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, &
1672 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
1678 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1692 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1699 CALL timeset(routinen, handle)
1701 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
1702 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
1703 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
1704 molecule_set, input, particles, subsys, rho_r)
1709 cpassert(
ASSOCIATED(qs_env))
1711 dft_control=dft_control, &
1712 molecule_set=molecule_set, &
1713 atomic_kind_set=atomic_kind_set, &
1714 particle_set=particle_set, &
1715 qs_kind_set=qs_kind_set, &
1716 admm_env=admm_env, &
1717 scf_control=scf_control, &
1726 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1730 IF (.NOT. qs_env%run_rtp)
THEN
1737 IF (.NOT. do_kpoints)
THEN
1738 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
1744 dft_section,
"PRINT%CHARGEMOL"), &
1753 IF (do_kpoints)
THEN
1754 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
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 absolute spin density : ", total_abs_spin_dens
1819 CALL auxbas_pw_pool%give_back_pw(wf_r)
1825 IF (do_kpoints)
THEN
1826 cpwarn(
"Spin contamination estimate not implemented for k-points.")
1829 DO ispin = 1, dft_control%nspins
1831 occupation_numbers=occupation_numbers, &
1836 all_equal = all_equal .AND. &
1837 (all(occupation_numbers(1:homo) == maxocc) .AND. &
1838 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
1841 IF (.NOT. all_equal)
THEN
1842 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(T3,A)") &
1843 "WARNING: S**2 computation does not yet treat fractional occupied orbitals"
1846 matrix_s=matrix_s, &
1849 s_square_ideal=s_square_ideal)
1850 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
1851 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
1852 energy%s_square = s_square
1857 CALL timestop(handle)
1869 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
1870 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = (/
"x",
"y",
"z"/)
1872 CHARACTER(LEN=2) :: element_symbol
1873 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1875 CHARACTER(LEN=default_string_length) :: name, print_density
1876 INTEGER :: after, handle, i, iat, id, ikind, img, iso, ispin, iw, l, n_rep_hf, natom, nd(3), &
1877 ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, should_print_voro, &
1878 unit_nr, unit_nr_voro
1879 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
1880 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
1882 rho_total, rho_total_rspace, udvol, &
1884 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
1885 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
1886 REAL(kind=
dp),
DIMENSION(3) :: dr
1887 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
1893 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
1908 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1916 print_key, print_key_bqb, &
1917 print_key_voro, xc_section
1919 CALL timeset(routinen, handle)
1920 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
1921 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
1922 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
1928 cpassert(
ASSOCIATED(qs_env))
1930 atomic_kind_set=atomic_kind_set, &
1931 qs_kind_set=qs_kind_set, &
1932 particle_set=particle_set, &
1934 para_env=para_env, &
1935 dft_control=dft_control, &
1937 do_kpoints=do_kpoints, &
1947 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
1948 NULLIFY (rho_core, rho0_s_gs)
1950 my_pos_cube =
"REWIND"
1951 IF (append_cube)
THEN
1952 my_pos_cube =
"APPEND"
1955 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
1956 rho0_s_gs=rho0_s_gs)
1957 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1959 CALL auxbas_pw_pool%create_pw(wf_r)
1960 IF (dft_control%qs_control%gapw)
THEN
1961 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1962 CALL pw_axpy(rho_core, rho0_s_gs)
1964 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
1971 DO ispin = 1, dft_control%nspins
1972 CALL pw_axpy(rho_r(ispin), wf_r)
1974 filename =
"TOTAL_DENSITY"
1977 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1978 log_filename=.false., mpi_io=mpi_io)
1980 particles=particles, &
1981 stride=
section_get_ivals(dft_section,
"PRINT%TOT_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
1983 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
1984 CALL auxbas_pw_pool%give_back_pw(wf_r)
1989 "DFT%PRINT%E_DENSITY_CUBE"),
cp_p_file))
THEN
1991 keyword_name=
"PRINT%E_DENSITY_CUBE%DENSITY_INCLUDE", &
1992 c_val=print_density)
1993 print_density = trim(print_density)
1995 my_pos_cube =
"REWIND"
1996 IF (append_cube)
THEN
1997 my_pos_cube =
"APPEND"
2001 xrd_interface =
section_get_lval(input,
"DFT%PRINT%E_DENSITY_CUBE%XRD_INTERFACE")
2002 IF (xrd_interface)
THEN
2004 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2006 filename =
"ELECTRON_DENSITY"
2008 extension=
".xrd", middle_name=trim(filename), &
2009 file_position=my_pos_cube, log_filename=.false.)
2011 IF (output_unit > 0)
THEN
2012 INQUIRE (unit=unit_nr, name=filename)
2013 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2014 "The electron density (atomic part) is written to the file:", &
2019 nkind =
SIZE(atomic_kind_set)
2020 IF (unit_nr > 0)
THEN
2021 WRITE (unit_nr, *)
"Atomic (core) densities"
2022 WRITE (unit_nr, *)
"Unit cell"
2023 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2024 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2025 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2026 WRITE (unit_nr, *)
"Atomic types"
2027 WRITE (unit_nr, *) nkind
2030 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2032 atomic_kind => atomic_kind_set(ikind)
2033 qs_kind => qs_kind_set(ikind)
2034 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2036 iunit=output_unit, confine=.true.)
2038 iunit=output_unit, allelectron=.true., confine=.true.)
2039 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2040 ccdens(:, 2, ikind) = 0._dp
2041 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2042 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2043 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2044 IF (unit_nr > 0)
THEN
2045 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2046 WRITE (unit_nr, fmt=
"(I6)") ngto
2047 WRITE (unit_nr, *)
" Total density"
2048 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2049 WRITE (unit_nr, *)
" Core density"
2050 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2052 NULLIFY (atomic_kind)
2055 IF (dft_control%qs_control%gapw)
THEN
2056 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2058 IF (unit_nr > 0)
THEN
2059 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2061 np = particles%n_els
2063 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2064 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2065 rho_atom => rho_atom_set(iat)
2066 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2067 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2068 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2073 CALL para_env%sum(nr)
2074 CALL para_env%sum(niso)
2076 ALLOCATE (bfun(nr, niso))
2078 DO ispin = 1, dft_control%nspins
2079 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2080 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2083 CALL para_env%sum(bfun)
2084 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2085 ccdens(:, 2, ikind) = 0._dp
2086 IF (unit_nr > 0)
THEN
2087 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2091 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2092 IF (unit_nr > 0)
THEN
2093 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2094 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2100 IF (unit_nr > 0)
THEN
2101 WRITE (unit_nr, *)
"Coordinates"
2102 np = particles%n_els
2104 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2105 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2110 DEALLOCATE (ppdens, aedens, ccdens)
2113 "DFT%PRINT%E_DENSITY_CUBE")
2116 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2118 cpassert(.NOT. do_kpoints)
2123 auxbas_pw_pool=auxbas_pw_pool, &
2125 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2127 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2132 q_max = sqrt(sum((
pi/dr(:))**2))
2134 auxbas_pw_pool=auxbas_pw_pool, &
2135 rhotot_elec_gspace=rho_elec_gspace, &
2137 rho_hard=rho_hard, &
2139 rho_total = rho_hard + rho_soft
2144 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2146 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2148 filename =
"TOTAL_ELECTRON_DENSITY"
2151 extension=
".cube", middle_name=trim(filename), &
2152 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2154 IF (output_unit > 0)
THEN
2155 IF (.NOT. mpi_io)
THEN
2156 INQUIRE (unit=unit_nr, name=filename)
2158 filename = mpi_filename
2160 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2161 "The total electron density is written in cube file format to the file:", &
2163 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2164 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2165 "Soft electronic charge (G-space) :", rho_soft, &
2166 "Hard electronic charge (G-space) :", rho_hard, &
2167 "Total electronic charge (G-space):", rho_total, &
2168 "Total electronic charge (R-space):", rho_total_rspace
2170 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2171 particles=particles, &
2172 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2174 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2176 IF (dft_control%nspins > 1)
THEN
2180 auxbas_pw_pool=auxbas_pw_pool, &
2181 rhotot_elec_gspace=rho_elec_gspace, &
2183 rho_hard=rho_hard, &
2184 rho_soft=rho_soft, &
2186 rho_total = rho_hard + rho_soft
2190 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2192 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2194 filename =
"TOTAL_SPIN_DENSITY"
2197 extension=
".cube", middle_name=trim(filename), &
2198 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2200 IF (output_unit > 0)
THEN
2201 IF (.NOT. mpi_io)
THEN
2202 INQUIRE (unit=unit_nr, name=filename)
2204 filename = mpi_filename
2206 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2207 "The total spin density is written in cube file format to the file:", &
2209 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2210 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2211 "Soft part of the spin density (G-space):", rho_soft, &
2212 "Hard part of the spin density (G-space):", rho_hard, &
2213 "Total spin density (G-space) :", rho_total, &
2214 "Total spin density (R-space) :", rho_total_rspace
2216 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2217 particles=particles, &
2218 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2220 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2222 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2223 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2225 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2226 IF (dft_control%nspins > 1)
THEN
2230 auxbas_pw_pool=auxbas_pw_pool, &
2232 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2233 CALL pw_copy(rho_r(1), rho_elec_rspace)
2234 CALL pw_axpy(rho_r(2), rho_elec_rspace)
2235 filename =
"ELECTRON_DENSITY"
2238 extension=
".cube", middle_name=trim(filename), &
2239 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2241 IF (output_unit > 0)
THEN
2242 IF (.NOT. mpi_io)
THEN
2243 INQUIRE (unit=unit_nr, name=filename)
2245 filename = mpi_filename
2247 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2248 "The sum of alpha and beta density is written in cube file format to the file:", &
2251 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
2252 particles=particles, stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), &
2255 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2256 CALL pw_copy(rho_r(1), rho_elec_rspace)
2257 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2258 filename =
"SPIN_DENSITY"
2261 extension=
".cube", middle_name=trim(filename), &
2262 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2264 IF (output_unit > 0)
THEN
2265 IF (.NOT. mpi_io)
THEN
2266 INQUIRE (unit=unit_nr, name=filename)
2268 filename = mpi_filename
2270 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2271 "The spin density is written in cube file format to the file:", &
2274 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2275 particles=particles, &
2276 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2278 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2279 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2281 filename =
"ELECTRON_DENSITY"
2284 extension=
".cube", middle_name=trim(filename), &
2285 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2287 IF (output_unit > 0)
THEN
2288 IF (.NOT. mpi_io)
THEN
2289 INQUIRE (unit=unit_nr, name=filename)
2291 filename = mpi_filename
2293 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2294 "The electron density is written in cube file format to the file:", &
2298 particles=particles, &
2299 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2301 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2304 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
2305 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
2306 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
2307 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
2310 ALLOCATE (my_q0(natom))
2318 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
2322 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2326 DO ispin = 1, dft_control%nspins
2327 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
2331 rho_total_rspace = rho_soft + rho_hard
2333 filename =
"ELECTRON_DENSITY"
2336 extension=
".cube", middle_name=trim(filename), &
2337 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2339 IF (output_unit > 0)
THEN
2340 IF (.NOT. mpi_io)
THEN
2341 INQUIRE (unit=unit_nr, name=filename)
2343 filename = mpi_filename
2345 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2346 "The electron density is written in cube file format to the file:", &
2348 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2349 "Soft electronic charge (R-space) :", rho_soft, &
2350 "Hard electronic charge (R-space) :", rho_hard, &
2351 "Total electronic charge (R-space):", rho_total_rspace
2353 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
2354 particles=particles, stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), &
2357 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2360 IF (dft_control%nspins > 1)
THEN
2362 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
2365 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2368 CALL pw_axpy(rho_r(1), rho_elec_rspace)
2369 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2373 rho_total_rspace = rho_soft + rho_hard
2375 filename =
"SPIN_DENSITY"
2378 extension=
".cube", middle_name=trim(filename), &
2379 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2381 IF (output_unit > 0)
THEN
2382 IF (.NOT. mpi_io)
THEN
2383 INQUIRE (unit=unit_nr, name=filename)
2385 filename = mpi_filename
2387 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2388 "The spin density is written in cube file format to the file:", &
2390 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2391 "Soft part of the spin density :", rho_soft, &
2392 "Hard part of the spin density :", rho_hard, &
2393 "Total spin density (R-space) :", rho_total_rspace
2395 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2396 particles=particles, &
2397 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2399 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2401 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2407 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
2413 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
2417 v_hartree_rspace=v_hartree_rspace)
2418 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2419 CALL auxbas_pw_pool%create_pw(aux_r)
2422 my_pos_cube =
"REWIND"
2423 IF (append_cube)
THEN
2424 my_pos_cube =
"APPEND"
2427 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2430 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
2431 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2433 CALL pw_copy(v_hartree_rspace, aux_r)
2436 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, &
2438 "PRINT%V_HARTREE_CUBE%STRIDE"), mpi_io=mpi_io)
2440 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
2442 CALL auxbas_pw_pool%give_back_pw(aux_r)
2447 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
2448 IF (dft_control%apply_external_potential)
THEN
2449 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
2450 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2451 CALL auxbas_pw_pool%create_pw(aux_r)
2453 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
2454 my_pos_cube =
"REWIND"
2455 IF (append_cube)
THEN
2456 my_pos_cube =
"APPEND"
2461 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
2465 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, &
2467 "PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), mpi_io=mpi_io)
2469 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
2471 CALL auxbas_pw_pool%give_back_pw(aux_r)
2477 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
2479 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2480 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2481 CALL auxbas_pw_pool%create_pw(aux_r)
2482 CALL auxbas_pw_pool%create_pw(aux_g)
2485 my_pos_cube =
"REWIND"
2486 IF (append_cube)
THEN
2487 my_pos_cube =
"APPEND"
2489 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
2490 v_hartree_rspace=v_hartree_rspace)
2492 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2496 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
2507 unit_nr,
"ELECTRIC FIELD", particles=particles, &
2509 "PRINT%EFIELD_CUBE%STRIDE"), mpi_io=mpi_io)
2511 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
2514 CALL auxbas_pw_pool%give_back_pw(aux_r)
2515 CALL auxbas_pw_pool%give_back_pw(aux_g)
2519 CALL qs_scf_post_local_energy(input, logger, qs_env)
2522 CALL qs_scf_post_local_stress(input, logger, qs_env)
2525 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
2533 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
2538 after = min(max(after, 1), 16)
2539 DO ispin = 1, dft_control%nspins
2540 DO img = 1, dft_control%nimages
2542 para_env, output_unit=iw, omit_headers=omit_headers)
2546 "DFT%PRINT%AO_MATRICES/DENSITY")
2551 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
2553 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
2555 IF (write_ks .OR. write_xc)
THEN
2556 IF (write_xc) qs_env%requires_matrix_vxc = .true.
2559 just_energy=.false.)
2560 IF (write_xc) qs_env%requires_matrix_vxc = .false.
2567 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
2569 after = min(max(after, 1), 16)
2570 DO ispin = 1, dft_control%nspins
2571 DO img = 1, dft_control%nimages
2573 para_env, output_unit=iw, omit_headers=omit_headers)
2577 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
2582 IF (.NOT. dft_control%qs_control%pao)
THEN
2588 CALL write_adjacency_matrix(qs_env, input)
2592 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
2593 cpassert(
ASSOCIATED(matrix_vxc))
2597 after = min(max(after, 1), 16)
2598 DO ispin = 1, dft_control%nspins
2599 DO img = 1, dft_control%nimages
2601 para_env, output_unit=iw, omit_headers=omit_headers)
2605 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
2610 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
2616 after = min(max(after, 1), 16)
2619 para_env, output_unit=iw, omit_headers=omit_headers)
2623 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
2629 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
2632 IF (print_it) print_level = 2
2634 IF (print_it) print_level = 3
2645 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
2646 IF (rho_r_valid)
THEN
2647 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
2648 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
2656 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
2658 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
2666 should_print_voro = 1
2668 should_print_voro = 0
2671 should_print_bqb = 1
2673 should_print_bqb = 0
2675 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
2680 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
2681 IF (rho_r_valid)
THEN
2683 IF (dft_control%nspins > 1)
THEN
2687 auxbas_pw_pool=auxbas_pw_pool, &
2691 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
2692 CALL pw_copy(rho_r(1), mb_rho)
2693 CALL pw_axpy(rho_r(2), mb_rho)
2700 IF (should_print_voro /= 0)
THEN
2702 IF (voro_print_txt)
THEN
2704 my_pos_voro =
"REWIND"
2705 IF (append_voro)
THEN
2706 my_pos_voro =
"APPEND"
2708 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
2709 file_position=my_pos_voro, log_filename=.false.)
2717 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
2718 unit_nr_voro, qs_env, mb_rho)
2720 IF (dft_control%nspins > 1)
THEN
2721 CALL auxbas_pw_pool%give_back_pw(mb_rho)
2725 IF (unit_nr_voro > 0)
THEN
2735 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
2743 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
2751 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
2753 IF (iao_env%do_iao)
THEN
2763 extension=
".mao", log_filename=.false.)
2774 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
2778 CALL timestop(handle)
2788 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
2791 INTEGER,
INTENT(IN) :: unit_nr
2793 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
2794 radius_type, refc, shapef
2795 INTEGER,
DIMENSION(:),
POINTER :: atom_list
2796 LOGICAL :: do_radius, do_sc, paw_atom
2797 REAL(kind=
dp) :: zeff
2798 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
2799 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
2802 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
2808 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2812 NULLIFY (hirshfeld_env)
2816 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
2817 ALLOCATE (hirshfeld_env%charges(natom))
2826 IF (.NOT.
SIZE(radii) == nkind) &
2827 CALL cp_abort(__location__, &
2828 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
2829 "match number of atomic kinds in the input coordinate file.")
2834 iterative=do_sc, ref_charge=refc, &
2835 radius_type=radius_type)
2837 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
2843 nspin =
SIZE(matrix_p, 1)
2844 ALLOCATE (charges(natom, nspin))
2849 atomic_kind => atomic_kind_set(ikind)
2851 DO iat = 1,
SIZE(atom_list)
2853 hirshfeld_env%charges(i) = zeff
2857 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
2860 hirshfeld_env%charges(iat) = sum(charges(iat, :))
2863 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
2867 IF (hirshfeld_env%iterative)
THEN
2874 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
2875 IF (dft_control%qs_control%gapw)
THEN
2877 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
2880 atomic_kind => particle_set(iat)%atomic_kind
2882 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
2884 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
2889 IF (unit_nr > 0)
THEN
2891 qs_kind_set, unit_nr)
2897 DEALLOCATE (charges)
2899 END SUBROUTINE hirshfeld_charges
2909 SUBROUTINE project_function_a(ca, a, cb, b, l)
2911 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
2912 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
2913 INTEGER,
INTENT(IN) :: l
2916 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
2917 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
2920 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
2924 v(:, 1) = matmul(tmat, cb)
2925 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
2929 DEALLOCATE (smat, tmat, v, ipiv)
2931 END SUBROUTINE project_function_a
2941 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
2943 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
2944 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
2946 INTEGER,
INTENT(IN) :: l
2948 INTEGER :: i, info, n, nr
2949 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
2950 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
2951 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
2955 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
2959 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
2960 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
2962 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
2966 DEALLOCATE (smat, v, ipiv, afun)
2968 END SUBROUTINE project_function_b
2979 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
2984 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
2986 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
2987 INTEGER :: handle, io_unit, natom, unit_nr
2988 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
2997 CALL timeset(routinen, handle)
3000 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3002 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3003 gapw = dft_control%qs_control%gapw
3004 gapw_xc = dft_control%qs_control%gapw_xc
3005 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3007 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3008 CALL auxbas_pw_pool%create_pw(eden)
3012 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3013 IF (append_cube)
THEN
3014 my_pos_cube =
"APPEND"
3016 my_pos_cube =
"REWIND"
3020 extension=
".cube", middle_name=
"local_energy", &
3021 file_position=my_pos_cube, mpi_io=mpi_io)
3023 unit_nr,
"LOCAL ENERGY", particles=particles, &
3025 "PRINT%LOCAL_ENERGY_CUBE%STRIDE"), mpi_io=mpi_io)
3026 IF (io_unit > 0)
THEN
3027 INQUIRE (unit=unit_nr, name=filename)
3028 IF (gapw .OR. gapw_xc)
THEN
3029 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3030 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3032 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3033 "The local energy is written to the file: ", trim(adjustl(filename))
3037 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3039 CALL auxbas_pw_pool%give_back_pw(eden)
3041 CALL timestop(handle)
3043 END SUBROUTINE qs_scf_post_local_energy
3054 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3059 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3061 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3062 INTEGER :: handle, io_unit, natom, unit_nr
3063 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3064 REAL(kind=
dp) :: beta
3073 CALL timeset(routinen, handle)
3076 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3078 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3079 gapw = dft_control%qs_control%gapw
3080 gapw_xc = dft_control%qs_control%gapw_xc
3081 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3083 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3084 CALL auxbas_pw_pool%create_pw(stress)
3090 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3091 IF (append_cube)
THEN
3092 my_pos_cube =
"APPEND"
3094 my_pos_cube =
"REWIND"
3098 extension=
".cube", middle_name=
"local_stress", &
3099 file_position=my_pos_cube, mpi_io=mpi_io)
3101 unit_nr,
"LOCAL STRESS", particles=particles, &
3103 "PRINT%LOCAL_STRESS_CUBE%STRIDE"), mpi_io=mpi_io)
3104 IF (io_unit > 0)
THEN
3105 INQUIRE (unit=unit_nr, name=filename)
3106 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3107 IF (gapw .OR. gapw_xc)
THEN
3108 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3109 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3111 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3112 "The local stress is written to the file: ", trim(adjustl(filename))
3116 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3118 CALL auxbas_pw_pool%give_back_pw(stress)
3121 CALL timestop(handle)
3123 END SUBROUTINE qs_scf_post_local_stress
3134 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3139 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3141 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3142 INTEGER :: boundary_condition, handle, i, j, &
3143 n_cstr, n_tiles, unit_nr
3144 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3145 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3155 CALL timeset(routinen, handle)
3157 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
3160 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3162 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3164 has_implicit_ps = .false.
3165 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3166 IF (pw_env%poisson_env%parameters%solver .EQ.
pw_poisson_implicit) has_implicit_ps = .true.
3170 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
3171 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
3172 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
3173 my_pos_cube =
"REWIND"
3174 IF (append_cube)
THEN
3175 my_pos_cube =
"APPEND"
3179 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
3181 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3182 CALL auxbas_pw_pool%create_pw(aux_r)
3184 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3185 SELECT CASE (boundary_condition)
3187 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
3189 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3190 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3191 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3192 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3193 poisson_env%implicit_env%dielectric%eps, aux_r)
3196 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, &
3197 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
3200 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
3202 CALL auxbas_pw_pool%give_back_pw(aux_r)
3207 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
3209 has_dirichlet_bc = .false.
3210 IF (has_implicit_ps)
THEN
3211 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3213 has_dirichlet_bc = .true.
3217 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
3219 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
3220 my_pos_cube =
"REWIND"
3221 IF (append_cube)
THEN
3222 my_pos_cube =
"APPEND"
3226 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
3227 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
3229 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3230 CALL auxbas_pw_pool%create_pw(aux_r)
3232 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3233 SELECT CASE (boundary_condition)
3235 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
3237 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3238 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3239 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3240 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3241 poisson_env%implicit_env%cstr_charge, aux_r)
3244 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, &
3245 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
3248 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
3250 CALL auxbas_pw_pool%give_back_pw(aux_r)
3255 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
3256 has_dirichlet_bc = .false.
3257 IF (has_implicit_ps)
THEN
3258 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3260 has_dirichlet_bc = .true.
3264 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
3265 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
3266 my_pos_cube =
"REWIND"
3267 IF (append_cube)
THEN
3268 my_pos_cube =
"APPEND"
3270 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
3272 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3273 CALL auxbas_pw_pool%create_pw(aux_r)
3276 IF (tile_cubes)
THEN
3278 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3280 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3282 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
3285 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3286 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
3289 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
3291 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3292 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3295 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3300 NULLIFY (dirichlet_tile)
3301 ALLOCATE (dirichlet_tile)
3302 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
3305 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3306 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
3309 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3311 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3313 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
3314 CALL pw_axpy(dirichlet_tile, aux_r)
3318 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3319 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3322 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3323 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
3324 DEALLOCATE (dirichlet_tile)
3327 CALL auxbas_pw_pool%give_back_pw(aux_r)
3330 CALL timestop(handle)
3332 END SUBROUTINE qs_scf_post_ps_implicit
3340 SUBROUTINE write_adjacency_matrix(qs_env, input)
3344 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
3346 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
3347 ind, jatom, jkind, k, natom, nkind, &
3348 output_unit, rowind, unit_nr
3349 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
3350 LOGICAL :: do_adjm_write, do_symmetric
3356 DIMENSION(:),
POINTER :: nl_iterator
3359 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3362 CALL timeset(routinen, handle)
3364 NULLIFY (dft_section)
3373 IF (do_adjm_write)
THEN
3374 NULLIFY (qs_kind_set, nl_iterator)
3375 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
3377 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
3379 nkind =
SIZE(qs_kind_set)
3380 cpassert(
SIZE(nl) .GT. 0)
3382 cpassert(do_symmetric)
3383 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
3387 adjm_size = ((natom + 1)*natom)/2
3388 ALLOCATE (interact_adjm(4*adjm_size))
3391 NULLIFY (nl_iterator)
3395 ikind=ikind, jkind=jkind, &
3396 iatom=iatom, jatom=jatom)
3398 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
3399 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
3400 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
3401 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
3404 IF (iatom .LE. jatom)
THEN
3411 ikind = ikind + jkind
3412 jkind = ikind - jkind
3413 ikind = ikind - jkind
3417 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
3420 interact_adjm((ind - 1)*4 + 1) = rowind
3421 interact_adjm((ind - 1)*4 + 2) = colind
3422 interact_adjm((ind - 1)*4 + 3) = ikind
3423 interact_adjm((ind - 1)*4 + 4) = jkind
3426 CALL para_env%sum(interact_adjm)
3429 extension=
".adjmat", file_form=
"FORMATTED", &
3430 file_status=
"REPLACE")
3431 IF (unit_nr .GT. 0)
THEN
3432 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
3433 DO k = 1, 4*adjm_size, 4
3435 IF (interact_adjm(k) .GT. 0 .AND. interact_adjm(k + 1) .GT. 0)
THEN
3436 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
3444 DEALLOCATE (basis_set_list_a, basis_set_list_b)
3447 CALL timestop(handle)
3449 END SUBROUTINE write_adjacency_matrix
3457 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
3461 LOGICAL :: use_virial
3471 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
3472 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
3473 rho_core=rho_core, virial=virial, &
3474 v_hartree_rspace=v_hartree_rspace)
3476 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
3478 IF (.NOT. use_virial)
THEN
3480 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
3481 poisson_env=poisson_env)
3482 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
3483 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
3487 v_hartree_gspace, rho_core=rho_core)
3489 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
3490 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
3492 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
3493 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
3496 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_kp(kpoints, qs_env, dft_section)
Compute and write density of states (kpoints)
subroutine, public calculate_dos(mos, dft_section)
Compute and write density of states.
Calculates electric field gradients H.M. Petrili, P.E. Blochl, P. Blaha, K. Schwarz,...
subroutine, public qs_efg_calc(qs_env)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public qs_elf_calc(qs_env, elf_r, rho_cutoff)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public energy_windows(qs_env)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, 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.