108 integrate_v_rspace_diagonal,&
109 integrate_v_rspace_one_center
123#include "./base/base_uses.f90"
129 LOGICAL,
PARAMETER :: debug_this_module = .true.
130 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_ks_utils'
148 SUBROUTINE low_spin_roks(energy, qs_env, dft_control, do_hfx, just_energy, &
149 calculate_forces, auxbas_pw_pool)
154 LOGICAL,
INTENT(IN) :: do_hfx, just_energy, calculate_forces
157 CHARACTER(*),
PARAMETER :: routinen =
'low_spin_roks'
159 INTEGER :: handle, irep, ispin, iterm, k, k_alpha, &
160 k_beta, n_rep, nelectron, nspin, nterms
161 INTEGER,
DIMENSION(:),
POINTER :: ivec
162 INTEGER,
DIMENSION(:, :, :),
POINTER :: occupations
163 LOGICAL :: compute_virial, in_range, &
165 REAL(kind=
dp) :: ehfx, exc
166 REAL(kind=
dp),
DIMENSION(3, 3) :: virial_xc_tmp
167 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy_scaling, rvec, scaling
169 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_h, matrix_hfx, matrix_p, mdummy, &
171 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p2
172 TYPE(
dbcsr_type),
POINTER :: dbcsr_deriv, fm_deriv, fm_scaled, &
174 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
175 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mo_array
181 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, tau, vxc, vxc_tau
186 low_spin_roks_section, xc_section
189 IF (.NOT. dft_control%low_spin_roks)
RETURN
191 CALL timeset(routinen, handle)
193 NULLIFY (ks_env, rho_ao)
196 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
197 CALL cp_abort(__location__,
"GAPW/GAPW_XC are not compatible with low spin ROKS method.")
199 IF (dft_control%do_admm)
THEN
200 CALL cp_abort(__location__,
"ADMM not compatible with low spin ROKS method.")
202 IF (dft_control%do_admm)
THEN
204 CALL cp_abort(__location__,
"ADMM with XC correction functional "// &
205 "not compatible with low spin ROKS method.")
208 IF (dft_control%qs_control%semi_empirical .OR. dft_control%qs_control%dftb .OR. &
209 dft_control%qs_control%xtb)
THEN
210 CALL cp_abort(__location__,
"SE/xTB/DFTB are not compatible with low spin ROKS method.")
215 mo_derivs=mo_derivs, &
219 xcint_weights=weights, &
226 compute_virial = virial%pv_calculate .AND. (.NOT. virial%pv_numer)
231 IF (
ASSOCIATED(weights))
THEN
232 CALL cp_abort(__location__,
"No accurate xc integration possible.")
236 cpassert(
SIZE(mo_array, 1) == 2)
239 CALL get_mo_set(mo_set=mo_array(1), uniform_occupation=uniform_occupation)
240 cpassert(uniform_occupation)
241 CALL get_mo_set(mo_set=mo_array(2), mo_coeff_b=mo_coeff, uniform_occupation=uniform_occupation)
242 cpassert(uniform_occupation)
243 IF (do_hfx .AND. calculate_forces .AND. compute_virial)
THEN
244 CALL cp_abort(__location__,
"ROKS virial with HFX not available.")
247 NULLIFY (dbcsr_deriv)
249 CALL dbcsr_copy(dbcsr_deriv, mo_derivs(1)%matrix)
253 CALL get_mo_set(mo_set=mo_array(1), mo_coeff_b=mo_coeff)
255 CALL get_mo_set(mo_set=mo_array(2), mo_coeff_b=mo_coeff)
263 ALLOCATE (energy_scaling(nterms))
264 energy_scaling = rvec
267 cpassert(n_rep == nterms)
268 CALL section_vals_val_get(low_spin_roks_section,
"SPIN_CONFIGURATION", i_rep_val=1, i_vals=ivec)
269 nelectron =
SIZE(ivec)
270 cpassert(nelectron == k_alpha - k_beta)
271 ALLOCATE (occupations(2, nelectron, nterms))
274 CALL section_vals_val_get(low_spin_roks_section,
"SPIN_CONFIGURATION", i_rep_val=iterm, i_vals=ivec)
275 cpassert(nelectron ==
SIZE(ivec))
276 in_range = all(ivec >= 1) .AND. all(ivec <= 2)
279 occupations(ivec(k), k, iterm) = 1
289 ALLOCATE (matrix_p(ispin)%matrix)
290 CALL dbcsr_copy(matrix_p(ispin)%matrix, rho_ao(1)%matrix, &
291 name=
"density matrix low spin roks")
292 CALL dbcsr_set(matrix_p(ispin)%matrix, 0.0_dp)
298 ALLOCATE (matrix_h(ispin)%matrix)
299 CALL dbcsr_copy(matrix_h(ispin)%matrix, rho_ao(1)%matrix, &
300 name=
"KS matrix low spin roks")
301 CALL dbcsr_set(matrix_h(ispin)%matrix, 0.0_dp)
308 ALLOCATE (matrix_hfx(ispin)%matrix)
309 CALL dbcsr_copy(matrix_hfx(ispin)%matrix, rho_ao(1)%matrix, &
310 name=
"HFX matrix low spin roks")
316 NULLIFY (tau, vxc_tau, vxc)
317 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool)
319 ALLOCATE (rho_r(nspin))
320 ALLOCATE (rho_g(nspin))
322 CALL auxbas_pw_pool%create_pw(rho_r(ispin))
323 CALL auxbas_pw_pool%create_pw(rho_g(ispin))
325 CALL auxbas_pw_pool%create_pw(work_v_rspace)
329 CALL get_mo_set(mo_set=mo_array(1), mo_coeff_b=mo_coeff)
330 NULLIFY (fm_scaled, fm_deriv)
336 ALLOCATE (scaling(k_alpha))
343 CALL dbcsr_set(matrix_p(ispin)%matrix, 0.0_dp)
345 scaling(k_alpha - nelectron + 1:k_alpha) = occupations(ispin, :, iterm)
349 0.0_dp, matrix_p(ispin)%matrix, retain_sparsity=.true.)
352 rho=rho_r(ispin), rho_gspace=rho_g(ispin), &
357 IF (just_energy)
THEN
358 exc =
xc_exc_calc(rho_r=rho_r, rho_g=rho_g, tau=tau, xc_section=xc_section, &
359 weights=weights, pw_pool=xc_pw_pool)
361 cpassert(.NOT. compute_virial)
363 rho_g=rho_g, tau=tau, vxc_tau=vxc_tau, exc=exc, xc_section=xc_section, &
364 weights=weights, pw_pool=xc_pw_pool, &
365 compute_virial=.false., virial_xc=virial_xc_tmp)
368 energy%exc = energy%exc + energy_scaling(iterm)*exc
373 CALL dbcsr_set(matrix_hfx(ispin)%matrix, 0.0_dp)
377 recalc_integrals=.false., update_energy=.true.)
378 energy%ex = ehfx + energy_scaling(iterm)*energy%ex
382 IF (.NOT. just_energy)
THEN
385 CALL dbcsr_set(matrix_h(ispin)%matrix, 0.0_dp)
387 CALL pw_axpy(vxc(ispin), work_v_rspace, energy_scaling(iterm)*vxc(ispin)%pw_grid%dvol, 0.0_dp)
388 CALL integrate_v_rspace(v_rspace=work_v_rspace, pmat=matrix_p(ispin), hmat=matrix_h(ispin), &
389 qs_env=qs_env, calculate_forces=calculate_forces)
390 CALL auxbas_pw_pool%give_back_pw(vxc(ispin))
397 CALL dbcsr_add(matrix_h(ispin)%matrix, matrix_hfx(ispin)%matrix, &
398 1.0_dp, energy_scaling(iterm))
400 IF (calculate_forces)
THEN
401 CALL get_qs_env(qs_env, x_data=x_data, para_env=para_env)
402 IF (x_data(1, 1)%n_rep_hf /= 1)
THEN
403 CALL cp_abort(__location__,
"Multiple HFX section forces not compatible "// &
404 "with low spin ROKS method.")
406 IF (x_data(1, 1)%do_hfx_ri)
THEN
407 CALL cp_abort(__location__,
"HFX_RI forces not compatible with low spin ROKS method.")
411 matrix_p2(1:nspin, 1:1) => matrix_p(1:nspin)
413 irep, compute_virial, &
414 adiabatic_rescale_factor=energy_scaling(iterm))
422 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_h(ispin)%matrix, mo_coeff, &
423 0.0_dp, dbcsr_deriv, last_column=k_alpha)
426 scaling(k_alpha - nelectron + 1:k_alpha) = occupations(ispin, :, iterm)
428 CALL dbcsr_add(mo_derivs(1)%matrix, dbcsr_deriv, 1.0_dp, 1.0_dp)
437 CALL auxbas_pw_pool%give_back_pw(rho_r(ispin))
438 CALL auxbas_pw_pool%give_back_pw(rho_g(ispin))
440 DEALLOCATE (rho_r, rho_g)
447 CALL auxbas_pw_pool%give_back_pw(work_v_rspace)
452 DEALLOCATE (occupations)
453 DEALLOCATE (energy_scaling)
458 CALL timestop(handle)
472 calculate_forces, auxbas_pw_pool)
478 LOGICAL,
INTENT(IN) :: just_energy, calculate_forces
481 CHARACTER(*),
PARAMETER :: routinen =
'sic_explicit_orbitals'
483 INTEGER :: handle, i, iorb, k_alpha, k_beta, norb
484 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: sic_orbital_list
485 LOGICAL :: compute_virial, uniform_occupation
486 REAL(kind=
dp) :: ener, exc
487 REAL(kind=
dp),
DIMENSION(3, 3) :: virial_xc_tmp
491 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mo_derivs_local
494 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mo_derivs, rho_ao, tmp_dbcsr
495 TYPE(
dbcsr_type),
POINTER :: orb_density_matrix, orb_h
496 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mo_array
503 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, tau, vxc, vxc_tau
511 IF (dft_control%sic_method_id /=
sic_eo)
RETURN
513 CALL timeset(routinen, handle)
515 NULLIFY (tau, vxc_tau, mo_derivs, ks_env, rho_ao)
520 mo_derivs=mo_derivs, &
523 xcint_weights=weights, &
531 compute_virial = virial%pv_calculate .AND. (.NOT. virial%pv_numer)
534 DO i = 1,
SIZE(mo_array)
535 IF (mo_array(i)%use_mo_coeff_b)
THEN
537 mo_array(i)%mo_coeff)
541 CALL pw_env_get(pw_env, xc_pw_pool=xc_pw_pool)
544 cpassert(
SIZE(mo_array, 1) == 2)
546 CALL get_mo_set(mo_set=mo_array(1), uniform_occupation=uniform_occupation)
547 cpassert(uniform_occupation)
548 CALL get_mo_set(mo_set=mo_array(2), mo_coeff=mo_coeff, uniform_occupation=uniform_occupation)
549 cpassert(uniform_occupation)
553 DO i = 1,
SIZE(mo_derivs, 1)
555 NULLIFY (tmp_dbcsr(i)%matrix)
557 CALL dbcsr_copy(tmp_dbcsr(i)%matrix, mo_derivs(i)%matrix)
558 CALL dbcsr_set(tmp_dbcsr(i)%matrix, 0.0_dp)
561 k_alpha = 0; k_beta = 0
562 SELECT CASE (dft_control%sic_list_id)
565 CALL get_mo_set(mo_set=mo_array(1), mo_coeff=mo_coeff)
568 IF (
SIZE(mo_array, 1) > 1)
THEN
569 CALL get_mo_set(mo_set=mo_array(2), mo_coeff=mo_coeff)
573 norb = k_alpha + k_beta
574 ALLOCATE (sic_orbital_list(3, norb))
579 sic_orbital_list(1, iorb) = 1
580 sic_orbital_list(2, iorb) = i
581 sic_orbital_list(3, iorb) = 1
585 sic_orbital_list(1, iorb) = 2
586 sic_orbital_list(2, iorb) = i
587 IF (
SIZE(mo_derivs, 1) == 1)
THEN
588 sic_orbital_list(3, iorb) = 1
590 sic_orbital_list(3, iorb) = 2
596 cpassert(
SIZE(mo_array, 1) == 2)
598 cpassert(
SIZE(mo_derivs, 1) == 1)
599 cpassert(dft_control%restricted)
601 CALL get_mo_set(mo_set=mo_array(1), mo_coeff=mo_coeff)
604 CALL get_mo_set(mo_set=mo_array(2), mo_coeff=mo_coeff)
607 norb = k_alpha - k_beta
608 ALLOCATE (sic_orbital_list(3, norb))
611 DO i = k_beta + 1, k_alpha
613 sic_orbital_list(1, iorb) = 1
614 sic_orbital_list(2, iorb) = i
616 sic_orbital_list(3, iorb) = 1
624 CALL auxbas_pw_pool%create_pw(orb_rho_r)
625 CALL auxbas_pw_pool%create_pw(tmp_r)
626 CALL auxbas_pw_pool%create_pw(orb_rho_g)
627 CALL auxbas_pw_pool%create_pw(tmp_g)
628 CALL auxbas_pw_pool%create_pw(work_v_gspace)
629 CALL auxbas_pw_pool%create_pw(work_v_rspace)
631 ALLOCATE (orb_density_matrix)
632 CALL dbcsr_copy(orb_density_matrix, rho_ao(1)%matrix, &
633 name=
"orb_density_matrix")
634 CALL dbcsr_set(orb_density_matrix, 0.0_dp)
635 orb_density_matrix_p%matrix => orb_density_matrix
639 name=
"orb_density_matrix")
641 orb_h_p%matrix => orb_h
643 CALL get_mo_set(mo_set=mo_array(1), mo_coeff=mo_coeff)
646 template_fmstruct=mo_coeff%matrix_struct)
647 CALL cp_fm_create(matrix_v, fm_struct_tmp, name=
"matrix_v")
648 CALL cp_fm_create(matrix_hv, fm_struct_tmp, name=
"matrix_hv")
651 ALLOCATE (mo_derivs_local(
SIZE(mo_array, 1)))
652 DO i = 1,
SIZE(mo_array, 1)
653 CALL get_mo_set(mo_set=mo_array(i), mo_coeff=mo_coeff)
654 CALL cp_fm_create(mo_derivs_local(i), mo_coeff%matrix_struct)
671 CALL get_mo_set(mo_set=mo_array(sic_orbital_list(1, iorb)), mo_coeff=mo_coeff)
672 CALL cp_fm_to_fm(mo_coeff, matrix_v, 1, sic_orbital_list(2, iorb), 1)
675 CALL dbcsr_set(orb_density_matrix, 0.0_dp)
680 rho=orb_rho_r, rho_gspace=orb_rho_g, &
688 energy%hartree = energy%hartree - dft_control%sic_scaling_a*ener
689 IF (.NOT. just_energy)
THEN
691 CALL pw_scale(work_v_rspace, -dft_control%sic_scaling_a*work_v_rspace%pw_grid%dvol)
695 IF (just_energy)
THEN
696 exc =
xc_exc_calc(rho_r=rho_r, rho_g=rho_g, tau=tau, xc_section=xc_section, &
697 weights=weights, pw_pool=xc_pw_pool)
699 cpassert(.NOT. compute_virial)
701 rho_g=rho_g, tau=tau, vxc_tau=vxc_tau, exc=exc, xc_section=xc_section, &
702 weights=weights, pw_pool=xc_pw_pool, &
703 compute_virial=compute_virial, virial_xc=virial_xc_tmp)
705 CALL pw_axpy(vxc(1), work_v_rspace, -dft_control%sic_scaling_b*vxc(1)%pw_grid%dvol)
707 energy%exc = energy%exc - dft_control%sic_scaling_b*exc
709 IF (.NOT. just_energy)
THEN
711 CALL integrate_v_rspace(v_rspace=work_v_rspace, pmat=orb_density_matrix_p, hmat=orb_h_p, &
712 qs_env=qs_env, calculate_forces=calculate_forces)
717 CALL cp_fm_set_all(mo_derivs_local(sic_orbital_list(3, iorb)), 0.0_dp)
718 CALL cp_fm_to_fm(matrix_hv, mo_derivs_local(sic_orbital_list(3, iorb)), 1, 1, sic_orbital_list(2, iorb))
720 tmp_dbcsr(sic_orbital_list(3, iorb))%matrix)
721 CALL dbcsr_add(mo_derivs(sic_orbital_list(3, iorb))%matrix, &
722 tmp_dbcsr(sic_orbital_list(3, iorb))%matrix, 1.0_dp, 1.0_dp)
725 CALL xc_pw_pool%give_back_pw(vxc(1))
726 CALL xc_pw_pool%give_back_pw(vxc(2))
733 CALL auxbas_pw_pool%give_back_pw(orb_rho_r)
734 CALL auxbas_pw_pool%give_back_pw(tmp_r)
735 CALL auxbas_pw_pool%give_back_pw(orb_rho_g)
736 CALL auxbas_pw_pool%give_back_pw(tmp_g)
737 CALL auxbas_pw_pool%give_back_pw(work_v_gspace)
738 CALL auxbas_pw_pool%give_back_pw(work_v_rspace)
750 CALL timestop(handle)
767 qs_env, dft_control, rho, poisson_env, just_energy, &
768 calculate_forces, auxbas_pw_pool)
776 LOGICAL,
INTENT(IN) :: just_energy, calculate_forces
779 INTEGER :: i, nelec, nelec_a, nelec_b, nforce
780 REAL(kind=
dp) :: ener, full_scaling, scaling
781 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: store_forces
782 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mo_array
787 NULLIFY (mo_array, rho_g)
789 IF (dft_control%sic_method_id ==
sic_none)
RETURN
790 IF (dft_control%sic_method_id ==
sic_eo)
RETURN
792 IF (dft_control%qs_control%gapw) &
793 cpabort(
"sic and GAPW not yet compatible")
796 cpassert(dft_control%nspins == 2)
798 CALL auxbas_pw_pool%create_pw(work_rho)
799 CALL auxbas_pw_pool%create_pw(work_v)
804 SELECT CASE (dft_control%sic_method_id)
806 CALL pw_copy(rho_g(1), work_rho)
807 CALL pw_axpy(rho_g(2), work_rho, alpha=-1._dp)
812 CALL get_mo_set(mo_set=mo_array(1), nelectron=nelec_a)
813 CALL get_mo_set(mo_set=mo_array(2), nelectron=nelec_b)
814 nelec = nelec_a + nelec_b
815 CALL pw_copy(rho_g(1), work_rho)
816 CALL pw_axpy(rho_g(2), work_rho)
817 scaling = 1.0_dp/real(nelec, kind=
dp)
821 cpabort(
"Unknown sic method id")
826 IF (calculate_forces)
THEN
829 DO i = 1,
SIZE(force)
830 nforce = nforce +
SIZE(force(i)%ch_pulay, 2)
832 ALLOCATE (store_forces(3, nforce))
834 DO i = 1,
SIZE(force)
835 store_forces(1:3, nforce + 1:nforce +
SIZE(force(i)%ch_pulay, 2)) = force(i)%ch_pulay(:, :)
836 force(i)%ch_pulay(:, :) = 0.0_dp
837 nforce = nforce +
SIZE(force(i)%ch_pulay, 2)
844 v_hartree_gspace=work_v, &
845 calculate_forces=calculate_forces, &
846 itype_of_density=
"SPIN")
848 SELECT CASE (dft_control%sic_method_id)
850 full_scaling = -dft_control%sic_scaling_a
852 full_scaling = -dft_control%sic_scaling_a*nelec
854 cpabort(
"Unknown sic method id")
856 energy%hartree = energy%hartree + full_scaling*ener
859 IF (calculate_forces)
THEN
861 DO i = 1,
SIZE(force)
862 force(i)%ch_pulay(:, :) = force(i)%ch_pulay(:, :)*full_scaling + &
863 store_forces(1:3, nforce + 1:nforce +
SIZE(force(i)%ch_pulay, 2))
864 nforce = nforce +
SIZE(force(i)%ch_pulay, 2)
868 IF (.NOT. just_energy)
THEN
869 ALLOCATE (v_sic_rspace)
870 CALL auxbas_pw_pool%create_pw(v_sic_rspace)
874 dft_control%sic_scaling_a*v_sic_rspace%pw_grid%dvol)
877 CALL auxbas_pw_pool%give_back_pw(work_rho)
878 CALL auxbas_pw_pool%give_back_pw(work_v)
891 INTEGER :: img, ispin, n_electrons, output_unit
892 REAL(
dp) :: tot1_h, tot1_s, tot_rho_r, trace, &
894 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r_arr
897 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s, rho_ao
900 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
903 NULLIFY (qs_charges, qs_kind_set, cell, input, logger, scf_section, matrix_s, &
904 dft_control, tot_rho_r_arr, rho_ao)
909 qs_kind_set=qs_kind_set, &
910 cell=cell, qs_charges=qs_charges, &
912 matrix_s_kp=matrix_s, &
913 dft_control=dft_control)
921 CALL qs_rho_get(rho, tot_rho_r=tot_rho_r_arr, rho_ao_kp=rho_ao)
922 n_electrons = n_electrons - dft_control%charge
927 DO ispin = 1, dft_control%nspins
928 DO img = 1, dft_control%nimages
929 CALL dbcsr_dot(rho_ao(ispin, img)%matrix, matrix_s(1, img)%matrix, trace_tmp)
930 trace = trace + trace_tmp
935 IF (output_unit > 0)
THEN
936 WRITE (unit=output_unit, fmt=
"(/,T3,A,T41,F20.10)")
"Trace(PS):", trace
937 WRITE (unit=output_unit, fmt=
"((T3,A,T41,2F20.10))") &
938 "Electronic density on regular grids: ", &
941 REAL(n_electrons,
dp), &
942 "Core density on regular grids:", &
943 qs_charges%total_rho_core_rspace, &
944 qs_charges%total_rho_core_rspace + &
945 qs_charges%total_rho1_hard_nuc - &
946 REAL(n_electrons + dft_control%charge,
dp)
948 IF (dft_control%qs_control%gapw)
THEN
949 tot1_h = qs_charges%total_rho1_hard(1)
950 tot1_s = qs_charges%total_rho1_soft(1)
951 DO ispin = 2, dft_control%nspins
952 tot1_h = tot1_h + qs_charges%total_rho1_hard(ispin)
953 tot1_s = tot1_s + qs_charges%total_rho1_soft(ispin)
955 IF (output_unit > 0)
THEN
956 WRITE (unit=output_unit, fmt=
"((T3,A,T41,2F20.10))") &
957 "Hard and soft densities (Lebedev):", &
959 WRITE (unit=output_unit, fmt=
"(T3,A,T41,F20.10)") &
960 "Total Rho_soft + Rho1_hard - Rho1_soft (r-space): ", &
961 tot_rho_r + tot1_h - tot1_s, &
962 "Total charge density (r-space): ", &
963 tot_rho_r + tot1_h - tot1_s &
964 + qs_charges%total_rho_core_rspace &
965 + qs_charges%total_rho1_hard_nuc
966 IF (qs_charges%total_rho1_hard_nuc /= 0.0_dp)
THEN
967 WRITE (unit=output_unit, fmt=
"(T3,A,T41,F20.10)") &
968 "Total CNEO nuc. char. den. (Lebedev): ", &
969 qs_charges%total_rho1_hard_nuc, &
970 "Total CNEO soft char. den. (Lebedev): ", &
971 qs_charges%total_rho1_soft_nuc_lebedev, &
972 "Total CNEO soft char. den. (r-space): ", &
973 qs_charges%total_rho1_soft_nuc_rspace, &
974 "Total soft Rho_e+n+0 (g-space):", &
975 qs_charges%total_rho_gspace
977 WRITE (unit=output_unit, fmt=
"(T3,A,T41,F20.10)") &
978 "Total Rho_soft + Rho0_soft (g-space):", &
979 qs_charges%total_rho_gspace
982 qs_charges%background = tot_rho_r + tot1_h - tot1_s + &
983 qs_charges%total_rho_core_rspace + &
984 qs_charges%total_rho1_hard_nuc
986 ELSE IF (dft_control%qs_control%gapw_xc)
THEN
987 tot1_h = qs_charges%total_rho1_hard(1)
988 tot1_s = qs_charges%total_rho1_soft(1)
989 DO ispin = 2, dft_control%nspins
990 tot1_h = tot1_h + qs_charges%total_rho1_hard(ispin)
991 tot1_s = tot1_s + qs_charges%total_rho1_soft(ispin)
993 IF (output_unit > 0)
THEN
994 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T41,2F20.10))") &
995 "Hard and soft densities (Lebedev):", &
997 WRITE (unit=output_unit, fmt=
"(T3,A,T41,F20.10)") &
998 "Total Rho_soft + Rho1_hard - Rho1_soft (r-space): ", &
1001 qs_charges%background = tot_rho_r + &
1002 qs_charges%total_rho_core_rspace
1004 IF (output_unit > 0)
THEN
1005 WRITE (unit=output_unit, fmt=
"(T3,A,T41,F20.10)") &
1006 "Total charge density on r-space grids: ", &
1008 qs_charges%total_rho_core_rspace, &
1009 "Total charge density g-space grids: ", &
1010 qs_charges%total_rho_gspace
1012 qs_charges%background = tot_rho_r + &
1013 qs_charges%total_rho_core_rspace
1015 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"()")
1016 qs_charges%background = qs_charges%background/cell%deth
1019 "PRINT%TOTAL_DENSITIES")
1041 REAL(kind=
dp),
INTENT(IN) :: mulliken_order_p
1043 INTEGER :: bc, n, output_unit, psolver
1044 REAL(kind=
dp) :: ddapc_order_p, implicit_ps_ehartree, &
1052 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1053 psolver = pw_env%poisson_env%parameters%solver
1056 extension=
".scfLog")
1057 IF (output_unit > 0)
THEN
1058 IF (dft_control%do_admm)
THEN
1059 WRITE (unit=output_unit, fmt=
"((T3,A,T60,F20.10))") &
1060 "Wfn fit exchange-correlation energy: ", energy%exc_aux_fit
1061 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
1062 WRITE (unit=output_unit, fmt=
"((T3,A,T60,F20.10))") &
1063 "Wfn fit soft/hard atomic rho1 Exc contribution: ", energy%exc1_aux_fit
1066 IF (dft_control%do_admm)
THEN
1068 implicit_ps_ehartree = pw_env%poisson_env%implicit_env%ehartree
1069 bc = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
1072 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1073 "Core Hamiltonian energy: ", energy%core, &
1074 "Hartree energy: ", implicit_ps_ehartree, &
1075 "Electric enthalpy: ", energy%hartree, &
1076 "Exchange-correlation energy: ", energy%exc + energy%exc_aux_fit
1078 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1079 "Core Hamiltonian energy: ", energy%core, &
1080 "Hartree energy: ", energy%hartree, &
1081 "Exchange-correlation energy: ", energy%exc + energy%exc_aux_fit
1084 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1085 "Core Hamiltonian energy: ", energy%core, &
1086 "Hartree energy: ", energy%hartree, &
1087 "Exchange-correlation energy: ", energy%exc + energy%exc_aux_fit
1091 IF (dft_control%apply_external_density)
THEN
1092 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1093 "DOING ZMP CALCULATION FROM EXTERNAL DENSITY "
1094 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1095 "Core Hamiltonian energy: ", energy%core, &
1096 "Hartree energy: ", energy%hartree
1097 ELSE IF (dft_control%apply_external_vxc)
THEN
1098 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1099 "DOING ZMP READING EXTERNAL VXC "
1100 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1101 "Core Hamiltonian energy: ", energy%core, &
1102 "Hartree energy: ", energy%hartree
1105 implicit_ps_ehartree = pw_env%poisson_env%implicit_env%ehartree
1106 bc = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
1109 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1110 "Core Hamiltonian energy: ", energy%core, &
1111 "Hartree energy: ", implicit_ps_ehartree, &
1112 "Electric enthalpy: ", energy%hartree, &
1113 "Exchange-correlation energy: ", energy%exc
1115 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1116 "Core Hamiltonian energy: ", energy%core, &
1117 "Hartree energy: ", energy%hartree, &
1118 "Exchange-correlation energy: ", energy%exc
1121 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1122 "Core Hamiltonian energy: ", energy%core, &
1123 "Hartree energy: ", energy%hartree, &
1124 "Exchange-correlation energy: ", energy%exc
1129 IF (dft_control%apply_external_density)
THEN
1130 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1131 "Integral of the (density * v_xc): ", energy%exc
1134 IF (energy%e_hartree /= 0.0_dp) &
1135 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1136 "Coulomb (electron-electron) energy: ", energy%e_hartree
1137 IF (energy%dispersion /= 0.0_dp) &
1138 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1139 "Dispersion energy: ", energy%dispersion
1140 IF (energy%efield /= 0.0_dp) &
1141 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1142 "Electric field interaction energy: ", energy%efield
1143 IF (energy%gcp /= 0.0_dp) &
1144 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1145 "gCP energy: ", energy%gcp
1146 IF (dft_control%qs_control%gapw)
THEN
1147 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1148 "GAPW| Exc from hard and soft atomic rho1: ", energy%exc1 + energy%exc1_aux_fit, &
1149 "GAPW| local Eh = 1 center integrals: ", energy%hartree_1c
1151 IF (dft_control%qs_control%gapw_xc)
THEN
1152 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T61,F20.10))") &
1153 "GAPW| Exc from hard and soft atomic rho1: ", energy%exc1 + energy%exc1_aux_fit
1155 IF (dft_control%dft_plus_u)
THEN
1156 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1157 "DFT+U energy:", energy%dft_plus_u
1159 IF (qs_env%qmmm)
THEN
1160 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1161 "QM/MM Electrostatic energy: ", energy%qmmm_el
1162 IF (qs_env%qmmm_env_qm%image_charge)
THEN
1163 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1164 "QM/MM image charge energy: ", energy%image_charge
1167 IF (dft_control%qs_control%mulliken_restraint)
THEN
1168 WRITE (unit=output_unit, fmt=
"(T3,A,T41,2F20.10)") &
1169 "Mulliken restraint (order_p,energy) : ", mulliken_order_p, energy%mulliken
1171 IF (dft_control%qs_control%ddapc_restraint)
THEN
1172 DO n = 1,
SIZE(dft_control%qs_control%ddapc_restraint_control)
1174 dft_control%qs_control%ddapc_restraint_control(n)%ddapc_order_p
1175 WRITE (unit=output_unit, fmt=
"(T3,A,T41,2F20.10)") &
1176 "DDAPC restraint (order_p,energy) : ", ddapc_order_p, energy%ddapc_restraint(n)
1179 IF (dft_control%qs_control%s2_restraint)
THEN
1180 s2_order_p = dft_control%qs_control%s2_restraint_control%s2_order_p
1181 WRITE (unit=output_unit, fmt=
"(T3,A,T41,2F20.10)") &
1182 "S2 restraint (order_p,energy) : ", s2_order_p, energy%s2_restraint
1184 IF (energy%core_cneo /= 0.0_dp)
THEN
1185 WRITE (unit=output_unit, fmt=
"(T3,A,T61,F20.10)") &
1186 "CNEO| quantum nuclear core energy: ", energy%core_cneo
1191 "DFT%SCF%PRINT%DETAILED_ENERGY")
1209 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_vxc
1211 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_matrix_vxc'
1213 INTEGER :: handle, ispin
1218 CALL timeset(routinen, handle)
1221 IF (
ASSOCIATED(matrix_vxc))
THEN
1225 ALLOCATE (matrix_vxc(
SIZE(matrix_ks)))
1226 DO ispin = 1,
SIZE(matrix_ks)
1227 NULLIFY (matrix_vxc(ispin)%matrix)
1229 CALL dbcsr_copy(matrix_vxc(ispin)%matrix, matrix_ks(ispin)%matrix, &
1231 CALL dbcsr_set(matrix_vxc(ispin)%matrix, 0.0_dp)
1235 CALL get_qs_env(qs_env, dft_control=dft_control)
1236 gapw = dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc
1237 DO ispin = 1,
SIZE(matrix_ks)
1238 CALL integrate_v_rspace(v_rspace=v_rspace(ispin), &
1239 hmat=matrix_vxc(ispin), &
1241 calculate_forces=.false., &
1244 CALL dbcsr_scale(matrix_vxc(ispin)%matrix, v_rspace(ispin)%pw_grid%dvol)
1247 CALL timestop(handle)
1275 vppl_rspace, v_rspace_new, &
1276 v_rspace_new_aux_fit, v_tau_rspace, &
1277 v_tau_rspace_aux_fit, &
1278 v_sic_rspace, v_spin_ddapc_rest_r, &
1279 v_sccs_rspace, v_rspace_embed, cdft_control, &
1283 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_matrix
1287 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: v_rspace_new, v_rspace_new_aux_fit, &
1288 v_tau_rspace, v_tau_rspace_aux_fit
1289 TYPE(
pw_r3d_rs_type),
POINTER :: v_sic_rspace, v_spin_ddapc_rest_r, &
1293 LOGICAL,
INTENT(in) :: calculate_forces
1295 CHARACTER(LEN=*),
PARAMETER :: routinen =
'sum_up_and_integrate'
1297 CHARACTER(LEN=default_string_length) :: basis_type
1298 INTEGER :: handle, igroup, ikind, img, ispin, &
1300 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1301 LOGICAL :: do_ppl, gapw, gapw_xc, lrigpw, rigpw
1302 REAL(kind=
dp) :: csign, dvol, fadm
1305 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ksmat, rho_ao, rho_ao_nokp, smat
1306 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_aux_fit, &
1307 matrix_ks_aux_fit_dft, rho_ao_aux, &
1323 CALL timeset(routinen, handle)
1325 NULLIFY (auxbas_pw_pool, dft_control, pw_env, matrix_ks_aux_fit, &
1326 v_rspace, rho_aux_fit, vee, rho_ao, rho_ao_kp, rho_ao_aux, &
1327 ksmat, matrix_ks_aux_fit_dft, lri_env, lri_density, atomic_kind_set, &
1328 rho_ao_nokp, ks_env, admm_env, task_list)
1331 dft_control=dft_control, &
1333 v_hartree_rspace=v_rspace, &
1337 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
1338 gapw = dft_control%qs_control%gapw
1339 gapw_xc = dft_control%qs_control%gapw_xc
1340 do_ppl = dft_control%qs_control%do_ppl_method ==
do_ppl_grid
1342 rigpw = dft_control%qs_control%rigpw
1343 lrigpw = dft_control%qs_control%lrigpw
1344 IF (lrigpw .OR. rigpw)
THEN
1347 lri_density=lri_density, &
1348 atomic_kind_set=atomic_kind_set)
1351 nspins = dft_control%nspins
1354 IF (
ASSOCIATED(v_rspace_new))
THEN
1355 DO ispin = 1, nspins
1358 cpassert(dft_control%sic_method_id ==
sic_none)
1360 CALL pw_scale(v_rspace_new(ispin), v_rspace_new(ispin)%pw_grid%dvol)
1363 rho_ao => rho_ao_kp(ispin, :)
1364 ksmat => ks_matrix(ispin, :)
1365 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
1366 pmat_kp=rho_ao, hmat_kp=ksmat, &
1368 calculate_forces=calculate_forces, &
1372 CALL pw_copy(v_rspace, v_rspace_new(ispin))
1375 CALL pw_axpy(v_rspace, v_rspace_new(ispin), 1.0_dp, v_rspace_new(ispin)%pw_grid%dvol)
1377 IF (dft_control%qs_control%ddapc_explicit_potential)
THEN
1378 IF (dft_control%qs_control%ddapc_restraint_is_spin)
THEN
1379 IF (ispin == 1)
THEN
1380 CALL pw_axpy(v_spin_ddapc_rest_r, v_rspace_new(ispin), 1.0_dp)
1382 CALL pw_axpy(v_spin_ddapc_rest_r, v_rspace_new(ispin), -1.0_dp)
1385 CALL pw_axpy(v_spin_ddapc_rest_r, v_rspace_new(ispin), 1.0_dp)
1389 IF (dft_control%qs_control%cdft)
THEN
1390 DO igroup = 1,
SIZE(cdft_control%group)
1391 SELECT CASE (cdft_control%group(igroup)%constraint_type)
1395 IF (ispin == 1)
THEN
1402 IF (ispin == 2) cycle
1405 IF (ispin == 1) cycle
1407 cpabort(
"Unknown constraint type.")
1409 CALL pw_axpy(cdft_control%group(igroup)%weight, v_rspace_new(ispin), &
1410 csign*cdft_control%strength(igroup))
1417 dvol = poisson_env%implicit_env%v_eps%pw_grid%dvol
1418 CALL pw_axpy(poisson_env%implicit_env%v_eps, v_rspace_new(ispin), dvol)
1421 IF (dft_control%do_sccs)
THEN
1422 CALL pw_axpy(v_sccs_rspace, v_rspace_new(ispin))
1425 IF (dft_control%apply_external_potential)
THEN
1427 v_qmmm=vee, scale=-1.0_dp)
1430 cpassert(.NOT. gapw)
1431 CALL pw_axpy(vppl_rspace, v_rspace_new(ispin), vppl_rspace%pw_grid%dvol)
1434 SELECT CASE (dft_control%sic_method_id)
1438 IF (ispin == 1)
THEN
1439 CALL pw_axpy(v_sic_rspace, v_rspace_new(ispin), -1.0_dp)
1441 CALL pw_axpy(v_sic_rspace, v_rspace_new(ispin), 1.0_dp)
1444 CALL pw_axpy(v_sic_rspace, v_rspace_new(ispin), -1.0_dp)
1449 IF (dft_control%apply_embed_pot)
THEN
1450 CALL pw_axpy(v_rspace_embed(ispin), v_rspace_new(ispin), v_rspace_embed(ispin)%pw_grid%dvol)
1451 CALL auxbas_pw_pool%give_back_pw(v_rspace_embed(ispin))
1454 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
1455 CALL get_qs_env(qs_env, nkind=nkind, para_env=para_env)
1457 lri_v_int(ikind)%v_int = 0.0_dp
1459 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
1460 lri_v_int, calculate_forces,
"LRI_AUX")
1462 CALL para_env%sum(lri_v_int(ikind)%v_int)
1464 IF (lri_env%exact_1c_terms)
THEN
1465 rho_ao => my_rho(ispin, :)
1466 ksmat => ks_matrix(ispin, :)
1467 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), ksmat(1)%matrix, &
1468 rho_ao(1)%matrix, qs_env, &
1469 calculate_forces,
"ORB")
1471 IF (lri_env%ppl_ri)
THEN
1475 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
1476 CALL get_qs_env(qs_env, nkind=nkind, para_env=para_env)
1478 lri_v_int(ikind)%v_int = 0.0_dp
1480 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
1481 lri_v_int, calculate_forces,
"RI_HXC")
1483 CALL para_env%sum(lri_v_int(ikind)%v_int)
1486 rho_ao => my_rho(ispin, :)
1487 ksmat => ks_matrix(ispin, :)
1488 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
1489 pmat_kp=rho_ao, hmat_kp=ksmat, &
1491 calculate_forces=calculate_forces, &
1494 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
1497 SELECT CASE (dft_control%sic_method_id)
1500 CALL auxbas_pw_pool%give_back_pw(v_sic_rspace)
1501 DEALLOCATE (v_sic_rspace)
1503 DEALLOCATE (v_rspace_new)
1507 cpassert(dft_control%sic_method_id ==
sic_none)
1508 cpassert(.NOT. dft_control%qs_control%ddapc_restraint_is_spin)
1509 DO ispin = 1, nspins
1512 dvol = poisson_env%implicit_env%v_eps%pw_grid%dvol
1513 CALL pw_axpy(poisson_env%implicit_env%v_eps, v_rspace, dvol)
1516 IF (dft_control%do_sccs)
THEN
1517 CALL pw_axpy(v_sccs_rspace, v_rspace)
1520 IF (dft_control%apply_embed_pot)
THEN
1521 CALL pw_axpy(v_rspace_embed(ispin), v_rspace, v_rspace_embed(ispin)%pw_grid%dvol)
1522 CALL auxbas_pw_pool%give_back_pw(v_rspace_embed(ispin))
1525 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
1526 CALL get_qs_env(qs_env, nkind=nkind, para_env=para_env)
1528 lri_v_int(ikind)%v_int = 0.0_dp
1530 CALL integrate_v_rspace_one_center(v_rspace, qs_env, &
1531 lri_v_int, calculate_forces,
"LRI_AUX")
1533 CALL para_env%sum(lri_v_int(ikind)%v_int)
1535 IF (lri_env%exact_1c_terms)
THEN
1536 rho_ao => my_rho(ispin, :)
1537 ksmat => ks_matrix(ispin, :)
1538 CALL integrate_v_rspace_diagonal(v_rspace, ksmat(1)%matrix, &
1539 rho_ao(1)%matrix, qs_env, &
1540 calculate_forces,
"ORB")
1542 IF (lri_env%ppl_ri)
THEN
1546 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
1547 CALL get_qs_env(qs_env, nkind=nkind, para_env=para_env)
1549 lri_v_int(ikind)%v_int = 0.0_dp
1551 CALL integrate_v_rspace_one_center(v_rspace, qs_env, &
1552 lri_v_int, calculate_forces,
"RI_HXC")
1554 CALL para_env%sum(lri_v_int(ikind)%v_int)
1557 rho_ao => my_rho(ispin, :)
1558 ksmat => ks_matrix(ispin, :)
1559 CALL integrate_v_rspace(v_rspace=v_rspace, &
1563 calculate_forces=calculate_forces, &
1572 CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
1574 DO ispin = 1, nspins
1575 ksmat => ks_matrix(ispin, :)
1577 cell_to_index=cell_to_index)
1579 IF (calculate_forces)
THEN
1584 DO ispin = 1, nspins
1586 smat(1)%matrix, atomic_kind_set, ispin)
1588 IF (calculate_forces)
THEN
1589 rho_ao_nokp => rho_ao_kp(:, 1)
1594 IF (
ASSOCIATED(v_tau_rspace))
THEN
1595 IF (lrigpw .OR. rigpw)
THEN
1596 cpabort(
"LRIGPW/RIGPW not implemented for meta-GGAs")
1598 DO ispin = 1, nspins
1599 CALL pw_scale(v_tau_rspace(ispin), v_tau_rspace(ispin)%pw_grid%dvol)
1601 rho_ao => rho_ao_kp(ispin, :)
1602 ksmat => ks_matrix(ispin, :)
1603 CALL integrate_v_rspace(v_rspace=v_tau_rspace(ispin), &
1604 pmat_kp=rho_ao, hmat_kp=ksmat, &
1606 calculate_forces=calculate_forces, compute_tau=.true., &
1608 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
1610 DEALLOCATE (v_tau_rspace)
1614 IF (dft_control%do_admm)
THEN
1616 CALL get_admm_env(admm_env, matrix_ks_aux_fit_kp=matrix_ks_aux_fit, rho_aux_fit=rho_aux_fit, &
1617 matrix_ks_aux_fit_dft_kp=matrix_ks_aux_fit_dft)
1618 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=rho_ao_aux)
1619 IF (
ASSOCIATED(v_rspace_new_aux_fit))
THEN
1620 DO ispin = 1, nspins
1622 CALL pw_scale(v_rspace_new_aux_fit(ispin), v_rspace_new_aux_fit(ispin)%pw_grid%dvol)
1625 DO img = 1, dft_control%nimages
1626 CALL dbcsr_copy(matrix_ks_aux_fit_dft(ispin, img)%matrix, matrix_ks_aux_fit(ispin, img)%matrix, &
1627 name=
"DFT exch. part of matrix_ks_aux_fit")
1635 CALL get_admm_env(admm_env, task_list_aux_fit=task_list)
1636 basis_type =
"AUX_FIT"
1637 IF (admm_env%do_gapw)
THEN
1638 task_list => admm_env%admm_gapw_env%task_list
1639 basis_type =
"AUX_FIT_SOFT"
1643 IF (admm_env%do_admmp)
THEN
1644 fadm = admm_env%gsi(ispin)**2
1645 ELSE IF (admm_env%do_admms)
THEN
1646 fadm = (admm_env%gsi(ispin))**(2.0_dp/3.0_dp)
1649 rho_ao => rho_ao_aux(ispin, :)
1650 ksmat => matrix_ks_aux_fit(ispin, :)
1652 CALL integrate_v_rspace(v_rspace=v_rspace_new_aux_fit(ispin), &
1656 calculate_forces=calculate_forces, &
1659 basis_type=basis_type, &
1660 task_list_external=task_list)
1664 DO img = 1, dft_control%nimages
1665 CALL dbcsr_add(matrix_ks_aux_fit_dft(ispin, img)%matrix, &
1666 matrix_ks_aux_fit(ispin, img)%matrix, 1.0_dp, -1.0_dp)
1669 CALL auxbas_pw_pool%give_back_pw(v_rspace_new_aux_fit(ispin))
1671 DEALLOCATE (v_rspace_new_aux_fit)
1674 IF (
ASSOCIATED(v_tau_rspace_aux_fit))
THEN
1675 DO ispin = 1, nspins
1676 CALL auxbas_pw_pool%give_back_pw(v_tau_rspace_aux_fit(ispin))
1678 DEALLOCATE (v_tau_rspace_aux_fit)
1682 IF (dft_control%apply_embed_pot)
DEALLOCATE (v_rspace_embed)
1684 CALL timestop(handle)
1706 REAL(kind=
dp) :: exc
1708 CHARACTER(*),
PARAMETER :: routinen =
'calculate_zmp_potential'
1710 INTEGER :: handle, my_val, nelectron, nspins
1711 INTEGER,
DIMENSION(2) :: nelectron_spin
1712 LOGICAL :: do_zmp_read, fermi_amaldi
1713 REAL(kind=
dp) :: lambda
1714 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_ext_r
1727 CALL timeset(routinen, handle)
1728 NULLIFY (auxbas_pw_pool)
1730 NULLIFY (poisson_env)
1731 NULLIFY (v_rspace_new)
1732 NULLIFY (dft_control)
1733 NULLIFY (rho_r, rho_g, tot_rho_ext_r, rho_ext_g)
1739 nelectron_spin=nelectron_spin, &
1740 dft_control=dft_control)
1742 auxbas_pw_pool=auxbas_pw_pool, &
1743 poisson_env=poisson_env)
1744 CALL qs_rho_get(rho, rho_r=rho_r, rho_g=rho_g)
1746 ALLOCATE (v_rspace_new(nspins))
1747 CALL auxbas_pw_pool%create_pw(pw=v_rspace_new(1))
1748 CALL auxbas_pw_pool%create_pw(pw=v_xc_rspace)
1751 do_zmp_read = dft_control%apply_external_vxc
1752 IF (do_zmp_read)
THEN
1753 CALL pw_copy(qs_env%external_vxc, v_rspace_new(1))
1755 v_rspace_new(1)%pw_grid%dvol
1758 REAL(kind=
dp) :: factor
1760 CALL auxbas_pw_pool%create_pw(pw=rho_eff_gspace)
1761 CALL auxbas_pw_pool%create_pw(pw=v_xc_gspace)
1768 tot_rho_r=tot_rho_ext_r)
1769 factor = tot_rho_ext_r(1)/factor
1771 CALL pw_axpy(rho_g(1), rho_eff_gspace, alpha=factor)
1772 CALL pw_axpy(rho_ext_g(1), rho_eff_gspace, alpha=-1.0_dp)
1778 CALL pw_scale(rho_eff_gspace, a=lambda)
1779 nelectron = nelectron_spin(1)
1780 factor = -1.0_dp/nelectron
1781 CALL pw_axpy(rho_g(1), rho_eff_gspace, alpha=factor)
1785 CALL pw_copy(v_rspace_new(1), v_xc_rspace)
1793 CALL auxbas_pw_pool%give_back_pw(rho_eff_gspace)
1794 CALL auxbas_pw_pool%give_back_pw(v_xc_gspace)
1798 CALL auxbas_pw_pool%give_back_pw(v_xc_rspace)
1800 CALL timestop(handle)
1815 TYPE(qs_environment_type),
POINTER :: qs_env
1816 TYPE(qs_rho_type),
POINTER :: rho
1817 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: v_rspace_embed
1818 TYPE(dft_control_type),
POINTER :: dft_control
1819 REAL(kind=dp) :: embed_corr
1820 LOGICAL :: just_energy
1822 CHARACTER(*),
PARAMETER :: routinen =
'get_embed_potential_energy'
1824 INTEGER :: handle, ispin
1825 REAL(kind=dp) :: embed_corr_local
1826 TYPE(pw_env_type),
POINTER :: pw_env
1827 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1828 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1830 CALL timeset(routinen, handle)
1832 NULLIFY (auxbas_pw_pool)
1835 CALL get_qs_env(qs_env=qs_env, &
1838 CALL pw_env_get(pw_env=pw_env, &
1839 auxbas_pw_pool=auxbas_pw_pool)
1840 CALL qs_rho_get(rho, rho_r=rho_r)
1841 ALLOCATE (v_rspace_embed(dft_control%nspins))
1845 DO ispin = 1, dft_control%nspins
1846 CALL auxbas_pw_pool%create_pw(pw=v_rspace_embed(ispin))
1847 CALL pw_zero(v_rspace_embed(ispin))
1849 CALL pw_copy(qs_env%embed_pot, v_rspace_embed(ispin))
1850 embed_corr_local = 0.0_dp
1853 IF (dft_control%nspins == 2)
THEN
1854 IF (ispin == 1)
CALL pw_axpy(qs_env%spin_embed_pot, v_rspace_embed(ispin), 1.0_dp)
1855 IF (ispin == 2)
CALL pw_axpy(qs_env%spin_embed_pot, v_rspace_embed(ispin), -1.0_dp)
1858 embed_corr_local = pw_integral_ab(v_rspace_embed(ispin), rho_r(ispin))
1860 embed_corr = embed_corr + embed_corr_local
1865 IF (just_energy)
THEN
1866 DO ispin = 1, dft_control%nspins
1867 CALL auxbas_pw_pool%give_back_pw(v_rspace_embed(ispin))
1869 DEALLOCATE (v_rspace_embed)
1872 CALL timestop(handle)
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_release_p(matrix)
...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
subroutine, public dbcsr_scale_by_vector(matrix, alpha, side)
Scales the rows/columns of given matrix.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Density Derived atomic point charges from a QM calculation (see Bloechl, J. Chem. Phys....
subroutine, public cp_ddapc_apply_cd(qs_env, rho_tot_gspace, energy, v_hartree_gspace, calculate_forces, itype_of_density)
Routine to couple/decouple periodic images with the Bloechl scheme.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
various routines to log and control the output. The idea is that decisions about where to log should ...
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...
Utilities for hfx and admm methods.
subroutine, public tddft_hfx_matrix(matrix_ks, rho_ao, qs_env, update_energy, recalc_integrals, external_hfx_sections, external_x_data, external_para_env)
Add the hfx contributions to the Hamiltonian.
Routines to calculate derivatives with respect to basis function origin.
subroutine, public derivatives_four_center(qs_env, rho_ao, rho_ao_resp, hfx_section, para_env, irep, use_virial, adiabatic_rescale_factor, resp_only, external_x_data, nspins)
computes four center derivatives for a full basis set and updates the forcesfock_4c arrays....
Types and set/get functions for HFX.
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Calculates integral matrices for LRIGPW method lri : local resolution of the identity.
subroutine, public v_int_ppl_update(qs_env, lri_v_int, calculate_forces)
...
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
Calculates forces for LRIGPW method lri : local resolution of the identity.
subroutine, public calculate_lri_forces(lri_env, lri_density, qs_env, pmatrix, atomic_kind_set)
calculates the lri forces
subroutine, public calculate_ri_forces(lri_env, lri_density, qs_env, pmatrix, atomic_kind_set)
calculates the ri forces
routines that build the Kohn-Sham matrix for the LRIGPW and xc parts
subroutine, public calculate_lri_ks_matrix(lri_env, lri_v_int, h_matrix, atomic_kind_set, cell_to_index)
update of LRIGPW KS matrix
subroutine, public calculate_ri_ks_matrix(lri_env, lri_v_int, h_matrix, s_matrix, atomic_kind_set, ispin)
update of RIGPW KS matrix
Interface to the message passing library MPI.
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
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 ...
Defines CDFT control structures.
container for information about total charges on the grids
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Integrate single or product functions over a potential on a RS grid.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
subroutine, public qmmm_modify_hartree_pot(v_hartree, v_qmmm, scale)
Modify the hartree potential in order to include the QM/MM correction.
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public print_densities(qs_env, rho)
...
subroutine, public get_embed_potential_energy(qs_env, rho, v_rspace_embed, dft_control, embed_corr, just_energy)
...
subroutine, public low_spin_roks(energy, qs_env, dft_control, do_hfx, just_energy, calculate_forces, auxbas_pw_pool)
do ROKS calculations yielding low spin states
subroutine, public sum_up_and_integrate(qs_env, ks_matrix, rho, my_rho, vppl_rspace, v_rspace_new, v_rspace_new_aux_fit, v_tau_rspace, v_tau_rspace_aux_fit, v_sic_rspace, v_spin_ddapc_rest_r, v_sccs_rspace, v_rspace_embed, cdft_control, calculate_forces)
Sum up all potentials defined on the grid and integrate.
subroutine, public print_detailed_energy(qs_env, dft_control, input, energy, mulliken_order_p)
Print detailed energies.
subroutine, public calculate_zmp_potential(qs_env, v_rspace_new, rho, exc)
Calculate the ZMP potential and energy as in Zhao, Morrison Parr PRA 50i, 2138 (1994) V_c^\lambda def...
subroutine, public calc_v_sic_rspace(v_sic_rspace, energy, qs_env, dft_control, rho, poisson_env, just_energy, calculate_forces, auxbas_pw_pool)
do sic calculations on the spin density
subroutine, public sic_explicit_orbitals(energy, qs_env, dft_control, poisson_env, just_energy, calculate_forces, auxbas_pw_pool)
do sic calculations on explicit orbitals
subroutine, public compute_matrix_vxc(qs_env, v_rspace, matrix_vxc)
compute matrix_vxc, defined via the potential created by qs_vxc_create ignores things like tau functi...
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.
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...
Exchange and Correlation functional calculations.
real(kind=dp) function, public xc_exc_calc(rho_r, rho_g, tau, xc_section, weights, pw_pool)
calculates just the exchange and correlation energy (no vxc)
subroutine, public xc_vxc_pw_create(vxc_rho, vxc_tau, exc, rho_r, rho_g, tau, xc_section, weights, pw_pool, compute_virial, virial_xc, exc_r)
Exchange and Correlation functional calculations.
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
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...
stores some data used in construction of Kohn-Sham matrix
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Container for information about total charges on the grids.
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.