223#include "./base/base_uses.f90"
229 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
236 CHARACTER(len=*),
PARAMETER :: &
237 str_mo_cubes =
"PRINT%MO_CUBES", &
238 str_mo_openpmd =
"PRINT%MO_OPENPMD", &
239 str_elf_cubes =
"PRINT%ELF_CUBE", &
240 str_elf_openpmd =
"PRINT%ELF_OPENPMD", &
241 str_e_density_cubes =
"PRINT%E_DENSITY_CUBE", &
242 str_e_density_openpmd =
"PRINT%E_DENSITY_OPENPMD"
244 INTEGER,
PARAMETER :: grid_output_cubes = 1, grid_output_openpmd = 2
246 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_density = &
247 [-3, 0, 0, 0, 0, 0, 0]
248 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_dimensionless = &
249 [0, 0, 0, 0, 0, 0, 0]
250 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_wavefunction = &
251 [-1.5_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp]
252 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_density =
a_bohr**(-3)
253 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_dimensionless = 1.0_dp
254 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_wavefunction =
a_bohr**(-1.5_dp)
260 CHARACTER(len=default_string_length) :: relative_section_key =
""
261 CHARACTER(len=default_string_length) :: absolute_section_key =
""
262 CHARACTER(len=7) :: format_name =
""
263 INTEGER :: grid_output = -1
264 LOGICAL :: do_output = .false.
267 PROCEDURE,
PUBLIC :: print_key_unit_nr => cp_forward_print_key_unit_nr
269 PROCEDURE,
PUBLIC :: write_pw => cp_forward_write_pw
271 PROCEDURE,
PUBLIC :: print_key_finished_output => cp_forward_print_key_finished_output
273 PROCEDURE,
PUBLIC :: do_openpmd => cp_section_key_do_openpmd
274 PROCEDURE,
PUBLIC :: do_cubes => cp_section_key_do_cubes
275 PROCEDURE,
PUBLIC :: concat_to_relative => cp_section_key_concat_to_relative
277 END TYPE cp_section_key
288 CLASS(cp_section_key),
INTENT(IN) :: self
289 CHARACTER(*),
INTENT(IN) :: extend_by
290 CHARACTER(len=default_string_length) :: res
292 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
293 res = trim(self%absolute_section_key)//trim(extend_by)
295 res = trim(self%absolute_section_key)//
"%"//trim(extend_by)
305 FUNCTION cp_section_key_concat_to_relative(self, extend_by)
RESULT(res)
306 CLASS(cp_section_key),
INTENT(IN) :: self
307 CHARACTER(*),
INTENT(IN) :: extend_by
308 CHARACTER(len=default_string_length) :: res
310 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
311 res = trim(self%relative_section_key)//trim(extend_by)
313 res = trim(self%relative_section_key)//
"%"//trim(extend_by)
315 END FUNCTION cp_section_key_concat_to_relative
322 FUNCTION cp_section_key_do_cubes(self)
RESULT(res)
323 CLASS(cp_section_key) :: self
326 res = self%do_output .AND. self%grid_output == grid_output_cubes
327 END FUNCTION cp_section_key_do_cubes
334 FUNCTION cp_section_key_do_openpmd(self)
RESULT(res)
335 CLASS(cp_section_key) :: self
338 res = self%do_output .AND. self%grid_output == grid_output_openpmd
339 END FUNCTION cp_section_key_do_openpmd
369 FUNCTION cp_forward_print_key_unit_nr( &
378 ignore_should_output, &
389 openpmd_unit_dimension, &
391 sim_time)
RESULT(res)
393 CLASS(cp_section_key),
INTENT(IN) :: self
396 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
397 CHARACTER(len=*),
INTENT(IN) :: extension
398 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
399 LOGICAL,
INTENT(IN),
OPTIONAL :: local, log_filename, ignore_should_output
400 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: file_form, file_position, file_action, &
402 LOGICAL,
INTENT(IN),
OPTIONAL :: do_backup, on_file
403 LOGICAL,
INTENT(OUT),
OPTIONAL :: is_new_file
404 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
405 CHARACTER(len=default_path_length),
INTENT(OUT), &
407 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
408 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
409 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
410 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
413 IF (self%grid_output == grid_output_cubes)
THEN
415 logger, basis_section, print_key_path, extension=extension, &
416 middle_name=middle_name, local=local, log_filename=log_filename, &
417 ignore_should_output=ignore_should_output, file_form=file_form, &
418 file_position=file_position, file_action=file_action, &
419 file_status=file_status, do_backup=do_backup, on_file=on_file, &
420 is_new_file=is_new_file, mpi_io=mpi_io, fout=fout)
426 middle_name=middle_name, &
427 ignore_should_output=ignore_should_output, &
430 openpmd_basename=openpmd_basename, &
431 openpmd_unit_dimension=openpmd_unit_dimension, &
432 openpmd_unit_si=openpmd_unit_si, &
435 END FUNCTION cp_forward_print_key_unit_nr
453 SUBROUTINE cp_forward_write_pw( &
466 CLASS(cp_section_key),
INTENT(IN) :: self
468 INTEGER,
INTENT(IN) :: unit_nr
469 CHARACTER(*),
INTENT(IN),
OPTIONAL :: title
471 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: stride
472 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: max_file_size_mb
473 LOGICAL,
INTENT(IN),
OPTIONAL :: zero_tails, silent, mpi_io
474 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: zeff
476 IF (self%grid_output == grid_output_cubes)
THEN
477 CALL cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
479 CALL cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
481 END SUBROUTINE cp_forward_write_pw
497 SUBROUTINE cp_forward_print_key_finished_output(self, unit_nr, logger, basis_section, &
498 print_key_path, local, ignore_should_output, on_file, &
500 CLASS(cp_section_key),
INTENT(IN) :: self
501 INTEGER,
INTENT(INOUT) :: unit_nr
504 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
505 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, on_file, &
508 IF (self%grid_output == grid_output_cubes)
THEN
513 END SUBROUTINE cp_forward_print_key_finished_output
533 FUNCTION cube_or_openpmd(input, str_cubes, str_openpmd, logger)
RESULT(res)
535 CHARACTER(len=*),
INTENT(IN) :: str_cubes, str_openpmd
537 TYPE(cp_section_key) :: res
539 LOGICAL :: do_cubes, do_openpmd
542 logger%iter_info, input, &
543 "DFT%"//trim(adjustl(str_cubes))),
cp_p_file)
545 logger%iter_info, input, &
546 "DFT%"//trim(adjustl(str_openpmd))),
cp_p_file)
550 cpassert(.NOT. (do_cubes .AND. do_openpmd))
551 res%do_output = do_cubes .OR. do_openpmd
553 res%grid_output = grid_output_openpmd
554 res%relative_section_key = trim(adjustl(str_openpmd))
555 res%format_name =
"openPMD"
557 res%grid_output = grid_output_cubes
558 res%relative_section_key = trim(adjustl(str_cubes))
559 res%format_name =
"Cube"
561 res%absolute_section_key =
"DFT%"//trim(adjustl(res%relative_section_key))
562 END FUNCTION cube_or_openpmd
570 FUNCTION section_key_do_write(grid_output)
RESULT(res)
571 INTEGER,
INTENT(IN) :: grid_output
572 CHARACTER(len=32) :: res
574 IF (grid_output == grid_output_cubes)
THEN
576 ELSE IF (grid_output == grid_output_openpmd)
THEN
577 res =
"%WRITE_OPENPMD"
579 END FUNCTION section_key_do_write
588 SUBROUTINE print_density_output_message(output_unit, prefix, e_density_section, filename)
589 INTEGER,
INTENT(IN) :: output_unit
590 CHARACTER(len=*),
INTENT(IN) :: prefix
591 TYPE(cp_section_key),
INTENT(IN) :: e_density_section
592 CHARACTER(len=*),
INTENT(IN) :: filename
594 IF (e_density_section%grid_output == grid_output_openpmd)
THEN
595 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
596 trim(prefix)//
" is written in " &
597 //e_density_section%format_name &
598 //
" file format to the file / file pattern:", &
601 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
602 trim(prefix)//
" is written in " &
603 //e_density_section%format_name &
604 //
" file format to the file:", &
607 END SUBROUTINE print_density_output_message
630 CHARACTER(6),
OPTIONAL :: wf_type
631 LOGICAL,
OPTIONAL :: do_mp2
633 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw', &
634 warning_cube_kpoint =
"Print MO cubes not implemented for k-point calculations", &
635 warning_openpmd_kpoint =
"Writing to openPMD not implemented for k-point calculations"
637 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
638 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
639 nlumos, nmo, nspins, output_unit, &
641 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
642 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_stm, &
643 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
644 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
646 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
647 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
650 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
651 unoccupied_evals, unoccupied_evals_stm
652 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
653 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
654 TARGET :: homo_localized, lumo_localized, &
656 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
657 unoccupied_orbs, unoccupied_orbs_stm
660 TYPE(cp_section_key) :: mo_section
661 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
663 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
675 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
684 localize_section, print_key, &
687 CALL timeset(routinen, handle)
694 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
695 IF (
PRESENT(wf_type))
THEN
696 IF (output_unit > 0)
THEN
697 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
698 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
699 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
706 my_localized_wfn = .false.
707 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
708 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
709 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
710 unoccupied_evals_stm, molecule_set, mo_derivs, &
711 subsys, particles, input, print_key, kinetic_m, marked_states, &
712 mixed_evals, qs_loc_env_mixed)
713 NULLIFY (lumo_ptr, rho_ao)
720 p_loc_mixed = .false.
722 cpassert(
ASSOCIATED(scf_env))
723 cpassert(
ASSOCIATED(qs_env))
726 dft_control=dft_control, &
727 molecule_set=molecule_set, &
728 scf_control=scf_control, &
729 do_kpoints=do_kpoints, &
734 particle_set=particle_set, &
735 atomic_kind_set=atomic_kind_set, &
736 qs_kind_set=qs_kind_set)
737 rtp_control => dft_control%rtp_control
744 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
745 DO ispin = 1, dft_control%nspins
746 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
751 CALL update_hartree_with_mp2(rho, qs_env)
754 CALL write_available_results(qs_env, scf_env)
758 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
760 cpassert(
ASSOCIATED(kinetic_m))
761 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
765 IF (unit_nr > 0)
THEN
766 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
769 "DFT%PRINT%KINETIC_ENERGY")
773 CALL qs_scf_post_charges(input, logger, qs_env)
786 IF (loc_print_explicit)
THEN
808 IF (loc_explicit)
THEN
818 p_loc_mixed = .false.
822 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
823 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
824 "therefore localization of unoccupied states will be skipped!")
835 mo_section = cube_or_openpmd(input, str_mo_cubes, str_mo_openpmd, logger)
837 IF (loc_print_explicit)
THEN
841 do_wannier_cubes = .false.
843 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
844 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
847 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
848 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
850 CALL auxbas_pw_pool%create_pw(wf_r)
851 CALL auxbas_pw_pool%create_pw(wf_g)
854 IF (dft_control%restricted)
THEN
858 nspins = dft_control%nspins
861 IF (dft_control%restricted .AND. (mo_section%do_output .OR. p_loc_homo))
THEN
862 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
867 cpwarn_if(mo_section%do_cubes(), warning_cube_kpoint)
868 cpwarn_if(mo_section%do_openpmd(), warning_openpmd_kpoint)
873 IF ((mo_section%do_output .AND. nhomo /= 0) .OR. do_stm)
THEN
875 IF (dft_control%do_admm)
THEN
877 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
879 IF (dft_control%hairy_probes)
THEN
880 scf_control%smear%do_smear = .false.
881 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
883 probe=dft_control%probe)
885 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
888 DO ispin = 1, dft_control%nspins
889 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
890 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
894 IF (mo_section%do_output .AND. nhomo /= 0)
THEN
897 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
898 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
899 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
900 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
911 cpwarn(
"Localization not implemented for k-point calculations!")
912 ELSE IF (dft_control%restricted &
915 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
917 ALLOCATE (occupied_orbs(dft_control%nspins))
918 ALLOCATE (occupied_evals(dft_control%nspins))
919 ALLOCATE (homo_localized(dft_control%nspins))
920 DO ispin = 1, dft_control%nspins
921 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
922 eigenvalues=mo_eigenvalues)
923 occupied_orbs(ispin) = mo_coeff
924 occupied_evals(ispin)%array => mo_eigenvalues
925 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
926 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
929 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
932 ALLOCATE (qs_loc_env_homo)
935 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
936 mo_section%do_output, mo_loc_history=mo_loc_history)
938 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
941 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
943 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
948 homo_localized, do_homo)
950 DEALLOCATE (occupied_orbs)
951 DEALLOCATE (occupied_evals)
953 IF (qs_loc_env_homo%do_localize)
THEN
954 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
961 IF (mo_section%do_output .OR. p_loc_lumo)
THEN
963 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
966 compute_lumos = mo_section%do_output .AND. nlumo /= 0
967 compute_lumos = compute_lumos .OR. p_loc_lumo
969 DO ispin = 1, dft_control%nspins
970 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
971 compute_lumos = compute_lumos .AND. homo == nmo
974 IF (mo_section%do_output .AND. .NOT. compute_lumos)
THEN
976 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
977 DO ispin = 1, dft_control%nspins
979 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
980 IF (nlumo > nmo - homo)
THEN
983 IF (nlumo == -1)
THEN
986 IF (output_unit > 0)
WRITE (output_unit, *)
" "
987 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
988 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
989 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
992 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
993 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
994 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1, mo_section=mo_section)
1000 IF (compute_lumos)
THEN
1001 check_write = .true.
1003 IF (nlumo == 0) check_write = .false.
1004 IF (p_loc_lumo)
THEN
1006 ALLOCATE (qs_loc_env_lumo)
1009 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
1012 ALLOCATE (unoccupied_orbs(dft_control%nspins))
1013 ALLOCATE (unoccupied_evals(dft_control%nspins))
1014 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
1015 lumo_ptr => unoccupied_orbs
1016 DO ispin = 1, dft_control%nspins
1018 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
1019 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
1020 IF (check_write)
THEN
1021 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
1023 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1024 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin, mo_section=mo_section)
1028 IF (p_loc_lumo)
THEN
1029 ALLOCATE (lumo_localized(dft_control%nspins))
1030 DO ispin = 1, dft_control%nspins
1031 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
1032 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
1034 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, mo_section%do_output, &
1035 evals=unoccupied_evals)
1036 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
1037 loc_coeff=unoccupied_orbs)
1039 lumo_localized, wf_r, wf_g, particles, &
1040 unoccupied_orbs, unoccupied_evals, marked_states)
1041 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
1042 evals=unoccupied_evals)
1043 lumo_ptr => lumo_localized
1047 IF (has_homo .AND. has_lumo)
THEN
1048 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1049 DO ispin = 1, dft_control%nspins
1050 IF (.NOT. scf_control%smear%do_smear)
THEN
1051 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
1052 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
1053 "HOMO - LUMO gap [eV] :", gap*
evolt
1059 IF (p_loc_mixed)
THEN
1060 IF (do_kpoints)
THEN
1061 cpwarn(
"Localization not implemented for k-point calculations!")
1062 ELSE IF (dft_control%restricted)
THEN
1063 IF (output_unit > 0)
WRITE (output_unit, *) &
1064 " Unclear how we define MOs / localization in the restricted case... skipping"
1067 ALLOCATE (mixed_orbs(dft_control%nspins))
1068 ALLOCATE (mixed_evals(dft_control%nspins))
1069 ALLOCATE (mixed_localized(dft_control%nspins))
1070 DO ispin = 1, dft_control%nspins
1071 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1072 eigenvalues=mo_eigenvalues)
1073 mixed_orbs(ispin) = mo_coeff
1074 mixed_evals(ispin)%array => mo_eigenvalues
1075 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
1076 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
1079 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
1082 total_zeff_corr = scf_env%sum_zeff_corr
1083 ALLOCATE (qs_loc_env_mixed)
1086 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
1087 mo_section%do_output, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
1090 DO ispin = 1, dft_control%nspins
1091 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
1095 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
1098 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
1100 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
1107 DEALLOCATE (mixed_orbs)
1108 DEALLOCATE (mixed_evals)
1113 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
1114 CALL auxbas_pw_pool%give_back_pw(wf_r)
1115 CALL auxbas_pw_pool%give_back_pw(wf_g)
1119 IF (.NOT. do_kpoints)
THEN
1120 IF (p_loc_homo)
THEN
1122 DEALLOCATE (qs_loc_env_homo)
1124 IF (p_loc_lumo)
THEN
1126 DEALLOCATE (qs_loc_env_lumo)
1128 IF (p_loc_mixed)
THEN
1130 DEALLOCATE (qs_loc_env_mixed)
1135 IF (do_kpoints)
THEN
1138 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
1139 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
1140 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
1141 matrix_s=matrix_s, marked_states=marked_states)
1145 IF (
ASSOCIATED(marked_states))
THEN
1146 DEALLOCATE (marked_states)
1150 IF (.NOT. do_kpoints)
THEN
1151 IF (compute_lumos)
THEN
1152 DO ispin = 1, dft_control%nspins
1153 DEALLOCATE (unoccupied_evals(ispin)%array)
1156 DEALLOCATE (unoccupied_evals)
1157 DEALLOCATE (unoccupied_orbs)
1163 IF (do_kpoints)
THEN
1164 cpwarn(
"STM not implemented for k-point calculations!")
1166 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
1167 IF (nlumo_stm > 0)
THEN
1168 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
1169 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
1170 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
1174 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
1175 unoccupied_evals_stm)
1177 IF (nlumo_stm > 0)
THEN
1178 DO ispin = 1, dft_control%nspins
1179 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
1181 DEALLOCATE (unoccupied_evals_stm)
1188 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1191 CALL qs_scf_post_efg(input, logger, qs_env)
1194 CALL qs_scf_post_et(input, qs_env, dft_control)
1197 CALL qs_scf_post_epr(input, logger, qs_env)
1200 CALL qs_scf_post_molopt(input, logger, qs_env)
1203 CALL qs_scf_post_elf(input, logger, qs_env)
1210 DO ispin = 1, dft_control%nspins
1211 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
1219 CALL timestop(handle)
1232 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
1236 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
1238 INTEGER,
INTENT(IN) :: nlumo
1239 INTEGER,
INTENT(OUT) :: nlumos
1241 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
1243 INTEGER :: handle, homo, ispin, n, nao, nmo, &
1250 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1257 CALL timeset(routinen, handle)
1259 NULLIFY (ks_rmpv, matrix_s, scf_control, dft_control, admm_env, para_env, blacs_env, mos)
1261 matrix_ks=ks_rmpv, &
1262 matrix_s=matrix_s, &
1263 scf_control=scf_control, &
1264 dft_control=dft_control, &
1265 admm_env=admm_env, &
1266 para_env=para_env, &
1267 blacs_env=blacs_env, &
1273 DO ispin = 1, dft_control%nspins
1274 NULLIFY (unoccupied_evals(ispin)%array)
1275 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1276 IF (output_unit > 0)
WRITE (output_unit, *) &
1277 " Using OT eigensolver for additional unoccupied orbitals spin ", ispin
1278 IF (output_unit > 0)
WRITE (output_unit, *) &
1279 " Lowest Eigenvalues of the unoccupied subspace spin ", ispin
1280 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
1281 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1283 nlumos = max(1, min(nlumo, nao - nmo))
1284 IF (nlumo == -1) nlumos = nao - nmo
1285 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1287 nrow_global=n, ncol_global=nlumos)
1288 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1293 NULLIFY (local_preconditioner)
1294 IF (
ASSOCIATED(scf_env))
THEN
1295 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1296 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1299 NULLIFY (local_preconditioner)
1305 IF (dft_control%do_admm)
THEN
1309 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1310 matrix_c_fm=unoccupied_orbs(ispin), &
1311 matrix_orthogonal_space_fm=mo_coeff, &
1312 eps_gradient=scf_control%eps_lumos, &
1314 iter_max=scf_control%max_iter_lumos, &
1315 size_ortho_space=nmo)
1318 unoccupied_evals(ispin)%array, scr=output_unit, &
1319 ionode=output_unit > 0)
1322 IF (dft_control%do_admm)
THEN
1328 CALL timestop(handle)
1338 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
1343 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
1345 INTEGER :: handle, print_level, unit_nr
1346 LOGICAL :: do_kpoints, print_it
1349 CALL timeset(routinen, handle)
1351 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
1359 log_filename=.false.)
1362 IF (print_it) print_level = 2
1364 IF (print_it) print_level = 3
1375 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
1376 log_filename=.false.)
1378 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
1382 CALL timestop(handle)
1384 END SUBROUTINE qs_scf_post_charges
1401 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1402 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
1411 INTEGER,
INTENT(IN) :: homo, ispin
1412 TYPE(cp_section_key) :: mo_section
1414 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1416 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1417 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1419 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1420 LOGICAL :: append_cube, mpi_io
1425 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1427 CALL timeset(routinen, handle)
1432 cpassert(mo_section%grid_output /= grid_output_openpmd)
1435 NULLIFY (list_index)
1438 ,
cp_p_file) .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1439 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
1441 IF (mo_section%grid_output == grid_output_cubes)
THEN
1442 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1444 my_pos_cube =
"REWIND"
1445 IF (append_cube)
THEN
1446 my_pos_cube =
"APPEND"
1448 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), n_rep_val=n_rep)
1453 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), i_rep_val=ir, &
1455 IF (
ASSOCIATED(
list))
THEN
1457 DO i = 1,
SIZE(
list)
1458 list_index(i + nlist) =
list(i)
1460 nlist = nlist +
SIZE(
list)
1465 IF (nhomo == -1) nhomo = homo
1466 nlist = homo - max(1, homo - nhomo + 1) + 1
1467 ALLOCATE (list_index(nlist))
1469 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1473 ivector = list_index(i)
1475 atomic_kind_set=atomic_kind_set, &
1476 qs_kind_set=qs_kind_set, &
1478 particle_set=particle_set, &
1481 cell, dft_control, particle_set, pw_env)
1482 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1485 unit_nr = mo_section%print_key_unit_nr( &
1488 mo_section%absolute_section_key, &
1489 extension=
".cube", &
1490 middle_name=trim(filename), &
1491 file_position=my_pos_cube, &
1492 log_filename=.false., &
1494 openpmd_basename=
"dft-mo", &
1495 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1496 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1497 sim_time=qs_env%sim_time)
1498 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1499 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1500 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1501 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1503 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1505 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1508 CALL timestop(handle)
1510 END SUBROUTINE qs_scf_post_occ_cubes
1529 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1530 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo, mo_section)
1536 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1540 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1541 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1542 TYPE(cp_section_key) :: mo_section
1544 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1546 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1547 INTEGER :: handle, ifirst, index_mo, ivector, &
1549 LOGICAL :: append_cube, mpi_io
1554 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1556 CALL timeset(routinen, handle)
1561 cpassert(mo_section%grid_output /= grid_output_openpmd)
1565 .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1566 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1568 IF (mo_section%grid_output == grid_output_cubes)
THEN
1569 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1571 my_pos_cube =
"REWIND"
1572 IF (append_cube)
THEN
1573 my_pos_cube =
"APPEND"
1576 IF (
PRESENT(lumo)) ifirst = lumo
1577 DO ivector = ifirst, ifirst + nlumos - 1
1579 atomic_kind_set=atomic_kind_set, &
1580 qs_kind_set=qs_kind_set, &
1582 particle_set=particle_set, &
1585 qs_kind_set, cell, dft_control, particle_set, pw_env)
1587 IF (ifirst == 1)
THEN
1588 index_mo = homo + ivector
1592 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1595 unit_nr = mo_section%print_key_unit_nr( &
1598 mo_section%absolute_section_key, &
1599 extension=
".cube", &
1600 middle_name=trim(filename), &
1601 file_position=my_pos_cube, &
1602 log_filename=.false., &
1604 openpmd_basename=
"dft-mo", &
1605 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1606 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1607 sim_time=qs_env%sim_time)
1608 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1609 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1610 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1611 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1613 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1618 CALL timestop(handle)
1620 END SUBROUTINE qs_scf_post_unocc_cubes
1633 INTEGER,
INTENT(IN) :: output_unit
1635 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1637 CHARACTER(LEN=default_path_length) :: filename
1638 INTEGER :: handle, max_nmo, maxmom, moments_format, &
1639 moments_unit_nr, reference, unit_nr
1640 LOGICAL :: com_nl, do_kg, do_kpoints, magnetic, &
1641 new_file, periodic, second_ref_point, &
1643 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1646 CALL timeset(routinen, handle)
1649 subsection_name=
"DFT%PRINT%MOMENTS")
1654 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1656 keyword_name=
"DFT%PRINT%MOMENTS%FORMAT")
1658 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1660 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1662 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1664 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1666 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1668 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1670 keyword_name=
"DFT%PRINT%MOMENTS%KG")
1672 keyword_name=
"DFT%PRINT%MOMENTS%MAX_NMO")
1677 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1678 middle_name=
"moments", log_filename=.false., &
1679 is_new_file=new_file)
1681 IF (output_unit > 0)
THEN
1682 IF (unit_nr /= output_unit)
THEN
1683 INQUIRE (unit=unit_nr, name=filename)
1684 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1685 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1688 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1692 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1695 IF (do_kpoints)
THEN
1696 cpabort(
"MOMENTS FORMAT TRAJECTORY is not available for k-point calculations.")
1698 IF (maxmom /= 1) cpabort(
"MOMENTS FORMAT TRAJECTORY requires MAX_MOMENT 1.")
1699 IF (magnetic) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support MAGNETIC moments.")
1700 IF (vel_reprs) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support VEL_REPRS.")
1701 IF (do_kg) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support KG moments.")
1702 moments_unit_nr = -1
1704 moments_unit_nr = unit_nr
1707 IF (do_kpoints)
THEN
1708 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr)
1713 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, moments_unit_nr, vel_reprs, com_nl)
1720 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS|")
1724 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1726 IF (second_ref_point)
THEN
1728 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1733 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1734 middle_name=
"moments_refpoint_2", log_filename=.false., &
1735 is_new_file=new_file)
1737 IF (output_unit > 0)
THEN
1738 IF (unit_nr /= output_unit)
THEN
1739 INQUIRE (unit=unit_nr, name=filename)
1740 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1741 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1744 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1748 IF (do_kpoints)
THEN
1749 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr)
1754 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, &
1755 moments_unit_nr, vel_reprs, com_nl)
1759 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS_REF2|")
1762 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1767 CALL timestop(handle)
1780 SUBROUTINE write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file, label)
1781 INTEGER,
INTENT(IN) :: unit_nr
1784 LOGICAL,
INTENT(IN) :: periodic, new_file
1785 CHARACTER(LEN=*),
INTENT(IN) :: label
1787 CHARACTER(LEN=default_string_length) :: description, iter
1788 REAL(kind=
dp),
DIMENSION(3) :: dipole
1792 IF (unit_nr <= 0)
RETURN
1794 NULLIFY (cell, results)
1795 CALL get_qs_env(qs_env, cell=cell, results=results)
1796 description =
"[DIPOLE]"
1797 CALL get_results(results=results, description=description, values=dipole)
1801 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1802 " iter_level dipole_x dipole_y dipole_z dipole_norm cell_xx cell_xy cell_xz"// &
1803 " cell_yx cell_yy cell_yz cell_zx cell_zy cell_zz [Debye]"
1805 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1806 " iter_level dipole_x dipole_y dipole_z dipole_norm [Debye]"
1812 WRITE (unit_nr,
"(1X,A,1X,A15,13(1X,ES18.10))") trim(label), iter(1:15), &
1816 WRITE (unit_nr,
"(1X,A,1X,A15,4(1X,ES18.10))") trim(label), iter(1:15), &
1820 END SUBROUTINE write_moments_trajectory
1830 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1835 INTEGER,
INTENT(IN) :: output_unit
1837 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1839 CHARACTER(LEN=default_path_length) :: filename
1840 INTEGER :: handle, unit_nr
1841 REAL(kind=
dp) :: q_max
1844 CALL timeset(routinen, handle)
1847 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1851 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1853 basis_section=input, &
1854 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1856 middle_name=
"xrd", &
1857 log_filename=.false.)
1858 IF (output_unit > 0)
THEN
1859 INQUIRE (unit=unit_nr, name=filename)
1860 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1861 "X-RAY DIFFRACTION SPECTRUM"
1862 IF (unit_nr /= output_unit)
THEN
1863 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1864 "The coherent X-ray diffraction spectrum is written to the file:", &
1869 unit_number=unit_nr, &
1873 basis_section=input, &
1874 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1877 CALL timestop(handle)
1879 END SUBROUTINE qs_scf_post_xray
1887 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1892 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1897 CALL timeset(routinen, handle)
1900 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1906 CALL timestop(handle)
1908 END SUBROUTINE qs_scf_post_efg
1916 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1921 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1923 INTEGER :: handle, ispin
1925 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1928 CALL timeset(routinen, handle)
1934 IF (qs_env%et_coupling%first_run)
THEN
1936 ALLOCATE (my_mos(dft_control%nspins))
1937 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1938 DO ispin = 1, dft_control%nspins
1940 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1941 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1950 CALL timestop(handle)
1952 END SUBROUTINE qs_scf_post_et
1963 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
1968 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
1970 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1972 INTEGER :: handle, ispin, output_unit, unit_nr
1973 LOGICAL :: append_cube, gapw, mpi_io
1974 REAL(
dp) :: rho_cutoff
1975 TYPE(cp_section_key) :: elf_section_key
1985 CALL timeset(routinen, handle)
1988 elf_section_key = cube_or_openpmd(input, str_elf_cubes, str_elf_openpmd, logger)
1991 IF (elf_section_key%do_output)
THEN
1993 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
1994 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
1997 gapw = dft_control%qs_control%gapw
1998 IF (.NOT. gapw)
THEN
2000 ALLOCATE (elf_r(dft_control%nspins))
2001 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2003 DO ispin = 1, dft_control%nspins
2004 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
2008 IF (output_unit > 0)
THEN
2009 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
2010 " ----- ELF is computed on the real space grid -----"
2018 IF (elf_section_key%grid_output == grid_output_cubes)
THEN
2021 my_pos_cube =
"REWIND"
2022 IF (append_cube)
THEN
2023 my_pos_cube =
"APPEND"
2026 DO ispin = 1, dft_control%nspins
2027 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
2028 WRITE (title, *)
"ELF spin ", ispin
2030 unit_nr = elf_section_key%print_key_unit_nr( &
2033 elf_section_key%absolute_section_key, &
2034 extension=
".cube", &
2035 middle_name=trim(filename), &
2036 file_position=my_pos_cube, &
2037 log_filename=.false., &
2039 fout=mpi_filename, &
2040 openpmd_basename=
"dft-elf", &
2041 openpmd_unit_dimension=openpmd_unit_dimension_dimensionless, &
2042 openpmd_unit_si=openpmd_unit_si_dimensionless, &
2043 sim_time=qs_env%sim_time)
2044 IF (output_unit > 0)
THEN
2045 IF (.NOT. mpi_io)
THEN
2046 INQUIRE (unit=unit_nr, name=filename)
2048 filename = mpi_filename
2050 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2051 "ELF is written in "//elf_section_key%format_name//
" file format to the file:", &
2055 CALL elf_section_key%write_pw(elf_r(ispin), unit_nr, title, particles=particles, &
2057 CALL elf_section_key%print_key_finished_output( &
2061 elf_section_key%absolute_section_key, &
2064 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
2072 cpwarn(
"ELF not implemented for GAPW calculations!")
2077 CALL timestop(handle)
2079 END SUBROUTINE qs_scf_post_elf
2091 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
2096 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
2098 INTEGER :: handle, nao, unit_nr
2099 REAL(kind=
dp) :: s_cond_number
2100 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
2109 CALL timeset(routinen, handle)
2112 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2116 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
2119 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
2121 nrow_global=nao, ncol_global=nao, &
2122 template_fmstruct=mo_coeff%matrix_struct)
2123 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
2125 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
2128 ALLOCATE (eigenvalues(nao))
2136 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
2139 extension=
".molopt")
2141 IF (unit_nr > 0)
THEN
2144 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
2145 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
2149 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2153 CALL timestop(handle)
2155 END SUBROUTINE qs_scf_post_molopt
2163 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
2168 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
2173 CALL timeset(routinen, handle)
2176 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
2182 CALL timestop(handle)
2184 END SUBROUTINE qs_scf_post_epr
2193 SUBROUTINE write_available_results(qs_env, scf_env)
2197 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
2201 CALL timeset(routinen, handle)
2209 CALL timestop(handle)
2211 END SUBROUTINE write_available_results
2224 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
2226 INTEGER :: handle, homo, ispin, nlumo_dos, &
2227 nlumo_molden, nlumo_required, nlumos, &
2229 LOGICAL :: all_equal, defer_molden, do_curve, &
2230 do_dos, do_kpoints, do_pdos, &
2231 do_projected_dos, explicit
2232 REAL(kind=
dp) :: maxocc, s_square, s_square_ideal, &
2233 total_abs_spin_dens, total_spin_dens
2234 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
2239 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
2242 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
2256 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2261 dos_section, input, sprint_section, &
2266 CALL timeset(routinen, handle)
2268 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
2269 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
2270 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
2271 molecule_set, input, particles, subsys, rho_r, unoccupied_orbs, &
2272 unoccupied_evals, casino_section, dos_section)
2277 cpassert(
ASSOCIATED(qs_env))
2279 dft_control=dft_control, &
2280 molecule_set=molecule_set, &
2281 atomic_kind_set=atomic_kind_set, &
2282 particle_set=particle_set, &
2283 qs_kind_set=qs_kind_set, &
2284 admm_env=admm_env, &
2285 scf_control=scf_control, &
2294 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
2298 IF (.NOT. qs_env%run_rtp)
THEN
2311 defer_molden = .false.
2312 IF (.NOT. do_kpoints)
THEN
2313 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
2317 IF (nlumo_molden /= 0 .AND.
PRESENT(scf_env))
THEN
2318 IF (scf_env%method ==
ot_method_nr) defer_molden = .true.
2320 IF (.NOT. defer_molden)
THEN
2321 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2322 qs_env=qs_env, calc_energies=.true.)
2331 cpwarn(
"Molden format output is not possible for k-point calculations.")
2335 cpwarn(
"Chargemol .wfx format output is not possible for k-point calculations.")
2342 IF (do_kpoints)
THEN
2346 cpwarn(
"MO_KP is only available for k-point calculations, ignored for Gamma-only")
2357 IF (.NOT. do_kpoints .AND.
PRESENT(scf_env))
THEN
2361 IF (nlumo_dos == -1)
THEN
2363 ELSE IF (nlumo_required /= -1)
THEN
2364 nlumo_required = max(nlumo_required, nlumo_dos)
2368 IF (defer_molden)
THEN
2369 IF (nlumo_molden == -1)
THEN
2371 ELSE IF (nlumo_required /= -1)
THEN
2372 nlumo_required = max(nlumo_required, nlumo_molden)
2375 IF (nlumo_required /= 0)
THEN
2376 ALLOCATE (unoccupied_orbs(dft_control%nspins))
2377 ALLOCATE (unoccupied_evals(dft_control%nspins))
2378 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, &
2379 nlumo_required, nlumos)
2382 IF (do_dos .OR. do_projected_dos)
THEN
2383 DO ispin = 1, dft_control%nspins
2386 IF (dft_control%do_admm)
THEN
2389 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
2390 eigenvalues=mo_eigenvalues)
2391 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
2392 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
2394 mo_coeff_deriv => null()
2397 do_rotation=.true., &
2398 co_rotate_dbcsr=mo_coeff_deriv)
2400 IF (dft_control%do_admm)
THEN
2408 IF (defer_molden)
THEN
2409 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2410 IF (output_unit > 0)
THEN
2411 WRITE (output_unit,
'(/,T2,A,I6,A)') &
2412 "MO_MOLDEN| Writing ", nlumos,
" unoccupied orbitals to molden file"
2414 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2415 unoccupied_orbs=unoccupied_orbs, &
2416 unoccupied_evals=unoccupied_evals, &
2417 qs_env=qs_env, calc_energies=.true.)
2423 IF (do_kpoints)
THEN
2425 IF (do_curve)
CALL calculate_dos_kp(qs_env, dft_section, write_curve_output=.true.)
2428 IF (
ASSOCIATED(unoccupied_evals))
THEN
2429 CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2430 smearing_enabled=dft_control%smear)
2431 IF (do_curve)
CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2432 smearing_enabled=dft_control%smear, write_curve_output=.true.)
2434 CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear)
2435 IF (do_curve)
CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear, &
2436 write_curve_output=.true.)
2442 IF (do_projected_dos)
THEN
2443 IF (do_kpoints)
THEN
2445 write_pdos=do_pdos, write_pdos_curve=do_curve)
2450 DO ispin = 1, dft_control%nspins
2451 IF (dft_control%nspins == 2)
THEN
2452 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2454 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2455 unoccupied_orbs=unoccupied_orbs(ispin), &
2456 unoccupied_evals=unoccupied_evals(ispin), &
2457 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2460 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2461 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2464 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2466 qs_kind_set, particle_set, qs_env, dft_section, &
2467 unoccupied_orbs=unoccupied_orbs(ispin), &
2468 unoccupied_evals=unoccupied_evals(ispin), &
2469 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2472 qs_kind_set, particle_set, qs_env, dft_section, &
2473 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2479 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2480 DO ispin = 1, dft_control%nspins
2481 DEALLOCATE (unoccupied_evals(ispin)%array)
2484 DEALLOCATE (unoccupied_evals)
2485 DEALLOCATE (unoccupied_orbs)
2490 IF (dft_control%nspins == 2)
THEN
2491 total_spin_dens = 0.0_dp
2492 total_abs_spin_dens = 0.0_dp
2493 IF (dft_control%qs_control%gapw)
THEN
2494 CALL get_qs_env(qs_env, qs_charges=qs_charges)
2495 total_spin_dens = qs_charges%total_rho_hard_spin - &
2496 qs_charges%total_rho_soft_spin
2497 total_abs_spin_dens = qs_charges%total_rho_hard_abs_spin - &
2498 qs_charges%total_rho_soft_abs_spin
2501 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2502 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2504 CALL auxbas_pw_pool%create_pw(wf_r)
2506 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
2508 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
2509 "Integrated spin density: ", total_spin_dens
2511 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
2512 "Integrated absolute spin density: ", total_abs_spin_dens
2513 CALL auxbas_pw_pool%give_back_pw(wf_r)
2519 IF (.NOT. do_kpoints)
THEN
2521 DO ispin = 1, dft_control%nspins
2523 occupation_numbers=occupation_numbers, &
2528 all_equal = all_equal .AND. &
2529 (all(occupation_numbers(1:homo) == maxocc) .AND. &
2530 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
2535 matrix_s=matrix_s, &
2538 s_square_ideal=s_square_ideal)
2539 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
2540 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
2541 energy%s_square = s_square
2546 CALL timestop(handle)
2558 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
2559 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
2561 CHARACTER(LEN=2) :: element_symbol
2562 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2564 CHARACTER(LEN=default_string_length) :: name, print_density
2565 INTEGER :: after, handle, i, iat, iatom, id, ikind, img, iso, ispin, iw, l, n_rep_hf, nat, &
2566 natom, nd(3), ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, &
2567 should_print_voro, unit_nr, unit_nr_voro
2568 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
2569 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
2571 rho_total, rho_total_rspace, udvol, &
2573 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2574 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
2575 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
2576 REAL(kind=
dp),
DIMENSION(3) :: checksum_hr, dr
2577 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
2582 TYPE(cp_section_key) :: e_density_section
2584 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
2592 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
2599 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2607 print_key, print_key_bqb, &
2608 print_key_voro, xc_section
2610 CALL timeset(routinen, handle)
2611 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
2612 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
2613 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
2619 cpassert(
ASSOCIATED(qs_env))
2621 atomic_kind_set=atomic_kind_set, &
2622 qs_kind_set=qs_kind_set, &
2623 particle_set=particle_set, &
2625 para_env=para_env, &
2626 dft_control=dft_control, &
2628 do_kpoints=do_kpoints, &
2636 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
2637 ALLOCATE (zcharge(natom))
2642 iat = atomic_kind_set(ikind)%atom_list(iatom)
2649 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
2650 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
2652 my_pos_cube =
"REWIND"
2653 IF (append_cube)
THEN
2654 my_pos_cube =
"APPEND"
2657 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
2658 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
2659 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2661 CALL auxbas_pw_pool%create_pw(wf_r)
2662 IF (dft_control%qs_control%gapw)
THEN
2663 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
2664 CALL pw_axpy(rho_core, rho0_s_gs)
2665 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2666 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2669 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
2670 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2671 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2674 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2675 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2678 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2679 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2685 DO ispin = 1, dft_control%nspins
2686 CALL pw_axpy(rho_r(ispin), wf_r)
2688 filename =
"TOTAL_DENSITY"
2691 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2692 log_filename=.false., mpi_io=mpi_io)
2694 particles=particles, zeff=zcharge, &
2696 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%TOT_DENSITY_CUBE%MAX_FILE_SIZE_MB"), &
2699 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2700 CALL auxbas_pw_pool%give_back_pw(wf_r)
2703 e_density_section = cube_or_openpmd(input, str_e_density_cubes, str_e_density_openpmd, logger)
2706 IF (e_density_section%do_output)
THEN
2708 keyword_name=e_density_section%concat_to_relative(
"%DENSITY_INCLUDE"), &
2709 c_val=print_density)
2710 print_density = trim(print_density)
2712 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2713 append_cube =
section_get_lval(input, e_density_section%concat_to_absolute(
"%APPEND"))
2715 my_pos_cube =
"REWIND"
2716 IF (append_cube)
THEN
2717 my_pos_cube =
"APPEND"
2721 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2722 xrd_interface =
section_get_lval(input, e_density_section%concat_to_absolute(
"%XRD_INTERFACE"))
2725 xrd_interface = .false.
2728 IF (xrd_interface)
THEN
2730 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2732 filename =
"ELECTRON_DENSITY"
2734 extension=
".xrd", middle_name=trim(filename), &
2735 file_position=my_pos_cube, log_filename=.false.)
2736 ngto =
section_get_ival(input, e_density_section%concat_to_absolute(
"%NGAUSS"))
2737 IF (output_unit > 0)
THEN
2738 INQUIRE (unit=unit_nr, name=filename)
2739 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2740 "The electron density (atomic part) is written to the file:", &
2745 nkind =
SIZE(atomic_kind_set)
2746 IF (unit_nr > 0)
THEN
2747 WRITE (unit_nr, *)
"Atomic (core) densities"
2748 WRITE (unit_nr, *)
"Unit cell"
2749 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2750 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2751 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2752 WRITE (unit_nr, *)
"Atomic types"
2753 WRITE (unit_nr, *) nkind
2756 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2758 atomic_kind => atomic_kind_set(ikind)
2759 qs_kind => qs_kind_set(ikind)
2760 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2762 iunit=output_unit, confine=.true.)
2764 iunit=output_unit, allelectron=.true., confine=.true.)
2765 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2766 ccdens(:, 2, ikind) = 0._dp
2767 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2768 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2769 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2770 IF (unit_nr > 0)
THEN
2771 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2772 WRITE (unit_nr, fmt=
"(I6)") ngto
2773 WRITE (unit_nr, *)
" Total density"
2774 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2775 WRITE (unit_nr, *)
" Core density"
2776 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2778 NULLIFY (atomic_kind)
2781 IF (dft_control%qs_control%gapw)
THEN
2782 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2784 IF (unit_nr > 0)
THEN
2785 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2787 np = particles%n_els
2789 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2790 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2791 rho_atom => rho_atom_set(iat)
2792 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2793 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2794 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2799 CALL para_env%sum(nr)
2800 CALL para_env%sum(niso)
2802 ALLOCATE (bfun(nr, niso))
2804 DO ispin = 1, dft_control%nspins
2805 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2806 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2809 CALL para_env%sum(bfun)
2810 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2811 ccdens(:, 2, ikind) = 0._dp
2812 IF (unit_nr > 0)
THEN
2813 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2817 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2818 IF (unit_nr > 0)
THEN
2819 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2820 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2826 IF (unit_nr > 0)
THEN
2827 WRITE (unit_nr, *)
"Coordinates"
2828 np = particles%n_els
2830 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2831 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2836 DEALLOCATE (ppdens, aedens, ccdens)
2839 e_density_section%absolute_section_key)
2842 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2844 cpassert(.NOT. do_kpoints)
2849 auxbas_pw_pool=auxbas_pw_pool, &
2851 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2853 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2858 q_max = sqrt(sum((
pi/dr(:))**2))
2860 auxbas_pw_pool=auxbas_pw_pool, &
2861 rhotot_elec_gspace=rho_elec_gspace, &
2863 rho_hard=rho_hard, &
2865 rho_total = rho_hard + rho_soft
2870 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2872 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2874 filename =
"TOTAL_ELECTRON_DENSITY"
2876 unit_nr = e_density_section%print_key_unit_nr( &
2879 e_density_section%absolute_section_key, &
2880 extension=
".cube", &
2881 middle_name=trim(filename), &
2882 file_position=my_pos_cube, &
2883 log_filename=.false., &
2885 fout=mpi_filename, &
2886 openpmd_basename=
"dft-total-electron-density", &
2887 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2888 openpmd_unit_si=openpmd_unit_si_density, &
2889 sim_time=qs_env%sim_time)
2890 IF (output_unit > 0)
THEN
2891 IF (.NOT. mpi_io)
THEN
2892 INQUIRE (unit=unit_nr, name=filename)
2894 filename = mpi_filename
2896 CALL print_density_output_message(output_unit,
"The total electron density", &
2897 e_density_section, filename)
2898 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2899 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2900 "Soft electronic charge (G-space) :", rho_soft, &
2901 "Hard electronic charge (G-space) :", rho_hard, &
2902 "Total electronic charge (G-space):", rho_total, &
2903 "Total electronic charge (R-space):", rho_total_rspace
2905 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2906 particles=particles, zeff=zcharge, &
2907 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2908 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2909 e_density_section%absolute_section_key, mpi_io=mpi_io)
2911 IF (dft_control%nspins > 1)
THEN
2915 auxbas_pw_pool=auxbas_pw_pool, &
2916 rhotot_elec_gspace=rho_elec_gspace, &
2918 rho_hard=rho_hard, &
2919 rho_soft=rho_soft, &
2921 rho_total = rho_hard + rho_soft
2925 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2927 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2929 filename =
"TOTAL_SPIN_DENSITY"
2931 unit_nr = e_density_section%print_key_unit_nr( &
2934 e_density_section%absolute_section_key, &
2935 extension=
".cube", &
2936 middle_name=trim(filename), &
2937 file_position=my_pos_cube, &
2938 log_filename=.false., &
2940 fout=mpi_filename, &
2941 openpmd_basename=
"dft-total-spin-density", &
2942 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2943 openpmd_unit_si=openpmd_unit_si_density, &
2944 sim_time=qs_env%sim_time)
2945 IF (output_unit > 0)
THEN
2946 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2947 INQUIRE (unit=unit_nr, name=filename)
2949 filename = mpi_filename
2951 CALL print_density_output_message(output_unit,
"The total spin density", &
2952 e_density_section, filename)
2953 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2954 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2955 "Soft part of the spin density (G-space):", rho_soft, &
2956 "Hard part of the spin density (G-space):", rho_hard, &
2957 "Total spin density (G-space) :", rho_total, &
2958 "Total spin density (R-space) :", rho_total_rspace
2960 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2961 particles=particles, zeff=zcharge, &
2962 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2963 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2964 e_density_section%absolute_section_key, mpi_io=mpi_io)
2966 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2967 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2969 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2970 IF (dft_control%nspins > 1)
THEN
2974 auxbas_pw_pool=auxbas_pw_pool, &
2976 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2977 CALL pw_copy(rho_r(1), rho_elec_rspace)
2978 CALL pw_axpy(rho_r(2), rho_elec_rspace)
2979 filename =
"ELECTRON_DENSITY"
2981 unit_nr = e_density_section%print_key_unit_nr( &
2984 e_density_section%absolute_section_key, &
2985 extension=
".cube", &
2986 middle_name=trim(filename), &
2987 file_position=my_pos_cube, &
2988 log_filename=.false., &
2990 fout=mpi_filename, &
2991 openpmd_basename=
"dft-electron-density", &
2992 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2993 openpmd_unit_si=openpmd_unit_si_density, &
2994 sim_time=qs_env%sim_time)
2995 IF (output_unit > 0)
THEN
2996 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2997 INQUIRE (unit=unit_nr, name=filename)
2999 filename = mpi_filename
3001 CALL print_density_output_message(output_unit,
"The sum of alpha and beta density", &
3002 e_density_section, filename)
3004 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
3005 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3007 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3008 e_density_section%absolute_section_key, mpi_io=mpi_io)
3009 CALL pw_copy(rho_r(1), rho_elec_rspace)
3010 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3011 filename =
"SPIN_DENSITY"
3013 unit_nr = e_density_section%print_key_unit_nr( &
3016 e_density_section%absolute_section_key, &
3017 extension=
".cube", &
3018 middle_name=trim(filename), &
3019 file_position=my_pos_cube, &
3020 log_filename=.false., &
3022 fout=mpi_filename, &
3023 openpmd_basename=
"dft-spin-density", &
3024 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3025 openpmd_unit_si=openpmd_unit_si_density, &
3026 sim_time=qs_env%sim_time)
3027 IF (output_unit > 0)
THEN
3028 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3029 INQUIRE (unit=unit_nr, name=filename)
3031 filename = mpi_filename
3033 CALL print_density_output_message(output_unit,
"The spin density", &
3034 e_density_section, filename)
3036 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3037 particles=particles, zeff=zcharge, &
3038 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3039 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3040 e_density_section%absolute_section_key, mpi_io=mpi_io)
3041 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3043 filename =
"ELECTRON_DENSITY"
3045 unit_nr = e_density_section%print_key_unit_nr( &
3048 e_density_section%absolute_section_key, &
3049 extension=
".cube", &
3050 middle_name=trim(filename), &
3051 file_position=my_pos_cube, &
3052 log_filename=.false., &
3054 fout=mpi_filename, &
3055 openpmd_basename=
"dft-electron-density", &
3056 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3057 openpmd_unit_si=openpmd_unit_si_density, &
3058 sim_time=qs_env%sim_time)
3059 IF (output_unit > 0)
THEN
3060 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3061 INQUIRE (unit=unit_nr, name=filename)
3063 filename = mpi_filename
3065 CALL print_density_output_message(output_unit,
"The electron density", &
3066 e_density_section, filename)
3068 CALL e_density_section%write_pw(rho_r(1), unit_nr,
"ELECTRON DENSITY", &
3069 particles=particles, zeff=zcharge, &
3070 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3071 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3072 e_density_section%absolute_section_key, mpi_io=mpi_io)
3075 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
3076 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
3077 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
3078 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
3081 ALLOCATE (my_q0(natom))
3089 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
3093 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3097 DO ispin = 1, dft_control%nspins
3098 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
3102 rho_total_rspace = rho_soft + rho_hard
3104 filename =
"ELECTRON_DENSITY"
3106 unit_nr = e_density_section%print_key_unit_nr( &
3109 e_density_section%absolute_section_key, &
3110 extension=
".cube", &
3111 middle_name=trim(filename), &
3112 file_position=my_pos_cube, &
3113 log_filename=.false., &
3115 fout=mpi_filename, &
3116 openpmd_basename=
"dft-electron-density", &
3117 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3118 openpmd_unit_si=openpmd_unit_si_density, &
3119 sim_time=qs_env%sim_time)
3120 IF (output_unit > 0)
THEN
3121 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3122 INQUIRE (unit=unit_nr, name=filename)
3124 filename = mpi_filename
3126 CALL print_density_output_message(output_unit,
"The electron density", &
3127 e_density_section, filename)
3128 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3129 "Soft electronic charge (R-space) :", rho_soft, &
3130 "Hard electronic charge (R-space) :", rho_hard, &
3131 "Total electronic charge (R-space):", rho_total_rspace
3133 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
3134 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3136 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3137 e_density_section%absolute_section_key, mpi_io=mpi_io)
3140 IF (dft_control%nspins > 1)
THEN
3142 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
3145 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3148 CALL pw_axpy(rho_r(1), rho_elec_rspace)
3149 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3153 rho_total_rspace = rho_soft + rho_hard
3155 filename =
"SPIN_DENSITY"
3157 unit_nr = e_density_section%print_key_unit_nr( &
3160 e_density_section%absolute_section_key, &
3161 extension=
".cube", &
3162 middle_name=trim(filename), &
3163 file_position=my_pos_cube, &
3164 log_filename=.false., &
3166 fout=mpi_filename, &
3167 openpmd_basename=
"dft-spin-density", &
3168 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3169 openpmd_unit_si=openpmd_unit_si_density, &
3170 sim_time=qs_env%sim_time)
3171 IF (output_unit > 0)
THEN
3172 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3173 INQUIRE (unit=unit_nr, name=filename)
3175 filename = mpi_filename
3177 CALL print_density_output_message(output_unit,
"The spin density", &
3178 e_density_section, filename)
3179 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3180 "Soft part of the spin density :", rho_soft, &
3181 "Hard part of the spin density :", rho_hard, &
3182 "Total spin density (R-space) :", rho_total_rspace
3184 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3185 particles=particles, zeff=zcharge, &
3186 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3187 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3188 e_density_section%absolute_section_key, mpi_io=mpi_io)
3190 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3196 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
3202 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
3206 v_hartree_rspace=v_hartree_rspace)
3207 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3208 CALL auxbas_pw_pool%create_pw(aux_r)
3211 my_pos_cube =
"REWIND"
3212 IF (append_cube)
THEN
3213 my_pos_cube =
"APPEND"
3216 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3219 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
3220 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3222 CALL pw_copy(v_hartree_rspace, aux_r)
3225 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
3227 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%V_HARTREE_CUBE%MAX_FILE_SIZE_MB"), &
3230 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
3232 CALL auxbas_pw_pool%give_back_pw(aux_r)
3237 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
3238 IF (dft_control%apply_external_potential)
THEN
3239 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
3240 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3241 CALL auxbas_pw_pool%create_pw(aux_r)
3243 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
3244 my_pos_cube =
"REWIND"
3245 IF (append_cube)
THEN
3246 my_pos_cube =
"APPEND"
3251 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
3255 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
3256 stride=
section_get_ivals(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), &
3257 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%MAX_FILE_SIZE_MB"), &
3260 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
3262 CALL auxbas_pw_pool%give_back_pw(aux_r)
3268 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
3270 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3271 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3272 CALL auxbas_pw_pool%create_pw(aux_r)
3273 CALL auxbas_pw_pool%create_pw(aux_g)
3276 my_pos_cube =
"REWIND"
3277 IF (append_cube)
THEN
3278 my_pos_cube =
"APPEND"
3280 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
3281 v_hartree_rspace=v_hartree_rspace)
3283 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3287 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
3297 CALL cp_pw_to_cube(aux_r, unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
3299 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EFIELD_CUBE%MAX_FILE_SIZE_MB"), &
3302 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
3305 CALL auxbas_pw_pool%give_back_pw(aux_r)
3306 CALL auxbas_pw_pool%give_back_pw(aux_g)
3310 CALL qs_scf_post_local_energy(input, logger, qs_env)
3313 CALL qs_scf_post_local_stress(input, logger, qs_env)
3316 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
3327 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
3332 after = min(max(after, 1), 16)
3333 DO ispin = 1, dft_control%nspins
3334 DO img = 1, dft_control%nimages
3336 para_env, output_unit=iw, omit_headers=omit_headers)
3340 "DFT%PRINT%AO_MATRICES/DENSITY")
3345 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
3347 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
3349 IF (write_ks .OR. write_xc)
THEN
3350 IF (write_xc) qs_env%requires_matrix_vxc = .true.
3353 just_energy=.false.)
3354 IF (write_xc) qs_env%requires_matrix_vxc = .false.
3361 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
3363 after = min(max(after, 1), 16)
3364 DO ispin = 1, dft_control%nspins
3365 DO img = 1, dft_control%nimages
3367 para_env, output_unit=iw, omit_headers=omit_headers)
3371 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
3376 IF (.NOT. dft_control%qs_control%pao)
THEN
3384 CALL write_adjacency_matrix(qs_env, input)
3388 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
3389 cpassert(
ASSOCIATED(matrix_vxc))
3393 after = min(max(after, 1), 16)
3394 DO ispin = 1, dft_control%nspins
3395 DO img = 1, dft_control%nimages
3397 para_env, output_unit=iw, omit_headers=omit_headers)
3401 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
3406 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
3415 IF (output_unit > 0)
THEN
3416 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum X =', checksum_hr(1)
3417 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Y =', checksum_hr(2)
3418 WRITE (output_unit,
'(T2,A,E23.16)')
'COMMUTATOR_HR| CheckSum Z =', checksum_hr(3)
3420 after = min(max(after, 1), 16)
3423 para_env, output_unit=iw, omit_headers=omit_headers)
3427 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
3433 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
3436 IF (print_it) print_level = 2
3438 IF (print_it) print_level = 3
3449 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3450 IF (rho_r_valid)
THEN
3451 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
3452 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
3460 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
3462 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
3470 should_print_voro = 1
3472 should_print_voro = 0
3475 should_print_bqb = 1
3477 should_print_bqb = 0
3479 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3484 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3485 IF (rho_r_valid)
THEN
3487 IF (dft_control%nspins > 1)
THEN
3491 auxbas_pw_pool=auxbas_pw_pool, &
3495 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
3496 CALL pw_copy(rho_r(1), mb_rho)
3497 CALL pw_axpy(rho_r(2), mb_rho)
3504 IF (should_print_voro /= 0)
THEN
3506 IF (voro_print_txt)
THEN
3508 my_pos_voro =
"REWIND"
3509 IF (append_voro)
THEN
3510 my_pos_voro =
"APPEND"
3512 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
3513 file_position=my_pos_voro, log_filename=.false.)
3521 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3522 unit_nr_voro, qs_env, mb_rho)
3524 IF (dft_control%nspins > 1)
THEN
3525 CALL auxbas_pw_pool%give_back_pw(mb_rho)
3529 IF (unit_nr_voro > 0)
THEN
3539 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
3547 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
3555 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
3557 IF (particle_set(1)%fragment_index /= 0) iao_env%do_fragments = .true.
3558 IF (iao_env%do_iao)
THEN
3568 extension=
".mao", log_filename=.false.)
3579 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
3583 DEALLOCATE (zcharge)
3585 CALL timestop(handle)
3595 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
3598 INTEGER,
INTENT(IN) :: unit_nr
3600 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
3601 radius_type, refc, shapef
3602 INTEGER,
DIMENSION(:),
POINTER :: atom_list
3603 LOGICAL :: do_radius, do_sc, paw_atom
3604 REAL(kind=
dp) :: zeff
3605 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
3606 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
3609 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
3615 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3619 NULLIFY (hirshfeld_env)
3623 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
3624 ALLOCATE (hirshfeld_env%charges(natom))
3633 IF (.NOT.
SIZE(radii) == nkind)
THEN
3634 CALL cp_abort(__location__, &
3635 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
3636 "match number of atomic kinds in the input coordinate file.")
3642 iterative=do_sc, ref_charge=refc, &
3643 radius_type=radius_type)
3645 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
3651 nspin =
SIZE(matrix_p, 1)
3652 ALLOCATE (charges(natom, nspin))
3657 atomic_kind => atomic_kind_set(ikind)
3659 DO iat = 1,
SIZE(atom_list)
3661 hirshfeld_env%charges(i) = zeff
3665 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
3668 hirshfeld_env%charges(iat) = sum(charges(iat, :))
3671 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
3675 IF (hirshfeld_env%iterative)
THEN
3682 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
3683 IF (dft_control%qs_control%gapw)
THEN
3685 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
3688 atomic_kind => particle_set(iat)%atomic_kind
3690 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
3692 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
3697 IF (unit_nr > 0)
THEN
3699 qs_kind_set, unit_nr)
3705 DEALLOCATE (charges)
3707 END SUBROUTINE hirshfeld_charges
3717 SUBROUTINE project_function_a(ca, a, cb, b, l)
3719 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3720 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
3721 INTEGER,
INTENT(IN) :: l
3724 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3725 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
3728 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
3732 v(:, 1) = matmul(tmat, cb)
3733 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3737 DEALLOCATE (smat, tmat, v, ipiv)
3739 END SUBROUTINE project_function_a
3749 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
3751 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3752 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
3754 INTEGER,
INTENT(IN) :: l
3756 INTEGER :: i, info, n, nr
3757 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3758 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
3759 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
3763 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3767 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3768 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3770 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3774 DEALLOCATE (smat, v, ipiv, afun)
3776 END SUBROUTINE project_function_b
3787 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3792 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3794 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3795 INTEGER :: handle, io_unit, natom, unit_nr
3796 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3805 CALL timeset(routinen, handle)
3808 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3810 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3811 gapw = dft_control%qs_control%gapw
3812 gapw_xc = dft_control%qs_control%gapw_xc
3813 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3815 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3816 CALL auxbas_pw_pool%create_pw(eden)
3820 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3821 IF (append_cube)
THEN
3822 my_pos_cube =
"APPEND"
3824 my_pos_cube =
"REWIND"
3828 extension=
".cube", middle_name=
"local_energy", &
3829 file_position=my_pos_cube, mpi_io=mpi_io)
3830 CALL cp_pw_to_cube(eden, unit_nr,
"LOCAL ENERGY", particles=particles, &
3832 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_ENERGY_CUBE%MAX_FILE_SIZE_MB"), &
3834 IF (io_unit > 0)
THEN
3835 INQUIRE (unit=unit_nr, name=filename)
3836 IF (gapw .OR. gapw_xc)
THEN
3837 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3838 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3840 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3841 "The local energy is written to the file: ", trim(adjustl(filename))
3845 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3847 CALL auxbas_pw_pool%give_back_pw(eden)
3849 CALL timestop(handle)
3851 END SUBROUTINE qs_scf_post_local_energy
3862 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3867 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3869 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3870 INTEGER :: handle, io_unit, natom, unit_nr
3871 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3872 REAL(kind=
dp) :: beta
3881 CALL timeset(routinen, handle)
3884 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3885 CALL cp_warn(__location__, &
3886 "LOCAL_STRESS_CUBE uses the existing experimental local stress implementation")
3888 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3889 gapw = dft_control%qs_control%gapw
3890 gapw_xc = dft_control%qs_control%gapw_xc
3891 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3893 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3894 CALL auxbas_pw_pool%create_pw(stress)
3900 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3901 IF (append_cube)
THEN
3902 my_pos_cube =
"APPEND"
3904 my_pos_cube =
"REWIND"
3908 extension=
".cube", middle_name=
"local_stress", &
3909 file_position=my_pos_cube, mpi_io=mpi_io)
3910 CALL cp_pw_to_cube(stress, unit_nr,
"LOCAL STRESS", particles=particles, &
3912 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_STRESS_CUBE%MAX_FILE_SIZE_MB"), &
3914 IF (io_unit > 0)
THEN
3915 INQUIRE (unit=unit_nr, name=filename)
3916 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3917 IF (gapw .OR. gapw_xc)
THEN
3918 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3919 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3921 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3922 "The local stress is written to the file: ", trim(adjustl(filename))
3926 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3928 CALL auxbas_pw_pool%give_back_pw(stress)
3931 CALL timestop(handle)
3933 END SUBROUTINE qs_scf_post_local_stress
3944 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3949 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3951 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3952 INTEGER :: boundary_condition, handle, i, j, &
3953 n_cstr, n_tiles, unit_nr
3954 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3955 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3965 CALL timeset(routinen, handle)
3967 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
3970 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3972 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3974 has_implicit_ps = .false.
3975 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3980 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
3981 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
3982 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
3983 my_pos_cube =
"REWIND"
3984 IF (append_cube)
THEN
3985 my_pos_cube =
"APPEND"
3989 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
3991 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3992 CALL auxbas_pw_pool%create_pw(aux_r)
3994 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3995 SELECT CASE (boundary_condition)
3997 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
3999 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4000 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4001 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4002 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4003 poisson_env%implicit_env%dielectric%eps, aux_r)
4006 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, &
4007 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
4008 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%MAX_FILE_SIZE_MB"), &
4011 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
4013 CALL auxbas_pw_pool%give_back_pw(aux_r)
4018 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
4020 has_dirichlet_bc = .false.
4021 IF (has_implicit_ps)
THEN
4022 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4024 has_dirichlet_bc = .true.
4028 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
4030 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
4031 my_pos_cube =
"REWIND"
4032 IF (append_cube)
THEN
4033 my_pos_cube =
"APPEND"
4037 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
4038 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
4040 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4041 CALL auxbas_pw_pool%create_pw(aux_r)
4043 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4044 SELECT CASE (boundary_condition)
4046 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
4048 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4049 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4050 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4051 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4052 poisson_env%implicit_env%cstr_charge, aux_r)
4055 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, &
4056 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
4057 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%MAX_FILE_SIZE_MB"), &
4060 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
4062 CALL auxbas_pw_pool%give_back_pw(aux_r)
4067 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
4068 has_dirichlet_bc = .false.
4069 IF (has_implicit_ps)
THEN
4070 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4072 has_dirichlet_bc = .true.
4076 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
4077 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
4078 my_pos_cube =
"REWIND"
4079 IF (append_cube)
THEN
4080 my_pos_cube =
"APPEND"
4082 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
4084 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4085 CALL auxbas_pw_pool%create_pw(aux_r)
4088 IF (tile_cubes)
THEN
4090 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4092 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4094 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
4097 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4098 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
4101 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
4103 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
4104 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4105 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4108 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4113 NULLIFY (dirichlet_tile)
4114 ALLOCATE (dirichlet_tile)
4115 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
4118 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4119 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
4122 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4124 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4126 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
4127 CALL pw_axpy(dirichlet_tile, aux_r)
4131 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
4132 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4133 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4136 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4137 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
4138 DEALLOCATE (dirichlet_tile)
4141 CALL auxbas_pw_pool%give_back_pw(aux_r)
4144 CALL timestop(handle)
4146 END SUBROUTINE qs_scf_post_ps_implicit
4154 SUBROUTINE write_adjacency_matrix(qs_env, input)
4158 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
4160 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
4161 ind, jatom, jkind, k, natom, nkind, &
4162 output_unit, rowind, unit_nr
4163 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
4164 LOGICAL :: do_adjm_write, do_symmetric
4170 DIMENSION(:),
POINTER :: nl_iterator
4173 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
4176 CALL timeset(routinen, handle)
4178 NULLIFY (dft_section)
4187 IF (do_adjm_write)
THEN
4188 NULLIFY (qs_kind_set, nl_iterator)
4189 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
4191 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
4193 nkind =
SIZE(qs_kind_set)
4194 cpassert(
SIZE(nl) > 0)
4196 cpassert(do_symmetric)
4197 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
4201 adjm_size = ((natom + 1)*natom)/2
4202 ALLOCATE (interact_adjm(4*adjm_size))
4205 NULLIFY (nl_iterator)
4209 ikind=ikind, jkind=jkind, &
4210 iatom=iatom, jatom=jatom)
4212 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
4213 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
4214 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
4215 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
4218 IF (iatom <= jatom)
THEN
4225 ikind = ikind + jkind
4226 jkind = ikind - jkind
4227 ikind = ikind - jkind
4231 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
4234 interact_adjm((ind - 1)*4 + 1) = rowind
4235 interact_adjm((ind - 1)*4 + 2) = colind
4236 interact_adjm((ind - 1)*4 + 3) = ikind
4237 interact_adjm((ind - 1)*4 + 4) = jkind
4240 CALL para_env%sum(interact_adjm)
4243 extension=
".adjmat", file_form=
"FORMATTED", &
4244 file_status=
"REPLACE")
4245 IF (unit_nr > 0)
THEN
4246 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
4247 DO k = 1, 4*adjm_size, 4
4249 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
4250 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
4258 DEALLOCATE (basis_set_list_a, basis_set_list_b)
4261 CALL timestop(handle)
4263 END SUBROUTINE write_adjacency_matrix
4271 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
4275 LOGICAL :: use_virial
4285 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
4286 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
4287 rho_core=rho_core, virial=virial, &
4288 v_hartree_rspace=v_hartree_rspace)
4290 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
4292 IF (.NOT. use_virial)
THEN
4294 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
4295 poisson_env=poisson_env)
4296 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
4297 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
4301 v_hartree_gspace, rho_core=rho_core)
4303 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
4304 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
4306 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
4307 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
4310 END SUBROUTINE update_hartree_with_mp2
static double norm_factor(double alpha, int L)
Types and set/get functions for auxiliary density matrix methods.
Contains methods used in the context of density fitting.
subroutine, public admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public sg_overlap(smat, l, pa, pb)
...
calculate the orbitals for a given atomic kind type
subroutine, public calculate_atomic_density(density, atomic_kind, qs_kind, ngto, iunit, optbasis, allelectron, confine)
...
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Writer for CASINO gwfn.data files.
subroutine, public write_casino(qs_env, casino_section)
Write a CASINO gwfn.data file from the converged GPW/GAPW wavefunction.
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers, cartesian_basis)
...
Density Derived atomic point charges from a QM calculation (see Bloechl, J. Chem. Phys....
recursive subroutine, public get_ddapc(qs_env, calc_force, density_fit_section, density_type, qout1, qout2, out_radii, dq_out, ext_rho_tot_g, itype_of_density, iwc)
Computes the Density Derived Atomic Point Charges.
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
subroutine, public cp_openpmd_close_iterations()
integer function, public cp_openpmd_print_key_unit_nr(logger, basis_section, print_key_path, middle_name, ignore_should_output, mpi_io, fout, openpmd_basename, openpmd_unit_dimension, openpmd_unit_si, sim_time)
...
subroutine, public cp_openpmd_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, mpi_io)
should be called after you finish working with a unit obtained with cp_openpmd_print_key_unit_nr,...
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
character(len=default_string_length) function, public cp_iter_string(iter_info, print_key, for_file)
returns the iteration string, a string that is useful to create unique filenames (once you trim it)
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
A wrapper around pw_to_openpmd() which accepts particle_list_type.
subroutine, public cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
...
set of type/routines to handle the storage of results in force_envs
set of type/routines to handle the storage of results in force_envs
the type I Discrete Cosine Transform (DCT-I)
subroutine, public pw_shrink(neumann_directions, dests_shrink, srcs_shrink, bounds_local_shftd, pw_in, pw_shrinked)
shrinks an evenly symmetric pw_r3d_rs_type data to a pw_r3d_rs_type data that is 8 times smaller (the...
Calculate Energy Decomposition analysis.
subroutine, public edmf_analysis(qs_env, input_section, unit_nr)
...
Calculation of charge equilibration method.
subroutine, public eeq_print(qs_env, iounit, print_level, ext)
...
Definition and initialisation of the et_coupling data type.
subroutine, public set_et_coupling_type(et_coupling, et_mo_coeff, rest_mat)
...
GAPW reciprocal-space reconstruction and its discrete adjoint.
subroutine, public calculate_rhotot_elec_gspace(qs_env, auxbas_pw_pool, rhotot_elec_gspace, q_max, rho_hard, rho_soft, fsign, compute_tau, rho_source, allow_nonorthorhombic)
The total electronic density in reciprocal space (g-space) is calculated.
subroutine, public print_ri_hfx(ri_data, qs_env)
Print RI-HFX quantities, as required by the PRINT subsection.
Calculate Hirshfeld charges and related functions.
subroutine, public comp_hirshfeld_charges(qs_env, hirshfeld_env, charges)
...
subroutine, public create_shape_function(hirshfeld_env, qs_kind_set, atomic_kind_set, radius, radii_list)
creates kind specific shape functions for Hirshfeld charges
subroutine, public write_hirshfeld_charges(charges, hirshfeld_env, particle_set, qs_kind_set, unit_nr)
...
subroutine, public comp_hirshfeld_i_charges(qs_env, hirshfeld_env, charges, ounit)
...
subroutine, public save_hirshfeld_charges(charges, particle_set, qs_kind_set, qs_env)
saves the Hirshfeld charges to the results structure
The types needed for the calculation of Hirshfeld charges and related functions.
subroutine, public create_hirshfeld_type(hirshfeld_env)
...
subroutine, public set_hirshfeld_info(hirshfeld_env, shape_function_type, iterative, ref_charge, fnorm, radius_type, use_bohr)
Set values of a Hirshfeld env.
subroutine, public release_hirshfeld_type(hirshfeld_env)
...
Calculate intrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
...
Calculate ntrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_read_input(iao_env, iao_section, cell)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
K-point MO wavefunction dump to TEXT file for post-processing (PDOS, etc.)
subroutine, public write_kpoint_mo_data(qs_env, print_section)
Write k-point resolved MO data to formatted text file.
Types and basic routines needed for a kpoint calculation.
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Routines for the calculation of moments from Wannier functions.
subroutine, public calculate_kg_moments(qs_env, unit_nr, max_moment, magnetic, vel_reprs, com_nl)
Calculates multipole moments per molecule from the Kim-Gordon AO density matrix.
Calculate MAO's and analyze wavefunctions.
subroutine, public mao_analysis(qs_env, input_section, unit_nr)
...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Utility routines for the memory handling.
Interface to the message passing library MPI.
Calculate localized minimal basis and analyze wavefunctions.
subroutine, public minbas_analysis(qs_env, input_section, unit_nr)
...
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section, cell, unoccupied_orbs, unoccupied_evals, qs_env, calc_energies)
Write out the MOs in molden format for visualisation.
Define the data structure for the molecule information.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:, :), allocatable, public indso
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public a_bohr
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
real(kind=dp), parameter, public debye
Provide various population analyses and print the requested output information.
subroutine, public lowdin_population_analysis(qs_env, output_unit, print_level)
Perform a Lowdin population analysis based on a symmetric orthogonalisation of the density matrix usi...
subroutine, public mulliken_population_analysis(qs_env, output_unit, print_level)
Perform a Mulliken population analysis.
computes preconditioners, and implements methods to apply them currently used in qs_ot
Types containing essential information for running implicit (iterative) Poisson solver.
integer, parameter, public neumann_bc
integer, parameter, public mixed_bc
integer, parameter, public mixed_periodic_bc
integer, parameter, public periodic_bc
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
This module defines the grid data type and some basic operations on it.
subroutine, public get_pw_grid_info(pw_grid, id_nr, mode, vol, dvol, npts, ngpts, ngpts_cut, dr, cutoff, orthorhombic, gvectors, gsquare)
Access to information stored in the pw_grid_type.
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_implicit
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Write wfx file, works as interface to chargemol and multiwfn.
subroutine, public write_wfx(qs_env, dft_section)
...
container for information about total charges on the grids
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
Calculation of commutator [H,r] matrices.
subroutine, public build_com_hr_matrix(qs_env, matrix_hr)
Calculation of the [H,r] commutators matrices over Cartesian Gaussian functions.
Calculation of the energies concerning the core charge distribution.
Utilities for broadened DOS and PDOS output.
subroutine, public get_dos_pdos_flags(dos_section, do_dos_output, do_projected_dos, do_pdos, do_curve)
Resolve projected-DOS requests from a DOS print section.
Calculation and writing of density of states.
subroutine, public calculate_dos_kp(qs_env, dft_section, write_curve_output)
Compute and write density of states (kpoints)
subroutine, public calculate_dos(mos, dft_section, unoccupied_evals, smearing_enabled, write_curve_output)
Compute and write density of states.
Calculates electric field gradients H.M. Petrili, P.E. Blochl, P. Blaha, K. Schwarz,...
subroutine, public qs_efg_calc(qs_env)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public qs_elf_calc(qs_env, elf_r, rho_cutoff)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public energy_windows(qs_env)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Calculates hyperfine values.
subroutine, public qs_epr_hyp_calc(qs_env)
...
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Finite-volume Kubo-Greenwood transport from converged Quickstep matrices.
subroutine, public qs_scf_post_kubo_transport(qs_env)
Compute and print the finite-volume Kubo-Greenwood conductivity tensor.
subroutine, public loc_dipole(input, dft_control, qs_loc_env, logger, qs_env)
Computes and prints the Dipole (using localized charges)
subroutine, public get_localization_info(qs_env, qs_loc_env, loc_section, mo_local, wf_r, wf_g, particles, coeff, evals, marked_states)
Performs localization of the orbitals.
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public qs_loc_env_release(qs_loc_env)
...
subroutine, public qs_loc_env_create(qs_loc_env)
...
Some utilities for the construction of the localization environment.
subroutine, public loc_write_restart(qs_loc_env, section, mo_array, coeff_localized, do_homo, evals, do_mixed)
...
subroutine, public qs_loc_env_init(qs_loc_env, localized_wfn_control, qs_env, myspin, do_localize, loc_coeff, mo_loc_history)
allocates the data, and initializes the operators
subroutine, public qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_mixed, do_xas, nloc_xas, spin_xas)
initializes everything needed for localization of the HOMOs
subroutine, public retain_history(mo_loc_history, mo_loc)
copy old mos to new ones, allocating as necessary
subroutine, public qs_loc_init(qs_env, qs_loc_env, localize_section, mos_localized, do_homo, do_mo_cubes, mo_loc_history, evals, tot_zeff_corr, do_mixed)
initializes everything needed for localization of the molecular orbitals
Routines for calculating local energy and stress tensor.
subroutine, public qs_local_stress(qs_env, stress_tensor, beta)
Routine to calculate the local stress.
subroutine, public qs_local_energy(qs_env, energy_density)
Routine to calculate the local energy.
Definition and initialisation of the mo data type.
subroutine, public write_dm_binary_restart(mo_array, dft_section, tmpl_matrix)
calculates density matrix from mo set and writes the density matrix into a binary restart file
collects routines that perform operations directly related to MOs
subroutine, public make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env, hairy_probes, probe)
Calculate KS eigenvalues starting from OF MOS.
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public qs_moment_locop(qs_env, magnetic, nmoments, reference, ref_point, unit_number, vel_reprs, com_nl)
...
subroutine, public qs_moment_kpoints(qs_env, nmoments, reference, ref_point, max_nmo, unit_number)
Calculate and print dipole moment elements d_nm(k) for k-point calculations.
subroutine, public qs_moment_berry_phase(qs_env, magnetic, nmoments, reference, ref_point, unit_number)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
Calculation and writing of projected density of states The DOS is computed per angular momentum and p...
subroutine, public calculate_projected_dos_kp(qs_env, dft_section, pdos_print_key, write_pdos, write_pdos_curve)
Compute and write broadened projected density of states for k-point calculations.
subroutine, public calculate_projected_dos(mo_set, atomic_kind_set, qs_kind_set, particle_set, qs_env, dft_section, ispin, xas_mittle, external_matrix_shalf, unoccupied_orbs, unoccupied_evals, pdos_print_key, write_pdos, write_pdos_curve)
Compute and write projected density of states.
provides a resp fit for gas phase systems
subroutine, public resp_fit(qs_env)
performs resp fit and generates RESP charges
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Functions to print the KS and S matrix in the CSR format to file.
subroutine, public write_s_matrix_csr(qs_env, input)
writing the overlap matrix in csr format into a file
subroutine, public write_ks_matrix_csr(qs_env, input)
writing the KS matrix in csr format into a file
subroutine, public write_p_matrix_csr(qs_env, input)
writing the density matrix in csr format into a file
subroutine, public write_hcore_matrix_csr(qs_env, input)
writing the core Hamiltonian matrix in csr format into a file
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
Gets the LUMOs and their eigenvalues for all spin channels.
subroutine, public write_mo_free_results(qs_env)
Write QS results always available (if switched on through the print_keys) Can be called from ls_scf.
subroutine, public qs_scf_post_moments(input, logger, qs_env, output_unit)
Computes and prints electric moments.
subroutine, public write_mo_dependent_results(qs_env, scf_env)
Write QS results available if MO's are present (if switched on through the print_keys) Writes only MO...
subroutine, public scf_post_calculation_gpw(qs_env, wf_type, do_mp2)
collects possible post - scf calculations and prints info / computes properties.
character(len=default_string_length) function cp_section_key_concat_to_absolute(self, extend_by)
Append extend_by to the absolute path of the base section.
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, unoccupied_orbs, scf_env, matrix_s, marked_states, for_rtp)
writes a new 'mixed' set of mos to restart file, without touching the current MOs
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Interface to Wannier90 code.
subroutine, public wannier90_interface(input, logger, qs_env)
...
Methods related to (\cal S)^2 (i.e. spin)
subroutine, public compute_s_square(mos, matrix_s, s_square, s_square_ideal, mo_derivs, strength)
Compute the expectation value <(\cal S)^2> of the single determinant defined by the spin up (alpha) a...
parameters that control an scf iteration
Calculation of STM image as post processing of an electronic structure calculation,...
subroutine, public th_stm_image(qs_env, stm_section, particles, unoccupied_orbs, unoccupied_evals)
Driver for the calculation of STM image, as post processing of a ground-state electronic structure ca...
routines for DFT+NEGF calculations (coupling with the quantum transport code OMEN)
subroutine, public qs_scf_post_transport(qs_env)
post scf calculations for transport
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public write_trexio(qs_env, trexio_section, energy_derivative)
Write a trexio file.
Interface for Voronoi Integration and output of BQB files.
subroutine, public entry_voronoi_or_bqb(do_voro, do_bqb, input_voro, input_bqb, unit_voro, qs_env, rspace_pw)
Does a Voronoi integration of density or stores the density to compressed BQB format.
subroutine, public xray_diffraction_spectrum(qs_env, unit_number, q_max)
Calculate the coherent X-ray diffraction spectrum using the total electronic density in reciprocal sp...
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.