38 dbcsr_type_antisymmetric
234#include "./base/base_uses.f90"
240 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
247 CHARACTER(len=*),
PARAMETER :: &
248 str_mo_cubes =
"PRINT%MO_CUBES", &
249 str_mo_openpmd =
"PRINT%MO_OPENPMD", &
250 str_elf_cubes =
"PRINT%ELF_CUBE", &
251 str_elf_openpmd =
"PRINT%ELF_OPENPMD", &
252 str_e_density_cubes =
"PRINT%E_DENSITY_CUBE", &
253 str_e_density_openpmd =
"PRINT%E_DENSITY_OPENPMD"
255 INTEGER,
PARAMETER :: grid_output_cubes = 1, grid_output_openpmd = 2
257 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_density = &
258 [-3, 0, 0, 0, 0, 0, 0]
259 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_dimensionless = &
260 [0, 0, 0, 0, 0, 0, 0]
261 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_wavefunction = &
262 [-1.5_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp]
263 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_density =
a_bohr**(-3)
264 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_dimensionless = 1.0_dp
265 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_wavefunction =
a_bohr**(-1.5_dp)
271 CHARACTER(len=default_string_length) :: relative_section_key =
""
272 CHARACTER(len=default_string_length) :: absolute_section_key =
""
273 CHARACTER(len=7) :: format_name =
""
274 INTEGER :: grid_output = -1
275 LOGICAL :: do_output = .false.
278 PROCEDURE,
PUBLIC :: print_key_unit_nr => cp_forward_print_key_unit_nr
280 PROCEDURE,
PUBLIC :: write_pw => cp_forward_write_pw
282 PROCEDURE,
PUBLIC :: print_key_finished_output => cp_forward_print_key_finished_output
284 PROCEDURE,
PUBLIC :: do_openpmd => cp_section_key_do_openpmd
285 PROCEDURE,
PUBLIC :: do_cubes => cp_section_key_do_cubes
286 PROCEDURE,
PUBLIC :: concat_to_relative => cp_section_key_concat_to_relative
287 PROCEDURE,
PUBLIC :: concat_to_absolute => cp_section_key_concat_to_absolute
288 END TYPE cp_section_key
299 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:), &
300 INTENT(OUT) :: zcharge
302 INTEGER :: iat, iatom, ikind, nat, natom, nkind
303 REAL(KIND=
dp) :: zeff
305 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
307 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
308 nkind=nkind, natom=natom)
309 ALLOCATE (zcharge(natom))
314 iat = atomic_kind_set(ikind)%atom_list(iatom)
326 FUNCTION cp_section_key_concat_to_absolute(self, extend_by)
RESULT(res)
327 CLASS(cp_section_key),
INTENT(IN) :: self
328 CHARACTER(*),
INTENT(IN) :: extend_by
329 CHARACTER(len=default_string_length) :: res
331 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
332 res = trim(self%absolute_section_key)//trim(extend_by)
334 res = trim(self%absolute_section_key)//
"%"//trim(extend_by)
336 END FUNCTION cp_section_key_concat_to_absolute
344 FUNCTION cp_section_key_concat_to_relative(self, extend_by)
RESULT(res)
345 CLASS(cp_section_key),
INTENT(IN) :: self
346 CHARACTER(*),
INTENT(IN) :: extend_by
347 CHARACTER(len=default_string_length) :: res
349 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
350 res = trim(self%relative_section_key)//trim(extend_by)
352 res = trim(self%relative_section_key)//
"%"//trim(extend_by)
354 END FUNCTION cp_section_key_concat_to_relative
361 FUNCTION cp_section_key_do_cubes(self)
RESULT(res)
362 CLASS(cp_section_key) :: self
365 res = self%do_output .AND. self%grid_output == grid_output_cubes
366 END FUNCTION cp_section_key_do_cubes
373 FUNCTION cp_section_key_do_openpmd(self)
RESULT(res)
374 CLASS(cp_section_key) :: self
377 res = self%do_output .AND. self%grid_output == grid_output_openpmd
378 END FUNCTION cp_section_key_do_openpmd
408 FUNCTION cp_forward_print_key_unit_nr( &
417 ignore_should_output, &
428 openpmd_unit_dimension, &
430 sim_time)
RESULT(res)
432 CLASS(cp_section_key),
INTENT(IN) :: self
435 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
436 CHARACTER(len=*),
INTENT(IN) :: extension
437 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
438 LOGICAL,
INTENT(IN),
OPTIONAL :: local, log_filename, ignore_should_output
439 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: file_form, file_position, file_action, &
441 LOGICAL,
INTENT(IN),
OPTIONAL :: do_backup, on_file
442 LOGICAL,
INTENT(OUT),
OPTIONAL :: is_new_file
443 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
444 CHARACTER(len=default_path_length),
INTENT(OUT), &
446 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
447 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
448 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
449 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
452 IF (self%grid_output == grid_output_cubes)
THEN
454 logger, basis_section, print_key_path, extension=extension, &
455 middle_name=middle_name, local=local, log_filename=log_filename, &
456 ignore_should_output=ignore_should_output, file_form=file_form, &
457 file_position=file_position, file_action=file_action, &
458 file_status=file_status, do_backup=do_backup, on_file=on_file, &
459 is_new_file=is_new_file, mpi_io=mpi_io, fout=fout)
465 middle_name=middle_name, &
466 ignore_should_output=ignore_should_output, &
469 openpmd_basename=openpmd_basename, &
470 openpmd_unit_dimension=openpmd_unit_dimension, &
471 openpmd_unit_si=openpmd_unit_si, &
474 END FUNCTION cp_forward_print_key_unit_nr
492 SUBROUTINE cp_forward_write_pw( &
505 CLASS(cp_section_key),
INTENT(IN) :: self
507 INTEGER,
INTENT(IN) :: unit_nr
508 CHARACTER(*),
INTENT(IN),
OPTIONAL :: title
510 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: stride
511 REAL(KIND=
dp),
INTENT(IN),
OPTIONAL :: max_file_size_mb
512 LOGICAL,
INTENT(IN),
OPTIONAL :: zero_tails, silent, mpi_io
513 REAL(KIND=
dp),
DIMENSION(:),
OPTIONAL :: zeff
515 IF (self%grid_output == grid_output_cubes)
THEN
516 CALL cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
518 CALL cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
520 END SUBROUTINE cp_forward_write_pw
536 SUBROUTINE cp_forward_print_key_finished_output(self, unit_nr, logger, basis_section, &
537 print_key_path, local, ignore_should_output, on_file, &
539 CLASS(cp_section_key),
INTENT(IN) :: self
540 INTEGER,
INTENT(INOUT) :: unit_nr
543 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
544 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, on_file, &
547 IF (self%grid_output == grid_output_cubes)
THEN
552 END SUBROUTINE cp_forward_print_key_finished_output
572 FUNCTION cube_or_openpmd(input, str_cubes, str_openpmd, logger)
RESULT(res)
574 CHARACTER(len=*),
INTENT(IN) :: str_cubes, str_openpmd
576 TYPE(cp_section_key) :: res
578 LOGICAL :: do_cubes, do_openpmd
581 logger%iter_info, input, &
582 "DFT%"//trim(adjustl(str_cubes))),
cp_p_file)
584 logger%iter_info, input, &
585 "DFT%"//trim(adjustl(str_openpmd))),
cp_p_file)
589 cpassert(.NOT. (do_cubes .AND. do_openpmd))
590 res%do_output = do_cubes .OR. do_openpmd
592 res%grid_output = grid_output_openpmd
593 res%relative_section_key = trim(adjustl(str_openpmd))
594 res%format_name =
"openPMD"
596 res%grid_output = grid_output_cubes
597 res%relative_section_key = trim(adjustl(str_cubes))
598 res%format_name =
"Cube"
600 res%absolute_section_key =
"DFT%"//trim(adjustl(res%relative_section_key))
601 END FUNCTION cube_or_openpmd
609 FUNCTION section_key_do_write(grid_output)
RESULT(res)
610 INTEGER,
INTENT(IN) :: grid_output
611 CHARACTER(len=32) :: res
613 IF (grid_output == grid_output_cubes)
THEN
615 ELSE IF (grid_output == grid_output_openpmd)
THEN
616 res =
"%WRITE_OPENPMD"
618 END FUNCTION section_key_do_write
627 SUBROUTINE print_density_output_message(output_unit, prefix, e_density_section, filename)
628 INTEGER,
INTENT(IN) :: output_unit
629 CHARACTER(len=*),
INTENT(IN) :: prefix
630 TYPE(cp_section_key),
INTENT(IN) :: e_density_section
631 CHARACTER(len=*),
INTENT(IN) :: filename
633 IF (e_density_section%grid_output == grid_output_openpmd)
THEN
634 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
635 trim(prefix)//
" is written in " &
636 //e_density_section%format_name &
637 //
" file format to the file / file pattern:", &
640 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
641 trim(prefix)//
" is written in " &
642 //e_density_section%format_name &
643 //
" file format to the file:", &
646 END SUBROUTINE print_density_output_message
669 CHARACTER(6),
OPTIONAL :: wf_type
670 LOGICAL,
OPTIONAL :: do_mp2
672 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw', &
673 warning_cube_kpoint =
"Print MO cubes not implemented for k-point calculations", &
674 warning_openpmd_kpoint =
"Writing to openPMD not implemented for k-point calculations"
676 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
677 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
678 nlumos, nmo, nspins, output_unit, &
680 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
681 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_stm, &
682 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
683 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
685 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
686 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
689 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
690 unoccupied_evals, unoccupied_evals_stm
691 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
692 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
693 TARGET :: homo_localized, lumo_localized, &
695 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
696 unoccupied_orbs, unoccupied_orbs_stm
699 TYPE(cp_section_key) :: mo_section
700 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
702 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
714 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
723 localize_section, print_key, &
726 CALL timeset(routinen, handle)
733 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
734 IF (
PRESENT(wf_type))
THEN
735 IF (output_unit > 0)
THEN
736 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
737 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
738 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
745 my_localized_wfn = .false.
746 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
747 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
748 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
749 unoccupied_evals_stm, molecule_set, mo_derivs, &
750 subsys, particles, input, print_key, kinetic_m, marked_states, &
751 mixed_evals, qs_loc_env_mixed)
752 NULLIFY (lumo_ptr, rho_ao)
759 p_loc_mixed = .false.
761 cpassert(
ASSOCIATED(scf_env))
762 cpassert(
ASSOCIATED(qs_env))
765 dft_control=dft_control, &
766 molecule_set=molecule_set, &
767 scf_control=scf_control, &
768 do_kpoints=do_kpoints, &
773 particle_set=particle_set, &
774 atomic_kind_set=atomic_kind_set, &
775 qs_kind_set=qs_kind_set)
776 rtp_control => dft_control%rtp_control
783 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
784 DO ispin = 1, dft_control%nspins
785 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
790 CALL update_hartree_with_mp2(rho, qs_env)
793 CALL write_available_results(qs_env, scf_env)
797 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
799 cpassert(
ASSOCIATED(kinetic_m))
800 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
804 IF (unit_nr > 0)
THEN
805 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
808 "DFT%PRINT%KINETIC_ENERGY")
812 CALL qs_scf_post_charges(input, logger, qs_env)
827 IF (loc_print_explicit)
THEN
849 IF (loc_explicit)
THEN
859 p_loc_mixed = .false.
863 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
864 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
865 "therefore localization of unoccupied states will be skipped!")
876 mo_section = cube_or_openpmd(input, str_mo_cubes, str_mo_openpmd, logger)
878 IF (loc_print_explicit)
THEN
882 do_wannier_cubes = .false.
884 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
885 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
888 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
889 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
891 CALL auxbas_pw_pool%create_pw(wf_r)
892 CALL auxbas_pw_pool%create_pw(wf_g)
895 IF (dft_control%restricted)
THEN
899 nspins = dft_control%nspins
902 IF (dft_control%restricted .AND. (mo_section%do_output .OR. p_loc_homo))
THEN
903 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
908 cpwarn_if(mo_section%do_cubes(), warning_cube_kpoint)
909 cpwarn_if(mo_section%do_openpmd(), warning_openpmd_kpoint)
914 IF ((mo_section%do_output .AND. nhomo /= 0) .OR. do_stm)
THEN
916 IF (dft_control%do_admm)
THEN
918 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
920 IF (dft_control%hairy_probes)
THEN
921 scf_control%smear%do_smear = .false.
922 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
924 probe=dft_control%probe)
926 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
929 DO ispin = 1, dft_control%nspins
930 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
931 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
935 IF (mo_section%do_output .AND. nhomo /= 0)
THEN
938 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
939 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
940 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
941 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
952 cpwarn(
"Localization not implemented for k-point calculations!")
953 ELSE IF (dft_control%restricted &
956 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
958 ALLOCATE (occupied_orbs(dft_control%nspins))
959 ALLOCATE (occupied_evals(dft_control%nspins))
960 ALLOCATE (homo_localized(dft_control%nspins))
961 DO ispin = 1, dft_control%nspins
962 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
963 eigenvalues=mo_eigenvalues)
964 occupied_orbs(ispin) = mo_coeff
965 occupied_evals(ispin)%array => mo_eigenvalues
966 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
967 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
970 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
973 ALLOCATE (qs_loc_env_homo)
976 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
977 mo_section%do_output, mo_loc_history=mo_loc_history)
979 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
982 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
984 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
989 homo_localized, do_homo)
991 DEALLOCATE (occupied_orbs)
992 DEALLOCATE (occupied_evals)
994 IF (qs_loc_env_homo%do_localize)
THEN
995 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
1001 IF (do_kpoints)
THEN
1002 IF (mo_section%do_output .OR. p_loc_lumo)
THEN
1004 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
1007 compute_lumos = mo_section%do_output .AND. nlumo /= 0
1008 compute_lumos = compute_lumos .OR. p_loc_lumo
1010 DO ispin = 1, dft_control%nspins
1011 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
1012 compute_lumos = compute_lumos .AND. homo == nmo
1015 IF (mo_section%do_output .AND. .NOT. compute_lumos)
THEN
1017 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
1018 DO ispin = 1, dft_control%nspins
1020 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
1021 IF (nlumo > nmo - homo)
THEN
1024 IF (nlumo == -1)
THEN
1027 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1028 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
1029 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
1030 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
1033 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1034 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1035 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1, mo_section=mo_section)
1041 IF (compute_lumos)
THEN
1042 check_write = .true.
1044 IF (nlumo == 0) check_write = .false.
1045 IF (p_loc_lumo)
THEN
1047 ALLOCATE (qs_loc_env_lumo)
1050 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
1053 ALLOCATE (unoccupied_orbs(dft_control%nspins))
1054 ALLOCATE (unoccupied_evals(dft_control%nspins))
1055 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
1056 lumo_ptr => unoccupied_orbs
1057 DO ispin = 1, dft_control%nspins
1059 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
1060 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
1061 IF (check_write)
THEN
1062 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
1064 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1065 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin, mo_section=mo_section)
1069 IF (p_loc_lumo)
THEN
1070 ALLOCATE (lumo_localized(dft_control%nspins))
1071 DO ispin = 1, dft_control%nspins
1072 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
1073 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
1075 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, mo_section%do_output, &
1076 evals=unoccupied_evals)
1077 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
1078 loc_coeff=unoccupied_orbs)
1080 lumo_localized, wf_r, wf_g, particles, &
1081 unoccupied_orbs, unoccupied_evals, marked_states)
1082 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
1083 evals=unoccupied_evals)
1084 lumo_ptr => lumo_localized
1088 IF (has_homo .AND. has_lumo)
THEN
1089 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1090 DO ispin = 1, dft_control%nspins
1091 IF (.NOT. scf_control%smear%do_smear)
THEN
1092 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
1093 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
1094 "HOMO - LUMO gap [eV] :", gap*
evolt
1100 IF (p_loc_mixed)
THEN
1101 IF (do_kpoints)
THEN
1102 cpwarn(
"Localization not implemented for k-point calculations!")
1103 ELSE IF (dft_control%restricted)
THEN
1104 IF (output_unit > 0)
WRITE (output_unit, *) &
1105 " Unclear how we define MOs / localization in the restricted case... skipping"
1108 ALLOCATE (mixed_orbs(dft_control%nspins))
1109 ALLOCATE (mixed_evals(dft_control%nspins))
1110 ALLOCATE (mixed_localized(dft_control%nspins))
1111 DO ispin = 1, dft_control%nspins
1112 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1113 eigenvalues=mo_eigenvalues)
1114 mixed_orbs(ispin) = mo_coeff
1115 mixed_evals(ispin)%array => mo_eigenvalues
1116 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
1117 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
1120 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
1123 total_zeff_corr = scf_env%sum_zeff_corr
1124 ALLOCATE (qs_loc_env_mixed)
1127 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
1128 mo_section%do_output, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
1131 DO ispin = 1, dft_control%nspins
1132 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
1136 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
1139 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
1141 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
1148 DEALLOCATE (mixed_orbs)
1149 DEALLOCATE (mixed_evals)
1154 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
1155 CALL auxbas_pw_pool%give_back_pw(wf_r)
1156 CALL auxbas_pw_pool%give_back_pw(wf_g)
1160 IF (.NOT. do_kpoints)
THEN
1161 IF (p_loc_homo)
THEN
1163 DEALLOCATE (qs_loc_env_homo)
1165 IF (p_loc_lumo)
THEN
1167 DEALLOCATE (qs_loc_env_lumo)
1169 IF (p_loc_mixed)
THEN
1171 DEALLOCATE (qs_loc_env_mixed)
1176 IF (do_kpoints)
THEN
1179 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
1180 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
1181 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
1182 matrix_s=matrix_s, marked_states=marked_states)
1186 IF (
ASSOCIATED(marked_states))
THEN
1187 DEALLOCATE (marked_states)
1191 IF (.NOT. do_kpoints)
THEN
1192 IF (compute_lumos)
THEN
1193 DO ispin = 1, dft_control%nspins
1194 DEALLOCATE (unoccupied_evals(ispin)%array)
1197 DEALLOCATE (unoccupied_evals)
1198 DEALLOCATE (unoccupied_orbs)
1204 IF (do_kpoints)
THEN
1205 cpwarn(
"STM not implemented for k-point calculations!")
1207 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
1208 IF (nlumo_stm > 0)
THEN
1209 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
1210 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
1211 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
1215 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
1216 unoccupied_evals_stm)
1218 IF (nlumo_stm > 0)
THEN
1219 DO ispin = 1, dft_control%nspins
1220 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
1222 DEALLOCATE (unoccupied_evals_stm)
1229 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1232 CALL qs_scf_post_efg(input, logger, qs_env)
1235 CALL qs_scf_post_et(input, qs_env, dft_control)
1238 CALL qs_scf_post_epr(input, logger, qs_env)
1241 CALL qs_scf_post_molopt(input, logger, qs_env)
1244 CALL qs_scf_post_elf(input, logger, qs_env)
1251 DO ispin = 1, dft_control%nspins
1252 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
1260 CALL timestop(handle)
1273 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
1277 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
1279 INTEGER,
INTENT(IN) :: nlumo
1280 INTEGER,
INTENT(OUT) :: nlumos
1282 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
1284 INTEGER :: handle, homo, ispin, n, nao, nmo, &
1291 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1298 CALL timeset(routinen, handle)
1300 NULLIFY (ks_rmpv, matrix_s, scf_control, dft_control, admm_env, para_env, blacs_env, mos)
1302 matrix_ks=ks_rmpv, &
1303 matrix_s=matrix_s, &
1304 scf_control=scf_control, &
1305 dft_control=dft_control, &
1306 admm_env=admm_env, &
1307 para_env=para_env, &
1308 blacs_env=blacs_env, &
1314 DO ispin = 1, dft_control%nspins
1315 NULLIFY (unoccupied_evals(ispin)%array)
1316 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1317 IF (output_unit > 0)
WRITE (output_unit, *) &
1318 " Using OT eigensolver for additional unoccupied orbitals spin ", ispin
1319 IF (output_unit > 0)
WRITE (output_unit, *) &
1320 " Lowest Eigenvalues of the unoccupied subspace spin ", ispin
1321 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
1322 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1324 nlumos = max(1, min(nlumo, nao - nmo))
1325 IF (nlumo == -1) nlumos = nao - nmo
1326 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1328 nrow_global=n, ncol_global=nlumos)
1329 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1334 NULLIFY (local_preconditioner)
1335 IF (
ASSOCIATED(scf_env))
THEN
1336 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1337 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1340 NULLIFY (local_preconditioner)
1346 IF (dft_control%do_admm)
THEN
1350 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1351 matrix_c_fm=unoccupied_orbs(ispin), &
1352 matrix_orthogonal_space_fm=mo_coeff, &
1353 eps_gradient=scf_control%eps_lumos, &
1355 iter_max=scf_control%max_iter_lumos, &
1356 size_ortho_space=nmo)
1359 unoccupied_evals(ispin)%array, scr=output_unit, &
1360 ionode=output_unit > 0)
1363 IF (dft_control%do_admm)
THEN
1369 CALL timestop(handle)
1379 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
1384 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
1386 INTEGER :: handle, print_level, unit_nr
1387 LOGICAL :: do_kpoints, print_it
1390 CALL timeset(routinen, handle)
1392 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
1400 log_filename=.false.)
1403 IF (print_it) print_level = 2
1405 IF (print_it) print_level = 3
1416 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
1417 log_filename=.false.)
1419 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
1423 CALL timestop(handle)
1425 END SUBROUTINE qs_scf_post_charges
1442 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1443 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
1452 INTEGER,
INTENT(IN) :: homo, ispin
1453 TYPE(cp_section_key) :: mo_section
1455 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1457 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1458 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1460 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1461 LOGICAL :: append_cube, mpi_io
1462 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
1467 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1469 CALL timeset(routinen, handle)
1474 cpassert(mo_section%grid_output /= grid_output_openpmd)
1477 NULLIFY (list_index)
1480 ,
cp_p_file) .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1482 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
1484 IF (mo_section%grid_output == grid_output_cubes)
THEN
1485 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1487 my_pos_cube =
"REWIND"
1488 IF (append_cube)
THEN
1489 my_pos_cube =
"APPEND"
1491 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), n_rep_val=n_rep)
1496 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), i_rep_val=ir, &
1498 IF (
ASSOCIATED(
list))
THEN
1500 DO i = 1,
SIZE(
list)
1501 list_index(i + nlist) =
list(i)
1503 nlist = nlist +
SIZE(
list)
1508 IF (nhomo == -1) nhomo = homo
1509 nlist = homo - max(1, homo - nhomo + 1) + 1
1510 ALLOCATE (list_index(nlist))
1512 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1516 ivector = list_index(i)
1518 atomic_kind_set=atomic_kind_set, &
1519 qs_kind_set=qs_kind_set, &
1521 particle_set=particle_set, &
1524 cell, dft_control, particle_set, pw_env)
1525 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1528 unit_nr = mo_section%print_key_unit_nr( &
1531 mo_section%absolute_section_key, &
1532 extension=
".cube", &
1533 middle_name=trim(filename), &
1534 file_position=my_pos_cube, &
1535 log_filename=.false., &
1537 openpmd_basename=
"dft-mo", &
1538 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1539 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1540 sim_time=qs_env%sim_time)
1541 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1542 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1543 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1544 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1546 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1548 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1549 DEALLOCATE (zcharge)
1552 CALL timestop(handle)
1554 END SUBROUTINE qs_scf_post_occ_cubes
1573 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1574 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo, mo_section)
1580 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1584 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1585 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1586 TYPE(cp_section_key) :: mo_section
1588 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1590 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1591 INTEGER :: handle, ifirst, index_mo, ivector, &
1593 LOGICAL :: append_cube, mpi_io
1594 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
1599 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1601 CALL timeset(routinen, handle)
1606 cpassert(mo_section%grid_output /= grid_output_openpmd)
1610 .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1612 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1614 IF (mo_section%grid_output == grid_output_cubes)
THEN
1615 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1617 my_pos_cube =
"REWIND"
1618 IF (append_cube)
THEN
1619 my_pos_cube =
"APPEND"
1622 IF (
PRESENT(lumo)) ifirst = lumo
1623 DO ivector = ifirst, ifirst + nlumos - 1
1625 atomic_kind_set=atomic_kind_set, &
1626 qs_kind_set=qs_kind_set, &
1628 particle_set=particle_set, &
1631 qs_kind_set, cell, dft_control, particle_set, pw_env)
1633 IF (ifirst == 1)
THEN
1634 index_mo = homo + ivector
1638 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1641 unit_nr = mo_section%print_key_unit_nr( &
1644 mo_section%absolute_section_key, &
1645 extension=
".cube", &
1646 middle_name=trim(filename), &
1647 file_position=my_pos_cube, &
1648 log_filename=.false., &
1650 openpmd_basename=
"dft-mo", &
1651 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1652 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1653 sim_time=qs_env%sim_time)
1654 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1655 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1656 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1657 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1659 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1662 DEALLOCATE (zcharge)
1665 CALL timestop(handle)
1667 END SUBROUTINE qs_scf_post_unocc_cubes
1680 INTEGER,
INTENT(IN) :: output_unit
1682 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1684 CHARACTER(LEN=default_path_length) :: bc_file, dip_file, filename
1685 CHARACTER(LEN=default_string_length) :: moment_unit
1686 INTEGER :: handle, max_nmo, maxmom, moments_format, &
1687 moments_unit_nr, reference, unit_nr
1688 LOGICAL :: com_nl, do_kg, do_kpoints, do_soc, &
1689 magnetic, new_file, periodic, &
1690 second_ref_point, vel_reprs
1691 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1694 CALL timeset(routinen, handle)
1697 subsection_name=
"DFT%PRINT%MOMENTS")
1702 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1704 keyword_name=
"DFT%PRINT%MOMENTS%FORMAT")
1706 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1708 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1710 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1712 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1714 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1716 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1718 keyword_name=
"DFT%PRINT%MOMENTS%KG")
1720 keyword_name=
"DFT%PRINT%MOMENTS%MAX_NMO")
1722 keyword_name=
"DFT%PRINT%MOMENTS%SOC")
1732 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1733 middle_name=
"moments", log_filename=.false., &
1734 is_new_file=new_file)
1736 IF (output_unit > 0)
THEN
1737 IF (unit_nr /= output_unit)
THEN
1738 INQUIRE (unit=unit_nr, name=filename)
1739 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1740 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1743 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1747 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1750 IF (do_kpoints)
THEN
1751 cpabort(
"MOMENTS FORMAT TRAJECTORY is not available for k-point calculations.")
1753 IF (maxmom /= 1) cpabort(
"MOMENTS FORMAT TRAJECTORY requires MAX_MOMENT 1.")
1754 IF (magnetic) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support MAGNETIC moments.")
1755 IF (vel_reprs) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support VEL_REPRS.")
1756 IF (do_kg) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support KG moments.")
1757 moments_unit_nr = -1
1759 moments_unit_nr = unit_nr
1762 IF (do_kpoints)
THEN
1763 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr, &
1764 do_soc, unit_str=moment_unit, dip_file=dip_file, bc_file=bc_file)
1768 unit_str=moment_unit)
1770 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, moments_unit_nr, vel_reprs, com_nl, &
1771 unit_str=moment_unit)
1775 unit_str=moment_unit)
1779 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS|")
1783 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1785 IF (second_ref_point)
THEN
1787 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1792 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1793 middle_name=
"moments_refpoint_2", log_filename=.false., &
1794 is_new_file=new_file)
1796 IF (output_unit > 0)
THEN
1797 IF (unit_nr /= output_unit)
THEN
1798 INQUIRE (unit=unit_nr, name=filename)
1799 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1800 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1803 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1807 IF (do_kpoints)
THEN
1808 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr, &
1809 do_soc, unit_str=moment_unit, dip_file=dip_file, bc_file=bc_file)
1813 unit_str=moment_unit)
1815 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, &
1816 moments_unit_nr, vel_reprs, com_nl, unit_str=moment_unit)
1820 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS_REF2|")
1823 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1828 CALL timestop(handle)
1841 SUBROUTINE write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file, label)
1842 INTEGER,
INTENT(IN) :: unit_nr
1845 LOGICAL,
INTENT(IN) :: periodic, new_file
1846 CHARACTER(LEN=*),
INTENT(IN) :: label
1848 CHARACTER(LEN=default_string_length) :: description, iter
1849 REAL(kind=
dp),
DIMENSION(3) :: dipole
1853 IF (unit_nr <= 0)
RETURN
1855 NULLIFY (cell, results)
1856 CALL get_qs_env(qs_env, cell=cell, results=results)
1857 description =
"[DIPOLE]"
1858 CALL get_results(results=results, description=description, values=dipole)
1862 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1863 " iter_level dipole_x dipole_y dipole_z dipole_norm cell_xx cell_xy cell_xz"// &
1864 " cell_yx cell_yy cell_yz cell_zx cell_zy cell_zz [Debye]"
1866 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1867 " iter_level dipole_x dipole_y dipole_z dipole_norm [Debye]"
1873 WRITE (unit_nr,
"(1X,A,1X,A15,13(1X,ES18.10))") trim(label), iter(1:15), &
1877 WRITE (unit_nr,
"(1X,A,1X,A15,4(1X,ES18.10))") trim(label), iter(1:15), &
1881 END SUBROUTINE write_moments_trajectory
1891 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1896 INTEGER,
INTENT(IN) :: output_unit
1898 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1900 CHARACTER(LEN=default_path_length) :: filename
1901 INTEGER :: handle, unit_nr
1902 REAL(kind=
dp) :: q_max
1905 CALL timeset(routinen, handle)
1908 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1912 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1914 basis_section=input, &
1915 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1917 middle_name=
"xrd", &
1918 log_filename=.false.)
1919 IF (output_unit > 0)
THEN
1920 INQUIRE (unit=unit_nr, name=filename)
1921 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1922 "X-RAY DIFFRACTION SPECTRUM"
1923 IF (unit_nr /= output_unit)
THEN
1924 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1925 "The coherent X-ray diffraction spectrum is written to the file:", &
1930 unit_number=unit_nr, &
1934 basis_section=input, &
1935 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1938 CALL timestop(handle)
1940 END SUBROUTINE qs_scf_post_xray
1948 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1953 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1958 CALL timeset(routinen, handle)
1961 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1967 CALL timestop(handle)
1969 END SUBROUTINE qs_scf_post_efg
1977 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1982 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1984 INTEGER :: handle, ispin
1986 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1989 CALL timeset(routinen, handle)
1995 IF (qs_env%et_coupling%first_run)
THEN
1997 ALLOCATE (my_mos(dft_control%nspins))
1998 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1999 DO ispin = 1, dft_control%nspins
2001 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
2002 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
2011 CALL timestop(handle)
2013 END SUBROUTINE qs_scf_post_et
2024 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
2029 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
2031 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2033 INTEGER :: handle, ispin, output_unit, unit_nr
2034 LOGICAL :: append_cube, gapw, mpi_io
2035 REAL(
dp) :: rho_cutoff
2036 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2037 TYPE(cp_section_key) :: elf_section_key
2047 CALL timeset(routinen, handle)
2050 elf_section_key = cube_or_openpmd(input, str_elf_cubes, str_elf_openpmd, logger)
2053 IF (elf_section_key%do_output)
THEN
2055 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
2056 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
2059 gapw = dft_control%qs_control%gapw
2060 IF (.NOT. gapw)
THEN
2062 ALLOCATE (elf_r(dft_control%nspins))
2063 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2065 DO ispin = 1, dft_control%nspins
2066 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
2070 IF (output_unit > 0)
THEN
2071 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
2072 " ----- ELF is computed on the real space grid -----"
2081 IF (elf_section_key%grid_output == grid_output_cubes)
THEN
2084 my_pos_cube =
"REWIND"
2085 IF (append_cube)
THEN
2086 my_pos_cube =
"APPEND"
2089 DO ispin = 1, dft_control%nspins
2090 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
2091 WRITE (title, *)
"ELF spin ", ispin
2093 unit_nr = elf_section_key%print_key_unit_nr( &
2096 elf_section_key%absolute_section_key, &
2097 extension=
".cube", &
2098 middle_name=trim(filename), &
2099 file_position=my_pos_cube, &
2100 log_filename=.false., &
2102 fout=mpi_filename, &
2103 openpmd_basename=
"dft-elf", &
2104 openpmd_unit_dimension=openpmd_unit_dimension_dimensionless, &
2105 openpmd_unit_si=openpmd_unit_si_dimensionless, &
2106 sim_time=qs_env%sim_time)
2107 IF (output_unit > 0)
THEN
2108 IF (.NOT. mpi_io)
THEN
2109 INQUIRE (unit=unit_nr, name=filename)
2111 filename = mpi_filename
2113 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2114 "ELF is written in "//elf_section_key%format_name//
" file format to the file:", &
2118 CALL elf_section_key%write_pw(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
2120 CALL elf_section_key%print_key_finished_output( &
2124 elf_section_key%absolute_section_key, &
2127 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
2131 DEALLOCATE (elf_r, zcharge)
2135 cpwarn(
"ELF not implemented for GAPW calculations!")
2140 CALL timestop(handle)
2142 END SUBROUTINE qs_scf_post_elf
2154 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
2159 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
2161 INTEGER :: handle, nao, unit_nr
2162 REAL(kind=
dp) :: s_cond_number
2163 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
2172 CALL timeset(routinen, handle)
2175 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2179 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
2182 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
2184 nrow_global=nao, ncol_global=nao, &
2185 template_fmstruct=mo_coeff%matrix_struct)
2186 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
2188 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
2191 ALLOCATE (eigenvalues(nao))
2199 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
2202 extension=
".molopt")
2204 IF (unit_nr > 0)
THEN
2207 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
2208 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
2212 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2216 CALL timestop(handle)
2218 END SUBROUTINE qs_scf_post_molopt
2226 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
2231 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
2236 CALL timeset(routinen, handle)
2239 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
2245 CALL timestop(handle)
2247 END SUBROUTINE qs_scf_post_epr
2256 SUBROUTINE write_available_results(qs_env, scf_env)
2260 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
2264 CALL timeset(routinen, handle)
2272 CALL timestop(handle)
2274 END SUBROUTINE write_available_results
2287 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
2289 INTEGER :: handle, ispin, nlumo_dos, nlumo_molden, &
2290 nlumo_required, nlumos, output_unit
2291 LOGICAL :: defer_molden, do_curve, do_dos, &
2292 do_kpoints, do_pdos, do_projected_dos, &
2294 REAL(kind=
dp) :: s_square, s_square_ideal, &
2295 total_abs_spin_dens, total_spin_dens
2296 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
2301 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
2304 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
2305 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp
2319 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2324 dos_section, input, sprint_section, &
2327 CALL timeset(routinen, handle)
2329 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
2330 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
2331 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
2332 molecule_set, input, particles, subsys, rho_r, unoccupied_orbs, &
2333 unoccupied_evals, casino_section, dos_section)
2338 cpassert(
ASSOCIATED(qs_env))
2340 dft_control=dft_control, &
2341 molecule_set=molecule_set, &
2342 atomic_kind_set=atomic_kind_set, &
2343 particle_set=particle_set, &
2344 qs_kind_set=qs_kind_set, &
2345 admm_env=admm_env, &
2346 scf_control=scf_control, &
2355 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
2359 IF (.NOT. qs_env%run_rtp)
THEN
2372 defer_molden = .false.
2373 IF (.NOT. do_kpoints)
THEN
2374 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
2378 IF (nlumo_molden /= 0 .AND.
PRESENT(scf_env))
THEN
2379 IF (scf_env%method ==
ot_method_nr) defer_molden = .true.
2381 IF (.NOT. defer_molden)
THEN
2382 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2383 qs_env=qs_env, calc_energies=.true.)
2392 cpwarn(
"Molden format output is not possible for k-point calculations.")
2396 cpwarn(
"Chargemol .wfx format output is not possible for k-point calculations.")
2403 IF (do_kpoints)
THEN
2407 cpwarn(
"MO_KP is only available for k-point calculations, ignored for Gamma-only")
2418 IF (.NOT. do_kpoints .AND.
PRESENT(scf_env))
THEN
2422 IF (nlumo_dos == -1)
THEN
2424 ELSE IF (nlumo_required /= -1)
THEN
2425 nlumo_required = max(nlumo_required, nlumo_dos)
2429 IF (defer_molden)
THEN
2430 IF (nlumo_molden == -1)
THEN
2432 ELSE IF (nlumo_required /= -1)
THEN
2433 nlumo_required = max(nlumo_required, nlumo_molden)
2436 IF (nlumo_required /= 0)
THEN
2437 ALLOCATE (unoccupied_orbs(dft_control%nspins))
2438 ALLOCATE (unoccupied_evals(dft_control%nspins))
2439 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, &
2440 nlumo_required, nlumos)
2443 IF (do_dos .OR. do_projected_dos)
THEN
2444 DO ispin = 1, dft_control%nspins
2447 IF (dft_control%do_admm)
THEN
2450 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
2451 eigenvalues=mo_eigenvalues)
2452 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
2453 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
2455 mo_coeff_deriv => null()
2458 do_rotation=.true., &
2459 co_rotate_dbcsr=mo_coeff_deriv)
2461 IF (dft_control%do_admm)
THEN
2469 IF (defer_molden)
THEN
2470 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2471 IF (output_unit > 0)
THEN
2472 WRITE (output_unit,
'(/,T2,A,I6,A)') &
2473 "MO_MOLDEN| Writing ", nlumos,
" unoccupied orbitals to molden file"
2475 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2476 unoccupied_orbs=unoccupied_orbs, &
2477 unoccupied_evals=unoccupied_evals, &
2478 qs_env=qs_env, calc_energies=.true.)
2484 IF (do_kpoints)
THEN
2486 IF (do_curve)
CALL calculate_dos_kp(qs_env, dft_section, write_curve_output=.true.)
2489 IF (
ASSOCIATED(unoccupied_evals))
THEN
2490 CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2491 smearing_enabled=dft_control%smear)
2492 IF (do_curve)
CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2493 smearing_enabled=dft_control%smear, write_curve_output=.true.)
2495 CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear)
2496 IF (do_curve)
CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear, &
2497 write_curve_output=.true.)
2503 IF (do_projected_dos)
THEN
2504 IF (do_kpoints)
THEN
2506 write_pdos=do_pdos, write_pdos_curve=do_curve)
2511 DO ispin = 1, dft_control%nspins
2512 IF (dft_control%nspins == 2)
THEN
2513 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2515 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2516 unoccupied_orbs=unoccupied_orbs(ispin), &
2517 unoccupied_evals=unoccupied_evals(ispin), &
2518 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2521 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2522 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2525 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2527 qs_kind_set, particle_set, qs_env, dft_section, &
2528 unoccupied_orbs=unoccupied_orbs(ispin), &
2529 unoccupied_evals=unoccupied_evals(ispin), &
2530 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2533 qs_kind_set, particle_set, qs_env, dft_section, &
2534 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2540 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2541 DO ispin = 1, dft_control%nspins
2542 DEALLOCATE (unoccupied_evals(ispin)%array)
2545 DEALLOCATE (unoccupied_evals)
2546 DEALLOCATE (unoccupied_orbs)
2551 IF (dft_control%nspins == 2)
THEN
2552 total_spin_dens = 0.0_dp
2553 total_abs_spin_dens = 0.0_dp
2554 IF (dft_control%qs_control%gapw)
THEN
2555 CALL get_qs_env(qs_env, qs_charges=qs_charges)
2556 total_spin_dens = qs_charges%total_rho_hard_spin - &
2557 qs_charges%total_rho_soft_spin
2558 total_abs_spin_dens = qs_charges%total_rho_hard_abs_spin - &
2559 qs_charges%total_rho_soft_abs_spin
2562 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2563 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2565 CALL auxbas_pw_pool%create_pw(wf_r)
2567 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
2569 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
2570 "Integrated spin density: ", total_spin_dens
2572 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
2573 "Integrated absolute spin density: ", total_abs_spin_dens
2574 CALL auxbas_pw_pool%give_back_pw(wf_r)
2577 IF (do_kpoints)
THEN
2578 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s_kp, kpoints=kpoints)
2581 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
2584 IF (dft_control%relax_multiplicity > 0.0_dp)
THEN
2585 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T66,F15.6)') &
2586 "Relaxed multiplicity: Single determinant S**2 : ", s_square
2588 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
2589 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
2593 CALL timestop(handle)
2605 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
2606 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
2608 CHARACTER(LEN=2) :: element_symbol
2609 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2611 CHARACTER(LEN=default_string_length) :: name, print_density
2612 INTEGER :: after, handle, i, iat, id, ikind, img, iso, ispin, iw, l, n_rep_hf, natom, nd(3), &
2613 ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, should_print_voro, &
2614 unit_nr, unit_nr_voro
2615 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
2616 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
2618 rho_total, rho_total_rspace, udvol, &
2620 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2621 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
2622 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
2623 REAL(kind=
dp),
DIMENSION(3) :: checksum_hr, dr
2624 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
2629 TYPE(cp_section_key) :: e_density_section
2631 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_s, matrix_vxc, rho_ao
2637 POINTER :: sab_orb, sap_ppnl
2641 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
2648 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2656 print_key, print_key_bqb, &
2657 print_key_voro, xc_section
2659 CALL timeset(routinen, handle)
2660 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
2661 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
2662 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
2663 vee, matrix_hr, matrix_s, sab_orb, sap_ppnl)
2668 cpassert(
ASSOCIATED(qs_env))
2670 atomic_kind_set=atomic_kind_set, &
2671 qs_kind_set=qs_kind_set, &
2674 particle_set=particle_set, &
2676 para_env=para_env, &
2677 dft_control=dft_control, &
2679 do_kpoints=do_kpoints, &
2681 matrix_s_kp=matrix_s, &
2694 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
2695 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
2697 my_pos_cube =
"REWIND"
2698 IF (append_cube)
THEN
2699 my_pos_cube =
"APPEND"
2702 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
2703 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
2704 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2706 CALL auxbas_pw_pool%create_pw(wf_r)
2707 IF (dft_control%qs_control%gapw)
THEN
2708 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
2709 CALL pw_axpy(rho_core, rho0_s_gs)
2710 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2711 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2714 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
2715 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2716 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2719 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2720 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2723 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2724 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2730 DO ispin = 1, dft_control%nspins
2731 CALL pw_axpy(rho_r(ispin), wf_r)
2733 filename =
"TOTAL_DENSITY"
2736 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2737 log_filename=.false., mpi_io=mpi_io)
2739 particles=particles, zeff=zcharge, &
2741 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%TOT_DENSITY_CUBE%MAX_FILE_SIZE_MB"), &
2744 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2745 CALL auxbas_pw_pool%give_back_pw(wf_r)
2748 e_density_section = cube_or_openpmd(input, str_e_density_cubes, str_e_density_openpmd, logger)
2751 IF (e_density_section%do_output)
THEN
2753 keyword_name=e_density_section%concat_to_relative(
"%DENSITY_INCLUDE"), &
2754 c_val=print_density)
2755 print_density = trim(print_density)
2757 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2758 append_cube =
section_get_lval(input, e_density_section%concat_to_absolute(
"%APPEND"))
2760 my_pos_cube =
"REWIND"
2761 IF (append_cube)
THEN
2762 my_pos_cube =
"APPEND"
2766 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2767 xrd_interface =
section_get_lval(input, e_density_section%concat_to_absolute(
"%XRD_INTERFACE"))
2770 xrd_interface = .false.
2773 IF (xrd_interface)
THEN
2775 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2777 filename =
"ELECTRON_DENSITY"
2779 extension=
".xrd", middle_name=trim(filename), &
2780 file_position=my_pos_cube, log_filename=.false.)
2781 ngto =
section_get_ival(input, e_density_section%concat_to_absolute(
"%NGAUSS"))
2782 IF (output_unit > 0)
THEN
2783 INQUIRE (unit=unit_nr, name=filename)
2784 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2785 "The electron density (atomic part) is written to the file:", &
2790 nkind =
SIZE(atomic_kind_set)
2791 IF (unit_nr > 0)
THEN
2792 WRITE (unit_nr, *)
"Atomic (core) densities"
2793 WRITE (unit_nr, *)
"Unit cell"
2794 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2795 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2796 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2797 WRITE (unit_nr, *)
"Atomic types"
2798 WRITE (unit_nr, *) nkind
2801 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2803 atomic_kind => atomic_kind_set(ikind)
2804 qs_kind => qs_kind_set(ikind)
2805 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2807 iunit=output_unit, confine=.true.)
2809 iunit=output_unit, allelectron=.true., confine=.true.)
2810 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2811 ccdens(:, 2, ikind) = 0._dp
2812 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2813 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2814 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2815 IF (unit_nr > 0)
THEN
2816 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2817 WRITE (unit_nr, fmt=
"(I6)") ngto
2818 WRITE (unit_nr, *)
" Total density"
2819 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2820 WRITE (unit_nr, *)
" Core density"
2821 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2823 NULLIFY (atomic_kind)
2826 IF (dft_control%qs_control%gapw)
THEN
2827 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2829 IF (unit_nr > 0)
THEN
2830 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2832 np = particles%n_els
2834 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2835 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2836 rho_atom => rho_atom_set(iat)
2837 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2838 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2839 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2844 CALL para_env%sum(nr)
2845 CALL para_env%sum(niso)
2847 ALLOCATE (bfun(nr, niso))
2849 DO ispin = 1, dft_control%nspins
2850 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2851 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2854 CALL para_env%sum(bfun)
2855 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2856 ccdens(:, 2, ikind) = 0._dp
2857 IF (unit_nr > 0)
THEN
2858 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2862 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2863 IF (unit_nr > 0)
THEN
2864 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2865 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2871 IF (unit_nr > 0)
THEN
2872 WRITE (unit_nr, *)
"Coordinates"
2873 np = particles%n_els
2875 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2876 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2881 DEALLOCATE (ppdens, aedens, ccdens)
2884 e_density_section%absolute_section_key)
2887 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2889 cpassert(.NOT. do_kpoints)
2894 auxbas_pw_pool=auxbas_pw_pool, &
2896 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2898 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2903 q_max = sqrt(sum((
pi/dr(:))**2))
2905 auxbas_pw_pool=auxbas_pw_pool, &
2906 rhotot_elec_gspace=rho_elec_gspace, &
2908 rho_hard=rho_hard, &
2910 rho_total = rho_hard + rho_soft
2915 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2917 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2919 filename =
"TOTAL_ELECTRON_DENSITY"
2921 unit_nr = e_density_section%print_key_unit_nr( &
2924 e_density_section%absolute_section_key, &
2925 extension=
".cube", &
2926 middle_name=trim(filename), &
2927 file_position=my_pos_cube, &
2928 log_filename=.false., &
2930 fout=mpi_filename, &
2931 openpmd_basename=
"dft-total-electron-density", &
2932 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2933 openpmd_unit_si=openpmd_unit_si_density, &
2934 sim_time=qs_env%sim_time)
2935 IF (output_unit > 0)
THEN
2936 IF (.NOT. mpi_io)
THEN
2937 INQUIRE (unit=unit_nr, name=filename)
2939 filename = mpi_filename
2941 CALL print_density_output_message(output_unit,
"The total electron density", &
2942 e_density_section, filename)
2943 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2944 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2945 "Soft electronic charge (G-space) :", rho_soft, &
2946 "Hard electronic charge (G-space) :", rho_hard, &
2947 "Total electronic charge (G-space):", rho_total, &
2948 "Total electronic charge (R-space):", rho_total_rspace
2950 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2951 particles=particles, zeff=zcharge, &
2952 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2953 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2954 e_density_section%absolute_section_key, mpi_io=mpi_io)
2956 IF (dft_control%nspins > 1)
THEN
2960 auxbas_pw_pool=auxbas_pw_pool, &
2961 rhotot_elec_gspace=rho_elec_gspace, &
2963 rho_hard=rho_hard, &
2964 rho_soft=rho_soft, &
2966 rho_total = rho_hard + rho_soft
2970 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2972 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2974 filename =
"TOTAL_SPIN_DENSITY"
2976 unit_nr = e_density_section%print_key_unit_nr( &
2979 e_density_section%absolute_section_key, &
2980 extension=
".cube", &
2981 middle_name=trim(filename), &
2982 file_position=my_pos_cube, &
2983 log_filename=.false., &
2985 fout=mpi_filename, &
2986 openpmd_basename=
"dft-total-spin-density", &
2987 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2988 openpmd_unit_si=openpmd_unit_si_density, &
2989 sim_time=qs_env%sim_time)
2990 IF (output_unit > 0)
THEN
2991 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2992 INQUIRE (unit=unit_nr, name=filename)
2994 filename = mpi_filename
2996 CALL print_density_output_message(output_unit,
"The total spin density", &
2997 e_density_section, filename)
2998 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2999 "q(max) [1/Angstrom] :", q_max/
angstrom, &
3000 "Soft part of the spin density (G-space):", rho_soft, &
3001 "Hard part of the spin density (G-space):", rho_hard, &
3002 "Total spin density (G-space) :", rho_total, &
3003 "Total spin density (R-space) :", rho_total_rspace
3005 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
3006 particles=particles, zeff=zcharge, &
3007 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3008 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3009 e_density_section%absolute_section_key, mpi_io=mpi_io)
3011 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
3012 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3014 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
3015 IF (dft_control%nspins > 1)
THEN
3019 auxbas_pw_pool=auxbas_pw_pool, &
3021 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
3022 CALL pw_copy(rho_r(1), rho_elec_rspace)
3023 CALL pw_axpy(rho_r(2), rho_elec_rspace)
3024 filename =
"ELECTRON_DENSITY"
3026 unit_nr = e_density_section%print_key_unit_nr( &
3029 e_density_section%absolute_section_key, &
3030 extension=
".cube", &
3031 middle_name=trim(filename), &
3032 file_position=my_pos_cube, &
3033 log_filename=.false., &
3035 fout=mpi_filename, &
3036 openpmd_basename=
"dft-electron-density", &
3037 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3038 openpmd_unit_si=openpmd_unit_si_density, &
3039 sim_time=qs_env%sim_time)
3040 IF (output_unit > 0)
THEN
3041 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3042 INQUIRE (unit=unit_nr, name=filename)
3044 filename = mpi_filename
3046 CALL print_density_output_message(output_unit,
"The sum of alpha and beta density", &
3047 e_density_section, filename)
3049 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
3050 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3052 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3053 e_density_section%absolute_section_key, mpi_io=mpi_io)
3054 CALL pw_copy(rho_r(1), rho_elec_rspace)
3055 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3056 filename =
"SPIN_DENSITY"
3058 unit_nr = e_density_section%print_key_unit_nr( &
3061 e_density_section%absolute_section_key, &
3062 extension=
".cube", &
3063 middle_name=trim(filename), &
3064 file_position=my_pos_cube, &
3065 log_filename=.false., &
3067 fout=mpi_filename, &
3068 openpmd_basename=
"dft-spin-density", &
3069 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3070 openpmd_unit_si=openpmd_unit_si_density, &
3071 sim_time=qs_env%sim_time)
3072 IF (output_unit > 0)
THEN
3073 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3074 INQUIRE (unit=unit_nr, name=filename)
3076 filename = mpi_filename
3078 CALL print_density_output_message(output_unit,
"The spin density", &
3079 e_density_section, filename)
3081 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3082 particles=particles, zeff=zcharge, &
3083 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3084 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3085 e_density_section%absolute_section_key, mpi_io=mpi_io)
3086 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3088 filename =
"ELECTRON_DENSITY"
3090 unit_nr = e_density_section%print_key_unit_nr( &
3093 e_density_section%absolute_section_key, &
3094 extension=
".cube", &
3095 middle_name=trim(filename), &
3096 file_position=my_pos_cube, &
3097 log_filename=.false., &
3099 fout=mpi_filename, &
3100 openpmd_basename=
"dft-electron-density", &
3101 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3102 openpmd_unit_si=openpmd_unit_si_density, &
3103 sim_time=qs_env%sim_time)
3104 IF (output_unit > 0)
THEN
3105 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3106 INQUIRE (unit=unit_nr, name=filename)
3108 filename = mpi_filename
3110 CALL print_density_output_message(output_unit,
"The electron density", &
3111 e_density_section, filename)
3113 CALL e_density_section%write_pw(rho_r(1), unit_nr,
"ELECTRON DENSITY", &
3114 particles=particles, zeff=zcharge, &
3115 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3116 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3117 e_density_section%absolute_section_key, mpi_io=mpi_io)
3120 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
3121 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
3122 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
3123 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
3126 ALLOCATE (my_q0(natom))
3134 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
3138 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3142 DO ispin = 1, dft_control%nspins
3143 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
3147 rho_total_rspace = rho_soft + rho_hard
3149 filename =
"ELECTRON_DENSITY"
3151 unit_nr = e_density_section%print_key_unit_nr( &
3154 e_density_section%absolute_section_key, &
3155 extension=
".cube", &
3156 middle_name=trim(filename), &
3157 file_position=my_pos_cube, &
3158 log_filename=.false., &
3160 fout=mpi_filename, &
3161 openpmd_basename=
"dft-electron-density", &
3162 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3163 openpmd_unit_si=openpmd_unit_si_density, &
3164 sim_time=qs_env%sim_time)
3165 IF (output_unit > 0)
THEN
3166 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3167 INQUIRE (unit=unit_nr, name=filename)
3169 filename = mpi_filename
3171 CALL print_density_output_message(output_unit,
"The electron density", &
3172 e_density_section, filename)
3173 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3174 "Soft electronic charge (R-space) :", rho_soft, &
3175 "Hard electronic charge (R-space) :", rho_hard, &
3176 "Total electronic charge (R-space):", rho_total_rspace
3178 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
3179 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3181 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3182 e_density_section%absolute_section_key, mpi_io=mpi_io)
3185 IF (dft_control%nspins > 1)
THEN
3187 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
3190 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3193 CALL pw_axpy(rho_r(1), rho_elec_rspace)
3194 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3198 rho_total_rspace = rho_soft + rho_hard
3200 filename =
"SPIN_DENSITY"
3202 unit_nr = e_density_section%print_key_unit_nr( &
3205 e_density_section%absolute_section_key, &
3206 extension=
".cube", &
3207 middle_name=trim(filename), &
3208 file_position=my_pos_cube, &
3209 log_filename=.false., &
3211 fout=mpi_filename, &
3212 openpmd_basename=
"dft-spin-density", &
3213 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3214 openpmd_unit_si=openpmd_unit_si_density, &
3215 sim_time=qs_env%sim_time)
3216 IF (output_unit > 0)
THEN
3217 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3218 INQUIRE (unit=unit_nr, name=filename)
3220 filename = mpi_filename
3222 CALL print_density_output_message(output_unit,
"The spin density", &
3223 e_density_section, filename)
3224 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3225 "Soft part of the spin density :", rho_soft, &
3226 "Hard part of the spin density :", rho_hard, &
3227 "Total spin density (R-space) :", rho_total_rspace
3229 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3230 particles=particles, zeff=zcharge, &
3231 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3232 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3233 e_density_section%absolute_section_key, mpi_io=mpi_io)
3235 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3241 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
3247 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
3251 v_hartree_rspace=v_hartree_rspace)
3252 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3253 CALL auxbas_pw_pool%create_pw(aux_r)
3256 my_pos_cube =
"REWIND"
3257 IF (append_cube)
THEN
3258 my_pos_cube =
"APPEND"
3261 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3264 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
3265 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3267 CALL pw_copy(v_hartree_rspace, aux_r)
3270 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
3272 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%V_HARTREE_CUBE%MAX_FILE_SIZE_MB"), &
3275 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
3277 CALL auxbas_pw_pool%give_back_pw(aux_r)
3282 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
3283 IF (dft_control%apply_external_potential)
THEN
3284 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
3285 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3286 CALL auxbas_pw_pool%create_pw(aux_r)
3288 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
3289 my_pos_cube =
"REWIND"
3290 IF (append_cube)
THEN
3291 my_pos_cube =
"APPEND"
3296 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
3300 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
3301 stride=
section_get_ivals(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), &
3302 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%MAX_FILE_SIZE_MB"), &
3305 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
3307 CALL auxbas_pw_pool%give_back_pw(aux_r)
3313 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
3315 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3316 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3317 CALL auxbas_pw_pool%create_pw(aux_r)
3318 CALL auxbas_pw_pool%create_pw(aux_g)
3321 my_pos_cube =
"REWIND"
3322 IF (append_cube)
THEN
3323 my_pos_cube =
"APPEND"
3325 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
3326 v_hartree_rspace=v_hartree_rspace)
3328 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3332 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
3342 CALL cp_pw_to_cube(aux_r, unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
3344 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EFIELD_CUBE%MAX_FILE_SIZE_MB"), &
3347 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
3350 CALL auxbas_pw_pool%give_back_pw(aux_r)
3351 CALL auxbas_pw_pool%give_back_pw(aux_g)
3355 CALL qs_scf_post_local_energy(input, logger, qs_env)
3358 CALL qs_scf_post_local_stress(input, logger, qs_env)
3361 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
3375 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
3380 after = min(max(after, 1), 16)
3381 DO ispin = 1, dft_control%nspins
3382 DO img = 1, dft_control%nimages
3384 para_env, output_unit=iw, omit_headers=omit_headers)
3388 "DFT%PRINT%AO_MATRICES/DENSITY")
3393 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
3395 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
3397 IF (write_ks .OR. write_xc)
THEN
3398 IF (write_xc) qs_env%requires_matrix_vxc = .true.
3401 just_energy=.false.)
3402 IF (write_xc) qs_env%requires_matrix_vxc = .false.
3409 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
3411 after = min(max(after, 1), 16)
3412 DO ispin = 1, dft_control%nspins
3413 DO img = 1, dft_control%nimages
3415 para_env, output_unit=iw, omit_headers=omit_headers)
3419 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
3424 IF (.NOT. dft_control%qs_control%pao)
THEN
3432 CALL write_adjacency_matrix(qs_env, input)
3436 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
3437 cpassert(
ASSOCIATED(matrix_vxc))
3441 after = min(max(after, 1), 16)
3442 DO ispin = 1, dft_control%nspins
3443 DO img = 1, dft_control%nimages
3445 para_env, output_unit=iw, omit_headers=omit_headers)
3449 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
3454 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
3461 ALLOCATE (matrix_hr(img)%matrix)
3462 CALL dbcsr_create(matrix_hr(img)%matrix, template=matrix_s(1, 1)%matrix, &
3463 name=
"COMMUTATOR", matrix_type=dbcsr_type_antisymmetric)
3465 CALL dbcsr_set(matrix_hr(img)%matrix, 0._dp)
3468 CALL build_com_mom_nl(qs_kind_set, sab_orb, sap_ppnl, dft_control%qs_control%eps_ppnl, &
3469 particle_set, cell, matrix_rv=matrix_hr)
3472 CALL dbcsr_scale(matrix_hr(img)%matrix, alpha_scalar=-1._dp)
3475 IF (output_unit > 0)
THEN
3476 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum X =', checksum_hr(1)
3477 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Y =', checksum_hr(2)
3478 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Z =', checksum_hr(3)
3480 after = min(max(after, 1), 16)
3483 para_env, output_unit=iw, omit_headers=omit_headers)
3487 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
3493 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
3496 IF (print_it) print_level = 2
3498 IF (print_it) print_level = 3
3509 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3510 IF (rho_r_valid)
THEN
3511 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
3512 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
3520 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
3522 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
3530 should_print_voro = 1
3532 should_print_voro = 0
3535 should_print_bqb = 1
3537 should_print_bqb = 0
3539 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3544 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3545 IF (rho_r_valid)
THEN
3547 IF (dft_control%nspins > 1)
THEN
3551 auxbas_pw_pool=auxbas_pw_pool, &
3555 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
3556 CALL pw_copy(rho_r(1), mb_rho)
3557 CALL pw_axpy(rho_r(2), mb_rho)
3564 IF (should_print_voro /= 0)
THEN
3566 IF (voro_print_txt)
THEN
3568 my_pos_voro =
"REWIND"
3569 IF (append_voro)
THEN
3570 my_pos_voro =
"APPEND"
3572 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
3573 file_position=my_pos_voro, log_filename=.false.)
3581 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3582 unit_nr_voro, qs_env, mb_rho)
3584 IF (dft_control%nspins > 1)
THEN
3585 CALL auxbas_pw_pool%give_back_pw(mb_rho)
3589 IF (unit_nr_voro > 0)
THEN
3599 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
3607 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
3615 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
3617 IF (particle_set(1)%fragment_index /= 0) iao_env%do_fragments = .true.
3618 IF (iao_env%do_iao)
THEN
3628 extension=
".mao", log_filename=.false.)
3639 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
3643 DEALLOCATE (zcharge)
3645 CALL timestop(handle)
3655 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
3658 INTEGER,
INTENT(IN) :: unit_nr
3660 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
3661 radius_type, refc, shapef
3662 INTEGER,
DIMENSION(:),
POINTER :: atom_list
3663 LOGICAL :: do_radius, do_sc, paw_atom
3664 REAL(kind=
dp) :: zeff
3665 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
3666 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
3669 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
3675 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3679 NULLIFY (hirshfeld_env)
3683 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
3684 ALLOCATE (hirshfeld_env%charges(natom))
3693 IF (.NOT.
SIZE(radii) == nkind)
THEN
3694 CALL cp_abort(__location__, &
3695 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
3696 "match number of atomic kinds in the input coordinate file.")
3702 iterative=do_sc, ref_charge=refc, &
3703 radius_type=radius_type)
3705 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
3711 nspin =
SIZE(matrix_p, 1)
3712 ALLOCATE (charges(natom, nspin))
3717 atomic_kind => atomic_kind_set(ikind)
3719 DO iat = 1,
SIZE(atom_list)
3721 hirshfeld_env%charges(i) = zeff
3725 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
3728 hirshfeld_env%charges(iat) = sum(charges(iat, :))
3731 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
3735 IF (hirshfeld_env%iterative)
THEN
3742 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
3743 IF (dft_control%qs_control%gapw)
THEN
3745 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
3748 atomic_kind => particle_set(iat)%atomic_kind
3750 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
3752 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
3757 IF (unit_nr > 0)
THEN
3759 qs_kind_set, unit_nr)
3765 DEALLOCATE (charges)
3767 END SUBROUTINE hirshfeld_charges
3777 SUBROUTINE project_function_a(ca, a, cb, b, l)
3779 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3780 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
3781 INTEGER,
INTENT(IN) :: l
3784 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3785 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
3788 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
3792 v(:, 1) = matmul(tmat, cb)
3793 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3797 DEALLOCATE (smat, tmat, v, ipiv)
3799 END SUBROUTINE project_function_a
3809 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
3811 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3812 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
3814 INTEGER,
INTENT(IN) :: l
3816 INTEGER :: i, info, n, nr
3817 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3818 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
3819 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
3823 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3827 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3828 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3830 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3834 DEALLOCATE (smat, v, ipiv, afun)
3836 END SUBROUTINE project_function_b
3847 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3852 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3854 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3855 INTEGER :: handle, io_unit, natom, unit_nr
3856 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3857 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
3866 CALL timeset(routinen, handle)
3869 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3871 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3872 gapw = dft_control%qs_control%gapw
3873 gapw_xc = dft_control%qs_control%gapw_xc
3874 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3876 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3877 CALL auxbas_pw_pool%create_pw(eden)
3882 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3883 IF (append_cube)
THEN
3884 my_pos_cube =
"APPEND"
3886 my_pos_cube =
"REWIND"
3890 extension=
".cube", middle_name=
"local_energy", &
3891 file_position=my_pos_cube, mpi_io=mpi_io)
3892 CALL cp_pw_to_cube(eden, unit_nr,
"LOCAL ENERGY", particles=particles, zeff=zcharge, &
3894 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_ENERGY_CUBE%MAX_FILE_SIZE_MB"), &
3896 IF (io_unit > 0)
THEN
3897 INQUIRE (unit=unit_nr, name=filename)
3898 IF (gapw .OR. gapw_xc)
THEN
3899 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3900 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3902 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3903 "The local energy is written to the file: ", trim(adjustl(filename))
3907 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3909 CALL auxbas_pw_pool%give_back_pw(eden)
3910 DEALLOCATE (zcharge)
3912 CALL timestop(handle)
3914 END SUBROUTINE qs_scf_post_local_energy
3925 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3930 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3932 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3933 INTEGER :: handle, io_unit, natom, unit_nr
3934 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3935 REAL(kind=
dp) :: beta
3936 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
3945 CALL timeset(routinen, handle)
3948 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3949 CALL cp_warn(__location__, &
3950 "LOCAL_STRESS_CUBE uses the existing experimental local stress implementation")
3952 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3953 gapw = dft_control%qs_control%gapw
3954 gapw_xc = dft_control%qs_control%gapw_xc
3955 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3957 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3958 CALL auxbas_pw_pool%create_pw(stress)
3965 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3966 IF (append_cube)
THEN
3967 my_pos_cube =
"APPEND"
3969 my_pos_cube =
"REWIND"
3973 extension=
".cube", middle_name=
"local_stress", &
3974 file_position=my_pos_cube, mpi_io=mpi_io)
3975 CALL cp_pw_to_cube(stress, unit_nr,
"LOCAL STRESS", particles=particles, zeff=zcharge, &
3977 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_STRESS_CUBE%MAX_FILE_SIZE_MB"), &
3979 IF (io_unit > 0)
THEN
3980 INQUIRE (unit=unit_nr, name=filename)
3981 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3982 IF (gapw .OR. gapw_xc)
THEN
3983 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3984 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3986 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3987 "The local stress is written to the file: ", trim(adjustl(filename))
3991 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3993 CALL auxbas_pw_pool%give_back_pw(stress)
3994 DEALLOCATE (zcharge)
3997 CALL timestop(handle)
3999 END SUBROUTINE qs_scf_post_local_stress
4010 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
4015 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
4017 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
4018 INTEGER :: boundary_condition, handle, i, j, &
4019 n_cstr, n_tiles, unit_nr
4020 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
4021 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
4022 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
4032 CALL timeset(routinen, handle)
4034 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
4037 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
4039 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
4041 has_implicit_ps = .false.
4042 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
4047 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
4048 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
4050 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
4051 my_pos_cube =
"REWIND"
4052 IF (append_cube)
THEN
4053 my_pos_cube =
"APPEND"
4057 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
4059 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4060 CALL auxbas_pw_pool%create_pw(aux_r)
4062 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4063 SELECT CASE (boundary_condition)
4065 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
4067 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4068 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4069 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4070 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4071 poisson_env%implicit_env%dielectric%eps, aux_r)
4074 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, zeff=zcharge, &
4075 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
4076 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%MAX_FILE_SIZE_MB"), &
4079 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
4081 CALL auxbas_pw_pool%give_back_pw(aux_r)
4086 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
4088 has_dirichlet_bc = .false.
4089 IF (has_implicit_ps)
THEN
4090 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4092 has_dirichlet_bc = .true.
4096 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
4099 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
4100 my_pos_cube =
"REWIND"
4101 IF (append_cube)
THEN
4102 my_pos_cube =
"APPEND"
4106 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
4107 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
4109 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4110 CALL auxbas_pw_pool%create_pw(aux_r)
4112 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4113 SELECT CASE (boundary_condition)
4115 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
4117 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4118 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4119 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4120 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4121 poisson_env%implicit_env%cstr_charge, aux_r)
4124 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, zeff=zcharge, &
4125 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
4126 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%MAX_FILE_SIZE_MB"), &
4129 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
4131 CALL auxbas_pw_pool%give_back_pw(aux_r)
4136 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
4137 has_dirichlet_bc = .false.
4138 IF (has_implicit_ps)
THEN
4139 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4141 has_dirichlet_bc = .true.
4145 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
4147 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
4148 my_pos_cube =
"REWIND"
4149 IF (append_cube)
THEN
4150 my_pos_cube =
"APPEND"
4152 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
4154 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4155 CALL auxbas_pw_pool%create_pw(aux_r)
4158 IF (tile_cubes)
THEN
4160 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4162 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4164 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
4167 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4168 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
4171 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
4173 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, zeff=zcharge, &
4174 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4175 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4178 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4183 NULLIFY (dirichlet_tile)
4184 ALLOCATE (dirichlet_tile)
4185 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
4188 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4189 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
4192 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4194 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4196 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
4197 CALL pw_axpy(dirichlet_tile, aux_r)
4201 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, zeff=zcharge, &
4202 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4203 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4206 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4207 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
4208 DEALLOCATE (dirichlet_tile)
4211 CALL auxbas_pw_pool%give_back_pw(aux_r)
4214 CALL timestop(handle)
4216 END SUBROUTINE qs_scf_post_ps_implicit
4224 SUBROUTINE write_adjacency_matrix(qs_env, input)
4228 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
4230 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
4231 ind, jatom, jkind, k, natom, nkind, &
4232 output_unit, rowind, unit_nr
4233 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
4234 LOGICAL :: do_adjm_write, do_symmetric
4240 DIMENSION(:),
POINTER :: nl_iterator
4243 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
4246 CALL timeset(routinen, handle)
4248 NULLIFY (dft_section)
4257 IF (do_adjm_write)
THEN
4258 NULLIFY (qs_kind_set, nl_iterator)
4259 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
4261 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
4263 nkind =
SIZE(qs_kind_set)
4264 cpassert(
SIZE(nl) > 0)
4266 cpassert(do_symmetric)
4267 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
4271 adjm_size = ((natom + 1)*natom)/2
4272 ALLOCATE (interact_adjm(4*adjm_size))
4275 NULLIFY (nl_iterator)
4279 ikind=ikind, jkind=jkind, &
4280 iatom=iatom, jatom=jatom)
4282 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
4283 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
4284 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
4285 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
4288 IF (iatom <= jatom)
THEN
4295 ikind = ikind + jkind
4296 jkind = ikind - jkind
4297 ikind = ikind - jkind
4301 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
4304 interact_adjm((ind - 1)*4 + 1) = rowind
4305 interact_adjm((ind - 1)*4 + 2) = colind
4306 interact_adjm((ind - 1)*4 + 3) = ikind
4307 interact_adjm((ind - 1)*4 + 4) = jkind
4310 CALL para_env%sum(interact_adjm)
4313 extension=
".adjmat", file_form=
"FORMATTED", &
4314 file_status=
"REPLACE")
4315 IF (unit_nr > 0)
THEN
4316 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
4317 DO k = 1, 4*adjm_size, 4
4319 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
4320 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
4328 DEALLOCATE (basis_set_list_a, basis_set_list_b)
4331 CALL timestop(handle)
4333 END SUBROUTINE write_adjacency_matrix
4341 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
4345 LOGICAL :: use_virial
4355 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
4356 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
4357 rho_core=rho_core, virial=virial, &
4358 v_hartree_rspace=v_hartree_rspace)
4360 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
4362 IF (.NOT. use_virial)
THEN
4364 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
4365 poisson_env=poisson_env)
4366 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
4367 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
4371 v_hartree_gspace, rho_core=rho_core)
4373 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
4374 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
4376 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
4377 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
4380 END SUBROUTINE update_hartree_with_mp2
static double norm_factor(double alpha, int L)
Types and set/get functions for auxiliary density matrix methods.
Contains methods used in the context of density fitting.
subroutine, public admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public sg_overlap(smat, l, pa, pb)
...
calculate the orbitals for a given atomic kind type
subroutine, public calculate_atomic_density(density, atomic_kind, qs_kind, ngto, iunit, optbasis, allelectron, confine)
...
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Writer for CASINO gwfn.data files.
subroutine, public write_casino(qs_env, casino_section)
Write a CASINO gwfn.data file from the converged GPW/GAPW wavefunction.
Handles all functions related to the CELL.
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, cell, matrix_rv, matrix_rxrv, matrix_rrv, matrix_rvr, matrix_rrv_vrr, matrix_r_rxvr, matrix_rxvr_r, matrix_r_doublecom, pseudoatom, ref_point)
Calculate [r,Vnl] (matrix_rv), r x [r,Vnl] (matrix_rxrv) or [rr,Vnl] (matrix_rrv) in AO basis....
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm, plan, check_plan)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers, cartesian_basis)
...
Density Derived atomic point charges from a QM calculation (see Bloechl, J. Chem. Phys....
recursive subroutine, public get_ddapc(qs_env, calc_force, density_fit_section, density_type, qout1, qout2, out_radii, dq_out, ext_rho_tot_g, itype_of_density, iwc)
Computes the Density Derived Atomic Point Charges.
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
subroutine, public cp_openpmd_close_iterations()
integer function, public cp_openpmd_print_key_unit_nr(logger, basis_section, print_key_path, middle_name, ignore_should_output, mpi_io, fout, openpmd_basename, openpmd_unit_dimension, openpmd_unit_si, sim_time)
...
subroutine, public cp_openpmd_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, mpi_io)
should be called after you finish working with a unit obtained with cp_openpmd_print_key_unit_nr,...
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
character(len=default_string_length) function, public cp_iter_string(iter_info, print_key, for_file)
returns the iteration string, a string that is useful to create unique filenames (once you trim it)
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, unit_str)
Calculates multipole moments per molecule from the Kim-Gordon AO density matrix.
Calculate MAO's and analyze wavefunctions.
subroutine, public mao_analysis(qs_env, input_section, unit_nr)
...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Utility routines for the memory handling.
Interface to the message passing library MPI.
Calculate localized minimal basis and analyze wavefunctions.
subroutine, public minbas_analysis(qs_env, input_section, unit_nr)
...
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section, cell, unoccupied_orbs, unoccupied_evals, qs_env, calc_energies)
Write out the MOs in molden format for visualisation.
Define the data structure for the molecule information.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii}...
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:, :), allocatable, public indso
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public a_bohr
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
real(kind=dp), parameter, public debye
Provide various population analyses and print the requested output information.
subroutine, public lowdin_population_analysis(qs_env, output_unit, print_level)
Perform a Lowdin population analysis based on a symmetric orthogonalisation of the density matrix usi...
subroutine, public mulliken_population_analysis(qs_env, output_unit, print_level)
Perform a Mulliken population analysis.
computes preconditioners, and implements methods to apply them currently used in qs_ot
Types containing essential information for running implicit (iterative) Poisson solver.
integer, parameter, public neumann_bc
integer, parameter, public mixed_bc
integer, parameter, public mixed_periodic_bc
integer, parameter, public periodic_bc
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
This module defines the grid data type and some basic operations on it.
subroutine, public get_pw_grid_info(pw_grid, id_nr, mode, vol, dvol, npts, ngpts, ngpts_cut, dr, cutoff, orthorhombic, gvectors, gsquare)
Access to information stored in the pw_grid_type.
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_implicit
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Write wfx file, works as interface to chargemol and multiwfn.
subroutine, public write_wfx(qs_env, dft_section)
...
container for information about total charges on the grids
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
Calculation of the energies concerning the core charge distribution.
Utilities for broadened DOS and PDOS output.
subroutine, public get_dos_pdos_flags(dos_section, do_dos_output, do_projected_dos, do_pdos, do_curve)
Resolve projected-DOS requests from a DOS print section.
Calculation and writing of density of states.
subroutine, public calculate_dos_kp(qs_env, dft_section, write_curve_output)
Compute and write density of states (kpoints).
subroutine, public calculate_dos(mos, dft_section, unoccupied_evals, smearing_enabled, write_curve_output)
Compute and write density of states.
Calculates electric field gradients H.M. Petrili, P.E. Blochl, P. Blaha, K. Schwarz,...
subroutine, public qs_efg_calc(qs_env)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public qs_elf_calc(qs_env, elf_r, rho_cutoff)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public energy_windows(qs_env)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Calculates hyperfine values.
subroutine, public qs_epr_hyp_calc(qs_env)
...
Fractional occupation number weighted density (Grimme and Hansen).
subroutine, public qs_scf_post_fod(input, logger, qs_env, output_unit)
Print the orbital FOD sum and, optionally, its real-space density.
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Finite-volume Kubo-Greenwood transport from converged Quickstep matrices.
subroutine, public qs_scf_post_kubo_transport(qs_env)
Compute and print the finite-volume Kubo-Greenwood conductivity tensor.
subroutine, public loc_dipole(input, dft_control, qs_loc_env, logger, qs_env)
Computes and prints the Dipole (using localized charges).
subroutine, public get_localization_info(qs_env, qs_loc_env, loc_section, mo_local, wf_r, wf_g, particles, coeff, evals, marked_states)
Performs localization of the orbitals.
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public qs_loc_env_release(qs_loc_env)
...
subroutine, public qs_loc_env_create(qs_loc_env)
...
Some utilities for the construction of the localization environment.
subroutine, public loc_write_restart(qs_loc_env, section, mo_array, coeff_localized, do_homo, evals, do_mixed)
...
subroutine, public qs_loc_env_init(qs_loc_env, localized_wfn_control, qs_env, myspin, do_localize, loc_coeff, mo_loc_history)
allocates the data, and initializes the operators
subroutine, public qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_mixed, do_xas, nloc_xas, spin_xas)
initializes everything needed for localization of the HOMOs
subroutine, public retain_history(mo_loc_history, mo_loc)
copy old mos to new ones, allocating as necessary
subroutine, public qs_loc_init(qs_env, qs_loc_env, localize_section, mos_localized, do_homo, do_mo_cubes, mo_loc_history, evals, tot_zeff_corr, do_mixed)
initializes everything needed for localization of the molecular orbitals
Routines for calculating local energy and stress tensor.
subroutine, public qs_local_stress(qs_env, stress_tensor, beta)
Routine to calculate the local stress.
subroutine, public qs_local_energy(qs_env, energy_density)
Routine to calculate the local energy.
Definition and initialisation of the mo data type.
subroutine, public write_dm_binary_restart(mo_array, dft_section, tmpl_matrix)
calculates density matrix from mo set and writes the density matrix into a binary restart file
collects routines that perform operations directly related to MOs
subroutine, public make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env, hairy_probes, probe)
Calculate KS eigenvalues starting from OF MOS.
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count, cmo_coeff)
Get the components of a MO set data structure.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>.
subroutine, public qs_moment_kpoints(qs_env, nmoments, reference, ref_point, max_nmo, unit_number, do_soc, unit_str, dip_file, bc_file)
Calculate and print dipole moment elements d_nm(k) = i<u_n|∇_k|u_m> for k-point calculations.
subroutine, public qs_moment_berry_phase(qs_env, magnetic, nmoments, reference, ref_point, unit_number, unit_str)
...
subroutine, public qs_moment_locop(qs_env, magnetic, nmoments, reference, ref_point, unit_number, vel_reprs, com_nl, unit_str)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
subroutine, public build_lin_mom_matrix(qs_env, matrix, minimum_image)
Calculation of the linear momentum matrix <mu|∂|nu> over Cartesian Gaussian functions.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
Calculation and writing of projected density of states The DOS is computed per angular momentum and p...
subroutine, public calculate_projected_dos_kp(qs_env, dft_section, pdos_print_key, write_pdos, write_pdos_curve)
Compute and write broadened projected density of states for k-point calculations.
subroutine, public calculate_projected_dos(mo_set, atomic_kind_set, qs_kind_set, particle_set, qs_env, dft_section, ispin, xas_mittle, external_matrix_shalf, unoccupied_orbs, unoccupied_evals, pdos_print_key, write_pdos, write_pdos_curve)
Compute and write projected density of states.
Finite or periodic quadratic pseudospectrum analysis after SCF.
subroutine, public qs_scf_post_quadratic(qs_env)
Evaluate scans of quadratic gaps and localized joint approximate eigenstates.
provides a resp fit for gas phase systems
subroutine, public resp_fit(qs_env)
performs resp fit and generates RESP charges
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Functions to print the KS and S matrix in the CSR format to file.
subroutine, public write_s_matrix_csr(qs_env, input)
writing the overlap matrix in csr format into a file
subroutine, public write_ks_matrix_csr(qs_env, input)
writing the KS matrix in csr format into a file
subroutine, public write_p_matrix_csr(qs_env, input)
writing the density matrix in csr format into a file
subroutine, public write_hcore_matrix_csr(qs_env, input)
writing the core Hamiltonian matrix in csr format into a file
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public 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
Post-SCF finite-system spectral localizers and analytic AO position export.
subroutine, public qs_scf_post_localizer(qs_env)
Export finite AO positions and optionally evaluate localizers after SCF.
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Interface to Wannier90 code.
subroutine, public wannier90_interface(input, logger, qs_env)
...
Methods related to (\cal S)^2 (i.e. spin).
subroutine, public compute_s_square_kp(mosin, kpoints, matrix_s, s_square, s_square_ideal)
Compute the expectation value <(\cal S)^2> of the single determinant defined by the spin up (alpha) a...
subroutine, public compute_s_square(mos, matrix_s, s_square, s_square_ideal)
Compute the expectation value <(\cal S)^2> of the single determinant defined by the spin up (alpha) a...
parameters that control an scf iteration
Calculation of STM image as post processing of an electronic structure calculation,...
subroutine, public th_stm_image(qs_env, stm_section, particles, unoccupied_orbs, unoccupied_evals)
Driver for the calculation of STM image, as post processing of a ground-state electronic structure ca...
routines for DFT+NEGF calculations (coupling with the quantum transport code OMEN)
subroutine, public qs_scf_post_transport(qs_env)
post scf calculations for transport
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public write_trexio(qs_env, trexio_section, energy_derivative)
Write a trexio file.
Interface for Voronoi Integration and output of BQB files.
subroutine, public entry_voronoi_or_bqb(do_voro, do_bqb, input_voro, input_bqb, unit_voro, qs_env, rspace_pw)
Does a Voronoi integration of density or stores the density to compressed BQB format.
subroutine, public xray_diffraction_spectrum(qs_env, unit_number, q_max)
Calculate the coherent X-ray diffraction spectrum using the total electronic density in reciprocal sp...
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a pointer to a 1d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains arbitrary information which need to be stored
quantities needed for a Hirshfeld based partitioning of real space
Contains information about kpoints.
stores all the informations relevant to an mpi environment
represent a list of objects
contained for different pw related things
environment for the poisson solver
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Container for information about total charges on the grids.
Provides all information about a quickstep kind.
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...
keeps the density in various representations, keeping track of which ones are valid.