38 dbcsr_type_antisymmetric
235#include "./base/base_uses.f90"
241 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
249 CHARACTER(len=*),
PARAMETER :: &
250 str_mo_cubes =
"PRINT%MO_CUBES", &
251 str_mo_openpmd =
"PRINT%MO_OPENPMD", &
252 str_elf_cubes =
"PRINT%ELF_CUBE", &
253 str_elf_openpmd =
"PRINT%ELF_OPENPMD", &
254 str_e_density_cubes =
"PRINT%E_DENSITY_CUBE", &
255 str_e_density_openpmd =
"PRINT%E_DENSITY_OPENPMD"
257 INTEGER,
PARAMETER :: grid_output_cubes = 1, grid_output_openpmd = 2
259 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_density = &
260 [-3, 0, 0, 0, 0, 0, 0]
261 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_dimensionless = &
262 [0, 0, 0, 0, 0, 0, 0]
263 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_wavefunction = &
264 [-1.5_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp]
265 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_density =
a_bohr**(-3)
266 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_dimensionless = 1.0_dp
267 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_wavefunction =
a_bohr**(-1.5_dp)
273 CHARACTER(len=default_string_length) :: relative_section_key =
""
274 CHARACTER(len=default_string_length) :: absolute_section_key =
""
275 CHARACTER(len=7) :: format_name =
""
276 INTEGER :: grid_output = -1
277 LOGICAL :: do_output = .false.
280 PROCEDURE,
PUBLIC :: print_key_unit_nr => cp_forward_print_key_unit_nr
282 PROCEDURE,
PUBLIC :: write_pw => cp_forward_write_pw
284 PROCEDURE,
PUBLIC :: print_key_finished_output => cp_forward_print_key_finished_output
286 PROCEDURE,
PUBLIC :: do_openpmd => cp_section_key_do_openpmd
287 PROCEDURE,
PUBLIC :: do_cubes => cp_section_key_do_cubes
288 PROCEDURE,
PUBLIC :: concat_to_relative => cp_section_key_concat_to_relative
289 PROCEDURE,
PUBLIC :: concat_to_absolute => cp_section_key_concat_to_absolute
290 END TYPE cp_section_key
301 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
302 INTENT(OUT) :: zcharge
304 INTEGER :: iat, iatom, ikind, nat, natom, nkind
305 REAL(kind=
dp) :: zeff
307 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
309 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
310 nkind=nkind, natom=natom)
311 ALLOCATE (zcharge(natom))
316 iat = atomic_kind_set(ikind)%atom_list(iatom)
328 FUNCTION cp_section_key_concat_to_absolute(self, extend_by)
RESULT(res)
329 CLASS(cp_section_key),
INTENT(IN) :: self
330 CHARACTER(*),
INTENT(IN) :: extend_by
331 CHARACTER(len=default_string_length) :: res
333 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
334 res = trim(self%absolute_section_key)//trim(extend_by)
336 res = trim(self%absolute_section_key)//
"%"//trim(extend_by)
338 END FUNCTION cp_section_key_concat_to_absolute
346 FUNCTION cp_section_key_concat_to_relative(self, extend_by)
RESULT(res)
347 CLASS(cp_section_key),
INTENT(IN) :: self
348 CHARACTER(*),
INTENT(IN) :: extend_by
349 CHARACTER(len=default_string_length) :: res
351 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
352 res = trim(self%relative_section_key)//trim(extend_by)
354 res = trim(self%relative_section_key)//
"%"//trim(extend_by)
356 END FUNCTION cp_section_key_concat_to_relative
363 FUNCTION cp_section_key_do_cubes(self)
RESULT(res)
364 CLASS(cp_section_key) :: self
367 res = self%do_output .AND. self%grid_output == grid_output_cubes
368 END FUNCTION cp_section_key_do_cubes
375 FUNCTION cp_section_key_do_openpmd(self)
RESULT(res)
376 CLASS(cp_section_key) :: self
379 res = self%do_output .AND. self%grid_output == grid_output_openpmd
380 END FUNCTION cp_section_key_do_openpmd
410 FUNCTION cp_forward_print_key_unit_nr( &
419 ignore_should_output, &
430 openpmd_unit_dimension, &
432 sim_time)
RESULT(res)
434 CLASS(cp_section_key),
INTENT(IN) :: self
437 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
438 CHARACTER(len=*),
INTENT(IN) :: extension
439 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
440 LOGICAL,
INTENT(IN),
OPTIONAL :: local, log_filename, ignore_should_output
441 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: file_form, file_position, file_action, &
443 LOGICAL,
INTENT(IN),
OPTIONAL :: do_backup, on_file
444 LOGICAL,
INTENT(OUT),
OPTIONAL :: is_new_file
445 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
446 CHARACTER(len=default_path_length),
INTENT(OUT), &
448 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
449 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
450 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
451 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
454 IF (self%grid_output == grid_output_cubes)
THEN
456 logger, basis_section, print_key_path, extension=extension, &
457 middle_name=middle_name, local=local, log_filename=log_filename, &
458 ignore_should_output=ignore_should_output, file_form=file_form, &
459 file_position=file_position, file_action=file_action, &
460 file_status=file_status, do_backup=do_backup, on_file=on_file, &
461 is_new_file=is_new_file, mpi_io=mpi_io, fout=fout)
467 middle_name=middle_name, &
468 ignore_should_output=ignore_should_output, &
471 openpmd_basename=openpmd_basename, &
472 openpmd_unit_dimension=openpmd_unit_dimension, &
473 openpmd_unit_si=openpmd_unit_si, &
476 END FUNCTION cp_forward_print_key_unit_nr
494 SUBROUTINE cp_forward_write_pw( &
507 CLASS(cp_section_key),
INTENT(IN) :: self
509 INTEGER,
INTENT(IN) :: unit_nr
510 CHARACTER(*),
INTENT(IN),
OPTIONAL :: title
512 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: stride
513 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: max_file_size_mb
514 LOGICAL,
INTENT(IN),
OPTIONAL :: zero_tails, silent, mpi_io
515 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: zeff
517 IF (self%grid_output == grid_output_cubes)
THEN
518 CALL cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
520 CALL cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
522 END SUBROUTINE cp_forward_write_pw
538 SUBROUTINE cp_forward_print_key_finished_output(self, unit_nr, logger, basis_section, &
539 print_key_path, local, ignore_should_output, on_file, &
541 CLASS(cp_section_key),
INTENT(IN) :: self
542 INTEGER,
INTENT(INOUT) :: unit_nr
545 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
546 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, on_file, &
549 IF (self%grid_output == grid_output_cubes)
THEN
554 END SUBROUTINE cp_forward_print_key_finished_output
574 FUNCTION cube_or_openpmd(input, str_cubes, str_openpmd, logger)
RESULT(res)
576 CHARACTER(len=*),
INTENT(IN) :: str_cubes, str_openpmd
578 TYPE(cp_section_key) :: res
580 LOGICAL :: do_cubes, do_openpmd
583 logger%iter_info, input, &
584 "DFT%"//trim(adjustl(str_cubes))),
cp_p_file)
586 logger%iter_info, input, &
587 "DFT%"//trim(adjustl(str_openpmd))),
cp_p_file)
591 cpassert(.NOT. (do_cubes .AND. do_openpmd))
592 res%do_output = do_cubes .OR. do_openpmd
594 res%grid_output = grid_output_openpmd
595 res%relative_section_key = trim(adjustl(str_openpmd))
596 res%format_name =
"openPMD"
598 res%grid_output = grid_output_cubes
599 res%relative_section_key = trim(adjustl(str_cubes))
600 res%format_name =
"Cube"
602 res%absolute_section_key =
"DFT%"//trim(adjustl(res%relative_section_key))
603 END FUNCTION cube_or_openpmd
611 FUNCTION section_key_do_write(grid_output)
RESULT(res)
612 INTEGER,
INTENT(IN) :: grid_output
613 CHARACTER(len=32) :: res
615 IF (grid_output == grid_output_cubes)
THEN
617 ELSE IF (grid_output == grid_output_openpmd)
THEN
618 res =
"%WRITE_OPENPMD"
620 END FUNCTION section_key_do_write
629 SUBROUTINE print_density_output_message(output_unit, prefix, e_density_section, filename)
630 INTEGER,
INTENT(IN) :: output_unit
631 CHARACTER(len=*),
INTENT(IN) :: prefix
632 TYPE(cp_section_key),
INTENT(IN) :: e_density_section
633 CHARACTER(len=*),
INTENT(IN) :: filename
635 IF (e_density_section%grid_output == grid_output_openpmd)
THEN
636 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
637 trim(prefix)//
" is written in " &
638 //e_density_section%format_name &
639 //
" file format to the file / file pattern:", &
642 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
643 trim(prefix)//
" is written in " &
644 //e_density_section%format_name &
645 //
" file format to the file:", &
648 END SUBROUTINE print_density_output_message
671 CHARACTER(6),
OPTIONAL :: wf_type
672 LOGICAL,
OPTIONAL :: do_mp2
674 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw', &
675 warning_cube_kpoint =
"Print MO cubes not implemented for k-point calculations", &
676 warning_openpmd_kpoint =
"Writing to openPMD not implemented for k-point calculations"
678 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
679 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
680 nlumos, nmo, nspins, output_unit, &
682 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
683 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_stm, &
684 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
685 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
687 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
688 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
691 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
692 unoccupied_evals, unoccupied_evals_stm
693 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
694 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
695 TARGET :: homo_localized, lumo_localized, &
697 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
698 unoccupied_orbs, unoccupied_orbs_stm
701 TYPE(cp_section_key) :: mo_section
702 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
704 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
716 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
725 localize_section, print_key, &
728 CALL timeset(routinen, handle)
735 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
736 IF (
PRESENT(wf_type))
THEN
737 IF (output_unit > 0)
THEN
738 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
739 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
740 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
747 my_localized_wfn = .false.
748 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
749 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
750 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
751 unoccupied_evals_stm, molecule_set, mo_derivs, &
752 subsys, particles, input, print_key, kinetic_m, marked_states, &
753 mixed_evals, qs_loc_env_mixed)
754 NULLIFY (lumo_ptr, rho_ao)
761 p_loc_mixed = .false.
763 cpassert(
ASSOCIATED(scf_env))
764 cpassert(
ASSOCIATED(qs_env))
767 dft_control=dft_control, &
768 molecule_set=molecule_set, &
769 scf_control=scf_control, &
770 do_kpoints=do_kpoints, &
775 particle_set=particle_set, &
776 atomic_kind_set=atomic_kind_set, &
777 qs_kind_set=qs_kind_set)
778 rtp_control => dft_control%rtp_control
785 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
786 DO ispin = 1, dft_control%nspins
787 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
792 CALL update_hartree_with_mp2(rho, qs_env)
795 CALL write_available_results(qs_env, scf_env)
799 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
801 cpassert(
ASSOCIATED(kinetic_m))
802 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
806 IF (unit_nr > 0)
THEN
807 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
810 "DFT%PRINT%KINETIC_ENERGY")
814 CALL qs_scf_post_charges(input, logger, qs_env)
829 IF (loc_print_explicit)
THEN
851 IF (loc_explicit)
THEN
861 p_loc_mixed = .false.
865 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
866 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
867 "therefore localization of unoccupied states will be skipped!")
878 mo_section = cube_or_openpmd(input, str_mo_cubes, str_mo_openpmd, logger)
880 IF (loc_print_explicit)
THEN
884 do_wannier_cubes = .false.
886 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
887 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
890 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
891 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
893 CALL auxbas_pw_pool%create_pw(wf_r)
894 CALL auxbas_pw_pool%create_pw(wf_g)
897 IF (dft_control%restricted)
THEN
901 nspins = dft_control%nspins
904 IF (dft_control%restricted .AND. (mo_section%do_output .OR. p_loc_homo))
THEN
905 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
910 cpwarn_if(mo_section%do_cubes(), warning_cube_kpoint)
911 cpwarn_if(mo_section%do_openpmd(), warning_openpmd_kpoint)
916 IF ((mo_section%do_output .AND. nhomo /= 0) .OR. do_stm)
THEN
918 IF (dft_control%do_admm)
THEN
920 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
922 IF (dft_control%hairy_probes)
THEN
923 scf_control%smear%do_smear = .false.
924 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
926 probe=dft_control%probe)
928 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
931 DO ispin = 1, dft_control%nspins
932 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
933 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
937 IF (mo_section%do_output .AND. nhomo /= 0)
THEN
940 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
941 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
942 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
943 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
954 cpwarn(
"Localization not implemented for k-point calculations!")
955 ELSE IF (dft_control%restricted &
958 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
960 ALLOCATE (occupied_orbs(dft_control%nspins))
961 ALLOCATE (occupied_evals(dft_control%nspins))
962 ALLOCATE (homo_localized(dft_control%nspins))
963 DO ispin = 1, dft_control%nspins
964 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
965 eigenvalues=mo_eigenvalues)
966 occupied_orbs(ispin) = mo_coeff
967 occupied_evals(ispin)%array => mo_eigenvalues
968 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
969 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
972 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
975 ALLOCATE (qs_loc_env_homo)
978 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
979 mo_section%do_output, mo_loc_history=mo_loc_history)
981 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
984 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
986 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
991 homo_localized, do_homo)
993 DEALLOCATE (occupied_orbs)
994 DEALLOCATE (occupied_evals)
996 IF (qs_loc_env_homo%do_localize)
THEN
997 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
1003 IF (do_kpoints)
THEN
1004 IF (mo_section%do_output .OR. p_loc_lumo)
THEN
1006 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
1009 compute_lumos = mo_section%do_output .AND. nlumo /= 0
1010 compute_lumos = compute_lumos .OR. p_loc_lumo
1012 DO ispin = 1, dft_control%nspins
1013 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
1014 compute_lumos = compute_lumos .AND. homo == nmo
1017 IF (mo_section%do_output .AND. .NOT. compute_lumos)
THEN
1019 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
1020 DO ispin = 1, dft_control%nspins
1022 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
1023 IF (nlumo > nmo - homo)
THEN
1026 IF (nlumo == -1)
THEN
1029 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1030 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
1031 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
1032 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
1035 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1036 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1037 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1, mo_section=mo_section)
1043 IF (compute_lumos)
THEN
1044 check_write = .true.
1046 IF (nlumo == 0) check_write = .false.
1047 IF (p_loc_lumo)
THEN
1049 ALLOCATE (qs_loc_env_lumo)
1052 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
1055 ALLOCATE (unoccupied_orbs(dft_control%nspins))
1056 ALLOCATE (unoccupied_evals(dft_control%nspins))
1057 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
1058 lumo_ptr => unoccupied_orbs
1059 DO ispin = 1, dft_control%nspins
1061 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
1062 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
1063 IF (check_write)
THEN
1064 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
1066 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1067 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin, mo_section=mo_section)
1071 IF (p_loc_lumo)
THEN
1072 ALLOCATE (lumo_localized(dft_control%nspins))
1073 DO ispin = 1, dft_control%nspins
1074 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
1075 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
1077 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, mo_section%do_output, &
1078 evals=unoccupied_evals)
1079 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
1080 loc_coeff=unoccupied_orbs)
1082 lumo_localized, wf_r, wf_g, particles, &
1083 unoccupied_orbs, unoccupied_evals, marked_states)
1084 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
1085 evals=unoccupied_evals)
1086 lumo_ptr => lumo_localized
1090 IF (has_homo .AND. has_lumo)
THEN
1091 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1092 DO ispin = 1, dft_control%nspins
1093 IF (.NOT. scf_control%smear%do_smear)
THEN
1094 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
1095 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
1096 "HOMO - LUMO gap [eV] :", gap*
evolt
1102 IF (p_loc_mixed)
THEN
1103 IF (do_kpoints)
THEN
1104 cpwarn(
"Localization not implemented for k-point calculations!")
1105 ELSE IF (dft_control%restricted)
THEN
1106 IF (output_unit > 0)
WRITE (output_unit, *) &
1107 " Unclear how we define MOs / localization in the restricted case... skipping"
1110 ALLOCATE (mixed_orbs(dft_control%nspins))
1111 ALLOCATE (mixed_evals(dft_control%nspins))
1112 ALLOCATE (mixed_localized(dft_control%nspins))
1113 DO ispin = 1, dft_control%nspins
1114 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1115 eigenvalues=mo_eigenvalues)
1116 mixed_orbs(ispin) = mo_coeff
1117 mixed_evals(ispin)%array => mo_eigenvalues
1118 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
1119 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
1122 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
1125 total_zeff_corr = scf_env%sum_zeff_corr
1126 ALLOCATE (qs_loc_env_mixed)
1129 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
1130 mo_section%do_output, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
1133 DO ispin = 1, dft_control%nspins
1134 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
1138 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
1141 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
1143 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
1150 DEALLOCATE (mixed_orbs)
1151 DEALLOCATE (mixed_evals)
1156 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
1157 CALL auxbas_pw_pool%give_back_pw(wf_r)
1158 CALL auxbas_pw_pool%give_back_pw(wf_g)
1162 IF (.NOT. do_kpoints)
THEN
1163 IF (p_loc_homo)
THEN
1165 DEALLOCATE (qs_loc_env_homo)
1167 IF (p_loc_lumo)
THEN
1169 DEALLOCATE (qs_loc_env_lumo)
1171 IF (p_loc_mixed)
THEN
1173 DEALLOCATE (qs_loc_env_mixed)
1178 IF (do_kpoints)
THEN
1181 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
1182 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
1183 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
1184 matrix_s=matrix_s, marked_states=marked_states)
1188 IF (
ASSOCIATED(marked_states))
THEN
1189 DEALLOCATE (marked_states)
1193 IF (.NOT. do_kpoints)
THEN
1194 IF (compute_lumos)
THEN
1195 DO ispin = 1, dft_control%nspins
1196 DEALLOCATE (unoccupied_evals(ispin)%array)
1199 DEALLOCATE (unoccupied_evals)
1200 DEALLOCATE (unoccupied_orbs)
1206 IF (do_kpoints)
THEN
1207 cpwarn(
"STM not implemented for k-point calculations!")
1209 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
1210 IF (nlumo_stm > 0)
THEN
1211 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
1212 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
1213 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
1217 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
1218 unoccupied_evals_stm)
1220 IF (nlumo_stm > 0)
THEN
1221 DO ispin = 1, dft_control%nspins
1222 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
1224 DEALLOCATE (unoccupied_evals_stm)
1231 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1234 CALL qs_scf_post_efg(input, logger, qs_env)
1237 CALL qs_scf_post_et(input, qs_env, dft_control)
1240 CALL qs_scf_post_epr(input, logger, qs_env)
1243 CALL qs_scf_post_molopt(input, logger, qs_env)
1246 CALL qs_scf_post_elf(input, logger, qs_env)
1253 DO ispin = 1, dft_control%nspins
1254 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
1262 CALL timestop(handle)
1275 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
1279 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
1281 INTEGER,
INTENT(IN) :: nlumo
1282 INTEGER,
INTENT(OUT) :: nlumos
1284 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
1286 INTEGER :: handle, homo, ispin, n, nao, nmo, &
1293 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1300 CALL timeset(routinen, handle)
1302 NULLIFY (ks_rmpv, matrix_s, scf_control, dft_control, admm_env, para_env, blacs_env, mos)
1304 matrix_ks=ks_rmpv, &
1305 matrix_s=matrix_s, &
1306 scf_control=scf_control, &
1307 dft_control=dft_control, &
1308 admm_env=admm_env, &
1309 para_env=para_env, &
1310 blacs_env=blacs_env, &
1316 DO ispin = 1, dft_control%nspins
1317 NULLIFY (unoccupied_evals(ispin)%array)
1318 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1319 IF (output_unit > 0)
WRITE (output_unit, *) &
1320 " Using OT eigensolver for additional unoccupied orbitals spin ", ispin
1321 IF (output_unit > 0)
WRITE (output_unit, *) &
1322 " Lowest Eigenvalues of the unoccupied subspace spin ", ispin
1323 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
1324 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1326 nlumos = max(1, min(nlumo, nao - nmo))
1327 IF (nlumo == -1) nlumos = nao - nmo
1328 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1330 nrow_global=n, ncol_global=nlumos)
1331 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1336 NULLIFY (local_preconditioner)
1337 IF (
ASSOCIATED(scf_env))
THEN
1338 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1339 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1342 NULLIFY (local_preconditioner)
1348 IF (dft_control%do_admm)
THEN
1352 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1353 matrix_c_fm=unoccupied_orbs(ispin), &
1354 matrix_orthogonal_space_fm=mo_coeff, &
1355 eps_gradient=scf_control%eps_lumos, &
1357 iter_max=scf_control%max_iter_lumos, &
1358 size_ortho_space=nmo)
1361 unoccupied_evals(ispin)%array, scr=output_unit, &
1362 ionode=output_unit > 0)
1365 IF (dft_control%do_admm)
THEN
1371 CALL timestop(handle)
1381 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
1386 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
1388 INTEGER :: handle, print_level, unit_nr
1389 LOGICAL :: do_kpoints, print_it
1392 CALL timeset(routinen, handle)
1394 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
1402 log_filename=.false.)
1405 IF (print_it) print_level = 2
1407 IF (print_it) print_level = 3
1418 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
1419 log_filename=.false.)
1421 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
1425 CALL timestop(handle)
1427 END SUBROUTINE qs_scf_post_charges
1444 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1445 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
1454 INTEGER,
INTENT(IN) :: homo, ispin
1455 TYPE(cp_section_key) :: mo_section
1457 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1459 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1460 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1462 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1463 LOGICAL :: append_cube, mpi_io
1464 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
1469 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1471 CALL timeset(routinen, handle)
1476 cpassert(mo_section%grid_output /= grid_output_openpmd)
1479 NULLIFY (list_index)
1482 ,
cp_p_file) .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1484 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
1486 IF (mo_section%grid_output == grid_output_cubes)
THEN
1487 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1489 my_pos_cube =
"REWIND"
1490 IF (append_cube)
THEN
1491 my_pos_cube =
"APPEND"
1493 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), n_rep_val=n_rep)
1498 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), i_rep_val=ir, &
1500 IF (
ASSOCIATED(
list))
THEN
1502 DO i = 1,
SIZE(
list)
1503 list_index(i + nlist) =
list(i)
1505 nlist = nlist +
SIZE(
list)
1510 IF (nhomo == -1) nhomo = homo
1511 nlist = homo - max(1, homo - nhomo + 1) + 1
1512 ALLOCATE (list_index(nlist))
1514 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1518 ivector = list_index(i)
1520 atomic_kind_set=atomic_kind_set, &
1521 qs_kind_set=qs_kind_set, &
1523 particle_set=particle_set, &
1526 cell, dft_control, particle_set, pw_env)
1527 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1530 unit_nr = mo_section%print_key_unit_nr( &
1533 mo_section%absolute_section_key, &
1534 extension=
".cube", &
1535 middle_name=trim(filename), &
1536 file_position=my_pos_cube, &
1537 log_filename=.false., &
1539 openpmd_basename=
"dft-mo", &
1540 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1541 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1542 sim_time=qs_env%sim_time)
1543 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1544 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1545 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1546 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1548 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1550 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1551 DEALLOCATE (zcharge)
1554 CALL timestop(handle)
1556 END SUBROUTINE qs_scf_post_occ_cubes
1575 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1576 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo, mo_section)
1582 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1586 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1587 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1588 TYPE(cp_section_key) :: mo_section
1590 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1592 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1593 INTEGER :: handle, ifirst, index_mo, ivector, &
1595 LOGICAL :: append_cube, mpi_io
1596 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
1601 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1603 CALL timeset(routinen, handle)
1608 cpassert(mo_section%grid_output /= grid_output_openpmd)
1612 .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1614 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1616 IF (mo_section%grid_output == grid_output_cubes)
THEN
1617 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1619 my_pos_cube =
"REWIND"
1620 IF (append_cube)
THEN
1621 my_pos_cube =
"APPEND"
1624 IF (
PRESENT(lumo)) ifirst = lumo
1625 DO ivector = ifirst, ifirst + nlumos - 1
1627 atomic_kind_set=atomic_kind_set, &
1628 qs_kind_set=qs_kind_set, &
1630 particle_set=particle_set, &
1633 qs_kind_set, cell, dft_control, particle_set, pw_env)
1635 IF (ifirst == 1)
THEN
1636 index_mo = homo + ivector
1640 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1643 unit_nr = mo_section%print_key_unit_nr( &
1646 mo_section%absolute_section_key, &
1647 extension=
".cube", &
1648 middle_name=trim(filename), &
1649 file_position=my_pos_cube, &
1650 log_filename=.false., &
1652 openpmd_basename=
"dft-mo", &
1653 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1654 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1655 sim_time=qs_env%sim_time)
1656 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1657 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1658 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1659 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1661 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1664 DEALLOCATE (zcharge)
1667 CALL timestop(handle)
1669 END SUBROUTINE qs_scf_post_unocc_cubes
1682 INTEGER,
INTENT(IN) :: output_unit
1684 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1686 CHARACTER(LEN=default_path_length) :: bc_file, dip_file, filename
1687 CHARACTER(LEN=default_string_length) :: moment_unit
1688 INTEGER :: handle, max_nmo, maxmom, moments_format, &
1689 moments_unit_nr, reference, unit_nr
1690 LOGICAL :: com_nl, do_kg, do_kpoints, do_soc, &
1691 magnetic, new_file, periodic, &
1692 second_ref_point, vel_reprs
1693 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1696 CALL timeset(routinen, handle)
1699 subsection_name=
"DFT%PRINT%MOMENTS")
1704 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1706 keyword_name=
"DFT%PRINT%MOMENTS%FORMAT")
1708 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1710 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1712 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1714 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1716 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1718 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1720 keyword_name=
"DFT%PRINT%MOMENTS%KG")
1722 keyword_name=
"DFT%PRINT%MOMENTS%MAX_NMO")
1724 keyword_name=
"DFT%PRINT%MOMENTS%SOC")
1734 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1735 middle_name=
"moments", log_filename=.false., &
1736 is_new_file=new_file)
1738 IF (output_unit > 0)
THEN
1739 IF (unit_nr /= output_unit)
THEN
1740 INQUIRE (unit=unit_nr, name=filename)
1741 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1742 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1745 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1749 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1752 IF (do_kpoints)
THEN
1753 cpabort(
"MOMENTS FORMAT TRAJECTORY is not available for k-point calculations.")
1755 IF (maxmom /= 1) cpabort(
"MOMENTS FORMAT TRAJECTORY requires MAX_MOMENT 1.")
1756 IF (magnetic) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support MAGNETIC moments.")
1757 IF (vel_reprs) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support VEL_REPRS.")
1758 IF (do_kg) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support KG moments.")
1759 moments_unit_nr = -1
1761 moments_unit_nr = unit_nr
1764 IF (do_kpoints)
THEN
1765 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr, &
1766 do_soc, unit_str=moment_unit, dip_file=dip_file, bc_file=bc_file)
1770 unit_str=moment_unit)
1772 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, moments_unit_nr, vel_reprs, com_nl, &
1773 unit_str=moment_unit)
1777 unit_str=moment_unit)
1781 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS|")
1785 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1787 IF (second_ref_point)
THEN
1789 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1794 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1795 middle_name=
"moments_refpoint_2", log_filename=.false., &
1796 is_new_file=new_file)
1798 IF (output_unit > 0)
THEN
1799 IF (unit_nr /= output_unit)
THEN
1800 INQUIRE (unit=unit_nr, name=filename)
1801 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1802 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1805 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1809 IF (do_kpoints)
THEN
1810 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr, &
1811 do_soc, unit_str=moment_unit, dip_file=dip_file, bc_file=bc_file)
1815 unit_str=moment_unit)
1817 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, &
1818 moments_unit_nr, vel_reprs, com_nl, unit_str=moment_unit)
1822 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS_REF2|")
1825 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1830 CALL timestop(handle)
1843 SUBROUTINE write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file, label)
1844 INTEGER,
INTENT(IN) :: unit_nr
1847 LOGICAL,
INTENT(IN) :: periodic, new_file
1848 CHARACTER(LEN=*),
INTENT(IN) :: label
1850 CHARACTER(LEN=default_string_length) :: description, iter
1851 REAL(kind=
dp),
DIMENSION(3) :: dipole
1855 IF (unit_nr <= 0)
RETURN
1857 NULLIFY (cell, results)
1858 CALL get_qs_env(qs_env, cell=cell, results=results)
1859 description =
"[DIPOLE]"
1860 CALL get_results(results=results, description=description, values=dipole)
1864 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1865 " iter_level dipole_x dipole_y dipole_z dipole_norm cell_xx cell_xy cell_xz"// &
1866 " cell_yx cell_yy cell_yz cell_zx cell_zy cell_zz [Debye]"
1868 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1869 " iter_level dipole_x dipole_y dipole_z dipole_norm [Debye]"
1875 WRITE (unit_nr,
"(1X,A,1X,A15,13(1X,ES18.10))") trim(label), iter(1:15), &
1879 WRITE (unit_nr,
"(1X,A,1X,A15,4(1X,ES18.10))") trim(label), iter(1:15), &
1883 END SUBROUTINE write_moments_trajectory
1893 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1898 INTEGER,
INTENT(IN) :: output_unit
1900 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1902 CHARACTER(LEN=default_path_length) :: filename
1903 INTEGER :: handle, unit_nr
1904 REAL(kind=
dp) :: q_max
1907 CALL timeset(routinen, handle)
1910 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1914 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1916 basis_section=input, &
1917 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1919 middle_name=
"xrd", &
1920 log_filename=.false.)
1921 IF (output_unit > 0)
THEN
1922 INQUIRE (unit=unit_nr, name=filename)
1923 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1924 "X-RAY DIFFRACTION SPECTRUM"
1925 IF (unit_nr /= output_unit)
THEN
1926 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1927 "The coherent X-ray diffraction spectrum is written to the file:", &
1932 unit_number=unit_nr, &
1936 basis_section=input, &
1937 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1940 CALL timestop(handle)
1942 END SUBROUTINE qs_scf_post_xray
1950 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1955 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1960 CALL timeset(routinen, handle)
1963 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1969 CALL timestop(handle)
1971 END SUBROUTINE qs_scf_post_efg
1979 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1984 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1986 INTEGER :: handle, ispin
1988 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1991 CALL timeset(routinen, handle)
1997 IF (qs_env%et_coupling%first_run)
THEN
1999 ALLOCATE (my_mos(dft_control%nspins))
2000 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
2001 DO ispin = 1, dft_control%nspins
2003 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
2004 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
2013 CALL timestop(handle)
2015 END SUBROUTINE qs_scf_post_et
2026 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
2031 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
2033 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2035 INTEGER :: handle, ispin, output_unit, unit_nr
2036 LOGICAL :: append_cube, gapw, mpi_io
2037 REAL(
dp) :: rho_cutoff
2038 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2039 TYPE(cp_section_key) :: elf_section_key
2049 CALL timeset(routinen, handle)
2052 elf_section_key = cube_or_openpmd(input, str_elf_cubes, str_elf_openpmd, logger)
2055 IF (elf_section_key%do_output)
THEN
2057 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
2058 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
2061 gapw = dft_control%qs_control%gapw
2062 IF (.NOT. gapw)
THEN
2064 ALLOCATE (elf_r(dft_control%nspins))
2065 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2067 DO ispin = 1, dft_control%nspins
2068 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
2072 IF (output_unit > 0)
THEN
2073 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
2074 " ----- ELF is computed on the real space grid -----"
2083 IF (elf_section_key%grid_output == grid_output_cubes)
THEN
2086 my_pos_cube =
"REWIND"
2087 IF (append_cube)
THEN
2088 my_pos_cube =
"APPEND"
2091 DO ispin = 1, dft_control%nspins
2092 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
2093 WRITE (title, *)
"ELF spin ", ispin
2095 unit_nr = elf_section_key%print_key_unit_nr( &
2098 elf_section_key%absolute_section_key, &
2099 extension=
".cube", &
2100 middle_name=trim(filename), &
2101 file_position=my_pos_cube, &
2102 log_filename=.false., &
2104 fout=mpi_filename, &
2105 openpmd_basename=
"dft-elf", &
2106 openpmd_unit_dimension=openpmd_unit_dimension_dimensionless, &
2107 openpmd_unit_si=openpmd_unit_si_dimensionless, &
2108 sim_time=qs_env%sim_time)
2109 IF (output_unit > 0)
THEN
2110 IF (.NOT. mpi_io)
THEN
2111 INQUIRE (unit=unit_nr, name=filename)
2113 filename = mpi_filename
2115 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2116 "ELF is written in "//elf_section_key%format_name//
" file format to the file:", &
2120 CALL elf_section_key%write_pw(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
2122 CALL elf_section_key%print_key_finished_output( &
2126 elf_section_key%absolute_section_key, &
2129 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
2133 DEALLOCATE (elf_r, zcharge)
2137 cpwarn(
"ELF not implemented for GAPW calculations!")
2142 CALL timestop(handle)
2144 END SUBROUTINE qs_scf_post_elf
2156 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
2161 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
2163 INTEGER :: handle, nao, unit_nr
2164 REAL(kind=
dp) :: s_cond_number
2165 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
2174 CALL timeset(routinen, handle)
2177 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2181 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
2184 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
2186 nrow_global=nao, ncol_global=nao, &
2187 template_fmstruct=mo_coeff%matrix_struct)
2188 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
2190 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
2193 ALLOCATE (eigenvalues(nao))
2201 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
2204 extension=
".molopt")
2206 IF (unit_nr > 0)
THEN
2209 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
2210 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
2214 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2218 CALL timestop(handle)
2220 END SUBROUTINE qs_scf_post_molopt
2228 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
2233 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
2238 CALL timeset(routinen, handle)
2241 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
2247 CALL timestop(handle)
2249 END SUBROUTINE qs_scf_post_epr
2258 SUBROUTINE write_available_results(qs_env, scf_env)
2262 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
2266 CALL timeset(routinen, handle)
2274 CALL timestop(handle)
2276 END SUBROUTINE write_available_results
2289 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
2291 INTEGER :: handle, ispin, nlumo_dos, nlumo_molden, &
2292 nlumo_required, nlumos, output_unit
2293 LOGICAL :: defer_molden, do_curve, do_dos, &
2294 do_kpoints, do_pdos, do_projected_dos, &
2296 REAL(kind=
dp) :: s_square, s_square_ideal, &
2297 total_abs_spin_dens, total_spin_dens
2298 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
2303 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
2306 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
2307 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp
2321 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2326 dos_section, input, sprint_section, &
2329 CALL timeset(routinen, handle)
2331 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
2332 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
2333 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
2334 molecule_set, input, particles, subsys, rho_r, unoccupied_orbs, &
2335 unoccupied_evals, casino_section, dos_section)
2340 cpassert(
ASSOCIATED(qs_env))
2342 dft_control=dft_control, &
2343 molecule_set=molecule_set, &
2344 atomic_kind_set=atomic_kind_set, &
2345 particle_set=particle_set, &
2346 qs_kind_set=qs_kind_set, &
2347 admm_env=admm_env, &
2348 scf_control=scf_control, &
2357 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
2361 IF (.NOT. qs_env%run_rtp)
THEN
2374 defer_molden = .false.
2375 IF (.NOT. do_kpoints)
THEN
2376 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
2380 IF (nlumo_molden /= 0 .AND.
PRESENT(scf_env))
THEN
2381 IF (scf_env%method ==
ot_method_nr) defer_molden = .true.
2383 IF (.NOT. defer_molden)
THEN
2384 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2385 qs_env=qs_env, calc_energies=.true.)
2394 cpwarn(
"Molden format output is not possible for k-point calculations.")
2398 cpwarn(
"Chargemol .wfx format output is not possible for k-point calculations.")
2405 IF (do_kpoints)
THEN
2409 cpwarn(
"MO_KP is only available for k-point calculations, ignored for Gamma-only")
2420 IF (.NOT. do_kpoints .AND.
PRESENT(scf_env))
THEN
2424 IF (nlumo_dos == -1)
THEN
2426 ELSE IF (nlumo_required /= -1)
THEN
2427 nlumo_required = max(nlumo_required, nlumo_dos)
2431 IF (defer_molden)
THEN
2432 IF (nlumo_molden == -1)
THEN
2434 ELSE IF (nlumo_required /= -1)
THEN
2435 nlumo_required = max(nlumo_required, nlumo_molden)
2438 IF (nlumo_required /= 0)
THEN
2439 ALLOCATE (unoccupied_orbs(dft_control%nspins))
2440 ALLOCATE (unoccupied_evals(dft_control%nspins))
2441 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, &
2442 nlumo_required, nlumos)
2445 IF (do_dos .OR. do_projected_dos)
THEN
2446 DO ispin = 1, dft_control%nspins
2449 IF (dft_control%do_admm)
THEN
2452 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
2453 eigenvalues=mo_eigenvalues)
2454 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
2455 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
2457 mo_coeff_deriv => null()
2460 do_rotation=.true., &
2461 co_rotate_dbcsr=mo_coeff_deriv)
2463 IF (dft_control%do_admm)
THEN
2471 IF (defer_molden)
THEN
2472 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2473 IF (output_unit > 0)
THEN
2474 WRITE (output_unit,
'(/,T2,A,I6,A)') &
2475 "MO_MOLDEN| Writing ", nlumos,
" unoccupied orbitals to molden file"
2477 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2478 unoccupied_orbs=unoccupied_orbs, &
2479 unoccupied_evals=unoccupied_evals, &
2480 qs_env=qs_env, calc_energies=.true.)
2486 IF (do_kpoints)
THEN
2488 IF (do_curve)
CALL calculate_dos_kp(qs_env, dft_section, write_curve_output=.true.)
2491 IF (
ASSOCIATED(unoccupied_evals))
THEN
2492 CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2493 smearing_enabled=dft_control%smear)
2494 IF (do_curve)
CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2495 smearing_enabled=dft_control%smear, write_curve_output=.true.)
2497 CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear)
2498 IF (do_curve)
CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear, &
2499 write_curve_output=.true.)
2505 IF (do_projected_dos)
THEN
2506 IF (do_kpoints)
THEN
2508 write_pdos=do_pdos, write_pdos_curve=do_curve)
2513 DO ispin = 1, dft_control%nspins
2514 IF (dft_control%nspins == 2)
THEN
2515 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2517 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2518 unoccupied_orbs=unoccupied_orbs(ispin), &
2519 unoccupied_evals=unoccupied_evals(ispin), &
2520 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2523 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2524 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2527 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2529 qs_kind_set, particle_set, qs_env, dft_section, &
2530 unoccupied_orbs=unoccupied_orbs(ispin), &
2531 unoccupied_evals=unoccupied_evals(ispin), &
2532 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2535 qs_kind_set, particle_set, qs_env, dft_section, &
2536 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2542 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2543 DO ispin = 1, dft_control%nspins
2544 DEALLOCATE (unoccupied_evals(ispin)%array)
2547 DEALLOCATE (unoccupied_evals)
2548 DEALLOCATE (unoccupied_orbs)
2553 IF (dft_control%nspins == 2)
THEN
2554 total_spin_dens = 0.0_dp
2555 total_abs_spin_dens = 0.0_dp
2556 IF (dft_control%qs_control%gapw)
THEN
2557 CALL get_qs_env(qs_env, qs_charges=qs_charges)
2558 total_spin_dens = qs_charges%total_rho_hard_spin - &
2559 qs_charges%total_rho_soft_spin
2560 total_abs_spin_dens = qs_charges%total_rho_hard_abs_spin - &
2561 qs_charges%total_rho_soft_abs_spin
2564 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2565 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2567 CALL auxbas_pw_pool%create_pw(wf_r)
2569 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
2571 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
2572 "Integrated spin density: ", total_spin_dens
2574 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
2575 "Integrated absolute spin density: ", total_abs_spin_dens
2576 CALL auxbas_pw_pool%give_back_pw(wf_r)
2579 IF (do_kpoints)
THEN
2580 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s_kp, kpoints=kpoints)
2583 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
2586 IF (dft_control%relax_multiplicity > 0.0_dp)
THEN
2587 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T66,F15.6)') &
2588 "Relaxed multiplicity: Single determinant S**2 : ", s_square
2590 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
2591 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
2595 CALL timestop(handle)
2607 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
2608 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
2610 CHARACTER(LEN=2) :: element_symbol
2611 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2613 CHARACTER(LEN=default_string_length) :: name, print_density
2614 INTEGER :: after, handle, i, iat, id, ikind, img, iso, ispin, iw, l, n_rep_hf, natom, nd(3), &
2615 ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, should_print_voro, &
2616 unit_nr, unit_nr_voro
2617 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
2618 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
2620 rho_total, rho_total_rspace, udvol, &
2622 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2623 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
2624 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
2625 REAL(kind=
dp),
DIMENSION(3) :: checksum_hr, dr
2626 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
2631 TYPE(cp_section_key) :: e_density_section
2633 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_s, matrix_vxc, rho_ao
2639 POINTER :: sab_orb, sap_ppnl
2643 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
2650 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2658 print_key, print_key_bqb, &
2659 print_key_voro, xc_section
2661 CALL timeset(routinen, handle)
2662 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
2663 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
2664 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
2665 vee, matrix_hr, matrix_s, sab_orb, sap_ppnl)
2670 cpassert(
ASSOCIATED(qs_env))
2672 atomic_kind_set=atomic_kind_set, &
2673 qs_kind_set=qs_kind_set, &
2676 particle_set=particle_set, &
2678 para_env=para_env, &
2679 dft_control=dft_control, &
2681 do_kpoints=do_kpoints, &
2683 matrix_s_kp=matrix_s, &
2696 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
2697 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
2699 my_pos_cube =
"REWIND"
2700 IF (append_cube)
THEN
2701 my_pos_cube =
"APPEND"
2704 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
2705 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
2706 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2708 CALL auxbas_pw_pool%create_pw(wf_r)
2709 IF (dft_control%qs_control%gapw)
THEN
2710 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
2711 CALL pw_axpy(rho_core, rho0_s_gs)
2712 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2713 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2716 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
2717 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2718 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2721 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2722 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2725 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2726 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2732 DO ispin = 1, dft_control%nspins
2733 CALL pw_axpy(rho_r(ispin), wf_r)
2735 filename =
"TOTAL_DENSITY"
2738 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2739 log_filename=.false., mpi_io=mpi_io)
2741 particles=particles, zeff=zcharge, &
2743 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%TOT_DENSITY_CUBE%MAX_FILE_SIZE_MB"), &
2746 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2747 CALL auxbas_pw_pool%give_back_pw(wf_r)
2750 e_density_section = cube_or_openpmd(input, str_e_density_cubes, str_e_density_openpmd, logger)
2753 IF (e_density_section%do_output)
THEN
2755 keyword_name=e_density_section%concat_to_relative(
"%DENSITY_INCLUDE"), &
2756 c_val=print_density)
2757 print_density = trim(print_density)
2759 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2760 append_cube =
section_get_lval(input, e_density_section%concat_to_absolute(
"%APPEND"))
2762 my_pos_cube =
"REWIND"
2763 IF (append_cube)
THEN
2764 my_pos_cube =
"APPEND"
2768 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2769 xrd_interface =
section_get_lval(input, e_density_section%concat_to_absolute(
"%XRD_INTERFACE"))
2772 xrd_interface = .false.
2775 IF (xrd_interface)
THEN
2777 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2779 filename =
"ELECTRON_DENSITY"
2781 extension=
".xrd", middle_name=trim(filename), &
2782 file_position=my_pos_cube, log_filename=.false.)
2783 ngto =
section_get_ival(input, e_density_section%concat_to_absolute(
"%NGAUSS"))
2784 IF (output_unit > 0)
THEN
2785 INQUIRE (unit=unit_nr, name=filename)
2786 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2787 "The electron density (atomic part) is written to the file:", &
2792 nkind =
SIZE(atomic_kind_set)
2793 IF (unit_nr > 0)
THEN
2794 WRITE (unit_nr, *)
"Atomic (core) densities"
2795 WRITE (unit_nr, *)
"Unit cell"
2796 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2797 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2798 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2799 WRITE (unit_nr, *)
"Atomic types"
2800 WRITE (unit_nr, *) nkind
2803 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2805 atomic_kind => atomic_kind_set(ikind)
2806 qs_kind => qs_kind_set(ikind)
2807 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2809 iunit=output_unit, confine=.true.)
2811 iunit=output_unit, allelectron=.true., confine=.true.)
2812 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2813 ccdens(:, 2, ikind) = 0._dp
2814 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2815 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2816 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2817 IF (unit_nr > 0)
THEN
2818 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2819 WRITE (unit_nr, fmt=
"(I6)") ngto
2820 WRITE (unit_nr, *)
" Total density"
2821 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2822 WRITE (unit_nr, *)
" Core density"
2823 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2825 NULLIFY (atomic_kind)
2828 IF (dft_control%qs_control%gapw)
THEN
2829 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2831 IF (unit_nr > 0)
THEN
2832 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2834 np = particles%n_els
2836 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2837 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2838 rho_atom => rho_atom_set(iat)
2839 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2840 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2841 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2846 CALL para_env%sum(nr)
2847 CALL para_env%sum(niso)
2849 ALLOCATE (bfun(nr, niso))
2851 DO ispin = 1, dft_control%nspins
2852 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2853 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2856 CALL para_env%sum(bfun)
2857 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2858 ccdens(:, 2, ikind) = 0._dp
2859 IF (unit_nr > 0)
THEN
2860 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2864 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2865 IF (unit_nr > 0)
THEN
2866 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2867 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2873 IF (unit_nr > 0)
THEN
2874 WRITE (unit_nr, *)
"Coordinates"
2875 np = particles%n_els
2877 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2878 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2883 DEALLOCATE (ppdens, aedens, ccdens)
2886 e_density_section%absolute_section_key)
2889 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2891 cpassert(.NOT. do_kpoints)
2896 auxbas_pw_pool=auxbas_pw_pool, &
2898 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2900 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2905 q_max = sqrt(sum((
pi/dr(:))**2))
2907 auxbas_pw_pool=auxbas_pw_pool, &
2908 rhotot_elec_gspace=rho_elec_gspace, &
2910 rho_hard=rho_hard, &
2912 rho_total = rho_hard + rho_soft
2917 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2919 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2921 filename =
"TOTAL_ELECTRON_DENSITY"
2923 unit_nr = e_density_section%print_key_unit_nr( &
2926 e_density_section%absolute_section_key, &
2927 extension=
".cube", &
2928 middle_name=trim(filename), &
2929 file_position=my_pos_cube, &
2930 log_filename=.false., &
2932 fout=mpi_filename, &
2933 openpmd_basename=
"dft-total-electron-density", &
2934 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2935 openpmd_unit_si=openpmd_unit_si_density, &
2936 sim_time=qs_env%sim_time)
2937 IF (output_unit > 0)
THEN
2938 IF (.NOT. mpi_io)
THEN
2939 INQUIRE (unit=unit_nr, name=filename)
2941 filename = mpi_filename
2943 CALL print_density_output_message(output_unit,
"The total electron density", &
2944 e_density_section, filename)
2945 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2946 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2947 "Soft electronic charge (G-space) :", rho_soft, &
2948 "Hard electronic charge (G-space) :", rho_hard, &
2949 "Total electronic charge (G-space):", rho_total, &
2950 "Total electronic charge (R-space):", rho_total_rspace
2952 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2953 particles=particles, zeff=zcharge, &
2954 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2955 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2956 e_density_section%absolute_section_key, mpi_io=mpi_io)
2958 IF (dft_control%nspins > 1)
THEN
2962 auxbas_pw_pool=auxbas_pw_pool, &
2963 rhotot_elec_gspace=rho_elec_gspace, &
2965 rho_hard=rho_hard, &
2966 rho_soft=rho_soft, &
2968 rho_total = rho_hard + rho_soft
2972 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2974 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2976 filename =
"TOTAL_SPIN_DENSITY"
2978 unit_nr = e_density_section%print_key_unit_nr( &
2981 e_density_section%absolute_section_key, &
2982 extension=
".cube", &
2983 middle_name=trim(filename), &
2984 file_position=my_pos_cube, &
2985 log_filename=.false., &
2987 fout=mpi_filename, &
2988 openpmd_basename=
"dft-total-spin-density", &
2989 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2990 openpmd_unit_si=openpmd_unit_si_density, &
2991 sim_time=qs_env%sim_time)
2992 IF (output_unit > 0)
THEN
2993 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2994 INQUIRE (unit=unit_nr, name=filename)
2996 filename = mpi_filename
2998 CALL print_density_output_message(output_unit,
"The total spin density", &
2999 e_density_section, filename)
3000 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3001 "q(max) [1/Angstrom] :", q_max/
angstrom, &
3002 "Soft part of the spin density (G-space):", rho_soft, &
3003 "Hard part of the spin density (G-space):", rho_hard, &
3004 "Total spin density (G-space) :", rho_total, &
3005 "Total spin density (R-space) :", rho_total_rspace
3007 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
3008 particles=particles, zeff=zcharge, &
3009 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3010 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3011 e_density_section%absolute_section_key, mpi_io=mpi_io)
3013 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
3014 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3016 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
3017 IF (dft_control%nspins > 1)
THEN
3021 auxbas_pw_pool=auxbas_pw_pool, &
3023 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
3024 CALL pw_copy(rho_r(1), rho_elec_rspace)
3025 CALL pw_axpy(rho_r(2), rho_elec_rspace)
3026 filename =
"ELECTRON_DENSITY"
3028 unit_nr = e_density_section%print_key_unit_nr( &
3031 e_density_section%absolute_section_key, &
3032 extension=
".cube", &
3033 middle_name=trim(filename), &
3034 file_position=my_pos_cube, &
3035 log_filename=.false., &
3037 fout=mpi_filename, &
3038 openpmd_basename=
"dft-electron-density", &
3039 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3040 openpmd_unit_si=openpmd_unit_si_density, &
3041 sim_time=qs_env%sim_time)
3042 IF (output_unit > 0)
THEN
3043 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3044 INQUIRE (unit=unit_nr, name=filename)
3046 filename = mpi_filename
3048 CALL print_density_output_message(output_unit,
"The sum of alpha and beta density", &
3049 e_density_section, filename)
3051 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
3052 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3054 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3055 e_density_section%absolute_section_key, mpi_io=mpi_io)
3056 CALL pw_copy(rho_r(1), rho_elec_rspace)
3057 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3058 filename =
"SPIN_DENSITY"
3060 unit_nr = e_density_section%print_key_unit_nr( &
3063 e_density_section%absolute_section_key, &
3064 extension=
".cube", &
3065 middle_name=trim(filename), &
3066 file_position=my_pos_cube, &
3067 log_filename=.false., &
3069 fout=mpi_filename, &
3070 openpmd_basename=
"dft-spin-density", &
3071 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3072 openpmd_unit_si=openpmd_unit_si_density, &
3073 sim_time=qs_env%sim_time)
3074 IF (output_unit > 0)
THEN
3075 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3076 INQUIRE (unit=unit_nr, name=filename)
3078 filename = mpi_filename
3080 CALL print_density_output_message(output_unit,
"The spin density", &
3081 e_density_section, filename)
3083 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3084 particles=particles, zeff=zcharge, &
3085 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3086 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3087 e_density_section%absolute_section_key, mpi_io=mpi_io)
3088 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3090 filename =
"ELECTRON_DENSITY"
3092 unit_nr = e_density_section%print_key_unit_nr( &
3095 e_density_section%absolute_section_key, &
3096 extension=
".cube", &
3097 middle_name=trim(filename), &
3098 file_position=my_pos_cube, &
3099 log_filename=.false., &
3101 fout=mpi_filename, &
3102 openpmd_basename=
"dft-electron-density", &
3103 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3104 openpmd_unit_si=openpmd_unit_si_density, &
3105 sim_time=qs_env%sim_time)
3106 IF (output_unit > 0)
THEN
3107 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3108 INQUIRE (unit=unit_nr, name=filename)
3110 filename = mpi_filename
3112 CALL print_density_output_message(output_unit,
"The electron density", &
3113 e_density_section, filename)
3115 CALL e_density_section%write_pw(rho_r(1), unit_nr,
"ELECTRON DENSITY", &
3116 particles=particles, zeff=zcharge, &
3117 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3118 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3119 e_density_section%absolute_section_key, mpi_io=mpi_io)
3122 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
3123 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
3124 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
3125 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
3128 ALLOCATE (my_q0(natom))
3136 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
3140 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3144 DO ispin = 1, dft_control%nspins
3145 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
3149 rho_total_rspace = rho_soft + rho_hard
3151 filename =
"ELECTRON_DENSITY"
3153 unit_nr = e_density_section%print_key_unit_nr( &
3156 e_density_section%absolute_section_key, &
3157 extension=
".cube", &
3158 middle_name=trim(filename), &
3159 file_position=my_pos_cube, &
3160 log_filename=.false., &
3162 fout=mpi_filename, &
3163 openpmd_basename=
"dft-electron-density", &
3164 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3165 openpmd_unit_si=openpmd_unit_si_density, &
3166 sim_time=qs_env%sim_time)
3167 IF (output_unit > 0)
THEN
3168 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3169 INQUIRE (unit=unit_nr, name=filename)
3171 filename = mpi_filename
3173 CALL print_density_output_message(output_unit,
"The electron density", &
3174 e_density_section, filename)
3175 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3176 "Soft electronic charge (R-space) :", rho_soft, &
3177 "Hard electronic charge (R-space) :", rho_hard, &
3178 "Total electronic charge (R-space):", rho_total_rspace
3180 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
3181 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3183 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3184 e_density_section%absolute_section_key, mpi_io=mpi_io)
3187 IF (dft_control%nspins > 1)
THEN
3189 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
3192 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3195 CALL pw_axpy(rho_r(1), rho_elec_rspace)
3196 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3200 rho_total_rspace = rho_soft + rho_hard
3202 filename =
"SPIN_DENSITY"
3204 unit_nr = e_density_section%print_key_unit_nr( &
3207 e_density_section%absolute_section_key, &
3208 extension=
".cube", &
3209 middle_name=trim(filename), &
3210 file_position=my_pos_cube, &
3211 log_filename=.false., &
3213 fout=mpi_filename, &
3214 openpmd_basename=
"dft-spin-density", &
3215 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3216 openpmd_unit_si=openpmd_unit_si_density, &
3217 sim_time=qs_env%sim_time)
3218 IF (output_unit > 0)
THEN
3219 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3220 INQUIRE (unit=unit_nr, name=filename)
3222 filename = mpi_filename
3224 CALL print_density_output_message(output_unit,
"The spin density", &
3225 e_density_section, filename)
3226 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3227 "Soft part of the spin density :", rho_soft, &
3228 "Hard part of the spin density :", rho_hard, &
3229 "Total spin density (R-space) :", rho_total_rspace
3231 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3232 particles=particles, zeff=zcharge, &
3233 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3234 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3235 e_density_section%absolute_section_key, mpi_io=mpi_io)
3237 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3243 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
3249 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
3253 v_hartree_rspace=v_hartree_rspace)
3254 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3255 CALL auxbas_pw_pool%create_pw(aux_r)
3258 my_pos_cube =
"REWIND"
3259 IF (append_cube)
THEN
3260 my_pos_cube =
"APPEND"
3263 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3266 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
3267 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3269 CALL pw_copy(v_hartree_rspace, aux_r)
3272 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
3274 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%V_HARTREE_CUBE%MAX_FILE_SIZE_MB"), &
3277 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
3279 CALL auxbas_pw_pool%give_back_pw(aux_r)
3284 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
3285 IF (dft_control%apply_external_potential)
THEN
3286 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
3287 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3288 CALL auxbas_pw_pool%create_pw(aux_r)
3290 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
3291 my_pos_cube =
"REWIND"
3292 IF (append_cube)
THEN
3293 my_pos_cube =
"APPEND"
3298 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
3302 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
3303 stride=
section_get_ivals(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), &
3304 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%MAX_FILE_SIZE_MB"), &
3307 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
3309 CALL auxbas_pw_pool%give_back_pw(aux_r)
3315 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
3317 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3318 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3319 CALL auxbas_pw_pool%create_pw(aux_r)
3320 CALL auxbas_pw_pool%create_pw(aux_g)
3323 my_pos_cube =
"REWIND"
3324 IF (append_cube)
THEN
3325 my_pos_cube =
"APPEND"
3327 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
3328 v_hartree_rspace=v_hartree_rspace)
3330 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3334 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
3344 CALL cp_pw_to_cube(aux_r, unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
3346 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EFIELD_CUBE%MAX_FILE_SIZE_MB"), &
3349 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
3352 CALL auxbas_pw_pool%give_back_pw(aux_r)
3353 CALL auxbas_pw_pool%give_back_pw(aux_g)
3357 CALL qs_scf_post_local_energy(input, logger, qs_env)
3360 CALL qs_scf_post_local_stress(input, logger, qs_env)
3363 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
3380 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
3385 after = min(max(after, 1), 16)
3386 DO ispin = 1, dft_control%nspins
3387 DO img = 1, dft_control%nimages
3389 para_env, output_unit=iw, omit_headers=omit_headers)
3393 "DFT%PRINT%AO_MATRICES/DENSITY")
3398 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
3400 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
3402 IF (write_ks .OR. write_xc)
THEN
3403 IF (write_xc) qs_env%requires_matrix_vxc = .true.
3406 just_energy=.false.)
3407 IF (write_xc) qs_env%requires_matrix_vxc = .false.
3414 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
3416 after = min(max(after, 1), 16)
3417 DO ispin = 1, dft_control%nspins
3418 DO img = 1, dft_control%nimages
3420 para_env, output_unit=iw, omit_headers=omit_headers)
3424 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
3429 IF (.NOT. dft_control%qs_control%pao)
THEN
3437 CALL write_adjacency_matrix(qs_env, input)
3441 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
3442 cpassert(
ASSOCIATED(matrix_vxc))
3446 after = min(max(after, 1), 16)
3447 DO ispin = 1, dft_control%nspins
3448 DO img = 1, dft_control%nimages
3450 para_env, output_unit=iw, omit_headers=omit_headers)
3454 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
3459 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
3466 ALLOCATE (matrix_hr(img)%matrix)
3467 CALL dbcsr_create(matrix_hr(img)%matrix, template=matrix_s(1, 1)%matrix, &
3468 name=
"COMMUTATOR", matrix_type=dbcsr_type_antisymmetric)
3470 CALL dbcsr_set(matrix_hr(img)%matrix, 0._dp)
3473 CALL build_com_mom_nl(qs_kind_set, sab_orb, sap_ppnl, dft_control%qs_control%eps_ppnl, &
3474 particle_set, cell, matrix_rv=matrix_hr)
3477 CALL dbcsr_scale(matrix_hr(img)%matrix, alpha_scalar=-1._dp)
3480 IF (output_unit > 0)
THEN
3481 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum X =', checksum_hr(1)
3482 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Y =', checksum_hr(2)
3483 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Z =', checksum_hr(3)
3485 after = min(max(after, 1), 16)
3488 para_env, output_unit=iw, omit_headers=omit_headers)
3492 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
3498 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
3501 IF (print_it) print_level = 2
3503 IF (print_it) print_level = 3
3514 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3515 IF (rho_r_valid)
THEN
3516 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
3517 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
3525 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
3527 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
3535 should_print_voro = 1
3537 should_print_voro = 0
3540 should_print_bqb = 1
3542 should_print_bqb = 0
3544 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3549 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3550 IF (rho_r_valid)
THEN
3552 IF (dft_control%nspins > 1)
THEN
3556 auxbas_pw_pool=auxbas_pw_pool, &
3560 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
3561 CALL pw_copy(rho_r(1), mb_rho)
3562 CALL pw_axpy(rho_r(2), mb_rho)
3569 IF (should_print_voro /= 0)
THEN
3571 IF (voro_print_txt)
THEN
3573 my_pos_voro =
"REWIND"
3574 IF (append_voro)
THEN
3575 my_pos_voro =
"APPEND"
3577 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
3578 file_position=my_pos_voro, log_filename=.false.)
3586 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3587 unit_nr_voro, qs_env, mb_rho)
3589 IF (dft_control%nspins > 1)
THEN
3590 CALL auxbas_pw_pool%give_back_pw(mb_rho)
3594 IF (unit_nr_voro > 0)
THEN
3604 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
3612 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
3620 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
3622 IF (particle_set(1)%fragment_index /= 0) iao_env%do_fragments = .true.
3623 IF (iao_env%do_iao)
THEN
3633 extension=
".mao", log_filename=.false.)
3644 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
3648 DEALLOCATE (zcharge)
3650 CALL timestop(handle)
3660 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
3663 INTEGER,
INTENT(IN) :: unit_nr
3665 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
3666 radius_type, refc, shapef
3667 INTEGER,
DIMENSION(:),
POINTER :: atom_list
3668 LOGICAL :: do_radius, do_sc, paw_atom
3669 REAL(kind=
dp) :: zeff
3670 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
3671 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
3674 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
3680 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3684 NULLIFY (hirshfeld_env)
3688 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
3689 ALLOCATE (hirshfeld_env%charges(natom))
3698 IF (.NOT.
SIZE(radii) == nkind)
THEN
3699 CALL cp_abort(__location__, &
3700 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
3701 "match number of atomic kinds in the input coordinate file.")
3707 iterative=do_sc, ref_charge=refc, &
3708 radius_type=radius_type)
3710 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
3716 nspin =
SIZE(matrix_p, 1)
3717 ALLOCATE (charges(natom, nspin))
3722 atomic_kind => atomic_kind_set(ikind)
3724 DO iat = 1,
SIZE(atom_list)
3726 hirshfeld_env%charges(i) = zeff
3730 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
3733 hirshfeld_env%charges(iat) = sum(charges(iat, :))
3736 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
3740 IF (hirshfeld_env%iterative)
THEN
3747 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
3748 IF (dft_control%qs_control%gapw)
THEN
3750 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
3753 atomic_kind => particle_set(iat)%atomic_kind
3755 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
3757 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
3762 IF (unit_nr > 0)
THEN
3764 qs_kind_set, unit_nr)
3770 DEALLOCATE (charges)
3772 END SUBROUTINE hirshfeld_charges
3782 SUBROUTINE project_function_a(ca, a, cb, b, l)
3784 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3785 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
3786 INTEGER,
INTENT(IN) :: l
3789 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3790 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
3793 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
3797 v(:, 1) = matmul(tmat, cb)
3798 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3802 DEALLOCATE (smat, tmat, v, ipiv)
3804 END SUBROUTINE project_function_a
3814 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
3816 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3817 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
3819 INTEGER,
INTENT(IN) :: l
3821 INTEGER :: i, info, n, nr
3822 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3823 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
3824 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
3828 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3832 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3833 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3835 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3839 DEALLOCATE (smat, v, ipiv, afun)
3841 END SUBROUTINE project_function_b
3852 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3857 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3859 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3860 INTEGER :: handle, io_unit, natom, unit_nr
3861 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3862 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
3871 CALL timeset(routinen, handle)
3874 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3876 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3877 gapw = dft_control%qs_control%gapw
3878 gapw_xc = dft_control%qs_control%gapw_xc
3879 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3881 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3882 CALL auxbas_pw_pool%create_pw(eden)
3887 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3888 IF (append_cube)
THEN
3889 my_pos_cube =
"APPEND"
3891 my_pos_cube =
"REWIND"
3895 extension=
".cube", middle_name=
"local_energy", &
3896 file_position=my_pos_cube, mpi_io=mpi_io)
3897 CALL cp_pw_to_cube(eden, unit_nr,
"LOCAL ENERGY", particles=particles, zeff=zcharge, &
3899 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_ENERGY_CUBE%MAX_FILE_SIZE_MB"), &
3901 IF (io_unit > 0)
THEN
3902 INQUIRE (unit=unit_nr, name=filename)
3903 IF (gapw .OR. gapw_xc)
THEN
3904 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3905 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3907 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3908 "The local energy is written to the file: ", trim(adjustl(filename))
3912 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3914 CALL auxbas_pw_pool%give_back_pw(eden)
3915 DEALLOCATE (zcharge)
3917 CALL timestop(handle)
3919 END SUBROUTINE qs_scf_post_local_energy
3930 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3935 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3937 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3938 INTEGER :: handle, io_unit, natom, unit_nr
3939 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3940 REAL(kind=
dp) :: beta
3941 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
3950 CALL timeset(routinen, handle)
3953 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3954 CALL cp_warn(__location__, &
3955 "LOCAL_STRESS_CUBE uses the existing experimental local stress implementation")
3957 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3958 gapw = dft_control%qs_control%gapw
3959 gapw_xc = dft_control%qs_control%gapw_xc
3960 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3962 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3963 CALL auxbas_pw_pool%create_pw(stress)
3970 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3971 IF (append_cube)
THEN
3972 my_pos_cube =
"APPEND"
3974 my_pos_cube =
"REWIND"
3978 extension=
".cube", middle_name=
"local_stress", &
3979 file_position=my_pos_cube, mpi_io=mpi_io)
3980 CALL cp_pw_to_cube(stress, unit_nr,
"LOCAL STRESS", particles=particles, zeff=zcharge, &
3982 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_STRESS_CUBE%MAX_FILE_SIZE_MB"), &
3984 IF (io_unit > 0)
THEN
3985 INQUIRE (unit=unit_nr, name=filename)
3986 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3987 IF (gapw .OR. gapw_xc)
THEN
3988 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3989 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3991 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3992 "The local stress is written to the file: ", trim(adjustl(filename))
3996 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3998 CALL auxbas_pw_pool%give_back_pw(stress)
3999 DEALLOCATE (zcharge)
4002 CALL timestop(handle)
4004 END SUBROUTINE qs_scf_post_local_stress
4015 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
4020 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
4022 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
4023 INTEGER :: boundary_condition, handle, i, j, &
4024 n_cstr, n_tiles, unit_nr
4025 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
4026 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
4027 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
4037 CALL timeset(routinen, handle)
4039 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
4042 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
4044 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
4046 has_implicit_ps = .false.
4047 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
4052 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
4053 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
4055 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
4056 my_pos_cube =
"REWIND"
4057 IF (append_cube)
THEN
4058 my_pos_cube =
"APPEND"
4062 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
4064 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4065 CALL auxbas_pw_pool%create_pw(aux_r)
4067 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4068 SELECT CASE (boundary_condition)
4070 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
4072 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4073 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4074 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4075 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4076 poisson_env%implicit_env%dielectric%eps, aux_r)
4079 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, zeff=zcharge, &
4080 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
4081 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%MAX_FILE_SIZE_MB"), &
4084 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
4086 CALL auxbas_pw_pool%give_back_pw(aux_r)
4091 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
4093 has_dirichlet_bc = .false.
4094 IF (has_implicit_ps)
THEN
4095 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4097 has_dirichlet_bc = .true.
4101 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
4104 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
4105 my_pos_cube =
"REWIND"
4106 IF (append_cube)
THEN
4107 my_pos_cube =
"APPEND"
4111 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
4112 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
4114 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4115 CALL auxbas_pw_pool%create_pw(aux_r)
4117 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4118 SELECT CASE (boundary_condition)
4120 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
4122 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4123 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4124 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4125 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4126 poisson_env%implicit_env%cstr_charge, aux_r)
4129 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, zeff=zcharge, &
4130 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
4131 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%MAX_FILE_SIZE_MB"), &
4134 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
4136 CALL auxbas_pw_pool%give_back_pw(aux_r)
4141 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
4142 has_dirichlet_bc = .false.
4143 IF (has_implicit_ps)
THEN
4144 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4146 has_dirichlet_bc = .true.
4150 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
4152 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
4153 my_pos_cube =
"REWIND"
4154 IF (append_cube)
THEN
4155 my_pos_cube =
"APPEND"
4157 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
4159 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4160 CALL auxbas_pw_pool%create_pw(aux_r)
4163 IF (tile_cubes)
THEN
4165 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4167 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4169 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
4172 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4173 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
4176 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
4178 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, zeff=zcharge, &
4179 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4180 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4183 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4188 NULLIFY (dirichlet_tile)
4189 ALLOCATE (dirichlet_tile)
4190 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
4193 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4194 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
4197 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4199 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4201 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
4202 CALL pw_axpy(dirichlet_tile, aux_r)
4206 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, zeff=zcharge, &
4207 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4208 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4211 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4212 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
4213 DEALLOCATE (dirichlet_tile)
4216 CALL auxbas_pw_pool%give_back_pw(aux_r)
4219 CALL timestop(handle)
4221 END SUBROUTINE qs_scf_post_ps_implicit
4229 SUBROUTINE write_adjacency_matrix(qs_env, input)
4233 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
4235 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
4236 ind, jatom, jkind, k, natom, nkind, &
4237 output_unit, rowind, unit_nr
4238 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
4239 LOGICAL :: do_adjm_write, do_symmetric
4245 DIMENSION(:),
POINTER :: nl_iterator
4248 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
4251 CALL timeset(routinen, handle)
4253 NULLIFY (dft_section)
4262 IF (do_adjm_write)
THEN
4263 NULLIFY (qs_kind_set, nl_iterator)
4264 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
4266 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
4268 nkind =
SIZE(qs_kind_set)
4269 cpassert(
SIZE(nl) > 0)
4271 cpassert(do_symmetric)
4272 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
4276 adjm_size = ((natom + 1)*natom)/2
4277 ALLOCATE (interact_adjm(4*adjm_size))
4280 NULLIFY (nl_iterator)
4284 ikind=ikind, jkind=jkind, &
4285 iatom=iatom, jatom=jatom)
4287 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
4288 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
4289 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
4290 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
4293 IF (iatom <= jatom)
THEN
4300 ikind = ikind + jkind
4301 jkind = ikind - jkind
4302 ikind = ikind - jkind
4306 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
4309 interact_adjm((ind - 1)*4 + 1) = rowind
4310 interact_adjm((ind - 1)*4 + 2) = colind
4311 interact_adjm((ind - 1)*4 + 3) = ikind
4312 interact_adjm((ind - 1)*4 + 4) = jkind
4315 CALL para_env%sum(interact_adjm)
4318 extension=
".adjmat", file_form=
"FORMATTED", &
4319 file_status=
"REPLACE")
4320 IF (unit_nr > 0)
THEN
4321 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
4322 DO k = 1, 4*adjm_size, 4
4324 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
4325 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
4333 DEALLOCATE (basis_set_list_a, basis_set_list_b)
4336 CALL timestop(handle)
4338 END SUBROUTINE write_adjacency_matrix
4346 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
4350 LOGICAL :: use_virial
4360 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
4361 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
4362 rho_core=rho_core, virial=virial, &
4363 v_hartree_rspace=v_hartree_rspace)
4365 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
4367 IF (.NOT. use_virial)
THEN
4369 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
4370 poisson_env=poisson_env)
4371 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
4372 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
4376 v_hartree_gspace, rho_core=rho_core)
4378 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
4379 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
4381 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
4382 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
4385 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.
Writer for CASINO gwfn.data files.
subroutine, public write_casino(qs_env, casino_section)
Write a CASINO gwfn.data file from the converged GPW/GAPW wavefunction.
Handles all functions related to the CELL.
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, cell, matrix_rv, matrix_rxrv, matrix_rrv, matrix_rvr, matrix_rrv_vrr, matrix_r_rxvr, matrix_rxvr_r, matrix_r_doublecom, pseudoatom, ref_point)
Calculate [r,Vnl] (matrix_rv), r x [r,Vnl] (matrix_rxrv) or [rr,Vnl] (matrix_rrv) in AO basis....
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_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm, plan, check_plan)
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, cartesian_basis)
...
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, 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...
character(len=default_string_length) function, public cp_iter_string(iter_info, print_key, for_file)
returns the iteration string, a string that is useful to create unique filenames (once you trim it)
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...
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, file_access)
...
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)
...
set of type/routines to handle the storage of results in force_envs
set of type/routines to handle the storage of results in force_envs
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)
...
GAPW reciprocal-space reconstruction and its discrete adjoint.
subroutine, public calculate_rhotot_elec_gspace(qs_env, auxbas_pw_pool, rhotot_elec_gspace, q_max, rho_hard, rho_soft, fsign, compute_tau, rho_source, allow_nonorthorhombic)
The total electronic density in reciprocal space (g-space) is calculated.
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 ...
Routines for the calculation of moments from Wannier functions.
subroutine, public calculate_kg_moments(qs_env, unit_nr, max_moment, magnetic, vel_reprs, com_nl, unit_str)
Calculates multipole moments per molecule from the Kim-Gordon AO density matrix.
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}...
subroutine, public run_nlo(qs_env)
Calculate frequency-dependent χ^(2) to χ^(5) after the ground-state SCF.
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
real(kind=dp), parameter, public debye
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)
...
container for information about total charges on the grids
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 the energies concerning the core charge distribution.
Utilities for broadened DOS and PDOS output.
subroutine, public get_dos_pdos_flags(dos_section, do_dos_output, do_projected_dos, do_pdos, do_curve)
Resolve projected-DOS requests from a DOS print section.
Calculation and writing of density of states.
subroutine, public calculate_dos_kp(qs_env, dft_section, write_curve_output)
Compute and write density of states (kpoints).
subroutine, public calculate_dos(mos, dft_section, unoccupied_evals, smearing_enabled, write_curve_output)
Compute and write density of states.
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, matrix_vhxc, 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)
...
Fractional occupation number weighted density (Grimme and Hansen).
subroutine, public qs_scf_post_fod(input, logger, qs_env, output_unit)
Print the orbital FOD sum and, optionally, its real-space density.
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, hund_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, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, 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...
Finite-volume Kubo-Greenwood transport from converged Quickstep matrices.
subroutine, public qs_scf_post_kubo_transport(qs_env)
Compute and print the finite-volume Kubo-Greenwood conductivity tensor.
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, cmo_coeff)
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_kpoints(qs_env, nmoments, reference, ref_point, max_nmo, unit_number, do_soc, unit_str, dip_file, bc_file)
Calculate and print dipole moment elements d_nm(k) = i<u_n|∇_k|u_m> for k-point calculations.
subroutine, public qs_moment_berry_phase(qs_env, magnetic, nmoments, reference, ref_point, unit_number, unit_str)
...
subroutine, public qs_moment_locop(qs_env, magnetic, nmoments, reference, ref_point, unit_number, vel_reprs, com_nl, unit_str)
...
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)
...
subroutine, public build_lin_mom_matrix(qs_env, matrix, minimum_image)
Calculation of the linear momentum matrix <mu|∂|nu> over Cartesian Gaussian functions.
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_kp(qs_env, dft_section, pdos_print_key, write_pdos, write_pdos_curve)
Compute and write broadened projected density of states for k-point calculations.
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, unoccupied_orbs, unoccupied_evals, pdos_print_key, write_pdos, write_pdos_curve)
Compute and write projected density of states.
Finite or periodic quadratic pseudospectrum analysis after SCF.
subroutine, public qs_scf_post_quadratic(qs_env)
Evaluate scans of quadratic gaps and localized joint approximate eigenstates.
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 get_effective_core_charges(qs_env, zcharge)
Collects the effective core charge for every atom in a QS environment.
subroutine, public make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
Gets the LUMOs and their eigenvalues for all spin channels.
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.
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
Post-SCF finite-system spectral localizers and analytic AO position export.
subroutine, public qs_scf_post_localizer(qs_env)
Export finite AO positions and optionally evaluate localizers after SCF.
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_kp(mosin, kpoints, matrix_s, s_square, s_square_ideal)
Compute the expectation value <(\cal S)^2> of the single determinant defined by the spin up (alpha) a...
subroutine, public compute_s_square(mos, matrix_s, s_square, s_square_ideal)
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...
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...
contains arbitrary information which need to be stored
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 ...
Container for information about total charges on the grids.
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.