208#include "./base/base_uses.f90"
214 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
222 CHARACTER(len=*),
PARAMETER :: &
223 str_mo_cubes =
"PRINT%MO_CUBES", &
224 str_mo_openpmd =
"PRINT%MO_OPENPMD", &
225 str_elf_cubes =
"PRINT%ELF_CUBE", &
226 str_elf_openpmd =
"PRINT%ELF_OPENPMD", &
227 str_e_density_cubes =
"PRINT%E_DENSITY_CUBE", &
228 str_e_density_openpmd =
"PRINT%E_DENSITY_OPENPMD"
230 INTEGER,
PARAMETER :: grid_output_cubes = 1, grid_output_openpmd = 2
236 CHARACTER(len=default_string_length) :: relative_section_key =
""
237 CHARACTER(len=default_string_length) :: absolute_section_key =
""
238 CHARACTER(len=7) :: format_name =
""
239 INTEGER :: grid_output = -1
240 LOGICAL :: do_output = .false.
243 PROCEDURE,
PUBLIC :: print_key_unit_nr => cp_forward_print_key_unit_nr
245 PROCEDURE,
PUBLIC :: write_pw => cp_forward_write_pw
247 PROCEDURE,
PUBLIC :: print_key_finished_output => cp_forward_print_key_finished_output
249 PROCEDURE,
PUBLIC :: do_openpmd => cp_section_key_do_openpmd
250 PROCEDURE,
PUBLIC :: do_cubes => cp_section_key_do_cubes
251 PROCEDURE,
PUBLIC :: concat_to_relative => cp_section_key_concat_to_relative
253 END TYPE cp_section_key
264 CLASS(cp_section_key),
INTENT(IN) :: self
265 CHARACTER(*),
INTENT(IN) :: extend_by
266 CHARACTER(len=default_string_length) :: res
268 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
269 res = trim(self%absolute_section_key)//trim(extend_by)
271 res = trim(self%absolute_section_key)//
"%"//trim(extend_by)
281 FUNCTION cp_section_key_concat_to_relative(self, extend_by)
RESULT(res)
282 CLASS(cp_section_key),
INTENT(IN) :: self
283 CHARACTER(*),
INTENT(IN) :: extend_by
284 CHARACTER(len=default_string_length) :: res
286 IF (len(trim(extend_by)) > 0 .AND. extend_by(1:1) ==
"%")
THEN
287 res = trim(self%relative_section_key)//trim(extend_by)
289 res = trim(self%relative_section_key)//
"%"//trim(extend_by)
291 END FUNCTION cp_section_key_concat_to_relative
298 FUNCTION cp_section_key_do_cubes(self)
RESULT(res)
299 CLASS(cp_section_key) :: self
302 res = self%do_output .AND. self%grid_output == grid_output_cubes
303 END FUNCTION cp_section_key_do_cubes
310 FUNCTION cp_section_key_do_openpmd(self)
RESULT(res)
311 CLASS(cp_section_key) :: self
314 res = self%do_output .AND. self%grid_output == grid_output_openpmd
315 END FUNCTION cp_section_key_do_openpmd
342 FUNCTION cp_forward_print_key_unit_nr(self, logger, basis_section, print_key_path, extension, &
343 middle_name, local, log_filename, ignore_should_output, file_form, file_position, &
344 file_action, file_status, do_backup, on_file, is_new_file, mpi_io, &
345 fout, openpmd_basename)
RESULT(res)
346 CLASS(cp_section_key),
INTENT(IN) :: self
349 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
350 CHARACTER(len=*),
INTENT(IN) :: extension
351 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
352 LOGICAL,
INTENT(IN),
OPTIONAL :: local, log_filename, ignore_should_output
353 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: file_form, file_position, file_action, &
355 LOGICAL,
INTENT(IN),
OPTIONAL :: do_backup, on_file
356 LOGICAL,
INTENT(OUT),
OPTIONAL :: is_new_file
357 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
358 CHARACTER(len=default_path_length),
INTENT(OUT), &
360 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
363 IF (self%grid_output == grid_output_cubes)
THEN
365 logger, basis_section, print_key_path, extension=extension, &
366 middle_name=middle_name, local=local, log_filename=log_filename, &
367 ignore_should_output=ignore_should_output, file_form=file_form, &
368 file_position=file_position, file_action=file_action, &
369 file_status=file_status, do_backup=do_backup, on_file=on_file, &
370 is_new_file=is_new_file, mpi_io=mpi_io, fout=fout)
373 middle_name=middle_name, ignore_should_output=ignore_should_output, &
374 mpi_io=mpi_io, fout=fout, openpmd_basename=openpmd_basename)
376 END FUNCTION cp_forward_print_key_unit_nr
394 SUBROUTINE cp_forward_write_pw( &
407 CLASS(cp_section_key),
INTENT(IN) :: self
409 INTEGER,
INTENT(IN) :: unit_nr
410 CHARACTER(*),
INTENT(IN),
OPTIONAL :: title
412 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: stride
413 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: max_file_size_mb
414 LOGICAL,
INTENT(IN),
OPTIONAL :: zero_tails, silent, mpi_io
415 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: zeff
417 IF (self%grid_output == grid_output_cubes)
THEN
418 CALL cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
420 CALL cp_pw_to_openpmd(pw, unit_nr, title, particles, zeff, stride, zero_tails, silent, mpi_io)
422 END SUBROUTINE cp_forward_write_pw
438 SUBROUTINE cp_forward_print_key_finished_output(self, unit_nr, logger, basis_section, &
439 print_key_path, local, ignore_should_output, on_file, &
441 CLASS(cp_section_key),
INTENT(IN) :: self
442 INTEGER,
INTENT(INOUT) :: unit_nr
445 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
446 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, on_file, &
449 IF (self%grid_output == grid_output_cubes)
THEN
454 END SUBROUTINE cp_forward_print_key_finished_output
474 FUNCTION cube_or_openpmd(input, str_cubes, str_openpmd, logger)
RESULT(res)
476 CHARACTER(len=*),
INTENT(IN) :: str_cubes, str_openpmd
478 TYPE(cp_section_key) :: res
480 LOGICAL :: do_cubes, do_openpmd
483 logger%iter_info, input, &
484 "DFT%"//trim(adjustl(str_cubes))),
cp_p_file)
486 logger%iter_info, input, &
487 "DFT%"//trim(adjustl(str_openpmd))),
cp_p_file)
491 cpassert(.NOT. (do_cubes .AND. do_openpmd))
492 res%do_output = do_cubes .OR. do_openpmd
494 res%grid_output = grid_output_openpmd
495 res%relative_section_key = trim(adjustl(str_openpmd))
496 res%format_name =
"openPMD"
498 res%grid_output = grid_output_cubes
499 res%relative_section_key = trim(adjustl(str_cubes))
500 res%format_name =
"Cube"
502 res%absolute_section_key =
"DFT%"//trim(adjustl(res%relative_section_key))
503 END FUNCTION cube_or_openpmd
511 FUNCTION section_key_do_write(grid_output)
RESULT(res)
512 INTEGER,
INTENT(IN) :: grid_output
513 CHARACTER(len=32) :: res
515 IF (grid_output == grid_output_cubes)
THEN
517 ELSE IF (grid_output == grid_output_openpmd)
THEN
518 res =
"%WRITE_OPENPMD"
520 END FUNCTION section_key_do_write
543 CHARACTER(6),
OPTIONAL :: wf_type
544 LOGICAL,
OPTIONAL :: do_mp2
546 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw', &
547 warning_cube_kpoint =
"Print MO cubes not implemented for k-point calculations", &
548 warning_openpmd_kpoint =
"Writing to openPMD not implemented for k-point calculations"
550 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
551 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
552 nlumos, nmo, nspins, output_unit, &
554 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
555 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_stm, &
556 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
557 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
559 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
560 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
563 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
564 unoccupied_evals, unoccupied_evals_stm
565 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
566 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
567 TARGET :: homo_localized, lumo_localized, &
569 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
570 unoccupied_orbs, unoccupied_orbs_stm
573 TYPE(cp_section_key) :: mo_section
574 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
576 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
588 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
596 localize_section, print_key, &
599 CALL timeset(routinen, handle)
606 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
607 IF (
PRESENT(wf_type))
THEN
608 IF (output_unit > 0)
THEN
609 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
610 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
611 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
618 my_localized_wfn = .false.
619 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
620 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
621 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
622 unoccupied_evals_stm, molecule_set, mo_derivs, &
623 subsys, particles, input, print_key, kinetic_m, marked_states, &
624 mixed_evals, qs_loc_env_mixed)
625 NULLIFY (lumo_ptr, rho_ao)
632 p_loc_mixed = .false.
634 cpassert(
ASSOCIATED(scf_env))
635 cpassert(
ASSOCIATED(qs_env))
638 dft_control=dft_control, &
639 molecule_set=molecule_set, &
640 scf_control=scf_control, &
641 do_kpoints=do_kpoints, &
646 particle_set=particle_set, &
647 atomic_kind_set=atomic_kind_set, &
648 qs_kind_set=qs_kind_set)
655 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
656 DO ispin = 1, dft_control%nspins
657 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
662 CALL update_hartree_with_mp2(rho, qs_env)
665 CALL write_available_results(qs_env, scf_env)
669 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
671 cpassert(
ASSOCIATED(kinetic_m))
672 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
676 IF (unit_nr > 0)
THEN
677 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
680 "DFT%PRINT%KINETIC_ENERGY")
684 CALL qs_scf_post_charges(input, logger, qs_env)
697 IF (loc_print_explicit)
THEN
717 IF (loc_explicit)
THEN
727 p_loc_mixed = .false.
731 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
732 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
733 "therefore localization of unoccupied states will be skipped!")
744 mo_section = cube_or_openpmd(input, str_mo_cubes, str_mo_openpmd, logger)
746 IF (loc_print_explicit)
THEN
750 do_wannier_cubes = .false.
752 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
753 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
756 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
757 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
759 CALL auxbas_pw_pool%create_pw(wf_r)
760 CALL auxbas_pw_pool%create_pw(wf_g)
763 IF (dft_control%restricted)
THEN
767 nspins = dft_control%nspins
770 IF (dft_control%restricted .AND. (mo_section%do_output .OR. p_loc_homo))
THEN
771 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
776 cpwarn_if(mo_section%do_cubes(), warning_cube_kpoint)
777 cpwarn_if(mo_section%do_openpmd(), warning_openpmd_kpoint)
782 IF ((mo_section%do_output .AND. nhomo /= 0) .OR. do_stm)
THEN
784 IF (dft_control%do_admm)
THEN
786 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
788 IF (dft_control%hairy_probes)
THEN
789 scf_control%smear%do_smear = .false.
790 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
792 probe=dft_control%probe)
794 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
797 DO ispin = 1, dft_control%nspins
798 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
799 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
803 IF (mo_section%do_output .AND. nhomo /= 0)
THEN
806 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
807 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
808 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
809 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
820 cpwarn(
"Localization not implemented for k-point calculations!")
821 ELSEIF (dft_control%restricted &
824 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
826 ALLOCATE (occupied_orbs(dft_control%nspins))
827 ALLOCATE (occupied_evals(dft_control%nspins))
828 ALLOCATE (homo_localized(dft_control%nspins))
829 DO ispin = 1, dft_control%nspins
830 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
831 eigenvalues=mo_eigenvalues)
832 occupied_orbs(ispin) = mo_coeff
833 occupied_evals(ispin)%array => mo_eigenvalues
834 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
835 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
838 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
841 ALLOCATE (qs_loc_env_homo)
844 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
845 mo_section%do_output, mo_loc_history=mo_loc_history)
847 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
850 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
852 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
857 homo_localized, do_homo)
859 DEALLOCATE (occupied_orbs)
860 DEALLOCATE (occupied_evals)
862 IF (qs_loc_env_homo%do_localize)
THEN
863 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
870 IF (mo_section%do_output .OR. p_loc_lumo)
THEN
872 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
875 compute_lumos = mo_section%do_output .AND. nlumo /= 0
876 compute_lumos = compute_lumos .OR. p_loc_lumo
878 DO ispin = 1, dft_control%nspins
879 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
880 compute_lumos = compute_lumos .AND. homo == nmo
883 IF (mo_section%do_output .AND. .NOT. compute_lumos)
THEN
885 nlumo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NLUMO"))
886 DO ispin = 1, dft_control%nspins
888 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
889 IF (nlumo > nmo - homo)
THEN
892 IF (nlumo == -1)
THEN
895 IF (output_unit > 0)
WRITE (output_unit, *)
" "
896 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
897 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
898 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
901 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
902 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
903 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1, mo_section=mo_section)
909 IF (compute_lumos)
THEN
912 IF (nlumo == 0) check_write = .false.
915 ALLOCATE (qs_loc_env_lumo)
918 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
921 ALLOCATE (unoccupied_orbs(dft_control%nspins))
922 ALLOCATE (unoccupied_evals(dft_control%nspins))
923 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
924 lumo_ptr => unoccupied_orbs
925 DO ispin = 1, dft_control%nspins
927 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
929 IF (check_write)
THEN
930 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
932 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
933 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin, mo_section=mo_section)
938 ALLOCATE (lumo_localized(dft_control%nspins))
939 DO ispin = 1, dft_control%nspins
940 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
941 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
943 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, mo_section%do_output, &
944 evals=unoccupied_evals)
945 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
946 loc_coeff=unoccupied_orbs)
948 lumo_localized, wf_r, wf_g, particles, &
949 unoccupied_orbs, unoccupied_evals, marked_states)
950 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
951 evals=unoccupied_evals)
952 lumo_ptr => lumo_localized
956 IF (has_homo .AND. has_lumo)
THEN
957 IF (output_unit > 0)
WRITE (output_unit, *)
" "
958 DO ispin = 1, dft_control%nspins
959 IF (.NOT. scf_control%smear%do_smear)
THEN
960 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
961 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
962 "HOMO - LUMO gap [eV] :", gap*
evolt
968 IF (p_loc_mixed)
THEN
970 cpwarn(
"Localization not implemented for k-point calculations!")
971 ELSEIF (dft_control%restricted)
THEN
972 IF (output_unit > 0)
WRITE (output_unit, *) &
973 " Unclear how we define MOs / localization in the restricted case... skipping"
976 ALLOCATE (mixed_orbs(dft_control%nspins))
977 ALLOCATE (mixed_evals(dft_control%nspins))
978 ALLOCATE (mixed_localized(dft_control%nspins))
979 DO ispin = 1, dft_control%nspins
980 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
981 eigenvalues=mo_eigenvalues)
982 mixed_orbs(ispin) = mo_coeff
983 mixed_evals(ispin)%array => mo_eigenvalues
984 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
985 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
988 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
991 total_zeff_corr = scf_env%sum_zeff_corr
992 ALLOCATE (qs_loc_env_mixed)
995 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
996 mo_section%do_output, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
999 DO ispin = 1, dft_control%nspins
1000 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
1004 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
1007 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
1009 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
1016 DEALLOCATE (mixed_orbs)
1017 DEALLOCATE (mixed_evals)
1027 IF (((mo_section%do_output .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
1028 CALL auxbas_pw_pool%give_back_pw(wf_r)
1029 CALL auxbas_pw_pool%give_back_pw(wf_g)
1033 IF (.NOT. do_kpoints)
THEN
1034 IF (p_loc_homo)
THEN
1036 DEALLOCATE (qs_loc_env_homo)
1038 IF (p_loc_lumo)
THEN
1040 DEALLOCATE (qs_loc_env_lumo)
1042 IF (p_loc_mixed)
THEN
1044 DEALLOCATE (qs_loc_env_mixed)
1049 IF (do_kpoints)
THEN
1052 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
1053 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
1054 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
1055 matrix_s=matrix_s, marked_states=marked_states)
1059 IF (
ASSOCIATED(marked_states))
THEN
1060 DEALLOCATE (marked_states)
1064 IF (.NOT. do_kpoints)
THEN
1065 IF (compute_lumos)
THEN
1066 DO ispin = 1, dft_control%nspins
1067 DEALLOCATE (unoccupied_evals(ispin)%array)
1070 DEALLOCATE (unoccupied_evals)
1071 DEALLOCATE (unoccupied_orbs)
1077 IF (do_kpoints)
THEN
1078 cpwarn(
"STM not implemented for k-point calculations!")
1080 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
1081 IF (nlumo_stm > 0)
THEN
1082 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
1083 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
1084 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
1088 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
1089 unoccupied_evals_stm)
1091 IF (nlumo_stm > 0)
THEN
1092 DO ispin = 1, dft_control%nspins
1093 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
1095 DEALLOCATE (unoccupied_evals_stm)
1102 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1105 CALL qs_scf_post_efg(input, logger, qs_env)
1108 CALL qs_scf_post_et(input, qs_env, dft_control)
1111 CALL qs_scf_post_epr(input, logger, qs_env)
1114 CALL qs_scf_post_molopt(input, logger, qs_env)
1117 CALL qs_scf_post_elf(input, logger, qs_env)
1124 DO ispin = 1, dft_control%nspins
1125 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
1133 CALL timestop(handle)
1146 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
1150 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
1152 INTEGER,
INTENT(IN) :: nlumo
1153 INTEGER,
INTENT(OUT) :: nlumos
1155 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
1157 INTEGER :: handle, homo, ispin, n, nao, nmo, &
1164 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1171 CALL timeset(routinen, handle)
1173 NULLIFY (mos, ks_rmpv, scf_control, dft_control, admm_env, para_env, blacs_env)
1176 matrix_ks=ks_rmpv, &
1177 scf_control=scf_control, &
1178 dft_control=dft_control, &
1179 matrix_s=matrix_s, &
1180 admm_env=admm_env, &
1181 para_env=para_env, &
1182 blacs_env=blacs_env)
1187 DO ispin = 1, dft_control%nspins
1188 NULLIFY (unoccupied_evals(ispin)%array)
1190 IF (output_unit > 0)
WRITE (output_unit, *)
" "
1191 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
1192 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
1193 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1195 nlumos = max(1, min(nlumo, nao - nmo))
1196 IF (nlumo == -1) nlumos = nao - nmo
1197 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1199 nrow_global=n, ncol_global=nlumos)
1200 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1205 NULLIFY (local_preconditioner)
1206 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1207 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1210 NULLIFY (local_preconditioner)
1215 IF (dft_control%do_admm)
THEN
1219 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1220 matrix_c_fm=unoccupied_orbs(ispin), &
1221 matrix_orthogonal_space_fm=mo_coeff, &
1222 eps_gradient=scf_control%eps_lumos, &
1224 iter_max=scf_control%max_iter_lumos, &
1225 size_ortho_space=nmo)
1228 unoccupied_evals(ispin)%array, scr=output_unit, &
1229 ionode=output_unit > 0)
1232 IF (dft_control%do_admm)
THEN
1238 CALL timestop(handle)
1247 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
1252 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
1254 INTEGER :: handle, print_level, unit_nr
1255 LOGICAL :: do_kpoints, print_it
1258 CALL timeset(routinen, handle)
1260 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
1268 log_filename=.false.)
1271 IF (print_it) print_level = 2
1273 IF (print_it) print_level = 3
1274 IF (do_kpoints)
THEN
1275 cpwarn(
"Lowdin charges not implemented for k-point calculations!")
1288 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
1289 log_filename=.false.)
1291 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
1295 CALL timestop(handle)
1297 END SUBROUTINE qs_scf_post_charges
1314 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1315 mo_coeff, wf_g, wf_r, particles, homo, ispin, mo_section)
1324 INTEGER,
INTENT(IN) :: homo, ispin
1325 TYPE(cp_section_key) :: mo_section
1327 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1329 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1330 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1332 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1333 LOGICAL :: append_cube, mpi_io
1338 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1340 CALL timeset(routinen, handle)
1345 cpassert(mo_section%grid_output /= grid_output_openpmd)
1348 NULLIFY (list_index)
1351 ,
cp_p_file) .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1352 nhomo =
section_get_ival(dft_section, mo_section%concat_to_relative(
"%NHOMO"))
1354 IF (mo_section%grid_output == grid_output_cubes)
THEN
1355 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1357 my_pos_cube =
"REWIND"
1358 IF (append_cube)
THEN
1359 my_pos_cube =
"APPEND"
1361 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), n_rep_val=n_rep)
1366 CALL section_vals_val_get(dft_section, mo_section%concat_to_relative(
"%HOMO_LIST"), i_rep_val=ir, &
1368 IF (
ASSOCIATED(
list))
THEN
1370 DO i = 1,
SIZE(
list)
1371 list_index(i + nlist) =
list(i)
1373 nlist = nlist +
SIZE(
list)
1378 IF (nhomo == -1) nhomo = homo
1379 nlist = homo - max(1, homo - nhomo + 1) + 1
1380 ALLOCATE (list_index(nlist))
1382 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1386 ivector = list_index(i)
1388 atomic_kind_set=atomic_kind_set, &
1389 qs_kind_set=qs_kind_set, &
1391 particle_set=particle_set, &
1394 cell, dft_control, particle_set, pw_env)
1395 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1398 unit_nr = mo_section%print_key_unit_nr(logger, input, mo_section%absolute_section_key, extension=
".cube", &
1399 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1400 mpi_io=mpi_io, openpmd_basename=
"dft-mo")
1401 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1402 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1403 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1404 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1406 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1408 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1411 CALL timestop(handle)
1413 END SUBROUTINE qs_scf_post_occ_cubes
1432 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1433 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo, mo_section)
1439 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1443 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1444 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1445 TYPE(cp_section_key) :: mo_section
1447 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1449 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1450 INTEGER :: handle, ifirst, index_mo, ivector, &
1452 LOGICAL :: append_cube, mpi_io
1457 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1459 CALL timeset(routinen, handle)
1464 cpassert(mo_section%grid_output /= grid_output_openpmd)
1468 .AND.
section_get_lval(dft_section, mo_section%concat_to_relative(section_key_do_write(mo_section%grid_output))))
THEN
1469 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1471 IF (mo_section%grid_output == grid_output_cubes)
THEN
1472 append_cube =
section_get_lval(dft_section, mo_section%concat_to_relative(
"%APPEND"))
1474 my_pos_cube =
"REWIND"
1475 IF (append_cube)
THEN
1476 my_pos_cube =
"APPEND"
1479 IF (
PRESENT(lumo)) ifirst = lumo
1480 DO ivector = ifirst, ifirst + nlumos - 1
1482 atomic_kind_set=atomic_kind_set, &
1483 qs_kind_set=qs_kind_set, &
1485 particle_set=particle_set, &
1488 qs_kind_set, cell, dft_control, particle_set, pw_env)
1490 IF (ifirst == 1)
THEN
1491 index_mo = homo + ivector
1495 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1498 unit_nr = mo_section%print_key_unit_nr(logger, input, mo_section%absolute_section_key, extension=
".cube", &
1499 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1500 mpi_io=mpi_io, openpmd_basename=
"dft-mo")
1501 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1502 CALL mo_section%write_pw(wf_r, unit_nr, title, particles=particles, &
1503 stride=
section_get_ivals(dft_section, mo_section%concat_to_relative(
"%STRIDE")), &
1504 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1506 CALL mo_section%print_key_finished_output(unit_nr, logger, input, mo_section%absolute_section_key, mpi_io=mpi_io)
1511 CALL timestop(handle)
1513 END SUBROUTINE qs_scf_post_unocc_cubes
1526 INTEGER,
INTENT(IN) :: output_unit
1528 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1530 CHARACTER(LEN=default_path_length) :: filename
1531 INTEGER :: handle, max_nmo, maxmom, reference, &
1533 LOGICAL :: com_nl, do_kpoints, magnetic, periodic, &
1534 second_ref_point, vel_reprs
1535 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1538 CALL timeset(routinen, handle)
1541 subsection_name=
"DFT%PRINT%MOMENTS")
1546 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1548 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1550 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1552 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1554 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1556 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1558 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1560 keyword_name=
"DFT%PRINT%MOMENTS%MAX_NMO")
1565 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1566 middle_name=
"moments", log_filename=.false.)
1568 IF (output_unit > 0)
THEN
1569 IF (unit_nr /= output_unit)
THEN
1570 INQUIRE (unit=unit_nr, name=filename)
1571 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1572 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1575 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1579 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1581 IF (do_kpoints)
THEN
1587 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1592 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1594 IF (second_ref_point)
THEN
1596 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1601 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1602 middle_name=
"moments_refpoint_2", log_filename=.false.)
1604 IF (output_unit > 0)
THEN
1605 IF (unit_nr /= output_unit)
THEN
1606 INQUIRE (unit=unit_nr, name=filename)
1607 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1608 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1611 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1614 IF (do_kpoints)
THEN
1620 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1624 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1629 CALL timestop(handle)
1641 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1646 INTEGER,
INTENT(IN) :: output_unit
1648 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1650 CHARACTER(LEN=default_path_length) :: filename
1651 INTEGER :: handle, unit_nr
1652 REAL(kind=
dp) :: q_max
1655 CALL timeset(routinen, handle)
1658 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1662 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1664 basis_section=input, &
1665 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1667 middle_name=
"xrd", &
1668 log_filename=.false.)
1669 IF (output_unit > 0)
THEN
1670 INQUIRE (unit=unit_nr, name=filename)
1671 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1672 "X-RAY DIFFRACTION SPECTRUM"
1673 IF (unit_nr /= output_unit)
THEN
1674 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1675 "The coherent X-ray diffraction spectrum is written to the file:", &
1680 unit_number=unit_nr, &
1684 basis_section=input, &
1685 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1688 CALL timestop(handle)
1690 END SUBROUTINE qs_scf_post_xray
1698 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1703 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1708 CALL timeset(routinen, handle)
1711 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1717 CALL timestop(handle)
1719 END SUBROUTINE qs_scf_post_efg
1727 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1732 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1734 INTEGER :: handle, ispin
1736 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1739 CALL timeset(routinen, handle)
1745 IF (qs_env%et_coupling%first_run)
THEN
1747 ALLOCATE (my_mos(dft_control%nspins))
1748 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1749 DO ispin = 1, dft_control%nspins
1751 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1752 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1761 CALL timestop(handle)
1763 END SUBROUTINE qs_scf_post_et
1774 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
1779 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
1781 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1783 INTEGER :: handle, ispin, output_unit, unit_nr
1784 LOGICAL :: append_cube, gapw, mpi_io
1785 REAL(
dp) :: rho_cutoff
1786 TYPE(cp_section_key) :: elf_section_key
1796 CALL timeset(routinen, handle)
1799 elf_section_key = cube_or_openpmd(input, str_elf_cubes, str_elf_openpmd, logger)
1802 IF (elf_section_key%do_output)
THEN
1804 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
1805 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
1808 gapw = dft_control%qs_control%gapw
1809 IF (.NOT. gapw)
THEN
1811 ALLOCATE (elf_r(dft_control%nspins))
1812 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1814 DO ispin = 1, dft_control%nspins
1815 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1819 IF (output_unit > 0)
THEN
1820 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
1821 " ----- ELF is computed on the real space grid -----"
1829 IF (elf_section_key%grid_output == grid_output_cubes)
THEN
1832 my_pos_cube =
"REWIND"
1833 IF (append_cube)
THEN
1834 my_pos_cube =
"APPEND"
1837 DO ispin = 1, dft_control%nspins
1838 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1839 WRITE (title, *)
"ELF spin ", ispin
1841 unit_nr = elf_section_key%print_key_unit_nr( &
1842 logger, input, elf_section_key%absolute_section_key, extension=
".cube", &
1843 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1844 mpi_io=mpi_io, fout=mpi_filename, openpmd_basename=
"dft-elf")
1845 IF (output_unit > 0)
THEN
1846 IF (.NOT. mpi_io)
THEN
1847 INQUIRE (unit=unit_nr, name=filename)
1849 filename = mpi_filename
1851 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
1852 "ELF is written in "//elf_section_key%format_name//
" file format to the file:", &
1856 CALL elf_section_key%write_pw(elf_r(ispin), unit_nr, title, particles=particles, &
1858 CALL elf_section_key%print_key_finished_output( &
1862 elf_section_key%absolute_section_key, &
1865 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1873 cpwarn(
"ELF not implemented for GAPW calculations!")
1878 CALL timestop(handle)
1880 END SUBROUTINE qs_scf_post_elf
1892 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
1897 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
1899 INTEGER :: handle, nao, unit_nr
1900 REAL(kind=
dp) :: s_cond_number
1901 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
1910 CALL timeset(routinen, handle)
1913 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
1917 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
1920 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
1922 nrow_global=nao, ncol_global=nao, &
1923 template_fmstruct=mo_coeff%matrix_struct)
1924 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
1926 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
1929 ALLOCATE (eigenvalues(nao))
1937 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
1940 extension=
".molopt")
1942 IF (unit_nr > 0)
THEN
1945 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
1946 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
1950 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
1954 CALL timestop(handle)
1956 END SUBROUTINE qs_scf_post_molopt
1964 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
1969 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
1974 CALL timeset(routinen, handle)
1977 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
1983 CALL timestop(handle)
1985 END SUBROUTINE qs_scf_post_epr
1994 SUBROUTINE write_available_results(qs_env, scf_env)
1998 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
2002 CALL timeset(routinen, handle)
2010 CALL timestop(handle)
2012 END SUBROUTINE write_available_results
2025 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
2027 INTEGER :: handle, homo, ispin, nmo, output_unit
2028 LOGICAL :: all_equal, do_kpoints, explicit
2029 REAL(kind=
dp) :: maxocc, s_square, s_square_ideal, &
2030 total_abs_spin_dens, total_spin_dens
2031 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
2037 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
2050 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2059 CALL timeset(routinen, handle)
2061 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
2062 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
2063 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
2064 molecule_set, input, particles, subsys, rho_r)
2069 cpassert(
ASSOCIATED(qs_env))
2071 dft_control=dft_control, &
2072 molecule_set=molecule_set, &
2073 atomic_kind_set=atomic_kind_set, &
2074 particle_set=particle_set, &
2075 qs_kind_set=qs_kind_set, &
2076 admm_env=admm_env, &
2077 scf_control=scf_control, &
2086 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
2090 IF (.NOT. qs_env%run_rtp)
THEN
2097 IF (.NOT. do_kpoints)
THEN
2098 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
2104 dft_section,
"PRINT%CHARGEMOL"), &
2113 IF (do_kpoints)
THEN
2124 IF (do_kpoints)
THEN
2125 cpwarn(
"Projected density of states (pDOS) is not implemented for k points")
2130 DO ispin = 1, dft_control%nspins
2132 IF (dft_control%do_admm)
THEN
2135 IF (
PRESENT(scf_env))
THEN
2137 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
2138 eigenvalues=mo_eigenvalues)
2139 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
2140 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
2142 mo_coeff_deriv => null()
2145 do_rotation=.true., &
2146 co_rotate_dbcsr=mo_coeff_deriv)
2150 IF (dft_control%nspins == 2)
THEN
2152 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
2155 qs_kind_set, particle_set, qs_env, dft_section)
2158 IF (dft_control%do_admm)
THEN
2167 IF (dft_control%nspins == 2)
THEN
2169 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2170 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2172 CALL auxbas_pw_pool%create_pw(wf_r)
2174 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
2176 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
2177 "Integrated spin density: ", total_spin_dens
2179 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
2180 "Integrated absolute spin density: ", total_abs_spin_dens
2181 CALL auxbas_pw_pool%give_back_pw(wf_r)
2187 IF (do_kpoints)
THEN
2188 cpwarn(
"Spin contamination estimate not implemented for k-points.")
2191 DO ispin = 1, dft_control%nspins
2193 occupation_numbers=occupation_numbers, &
2198 all_equal = all_equal .AND. &
2199 (all(occupation_numbers(1:homo) == maxocc) .AND. &
2200 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
2203 IF (.NOT. all_equal)
THEN
2204 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(T3,A)") &
2205 "WARNING: S**2 computation does not yet treat fractional occupied orbitals"
2208 matrix_s=matrix_s, &
2211 s_square_ideal=s_square_ideal)
2212 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
2213 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
2214 energy%s_square = s_square
2219 CALL timestop(handle)
2231 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
2232 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
2234 CHARACTER(LEN=2) :: element_symbol
2235 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
2237 CHARACTER(LEN=default_string_length) :: name, print_density
2238 INTEGER :: after, handle, i, iat, iatom, id, ikind, img, iso, ispin, iw, l, n_rep_hf, nat, &
2239 natom, nd(3), ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, &
2240 should_print_voro, unit_nr, unit_nr_voro
2241 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
2242 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
2244 rho_total, rho_total_rspace, udvol, &
2246 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
2247 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
2248 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
2249 REAL(kind=
dp),
DIMENSION(3) :: dr
2250 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
2255 TYPE(cp_section_key) :: e_density_section
2257 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
2265 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
2272 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2280 print_key, print_key_bqb, &
2281 print_key_voro, xc_section
2283 CALL timeset(routinen, handle)
2284 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
2285 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
2286 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
2292 cpassert(
ASSOCIATED(qs_env))
2294 atomic_kind_set=atomic_kind_set, &
2295 qs_kind_set=qs_kind_set, &
2296 particle_set=particle_set, &
2298 para_env=para_env, &
2299 dft_control=dft_control, &
2301 do_kpoints=do_kpoints, &
2309 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
2310 ALLOCATE (zcharge(natom))
2315 iat = atomic_kind_set(ikind)%atom_list(iatom)
2322 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
2323 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
2325 my_pos_cube =
"REWIND"
2326 IF (append_cube)
THEN
2327 my_pos_cube =
"APPEND"
2330 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
2331 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
2332 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
2334 CALL auxbas_pw_pool%create_pw(wf_r)
2335 IF (dft_control%qs_control%gapw)
THEN
2336 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
2337 CALL pw_axpy(rho_core, rho0_s_gs)
2338 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2339 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2342 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
2343 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2344 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2347 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2348 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2351 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2352 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2358 DO ispin = 1, dft_control%nspins
2359 CALL pw_axpy(rho_r(ispin), wf_r)
2361 filename =
"TOTAL_DENSITY"
2364 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2365 log_filename=.false., mpi_io=mpi_io)
2367 particles=particles, zeff=zcharge, &
2369 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%TOT_DENSITY_CUBE%MAX_FILE_SIZE_MB"), &
2372 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2373 CALL auxbas_pw_pool%give_back_pw(wf_r)
2376 e_density_section = cube_or_openpmd(input, str_e_density_cubes, str_e_density_openpmd, logger)
2379 IF (e_density_section%do_output)
THEN
2381 keyword_name=e_density_section%concat_to_relative(
"%DENSITY_INCLUDE"), &
2382 c_val=print_density)
2383 print_density = trim(print_density)
2385 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2386 append_cube =
section_get_lval(input, e_density_section%concat_to_absolute(
"%APPEND"))
2388 my_pos_cube =
"REWIND"
2389 IF (append_cube)
THEN
2390 my_pos_cube =
"APPEND"
2394 IF (e_density_section%grid_output == grid_output_cubes)
THEN
2395 xrd_interface =
section_get_lval(input, e_density_section%concat_to_absolute(
"%XRD_INTERFACE"))
2398 xrd_interface = .false.
2401 IF (xrd_interface)
THEN
2403 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2405 filename =
"ELECTRON_DENSITY"
2407 extension=
".xrd", middle_name=trim(filename), &
2408 file_position=my_pos_cube, log_filename=.false.)
2409 ngto =
section_get_ival(input, e_density_section%concat_to_absolute(
"%NGAUSS"))
2410 IF (output_unit > 0)
THEN
2411 INQUIRE (unit=unit_nr, name=filename)
2412 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2413 "The electron density (atomic part) is written to the file:", &
2418 nkind =
SIZE(atomic_kind_set)
2419 IF (unit_nr > 0)
THEN
2420 WRITE (unit_nr, *)
"Atomic (core) densities"
2421 WRITE (unit_nr, *)
"Unit cell"
2422 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2423 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2424 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2425 WRITE (unit_nr, *)
"Atomic types"
2426 WRITE (unit_nr, *) nkind
2429 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2431 atomic_kind => atomic_kind_set(ikind)
2432 qs_kind => qs_kind_set(ikind)
2433 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2435 iunit=output_unit, confine=.true.)
2437 iunit=output_unit, allelectron=.true., confine=.true.)
2438 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2439 ccdens(:, 2, ikind) = 0._dp
2440 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2441 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2442 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2443 IF (unit_nr > 0)
THEN
2444 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2445 WRITE (unit_nr, fmt=
"(I6)") ngto
2446 WRITE (unit_nr, *)
" Total density"
2447 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2448 WRITE (unit_nr, *)
" Core density"
2449 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2451 NULLIFY (atomic_kind)
2454 IF (dft_control%qs_control%gapw)
THEN
2455 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2457 IF (unit_nr > 0)
THEN
2458 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2460 np = particles%n_els
2462 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2463 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2464 rho_atom => rho_atom_set(iat)
2465 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2466 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2467 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2472 CALL para_env%sum(nr)
2473 CALL para_env%sum(niso)
2475 ALLOCATE (bfun(nr, niso))
2477 DO ispin = 1, dft_control%nspins
2478 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2479 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2482 CALL para_env%sum(bfun)
2483 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2484 ccdens(:, 2, ikind) = 0._dp
2485 IF (unit_nr > 0)
THEN
2486 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2490 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2491 IF (unit_nr > 0)
THEN
2492 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2493 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2499 IF (unit_nr > 0)
THEN
2500 WRITE (unit_nr, *)
"Coordinates"
2501 np = particles%n_els
2503 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2504 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2509 DEALLOCATE (ppdens, aedens, ccdens)
2512 e_density_section%absolute_section_key)
2515 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2517 cpassert(.NOT. do_kpoints)
2522 auxbas_pw_pool=auxbas_pw_pool, &
2524 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2526 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2531 q_max = sqrt(sum((
pi/dr(:))**2))
2533 auxbas_pw_pool=auxbas_pw_pool, &
2534 rhotot_elec_gspace=rho_elec_gspace, &
2536 rho_hard=rho_hard, &
2538 rho_total = rho_hard + rho_soft
2543 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2545 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2547 filename =
"TOTAL_ELECTRON_DENSITY"
2549 unit_nr = e_density_section%print_key_unit_nr(logger, input, e_density_section%absolute_section_key, &
2550 extension=
".cube", middle_name=trim(filename), &
2551 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2552 fout=mpi_filename, openpmd_basename=
"dft-total-electron-density")
2553 IF (output_unit > 0)
THEN
2554 IF (.NOT. mpi_io)
THEN
2555 INQUIRE (unit=unit_nr, name=filename)
2557 filename = mpi_filename
2559 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2560 "The total electron density is written in "//e_density_section%format_name//
" file format to the file:", &
2562 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2563 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2564 "Soft electronic charge (G-space) :", rho_soft, &
2565 "Hard electronic charge (G-space) :", rho_hard, &
2566 "Total electronic charge (G-space):", rho_total, &
2567 "Total electronic charge (R-space):", rho_total_rspace
2569 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2570 particles=particles, zeff=zcharge, &
2571 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2572 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2573 e_density_section%absolute_section_key, mpi_io=mpi_io)
2575 IF (dft_control%nspins > 1)
THEN
2579 auxbas_pw_pool=auxbas_pw_pool, &
2580 rhotot_elec_gspace=rho_elec_gspace, &
2582 rho_hard=rho_hard, &
2583 rho_soft=rho_soft, &
2585 rho_total = rho_hard + rho_soft
2589 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2591 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2593 filename =
"TOTAL_SPIN_DENSITY"
2595 unit_nr = e_density_section%print_key_unit_nr(logger, input, e_density_section%absolute_section_key, &
2596 extension=
".cube", middle_name=trim(filename), &
2597 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2598 fout=mpi_filename, openpmd_basename=
"dft-total-spin-density")
2599 IF (output_unit > 0)
THEN
2600 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2601 INQUIRE (unit=unit_nr, name=filename)
2603 filename = mpi_filename
2605 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2606 "The total spin density is written in "//e_density_section%format_name//
" file format to the file:", &
2608 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2609 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2610 "Soft part of the spin density (G-space):", rho_soft, &
2611 "Hard part of the spin density (G-space):", rho_hard, &
2612 "Total spin density (G-space) :", rho_total, &
2613 "Total spin density (R-space) :", rho_total_rspace
2615 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2616 particles=particles, zeff=zcharge, &
2617 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2618 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2619 e_density_section%absolute_section_key, mpi_io=mpi_io)
2621 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2622 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2624 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2625 IF (dft_control%nspins > 1)
THEN
2629 auxbas_pw_pool=auxbas_pw_pool, &
2631 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2632 CALL pw_copy(rho_r(1), rho_elec_rspace)
2633 CALL pw_axpy(rho_r(2), rho_elec_rspace)
2634 filename =
"ELECTRON_DENSITY"
2636 unit_nr = e_density_section%print_key_unit_nr(logger, input, e_density_section%absolute_section_key, &
2637 extension=
".cube", middle_name=trim(filename), &
2638 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2639 fout=mpi_filename, openpmd_basename=
"dft-electron-density")
2640 IF (output_unit > 0)
THEN
2641 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2642 INQUIRE (unit=unit_nr, name=filename)
2644 filename = mpi_filename
2646 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2647 "The sum of alpha and beta density is written in "//e_density_section%format_name//
" file format to the file:", &
2650 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
2651 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
2653 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2654 e_density_section%absolute_section_key, mpi_io=mpi_io)
2655 CALL pw_copy(rho_r(1), rho_elec_rspace)
2656 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2657 filename =
"SPIN_DENSITY"
2659 unit_nr = e_density_section%print_key_unit_nr(logger, input, e_density_section%absolute_section_key, &
2660 extension=
".cube", middle_name=trim(filename), &
2661 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2662 fout=mpi_filename, openpmd_basename=
"dft-spin-density")
2663 IF (output_unit > 0)
THEN
2664 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2665 INQUIRE (unit=unit_nr, name=filename)
2667 filename = mpi_filename
2669 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2670 "The spin density is written in "//e_density_section%format_name//
" file format to the file:", &
2673 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2674 particles=particles, zeff=zcharge, &
2675 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2676 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2677 e_density_section%absolute_section_key, mpi_io=mpi_io)
2678 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2680 filename =
"ELECTRON_DENSITY"
2682 unit_nr = e_density_section%print_key_unit_nr(logger, input, e_density_section%absolute_section_key, &
2683 extension=
".cube", middle_name=trim(filename), &
2684 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2685 fout=mpi_filename, openpmd_basename=
"dft-electron-density")
2686 IF (output_unit > 0)
THEN
2687 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2688 INQUIRE (unit=unit_nr, name=filename)
2690 filename = mpi_filename
2692 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2693 "The electron density is written in "//e_density_section%format_name//
" file format to the file:", &
2696 CALL e_density_section%write_pw(rho_r(1), unit_nr,
"ELECTRON DENSITY", &
2697 particles=particles, zeff=zcharge, &
2698 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2699 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2700 e_density_section%absolute_section_key, mpi_io=mpi_io)
2703 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
2704 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
2705 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
2706 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
2709 ALLOCATE (my_q0(natom))
2717 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
2721 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2725 DO ispin = 1, dft_control%nspins
2726 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
2730 rho_total_rspace = rho_soft + rho_hard
2732 filename =
"ELECTRON_DENSITY"
2734 unit_nr = e_density_section%print_key_unit_nr(logger, input, e_density_section%absolute_section_key, &
2735 extension=
".cube", middle_name=trim(filename), &
2736 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2737 fout=mpi_filename, openpmd_basename=
"dft-electron-density")
2738 IF (output_unit > 0)
THEN
2739 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2740 INQUIRE (unit=unit_nr, name=filename)
2742 filename = mpi_filename
2744 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2745 "The electron density is written in "//e_density_section%format_name//
" file format to the file:", &
2747 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2748 "Soft electronic charge (R-space) :", rho_soft, &
2749 "Hard electronic charge (R-space) :", rho_hard, &
2750 "Total electronic charge (R-space):", rho_total_rspace
2752 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
2753 particles=particles, zeff=zcharge, stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), &
2755 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2756 e_density_section%absolute_section_key, mpi_io=mpi_io)
2759 IF (dft_control%nspins > 1)
THEN
2761 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
2764 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2767 CALL pw_axpy(rho_r(1), rho_elec_rspace)
2768 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2772 rho_total_rspace = rho_soft + rho_hard
2774 filename =
"SPIN_DENSITY"
2776 unit_nr = e_density_section%print_key_unit_nr(logger, input, e_density_section%absolute_section_key, &
2777 extension=
".cube", middle_name=trim(filename), &
2778 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2779 fout=mpi_filename, openpmd_basename=
"dft-spin-density")
2780 IF (output_unit > 0)
THEN
2781 IF (.NOT. mpi_io .AND. e_density_section%grid_output == grid_output_cubes)
THEN
2782 INQUIRE (unit=unit_nr, name=filename)
2784 filename = mpi_filename
2786 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2787 "The spin density is written in "//e_density_section%format_name//
" file format to the file:", &
2789 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2790 "Soft part of the spin density :", rho_soft, &
2791 "Hard part of the spin density :", rho_hard, &
2792 "Total spin density (R-space) :", rho_total_rspace
2794 CALL e_density_section%write_pw(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2795 particles=particles, zeff=zcharge, &
2796 stride=
section_get_ivals(dft_section, e_density_section%concat_to_relative(
"%STRIDE")), mpi_io=mpi_io)
2797 CALL e_density_section%print_key_finished_output(unit_nr, logger, input, &
2798 e_density_section%absolute_section_key, mpi_io=mpi_io)
2800 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2806 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
2812 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
2816 v_hartree_rspace=v_hartree_rspace)
2817 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2818 CALL auxbas_pw_pool%create_pw(aux_r)
2821 my_pos_cube =
"REWIND"
2822 IF (append_cube)
THEN
2823 my_pos_cube =
"APPEND"
2826 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2829 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
2830 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2832 CALL pw_copy(v_hartree_rspace, aux_r)
2835 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
2837 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%V_HARTREE_CUBE%MAX_FILE_SIZE_MB"), &
2840 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
2842 CALL auxbas_pw_pool%give_back_pw(aux_r)
2847 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
2848 IF (dft_control%apply_external_potential)
THEN
2849 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
2850 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2851 CALL auxbas_pw_pool%create_pw(aux_r)
2853 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
2854 my_pos_cube =
"REWIND"
2855 IF (append_cube)
THEN
2856 my_pos_cube =
"APPEND"
2861 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
2865 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
2866 stride=
section_get_ivals(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), &
2867 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EXTERNAL_POTENTIAL_CUBE%MAX_FILE_SIZE_MB"), &
2870 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
2872 CALL auxbas_pw_pool%give_back_pw(aux_r)
2878 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
2880 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2881 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2882 CALL auxbas_pw_pool%create_pw(aux_r)
2883 CALL auxbas_pw_pool%create_pw(aux_g)
2886 my_pos_cube =
"REWIND"
2887 IF (append_cube)
THEN
2888 my_pos_cube =
"APPEND"
2890 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
2891 v_hartree_rspace=v_hartree_rspace)
2893 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2897 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
2907 CALL cp_pw_to_cube(aux_r, unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
2909 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%EFIELD_CUBE%MAX_FILE_SIZE_MB"), &
2912 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
2915 CALL auxbas_pw_pool%give_back_pw(aux_r)
2916 CALL auxbas_pw_pool%give_back_pw(aux_g)
2920 CALL qs_scf_post_local_energy(input, logger, qs_env)
2923 CALL qs_scf_post_local_stress(input, logger, qs_env)
2926 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
2934 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
2939 after = min(max(after, 1), 16)
2940 DO ispin = 1, dft_control%nspins
2941 DO img = 1, dft_control%nimages
2943 para_env, output_unit=iw, omit_headers=omit_headers)
2947 "DFT%PRINT%AO_MATRICES/DENSITY")
2952 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
2954 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
2956 IF (write_ks .OR. write_xc)
THEN
2957 IF (write_xc) qs_env%requires_matrix_vxc = .true.
2960 just_energy=.false.)
2961 IF (write_xc) qs_env%requires_matrix_vxc = .false.
2968 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
2970 after = min(max(after, 1), 16)
2971 DO ispin = 1, dft_control%nspins
2972 DO img = 1, dft_control%nimages
2974 para_env, output_unit=iw, omit_headers=omit_headers)
2978 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
2983 IF (.NOT. dft_control%qs_control%pao)
THEN
2991 CALL write_adjacency_matrix(qs_env, input)
2995 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
2996 cpassert(
ASSOCIATED(matrix_vxc))
3000 after = min(max(after, 1), 16)
3001 DO ispin = 1, dft_control%nspins
3002 DO img = 1, dft_control%nimages
3004 para_env, output_unit=iw, omit_headers=omit_headers)
3008 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
3013 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
3019 after = min(max(after, 1), 16)
3022 para_env, output_unit=iw, omit_headers=omit_headers)
3026 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
3032 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
3035 IF (print_it) print_level = 2
3037 IF (print_it) print_level = 3
3048 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3049 IF (rho_r_valid)
THEN
3050 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
3051 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
3059 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
3061 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
3069 should_print_voro = 1
3071 should_print_voro = 0
3074 should_print_bqb = 1
3076 should_print_bqb = 0
3078 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
3083 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
3084 IF (rho_r_valid)
THEN
3086 IF (dft_control%nspins > 1)
THEN
3090 auxbas_pw_pool=auxbas_pw_pool, &
3094 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
3095 CALL pw_copy(rho_r(1), mb_rho)
3096 CALL pw_axpy(rho_r(2), mb_rho)
3103 IF (should_print_voro /= 0)
THEN
3105 IF (voro_print_txt)
THEN
3107 my_pos_voro =
"REWIND"
3108 IF (append_voro)
THEN
3109 my_pos_voro =
"APPEND"
3111 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
3112 file_position=my_pos_voro, log_filename=.false.)
3120 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
3121 unit_nr_voro, qs_env, mb_rho)
3123 IF (dft_control%nspins > 1)
THEN
3124 CALL auxbas_pw_pool%give_back_pw(mb_rho)
3128 IF (unit_nr_voro > 0)
THEN
3138 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
3146 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
3154 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
3156 IF (iao_env%do_iao)
THEN
3166 extension=
".mao", log_filename=.false.)
3177 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
3181 DEALLOCATE (zcharge)
3183 CALL timestop(handle)
3193 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
3196 INTEGER,
INTENT(IN) :: unit_nr
3198 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
3199 radius_type, refc, shapef
3200 INTEGER,
DIMENSION(:),
POINTER :: atom_list
3201 LOGICAL :: do_radius, do_sc, paw_atom
3202 REAL(kind=
dp) :: zeff
3203 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
3204 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
3207 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
3213 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3217 NULLIFY (hirshfeld_env)
3221 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
3222 ALLOCATE (hirshfeld_env%charges(natom))
3231 IF (.NOT.
SIZE(radii) == nkind) &
3232 CALL cp_abort(__location__, &
3233 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
3234 "match number of atomic kinds in the input coordinate file.")
3239 iterative=do_sc, ref_charge=refc, &
3240 radius_type=radius_type)
3242 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
3248 nspin =
SIZE(matrix_p, 1)
3249 ALLOCATE (charges(natom, nspin))
3254 atomic_kind => atomic_kind_set(ikind)
3256 DO iat = 1,
SIZE(atom_list)
3258 hirshfeld_env%charges(i) = zeff
3262 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
3265 hirshfeld_env%charges(iat) = sum(charges(iat, :))
3268 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
3272 IF (hirshfeld_env%iterative)
THEN
3279 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
3280 IF (dft_control%qs_control%gapw)
THEN
3282 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
3285 atomic_kind => particle_set(iat)%atomic_kind
3287 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
3289 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
3294 IF (unit_nr > 0)
THEN
3296 qs_kind_set, unit_nr)
3302 DEALLOCATE (charges)
3304 END SUBROUTINE hirshfeld_charges
3314 SUBROUTINE project_function_a(ca, a, cb, b, l)
3316 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3317 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
3318 INTEGER,
INTENT(IN) :: l
3321 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3322 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
3325 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
3329 v(:, 1) = matmul(tmat, cb)
3330 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3334 DEALLOCATE (smat, tmat, v, ipiv)
3336 END SUBROUTINE project_function_a
3346 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
3348 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
3349 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
3351 INTEGER,
INTENT(IN) :: l
3353 INTEGER :: i, info, n, nr
3354 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3355 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
3356 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
3360 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3364 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3365 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3367 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3371 DEALLOCATE (smat, v, ipiv, afun)
3373 END SUBROUTINE project_function_b
3384 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3389 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3391 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3392 INTEGER :: handle, io_unit, natom, unit_nr
3393 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3402 CALL timeset(routinen, handle)
3405 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3407 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3408 gapw = dft_control%qs_control%gapw
3409 gapw_xc = dft_control%qs_control%gapw_xc
3410 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3412 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3413 CALL auxbas_pw_pool%create_pw(eden)
3417 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3418 IF (append_cube)
THEN
3419 my_pos_cube =
"APPEND"
3421 my_pos_cube =
"REWIND"
3425 extension=
".cube", middle_name=
"local_energy", &
3426 file_position=my_pos_cube, mpi_io=mpi_io)
3427 CALL cp_pw_to_cube(eden, unit_nr,
"LOCAL ENERGY", particles=particles, &
3429 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_ENERGY_CUBE%MAX_FILE_SIZE_MB"), &
3431 IF (io_unit > 0)
THEN
3432 INQUIRE (unit=unit_nr, name=filename)
3433 IF (gapw .OR. gapw_xc)
THEN
3434 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3435 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3437 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3438 "The local energy is written to the file: ", trim(adjustl(filename))
3442 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3444 CALL auxbas_pw_pool%give_back_pw(eden)
3446 CALL timestop(handle)
3448 END SUBROUTINE qs_scf_post_local_energy
3459 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3464 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3466 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3467 INTEGER :: handle, io_unit, natom, unit_nr
3468 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3469 REAL(kind=
dp) :: beta
3478 CALL timeset(routinen, handle)
3481 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3483 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3484 gapw = dft_control%qs_control%gapw
3485 gapw_xc = dft_control%qs_control%gapw_xc
3486 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3488 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3489 CALL auxbas_pw_pool%create_pw(stress)
3495 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3496 IF (append_cube)
THEN
3497 my_pos_cube =
"APPEND"
3499 my_pos_cube =
"REWIND"
3503 extension=
".cube", middle_name=
"local_stress", &
3504 file_position=my_pos_cube, mpi_io=mpi_io)
3505 CALL cp_pw_to_cube(stress, unit_nr,
"LOCAL STRESS", particles=particles, &
3507 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%LOCAL_STRESS_CUBE%MAX_FILE_SIZE_MB"), &
3509 IF (io_unit > 0)
THEN
3510 INQUIRE (unit=unit_nr, name=filename)
3511 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3512 IF (gapw .OR. gapw_xc)
THEN
3513 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3514 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3516 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3517 "The local stress is written to the file: ", trim(adjustl(filename))
3521 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3523 CALL auxbas_pw_pool%give_back_pw(stress)
3526 CALL timestop(handle)
3528 END SUBROUTINE qs_scf_post_local_stress
3539 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3544 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3546 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3547 INTEGER :: boundary_condition, handle, i, j, &
3548 n_cstr, n_tiles, unit_nr
3549 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3550 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3560 CALL timeset(routinen, handle)
3562 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
3565 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3567 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3569 has_implicit_ps = .false.
3570 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3575 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
3576 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
3577 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
3578 my_pos_cube =
"REWIND"
3579 IF (append_cube)
THEN
3580 my_pos_cube =
"APPEND"
3584 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
3586 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3587 CALL auxbas_pw_pool%create_pw(aux_r)
3589 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3590 SELECT CASE (boundary_condition)
3592 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
3594 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3595 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3596 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3597 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3598 poisson_env%implicit_env%dielectric%eps, aux_r)
3601 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, &
3602 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
3603 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%MAX_FILE_SIZE_MB"), &
3606 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
3608 CALL auxbas_pw_pool%give_back_pw(aux_r)
3613 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
3615 has_dirichlet_bc = .false.
3616 IF (has_implicit_ps)
THEN
3617 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3619 has_dirichlet_bc = .true.
3623 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
3625 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
3626 my_pos_cube =
"REWIND"
3627 IF (append_cube)
THEN
3628 my_pos_cube =
"APPEND"
3632 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
3633 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
3635 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3636 CALL auxbas_pw_pool%create_pw(aux_r)
3638 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3639 SELECT CASE (boundary_condition)
3641 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
3643 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3644 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3645 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3646 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3647 poisson_env%implicit_env%cstr_charge, aux_r)
3650 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, &
3651 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
3652 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%MAX_FILE_SIZE_MB"), &
3655 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
3657 CALL auxbas_pw_pool%give_back_pw(aux_r)
3662 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
3663 has_dirichlet_bc = .false.
3664 IF (has_implicit_ps)
THEN
3665 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3667 has_dirichlet_bc = .true.
3671 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
3672 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
3673 my_pos_cube =
"REWIND"
3674 IF (append_cube)
THEN
3675 my_pos_cube =
"APPEND"
3677 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
3679 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3680 CALL auxbas_pw_pool%create_pw(aux_r)
3683 IF (tile_cubes)
THEN
3685 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3687 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3689 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
3692 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3693 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
3696 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
3698 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3699 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3700 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
3703 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3708 NULLIFY (dirichlet_tile)
3709 ALLOCATE (dirichlet_tile)
3710 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
3713 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3714 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
3717 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3719 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3721 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
3722 CALL pw_axpy(dirichlet_tile, aux_r)
3726 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3727 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3728 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%MAX_FILE_SIZE_MB"), &
3731 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3732 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
3733 DEALLOCATE (dirichlet_tile)
3736 CALL auxbas_pw_pool%give_back_pw(aux_r)
3739 CALL timestop(handle)
3741 END SUBROUTINE qs_scf_post_ps_implicit
3749 SUBROUTINE write_adjacency_matrix(qs_env, input)
3753 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
3755 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
3756 ind, jatom, jkind, k, natom, nkind, &
3757 output_unit, rowind, unit_nr
3758 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
3759 LOGICAL :: do_adjm_write, do_symmetric
3765 DIMENSION(:),
POINTER :: nl_iterator
3768 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3771 CALL timeset(routinen, handle)
3773 NULLIFY (dft_section)
3782 IF (do_adjm_write)
THEN
3783 NULLIFY (qs_kind_set, nl_iterator)
3784 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
3786 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
3788 nkind =
SIZE(qs_kind_set)
3789 cpassert(
SIZE(nl) > 0)
3791 cpassert(do_symmetric)
3792 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
3796 adjm_size = ((natom + 1)*natom)/2
3797 ALLOCATE (interact_adjm(4*adjm_size))
3800 NULLIFY (nl_iterator)
3804 ikind=ikind, jkind=jkind, &
3805 iatom=iatom, jatom=jatom)
3807 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
3808 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
3809 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
3810 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
3813 IF (iatom <= jatom)
THEN
3820 ikind = ikind + jkind
3821 jkind = ikind - jkind
3822 ikind = ikind - jkind
3826 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
3829 interact_adjm((ind - 1)*4 + 1) = rowind
3830 interact_adjm((ind - 1)*4 + 2) = colind
3831 interact_adjm((ind - 1)*4 + 3) = ikind
3832 interact_adjm((ind - 1)*4 + 4) = jkind
3835 CALL para_env%sum(interact_adjm)
3838 extension=
".adjmat", file_form=
"FORMATTED", &
3839 file_status=
"REPLACE")
3840 IF (unit_nr > 0)
THEN
3841 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
3842 DO k = 1, 4*adjm_size, 4
3844 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
3845 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
3853 DEALLOCATE (basis_set_list_a, basis_set_list_b)
3856 CALL timestop(handle)
3858 END SUBROUTINE write_adjacency_matrix
3866 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
3870 LOGICAL :: use_virial
3880 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
3881 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
3882 rho_core=rho_core, virial=virial, &
3883 v_hartree_rspace=v_hartree_rspace)
3885 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
3887 IF (.NOT. use_virial)
THEN
3889 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
3890 poisson_env=poisson_env)
3891 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
3892 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
3896 v_hartree_gspace, rho_core=rho_core)
3898 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
3899 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
3901 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
3902 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
3905 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.
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)
...
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, use_sp, 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)
...
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...
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)
...
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)
...
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
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 ...
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)
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 evolt
real(kind=dp), parameter, public angstrom
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)
...
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.
Calculation and writing of density of states.
subroutine, public calculate_dos(mos, dft_section)
Compute and write density of states.
subroutine, public calculate_dos_kp(qs_env, dft_section)
Compute and write density of states (kpoints)
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, 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, 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, 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, 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...
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(mo_set, atomic_kind_set, qs_kind_set, particle_set, qs_env, dft_section, ispin, xas_mittle, external_matrix_shalf)
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 eigenvalues for the lumos.
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...
subroutine, public calculate_rhotot_elec_gspace(qs_env, auxbas_pw_pool, rhotot_elec_gspace, q_max, rho_hard, rho_soft, fsign)
The total electronic density in reciprocal space (g-space) is calculated.
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...
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 ...
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.