850 SUBROUTINE response_force(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, &
851 vadmm_tau_rspace, matrix_hz, matrix_pz, matrix_pz_admm, matrix_wz, &
852 zehartree, zexc, zexc_aux_fit, rhopz_r, p_env, ex_env, debug)
855 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: vxc_rspace, vtau_rspace, vadmm_rspace, &
857 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz, matrix_pz, matrix_pz_admm, &
859 REAL(kind=
dp),
OPTIONAL :: zehartree, zexc, zexc_aux_fit
861 INTENT(INOUT),
OPTIONAL :: rhopz_r
864 LOGICAL,
INTENT(IN),
OPTIONAL :: debug
866 CHARACTER(LEN=*),
PARAMETER :: routinen =
'response_force'
868 CHARACTER(LEN=default_string_length) :: basis_type, unitstr
869 INTEGER :: handle, iounit, ispin, mspin, myfun, &
870 n_rep_hf, nao, nao_aux, natom, nder, &
872 LOGICAL :: debug_forces, debug_stress, distribute_fock_matrix, do_ex, do_hfx, do_onecenter, &
873 gapw, gapw_xc, hfx_treat_lsd_in_core, needs_tau_response, needs_tau_response_aux, &
874 resp_only, s_mstruct_changed, use_virial
875 REAL(kind=
dp) :: eh1, ehartree, ekin_mol, eps_filter, &
876 exc, exc_aux_fit, fconv, focc, &
877 hartree_gs, hartree_t
878 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot1, ftot2, ftot3
879 REAL(kind=
dp),
DIMENSION(2) :: total_rho_gs, total_rho_t
880 REAL(kind=
dp),
DIMENSION(3) :: fodeb
881 REAL(kind=
dp),
DIMENSION(3, 3) :: h_stress, pv_loc, stdeb, sttot, sttot2
887 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ht, matrix_pd, matrix_pza, &
889 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_p, mhd, mhx, mhy, mhz, &
890 mpa2, mpd, mpz, scrm2
894 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
896 TYPE(
local_rho_type),
POINTER :: local_rho_set_f, local_rho_set_gs, &
897 local_rho_set_t, local_rho_set_vxc, &
902 POINTER :: sab_aux_fit, sab_orb
905 TYPE(
pw_c1d_gs_type) :: rho_tot_gspace, rho_tot_gspace_gs, rho_tot_gspace_t, &
906 rhoz_tot_gspace, v_hartree_gspace_gs, v_hartree_gspace_t, zv_hartree_gspace
907 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g_gs, rho_g_t, rhoz_g, rhoz_g_aux, &
913 TYPE(
pw_r3d_rs_type) :: v_hartree_rspace_gs, v_hartree_rspace_t, &
914 vhxc_rspace, zv_hartree_rspace
915 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_gs, rho_r_t, rhoz_r, rhoz_r_aux, &
916 rhoz_r_xc, rhoz_tau_r_aux, tauz_r, &
917 tauz_r_xc, v_xc, v_xc_tau
919 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: kind_set, qs_kind_set
921 TYPE(
qs_rho_type),
POINTER :: rho, rho0, rho1, rho_aux_fit, rho_xc
922 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho0_atom_set, rho1_atom_set
928 CALL timeset(routinen, handle)
930 IF (
PRESENT(debug))
THEN
934 debug_forces = .false.
935 debug_stress = .false.
939 IF (logger%para_env%is_source())
THEN
946 IF (
PRESENT(ex_env)) do_ex = .true.
948 cpassert(
PRESENT(p_env))
951 NULLIFY (ks_env, sab_orb, virial)
956 dft_control=dft_control, &
960 nspins = dft_control%nspins
961 gapw = dft_control%qs_control%gapw
962 gapw_xc = dft_control%qs_control%gapw_xc
964 IF (debug_forces)
THEN
965 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
966 ALLOCATE (ftot1(3, natom))
971 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
973 IF (use_virial .AND. do_ex)
THEN
974 CALL cp_abort(__location__,
"Stress Tensor not available for TDDFT calculations.")
977 fconv = 1.0e-9_dp*
pascal/cell%deth
978 IF (debug_stress .AND. use_virial)
THEN
979 sttot = virial%pv_virial
989 ALLOCATE (mpa(ispin)%matrix)
990 CALL dbcsr_create(mpa(ispin)%matrix, template=p_env%p1(ispin)%matrix)
991 CALL dbcsr_copy(mpa(ispin)%matrix, p_env%p1(ispin)%matrix)
992 CALL dbcsr_add(mpa(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix, 1.0_dp, 1.0_dp)
993 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
999 IF (do_ex .OR. (gapw .OR. gapw_xc))
THEN
1001 DO ispin = 1, nspins
1002 ALLOCATE (matrix_ht(ispin)%matrix)
1003 CALL dbcsr_create(matrix_ht(ispin)%matrix, template=matrix_hz(ispin)%matrix)
1004 CALL dbcsr_copy(matrix_ht(ispin)%matrix, matrix_hz(ispin)%matrix)
1005 CALL dbcsr_set(matrix_ht(ispin)%matrix, 0.0_dp)
1014 mpa2(1:nspins, 1:1) => mpa(1:nspins)
1016 matrix_name=
"KINETIC ENERGY MATRIX", &
1018 sab_orb=sab_orb, calculate_forces=.true., &
1019 debug_forces=debug_forces, debug_stress=debug_stress)
1023 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
1026 DO ispin = 1, nspins
1027 ALLOCATE (scrm(ispin)%matrix)
1028 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_s(1)%matrix)
1029 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_s(1)%matrix)
1030 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1033 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, &
1034 atomic_kind_set=atomic_kind_set)
1036 ALLOCATE (matrix_p(nspins, 1), matrix_h(nspins, 1))
1037 DO ispin = 1, nspins
1038 matrix_p(ispin, 1)%matrix => mpa(ispin)%matrix
1039 matrix_h(ispin, 1)%matrix => scrm(ispin)%matrix
1041 matrix_h(1, 1)%matrix => scrm(1)%matrix
1044 CALL core_matrices(qs_env, matrix_h, matrix_p, .true., nder, &
1045 debug_forces=debug_forces, debug_stress=debug_stress)
1049 IF (dft_control%qs_control%do_kg)
THEN
1051 CALL get_qs_env(qs_env=qs_env, kg_env=kg_env, dbcsr_dist=dbcsr_dist)
1053 IF (use_virial)
THEN
1054 pv_loc = virial%pv_virial
1057 IF (debug_forces) fodeb(1:3) = force(1)%kinetic(1:3, 1)
1058 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1059 CALL build_tnadd_mat(kg_env=kg_env, matrix_p=matrix_p, force=force, virial=virial, &
1060 calculate_forces=.true., use_virial=use_virial, &
1061 qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set, &
1062 particle_set=particle_set, sab_orb=sab_orb, dbcsr_dist=dbcsr_dist)
1063 IF (debug_forces)
THEN
1064 fodeb(1:3) = force(1)%kinetic(1:3, 1) - fodeb(1:3)
1065 CALL para_env%sum(fodeb)
1066 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dTnadd ", fodeb
1068 IF (debug_stress .AND. use_virial)
THEN
1069 stdeb = fconv*(virial%pv_virial - stdeb)
1070 CALL para_env%sum(stdeb)
1071 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1076 IF (use_virial)
THEN
1077 virial%pv_ekinetic = virial%pv_ekinetic + (virial%pv_virial - pv_loc)
1083 DEALLOCATE (matrix_h)
1084 DEALLOCATE (matrix_p)
1092 DO ispin = 1, nspins
1093 ALLOCATE (scrm(ispin)%matrix)
1094 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_pz(1)%matrix)
1095 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_pz(ispin)%matrix)
1096 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1099 IF (debug_forces)
THEN
1100 ALLOCATE (ftot2(3, natom))
1102 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
1103 CALL para_env%sum(fodeb)
1104 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dHcore", fodeb
1106 IF (debug_stress .AND. use_virial)
THEN
1107 stdeb = fconv*(virial%pv_virial - sttot)
1108 CALL para_env%sum(stdeb)
1109 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1112 sttot2 = virial%pv_virial
1120 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
1122 IF (dft_control%do_admm)
THEN
1124 xc_section => admm_env%xc_section_primary
1131 needs_tau_response = needs%tau .OR. needs%tau_spin
1133 IF (gapw .OR. gapw_xc)
THEN
1134 NULLIFY (oce, sab_orb)
1135 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab_orb)
1137 NULLIFY (local_rho_set_gs)
1142 qs_kind_set, dft_control, para_env)
1143 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1146 qs_kind_set, oce, sab_orb, para_env)
1149 NULLIFY (local_rho_set_t)
1152 qs_kind_set, dft_control, para_env)
1153 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1157 qs_kind_set, oce, sab_orb, para_env)
1161 ALLOCATE (rho_r_gs(nspins), rho_g_gs(nspins))
1162 DO ispin = 1, nspins
1163 CALL auxbas_pw_pool%create_pw(rho_r_gs(ispin))
1164 CALL auxbas_pw_pool%create_pw(rho_g_gs(ispin))
1166 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_gs)
1168 total_rho_gs = 0.0_dp
1169 CALL pw_zero(rho_tot_gspace_gs)
1170 DO ispin = 1, nspins
1172 rho=rho_r_gs(ispin), &
1173 rho_gspace=rho_g_gs(ispin), &
1174 soft_valid=(gapw .OR. gapw_xc), &
1175 total_rho=total_rho_gs(ispin))
1176 CALL pw_axpy(rho_g_gs(ispin), rho_tot_gspace_gs)
1181 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rho0_s_gs, rho_tot_gspace_gs)
1182 IF (
ASSOCIATED(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs))
THEN
1183 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_gs)
1185 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1186 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
1187 CALL pw_axpy(rho_core, rho_tot_gspace_gs)
1190 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_gs)
1191 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_gs)
1192 NULLIFY (hartree_local_gs)
1195 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_gs, hartree_gs, v_hartree_gspace_gs)
1196 CALL pw_transfer(v_hartree_gspace_gs, v_hartree_rspace_gs)
1197 CALL pw_scale(v_hartree_rspace_gs, v_hartree_rspace_gs%pw_grid%dvol)
1203 cpassert(.NOT. use_virial)
1204 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1205 CALL vh_1c_gg_integrals(qs_env, hartree_gs, hartree_local_gs%ecoul_1c, local_rho_set_t, para_env, tddft=.true., &
1206 local_rho_set_2nd=local_rho_set_gs, core_2nd=.false.)
1209 local_rho_set=local_rho_set_t, local_rho_set_2nd=local_rho_set_gs)
1210 IF (debug_forces)
THEN
1211 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1212 CALL para_env%sum(fodeb)
1213 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVh[D^GS]PAWg0", fodeb
1216 IF (gapw .OR. gapw_xc)
THEN
1219 NULLIFY (local_rho_set_vxc)
1222 qs_kind_set, dft_control, para_env)
1224 qs_kind_set, oce, sab_orb, para_env)
1227 CALL calculate_vxc_atom(qs_env, .false., exc1=hartree_gs, xc_section_external=xc_section, &
1228 rho_atom_set_external=local_rho_set_vxc%rho_atom_set)
1232 CALL auxbas_pw_pool%create_pw(vhxc_rspace)
1236 IF (use_virial)
THEN
1237 pv_loc = virial%pv_virial
1240 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1241 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1242 IF (gapw .OR. gapw_xc)
THEN
1244 DO ispin = 1, nspins
1247 CALL pw_transfer(v_hartree_rspace_gs, vhxc_rspace)
1248 ELSE IF (gapw_xc)
THEN
1251 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1252 hmat=scrm(ispin), pmat=mpa(ispin), &
1253 qs_env=qs_env, gapw=gapw, &
1254 calculate_forces=.true.)
1257 DO ispin = 1, nspins
1259 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1260 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1261 hmat=scrm(ispin), pmat=mpa(ispin), &
1262 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1263 calculate_forces=.true.)
1267 DO ispin = 1, nspins
1269 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1270 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1271 hmat=scrm(ispin), pmat=mpa(ispin), &
1272 qs_env=qs_env, gapw=gapw, calculate_forces=.true.)
1276 IF (debug_forces)
THEN
1277 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1278 CALL para_env%sum(fodeb)
1279 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS] ", fodeb
1281 IF (debug_stress .AND. use_virial)
THEN
1282 stdeb = fconv*(virial%pv_virial - pv_loc)
1283 CALL para_env%sum(stdeb)
1284 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1288 IF (gapw .OR. gapw_xc)
THEN
1290 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1291 IF (gapw)
CALL update_ks_atom(qs_env, scrm, mpa, forces=.true., tddft=.false., &
1292 rho_atom_external=local_rho_set_gs%rho_atom_set)
1294 rho_atom_external=local_rho_set_vxc%rho_atom_set)
1295 IF (debug_forces)
THEN
1296 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1297 CALL para_env%sum(fodeb)
1298 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS]PAW ", fodeb
1307 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_gs)
1308 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_gs)
1310 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_gs)
1311 IF (
ASSOCIATED(rho_r_gs))
THEN
1312 DO ispin = 1, nspins
1313 CALL auxbas_pw_pool%give_back_pw(rho_r_gs(ispin))
1315 DEALLOCATE (rho_r_gs)
1317 IF (
ASSOCIATED(rho_g_gs))
THEN
1318 DO ispin = 1, nspins
1319 CALL auxbas_pw_pool%give_back_pw(rho_g_gs(ispin))
1321 DEALLOCATE (rho_g_gs)
1325 IF (
ASSOCIATED(vtau_rspace))
THEN
1326 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1327 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1328 DO ispin = 1, nspins
1329 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
1330 hmat=scrm(ispin), pmat=mpa(ispin), &
1331 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1332 calculate_forces=.true., compute_tau=.true.)
1334 IF (debug_forces)
THEN
1335 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1336 CALL para_env%sum(fodeb)
1337 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVxc_tau ", fodeb
1339 IF (debug_stress .AND. use_virial)
THEN
1340 stdeb = fconv*(virial%pv_virial - pv_loc)
1341 CALL para_env%sum(stdeb)
1342 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1346 CALL auxbas_pw_pool%give_back_pw(vhxc_rspace)
1349 IF (use_virial)
THEN
1350 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1355 IF (dft_control%qs_control%do_kg)
THEN
1360 IF (use_virial)
THEN
1361 pv_loc = virial%pv_virial
1364 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1367 ekin_mol=ekin_mol, &
1368 calc_force=.true., &
1369 do_kernel=.false., &
1371 IF (debug_forces)
THEN
1372 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1373 CALL para_env%sum(fodeb)
1374 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVkg ", fodeb
1376 IF (debug_stress .AND. use_virial)
THEN
1379 stdeb = 1.0_dp*fconv*ekin_mol
1380 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
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))") &
1388 stdeb = fconv*virial%pv_xc
1389 CALL para_env%sum(stdeb)
1390 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1393 IF (use_virial)
THEN
1395 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1406 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
1407 DO ispin = 1, nspins
1408 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
1409 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
1411 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
1412 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
1413 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
1416 DO ispin = 1, nspins
1418 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
1420 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
1422 NULLIFY (tauz_r, tauz_r_xc)
1424 ALLOCATE (rhoz_r_xc(nspins), rhoz_g_xc(nspins))
1425 DO ispin = 1, nspins
1426 CALL auxbas_pw_pool%create_pw(rhoz_r_xc(ispin))
1427 CALL auxbas_pw_pool%create_pw(rhoz_g_xc(ispin))
1429 DO ispin = 1, nspins
1431 rho=rhoz_r_xc(ispin), rho_gspace=rhoz_g_xc(ispin), &
1436 IF (needs_tau_response)
THEN
1439 ALLOCATE (tauz_r(nspins))
1440 CALL auxbas_pw_pool%create_pw(work_g)
1441 DO ispin = 1, nspins
1442 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
1444 rho=tauz_r(ispin), rho_gspace=work_g, &
1445 soft_valid=gapw, compute_tau=.true.)
1447 CALL auxbas_pw_pool%give_back_pw(work_g)
1452 ALLOCATE (tauz_r_xc(nspins))
1453 CALL auxbas_pw_pool%create_pw(work_g)
1454 DO ispin = 1, nspins
1455 CALL auxbas_pw_pool%create_pw(tauz_r_xc(ispin))
1457 rho=tauz_r_xc(ispin), rho_gspace=work_g, &
1458 soft_valid=gapw_xc, compute_tau=.true.)
1460 CALL auxbas_pw_pool%give_back_pw(work_g)
1466 IF (
PRESENT(rhopz_r))
THEN
1467 DO ispin = 1, nspins
1468 CALL pw_copy(rhoz_r(ispin), rhopz_r(ispin))
1473 CALL qs_rho_create(rho1)
1475 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1477 IF (
ASSOCIATED(tauz_r_xc))
THEN
1478 CALL qs_rho_set(rho1, rho_r=rhoz_r_xc, rho_g=rhoz_g_xc, tau_r=tauz_r_xc, &
1479 rho_r_valid=.true., rho_g_valid=.true., tau_r_valid=.true.)
1481 CALL qs_rho_set(rho1, rho_r=rhoz_r_xc, rho_g=rhoz_g_xc, &
1482 rho_r_valid=.true., rho_g_valid=.true.)
1485 CALL get_qs_env(qs_env=qs_env, rho=rho)
1487 IF (
ASSOCIATED(tauz_r))
THEN
1488 CALL qs_rho_set(rho1, rho_r=rhoz_r, rho_g=rhoz_g, tau_r=tauz_r, &
1489 rho_r_valid=.true., rho_g_valid=.true., tau_r_valid=.true.)
1491 CALL qs_rho_set(rho1, rho_r=rhoz_r, rho_g=rhoz_g, &
1492 rho_r_valid=.true., rho_g_valid=.true.)
1496 IF (dft_control%qs_control%gapw_control%accurate_xcint)
THEN
1498 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1499 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1501 CALL accint_weight_force(qs_env, rho0, rho1, 1, xc_section)
1503 IF (debug_forces)
THEN
1504 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1505 CALL para_env%sum(fodeb)
1506 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc*dw ", fodeb
1508 IF (debug_stress .AND. use_virial)
THEN
1509 stdeb = fconv*(virial%pv_virial - stdeb)
1510 CALL para_env%sum(stdeb)
1511 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1512 'STRESS| INT Pz*dVxc*dw ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1519 IF (use_virial)
THEN
1521 CALL get_qs_env(qs_env, rho=rho)
1522 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
1525 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho)
1527 h_stress(:, :) = 0.0_dp
1534 CALL pw_poisson_solve(poisson_env, &
1535 density=rhoz_tot_gspace, &
1536 ehartree=ehartree, &
1537 vhartree=zv_hartree_gspace, &
1538 h_stress=h_stress, &
1539 aux_density=rho_tot_gspace)
1541 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1544 virial%pv_ehartree = virial%pv_ehartree + 2.0_dp*h_stress/real(para_env%num_pe, dp)
1545 virial%pv_virial = virial%pv_virial + 2.0_dp*h_stress/real(para_env%num_pe, dp)
1547 IF (debug_stress)
THEN
1548 stdeb = -1.0_dp*fconv*ehartree
1549 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1550 'STRESS| VOL 1st v_H[n_z]*n_in ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1551 stdeb = -1.0_dp*fconv*ehartree
1552 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1553 'STRESS| VOL 2nd v_H[n_in]*n_z ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1554 stdeb = fconv*(h_stress/real(para_env%num_pe, dp))
1555 CALL para_env%sum(stdeb)
1556 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1557 'STRESS| GREEN 1st v_H[n_z]*n_in ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1558 stdeb = fconv*(h_stress/real(para_env%num_pe, dp))
1559 CALL para_env%sum(stdeb)
1560 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1561 'STRESS| GREEN 2nd v_H[n_in]*n_z ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1567 DO ispin = 1, nspins
1568 exc = exc + pw_integral_ab(rhoz_r(ispin), vxc_rspace(ispin))/ &
1569 vxc_rspace(ispin)%pw_grid%dvol
1571 IF (
ASSOCIATED(vtau_rspace))
THEN
1572 DO ispin = 1, nspins
1573 exc = exc + pw_integral_ab(tauz_r(ispin), vtau_rspace(ispin))/ &
1574 vtau_rspace(ispin)%pw_grid%dvol
1579 IF (dft_control%qs_control%do_kg)
THEN
1580 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed .OR. &
1581 qs_env%kg_env%tnadd_method == kg_tnadd_embed_ri)
THEN
1582 exc = exc - ekin_mol
1586 IF (debug_stress)
THEN
1587 stdeb = -1.0_dp*fconv*exc
1588 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1589 'STRESS| VOL 1st eps_XC[n_in]*n_z', one_third_sum_diag(stdeb), det_3x3(stdeb)
1597 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rhoz_tot_gspace)
1598 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1599 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rhoz_tot_gspace)
1602 CALL pw_poisson_solve(poisson_env, rhoz_tot_gspace, ehartree, zv_hartree_gspace)
1605 IF (gapw .OR. gapw_xc)
THEN
1606 IF (
ASSOCIATED(local_rho_set_t))
CALL local_rho_set_release(local_rho_set_t)
1609 IF (debug_forces) fodeb(1:3) = force(1)%rho_core(1:3, 1)
1610 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ehartree
1611 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
1612 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
1614 CALL integrate_v_core_rspace(zv_hartree_rspace, qs_env)
1615 IF (debug_forces)
THEN
1616 fodeb(1:3) = force(1)%rho_core(1:3, 1) - fodeb(1:3)
1617 CALL para_env%sum(fodeb)
1618 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(rhoz)*dncore ", fodeb
1620 IF (debug_stress .AND. use_virial)
THEN
1621 stdeb = fconv*(virial%pv_ehartree - stdeb)
1622 CALL para_env%sum(stdeb)
1623 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1624 'STRESS| INT Vh(rhoz)*dncore ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1629 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1631 CALL get_qs_env(qs_env=qs_env, rho=rho)
1633 IF (dft_control%do_admm)
THEN
1634 CALL get_qs_env(qs_env, admm_env=admm_env)
1635 xc_section => admm_env%xc_section_primary
1637 xc_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC")
1640 IF (use_virial)
THEN
1641 virial%pv_xc = 0.0_dp
1644 IF (gapw .OR. gapw_xc)
THEN
1646 NULLIFY (local_rho_set_t)
1647 CALL local_rho_set_create(local_rho_set_t)
1648 CALL allocate_rho_atom_internals(local_rho_set_t%rho_atom_set, atomic_kind_set, &
1649 qs_kind_set, dft_control, para_env)
1650 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1652 CALL rho0_s_grid_create(pw_env, local_rho_set_t%rho0_mpole)
1653 CALL calculate_rho_atom_coeff(qs_env, mpa(:), local_rho_set_t%rho_atom_set, &
1654 qs_kind_set, oce, sab_orb, para_env)
1655 CALL prepare_gapw_den(qs_env, local_rho_set_t, do_rho0=gapw)
1656 NULLIFY (local_rho_set_gs)
1657 CALL local_rho_set_create(local_rho_set_gs)
1658 CALL allocate_rho_atom_internals(local_rho_set_gs%rho_atom_set, atomic_kind_set, &
1659 qs_kind_set, dft_control, para_env)
1660 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1661 CALL rho0_s_grid_create(pw_env, local_rho_set_gs%rho0_mpole)
1662 CALL calculate_rho_atom_coeff(qs_env, matrix_p(:, 1), local_rho_set_gs%rho_atom_set, &
1663 qs_kind_set, oce, sab_orb, para_env)
1664 CALL prepare_gapw_den(qs_env, local_rho_set_gs, do_rho0=gapw)
1666 ALLOCATE (rho_r_t(nspins), rho_g_t(nspins))
1667 DO ispin = 1, nspins
1668 CALL auxbas_pw_pool%create_pw(rho_r_t(ispin))
1669 CALL auxbas_pw_pool%create_pw(rho_g_t(ispin))
1671 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_t)
1672 total_rho_t = 0.0_dp
1673 CALL pw_zero(rho_tot_gspace_t)
1674 DO ispin = 1, nspins
1675 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpa(ispin)%matrix, &
1676 rho=rho_r_t(ispin), &
1677 rho_gspace=rho_g_t(ispin), &
1679 total_rho=total_rho_t(ispin))
1680 CALL pw_axpy(rho_g_t(ispin), rho_tot_gspace_t)
1684 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rho_tot_gspace_t)
1685 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1686 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_t)
1689 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_t)
1690 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_t)
1691 NULLIFY (hartree_local_t)
1692 CALL hartree_local_create(hartree_local_t)
1693 CALL init_coulomb_local(hartree_local_t, natom)
1694 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_t, hartree_t, v_hartree_gspace_t)
1695 CALL pw_transfer(v_hartree_gspace_t, v_hartree_rspace_t)
1696 CALL pw_scale(v_hartree_rspace_t, v_hartree_rspace_t%pw_grid%dvol)
1698 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1699 CALL vh_1c_gg_integrals(qs_env, hartree_t, hartree_local_t%ecoul_1c, local_rho_set_gs, para_env, tddft=.false., &
1700 local_rho_set_2nd=local_rho_set_t, core_2nd=.true.)
1701 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace_t, para_env, calculate_forces=.true., &
1702 local_rho_set=local_rho_set_gs, local_rho_set_2nd=local_rho_set_t)
1703 IF (debug_forces)
THEN
1704 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1705 CALL para_env%sum(fodeb)
1706 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(T)*dncore PAWg0", fodeb
1711 do_onecenter = .false.
1712 NULLIFY (rho0_atom_set, rho1_atom_set)
1713 IF (gapw .OR. gapw_xc)
THEN
1715 IF (myfun /= xc_none)
THEN
1717 NULLIFY (local_rho_set_f)
1718 CALL local_rho_set_create(local_rho_set_f)
1719 CALL allocate_rho_atom_internals(local_rho_set_f%rho_atom_set, atomic_kind_set, &
1720 qs_kind_set, dft_control, para_env)
1721 CALL calculate_rho_atom_coeff(qs_env, mpa, local_rho_set_f%rho_atom_set, &
1722 qs_kind_set, oce, sab_orb, para_env)
1723 CALL prepare_gapw_den(qs_env, local_rho_set_f, do_rho0=.false.)
1724 rho0_atom_set => local_rho_set_gs%rho_atom_set
1725 rho1_atom_set => local_rho_set_f%rho_atom_set
1726 do_onecenter = .true.
1730 NULLIFY (v_xc, v_xc_tau)
1731 CALL qs_fxc_create(qs_env, rho0, rho1, rho0_atom_set, xc_section, do_onecenter, &
1732 v_xc, v_xc_tau, rho1_atom_set, &
1733 compute_virial=use_virial, virial_xc=virial%pv_xc)
1737 IF (use_virial)
THEN
1738 virial%pv_exc = virial%pv_exc + virial%pv_xc
1739 virial%pv_virial = virial%pv_virial + virial%pv_xc
1742 IF (debug_stress .AND. use_virial)
THEN
1743 stdeb = 1.0_dp*fconv*virial%pv_xc
1744 CALL para_env%sum(stdeb)
1745 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1746 'STRESS| GGA 2nd Pin*dK*rhoz', one_third_sum_diag(stdeb), det_3x3(stdeb)
1750 IF (use_virial)
THEN
1751 pv_loc = virial%pv_virial
1754 CALL get_qs_env(qs_env=qs_env, rho=rho)
1755 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
1756 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1758 DO ispin = 1, nspins
1759 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1761 IF ((.NOT. (gapw)) .AND. (.NOT. gapw_xc))
THEN
1762 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1763 DO ispin = 1, nspins
1764 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1765 CALL integrate_v_rspace(qs_env=qs_env, &
1766 v_rspace=v_xc(ispin), &
1767 hmat=matrix_hz(ispin), &
1768 pmat=matrix_p(ispin, 1), &
1770 calculate_forces=.true.)
1772 IF (debug_forces)
THEN
1773 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1774 CALL para_env%sum(fodeb)
1775 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1778 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1779 IF (myfun /= xc_none)
THEN
1780 DO ispin = 1, nspins
1781 CALL integrate_v_rspace(qs_env=qs_env, &
1782 v_rspace=v_xc(ispin), &
1783 hmat=matrix_hz(ispin), &
1784 pmat=matrix_p(ispin, 1), &
1786 calculate_forces=.true.)
1790 DO ispin = 1, nspins
1791 CALL pw_zero(v_xc(ispin))
1793 CALL pw_axpy(v_hartree_rspace_t, v_xc(ispin))
1794 ELSE IF (gapw_xc)
THEN
1795 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1797 CALL integrate_v_rspace(qs_env=qs_env, &
1798 v_rspace=v_xc(ispin), &
1799 hmat=matrix_ht(ispin), &
1800 pmat=matrix_p(ispin, 1), &
1802 calculate_forces=.true.)
1804 IF (debug_forces)
THEN
1805 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1806 CALL para_env%sum(fodeb)
1807 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1811 IF (gapw .OR. gapw_xc)
THEN
1813 IF (myfun /= xc_none)
THEN
1814 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1815 CALL update_ks_atom(qs_env, matrix_hz, matrix_p, forces=.true., tddft=.false., &
1816 rho_atom_external=local_rho_set_f%rho_atom_set)
1817 IF (debug_forces)
THEN
1818 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1819 CALL para_env%sum(fodeb)
1820 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKxc*(Dz+T) PAW", fodeb
1825 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1826 CALL update_ks_atom(qs_env, matrix_ht, matrix_p, forces=.true., tddft=.false., &
1827 rho_atom_external=local_rho_set_t%rho_atom_set)
1828 IF (debug_forces)
THEN
1829 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1830 CALL para_env%sum(fodeb)
1831 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKh*(Dz+T) PAW", fodeb
1835 DO ispin = 1, nspins
1836 CALL dbcsr_add(matrix_hz(ispin)%matrix, matrix_ht(ispin)%matrix, 1.0_dp, 1.0_dp)
1840 IF (myfun /= xc_none)
THEN
1841 IF (
ASSOCIATED(local_rho_set_f))
CALL local_rho_set_release(local_rho_set_f)
1843 IF (
ASSOCIATED(local_rho_set_t))
CALL local_rho_set_release(local_rho_set_t)
1844 IF (
ASSOCIATED(local_rho_set_gs))
CALL local_rho_set_release(local_rho_set_gs)
1846 IF (
ASSOCIATED(hartree_local_t))
CALL hartree_local_release(hartree_local_t)
1847 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_t)
1848 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_t)
1850 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_t)
1851 DO ispin = 1, nspins
1852 CALL auxbas_pw_pool%give_back_pw(rho_r_t(ispin))
1853 CALL auxbas_pw_pool%give_back_pw(rho_g_t(ispin))
1855 DEALLOCATE (rho_r_t, rho_g_t)
1858 IF (debug_stress .AND. use_virial)
THEN
1859 stdeb = fconv*(virial%pv_virial - stdeb)
1860 CALL para_env%sum(stdeb)
1861 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1862 'STRESS| INT 2nd f_Hxc[Pz]*Pin', one_third_sum_diag(stdeb), det_3x3(stdeb)
1865 IF (
ASSOCIATED(v_xc_tau))
THEN
1866 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1867 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1868 DO ispin = 1, nspins
1869 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
1870 CALL integrate_v_rspace(qs_env=qs_env, &
1871 v_rspace=v_xc_tau(ispin), &
1872 hmat=matrix_hz(ispin), &
1873 pmat=matrix_p(ispin, 1), &
1874 compute_tau=.true., &
1875 gapw=(gapw .OR. gapw_xc), &
1876 calculate_forces=.true.)
1878 IF (debug_forces)
THEN
1879 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1880 CALL para_env%sum(fodeb)
1881 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKtau*tauz ", fodeb
1884 IF (debug_stress .AND. use_virial)
THEN
1885 stdeb = fconv*(virial%pv_virial - stdeb)
1886 CALL para_env%sum(stdeb)
1887 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1888 'STRESS| INT 2nd f_xctau[Pz]*Pin', one_third_sum_diag(stdeb), det_3x3(stdeb)
1891 IF (use_virial)
THEN
1892 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1897 IF (dft_control%qs_control%do_kg)
THEN
1898 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed)
THEN
1900 IF (use_virial)
THEN
1901 pv_loc = virial%pv_virial
1904 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1905 IF (use_virial) virial%pv_xc = 0.0_dp
1906 CALL kg_ekin_subset(qs_env=qs_env, &
1907 ks_matrix=matrix_hz, &
1908 ekin_mol=ekin_mol, &
1909 calc_force=.true., &
1913 IF (debug_forces)
THEN
1914 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1915 CALL para_env%sum(fodeb)
1916 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*d(Kkg)*rhoz ", fodeb
1918 IF (debug_stress .AND. use_virial)
THEN
1919 stdeb = fconv*(virial%pv_virial - pv_loc)
1920 CALL para_env%sum(stdeb)
1921 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1922 'STRESS| INT KG Pin*d(KKG)*rhoz ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1924 stdeb = fconv*(virial%pv_xc)
1925 CALL para_env%sum(stdeb)
1926 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1927 'STRESS| GGA KG Pin*d(KKG)*rhoz ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1931 IF (use_virial)
THEN
1933 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1936 virial%pv_exc = virial%pv_exc - virial%pv_xc
1937 virial%pv_virial = virial%pv_virial - virial%pv_xc
1938 virial%pv_xc = 0.0_dp
1942 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
1943 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
1944 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
1945 DO ispin = 1, nspins
1946 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
1947 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
1948 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1950 DEALLOCATE (rhoz_r, rhoz_g, v_xc)
1952 DO ispin = 1, nspins
1953 CALL auxbas_pw_pool%give_back_pw(rhoz_r_xc(ispin))
1954 CALL auxbas_pw_pool%give_back_pw(rhoz_g_xc(ispin))
1956 DEALLOCATE (rhoz_r_xc, rhoz_g_xc)
1958 IF (
ASSOCIATED(v_xc_tau))
THEN
1959 DO ispin = 1, nspins
1960 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
1961 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1963 DEALLOCATE (tauz_r, v_xc_tau)
1964 IF (
ASSOCIATED(tauz_r_xc))
THEN
1965 DO ispin = 1, nspins
1966 CALL auxbas_pw_pool%give_back_pw(tauz_r_xc(ispin))
1968 DEALLOCATE (tauz_r_xc)
1971 IF (debug_forces)
THEN
1972 ALLOCATE (ftot3(3, natom))
1973 CALL total_qs_force(ftot3, force, atomic_kind_set)
1974 fodeb(1:3) = ftot3(1:3, 1) - ftot2(1:3, 1)
1975 CALL para_env%sum(fodeb)
1976 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*V(rhoz)", fodeb
1978 CALL dbcsr_deallocate_matrix_set(scrm)
1979 CALL dbcsr_deallocate_matrix_set(matrix_ht)
1985 IF (dft_control%do_admm)
THEN
1987 exc_aux_fit = 0.0_dp
1989 IF (qs_env%admm_env%aux_exch_func == do_admm_aux_exch_func_none)
THEN
1991 NULLIFY (mpz, mhz, mhx, mhy)
1994 CALL get_qs_env(qs_env, admm_env=admm_env)
1995 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=scrm, &
1996 task_list_aux_fit=task_list_aux_fit)
1998 NULLIFY (mpz, mhz, mhx, mhy)
1999 CALL dbcsr_allocate_matrix_set(mhx, nspins, 1)
2000 CALL dbcsr_allocate_matrix_set(mhy, nspins, 1)
2001 CALL dbcsr_allocate_matrix_set(mpz, nspins, 1)
2002 DO ispin = 1, nspins
2003 ALLOCATE (mhx(ispin, 1)%matrix)
2004 CALL dbcsr_create(mhx(ispin, 1)%matrix, template=scrm(1)%matrix)
2005 CALL dbcsr_copy(mhx(ispin, 1)%matrix, scrm(1)%matrix)
2006 CALL dbcsr_set(mhx(ispin, 1)%matrix, 0.0_dp)
2007 ALLOCATE (mhy(ispin, 1)%matrix)
2008 CALL dbcsr_create(mhy(ispin, 1)%matrix, template=scrm(1)%matrix)
2009 CALL dbcsr_copy(mhy(ispin, 1)%matrix, scrm(1)%matrix)
2010 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
2011 ALLOCATE (mpz(ispin, 1)%matrix)
2013 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=p_env%p1_admm(ispin)%matrix)
2014 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
2015 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2018 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=matrix_pz_admm(ispin)%matrix)
2019 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2023 xc_section => admm_env%xc_section_aux
2024 xc_fun_section => section_vals_get_subs_vals(xc_section,
"XC_FUNCTIONAL")
2025 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
2026 needs_tau_response_aux = needs%tau .OR. needs%tau_spin
2029 IF (use_virial)
THEN
2030 pv_loc = virial%pv_virial
2033 basis_type =
"AUX_FIT"
2034 task_list => task_list_aux_fit
2035 IF (admm_env%do_gapw)
THEN
2036 basis_type =
"AUX_FIT_SOFT"
2037 task_list => admm_env%admm_gapw_env%task_list
2040 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2041 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2042 DO ispin = 1, nspins
2043 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
2044 hmat=mhx(ispin, 1), pmat=mpz(ispin, 1), &
2045 qs_env=qs_env, calculate_forces=.true., &
2046 basis_type=basis_type, task_list_external=task_list)
2047 IF (
ASSOCIATED(vadmm_tau_rspace))
THEN
2048 CALL integrate_v_rspace(v_rspace=vadmm_tau_rspace(ispin), &
2049 hmat=mhx(ispin, 1), pmat=mpz(ispin, 1), &
2050 qs_env=qs_env, calculate_forces=.true., compute_tau=.true., &
2051 basis_type=basis_type, task_list_external=task_list)
2054 IF (debug_forces)
THEN
2055 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2056 CALL para_env%sum(fodeb)
2057 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)", fodeb
2059 IF (debug_stress .AND. use_virial)
THEN
2060 stdeb = fconv*(virial%pv_virial - pv_loc)
2061 CALL para_env%sum(stdeb)
2062 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2063 'STRESS| INT 1st Pz*dVxc(rho_admm) ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2066 IF (use_virial)
THEN
2067 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2070 IF (admm_env%do_gapw)
THEN
2071 CALL get_admm_env(admm_env, sab_aux_fit=sab_aux_fit)
2072 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2073 CALL update_ks_atom(qs_env, mhx(:, 1), mpz(:, 1), forces=.true., tddft=.false., &
2074 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
2075 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2076 oce_external=admm_env%admm_gapw_env%oce, &
2077 sab_external=sab_aux_fit)
2078 IF (debug_forces)
THEN
2079 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2080 CALL para_env%sum(fodeb)
2081 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)PAW", fodeb
2086 NULLIFY (rhoz_g_aux, rhoz_r_aux, rhoz_tau_r_aux)
2087 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
2088 DO ispin = 1, nspins
2089 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
2090 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
2092 DO ispin = 1, nspins
2093 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpz(ispin, 1)%matrix, &
2094 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
2095 basis_type=basis_type, task_list_external=task_list)
2097 IF (needs_tau_response_aux .OR.
ASSOCIATED(vadmm_tau_rspace))
THEN
2099 TYPE(pw_c1d_gs_type) :: work_g
2100 ALLOCATE (rhoz_tau_r_aux(nspins))
2101 CALL auxbas_pw_pool%create_pw(work_g)
2102 DO ispin = 1, nspins
2103 CALL auxbas_pw_pool%create_pw(rhoz_tau_r_aux(ispin))
2104 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpz(ispin, 1)%matrix, &
2105 rho=rhoz_tau_r_aux(ispin), rho_gspace=work_g, &
2106 basis_type=basis_type, task_list_external=task_list, &
2109 CALL auxbas_pw_pool%give_back_pw(work_g)
2114 IF (use_virial)
THEN
2118 DO ispin = 1, nspins
2119 exc_aux_fit = exc_aux_fit + pw_integral_ab(rhoz_r_aux(ispin), vadmm_rspace(ispin))/ &
2120 vadmm_rspace(ispin)%pw_grid%dvol
2122 IF (
ASSOCIATED(vadmm_tau_rspace) .AND.
ASSOCIATED(rhoz_tau_r_aux))
THEN
2123 DO ispin = 1, nspins
2124 exc_aux_fit = exc_aux_fit + pw_integral_ab(rhoz_tau_r_aux(ispin), vadmm_tau_rspace(ispin))/ &
2125 vadmm_tau_rspace(ispin)%pw_grid%dvol
2129 IF (debug_stress)
THEN
2130 stdeb = -1.0_dp*fconv*exc_aux_fit
2131 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T43,2(1X,ES19.11))") &
2132 'STRESS| VOL 1st eps_XC[n_in_admm]*n_z_admm', one_third_sum_diag(stdeb), det_3x3(stdeb)
2137 NULLIFY (v_xc, v_xc_tau)
2139 IF (use_virial) virial%pv_xc = 0.0_dp
2141 NULLIFY (rho0_atom_set, rho1_atom_set)
2142 kind_set => qs_kind_set
2143 IF (admm_env%do_gapw)
THEN
2144 kind_set => admm_env%admm_gapw_env%admm_kind_set
2145 CALL local_rho_set_create(local_rhoz_set_admm)
2146 CALL allocate_rho_atom_internals(local_rhoz_set_admm%rho_atom_set, atomic_kind_set, &
2147 kind_set, dft_control, para_env)
2148 CALL calculate_rho_atom_coeff(qs_env, mpz(:, 1), local_rhoz_set_admm%rho_atom_set, &
2149 kind_set, admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
2150 CALL prepare_gapw_den(qs_env, local_rho_set=local_rhoz_set_admm, &
2151 do_rho0=.false., kind_set_external=kind_set)
2152 rho0_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
2153 rho1_atom_set => local_rhoz_set_admm%rho_atom_set
2154 do_onecenter = .true.
2158 CALL qs_rho_create(rho1)
2159 IF (
ASSOCIATED(rhoz_tau_r_aux))
THEN
2160 CALL qs_rho_set(rho1, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux, tau_r=rhoz_tau_r_aux, &
2161 rho_r_valid=.true., rho_g_valid=.true., tau_r_valid=.true.)
2163 CALL qs_rho_set(rho1, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux, &
2164 rho_r_valid=.true., rho_g_valid=.true.)
2166 CALL qs_fxc_create(qs_env, rho_aux_fit, rho1, rho0_atom_set, xc_section, do_onecenter, &
2167 v_xc, v_xc_tau, rho1_atom_set, &
2168 kind_set_external=kind_set, &
2169 compute_virial=use_virial, virial_xc=virial%pv_xc)
2172 IF (use_virial)
THEN
2173 virial%pv_exc = virial%pv_exc + virial%pv_xc
2174 virial%pv_virial = virial%pv_virial + virial%pv_xc
2177 IF (debug_stress .AND. use_virial)
THEN
2178 stdeb = 1.0_dp*fconv*virial%pv_xc
2179 CALL para_env%sum(stdeb)
2180 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2181 'STRESS| GGA 2nd Pin_admm*dK*rhoz_admm', one_third_sum_diag(stdeb), det_3x3(stdeb)
2184 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2186 IF (use_virial)
THEN
2187 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2189 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2190 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2191 DO ispin = 1, nspins
2192 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
2193 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2194 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
2195 hmat=mhy(ispin, 1), pmat=matrix_p(ispin, 1), &
2196 calculate_forces=.true., &
2197 basis_type=basis_type, task_list_external=task_list)
2199 IF (
ASSOCIATED(v_xc_tau))
THEN
2200 DO ispin = 1, nspins
2201 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
2202 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc_tau(ispin), &
2203 hmat=mhy(ispin, 1), pmat=matrix_p(ispin, 1), &
2204 calculate_forces=.true., compute_tau=.true., &
2205 basis_type=basis_type, task_list_external=task_list)
2208 IF (debug_forces)
THEN
2209 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2210 CALL para_env%sum(fodeb)
2211 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm ", fodeb
2213 IF (debug_stress .AND. use_virial)
THEN
2214 stdeb = fconv*(virial%pv_virial - pv_loc)
2215 CALL para_env%sum(stdeb)
2216 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2217 'STRESS| INT 2nd Pin*dK*rhoz_admm ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2220 IF (use_virial)
THEN
2221 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2224 IF (admm_env%do_gapw)
THEN
2225 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2226 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2228 CALL accint_weight_force(qs_env, rho_aux_fit, rho1, 1, xc_section)
2230 IF (debug_forces)
THEN
2231 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2232 CALL para_env%sum(fodeb)
2233 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: dKxc*rhoz_admm*dw ", fodeb
2235 IF (debug_stress .AND. use_virial)
THEN
2236 stdeb = fconv*(virial%pv_virial - stdeb)
2237 CALL para_env%sum(stdeb)
2238 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2239 'STRESS| dKxc*rhoz_admm*dw', one_third_sum_diag(stdeb), det_3x3(stdeb)
2243 DO ispin = 1, nspins
2244 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2245 IF (
ASSOCIATED(v_xc_tau))
CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
2246 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
2247 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
2248 IF (
ASSOCIATED(rhoz_tau_r_aux))
CALL auxbas_pw_pool%give_back_pw(rhoz_tau_r_aux(ispin))
2250 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
2251 IF (
ASSOCIATED(v_xc_tau))
DEALLOCATE (v_xc_tau)
2252 IF (
ASSOCIATED(rhoz_tau_r_aux))
DEALLOCATE (rhoz_tau_r_aux)
2255 IF (admm_env%do_gapw)
THEN
2256 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2257 CALL update_ks_atom(qs_env, mhy(:, 1), matrix_p(:, 1), forces=.true., tddft=.false., &
2258 rho_atom_external=local_rhoz_set_admm%rho_atom_set, &
2259 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2260 oce_external=admm_env%admm_gapw_env%oce, &
2261 sab_external=sab_aux_fit)
2262 IF (debug_forces)
THEN
2263 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2264 CALL para_env%sum(fodeb)
2265 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm[PAW] ", fodeb
2267 CALL local_rho_set_release(local_rhoz_set_admm)
2270 nao = admm_env%nao_orb
2271 nao_aux = admm_env%nao_aux_fit
2273 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2274 DO ispin = 1, nspins
2275 CALL cp_dbcsr_sm_fm_multiply(mhy(ispin, 1)%matrix, admm_env%A, &
2276 admm_env%work_aux_orb, nao)
2277 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
2278 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2279 admm_env%work_orb_orb)
2280 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2281 CALL dbcsr_set(dbwork, 0.0_dp)
2282 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
2283 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2285 CALL dbcsr_release(dbwork)
2287 CALL dbcsr_deallocate_matrix_set(mpz)
2296 hfx_section => section_vals_get_subs_vals(xc_section,
"HF")
2297 CALL section_vals_get(hfx_section, explicit=do_hfx)
2299 CALL section_vals_get(hfx_section, n_repetition=n_rep_hf)
2300 cpassert(n_rep_hf == 1)
2301 CALL section_vals_val_get(hfx_section,
"TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core, &
2304 IF (hfx_treat_lsd_in_core) mspin = nspins
2305 IF (use_virial) virial%pv_fock_4c = 0.0_dp
2307 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, &
2308 s_mstruct_changed=s_mstruct_changed)
2309 distribute_fock_matrix = .true.
2314 IF (dft_control%do_admm)
THEN
2315 CALL get_qs_env(qs_env=qs_env, admm_env=admm_env)
2316 CALL get_admm_env(admm_env, matrix_s_aux_fit=scrm, rho_aux_fit=rho_aux_fit)
2317 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2318 NULLIFY (mpz, mhz, mpd, mhd)
2319 CALL dbcsr_allocate_matrix_set(mpz, nspins, 1)
2320 CALL dbcsr_allocate_matrix_set(mhz, nspins, 1)
2321 CALL dbcsr_allocate_matrix_set(mpd, nspins, 1)
2322 CALL dbcsr_allocate_matrix_set(mhd, nspins, 1)
2323 DO ispin = 1, nspins
2324 ALLOCATE (mhz(ispin, 1)%matrix, mhd(ispin, 1)%matrix)
2325 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=scrm(1)%matrix)
2326 CALL dbcsr_create(mhd(ispin, 1)%matrix, template=scrm(1)%matrix)
2327 CALL dbcsr_copy(mhz(ispin, 1)%matrix, scrm(1)%matrix)
2328 CALL dbcsr_copy(mhd(ispin, 1)%matrix, scrm(1)%matrix)
2329 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
2330 CALL dbcsr_set(mhd(ispin, 1)%matrix, 0.0_dp)
2331 ALLOCATE (mpz(ispin, 1)%matrix)
2333 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2334 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
2335 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2338 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2339 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2341 mpd(ispin, 1)%matrix => matrix_p(ispin, 1)%matrix
2344 IF (x_data(1, 1)%do_hfx_ri)
THEN
2347 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2348 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2349 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2352 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhd, eh1, rho_ao=mpd, &
2353 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2354 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2359 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpz, hfx_section, &
2360 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2365 CALL integrate_four_center(qs_env, x_data, mhd, eh1, mpd, hfx_section, &
2366 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2371 CALL get_qs_env(qs_env, admm_env=admm_env)
2372 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
2373 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
2374 nao = admm_env%nao_orb
2375 nao_aux = admm_env%nao_aux_fit
2377 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2378 DO ispin = 1, nspins
2379 CALL cp_dbcsr_sm_fm_multiply(mhz(ispin, 1)%matrix, admm_env%A, &
2380 admm_env%work_aux_orb, nao)
2381 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
2382 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2383 admm_env%work_orb_orb)
2384 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2385 CALL dbcsr_set(dbwork, 0.0_dp)
2386 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
2387 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2389 CALL dbcsr_release(dbwork)
2392 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
2393 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2394 DO ispin = 1, nspins
2395 CALL dbcsr_add(mhd(ispin, 1)%matrix, mhx(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2396 CALL dbcsr_add(mhz(ispin, 1)%matrix, mhy(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2399 CALL qs_rho_get(rho, rho_ao=matrix_pd)
2400 CALL admm_projection_derivative(qs_env, mhd(:, 1), mpa)
2401 CALL admm_projection_derivative(qs_env, mhz(:, 1), matrix_pd)
2402 IF (debug_forces)
THEN
2403 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
2404 CALL para_env%sum(fodeb)
2405 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx*S' ", fodeb
2407 CALL dbcsr_deallocate_matrix_set(mpz)
2408 CALL dbcsr_deallocate_matrix_set(mhz)
2409 CALL dbcsr_deallocate_matrix_set(mhd)
2410 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2411 CALL dbcsr_deallocate_matrix_set(mhx)
2412 CALL dbcsr_deallocate_matrix_set(mhy)
2419 ALLOCATE (mpz(nspins, 1), mhz(nspins, 1))
2420 DO ispin = 1, nspins
2421 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
2422 mpz(ispin, 1)%matrix => mpa(ispin)%matrix
2425 IF (x_data(1, 1)%do_hfx_ri)
THEN
2428 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2429 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2430 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2434 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpz, hfx_section, &
2435 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2439 DEALLOCATE (mhz, mpz)
2447 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
2448 IF (dft_control%do_admm)
THEN
2452 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2453 NULLIFY (matrix_pza)
2454 CALL dbcsr_allocate_matrix_set(matrix_pza, nspins)
2455 DO ispin = 1, nspins
2456 ALLOCATE (matrix_pza(ispin)%matrix)
2458 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=p_env%p1_admm(ispin)%matrix)
2459 CALL dbcsr_copy(matrix_pza(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
2460 CALL dbcsr_add(matrix_pza(ispin)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2463 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=matrix_pz_admm(ispin)%matrix)
2464 CALL dbcsr_copy(matrix_pza(ispin)%matrix, matrix_pz_admm(ispin)%matrix)
2467 IF (x_data(1, 1)%do_hfx_ri)
THEN
2469 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
2470 x_data(1, 1)%general_parameter%fraction, &
2471 rho_ao=matrix_p, rho_ao_resp=matrix_pza, &
2472 use_virial=use_virial, resp_only=resp_only)
2474 CALL derivatives_four_center(qs_env, matrix_p, matrix_pza, hfx_section, para_env, &
2475 1, use_virial, resp_only=resp_only)
2477 CALL dbcsr_deallocate_matrix_set(matrix_pza)
2482 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
2483 IF (x_data(1, 1)%do_hfx_ri)
THEN
2485 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
2486 x_data(1, 1)%general_parameter%fraction, &
2487 rho_ao=matrix_p, rho_ao_resp=mpa, &
2488 use_virial=use_virial, resp_only=resp_only)
2490 CALL derivatives_four_center(qs_env, matrix_p, mpa, hfx_section, para_env, &
2491 1, use_virial, resp_only=resp_only)
2495 IF (use_virial)
THEN
2496 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
2497 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
2498 virial%pv_calculate = .false.
2501 IF (debug_forces)
THEN
2502 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
2503 CALL para_env%sum(fodeb)
2504 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx ", fodeb
2506 IF (debug_stress .AND. use_virial)
THEN
2507 stdeb = -1.0_dp*fconv*virial%pv_fock_4c
2508 CALL para_env%sum(stdeb)
2509 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2510 'STRESS| Pz*hfx ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2516 IF (use_virial)
THEN
2518 zehartree = zehartree + 2.0_dp*ehartree
2521 IF (dft_control%do_admm)
THEN
2522 zexc_aux_fit = zexc_aux_fit + exc_aux_fit
2529 IF (dft_control%qs_control%do_ls_scf)
THEN
2531 eps_filter = dft_control%qs_control%eps_filter_matrix
2532 CALL calculate_whz_ao_matrix(qs_env, matrix_hz, matrix_wz, eps_filter)
2535 matrix_wz => p_env%w1
2538 IF (nspins == 1) focc = 2.0_dp
2539 CALL get_qs_env(qs_env, mos=mos)
2540 DO ispin = 1, nspins
2541 CALL get_mo_set(mo_set=mos(ispin), homo=nocc)
2542 CALL calculate_whz_matrix(mos(ispin)%mo_coeff, matrix_hz(ispin)%matrix, &
2543 matrix_wz(ispin)%matrix, focc, nocc)
2546 IF (nspins == 2)
THEN
2547 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2548 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
2551 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
2552 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
2554 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
2555 matrix_name=
"OVERLAP MATRIX", &
2556 basis_type_a=
"ORB", basis_type_b=
"ORB", &
2557 sab_nl=sab_orb, calculate_forces=.true., &
2558 matrix_p=matrix_wz(1)%matrix)
2560 IF (
SIZE(matrix_wz, 1) == 2)
THEN
2561 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2562 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
2565 IF (debug_forces)
THEN
2566 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
2567 CALL para_env%sum(fodeb)
2568 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wz*dS ", fodeb
2570 IF (debug_stress .AND. use_virial)
THEN
2571 stdeb = fconv*(virial%pv_overlap - stdeb)
2572 CALL para_env%sum(stdeb)
2573 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2574 'STRESS| WHz ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2576 CALL dbcsr_deallocate_matrix_set(scrm)
2578 IF (debug_forces)
THEN
2579 CALL total_qs_force(ftot2, force, atomic_kind_set)
2580 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
2581 CALL para_env%sum(fodeb)
2582 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Response Force", fodeb
2583 fodeb(1:3) = ftot2(1:3, 1)
2584 CALL para_env%sum(fodeb)
2585 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Total Force ", fodeb
2586 DEALLOCATE (ftot1, ftot2, ftot3)
2588 IF (debug_stress .AND. use_virial)
THEN
2589 stdeb = fconv*(virial%pv_virial - sttot)
2590 CALL para_env%sum(stdeb)
2591 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2592 'STRESS| Stress Response ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2593 stdeb = fconv*(virial%pv_virial)
2594 CALL para_env%sum(stdeb)
2595 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2596 'STRESS| Total Stress ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2597 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,3(1X,ES19.11))") &
2598 stdeb(1, 1), stdeb(2, 2), stdeb(3, 3)
2603 CALL dbcsr_deallocate_matrix_set(mpa)
2604 CALL dbcsr_deallocate_matrix_set(matrix_hz)
2607 CALL timestop(handle)