223#include "./base/base_uses.f90"
229 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
236 CHARACTER(len=*),
PARAMETER :: &
237 str_mo_cubes =
"PRINT%MO_CUBES", &
238 str_mo_openpmd =
"PRINT%MO_OPENPMD", &
239 str_elf_cubes =
"PRINT%ELF_CUBE", &
240 str_elf_openpmd =
"PRINT%ELF_OPENPMD", &
241 str_e_density_cubes =
"PRINT%E_DENSITY_CUBE", &
242 str_e_density_openpmd =
"PRINT%E_DENSITY_OPENPMD"
244 INTEGER,
PARAMETER :: grid_output_cubes = 1, grid_output_openpmd = 2
246 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_density = &
247 [-3, 0, 0, 0, 0, 0, 0]
248 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_dimensionless = &
249 [0, 0, 0, 0, 0, 0, 0]
250 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_wavefunction = &
251 [-1.5_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp]
252 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_density =
a_bohr**(-3)
253 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_dimensionless = 1.0_dp
254 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_wavefunction =
a_bohr**(-1.5_dp)
260 CHARACTER(len=default_string_length) :: relative_section_key =
""
261 CHARACTER(len=default_string_length) :: absolute_section_key =
""
262 CHARACTER(len=7) :: format_name =
""
263 INTEGER :: grid_output = -1
264 LOGICAL :: do_output = .false.
267 PROCEDURE,
PUBLIC :: print_key_unit_nr => cp_forward_print_key_unit_nr
269 PROCEDURE,
PUBLIC :: write_pw => cp_forward_write_pw
271 PROCEDURE,
PUBLIC :: print_key_finished_output => cp_forward_print_key_finished_output
273 PROCEDURE,
PUBLIC :: do_openpmd => cp_section_key_do_openpmd
274 PROCEDURE,
PUBLIC :: do_cubes => cp_section_key_do_cubes
275 PROCEDURE,
PUBLIC :: concat_to_relative => cp_section_key_concat_to_relative
276 PROCEDURE,
PUBLIC :: concat_to_absolute => cp_section_key_concat_to_absolute
277 END TYPE cp_section_key
288 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:), &
289 INTENT(OUT) :: zcharge
291 INTEGER :: iat, iatom, ikind, nat, natom, nkind
292 REAL(KIND=
dp) :: zeff
294 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
296 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
297 nkind=nkind, natom=natom)
298 ALLOCATE (zcharge(natom))
303 iat = atomic_kind_set(ikind)%atom_list(iatom)
315 FUNCTION cp_section_key_concat_to_absolute(self, extend_by)
RESULT(res)
316 CLASS(cp_section_key),
INTENT(IN) :: self
317 CHARACTER(*),
INTENT(IN) :: extend_by
318 CHARACTER(len=default_string_length) :: res
320 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
321 res = trim(self%absolute_section_key)//trim(extend_by)
323 res = trim(self%absolute_section_key)//
"%"//trim(extend_by)
325 END FUNCTION cp_section_key_concat_to_absolute
333 FUNCTION cp_section_key_concat_to_relative(self, extend_by)
RESULT(res)
334 CLASS(cp_section_key),
INTENT(IN) :: self
335 CHARACTER(*),
INTENT(IN) :: extend_by
336 CHARACTER(len=default_string_length) :: res
338 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
339 res = trim(self%relative_section_key)//trim(extend_by)
341 res = trim(self%relative_section_key)//
"%"//trim(extend_by)
343 END FUNCTION cp_section_key_concat_to_relative
350 FUNCTION cp_section_key_do_cubes(self)
RESULT(res)
351 CLASS(cp_section_key) :: self
354 res = self%do_output .AND. self%grid_output == grid_output_cubes
355 END FUNCTION cp_section_key_do_cubes
362 FUNCTION cp_section_key_do_openpmd(self)
RESULT(res)
363 CLASS(cp_section_key) :: self
366 res = self%do_output .AND. self%grid_output == grid_output_openpmd
367 END FUNCTION cp_section_key_do_openpmd
397 FUNCTION cp_forward_print_key_unit_nr( &
406 ignore_should_output, &
417 openpmd_unit_dimension, &
419 sim_time)
RESULT(res)
421 CLASS(cp_section_key),
INTENT(IN) :: self
424 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
425 CHARACTER(len=*),
INTENT(IN) :: extension
426 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
427 LOGICAL,
INTENT(IN),
OPTIONAL :: local, log_filename, ignore_should_output
428 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: file_form, file_position, file_action, &
430 LOGICAL,
INTENT(IN),
OPTIONAL :: do_backup, on_file
431 LOGICAL,
INTENT(OUT),
OPTIONAL :: is_new_file
432 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
433 CHARACTER(len=default_path_length),
INTENT(OUT), &
435 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
436 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
437 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
438 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
441 IF (self%grid_output == grid_output_cubes)
THEN
443 logger, basis_section, print_key_path, extension=extension, &
444 middle_name=middle_name, local=local, log_filename=log_filename, &
445 ignore_should_output=ignore_should_output, file_form=file_form, &
446 file_position=file_position, file_action=file_action, &
447 file_status=file_status, do_backup=do_backup, on_file=on_file, &
448 is_new_file=is_new_file, mpi_io=mpi_io, fout=fout)
454 middle_name=middle_name, &
455 ignore_should_output=ignore_should_output, &
458 openpmd_basename=openpmd_basename, &
459 openpmd_unit_dimension=openpmd_unit_dimension, &
460 openpmd_unit_si=openpmd_unit_si, &
463 END FUNCTION cp_forward_print_key_unit_nr
481 SUBROUTINE cp_forward_write_pw( &
494 CLASS(cp_section_key),
INTENT(IN) :: self
496 INTEGER,
INTENT(IN) :: unit_nr
497 CHARACTER(*),
INTENT(IN),
OPTIONAL :: title
499 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: stride
500 REAL(KIND=
dp),
INTENT(IN),
OPTIONAL :: max_file_size_mb
501 LOGICAL,
INTENT(IN),
OPTIONAL :: zero_tails, silent, mpi_io
502 REAL(KIND=
dp),
DIMENSION(:),
OPTIONAL :: zeff
504 IF (self%grid_output == grid_output_cubes)
THEN
505 CALL cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
507 CALL cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
509 END SUBROUTINE cp_forward_write_pw
525 SUBROUTINE cp_forward_print_key_finished_output(self, unit_nr, logger, basis_section, &
526 print_key_path, local, ignore_should_output, on_file, &
528 CLASS(cp_section_key),
INTENT(IN) :: self
529 INTEGER,
INTENT(INOUT) :: unit_nr
532 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
533 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, on_file, &
536 IF (self%grid_output == grid_output_cubes)
THEN
541 END SUBROUTINE cp_forward_print_key_finished_output
561 FUNCTION cube_or_openpmd(input, str_cubes, str_openpmd, logger)
RESULT(res)
563 CHARACTER(len=*),
INTENT(IN) :: str_cubes, str_openpmd
565 TYPE(cp_section_key) :: res
567 LOGICAL :: do_cubes, do_openpmd
570 logger%iter_info, input, &
571 "DFT%"//trim(adjustl(str_cubes))),
cp_p_file)
573 logger%iter_info, input, &
574 "DFT%"//trim(adjustl(str_openpmd))),
cp_p_file)
578 cpassert(.NOT. (do_cubes .AND. do_openpmd))
579 res%do_output = do_cubes .OR. do_openpmd
581 res%grid_output = grid_output_openpmd
582 res%relative_section_key = trim(adjustl(str_openpmd))
583 res%format_name =
"openPMD"
585 res%grid_output = grid_output_cubes
586 res%relative_section_key = trim(adjustl(str_cubes))
587 res%format_name =
"Cube"
589 res%absolute_section_key =
"DFT%"//trim(adjustl(res%relative_section_key))
590 END FUNCTION cube_or_openpmd
598 FUNCTION section_key_do_write(grid_output)
RESULT(res)
599 INTEGER,
INTENT(IN) :: grid_output
600 CHARACTER(len=32) :: res
602 IF (grid_output == grid_output_cubes)
THEN
604 ELSE IF (grid_output == grid_output_openpmd)
THEN
605 res =
"%WRITE_OPENPMD"
607 END FUNCTION section_key_do_write
616 SUBROUTINE print_density_output_message(output_unit, prefix, e_density_section, filename)
617 INTEGER,
INTENT(IN) :: output_unit
618 CHARACTER(len=*),
INTENT(IN) :: prefix
619 TYPE(cp_section_key),
INTENT(IN) :: e_density_section
620 CHARACTER(len=*),
INTENT(IN) :: filename
622 IF (e_density_section%grid_output == grid_output_openpmd)
THEN
623 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
624 trim(prefix)//
" is written in " &
625 //e_density_section%format_name &
626 //
" file format to the file / file pattern:", &
629 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
630 trim(prefix)//
" is written in " &
631 //e_density_section%format_name &
632 //
" file format to the file:", &
635 END SUBROUTINE print_density_output_message
658 CHARACTER(6),
OPTIONAL :: wf_type
659 LOGICAL,
OPTIONAL :: do_mp2
661 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw', &
662 warning_cube_kpoint =
"Print MO cubes not implemented for k-point calculations", &
663 warning_openpmd_kpoint =
"Writing to openPMD not implemented for k-point calculations"
665 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
666 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
667 nlumos, nmo, nspins, output_unit, &
669 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
670 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_stm, &
671 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
672 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
674 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
675 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
678 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
679 unoccupied_evals, unoccupied_evals_stm
680 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
681 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
682 TARGET :: homo_localized, lumo_localized, &
684 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
685 unoccupied_orbs, unoccupied_orbs_stm
688 TYPE(cp_section_key) :: mo_section
689 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
691 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
703 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
712 localize_section, print_key, &
715 CALL timeset(routinen, handle)
722 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
723 IF (
PRESENT(wf_type))
THEN
724 IF (output_unit > 0)
THEN
725 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
726 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
727 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
734 my_localized_wfn = .false.
735 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
736 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
737 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
738 unoccupied_evals_stm, molecule_set, mo_derivs, &
739 subsys, particles, input, print_key, kinetic_m, marked_states, &
740 mixed_evals, qs_loc_env_mixed)
741 NULLIFY (lumo_ptr, rho_ao)
748 p_loc_mixed = .false.
750 cpassert(
ASSOCIATED(scf_env))
751 cpassert(
ASSOCIATED(qs_env))
754 dft_control=dft_control, &
755 molecule_set=molecule_set, &
756 scf_control=scf_control, &
757 do_kpoints=do_kpoints, &
762 particle_set=particle_set, &
763 atomic_kind_set=atomic_kind_set, &
764 qs_kind_set=qs_kind_set)
765 rtp_control => dft_control%rtp_control
772 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
773 DO ispin = 1, dft_control%nspins
774 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
779 CALL update_hartree_with_mp2(rho, qs_env)
782 CALL write_available_results(qs_env, scf_env)
786 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
788 cpassert(
ASSOCIATED(kinetic_m))
789 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
793 IF (unit_nr > 0)
THEN
794 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
797 "DFT%PRINT%KINETIC_ENERGY")
801 CALL qs_scf_post_charges(input, logger, qs_env)
814 IF (loc_print_explicit)
THEN
836 IF (loc_explicit)
THEN
846 p_loc_mixed = .false.
850 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
851 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
852 "therefore localization of unoccupied states will be skipped!")
863 mo_section = cube_or_openpmd(input, str_mo_cubes, str_mo_openpmd, logger)
865 IF (loc_print_explicit)
THEN
869 do_wannier_cubes = .false.
871 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
872 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
875 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
876 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
878 CALL auxbas_pw_pool%create_pw(wf_r)
879 CALL auxbas_pw_pool%create_pw(wf_g)
882 IF (dft_control%restricted)
THEN
886 nspins = dft_control%nspins
889 IF (dft_control%restricted .AND. (mo_section%do_output .OR. p_loc_homo))
THEN
890 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
895 cpwarn_if(mo_section%do_cubes(), warning_cube_kpoint)
896 cpwarn_if(mo_section%do_openpmd(), warning_openpmd_kpoint)
901 IF ((mo_section%do_output .AND. nhomo /= 0) .OR. do_stm)
THEN
903 IF (dft_control%do_admm)
THEN
905 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
907 IF (dft_control%hairy_probes)
THEN
908 scf_control%smear%do_smear = .false.
909 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
911 probe=dft_control%probe)
913 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
916 DO ispin = 1, dft_control%nspins
917 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
918 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
922 IF (mo_section%do_output .AND. nhomo /= 0)
THEN
925 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
926 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
927 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
928 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
939 cpwarn(
"Localization not implemented for k-point calculations!")
940 ELSE IF (dft_control%restricted &
943 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
945 ALLOCATE (occupied_orbs(dft_control%nspins))
946 ALLOCATE (occupied_evals(dft_control%nspins))
947 ALLOCATE (homo_localized(dft_control%nspins))
948 DO ispin = 1, dft_control%nspins
949 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
950 eigenvalues=mo_eigenvalues)
951 occupied_orbs(ispin) = mo_coeff
952 occupied_evals(ispin)%array => mo_eigenvalues
953 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
954 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
957 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
960 ALLOCATE (qs_loc_env_homo)
963 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
964 mo_section%do_output, mo_loc_history=mo_loc_history)
966 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
969 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
971 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
976 homo_localized, do_homo)
978 DEALLOCATE (occupied_orbs)
979 DEALLOCATE (occupied_evals)
981 IF (qs_loc_env_homo%do_localize)
THEN
982 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
989 IF (mo_section%do_output .OR. p_loc_lumo)
THEN
991 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
994 compute_lumos = mo_section%do_output .AND. nlumo /= 0
995 compute_lumos = compute_lumos .OR. p_loc_lumo
997 DO ispin = 1, dft_control%nspins
998 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
999 compute_lumos = compute_lumos .AND. homo == nmo
1002 IF (mo_section%do_output .AND. .NOT. compute_lumos)
THEN
1004 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
1005 DO ispin = 1, dft_control%nspins
1007 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
1008 IF (nlumo > nmo - homo)
THEN
1011 IF (nlumo == -1)
THEN
1014 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1015 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
1016 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
1017 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
1020 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1021 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1022 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1, mo_section=mo_section)
1028 IF (compute_lumos)
THEN
1029 check_write = .true.
1031 IF (nlumo == 0) check_write = .false.
1032 IF (p_loc_lumo)
THEN
1034 ALLOCATE (qs_loc_env_lumo)
1037 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
1040 ALLOCATE (unoccupied_orbs(dft_control%nspins))
1041 ALLOCATE (unoccupied_evals(dft_control%nspins))
1042 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
1043 lumo_ptr => unoccupied_orbs
1044 DO ispin = 1, dft_control%nspins
1046 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
1047 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
1048 IF (check_write)
THEN
1049 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
1051 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1052 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin, mo_section=mo_section)
1056 IF (p_loc_lumo)
THEN
1057 ALLOCATE (lumo_localized(dft_control%nspins))
1058 DO ispin = 1, dft_control%nspins
1059 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
1060 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
1062 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, mo_section%do_output, &
1063 evals=unoccupied_evals)
1064 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
1065 loc_coeff=unoccupied_orbs)
1067 lumo_localized, wf_r, wf_g, particles, &
1068 unoccupied_orbs, unoccupied_evals, marked_states)
1069 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
1070 evals=unoccupied_evals)
1071 lumo_ptr => lumo_localized
1075 IF (has_homo .AND. has_lumo)
THEN
1076 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1077 DO ispin = 1, dft_control%nspins
1078 IF (.NOT. scf_control%smear%do_smear)
THEN
1079 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
1080 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
1081 "HOMO - LUMO gap [eV] :", gap*
evolt
1087 IF (p_loc_mixed)
THEN
1088 IF (do_kpoints)
THEN
1089 cpwarn(
"Localization not implemented for k-point calculations!")
1090 ELSE IF (dft_control%restricted)
THEN
1091 IF (output_unit > 0)
WRITE (output_unit, *) &
1092 " Unclear how we define MOs / localization in the restricted case... skipping"
1095 ALLOCATE (mixed_orbs(dft_control%nspins))
1096 ALLOCATE (mixed_evals(dft_control%nspins))
1097 ALLOCATE (mixed_localized(dft_control%nspins))
1098 DO ispin = 1, dft_control%nspins
1099 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1100 eigenvalues=mo_eigenvalues)
1101 mixed_orbs(ispin) = mo_coeff
1102 mixed_evals(ispin)%array => mo_eigenvalues
1103 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
1104 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
1107 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
1110 total_zeff_corr = scf_env%sum_zeff_corr
1111 ALLOCATE (qs_loc_env_mixed)
1114 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
1115 mo_section%do_output, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
1118 DO ispin = 1, dft_control%nspins
1119 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
1123 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
1126 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
1128 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
1135 DEALLOCATE (mixed_orbs)
1136 DEALLOCATE (mixed_evals)
1141 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
1142 CALL auxbas_pw_pool%give_back_pw(wf_r)
1143 CALL auxbas_pw_pool%give_back_pw(wf_g)
1147 IF (.NOT. do_kpoints)
THEN
1148 IF (p_loc_homo)
THEN
1150 DEALLOCATE (qs_loc_env_homo)
1152 IF (p_loc_lumo)
THEN
1154 DEALLOCATE (qs_loc_env_lumo)
1156 IF (p_loc_mixed)
THEN
1158 DEALLOCATE (qs_loc_env_mixed)
1163 IF (do_kpoints)
THEN
1166 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
1167 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
1168 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
1169 matrix_s=matrix_s, marked_states=marked_states)
1173 IF (
ASSOCIATED(marked_states))
THEN
1174 DEALLOCATE (marked_states)
1178 IF (.NOT. do_kpoints)
THEN
1179 IF (compute_lumos)
THEN
1180 DO ispin = 1, dft_control%nspins
1181 DEALLOCATE (unoccupied_evals(ispin)%array)
1184 DEALLOCATE (unoccupied_evals)
1185 DEALLOCATE (unoccupied_orbs)
1191 IF (do_kpoints)
THEN
1192 cpwarn(
"STM not implemented for k-point calculations!")
1194 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
1195 IF (nlumo_stm > 0)
THEN
1196 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
1197 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
1198 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
1202 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
1203 unoccupied_evals_stm)
1205 IF (nlumo_stm > 0)
THEN
1206 DO ispin = 1, dft_control%nspins
1207 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
1209 DEALLOCATE (unoccupied_evals_stm)
1216 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1219 CALL qs_scf_post_efg(input, logger, qs_env)
1222 CALL qs_scf_post_et(input, qs_env, dft_control)
1225 CALL qs_scf_post_epr(input, logger, qs_env)
1228 CALL qs_scf_post_molopt(input, logger, qs_env)
1231 CALL qs_scf_post_elf(input, logger, qs_env)
1238 DO ispin = 1, dft_control%nspins
1239 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
1247 CALL timestop(handle)
1260 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
1264 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
1266 INTEGER,
INTENT(IN) :: nlumo
1267 INTEGER,
INTENT(OUT) :: nlumos
1269 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
1271 INTEGER :: handle, homo, ispin, n, nao, nmo, &
1278 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1285 CALL timeset(routinen, handle)
1287 NULLIFY (ks_rmpv, matrix_s, scf_control, dft_control, admm_env, para_env, blacs_env, mos)
1289 matrix_ks=ks_rmpv, &
1290 matrix_s=matrix_s, &
1291 scf_control=scf_control, &
1292 dft_control=dft_control, &
1293 admm_env=admm_env, &
1294 para_env=para_env, &
1295 blacs_env=blacs_env, &
1301 DO ispin = 1, dft_control%nspins
1302 NULLIFY (unoccupied_evals(ispin)%array)
1303 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1304 IF (output_unit > 0)
WRITE (output_unit, *) &
1305 " Using OT eigensolver for additional unoccupied orbitals spin ", ispin
1306 IF (output_unit > 0)
WRITE (output_unit, *) &
1307 " Lowest Eigenvalues of the unoccupied subspace spin ", ispin
1308 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
1309 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1311 nlumos = max(1, min(nlumo, nao - nmo))
1312 IF (nlumo == -1) nlumos = nao - nmo
1313 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1315 nrow_global=n, ncol_global=nlumos)
1316 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1321 NULLIFY (local_preconditioner)
1322 IF (
ASSOCIATED(scf_env))
THEN
1323 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1324 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1327 NULLIFY (local_preconditioner)
1333 IF (dft_control%do_admm)
THEN
1337 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1338 matrix_c_fm=unoccupied_orbs(ispin), &
1339 matrix_orthogonal_space_fm=mo_coeff, &
1340 eps_gradient=scf_control%eps_lumos, &
1342 iter_max=scf_control%max_iter_lumos, &
1343 size_ortho_space=nmo)
1346 unoccupied_evals(ispin)%array, scr=output_unit, &
1347 ionode=output_unit > 0)
1350 IF (dft_control%do_admm)
THEN
1356 CALL timestop(handle)
1366 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
1371 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
1373 INTEGER :: handle, print_level, unit_nr
1374 LOGICAL :: do_kpoints, print_it
1377 CALL timeset(routinen, handle)
1379 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
1387 log_filename=.false.)
1390 IF (print_it) print_level = 2
1392 IF (print_it) print_level = 3
1403 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
1404 log_filename=.false.)
1406 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
1410 CALL timestop(handle)
1412 END SUBROUTINE qs_scf_post_charges
1429 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1430 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
1439 INTEGER,
INTENT(IN) :: homo, ispin
1440 TYPE(cp_section_key) :: mo_section
1442 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1444 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1445 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1447 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1448 LOGICAL :: append_cube, mpi_io
1449 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
1454 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1456 CALL timeset(routinen, handle)
1461 cpassert(mo_section%grid_output /= grid_output_openpmd)
1464 NULLIFY (list_index)
1467 ,
cp_p_file) .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1469 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
1471 IF (mo_section%grid_output == grid_output_cubes)
THEN
1472 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1474 my_pos_cube =
"REWIND"
1475 IF (append_cube)
THEN
1476 my_pos_cube =
"APPEND"
1478 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), n_rep_val=n_rep)
1483 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), i_rep_val=ir, &
1485 IF (
ASSOCIATED(
list))
THEN
1487 DO i = 1,
SIZE(
list)
1488 list_index(i + nlist) =
list(i)
1490 nlist = nlist +
SIZE(
list)
1495 IF (nhomo == -1) nhomo = homo
1496 nlist = homo - max(1, homo - nhomo + 1) + 1
1497 ALLOCATE (list_index(nlist))
1499 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1503 ivector = list_index(i)
1505 atomic_kind_set=atomic_kind_set, &
1506 qs_kind_set=qs_kind_set, &
1508 particle_set=particle_set, &
1511 cell, dft_control, particle_set, pw_env)
1512 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1515 unit_nr = mo_section%print_key_unit_nr( &
1518 mo_section%absolute_section_key, &
1519 extension=
".cube", &
1520 middle_name=trim(filename), &
1521 file_position=my_pos_cube, &
1522 log_filename=.false., &
1524 openpmd_basename=
"dft-mo", &
1525 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1526 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1527 sim_time=qs_env%sim_time)
1528 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1529 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1530 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1531 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1533 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1535 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1536 DEALLOCATE (zcharge)
1539 CALL timestop(handle)
1541 END SUBROUTINE qs_scf_post_occ_cubes
1560 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1561 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo, mo_section)
1567 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1571 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1572 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1573 TYPE(cp_section_key) :: mo_section
1575 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1577 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1578 INTEGER :: handle, ifirst, index_mo, ivector, &
1580 LOGICAL :: append_cube, mpi_io
1581 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
1586 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1588 CALL timeset(routinen, handle)
1593 cpassert(mo_section%grid_output /= grid_output_openpmd)
1597 .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1599 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1601 IF (mo_section%grid_output == grid_output_cubes)
THEN
1602 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1604 my_pos_cube =
"REWIND"
1605 IF (append_cube)
THEN
1606 my_pos_cube =
"APPEND"
1609 IF (
PRESENT(lumo)) ifirst = lumo
1610 DO ivector = ifirst, ifirst + nlumos - 1
1612 atomic_kind_set=atomic_kind_set, &
1613 qs_kind_set=qs_kind_set, &
1615 particle_set=particle_set, &
1618 qs_kind_set, cell, dft_control, particle_set, pw_env)
1620 IF (ifirst == 1)
THEN
1621 index_mo = homo + ivector
1625 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1628 unit_nr = mo_section%print_key_unit_nr( &
1631 mo_section%absolute_section_key, &
1632 extension=
".cube", &
1633 middle_name=trim(filename), &
1634 file_position=my_pos_cube, &
1635 log_filename=.false., &
1637 openpmd_basename=
"dft-mo", &
1638 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1639 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1640 sim_time=qs_env%sim_time)
1641 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1642 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1643 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1644 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1646 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1649 DEALLOCATE (zcharge)
1652 CALL timestop(handle)
1654 END SUBROUTINE qs_scf_post_unocc_cubes
1667 INTEGER,
INTENT(IN) :: output_unit
1669 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1671 CHARACTER(LEN=default_path_length) :: filename
1672 INTEGER :: handle, max_nmo, maxmom, moments_format, &
1673 moments_unit_nr, reference, unit_nr
1674 LOGICAL :: com_nl, do_kg, do_kpoints, magnetic, &
1675 new_file, periodic, second_ref_point, &
1677 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1680 CALL timeset(routinen, handle)
1683 subsection_name=
"DFT%PRINT%MOMENTS")
1688 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1690 keyword_name=
"DFT%PRINT%MOMENTS%FORMAT")
1692 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1694 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1696 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1698 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1700 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1702 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1704 keyword_name=
"DFT%PRINT%MOMENTS%KG")
1706 keyword_name=
"DFT%PRINT%MOMENTS%MAX_NMO")
1711 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1712 middle_name=
"moments", log_filename=.false., &
1713 is_new_file=new_file)
1715 IF (output_unit > 0)
THEN
1716 IF (unit_nr /= output_unit)
THEN
1717 INQUIRE (unit=unit_nr, name=filename)
1718 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1719 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1722 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1726 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1729 IF (do_kpoints)
THEN
1730 cpabort(
"MOMENTS FORMAT TRAJECTORY is not available for k-point calculations.")
1732 IF (maxmom /= 1) cpabort(
"MOMENTS FORMAT TRAJECTORY requires MAX_MOMENT 1.")
1733 IF (magnetic) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support MAGNETIC moments.")
1734 IF (vel_reprs) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support VEL_REPRS.")
1735 IF (do_kg) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support KG moments.")
1736 moments_unit_nr = -1
1738 moments_unit_nr = unit_nr
1741 IF (do_kpoints)
THEN
1742 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr)
1747 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, moments_unit_nr, vel_reprs, com_nl)
1754 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS|")
1758 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1760 IF (second_ref_point)
THEN
1762 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1767 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1768 middle_name=
"moments_refpoint_2", log_filename=.false., &
1769 is_new_file=new_file)
1771 IF (output_unit > 0)
THEN
1772 IF (unit_nr /= output_unit)
THEN
1773 INQUIRE (unit=unit_nr, name=filename)
1774 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1775 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1778 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1782 IF (do_kpoints)
THEN
1783 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr)
1788 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, &
1789 moments_unit_nr, vel_reprs, com_nl)
1793 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS_REF2|")
1796 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1801 CALL timestop(handle)
1814 SUBROUTINE write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file, label)
1815 INTEGER,
INTENT(IN) :: unit_nr
1818 LOGICAL,
INTENT(IN) :: periodic, new_file
1819 CHARACTER(LEN=*),
INTENT(IN) :: label
1821 CHARACTER(LEN=default_string_length) :: description, iter
1822 REAL(kind=
dp),
DIMENSION(3) :: dipole
1826 IF (unit_nr <= 0)
RETURN
1828 NULLIFY (cell, results)
1829 CALL get_qs_env(qs_env, cell=cell, results=results)
1830 description =
"[DIPOLE]"
1831 CALL get_results(results=results, description=description, values=dipole)
1835 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1836 " iter_level dipole_x dipole_y dipole_z dipole_norm cell_xx cell_xy cell_xz"// &
1837 " cell_yx cell_yy cell_yz cell_zx cell_zy cell_zz [Debye]"
1839 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1840 " iter_level dipole_x dipole_y dipole_z dipole_norm [Debye]"
1846 WRITE (unit_nr,
"(1X,A,1X,A15,13(1X,ES18.10))") trim(label), iter(1:15), &
1850 WRITE (unit_nr,
"(1X,A,1X,A15,4(1X,ES18.10))") trim(label), iter(1:15), &
1854 END SUBROUTINE write_moments_trajectory
1864 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1869 INTEGER,
INTENT(IN) :: output_unit
1871 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1873 CHARACTER(LEN=default_path_length) :: filename
1874 INTEGER :: handle, unit_nr
1875 REAL(kind=
dp) :: q_max
1878 CALL timeset(routinen, handle)
1881 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1885 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1887 basis_section=input, &
1888 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1890 middle_name=
"xrd", &
1891 log_filename=.false.)
1892 IF (output_unit > 0)
THEN
1893 INQUIRE (unit=unit_nr, name=filename)
1894 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1895 "X-RAY DIFFRACTION SPECTRUM"
1896 IF (unit_nr /= output_unit)
THEN
1897 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1898 "The coherent X-ray diffraction spectrum is written to the file:", &
1903 unit_number=unit_nr, &
1907 basis_section=input, &
1908 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1911 CALL timestop(handle)
1913 END SUBROUTINE qs_scf_post_xray
1921 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1926 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1931 CALL timeset(routinen, handle)
1934 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1940 CALL timestop(handle)
1942 END SUBROUTINE qs_scf_post_efg
1950 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1955 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1957 INTEGER :: handle, ispin
1959 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1962 CALL timeset(routinen, handle)
1968 IF (qs_env%et_coupling%first_run)
THEN
1970 ALLOCATE (my_mos(dft_control%nspins))
1971 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1972 DO ispin = 1, dft_control%nspins
1974 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1975 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1984 CALL timestop(handle)
1986 END SUBROUTINE qs_scf_post_et
1997 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
2002 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
2004 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2006 INTEGER :: handle, ispin, output_unit, unit_nr
2007 LOGICAL :: append_cube, gapw, mpi_io
2008 REAL(
dp) :: rho_cutoff
2009 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2010 TYPE(cp_section_key) :: elf_section_key
2020 CALL timeset(routinen, handle)
2023 elf_section_key = cube_or_openpmd(input, str_elf_cubes, str_elf_openpmd, logger)
2026 IF (elf_section_key%do_output)
THEN
2028 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
2029 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
2032 gapw = dft_control%qs_control%gapw
2033 IF (.NOT. gapw)
THEN
2035 ALLOCATE (elf_r(dft_control%nspins))
2036 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2038 DO ispin = 1, dft_control%nspins
2039 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
2043 IF (output_unit > 0)
THEN
2044 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
2045 " ----- ELF is computed on the real space grid -----"
2054 IF (elf_section_key%grid_output == grid_output_cubes)
THEN
2057 my_pos_cube =
"REWIND"
2058 IF (append_cube)
THEN
2059 my_pos_cube =
"APPEND"
2062 DO ispin = 1, dft_control%nspins
2063 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
2064 WRITE (title, *)
"ELF spin ", ispin
2066 unit_nr = elf_section_key%print_key_unit_nr( &
2069 elf_section_key%absolute_section_key, &
2070 extension=
".cube", &
2071 middle_name=trim(filename), &
2072 file_position=my_pos_cube, &
2073 log_filename=.false., &
2075 fout=mpi_filename, &
2076 openpmd_basename=
"dft-elf", &
2077 openpmd_unit_dimension=openpmd_unit_dimension_dimensionless, &
2078 openpmd_unit_si=openpmd_unit_si_dimensionless, &
2079 sim_time=qs_env%sim_time)
2080 IF (output_unit > 0)
THEN
2081 IF (.NOT. mpi_io)
THEN
2082 INQUIRE (unit=unit_nr, name=filename)
2084 filename = mpi_filename
2086 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2087 "ELF is written in "//elf_section_key%format_name//
" file format to the file:", &
2091 CALL elf_section_key%write_pw(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
2093 CALL elf_section_key%print_key_finished_output( &
2097 elf_section_key%absolute_section_key, &
2100 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
2104 DEALLOCATE (elf_r, zcharge)
2108 cpwarn(
"ELF not implemented for GAPW calculations!")
2113 CALL timestop(handle)
2115 END SUBROUTINE qs_scf_post_elf
2127 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
2132 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
2134 INTEGER :: handle, nao, unit_nr
2135 REAL(kind=
dp) :: s_cond_number
2136 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
2145 CALL timeset(routinen, handle)
2148 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2152 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
2155 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
2157 nrow_global=nao, ncol_global=nao, &
2158 template_fmstruct=mo_coeff%matrix_struct)
2159 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
2161 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
2164 ALLOCATE (eigenvalues(nao))
2172 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
2175 extension=
".molopt")
2177 IF (unit_nr > 0)
THEN
2180 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
2181 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
2185 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2189 CALL timestop(handle)
2191 END SUBROUTINE qs_scf_post_molopt
2199 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
2204 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
2209 CALL timeset(routinen, handle)
2212 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
2218 CALL timestop(handle)
2220 END SUBROUTINE qs_scf_post_epr
2229 SUBROUTINE write_available_results(qs_env, scf_env)
2233 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
2237 CALL timeset(routinen, handle)
2245 CALL timestop(handle)
2247 END SUBROUTINE write_available_results
2260 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
2262 INTEGER :: handle, homo, ispin, nlumo_dos, &
2263 nlumo_molden, nlumo_required, nlumos, &
2265 LOGICAL :: all_equal, defer_molden, do_curve, &
2266 do_dos, do_kpoints, do_pdos, &
2267 do_projected_dos, explicit
2268 REAL(kind=
dp) :: maxocc, s_square, s_square_ideal, &
2269 total_abs_spin_dens, total_spin_dens
2270 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
2275 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
2278 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
2292 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2297 dos_section, input, sprint_section, &
2302 CALL timeset(routinen, handle)
2304 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
2305 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
2306 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
2307 molecule_set, input, particles, subsys, rho_r, unoccupied_orbs, &
2308 unoccupied_evals, casino_section, dos_section)
2313 cpassert(
ASSOCIATED(qs_env))
2315 dft_control=dft_control, &
2316 molecule_set=molecule_set, &
2317 atomic_kind_set=atomic_kind_set, &
2318 particle_set=particle_set, &
2319 qs_kind_set=qs_kind_set, &
2320 admm_env=admm_env, &
2321 scf_control=scf_control, &
2330 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
2334 IF (.NOT. qs_env%run_rtp)
THEN
2347 defer_molden = .false.
2348 IF (.NOT. do_kpoints)
THEN
2349 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
2353 IF (nlumo_molden /= 0 .AND.
PRESENT(scf_env))
THEN
2354 IF (scf_env%method ==
ot_method_nr) defer_molden = .true.
2356 IF (.NOT. defer_molden)
THEN
2357 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2358 qs_env=qs_env, calc_energies=.true.)
2367 cpwarn(
"Molden format output is not possible for k-point calculations.")
2371 cpwarn(
"Chargemol .wfx format output is not possible for k-point calculations.")
2378 IF (do_kpoints)
THEN
2382 cpwarn(
"MO_KP is only available for k-point calculations, ignored for Gamma-only")
2393 IF (.NOT. do_kpoints .AND.
PRESENT(scf_env))
THEN
2397 IF (nlumo_dos == -1)
THEN
2399 ELSE IF (nlumo_required /= -1)
THEN
2400 nlumo_required = max(nlumo_required, nlumo_dos)
2404 IF (defer_molden)
THEN
2405 IF (nlumo_molden == -1)
THEN
2407 ELSE IF (nlumo_required /= -1)
THEN
2408 nlumo_required = max(nlumo_required, nlumo_molden)
2411 IF (nlumo_required /= 0)
THEN
2412 ALLOCATE (unoccupied_orbs(dft_control%nspins))
2413 ALLOCATE (unoccupied_evals(dft_control%nspins))
2414 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, &
2415 nlumo_required, nlumos)
2418 IF (do_dos .OR. do_projected_dos)
THEN
2419 DO ispin = 1, dft_control%nspins
2422 IF (dft_control%do_admm)
THEN
2425 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
2426 eigenvalues=mo_eigenvalues)
2427 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
2428 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
2430 mo_coeff_deriv => null()
2433 do_rotation=.true., &
2434 co_rotate_dbcsr=mo_coeff_deriv)
2436 IF (dft_control%do_admm)
THEN
2444 IF (defer_molden)
THEN
2445 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2446 IF (output_unit > 0)
THEN
2447 WRITE (output_unit,
'(/,T2,A,I6,A)') &
2448 "MO_MOLDEN| Writing ", nlumos,
" unoccupied orbitals to molden file"
2450 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2451 unoccupied_orbs=unoccupied_orbs, &
2452 unoccupied_evals=unoccupied_evals, &
2453 qs_env=qs_env, calc_energies=.true.)
2459 IF (do_kpoints)
THEN
2461 IF (do_curve)
CALL calculate_dos_kp(qs_env, dft_section, write_curve_output=.true.)
2464 IF (
ASSOCIATED(unoccupied_evals))
THEN
2465 CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2466 smearing_enabled=dft_control%smear)
2467 IF (do_curve)
CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2468 smearing_enabled=dft_control%smear, write_curve_output=.true.)
2470 CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear)
2471 IF (do_curve)
CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear, &
2472 write_curve_output=.true.)
2478 IF (do_projected_dos)
THEN
2479 IF (do_kpoints)
THEN
2481 write_pdos=do_pdos, write_pdos_curve=do_curve)
2486 DO ispin = 1, dft_control%nspins
2487 IF (dft_control%nspins == 2)
THEN
2488 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2490 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2491 unoccupied_orbs=unoccupied_orbs(ispin), &
2492 unoccupied_evals=unoccupied_evals(ispin), &
2493 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2496 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2497 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2500 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2502 qs_kind_set, particle_set, qs_env, dft_section, &
2503 unoccupied_orbs=unoccupied_orbs(ispin), &
2504 unoccupied_evals=unoccupied_evals(ispin), &
2505 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2508 qs_kind_set, particle_set, qs_env, dft_section, &
2509 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2515 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2516 DO ispin = 1, dft_control%nspins
2517 DEALLOCATE (unoccupied_evals(ispin)%array)
2520 DEALLOCATE (unoccupied_evals)
2521 DEALLOCATE (unoccupied_orbs)
2526 IF (dft_control%nspins == 2)
THEN
2527 total_spin_dens = 0.0_dp
2528 total_abs_spin_dens = 0.0_dp
2529 IF (dft_control%qs_control%gapw)
THEN
2530 CALL get_qs_env(qs_env, qs_charges=qs_charges)
2531 total_spin_dens = qs_charges%total_rho_hard_spin - &
2532 qs_charges%total_rho_soft_spin
2533 total_abs_spin_dens = qs_charges%total_rho_hard_abs_spin - &
2534 qs_charges%total_rho_soft_abs_spin
2537 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2538 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2540 CALL auxbas_pw_pool%create_pw(wf_r)
2542 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
2544 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
2545 "Integrated spin density: ", total_spin_dens
2547 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
2548 "Integrated absolute spin density: ", total_abs_spin_dens
2549 CALL auxbas_pw_pool%give_back_pw(wf_r)
2555 IF (.NOT. do_kpoints)
THEN
2557 DO ispin = 1, dft_control%nspins
2559 occupation_numbers=occupation_numbers, &
2564 all_equal = all_equal .AND. &
2565 (all(occupation_numbers(1:homo) == maxocc) .AND. &
2566 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
2571 matrix_s=matrix_s, &
2574 s_square_ideal=s_square_ideal)
2575 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
2576 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
2577 energy%s_square = s_square
2582 CALL timestop(handle)
2594 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
2595 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
2597 CHARACTER(LEN=2) :: element_symbol
2598 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2600 CHARACTER(LEN=default_string_length) :: name, print_density
2601 INTEGER :: after, handle, i, iat, id, ikind, img, iso, ispin, iw, l, n_rep_hf, natom, nd(3), &
2602 ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, should_print_voro, &
2603 unit_nr, unit_nr_voro
2604 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
2605 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
2607 rho_total, rho_total_rspace, udvol, &
2609 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2610 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
2611 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
2612 REAL(kind=
dp),
DIMENSION(3) :: checksum_hr, dr
2613 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
2618 TYPE(cp_section_key) :: e_density_section
2620 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
2628 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
2635 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2643 print_key, print_key_bqb, &
2644 print_key_voro, xc_section
2646 CALL timeset(routinen, handle)
2647 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
2648 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
2649 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
2655 cpassert(
ASSOCIATED(qs_env))
2657 atomic_kind_set=atomic_kind_set, &
2658 qs_kind_set=qs_kind_set, &
2661 particle_set=particle_set, &
2663 para_env=para_env, &
2664 dft_control=dft_control, &
2666 do_kpoints=do_kpoints, &
2678 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
2679 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
2681 my_pos_cube =
"REWIND"
2682 IF (append_cube)
THEN
2683 my_pos_cube =
"APPEND"
2686 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
2687 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
2688 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2690 CALL auxbas_pw_pool%create_pw(wf_r)
2691 IF (dft_control%qs_control%gapw)
THEN
2692 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
2693 CALL pw_axpy(rho_core, rho0_s_gs)
2694 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2695 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2698 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
2699 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2700 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2703 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2704 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2707 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2708 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2714 DO ispin = 1, dft_control%nspins
2715 CALL pw_axpy(rho_r(ispin), wf_r)
2717 filename =
"TOTAL_DENSITY"
2720 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2721 log_filename=.false., mpi_io=mpi_io)
2723 particles=particles, zeff=zcharge, &
2725 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%TOT_DENSITY_CUBE%MAX_FILE_SIZE_MB"), &
2728 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2729 CALL auxbas_pw_pool%give_back_pw(wf_r)
2732 e_density_section = cube_or_openpmd(input, str_e_density_cubes, str_e_density_openpmd, logger)
2735 IF (e_density_section%do_output)
THEN
2737 keyword_name=e_density_section%concat_to_relative(
"%DENSITY_INCLUDE"), &
2738 c_val=print_density)
2739 print_density = trim(print_density)
2741 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2742 append_cube =
section_get_lval(input, e_density_section%concat_to_absolute(
"%APPEND"))
2744 my_pos_cube =
"REWIND"
2745 IF (append_cube)
THEN
2746 my_pos_cube =
"APPEND"
2750 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2751 xrd_interface =
section_get_lval(input, e_density_section%concat_to_absolute(
"%XRD_INTERFACE"))
2754 xrd_interface = .false.
2757 IF (xrd_interface)
THEN
2759 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2761 filename =
"ELECTRON_DENSITY"
2763 extension=
".xrd", middle_name=trim(filename), &
2764 file_position=my_pos_cube, log_filename=.false.)
2765 ngto =
section_get_ival(input, e_density_section%concat_to_absolute(
"%NGAUSS"))
2766 IF (output_unit > 0)
THEN
2767 INQUIRE (unit=unit_nr, name=filename)
2768 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2769 "The electron density (atomic part) is written to the file:", &
2774 nkind =
SIZE(atomic_kind_set)
2775 IF (unit_nr > 0)
THEN
2776 WRITE (unit_nr, *)
"Atomic (core) densities"
2777 WRITE (unit_nr, *)
"Unit cell"
2778 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2779 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2780 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2781 WRITE (unit_nr, *)
"Atomic types"
2782 WRITE (unit_nr, *) nkind
2785 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2787 atomic_kind => atomic_kind_set(ikind)
2788 qs_kind => qs_kind_set(ikind)
2789 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2791 iunit=output_unit, confine=.true.)
2793 iunit=output_unit, allelectron=.true., confine=.true.)
2794 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2795 ccdens(:, 2, ikind) = 0._dp
2796 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2797 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2798 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2799 IF (unit_nr > 0)
THEN
2800 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2801 WRITE (unit_nr, fmt=
"(I6)") ngto
2802 WRITE (unit_nr, *)
" Total density"
2803 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2804 WRITE (unit_nr, *)
" Core density"
2805 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2807 NULLIFY (atomic_kind)
2810 IF (dft_control%qs_control%gapw)
THEN
2811 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2813 IF (unit_nr > 0)
THEN
2814 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2816 np = particles%n_els
2818 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2819 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2820 rho_atom => rho_atom_set(iat)
2821 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2822 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2823 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2828 CALL para_env%sum(nr)
2829 CALL para_env%sum(niso)
2831 ALLOCATE (bfun(nr, niso))
2833 DO ispin = 1, dft_control%nspins
2834 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2835 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2838 CALL para_env%sum(bfun)
2839 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2840 ccdens(:, 2, ikind) = 0._dp
2841 IF (unit_nr > 0)
THEN
2842 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2846 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2847 IF (unit_nr > 0)
THEN
2848 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2849 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2855 IF (unit_nr > 0)
THEN
2856 WRITE (unit_nr, *)
"Coordinates"
2857 np = particles%n_els
2859 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2860 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2865 DEALLOCATE (ppdens, aedens, ccdens)
2868 e_density_section%absolute_section_key)
2871 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2873 cpassert(.NOT. do_kpoints)
2878 auxbas_pw_pool=auxbas_pw_pool, &
2880 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2882 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2887 q_max = sqrt(sum((
pi/dr(:))**2))
2889 auxbas_pw_pool=auxbas_pw_pool, &
2890 rhotot_elec_gspace=rho_elec_gspace, &
2892 rho_hard=rho_hard, &
2894 rho_total = rho_hard + rho_soft
2899 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2901 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2903 filename =
"TOTAL_ELECTRON_DENSITY"
2905 unit_nr = e_density_section%print_key_unit_nr( &
2908 e_density_section%absolute_section_key, &
2909 extension=
".cube", &
2910 middle_name=trim(filename), &
2911 file_position=my_pos_cube, &
2912 log_filename=.false., &
2914 fout=mpi_filename, &
2915 openpmd_basename=
"dft-total-electron-density", &
2916 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2917 openpmd_unit_si=openpmd_unit_si_density, &
2918 sim_time=qs_env%sim_time)
2919 IF (output_unit > 0)
THEN
2920 IF (.NOT. mpi_io)
THEN
2921 INQUIRE (unit=unit_nr, name=filename)
2923 filename = mpi_filename
2925 CALL print_density_output_message(output_unit,
"The total electron density", &
2926 e_density_section, filename)
2927 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2928 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2929 "Soft electronic charge (G-space) :", rho_soft, &
2930 "Hard electronic charge (G-space) :", rho_hard, &
2931 "Total electronic charge (G-space):", rho_total, &
2932 "Total electronic charge (R-space):", rho_total_rspace
2934 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2935 particles=particles, zeff=zcharge, &
2936 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2937 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2938 e_density_section%absolute_section_key, mpi_io=mpi_io)
2940 IF (dft_control%nspins > 1)
THEN
2944 auxbas_pw_pool=auxbas_pw_pool, &
2945 rhotot_elec_gspace=rho_elec_gspace, &
2947 rho_hard=rho_hard, &
2948 rho_soft=rho_soft, &
2950 rho_total = rho_hard + rho_soft
2954 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2956 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2958 filename =
"TOTAL_SPIN_DENSITY"
2960 unit_nr = e_density_section%print_key_unit_nr( &
2963 e_density_section%absolute_section_key, &
2964 extension=
".cube", &
2965 middle_name=trim(filename), &
2966 file_position=my_pos_cube, &
2967 log_filename=.false., &
2969 fout=mpi_filename, &
2970 openpmd_basename=
"dft-total-spin-density", &
2971 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2972 openpmd_unit_si=openpmd_unit_si_density, &
2973 sim_time=qs_env%sim_time)
2974 IF (output_unit > 0)
THEN
2975 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2976 INQUIRE (unit=unit_nr, name=filename)
2978 filename = mpi_filename
2980 CALL print_density_output_message(output_unit,
"The total spin density", &
2981 e_density_section, filename)
2982 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2983 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2984 "Soft part of the spin density (G-space):", rho_soft, &
2985 "Hard part of the spin density (G-space):", rho_hard, &
2986 "Total spin density (G-space) :", rho_total, &
2987 "Total spin density (R-space) :", rho_total_rspace
2989 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2990 particles=particles, zeff=zcharge, &
2991 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2992 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2993 e_density_section%absolute_section_key, mpi_io=mpi_io)
2995 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2996 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2998 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2999 IF (dft_control%nspins > 1)
THEN
3003 auxbas_pw_pool=auxbas_pw_pool, &
3005 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
3006 CALL pw_copy(rho_r(1), rho_elec_rspace)
3007 CALL pw_axpy(rho_r(2), rho_elec_rspace)
3008 filename =
"ELECTRON_DENSITY"
3010 unit_nr = e_density_section%print_key_unit_nr( &
3013 e_density_section%absolute_section_key, &
3014 extension=
".cube", &
3015 middle_name=trim(filename), &
3016 file_position=my_pos_cube, &
3017 log_filename=.false., &
3019 fout=mpi_filename, &
3020 openpmd_basename=
"dft-electron-density", &
3021 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3022 openpmd_unit_si=openpmd_unit_si_density, &
3023 sim_time=qs_env%sim_time)
3024 IF (output_unit > 0)
THEN
3025 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3026 INQUIRE (unit=unit_nr, name=filename)
3028 filename = mpi_filename
3030 CALL print_density_output_message(output_unit,
"The sum of alpha and beta density", &
3031 e_density_section, filename)
3033 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
3034 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3036 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3037 e_density_section%absolute_section_key, mpi_io=mpi_io)
3038 CALL pw_copy(rho_r(1), rho_elec_rspace)
3039 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3040 filename =
"SPIN_DENSITY"
3042 unit_nr = e_density_section%print_key_unit_nr( &
3045 e_density_section%absolute_section_key, &
3046 extension=
".cube", &
3047 middle_name=trim(filename), &
3048 file_position=my_pos_cube, &
3049 log_filename=.false., &
3051 fout=mpi_filename, &
3052 openpmd_basename=
"dft-spin-density", &
3053 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3054 openpmd_unit_si=openpmd_unit_si_density, &
3055 sim_time=qs_env%sim_time)
3056 IF (output_unit > 0)
THEN
3057 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3058 INQUIRE (unit=unit_nr, name=filename)
3060 filename = mpi_filename
3062 CALL print_density_output_message(output_unit,
"The spin density", &
3063 e_density_section, filename)
3065 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3066 particles=particles, zeff=zcharge, &
3067 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3068 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3069 e_density_section%absolute_section_key, mpi_io=mpi_io)
3070 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3072 filename =
"ELECTRON_DENSITY"
3074 unit_nr = e_density_section%print_key_unit_nr( &
3077 e_density_section%absolute_section_key, &
3078 extension=
".cube", &
3079 middle_name=trim(filename), &
3080 file_position=my_pos_cube, &
3081 log_filename=.false., &
3083 fout=mpi_filename, &
3084 openpmd_basename=
"dft-electron-density", &
3085 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3086 openpmd_unit_si=openpmd_unit_si_density, &
3087 sim_time=qs_env%sim_time)
3088 IF (output_unit > 0)
THEN
3089 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3090 INQUIRE (unit=unit_nr, name=filename)
3092 filename = mpi_filename
3094 CALL print_density_output_message(output_unit,
"The electron density", &
3095 e_density_section, filename)
3097 CALL e_density_section%write_pw(rho_r(1), unit_nr,
"ELECTRON DENSITY", &
3098 particles=particles, zeff=zcharge, &
3099 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3100 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3101 e_density_section%absolute_section_key, mpi_io=mpi_io)
3104 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
3105 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
3106 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
3107 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
3110 ALLOCATE (my_q0(natom))
3118 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
3122 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3126 DO ispin = 1, dft_control%nspins
3127 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
3131 rho_total_rspace = rho_soft + rho_hard
3133 filename =
"ELECTRON_DENSITY"
3135 unit_nr = e_density_section%print_key_unit_nr( &
3138 e_density_section%absolute_section_key, &
3139 extension=
".cube", &
3140 middle_name=trim(filename), &
3141 file_position=my_pos_cube, &
3142 log_filename=.false., &
3144 fout=mpi_filename, &
3145 openpmd_basename=
"dft-electron-density", &
3146 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3147 openpmd_unit_si=openpmd_unit_si_density, &
3148 sim_time=qs_env%sim_time)
3149 IF (output_unit > 0)
THEN
3150 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3151 INQUIRE (unit=unit_nr, name=filename)
3153 filename = mpi_filename
3155 CALL print_density_output_message(output_unit,
"The electron density", &
3156 e_density_section, filename)
3157 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3158 "Soft electronic charge (R-space) :", rho_soft, &
3159 "Hard electronic charge (R-space) :", rho_hard, &
3160 "Total electronic charge (R-space):", rho_total_rspace
3162 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
3163 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3165 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3166 e_density_section%absolute_section_key, mpi_io=mpi_io)
3169 IF (dft_control%nspins > 1)
THEN
3171 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
3174 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3177 CALL pw_axpy(rho_r(1), rho_elec_rspace)
3178 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3182 rho_total_rspace = rho_soft + rho_hard
3184 filename =
"SPIN_DENSITY"
3186 unit_nr = e_density_section%print_key_unit_nr( &
3189 e_density_section%absolute_section_key, &
3190 extension=
".cube", &
3191 middle_name=trim(filename), &
3192 file_position=my_pos_cube, &
3193 log_filename=.false., &
3195 fout=mpi_filename, &
3196 openpmd_basename=
"dft-spin-density", &
3197 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3198 openpmd_unit_si=openpmd_unit_si_density, &
3199 sim_time=qs_env%sim_time)
3200 IF (output_unit > 0)
THEN
3201 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3202 INQUIRE (unit=unit_nr, name=filename)
3204 filename = mpi_filename
3206 CALL print_density_output_message(output_unit,
"The spin density", &
3207 e_density_section, filename)
3208 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3209 "Soft part of the spin density :", rho_soft, &
3210 "Hard part of the spin density :", rho_hard, &
3211 "Total spin density (R-space) :", rho_total_rspace
3213 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3214 particles=particles, zeff=zcharge, &
3215 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3216 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3217 e_density_section%absolute_section_key, mpi_io=mpi_io)
3219 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3225 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
3231 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
3235 v_hartree_rspace=v_hartree_rspace)
3236 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3237 CALL auxbas_pw_pool%create_pw(aux_r)
3240 my_pos_cube =
"REWIND"
3241 IF (append_cube)
THEN
3242 my_pos_cube =
"APPEND"
3245 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3248 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
3249 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3251 CALL pw_copy(v_hartree_rspace, aux_r)
3254 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
3256 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%V_HARTREE_CUBE%MAX_FILE_SIZE_MB"), &
3259 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
3261 CALL auxbas_pw_pool%give_back_pw(aux_r)
3266 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
3267 IF (dft_control%apply_external_potential)
THEN
3268 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
3269 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3270 CALL auxbas_pw_pool%create_pw(aux_r)
3272 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
3273 my_pos_cube =
"REWIND"
3274 IF (append_cube)
THEN
3275 my_pos_cube =
"APPEND"
3280 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
3284 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
3285 stride=
section_get_ivals(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), &
3286 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%MAX_FILE_SIZE_MB"), &
3289 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
3291 CALL auxbas_pw_pool%give_back_pw(aux_r)
3297 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
3299 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3300 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3301 CALL auxbas_pw_pool%create_pw(aux_r)
3302 CALL auxbas_pw_pool%create_pw(aux_g)
3305 my_pos_cube =
"REWIND"
3306 IF (append_cube)
THEN
3307 my_pos_cube =
"APPEND"
3309 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
3310 v_hartree_rspace=v_hartree_rspace)
3312 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3316 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
3326 CALL cp_pw_to_cube(aux_r, unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
3328 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EFIELD_CUBE%MAX_FILE_SIZE_MB"), &
3331 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
3334 CALL auxbas_pw_pool%give_back_pw(aux_r)
3335 CALL auxbas_pw_pool%give_back_pw(aux_g)
3339 CALL qs_scf_post_local_energy(input, logger, qs_env)
3342 CALL qs_scf_post_local_stress(input, logger, qs_env)
3345 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
3356 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
3361 after = min(max(after, 1), 16)
3362 DO ispin = 1, dft_control%nspins
3363 DO img = 1, dft_control%nimages
3365 para_env, output_unit=iw, omit_headers=omit_headers)
3369 "DFT%PRINT%AO_MATRICES/DENSITY")
3374 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
3376 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
3378 IF (write_ks .OR. write_xc)
THEN
3379 IF (write_xc) qs_env%requires_matrix_vxc = .true.
3382 just_energy=.false.)
3383 IF (write_xc) qs_env%requires_matrix_vxc = .false.
3390 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
3392 after = min(max(after, 1), 16)
3393 DO ispin = 1, dft_control%nspins
3394 DO img = 1, dft_control%nimages
3396 para_env, output_unit=iw, omit_headers=omit_headers)
3400 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
3405 IF (.NOT. dft_control%qs_control%pao)
THEN
3413 CALL write_adjacency_matrix(qs_env, input)
3417 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
3418 cpassert(
ASSOCIATED(matrix_vxc))
3422 after = min(max(after, 1), 16)
3423 DO ispin = 1, dft_control%nspins
3424 DO img = 1, dft_control%nimages
3426 para_env, output_unit=iw, omit_headers=omit_headers)
3430 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
3435 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
3444 IF (output_unit > 0)
THEN
3445 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum X =', checksum_hr(1)
3446 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Y =', checksum_hr(2)
3447 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Z =', checksum_hr(3)
3449 after = min(max(after, 1), 16)
3452 para_env, output_unit=iw, omit_headers=omit_headers)
3456 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
3462 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
3465 IF (print_it) print_level = 2
3467 IF (print_it) print_level = 3
3478 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3479 IF (rho_r_valid)
THEN
3480 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
3481 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
3489 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
3491 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
3499 should_print_voro = 1
3501 should_print_voro = 0
3504 should_print_bqb = 1
3506 should_print_bqb = 0
3508 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3513 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3514 IF (rho_r_valid)
THEN
3516 IF (dft_control%nspins > 1)
THEN
3520 auxbas_pw_pool=auxbas_pw_pool, &
3524 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
3525 CALL pw_copy(rho_r(1), mb_rho)
3526 CALL pw_axpy(rho_r(2), mb_rho)
3533 IF (should_print_voro /= 0)
THEN
3535 IF (voro_print_txt)
THEN
3537 my_pos_voro =
"REWIND"
3538 IF (append_voro)
THEN
3539 my_pos_voro =
"APPEND"
3541 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
3542 file_position=my_pos_voro, log_filename=.false.)
3550 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3551 unit_nr_voro, qs_env, mb_rho)
3553 IF (dft_control%nspins > 1)
THEN
3554 CALL auxbas_pw_pool%give_back_pw(mb_rho)
3558 IF (unit_nr_voro > 0)
THEN
3568 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
3576 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
3584 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
3586 IF (particle_set(1)%fragment_index /= 0) iao_env%do_fragments = .true.
3587 IF (iao_env%do_iao)
THEN
3597 extension=
".mao", log_filename=.false.)
3608 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
3612 DEALLOCATE (zcharge)
3614 CALL timestop(handle)
3624 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
3627 INTEGER,
INTENT(IN) :: unit_nr
3629 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
3630 radius_type, refc, shapef
3631 INTEGER,
DIMENSION(:),
POINTER :: atom_list
3632 LOGICAL :: do_radius, do_sc, paw_atom
3633 REAL(kind=
dp) :: zeff
3634 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
3635 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
3638 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
3644 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3648 NULLIFY (hirshfeld_env)
3652 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
3653 ALLOCATE (hirshfeld_env%charges(natom))
3662 IF (.NOT.
SIZE(radii) == nkind)
THEN
3663 CALL cp_abort(__location__, &
3664 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
3665 "match number of atomic kinds in the input coordinate file.")
3671 iterative=do_sc, ref_charge=refc, &
3672 radius_type=radius_type)
3674 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
3680 nspin =
SIZE(matrix_p, 1)
3681 ALLOCATE (charges(natom, nspin))
3686 atomic_kind => atomic_kind_set(ikind)
3688 DO iat = 1,
SIZE(atom_list)
3690 hirshfeld_env%charges(i) = zeff
3694 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
3697 hirshfeld_env%charges(iat) = sum(charges(iat, :))
3700 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
3704 IF (hirshfeld_env%iterative)
THEN
3711 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
3712 IF (dft_control%qs_control%gapw)
THEN
3714 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
3717 atomic_kind => particle_set(iat)%atomic_kind
3719 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
3721 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
3726 IF (unit_nr > 0)
THEN
3728 qs_kind_set, unit_nr)
3734 DEALLOCATE (charges)
3736 END SUBROUTINE hirshfeld_charges
3746 SUBROUTINE project_function_a(ca, a, cb, b, l)
3748 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3749 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
3750 INTEGER,
INTENT(IN) :: l
3753 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3754 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
3757 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
3761 v(:, 1) = matmul(tmat, cb)
3762 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3766 DEALLOCATE (smat, tmat, v, ipiv)
3768 END SUBROUTINE project_function_a
3778 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
3780 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3781 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
3783 INTEGER,
INTENT(IN) :: l
3785 INTEGER :: i, info, n, nr
3786 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3787 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
3788 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
3792 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3796 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3797 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3799 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3803 DEALLOCATE (smat, v, ipiv, afun)
3805 END SUBROUTINE project_function_b
3816 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3821 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3823 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3824 INTEGER :: handle, io_unit, natom, unit_nr
3825 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3826 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
3835 CALL timeset(routinen, handle)
3838 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3840 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3841 gapw = dft_control%qs_control%gapw
3842 gapw_xc = dft_control%qs_control%gapw_xc
3843 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3845 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3846 CALL auxbas_pw_pool%create_pw(eden)
3851 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3852 IF (append_cube)
THEN
3853 my_pos_cube =
"APPEND"
3855 my_pos_cube =
"REWIND"
3859 extension=
".cube", middle_name=
"local_energy", &
3860 file_position=my_pos_cube, mpi_io=mpi_io)
3861 CALL cp_pw_to_cube(eden, unit_nr,
"LOCAL ENERGY", particles=particles, zeff=zcharge, &
3863 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_ENERGY_CUBE%MAX_FILE_SIZE_MB"), &
3865 IF (io_unit > 0)
THEN
3866 INQUIRE (unit=unit_nr, name=filename)
3867 IF (gapw .OR. gapw_xc)
THEN
3868 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3869 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3871 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3872 "The local energy is written to the file: ", trim(adjustl(filename))
3876 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3878 CALL auxbas_pw_pool%give_back_pw(eden)
3879 DEALLOCATE (zcharge)
3881 CALL timestop(handle)
3883 END SUBROUTINE qs_scf_post_local_energy
3894 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3899 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3901 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3902 INTEGER :: handle, io_unit, natom, unit_nr
3903 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3904 REAL(kind=
dp) :: beta
3905 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
3914 CALL timeset(routinen, handle)
3917 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3918 CALL cp_warn(__location__, &
3919 "LOCAL_STRESS_CUBE uses the existing experimental local stress implementation")
3921 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3922 gapw = dft_control%qs_control%gapw
3923 gapw_xc = dft_control%qs_control%gapw_xc
3924 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3926 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3927 CALL auxbas_pw_pool%create_pw(stress)
3934 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3935 IF (append_cube)
THEN
3936 my_pos_cube =
"APPEND"
3938 my_pos_cube =
"REWIND"
3942 extension=
".cube", middle_name=
"local_stress", &
3943 file_position=my_pos_cube, mpi_io=mpi_io)
3944 CALL cp_pw_to_cube(stress, unit_nr,
"LOCAL STRESS", particles=particles, zeff=zcharge, &
3946 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_STRESS_CUBE%MAX_FILE_SIZE_MB"), &
3948 IF (io_unit > 0)
THEN
3949 INQUIRE (unit=unit_nr, name=filename)
3950 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3951 IF (gapw .OR. gapw_xc)
THEN
3952 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3953 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3955 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3956 "The local stress is written to the file: ", trim(adjustl(filename))
3960 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3962 CALL auxbas_pw_pool%give_back_pw(stress)
3963 DEALLOCATE (zcharge)
3966 CALL timestop(handle)
3968 END SUBROUTINE qs_scf_post_local_stress
3979 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3984 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3986 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3987 INTEGER :: boundary_condition, handle, i, j, &
3988 n_cstr, n_tiles, unit_nr
3989 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3990 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3991 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
4001 CALL timeset(routinen, handle)
4003 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
4006 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
4008 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
4010 has_implicit_ps = .false.
4011 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
4016 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
4017 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
4019 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
4020 my_pos_cube =
"REWIND"
4021 IF (append_cube)
THEN
4022 my_pos_cube =
"APPEND"
4026 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
4028 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4029 CALL auxbas_pw_pool%create_pw(aux_r)
4031 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4032 SELECT CASE (boundary_condition)
4034 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
4036 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4037 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4038 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4039 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4040 poisson_env%implicit_env%dielectric%eps, aux_r)
4043 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, zeff=zcharge, &
4044 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
4045 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%MAX_FILE_SIZE_MB"), &
4048 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
4050 CALL auxbas_pw_pool%give_back_pw(aux_r)
4055 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
4057 has_dirichlet_bc = .false.
4058 IF (has_implicit_ps)
THEN
4059 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4061 has_dirichlet_bc = .true.
4065 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
4068 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
4069 my_pos_cube =
"REWIND"
4070 IF (append_cube)
THEN
4071 my_pos_cube =
"APPEND"
4075 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
4076 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
4078 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4079 CALL auxbas_pw_pool%create_pw(aux_r)
4081 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4082 SELECT CASE (boundary_condition)
4084 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
4086 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4087 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4088 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4089 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4090 poisson_env%implicit_env%cstr_charge, aux_r)
4093 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, zeff=zcharge, &
4094 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
4095 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%MAX_FILE_SIZE_MB"), &
4098 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
4100 CALL auxbas_pw_pool%give_back_pw(aux_r)
4105 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
4106 has_dirichlet_bc = .false.
4107 IF (has_implicit_ps)
THEN
4108 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4110 has_dirichlet_bc = .true.
4114 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
4116 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
4117 my_pos_cube =
"REWIND"
4118 IF (append_cube)
THEN
4119 my_pos_cube =
"APPEND"
4121 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
4123 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4124 CALL auxbas_pw_pool%create_pw(aux_r)
4127 IF (tile_cubes)
THEN
4129 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4131 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4133 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
4136 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4137 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
4140 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
4142 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, zeff=zcharge, &
4143 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4144 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4147 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4152 NULLIFY (dirichlet_tile)
4153 ALLOCATE (dirichlet_tile)
4154 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
4157 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4158 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
4161 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4163 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4165 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
4166 CALL pw_axpy(dirichlet_tile, aux_r)
4170 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, zeff=zcharge, &
4171 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4172 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4175 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4176 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
4177 DEALLOCATE (dirichlet_tile)
4180 CALL auxbas_pw_pool%give_back_pw(aux_r)
4183 CALL timestop(handle)
4185 END SUBROUTINE qs_scf_post_ps_implicit
4193 SUBROUTINE write_adjacency_matrix(qs_env, input)
4197 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
4199 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
4200 ind, jatom, jkind, k, natom, nkind, &
4201 output_unit, rowind, unit_nr
4202 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
4203 LOGICAL :: do_adjm_write, do_symmetric
4209 DIMENSION(:),
POINTER :: nl_iterator
4212 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
4215 CALL timeset(routinen, handle)
4217 NULLIFY (dft_section)
4226 IF (do_adjm_write)
THEN
4227 NULLIFY (qs_kind_set, nl_iterator)
4228 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
4230 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
4232 nkind =
SIZE(qs_kind_set)
4233 cpassert(
SIZE(nl) > 0)
4235 cpassert(do_symmetric)
4236 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
4240 adjm_size = ((natom + 1)*natom)/2
4241 ALLOCATE (interact_adjm(4*adjm_size))
4244 NULLIFY (nl_iterator)
4248 ikind=ikind, jkind=jkind, &
4249 iatom=iatom, jatom=jatom)
4251 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
4252 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
4253 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
4254 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
4257 IF (iatom <= jatom)
THEN
4264 ikind = ikind + jkind
4265 jkind = ikind - jkind
4266 ikind = ikind - jkind
4270 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
4273 interact_adjm((ind - 1)*4 + 1) = rowind
4274 interact_adjm((ind - 1)*4 + 2) = colind
4275 interact_adjm((ind - 1)*4 + 3) = ikind
4276 interact_adjm((ind - 1)*4 + 4) = jkind
4279 CALL para_env%sum(interact_adjm)
4282 extension=
".adjmat", file_form=
"FORMATTED", &
4283 file_status=
"REPLACE")
4284 IF (unit_nr > 0)
THEN
4285 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
4286 DO k = 1, 4*adjm_size, 4
4288 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
4289 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
4297 DEALLOCATE (basis_set_list_a, basis_set_list_b)
4300 CALL timestop(handle)
4302 END SUBROUTINE write_adjacency_matrix
4310 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
4314 LOGICAL :: use_virial
4324 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
4325 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
4326 rho_core=rho_core, virial=virial, &
4327 v_hartree_rspace=v_hartree_rspace)
4329 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
4331 IF (.NOT. use_virial)
THEN
4333 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
4334 poisson_env=poisson_env)
4335 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
4336 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
4340 v_hartree_gspace, rho_core=rho_core)
4342 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
4343 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
4345 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
4346 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
4349 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.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers, 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)
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
A wrapper around pw_to_openpmd() which accepts particle_list_type.
subroutine, public cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
...
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)
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} ]
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 commutator [H,r] matrices.
subroutine, public build_com_hr_matrix(qs_env, matrix_hr)
Calculation of the [H,r] commutators matrices over Cartesian Gaussian functions.
Calculation of the energies concerning the core charge distribution.
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)
...
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)
Get the components of a MO set data structure.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public qs_moment_locop(qs_env, magnetic, nmoments, reference, ref_point, unit_number, vel_reprs, com_nl)
...
subroutine, public qs_moment_kpoints(qs_env, nmoments, reference, ref_point, max_nmo, unit_number)
Calculate and print dipole moment elements d_nm(k) for k-point calculations.
subroutine, public qs_moment_berry_phase(qs_env, magnetic, nmoments, reference, ref_point, unit_number)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
Calculation and writing of projected density of states The DOS is computed per angular momentum and p...
subroutine, public calculate_projected_dos_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.
provides a resp fit for gas phase systems
subroutine, public resp_fit(qs_env)
performs resp fit and generates RESP charges
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Functions to print the KS and S matrix in the CSR format to file.
subroutine, public write_s_matrix_csr(qs_env, input)
writing the overlap matrix in csr format into a file
subroutine, public write_ks_matrix_csr(qs_env, input)
writing the KS matrix in csr format into a file
subroutine, public write_p_matrix_csr(qs_env, input)
writing the density matrix in csr format into a file
subroutine, public write_hcore_matrix_csr(qs_env, input)
writing the core Hamiltonian matrix in csr format into a file
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
Gets the LUMOs and 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 get_effective_core_charges(qs_env, zcharge)
Collects the effective core charge for every atom in a QS environment.
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
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Interface to Wannier90 code.
subroutine, public wannier90_interface(input, logger, qs_env)
...
Methods related to (\cal S)^2 (i.e. spin)
subroutine, public compute_s_square(mos, matrix_s, s_square, s_square_ideal, mo_derivs, strength)
Compute the expectation value <(\cal S)^2> of the single determinant defined by the spin up (alpha) a...
parameters that control an scf iteration
Calculation of STM image as post processing of an electronic structure calculation,...
subroutine, public th_stm_image(qs_env, stm_section, particles, unoccupied_orbs, unoccupied_evals)
Driver for the calculation of STM image, as post processing of a ground-state electronic structure ca...
routines for DFT+NEGF calculations (coupling with the quantum transport code OMEN)
subroutine, public qs_scf_post_transport(qs_env)
post scf calculations for transport
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public write_trexio(qs_env, trexio_section, energy_derivative)
Write a trexio file.
Interface for Voronoi Integration and output of BQB files.
subroutine, public entry_voronoi_or_bqb(do_voro, do_bqb, input_voro, input_bqb, unit_voro, qs_env, rspace_pw)
Does a Voronoi integration of density or stores the density to compressed BQB format.
subroutine, public xray_diffraction_spectrum(qs_env, unit_number, q_max)
Calculate the coherent X-ray diffraction spectrum using the total electronic density in reciprocal sp...
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.