153 dft_section, ispin, xas_mittle, external_matrix_shalf, &
154 unoccupied_orbs, unoccupied_evals, pdos_print_key, write_pdos, write_pdos_raw)
158 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
162 INTEGER,
INTENT(IN),
OPTIONAL :: ispin
163 CHARACTER(LEN=default_string_length),
INTENT(IN), &
164 OPTIONAL :: xas_mittle
165 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL,
TARGET :: external_matrix_shalf, unoccupied_orbs
166 TYPE(
cp_1d_r_p_type),
INTENT(IN),
OPTIONAL,
TARGET :: unoccupied_evals
167 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: pdos_print_key
168 LOGICAL,
INTENT(IN),
OPTIONAL :: write_pdos, write_pdos_raw
170 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_projected_dos'
172 CHARACTER(LEN=16) :: energy_label, fmtstr2
173 CHARACTER(LEN=27) :: fmtstr1
174 CHARACTER(LEN=32) :: zero_label
175 CHARACTER(LEN=6),
ALLOCATABLE,
DIMENSION(:, :, :) :: tmp_str
176 CHARACTER(LEN=default_string_length) :: kind_name, my_act, my_mittle, my_pos, &
177 my_print_key, spin(2)
178 CHARACTER(LEN=default_string_length), &
179 ALLOCATABLE,
DIMENSION(:) :: ldos_index, r_ldos_index
180 INTEGER :: broaden_type, energy_unit, energy_zero, handle, homo, i, iatom, ikind, il, ildos, &
181 im, imo, in_x, in_y, in_z, ir, irow, iset, isgf, ishell, iso, iterstep, iw, j, jx, jy, &
182 jz, k, lcomponent, lshell, maxl, maxlgto, my_spin, n_dependent, n_r_ldos, n_rep, nao, &
183 natom, ncol_global, ndigits, nkind, nldos, nmo, np_tot, npoints, nrow_global, nset, nsgf, &
184 nvirt, out_each, output_unit, resolved_energy_zero
185 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: firstrow
186 INTEGER,
DIMENSION(:),
POINTER ::
list, nshell
187 INTEGER,
DIMENSION(:, :),
POINTER :: bo, l
188 LOGICAL :: append, calc_matsh, do_broaden, do_ldos, do_r_ldos, do_virt, &
189 fractional_occupation, ionode, separate_components, should_output, write_raw, &
191 LOGICAL,
DIMENSION(:, :),
POINTER :: read_r
192 REAL(kind=
dp) :: broaden_width, de, dh(3, 3), dvol, e_fermi, energy_factor, energy_ref, &
193 ev_factor, hoco, r(3), r_vec(3), ratom(3), voigt_mixing
194 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, evals_virt, &
196 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: vecbuffer
197 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: pdos_array
201 TYPE(
cp_fm_type) :: matrix_shalfc, matrix_work
202 TYPE(
cp_fm_type),
POINTER :: matrix_shalf, mo_coeff, mo_virt
207 TYPE(ldos_p_type),
DIMENSION(:),
POINTER :: ldos_p
214 TYPE(r_ldos_p_type),
DIMENSION(:),
POINTER :: r_ldos_p
219 ionode = logger%para_env%is_source()
220 my_print_key =
"PRINT%PDOS"
221 IF (
PRESENT(pdos_print_key)) my_print_key = trim(pdos_print_key)
222 write_standard = .true.
223 IF (
PRESENT(write_pdos)) write_standard = write_pdos
225 IF (
PRESENT(write_pdos_raw)) write_raw = write_pdos_raw
226 write_raw = write_raw .AND. write_standard
233 IF ((.NOT. should_output))
RETURN
235 NULLIFY (context, s_matrix, orb_basis_set, para_env, pdos_array)
236 NULLIFY (eigenvalues, fm_struct_tmp, mo_coeff, vecbuffer, mo_virt)
237 NULLIFY (ldos_section,
list, cell, pw_env, auxbas_pw_pool, evals_virt)
238 NULLIFY (occupation_numbers, ldos_p, r_ldos_p, dft_control, occupation_numbers)
240 CALL timeset(routinen, handle)
241 iterstep = logger%iter_info%iteration(logger%iter_info%n_rlevel)
243 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,I10))') &
244 " Calculate PDOS at iteration step ", iterstep
247 dft_control=dft_control)
251 nkind =
SIZE(atomic_kind_set)
253 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo, &
256 context=context, para_env=para_env, &
257 nrow_global=nrow_global, &
258 ncol_global=ncol_global)
261 IF (out_each == -1) out_each = nao + 1
264 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%BROADEN_WIDTH", r_val=broaden_width)
269 ndigits = min(max(ndigits, 1), 10)
270 do_broaden = (broaden_width > 0.0_dp)
271 IF (do_broaden) de = max(de, 0.00001_dp)
274 IF (
PRESENT(unoccupied_orbs) .AND.
PRESENT(unoccupied_evals))
THEN
275 IF (
ASSOCIATED(unoccupied_evals%array))
THEN
276 nvirt =
SIZE(unoccupied_evals%array)
278 mo_virt => unoccupied_orbs
279 evals_virt => unoccupied_evals%array
283 do_virt = (nvirt > 0)
286 IF (
PRESENT(external_matrix_shalf)) calc_matsh = .false.
290 NULLIFY (matrix_shalf)
292 nrow_global=nrow_global, ncol_global=nrow_global)
293 ALLOCATE (matrix_shalf)
294 CALL cp_fm_create(matrix_shalf, fm_struct_tmp, name=
"matrix_shalf")
295 CALL cp_fm_create(matrix_work, fm_struct_tmp, name=
"matrix_work")
298 CALL cp_fm_power(matrix_shalf, matrix_work, 0.5_dp, epsilon(0.0_dp), n_dependent)
301 matrix_shalf => external_matrix_shalf
306 nrow_global=nrow_global, ncol_global=ncol_global)
307 CALL cp_fm_create(matrix_shalfc, fm_struct_tmp, name=
"matrix_shalfc")
308 CALL parallel_gemm(
"N",
"N", nrow_global, ncol_global, nrow_global, &
309 1.0_dp, matrix_shalf, mo_coeff, 0.0_dp, matrix_shalfc)
313 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T14,I10,T27,A))') &
314 " Use ", nvirt,
" additional unoccupied KS orbitals"
316 nrow_global=nrow_global, ncol_global=nvirt)
317 CALL cp_fm_create(matrix_work, fm_struct_tmp, name=
"matrix_shalfc")
318 CALL parallel_gemm(
"N",
"N", nrow_global, nvirt, nrow_global, &
319 1.0_dp, matrix_shalf, mo_virt, 0.0_dp, matrix_work)
325 DEALLOCATE (matrix_shalf)
333 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,I10))') &
334 " Prepare the list of atoms for LDOS. Number of lists: ", nldos
336 ALLOCATE (ldos_p(nldos))
337 ALLOCATE (ldos_index(nldos))
339 WRITE (ldos_index(ildos),
'(I0)') ildos
340 ALLOCATE (ldos_p(ildos)%ldos)
341 NULLIFY (ldos_p(ildos)%ldos%pdos_array)
342 NULLIFY (ldos_p(ildos)%ldos%list_index)
346 ldos_p(ildos)%ldos%nlist = 0
351 IF (
ASSOCIATED(
list))
THEN
352 CALL reallocate(ldos_p(ildos)%ldos%list_index, 1, ldos_p(ildos)%ldos%nlist +
SIZE(
list))
354 ldos_p(ildos)%ldos%list_index(i + ldos_p(ildos)%ldos%nlist) =
list(i)
356 ldos_p(ildos)%ldos%nlist = ldos_p(ildos)%ldos%nlist +
SIZE(
list)
363 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T10,A,T18,I6,T25,A,T36,I10,A))') &
364 " List ", ildos,
" contains ", ldos_p(ildos)%ldos%nlist,
" atoms"
366 l_val=ldos_p(ildos)%ldos%separate_components)
367 IF (ldos_p(ildos)%ldos%separate_components)
THEN
368 ALLOCATE (ldos_p(ildos)%ldos%pdos_array(
nsoset(maxlgto), nmo + nvirt))
370 ALLOCATE (ldos_p(ildos)%ldos%pdos_array(0:maxlgto, nmo + nvirt))
372 ldos_p(ildos)%ldos%pdos_array = 0.0_dp
373 ldos_p(ildos)%ldos%maxl = -1
381 IF (n_r_ldos > 0)
THEN
383 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,I10))') &
384 " Prepare the list of points for R_LDOS. Number of lists: ", n_r_ldos
385 ALLOCATE (r_ldos_p(n_r_ldos))
386 ALLOCATE (r_ldos_index(n_r_ldos))
389 dft_control=dft_control, &
391 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
394 CALL auxbas_pw_pool%create_pw(wf_r)
395 CALL auxbas_pw_pool%create_pw(wf_g)
396 ALLOCATE (read_r(4, n_r_ldos))
397 DO ildos = 1, n_r_ldos
398 WRITE (r_ldos_index(ildos),
'(I0)') ildos
399 ALLOCATE (r_ldos_p(ildos)%ldos)
400 NULLIFY (r_ldos_p(ildos)%ldos%pdos_array)
401 NULLIFY (r_ldos_p(ildos)%ldos%list_index)
405 r_ldos_p(ildos)%ldos%nlist = 0
410 IF (
ASSOCIATED(
list))
THEN
411 CALL reallocate(r_ldos_p(ildos)%ldos%list_index, 1, r_ldos_p(ildos)%ldos%nlist +
SIZE(
list))
413 r_ldos_p(ildos)%ldos%list_index(i + r_ldos_p(ildos)%ldos%nlist) =
list(i)
415 r_ldos_p(ildos)%ldos%nlist = r_ldos_p(ildos)%ldos%nlist +
SIZE(
list)
422 ALLOCATE (r_ldos_p(ildos)%ldos%pdos_array(nmo + nvirt))
423 r_ldos_p(ildos)%ldos%pdos_array = 0.0_dp
424 read_r(1:3, ildos) = .false.
425 CALL section_vals_val_get(ldos_section,
"XRANGE", i_rep_section=ildos, explicit=read_r(1, ildos))
426 IF (read_r(1, ildos))
THEN
428 r_ldos_p(ildos)%ldos%x_range)
430 ALLOCATE (r_ldos_p(ildos)%ldos%x_range(2))
431 r_ldos_p(ildos)%ldos%x_range = 0.0_dp
433 CALL section_vals_val_get(ldos_section,
"YRANGE", i_rep_section=ildos, explicit=read_r(2, ildos))
434 IF (read_r(2, ildos))
THEN
436 r_ldos_p(ildos)%ldos%y_range)
438 ALLOCATE (r_ldos_p(ildos)%ldos%y_range(2))
439 r_ldos_p(ildos)%ldos%y_range = 0.0_dp
441 CALL section_vals_val_get(ldos_section,
"ZRANGE", i_rep_section=ildos, explicit=read_r(3, ildos))
442 IF (read_r(3, ildos))
THEN
444 r_ldos_p(ildos)%ldos%z_range)
446 ALLOCATE (r_ldos_p(ildos)%ldos%z_range(2))
447 r_ldos_p(ildos)%ldos%z_range = 0.0_dp
450 CALL section_vals_val_get(ldos_section,
"ERANGE", i_rep_section=ildos, explicit=read_r(4, ildos))
451 IF (read_r(4, ildos))
THEN
453 r_vals=r_ldos_p(ildos)%ldos%eval_range)
455 ALLOCATE (r_ldos_p(ildos)%ldos%eval_range(2))
456 r_ldos_p(ildos)%ldos%eval_range(1) = -huge(0.0_dp)
457 r_ldos_p(ildos)%ldos%eval_range(2) = +huge(0.0_dp)
460 bo => wf_r%pw_grid%bounds_local
462 dvol = wf_r%pw_grid%dvol
463 np_tot = wf_r%pw_grid%npts(1)*wf_r%pw_grid%npts(2)*wf_r%pw_grid%npts(3)
464 ALLOCATE (r_ldos_p(ildos)%ldos%index_grid_local(3, np_tot))
466 r_ldos_p(ildos)%ldos%npoints = 0
467 DO jz = bo(1, 3), bo(2, 3)
468 DO jy = bo(1, 2), bo(2, 2)
469 DO jx = bo(1, 1), bo(2, 1)
471 i = jx - wf_r%pw_grid%bounds(1, 1)
472 j = jy - wf_r%pw_grid%bounds(1, 2)
473 k = jz - wf_r%pw_grid%bounds(1, 3)
474 r(3) = k*dh(3, 3) + j*dh(3, 2) + i*dh(3, 1)
475 r(2) = k*dh(2, 3) + j*dh(2, 2) + i*dh(2, 1)
476 r(1) = k*dh(1, 3) + j*dh(1, 2) + i*dh(1, 1)
478 DO il = 1, r_ldos_p(ildos)%ldos%nlist
479 iatom = r_ldos_p(ildos)%ldos%list_index(il)
480 ratom = particle_set(iatom)%r
481 r_vec =
pbc(ratom, r, cell)
482 IF (cell%orthorhombic)
THEN
483 IF (cell%perd(1) == 0) r_vec(1) =
modulo(r_vec(1), cell%hmat(1, 1))
484 IF (cell%perd(2) == 0) r_vec(2) =
modulo(r_vec(2), cell%hmat(2, 2))
485 IF (cell%perd(3) == 0) r_vec(3) =
modulo(r_vec(3), cell%hmat(3, 3))
491 IF (r_ldos_p(ildos)%ldos%x_range(1) /= 0.0_dp)
THEN
492 IF (r_vec(1) > r_ldos_p(ildos)%ldos%x_range(1) .AND. &
493 r_vec(1) < r_ldos_p(ildos)%ldos%x_range(2))
THEN
499 IF (r_ldos_p(ildos)%ldos%y_range(1) /= 0.0_dp)
THEN
500 IF (r_vec(2) > r_ldos_p(ildos)%ldos%y_range(1) .AND. &
501 r_vec(2) < r_ldos_p(ildos)%ldos%y_range(2))
THEN
507 IF (r_ldos_p(ildos)%ldos%z_range(1) /= 0.0_dp)
THEN
508 IF (r_vec(3) > r_ldos_p(ildos)%ldos%z_range(1) .AND. &
509 r_vec(3) < r_ldos_p(ildos)%ldos%z_range(2))
THEN
515 IF (in_x*in_y*in_z > 0)
THEN
516 r_ldos_p(ildos)%ldos%npoints = r_ldos_p(ildos)%ldos%npoints + 1
517 r_ldos_p(ildos)%ldos%index_grid_local(1, r_ldos_p(ildos)%ldos%npoints) = jx
518 r_ldos_p(ildos)%ldos%index_grid_local(2, r_ldos_p(ildos)%ldos%npoints) = jy
519 r_ldos_p(ildos)%ldos%index_grid_local(3, r_ldos_p(ildos)%ldos%npoints) = jz
526 CALL reallocate(r_ldos_p(ildos)%ldos%index_grid_local, 1, 3, 1, r_ldos_p(ildos)%ldos%npoints)
527 npoints = r_ldos_p(ildos)%ldos%npoints
528 CALL para_env%sum(npoints)
529 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T10,A,T18,I6,T25,A,T36,I10,A))') &
530 " List ", ildos,
" contains ", npoints,
" grid points"
534 IF (trim(my_print_key) ==
"PRINT%DOS")
THEN
535 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%PDOS%COMPONENTS", l_val=separate_components)
537 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%COMPONENTS", l_val=separate_components)
539 IF (separate_components)
THEN
540 ALLOCATE (pdos_array(
nsoset(maxlgto), nkind, nmo + nvirt))
542 ALLOCATE (pdos_array(0:maxlgto, nkind, nmo + nvirt))
545 ALLOCATE (eigenvalues(nmo + nvirt))
546 eigenvalues(1:nmo) = mo_set%eigenvalues(1:nmo)
547 eigenvalues(nmo + 1:nmo + nvirt) = evals_virt(1:nvirt)
548 ALLOCATE (occupation_numbers(nmo + nvirt))
549 occupation_numbers(:) = 0.0_dp
550 occupation_numbers(1:nmo) = mo_set%occupation_numbers(1:nmo)
552 eigenvalues => mo_set%eigenvalues
553 occupation_numbers => mo_set%occupation_numbers
557 fractional_occupation = .false.
558 DO imo = 1, nmo + nvirt
559 IF (occupation_numbers(imo) > 1.0e-10_dp) hoco = max(hoco, eigenvalues(imo))
560 IF (abs(occupation_numbers(imo) - real(nint(occupation_numbers(imo)), kind=
dp)) > &
561 1.0e-8_dp) fractional_occupation = .true.
563 IF (hoco < -0.5_dp*huge(0.0_dp)) hoco = e_fermi
565 SELECT CASE (resolved_energy_zero)
581 ALLOCATE (vecbuffer(1, nao))
583 ALLOCATE (firstrow(natom))
587 DO ildos = 1, n_r_ldos
588 IF (eigenvalues(1) > r_ldos_p(ildos)%ldos%eval_range(1)) &
589 r_ldos_p(ildos)%ldos%eval_range(1) = eigenvalues(1)
590 IF (eigenvalues(nmo + nvirt) < r_ldos_p(ildos)%ldos%eval_range(2)) &
591 r_ldos_p(ildos)%ldos%eval_range(2) = eigenvalues(nmo + nvirt)
594 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T15,A))') &
595 "---- PDOS: start iteration on the KS states --- "
597 DO imo = 1, nmo + nvirt
599 IF (output_unit > 0 .AND. mod(imo, out_each) == 0)
WRITE (unit=output_unit, fmt=
'((T20,A,I10))') &
600 " KS state index : ", imo
604 nao, 1, transpose=.true.)
607 nao, 1, transpose=.true.)
613 firstrow(iatom) = irow
614 NULLIFY (orb_basis_set)
615 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
616 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
621 IF (separate_components)
THEN
624 DO ishell = 1, nshell(iset)
625 lshell = l(ishell, iset)
626 DO iso = 1,
nso(lshell)
627 lcomponent =
nsoset(lshell - 1) + iso
628 pdos_array(lcomponent, ikind, imo) = &
629 pdos_array(lcomponent, ikind, imo) + &
630 vecbuffer(1, irow)*vecbuffer(1, irow)
638 DO ishell = 1, nshell(iset)
639 lshell = l(ishell, iset)
640 DO iso = 1,
nso(lshell)
641 pdos_array(lshell, ikind, imo) = &
642 pdos_array(lshell, ikind, imo) + &
643 vecbuffer(1, irow)*vecbuffer(1, irow)
653 DO il = 1, ldos_p(ildos)%ldos%nlist
654 iatom = ldos_p(ildos)%ldos%list_index(il)
656 irow = firstrow(iatom)
657 NULLIFY (orb_basis_set)
658 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
659 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
665 ldos_p(ildos)%ldos%maxl = max(ldos_p(ildos)%ldos%maxl, maxl)
666 IF (ldos_p(ildos)%ldos%separate_components)
THEN
669 DO ishell = 1, nshell(iset)
670 lshell = l(ishell, iset)
671 DO iso = 1,
nso(lshell)
672 lcomponent =
nsoset(lshell - 1) + iso
673 ldos_p(ildos)%ldos%pdos_array(lcomponent, imo) = &
674 ldos_p(ildos)%ldos%pdos_array(lcomponent, imo) + &
675 vecbuffer(1, irow)*vecbuffer(1, irow)
683 DO ishell = 1, nshell(iset)
684 lshell = l(ishell, iset)
685 DO iso = 1,
nso(lshell)
686 ldos_p(ildos)%ldos%pdos_array(lshell, imo) = &
687 ldos_p(ildos)%ldos%pdos_array(lshell, imo) + &
688 vecbuffer(1, irow)*vecbuffer(1, irow)
698 DO ildos = 1, n_r_ldos
699 IF (r_ldos_p(ildos)%ldos%eval_range(1) <= eigenvalues(imo) .AND. &
700 r_ldos_p(ildos)%ldos%eval_range(2) >= eigenvalues(imo))
THEN
704 wf_r, wf_g, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, &
708 wf_r, wf_g, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, &
711 r_ldos_p(ildos)%ldos%pdos_array(imo) = 0.0_dp
712 DO il = 1, r_ldos_p(ildos)%ldos%npoints
714 jx = r_ldos_p(ildos)%ldos%index_grid_local(1, il)
715 jy = r_ldos_p(ildos)%ldos%index_grid_local(2, il)
716 jz = r_ldos_p(ildos)%ldos%index_grid_local(3, il)
717 r_ldos_p(ildos)%ldos%pdos_array(imo) = r_ldos_p(ildos)%ldos%pdos_array(imo) + &
718 wf_r%array(jx, jy, jz)*wf_r%array(jx, jy, jz)
720 r_ldos_p(ildos)%ldos%pdos_array(imo) = r_ldos_p(ildos)%ldos%pdos_array(imo)*dvol
726 DEALLOCATE (vecbuffer)
729 IF (append .AND. iterstep > 1)
THEN
735 IF (write_standard .OR. write_raw)
THEN
738 NULLIFY (orb_basis_set)
740 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
746 IF (
PRESENT(ispin))
THEN
747 IF (
PRESENT(xas_mittle))
THEN
748 my_mittle = trim(xas_mittle)//trim(spin(ispin))//
"_k"//trim(adjustl(
cp_to_string(ikind)))
750 my_mittle = trim(spin(ispin))//
"_k"//trim(adjustl(
cp_to_string(ikind)))
758 IF (write_standard .AND. do_broaden)
THEN
759 IF (separate_components)
THEN
760 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle), my_pos, my_act, iterstep, &
761 e_fermi, hoco, energy_ref, trim(zero_label), &
762 "Projected DOS for atomic kind "//trim(kind_name), &
763 maxl, .true., pdos_array(1:
nsoset(maxl), ikind, :), &
764 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
765 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
767 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle), my_pos, my_act, iterstep, &
768 e_fermi, hoco, energy_ref, trim(zero_label), &
769 "Projected DOS for atomic kind "//trim(kind_name), &
770 maxl, .false., pdos_array(0:maxl, ikind, :), &
771 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
772 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
778 extension=
".pdos_raw", file_position=my_pos, file_action=my_act, &
779 file_form=
"FORMATTED", middle_name=trim(my_mittle))
782 fmtstr1 =
"(I8,2X,2F16.6, (2X,F16.8))"
783 fmtstr2 =
"(A42, (10X,A8))"
784 IF (separate_components)
THEN
785 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)")
nsoset(maxl) + 1
786 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)")
nsoset(maxl) + 1
788 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)") maxl + 2
789 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)") maxl + 2
792 WRITE (unit=iw, fmt=
"(A,I0)") &
793 "# Projected DOS for atomic kind "//trim(kind_name)//
" at iteration step i = ", iterstep
794 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
795 "# E(Fermi) = ", e_fermi,
" a.u. = ", e_fermi*ev_factor,
" eV"
796 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
797 "# E(HOCO) = ", hoco,
" a.u. = ", hoco*ev_factor,
" eV"
798 WRITE (unit=iw, fmt=
"(A,A)")
"# Energy zero: ", trim(zero_label)
799 IF (separate_components)
THEN
800 ALLOCATE (tmp_str(0:0, 0:maxl, -maxl:maxl))
808 WRITE (unit=iw, fmt=fmtstr2) &
809 "# MO "//trim(energy_label)//
" Occupation",
"Total", &
810 ((trim(tmp_str(0, il, im)), im=-il, il), il=0, maxl)
811 DO imo = 1, nmo + nvirt
812 WRITE (unit=iw, fmt=fmtstr1) imo, (eigenvalues(imo) - energy_ref)*energy_factor, &
813 occupation_numbers(imo), sum(pdos_array(1:
nsoset(maxl), ikind, imo)), &
814 (pdos_array(lshell, ikind, imo), lshell=1,
nsoset(maxl))
818 WRITE (unit=iw, fmt=fmtstr2) &
819 "# MO "//trim(energy_label)//
" Occupation",
"Total", &
820 (trim(
l_sym(il)), il=0, maxl)
821 DO imo = 1, nmo + nvirt
822 WRITE (unit=iw, fmt=fmtstr1) imo, (eigenvalues(imo) - energy_ref)*energy_factor, &
823 occupation_numbers(imo), sum(pdos_array(0:maxl, ikind, imo)), &
824 (pdos_array(lshell, ikind, imo), lshell=0, maxl)
839 IF (ldos_p(ildos)%ldos%maxl > 0)
THEN
841 IF (
PRESENT(ispin))
THEN
842 IF (
PRESENT(xas_mittle))
THEN
843 my_mittle = trim(xas_mittle)//trim(spin(ispin))//
"_list"//trim(ldos_index(ildos))
845 my_mittle = trim(spin(ispin))//
"_list"//trim(ldos_index(ildos))
849 my_mittle =
"list"//trim(ldos_index(ildos))
854 IF (ldos_p(ildos)%ldos%separate_components)
THEN
855 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle), my_pos, my_act, iterstep, &
856 e_fermi, hoco, energy_ref, trim(zero_label), &
857 "Projected DOS for atom list "//trim(ldos_index(ildos)), &
858 ldos_p(ildos)%ldos%maxl, .true., &
859 ldos_p(ildos)%ldos%pdos_array(1:
nsoset(ldos_p(ildos)%ldos%maxl), :), &
860 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
861 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
863 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle), my_pos, my_act, iterstep, &
864 e_fermi, hoco, energy_ref, trim(zero_label), &
865 "Projected DOS for atom list "//trim(ldos_index(ildos)), &
866 ldos_p(ildos)%ldos%maxl, .false., &
867 ldos_p(ildos)%ldos%pdos_array(0:ldos_p(ildos)%ldos%maxl, :), &
868 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
869 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
874 extension=
".pdos_raw", file_position=my_pos, file_action=my_act, &
875 file_form=
"FORMATTED", middle_name=trim(my_mittle))
878 fmtstr1 =
"(I8,2X,2F16.6, (2X,F16.8))"
879 fmtstr2 =
"(A42, (10X,A8))"
880 IF (ldos_p(ildos)%ldos%separate_components)
THEN
881 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)")
nsoset(ldos_p(ildos)%ldos%maxl) + 1
882 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)")
nsoset(ldos_p(ildos)%ldos%maxl) + 1
884 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)") ldos_p(ildos)%ldos%maxl + 2
885 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)") ldos_p(ildos)%ldos%maxl + 2
888 WRITE (unit=iw, fmt=
"(A,I0,A,I0,A,I0)") &
889 "# Projected DOS for list ", ildos,
" of ", ldos_p(ildos)%ldos%nlist, &
890 " atoms, at iteration step i = ", iterstep
891 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
892 "# E(Fermi) = ", e_fermi,
" a.u. = ", e_fermi*ev_factor,
" eV"
893 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
894 "# E(HOCO) = ", hoco,
" a.u. = ", hoco*ev_factor,
" eV"
895 WRITE (unit=iw, fmt=
"(A,A)")
"# Energy zero: ", trim(zero_label)
896 IF (ldos_p(ildos)%ldos%separate_components)
THEN
897 ALLOCATE (tmp_str(0:0, 0:ldos_p(ildos)%ldos%maxl, -ldos_p(ildos)%ldos%maxl:ldos_p(ildos)%ldos%maxl))
899 DO j = 0, ldos_p(ildos)%ldos%maxl
905 WRITE (unit=iw, fmt=fmtstr2) &
906 "# MO "//trim(energy_label)//
" Occupation",
"Total", &
907 ((trim(tmp_str(0, il, im)), im=-il, il), il=0, ldos_p(ildos)%ldos%maxl)
908 DO imo = 1, nmo + nvirt
909 WRITE (unit=iw, fmt=fmtstr1) imo, (eigenvalues(imo) - energy_ref)*energy_factor, &
910 occupation_numbers(imo), &
911 sum(ldos_p(ildos)%ldos%pdos_array(1:
nsoset(ldos_p(ildos)%ldos%maxl), imo)), &
912 (ldos_p(ildos)%ldos%pdos_array(lshell, imo), &
913 lshell=1,
nsoset(ldos_p(ildos)%ldos%maxl))
917 WRITE (unit=iw, fmt=fmtstr2) &
918 "# MO "//trim(energy_label)//
" Occupation",
"Total", &
919 (trim(
l_sym(il)), il=0, ldos_p(ildos)%ldos%maxl)
920 DO imo = 1, nmo + nvirt
921 WRITE (unit=iw, fmt=fmtstr1) imo, (eigenvalues(imo) - energy_ref)*energy_factor, &
922 occupation_numbers(imo), &
923 sum(ldos_p(ildos)%ldos%pdos_array(0:ldos_p(ildos)%ldos%maxl, imo)), &
924 (ldos_p(ildos)%ldos%pdos_array(lshell, imo), lshell=0, ldos_p(ildos)%ldos%maxl)
935 DO ildos = 1, n_r_ldos
937 npoints = r_ldos_p(ildos)%ldos%npoints
938 CALL para_env%sum(npoints)
939 CALL para_env%sum(np_tot)
940 CALL para_env%sum(r_ldos_p(ildos)%ldos%pdos_array)
941 IF (
PRESENT(ispin))
THEN
942 IF (
PRESENT(xas_mittle))
THEN
943 my_mittle = trim(xas_mittle)//trim(spin(ispin))//
"_r_list"//trim(r_ldos_index(ildos))
945 my_mittle = trim(spin(ispin))//
"_r_list"//trim(r_ldos_index(ildos))
949 my_mittle =
"r_list"//trim(r_ldos_index(ildos))
954 extension=
".pdos_raw", file_position=my_pos, file_action=my_act, &
955 file_form=
"FORMATTED", middle_name=trim(my_mittle))
957 fmtstr1 =
"(I8,2X,2F16.6, (2X,F16.8))"
958 fmtstr2 =
"(A42, (10X,A8))"
960 WRITE (unit=iw, fmt=
"(A,I0,A,F12.6,F12.6,A)") &
961 "# Projected DOS in real space, using ", npoints, &
962 " points of the grid, and eval in the range", r_ldos_p(ildos)%ldos%eval_range(1:2),
" Hartree"
963 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
964 "# E(Fermi) = ", e_fermi,
" a.u. = ", e_fermi*ev_factor,
" eV"
965 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
966 "# E(HOCO) = ", hoco,
" a.u. = ", hoco*ev_factor,
" eV"
967 WRITE (unit=iw, fmt=
"(A,A)")
"# Energy zero: ", trim(zero_label)
968 WRITE (unit=iw, fmt=
"(A,A,A)") &
969 "# MO ", trim(energy_label),
" Occupation LDOS"
970 DO imo = 1, nmo + nvirt
971 IF (r_ldos_p(ildos)%ldos%eval_range(1) <= eigenvalues(imo) .AND. &
972 r_ldos_p(ildos)%ldos%eval_range(2) >= eigenvalues(imo))
THEN
973 WRITE (unit=iw, fmt=
"(I8,2X,2F16.6,E20.10,E20.10)") imo, &
974 (eigenvalues(imo) - energy_ref)*energy_factor, occupation_numbers(imo), &
975 r_ldos_p(ildos)%ldos%pdos_array(imo), r_ldos_p(ildos)%ldos%pdos_array(imo)*np_tot
985 DEALLOCATE (pdos_array)
986 DEALLOCATE (firstrow)
989 DEALLOCATE (ldos_p(ildos)%ldos%pdos_array)
990 DEALLOCATE (ldos_p(ildos)%ldos%list_index)
991 DEALLOCATE (ldos_p(ildos)%ldos)
994 DEALLOCATE (ldos_index)
997 DO ildos = 1, n_r_ldos
998 DEALLOCATE (r_ldos_p(ildos)%ldos%index_grid_local)
999 DEALLOCATE (r_ldos_p(ildos)%ldos%pdos_array)
1000 DEALLOCATE (r_ldos_p(ildos)%ldos%list_index)
1001 IF (.NOT. read_r(1, ildos))
THEN
1002 DEALLOCATE (r_ldos_p(ildos)%ldos%x_range)
1004 IF (.NOT. read_r(2, ildos))
THEN
1005 DEALLOCATE (r_ldos_p(ildos)%ldos%y_range)
1007 IF (.NOT. read_r(3, ildos))
THEN
1008 DEALLOCATE (r_ldos_p(ildos)%ldos%z_range)
1010 IF (.NOT. read_r(4, ildos))
THEN
1011 DEALLOCATE (r_ldos_p(ildos)%ldos%eval_range)
1013 DEALLOCATE (r_ldos_p(ildos)%ldos)
1016 DEALLOCATE (r_ldos_p)
1017 DEALLOCATE (r_ldos_index)
1018 CALL auxbas_pw_pool%give_back_pw(wf_r)
1019 CALL auxbas_pw_pool%give_back_pw(wf_g)
1023 DEALLOCATE (eigenvalues)
1024 DEALLOCATE (occupation_numbers)
1027 CALL timestop(handle)
1043 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: pdos_print_key
1044 LOGICAL,
INTENT(IN),
OPTIONAL :: write_pdos, write_pdos_raw
1046 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_projected_dos_kp'
1048 CHARACTER(LEN=32) :: zero_label
1049 CHARACTER(LEN=default_string_length) :: kind_name, my_act, my_mittle, my_pos, &
1050 my_print_key, spin(2)
1051 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: zvecbuffer
1052 INTEGER :: broaden_type, energy_zero, fractional_occupation_int, handle, icomp, ik, ikind, &
1053 imo, ispin, iterstep, maxl, maxlgto, n_r_ldos, nao, ncomp, ndigits, nhist, nkind, nldos, &
1054 nmo_kp, nspins, output_unit, resolved_energy_zero
1055 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ao_comp, ao_kind, ao_l, kind_maxl
1056 LOGICAL :: append, fractional_occupation, &
1057 separate_components, should_output, &
1058 write_raw, write_standard
1059 REAL(kind=
dp) :: broaden_cutoff, broaden_width, de, e1, &
1060 e2, e_fermi(2), emax, emin, &
1061 energy_ref(2), hoco(2), voigt_mixing, &
1063 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ao_weight
1064 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: proj_weight, vecbuffer
1065 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: pdos_curve
1066 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, occupation_numbers
1072 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp
1080 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1084 NULLIFY (logger, kpoints, dft_control, para_env, atomic_kind_set, qs_kind_set, particle_set)
1085 NULLIFY (matrix_s_kp, scf_env)
1086 NULLIFY (kp, mo_set, eigenvalues, fm_struct_tmp, orb_basis_set, ldos_section)
1088 my_print_key =
"PRINT%PDOS"
1089 IF (
PRESENT(pdos_print_key)) my_print_key = trim(pdos_print_key)
1090 write_standard = .true.
1091 IF (
PRESENT(write_pdos)) write_standard = write_pdos
1093 IF (
PRESENT(write_pdos_raw)) write_raw = write_pdos_raw
1094 write_raw = write_raw .AND. write_standard
1098 IF ((.NOT. should_output))
RETURN
1100 CALL timeset(routinen, handle)
1101 iterstep = logger%iter_info%iteration(logger%iter_info%n_rlevel)
1103 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,I10))') &
1104 " Calculate k-point PDOS at iteration step ", iterstep
1108 dft_control=dft_control, &
1109 matrix_s_kp=matrix_s_kp, &
1111 atomic_kind_set=atomic_kind_set, &
1112 qs_kind_set=qs_kind_set, &
1113 particle_set=particle_set)
1114 para_env => kpoints%para_env_inter_kp
1115 nspins = dft_control%nspins
1116 nkind =
SIZE(atomic_kind_set)
1118 IF (.NOT.
ASSOCIATED(kpoints%kp_env))
THEN
1119 cpwarn(
"No local k points available for k-point PDOS")
1120 CALL timestop(handle)
1123 IF (
SIZE(kpoints%kp_env) == 0)
THEN
1124 cpwarn(
"No local k points available for k-point PDOS")
1125 CALL timestop(handle)
1131 IF (trim(my_print_key) ==
"PRINT%DOS")
THEN
1132 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%PDOS%COMPONENTS", l_val=separate_components)
1134 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%COMPONENTS", l_val=separate_components)
1137 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%BROADEN_TYPE", i_val=broaden_type)
1138 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%BROADEN_WIDTH", r_val=broaden_width)
1139 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%VOIGT_MIXING", r_val=voigt_mixing)
1141 ndigits = min(max(ndigits, 1), 10)
1142 de = max(de, 0.00001_dp)
1148 IF (nldos > 0 .OR. n_r_ldos > 0)
THEN
1149 cpwarn(
"LDOS/R_LDOS are not implemented for k-point PDOS and will be ignored")
1152 cpwarn(
"Raw k-point PDOS output is not implemented and will be ignored")
1154 IF (broaden_width <= 0.0_dp)
THEN
1155 cpwarn(
"Broadened k-point PDOS output requires a finite BROADEN_WIDTH")
1156 CALL timestop(handle)
1160 IF (separate_components)
THEN
1165 ALLOCATE (kind_maxl(nkind))
1168 NULLIFY (orb_basis_set)
1169 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1171 kind_maxl(ikind) = maxl
1175 emax = -huge(0.0_dp)
1177 hoco(:) = -huge(0.0_dp)
1178 fractional_occupation = .false.
1179 IF (kpoints%nkp /= 0)
THEN
1180 DO ik = 1,
SIZE(kpoints%kp_env)
1181 kp => kpoints%kp_env(ik)%kpoint_env
1182 DO ispin = 1, nspins
1183 mo_set => kp%mos(1, ispin)
1184 CALL get_mo_set(mo_set=mo_set, nmo=nmo_kp, mu=e_fermi(ispin))
1185 eigenvalues => mo_set%eigenvalues
1186 occupation_numbers => mo_set%occupation_numbers
1188 IF (occupation_numbers(imo) > 1.0e-10_dp) hoco(ispin) = max(hoco(ispin), eigenvalues(imo))
1189 IF (abs(occupation_numbers(imo) - real(nint(occupation_numbers(imo)), kind=
dp)) > &
1190 1.0e-8_dp) fractional_occupation = .true.
1192 e1 = minval(eigenvalues(1:nmo_kp))
1193 e2 = maxval(eigenvalues(1:nmo_kp))
1194 emin = min(emin, e1)
1195 emax = max(emax, e2)
1199 CALL para_env%min(emin)
1200 CALL para_env%max(emax)
1201 CALL para_env%max(e_fermi)
1202 CALL para_env%max(hoco)
1203 fractional_occupation_int = merge(1, 0, fractional_occupation)
1204 CALL para_env%max(fractional_occupation_int)
1205 fractional_occupation = (fractional_occupation_int /= 0)
1206 DO ispin = 1, nspins
1207 IF (hoco(ispin) < -0.5_dp*huge(0.0_dp)) hoco(ispin) = e_fermi(ispin)
1210 SELECT CASE (resolved_energy_zero)
1212 energy_ref(:) = 0.0_dp
1214 energy_ref(:) = hoco(:)
1216 energy_ref(:) = e_fermi(:)
1221 emin = emin - broaden_cutoff
1222 emax = emax + broaden_cutoff
1223 nhist = nint((emax - emin)/de) + 1
1224 ALLOCATE (pdos_curve(nhist, ncomp, nkind, nspins))
1229 CALL diag_kp_smat(matrix_s_kp, kpoints, scf_env%scf_work1)
1232 kp => kpoints%kp_env(1)%kpoint_env
1233 mo_set => kp%mos(1, 1)
1235 CALL build_pdos_ao_map(qs_kind_set, particle_set, nao, ao_kind, ao_l, ao_comp)
1236 ALLOCATE (ao_weight(nao), proj_weight(ncomp, nkind))
1237 ALLOCATE (vecbuffer(1, nao), zvecbuffer(1, nao))
1239 IF (kpoints%nkp /= 0)
THEN
1240 DO ik = 1,
SIZE(kpoints%kp_env)
1241 kp => kpoints%kp_env(ik)%kpoint_env
1243 DO ispin = 1, nspins
1244 mo_set => kp%mos(1, ispin)
1245 CALL get_mo_set(mo_set=mo_set, nao=nao, nmo=nmo_kp)
1246 eigenvalues => mo_set%eigenvalues
1247 CALL cp_fm_get_info(mo_set%mo_coeff, matrix_struct=fm_struct_tmp)
1248 IF (kpoints%use_real_wfn)
THEN
1249 CALL cp_fm_create(shalfc, fm_struct_tmp, name=
"shalfc")
1257 IF (kpoints%use_real_wfn)
THEN
1259 ao_weight(:) = vecbuffer(1, 1:nao)**2
1262 ao_weight(:) = real(conjg(zvecbuffer(1, 1:nao))*zvecbuffer(1, 1:nao), kind=
dp)
1264 proj_weight = 0.0_dp
1265 CALL accumulate_pdos_weights(ao_weight, ao_kind, ao_l, ao_comp, &
1266 separate_components, proj_weight)
1268 IF (kind_maxl(ikind) < 0) cycle
1269 IF (separate_components)
THEN
1270 DO icomp = 1,
nsoset(kind_maxl(ikind))
1272 emin, de, eigenvalues(imo), &
1273 wkp*proj_weight(icomp, ikind), &
1274 broaden_type, broaden_width, voigt_mixing)
1277 DO icomp = 1, kind_maxl(ikind) + 1
1279 emin, de, eigenvalues(imo), &
1280 wkp*proj_weight(icomp, ikind), &
1281 broaden_type, broaden_width, voigt_mixing)
1287 IF (kpoints%use_real_wfn)
THEN
1295 CALL para_env%sum(pdos_curve)
1297 IF (append .AND. iterstep > 1)
THEN
1305 IF (write_standard)
THEN
1307 IF (kind_maxl(ikind) < 0) cycle
1309 DO ispin = 1, nspins
1310 IF (nspins == 2)
THEN
1311 my_mittle = trim(spin(ispin))//
"_k"//trim(adjustl(
cp_to_string(ikind)))
1315 CALL write_broadened_pdos_curve(logger, dft_section, trim(my_mittle), my_pos, my_act, &
1316 iterstep, e_fermi(ispin), hoco(ispin), energy_ref(ispin), &
1318 "K-point projected DOS for atomic kind "//trim(kind_name), &
1319 kind_maxl(ikind), separate_components, &
1320 pdos_curve(:, :, ikind, ispin), emin, de, &
1321 broaden_type, broaden_width, voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
1326 DEALLOCATE (ao_comp, ao_kind, ao_l, ao_weight, kind_maxl, pdos_curve, proj_weight, &
1327 vecbuffer, zvecbuffer)
1329 CALL timestop(handle)
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.