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, gapw, gapw_xc, &
873 hfx_treat_lsd_in_core, needs_tau_response, needs_tau_response_aux, resp_only, &
874 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 :: qs_kind_set
921 TYPE(
qs_rho_type),
POINTER :: rho, rho0, rho1, rho_aux_fit, rho_xc
927 CALL timeset(routinen, handle)
929 IF (
PRESENT(debug))
THEN
933 debug_forces = .false.
934 debug_stress = .false.
938 IF (logger%para_env%is_source())
THEN
945 IF (
PRESENT(ex_env)) do_ex = .true.
947 cpassert(
PRESENT(p_env))
950 NULLIFY (ks_env, sab_orb, virial)
955 dft_control=dft_control, &
959 nspins = dft_control%nspins
960 gapw = dft_control%qs_control%gapw
961 gapw_xc = dft_control%qs_control%gapw_xc
963 IF (debug_forces)
THEN
964 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
965 ALLOCATE (ftot1(3, natom))
970 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
972 IF (use_virial .AND. do_ex)
THEN
973 CALL cp_abort(__location__,
"Stress Tensor not available for TDDFT calculations.")
976 fconv = 1.0e-9_dp*
pascal/cell%deth
977 IF (debug_stress .AND. use_virial)
THEN
978 sttot = virial%pv_virial
988 ALLOCATE (mpa(ispin)%matrix)
989 CALL dbcsr_create(mpa(ispin)%matrix, template=p_env%p1(ispin)%matrix)
990 CALL dbcsr_copy(mpa(ispin)%matrix, p_env%p1(ispin)%matrix)
991 CALL dbcsr_add(mpa(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix, 1.0_dp, 1.0_dp)
992 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
998 IF (do_ex .OR. (gapw .OR. gapw_xc))
THEN
1000 DO ispin = 1, nspins
1001 ALLOCATE (matrix_ht(ispin)%matrix)
1002 CALL dbcsr_create(matrix_ht(ispin)%matrix, template=matrix_hz(ispin)%matrix)
1003 CALL dbcsr_copy(matrix_ht(ispin)%matrix, matrix_hz(ispin)%matrix)
1004 CALL dbcsr_set(matrix_ht(ispin)%matrix, 0.0_dp)
1013 mpa2(1:nspins, 1:1) => mpa(1:nspins)
1015 matrix_name=
"KINETIC ENERGY MATRIX", &
1017 sab_orb=sab_orb, calculate_forces=.true., &
1018 debug_forces=debug_forces, debug_stress=debug_stress)
1022 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
1025 DO ispin = 1, nspins
1026 ALLOCATE (scrm(ispin)%matrix)
1027 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_s(1)%matrix)
1028 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_s(1)%matrix)
1029 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1032 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, &
1033 atomic_kind_set=atomic_kind_set)
1035 ALLOCATE (matrix_p(nspins, 1), matrix_h(nspins, 1))
1036 DO ispin = 1, nspins
1037 matrix_p(ispin, 1)%matrix => mpa(ispin)%matrix
1038 matrix_h(ispin, 1)%matrix => scrm(ispin)%matrix
1040 matrix_h(1, 1)%matrix => scrm(1)%matrix
1043 CALL core_matrices(qs_env, matrix_h, matrix_p, .true., nder, &
1044 debug_forces=debug_forces, debug_stress=debug_stress)
1048 IF (dft_control%qs_control%do_kg)
THEN
1050 CALL get_qs_env(qs_env=qs_env, kg_env=kg_env, dbcsr_dist=dbcsr_dist)
1052 IF (use_virial)
THEN
1053 pv_loc = virial%pv_virial
1056 IF (debug_forces) fodeb(1:3) = force(1)%kinetic(1:3, 1)
1057 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1058 CALL build_tnadd_mat(kg_env=kg_env, matrix_p=matrix_p, force=force, virial=virial, &
1059 calculate_forces=.true., use_virial=use_virial, &
1060 qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set, &
1061 particle_set=particle_set, sab_orb=sab_orb, dbcsr_dist=dbcsr_dist)
1062 IF (debug_forces)
THEN
1063 fodeb(1:3) = force(1)%kinetic(1:3, 1) - fodeb(1:3)
1064 CALL para_env%sum(fodeb)
1065 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dTnadd ", fodeb
1067 IF (debug_stress .AND. use_virial)
THEN
1068 stdeb = fconv*(virial%pv_virial - stdeb)
1069 CALL para_env%sum(stdeb)
1070 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1075 IF (use_virial)
THEN
1076 virial%pv_ekinetic = virial%pv_ekinetic + (virial%pv_virial - pv_loc)
1082 DEALLOCATE (matrix_h)
1083 DEALLOCATE (matrix_p)
1091 DO ispin = 1, nspins
1092 ALLOCATE (scrm(ispin)%matrix)
1093 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_pz(1)%matrix)
1094 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_pz(ispin)%matrix)
1095 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1098 IF (debug_forces)
THEN
1099 ALLOCATE (ftot2(3, natom))
1101 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
1102 CALL para_env%sum(fodeb)
1103 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dHcore", fodeb
1105 IF (debug_stress .AND. use_virial)
THEN
1106 stdeb = fconv*(virial%pv_virial - sttot)
1107 CALL para_env%sum(stdeb)
1108 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1111 sttot2 = virial%pv_virial
1119 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
1121 IF (dft_control%do_admm)
THEN
1123 xc_section => admm_env%xc_section_primary
1130 needs_tau_response = needs%tau .OR. needs%tau_spin
1132 IF (gapw .OR. gapw_xc)
THEN
1133 NULLIFY (oce, sab_orb)
1134 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab_orb)
1136 NULLIFY (local_rho_set_gs)
1141 qs_kind_set, dft_control, para_env)
1142 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1145 qs_kind_set, oce, sab_orb, para_env)
1148 NULLIFY (local_rho_set_t)
1151 qs_kind_set, dft_control, para_env)
1152 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1156 qs_kind_set, oce, sab_orb, para_env)
1160 ALLOCATE (rho_r_gs(nspins), rho_g_gs(nspins))
1161 DO ispin = 1, nspins
1162 CALL auxbas_pw_pool%create_pw(rho_r_gs(ispin))
1163 CALL auxbas_pw_pool%create_pw(rho_g_gs(ispin))
1165 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_gs)
1167 total_rho_gs = 0.0_dp
1168 CALL pw_zero(rho_tot_gspace_gs)
1169 DO ispin = 1, nspins
1171 rho=rho_r_gs(ispin), &
1172 rho_gspace=rho_g_gs(ispin), &
1173 soft_valid=(gapw .OR. gapw_xc), &
1174 total_rho=total_rho_gs(ispin))
1175 CALL pw_axpy(rho_g_gs(ispin), rho_tot_gspace_gs)
1180 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rho0_s_gs, rho_tot_gspace_gs)
1181 IF (
ASSOCIATED(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs))
THEN
1182 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_gs)
1184 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1185 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
1186 CALL pw_axpy(rho_core, rho_tot_gspace_gs)
1189 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_gs)
1190 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_gs)
1191 NULLIFY (hartree_local_gs)
1194 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_gs, hartree_gs, v_hartree_gspace_gs)
1195 CALL pw_transfer(v_hartree_gspace_gs, v_hartree_rspace_gs)
1196 CALL pw_scale(v_hartree_rspace_gs, v_hartree_rspace_gs%pw_grid%dvol)
1202 cpassert(.NOT. use_virial)
1203 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1204 CALL vh_1c_gg_integrals(qs_env, hartree_gs, hartree_local_gs%ecoul_1c, local_rho_set_t, para_env, tddft=.true., &
1205 local_rho_set_2nd=local_rho_set_gs, core_2nd=.false.)
1208 local_rho_set=local_rho_set_t, local_rho_set_2nd=local_rho_set_gs)
1209 IF (debug_forces)
THEN
1210 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1211 CALL para_env%sum(fodeb)
1212 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVh[D^GS]PAWg0", fodeb
1215 IF (gapw .OR. gapw_xc)
THEN
1218 NULLIFY (local_rho_set_vxc)
1221 qs_kind_set, dft_control, para_env)
1223 qs_kind_set, oce, sab_orb, para_env)
1226 CALL calculate_vxc_atom(qs_env, .false., exc1=hartree_gs, xc_section_external=xc_section, &
1227 rho_atom_set_external=local_rho_set_vxc%rho_atom_set)
1231 CALL auxbas_pw_pool%create_pw(vhxc_rspace)
1235 IF (use_virial)
THEN
1236 pv_loc = virial%pv_virial
1239 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1240 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1241 IF (gapw .OR. gapw_xc)
THEN
1243 DO ispin = 1, nspins
1246 CALL pw_transfer(v_hartree_rspace_gs, vhxc_rspace)
1247 ELSEIF (gapw_xc)
THEN
1250 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1251 hmat=scrm(ispin), pmat=mpa(ispin), &
1252 qs_env=qs_env, gapw=gapw, &
1253 calculate_forces=.true.)
1256 DO ispin = 1, nspins
1258 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1259 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1260 hmat=scrm(ispin), pmat=mpa(ispin), &
1261 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1262 calculate_forces=.true.)
1266 DO ispin = 1, nspins
1268 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1269 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1270 hmat=scrm(ispin), pmat=mpa(ispin), &
1271 qs_env=qs_env, gapw=gapw, calculate_forces=.true.)
1275 IF (debug_forces)
THEN
1276 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1277 CALL para_env%sum(fodeb)
1278 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS] ", fodeb
1280 IF (debug_stress .AND. use_virial)
THEN
1281 stdeb = fconv*(virial%pv_virial - pv_loc)
1282 CALL para_env%sum(stdeb)
1283 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1287 IF (gapw .OR. gapw_xc)
THEN
1289 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1290 IF (gapw)
CALL update_ks_atom(qs_env, scrm, mpa, forces=.true., tddft=.false., &
1291 rho_atom_external=local_rho_set_gs%rho_atom_set)
1293 rho_atom_external=local_rho_set_vxc%rho_atom_set)
1294 IF (debug_forces)
THEN
1295 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1296 CALL para_env%sum(fodeb)
1297 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS]PAW ", fodeb
1306 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_gs)
1307 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_gs)
1309 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_gs)
1310 IF (
ASSOCIATED(rho_r_gs))
THEN
1311 DO ispin = 1, nspins
1312 CALL auxbas_pw_pool%give_back_pw(rho_r_gs(ispin))
1314 DEALLOCATE (rho_r_gs)
1316 IF (
ASSOCIATED(rho_g_gs))
THEN
1317 DO ispin = 1, nspins
1318 CALL auxbas_pw_pool%give_back_pw(rho_g_gs(ispin))
1320 DEALLOCATE (rho_g_gs)
1324 IF (
ASSOCIATED(vtau_rspace))
THEN
1325 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1326 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1327 DO ispin = 1, nspins
1328 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
1329 hmat=scrm(ispin), pmat=mpa(ispin), &
1330 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1331 calculate_forces=.true., compute_tau=.true.)
1333 IF (debug_forces)
THEN
1334 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1335 CALL para_env%sum(fodeb)
1336 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVxc_tau ", fodeb
1338 IF (debug_stress .AND. use_virial)
THEN
1339 stdeb = fconv*(virial%pv_virial - pv_loc)
1340 CALL para_env%sum(stdeb)
1341 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1345 CALL auxbas_pw_pool%give_back_pw(vhxc_rspace)
1348 IF (use_virial)
THEN
1349 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1354 IF (dft_control%qs_control%do_kg)
THEN
1359 IF (use_virial)
THEN
1360 pv_loc = virial%pv_virial
1363 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1366 ekin_mol=ekin_mol, &
1367 calc_force=.true., &
1368 do_kernel=.false., &
1370 IF (debug_forces)
THEN
1371 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1372 CALL para_env%sum(fodeb)
1373 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVkg ", fodeb
1375 IF (debug_stress .AND. use_virial)
THEN
1378 stdeb = 1.0_dp*fconv*ekin_mol
1379 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1382 stdeb = fconv*(virial%pv_virial - pv_loc)
1383 CALL para_env%sum(stdeb)
1384 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1387 stdeb = fconv*virial%pv_xc
1388 CALL para_env%sum(stdeb)
1389 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1392 IF (use_virial)
THEN
1394 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1405 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
1406 DO ispin = 1, nspins
1407 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
1408 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
1410 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
1411 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
1412 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
1415 DO ispin = 1, nspins
1417 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
1419 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
1421 NULLIFY (tauz_r, tauz_r_xc)
1423 ALLOCATE (rhoz_r_xc(nspins), rhoz_g_xc(nspins))
1424 DO ispin = 1, nspins
1425 CALL auxbas_pw_pool%create_pw(rhoz_r_xc(ispin))
1426 CALL auxbas_pw_pool%create_pw(rhoz_g_xc(ispin))
1428 DO ispin = 1, nspins
1430 rho=rhoz_r_xc(ispin), rho_gspace=rhoz_g_xc(ispin), &
1435 IF (needs_tau_response)
THEN
1438 ALLOCATE (tauz_r(nspins))
1439 CALL auxbas_pw_pool%create_pw(work_g)
1440 DO ispin = 1, nspins
1441 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
1443 rho=tauz_r(ispin), rho_gspace=work_g, &
1444 soft_valid=gapw, compute_tau=.true.)
1446 CALL auxbas_pw_pool%give_back_pw(work_g)
1451 ALLOCATE (tauz_r_xc(nspins))
1452 CALL auxbas_pw_pool%create_pw(work_g)
1453 DO ispin = 1, nspins
1454 CALL auxbas_pw_pool%create_pw(tauz_r_xc(ispin))
1456 rho=tauz_r_xc(ispin), rho_gspace=work_g, &
1457 soft_valid=gapw_xc, compute_tau=.true.)
1459 CALL auxbas_pw_pool%give_back_pw(work_g)
1465 IF (
PRESENT(rhopz_r))
THEN
1466 DO ispin = 1, nspins
1467 CALL pw_copy(rhoz_r(ispin), rhopz_r(ispin))
1472 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1474 CALL get_qs_env(qs_env=qs_env, rho=rho)
1477 IF (dft_control%qs_control%gapw_control%accurate_xcint)
THEN
1479 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1480 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1482 CALL qs_rho_create(rho1)
1484 CALL get_qs_env(qs_env=qs_env, rho_xc=rho0)
1485 IF (
ASSOCIATED(tauz_r_xc))
THEN
1486 CALL qs_rho_set(rho1, rho_r=rhoz_r_xc, rho_g=rhoz_g_xc, tau_r=tauz_r_xc, &
1487 rho_r_valid=.true., rho_g_valid=.true., tau_r_valid=.true.)
1489 CALL qs_rho_set(rho1, rho_r=rhoz_r_xc, rho_g=rhoz_g_xc)
1492 CALL get_qs_env(qs_env=qs_env, rho=rho0)
1493 IF (
ASSOCIATED(tauz_r))
THEN
1494 CALL qs_rho_set(rho1, rho_r=rhoz_r, rho_g=rhoz_g, tau_r=tauz_r, &
1495 rho_r_valid=.true., rho_g_valid=.true., tau_r_valid=.true.)
1497 CALL qs_rho_set(rho1, rho_r=rhoz_r, rho_g=rhoz_g)
1500 CALL accint_weight_force(qs_env, rho0, rho1, 1, xc_section)
1502 IF (debug_forces)
THEN
1503 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1504 CALL para_env%sum(fodeb)
1505 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc*dw ", fodeb
1507 IF (debug_stress .AND. use_virial)
THEN
1508 stdeb = fconv*(virial%pv_virial - stdeb)
1509 CALL para_env%sum(stdeb)
1510 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1511 'STRESS| INT Pz*dVxc*dw ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1518 IF (use_virial)
THEN
1520 CALL get_qs_env(qs_env, rho=rho)
1521 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
1524 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho)
1526 h_stress(:, :) = 0.0_dp
1533 CALL pw_poisson_solve(poisson_env, &
1534 density=rhoz_tot_gspace, &
1535 ehartree=ehartree, &
1536 vhartree=zv_hartree_gspace, &
1537 h_stress=h_stress, &
1538 aux_density=rho_tot_gspace)
1540 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1543 virial%pv_ehartree = virial%pv_ehartree + 2.0_dp*h_stress/real(para_env%num_pe, dp)
1544 virial%pv_virial = virial%pv_virial + 2.0_dp*h_stress/real(para_env%num_pe, dp)
1546 IF (debug_stress)
THEN
1547 stdeb = -1.0_dp*fconv*ehartree
1548 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1549 'STRESS| VOL 1st v_H[n_z]*n_in ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1550 stdeb = -1.0_dp*fconv*ehartree
1551 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1552 'STRESS| VOL 2nd v_H[n_in]*n_z ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1553 stdeb = fconv*(h_stress/real(para_env%num_pe, dp))
1554 CALL para_env%sum(stdeb)
1555 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1556 'STRESS| GREEN 1st v_H[n_z]*n_in ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1557 stdeb = fconv*(h_stress/real(para_env%num_pe, dp))
1558 CALL para_env%sum(stdeb)
1559 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1560 'STRESS| GREEN 2nd v_H[n_in]*n_z ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1566 DO ispin = 1, nspins
1567 exc = exc + pw_integral_ab(rhoz_r(ispin), vxc_rspace(ispin))/ &
1568 vxc_rspace(ispin)%pw_grid%dvol
1570 IF (
ASSOCIATED(vtau_rspace))
THEN
1571 DO ispin = 1, nspins
1572 exc = exc + pw_integral_ab(tauz_r(ispin), vtau_rspace(ispin))/ &
1573 vtau_rspace(ispin)%pw_grid%dvol
1578 IF (dft_control%qs_control%do_kg)
THEN
1579 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed .OR. &
1580 qs_env%kg_env%tnadd_method == kg_tnadd_embed_ri)
THEN
1581 exc = exc - ekin_mol
1585 IF (debug_stress)
THEN
1586 stdeb = -1.0_dp*fconv*exc
1587 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1588 'STRESS| VOL 1st eps_XC[n_in]*n_z', one_third_sum_diag(stdeb), det_3x3(stdeb)
1596 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rhoz_tot_gspace)
1597 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1598 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rhoz_tot_gspace)
1601 CALL pw_poisson_solve(poisson_env, rhoz_tot_gspace, ehartree, zv_hartree_gspace)
1604 IF (gapw .OR. gapw_xc)
THEN
1605 IF (
ASSOCIATED(local_rho_set_t))
CALL local_rho_set_release(local_rho_set_t)
1608 IF (debug_forces) fodeb(1:3) = force(1)%rho_core(1:3, 1)
1609 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ehartree
1610 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
1611 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
1613 CALL integrate_v_core_rspace(zv_hartree_rspace, qs_env)
1614 IF (debug_forces)
THEN
1615 fodeb(1:3) = force(1)%rho_core(1:3, 1) - fodeb(1:3)
1616 CALL para_env%sum(fodeb)
1617 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(rhoz)*dncore ", fodeb
1619 IF (debug_stress .AND. use_virial)
THEN
1620 stdeb = fconv*(virial%pv_ehartree - stdeb)
1621 CALL para_env%sum(stdeb)
1622 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1623 'STRESS| INT Vh(rhoz)*dncore ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1628 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1630 CALL get_qs_env(qs_env=qs_env, rho=rho)
1632 IF (dft_control%do_admm)
THEN
1633 CALL get_qs_env(qs_env, admm_env=admm_env)
1634 xc_section => admm_env%xc_section_primary
1636 xc_section => section_vals_get_subs_vals(qs_env%input,
"DFT%XC")
1639 IF (use_virial)
THEN
1640 virial%pv_xc = 0.0_dp
1643 NULLIFY (v_xc, v_xc_tau)
1645 CALL create_kernel(qs_env, vxc=v_xc, vxc_tau=v_xc_tau, &
1646 rho=rho_xc, rho1_r=rhoz_r_xc, rho1_g=rhoz_g_xc, tau1_r=tauz_r_xc, &
1647 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1649 CALL create_kernel(qs_env, vxc=v_xc, vxc_tau=v_xc_tau, &
1650 rho=rho, rho1_r=rhoz_r, rho1_g=rhoz_g, tau1_r=tauz_r, &
1651 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1654 IF (gapw .OR. gapw_xc)
THEN
1656 NULLIFY (local_rho_set_t)
1657 CALL local_rho_set_create(local_rho_set_t)
1658 CALL allocate_rho_atom_internals(local_rho_set_t%rho_atom_set, atomic_kind_set, &
1659 qs_kind_set, dft_control, para_env)
1660 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1662 CALL rho0_s_grid_create(pw_env, local_rho_set_t%rho0_mpole)
1663 CALL calculate_rho_atom_coeff(qs_env, mpa(:), local_rho_set_t%rho_atom_set, &
1664 qs_kind_set, oce, sab_orb, para_env)
1665 CALL prepare_gapw_den(qs_env, local_rho_set_t, do_rho0=gapw)
1666 NULLIFY (local_rho_set_gs)
1667 CALL local_rho_set_create(local_rho_set_gs)
1668 CALL allocate_rho_atom_internals(local_rho_set_gs%rho_atom_set, atomic_kind_set, &
1669 qs_kind_set, dft_control, para_env)
1670 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1671 CALL rho0_s_grid_create(pw_env, local_rho_set_gs%rho0_mpole)
1672 CALL calculate_rho_atom_coeff(qs_env, matrix_p(:, 1), local_rho_set_gs%rho_atom_set, &
1673 qs_kind_set, oce, sab_orb, para_env)
1674 CALL prepare_gapw_den(qs_env, local_rho_set_gs, do_rho0=gapw)
1676 ALLOCATE (rho_r_t(nspins), rho_g_t(nspins))
1677 DO ispin = 1, nspins
1678 CALL auxbas_pw_pool%create_pw(rho_r_t(ispin))
1679 CALL auxbas_pw_pool%create_pw(rho_g_t(ispin))
1681 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_t)
1682 total_rho_t = 0.0_dp
1683 CALL pw_zero(rho_tot_gspace_t)
1684 DO ispin = 1, nspins
1685 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpa(ispin)%matrix, &
1686 rho=rho_r_t(ispin), &
1687 rho_gspace=rho_g_t(ispin), &
1689 total_rho=total_rho_t(ispin))
1690 CALL pw_axpy(rho_g_t(ispin), rho_tot_gspace_t)
1694 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rho_tot_gspace_t)
1695 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1696 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_t)
1699 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_t)
1700 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_t)
1701 NULLIFY (hartree_local_t)
1702 CALL hartree_local_create(hartree_local_t)
1703 CALL init_coulomb_local(hartree_local_t, natom)
1704 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_t, hartree_t, v_hartree_gspace_t)
1705 CALL pw_transfer(v_hartree_gspace_t, v_hartree_rspace_t)
1706 CALL pw_scale(v_hartree_rspace_t, v_hartree_rspace_t%pw_grid%dvol)
1708 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1709 CALL vh_1c_gg_integrals(qs_env, hartree_t, hartree_local_t%ecoul_1c, local_rho_set_gs, para_env, tddft=.false., &
1710 local_rho_set_2nd=local_rho_set_t, core_2nd=.true.)
1711 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace_t, para_env, calculate_forces=.true., &
1712 local_rho_set=local_rho_set_gs, local_rho_set_2nd=local_rho_set_t)
1713 IF (debug_forces)
THEN
1714 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1715 CALL para_env%sum(fodeb)
1716 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(T)*dncore PAWg0", fodeb
1721 IF (gapw .OR. gapw_xc)
THEN
1723 IF (myfun /= xc_none)
THEN
1725 NULLIFY (local_rho_set_f)
1726 CALL local_rho_set_create(local_rho_set_f)
1727 CALL allocate_rho_atom_internals(local_rho_set_f%rho_atom_set, atomic_kind_set, &
1728 qs_kind_set, dft_control, para_env)
1729 CALL calculate_rho_atom_coeff(qs_env, mpa, local_rho_set_f%rho_atom_set, &
1730 qs_kind_set, oce, sab_orb, para_env)
1731 CALL prepare_gapw_den(qs_env, local_rho_set_f, do_rho0=.false.)
1733 CALL calculate_xc_2nd_deriv_atom(local_rho_set_gs%rho_atom_set, &
1734 local_rho_set_f%rho_atom_set, &
1735 qs_env, xc_section, para_env, &
1741 IF (use_virial)
THEN
1742 virial%pv_exc = virial%pv_exc + virial%pv_xc
1743 virial%pv_virial = virial%pv_virial + virial%pv_xc
1746 IF (debug_stress .AND. use_virial)
THEN
1747 stdeb = 1.0_dp*fconv*virial%pv_xc
1748 CALL para_env%sum(stdeb)
1749 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1750 'STRESS| GGA 2nd Pin*dK*rhoz', one_third_sum_diag(stdeb), det_3x3(stdeb)
1754 IF (use_virial)
THEN
1755 pv_loc = virial%pv_virial
1758 CALL get_qs_env(qs_env=qs_env, rho=rho)
1759 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
1760 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1762 DO ispin = 1, nspins
1763 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1765 IF ((.NOT. (gapw)) .AND. (.NOT. gapw_xc))
THEN
1766 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1767 DO ispin = 1, nspins
1768 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1769 CALL integrate_v_rspace(qs_env=qs_env, &
1770 v_rspace=v_xc(ispin), &
1771 hmat=matrix_hz(ispin), &
1772 pmat=matrix_p(ispin, 1), &
1774 calculate_forces=.true.)
1776 IF (debug_forces)
THEN
1777 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1778 CALL para_env%sum(fodeb)
1779 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1782 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1783 IF (myfun /= xc_none)
THEN
1784 DO ispin = 1, nspins
1785 CALL integrate_v_rspace(qs_env=qs_env, &
1786 v_rspace=v_xc(ispin), &
1787 hmat=matrix_hz(ispin), &
1788 pmat=matrix_p(ispin, 1), &
1790 calculate_forces=.true.)
1794 DO ispin = 1, nspins
1795 CALL pw_zero(v_xc(ispin))
1797 CALL pw_axpy(v_hartree_rspace_t, v_xc(ispin))
1798 ELSEIF (gapw_xc)
THEN
1799 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1801 CALL integrate_v_rspace(qs_env=qs_env, &
1802 v_rspace=v_xc(ispin), &
1803 hmat=matrix_ht(ispin), &
1804 pmat=matrix_p(ispin, 1), &
1806 calculate_forces=.true.)
1808 IF (debug_forces)
THEN
1809 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1810 CALL para_env%sum(fodeb)
1811 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1815 IF (gapw .OR. gapw_xc)
THEN
1817 IF (myfun /= xc_none)
THEN
1818 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1819 CALL update_ks_atom(qs_env, matrix_hz, matrix_p, forces=.true., tddft=.false., &
1820 rho_atom_external=local_rho_set_f%rho_atom_set)
1821 IF (debug_forces)
THEN
1822 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1823 CALL para_env%sum(fodeb)
1824 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKxc*(Dz+T) PAW", fodeb
1829 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1830 CALL update_ks_atom(qs_env, matrix_ht, matrix_p, forces=.true., tddft=.false., &
1831 rho_atom_external=local_rho_set_t%rho_atom_set)
1832 IF (debug_forces)
THEN
1833 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1834 CALL para_env%sum(fodeb)
1835 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKh*(Dz+T) PAW", fodeb
1839 DO ispin = 1, nspins
1840 CALL dbcsr_add(matrix_hz(ispin)%matrix, matrix_ht(ispin)%matrix, 1.0_dp, 1.0_dp)
1844 IF (myfun /= xc_none)
THEN
1845 IF (
ASSOCIATED(local_rho_set_f))
CALL local_rho_set_release(local_rho_set_f)
1847 IF (
ASSOCIATED(local_rho_set_t))
CALL local_rho_set_release(local_rho_set_t)
1848 IF (
ASSOCIATED(local_rho_set_gs))
CALL local_rho_set_release(local_rho_set_gs)
1850 IF (
ASSOCIATED(hartree_local_t))
CALL hartree_local_release(hartree_local_t)
1851 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_t)
1852 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_t)
1854 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_t)
1855 DO ispin = 1, nspins
1856 CALL auxbas_pw_pool%give_back_pw(rho_r_t(ispin))
1857 CALL auxbas_pw_pool%give_back_pw(rho_g_t(ispin))
1859 DEALLOCATE (rho_r_t, rho_g_t)
1862 IF (debug_stress .AND. use_virial)
THEN
1863 stdeb = fconv*(virial%pv_virial - stdeb)
1864 CALL para_env%sum(stdeb)
1865 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1866 'STRESS| INT 2nd f_Hxc[Pz]*Pin', one_third_sum_diag(stdeb), det_3x3(stdeb)
1869 IF (
ASSOCIATED(v_xc_tau))
THEN
1870 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1871 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1872 DO ispin = 1, nspins
1873 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
1874 CALL integrate_v_rspace(qs_env=qs_env, &
1875 v_rspace=v_xc_tau(ispin), &
1876 hmat=matrix_hz(ispin), &
1877 pmat=matrix_p(ispin, 1), &
1878 compute_tau=.true., &
1879 gapw=(gapw .OR. gapw_xc), &
1880 calculate_forces=.true.)
1882 IF (debug_forces)
THEN
1883 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1884 CALL para_env%sum(fodeb)
1885 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKtau*tauz ", fodeb
1888 IF (debug_stress .AND. use_virial)
THEN
1889 stdeb = fconv*(virial%pv_virial - stdeb)
1890 CALL para_env%sum(stdeb)
1891 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1892 'STRESS| INT 2nd f_xctau[Pz]*Pin', one_third_sum_diag(stdeb), det_3x3(stdeb)
1895 IF (use_virial)
THEN
1896 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1901 IF (dft_control%qs_control%do_kg)
THEN
1902 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed)
THEN
1904 IF (use_virial)
THEN
1905 pv_loc = virial%pv_virial
1908 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1909 IF (use_virial) virial%pv_xc = 0.0_dp
1910 CALL kg_ekin_subset(qs_env=qs_env, &
1911 ks_matrix=matrix_hz, &
1912 ekin_mol=ekin_mol, &
1913 calc_force=.true., &
1917 IF (debug_forces)
THEN
1918 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1919 CALL para_env%sum(fodeb)
1920 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*d(Kkg)*rhoz ", fodeb
1922 IF (debug_stress .AND. use_virial)
THEN
1923 stdeb = fconv*(virial%pv_virial - pv_loc)
1924 CALL para_env%sum(stdeb)
1925 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1926 'STRESS| INT KG Pin*d(KKG)*rhoz ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1928 stdeb = fconv*(virial%pv_xc)
1929 CALL para_env%sum(stdeb)
1930 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1931 'STRESS| GGA KG Pin*d(KKG)*rhoz ', one_third_sum_diag(stdeb), det_3x3(stdeb)
1935 IF (use_virial)
THEN
1937 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1940 virial%pv_exc = virial%pv_exc - virial%pv_xc
1941 virial%pv_virial = virial%pv_virial - virial%pv_xc
1942 virial%pv_xc = 0.0_dp
1946 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
1947 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
1948 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
1949 DO ispin = 1, nspins
1950 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
1951 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
1952 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1954 DEALLOCATE (rhoz_r, rhoz_g, v_xc)
1956 DO ispin = 1, nspins
1957 CALL auxbas_pw_pool%give_back_pw(rhoz_r_xc(ispin))
1958 CALL auxbas_pw_pool%give_back_pw(rhoz_g_xc(ispin))
1960 DEALLOCATE (rhoz_r_xc, rhoz_g_xc)
1962 IF (
ASSOCIATED(v_xc_tau))
THEN
1963 DO ispin = 1, nspins
1964 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
1965 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1967 DEALLOCATE (tauz_r, v_xc_tau)
1968 IF (
ASSOCIATED(tauz_r_xc))
THEN
1969 DO ispin = 1, nspins
1970 CALL auxbas_pw_pool%give_back_pw(tauz_r_xc(ispin))
1972 DEALLOCATE (tauz_r_xc)
1975 IF (debug_forces)
THEN
1976 ALLOCATE (ftot3(3, natom))
1977 CALL total_qs_force(ftot3, force, atomic_kind_set)
1978 fodeb(1:3) = ftot3(1:3, 1) - ftot2(1:3, 1)
1979 CALL para_env%sum(fodeb)
1980 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*V(rhoz)", fodeb
1982 CALL dbcsr_deallocate_matrix_set(scrm)
1983 CALL dbcsr_deallocate_matrix_set(matrix_ht)
1989 IF (dft_control%do_admm)
THEN
1991 exc_aux_fit = 0.0_dp
1993 IF (qs_env%admm_env%aux_exch_func == do_admm_aux_exch_func_none)
THEN
1995 NULLIFY (mpz, mhz, mhx, mhy)
1998 CALL get_qs_env(qs_env, admm_env=admm_env)
1999 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=scrm, &
2000 task_list_aux_fit=task_list_aux_fit)
2002 NULLIFY (mpz, mhz, mhx, mhy)
2003 CALL dbcsr_allocate_matrix_set(mhx, nspins, 1)
2004 CALL dbcsr_allocate_matrix_set(mhy, nspins, 1)
2005 CALL dbcsr_allocate_matrix_set(mpz, nspins, 1)
2006 DO ispin = 1, nspins
2007 ALLOCATE (mhx(ispin, 1)%matrix)
2008 CALL dbcsr_create(mhx(ispin, 1)%matrix, template=scrm(1)%matrix)
2009 CALL dbcsr_copy(mhx(ispin, 1)%matrix, scrm(1)%matrix)
2010 CALL dbcsr_set(mhx(ispin, 1)%matrix, 0.0_dp)
2011 ALLOCATE (mhy(ispin, 1)%matrix)
2012 CALL dbcsr_create(mhy(ispin, 1)%matrix, template=scrm(1)%matrix)
2013 CALL dbcsr_copy(mhy(ispin, 1)%matrix, scrm(1)%matrix)
2014 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
2015 ALLOCATE (mpz(ispin, 1)%matrix)
2017 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=p_env%p1_admm(ispin)%matrix)
2018 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
2019 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2022 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=matrix_pz_admm(ispin)%matrix)
2023 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2027 xc_section => admm_env%xc_section_aux
2028 xc_fun_section => section_vals_get_subs_vals(xc_section,
"XC_FUNCTIONAL")
2029 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
2030 needs_tau_response_aux = needs%tau .OR. needs%tau_spin
2033 IF (use_virial)
THEN
2034 pv_loc = virial%pv_virial
2037 basis_type =
"AUX_FIT"
2038 task_list => task_list_aux_fit
2039 IF (admm_env%do_gapw)
THEN
2040 basis_type =
"AUX_FIT_SOFT"
2041 task_list => admm_env%admm_gapw_env%task_list
2044 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2045 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2046 DO ispin = 1, nspins
2047 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
2048 hmat=mhx(ispin, 1), pmat=mpz(ispin, 1), &
2049 qs_env=qs_env, calculate_forces=.true., &
2050 basis_type=basis_type, task_list_external=task_list)
2051 IF (
ASSOCIATED(vadmm_tau_rspace))
THEN
2052 CALL integrate_v_rspace(v_rspace=vadmm_tau_rspace(ispin), &
2053 hmat=mhx(ispin, 1), pmat=mpz(ispin, 1), &
2054 qs_env=qs_env, calculate_forces=.true., compute_tau=.true., &
2055 basis_type=basis_type, task_list_external=task_list)
2058 IF (debug_forces)
THEN
2059 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2060 CALL para_env%sum(fodeb)
2061 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)", fodeb
2063 IF (debug_stress .AND. use_virial)
THEN
2064 stdeb = fconv*(virial%pv_virial - pv_loc)
2065 CALL para_env%sum(stdeb)
2066 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2067 'STRESS| INT 1st Pz*dVxc(rho_admm) ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2070 IF (use_virial)
THEN
2071 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2074 IF (admm_env%do_gapw)
THEN
2075 CALL get_admm_env(admm_env, sab_aux_fit=sab_aux_fit)
2076 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2077 CALL update_ks_atom(qs_env, mhx(:, 1), mpz(:, 1), forces=.true., tddft=.false., &
2078 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
2079 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2080 oce_external=admm_env%admm_gapw_env%oce, &
2081 sab_external=sab_aux_fit)
2082 IF (debug_forces)
THEN
2083 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2084 CALL para_env%sum(fodeb)
2085 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)PAW", fodeb
2090 NULLIFY (rhoz_g_aux, rhoz_r_aux, rhoz_tau_r_aux)
2091 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
2092 DO ispin = 1, nspins
2093 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
2094 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
2096 DO ispin = 1, nspins
2097 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpz(ispin, 1)%matrix, &
2098 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
2099 basis_type=basis_type, task_list_external=task_list)
2101 IF (needs_tau_response_aux .OR.
ASSOCIATED(vadmm_tau_rspace))
THEN
2103 TYPE(pw_c1d_gs_type) :: work_g
2104 ALLOCATE (rhoz_tau_r_aux(nspins))
2105 CALL auxbas_pw_pool%create_pw(work_g)
2106 DO ispin = 1, nspins
2107 CALL auxbas_pw_pool%create_pw(rhoz_tau_r_aux(ispin))
2108 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpz(ispin, 1)%matrix, &
2109 rho=rhoz_tau_r_aux(ispin), rho_gspace=work_g, &
2110 basis_type=basis_type, task_list_external=task_list, &
2113 CALL auxbas_pw_pool%give_back_pw(work_g)
2118 IF (use_virial)
THEN
2122 DO ispin = 1, nspins
2123 exc_aux_fit = exc_aux_fit + pw_integral_ab(rhoz_r_aux(ispin), vadmm_rspace(ispin))/ &
2124 vadmm_rspace(ispin)%pw_grid%dvol
2126 IF (
ASSOCIATED(vadmm_tau_rspace) .AND.
ASSOCIATED(rhoz_tau_r_aux))
THEN
2127 DO ispin = 1, nspins
2128 exc_aux_fit = exc_aux_fit + pw_integral_ab(rhoz_tau_r_aux(ispin), vadmm_tau_rspace(ispin))/ &
2129 vadmm_tau_rspace(ispin)%pw_grid%dvol
2133 IF (debug_stress)
THEN
2134 stdeb = -1.0_dp*fconv*exc_aux_fit
2135 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T43,2(1X,ES19.11))") &
2136 'STRESS| VOL 1st eps_XC[n_in_admm]*n_z_admm', one_third_sum_diag(stdeb), det_3x3(stdeb)
2141 NULLIFY (v_xc, v_xc_tau)
2143 IF (use_virial) virial%pv_xc = 0.0_dp
2145 CALL create_kernel(qs_env=qs_env, &
2149 rho1_r=rhoz_r_aux, &
2150 rho1_g=rhoz_g_aux, &
2151 tau1_r=rhoz_tau_r_aux, &
2152 xc_section=xc_section, &
2153 compute_virial=use_virial, &
2154 virial_xc=virial%pv_xc)
2157 IF (use_virial)
THEN
2158 virial%pv_exc = virial%pv_exc + virial%pv_xc
2159 virial%pv_virial = virial%pv_virial + virial%pv_xc
2162 IF (debug_stress .AND. use_virial)
THEN
2163 stdeb = 1.0_dp*fconv*virial%pv_xc
2164 CALL para_env%sum(stdeb)
2165 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2166 'STRESS| GGA 2nd Pin_admm*dK*rhoz_admm', one_third_sum_diag(stdeb), det_3x3(stdeb)
2169 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2171 IF (use_virial)
THEN
2172 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2174 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2175 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2176 DO ispin = 1, nspins
2177 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
2178 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2179 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
2180 hmat=mhy(ispin, 1), pmat=matrix_p(ispin, 1), &
2181 calculate_forces=.true., &
2182 basis_type=basis_type, task_list_external=task_list)
2184 IF (
ASSOCIATED(v_xc_tau))
THEN
2185 DO ispin = 1, nspins
2186 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
2187 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc_tau(ispin), &
2188 hmat=mhy(ispin, 1), pmat=matrix_p(ispin, 1), &
2189 calculate_forces=.true., compute_tau=.true., &
2190 basis_type=basis_type, task_list_external=task_list)
2193 IF (debug_forces)
THEN
2194 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2195 CALL para_env%sum(fodeb)
2196 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm ", fodeb
2198 IF (debug_stress .AND. use_virial)
THEN
2199 stdeb = fconv*(virial%pv_virial - pv_loc)
2200 CALL para_env%sum(stdeb)
2201 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2202 'STRESS| INT 2nd Pin*dK*rhoz_admm ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2205 IF (use_virial)
THEN
2206 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2209 IF (admm_env%do_gapw)
THEN
2210 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2211 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2214 CALL qs_rho_create(rho1)
2215 IF (
ASSOCIATED(rhoz_tau_r_aux))
THEN
2216 CALL qs_rho_set(rho1, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux, &
2217 tau_r=rhoz_tau_r_aux, tau_r_valid=.true.)
2219 CALL qs_rho_set(rho1, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux)
2222 CALL accint_weight_force(qs_env, rho_aux_fit, rho1, 1, xc_section)
2225 IF (debug_forces)
THEN
2226 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2227 CALL para_env%sum(fodeb)
2228 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: dKxc*rhoz_admm*dw ", fodeb
2230 IF (debug_stress .AND. use_virial)
THEN
2231 stdeb = fconv*(virial%pv_virial - stdeb)
2232 CALL para_env%sum(stdeb)
2233 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2234 'STRESS| dKxc*rhoz_admm*dw', one_third_sum_diag(stdeb), det_3x3(stdeb)
2238 DO ispin = 1, nspins
2239 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2240 IF (
ASSOCIATED(v_xc_tau))
CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
2241 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
2242 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
2243 IF (
ASSOCIATED(rhoz_tau_r_aux))
CALL auxbas_pw_pool%give_back_pw(rhoz_tau_r_aux(ispin))
2245 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
2246 IF (
ASSOCIATED(v_xc_tau))
DEALLOCATE (v_xc_tau)
2247 IF (
ASSOCIATED(rhoz_tau_r_aux))
DEALLOCATE (rhoz_tau_r_aux)
2249 IF (admm_env%do_gapw)
THEN
2250 CALL local_rho_set_create(local_rhoz_set_admm)
2251 CALL allocate_rho_atom_internals(local_rhoz_set_admm%rho_atom_set, atomic_kind_set, &
2252 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
2253 CALL calculate_rho_atom_coeff(qs_env, mpz(:, 1), local_rhoz_set_admm%rho_atom_set, &
2254 admm_env%admm_gapw_env%admm_kind_set, &
2255 admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
2256 CALL prepare_gapw_den(qs_env, local_rho_set=local_rhoz_set_admm, &
2257 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2259 CALL calculate_xc_2nd_deriv_atom(admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
2260 local_rhoz_set_admm%rho_atom_set, &
2261 qs_env, xc_section, para_env, do_triplet=.false., &
2262 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2264 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2265 CALL update_ks_atom(qs_env, mhy(:, 1), matrix_p(:, 1), forces=.true., tddft=.false., &
2266 rho_atom_external=local_rhoz_set_admm%rho_atom_set, &
2267 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2268 oce_external=admm_env%admm_gapw_env%oce, &
2269 sab_external=sab_aux_fit)
2270 IF (debug_forces)
THEN
2271 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2272 CALL para_env%sum(fodeb)
2273 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm[PAW] ", fodeb
2275 CALL local_rho_set_release(local_rhoz_set_admm)
2278 nao = admm_env%nao_orb
2279 nao_aux = admm_env%nao_aux_fit
2281 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2282 DO ispin = 1, nspins
2283 CALL cp_dbcsr_sm_fm_multiply(mhy(ispin, 1)%matrix, admm_env%A, &
2284 admm_env%work_aux_orb, nao)
2285 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
2286 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2287 admm_env%work_orb_orb)
2288 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2289 CALL dbcsr_set(dbwork, 0.0_dp)
2290 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
2291 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2293 CALL dbcsr_release(dbwork)
2295 CALL dbcsr_deallocate_matrix_set(mpz)
2304 hfx_section => section_vals_get_subs_vals(xc_section,
"HF")
2305 CALL section_vals_get(hfx_section, explicit=do_hfx)
2307 CALL section_vals_get(hfx_section, n_repetition=n_rep_hf)
2308 cpassert(n_rep_hf == 1)
2309 CALL section_vals_val_get(hfx_section,
"TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core, &
2312 IF (hfx_treat_lsd_in_core) mspin = nspins
2313 IF (use_virial) virial%pv_fock_4c = 0.0_dp
2315 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, &
2316 s_mstruct_changed=s_mstruct_changed)
2317 distribute_fock_matrix = .true.
2322 IF (dft_control%do_admm)
THEN
2323 CALL get_qs_env(qs_env=qs_env, admm_env=admm_env)
2324 CALL get_admm_env(admm_env, matrix_s_aux_fit=scrm, rho_aux_fit=rho_aux_fit)
2325 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2326 NULLIFY (mpz, mhz, mpd, mhd)
2327 CALL dbcsr_allocate_matrix_set(mpz, nspins, 1)
2328 CALL dbcsr_allocate_matrix_set(mhz, nspins, 1)
2329 CALL dbcsr_allocate_matrix_set(mpd, nspins, 1)
2330 CALL dbcsr_allocate_matrix_set(mhd, nspins, 1)
2331 DO ispin = 1, nspins
2332 ALLOCATE (mhz(ispin, 1)%matrix, mhd(ispin, 1)%matrix)
2333 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=scrm(1)%matrix)
2334 CALL dbcsr_create(mhd(ispin, 1)%matrix, template=scrm(1)%matrix)
2335 CALL dbcsr_copy(mhz(ispin, 1)%matrix, scrm(1)%matrix)
2336 CALL dbcsr_copy(mhd(ispin, 1)%matrix, scrm(1)%matrix)
2337 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
2338 CALL dbcsr_set(mhd(ispin, 1)%matrix, 0.0_dp)
2339 ALLOCATE (mpz(ispin, 1)%matrix)
2341 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2342 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
2343 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2346 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2347 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2349 mpd(ispin, 1)%matrix => matrix_p(ispin, 1)%matrix
2352 IF (x_data(1, 1)%do_hfx_ri)
THEN
2355 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2356 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2357 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2360 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhd, eh1, rho_ao=mpd, &
2361 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2362 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2367 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpz, hfx_section, &
2368 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2373 CALL integrate_four_center(qs_env, x_data, mhd, eh1, mpd, hfx_section, &
2374 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2379 CALL get_qs_env(qs_env, admm_env=admm_env)
2380 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
2381 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
2382 nao = admm_env%nao_orb
2383 nao_aux = admm_env%nao_aux_fit
2385 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2386 DO ispin = 1, nspins
2387 CALL cp_dbcsr_sm_fm_multiply(mhz(ispin, 1)%matrix, admm_env%A, &
2388 admm_env%work_aux_orb, nao)
2389 CALL parallel_gemm(
'T',
'N', nao, nao, nao_aux, &
2390 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2391 admm_env%work_orb_orb)
2392 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2393 CALL dbcsr_set(dbwork, 0.0_dp)
2394 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
2395 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2397 CALL dbcsr_release(dbwork)
2400 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
2401 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2402 DO ispin = 1, nspins
2403 CALL dbcsr_add(mhd(ispin, 1)%matrix, mhx(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2404 CALL dbcsr_add(mhz(ispin, 1)%matrix, mhy(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2407 CALL qs_rho_get(rho, rho_ao=matrix_pd)
2408 CALL admm_projection_derivative(qs_env, mhd(:, 1), mpa)
2409 CALL admm_projection_derivative(qs_env, mhz(:, 1), matrix_pd)
2410 IF (debug_forces)
THEN
2411 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
2412 CALL para_env%sum(fodeb)
2413 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx*S' ", fodeb
2415 CALL dbcsr_deallocate_matrix_set(mpz)
2416 CALL dbcsr_deallocate_matrix_set(mhz)
2417 CALL dbcsr_deallocate_matrix_set(mhd)
2418 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2419 CALL dbcsr_deallocate_matrix_set(mhx)
2420 CALL dbcsr_deallocate_matrix_set(mhy)
2427 ALLOCATE (mpz(nspins, 1), mhz(nspins, 1))
2428 DO ispin = 1, nspins
2429 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
2430 mpz(ispin, 1)%matrix => mpa(ispin)%matrix
2433 IF (x_data(1, 1)%do_hfx_ri)
THEN
2436 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2437 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2438 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2442 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpz, hfx_section, &
2443 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2447 DEALLOCATE (mhz, mpz)
2455 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
2456 IF (dft_control%do_admm)
THEN
2460 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2461 NULLIFY (matrix_pza)
2462 CALL dbcsr_allocate_matrix_set(matrix_pza, nspins)
2463 DO ispin = 1, nspins
2464 ALLOCATE (matrix_pza(ispin)%matrix)
2466 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=p_env%p1_admm(ispin)%matrix)
2467 CALL dbcsr_copy(matrix_pza(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
2468 CALL dbcsr_add(matrix_pza(ispin)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2471 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=matrix_pz_admm(ispin)%matrix)
2472 CALL dbcsr_copy(matrix_pza(ispin)%matrix, matrix_pz_admm(ispin)%matrix)
2475 IF (x_data(1, 1)%do_hfx_ri)
THEN
2477 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
2478 x_data(1, 1)%general_parameter%fraction, &
2479 rho_ao=matrix_p, rho_ao_resp=matrix_pza, &
2480 use_virial=use_virial, resp_only=resp_only)
2482 CALL derivatives_four_center(qs_env, matrix_p, matrix_pza, hfx_section, para_env, &
2483 1, use_virial, resp_only=resp_only)
2485 CALL dbcsr_deallocate_matrix_set(matrix_pza)
2490 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
2491 IF (x_data(1, 1)%do_hfx_ri)
THEN
2493 CALL hfx_ri_update_forces(qs_env, x_data(1, 1)%ri_data, nspins, &
2494 x_data(1, 1)%general_parameter%fraction, &
2495 rho_ao=matrix_p, rho_ao_resp=mpa, &
2496 use_virial=use_virial, resp_only=resp_only)
2498 CALL derivatives_four_center(qs_env, matrix_p, mpa, hfx_section, para_env, &
2499 1, use_virial, resp_only=resp_only)
2503 IF (use_virial)
THEN
2504 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
2505 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
2506 virial%pv_calculate = .false.
2509 IF (debug_forces)
THEN
2510 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
2511 CALL para_env%sum(fodeb)
2512 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx ", fodeb
2514 IF (debug_stress .AND. use_virial)
THEN
2515 stdeb = -1.0_dp*fconv*virial%pv_fock_4c
2516 CALL para_env%sum(stdeb)
2517 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2518 'STRESS| Pz*hfx ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2524 IF (use_virial)
THEN
2526 zehartree = zehartree + 2.0_dp*ehartree
2529 IF (dft_control%do_admm)
THEN
2530 zexc_aux_fit = zexc_aux_fit + exc_aux_fit
2537 IF (dft_control%qs_control%do_ls_scf)
THEN
2539 eps_filter = dft_control%qs_control%eps_filter_matrix
2540 CALL calculate_whz_ao_matrix(qs_env, matrix_hz, matrix_wz, eps_filter)
2543 matrix_wz => p_env%w1
2546 IF (nspins == 1) focc = 2.0_dp
2547 CALL get_qs_env(qs_env, mos=mos)
2548 DO ispin = 1, nspins
2549 CALL get_mo_set(mo_set=mos(ispin), homo=nocc)
2550 CALL calculate_whz_matrix(mos(ispin)%mo_coeff, matrix_hz(ispin)%matrix, &
2551 matrix_wz(ispin)%matrix, focc, nocc)
2554 IF (nspins == 2)
THEN
2555 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2556 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
2559 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
2560 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
2562 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
2563 matrix_name=
"OVERLAP MATRIX", &
2564 basis_type_a=
"ORB", basis_type_b=
"ORB", &
2565 sab_nl=sab_orb, calculate_forces=.true., &
2566 matrix_p=matrix_wz(1)%matrix)
2568 IF (
SIZE(matrix_wz, 1) == 2)
THEN
2569 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2570 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
2573 IF (debug_forces)
THEN
2574 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
2575 CALL para_env%sum(fodeb)
2576 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wz*dS ", fodeb
2578 IF (debug_stress .AND. use_virial)
THEN
2579 stdeb = fconv*(virial%pv_overlap - stdeb)
2580 CALL para_env%sum(stdeb)
2581 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2582 'STRESS| WHz ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2584 CALL dbcsr_deallocate_matrix_set(scrm)
2586 IF (debug_forces)
THEN
2587 CALL total_qs_force(ftot2, force, atomic_kind_set)
2588 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
2589 CALL para_env%sum(fodeb)
2590 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Response Force", fodeb
2591 fodeb(1:3) = ftot2(1:3, 1)
2592 CALL para_env%sum(fodeb)
2593 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Total Force ", fodeb
2594 DEALLOCATE (ftot1, ftot2, ftot3)
2596 IF (debug_stress .AND. use_virial)
THEN
2597 stdeb = fconv*(virial%pv_virial - sttot)
2598 CALL para_env%sum(stdeb)
2599 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2600 'STRESS| Stress Response ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2601 stdeb = fconv*(virial%pv_virial)
2602 CALL para_env%sum(stdeb)
2603 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2604 'STRESS| Total Stress ', one_third_sum_diag(stdeb), det_3x3(stdeb)
2605 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,3(1X,ES19.11))") &
2606 stdeb(1, 1), stdeb(2, 2), stdeb(3, 3)
2611 CALL dbcsr_deallocate_matrix_set(mpa)
2612 CALL dbcsr_deallocate_matrix_set(matrix_hz)
2615 CALL timestop(handle)