222#include "./base/base_uses.f90"
228 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
235 CHARACTER(len=*),
PARAMETER :: &
236 str_mo_cubes =
"PRINT%MO_CUBES", &
237 str_mo_openpmd =
"PRINT%MO_OPENPMD", &
238 str_elf_cubes =
"PRINT%ELF_CUBE", &
239 str_elf_openpmd =
"PRINT%ELF_OPENPMD", &
240 str_e_density_cubes =
"PRINT%E_DENSITY_CUBE", &
241 str_e_density_openpmd =
"PRINT%E_DENSITY_OPENPMD"
243 INTEGER,
PARAMETER :: grid_output_cubes = 1, grid_output_openpmd = 2
245 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_density = &
246 [-3, 0, 0, 0, 0, 0, 0]
247 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_dimensionless = &
248 [0, 0, 0, 0, 0, 0, 0]
249 REAL(kind=
dp),
DIMENSION(7),
PARAMETER :: openpmd_unit_dimension_wavefunction = &
250 [-1.5_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp]
251 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_density =
a_bohr**(-3)
252 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_dimensionless = 1.0_dp
253 REAL(kind=
dp),
PARAMETER :: openpmd_unit_si_wavefunction =
a_bohr**(-1.5_dp)
259 CHARACTER(len=default_string_length) :: relative_section_key =
""
260 CHARACTER(len=default_string_length) :: absolute_section_key =
""
261 CHARACTER(len=7) :: format_name =
""
262 INTEGER :: grid_output = -1
263 LOGICAL :: do_output = .false.
266 PROCEDURE,
PUBLIC :: print_key_unit_nr => cp_forward_print_key_unit_nr
268 PROCEDURE,
PUBLIC :: write_pw => cp_forward_write_pw
270 PROCEDURE,
PUBLIC :: print_key_finished_output => cp_forward_print_key_finished_output
272 PROCEDURE,
PUBLIC :: do_openpmd => cp_section_key_do_openpmd
273 PROCEDURE,
PUBLIC :: do_cubes => cp_section_key_do_cubes
274 PROCEDURE,
PUBLIC :: concat_to_relative => cp_section_key_concat_to_relative
276 END TYPE cp_section_key
287 CLASS(cp_section_key),
INTENT(IN) :: self
288 CHARACTER(*),
INTENT(IN) :: extend_by
289 CHARACTER(len=default_string_length) :: res
291 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
292 res = trim(self%absolute_section_key)//trim(extend_by)
294 res = trim(self%absolute_section_key)//
"%"//trim(extend_by)
304 FUNCTION cp_section_key_concat_to_relative(self, extend_by)
RESULT(res)
305 CLASS(cp_section_key),
INTENT(IN) :: self
306 CHARACTER(*),
INTENT(IN) :: extend_by
307 CHARACTER(len=default_string_length) :: res
309 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
310 res = trim(self%relative_section_key)//trim(extend_by)
312 res = trim(self%relative_section_key)//
"%"//trim(extend_by)
314 END FUNCTION cp_section_key_concat_to_relative
321 FUNCTION cp_section_key_do_cubes(self)
RESULT(res)
322 CLASS(cp_section_key) :: self
325 res = self%do_output .AND. self%grid_output == grid_output_cubes
326 END FUNCTION cp_section_key_do_cubes
333 FUNCTION cp_section_key_do_openpmd(self)
RESULT(res)
334 CLASS(cp_section_key) :: self
337 res = self%do_output .AND. self%grid_output == grid_output_openpmd
338 END FUNCTION cp_section_key_do_openpmd
368 FUNCTION cp_forward_print_key_unit_nr( &
377 ignore_should_output, &
388 openpmd_unit_dimension, &
390 sim_time)
RESULT(res)
392 CLASS(cp_section_key),
INTENT(IN) :: self
395 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
396 CHARACTER(len=*),
INTENT(IN) :: extension
397 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
398 LOGICAL,
INTENT(IN),
OPTIONAL :: local, log_filename, ignore_should_output
399 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: file_form, file_position, file_action, &
401 LOGICAL,
INTENT(IN),
OPTIONAL :: do_backup, on_file
402 LOGICAL,
INTENT(OUT),
OPTIONAL :: is_new_file
403 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
404 CHARACTER(len=default_path_length),
INTENT(OUT), &
406 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
407 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
408 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
409 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
412 IF (self%grid_output == grid_output_cubes)
THEN
414 logger, basis_section, print_key_path, extension=extension, &
415 middle_name=middle_name, local=local, log_filename=log_filename, &
416 ignore_should_output=ignore_should_output, file_form=file_form, &
417 file_position=file_position, file_action=file_action, &
418 file_status=file_status, do_backup=do_backup, on_file=on_file, &
419 is_new_file=is_new_file, mpi_io=mpi_io, fout=fout)
425 middle_name=middle_name, &
426 ignore_should_output=ignore_should_output, &
429 openpmd_basename=openpmd_basename, &
430 openpmd_unit_dimension=openpmd_unit_dimension, &
431 openpmd_unit_si=openpmd_unit_si, &
434 END FUNCTION cp_forward_print_key_unit_nr
452 SUBROUTINE cp_forward_write_pw( &
465 CLASS(cp_section_key),
INTENT(IN) :: self
467 INTEGER,
INTENT(IN) :: unit_nr
468 CHARACTER(*),
INTENT(IN),
OPTIONAL :: title
470 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: stride
471 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: max_file_size_mb
472 LOGICAL,
INTENT(IN),
OPTIONAL :: zero_tails, silent, mpi_io
473 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: zeff
475 IF (self%grid_output == grid_output_cubes)
THEN
476 CALL cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
478 CALL cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
480 END SUBROUTINE cp_forward_write_pw
496 SUBROUTINE cp_forward_print_key_finished_output(self, unit_nr, logger, basis_section, &
497 print_key_path, local, ignore_should_output, on_file, &
499 CLASS(cp_section_key),
INTENT(IN) :: self
500 INTEGER,
INTENT(INOUT) :: unit_nr
503 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
504 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, on_file, &
507 IF (self%grid_output == grid_output_cubes)
THEN
512 END SUBROUTINE cp_forward_print_key_finished_output
532 FUNCTION cube_or_openpmd(input, str_cubes, str_openpmd, logger)
RESULT(res)
534 CHARACTER(len=*),
INTENT(IN) :: str_cubes, str_openpmd
536 TYPE(cp_section_key) :: res
538 LOGICAL :: do_cubes, do_openpmd
541 logger%iter_info, input, &
542 "DFT%"//trim(adjustl(str_cubes))),
cp_p_file)
544 logger%iter_info, input, &
545 "DFT%"//trim(adjustl(str_openpmd))),
cp_p_file)
549 cpassert(.NOT. (do_cubes .AND. do_openpmd))
550 res%do_output = do_cubes .OR. do_openpmd
552 res%grid_output = grid_output_openpmd
553 res%relative_section_key = trim(adjustl(str_openpmd))
554 res%format_name =
"openPMD"
556 res%grid_output = grid_output_cubes
557 res%relative_section_key = trim(adjustl(str_cubes))
558 res%format_name =
"Cube"
560 res%absolute_section_key =
"DFT%"//trim(adjustl(res%relative_section_key))
561 END FUNCTION cube_or_openpmd
569 FUNCTION section_key_do_write(grid_output)
RESULT(res)
570 INTEGER,
INTENT(IN) :: grid_output
571 CHARACTER(len=32) :: res
573 IF (grid_output == grid_output_cubes)
THEN
575 ELSE IF (grid_output == grid_output_openpmd)
THEN
576 res =
"%WRITE_OPENPMD"
578 END FUNCTION section_key_do_write
587 SUBROUTINE print_density_output_message(output_unit, prefix, e_density_section, filename)
588 INTEGER,
INTENT(IN) :: output_unit
589 CHARACTER(len=*),
INTENT(IN) :: prefix
590 TYPE(cp_section_key),
INTENT(IN) :: e_density_section
591 CHARACTER(len=*),
INTENT(IN) :: filename
593 IF (e_density_section%grid_output == grid_output_openpmd)
THEN
594 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
595 trim(prefix)//
" is written in " &
596 //e_density_section%format_name &
597 //
" file format to the file / file pattern:", &
600 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
601 trim(prefix)//
" is written in " &
602 //e_density_section%format_name &
603 //
" file format to the file:", &
606 END SUBROUTINE print_density_output_message
629 CHARACTER(6),
OPTIONAL :: wf_type
630 LOGICAL,
OPTIONAL :: do_mp2
632 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw', &
633 warning_cube_kpoint =
"Print MO cubes not implemented for k-point calculations", &
634 warning_openpmd_kpoint =
"Writing to openPMD not implemented for k-point calculations"
636 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
637 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
638 nlumos, nmo, nspins, output_unit, &
640 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
641 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_stm, &
642 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
643 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
645 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
646 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
649 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
650 unoccupied_evals, unoccupied_evals_stm
651 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
652 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
653 TARGET :: homo_localized, lumo_localized, &
655 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
656 unoccupied_orbs, unoccupied_orbs_stm
659 TYPE(cp_section_key) :: mo_section
660 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
662 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
674 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
683 localize_section, print_key, &
686 CALL timeset(routinen, handle)
693 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
694 IF (
PRESENT(wf_type))
THEN
695 IF (output_unit > 0)
THEN
696 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
697 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
698 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
705 my_localized_wfn = .false.
706 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
707 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
708 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
709 unoccupied_evals_stm, molecule_set, mo_derivs, &
710 subsys, particles, input, print_key, kinetic_m, marked_states, &
711 mixed_evals, qs_loc_env_mixed)
712 NULLIFY (lumo_ptr, rho_ao)
719 p_loc_mixed = .false.
721 cpassert(
ASSOCIATED(scf_env))
722 cpassert(
ASSOCIATED(qs_env))
725 dft_control=dft_control, &
726 molecule_set=molecule_set, &
727 scf_control=scf_control, &
728 do_kpoints=do_kpoints, &
733 particle_set=particle_set, &
734 atomic_kind_set=atomic_kind_set, &
735 qs_kind_set=qs_kind_set)
736 rtp_control => dft_control%rtp_control
743 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
744 DO ispin = 1, dft_control%nspins
745 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
750 CALL update_hartree_with_mp2(rho, qs_env)
753 CALL write_available_results(qs_env, scf_env)
757 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
759 cpassert(
ASSOCIATED(kinetic_m))
760 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
764 IF (unit_nr > 0)
THEN
765 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
768 "DFT%PRINT%KINETIC_ENERGY")
772 CALL qs_scf_post_charges(input, logger, qs_env)
785 IF (loc_print_explicit)
THEN
807 IF (loc_explicit)
THEN
817 p_loc_mixed = .false.
821 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
822 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
823 "therefore localization of unoccupied states will be skipped!")
834 mo_section = cube_or_openpmd(input, str_mo_cubes, str_mo_openpmd, logger)
836 IF (loc_print_explicit)
THEN
840 do_wannier_cubes = .false.
842 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
843 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
846 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
847 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
849 CALL auxbas_pw_pool%create_pw(wf_r)
850 CALL auxbas_pw_pool%create_pw(wf_g)
853 IF (dft_control%restricted)
THEN
857 nspins = dft_control%nspins
860 IF (dft_control%restricted .AND. (mo_section%do_output .OR. p_loc_homo))
THEN
861 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
866 cpwarn_if(mo_section%do_cubes(), warning_cube_kpoint)
867 cpwarn_if(mo_section%do_openpmd(), warning_openpmd_kpoint)
872 IF ((mo_section%do_output .AND. nhomo /= 0) .OR. do_stm)
THEN
874 IF (dft_control%do_admm)
THEN
876 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
878 IF (dft_control%hairy_probes)
THEN
879 scf_control%smear%do_smear = .false.
880 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
882 probe=dft_control%probe)
884 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
887 DO ispin = 1, dft_control%nspins
888 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
889 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
893 IF (mo_section%do_output .AND. nhomo /= 0)
THEN
896 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
897 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
898 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
899 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
910 cpwarn(
"Localization not implemented for k-point calculations!")
911 ELSE IF (dft_control%restricted &
914 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
916 ALLOCATE (occupied_orbs(dft_control%nspins))
917 ALLOCATE (occupied_evals(dft_control%nspins))
918 ALLOCATE (homo_localized(dft_control%nspins))
919 DO ispin = 1, dft_control%nspins
920 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
921 eigenvalues=mo_eigenvalues)
922 occupied_orbs(ispin) = mo_coeff
923 occupied_evals(ispin)%array => mo_eigenvalues
924 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
925 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
928 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
931 ALLOCATE (qs_loc_env_homo)
934 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
935 mo_section%do_output, mo_loc_history=mo_loc_history)
937 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
940 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
942 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
947 homo_localized, do_homo)
949 DEALLOCATE (occupied_orbs)
950 DEALLOCATE (occupied_evals)
952 IF (qs_loc_env_homo%do_localize)
THEN
953 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
960 IF (mo_section%do_output .OR. p_loc_lumo)
THEN
962 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
965 compute_lumos = mo_section%do_output .AND. nlumo /= 0
966 compute_lumos = compute_lumos .OR. p_loc_lumo
968 DO ispin = 1, dft_control%nspins
969 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
970 compute_lumos = compute_lumos .AND. homo == nmo
973 IF (mo_section%do_output .AND. .NOT. compute_lumos)
THEN
975 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
976 DO ispin = 1, dft_control%nspins
978 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
979 IF (nlumo > nmo - homo)
THEN
982 IF (nlumo == -1)
THEN
985 IF (output_unit > 0)
WRITE (output_unit, *)
" "
986 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
987 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
988 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
991 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
992 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
993 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1, mo_section=mo_section)
999 IF (compute_lumos)
THEN
1000 check_write = .true.
1002 IF (nlumo == 0) check_write = .false.
1003 IF (p_loc_lumo)
THEN
1005 ALLOCATE (qs_loc_env_lumo)
1008 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
1011 ALLOCATE (unoccupied_orbs(dft_control%nspins))
1012 ALLOCATE (unoccupied_evals(dft_control%nspins))
1013 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
1014 lumo_ptr => unoccupied_orbs
1015 DO ispin = 1, dft_control%nspins
1017 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
1018 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
1019 IF (check_write)
THEN
1020 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
1022 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1023 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin, mo_section=mo_section)
1027 IF (p_loc_lumo)
THEN
1028 ALLOCATE (lumo_localized(dft_control%nspins))
1029 DO ispin = 1, dft_control%nspins
1030 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
1031 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
1033 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, mo_section%do_output, &
1034 evals=unoccupied_evals)
1035 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
1036 loc_coeff=unoccupied_orbs)
1038 lumo_localized, wf_r, wf_g, particles, &
1039 unoccupied_orbs, unoccupied_evals, marked_states)
1040 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
1041 evals=unoccupied_evals)
1042 lumo_ptr => lumo_localized
1046 IF (has_homo .AND. has_lumo)
THEN
1047 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1048 DO ispin = 1, dft_control%nspins
1049 IF (.NOT. scf_control%smear%do_smear)
THEN
1050 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
1051 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
1052 "HOMO - LUMO gap [eV] :", gap*
evolt
1058 IF (p_loc_mixed)
THEN
1059 IF (do_kpoints)
THEN
1060 cpwarn(
"Localization not implemented for k-point calculations!")
1061 ELSE IF (dft_control%restricted)
THEN
1062 IF (output_unit > 0)
WRITE (output_unit, *) &
1063 " Unclear how we define MOs / localization in the restricted case... skipping"
1066 ALLOCATE (mixed_orbs(dft_control%nspins))
1067 ALLOCATE (mixed_evals(dft_control%nspins))
1068 ALLOCATE (mixed_localized(dft_control%nspins))
1069 DO ispin = 1, dft_control%nspins
1070 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1071 eigenvalues=mo_eigenvalues)
1072 mixed_orbs(ispin) = mo_coeff
1073 mixed_evals(ispin)%array => mo_eigenvalues
1074 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
1075 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
1078 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
1081 total_zeff_corr = scf_env%sum_zeff_corr
1082 ALLOCATE (qs_loc_env_mixed)
1085 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
1086 mo_section%do_output, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
1089 DO ispin = 1, dft_control%nspins
1090 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
1094 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
1097 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
1099 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
1106 DEALLOCATE (mixed_orbs)
1107 DEALLOCATE (mixed_evals)
1112 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
1113 CALL auxbas_pw_pool%give_back_pw(wf_r)
1114 CALL auxbas_pw_pool%give_back_pw(wf_g)
1118 IF (.NOT. do_kpoints)
THEN
1119 IF (p_loc_homo)
THEN
1121 DEALLOCATE (qs_loc_env_homo)
1123 IF (p_loc_lumo)
THEN
1125 DEALLOCATE (qs_loc_env_lumo)
1127 IF (p_loc_mixed)
THEN
1129 DEALLOCATE (qs_loc_env_mixed)
1134 IF (do_kpoints)
THEN
1137 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
1138 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
1139 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
1140 matrix_s=matrix_s, marked_states=marked_states)
1144 IF (
ASSOCIATED(marked_states))
THEN
1145 DEALLOCATE (marked_states)
1149 IF (.NOT. do_kpoints)
THEN
1150 IF (compute_lumos)
THEN
1151 DO ispin = 1, dft_control%nspins
1152 DEALLOCATE (unoccupied_evals(ispin)%array)
1155 DEALLOCATE (unoccupied_evals)
1156 DEALLOCATE (unoccupied_orbs)
1162 IF (do_kpoints)
THEN
1163 cpwarn(
"STM not implemented for k-point calculations!")
1165 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
1166 IF (nlumo_stm > 0)
THEN
1167 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
1168 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
1169 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
1173 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
1174 unoccupied_evals_stm)
1176 IF (nlumo_stm > 0)
THEN
1177 DO ispin = 1, dft_control%nspins
1178 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
1180 DEALLOCATE (unoccupied_evals_stm)
1187 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1190 CALL qs_scf_post_efg(input, logger, qs_env)
1193 CALL qs_scf_post_et(input, qs_env, dft_control)
1196 CALL qs_scf_post_epr(input, logger, qs_env)
1199 CALL qs_scf_post_molopt(input, logger, qs_env)
1202 CALL qs_scf_post_elf(input, logger, qs_env)
1209 DO ispin = 1, dft_control%nspins
1210 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
1218 CALL timestop(handle)
1231 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
1235 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
1237 INTEGER,
INTENT(IN) :: nlumo
1238 INTEGER,
INTENT(OUT) :: nlumos
1240 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
1242 INTEGER :: handle, homo, ispin, n, nao, nmo, &
1249 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1256 CALL timeset(routinen, handle)
1258 NULLIFY (ks_rmpv, matrix_s, scf_control, dft_control, admm_env, para_env, blacs_env, mos)
1260 matrix_ks=ks_rmpv, &
1261 matrix_s=matrix_s, &
1262 scf_control=scf_control, &
1263 dft_control=dft_control, &
1264 admm_env=admm_env, &
1265 para_env=para_env, &
1266 blacs_env=blacs_env, &
1272 DO ispin = 1, dft_control%nspins
1273 NULLIFY (unoccupied_evals(ispin)%array)
1274 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1275 IF (output_unit > 0)
WRITE (output_unit, *) &
1276 " Using OT eigensolver for additional unoccupied orbitals spin ", ispin
1277 IF (output_unit > 0)
WRITE (output_unit, *) &
1278 " Lowest Eigenvalues of the unoccupied subspace spin ", ispin
1279 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
1280 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1282 nlumos = max(1, min(nlumo, nao - nmo))
1283 IF (nlumo == -1) nlumos = nao - nmo
1284 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1286 nrow_global=n, ncol_global=nlumos)
1287 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1292 NULLIFY (local_preconditioner)
1293 IF (
ASSOCIATED(scf_env))
THEN
1294 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1295 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1298 NULLIFY (local_preconditioner)
1304 IF (dft_control%do_admm)
THEN
1308 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1309 matrix_c_fm=unoccupied_orbs(ispin), &
1310 matrix_orthogonal_space_fm=mo_coeff, &
1311 eps_gradient=scf_control%eps_lumos, &
1313 iter_max=scf_control%max_iter_lumos, &
1314 size_ortho_space=nmo)
1317 unoccupied_evals(ispin)%array, scr=output_unit, &
1318 ionode=output_unit > 0)
1321 IF (dft_control%do_admm)
THEN
1327 CALL timestop(handle)
1337 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
1342 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
1344 INTEGER :: handle, print_level, unit_nr
1345 LOGICAL :: do_kpoints, print_it
1348 CALL timeset(routinen, handle)
1350 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
1358 log_filename=.false.)
1361 IF (print_it) print_level = 2
1363 IF (print_it) print_level = 3
1374 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
1375 log_filename=.false.)
1377 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
1381 CALL timestop(handle)
1383 END SUBROUTINE qs_scf_post_charges
1400 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1401 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
1410 INTEGER,
INTENT(IN) :: homo, ispin
1411 TYPE(cp_section_key) :: mo_section
1413 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1415 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1416 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1418 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1419 LOGICAL :: append_cube, mpi_io
1424 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1426 CALL timeset(routinen, handle)
1431 cpassert(mo_section%grid_output /= grid_output_openpmd)
1434 NULLIFY (list_index)
1437 ,
cp_p_file) .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1438 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
1440 IF (mo_section%grid_output == grid_output_cubes)
THEN
1441 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1443 my_pos_cube =
"REWIND"
1444 IF (append_cube)
THEN
1445 my_pos_cube =
"APPEND"
1447 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), n_rep_val=n_rep)
1452 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), i_rep_val=ir, &
1454 IF (
ASSOCIATED(
list))
THEN
1456 DO i = 1,
SIZE(
list)
1457 list_index(i + nlist) =
list(i)
1459 nlist = nlist +
SIZE(
list)
1464 IF (nhomo == -1) nhomo = homo
1465 nlist = homo - max(1, homo - nhomo + 1) + 1
1466 ALLOCATE (list_index(nlist))
1468 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1472 ivector = list_index(i)
1474 atomic_kind_set=atomic_kind_set, &
1475 qs_kind_set=qs_kind_set, &
1477 particle_set=particle_set, &
1480 cell, dft_control, particle_set, pw_env)
1481 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1484 unit_nr = mo_section%print_key_unit_nr( &
1487 mo_section%absolute_section_key, &
1488 extension=
".cube", &
1489 middle_name=trim(filename), &
1490 file_position=my_pos_cube, &
1491 log_filename=.false., &
1493 openpmd_basename=
"dft-mo", &
1494 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1495 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1496 sim_time=qs_env%sim_time)
1497 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1498 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1499 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1500 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1502 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1504 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1507 CALL timestop(handle)
1509 END SUBROUTINE qs_scf_post_occ_cubes
1528 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1529 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo, mo_section)
1535 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1539 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1540 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1541 TYPE(cp_section_key) :: mo_section
1543 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1545 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1546 INTEGER :: handle, ifirst, index_mo, ivector, &
1548 LOGICAL :: append_cube, mpi_io
1553 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1555 CALL timeset(routinen, handle)
1560 cpassert(mo_section%grid_output /= grid_output_openpmd)
1564 .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1565 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1567 IF (mo_section%grid_output == grid_output_cubes)
THEN
1568 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1570 my_pos_cube =
"REWIND"
1571 IF (append_cube)
THEN
1572 my_pos_cube =
"APPEND"
1575 IF (
PRESENT(lumo)) ifirst = lumo
1576 DO ivector = ifirst, ifirst + nlumos - 1
1578 atomic_kind_set=atomic_kind_set, &
1579 qs_kind_set=qs_kind_set, &
1581 particle_set=particle_set, &
1584 qs_kind_set, cell, dft_control, particle_set, pw_env)
1586 IF (ifirst == 1)
THEN
1587 index_mo = homo + ivector
1591 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1594 unit_nr = mo_section%print_key_unit_nr( &
1597 mo_section%absolute_section_key, &
1598 extension=
".cube", &
1599 middle_name=trim(filename), &
1600 file_position=my_pos_cube, &
1601 log_filename=.false., &
1603 openpmd_basename=
"dft-mo", &
1604 openpmd_unit_dimension=openpmd_unit_dimension_wavefunction, &
1605 openpmd_unit_si=openpmd_unit_si_wavefunction, &
1606 sim_time=qs_env%sim_time)
1607 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1608 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1609 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1610 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1612 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1617 CALL timestop(handle)
1619 END SUBROUTINE qs_scf_post_unocc_cubes
1632 INTEGER,
INTENT(IN) :: output_unit
1634 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1636 CHARACTER(LEN=default_path_length) :: filename
1637 INTEGER :: handle, max_nmo, maxmom, moments_format, &
1638 moments_unit_nr, reference, unit_nr
1639 LOGICAL :: com_nl, do_kg, do_kpoints, magnetic, &
1640 new_file, periodic, second_ref_point, &
1642 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1645 CALL timeset(routinen, handle)
1648 subsection_name=
"DFT%PRINT%MOMENTS")
1653 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1655 keyword_name=
"DFT%PRINT%MOMENTS%FORMAT")
1657 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1659 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1661 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1663 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1665 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1667 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1669 keyword_name=
"DFT%PRINT%MOMENTS%KG")
1671 keyword_name=
"DFT%PRINT%MOMENTS%MAX_NMO")
1676 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1677 middle_name=
"moments", log_filename=.false., &
1678 is_new_file=new_file)
1680 IF (output_unit > 0)
THEN
1681 IF (unit_nr /= output_unit)
THEN
1682 INQUIRE (unit=unit_nr, name=filename)
1683 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1684 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1687 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1691 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1694 IF (do_kpoints)
THEN
1695 cpabort(
"MOMENTS FORMAT TRAJECTORY is not available for k-point calculations.")
1697 IF (maxmom /= 1) cpabort(
"MOMENTS FORMAT TRAJECTORY requires MAX_MOMENT 1.")
1698 IF (magnetic) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support MAGNETIC moments.")
1699 IF (vel_reprs) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support VEL_REPRS.")
1700 IF (do_kg) cpabort(
"MOMENTS FORMAT TRAJECTORY does not support KG moments.")
1701 moments_unit_nr = -1
1703 moments_unit_nr = unit_nr
1706 IF (do_kpoints)
THEN
1707 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr)
1712 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, moments_unit_nr, vel_reprs, com_nl)
1719 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS|")
1723 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1725 IF (second_ref_point)
THEN
1727 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1732 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1733 middle_name=
"moments_refpoint_2", log_filename=.false., &
1734 is_new_file=new_file)
1736 IF (output_unit > 0)
THEN
1737 IF (unit_nr /= output_unit)
THEN
1738 INQUIRE (unit=unit_nr, name=filename)
1739 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1740 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1743 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1747 IF (do_kpoints)
THEN
1748 CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, moments_unit_nr)
1753 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, &
1754 moments_unit_nr, vel_reprs, com_nl)
1758 CALL write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file,
"MOMENTS_REF2|")
1761 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1766 CALL timestop(handle)
1779 SUBROUTINE write_moments_trajectory(unit_nr, logger, qs_env, periodic, new_file, label)
1780 INTEGER,
INTENT(IN) :: unit_nr
1783 LOGICAL,
INTENT(IN) :: periodic, new_file
1784 CHARACTER(LEN=*),
INTENT(IN) :: label
1786 CHARACTER(LEN=default_string_length) :: description, iter
1787 REAL(kind=
dp),
DIMENSION(3) :: dipole
1791 IF (unit_nr <= 0)
RETURN
1793 NULLIFY (cell, results)
1794 CALL get_qs_env(qs_env, cell=cell, results=results)
1795 description =
"[DIPOLE]"
1796 CALL get_results(results=results, description=description, values=dipole)
1800 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1801 " iter_level dipole_x dipole_y dipole_z dipole_norm cell_xx cell_xy cell_xz"// &
1802 " cell_yx cell_yy cell_yz cell_zx cell_zy cell_zz [Debye]"
1804 WRITE (unit_nr,
"(A)")
"# "//trim(label)// &
1805 " iter_level dipole_x dipole_y dipole_z dipole_norm [Debye]"
1811 WRITE (unit_nr,
"(1X,A,1X,A15,13(1X,ES18.10))") trim(label), iter(1:15), &
1815 WRITE (unit_nr,
"(1X,A,1X,A15,4(1X,ES18.10))") trim(label), iter(1:15), &
1819 END SUBROUTINE write_moments_trajectory
1829 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1834 INTEGER,
INTENT(IN) :: output_unit
1836 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1838 CHARACTER(LEN=default_path_length) :: filename
1839 INTEGER :: handle, unit_nr
1840 REAL(kind=
dp) :: q_max
1843 CALL timeset(routinen, handle)
1846 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1850 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1852 basis_section=input, &
1853 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1855 middle_name=
"xrd", &
1856 log_filename=.false.)
1857 IF (output_unit > 0)
THEN
1858 INQUIRE (unit=unit_nr, name=filename)
1859 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1860 "X-RAY DIFFRACTION SPECTRUM"
1861 IF (unit_nr /= output_unit)
THEN
1862 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1863 "The coherent X-ray diffraction spectrum is written to the file:", &
1868 unit_number=unit_nr, &
1872 basis_section=input, &
1873 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1876 CALL timestop(handle)
1878 END SUBROUTINE qs_scf_post_xray
1886 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1891 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1896 CALL timeset(routinen, handle)
1899 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1905 CALL timestop(handle)
1907 END SUBROUTINE qs_scf_post_efg
1915 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1920 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1922 INTEGER :: handle, ispin
1924 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1927 CALL timeset(routinen, handle)
1933 IF (qs_env%et_coupling%first_run)
THEN
1935 ALLOCATE (my_mos(dft_control%nspins))
1936 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1937 DO ispin = 1, dft_control%nspins
1939 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1940 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1949 CALL timestop(handle)
1951 END SUBROUTINE qs_scf_post_et
1962 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
1967 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
1969 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1971 INTEGER :: handle, ispin, output_unit, unit_nr
1972 LOGICAL :: append_cube, gapw, mpi_io
1973 REAL(
dp) :: rho_cutoff
1974 TYPE(cp_section_key) :: elf_section_key
1984 CALL timeset(routinen, handle)
1987 elf_section_key = cube_or_openpmd(input, str_elf_cubes, str_elf_openpmd, logger)
1990 IF (elf_section_key%do_output)
THEN
1992 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
1993 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
1996 gapw = dft_control%qs_control%gapw
1997 IF (.NOT. gapw)
THEN
1999 ALLOCATE (elf_r(dft_control%nspins))
2000 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2002 DO ispin = 1, dft_control%nspins
2003 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
2007 IF (output_unit > 0)
THEN
2008 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
2009 " ----- ELF is computed on the real space grid -----"
2017 IF (elf_section_key%grid_output == grid_output_cubes)
THEN
2020 my_pos_cube =
"REWIND"
2021 IF (append_cube)
THEN
2022 my_pos_cube =
"APPEND"
2025 DO ispin = 1, dft_control%nspins
2026 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
2027 WRITE (title, *)
"ELF spin ", ispin
2029 unit_nr = elf_section_key%print_key_unit_nr( &
2032 elf_section_key%absolute_section_key, &
2033 extension=
".cube", &
2034 middle_name=trim(filename), &
2035 file_position=my_pos_cube, &
2036 log_filename=.false., &
2038 fout=mpi_filename, &
2039 openpmd_basename=
"dft-elf", &
2040 openpmd_unit_dimension=openpmd_unit_dimension_dimensionless, &
2041 openpmd_unit_si=openpmd_unit_si_dimensionless, &
2042 sim_time=qs_env%sim_time)
2043 IF (output_unit > 0)
THEN
2044 IF (.NOT. mpi_io)
THEN
2045 INQUIRE (unit=unit_nr, name=filename)
2047 filename = mpi_filename
2049 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2050 "ELF is written in "//elf_section_key%format_name//
" file format to the file:", &
2054 CALL elf_section_key%write_pw(elf_r(ispin), unit_nr, title, particles=particles, &
2056 CALL elf_section_key%print_key_finished_output( &
2060 elf_section_key%absolute_section_key, &
2063 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
2071 cpwarn(
"ELF not implemented for GAPW calculations!")
2076 CALL timestop(handle)
2078 END SUBROUTINE qs_scf_post_elf
2090 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
2095 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
2097 INTEGER :: handle, nao, unit_nr
2098 REAL(kind=
dp) :: s_cond_number
2099 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
2108 CALL timeset(routinen, handle)
2111 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2115 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
2118 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
2120 nrow_global=nao, ncol_global=nao, &
2121 template_fmstruct=mo_coeff%matrix_struct)
2122 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
2124 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
2127 ALLOCATE (eigenvalues(nao))
2135 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
2138 extension=
".molopt")
2140 IF (unit_nr > 0)
THEN
2143 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
2144 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
2148 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
2152 CALL timestop(handle)
2154 END SUBROUTINE qs_scf_post_molopt
2162 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
2167 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
2172 CALL timeset(routinen, handle)
2175 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
2181 CALL timestop(handle)
2183 END SUBROUTINE qs_scf_post_epr
2192 SUBROUTINE write_available_results(qs_env, scf_env)
2196 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
2200 CALL timeset(routinen, handle)
2208 CALL timestop(handle)
2210 END SUBROUTINE write_available_results
2223 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
2225 INTEGER :: handle, homo, ispin, nlumo_dos, &
2226 nlumo_molden, nlumo_required, nlumos, &
2228 LOGICAL :: all_equal, defer_molden, do_curve, &
2229 do_dos, do_kpoints, do_pdos, &
2230 do_projected_dos, explicit
2231 REAL(kind=
dp) :: maxocc, s_square, s_square_ideal, &
2232 total_abs_spin_dens, total_spin_dens
2233 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
2238 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
2241 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
2255 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2260 dos_section, input, sprint_section, &
2265 CALL timeset(routinen, handle)
2267 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
2268 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
2269 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
2270 molecule_set, input, particles, subsys, rho_r, unoccupied_orbs, &
2271 unoccupied_evals, casino_section, dos_section)
2276 cpassert(
ASSOCIATED(qs_env))
2278 dft_control=dft_control, &
2279 molecule_set=molecule_set, &
2280 atomic_kind_set=atomic_kind_set, &
2281 particle_set=particle_set, &
2282 qs_kind_set=qs_kind_set, &
2283 admm_env=admm_env, &
2284 scf_control=scf_control, &
2293 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
2297 IF (.NOT. qs_env%run_rtp)
THEN
2310 defer_molden = .false.
2311 IF (.NOT. do_kpoints)
THEN
2312 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
2316 IF (nlumo_molden /= 0 .AND.
PRESENT(scf_env))
THEN
2317 IF (scf_env%method ==
ot_method_nr) defer_molden = .true.
2319 IF (.NOT. defer_molden)
THEN
2320 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2321 qs_env=qs_env, calc_energies=.true.)
2330 cpwarn(
"Molden format output is not possible for k-point calculations.")
2334 cpwarn(
"Chargemol .wfx format output is not possible for k-point calculations.")
2341 IF (do_kpoints)
THEN
2345 cpwarn(
"MO_KP is only available for k-point calculations, ignored for Gamma-only")
2356 IF (.NOT. do_kpoints .AND.
PRESENT(scf_env))
THEN
2360 IF (nlumo_dos == -1)
THEN
2362 ELSE IF (nlumo_required /= -1)
THEN
2363 nlumo_required = max(nlumo_required, nlumo_dos)
2367 IF (defer_molden)
THEN
2368 IF (nlumo_molden == -1)
THEN
2370 ELSE IF (nlumo_required /= -1)
THEN
2371 nlumo_required = max(nlumo_required, nlumo_molden)
2374 IF (nlumo_required /= 0)
THEN
2375 ALLOCATE (unoccupied_orbs(dft_control%nspins))
2376 ALLOCATE (unoccupied_evals(dft_control%nspins))
2377 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, &
2378 nlumo_required, nlumos)
2381 IF (do_dos .OR. do_projected_dos)
THEN
2382 DO ispin = 1, dft_control%nspins
2385 IF (dft_control%do_admm)
THEN
2388 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
2389 eigenvalues=mo_eigenvalues)
2390 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
2391 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
2393 mo_coeff_deriv => null()
2396 do_rotation=.true., &
2397 co_rotate_dbcsr=mo_coeff_deriv)
2399 IF (dft_control%do_admm)
THEN
2407 IF (defer_molden)
THEN
2408 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2409 IF (output_unit > 0)
THEN
2410 WRITE (output_unit,
'(/,T2,A,I6,A)') &
2411 "MO_MOLDEN| Writing ", nlumos,
" unoccupied orbitals to molden file"
2413 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
2414 unoccupied_orbs=unoccupied_orbs, &
2415 unoccupied_evals=unoccupied_evals, &
2416 qs_env=qs_env, calc_energies=.true.)
2422 IF (do_kpoints)
THEN
2424 IF (do_curve)
CALL calculate_dos_kp(qs_env, dft_section, write_curve_output=.true.)
2427 IF (
ASSOCIATED(unoccupied_evals))
THEN
2428 CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2429 smearing_enabled=dft_control%smear)
2430 IF (do_curve)
CALL calculate_dos(mos, dft_section, unoccupied_evals=unoccupied_evals, &
2431 smearing_enabled=dft_control%smear, write_curve_output=.true.)
2433 CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear)
2434 IF (do_curve)
CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear, &
2435 write_curve_output=.true.)
2441 IF (do_projected_dos)
THEN
2442 IF (do_kpoints)
THEN
2444 write_pdos=do_pdos, write_pdos_curve=do_curve)
2449 DO ispin = 1, dft_control%nspins
2450 IF (dft_control%nspins == 2)
THEN
2451 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2453 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2454 unoccupied_orbs=unoccupied_orbs(ispin), &
2455 unoccupied_evals=unoccupied_evals(ispin), &
2456 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2459 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
2460 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2463 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2465 qs_kind_set, particle_set, qs_env, dft_section, &
2466 unoccupied_orbs=unoccupied_orbs(ispin), &
2467 unoccupied_evals=unoccupied_evals(ispin), &
2468 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2471 qs_kind_set, particle_set, qs_env, dft_section, &
2472 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_curve=do_curve)
2478 IF (
ASSOCIATED(unoccupied_orbs))
THEN
2479 DO ispin = 1, dft_control%nspins
2480 DEALLOCATE (unoccupied_evals(ispin)%array)
2483 DEALLOCATE (unoccupied_evals)
2484 DEALLOCATE (unoccupied_orbs)
2489 IF (dft_control%nspins == 2)
THEN
2490 total_spin_dens = 0.0_dp
2491 total_abs_spin_dens = 0.0_dp
2492 IF (dft_control%qs_control%gapw)
THEN
2493 CALL get_qs_env(qs_env, qs_charges=qs_charges)
2494 total_spin_dens = qs_charges%total_rho_hard_spin - &
2495 qs_charges%total_rho_soft_spin
2496 total_abs_spin_dens = qs_charges%total_rho_hard_abs_spin - &
2497 qs_charges%total_rho_soft_abs_spin
2500 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2501 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2503 CALL auxbas_pw_pool%create_pw(wf_r)
2505 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
2507 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
2508 "Integrated spin density: ", total_spin_dens
2510 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
2511 "Integrated absolute spin density: ", total_abs_spin_dens
2512 CALL auxbas_pw_pool%give_back_pw(wf_r)
2518 IF (.NOT. do_kpoints)
THEN
2520 DO ispin = 1, dft_control%nspins
2522 occupation_numbers=occupation_numbers, &
2527 all_equal = all_equal .AND. &
2528 (all(occupation_numbers(1:homo) == maxocc) .AND. &
2529 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
2534 matrix_s=matrix_s, &
2537 s_square_ideal=s_square_ideal)
2538 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
2539 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
2540 energy%s_square = s_square
2545 CALL timestop(handle)
2557 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
2558 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
2560 CHARACTER(LEN=2) :: element_symbol
2561 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2563 CHARACTER(LEN=default_string_length) :: name, print_density
2564 INTEGER :: after, handle, i, iat, iatom, id, ikind, img, iso, ispin, iw, l, n_rep_hf, nat, &
2565 natom, nd(3), ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, &
2566 should_print_voro, unit_nr, unit_nr_voro
2567 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
2568 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
2570 rho_total, rho_total_rspace, udvol, &
2572 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2573 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
2574 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
2575 REAL(kind=
dp),
DIMENSION(3) :: dr
2576 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
2581 TYPE(cp_section_key) :: e_density_section
2583 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
2591 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
2598 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2606 print_key, print_key_bqb, &
2607 print_key_voro, xc_section
2609 CALL timeset(routinen, handle)
2610 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
2611 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
2612 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
2618 cpassert(
ASSOCIATED(qs_env))
2620 atomic_kind_set=atomic_kind_set, &
2621 qs_kind_set=qs_kind_set, &
2622 particle_set=particle_set, &
2624 para_env=para_env, &
2625 dft_control=dft_control, &
2627 do_kpoints=do_kpoints, &
2635 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
2636 ALLOCATE (zcharge(natom))
2641 iat = atomic_kind_set(ikind)%atom_list(iatom)
2648 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
2649 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
2651 my_pos_cube =
"REWIND"
2652 IF (append_cube)
THEN
2653 my_pos_cube =
"APPEND"
2656 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
2657 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
2658 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2660 CALL auxbas_pw_pool%create_pw(wf_r)
2661 IF (dft_control%qs_control%gapw)
THEN
2662 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
2663 CALL pw_axpy(rho_core, rho0_s_gs)
2664 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2665 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2668 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
2669 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2670 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2673 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2674 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2677 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2678 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2684 DO ispin = 1, dft_control%nspins
2685 CALL pw_axpy(rho_r(ispin), wf_r)
2687 filename =
"TOTAL_DENSITY"
2690 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2691 log_filename=.false., mpi_io=mpi_io)
2693 particles=particles, zeff=zcharge, &
2695 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%TOT_DENSITY_CUBE%MAX_FILE_SIZE_MB"), &
2698 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2699 CALL auxbas_pw_pool%give_back_pw(wf_r)
2702 e_density_section = cube_or_openpmd(input, str_e_density_cubes, str_e_density_openpmd, logger)
2705 IF (e_density_section%do_output)
THEN
2707 keyword_name=e_density_section%concat_to_relative(
"%DENSITY_INCLUDE"), &
2708 c_val=print_density)
2709 print_density = trim(print_density)
2711 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2712 append_cube =
section_get_lval(input, e_density_section%concat_to_absolute(
"%APPEND"))
2714 my_pos_cube =
"REWIND"
2715 IF (append_cube)
THEN
2716 my_pos_cube =
"APPEND"
2720 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2721 xrd_interface =
section_get_lval(input, e_density_section%concat_to_absolute(
"%XRD_INTERFACE"))
2724 xrd_interface = .false.
2727 IF (xrd_interface)
THEN
2729 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2731 filename =
"ELECTRON_DENSITY"
2733 extension=
".xrd", middle_name=trim(filename), &
2734 file_position=my_pos_cube, log_filename=.false.)
2735 ngto =
section_get_ival(input, e_density_section%concat_to_absolute(
"%NGAUSS"))
2736 IF (output_unit > 0)
THEN
2737 INQUIRE (unit=unit_nr, name=filename)
2738 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2739 "The electron density (atomic part) is written to the file:", &
2744 nkind =
SIZE(atomic_kind_set)
2745 IF (unit_nr > 0)
THEN
2746 WRITE (unit_nr, *)
"Atomic (core) densities"
2747 WRITE (unit_nr, *)
"Unit cell"
2748 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2749 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2750 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2751 WRITE (unit_nr, *)
"Atomic types"
2752 WRITE (unit_nr, *) nkind
2755 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2757 atomic_kind => atomic_kind_set(ikind)
2758 qs_kind => qs_kind_set(ikind)
2759 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2761 iunit=output_unit, confine=.true.)
2763 iunit=output_unit, allelectron=.true., confine=.true.)
2764 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2765 ccdens(:, 2, ikind) = 0._dp
2766 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2767 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2768 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2769 IF (unit_nr > 0)
THEN
2770 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2771 WRITE (unit_nr, fmt=
"(I6)") ngto
2772 WRITE (unit_nr, *)
" Total density"
2773 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2774 WRITE (unit_nr, *)
" Core density"
2775 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2777 NULLIFY (atomic_kind)
2780 IF (dft_control%qs_control%gapw)
THEN
2781 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2783 IF (unit_nr > 0)
THEN
2784 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2786 np = particles%n_els
2788 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2789 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2790 rho_atom => rho_atom_set(iat)
2791 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2792 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2793 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2798 CALL para_env%sum(nr)
2799 CALL para_env%sum(niso)
2801 ALLOCATE (bfun(nr, niso))
2803 DO ispin = 1, dft_control%nspins
2804 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2805 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2808 CALL para_env%sum(bfun)
2809 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2810 ccdens(:, 2, ikind) = 0._dp
2811 IF (unit_nr > 0)
THEN
2812 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2816 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2817 IF (unit_nr > 0)
THEN
2818 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2819 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2825 IF (unit_nr > 0)
THEN
2826 WRITE (unit_nr, *)
"Coordinates"
2827 np = particles%n_els
2829 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2830 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2835 DEALLOCATE (ppdens, aedens, ccdens)
2838 e_density_section%absolute_section_key)
2841 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2843 cpassert(.NOT. do_kpoints)
2848 auxbas_pw_pool=auxbas_pw_pool, &
2850 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2852 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2857 q_max = sqrt(sum((
pi/dr(:))**2))
2859 auxbas_pw_pool=auxbas_pw_pool, &
2860 rhotot_elec_gspace=rho_elec_gspace, &
2862 rho_hard=rho_hard, &
2864 rho_total = rho_hard + rho_soft
2869 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2871 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2873 filename =
"TOTAL_ELECTRON_DENSITY"
2875 unit_nr = e_density_section%print_key_unit_nr( &
2878 e_density_section%absolute_section_key, &
2879 extension=
".cube", &
2880 middle_name=trim(filename), &
2881 file_position=my_pos_cube, &
2882 log_filename=.false., &
2884 fout=mpi_filename, &
2885 openpmd_basename=
"dft-total-electron-density", &
2886 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2887 openpmd_unit_si=openpmd_unit_si_density, &
2888 sim_time=qs_env%sim_time)
2889 IF (output_unit > 0)
THEN
2890 IF (.NOT. mpi_io)
THEN
2891 INQUIRE (unit=unit_nr, name=filename)
2893 filename = mpi_filename
2895 CALL print_density_output_message(output_unit,
"The total electron density", &
2896 e_density_section, filename)
2897 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2898 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2899 "Soft electronic charge (G-space) :", rho_soft, &
2900 "Hard electronic charge (G-space) :", rho_hard, &
2901 "Total electronic charge (G-space):", rho_total, &
2902 "Total electronic charge (R-space):", rho_total_rspace
2904 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2905 particles=particles, zeff=zcharge, &
2906 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2907 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2908 e_density_section%absolute_section_key, mpi_io=mpi_io)
2910 IF (dft_control%nspins > 1)
THEN
2914 auxbas_pw_pool=auxbas_pw_pool, &
2915 rhotot_elec_gspace=rho_elec_gspace, &
2917 rho_hard=rho_hard, &
2918 rho_soft=rho_soft, &
2920 rho_total = rho_hard + rho_soft
2924 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2926 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2928 filename =
"TOTAL_SPIN_DENSITY"
2930 unit_nr = e_density_section%print_key_unit_nr( &
2933 e_density_section%absolute_section_key, &
2934 extension=
".cube", &
2935 middle_name=trim(filename), &
2936 file_position=my_pos_cube, &
2937 log_filename=.false., &
2939 fout=mpi_filename, &
2940 openpmd_basename=
"dft-total-spin-density", &
2941 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2942 openpmd_unit_si=openpmd_unit_si_density, &
2943 sim_time=qs_env%sim_time)
2944 IF (output_unit > 0)
THEN
2945 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2946 INQUIRE (unit=unit_nr, name=filename)
2948 filename = mpi_filename
2950 CALL print_density_output_message(output_unit,
"The total spin density", &
2951 e_density_section, filename)
2952 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2953 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2954 "Soft part of the spin density (G-space):", rho_soft, &
2955 "Hard part of the spin density (G-space):", rho_hard, &
2956 "Total spin density (G-space) :", rho_total, &
2957 "Total spin density (R-space) :", rho_total_rspace
2959 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2960 particles=particles, zeff=zcharge, &
2961 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2962 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2963 e_density_section%absolute_section_key, mpi_io=mpi_io)
2965 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2966 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2968 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2969 IF (dft_control%nspins > 1)
THEN
2973 auxbas_pw_pool=auxbas_pw_pool, &
2975 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2976 CALL pw_copy(rho_r(1), rho_elec_rspace)
2977 CALL pw_axpy(rho_r(2), rho_elec_rspace)
2978 filename =
"ELECTRON_DENSITY"
2980 unit_nr = e_density_section%print_key_unit_nr( &
2983 e_density_section%absolute_section_key, &
2984 extension=
".cube", &
2985 middle_name=trim(filename), &
2986 file_position=my_pos_cube, &
2987 log_filename=.false., &
2989 fout=mpi_filename, &
2990 openpmd_basename=
"dft-electron-density", &
2991 openpmd_unit_dimension=openpmd_unit_dimension_density, &
2992 openpmd_unit_si=openpmd_unit_si_density, &
2993 sim_time=qs_env%sim_time)
2994 IF (output_unit > 0)
THEN
2995 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2996 INQUIRE (unit=unit_nr, name=filename)
2998 filename = mpi_filename
3000 CALL print_density_output_message(output_unit,
"The sum of alpha and beta density", &
3001 e_density_section, filename)
3003 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
3004 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3006 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3007 e_density_section%absolute_section_key, mpi_io=mpi_io)
3008 CALL pw_copy(rho_r(1), rho_elec_rspace)
3009 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3010 filename =
"SPIN_DENSITY"
3012 unit_nr = e_density_section%print_key_unit_nr( &
3015 e_density_section%absolute_section_key, &
3016 extension=
".cube", &
3017 middle_name=trim(filename), &
3018 file_position=my_pos_cube, &
3019 log_filename=.false., &
3021 fout=mpi_filename, &
3022 openpmd_basename=
"dft-spin-density", &
3023 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3024 openpmd_unit_si=openpmd_unit_si_density, &
3025 sim_time=qs_env%sim_time)
3026 IF (output_unit > 0)
THEN
3027 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3028 INQUIRE (unit=unit_nr, name=filename)
3030 filename = mpi_filename
3032 CALL print_density_output_message(output_unit,
"The spin density", &
3033 e_density_section, filename)
3035 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3036 particles=particles, zeff=zcharge, &
3037 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3038 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3039 e_density_section%absolute_section_key, mpi_io=mpi_io)
3040 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3042 filename =
"ELECTRON_DENSITY"
3044 unit_nr = e_density_section%print_key_unit_nr( &
3047 e_density_section%absolute_section_key, &
3048 extension=
".cube", &
3049 middle_name=trim(filename), &
3050 file_position=my_pos_cube, &
3051 log_filename=.false., &
3053 fout=mpi_filename, &
3054 openpmd_basename=
"dft-electron-density", &
3055 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3056 openpmd_unit_si=openpmd_unit_si_density, &
3057 sim_time=qs_env%sim_time)
3058 IF (output_unit > 0)
THEN
3059 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3060 INQUIRE (unit=unit_nr, name=filename)
3062 filename = mpi_filename
3064 CALL print_density_output_message(output_unit,
"The electron density", &
3065 e_density_section, filename)
3067 CALL e_density_section%write_pw(rho_r(1), unit_nr,
"ELECTRON DENSITY", &
3068 particles=particles, zeff=zcharge, &
3069 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3070 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3071 e_density_section%absolute_section_key, mpi_io=mpi_io)
3074 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
3075 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
3076 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
3077 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
3080 ALLOCATE (my_q0(natom))
3088 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
3092 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3096 DO ispin = 1, dft_control%nspins
3097 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
3101 rho_total_rspace = rho_soft + rho_hard
3103 filename =
"ELECTRON_DENSITY"
3105 unit_nr = e_density_section%print_key_unit_nr( &
3108 e_density_section%absolute_section_key, &
3109 extension=
".cube", &
3110 middle_name=trim(filename), &
3111 file_position=my_pos_cube, &
3112 log_filename=.false., &
3114 fout=mpi_filename, &
3115 openpmd_basename=
"dft-electron-density", &
3116 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3117 openpmd_unit_si=openpmd_unit_si_density, &
3118 sim_time=qs_env%sim_time)
3119 IF (output_unit > 0)
THEN
3120 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3121 INQUIRE (unit=unit_nr, name=filename)
3123 filename = mpi_filename
3125 CALL print_density_output_message(output_unit,
"The electron density", &
3126 e_density_section, filename)
3127 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3128 "Soft electronic charge (R-space) :", rho_soft, &
3129 "Hard electronic charge (R-space) :", rho_hard, &
3130 "Total electronic charge (R-space):", rho_total_rspace
3132 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
3133 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
3135 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3136 e_density_section%absolute_section_key, mpi_io=mpi_io)
3139 IF (dft_control%nspins > 1)
THEN
3141 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
3144 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
3147 CALL pw_axpy(rho_r(1), rho_elec_rspace)
3148 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
3152 rho_total_rspace = rho_soft + rho_hard
3154 filename =
"SPIN_DENSITY"
3156 unit_nr = e_density_section%print_key_unit_nr( &
3159 e_density_section%absolute_section_key, &
3160 extension=
".cube", &
3161 middle_name=trim(filename), &
3162 file_position=my_pos_cube, &
3163 log_filename=.false., &
3165 fout=mpi_filename, &
3166 openpmd_basename=
"dft-spin-density", &
3167 openpmd_unit_dimension=openpmd_unit_dimension_density, &
3168 openpmd_unit_si=openpmd_unit_si_density, &
3169 sim_time=qs_env%sim_time)
3170 IF (output_unit > 0)
THEN
3171 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
3172 INQUIRE (unit=unit_nr, name=filename)
3174 filename = mpi_filename
3176 CALL print_density_output_message(output_unit,
"The spin density", &
3177 e_density_section, filename)
3178 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
3179 "Soft part of the spin density :", rho_soft, &
3180 "Hard part of the spin density :", rho_hard, &
3181 "Total spin density (R-space) :", rho_total_rspace
3183 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
3184 particles=particles, zeff=zcharge, &
3185 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
3186 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
3187 e_density_section%absolute_section_key, mpi_io=mpi_io)
3189 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
3195 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
3201 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
3205 v_hartree_rspace=v_hartree_rspace)
3206 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3207 CALL auxbas_pw_pool%create_pw(aux_r)
3210 my_pos_cube =
"REWIND"
3211 IF (append_cube)
THEN
3212 my_pos_cube =
"APPEND"
3215 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3218 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
3219 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3221 CALL pw_copy(v_hartree_rspace, aux_r)
3224 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
3226 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%V_HARTREE_CUBE%MAX_FILE_SIZE_MB"), &
3229 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
3231 CALL auxbas_pw_pool%give_back_pw(aux_r)
3236 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
3237 IF (dft_control%apply_external_potential)
THEN
3238 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
3239 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3240 CALL auxbas_pw_pool%create_pw(aux_r)
3242 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
3243 my_pos_cube =
"REWIND"
3244 IF (append_cube)
THEN
3245 my_pos_cube =
"APPEND"
3250 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
3254 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
3255 stride=
section_get_ivals(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), &
3256 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%MAX_FILE_SIZE_MB"), &
3259 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
3261 CALL auxbas_pw_pool%give_back_pw(aux_r)
3267 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
3269 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3270 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3271 CALL auxbas_pw_pool%create_pw(aux_r)
3272 CALL auxbas_pw_pool%create_pw(aux_g)
3275 my_pos_cube =
"REWIND"
3276 IF (append_cube)
THEN
3277 my_pos_cube =
"APPEND"
3279 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
3280 v_hartree_rspace=v_hartree_rspace)
3282 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
3286 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
3296 CALL cp_pw_to_cube(aux_r, unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
3298 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EFIELD_CUBE%MAX_FILE_SIZE_MB"), &
3301 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
3304 CALL auxbas_pw_pool%give_back_pw(aux_r)
3305 CALL auxbas_pw_pool%give_back_pw(aux_g)
3309 CALL qs_scf_post_local_energy(input, logger, qs_env)
3312 CALL qs_scf_post_local_stress(input, logger, qs_env)
3315 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
3326 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
3331 after = min(max(after, 1), 16)
3332 DO ispin = 1, dft_control%nspins
3333 DO img = 1, dft_control%nimages
3335 para_env, output_unit=iw, omit_headers=omit_headers)
3339 "DFT%PRINT%AO_MATRICES/DENSITY")
3344 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
3346 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
3348 IF (write_ks .OR. write_xc)
THEN
3349 IF (write_xc) qs_env%requires_matrix_vxc = .true.
3352 just_energy=.false.)
3353 IF (write_xc) qs_env%requires_matrix_vxc = .false.
3360 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
3362 after = min(max(after, 1), 16)
3363 DO ispin = 1, dft_control%nspins
3364 DO img = 1, dft_control%nimages
3366 para_env, output_unit=iw, omit_headers=omit_headers)
3370 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
3375 IF (.NOT. dft_control%qs_control%pao)
THEN
3383 CALL write_adjacency_matrix(qs_env, input)
3387 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
3388 cpassert(
ASSOCIATED(matrix_vxc))
3392 after = min(max(after, 1), 16)
3393 DO ispin = 1, dft_control%nspins
3394 DO img = 1, dft_control%nimages
3396 para_env, output_unit=iw, omit_headers=omit_headers)
3400 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
3405 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
3411 after = min(max(after, 1), 16)
3414 para_env, output_unit=iw, omit_headers=omit_headers)
3418 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
3424 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
3427 IF (print_it) print_level = 2
3429 IF (print_it) print_level = 3
3440 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3441 IF (rho_r_valid)
THEN
3442 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
3443 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
3451 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
3453 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
3461 should_print_voro = 1
3463 should_print_voro = 0
3466 should_print_bqb = 1
3468 should_print_bqb = 0
3470 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3475 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3476 IF (rho_r_valid)
THEN
3478 IF (dft_control%nspins > 1)
THEN
3482 auxbas_pw_pool=auxbas_pw_pool, &
3486 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
3487 CALL pw_copy(rho_r(1), mb_rho)
3488 CALL pw_axpy(rho_r(2), mb_rho)
3495 IF (should_print_voro /= 0)
THEN
3497 IF (voro_print_txt)
THEN
3499 my_pos_voro =
"REWIND"
3500 IF (append_voro)
THEN
3501 my_pos_voro =
"APPEND"
3503 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
3504 file_position=my_pos_voro, log_filename=.false.)
3512 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3513 unit_nr_voro, qs_env, mb_rho)
3515 IF (dft_control%nspins > 1)
THEN
3516 CALL auxbas_pw_pool%give_back_pw(mb_rho)
3520 IF (unit_nr_voro > 0)
THEN
3530 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
3538 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
3546 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
3548 IF (particle_set(1)%fragment_index /= 0) iao_env%do_fragments = .true.
3549 IF (iao_env%do_iao)
THEN
3559 extension=
".mao", log_filename=.false.)
3570 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
3574 DEALLOCATE (zcharge)
3576 CALL timestop(handle)
3586 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
3589 INTEGER,
INTENT(IN) :: unit_nr
3591 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
3592 radius_type, refc, shapef
3593 INTEGER,
DIMENSION(:),
POINTER :: atom_list
3594 LOGICAL :: do_radius, do_sc, paw_atom
3595 REAL(kind=
dp) :: zeff
3596 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
3597 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
3600 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
3606 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3610 NULLIFY (hirshfeld_env)
3614 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
3615 ALLOCATE (hirshfeld_env%charges(natom))
3624 IF (.NOT.
SIZE(radii) == nkind)
THEN
3625 CALL cp_abort(__location__, &
3626 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
3627 "match number of atomic kinds in the input coordinate file.")
3633 iterative=do_sc, ref_charge=refc, &
3634 radius_type=radius_type)
3636 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
3642 nspin =
SIZE(matrix_p, 1)
3643 ALLOCATE (charges(natom, nspin))
3648 atomic_kind => atomic_kind_set(ikind)
3650 DO iat = 1,
SIZE(atom_list)
3652 hirshfeld_env%charges(i) = zeff
3656 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
3659 hirshfeld_env%charges(iat) = sum(charges(iat, :))
3662 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
3666 IF (hirshfeld_env%iterative)
THEN
3673 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
3674 IF (dft_control%qs_control%gapw)
THEN
3676 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
3679 atomic_kind => particle_set(iat)%atomic_kind
3681 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
3683 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
3688 IF (unit_nr > 0)
THEN
3690 qs_kind_set, unit_nr)
3696 DEALLOCATE (charges)
3698 END SUBROUTINE hirshfeld_charges
3708 SUBROUTINE project_function_a(ca, a, cb, b, l)
3710 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3711 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
3712 INTEGER,
INTENT(IN) :: l
3715 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3716 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
3719 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
3723 v(:, 1) = matmul(tmat, cb)
3724 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3728 DEALLOCATE (smat, tmat, v, ipiv)
3730 END SUBROUTINE project_function_a
3740 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
3742 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3743 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
3745 INTEGER,
INTENT(IN) :: l
3747 INTEGER :: i, info, n, nr
3748 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3749 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
3750 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
3754 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3758 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3759 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3761 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3765 DEALLOCATE (smat, v, ipiv, afun)
3767 END SUBROUTINE project_function_b
3778 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3783 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3785 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3786 INTEGER :: handle, io_unit, natom, unit_nr
3787 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3796 CALL timeset(routinen, handle)
3799 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3801 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3802 gapw = dft_control%qs_control%gapw
3803 gapw_xc = dft_control%qs_control%gapw_xc
3804 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3806 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3807 CALL auxbas_pw_pool%create_pw(eden)
3811 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3812 IF (append_cube)
THEN
3813 my_pos_cube =
"APPEND"
3815 my_pos_cube =
"REWIND"
3819 extension=
".cube", middle_name=
"local_energy", &
3820 file_position=my_pos_cube, mpi_io=mpi_io)
3821 CALL cp_pw_to_cube(eden, unit_nr,
"LOCAL ENERGY", particles=particles, &
3823 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_ENERGY_CUBE%MAX_FILE_SIZE_MB"), &
3825 IF (io_unit > 0)
THEN
3826 INQUIRE (unit=unit_nr, name=filename)
3827 IF (gapw .OR. gapw_xc)
THEN
3828 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3829 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3831 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3832 "The local energy is written to the file: ", trim(adjustl(filename))
3836 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3838 CALL auxbas_pw_pool%give_back_pw(eden)
3840 CALL timestop(handle)
3842 END SUBROUTINE qs_scf_post_local_energy
3853 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3858 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3860 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3861 INTEGER :: handle, io_unit, natom, unit_nr
3862 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3863 REAL(kind=
dp) :: beta
3872 CALL timeset(routinen, handle)
3875 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3876 CALL cp_warn(__location__, &
3877 "LOCAL_STRESS_CUBE uses the existing experimental local stress implementation")
3879 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3880 gapw = dft_control%qs_control%gapw
3881 gapw_xc = dft_control%qs_control%gapw_xc
3882 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3884 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3885 CALL auxbas_pw_pool%create_pw(stress)
3891 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3892 IF (append_cube)
THEN
3893 my_pos_cube =
"APPEND"
3895 my_pos_cube =
"REWIND"
3899 extension=
".cube", middle_name=
"local_stress", &
3900 file_position=my_pos_cube, mpi_io=mpi_io)
3901 CALL cp_pw_to_cube(stress, unit_nr,
"LOCAL STRESS", particles=particles, &
3903 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_STRESS_CUBE%MAX_FILE_SIZE_MB"), &
3905 IF (io_unit > 0)
THEN
3906 INQUIRE (unit=unit_nr, name=filename)
3907 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3908 IF (gapw .OR. gapw_xc)
THEN
3909 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3910 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3912 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3913 "The local stress is written to the file: ", trim(adjustl(filename))
3917 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3919 CALL auxbas_pw_pool%give_back_pw(stress)
3922 CALL timestop(handle)
3924 END SUBROUTINE qs_scf_post_local_stress
3935 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3940 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3942 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3943 INTEGER :: boundary_condition, handle, i, j, &
3944 n_cstr, n_tiles, unit_nr
3945 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3946 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3956 CALL timeset(routinen, handle)
3958 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
3961 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3963 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3965 has_implicit_ps = .false.
3966 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3971 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
3972 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
3973 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
3974 my_pos_cube =
"REWIND"
3975 IF (append_cube)
THEN
3976 my_pos_cube =
"APPEND"
3980 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
3982 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3983 CALL auxbas_pw_pool%create_pw(aux_r)
3985 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3986 SELECT CASE (boundary_condition)
3988 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
3990 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3991 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3992 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3993 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3994 poisson_env%implicit_env%dielectric%eps, aux_r)
3997 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, &
3998 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
3999 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%MAX_FILE_SIZE_MB"), &
4002 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
4004 CALL auxbas_pw_pool%give_back_pw(aux_r)
4009 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
4011 has_dirichlet_bc = .false.
4012 IF (has_implicit_ps)
THEN
4013 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4015 has_dirichlet_bc = .true.
4019 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
4021 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
4022 my_pos_cube =
"REWIND"
4023 IF (append_cube)
THEN
4024 my_pos_cube =
"APPEND"
4028 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
4029 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
4031 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4032 CALL auxbas_pw_pool%create_pw(aux_r)
4034 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4035 SELECT CASE (boundary_condition)
4037 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
4039 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
4040 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
4041 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
4042 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
4043 poisson_env%implicit_env%cstr_charge, aux_r)
4046 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, &
4047 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
4048 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%MAX_FILE_SIZE_MB"), &
4051 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
4053 CALL auxbas_pw_pool%give_back_pw(aux_r)
4058 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
4059 has_dirichlet_bc = .false.
4060 IF (has_implicit_ps)
THEN
4061 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
4063 has_dirichlet_bc = .true.
4067 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
4068 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
4069 my_pos_cube =
"REWIND"
4070 IF (append_cube)
THEN
4071 my_pos_cube =
"APPEND"
4073 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
4075 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
4076 CALL auxbas_pw_pool%create_pw(aux_r)
4079 IF (tile_cubes)
THEN
4081 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4083 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4085 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
4088 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4089 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
4092 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
4094 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
4095 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4096 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4099 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4104 NULLIFY (dirichlet_tile)
4105 ALLOCATE (dirichlet_tile)
4106 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
4109 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
4110 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
4113 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
4115 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
4117 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
4118 CALL pw_axpy(dirichlet_tile, aux_r)
4122 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
4123 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
4124 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
4127 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
4128 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
4129 DEALLOCATE (dirichlet_tile)
4132 CALL auxbas_pw_pool%give_back_pw(aux_r)
4135 CALL timestop(handle)
4137 END SUBROUTINE qs_scf_post_ps_implicit
4145 SUBROUTINE write_adjacency_matrix(qs_env, input)
4149 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
4151 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
4152 ind, jatom, jkind, k, natom, nkind, &
4153 output_unit, rowind, unit_nr
4154 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
4155 LOGICAL :: do_adjm_write, do_symmetric
4161 DIMENSION(:),
POINTER :: nl_iterator
4164 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
4167 CALL timeset(routinen, handle)
4169 NULLIFY (dft_section)
4178 IF (do_adjm_write)
THEN
4179 NULLIFY (qs_kind_set, nl_iterator)
4180 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
4182 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
4184 nkind =
SIZE(qs_kind_set)
4185 cpassert(
SIZE(nl) > 0)
4187 cpassert(do_symmetric)
4188 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
4192 adjm_size = ((natom + 1)*natom)/2
4193 ALLOCATE (interact_adjm(4*adjm_size))
4196 NULLIFY (nl_iterator)
4200 ikind=ikind, jkind=jkind, &
4201 iatom=iatom, jatom=jatom)
4203 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
4204 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
4205 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
4206 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
4209 IF (iatom <= jatom)
THEN
4216 ikind = ikind + jkind
4217 jkind = ikind - jkind
4218 ikind = ikind - jkind
4222 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
4225 interact_adjm((ind - 1)*4 + 1) = rowind
4226 interact_adjm((ind - 1)*4 + 2) = colind
4227 interact_adjm((ind - 1)*4 + 3) = ikind
4228 interact_adjm((ind - 1)*4 + 4) = jkind
4231 CALL para_env%sum(interact_adjm)
4234 extension=
".adjmat", file_form=
"FORMATTED", &
4235 file_status=
"REPLACE")
4236 IF (unit_nr > 0)
THEN
4237 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
4238 DO k = 1, 4*adjm_size, 4
4240 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
4241 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
4249 DEALLOCATE (basis_set_list_a, basis_set_list_b)
4252 CALL timestop(handle)
4254 END SUBROUTINE write_adjacency_matrix
4262 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
4266 LOGICAL :: use_virial
4276 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
4277 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
4278 rho_core=rho_core, virial=virial, &
4279 v_hartree_rspace=v_hartree_rspace)
4281 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
4283 IF (.NOT. use_virial)
THEN
4285 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
4286 poisson_env=poisson_env)
4287 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
4288 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
4292 v_hartree_gspace, rho_core=rho_core)
4294 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
4295 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
4297 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
4298 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
4301 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)
...
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.