153 dft_section, ispin, xas_mittle, external_matrix_shalf, &
154 unoccupied_orbs, unoccupied_evals, pdos_print_key, write_pdos, write_pdos_curve)
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_curve
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, imo_ref, in_x, in_y, in_z, ir, irow, iset, isgf, ishell, iso, ispin_ref, &
182 iterstep, iw, j, jx, jy, jz, k, lcomponent, lshell, maxl, maxlgto, my_spin, n_dependent, &
183 n_r_ldos, n_rep, nao, natom, ncol_global, ndigits, nkind, nldos, nmo, nmo_ref, np_tot, &
184 npoints, nrow_global, nset, nsgf, 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_curve, do_ldos, do_r_ldos, do_virt, fractional_occupation, &
189 ionode, separate_components, should_output, write_curve, write_pdos_file
190 LOGICAL,
DIMENSION(:, :),
POINTER :: read_r
191 REAL(kind=
dp) :: broaden_width, de, dh(3, 3), dvol, e_fermi, e_fermi_ref(2), energy_factor, &
192 energy_ref, ev_factor, hoco, hoco_ref(2), r(3), r_vec(3), ratom(3), voigt_mixing
193 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, eval_ref, evals_virt, &
194 occ_ref, occupation_numbers
195 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: vecbuffer
196 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: pdos_array
200 TYPE(
cp_fm_type) :: matrix_shalfc, matrix_work
201 TYPE(
cp_fm_type),
POINTER :: matrix_shalf, mo_coeff, mo_virt
206 TYPE(ldos_p_type),
DIMENSION(:),
POINTER :: ldos_p
207 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos_ref
214 TYPE(r_ldos_p_type),
DIMENSION(:),
POINTER :: r_ldos_p
217 NULLIFY (logger, mos_ref, eval_ref, occ_ref)
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_pdos_file = .true.
223 IF (
PRESENT(write_pdos)) write_pdos_file = write_pdos
226 IF (
PRESENT(write_pdos_curve)) write_curve = write_pdos_curve
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 (curve_section, 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
263 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%BROADEN%TYPE", i_val=broaden_type)
264 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%BROADEN%WIDTH", r_val=broaden_width)
265 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%BROADEN%VOIGT_MIXING", r_val=voigt_mixing)
267 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%ENERGY_UNIT", i_val=energy_unit)
268 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%ENERGY_ZERO", i_val=energy_zero)
269 ndigits = min(max(ndigits, 1), 10)
270 IF (write_curve .AND. de <= 0.0_dp)
THEN
271 cpwarn(
"Broadened PDOS output requires DELTA_E > 0 and will be skipped")
272 write_curve = .false.
274 IF (write_curve .AND. broaden_width <= 0.0_dp)
THEN
275 cpwarn(
"Broadened PDOS output requires a finite WIDTH and will be skipped")
276 write_curve = .false.
278 do_curve = write_curve .AND. (broaden_width > 0.0_dp)
279 IF (do_curve) de = max(de, 0.00001_dp)
282 IF (
PRESENT(unoccupied_orbs) .AND.
PRESENT(unoccupied_evals))
THEN
283 IF (
ASSOCIATED(unoccupied_evals%array))
THEN
284 nvirt =
SIZE(unoccupied_evals%array)
286 mo_virt => unoccupied_orbs
287 evals_virt => unoccupied_evals%array
291 do_virt = (nvirt > 0)
294 IF (
PRESENT(external_matrix_shalf)) calc_matsh = .false.
298 NULLIFY (matrix_shalf)
300 nrow_global=nrow_global, ncol_global=nrow_global)
301 ALLOCATE (matrix_shalf)
302 CALL cp_fm_create(matrix_shalf, fm_struct_tmp, name=
"matrix_shalf")
303 CALL cp_fm_create(matrix_work, fm_struct_tmp, name=
"matrix_work")
306 CALL cp_fm_power(matrix_shalf, matrix_work, 0.5_dp, epsilon(0.0_dp), n_dependent)
309 matrix_shalf => external_matrix_shalf
314 nrow_global=nrow_global, ncol_global=ncol_global)
315 CALL cp_fm_create(matrix_shalfc, fm_struct_tmp, name=
"matrix_shalfc")
316 CALL parallel_gemm(
"N",
"N", nrow_global, ncol_global, nrow_global, &
317 1.0_dp, matrix_shalf, mo_coeff, 0.0_dp, matrix_shalfc)
321 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T14,I10,T27,A))') &
322 " Use ", nvirt,
" additional unoccupied KS orbitals"
324 nrow_global=nrow_global, ncol_global=nvirt)
325 CALL cp_fm_create(matrix_work, fm_struct_tmp, name=
"matrix_shalfc")
326 CALL parallel_gemm(
"N",
"N", nrow_global, nvirt, nrow_global, &
327 1.0_dp, matrix_shalf, mo_virt, 0.0_dp, matrix_work)
333 DEALLOCATE (matrix_shalf)
341 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,I10))') &
342 " Prepare the list of atoms for LDOS. Number of lists: ", nldos
344 ALLOCATE (ldos_p(nldos))
345 ALLOCATE (ldos_index(nldos))
347 WRITE (ldos_index(ildos),
'(I0)') ildos
348 ALLOCATE (ldos_p(ildos)%ldos)
349 NULLIFY (ldos_p(ildos)%ldos%pdos_array)
350 NULLIFY (ldos_p(ildos)%ldos%list_index)
354 ldos_p(ildos)%ldos%nlist = 0
359 IF (
ASSOCIATED(
list))
THEN
360 CALL reallocate(ldos_p(ildos)%ldos%list_index, 1, ldos_p(ildos)%ldos%nlist +
SIZE(
list))
362 ldos_p(ildos)%ldos%list_index(i + ldos_p(ildos)%ldos%nlist) =
list(i)
364 ldos_p(ildos)%ldos%nlist = ldos_p(ildos)%ldos%nlist +
SIZE(
list)
371 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T10,A,T18,I6,T25,A,T36,I10,A))') &
372 " List ", ildos,
" contains ", ldos_p(ildos)%ldos%nlist,
" atoms"
374 l_val=ldos_p(ildos)%ldos%separate_components)
375 IF (ldos_p(ildos)%ldos%separate_components)
THEN
376 ALLOCATE (ldos_p(ildos)%ldos%pdos_array(
nsoset(maxlgto), nmo + nvirt))
378 ALLOCATE (ldos_p(ildos)%ldos%pdos_array(0:maxlgto, nmo + nvirt))
380 ldos_p(ildos)%ldos%pdos_array = 0.0_dp
381 ldos_p(ildos)%ldos%maxl = -1
389 IF (n_r_ldos > 0)
THEN
391 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,I10))') &
392 " Prepare the list of points for R_LDOS. Number of lists: ", n_r_ldos
393 ALLOCATE (r_ldos_p(n_r_ldos))
394 ALLOCATE (r_ldos_index(n_r_ldos))
397 dft_control=dft_control, &
399 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
402 CALL auxbas_pw_pool%create_pw(wf_r)
403 CALL auxbas_pw_pool%create_pw(wf_g)
404 ALLOCATE (read_r(4, n_r_ldos))
405 DO ildos = 1, n_r_ldos
406 WRITE (r_ldos_index(ildos),
'(I0)') ildos
407 ALLOCATE (r_ldos_p(ildos)%ldos)
408 NULLIFY (r_ldos_p(ildos)%ldos%pdos_array)
409 NULLIFY (r_ldos_p(ildos)%ldos%list_index)
413 r_ldos_p(ildos)%ldos%nlist = 0
418 IF (
ASSOCIATED(
list))
THEN
419 CALL reallocate(r_ldos_p(ildos)%ldos%list_index, 1, r_ldos_p(ildos)%ldos%nlist +
SIZE(
list))
421 r_ldos_p(ildos)%ldos%list_index(i + r_ldos_p(ildos)%ldos%nlist) =
list(i)
423 r_ldos_p(ildos)%ldos%nlist = r_ldos_p(ildos)%ldos%nlist +
SIZE(
list)
430 ALLOCATE (r_ldos_p(ildos)%ldos%pdos_array(nmo + nvirt))
431 r_ldos_p(ildos)%ldos%pdos_array = 0.0_dp
432 read_r(1:3, ildos) = .false.
433 CALL section_vals_val_get(ldos_section,
"XRANGE", i_rep_section=ildos, explicit=read_r(1, ildos))
434 IF (read_r(1, ildos))
THEN
436 r_ldos_p(ildos)%ldos%x_range)
438 ALLOCATE (r_ldos_p(ildos)%ldos%x_range(2))
439 r_ldos_p(ildos)%ldos%x_range = 0.0_dp
441 CALL section_vals_val_get(ldos_section,
"YRANGE", i_rep_section=ildos, explicit=read_r(2, ildos))
442 IF (read_r(2, ildos))
THEN
444 r_ldos_p(ildos)%ldos%y_range)
446 ALLOCATE (r_ldos_p(ildos)%ldos%y_range(2))
447 r_ldos_p(ildos)%ldos%y_range = 0.0_dp
449 CALL section_vals_val_get(ldos_section,
"ZRANGE", i_rep_section=ildos, explicit=read_r(3, ildos))
450 IF (read_r(3, ildos))
THEN
452 r_ldos_p(ildos)%ldos%z_range)
454 ALLOCATE (r_ldos_p(ildos)%ldos%z_range(2))
455 r_ldos_p(ildos)%ldos%z_range = 0.0_dp
458 CALL section_vals_val_get(ldos_section,
"ERANGE", i_rep_section=ildos, explicit=read_r(4, ildos))
459 IF (read_r(4, ildos))
THEN
461 r_vals=r_ldos_p(ildos)%ldos%eval_range)
463 ALLOCATE (r_ldos_p(ildos)%ldos%eval_range(2))
464 r_ldos_p(ildos)%ldos%eval_range(1) = -huge(0.0_dp)
465 r_ldos_p(ildos)%ldos%eval_range(2) = +huge(0.0_dp)
468 bo => wf_r%pw_grid%bounds_local
470 dvol = wf_r%pw_grid%dvol
471 np_tot = wf_r%pw_grid%npts(1)*wf_r%pw_grid%npts(2)*wf_r%pw_grid%npts(3)
472 ALLOCATE (r_ldos_p(ildos)%ldos%index_grid_local(3, np_tot))
474 r_ldos_p(ildos)%ldos%npoints = 0
475 DO jz = bo(1, 3), bo(2, 3)
476 DO jy = bo(1, 2), bo(2, 2)
477 DO jx = bo(1, 1), bo(2, 1)
479 i = jx - wf_r%pw_grid%bounds(1, 1)
480 j = jy - wf_r%pw_grid%bounds(1, 2)
481 k = jz - wf_r%pw_grid%bounds(1, 3)
482 r(3) = k*dh(3, 3) + j*dh(3, 2) + i*dh(3, 1)
483 r(2) = k*dh(2, 3) + j*dh(2, 2) + i*dh(2, 1)
484 r(1) = k*dh(1, 3) + j*dh(1, 2) + i*dh(1, 1)
486 DO il = 1, r_ldos_p(ildos)%ldos%nlist
487 iatom = r_ldos_p(ildos)%ldos%list_index(il)
488 ratom = particle_set(iatom)%r
489 r_vec =
pbc(ratom, r, cell)
490 IF (cell%orthorhombic)
THEN
491 IF (cell%perd(1) == 0) r_vec(1) =
modulo(r_vec(1), cell%hmat(1, 1))
492 IF (cell%perd(2) == 0) r_vec(2) =
modulo(r_vec(2), cell%hmat(2, 2))
493 IF (cell%perd(3) == 0) r_vec(3) =
modulo(r_vec(3), cell%hmat(3, 3))
499 IF (r_ldos_p(ildos)%ldos%x_range(1) /= 0.0_dp)
THEN
500 IF (r_vec(1) > r_ldos_p(ildos)%ldos%x_range(1) .AND. &
501 r_vec(1) < r_ldos_p(ildos)%ldos%x_range(2))
THEN
507 IF (r_ldos_p(ildos)%ldos%y_range(1) /= 0.0_dp)
THEN
508 IF (r_vec(2) > r_ldos_p(ildos)%ldos%y_range(1) .AND. &
509 r_vec(2) < r_ldos_p(ildos)%ldos%y_range(2))
THEN
515 IF (r_ldos_p(ildos)%ldos%z_range(1) /= 0.0_dp)
THEN
516 IF (r_vec(3) > r_ldos_p(ildos)%ldos%z_range(1) .AND. &
517 r_vec(3) < r_ldos_p(ildos)%ldos%z_range(2))
THEN
523 IF (in_x*in_y*in_z > 0)
THEN
524 r_ldos_p(ildos)%ldos%npoints = r_ldos_p(ildos)%ldos%npoints + 1
525 r_ldos_p(ildos)%ldos%index_grid_local(1, r_ldos_p(ildos)%ldos%npoints) = jx
526 r_ldos_p(ildos)%ldos%index_grid_local(2, r_ldos_p(ildos)%ldos%npoints) = jy
527 r_ldos_p(ildos)%ldos%index_grid_local(3, r_ldos_p(ildos)%ldos%npoints) = jz
534 CALL reallocate(r_ldos_p(ildos)%ldos%index_grid_local, 1, 3, 1, r_ldos_p(ildos)%ldos%npoints)
535 npoints = r_ldos_p(ildos)%ldos%npoints
536 CALL para_env%sum(npoints)
537 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T10,A,T18,I6,T25,A,T36,I10,A))') &
538 " List ", ildos,
" contains ", npoints,
" grid points"
542 IF (trim(my_print_key) ==
"PRINT%DOS")
THEN
543 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%PDOS%COMPONENTS", l_val=separate_components)
545 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%COMPONENTS", l_val=separate_components)
547 IF (separate_components)
THEN
548 ALLOCATE (pdos_array(
nsoset(maxlgto), nkind, nmo + nvirt))
550 ALLOCATE (pdos_array(0:maxlgto, nkind, nmo + nvirt))
553 ALLOCATE (eigenvalues(nmo + nvirt))
554 eigenvalues(1:nmo) = mo_set%eigenvalues(1:nmo)
555 eigenvalues(nmo + 1:nmo + nvirt) = evals_virt(1:nvirt)
556 ALLOCATE (occupation_numbers(nmo + nvirt))
557 occupation_numbers(:) = 0.0_dp
558 occupation_numbers(1:nmo) = mo_set%occupation_numbers(1:nmo)
560 eigenvalues => mo_set%eigenvalues
561 occupation_numbers => mo_set%occupation_numbers
565 fractional_occupation = .false.
566 DO imo = 1, nmo + nvirt
567 IF (occupation_numbers(imo) > 1.0e-10_dp) hoco = max(hoco, eigenvalues(imo))
568 IF (abs(occupation_numbers(imo) - real(nint(occupation_numbers(imo)), kind=
dp)) > &
569 1.0e-8_dp) fractional_occupation = .true.
571 IF (hoco < -0.5_dp*huge(0.0_dp)) hoco = e_fermi
572 IF (
PRESENT(ispin) .AND. dft_control%nspins == 2)
THEN
573 e_fermi_ref(:) = 0.0_dp
574 hoco_ref(:) = -huge(0.0_dp)
576 IF (
ASSOCIATED(mos_ref))
THEN
577 DO ispin_ref = 1, dft_control%nspins
578 CALL get_mo_set(mo_set=mos_ref(ispin_ref), nmo=nmo_ref, mu=e_fermi_ref(ispin_ref))
579 eval_ref => mos_ref(ispin_ref)%eigenvalues
580 occ_ref => mos_ref(ispin_ref)%occupation_numbers
581 DO imo_ref = 1, nmo_ref
582 IF (occ_ref(imo_ref) > 1.0e-10_dp)
THEN
583 hoco_ref(ispin_ref) = max(hoco_ref(ispin_ref), eval_ref(imo_ref))
585 IF (abs(occ_ref(imo_ref) - real(nint(occ_ref(imo_ref)), kind=
dp)) > &
586 1.0e-8_dp) fractional_occupation = .true.
588 IF (hoco_ref(ispin_ref) < -0.5_dp*huge(0.0_dp)) hoco_ref(ispin_ref) = e_fermi_ref(ispin_ref)
591 e_fermi_ref(:) = e_fermi
595 e_fermi_ref(:) = e_fermi
599 SELECT CASE (resolved_energy_zero)
603 energy_ref = maxval(hoco_ref(1:dft_control%nspins))
605 energy_ref = maxval(e_fermi_ref(1:dft_control%nspins))
615 ALLOCATE (vecbuffer(1, nao))
617 ALLOCATE (firstrow(natom))
621 DO ildos = 1, n_r_ldos
622 IF (eigenvalues(1) > r_ldos_p(ildos)%ldos%eval_range(1))
THEN
623 r_ldos_p(ildos)%ldos%eval_range(1) = eigenvalues(1)
625 IF (eigenvalues(nmo + nvirt) < r_ldos_p(ildos)%ldos%eval_range(2))
THEN
626 r_ldos_p(ildos)%ldos%eval_range(2) = eigenvalues(nmo + nvirt)
630 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T15,A))') &
631 "---- PDOS: start iteration on the KS states --- "
633 DO imo = 1, nmo + nvirt
635 IF (output_unit > 0 .AND. mod(imo, out_each) == 0)
WRITE (unit=output_unit, fmt=
'((T20,A,I10))') &
636 " KS state index : ", imo
640 nao, 1, transpose=.true.)
643 nao, 1, transpose=.true.)
649 firstrow(iatom) = irow
650 NULLIFY (orb_basis_set)
651 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
652 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
657 IF (separate_components)
THEN
660 DO ishell = 1, nshell(iset)
661 lshell = l(ishell, iset)
662 DO iso = 1,
nso(lshell)
663 lcomponent =
nsoset(lshell - 1) + iso
664 pdos_array(lcomponent, ikind, imo) = &
665 pdos_array(lcomponent, ikind, imo) + &
666 vecbuffer(1, irow)*vecbuffer(1, irow)
674 DO ishell = 1, nshell(iset)
675 lshell = l(ishell, iset)
676 DO iso = 1,
nso(lshell)
677 pdos_array(lshell, ikind, imo) = &
678 pdos_array(lshell, ikind, imo) + &
679 vecbuffer(1, irow)*vecbuffer(1, irow)
689 DO il = 1, ldos_p(ildos)%ldos%nlist
690 iatom = ldos_p(ildos)%ldos%list_index(il)
692 irow = firstrow(iatom)
693 NULLIFY (orb_basis_set)
694 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
695 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
701 ldos_p(ildos)%ldos%maxl = max(ldos_p(ildos)%ldos%maxl, maxl)
702 IF (ldos_p(ildos)%ldos%separate_components)
THEN
705 DO ishell = 1, nshell(iset)
706 lshell = l(ishell, iset)
707 DO iso = 1,
nso(lshell)
708 lcomponent =
nsoset(lshell - 1) + iso
709 ldos_p(ildos)%ldos%pdos_array(lcomponent, imo) = &
710 ldos_p(ildos)%ldos%pdos_array(lcomponent, imo) + &
711 vecbuffer(1, irow)*vecbuffer(1, irow)
719 DO ishell = 1, nshell(iset)
720 lshell = l(ishell, iset)
721 DO iso = 1,
nso(lshell)
722 ldos_p(ildos)%ldos%pdos_array(lshell, imo) = &
723 ldos_p(ildos)%ldos%pdos_array(lshell, imo) + &
724 vecbuffer(1, irow)*vecbuffer(1, irow)
734 DO ildos = 1, n_r_ldos
735 IF (r_ldos_p(ildos)%ldos%eval_range(1) <= eigenvalues(imo) .AND. &
736 r_ldos_p(ildos)%ldos%eval_range(2) >= eigenvalues(imo))
THEN
740 wf_r, wf_g, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, &
744 wf_r, wf_g, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, &
747 r_ldos_p(ildos)%ldos%pdos_array(imo) = 0.0_dp
748 DO il = 1, r_ldos_p(ildos)%ldos%npoints
750 jx = r_ldos_p(ildos)%ldos%index_grid_local(1, il)
751 jy = r_ldos_p(ildos)%ldos%index_grid_local(2, il)
752 jz = r_ldos_p(ildos)%ldos%index_grid_local(3, il)
753 r_ldos_p(ildos)%ldos%pdos_array(imo) = r_ldos_p(ildos)%ldos%pdos_array(imo) + &
754 wf_r%array(jx, jy, jz)*wf_r%array(jx, jy, jz)
756 r_ldos_p(ildos)%ldos%pdos_array(imo) = r_ldos_p(ildos)%ldos%pdos_array(imo)*dvol
762 DEALLOCATE (vecbuffer)
765 IF (append .AND. iterstep > 1)
THEN
771 IF (write_pdos_file)
THEN
774 NULLIFY (orb_basis_set)
776 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
782 IF (
PRESENT(ispin))
THEN
783 IF (
PRESENT(xas_mittle))
THEN
784 my_mittle = trim(xas_mittle)//trim(spin(ispin))//
"_k"//trim(adjustl(
cp_to_string(ikind)))
786 my_mittle = trim(spin(ispin))//
"_k"//trim(adjustl(
cp_to_string(ikind)))
794 IF (write_pdos_file .AND. do_curve)
THEN
795 IF (separate_components)
THEN
796 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle)//
"_curve", my_pos, my_act, iterstep, &
797 e_fermi, hoco, energy_ref, trim(zero_label), &
798 "Projected DOS for atomic kind "//trim(kind_name), &
799 maxl, .true., pdos_array(1:
nsoset(maxl), ikind, :), &
800 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
801 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
803 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle)//
"_curve", my_pos, my_act, iterstep, &
804 e_fermi, hoco, energy_ref, trim(zero_label), &
805 "Projected DOS for atomic kind "//trim(kind_name), &
806 maxl, .false., pdos_array(0:maxl, ikind, :), &
807 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
808 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
812 IF (write_pdos_file)
THEN
814 extension=
".pdos", file_position=my_pos, file_action=my_act, &
815 file_form=
"FORMATTED", middle_name=trim(my_mittle))
818 fmtstr1 =
"(I8,2X,2F16.6, (2X,F16.8))"
819 fmtstr2 =
"(A42, (10X,A8))"
820 IF (separate_components)
THEN
821 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)")
nsoset(maxl) + 1
822 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)")
nsoset(maxl) + 1
824 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)") maxl + 2
825 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)") maxl + 2
828 WRITE (unit=iw, fmt=
"(A,I0)") &
829 "# Projected DOS for atomic kind "//trim(kind_name)//
" at iteration step i = ", iterstep
830 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
831 "# E(Fermi) = ", e_fermi,
" a.u. = ", e_fermi*ev_factor,
" eV"
832 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
833 "# E(HOCO) = ", hoco,
" a.u. = ", hoco*ev_factor,
" eV"
834 IF (separate_components)
THEN
835 ALLOCATE (tmp_str(0:0, 0:maxl, -maxl:maxl))
843 WRITE (unit=iw, fmt=fmtstr2) &
844 "# MO Energy[a.u.] Occupation",
"Total", &
845 ((trim(tmp_str(0, il, im)), im=-il, il), il=0, maxl)
846 DO imo = 1, nmo + nvirt
847 WRITE (unit=iw, fmt=fmtstr1) imo, eigenvalues(imo), &
848 occupation_numbers(imo), sum(pdos_array(1:
nsoset(maxl), ikind, imo)), &
849 (pdos_array(lshell, ikind, imo), lshell=1,
nsoset(maxl))
853 WRITE (unit=iw, fmt=fmtstr2) &
854 "# MO Energy[a.u.] Occupation",
"Total", &
855 (trim(
l_sym(il)), il=0, maxl)
856 DO imo = 1, nmo + nvirt
857 WRITE (unit=iw, fmt=fmtstr1) imo, eigenvalues(imo), &
858 occupation_numbers(imo), sum(pdos_array(0:maxl, ikind, imo)), &
859 (pdos_array(lshell, ikind, imo), lshell=0, maxl)
874 IF (ldos_p(ildos)%ldos%maxl > 0)
THEN
876 IF (
PRESENT(ispin))
THEN
877 IF (
PRESENT(xas_mittle))
THEN
878 my_mittle = trim(xas_mittle)//trim(spin(ispin))//
"_list"//trim(ldos_index(ildos))
880 my_mittle = trim(spin(ispin))//
"_list"//trim(ldos_index(ildos))
884 my_mittle =
"list"//trim(ldos_index(ildos))
889 IF (ldos_p(ildos)%ldos%separate_components)
THEN
890 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle)//
"_curve", my_pos, my_act, iterstep, &
891 e_fermi, hoco, energy_ref, trim(zero_label), &
892 "Projected DOS for atom list "//trim(ldos_index(ildos)), &
893 ldos_p(ildos)%ldos%maxl, .true., &
894 ldos_p(ildos)%ldos%pdos_array(1:
nsoset(ldos_p(ildos)%ldos%maxl), :), &
895 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
896 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
898 CALL write_broadened_pdos(logger, dft_section, trim(my_mittle)//
"_curve", my_pos, my_act, iterstep, &
899 e_fermi, hoco, energy_ref, trim(zero_label), &
900 "Projected DOS for atom list "//trim(ldos_index(ildos)), &
901 ldos_p(ildos)%ldos%maxl, .false., &
902 ldos_p(ildos)%ldos%pdos_array(0:ldos_p(ildos)%ldos%maxl, :), &
903 eigenvalues, nmo + nvirt, de, broaden_type, broaden_width, &
904 voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
909 extension=
".pdos", file_position=my_pos, file_action=my_act, &
910 file_form=
"FORMATTED", middle_name=trim(my_mittle))
913 fmtstr1 =
"(I8,2X,2F16.6, (2X,F16.8))"
914 fmtstr2 =
"(A42, (10X,A8))"
915 IF (ldos_p(ildos)%ldos%separate_components)
THEN
916 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)")
nsoset(ldos_p(ildos)%ldos%maxl) + 1
917 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)")
nsoset(ldos_p(ildos)%ldos%maxl) + 1
919 WRITE (unit=fmtstr1(15:16), fmt=
"(I2)") ldos_p(ildos)%ldos%maxl + 2
920 WRITE (unit=fmtstr2(6:7), fmt=
"(I2)") ldos_p(ildos)%ldos%maxl + 2
923 WRITE (unit=iw, fmt=
"(A,I0,A,I0,A,I0)") &
924 "# Projected DOS for list ", ildos,
" of ", ldos_p(ildos)%ldos%nlist, &
925 " atoms, at iteration step i = ", iterstep
926 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
927 "# E(Fermi) = ", e_fermi,
" a.u. = ", e_fermi*ev_factor,
" eV"
928 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
929 "# E(HOCO) = ", hoco,
" a.u. = ", hoco*ev_factor,
" eV"
930 IF (ldos_p(ildos)%ldos%separate_components)
THEN
931 ALLOCATE (tmp_str(0:0, 0:ldos_p(ildos)%ldos%maxl, -ldos_p(ildos)%ldos%maxl:ldos_p(ildos)%ldos%maxl))
933 DO j = 0, ldos_p(ildos)%ldos%maxl
939 WRITE (unit=iw, fmt=fmtstr2) &
940 "# MO Energy[a.u.] Occupation",
"Total", &
941 ((trim(tmp_str(0, il, im)), im=-il, il), il=0, ldos_p(ildos)%ldos%maxl)
942 DO imo = 1, nmo + nvirt
943 WRITE (unit=iw, fmt=fmtstr1) imo, eigenvalues(imo), &
944 occupation_numbers(imo), &
945 sum(ldos_p(ildos)%ldos%pdos_array(1:
nsoset(ldos_p(ildos)%ldos%maxl), imo)), &
946 (ldos_p(ildos)%ldos%pdos_array(lshell, imo), &
947 lshell=1,
nsoset(ldos_p(ildos)%ldos%maxl))
951 WRITE (unit=iw, fmt=fmtstr2) &
952 "# MO Energy[a.u.] Occupation",
"Total", &
953 (trim(
l_sym(il)), il=0, ldos_p(ildos)%ldos%maxl)
954 DO imo = 1, nmo + nvirt
955 WRITE (unit=iw, fmt=fmtstr1) imo, eigenvalues(imo), &
956 occupation_numbers(imo), &
957 sum(ldos_p(ildos)%ldos%pdos_array(0:ldos_p(ildos)%ldos%maxl, imo)), &
958 (ldos_p(ildos)%ldos%pdos_array(lshell, imo), lshell=0, ldos_p(ildos)%ldos%maxl)
969 DO ildos = 1, n_r_ldos
971 npoints = r_ldos_p(ildos)%ldos%npoints
972 CALL para_env%sum(npoints)
973 CALL para_env%sum(np_tot)
974 CALL para_env%sum(r_ldos_p(ildos)%ldos%pdos_array)
975 IF (
PRESENT(ispin))
THEN
976 IF (
PRESENT(xas_mittle))
THEN
977 my_mittle = trim(xas_mittle)//trim(spin(ispin))//
"_r_list"//trim(r_ldos_index(ildos))
979 my_mittle = trim(spin(ispin))//
"_r_list"//trim(r_ldos_index(ildos))
983 my_mittle =
"r_list"//trim(r_ldos_index(ildos))
988 extension=
".pdos", file_position=my_pos, file_action=my_act, &
989 file_form=
"FORMATTED", middle_name=trim(my_mittle))
991 fmtstr1 =
"(I8,2X,2F16.6, (2X,F16.8))"
992 fmtstr2 =
"(A42, (10X,A8))"
994 WRITE (unit=iw, fmt=
"(A,I0,A,F12.6,F12.6,A)") &
995 "# Projected DOS in real space, using ", npoints, &
996 " points of the grid, and eval in the range", r_ldos_p(ildos)%ldos%eval_range(1:2),
" Hartree"
997 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
998 "# E(Fermi) = ", e_fermi,
" a.u. = ", e_fermi*ev_factor,
" eV"
999 WRITE (unit=iw, fmt=
"(A,F12.6,A,F12.6,A)") &
1000 "# E(HOCO) = ", hoco,
" a.u. = ", hoco*ev_factor,
" eV"
1001 WRITE (unit=iw, fmt=
"(A)") &
1002 "# MO Energy[a.u.] Occupation LDOS"
1003 DO imo = 1, nmo + nvirt
1004 IF (r_ldos_p(ildos)%ldos%eval_range(1) <= eigenvalues(imo) .AND. &
1005 r_ldos_p(ildos)%ldos%eval_range(2) >= eigenvalues(imo))
THEN
1006 WRITE (unit=iw, fmt=
"(I8,2X,2F16.6,E20.10,E20.10)") imo, &
1007 eigenvalues(imo), occupation_numbers(imo), &
1008 r_ldos_p(ildos)%ldos%pdos_array(imo), r_ldos_p(ildos)%ldos%pdos_array(imo)*np_tot
1018 DEALLOCATE (pdos_array)
1019 DEALLOCATE (firstrow)
1022 DEALLOCATE (ldos_p(ildos)%ldos%pdos_array)
1023 DEALLOCATE (ldos_p(ildos)%ldos%list_index)
1024 DEALLOCATE (ldos_p(ildos)%ldos)
1027 DEALLOCATE (ldos_index)
1030 DO ildos = 1, n_r_ldos
1031 DEALLOCATE (r_ldos_p(ildos)%ldos%index_grid_local)
1032 DEALLOCATE (r_ldos_p(ildos)%ldos%pdos_array)
1033 DEALLOCATE (r_ldos_p(ildos)%ldos%list_index)
1034 IF (.NOT. read_r(1, ildos))
THEN
1035 DEALLOCATE (r_ldos_p(ildos)%ldos%x_range)
1037 IF (.NOT. read_r(2, ildos))
THEN
1038 DEALLOCATE (r_ldos_p(ildos)%ldos%y_range)
1040 IF (.NOT. read_r(3, ildos))
THEN
1041 DEALLOCATE (r_ldos_p(ildos)%ldos%z_range)
1043 IF (.NOT. read_r(4, ildos))
THEN
1044 DEALLOCATE (r_ldos_p(ildos)%ldos%eval_range)
1046 DEALLOCATE (r_ldos_p(ildos)%ldos)
1049 DEALLOCATE (r_ldos_p)
1050 DEALLOCATE (r_ldos_index)
1051 CALL auxbas_pw_pool%give_back_pw(wf_r)
1052 CALL auxbas_pw_pool%give_back_pw(wf_g)
1056 DEALLOCATE (eigenvalues)
1057 DEALLOCATE (occupation_numbers)
1060 CALL timestop(handle)
1076 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: pdos_print_key
1077 LOGICAL,
INTENT(IN),
OPTIONAL :: write_pdos, write_pdos_curve
1079 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_projected_dos_kp'
1081 CHARACTER(LEN=32) :: zero_label
1082 CHARACTER(LEN=default_string_length) :: kind_name, my_act, my_mittle, my_pos, &
1083 my_print_key, spin(2)
1084 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: zvecbuffer
1085 INTEGER :: broaden_type, energy_zero, fractional_occupation_int, handle, icomp, ik, ikind, &
1086 imo, ispin, iterstep, maxl, maxlgto, n_r_ldos, nao, ncomp, ndigits, nhist, nkind, nldos, &
1087 nmo_kp, nspins, output_unit, resolved_energy_zero
1088 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ao_comp, ao_kind, ao_l, kind_maxl
1089 LOGICAL :: append, fractional_occupation, &
1090 separate_components, should_output, &
1091 write_curve, write_pdos_file
1092 REAL(kind=
dp) :: broaden_cutoff, broaden_width, de, e1, &
1093 e2, e_fermi(2), emax, emin, &
1094 energy_ref(2), hoco(2), voigt_mixing, &
1096 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ao_weight
1097 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: proj_weight, vecbuffer
1098 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: pdos_curve
1099 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, occupation_numbers
1105 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp
1113 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1117 NULLIFY (logger, kpoints, dft_control, para_env, atomic_kind_set, qs_kind_set, particle_set)
1118 NULLIFY (matrix_s_kp, scf_env)
1119 NULLIFY (kp, mo_set, eigenvalues, fm_struct_tmp, orb_basis_set, curve_section, ldos_section)
1121 my_print_key =
"PRINT%PDOS"
1122 IF (
PRESENT(pdos_print_key)) my_print_key = trim(pdos_print_key)
1123 write_pdos_file = .true.
1124 IF (
PRESENT(write_pdos)) write_pdos_file = write_pdos
1127 IF (
PRESENT(write_pdos_curve)) write_curve = write_pdos_curve
1131 IF ((.NOT. should_output))
RETURN
1133 CALL timeset(routinen, handle)
1134 iterstep = logger%iter_info%iteration(logger%iter_info%n_rlevel)
1136 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,I10))') &
1137 " Calculate k-point PDOS at iteration step ", iterstep
1141 dft_control=dft_control, &
1142 matrix_s_kp=matrix_s_kp, &
1144 atomic_kind_set=atomic_kind_set, &
1145 qs_kind_set=qs_kind_set, &
1146 particle_set=particle_set)
1147 para_env => kpoints%para_env_inter_kp
1148 nspins = dft_control%nspins
1149 nkind =
SIZE(atomic_kind_set)
1151 IF (.NOT.
ASSOCIATED(kpoints%kp_env))
THEN
1152 cpwarn(
"No local k points available for k-point PDOS")
1153 CALL timestop(handle)
1156 IF (
SIZE(kpoints%kp_env) == 0)
THEN
1157 cpwarn(
"No local k points available for k-point PDOS")
1158 CALL timestop(handle)
1164 IF (trim(my_print_key) ==
"PRINT%DOS")
THEN
1165 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%PDOS%COMPONENTS", l_val=separate_components)
1167 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%COMPONENTS", l_val=separate_components)
1170 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%BROADEN%TYPE", i_val=broaden_type)
1171 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%BROADEN%WIDTH", r_val=broaden_width)
1172 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%BROADEN%VOIGT_MIXING", r_val=voigt_mixing)
1173 CALL section_vals_val_get(dft_section, trim(my_print_key)//
"%CURVE%ENERGY_ZERO", i_val=energy_zero)
1174 ndigits = min(max(ndigits, 1), 10)
1175 IF (write_curve .AND. de <= 0.0_dp)
THEN
1176 cpwarn(
"Broadened k-point PDOS output requires DELTA_E > 0 and will be skipped")
1177 CALL timestop(handle)
1180 IF (write_curve) de = max(de, 0.00001_dp)
1186 IF (nldos > 0 .OR. n_r_ldos > 0)
THEN
1187 cpwarn(
"LDOS/R_LDOS are not implemented for k-point PDOS and will be ignored")
1189 IF (write_pdos_file)
THEN
1190 cpwarn(
"State-resolved k-point PDOS output is not implemented yet")
1192 IF (.NOT. write_curve)
THEN
1193 CALL timestop(handle)
1196 IF (broaden_width <= 0.0_dp)
THEN
1197 cpwarn(
"Broadened k-point PDOS output requires a finite WIDTH and will be skipped")
1198 CALL timestop(handle)
1202 IF (separate_components)
THEN
1207 ALLOCATE (kind_maxl(nkind))
1210 NULLIFY (orb_basis_set)
1211 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1213 kind_maxl(ikind) = maxl
1217 emax = -huge(0.0_dp)
1219 hoco(:) = -huge(0.0_dp)
1220 fractional_occupation = .false.
1221 IF (kpoints%nkp /= 0)
THEN
1222 DO ik = 1,
SIZE(kpoints%kp_env)
1223 kp => kpoints%kp_env(ik)%kpoint_env
1224 DO ispin = 1, nspins
1225 mo_set => kp%mos(1, ispin)
1226 CALL get_mo_set(mo_set=mo_set, nmo=nmo_kp, mu=e_fermi(ispin))
1227 eigenvalues => mo_set%eigenvalues
1228 occupation_numbers => mo_set%occupation_numbers
1230 IF (occupation_numbers(imo) > 1.0e-10_dp) hoco(ispin) = max(hoco(ispin), eigenvalues(imo))
1231 IF (abs(occupation_numbers(imo) - real(nint(occupation_numbers(imo)), kind=
dp)) > &
1232 1.0e-8_dp) fractional_occupation = .true.
1234 e1 = minval(eigenvalues(1:nmo_kp))
1235 e2 = maxval(eigenvalues(1:nmo_kp))
1236 emin = min(emin, e1)
1237 emax = max(emax, e2)
1241 CALL para_env%min(emin)
1242 CALL para_env%max(emax)
1243 CALL para_env%max(e_fermi)
1244 CALL para_env%max(hoco)
1245 fractional_occupation_int = merge(1, 0, fractional_occupation)
1246 CALL para_env%max(fractional_occupation_int)
1247 fractional_occupation = (fractional_occupation_int /= 0)
1248 DO ispin = 1, nspins
1249 IF (hoco(ispin) < -0.5_dp*huge(0.0_dp)) hoco(ispin) = e_fermi(ispin)
1252 SELECT CASE (resolved_energy_zero)
1254 energy_ref(:) = 0.0_dp
1256 energy_ref(:) = maxval(hoco(1:nspins))
1258 energy_ref(:) = maxval(e_fermi(1:nspins))
1263 emin = emin - broaden_cutoff
1264 emax = emax + broaden_cutoff
1265 nhist = nint((emax - emin)/de) + 1
1266 ALLOCATE (pdos_curve(nhist, ncomp, nkind, nspins))
1271 CALL diag_kp_smat(matrix_s_kp, kpoints, scf_env%scf_work1)
1274 kp => kpoints%kp_env(1)%kpoint_env
1275 mo_set => kp%mos(1, 1)
1277 CALL build_pdos_ao_map(qs_kind_set, particle_set, nao, ao_kind, ao_l, ao_comp)
1278 ALLOCATE (ao_weight(nao), proj_weight(ncomp, nkind))
1279 ALLOCATE (vecbuffer(1, nao), zvecbuffer(1, nao))
1281 IF (kpoints%nkp /= 0)
THEN
1282 DO ik = 1,
SIZE(kpoints%kp_env)
1283 kp => kpoints%kp_env(ik)%kpoint_env
1285 DO ispin = 1, nspins
1286 mo_set => kp%mos(1, ispin)
1287 CALL get_mo_set(mo_set=mo_set, nao=nao, nmo=nmo_kp)
1288 eigenvalues => mo_set%eigenvalues
1289 CALL cp_fm_get_info(mo_set%mo_coeff, matrix_struct=fm_struct_tmp)
1290 IF (kpoints%use_real_wfn)
THEN
1291 CALL cp_fm_create(shalfc, fm_struct_tmp, name=
"shalfc")
1299 IF (kpoints%use_real_wfn)
THEN
1301 ao_weight(:) = vecbuffer(1, 1:nao)**2
1304 ao_weight(:) = real(conjg(zvecbuffer(1, 1:nao))*zvecbuffer(1, 1:nao), kind=
dp)
1306 proj_weight = 0.0_dp
1307 CALL accumulate_pdos_weights(ao_weight, ao_kind, ao_l, ao_comp, &
1308 separate_components, proj_weight)
1310 IF (kind_maxl(ikind) < 0) cycle
1311 IF (separate_components)
THEN
1312 DO icomp = 1,
nsoset(kind_maxl(ikind))
1314 emin, de, eigenvalues(imo), &
1315 wkp*proj_weight(icomp, ikind), &
1316 broaden_type, broaden_width, voigt_mixing)
1319 DO icomp = 1, kind_maxl(ikind) + 1
1321 emin, de, eigenvalues(imo), &
1322 wkp*proj_weight(icomp, ikind), &
1323 broaden_type, broaden_width, voigt_mixing)
1329 IF (kpoints%use_real_wfn)
THEN
1337 CALL para_env%sum(pdos_curve)
1339 IF (append .AND. iterstep > 1)
THEN
1347 IF (write_pdos_file)
THEN
1349 IF (kind_maxl(ikind) < 0) cycle
1351 DO ispin = 1, nspins
1352 IF (nspins == 2)
THEN
1353 my_mittle = trim(spin(ispin))//
"_k"//trim(adjustl(
cp_to_string(ikind)))
1357 CALL write_broadened_pdos_curve(logger, dft_section, trim(my_mittle)//
"_curve", my_pos, my_act, &
1358 iterstep, e_fermi(ispin), hoco(ispin), energy_ref(ispin), &
1360 "K-point projected DOS for atomic kind "//trim(kind_name), &
1361 kind_maxl(ikind), separate_components, &
1362 pdos_curve(:, :, ikind, ispin), emin, de, &
1363 broaden_type, broaden_width, voigt_mixing, ndigits, pdos_print_key=trim(my_print_key))
1368 DEALLOCATE (ao_comp, ao_kind, ao_l, ao_weight, kind_maxl, pdos_curve, proj_weight, &
1369 vecbuffer, zvecbuffer)
1371 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.