817 SUBROUTINE response_force(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, &
818 matrix_hz, matrix_pz, matrix_pz_admm, matrix_wz, &
819 zehartree, zexc, zexc_aux_fit, rhopz_r, p_env, ex_env, debug)
822 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: vxc_rspace, vtau_rspace, vadmm_rspace
823 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz, matrix_pz, matrix_pz_admm, &
825 REAL(kind=
dp),
OPTIONAL :: zehartree, zexc, zexc_aux_fit
827 INTENT(INOUT),
OPTIONAL :: rhopz_r
830 LOGICAL,
INTENT(IN),
OPTIONAL :: debug
832 CHARACTER(LEN=*),
PARAMETER :: routinen =
'response_force'
834 CHARACTER(LEN=default_string_length) :: basis_type
835 INTEGER :: handle, iounit, ispin, mspin, myfun, &
836 n_rep_hf, nao, nao_aux, natom, nder, &
837 nimages, nocc, nspins
838 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
839 LOGICAL :: debug_forces, debug_stress, distribute_fock_matrix, do_ex, do_hfx, gapw, gapw_xc, &
840 hfx_treat_lsd_in_core, resp_only, s_mstruct_changed, use_virial
841 REAL(kind=
dp) :: eh1, ehartree, ekin_mol, eps_filter, &
842 eps_ppnl, exc, exc_aux_fit, fconv, &
843 focc, hartree_gs, hartree_t
844 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot1, ftot2, ftot3
845 REAL(kind=
dp),
DIMENSION(2) :: total_rho_gs, total_rho_t
846 REAL(kind=
dp),
DIMENSION(3) :: fodeb
847 REAL(kind=
dp),
DIMENSION(3, 3) :: h_stress, pv_loc, stdeb, sttot, sttot2
853 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ht, matrix_pd, matrix_pza, &
855 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_p, mhd, mhx, mhy, mhz, &
860 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
862 TYPE(
local_rho_type),
POINTER :: local_rho_set_f, local_rho_set_gs, &
863 local_rho_set_t, local_rho_set_vxc, &
868 POINTER :: sab_aux_fit, sab_orb, sac_ae, sac_ppl, &
872 TYPE(
pw_c1d_gs_type) :: rho_tot_gspace, rho_tot_gspace_gs, rho_tot_gspace_t, &
873 rhoz_tot_gspace, v_hartree_gspace_gs, v_hartree_gspace_t, zv_hartree_gspace
874 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g_aux, rho_g_gs, rho_g_t, rhoz_g, &
875 rhoz_g_aux, rhoz_g_xc
880 TYPE(
pw_r3d_rs_type) :: v_hartree_rspace_gs, v_hartree_rspace_t, &
881 vhxc_rspace, zv_hartree_rspace
882 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_aux, rho_r_gs, rho_r_t, rhoz_r, &
883 rhoz_r_aux, rhoz_r_xc, tau_r_aux, &
884 tauz_r, tauz_r_xc, v_xc, v_xc_tau
886 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
888 TYPE(
qs_rho_type),
POINTER :: rho, rho_aux_fit, rho_xc
893 CALL timeset(routinen, handle)
895 IF (
PRESENT(debug))
THEN
899 debug_forces = .false.
900 debug_stress = .false.
905 IF (logger%para_env%is_source())
THEN
912 IF (
PRESENT(ex_env)) do_ex = .true.
914 cpassert(
PRESENT(p_env))
917 NULLIFY (ks_env, sab_orb, sac_ae, sac_ppl, sap_ppnl, virial)
922 dft_control=dft_control, &
929 nspins = dft_control%nspins
930 gapw = dft_control%qs_control%gapw
931 gapw_xc = dft_control%qs_control%gapw_xc
933 IF (debug_forces)
THEN
934 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
935 ALLOCATE (ftot1(3, natom))
940 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
942 IF (use_virial .AND. do_ex)
THEN
943 CALL cp_abort(__location__,
"Stress Tensor not available for TDDFT calculations.")
946 fconv = 1.0e-9_dp*
pascal/cell%deth
947 IF (debug_stress .AND. use_virial)
THEN
948 sttot = virial%pv_virial
958 ALLOCATE (mpa(ispin)%matrix)
959 CALL dbcsr_create(mpa(ispin)%matrix, template=p_env%p1(ispin)%matrix)
960 CALL dbcsr_copy(mpa(ispin)%matrix, p_env%p1(ispin)%matrix)
961 CALL dbcsr_add(mpa(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix, 1.0_dp, 1.0_dp)
962 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
967 ALLOCATE (matrix_ht(ispin)%matrix)
968 CALL dbcsr_create(matrix_ht(ispin)%matrix, template=matrix_hz(ispin)%matrix)
969 CALL dbcsr_copy(matrix_ht(ispin)%matrix, matrix_hz(ispin)%matrix)
970 CALL dbcsr_set(matrix_ht(ispin)%matrix, 0.0_dp)
978 IF (nspins == 2)
THEN
979 CALL dbcsr_add(mpa(1)%matrix, mpa(2)%matrix, 1.0_dp, 1.0_dp)
985 IF (debug_forces) fodeb(1:3) = force(1)%kinetic(1:3, 1)
986 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ekinetic
988 matrix_name=
"KINETIC ENERGY MATRIX", &
990 sab_nl=sab_orb, calculate_forces=.true., &
991 matrix_p=mpa(1)%matrix)
992 IF (debug_forces)
THEN
993 fodeb(1:3) = force(1)%kinetic(1:3, 1) - fodeb(1:3)
994 CALL para_env%sum(fodeb)
995 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dT ", fodeb
997 IF (debug_stress .AND. use_virial)
THEN
998 stdeb = fconv*(virial%pv_ekinetic - stdeb)
999 CALL para_env%sum(stdeb)
1000 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1004 IF (nspins == 2)
THEN
1005 CALL dbcsr_add(mpa(1)%matrix, mpa(2)%matrix, 1.0_dp, -1.0_dp)
1010 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
1012 DO ispin = 1, nspins
1013 ALLOCATE (scrm(ispin)%matrix)
1014 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_s(1)%matrix)
1015 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_s(1)%matrix)
1016 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1019 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, &
1020 atomic_kind_set=atomic_kind_set)
1022 NULLIFY (cell_to_index)
1023 ALLOCATE (matrix_p(nspins, 1), matrix_h(nspins, 1))
1024 DO ispin = 1, nspins
1025 matrix_p(ispin, 1)%matrix => mpa(ispin)%matrix
1026 matrix_h(ispin, 1)%matrix => scrm(ispin)%matrix
1028 matrix_h(1, 1)%matrix => scrm(1)%matrix
1030 IF (
ASSOCIATED(sac_ae))
THEN
1032 IF (debug_forces) fodeb(1:3) = force(1)%all_potential(1:3, 1)
1033 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ppl
1034 CALL build_core_ae(matrix_h, matrix_p, force, virial, .true., use_virial, nder, &
1035 qs_kind_set, atomic_kind_set, particle_set, sab_orb, sac_ae, &
1036 nimages, cell_to_index)
1037 IF (debug_forces)
THEN
1038 fodeb(1:3) = force(1)%all_potential(1:3, 1) - fodeb(1:3)
1039 CALL para_env%sum(fodeb)
1040 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dHae ", fodeb
1042 IF (debug_stress .AND. use_virial)
THEN
1043 stdeb = fconv*(virial%pv_ppl - stdeb)
1044 CALL para_env%sum(stdeb)
1045 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1050 IF (
ASSOCIATED(sac_ppl))
THEN
1052 IF (debug_forces) fodeb(1:3) = force(1)%gth_ppl(1:3, 1)
1053 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ppl
1055 virial, .true., use_virial, nder, &
1056 qs_kind_set, atomic_kind_set, particle_set, &
1057 sab_orb, sac_ppl, nimages, cell_to_index,
"ORB")
1058 IF (debug_forces)
THEN
1059 fodeb(1:3) = force(1)%gth_ppl(1:3, 1) - fodeb(1:3)
1060 CALL para_env%sum(fodeb)
1061 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dHppl ", fodeb
1063 IF (debug_stress .AND. use_virial)
THEN
1064 stdeb = fconv*(virial%pv_ppl - stdeb)
1065 CALL para_env%sum(stdeb)
1066 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1070 eps_ppnl = dft_control%qs_control%eps_ppnl
1071 IF (
ASSOCIATED(sap_ppnl))
THEN
1073 IF (debug_forces) fodeb(1:3) = force(1)%gth_ppnl(1:3, 1)
1074 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ppnl
1076 virial, .true., use_virial, nder, &
1077 qs_kind_set, atomic_kind_set, particle_set, &
1078 sab_orb, sap_ppnl, eps_ppnl, nimages, cell_to_index,
"ORB")
1079 IF (debug_forces)
THEN
1080 fodeb(1:3) = force(1)%gth_ppnl(1:3, 1) - fodeb(1:3)
1081 CALL para_env%sum(fodeb)
1082 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dHppnl ", fodeb
1084 IF (debug_stress .AND. use_virial)
THEN
1085 stdeb = fconv*(virial%pv_ppnl - stdeb)
1086 CALL para_env%sum(stdeb)
1087 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1094 IF (dft_control%qs_control%do_kg)
THEN
1096 CALL get_qs_env(qs_env=qs_env, kg_env=kg_env, dbcsr_dist=dbcsr_dist)
1098 IF (use_virial)
THEN
1099 pv_loc = virial%pv_virial
1102 IF (debug_forces) fodeb(1:3) = force(1)%kinetic(1:3, 1)
1103 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1104 CALL build_tnadd_mat(kg_env=kg_env, matrix_p=matrix_p, force=force, virial=virial, &
1105 calculate_forces=.true., use_virial=use_virial, &
1106 qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set, &
1107 particle_set=particle_set, sab_orb=sab_orb, dbcsr_dist=dbcsr_dist)
1108 IF (debug_forces)
THEN
1109 fodeb(1:3) = force(1)%kinetic(1:3, 1) - fodeb(1:3)
1110 CALL para_env%sum(fodeb)
1111 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dTnadd ", fodeb
1113 IF (debug_stress .AND. use_virial)
THEN
1114 stdeb = fconv*(virial%pv_virial - stdeb)
1115 CALL para_env%sum(stdeb)
1116 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1121 IF (use_virial)
THEN
1122 virial%pv_ekinetic = virial%pv_ekinetic + (virial%pv_virial - pv_loc)
1128 DEALLOCATE (matrix_h)
1129 DEALLOCATE (matrix_p)
1137 DO ispin = 1, nspins
1138 ALLOCATE (scrm(ispin)%matrix)
1139 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_pz(1)%matrix)
1140 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_pz(ispin)%matrix)
1141 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1144 IF (debug_forces)
THEN
1145 ALLOCATE (ftot2(3, natom))
1147 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
1148 CALL para_env%sum(fodeb)
1149 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dHcore", fodeb
1151 IF (debug_stress .AND. use_virial)
THEN
1152 stdeb = fconv*(virial%pv_virial - sttot)
1153 CALL para_env%sum(stdeb)
1154 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1157 sttot2 = virial%pv_virial
1165 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
1167 IF (dft_control%do_admm)
THEN
1169 xc_section => admm_env%xc_section_primary
1176 IF (gapw .OR. gapw_xc)
THEN
1177 NULLIFY (oce, sab_orb)
1178 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab_orb)
1180 NULLIFY (local_rho_set_gs)
1185 qs_kind_set, dft_control, para_env)
1186 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1189 qs_kind_set, oce, sab_orb, para_env)
1192 NULLIFY (local_rho_set_t)
1195 qs_kind_set, dft_control, para_env)
1196 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1200 qs_kind_set, oce, sab_orb, para_env)
1204 ALLOCATE (rho_r_gs(nspins), rho_g_gs(nspins))
1205 DO ispin = 1, nspins
1206 CALL auxbas_pw_pool%create_pw(rho_r_gs(ispin))
1207 CALL auxbas_pw_pool%create_pw(rho_g_gs(ispin))
1209 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_gs)
1211 total_rho_gs = 0.0_dp
1212 CALL pw_zero(rho_tot_gspace_gs)
1213 DO ispin = 1, nspins
1215 rho=rho_r_gs(ispin), &
1216 rho_gspace=rho_g_gs(ispin), &
1217 soft_valid=(gapw .OR. gapw_xc), &
1218 total_rho=total_rho_gs(ispin))
1219 CALL pw_axpy(rho_g_gs(ispin), rho_tot_gspace_gs)
1224 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rho0_s_gs, rho_tot_gspace_gs)
1225 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1226 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
1227 CALL pw_axpy(rho_core, rho_tot_gspace_gs)
1230 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_gs)
1231 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_gs)
1232 NULLIFY (hartree_local_gs)
1235 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_gs, hartree_gs, v_hartree_gspace_gs)
1236 CALL pw_transfer(v_hartree_gspace_gs, v_hartree_rspace_gs)
1237 CALL pw_scale(v_hartree_rspace_gs, v_hartree_rspace_gs%pw_grid%dvol)
1244 cpassert(.NOT. use_virial)
1245 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1246 CALL vh_1c_gg_integrals(qs_env, hartree_gs, hartree_local_gs%ecoul_1c, local_rho_set_t, para_env, tddft=.true., &
1247 local_rho_set_2nd=local_rho_set_gs, core_2nd=.false.)
1250 local_rho_set=local_rho_set_t, local_rho_set_2nd=local_rho_set_gs)
1251 IF (debug_forces)
THEN
1252 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1253 CALL para_env%sum(fodeb)
1254 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVh[D^GS]PAWg0", fodeb
1257 IF (gapw .OR. gapw_xc)
THEN
1260 NULLIFY (local_rho_set_vxc)
1263 qs_kind_set, dft_control, para_env)
1265 qs_kind_set, oce, sab_orb, para_env)
1268 CALL calculate_vxc_atom(qs_env, .false., exc1=hartree_gs, xc_section_external=xc_section, &
1269 rho_atom_set_external=local_rho_set_vxc%rho_atom_set)
1273 CALL auxbas_pw_pool%create_pw(vhxc_rspace)
1277 IF (use_virial)
THEN
1278 pv_loc = virial%pv_virial
1281 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1282 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1283 IF (gapw .OR. gapw_xc)
THEN
1285 DO ispin = 1, nspins
1288 CALL pw_transfer(v_hartree_rspace_gs, vhxc_rspace)
1289 ELSEIF (gapw_xc)
THEN
1292 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1293 hmat=scrm(ispin), pmat=mpa(ispin), &
1294 qs_env=qs_env, gapw=gapw, &
1295 calculate_forces=.true.)
1298 DO ispin = 1, nspins
1300 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1301 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1302 hmat=scrm(ispin), pmat=mpa(ispin), &
1303 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1304 calculate_forces=.true.)
1308 DO ispin = 1, nspins
1310 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1311 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1312 hmat=scrm(ispin), pmat=mpa(ispin), &
1313 qs_env=qs_env, gapw=gapw, calculate_forces=.true.)
1317 IF (debug_forces)
THEN
1318 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1319 CALL para_env%sum(fodeb)
1320 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS] ", fodeb
1322 IF (debug_stress .AND. use_virial)
THEN
1323 stdeb = fconv*(virial%pv_virial - pv_loc)
1324 CALL para_env%sum(stdeb)
1325 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1329 IF (gapw .OR. gapw_xc)
THEN
1332 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1333 IF (gapw)
CALL update_ks_atom(qs_env, scrm, mpa, forces=.true., tddft=.false., &
1334 rho_atom_external=local_rho_set_gs%rho_atom_set)
1336 rho_atom_external=local_rho_set_vxc%rho_atom_set)
1337 IF (debug_forces)
THEN
1338 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1339 CALL para_env%sum(fodeb)
1340 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS]PAW ", fodeb
1349 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_gs)
1350 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_gs)
1352 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_gs)
1353 IF (
ASSOCIATED(rho_r_gs))
THEN
1354 DO ispin = 1, nspins
1355 CALL auxbas_pw_pool%give_back_pw(rho_r_gs(ispin))
1357 DEALLOCATE (rho_r_gs)
1359 IF (
ASSOCIATED(rho_g_gs))
THEN
1360 DO ispin = 1, nspins
1361 CALL auxbas_pw_pool%give_back_pw(rho_g_gs(ispin))
1363 DEALLOCATE (rho_g_gs)
1367 IF (
ASSOCIATED(vtau_rspace))
THEN
1368 cpassert(.NOT. (gapw .OR. gapw_xc))
1369 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1370 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1371 DO ispin = 1, nspins
1372 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
1373 hmat=scrm(ispin), pmat=mpa(ispin), &
1374 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1375 calculate_forces=.true., compute_tau=.true.)
1377 IF (debug_forces)
THEN
1378 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1379 CALL para_env%sum(fodeb)
1380 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVxc_tau ", fodeb
1382 IF (debug_stress .AND. use_virial)
THEN
1383 stdeb = fconv*(virial%pv_virial - pv_loc)
1384 CALL para_env%sum(stdeb)
1385 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1389 CALL auxbas_pw_pool%give_back_pw(vhxc_rspace)
1392 IF (use_virial)
THEN
1393 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1398 IF (dft_control%qs_control%do_kg)
THEN
1403 IF (use_virial)
THEN
1404 pv_loc = virial%pv_virial
1407 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1410 ekin_mol=ekin_mol, &
1411 calc_force=.true., &
1412 do_kernel=.false., &
1414 IF (debug_forces)
THEN
1415 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1416 CALL para_env%sum(fodeb)
1417 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVkg ", fodeb
1419 IF (debug_stress .AND. use_virial)
THEN
1422 stdeb = 1.0_dp*fconv*ekin_mol
1423 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1426 stdeb = fconv*(virial%pv_virial - pv_loc)
1427 CALL para_env%sum(stdeb)
1428 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1431 stdeb = fconv*virial%pv_xc
1432 CALL para_env%sum(stdeb)
1433 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1436 IF (use_virial)
THEN
1438 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1449 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
1450 DO ispin = 1, nspins
1451 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
1452 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
1454 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
1455 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
1456 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
1459 DO ispin = 1, nspins
1461 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
1463 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
1467 ALLOCATE (rhoz_r_xc(nspins), rhoz_g_xc(nspins))
1468 DO ispin = 1, nspins
1469 CALL auxbas_pw_pool%create_pw(rhoz_r_xc(ispin))
1470 CALL auxbas_pw_pool%create_pw(rhoz_g_xc(ispin))
1472 DO ispin = 1, nspins
1474 rho=rhoz_r_xc(ispin), rho_gspace=rhoz_g_xc(ispin), &
1479 IF (
ASSOCIATED(vtau_rspace))
THEN
1480 cpassert(.NOT. (gapw .OR. gapw_xc))
1483 ALLOCATE (tauz_r(nspins))
1484 CALL auxbas_pw_pool%create_pw(work_g)
1485 DO ispin = 1, nspins
1486 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
1488 rho=tauz_r(ispin), rho_gspace=work_g, &
1491 CALL auxbas_pw_pool%give_back_pw(work_g)
1496 IF (
PRESENT(rhopz_r))
THEN
1497 DO ispin = 1, nspins
1498 CALL pw_copy(rhoz_r(ispin), rhopz_r(ispin))
1505 IF (use_virial)
THEN
1508 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
1513 h_stress(:, :) = 0.0_dp
1521 density=rhoz_tot_gspace, &
1522 ehartree=ehartree, &
1523 vhartree=zv_hartree_gspace, &
1524 h_stress=h_stress, &
1525 aux_density=rho_tot_gspace)
1527 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1530 virial%pv_ehartree = virial%pv_ehartree + 2.0_dp*h_stress/real(para_env%num_pe,
dp)
1531 virial%pv_virial = virial%pv_virial + 2.0_dp*h_stress/real(para_env%num_pe,
dp)
1533 IF (debug_stress)
THEN
1534 stdeb = -1.0_dp*fconv*ehartree
1535 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1537 stdeb = -1.0_dp*fconv*ehartree
1538 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1540 stdeb = fconv*(h_stress/real(para_env%num_pe,
dp))
1541 CALL para_env%sum(stdeb)
1542 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1544 stdeb = fconv*(h_stress/real(para_env%num_pe,
dp))
1545 CALL para_env%sum(stdeb)
1546 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1553 DO ispin = 1, nspins
1555 vxc_rspace(ispin)%pw_grid%dvol
1557 IF (
ASSOCIATED(vtau_rspace))
THEN
1558 DO ispin = 1, nspins
1560 vtau_rspace(ispin)%pw_grid%dvol
1565 IF (dft_control%qs_control%do_kg)
THEN
1568 exc = exc - ekin_mol
1572 IF (debug_stress)
THEN
1573 stdeb = -1.0_dp*fconv*exc
1574 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1583 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rhoz_tot_gspace)
1585 CALL pw_poisson_solve(poisson_env, rhoz_tot_gspace, ehartree, zv_hartree_gspace)
1588 IF (gapw .OR. gapw_xc)
THEN
1592 IF (debug_forces) fodeb(1:3) = force(1)%rho_core(1:3, 1)
1593 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ehartree
1594 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
1595 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
1597 CALL integrate_v_core_rspace(zv_hartree_rspace, qs_env)
1598 IF (debug_forces)
THEN
1599 fodeb(1:3) = force(1)%rho_core(1:3, 1) - fodeb(1:3)
1600 CALL para_env%sum(fodeb)
1601 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(rhoz)*dncore ", fodeb
1603 IF (debug_stress .AND. use_virial)
THEN
1604 stdeb = fconv*(virial%pv_ehartree - stdeb)
1605 CALL para_env%sum(stdeb)
1606 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1612 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1616 IF (dft_control%do_admm)
THEN
1618 xc_section => admm_env%xc_section_primary
1623 IF (use_virial)
THEN
1624 virial%pv_xc = 0.0_dp
1627 NULLIFY (v_xc, v_xc_tau)
1630 rho=rho_xc, rho1_r=rhoz_r_xc, rho1_g=rhoz_g_xc, tau1_r=tauz_r_xc, &
1631 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1634 rho=rho, rho1_r=rhoz_r, rho1_g=rhoz_g, tau1_r=tauz_r, &
1635 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1638 IF (gapw .OR. gapw_xc)
THEN
1640 NULLIFY (local_rho_set_t)
1643 qs_kind_set, dft_control, para_env)
1644 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1648 qs_kind_set, oce, sab_orb, para_env)
1650 NULLIFY (local_rho_set_gs)
1653 qs_kind_set, dft_control, para_env)
1654 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1657 qs_kind_set, oce, sab_orb, para_env)
1660 ALLOCATE (rho_r_t(nspins), rho_g_t(nspins))
1661 DO ispin = 1, nspins
1662 CALL auxbas_pw_pool%create_pw(rho_r_t(ispin))
1663 CALL auxbas_pw_pool%create_pw(rho_g_t(ispin))
1665 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_t)
1666 total_rho_t = 0.0_dp
1667 CALL pw_zero(rho_tot_gspace_t)
1668 DO ispin = 1, nspins
1670 rho=rho_r_t(ispin), &
1671 rho_gspace=rho_g_t(ispin), &
1673 total_rho=total_rho_t(ispin))
1674 CALL pw_axpy(rho_g_t(ispin), rho_tot_gspace_t)
1678 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rho_tot_gspace_t)
1680 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_t)
1681 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_t)
1682 NULLIFY (hartree_local_t)
1685 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_t, hartree_t, v_hartree_gspace_t)
1686 CALL pw_transfer(v_hartree_gspace_t, v_hartree_rspace_t)
1687 CALL pw_scale(v_hartree_rspace_t, v_hartree_rspace_t%pw_grid%dvol)
1689 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1690 CALL vh_1c_gg_integrals(qs_env, hartree_t, hartree_local_t%ecoul_1c, local_rho_set_gs, para_env, tddft=.false., &
1691 local_rho_set_2nd=local_rho_set_t, core_2nd=.true.)
1693 local_rho_set=local_rho_set_gs, local_rho_set_2nd=local_rho_set_t)
1694 IF (debug_forces)
THEN
1695 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1696 CALL para_env%sum(fodeb)
1697 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(T)*dncore PAWg0", fodeb
1702 IF (gapw .OR. gapw_xc)
THEN
1706 NULLIFY (local_rho_set_f)
1709 qs_kind_set, dft_control, para_env)
1711 qs_kind_set, oce, sab_orb, para_env)
1715 local_rho_set_f%rho_atom_set, &
1716 qs_env, xc_section, para_env, &
1722 IF (use_virial)
THEN
1723 virial%pv_exc = virial%pv_exc + virial%pv_xc
1724 virial%pv_virial = virial%pv_virial + virial%pv_xc
1727 IF (debug_stress .AND. use_virial)
THEN
1728 stdeb = 1.0_dp*fconv*virial%pv_xc
1729 CALL para_env%sum(stdeb)
1730 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1735 IF (use_virial)
THEN
1736 pv_loc = virial%pv_virial
1741 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1743 DO ispin = 1, nspins
1744 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1746 IF ((.NOT. (gapw)) .AND. (.NOT. gapw_xc))
THEN
1747 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1748 DO ispin = 1, nspins
1749 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1750 CALL integrate_v_rspace(qs_env=qs_env, &
1751 v_rspace=v_xc(ispin), &
1752 hmat=matrix_hz(ispin), &
1753 pmat=matrix_p(ispin, 1), &
1755 calculate_forces=.true.)
1757 IF (debug_forces)
THEN
1758 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1759 CALL para_env%sum(fodeb)
1760 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1763 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1765 DO ispin = 1, nspins
1766 CALL integrate_v_rspace(qs_env=qs_env, &
1767 v_rspace=v_xc(ispin), &
1768 hmat=matrix_hz(ispin), &
1769 pmat=matrix_p(ispin, 1), &
1771 calculate_forces=.true.)
1775 DO ispin = 1, nspins
1778 CALL pw_axpy(v_hartree_rspace_t, v_xc(ispin))
1779 ELSEIF (gapw_xc)
THEN
1780 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1782 CALL integrate_v_rspace(qs_env=qs_env, &
1783 v_rspace=v_xc(ispin), &
1784 hmat=matrix_ht(ispin), &
1785 pmat=matrix_p(ispin, 1), &
1787 calculate_forces=.true.)
1789 IF (debug_forces)
THEN
1790 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1791 CALL para_env%sum(fodeb)
1792 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1796 IF (gapw .OR. gapw_xc)
THEN
1799 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1800 CALL update_ks_atom(qs_env, matrix_hz, matrix_p, forces=.true., tddft=.false., &
1801 rho_atom_external=local_rho_set_f%rho_atom_set)
1802 IF (debug_forces)
THEN
1803 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1804 CALL para_env%sum(fodeb)
1805 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKxc*(Dz+T) PAW", fodeb
1810 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1811 CALL update_ks_atom(qs_env, matrix_ht, matrix_p, forces=.true., tddft=.false., &
1812 rho_atom_external=local_rho_set_t%rho_atom_set)
1813 IF (debug_forces)
THEN
1814 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1815 CALL para_env%sum(fodeb)
1816 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKh*(Dz+T) PAW", fodeb
1820 DO ispin = 1, nspins
1821 CALL dbcsr_add(matrix_hz(ispin)%matrix, matrix_ht(ispin)%matrix, 1.0_dp, 1.0_dp)
1832 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_t)
1833 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_t)
1835 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_t)
1836 DO ispin = 1, nspins
1837 CALL auxbas_pw_pool%give_back_pw(rho_r_t(ispin))
1838 CALL auxbas_pw_pool%give_back_pw(rho_g_t(ispin))
1840 DEALLOCATE (rho_r_t, rho_g_t)
1843 IF (debug_stress .AND. use_virial)
THEN
1844 stdeb = fconv*(virial%pv_virial - stdeb)
1845 CALL para_env%sum(stdeb)
1846 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1850 IF (
ASSOCIATED(v_xc_tau))
THEN
1851 cpassert(.NOT. (gapw .OR. gapw_xc))
1852 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1853 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1854 DO ispin = 1, nspins
1855 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
1856 CALL integrate_v_rspace(qs_env=qs_env, &
1857 v_rspace=v_xc_tau(ispin), &
1858 hmat=matrix_hz(ispin), &
1859 pmat=matrix_p(ispin, 1), &
1860 compute_tau=.true., &
1861 gapw=(gapw .OR. gapw_xc), &
1862 calculate_forces=.true.)
1864 IF (debug_forces)
THEN
1865 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1866 CALL para_env%sum(fodeb)
1867 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKtau*tauz ", fodeb
1870 IF (debug_stress .AND. use_virial)
THEN
1871 stdeb = fconv*(virial%pv_virial - stdeb)
1872 CALL para_env%sum(stdeb)
1873 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1877 IF (use_virial)
THEN
1878 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1883 IF (dft_control%qs_control%do_kg)
THEN
1886 IF (use_virial)
THEN
1887 pv_loc = virial%pv_virial
1890 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1891 IF (use_virial) virial%pv_xc = 0.0_dp
1893 ks_matrix=matrix_hz, &
1894 ekin_mol=ekin_mol, &
1895 calc_force=.true., &
1899 IF (debug_forces)
THEN
1900 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1901 CALL para_env%sum(fodeb)
1902 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*d(Kkg)*rhoz ", fodeb
1904 IF (debug_stress .AND. use_virial)
THEN
1905 stdeb = fconv*(virial%pv_virial - pv_loc)
1906 CALL para_env%sum(stdeb)
1907 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1910 stdeb = fconv*(virial%pv_xc)
1911 CALL para_env%sum(stdeb)
1912 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1917 IF (use_virial)
THEN
1919 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1922 virial%pv_exc = virial%pv_exc - virial%pv_xc
1923 virial%pv_virial = virial%pv_virial - virial%pv_xc
1924 virial%pv_xc = 0.0_dp
1928 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
1929 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
1930 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
1931 DO ispin = 1, nspins
1932 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
1933 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
1934 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1936 DEALLOCATE (rhoz_r, rhoz_g, v_xc)
1938 DO ispin = 1, nspins
1939 CALL auxbas_pw_pool%give_back_pw(rhoz_r_xc(ispin))
1940 CALL auxbas_pw_pool%give_back_pw(rhoz_g_xc(ispin))
1942 DEALLOCATE (rhoz_r_xc, rhoz_g_xc)
1944 IF (
ASSOCIATED(v_xc_tau))
THEN
1945 DO ispin = 1, nspins
1946 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
1947 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1949 DEALLOCATE (tauz_r, v_xc_tau)
1951 IF (debug_forces)
THEN
1952 ALLOCATE (ftot3(3, natom))
1954 fodeb(1:3) = ftot3(1:3, 1) - ftot2(1:3, 1)
1955 CALL para_env%sum(fodeb)
1956 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*V(rhoz)", fodeb
1965 IF (dft_control%do_admm)
THEN
1967 exc_aux_fit = 0.0_dp
1971 NULLIFY (mpz, mhz, mhx, mhy)
1975 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=scrm, &
1976 task_list_aux_fit=task_list_aux_fit)
1978 NULLIFY (mpz, mhz, mhx, mhy)
1982 DO ispin = 1, nspins
1983 ALLOCATE (mhx(ispin, 1)%matrix)
1984 CALL dbcsr_create(mhx(ispin, 1)%matrix, template=scrm(1)%matrix)
1985 CALL dbcsr_copy(mhx(ispin, 1)%matrix, scrm(1)%matrix)
1986 CALL dbcsr_set(mhx(ispin, 1)%matrix, 0.0_dp)
1987 ALLOCATE (mhy(ispin, 1)%matrix)
1988 CALL dbcsr_create(mhy(ispin, 1)%matrix, template=scrm(1)%matrix)
1989 CALL dbcsr_copy(mhy(ispin, 1)%matrix, scrm(1)%matrix)
1990 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
1991 ALLOCATE (mpz(ispin, 1)%matrix)
1993 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=p_env%p1_admm(ispin)%matrix)
1994 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
1995 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
1998 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=matrix_pz_admm(ispin)%matrix)
1999 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2003 xc_section => admm_env%xc_section_aux
2006 IF (use_virial)
THEN
2007 pv_loc = virial%pv_virial
2010 basis_type =
"AUX_FIT"
2011 task_list => task_list_aux_fit
2012 IF (admm_env%do_gapw)
THEN
2013 basis_type =
"AUX_FIT_SOFT"
2014 task_list => admm_env%admm_gapw_env%task_list
2017 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2018 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2019 DO ispin = 1, nspins
2020 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
2021 hmat=mhx(ispin, 1), pmat=mpz(ispin, 1), &
2022 qs_env=qs_env, calculate_forces=.true., &
2023 basis_type=basis_type, task_list_external=task_list)
2025 IF (debug_forces)
THEN
2026 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2027 CALL para_env%sum(fodeb)
2028 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)", fodeb
2030 IF (debug_stress .AND. use_virial)
THEN
2031 stdeb = fconv*(virial%pv_virial - pv_loc)
2032 CALL para_env%sum(stdeb)
2033 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2037 IF (use_virial)
THEN
2038 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2041 IF (admm_env%do_gapw)
THEN
2043 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2044 CALL update_ks_atom(qs_env, mhx(:, 1), mpz(:, 1), forces=.true., tddft=.false., &
2045 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
2046 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2047 oce_external=admm_env%admm_gapw_env%oce, &
2048 sab_external=sab_aux_fit)
2049 IF (debug_forces)
THEN
2050 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2051 CALL para_env%sum(fodeb)
2052 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)PAW", fodeb
2056 NULLIFY (rho_g_aux, rho_r_aux, tau_r_aux)
2057 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux, tau_r=tau_r_aux)
2059 NULLIFY (rhoz_g_aux, rhoz_r_aux)
2060 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
2061 DO ispin = 1, nspins
2062 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
2063 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
2065 DO ispin = 1, nspins
2067 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
2068 basis_type=basis_type, task_list_external=task_list)
2072 IF (use_virial)
THEN
2076 DO ispin = 1, nspins
2077 exc_aux_fit = exc_aux_fit +
pw_integral_ab(rhoz_r_aux(ispin), vadmm_rspace(ispin))/ &
2078 vadmm_rspace(ispin)%pw_grid%dvol
2081 IF (debug_stress)
THEN
2082 stdeb = -1.0_dp*fconv*exc_aux_fit
2083 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T43,2(1X,ES19.11))") &
2091 IF (use_virial) virial%pv_xc = 0.0_dp
2097 rho1_r=rhoz_r_aux, &
2098 rho1_g=rhoz_g_aux, &
2100 xc_section=xc_section, &
2101 compute_virial=use_virial, &
2102 virial_xc=virial%pv_xc)
2105 IF (use_virial)
THEN
2106 virial%pv_exc = virial%pv_exc + virial%pv_xc
2107 virial%pv_virial = virial%pv_virial + virial%pv_xc
2110 IF (debug_stress .AND. use_virial)
THEN
2111 stdeb = 1.0_dp*fconv*virial%pv_xc
2112 CALL para_env%sum(stdeb)
2113 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2117 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2119 IF (use_virial)
THEN
2120 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2122 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2123 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2124 DO ispin = 1, nspins
2125 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
2126 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2127 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
2128 hmat=mhy(ispin, 1), pmat=matrix_p(ispin, 1), &
2129 calculate_forces=.true., &
2130 basis_type=basis_type, task_list_external=task_list)
2132 IF (debug_forces)
THEN
2133 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2134 CALL para_env%sum(fodeb)
2135 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm ", fodeb
2137 IF (debug_stress .AND. use_virial)
THEN
2138 stdeb = fconv*(virial%pv_virial - pv_loc)
2139 CALL para_env%sum(stdeb)
2140 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2144 IF (use_virial)
THEN
2145 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2147 DO ispin = 1, nspins
2148 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2149 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
2150 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
2152 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
2154 IF (admm_env%do_gapw)
THEN
2157 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
2159 admm_env%admm_gapw_env%admm_kind_set, &
2160 admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
2162 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2165 local_rhoz_set_admm%rho_atom_set, &
2166 qs_env, xc_section, para_env, do_triplet=.false., &
2167 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2169 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2170 CALL update_ks_atom(qs_env, mhy(:, 1), matrix_p(:, 1), forces=.true., tddft=.false., &
2171 rho_atom_external=local_rhoz_set_admm%rho_atom_set, &
2172 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2173 oce_external=admm_env%admm_gapw_env%oce, &
2174 sab_external=sab_aux_fit)
2175 IF (debug_forces)
THEN
2176 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2177 CALL para_env%sum(fodeb)
2178 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm[PAW] ", fodeb
2183 nao = admm_env%nao_orb
2184 nao_aux = admm_env%nao_aux_fit
2186 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2187 DO ispin = 1, nspins
2189 admm_env%work_aux_orb, nao)
2191 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2192 admm_env%work_orb_orb)
2193 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2196 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2213 cpassert(n_rep_hf == 1)
2217 IF (hfx_treat_lsd_in_core) mspin = nspins
2218 IF (use_virial) virial%pv_fock_4c = 0.0_dp
2220 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, &
2221 s_mstruct_changed=s_mstruct_changed)
2222 distribute_fock_matrix = .true.
2227 IF (dft_control%do_admm)
THEN
2228 CALL get_qs_env(qs_env=qs_env, admm_env=admm_env)
2229 CALL get_admm_env(admm_env, matrix_s_aux_fit=scrm, rho_aux_fit=rho_aux_fit)
2230 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2231 NULLIFY (mpz, mhz, mpd, mhd)
2236 DO ispin = 1, nspins
2237 ALLOCATE (mhz(ispin, 1)%matrix, mhd(ispin, 1)%matrix)
2238 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=scrm(1)%matrix)
2239 CALL dbcsr_create(mhd(ispin, 1)%matrix, template=scrm(1)%matrix)
2240 CALL dbcsr_copy(mhz(ispin, 1)%matrix, scrm(1)%matrix)
2241 CALL dbcsr_copy(mhd(ispin, 1)%matrix, scrm(1)%matrix)
2242 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
2243 CALL dbcsr_set(mhd(ispin, 1)%matrix, 0.0_dp)
2244 ALLOCATE (mpz(ispin, 1)%matrix)
2246 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2247 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
2248 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2251 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2252 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2254 mpd(ispin, 1)%matrix => matrix_p(ispin, 1)%matrix
2257 IF (x_data(1, 1)%do_hfx_ri)
THEN
2260 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2261 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2262 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2265 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhd, eh1, rho_ao=mpd, &
2266 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2267 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2273 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2279 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2285 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
2286 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
2287 nao = admm_env%nao_orb
2288 nao_aux = admm_env%nao_aux_fit
2290 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2291 DO ispin = 1, nspins
2293 admm_env%work_aux_orb, nao)
2295 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2296 admm_env%work_orb_orb)
2297 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2300 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2305 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
2306 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2307 DO ispin = 1, nspins
2308 CALL dbcsr_add(mhd(ispin, 1)%matrix, mhx(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2309 CALL dbcsr_add(mhz(ispin, 1)%matrix, mhy(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2315 IF (debug_forces)
THEN
2316 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
2317 CALL para_env%sum(fodeb)
2318 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx*S' ", fodeb
2323 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2332 ALLOCATE (mpz(nspins, 1), mhz(nspins, 1))
2333 DO ispin = 1, nspins
2334 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
2335 mpz(ispin, 1)%matrix => mpa(ispin)%matrix
2338 IF (x_data(1, 1)%do_hfx_ri)
THEN
2341 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2342 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2343 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2348 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2352 DEALLOCATE (mhz, mpz)
2360 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
2361 IF (dft_control%do_admm)
THEN
2365 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2366 NULLIFY (matrix_pza)
2368 DO ispin = 1, nspins
2369 ALLOCATE (matrix_pza(ispin)%matrix)
2371 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=p_env%p1_admm(ispin)%matrix)
2372 CALL dbcsr_copy(matrix_pza(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
2373 CALL dbcsr_add(matrix_pza(ispin)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2376 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=matrix_pz_admm(ispin)%matrix)
2377 CALL dbcsr_copy(matrix_pza(ispin)%matrix, matrix_pz_admm(ispin)%matrix)
2380 IF (x_data(1, 1)%do_hfx_ri)
THEN
2383 x_data(1, 1)%general_parameter%fraction, &
2384 rho_ao=matrix_p, rho_ao_resp=matrix_pza, &
2385 use_virial=use_virial, resp_only=resp_only)
2388 1, use_virial, resp_only=resp_only)
2396 IF (x_data(1, 1)%do_hfx_ri)
THEN
2399 x_data(1, 1)%general_parameter%fraction, &
2400 rho_ao=matrix_p, rho_ao_resp=mpa, &
2401 use_virial=use_virial, resp_only=resp_only)
2404 1, use_virial, resp_only=resp_only)
2408 IF (use_virial)
THEN
2409 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
2410 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
2411 virial%pv_calculate = .false.
2414 IF (debug_forces)
THEN
2415 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
2416 CALL para_env%sum(fodeb)
2417 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx ", fodeb
2419 IF (debug_stress .AND. use_virial)
THEN
2420 stdeb = -1.0_dp*fconv*virial%pv_fock_4c
2421 CALL para_env%sum(stdeb)
2422 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2429 IF (use_virial)
THEN
2431 zehartree = zehartree + 2.0_dp*ehartree
2434 IF (dft_control%do_admm)
THEN
2435 zexc_aux_fit = zexc_aux_fit + exc_aux_fit
2442 IF (dft_control%qs_control%do_ls_scf)
THEN
2444 eps_filter = dft_control%qs_control%eps_filter_matrix
2445 CALL calculate_whz_ao_matrix(qs_env, matrix_hz, matrix_wz, eps_filter)
2448 matrix_wz => p_env%w1
2451 IF (nspins == 1) focc = 2.0_dp
2453 DO ispin = 1, nspins
2454 CALL get_mo_set(mo_set=mos(ispin), homo=nocc)
2456 matrix_wz(ispin)%matrix, focc, nocc)
2459 IF (nspins == 2)
THEN
2460 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2461 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
2464 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
2465 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
2468 matrix_name=
"OVERLAP MATRIX", &
2469 basis_type_a=
"ORB", basis_type_b=
"ORB", &
2470 sab_nl=sab_orb, calculate_forces=.true., &
2471 matrix_p=matrix_wz(1)%matrix)
2473 IF (
SIZE(matrix_wz, 1) == 2)
THEN
2474 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2475 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
2478 IF (debug_forces)
THEN
2479 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
2480 CALL para_env%sum(fodeb)
2481 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wz*dS ", fodeb
2483 IF (debug_stress .AND. use_virial)
THEN
2484 stdeb = fconv*(virial%pv_overlap - stdeb)
2485 CALL para_env%sum(stdeb)
2486 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2491 IF (debug_forces)
THEN
2493 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
2494 CALL para_env%sum(fodeb)
2495 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Response Force", fodeb
2496 fodeb(1:3) = ftot2(1:3, 1)
2497 CALL para_env%sum(fodeb)
2498 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Total Force ", fodeb
2499 DEALLOCATE (ftot1, ftot2, ftot3)
2501 IF (debug_stress .AND. use_virial)
THEN
2502 stdeb = fconv*(virial%pv_virial - sttot)
2503 CALL para_env%sum(stdeb)
2504 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2513 CALL timestop(handle)