210#include "./base/base_uses.f90"
216 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
224 CHARACTER(len=*),
PARAMETER :: &
225 str_mo_cubes =
"PRINT%MO_CUBES", &
226 str_mo_openpmd =
"PRINT%MO_OPENPMD", &
227 str_elf_cubes =
"PRINT%ELF_CUBE", &
228 str_elf_openpmd =
"PRINT%ELF_OPENPMD", &
229 str_e_density_cubes =
"PRINT%E_DENSITY_CUBE", &
230 str_e_density_openpmd =
"PRINT%E_DENSITY_OPENPMD"
232 INTEGER,
PARAMETER :: grid_output_cubes = 1, grid_output_openpmd = 2
234 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_density = &
235 [-3, 0, 0, 0, 0, 0, 0]
236 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_dimensionless = &
237 [0, 0, 0, 0, 0, 0, 0]
238 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_wavefunction = &
239 [-1.5_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp]
240 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_density =
a_bohr**(-3)
241 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_dimensionless = 1.0_dp
242 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_wavefunction =
a_bohr**(-1.5_dp)
248 CHARACTER(len=default_string_length) :: relative_section_key =
""
249 CHARACTER(len=default_string_length) :: absolute_section_key =
""
250 CHARACTER(len=7) :: format_name =
""
251 INTEGER :: grid_output = -1
252 LOGICAL :: do_output = .false.
255 PROCEDURE,
PUBLIC :: print_key_unit_nr => cp_forward_print_key_unit_nr
257 PROCEDURE,
PUBLIC :: write_pw => cp_forward_write_pw
259 PROCEDURE,
PUBLIC :: print_key_finished_output => cp_forward_print_key_finished_output
261 PROCEDURE,
PUBLIC :: do_openpmd => cp_section_key_do_openpmd
262 PROCEDURE,
PUBLIC :: do_cubes => cp_section_key_do_cubes
263 PROCEDURE,
PUBLIC :: concat_to_relative => cp_section_key_concat_to_relative
265 END TYPE cp_section_key
276 CLASS(cp_section_key),
INTENT(IN) :: self
277 CHARACTER(*),
INTENT(IN) :: extend_by
278 CHARACTER(len=default_string_length) :: res
280 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
281 res = trim(self%absolute_section_key)//trim(extend_by)
283 res = trim(self%absolute_section_key)//
"%"//trim(extend_by)
293 FUNCTION cp_section_key_concat_to_relative(self, extend_by)
RESULT(res)
294 CLASS(cp_section_key),
INTENT(IN) :: self
295 CHARACTER(*),
INTENT(IN) :: extend_by
296 CHARACTER(len=default_string_length) :: res
298 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
299 res = trim(self%relative_section_key)//trim(extend_by)
301 res = trim(self%relative_section_key)//
"%"//trim(extend_by)
303 END FUNCTION cp_section_key_concat_to_relative
310 FUNCTION cp_section_key_do_cubes(self)
RESULT(res)
311 CLASS(cp_section_key) :: self
314 res = self%do_output .AND. self%grid_output == grid_output_cubes
315 END FUNCTION cp_section_key_do_cubes
322 FUNCTION cp_section_key_do_openpmd(self)
RESULT(res)
323 CLASS(cp_section_key) :: self
326 res = self%do_output .AND. self%grid_output == grid_output_openpmd
327 END FUNCTION cp_section_key_do_openpmd
357 FUNCTION cp_forward_print_key_unit_nr( &
366 ignore_should_output, &
377 openpmd_unit_dimension, &
379 sim_time)
RESULT(res)
381 CLASS(cp_section_key),
INTENT(IN) :: self
384 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
385 CHARACTER(len=*),
INTENT(IN) :: extension
386 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
387 LOGICAL,
INTENT(IN),
OPTIONAL :: local, log_filename, ignore_should_output
388 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: file_form, file_position, file_action, &
390 LOGICAL,
INTENT(IN),
OPTIONAL :: do_backup, on_file
391 LOGICAL,
INTENT(OUT),
OPTIONAL :: is_new_file
392 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
393 CHARACTER(len=default_path_length),
INTENT(OUT), &
395 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
396 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
397 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
398 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
401 IF (self%grid_output == grid_output_cubes)
THEN
403 logger, basis_section, print_key_path, extension=extension, &
404 middle_name=middle_name, local=local, log_filename=log_filename, &
405 ignore_should_output=ignore_should_output, file_form=file_form, &
406 file_position=file_position, file_action=file_action, &
407 file_status=file_status, do_backup=do_backup, on_file=on_file, &
408 is_new_file=is_new_file, mpi_io=mpi_io, fout=fout)
414 middle_name=middle_name, &
415 ignore_should_output=ignore_should_output, &
418 openpmd_basename=openpmd_basename, &
419 openpmd_unit_dimension=openpmd_unit_dimension, &
420 openpmd_unit_si=openpmd_unit_si, &
423 END FUNCTION cp_forward_print_key_unit_nr
441 SUBROUTINE cp_forward_write_pw( &
454 CLASS(cp_section_key),
INTENT(IN) :: self
456 INTEGER,
INTENT(IN) :: unit_nr
457 CHARACTER(*),
INTENT(IN),
OPTIONAL :: title
459 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: stride
460 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: max_file_size_mb
461 LOGICAL,
INTENT(IN),
OPTIONAL :: zero_tails, silent, mpi_io
462 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: zeff
464 IF (self%grid_output == grid_output_cubes)
THEN
465 CALL cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
467 CALL cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
469 END SUBROUTINE cp_forward_write_pw
485 SUBROUTINE cp_forward_print_key_finished_output(self, unit_nr, logger, basis_section, &
486 print_key_path, local, ignore_should_output, on_file, &
488 CLASS(cp_section_key),
INTENT(IN) :: self
489 INTEGER,
INTENT(INOUT) :: unit_nr
492 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
493 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, on_file, &
496 IF (self%grid_output == grid_output_cubes)
THEN
501 END SUBROUTINE cp_forward_print_key_finished_output
521 FUNCTION cube_or_openpmd(input, str_cubes, str_openpmd, logger)
RESULT(res)
523 CHARACTER(len=*),
INTENT(IN) :: str_cubes, str_openpmd
525 TYPE(cp_section_key) :: res
527 LOGICAL :: do_cubes, do_openpmd
530 logger%iter_info, input, &
531 "DFT%"//trim(adjustl(str_cubes))),
cp_p_file)
533 logger%iter_info, input, &
534 "DFT%"//trim(adjustl(str_openpmd))),
cp_p_file)
538 cpassert(.NOT. (do_cubes .AND. do_openpmd))
539 res%do_output = do_cubes .OR. do_openpmd
541 res%grid_output = grid_output_openpmd
542 res%relative_section_key = trim(adjustl(str_openpmd))
543 res%format_name =
"openPMD"
545 res%grid_output = grid_output_cubes
546 res%relative_section_key = trim(adjustl(str_cubes))
547 res%format_name =
"Cube"
549 res%absolute_section_key =
"DFT%"//trim(adjustl(res%relative_section_key))
550 END FUNCTION cube_or_openpmd
558 FUNCTION section_key_do_write(grid_output)
RESULT(res)
559 INTEGER,
INTENT(IN) :: grid_output
560 CHARACTER(len=32) :: res
562 IF (grid_output == grid_output_cubes)
THEN
564 ELSE IF (grid_output == grid_output_openpmd)
THEN
565 res =
"%WRITE_OPENPMD"
567 END FUNCTION section_key_do_write
576 SUBROUTINE print_density_output_message(output_unit, prefix, e_density_section, filename)
577 INTEGER,
INTENT(IN) :: output_unit
578 CHARACTER(len=*),
INTENT(IN) :: prefix
579 TYPE(cp_section_key),
INTENT(IN) :: e_density_section
580 CHARACTER(len=*),
INTENT(IN) :: filename
582 IF (e_density_section%grid_output == grid_output_openpmd)
THEN
583 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
584 trim(prefix)//
" is written in " &
585 //e_density_section%format_name &
586 //
" file format to the file / file pattern:", &
589 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
590 trim(prefix)//
" is written in " &
591 //e_density_section%format_name &
592 //
" file format to the file:", &
595 END SUBROUTINE print_density_output_message
618 CHARACTER(6),
OPTIONAL :: wf_type
619 LOGICAL,
OPTIONAL :: do_mp2
621 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw', &
622 warning_cube_kpoint =
"Print MO cubes not implemented for k-point calculations", &
623 warning_openpmd_kpoint =
"Writing to openPMD not implemented for k-point calculations"
625 INTEGER :: handle, homo, ispin, min_lumos, n_rep, nchk_nmoloc, nhomo, nlumo, nlumo_molden, &
626 nlumo_stm, nlumos, nmo, nspins, output_unit, unit_nr
627 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
628 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_stm, &
629 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
630 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
632 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
633 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
637 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
638 unoccupied_evals, unoccupied_evals_stm
639 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
640 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
641 TARGET :: homo_localized, lumo_localized, &
643 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
644 unoccupied_orbs, unoccupied_orbs_stm
647 TYPE(cp_section_key) :: mo_section
648 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
650 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
662 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
670 localize_section, print_key, &
671 sprint_section, stm_section
673 CALL timeset(routinen, handle)
680 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
681 IF (
PRESENT(wf_type))
THEN
682 IF (output_unit > 0)
THEN
683 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
684 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
685 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
692 my_localized_wfn = .false.
693 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
694 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
695 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
696 unoccupied_evals_stm, molecule_set, mo_derivs, &
697 subsys, particles, input, print_key, kinetic_m, marked_states, &
698 mixed_evals, qs_loc_env_mixed)
699 NULLIFY (lumo_ptr, rho_ao)
706 p_loc_mixed = .false.
708 cpassert(
ASSOCIATED(scf_env))
709 cpassert(
ASSOCIATED(qs_env))
712 dft_control=dft_control, &
713 molecule_set=molecule_set, &
714 scf_control=scf_control, &
715 do_kpoints=do_kpoints, &
720 particle_set=particle_set, &
721 atomic_kind_set=atomic_kind_set, &
722 qs_kind_set=qs_kind_set)
729 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
730 DO ispin = 1, dft_control%nspins
731 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
736 CALL update_hartree_with_mp2(rho, qs_env)
739 CALL write_available_results(qs_env, scf_env)
743 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
745 cpassert(
ASSOCIATED(kinetic_m))
746 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
750 IF (unit_nr > 0)
THEN
751 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
754 "DFT%PRINT%KINETIC_ENERGY")
758 CALL qs_scf_post_charges(input, logger, qs_env)
771 IF (loc_print_explicit)
THEN
791 IF (loc_explicit)
THEN
801 p_loc_mixed = .false.
805 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
806 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
807 "therefore localization of unoccupied states will be skipped!")
818 mo_section = cube_or_openpmd(input, str_mo_cubes, str_mo_openpmd, logger)
820 IF (loc_print_explicit)
THEN
824 do_wannier_cubes = .false.
826 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
827 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
830 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
831 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
833 CALL auxbas_pw_pool%create_pw(wf_r)
834 CALL auxbas_pw_pool%create_pw(wf_g)
837 IF (dft_control%restricted)
THEN
841 nspins = dft_control%nspins
844 IF (dft_control%restricted .AND. (mo_section%do_output .OR. p_loc_homo))
THEN
845 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
850 cpwarn_if(mo_section%do_cubes(), warning_cube_kpoint)
851 cpwarn_if(mo_section%do_openpmd(), warning_openpmd_kpoint)
856 IF ((mo_section%do_output .AND. nhomo /= 0) .OR. do_stm)
THEN
858 IF (dft_control%do_admm)
THEN
860 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
862 IF (dft_control%hairy_probes)
THEN
863 scf_control%smear%do_smear = .false.
864 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
866 probe=dft_control%probe)
868 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
871 DO ispin = 1, dft_control%nspins
872 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
873 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
877 IF (mo_section%do_output .AND. nhomo /= 0)
THEN
880 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
881 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
882 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
883 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
894 cpwarn(
"Localization not implemented for k-point calculations!")
895 ELSEIF (dft_control%restricted &
898 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
900 ALLOCATE (occupied_orbs(dft_control%nspins))
901 ALLOCATE (occupied_evals(dft_control%nspins))
902 ALLOCATE (homo_localized(dft_control%nspins))
903 DO ispin = 1, dft_control%nspins
904 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
905 eigenvalues=mo_eigenvalues)
906 occupied_orbs(ispin) = mo_coeff
907 occupied_evals(ispin)%array => mo_eigenvalues
908 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
909 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
912 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
915 ALLOCATE (qs_loc_env_homo)
918 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
919 mo_section%do_output, mo_loc_history=mo_loc_history)
921 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
924 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
926 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
931 homo_localized, do_homo)
933 DEALLOCATE (occupied_orbs)
934 DEALLOCATE (occupied_evals)
936 IF (qs_loc_env_homo%do_localize)
THEN
937 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
944 IF (mo_section%do_output .OR. p_loc_lumo)
THEN
946 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
949 compute_lumos = mo_section%do_output .AND. nlumo /= 0
950 compute_lumos = compute_lumos .OR. p_loc_lumo
952 DO ispin = 1, dft_control%nspins
953 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
954 compute_lumos = compute_lumos .AND. homo == nmo
957 IF (mo_section%do_output .AND. .NOT. compute_lumos)
THEN
959 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
960 DO ispin = 1, dft_control%nspins
962 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
963 IF (nlumo > nmo - homo)
THEN
966 IF (nlumo == -1)
THEN
969 IF (output_unit > 0)
WRITE (output_unit, *)
" "
970 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
971 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
972 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
975 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
976 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
977 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1, mo_section=mo_section)
983 IF (compute_lumos)
THEN
986 IF (nlumo == 0) check_write = .false.
989 ALLOCATE (qs_loc_env_lumo)
992 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
995 ALLOCATE (unoccupied_orbs(dft_control%nspins))
996 ALLOCATE (unoccupied_evals(dft_control%nspins))
997 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
998 lumo_ptr => unoccupied_orbs
999 DO ispin = 1, dft_control%nspins
1001 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
1002 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
1003 IF (check_write)
THEN
1004 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
1006 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1007 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin, mo_section=mo_section)
1011 IF (p_loc_lumo)
THEN
1012 ALLOCATE (lumo_localized(dft_control%nspins))
1013 DO ispin = 1, dft_control%nspins
1014 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
1015 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
1017 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, mo_section%do_output, &
1018 evals=unoccupied_evals)
1019 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
1020 loc_coeff=unoccupied_orbs)
1022 lumo_localized, wf_r, wf_g, particles, &
1023 unoccupied_orbs, unoccupied_evals, marked_states)
1024 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
1025 evals=unoccupied_evals)
1026 lumo_ptr => lumo_localized
1030 IF (has_homo .AND. has_lumo)
THEN
1031 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1032 DO ispin = 1, dft_control%nspins
1033 IF (.NOT. scf_control%smear%do_smear)
THEN
1034 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
1035 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
1036 "HOMO - LUMO gap [eV] :", gap*
evolt
1042 IF (p_loc_mixed)
THEN
1043 IF (do_kpoints)
THEN
1044 cpwarn(
"Localization not implemented for k-point calculations!")
1045 ELSEIF (dft_control%restricted)
THEN
1046 IF (output_unit > 0)
WRITE (output_unit, *) &
1047 " Unclear how we define MOs / localization in the restricted case... skipping"
1050 ALLOCATE (mixed_orbs(dft_control%nspins))
1051 ALLOCATE (mixed_evals(dft_control%nspins))
1052 ALLOCATE (mixed_localized(dft_control%nspins))
1053 DO ispin = 1, dft_control%nspins
1054 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1055 eigenvalues=mo_eigenvalues)
1056 mixed_orbs(ispin) = mo_coeff
1057 mixed_evals(ispin)%array => mo_eigenvalues
1058 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
1059 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
1062 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
1065 total_zeff_corr = scf_env%sum_zeff_corr
1066 ALLOCATE (qs_loc_env_mixed)
1069 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
1070 mo_section%do_output, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
1073 DO ispin = 1, dft_control%nspins
1074 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
1078 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
1081 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
1083 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
1090 DEALLOCATE (mixed_orbs)
1091 DEALLOCATE (mixed_evals)
1096 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
1097 CALL auxbas_pw_pool%give_back_pw(wf_r)
1098 CALL auxbas_pw_pool%give_back_pw(wf_g)
1102 IF (.NOT. do_kpoints)
THEN
1103 IF (p_loc_homo)
THEN
1105 DEALLOCATE (qs_loc_env_homo)
1107 IF (p_loc_lumo)
THEN
1109 DEALLOCATE (qs_loc_env_lumo)
1111 IF (p_loc_mixed)
THEN
1113 DEALLOCATE (qs_loc_env_mixed)
1118 IF (do_kpoints)
THEN
1121 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
1122 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
1123 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
1124 matrix_s=matrix_s, marked_states=marked_states)
1128 IF (
ASSOCIATED(marked_states))
THEN
1129 DEALLOCATE (marked_states)
1133 IF (.NOT. do_kpoints)
THEN
1134 IF (compute_lumos)
THEN
1135 DO ispin = 1, dft_control%nspins
1136 DEALLOCATE (unoccupied_evals(ispin)%array)
1139 DEALLOCATE (unoccupied_evals)
1140 DEALLOCATE (unoccupied_orbs)
1146 IF (do_kpoints)
THEN
1147 cpwarn(
"STM not implemented for k-point calculations!")
1149 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
1150 IF (nlumo_stm > 0)
THEN
1151 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
1152 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
1153 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
1157 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
1158 unoccupied_evals_stm)
1160 IF (nlumo_stm > 0)
THEN
1161 DO ispin = 1, dft_control%nspins
1162 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
1164 DEALLOCATE (unoccupied_evals_stm)
1171 IF (.NOT. do_kpoints)
THEN
1174 IF (nlumo_molden /= 0 .AND. scf_env%method ==
ot_method_nr)
THEN
1175 CALL get_qs_env(qs_env, mos=mos, qs_kind_set=qs_kind_set, &
1176 particle_set=particle_set, cell=cell)
1177 ALLOCATE (unoccupied_orbs(dft_control%nspins))
1178 ALLOCATE (unoccupied_evals(dft_control%nspins))
1179 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, &
1180 nlumo_molden, nlumos)
1181 IF (output_unit > 0)
THEN
1182 WRITE (output_unit,
'(/,T2,A,I6,A)') &
1183 "MO_MOLDEN| Writing ", nlumos,
" unoccupied orbitals to molden file"
1185 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
1186 unoccupied_orbs=unoccupied_orbs, &
1187 unoccupied_evals=unoccupied_evals, &
1188 qs_env=qs_env, calc_energies=.true.)
1189 DO ispin = 1, dft_control%nspins
1190 DEALLOCATE (unoccupied_evals(ispin)%array)
1193 DEALLOCATE (unoccupied_evals)
1194 DEALLOCATE (unoccupied_orbs)
1199 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1202 CALL qs_scf_post_efg(input, logger, qs_env)
1205 CALL qs_scf_post_et(input, qs_env, dft_control)
1208 CALL qs_scf_post_epr(input, logger, qs_env)
1211 CALL qs_scf_post_molopt(input, logger, qs_env)
1214 CALL qs_scf_post_elf(input, logger, qs_env)
1221 DO ispin = 1, dft_control%nspins
1222 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
1230 CALL timestop(handle)
1243 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
1247 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
1249 INTEGER,
INTENT(IN) :: nlumo
1250 INTEGER,
INTENT(OUT) :: nlumos
1252 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
1254 INTEGER :: handle, homo, ispin, n, nao, nmo, &
1261 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1268 CALL timeset(routinen, handle)
1270 NULLIFY (mos, ks_rmpv, scf_control, dft_control, admm_env, para_env, blacs_env)
1273 matrix_ks=ks_rmpv, &
1274 scf_control=scf_control, &
1275 dft_control=dft_control, &
1276 matrix_s=matrix_s, &
1277 admm_env=admm_env, &
1278 para_env=para_env, &
1279 blacs_env=blacs_env)
1284 DO ispin = 1, dft_control%nspins
1285 NULLIFY (unoccupied_evals(ispin)%array)
1287 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1288 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
1289 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
1290 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1292 nlumos = max(1, min(nlumo, nao - nmo))
1293 IF (nlumo == -1) nlumos = nao - nmo
1294 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1296 nrow_global=n, ncol_global=nlumos)
1297 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1302 NULLIFY (local_preconditioner)
1303 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1304 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1307 NULLIFY (local_preconditioner)
1312 IF (dft_control%do_admm)
THEN
1316 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1317 matrix_c_fm=unoccupied_orbs(ispin), &
1318 matrix_orthogonal_space_fm=mo_coeff, &
1319 eps_gradient=scf_control%eps_lumos, &
1321 iter_max=scf_control%max_iter_lumos, &
1322 size_ortho_space=nmo)
1325 unoccupied_evals(ispin)%array, scr=output_unit, &
1326 ionode=output_unit > 0)
1329 IF (dft_control%do_admm)
THEN
1335 CALL timestop(handle)
1344 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
1349 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
1351 INTEGER :: handle, print_level, unit_nr
1352 LOGICAL :: do_kpoints, print_it
1355 CALL timeset(routinen, handle)
1357 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
1365 log_filename=.false.)
1368 IF (print_it) print_level = 2
1370 IF (print_it) print_level = 3
1381 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
1382 log_filename=.false.)
1384 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
1388 CALL timestop(handle)
1390 END SUBROUTINE qs_scf_post_charges
1407 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1408 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
1417 INTEGER,
INTENT(IN) :: homo, ispin
1418 TYPE(cp_section_key) :: mo_section
1420 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1422 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1423 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1425 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1426 LOGICAL :: append_cube, mpi_io
1431 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1433 CALL timeset(routinen, handle)
1438 cpassert(mo_section%grid_output /= grid_output_openpmd)
1441 NULLIFY (list_index)
1444 ,
cp_p_file) .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1445 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
1447 IF (mo_section%grid_output == grid_output_cubes)
THEN
1448 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1450 my_pos_cube =
"REWIND"
1451 IF (append_cube)
THEN
1452 my_pos_cube =
"APPEND"
1454 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), n_rep_val=n_rep)
1459 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), i_rep_val=ir, &
1461 IF (
ASSOCIATED(
list))
THEN
1463 DO i = 1,
SIZE(
list)
1464 list_index(i + nlist) =
list(i)
1466 nlist = nlist +
SIZE(
list)
1471 IF (nhomo == -1) nhomo = homo
1472 nlist = homo - max(1, homo - nhomo + 1) + 1
1473 ALLOCATE (list_index(nlist))
1475 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1479 ivector = list_index(i)
1481 atomic_kind_set=atomic_kind_set, &
1482 qs_kind_set=qs_kind_set, &
1484 particle_set=particle_set, &
1487 cell, dft_control, particle_set, pw_env)
1488 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1491 unit_nr = mo_section%print_key_unit_nr( &
1494 mo_section%absolute_section_key, &
1495 extension=
".cube", &
1496 middle_name=trim(filename), &
1497 file_position=my_pos_cube, &
1498 log_filename=.false., &
1500 openpmd_basename=
"dft-mo", &
1501 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1502 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1503 sim_time=qs_env%sim_time)
1504 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1505 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1506 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1507 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1509 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1511 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1514 CALL timestop(handle)
1516 END SUBROUTINE qs_scf_post_occ_cubes
1535 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1536 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo, mo_section)
1542 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1546 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1547 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1548 TYPE(cp_section_key) :: mo_section
1550 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1552 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1553 INTEGER :: handle, ifirst, index_mo, ivector, &
1555 LOGICAL :: append_cube, mpi_io
1560 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1562 CALL timeset(routinen, handle)
1567 cpassert(mo_section%grid_output /= grid_output_openpmd)
1571 .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1572 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1574 IF (mo_section%grid_output == grid_output_cubes)
THEN
1575 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1577 my_pos_cube =
"REWIND"
1578 IF (append_cube)
THEN
1579 my_pos_cube =
"APPEND"
1582 IF (
PRESENT(lumo)) ifirst = lumo
1583 DO ivector = ifirst, ifirst + nlumos - 1
1585 atomic_kind_set=atomic_kind_set, &
1586 qs_kind_set=qs_kind_set, &
1588 particle_set=particle_set, &
1591 qs_kind_set, cell, dft_control, particle_set, pw_env)
1593 IF (ifirst == 1)
THEN
1594 index_mo = homo + ivector
1598 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1601 unit_nr = mo_section%print_key_unit_nr( &
1604 mo_section%absolute_section_key, &
1605 extension=
".cube", &
1606 middle_name=trim(filename), &
1607 file_position=my_pos_cube, &
1608 log_filename=.false., &
1610 openpmd_basename=
"dft-mo", &
1611 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1612 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1613 sim_time=qs_env%sim_time)
1614 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1615 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1616 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1617 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1619 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1624 CALL timestop(handle)
1626 END SUBROUTINE qs_scf_post_unocc_cubes
1639 INTEGER,
INTENT(IN) :: output_unit
1641 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1643 CHARACTER(LEN=default_path_length) :: filename
1644 INTEGER :: handle, max_nmo, maxmom, reference, &
1646 LOGICAL :: com_nl, do_kpoints, magnetic, periodic, &
1647 second_ref_point, vel_reprs
1648 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1651 CALL timeset(routinen, handle)
1654 subsection_name=
"DFT%PRINT%MOMENTS")
1659 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1661 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1663 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1665 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1667 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1669 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1671 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1673 keyword_name=
"DFT%PRINT%MOMENTS%MAX_NMO")
1678 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1679 middle_name=
"moments", log_filename=.false.)
1681 IF (output_unit > 0)
THEN
1682 IF (unit_nr /= output_unit)
THEN
1683 INQUIRE (unit=unit_nr, name=filename)
1684 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1685 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1688 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1692 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1694 IF (do_kpoints)
THEN
1700 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1705 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1707 IF (second_ref_point)
THEN
1709 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1714 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1715 middle_name=
"moments_refpoint_2", log_filename=.false.)
1717 IF (output_unit > 0)
THEN
1718 IF (unit_nr /= output_unit)
THEN
1719 INQUIRE (unit=unit_nr, name=filename)
1720 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1721 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1724 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1727 IF (do_kpoints)
THEN
1733 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1737 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1742 CALL timestop(handle)
1754 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1759 INTEGER,
INTENT(IN) :: output_unit
1761 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1763 CHARACTER(LEN=default_path_length) :: filename
1764 INTEGER :: handle, unit_nr
1765 REAL(kind=
dp) :: q_max
1768 CALL timeset(routinen, handle)
1771 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1775 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1777 basis_section=input, &
1778 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1780 middle_name=
"xrd", &
1781 log_filename=.false.)
1782 IF (output_unit > 0)
THEN
1783 INQUIRE (unit=unit_nr, name=filename)
1784 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1785 "X-RAY DIFFRACTION SPECTRUM"
1786 IF (unit_nr /= output_unit)
THEN
1787 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1788 "The coherent X-ray diffraction spectrum is written to the file:", &
1793 unit_number=unit_nr, &
1797 basis_section=input, &
1798 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1801 CALL timestop(handle)
1803 END SUBROUTINE qs_scf_post_xray
1811 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1816 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1821 CALL timeset(routinen, handle)
1824 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1830 CALL timestop(handle)
1832 END SUBROUTINE qs_scf_post_efg
1840 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1845 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1847 INTEGER :: handle, ispin
1849 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1852 CALL timeset(routinen, handle)
1858 IF (qs_env%et_coupling%first_run)
THEN
1860 ALLOCATE (my_mos(dft_control%nspins))
1861 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1862 DO ispin = 1, dft_control%nspins
1864 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1865 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1874 CALL timestop(handle)
1876 END SUBROUTINE qs_scf_post_et
1887 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
1892 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
1894 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1896 INTEGER :: handle, ispin, output_unit, unit_nr
1897 LOGICAL :: append_cube, gapw, mpi_io
1898 REAL(
dp) :: rho_cutoff
1899 TYPE(cp_section_key) :: elf_section_key
1909 CALL timeset(routinen, handle)
1912 elf_section_key = cube_or_openpmd(input, str_elf_cubes, str_elf_openpmd, logger)
1915 IF (elf_section_key%do_output)
THEN
1917 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
1918 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
1921 gapw = dft_control%qs_control%gapw
1922 IF (.NOT. gapw)
THEN
1924 ALLOCATE (elf_r(dft_control%nspins))
1925 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1927 DO ispin = 1, dft_control%nspins
1928 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1932 IF (output_unit > 0)
THEN
1933 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
1934 " ----- ELF is computed on the real space grid -----"
1942 IF (elf_section_key%grid_output == grid_output_cubes)
THEN
1945 my_pos_cube =
"REWIND"
1946 IF (append_cube)
THEN
1947 my_pos_cube =
"APPEND"
1950 DO ispin = 1, dft_control%nspins
1951 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1952 WRITE (title, *)
"ELF spin ", ispin
1954 unit_nr = elf_section_key%print_key_unit_nr( &
1957 elf_section_key%absolute_section_key, &
1958 extension=
".cube", &
1959 middle_name=trim(filename), &
1960 file_position=my_pos_cube, &
1961 log_filename=.false., &
1963 fout=mpi_filename, &
1964 openpmd_basename=
"dft-elf", &
1965 openpmd_unit_dimension=openpmd_unit_dimension_dimensionless, &
1966 openpmd_unit_si=openpmd_unit_si_dimensionless, &
1967 sim_time=qs_env%sim_time)
1968 IF (output_unit > 0)
THEN
1969 IF (.NOT. mpi_io)
THEN
1970 INQUIRE (unit=unit_nr, name=filename)
1972 filename = mpi_filename
1974 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
1975 "ELF is written in "//elf_section_key%format_name//
" file format to the file:", &
1979 CALL elf_section_key%write_pw(elf_r(ispin), unit_nr, title, particles=particles, &
1981 CALL elf_section_key%print_key_finished_output( &
1985 elf_section_key%absolute_section_key, &
1988 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1996 cpwarn(
"ELF not implemented for GAPW calculations!")
2001 CALL timestop(handle)
2003 END SUBROUTINE qs_scf_post_elf
2015 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
2020 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
2022 INTEGER :: handle, nao, unit_nr
2023 REAL(kind=
dp) :: s_cond_number
2024 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
2033 CALL timeset(routinen, handle)
2036 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2040 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
2043 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
2045 nrow_global=nao, ncol_global=nao, &
2046 template_fmstruct=mo_coeff%matrix_struct)
2047 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
2049 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
2052 ALLOCATE (eigenvalues(nao))
2060 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
2063 extension=
".molopt")
2065 IF (unit_nr > 0)
THEN
2068 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
2069 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
2073 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2077 CALL timestop(handle)
2079 END SUBROUTINE qs_scf_post_molopt
2087 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
2092 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
2097 CALL timeset(routinen, handle)
2100 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
2106 CALL timestop(handle)
2108 END SUBROUTINE qs_scf_post_epr
2117 SUBROUTINE write_available_results(qs_env, scf_env)
2121 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
2125 CALL timeset(routinen, handle)
2133 CALL timestop(handle)
2135 END SUBROUTINE write_available_results
2148 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
2150 INTEGER :: handle, homo, ispin, nlumo_molden, nmo, &
2152 LOGICAL :: all_equal, defer_molden, do_kpoints, &
2154 REAL(kind=
dp) :: maxocc, s_square, s_square_ideal, &
2155 total_abs_spin_dens, total_spin_dens
2156 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
2162 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
2175 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2184 CALL timeset(routinen, handle)
2186 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
2187 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
2188 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
2189 molecule_set, input, particles, subsys, rho_r)
2194 cpassert(
ASSOCIATED(qs_env))
2196 dft_control=dft_control, &
2197 molecule_set=molecule_set, &
2198 atomic_kind_set=atomic_kind_set, &
2199 particle_set=particle_set, &
2200 qs_kind_set=qs_kind_set, &
2201 admm_env=admm_env, &
2202 scf_control=scf_control, &
2211 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
2215 IF (.NOT. qs_env%run_rtp)
THEN
2223 IF (.NOT. do_kpoints)
THEN
2224 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
2227 defer_molden = .false.
2229 IF (nlumo_molden /= 0 .AND.
PRESENT(scf_env))
THEN
2230 IF (scf_env%method ==
ot_method_nr) defer_molden = .true.
2232 IF (.NOT. defer_molden)
THEN
2233 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2234 qs_env=qs_env, calc_energies=.true.)
2243 cpwarn(
"Molden format output is not possible for k-point calculations.")
2247 cpwarn(
"Chargemol .wfx format output is not possible for k-point calculations.")
2254 IF (do_kpoints)
THEN
2258 cpwarn(
"MO_KP is only available for k-point calculations, ignored for Gamma-only")
2265 IF (do_kpoints)
THEN
2276 IF (do_kpoints)
THEN
2277 cpwarn(
"Projected density of states (pDOS) is not implemented for k points")
2282 DO ispin = 1, dft_control%nspins
2284 IF (dft_control%do_admm)
THEN
2287 IF (
PRESENT(scf_env))
THEN
2289 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
2290 eigenvalues=mo_eigenvalues)
2291 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
2292 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
2294 mo_coeff_deriv => null()
2297 do_rotation=.true., &
2298 co_rotate_dbcsr=mo_coeff_deriv)
2302 IF (dft_control%nspins == 2)
THEN
2304 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
2307 qs_kind_set, particle_set, qs_env, dft_section)
2310 IF (dft_control%do_admm)
THEN
2319 IF (dft_control%nspins == 2)
THEN
2321 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2322 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2324 CALL auxbas_pw_pool%create_pw(wf_r)
2326 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
2328 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
2329 "Integrated spin density: ", total_spin_dens
2331 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
2332 "Integrated absolute spin density: ", total_abs_spin_dens
2333 CALL auxbas_pw_pool%give_back_pw(wf_r)
2339 IF (.NOT. do_kpoints)
THEN
2341 DO ispin = 1, dft_control%nspins
2343 occupation_numbers=occupation_numbers, &
2348 all_equal = all_equal .AND. &
2349 (all(occupation_numbers(1:homo) == maxocc) .AND. &
2350 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
2355 matrix_s=matrix_s, &
2358 s_square_ideal=s_square_ideal)
2359 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
2360 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
2361 energy%s_square = s_square
2366 CALL timestop(handle)
2378 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
2379 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
2381 CHARACTER(LEN=2) :: element_symbol
2382 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2384 CHARACTER(LEN=default_string_length) :: name, print_density
2385 INTEGER :: after, handle, i, iat, iatom, id, ikind, img, iso, ispin, iw, l, n_rep_hf, nat, &
2386 natom, nd(3), ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, &
2387 should_print_voro, unit_nr, unit_nr_voro
2388 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
2389 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
2391 rho_total, rho_total_rspace, udvol, &
2393 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2394 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
2395 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
2396 REAL(kind=
dp),
DIMENSION(3) :: dr
2397 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
2402 TYPE(cp_section_key) :: e_density_section
2404 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
2412 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
2419 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2427 print_key, print_key_bqb, &
2428 print_key_voro, xc_section
2430 CALL timeset(routinen, handle)
2431 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
2432 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
2433 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
2439 cpassert(
ASSOCIATED(qs_env))
2441 atomic_kind_set=atomic_kind_set, &
2442 qs_kind_set=qs_kind_set, &
2443 particle_set=particle_set, &
2445 para_env=para_env, &
2446 dft_control=dft_control, &
2448 do_kpoints=do_kpoints, &
2456 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
2457 ALLOCATE (zcharge(natom))
2462 iat = atomic_kind_set(ikind)%atom_list(iatom)
2469 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
2470 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
2472 my_pos_cube =
"REWIND"
2473 IF (append_cube)
THEN
2474 my_pos_cube =
"APPEND"
2477 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
2478 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
2479 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2481 CALL auxbas_pw_pool%create_pw(wf_r)
2482 IF (dft_control%qs_control%gapw)
THEN
2483 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
2484 CALL pw_axpy(rho_core, rho0_s_gs)
2485 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2486 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2489 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
2490 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2491 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2494 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2495 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2498 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2499 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2505 DO ispin = 1, dft_control%nspins
2506 CALL pw_axpy(rho_r(ispin), wf_r)
2508 filename =
"TOTAL_DENSITY"
2511 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2512 log_filename=.false., mpi_io=mpi_io)
2514 particles=particles, zeff=zcharge, &
2516 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%TOT_DENSITY_CUBE%MAX_FILE_SIZE_MB"), &
2519 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2520 CALL auxbas_pw_pool%give_back_pw(wf_r)
2523 e_density_section = cube_or_openpmd(input, str_e_density_cubes, str_e_density_openpmd, logger)
2526 IF (e_density_section%do_output)
THEN
2528 keyword_name=e_density_section%concat_to_relative(
"%DENSITY_INCLUDE"), &
2529 c_val=print_density)
2530 print_density = trim(print_density)
2532 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2533 append_cube =
section_get_lval(input, e_density_section%concat_to_absolute(
"%APPEND"))
2535 my_pos_cube =
"REWIND"
2536 IF (append_cube)
THEN
2537 my_pos_cube =
"APPEND"
2541 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2542 xrd_interface =
section_get_lval(input, e_density_section%concat_to_absolute(
"%XRD_INTERFACE"))
2545 xrd_interface = .false.
2548 IF (xrd_interface)
THEN
2550 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2552 filename =
"ELECTRON_DENSITY"
2554 extension=
".xrd", middle_name=trim(filename), &
2555 file_position=my_pos_cube, log_filename=.false.)
2556 ngto =
section_get_ival(input, e_density_section%concat_to_absolute(
"%NGAUSS"))
2557 IF (output_unit > 0)
THEN
2558 INQUIRE (unit=unit_nr, name=filename)
2559 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2560 "The electron density (atomic part) is written to the file:", &
2565 nkind =
SIZE(atomic_kind_set)
2566 IF (unit_nr > 0)
THEN
2567 WRITE (unit_nr, *)
"Atomic (core) densities"
2568 WRITE (unit_nr, *)
"Unit cell"
2569 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2570 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2571 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2572 WRITE (unit_nr, *)
"Atomic types"
2573 WRITE (unit_nr, *) nkind
2576 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2578 atomic_kind => atomic_kind_set(ikind)
2579 qs_kind => qs_kind_set(ikind)
2580 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2582 iunit=output_unit, confine=.true.)
2584 iunit=output_unit, allelectron=.true., confine=.true.)
2585 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2586 ccdens(:, 2, ikind) = 0._dp
2587 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2588 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2589 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2590 IF (unit_nr > 0)
THEN
2591 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2592 WRITE (unit_nr, fmt=
"(I6)") ngto
2593 WRITE (unit_nr, *)
" Total density"
2594 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2595 WRITE (unit_nr, *)
" Core density"
2596 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2598 NULLIFY (atomic_kind)
2601 IF (dft_control%qs_control%gapw)
THEN
2602 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2604 IF (unit_nr > 0)
THEN
2605 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2607 np = particles%n_els
2609 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2610 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2611 rho_atom => rho_atom_set(iat)
2612 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2613 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2614 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2619 CALL para_env%sum(nr)
2620 CALL para_env%sum(niso)
2622 ALLOCATE (bfun(nr, niso))
2624 DO ispin = 1, dft_control%nspins
2625 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2626 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2629 CALL para_env%sum(bfun)
2630 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2631 ccdens(:, 2, ikind) = 0._dp
2632 IF (unit_nr > 0)
THEN
2633 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2637 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2638 IF (unit_nr > 0)
THEN
2639 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2640 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2646 IF (unit_nr > 0)
THEN
2647 WRITE (unit_nr, *)
"Coordinates"
2648 np = particles%n_els
2650 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2651 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2656 DEALLOCATE (ppdens, aedens, ccdens)
2659 e_density_section%absolute_section_key)
2662 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2664 cpassert(.NOT. do_kpoints)
2669 auxbas_pw_pool=auxbas_pw_pool, &
2671 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2673 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2678 q_max = sqrt(sum((
pi/dr(:))**2))
2680 auxbas_pw_pool=auxbas_pw_pool, &
2681 rhotot_elec_gspace=rho_elec_gspace, &
2683 rho_hard=rho_hard, &
2685 rho_total = rho_hard + rho_soft
2690 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2692 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2694 filename =
"TOTAL_ELECTRON_DENSITY"
2696 unit_nr = e_density_section%print_key_unit_nr( &
2699 e_density_section%absolute_section_key, &
2700 extension=
".cube", &
2701 middle_name=trim(filename), &
2702 file_position=my_pos_cube, &
2703 log_filename=.false., &
2705 fout=mpi_filename, &
2706 openpmd_basename=
"dft-total-electron-density", &
2707 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2708 openpmd_unit_si=openpmd_unit_si_density, &
2709 sim_time=qs_env%sim_time)
2710 IF (output_unit > 0)
THEN
2711 IF (.NOT. mpi_io)
THEN
2712 INQUIRE (unit=unit_nr, name=filename)
2714 filename = mpi_filename
2716 CALL print_density_output_message(output_unit,
"The total electron density", &
2717 e_density_section, filename)
2718 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2719 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2720 "Soft electronic charge (G-space) :", rho_soft, &
2721 "Hard electronic charge (G-space) :", rho_hard, &
2722 "Total electronic charge (G-space):", rho_total, &
2723 "Total electronic charge (R-space):", rho_total_rspace
2725 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2726 particles=particles, zeff=zcharge, &
2727 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2728 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2729 e_density_section%absolute_section_key, mpi_io=mpi_io)
2731 IF (dft_control%nspins > 1)
THEN
2735 auxbas_pw_pool=auxbas_pw_pool, &
2736 rhotot_elec_gspace=rho_elec_gspace, &
2738 rho_hard=rho_hard, &
2739 rho_soft=rho_soft, &
2741 rho_total = rho_hard + rho_soft
2745 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2747 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2749 filename =
"TOTAL_SPIN_DENSITY"
2751 unit_nr = e_density_section%print_key_unit_nr( &
2754 e_density_section%absolute_section_key, &
2755 extension=
".cube", &
2756 middle_name=trim(filename), &
2757 file_position=my_pos_cube, &
2758 log_filename=.false., &
2760 fout=mpi_filename, &
2761 openpmd_basename=
"dft-total-spin-density", &
2762 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2763 openpmd_unit_si=openpmd_unit_si_density, &
2764 sim_time=qs_env%sim_time)
2765 IF (output_unit > 0)
THEN
2766 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2767 INQUIRE (unit=unit_nr, name=filename)
2769 filename = mpi_filename
2771 CALL print_density_output_message(output_unit,
"The total spin density", &
2772 e_density_section, filename)
2773 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2774 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2775 "Soft part of the spin density (G-space):", rho_soft, &
2776 "Hard part of the spin density (G-space):", rho_hard, &
2777 "Total spin density (G-space) :", rho_total, &
2778 "Total spin density (R-space) :", rho_total_rspace
2780 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2781 particles=particles, zeff=zcharge, &
2782 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2783 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2784 e_density_section%absolute_section_key, mpi_io=mpi_io)
2786 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2787 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2789 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2790 IF (dft_control%nspins > 1)
THEN
2794 auxbas_pw_pool=auxbas_pw_pool, &
2796 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2797 CALL pw_copy(rho_r(1), rho_elec_rspace)
2798 CALL pw_axpy(rho_r(2), rho_elec_rspace)
2799 filename =
"ELECTRON_DENSITY"
2801 unit_nr = e_density_section%print_key_unit_nr( &
2804 e_density_section%absolute_section_key, &
2805 extension=
".cube", &
2806 middle_name=trim(filename), &
2807 file_position=my_pos_cube, &
2808 log_filename=.false., &
2810 fout=mpi_filename, &
2811 openpmd_basename=
"dft-electron-density", &
2812 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2813 openpmd_unit_si=openpmd_unit_si_density, &
2814 sim_time=qs_env%sim_time)
2815 IF (output_unit > 0)
THEN
2816 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2817 INQUIRE (unit=unit_nr, name=filename)
2819 filename = mpi_filename
2821 CALL print_density_output_message(output_unit,
"The sum of alpha and beta density", &
2822 e_density_section, filename)
2824 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
2825 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
2827 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2828 e_density_section%absolute_section_key, mpi_io=mpi_io)
2829 CALL pw_copy(rho_r(1), rho_elec_rspace)
2830 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2831 filename =
"SPIN_DENSITY"
2833 unit_nr = e_density_section%print_key_unit_nr( &
2836 e_density_section%absolute_section_key, &
2837 extension=
".cube", &
2838 middle_name=trim(filename), &
2839 file_position=my_pos_cube, &
2840 log_filename=.false., &
2842 fout=mpi_filename, &
2843 openpmd_basename=
"dft-spin-density", &
2844 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2845 openpmd_unit_si=openpmd_unit_si_density, &
2846 sim_time=qs_env%sim_time)
2847 IF (output_unit > 0)
THEN
2848 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2849 INQUIRE (unit=unit_nr, name=filename)
2851 filename = mpi_filename
2853 CALL print_density_output_message(output_unit,
"The spin density", &
2854 e_density_section, filename)
2856 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2857 particles=particles, zeff=zcharge, &
2858 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2859 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2860 e_density_section%absolute_section_key, mpi_io=mpi_io)
2861 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2863 filename =
"ELECTRON_DENSITY"
2865 unit_nr = e_density_section%print_key_unit_nr( &
2868 e_density_section%absolute_section_key, &
2869 extension=
".cube", &
2870 middle_name=trim(filename), &
2871 file_position=my_pos_cube, &
2872 log_filename=.false., &
2874 fout=mpi_filename, &
2875 openpmd_basename=
"dft-electron-density", &
2876 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2877 openpmd_unit_si=openpmd_unit_si_density, &
2878 sim_time=qs_env%sim_time)
2879 IF (output_unit > 0)
THEN
2880 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2881 INQUIRE (unit=unit_nr, name=filename)
2883 filename = mpi_filename
2885 CALL print_density_output_message(output_unit,
"The electron density", &
2886 e_density_section, filename)
2888 CALL e_density_section%write_pw(rho_r(1), unit_nr,
"ELECTRON DENSITY", &
2889 particles=particles, zeff=zcharge, &
2890 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2891 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2892 e_density_section%absolute_section_key, mpi_io=mpi_io)
2895 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
2896 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
2897 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
2898 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
2901 ALLOCATE (my_q0(natom))
2909 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
2913 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2917 DO ispin = 1, dft_control%nspins
2918 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
2922 rho_total_rspace = rho_soft + rho_hard
2924 filename =
"ELECTRON_DENSITY"
2926 unit_nr = e_density_section%print_key_unit_nr( &
2929 e_density_section%absolute_section_key, &
2930 extension=
".cube", &
2931 middle_name=trim(filename), &
2932 file_position=my_pos_cube, &
2933 log_filename=.false., &
2935 fout=mpi_filename, &
2936 openpmd_basename=
"dft-electron-density", &
2937 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2938 openpmd_unit_si=openpmd_unit_si_density, &
2939 sim_time=qs_env%sim_time)
2940 IF (output_unit > 0)
THEN
2941 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2942 INQUIRE (unit=unit_nr, name=filename)
2944 filename = mpi_filename
2946 CALL print_density_output_message(output_unit,
"The electron density", &
2947 e_density_section, filename)
2948 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2949 "Soft electronic charge (R-space) :", rho_soft, &
2950 "Hard electronic charge (R-space) :", rho_hard, &
2951 "Total electronic charge (R-space):", rho_total_rspace
2953 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
2954 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
2956 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2957 e_density_section%absolute_section_key, mpi_io=mpi_io)
2960 IF (dft_control%nspins > 1)
THEN
2962 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
2965 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2968 CALL pw_axpy(rho_r(1), rho_elec_rspace)
2969 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2973 rho_total_rspace = rho_soft + rho_hard
2975 filename =
"SPIN_DENSITY"
2977 unit_nr = e_density_section%print_key_unit_nr( &
2980 e_density_section%absolute_section_key, &
2981 extension=
".cube", &
2982 middle_name=trim(filename), &
2983 file_position=my_pos_cube, &
2984 log_filename=.false., &
2986 fout=mpi_filename, &
2987 openpmd_basename=
"dft-spin-density", &
2988 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2989 openpmd_unit_si=openpmd_unit_si_density, &
2990 sim_time=qs_env%sim_time)
2991 IF (output_unit > 0)
THEN
2992 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2993 INQUIRE (unit=unit_nr, name=filename)
2995 filename = mpi_filename
2997 CALL print_density_output_message(output_unit,
"The spin density", &
2998 e_density_section, filename)
2999 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3000 "Soft part of the spin density :", rho_soft, &
3001 "Hard part of the spin density :", rho_hard, &
3002 "Total spin density (R-space) :", rho_total_rspace
3004 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3005 particles=particles, zeff=zcharge, &
3006 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3007 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3008 e_density_section%absolute_section_key, mpi_io=mpi_io)
3010 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3016 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
3022 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
3026 v_hartree_rspace=v_hartree_rspace)
3027 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3028 CALL auxbas_pw_pool%create_pw(aux_r)
3031 my_pos_cube =
"REWIND"
3032 IF (append_cube)
THEN
3033 my_pos_cube =
"APPEND"
3036 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3039 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
3040 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3042 CALL pw_copy(v_hartree_rspace, aux_r)
3045 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
3047 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%V_HARTREE_CUBE%MAX_FILE_SIZE_MB"), &
3050 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
3052 CALL auxbas_pw_pool%give_back_pw(aux_r)
3057 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
3058 IF (dft_control%apply_external_potential)
THEN
3059 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
3060 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3061 CALL auxbas_pw_pool%create_pw(aux_r)
3063 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
3064 my_pos_cube =
"REWIND"
3065 IF (append_cube)
THEN
3066 my_pos_cube =
"APPEND"
3071 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
3075 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
3076 stride=
section_get_ivals(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), &
3077 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%MAX_FILE_SIZE_MB"), &
3080 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
3082 CALL auxbas_pw_pool%give_back_pw(aux_r)
3088 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
3090 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3091 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3092 CALL auxbas_pw_pool%create_pw(aux_r)
3093 CALL auxbas_pw_pool%create_pw(aux_g)
3096 my_pos_cube =
"REWIND"
3097 IF (append_cube)
THEN
3098 my_pos_cube =
"APPEND"
3100 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
3101 v_hartree_rspace=v_hartree_rspace)
3103 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3107 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
3117 CALL cp_pw_to_cube(aux_r, unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
3119 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EFIELD_CUBE%MAX_FILE_SIZE_MB"), &
3122 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
3125 CALL auxbas_pw_pool%give_back_pw(aux_r)
3126 CALL auxbas_pw_pool%give_back_pw(aux_g)
3130 CALL qs_scf_post_local_energy(input, logger, qs_env)
3133 CALL qs_scf_post_local_stress(input, logger, qs_env)
3136 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
3144 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
3149 after = min(max(after, 1), 16)
3150 DO ispin = 1, dft_control%nspins
3151 DO img = 1, dft_control%nimages
3153 para_env, output_unit=iw, omit_headers=omit_headers)
3157 "DFT%PRINT%AO_MATRICES/DENSITY")
3162 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
3164 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
3166 IF (write_ks .OR. write_xc)
THEN
3167 IF (write_xc) qs_env%requires_matrix_vxc = .true.
3170 just_energy=.false.)
3171 IF (write_xc) qs_env%requires_matrix_vxc = .false.
3178 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
3180 after = min(max(after, 1), 16)
3181 DO ispin = 1, dft_control%nspins
3182 DO img = 1, dft_control%nimages
3184 para_env, output_unit=iw, omit_headers=omit_headers)
3188 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
3193 IF (.NOT. dft_control%qs_control%pao)
THEN
3201 CALL write_adjacency_matrix(qs_env, input)
3205 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
3206 cpassert(
ASSOCIATED(matrix_vxc))
3210 after = min(max(after, 1), 16)
3211 DO ispin = 1, dft_control%nspins
3212 DO img = 1, dft_control%nimages
3214 para_env, output_unit=iw, omit_headers=omit_headers)
3218 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
3223 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
3229 after = min(max(after, 1), 16)
3232 para_env, output_unit=iw, omit_headers=omit_headers)
3236 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
3242 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
3245 IF (print_it) print_level = 2
3247 IF (print_it) print_level = 3
3258 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3259 IF (rho_r_valid)
THEN
3260 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
3261 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
3269 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
3271 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
3279 should_print_voro = 1
3281 should_print_voro = 0
3284 should_print_bqb = 1
3286 should_print_bqb = 0
3288 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3293 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3294 IF (rho_r_valid)
THEN
3296 IF (dft_control%nspins > 1)
THEN
3300 auxbas_pw_pool=auxbas_pw_pool, &
3304 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
3305 CALL pw_copy(rho_r(1), mb_rho)
3306 CALL pw_axpy(rho_r(2), mb_rho)
3313 IF (should_print_voro /= 0)
THEN
3315 IF (voro_print_txt)
THEN
3317 my_pos_voro =
"REWIND"
3318 IF (append_voro)
THEN
3319 my_pos_voro =
"APPEND"
3321 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
3322 file_position=my_pos_voro, log_filename=.false.)
3330 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3331 unit_nr_voro, qs_env, mb_rho)
3333 IF (dft_control%nspins > 1)
THEN
3334 CALL auxbas_pw_pool%give_back_pw(mb_rho)
3338 IF (unit_nr_voro > 0)
THEN
3348 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
3356 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
3364 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
3366 IF (iao_env%do_iao)
THEN
3376 extension=
".mao", log_filename=.false.)
3387 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
3391 DEALLOCATE (zcharge)
3393 CALL timestop(handle)
3403 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
3406 INTEGER,
INTENT(IN) :: unit_nr
3408 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
3409 radius_type, refc, shapef
3410 INTEGER,
DIMENSION(:),
POINTER :: atom_list
3411 LOGICAL :: do_radius, do_sc, paw_atom
3412 REAL(kind=
dp) :: zeff
3413 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
3414 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
3417 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
3423 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3427 NULLIFY (hirshfeld_env)
3431 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
3432 ALLOCATE (hirshfeld_env%charges(natom))
3441 IF (.NOT.
SIZE(radii) == nkind) &
3442 CALL cp_abort(__location__, &
3443 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
3444 "match number of atomic kinds in the input coordinate file.")
3449 iterative=do_sc, ref_charge=refc, &
3450 radius_type=radius_type)
3452 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
3458 nspin =
SIZE(matrix_p, 1)
3459 ALLOCATE (charges(natom, nspin))
3464 atomic_kind => atomic_kind_set(ikind)
3466 DO iat = 1,
SIZE(atom_list)
3468 hirshfeld_env%charges(i) = zeff
3472 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
3475 hirshfeld_env%charges(iat) = sum(charges(iat, :))
3478 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
3482 IF (hirshfeld_env%iterative)
THEN
3489 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
3490 IF (dft_control%qs_control%gapw)
THEN
3492 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
3495 atomic_kind => particle_set(iat)%atomic_kind
3497 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
3499 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
3504 IF (unit_nr > 0)
THEN
3506 qs_kind_set, unit_nr)
3512 DEALLOCATE (charges)
3514 END SUBROUTINE hirshfeld_charges
3524 SUBROUTINE project_function_a(ca, a, cb, b, l)
3526 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3527 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
3528 INTEGER,
INTENT(IN) :: l
3531 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3532 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
3535 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
3539 v(:, 1) = matmul(tmat, cb)
3540 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3544 DEALLOCATE (smat, tmat, v, ipiv)
3546 END SUBROUTINE project_function_a
3556 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
3558 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3559 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
3561 INTEGER,
INTENT(IN) :: l
3563 INTEGER :: i, info, n, nr
3564 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3565 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
3566 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
3570 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3574 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3575 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3577 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3581 DEALLOCATE (smat, v, ipiv, afun)
3583 END SUBROUTINE project_function_b
3594 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3599 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3601 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3602 INTEGER :: handle, io_unit, natom, unit_nr
3603 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3612 CALL timeset(routinen, handle)
3615 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3617 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3618 gapw = dft_control%qs_control%gapw
3619 gapw_xc = dft_control%qs_control%gapw_xc
3620 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3622 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3623 CALL auxbas_pw_pool%create_pw(eden)
3627 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3628 IF (append_cube)
THEN
3629 my_pos_cube =
"APPEND"
3631 my_pos_cube =
"REWIND"
3635 extension=
".cube", middle_name=
"local_energy", &
3636 file_position=my_pos_cube, mpi_io=mpi_io)
3637 CALL cp_pw_to_cube(eden, unit_nr,
"LOCAL ENERGY", particles=particles, &
3639 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_ENERGY_CUBE%MAX_FILE_SIZE_MB"), &
3641 IF (io_unit > 0)
THEN
3642 INQUIRE (unit=unit_nr, name=filename)
3643 IF (gapw .OR. gapw_xc)
THEN
3644 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3645 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3647 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3648 "The local energy is written to the file: ", trim(adjustl(filename))
3652 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3654 CALL auxbas_pw_pool%give_back_pw(eden)
3656 CALL timestop(handle)
3658 END SUBROUTINE qs_scf_post_local_energy
3669 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3674 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3676 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3677 INTEGER :: handle, io_unit, natom, unit_nr
3678 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3679 REAL(kind=
dp) :: beta
3688 CALL timeset(routinen, handle)
3691 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3692 CALL cp_warn(__location__, &
3693 "LOCAL_STRESS_CUBE uses the existing experimental local stress implementation")
3695 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3696 gapw = dft_control%qs_control%gapw
3697 gapw_xc = dft_control%qs_control%gapw_xc
3698 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3700 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3701 CALL auxbas_pw_pool%create_pw(stress)
3707 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3708 IF (append_cube)
THEN
3709 my_pos_cube =
"APPEND"
3711 my_pos_cube =
"REWIND"
3715 extension=
".cube", middle_name=
"local_stress", &
3716 file_position=my_pos_cube, mpi_io=mpi_io)
3717 CALL cp_pw_to_cube(stress, unit_nr,
"LOCAL STRESS", particles=particles, &
3719 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_STRESS_CUBE%MAX_FILE_SIZE_MB"), &
3721 IF (io_unit > 0)
THEN
3722 INQUIRE (unit=unit_nr, name=filename)
3723 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3724 IF (gapw .OR. gapw_xc)
THEN
3725 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3726 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3728 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3729 "The local stress is written to the file: ", trim(adjustl(filename))
3733 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3735 CALL auxbas_pw_pool%give_back_pw(stress)
3738 CALL timestop(handle)
3740 END SUBROUTINE qs_scf_post_local_stress
3751 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3756 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3758 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3759 INTEGER :: boundary_condition, handle, i, j, &
3760 n_cstr, n_tiles, unit_nr
3761 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3762 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3772 CALL timeset(routinen, handle)
3774 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
3777 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3779 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3781 has_implicit_ps = .false.
3782 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3787 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
3788 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
3789 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
3790 my_pos_cube =
"REWIND"
3791 IF (append_cube)
THEN
3792 my_pos_cube =
"APPEND"
3796 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
3798 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3799 CALL auxbas_pw_pool%create_pw(aux_r)
3801 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3802 SELECT CASE (boundary_condition)
3804 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
3806 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3807 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3808 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3809 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3810 poisson_env%implicit_env%dielectric%eps, aux_r)
3813 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, &
3814 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
3815 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%MAX_FILE_SIZE_MB"), &
3818 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
3820 CALL auxbas_pw_pool%give_back_pw(aux_r)
3825 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
3827 has_dirichlet_bc = .false.
3828 IF (has_implicit_ps)
THEN
3829 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3831 has_dirichlet_bc = .true.
3835 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
3837 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
3838 my_pos_cube =
"REWIND"
3839 IF (append_cube)
THEN
3840 my_pos_cube =
"APPEND"
3844 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
3845 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
3847 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3848 CALL auxbas_pw_pool%create_pw(aux_r)
3850 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3851 SELECT CASE (boundary_condition)
3853 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
3855 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3856 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3857 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3858 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3859 poisson_env%implicit_env%cstr_charge, aux_r)
3862 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, &
3863 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
3864 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%MAX_FILE_SIZE_MB"), &
3867 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
3869 CALL auxbas_pw_pool%give_back_pw(aux_r)
3874 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
3875 has_dirichlet_bc = .false.
3876 IF (has_implicit_ps)
THEN
3877 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3879 has_dirichlet_bc = .true.
3883 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
3884 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
3885 my_pos_cube =
"REWIND"
3886 IF (append_cube)
THEN
3887 my_pos_cube =
"APPEND"
3889 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
3891 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3892 CALL auxbas_pw_pool%create_pw(aux_r)
3895 IF (tile_cubes)
THEN
3897 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3899 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3901 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
3904 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3905 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
3908 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
3910 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3911 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3912 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
3915 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3920 NULLIFY (dirichlet_tile)
3921 ALLOCATE (dirichlet_tile)
3922 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
3925 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3926 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
3929 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3931 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3933 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
3934 CALL pw_axpy(dirichlet_tile, aux_r)
3938 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3939 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3940 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
3943 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3944 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
3945 DEALLOCATE (dirichlet_tile)
3948 CALL auxbas_pw_pool%give_back_pw(aux_r)
3951 CALL timestop(handle)
3953 END SUBROUTINE qs_scf_post_ps_implicit
3961 SUBROUTINE write_adjacency_matrix(qs_env, input)
3965 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
3967 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
3968 ind, jatom, jkind, k, natom, nkind, &
3969 output_unit, rowind, unit_nr
3970 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
3971 LOGICAL :: do_adjm_write, do_symmetric
3977 DIMENSION(:),
POINTER :: nl_iterator
3980 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3983 CALL timeset(routinen, handle)
3985 NULLIFY (dft_section)
3994 IF (do_adjm_write)
THEN
3995 NULLIFY (qs_kind_set, nl_iterator)
3996 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
3998 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
4000 nkind =
SIZE(qs_kind_set)
4001 cpassert(
SIZE(nl) > 0)
4003 cpassert(do_symmetric)
4004 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
4008 adjm_size = ((natom + 1)*natom)/2
4009 ALLOCATE (interact_adjm(4*adjm_size))
4012 NULLIFY (nl_iterator)
4016 ikind=ikind, jkind=jkind, &
4017 iatom=iatom, jatom=jatom)
4019 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
4020 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
4021 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
4022 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
4025 IF (iatom <= jatom)
THEN
4032 ikind = ikind + jkind
4033 jkind = ikind - jkind
4034 ikind = ikind - jkind
4038 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
4041 interact_adjm((ind - 1)*4 + 1) = rowind
4042 interact_adjm((ind - 1)*4 + 2) = colind
4043 interact_adjm((ind - 1)*4 + 3) = ikind
4044 interact_adjm((ind - 1)*4 + 4) = jkind
4047 CALL para_env%sum(interact_adjm)
4050 extension=
".adjmat", file_form=
"FORMATTED", &
4051 file_status=
"REPLACE")
4052 IF (unit_nr > 0)
THEN
4053 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
4054 DO k = 1, 4*adjm_size, 4
4056 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
4057 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
4065 DEALLOCATE (basis_set_list_a, basis_set_list_b)
4068 CALL timestop(handle)
4070 END SUBROUTINE write_adjacency_matrix
4078 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
4082 LOGICAL :: use_virial
4092 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
4093 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
4094 rho_core=rho_core, virial=virial, &
4095 v_hartree_rspace=v_hartree_rspace)
4097 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
4099 IF (.NOT. use_virial)
THEN
4101 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
4102 poisson_env=poisson_env)
4103 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
4104 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
4108 v_hartree_gspace, rho_core=rho_core)
4110 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
4111 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
4113 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
4114 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
4117 END SUBROUTINE update_hartree_with_mp2
static double norm_factor(double alpha, int L)
Types and set/get functions for auxiliary density matrix methods.
Contains methods used in the context of density fitting.
subroutine, public admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public sg_overlap(smat, l, pa, pb)
...
calculate the orbitals for a given atomic kind type
subroutine, public calculate_atomic_density(density, atomic_kind, qs_kind, ngto, iunit, optbasis, allelectron, confine)
...
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers)
...
Density Derived atomic point charges from a QM calculation (see Bloechl, J. Chem. Phys....
recursive subroutine, public get_ddapc(qs_env, calc_force, density_fit_section, density_type, qout1, qout2, out_radii, dq_out, ext_rho_tot_g, itype_of_density, iwc)
Computes the Density Derived Atomic Point Charges.
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
subroutine, public cp_openpmd_close_iterations()
integer function, public cp_openpmd_print_key_unit_nr(logger, basis_section, print_key_path, middle_name, ignore_should_output, mpi_io, fout, openpmd_basename, openpmd_unit_dimension, openpmd_unit_si, sim_time)
...
subroutine, public cp_openpmd_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, mpi_io)
should be called after you finish working with a unit obtained with cp_openpmd_print_key_unit_nr,...
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
A wrapper around pw_to_openpmd() which accepts particle_list_type.
subroutine, public cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
...
the type I Discrete Cosine Transform (DCT-I)
subroutine, public pw_shrink(neumann_directions, dests_shrink, srcs_shrink, bounds_local_shftd, pw_in, pw_shrinked)
shrinks an evenly symmetric pw_r3d_rs_type data to a pw_r3d_rs_type data that is 8 times smaller (the...
Calculate Energy Decomposition analysis.
subroutine, public edmf_analysis(qs_env, input_section, unit_nr)
...
Calculation of charge equilibration method.
subroutine, public eeq_print(qs_env, iounit, print_level, ext)
...
Definition and initialisation of the et_coupling data type.
subroutine, public set_et_coupling_type(et_coupling, et_mo_coeff, rest_mat)
...
subroutine, public print_ri_hfx(ri_data, qs_env)
Print RI-HFX quantities, as required by the PRINT subsection.
Calculate Hirshfeld charges and related functions.
subroutine, public comp_hirshfeld_charges(qs_env, hirshfeld_env, charges)
...
subroutine, public create_shape_function(hirshfeld_env, qs_kind_set, atomic_kind_set, radius, radii_list)
creates kind specific shape functions for Hirshfeld charges
subroutine, public write_hirshfeld_charges(charges, hirshfeld_env, particle_set, qs_kind_set, unit_nr)
...
subroutine, public comp_hirshfeld_i_charges(qs_env, hirshfeld_env, charges, ounit)
...
subroutine, public save_hirshfeld_charges(charges, particle_set, qs_kind_set, qs_env)
saves the Hirshfeld charges to the results structure
The types needed for the calculation of Hirshfeld charges and related functions.
subroutine, public create_hirshfeld_type(hirshfeld_env)
...
subroutine, public set_hirshfeld_info(hirshfeld_env, shape_function_type, iterative, ref_charge, fnorm, radius_type, use_bohr)
Set values of a Hirshfeld env.
subroutine, public release_hirshfeld_type(hirshfeld_env)
...
Calculate intrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
...
Calculate ntrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_read_input(iao_env, iao_section, cell)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
K-point MO wavefunction dump to TEXT file for post-processing (PDOS, etc.)
subroutine, public write_kpoint_mo_data(qs_env, print_section)
Write k-point resolved MO data to formatted text file.
Types and basic routines needed for a kpoint calculation.
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Calculate MAO's and analyze wavefunctions.
subroutine, public mao_analysis(qs_env, input_section, unit_nr)
...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Utility routines for the memory handling.
Interface to the message passing library MPI.
Calculate localized minimal basis and analyze wavefunctions.
subroutine, public minbas_analysis(qs_env, input_section, unit_nr)
...
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section, cell, unoccupied_orbs, unoccupied_evals, qs_env, calc_energies)
Write out the MOs in molden format for visualisation.
Define the data structure for the molecule information.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:, :), allocatable, public indso
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public a_bohr
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
Provide various population analyses and print the requested output information.
subroutine, public lowdin_population_analysis(qs_env, output_unit, print_level)
Perform a Lowdin population analysis based on a symmetric orthogonalisation of the density matrix usi...
subroutine, public mulliken_population_analysis(qs_env, output_unit, print_level)
Perform a Mulliken population analysis.
computes preconditioners, and implements methods to apply them currently used in qs_ot
Types containing essential information for running implicit (iterative) Poisson solver.
integer, parameter, public neumann_bc
integer, parameter, public mixed_bc
integer, parameter, public mixed_periodic_bc
integer, parameter, public periodic_bc
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
This module defines the grid data type and some basic operations on it.
subroutine, public get_pw_grid_info(pw_grid, id_nr, mode, vol, dvol, npts, ngpts, ngpts_cut, dr, cutoff, orthorhombic, gvectors, gsquare)
Access to information stored in the pw_grid_type.
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_implicit
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Write wfx file, works as interface to chargemol and multiwfn.
subroutine, public write_wfx(qs_env, dft_section)
...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
Calculation of commutator [H,r] matrices.
subroutine, public build_com_hr_matrix(qs_env, matrix_hr)
Calculation of the [H,r] commutators matrices over Cartesian Gaussian functions.
Calculation of the energies concerning the core charge distribution.
Calculation and writing of density of states.
subroutine, public calculate_dos(mos, dft_section)
Compute and write density of states.
subroutine, public calculate_dos_kp(qs_env, dft_section)
Compute and write density of states (kpoints)
Calculates electric field gradients H.M. Petrili, P.E. Blochl, P. Blaha, K. Schwarz,...
subroutine, public qs_efg_calc(qs_env)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public qs_elf_calc(qs_env, elf_r, rho_cutoff)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public energy_windows(qs_env)
...
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.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Calculates hyperfine values.
subroutine, public qs_epr_hyp_calc(qs_env)
...
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
subroutine, public loc_dipole(input, dft_control, qs_loc_env, logger, qs_env)
Computes and prints the Dipole (using localized charges)
subroutine, public get_localization_info(qs_env, qs_loc_env, loc_section, mo_local, wf_r, wf_g, particles, coeff, evals, marked_states)
Performs localization of the orbitals.
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public qs_loc_env_release(qs_loc_env)
...
subroutine, public qs_loc_env_create(qs_loc_env)
...
Some utilities for the construction of the localization environment.
subroutine, public loc_write_restart(qs_loc_env, section, mo_array, coeff_localized, do_homo, evals, do_mixed)
...
subroutine, public qs_loc_env_init(qs_loc_env, localized_wfn_control, qs_env, myspin, do_localize, loc_coeff, mo_loc_history)
allocates the data, and initializes the operators
subroutine, public qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_mixed, do_xas, nloc_xas, spin_xas)
initializes everything needed for localization of the HOMOs
subroutine, public retain_history(mo_loc_history, mo_loc)
copy old mos to new ones, allocating as necessary
subroutine, public qs_loc_init(qs_env, qs_loc_env, localize_section, mos_localized, do_homo, do_mo_cubes, mo_loc_history, evals, tot_zeff_corr, do_mixed)
initializes everything needed for localization of the molecular orbitals
Routines for calculating local energy and stress tensor.
subroutine, public qs_local_stress(qs_env, stress_tensor, beta)
Routine to calculate the local stress.
subroutine, public qs_local_energy(qs_env, energy_density)
Routine to calculate the local energy.
Definition and initialisation of the mo data type.
subroutine, public write_dm_binary_restart(mo_array, dft_section, tmpl_matrix)
calculates density matrix from mo set and writes the density matrix into a binary restart file
collects routines that perform operations directly related to MOs
subroutine, public make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env, hairy_probes, probe)
Calculate KS eigenvalues starting from OF MOS.
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public qs_moment_locop(qs_env, magnetic, nmoments, reference, ref_point, unit_number, vel_reprs, com_nl)
...
subroutine, public qs_moment_kpoints(qs_env, nmoments, reference, ref_point, max_nmo, unit_number)
Calculate and print dipole moment elements d_nm(k) for k-point calculations.
subroutine, public qs_moment_berry_phase(qs_env, magnetic, nmoments, reference, ref_point, unit_number)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
Calculation and writing of projected density of states The DOS is computed per angular momentum and p...
subroutine, public calculate_projected_dos(mo_set, atomic_kind_set, qs_kind_set, particle_set, qs_env, dft_section, ispin, xas_mittle, external_matrix_shalf)
Compute and write projected density of states.
provides a resp fit for gas phase systems
subroutine, public resp_fit(qs_env)
performs resp fit and generates RESP charges
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Functions to print the KS and S matrix in the CSR format to file.
subroutine, public write_s_matrix_csr(qs_env, input)
writing the overlap matrix in csr format into a file
subroutine, public write_ks_matrix_csr(qs_env, input)
writing the KS matrix in csr format into a file
subroutine, public write_p_matrix_csr(qs_env, input)
writing the density matrix in csr format into a file
subroutine, public write_hcore_matrix_csr(qs_env, input)
writing the core Hamiltonian matrix in csr format into a file
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
Gets the lumos, and eigenvalues for the lumos.
subroutine, public write_mo_free_results(qs_env)
Write QS results always available (if switched on through the print_keys) Can be called from ls_scf.
subroutine, public qs_scf_post_moments(input, logger, qs_env, output_unit)
Computes and prints electric moments.
subroutine, public write_mo_dependent_results(qs_env, scf_env)
Write QS results available if MO's are present (if switched on through the print_keys) Writes only MO...
subroutine, public scf_post_calculation_gpw(qs_env, wf_type, do_mp2)
collects possible post - scf calculations and prints info / computes properties.
character(len=default_string_length) function cp_section_key_concat_to_absolute(self, extend_by)
Append extend_by to the absolute path of the base section.
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, unoccupied_orbs, scf_env, matrix_s, marked_states, for_rtp)
writes a new 'mixed' set of mos to restart file, without touching the current MOs
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Interface to Wannier90 code.
subroutine, public wannier90_interface(input, logger, qs_env)
...
Methods related to (\cal S)^2 (i.e. spin)
subroutine, public compute_s_square(mos, matrix_s, s_square, s_square_ideal, mo_derivs, strength)
Compute the expectation value <(\cal S)^2> of the single determinant defined by the spin up (alpha) a...
parameters that control an scf iteration
Calculation of STM image as post processing of an electronic structure calculation,...
subroutine, public th_stm_image(qs_env, stm_section, particles, unoccupied_orbs, unoccupied_evals)
Driver for the calculation of STM image, as post processing of a ground-state electronic structure ca...
routines for DFT+NEGF calculations (coupling with the quantum transport code OMEN)
subroutine, public qs_scf_post_transport(qs_env)
post scf calculations for transport
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public write_trexio(qs_env, trexio_section, energy_derivative)
Write a trexio file.
Interface for Voronoi Integration and output of BQB files.
subroutine, public entry_voronoi_or_bqb(do_voro, do_bqb, input_voro, input_bqb, unit_voro, qs_env, rspace_pw)
Does a Voronoi integration of density or stores the density to compressed BQB format.
subroutine, public xray_diffraction_spectrum(qs_env, unit_number, q_max)
Calculate the coherent X-ray diffraction spectrum using the total electronic density in reciprocal sp...
subroutine, public calculate_rhotot_elec_gspace(qs_env, auxbas_pw_pool, rhotot_elec_gspace, q_max, rho_hard, rho_soft, fsign)
The total electronic density in reciprocal space (g-space) is calculated.
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a pointer to a 1d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
quantities needed for a Hirshfeld based partitioning of real space
Contains information about kpoints.
stores all the informations relevant to an mpi environment
represent a list of objects
contained for different pw related things
environment for the poisson solver
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...
keeps the density in various representations, keeping track of which ones are valid.