201#include "./base/base_uses.f90"
207 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
240 CHARACTER(6),
OPTIONAL :: wf_type
241 LOGICAL,
OPTIONAL :: do_mp2
243 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw'
245 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
246 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
247 nlumos, nmo, nspins, output_unit, &
249 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
250 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_mo_cubes, do_stm, &
251 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
252 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
254 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
255 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
258 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
259 unoccupied_evals, unoccupied_evals_stm
260 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
261 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
262 TARGET :: homo_localized, lumo_localized, &
264 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
265 unoccupied_orbs, unoccupied_orbs_stm
268 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
270 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
282 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
290 localize_section, print_key, &
293 CALL timeset(routinen, handle)
300 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
301 IF (
PRESENT(wf_type))
THEN
302 IF (output_unit > 0)
THEN
303 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
304 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
305 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
312 my_localized_wfn = .false.
313 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
314 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
315 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
316 unoccupied_evals_stm, molecule_set, mo_derivs, &
317 subsys, particles, input, print_key, kinetic_m, marked_states, &
318 mixed_evals, qs_loc_env_mixed)
319 NULLIFY (lumo_ptr, rho_ao)
326 p_loc_mixed = .false.
328 cpassert(
ASSOCIATED(scf_env))
329 cpassert(
ASSOCIATED(qs_env))
332 dft_control=dft_control, &
333 molecule_set=molecule_set, &
334 scf_control=scf_control, &
335 do_kpoints=do_kpoints, &
340 particle_set=particle_set, &
341 atomic_kind_set=atomic_kind_set, &
342 qs_kind_set=qs_kind_set)
349 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
350 DO ispin = 1, dft_control%nspins
351 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
356 CALL update_hartree_with_mp2(rho, qs_env)
359 CALL write_available_results(qs_env, scf_env)
363 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
365 cpassert(
ASSOCIATED(kinetic_m))
366 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
370 IF (unit_nr > 0)
THEN
371 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
374 "DFT%PRINT%KINETIC_ENERGY")
378 CALL qs_scf_post_charges(input, logger, qs_env)
391 IF (loc_print_explicit)
THEN
411 IF (loc_explicit)
THEN
421 p_loc_mixed = .false.
425 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
426 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
427 "therefore localization of unoccupied states will be skipped!")
440 IF (loc_print_explicit)
THEN
444 do_wannier_cubes = .false.
450 IF (((do_mo_cubes .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
451 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
453 CALL auxbas_pw_pool%create_pw(wf_r)
454 CALL auxbas_pw_pool%create_pw(wf_g)
457 IF (dft_control%restricted)
THEN
461 nspins = dft_control%nspins
464 IF (dft_control%restricted .AND. (do_mo_cubes .OR. p_loc_homo))
THEN
465 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
470 cpwarn_if(do_mo_cubes,
"Print MO cubes not implemented for k-point calculations")
475 IF ((do_mo_cubes .AND. nhomo /= 0) .OR. do_stm)
THEN
477 IF (dft_control%do_admm)
THEN
479 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
481 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs)
483 DO ispin = 1, dft_control%nspins
484 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
485 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
489 IF (do_mo_cubes .AND. nhomo /= 0)
THEN
492 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
493 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
494 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
495 mo_coeff, wf_g, wf_r, particles, homo, ispin)
506 cpwarn(
"Localization not implemented for k-point calculations!")
507 ELSEIF (dft_control%restricted &
510 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
512 ALLOCATE (occupied_orbs(dft_control%nspins))
513 ALLOCATE (occupied_evals(dft_control%nspins))
514 ALLOCATE (homo_localized(dft_control%nspins))
515 DO ispin = 1, dft_control%nspins
516 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
517 eigenvalues=mo_eigenvalues)
518 occupied_orbs(ispin) = mo_coeff
519 occupied_evals(ispin)%array => mo_eigenvalues
520 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
521 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
524 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
527 ALLOCATE (qs_loc_env_homo)
530 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
531 do_mo_cubes, mo_loc_history=mo_loc_history)
533 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
536 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
538 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
543 homo_localized, do_homo)
545 DEALLOCATE (occupied_orbs)
546 DEALLOCATE (occupied_evals)
548 IF (qs_loc_env_homo%do_localize)
THEN
549 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
556 IF (do_mo_cubes .OR. p_loc_lumo)
THEN
558 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
561 compute_lumos = do_mo_cubes .AND. nlumo .NE. 0
562 compute_lumos = compute_lumos .OR. p_loc_lumo
564 DO ispin = 1, dft_control%nspins
565 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
566 compute_lumos = compute_lumos .AND. homo == nmo
569 IF (do_mo_cubes .AND. .NOT. compute_lumos)
THEN
572 DO ispin = 1, dft_control%nspins
574 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
575 IF (nlumo > nmo - homo)
THEN
578 IF (nlumo .EQ. -1)
THEN
581 IF (output_unit > 0)
WRITE (output_unit, *)
" "
582 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
583 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
584 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
587 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
588 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
589 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1)
595 IF (compute_lumos)
THEN
598 IF (nlumo == 0) check_write = .false.
601 ALLOCATE (qs_loc_env_lumo)
604 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
607 ALLOCATE (unoccupied_orbs(dft_control%nspins))
608 ALLOCATE (unoccupied_evals(dft_control%nspins))
609 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
610 lumo_ptr => unoccupied_orbs
611 DO ispin = 1, dft_control%nspins
613 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
615 IF (check_write)
THEN
616 IF (p_loc_lumo .AND. nlumo .NE. -1) nlumos = min(nlumo, nlumos)
618 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
619 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin)
624 ALLOCATE (lumo_localized(dft_control%nspins))
625 DO ispin = 1, dft_control%nspins
626 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
627 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
629 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, do_mo_cubes, &
630 evals=unoccupied_evals)
631 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
632 loc_coeff=unoccupied_orbs)
634 lumo_localized, wf_r, wf_g, particles, &
635 unoccupied_orbs, unoccupied_evals, marked_states)
636 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
637 evals=unoccupied_evals)
638 lumo_ptr => lumo_localized
642 IF (has_homo .AND. has_lumo)
THEN
643 IF (output_unit > 0)
WRITE (output_unit, *)
" "
644 DO ispin = 1, dft_control%nspins
645 IF (.NOT. scf_control%smear%do_smear)
THEN
646 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
647 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
648 "HOMO - LUMO gap [eV] :", gap*
evolt
654 IF (p_loc_mixed)
THEN
656 cpwarn(
"Localization not implemented for k-point calculations!")
657 ELSEIF (dft_control%restricted)
THEN
658 IF (output_unit > 0)
WRITE (output_unit, *) &
659 " Unclear how we define MOs / localization in the restricted case... skipping"
662 ALLOCATE (mixed_orbs(dft_control%nspins))
663 ALLOCATE (mixed_evals(dft_control%nspins))
664 ALLOCATE (mixed_localized(dft_control%nspins))
665 DO ispin = 1, dft_control%nspins
666 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
667 eigenvalues=mo_eigenvalues)
668 mixed_orbs(ispin) = mo_coeff
669 mixed_evals(ispin)%array => mo_eigenvalues
670 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
671 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
674 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
677 total_zeff_corr = scf_env%sum_zeff_corr
678 ALLOCATE (qs_loc_env_mixed)
681 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
682 do_mo_cubes, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
685 DO ispin = 1, dft_control%nspins
686 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
690 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
693 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
695 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
702 DEALLOCATE (mixed_orbs)
703 DEALLOCATE (mixed_evals)
713 IF (((do_mo_cubes .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
714 CALL auxbas_pw_pool%give_back_pw(wf_r)
715 CALL auxbas_pw_pool%give_back_pw(wf_g)
719 IF (.NOT. do_kpoints)
THEN
722 DEALLOCATE (qs_loc_env_homo)
726 DEALLOCATE (qs_loc_env_lumo)
728 IF (p_loc_mixed)
THEN
730 DEALLOCATE (qs_loc_env_mixed)
738 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
739 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
740 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
741 matrix_s=matrix_s, marked_states=marked_states)
745 IF (
ASSOCIATED(marked_states))
THEN
746 DEALLOCATE (marked_states)
750 IF (.NOT. do_kpoints)
THEN
751 IF (compute_lumos)
THEN
752 DO ispin = 1, dft_control%nspins
753 DEALLOCATE (unoccupied_evals(ispin)%array)
756 DEALLOCATE (unoccupied_evals)
757 DEALLOCATE (unoccupied_orbs)
764 cpwarn(
"STM not implemented for k-point calculations!")
766 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
767 IF (nlumo_stm > 0)
THEN
768 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
769 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
770 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
774 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
775 unoccupied_evals_stm)
777 IF (nlumo_stm > 0)
THEN
778 DO ispin = 1, dft_control%nspins
779 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
781 DEALLOCATE (unoccupied_evals_stm)
788 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
791 CALL qs_scf_post_efg(input, logger, qs_env)
794 CALL qs_scf_post_et(input, qs_env, dft_control)
797 CALL qs_scf_post_epr(input, logger, qs_env)
800 CALL qs_scf_post_molopt(input, logger, qs_env)
803 CALL qs_scf_post_elf(input, logger, qs_env)
810 DO ispin = 1, dft_control%nspins
811 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
817 CALL timestop(handle)
830 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
834 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
836 INTEGER,
INTENT(IN) :: nlumo
837 INTEGER,
INTENT(OUT) :: nlumos
839 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
841 INTEGER :: handle, homo, ispin, n, nao, nmo, &
848 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
855 CALL timeset(routinen, handle)
857 NULLIFY (mos, ks_rmpv, scf_control, dft_control, admm_env, para_env, blacs_env)
861 scf_control=scf_control, &
862 dft_control=dft_control, &
871 DO ispin = 1, dft_control%nspins
872 NULLIFY (unoccupied_evals(ispin)%array)
874 IF (output_unit > 0)
WRITE (output_unit, *)
" "
875 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
876 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
877 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
879 nlumos = max(1, min(nlumo, nao - nmo))
880 IF (nlumo == -1) nlumos = nao - nmo
881 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
883 nrow_global=n, ncol_global=nlumos)
884 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
889 NULLIFY (local_preconditioner)
890 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
891 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
894 NULLIFY (local_preconditioner)
899 IF (dft_control%do_admm)
THEN
903 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
904 matrix_c_fm=unoccupied_orbs(ispin), &
905 matrix_orthogonal_space_fm=mo_coeff, &
906 eps_gradient=scf_control%eps_lumos, &
908 iter_max=scf_control%max_iter_lumos, &
909 size_ortho_space=nmo)
912 unoccupied_evals(ispin)%array, scr=output_unit, &
913 ionode=output_unit > 0)
916 IF (dft_control%do_admm)
THEN
922 CALL timestop(handle)
931 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
936 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
938 INTEGER :: handle, print_level, unit_nr
939 LOGICAL :: do_kpoints, print_it
942 CALL timeset(routinen, handle)
944 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
952 log_filename=.false.)
955 IF (print_it) print_level = 2
957 IF (print_it) print_level = 3
959 cpwarn(
"Lowdin charges not implemented for k-point calculations!")
972 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
973 log_filename=.false.)
975 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
979 CALL timestop(handle)
981 END SUBROUTINE qs_scf_post_charges
997 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
998 mo_coeff, wf_g, wf_r, particles, homo, ispin)
1007 INTEGER,
INTENT(IN) :: homo, ispin
1009 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1011 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1012 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1014 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1015 LOGICAL :: append_cube, mpi_io
1020 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1022 CALL timeset(routinen, handle)
1024 NULLIFY (list_index)
1030 my_pos_cube =
"REWIND"
1031 IF (append_cube)
THEN
1032 my_pos_cube =
"APPEND"
1041 IF (
ASSOCIATED(
list))
THEN
1043 DO i = 1,
SIZE(
list)
1044 list_index(i + nlist) =
list(i)
1046 nlist = nlist +
SIZE(
list)
1051 IF (nhomo == -1) nhomo = homo
1052 nlist = homo - max(1, homo - nhomo + 1) + 1
1053 ALLOCATE (list_index(nlist))
1055 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1059 ivector = list_index(i)
1061 atomic_kind_set=atomic_kind_set, &
1062 qs_kind_set=qs_kind_set, &
1064 particle_set=particle_set, &
1067 cell, dft_control, particle_set, pw_env)
1068 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1071 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1073 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1074 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1078 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1081 CALL timestop(handle)
1083 END SUBROUTINE qs_scf_post_occ_cubes
1101 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1102 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo)
1108 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1112 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1113 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1115 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1117 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1118 INTEGER :: handle, ifirst, index_mo, ivector, &
1120 LOGICAL :: append_cube, mpi_io
1125 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1127 CALL timeset(routinen, handle)
1131 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1133 my_pos_cube =
"REWIND"
1134 IF (append_cube)
THEN
1135 my_pos_cube =
"APPEND"
1138 IF (
PRESENT(lumo)) ifirst = lumo
1139 DO ivector = ifirst, ifirst + nlumos - 1
1141 atomic_kind_set=atomic_kind_set, &
1142 qs_kind_set=qs_kind_set, &
1144 particle_set=particle_set, &
1147 qs_kind_set, cell, dft_control, particle_set, pw_env)
1149 IF (ifirst == 1)
THEN
1150 index_mo = homo + ivector
1154 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1158 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1160 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1161 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1167 CALL timestop(handle)
1169 END SUBROUTINE qs_scf_post_unocc_cubes
1182 INTEGER,
INTENT(IN) :: output_unit
1184 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1186 CHARACTER(LEN=default_path_length) :: filename
1187 INTEGER :: handle, maxmom, reference, unit_nr
1188 LOGICAL :: com_nl, do_kpoints, magnetic, periodic, &
1189 second_ref_point, vel_reprs
1190 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1193 CALL timeset(routinen, handle)
1196 subsection_name=
"DFT%PRINT%MOMENTS")
1201 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1203 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1205 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1207 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1209 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1211 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1213 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1218 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1219 middle_name=
"moments", log_filename=.false.)
1221 IF (output_unit > 0)
THEN
1222 IF (unit_nr /= output_unit)
THEN
1223 INQUIRE (unit=unit_nr, name=filename)
1224 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1225 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1228 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1232 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1234 IF (do_kpoints)
THEN
1235 cpwarn(
"Moments not implemented for k-point calculations!")
1240 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1245 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1247 IF (second_ref_point)
THEN
1249 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1254 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1255 middle_name=
"moments_refpoint_2", log_filename=.false.)
1257 IF (output_unit > 0)
THEN
1258 IF (unit_nr /= output_unit)
THEN
1259 INQUIRE (unit=unit_nr, name=filename)
1260 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1261 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1264 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1267 IF (do_kpoints)
THEN
1268 cpwarn(
"Moments not implemented for k-point calculations!")
1273 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1277 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1282 CALL timestop(handle)
1294 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1299 INTEGER,
INTENT(IN) :: output_unit
1301 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1303 CHARACTER(LEN=default_path_length) :: filename
1304 INTEGER :: handle, unit_nr
1305 REAL(kind=
dp) :: q_max
1308 CALL timeset(routinen, handle)
1311 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1315 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1317 basis_section=input, &
1318 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1320 middle_name=
"xrd", &
1321 log_filename=.false.)
1322 IF (output_unit > 0)
THEN
1323 INQUIRE (unit=unit_nr, name=filename)
1324 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1325 "X-RAY DIFFRACTION SPECTRUM"
1326 IF (unit_nr /= output_unit)
THEN
1327 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1328 "The coherent X-ray diffraction spectrum is written to the file:", &
1333 unit_number=unit_nr, &
1337 basis_section=input, &
1338 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1341 CALL timestop(handle)
1343 END SUBROUTINE qs_scf_post_xray
1351 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1356 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1361 CALL timeset(routinen, handle)
1364 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1370 CALL timestop(handle)
1372 END SUBROUTINE qs_scf_post_efg
1380 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1385 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1387 INTEGER :: handle, ispin
1389 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1392 CALL timeset(routinen, handle)
1398 IF (qs_env%et_coupling%first_run)
THEN
1400 ALLOCATE (my_mos(dft_control%nspins))
1401 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1402 DO ispin = 1, dft_control%nspins
1404 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1405 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1414 CALL timestop(handle)
1416 END SUBROUTINE qs_scf_post_et
1427 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
1432 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
1434 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1436 INTEGER :: handle, ispin, output_unit, unit_nr
1437 LOGICAL :: append_cube, gapw, mpi_io
1438 REAL(
dp) :: rho_cutoff
1448 CALL timeset(routinen, handle)
1455 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
1456 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
1459 gapw = dft_control%qs_control%gapw
1460 IF (.NOT. gapw)
THEN
1462 ALLOCATE (elf_r(dft_control%nspins))
1463 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1465 DO ispin = 1, dft_control%nspins
1466 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1470 IF (output_unit > 0)
THEN
1471 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
1472 " ----- ELF is computed on the real space grid -----"
1479 my_pos_cube =
"REWIND"
1480 IF (append_cube)
THEN
1481 my_pos_cube =
"APPEND"
1484 DO ispin = 1, dft_control%nspins
1485 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1486 WRITE (title, *)
"ELF spin ", ispin
1489 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1490 mpi_io=mpi_io, fout=mpi_filename)
1491 IF (output_unit > 0)
THEN
1492 IF (.NOT. mpi_io)
THEN
1493 INQUIRE (unit=unit_nr, name=filename)
1495 filename = mpi_filename
1497 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
1498 "ELF is written in cube file format to the file:", &
1502 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, &
1506 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1514 cpwarn(
"ELF not implemented for GAPW calculations!")
1519 CALL timestop(handle)
1521 END SUBROUTINE qs_scf_post_elf
1533 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
1538 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
1540 INTEGER :: handle, nao, unit_nr
1541 REAL(kind=
dp) :: s_cond_number
1542 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
1551 CALL timeset(routinen, handle)
1554 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
1558 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
1561 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
1563 nrow_global=nao, ncol_global=nao, &
1564 template_fmstruct=mo_coeff%matrix_struct)
1565 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
1567 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
1570 ALLOCATE (eigenvalues(nao))
1578 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
1581 extension=
".molopt")
1583 IF (unit_nr > 0)
THEN
1586 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
1587 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
1591 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
1595 CALL timestop(handle)
1597 END SUBROUTINE qs_scf_post_molopt
1605 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
1610 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
1615 CALL timeset(routinen, handle)
1618 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
1624 CALL timestop(handle)
1626 END SUBROUTINE qs_scf_post_epr
1635 SUBROUTINE write_available_results(qs_env, scf_env)
1639 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
1643 CALL timeset(routinen, handle)
1651 CALL timestop(handle)
1653 END SUBROUTINE write_available_results
1666 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
1668 INTEGER :: handle, homo, ispin, nmo, output_unit
1669 LOGICAL :: all_equal, do_kpoints, explicit
1670 REAL(kind=
dp) :: maxocc, s_square, s_square_ideal, &
1671 total_abs_spin_dens, total_spin_dens
1672 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
1678 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1691 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1700 CALL timeset(routinen, handle)
1702 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
1703 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
1704 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
1705 molecule_set, input, particles, subsys, rho_r)
1710 cpassert(
ASSOCIATED(qs_env))
1712 dft_control=dft_control, &
1713 molecule_set=molecule_set, &
1714 atomic_kind_set=atomic_kind_set, &
1715 particle_set=particle_set, &
1716 qs_kind_set=qs_kind_set, &
1717 admm_env=admm_env, &
1718 scf_control=scf_control, &
1727 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1731 IF (.NOT. qs_env%run_rtp)
THEN
1738 IF (.NOT. do_kpoints)
THEN
1739 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
1745 dft_section,
"PRINT%CHARGEMOL"), &
1754 IF (do_kpoints)
THEN
1765 IF (do_kpoints)
THEN
1766 cpwarn(
"Projected density of states (pDOS) is not implemented for k points")
1771 DO ispin = 1, dft_control%nspins
1773 IF (dft_control%do_admm)
THEN
1776 IF (
PRESENT(scf_env))
THEN
1778 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1779 eigenvalues=mo_eigenvalues)
1780 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
1781 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
1783 mo_coeff_deriv => null()
1786 do_rotation=.true., &
1787 co_rotate_dbcsr=mo_coeff_deriv)
1791 IF (dft_control%nspins == 2)
THEN
1793 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
1796 qs_kind_set, particle_set, qs_env, dft_section)
1799 IF (dft_control%do_admm)
THEN
1808 IF (dft_control%nspins == 2)
THEN
1810 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1811 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1813 CALL auxbas_pw_pool%create_pw(wf_r)
1815 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
1817 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
1818 "Integrated spin density: ", total_spin_dens
1820 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
1821 "Integrated absolute spin density: ", total_abs_spin_dens
1822 CALL auxbas_pw_pool%give_back_pw(wf_r)
1828 IF (do_kpoints)
THEN
1829 cpwarn(
"Spin contamination estimate not implemented for k-points.")
1832 DO ispin = 1, dft_control%nspins
1834 occupation_numbers=occupation_numbers, &
1839 all_equal = all_equal .AND. &
1840 (all(occupation_numbers(1:homo) == maxocc) .AND. &
1841 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
1844 IF (.NOT. all_equal)
THEN
1845 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(T3,A)") &
1846 "WARNING: S**2 computation does not yet treat fractional occupied orbitals"
1849 matrix_s=matrix_s, &
1852 s_square_ideal=s_square_ideal)
1853 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
1854 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
1855 energy%s_square = s_square
1860 CALL timestop(handle)
1872 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
1873 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = (/
"x",
"y",
"z"/)
1875 CHARACTER(LEN=2) :: element_symbol
1876 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1878 CHARACTER(LEN=default_string_length) :: name, print_density
1879 INTEGER :: after, handle, i, iat, id, ikind, img, iso, ispin, iw, l, n_rep_hf, natom, nd(3), &
1880 ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, should_print_voro, &
1881 unit_nr, unit_nr_voro
1882 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
1883 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
1885 rho_total, rho_total_rspace, udvol, &
1887 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
1888 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
1889 REAL(kind=
dp),
DIMENSION(3) :: dr
1890 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
1896 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
1911 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1919 print_key, print_key_bqb, &
1920 print_key_voro, xc_section
1922 CALL timeset(routinen, handle)
1923 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
1924 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
1925 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
1931 cpassert(
ASSOCIATED(qs_env))
1933 atomic_kind_set=atomic_kind_set, &
1934 qs_kind_set=qs_kind_set, &
1935 particle_set=particle_set, &
1937 para_env=para_env, &
1938 dft_control=dft_control, &
1940 do_kpoints=do_kpoints, &
1950 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
1951 NULLIFY (rho_core, rho0_s_gs)
1953 my_pos_cube =
"REWIND"
1954 IF (append_cube)
THEN
1955 my_pos_cube =
"APPEND"
1958 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
1959 rho0_s_gs=rho0_s_gs)
1960 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1962 CALL auxbas_pw_pool%create_pw(wf_r)
1963 IF (dft_control%qs_control%gapw)
THEN
1964 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1965 CALL pw_axpy(rho_core, rho0_s_gs)
1967 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
1974 DO ispin = 1, dft_control%nspins
1975 CALL pw_axpy(rho_r(ispin), wf_r)
1977 filename =
"TOTAL_DENSITY"
1980 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1981 log_filename=.false., mpi_io=mpi_io)
1983 particles=particles, &
1984 stride=
section_get_ivals(dft_section,
"PRINT%TOT_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
1986 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
1987 CALL auxbas_pw_pool%give_back_pw(wf_r)
1992 "DFT%PRINT%E_DENSITY_CUBE"),
cp_p_file))
THEN
1994 keyword_name=
"PRINT%E_DENSITY_CUBE%DENSITY_INCLUDE", &
1995 c_val=print_density)
1996 print_density = trim(print_density)
1998 my_pos_cube =
"REWIND"
1999 IF (append_cube)
THEN
2000 my_pos_cube =
"APPEND"
2004 xrd_interface =
section_get_lval(input,
"DFT%PRINT%E_DENSITY_CUBE%XRD_INTERFACE")
2005 IF (xrd_interface)
THEN
2007 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2009 filename =
"ELECTRON_DENSITY"
2011 extension=
".xrd", middle_name=trim(filename), &
2012 file_position=my_pos_cube, log_filename=.false.)
2014 IF (output_unit > 0)
THEN
2015 INQUIRE (unit=unit_nr, name=filename)
2016 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2017 "The electron density (atomic part) is written to the file:", &
2022 nkind =
SIZE(atomic_kind_set)
2023 IF (unit_nr > 0)
THEN
2024 WRITE (unit_nr, *)
"Atomic (core) densities"
2025 WRITE (unit_nr, *)
"Unit cell"
2026 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2027 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2028 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2029 WRITE (unit_nr, *)
"Atomic types"
2030 WRITE (unit_nr, *) nkind
2033 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2035 atomic_kind => atomic_kind_set(ikind)
2036 qs_kind => qs_kind_set(ikind)
2037 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2039 iunit=output_unit, confine=.true.)
2041 iunit=output_unit, allelectron=.true., confine=.true.)
2042 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2043 ccdens(:, 2, ikind) = 0._dp
2044 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2045 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2046 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2047 IF (unit_nr > 0)
THEN
2048 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2049 WRITE (unit_nr, fmt=
"(I6)") ngto
2050 WRITE (unit_nr, *)
" Total density"
2051 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2052 WRITE (unit_nr, *)
" Core density"
2053 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2055 NULLIFY (atomic_kind)
2058 IF (dft_control%qs_control%gapw)
THEN
2059 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2061 IF (unit_nr > 0)
THEN
2062 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2064 np = particles%n_els
2066 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2067 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2068 rho_atom => rho_atom_set(iat)
2069 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2070 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2071 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2076 CALL para_env%sum(nr)
2077 CALL para_env%sum(niso)
2079 ALLOCATE (bfun(nr, niso))
2081 DO ispin = 1, dft_control%nspins
2082 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2083 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2086 CALL para_env%sum(bfun)
2087 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2088 ccdens(:, 2, ikind) = 0._dp
2089 IF (unit_nr > 0)
THEN
2090 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2094 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2095 IF (unit_nr > 0)
THEN
2096 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2097 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2103 IF (unit_nr > 0)
THEN
2104 WRITE (unit_nr, *)
"Coordinates"
2105 np = particles%n_els
2107 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2108 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2113 DEALLOCATE (ppdens, aedens, ccdens)
2116 "DFT%PRINT%E_DENSITY_CUBE")
2119 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2121 cpassert(.NOT. do_kpoints)
2126 auxbas_pw_pool=auxbas_pw_pool, &
2128 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2130 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2135 q_max = sqrt(sum((
pi/dr(:))**2))
2137 auxbas_pw_pool=auxbas_pw_pool, &
2138 rhotot_elec_gspace=rho_elec_gspace, &
2140 rho_hard=rho_hard, &
2142 rho_total = rho_hard + rho_soft
2147 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2149 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2151 filename =
"TOTAL_ELECTRON_DENSITY"
2154 extension=
".cube", middle_name=trim(filename), &
2155 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2157 IF (output_unit > 0)
THEN
2158 IF (.NOT. mpi_io)
THEN
2159 INQUIRE (unit=unit_nr, name=filename)
2161 filename = mpi_filename
2163 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2164 "The total electron density is written in cube file format to the file:", &
2166 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2167 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2168 "Soft electronic charge (G-space) :", rho_soft, &
2169 "Hard electronic charge (G-space) :", rho_hard, &
2170 "Total electronic charge (G-space):", rho_total, &
2171 "Total electronic charge (R-space):", rho_total_rspace
2173 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2174 particles=particles, &
2175 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2177 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2179 IF (dft_control%nspins > 1)
THEN
2183 auxbas_pw_pool=auxbas_pw_pool, &
2184 rhotot_elec_gspace=rho_elec_gspace, &
2186 rho_hard=rho_hard, &
2187 rho_soft=rho_soft, &
2189 rho_total = rho_hard + rho_soft
2193 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2195 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2197 filename =
"TOTAL_SPIN_DENSITY"
2200 extension=
".cube", middle_name=trim(filename), &
2201 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2203 IF (output_unit > 0)
THEN
2204 IF (.NOT. mpi_io)
THEN
2205 INQUIRE (unit=unit_nr, name=filename)
2207 filename = mpi_filename
2209 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2210 "The total spin density is written in cube file format to the file:", &
2212 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2213 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2214 "Soft part of the spin density (G-space):", rho_soft, &
2215 "Hard part of the spin density (G-space):", rho_hard, &
2216 "Total spin density (G-space) :", rho_total, &
2217 "Total spin density (R-space) :", rho_total_rspace
2219 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2220 particles=particles, &
2221 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2223 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2225 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2226 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2228 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2229 IF (dft_control%nspins > 1)
THEN
2233 auxbas_pw_pool=auxbas_pw_pool, &
2235 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2236 CALL pw_copy(rho_r(1), rho_elec_rspace)
2237 CALL pw_axpy(rho_r(2), rho_elec_rspace)
2238 filename =
"ELECTRON_DENSITY"
2241 extension=
".cube", middle_name=trim(filename), &
2242 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2244 IF (output_unit > 0)
THEN
2245 IF (.NOT. mpi_io)
THEN
2246 INQUIRE (unit=unit_nr, name=filename)
2248 filename = mpi_filename
2250 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2251 "The sum of alpha and beta density is written in cube file format to the file:", &
2254 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
2255 particles=particles, stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), &
2258 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2259 CALL pw_copy(rho_r(1), rho_elec_rspace)
2260 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2261 filename =
"SPIN_DENSITY"
2264 extension=
".cube", middle_name=trim(filename), &
2265 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2267 IF (output_unit > 0)
THEN
2268 IF (.NOT. mpi_io)
THEN
2269 INQUIRE (unit=unit_nr, name=filename)
2271 filename = mpi_filename
2273 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2274 "The spin density is written in cube file format to the file:", &
2277 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2278 particles=particles, &
2279 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2281 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2282 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2284 filename =
"ELECTRON_DENSITY"
2287 extension=
".cube", middle_name=trim(filename), &
2288 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2290 IF (output_unit > 0)
THEN
2291 IF (.NOT. mpi_io)
THEN
2292 INQUIRE (unit=unit_nr, name=filename)
2294 filename = mpi_filename
2296 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2297 "The electron density is written in cube file format to the file:", &
2301 particles=particles, &
2302 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2304 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2307 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
2308 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
2309 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
2310 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
2313 ALLOCATE (my_q0(natom))
2321 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
2325 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2329 DO ispin = 1, dft_control%nspins
2330 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
2334 rho_total_rspace = rho_soft + rho_hard
2336 filename =
"ELECTRON_DENSITY"
2339 extension=
".cube", middle_name=trim(filename), &
2340 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2342 IF (output_unit > 0)
THEN
2343 IF (.NOT. mpi_io)
THEN
2344 INQUIRE (unit=unit_nr, name=filename)
2346 filename = mpi_filename
2348 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2349 "The electron density is written in cube file format to the file:", &
2351 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2352 "Soft electronic charge (R-space) :", rho_soft, &
2353 "Hard electronic charge (R-space) :", rho_hard, &
2354 "Total electronic charge (R-space):", rho_total_rspace
2356 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
2357 particles=particles, stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), &
2360 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2363 IF (dft_control%nspins > 1)
THEN
2365 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
2368 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2371 CALL pw_axpy(rho_r(1), rho_elec_rspace)
2372 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2376 rho_total_rspace = rho_soft + rho_hard
2378 filename =
"SPIN_DENSITY"
2381 extension=
".cube", middle_name=trim(filename), &
2382 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2384 IF (output_unit > 0)
THEN
2385 IF (.NOT. mpi_io)
THEN
2386 INQUIRE (unit=unit_nr, name=filename)
2388 filename = mpi_filename
2390 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2391 "The spin density is written in cube file format to the file:", &
2393 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2394 "Soft part of the spin density :", rho_soft, &
2395 "Hard part of the spin density :", rho_hard, &
2396 "Total spin density (R-space) :", rho_total_rspace
2398 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2399 particles=particles, &
2400 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2402 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2404 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2410 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
2416 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
2420 v_hartree_rspace=v_hartree_rspace)
2421 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2422 CALL auxbas_pw_pool%create_pw(aux_r)
2425 my_pos_cube =
"REWIND"
2426 IF (append_cube)
THEN
2427 my_pos_cube =
"APPEND"
2430 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2433 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
2434 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2436 CALL pw_copy(v_hartree_rspace, aux_r)
2439 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, &
2441 "PRINT%V_HARTREE_CUBE%STRIDE"), mpi_io=mpi_io)
2443 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
2445 CALL auxbas_pw_pool%give_back_pw(aux_r)
2450 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
2451 IF (dft_control%apply_external_potential)
THEN
2452 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
2453 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2454 CALL auxbas_pw_pool%create_pw(aux_r)
2456 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
2457 my_pos_cube =
"REWIND"
2458 IF (append_cube)
THEN
2459 my_pos_cube =
"APPEND"
2464 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
2468 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, &
2470 "PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), mpi_io=mpi_io)
2472 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
2474 CALL auxbas_pw_pool%give_back_pw(aux_r)
2480 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
2482 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2483 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2484 CALL auxbas_pw_pool%create_pw(aux_r)
2485 CALL auxbas_pw_pool%create_pw(aux_g)
2488 my_pos_cube =
"REWIND"
2489 IF (append_cube)
THEN
2490 my_pos_cube =
"APPEND"
2492 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
2493 v_hartree_rspace=v_hartree_rspace)
2495 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2499 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
2510 unit_nr,
"ELECTRIC FIELD", particles=particles, &
2512 "PRINT%EFIELD_CUBE%STRIDE"), mpi_io=mpi_io)
2514 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
2517 CALL auxbas_pw_pool%give_back_pw(aux_r)
2518 CALL auxbas_pw_pool%give_back_pw(aux_g)
2522 CALL qs_scf_post_local_energy(input, logger, qs_env)
2525 CALL qs_scf_post_local_stress(input, logger, qs_env)
2528 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
2536 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
2541 after = min(max(after, 1), 16)
2542 DO ispin = 1, dft_control%nspins
2543 DO img = 1, dft_control%nimages
2545 para_env, output_unit=iw, omit_headers=omit_headers)
2549 "DFT%PRINT%AO_MATRICES/DENSITY")
2554 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
2556 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
2558 IF (write_ks .OR. write_xc)
THEN
2559 IF (write_xc) qs_env%requires_matrix_vxc = .true.
2562 just_energy=.false.)
2563 IF (write_xc) qs_env%requires_matrix_vxc = .false.
2570 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
2572 after = min(max(after, 1), 16)
2573 DO ispin = 1, dft_control%nspins
2574 DO img = 1, dft_control%nimages
2576 para_env, output_unit=iw, omit_headers=omit_headers)
2580 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
2585 IF (.NOT. dft_control%qs_control%pao)
THEN
2591 CALL write_adjacency_matrix(qs_env, input)
2595 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
2596 cpassert(
ASSOCIATED(matrix_vxc))
2600 after = min(max(after, 1), 16)
2601 DO ispin = 1, dft_control%nspins
2602 DO img = 1, dft_control%nimages
2604 para_env, output_unit=iw, omit_headers=omit_headers)
2608 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
2613 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
2619 after = min(max(after, 1), 16)
2622 para_env, output_unit=iw, omit_headers=omit_headers)
2626 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
2632 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
2635 IF (print_it) print_level = 2
2637 IF (print_it) print_level = 3
2648 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
2649 IF (rho_r_valid)
THEN
2650 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
2651 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
2659 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
2661 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
2669 should_print_voro = 1
2671 should_print_voro = 0
2674 should_print_bqb = 1
2676 should_print_bqb = 0
2678 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
2683 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
2684 IF (rho_r_valid)
THEN
2686 IF (dft_control%nspins > 1)
THEN
2690 auxbas_pw_pool=auxbas_pw_pool, &
2694 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
2695 CALL pw_copy(rho_r(1), mb_rho)
2696 CALL pw_axpy(rho_r(2), mb_rho)
2703 IF (should_print_voro /= 0)
THEN
2705 IF (voro_print_txt)
THEN
2707 my_pos_voro =
"REWIND"
2708 IF (append_voro)
THEN
2709 my_pos_voro =
"APPEND"
2711 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
2712 file_position=my_pos_voro, log_filename=.false.)
2720 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
2721 unit_nr_voro, qs_env, mb_rho)
2723 IF (dft_control%nspins > 1)
THEN
2724 CALL auxbas_pw_pool%give_back_pw(mb_rho)
2728 IF (unit_nr_voro > 0)
THEN
2738 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
2746 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
2754 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
2756 IF (iao_env%do_iao)
THEN
2766 extension=
".mao", log_filename=.false.)
2777 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
2781 CALL timestop(handle)
2791 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
2794 INTEGER,
INTENT(IN) :: unit_nr
2796 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
2797 radius_type, refc, shapef
2798 INTEGER,
DIMENSION(:),
POINTER :: atom_list
2799 LOGICAL :: do_radius, do_sc, paw_atom
2800 REAL(kind=
dp) :: zeff
2801 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
2802 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
2805 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
2811 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2815 NULLIFY (hirshfeld_env)
2819 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
2820 ALLOCATE (hirshfeld_env%charges(natom))
2829 IF (.NOT.
SIZE(radii) == nkind) &
2830 CALL cp_abort(__location__, &
2831 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
2832 "match number of atomic kinds in the input coordinate file.")
2837 iterative=do_sc, ref_charge=refc, &
2838 radius_type=radius_type)
2840 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
2846 nspin =
SIZE(matrix_p, 1)
2847 ALLOCATE (charges(natom, nspin))
2852 atomic_kind => atomic_kind_set(ikind)
2854 DO iat = 1,
SIZE(atom_list)
2856 hirshfeld_env%charges(i) = zeff
2860 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
2863 hirshfeld_env%charges(iat) = sum(charges(iat, :))
2866 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
2870 IF (hirshfeld_env%iterative)
THEN
2877 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
2878 IF (dft_control%qs_control%gapw)
THEN
2880 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
2883 atomic_kind => particle_set(iat)%atomic_kind
2885 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
2887 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
2892 IF (unit_nr > 0)
THEN
2894 qs_kind_set, unit_nr)
2900 DEALLOCATE (charges)
2902 END SUBROUTINE hirshfeld_charges
2912 SUBROUTINE project_function_a(ca, a, cb, b, l)
2914 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
2915 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
2916 INTEGER,
INTENT(IN) :: l
2919 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
2920 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
2923 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
2927 v(:, 1) = matmul(tmat, cb)
2928 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
2932 DEALLOCATE (smat, tmat, v, ipiv)
2934 END SUBROUTINE project_function_a
2944 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
2946 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
2947 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
2949 INTEGER,
INTENT(IN) :: l
2951 INTEGER :: i, info, n, nr
2952 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
2953 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
2954 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
2958 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
2962 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
2963 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
2965 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
2969 DEALLOCATE (smat, v, ipiv, afun)
2971 END SUBROUTINE project_function_b
2982 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
2987 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
2989 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
2990 INTEGER :: handle, io_unit, natom, unit_nr
2991 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3000 CALL timeset(routinen, handle)
3003 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3005 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3006 gapw = dft_control%qs_control%gapw
3007 gapw_xc = dft_control%qs_control%gapw_xc
3008 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3010 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3011 CALL auxbas_pw_pool%create_pw(eden)
3015 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3016 IF (append_cube)
THEN
3017 my_pos_cube =
"APPEND"
3019 my_pos_cube =
"REWIND"
3023 extension=
".cube", middle_name=
"local_energy", &
3024 file_position=my_pos_cube, mpi_io=mpi_io)
3026 unit_nr,
"LOCAL ENERGY", particles=particles, &
3028 "PRINT%LOCAL_ENERGY_CUBE%STRIDE"), mpi_io=mpi_io)
3029 IF (io_unit > 0)
THEN
3030 INQUIRE (unit=unit_nr, name=filename)
3031 IF (gapw .OR. gapw_xc)
THEN
3032 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3033 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3035 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3036 "The local energy is written to the file: ", trim(adjustl(filename))
3040 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3042 CALL auxbas_pw_pool%give_back_pw(eden)
3044 CALL timestop(handle)
3046 END SUBROUTINE qs_scf_post_local_energy
3057 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3062 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3064 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3065 INTEGER :: handle, io_unit, natom, unit_nr
3066 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3067 REAL(kind=
dp) :: beta
3076 CALL timeset(routinen, handle)
3079 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3081 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3082 gapw = dft_control%qs_control%gapw
3083 gapw_xc = dft_control%qs_control%gapw_xc
3084 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3086 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3087 CALL auxbas_pw_pool%create_pw(stress)
3093 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3094 IF (append_cube)
THEN
3095 my_pos_cube =
"APPEND"
3097 my_pos_cube =
"REWIND"
3101 extension=
".cube", middle_name=
"local_stress", &
3102 file_position=my_pos_cube, mpi_io=mpi_io)
3104 unit_nr,
"LOCAL STRESS", particles=particles, &
3106 "PRINT%LOCAL_STRESS_CUBE%STRIDE"), mpi_io=mpi_io)
3107 IF (io_unit > 0)
THEN
3108 INQUIRE (unit=unit_nr, name=filename)
3109 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3110 IF (gapw .OR. gapw_xc)
THEN
3111 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3112 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3114 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3115 "The local stress is written to the file: ", trim(adjustl(filename))
3119 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3121 CALL auxbas_pw_pool%give_back_pw(stress)
3124 CALL timestop(handle)
3126 END SUBROUTINE qs_scf_post_local_stress
3137 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3142 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3144 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3145 INTEGER :: boundary_condition, handle, i, j, &
3146 n_cstr, n_tiles, unit_nr
3147 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3148 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3158 CALL timeset(routinen, handle)
3160 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
3163 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3165 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3167 has_implicit_ps = .false.
3168 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3169 IF (pw_env%poisson_env%parameters%solver .EQ.
pw_poisson_implicit) has_implicit_ps = .true.
3173 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
3174 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
3175 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
3176 my_pos_cube =
"REWIND"
3177 IF (append_cube)
THEN
3178 my_pos_cube =
"APPEND"
3182 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
3184 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3185 CALL auxbas_pw_pool%create_pw(aux_r)
3187 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3188 SELECT CASE (boundary_condition)
3190 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
3192 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3193 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3194 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3195 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3196 poisson_env%implicit_env%dielectric%eps, aux_r)
3199 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, &
3200 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
3203 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
3205 CALL auxbas_pw_pool%give_back_pw(aux_r)
3210 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
3212 has_dirichlet_bc = .false.
3213 IF (has_implicit_ps)
THEN
3214 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3216 has_dirichlet_bc = .true.
3220 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
3222 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
3223 my_pos_cube =
"REWIND"
3224 IF (append_cube)
THEN
3225 my_pos_cube =
"APPEND"
3229 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
3230 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
3232 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3233 CALL auxbas_pw_pool%create_pw(aux_r)
3235 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3236 SELECT CASE (boundary_condition)
3238 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
3240 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3241 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3242 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3243 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3244 poisson_env%implicit_env%cstr_charge, aux_r)
3247 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, &
3248 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
3251 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
3253 CALL auxbas_pw_pool%give_back_pw(aux_r)
3258 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
3259 has_dirichlet_bc = .false.
3260 IF (has_implicit_ps)
THEN
3261 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3263 has_dirichlet_bc = .true.
3267 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
3268 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
3269 my_pos_cube =
"REWIND"
3270 IF (append_cube)
THEN
3271 my_pos_cube =
"APPEND"
3273 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
3275 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3276 CALL auxbas_pw_pool%create_pw(aux_r)
3279 IF (tile_cubes)
THEN
3281 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3283 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3285 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
3288 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3289 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
3292 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
3294 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3295 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3298 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3303 NULLIFY (dirichlet_tile)
3304 ALLOCATE (dirichlet_tile)
3305 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
3308 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3309 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
3312 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3314 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3316 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
3317 CALL pw_axpy(dirichlet_tile, aux_r)
3321 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3322 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3325 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3326 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
3327 DEALLOCATE (dirichlet_tile)
3330 CALL auxbas_pw_pool%give_back_pw(aux_r)
3333 CALL timestop(handle)
3335 END SUBROUTINE qs_scf_post_ps_implicit
3343 SUBROUTINE write_adjacency_matrix(qs_env, input)
3347 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
3349 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
3350 ind, jatom, jkind, k, natom, nkind, &
3351 output_unit, rowind, unit_nr
3352 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
3353 LOGICAL :: do_adjm_write, do_symmetric
3359 DIMENSION(:),
POINTER :: nl_iterator
3362 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3365 CALL timeset(routinen, handle)
3367 NULLIFY (dft_section)
3376 IF (do_adjm_write)
THEN
3377 NULLIFY (qs_kind_set, nl_iterator)
3378 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
3380 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
3382 nkind =
SIZE(qs_kind_set)
3383 cpassert(
SIZE(nl) .GT. 0)
3385 cpassert(do_symmetric)
3386 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
3390 adjm_size = ((natom + 1)*natom)/2
3391 ALLOCATE (interact_adjm(4*adjm_size))
3394 NULLIFY (nl_iterator)
3398 ikind=ikind, jkind=jkind, &
3399 iatom=iatom, jatom=jatom)
3401 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
3402 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
3403 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
3404 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
3407 IF (iatom .LE. jatom)
THEN
3414 ikind = ikind + jkind
3415 jkind = ikind - jkind
3416 ikind = ikind - jkind
3420 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
3423 interact_adjm((ind - 1)*4 + 1) = rowind
3424 interact_adjm((ind - 1)*4 + 2) = colind
3425 interact_adjm((ind - 1)*4 + 3) = ikind
3426 interact_adjm((ind - 1)*4 + 4) = jkind
3429 CALL para_env%sum(interact_adjm)
3432 extension=
".adjmat", file_form=
"FORMATTED", &
3433 file_status=
"REPLACE")
3434 IF (unit_nr .GT. 0)
THEN
3435 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
3436 DO k = 1, 4*adjm_size, 4
3438 IF (interact_adjm(k) .GT. 0 .AND. interact_adjm(k + 1) .GT. 0)
THEN
3439 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
3447 DEALLOCATE (basis_set_list_a, basis_set_list_b)
3450 CALL timestop(handle)
3452 END SUBROUTINE write_adjacency_matrix
3460 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
3464 LOGICAL :: use_virial
3474 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
3475 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
3476 rho_core=rho_core, virial=virial, &
3477 v_hartree_rspace=v_hartree_rspace)
3479 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
3481 IF (.NOT. use_virial)
THEN
3483 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
3484 poisson_env=poisson_env)
3485 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
3486 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
3490 v_hartree_gspace, rho_core=rho_core)
3492 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
3493 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
3495 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
3496 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
3499 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_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
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...
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, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, 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, 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)
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, 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, 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)
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_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)
...
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 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.
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.