847 SUBROUTINE response_force(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, &
848 matrix_hz, matrix_pz, matrix_pz_admm, matrix_wz, &
849 zehartree, zexc, zexc_aux_fit, rhopz_r, p_env, ex_env, debug)
852 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: vxc_rspace, vtau_rspace, vadmm_rspace
853 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz, matrix_pz, matrix_pz_admm, &
855 REAL(kind=
dp),
OPTIONAL :: zehartree, zexc, zexc_aux_fit
857 INTENT(INOUT),
OPTIONAL :: rhopz_r
860 LOGICAL,
INTENT(IN),
OPTIONAL :: debug
862 CHARACTER(LEN=*),
PARAMETER :: routinen =
'response_force'
864 CHARACTER(LEN=default_string_length) :: basis_type, unitstr
865 INTEGER :: handle, iounit, ispin, mspin, myfun, &
866 n_rep_hf, nao, nao_aux, natom, nder, &
868 LOGICAL :: debug_forces, debug_stress, distribute_fock_matrix, do_ex, do_hfx, gapw, gapw_xc, &
869 hfx_treat_lsd_in_core, resp_only, s_mstruct_changed, use_virial
870 REAL(kind=
dp) :: eh1, ehartree, ekin_mol, eps_filter, &
871 exc, exc_aux_fit, fconv, focc, &
872 hartree_gs, hartree_t
873 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot1, ftot2, ftot3
874 REAL(kind=
dp),
DIMENSION(2) :: total_rho_gs, total_rho_t
875 REAL(kind=
dp),
DIMENSION(3) :: fodeb
876 REAL(kind=
dp),
DIMENSION(3, 3) :: h_stress, pv_loc, stdeb, sttot, sttot2
882 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ht, matrix_pd, matrix_pza, &
884 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_p, mhd, mhx, mhy, mhz, &
885 mpa2, mpd, mpz, scrm2
889 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
891 TYPE(
local_rho_type),
POINTER :: local_rho_set_f, local_rho_set_gs, &
892 local_rho_set_t, local_rho_set_vxc, &
897 POINTER :: sab_aux_fit, sab_orb
900 TYPE(
pw_c1d_gs_type) :: rho_tot_gspace, rho_tot_gspace_gs, rho_tot_gspace_t, &
901 rhoz_tot_gspace, v_hartree_gspace_gs, v_hartree_gspace_t, zv_hartree_gspace
902 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g_aux, rho_g_gs, rho_g_t, rhoz_g, &
903 rhoz_g_aux, rhoz_g_xc
908 TYPE(
pw_r3d_rs_type) :: v_hartree_rspace_gs, v_hartree_rspace_t, &
909 vhxc_rspace, zv_hartree_rspace
910 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_aux, rho_r_gs, rho_r_t, rhoz_r, &
911 rhoz_r_aux, rhoz_r_xc, tau_r_aux, &
912 tauz_r, tauz_r_xc, v_xc, v_xc_tau
914 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
916 TYPE(
qs_rho_type),
POINTER :: rho, rho0, rho1, rho_aux_fit, rho_xc
921 CALL timeset(routinen, handle)
923 IF (
PRESENT(debug))
THEN
927 debug_forces = .false.
928 debug_stress = .false.
932 IF (logger%para_env%is_source())
THEN
939 IF (
PRESENT(ex_env)) do_ex = .true.
941 cpassert(
PRESENT(p_env))
944 NULLIFY (ks_env, sab_orb, virial)
949 dft_control=dft_control, &
953 nspins = dft_control%nspins
954 gapw = dft_control%qs_control%gapw
955 gapw_xc = dft_control%qs_control%gapw_xc
957 IF (debug_forces)
THEN
958 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
959 ALLOCATE (ftot1(3, natom))
964 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
966 IF (use_virial .AND. do_ex)
THEN
967 CALL cp_abort(__location__,
"Stress Tensor not available for TDDFT calculations.")
970 fconv = 1.0e-9_dp*
pascal/cell%deth
971 IF (debug_stress .AND. use_virial)
THEN
972 sttot = virial%pv_virial
982 ALLOCATE (mpa(ispin)%matrix)
983 CALL dbcsr_create(mpa(ispin)%matrix, template=p_env%p1(ispin)%matrix)
984 CALL dbcsr_copy(mpa(ispin)%matrix, p_env%p1(ispin)%matrix)
985 CALL dbcsr_add(mpa(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix, 1.0_dp, 1.0_dp)
986 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
992 IF (do_ex .OR. (gapw .OR. gapw_xc))
THEN
995 ALLOCATE (matrix_ht(ispin)%matrix)
996 CALL dbcsr_create(matrix_ht(ispin)%matrix, template=matrix_hz(ispin)%matrix)
997 CALL dbcsr_copy(matrix_ht(ispin)%matrix, matrix_hz(ispin)%matrix)
998 CALL dbcsr_set(matrix_ht(ispin)%matrix, 0.0_dp)
1007 mpa2(1:nspins, 1:1) => mpa(1:nspins)
1009 matrix_name=
"KINETIC ENERGY MATRIX", &
1011 sab_orb=sab_orb, calculate_forces=.true., &
1012 debug_forces=debug_forces, debug_stress=debug_stress)
1016 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
1019 DO ispin = 1, nspins
1020 ALLOCATE (scrm(ispin)%matrix)
1021 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_s(1)%matrix)
1022 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_s(1)%matrix)
1023 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1026 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, &
1027 atomic_kind_set=atomic_kind_set)
1029 ALLOCATE (matrix_p(nspins, 1), matrix_h(nspins, 1))
1030 DO ispin = 1, nspins
1031 matrix_p(ispin, 1)%matrix => mpa(ispin)%matrix
1032 matrix_h(ispin, 1)%matrix => scrm(ispin)%matrix
1034 matrix_h(1, 1)%matrix => scrm(1)%matrix
1037 CALL core_matrices(qs_env, matrix_h, matrix_p, .true., nder, &
1038 debug_forces=debug_forces, debug_stress=debug_stress)
1042 IF (dft_control%qs_control%do_kg)
THEN
1044 CALL get_qs_env(qs_env=qs_env, kg_env=kg_env, dbcsr_dist=dbcsr_dist)
1046 IF (use_virial)
THEN
1047 pv_loc = virial%pv_virial
1050 IF (debug_forces) fodeb(1:3) = force(1)%kinetic(1:3, 1)
1051 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1052 CALL build_tnadd_mat(kg_env=kg_env, matrix_p=matrix_p, force=force, virial=virial, &
1053 calculate_forces=.true., use_virial=use_virial, &
1054 qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set, &
1055 particle_set=particle_set, sab_orb=sab_orb, dbcsr_dist=dbcsr_dist)
1056 IF (debug_forces)
THEN
1057 fodeb(1:3) = force(1)%kinetic(1:3, 1) - fodeb(1:3)
1058 CALL para_env%sum(fodeb)
1059 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dTnadd ", fodeb
1061 IF (debug_stress .AND. use_virial)
THEN
1062 stdeb = fconv*(virial%pv_virial - stdeb)
1063 CALL para_env%sum(stdeb)
1064 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1069 IF (use_virial)
THEN
1070 virial%pv_ekinetic = virial%pv_ekinetic + (virial%pv_virial - pv_loc)
1076 DEALLOCATE (matrix_h)
1077 DEALLOCATE (matrix_p)
1085 DO ispin = 1, nspins
1086 ALLOCATE (scrm(ispin)%matrix)
1087 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_pz(1)%matrix)
1088 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_pz(ispin)%matrix)
1089 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1092 IF (debug_forces)
THEN
1093 ALLOCATE (ftot2(3, natom))
1095 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
1096 CALL para_env%sum(fodeb)
1097 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dHcore", fodeb
1099 IF (debug_stress .AND. use_virial)
THEN
1100 stdeb = fconv*(virial%pv_virial - sttot)
1101 CALL para_env%sum(stdeb)
1102 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1105 sttot2 = virial%pv_virial
1113 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
1115 IF (dft_control%do_admm)
THEN
1117 xc_section => admm_env%xc_section_primary
1124 IF (gapw .OR. gapw_xc)
THEN
1125 NULLIFY (oce, sab_orb)
1126 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab_orb)
1128 NULLIFY (local_rho_set_gs)
1133 qs_kind_set, dft_control, para_env)
1134 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1137 qs_kind_set, oce, sab_orb, para_env)
1140 NULLIFY (local_rho_set_t)
1143 qs_kind_set, dft_control, para_env)
1144 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1148 qs_kind_set, oce, sab_orb, para_env)
1152 ALLOCATE (rho_r_gs(nspins), rho_g_gs(nspins))
1153 DO ispin = 1, nspins
1154 CALL auxbas_pw_pool%create_pw(rho_r_gs(ispin))
1155 CALL auxbas_pw_pool%create_pw(rho_g_gs(ispin))
1157 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_gs)
1159 total_rho_gs = 0.0_dp
1160 CALL pw_zero(rho_tot_gspace_gs)
1161 DO ispin = 1, nspins
1163 rho=rho_r_gs(ispin), &
1164 rho_gspace=rho_g_gs(ispin), &
1165 soft_valid=(gapw .OR. gapw_xc), &
1166 total_rho=total_rho_gs(ispin))
1167 CALL pw_axpy(rho_g_gs(ispin), rho_tot_gspace_gs)
1172 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rho0_s_gs, rho_tot_gspace_gs)
1173 IF (
ASSOCIATED(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs))
THEN
1174 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_gs)
1176 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1177 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
1178 CALL pw_axpy(rho_core, rho_tot_gspace_gs)
1181 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_gs)
1182 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_gs)
1183 NULLIFY (hartree_local_gs)
1186 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_gs, hartree_gs, v_hartree_gspace_gs)
1187 CALL pw_transfer(v_hartree_gspace_gs, v_hartree_rspace_gs)
1188 CALL pw_scale(v_hartree_rspace_gs, v_hartree_rspace_gs%pw_grid%dvol)
1194 cpassert(.NOT. use_virial)
1195 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1196 CALL vh_1c_gg_integrals(qs_env, hartree_gs, hartree_local_gs%ecoul_1c, local_rho_set_t, para_env, tddft=.true., &
1197 local_rho_set_2nd=local_rho_set_gs, core_2nd=.false.)
1200 local_rho_set=local_rho_set_t, local_rho_set_2nd=local_rho_set_gs)
1201 IF (debug_forces)
THEN
1202 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1203 CALL para_env%sum(fodeb)
1204 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVh[D^GS]PAWg0", fodeb
1207 IF (gapw .OR. gapw_xc)
THEN
1210 NULLIFY (local_rho_set_vxc)
1213 qs_kind_set, dft_control, para_env)
1215 qs_kind_set, oce, sab_orb, para_env)
1218 CALL calculate_vxc_atom(qs_env, .false., exc1=hartree_gs, xc_section_external=xc_section, &
1219 rho_atom_set_external=local_rho_set_vxc%rho_atom_set)
1223 CALL auxbas_pw_pool%create_pw(vhxc_rspace)
1227 IF (use_virial)
THEN
1228 pv_loc = virial%pv_virial
1231 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1232 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1233 IF (gapw .OR. gapw_xc)
THEN
1235 DO ispin = 1, nspins
1238 CALL pw_transfer(v_hartree_rspace_gs, vhxc_rspace)
1239 ELSEIF (gapw_xc)
THEN
1242 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1243 hmat=scrm(ispin), pmat=mpa(ispin), &
1244 qs_env=qs_env, gapw=gapw, &
1245 calculate_forces=.true.)
1248 DO ispin = 1, nspins
1250 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1251 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1252 hmat=scrm(ispin), pmat=mpa(ispin), &
1253 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1254 calculate_forces=.true.)
1258 DO ispin = 1, nspins
1260 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1261 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1262 hmat=scrm(ispin), pmat=mpa(ispin), &
1263 qs_env=qs_env, gapw=gapw, calculate_forces=.true.)
1267 IF (debug_forces)
THEN
1268 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1269 CALL para_env%sum(fodeb)
1270 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS] ", fodeb
1272 IF (debug_stress .AND. use_virial)
THEN
1273 stdeb = fconv*(virial%pv_virial - pv_loc)
1274 CALL para_env%sum(stdeb)
1275 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1279 IF (gapw .OR. gapw_xc)
THEN
1281 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1282 IF (gapw)
CALL update_ks_atom(qs_env, scrm, mpa, forces=.true., tddft=.false., &
1283 rho_atom_external=local_rho_set_gs%rho_atom_set)
1285 rho_atom_external=local_rho_set_vxc%rho_atom_set)
1286 IF (debug_forces)
THEN
1287 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1288 CALL para_env%sum(fodeb)
1289 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS]PAW ", fodeb
1298 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_gs)
1299 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_gs)
1301 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_gs)
1302 IF (
ASSOCIATED(rho_r_gs))
THEN
1303 DO ispin = 1, nspins
1304 CALL auxbas_pw_pool%give_back_pw(rho_r_gs(ispin))
1306 DEALLOCATE (rho_r_gs)
1308 IF (
ASSOCIATED(rho_g_gs))
THEN
1309 DO ispin = 1, nspins
1310 CALL auxbas_pw_pool%give_back_pw(rho_g_gs(ispin))
1312 DEALLOCATE (rho_g_gs)
1316 IF (
ASSOCIATED(vtau_rspace))
THEN
1317 cpassert(.NOT. (gapw .OR. gapw_xc))
1318 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1319 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1320 DO ispin = 1, nspins
1321 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
1322 hmat=scrm(ispin), pmat=mpa(ispin), &
1323 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1324 calculate_forces=.true., compute_tau=.true.)
1326 IF (debug_forces)
THEN
1327 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1328 CALL para_env%sum(fodeb)
1329 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVxc_tau ", fodeb
1331 IF (debug_stress .AND. use_virial)
THEN
1332 stdeb = fconv*(virial%pv_virial - pv_loc)
1333 CALL para_env%sum(stdeb)
1334 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1338 CALL auxbas_pw_pool%give_back_pw(vhxc_rspace)
1341 IF (use_virial)
THEN
1342 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1347 IF (dft_control%qs_control%do_kg)
THEN
1352 IF (use_virial)
THEN
1353 pv_loc = virial%pv_virial
1356 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1359 ekin_mol=ekin_mol, &
1360 calc_force=.true., &
1361 do_kernel=.false., &
1363 IF (debug_forces)
THEN
1364 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1365 CALL para_env%sum(fodeb)
1366 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVkg ", fodeb
1368 IF (debug_stress .AND. use_virial)
THEN
1371 stdeb = 1.0_dp*fconv*ekin_mol
1372 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1375 stdeb = fconv*(virial%pv_virial - pv_loc)
1376 CALL para_env%sum(stdeb)
1377 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1380 stdeb = fconv*virial%pv_xc
1381 CALL para_env%sum(stdeb)
1382 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1385 IF (use_virial)
THEN
1387 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1398 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
1399 DO ispin = 1, nspins
1400 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
1401 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
1403 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
1404 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
1405 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
1408 DO ispin = 1, nspins
1410 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
1412 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
1416 ALLOCATE (rhoz_r_xc(nspins), rhoz_g_xc(nspins))
1417 DO ispin = 1, nspins
1418 CALL auxbas_pw_pool%create_pw(rhoz_r_xc(ispin))
1419 CALL auxbas_pw_pool%create_pw(rhoz_g_xc(ispin))
1421 DO ispin = 1, nspins
1423 rho=rhoz_r_xc(ispin), rho_gspace=rhoz_g_xc(ispin), &
1428 IF (
ASSOCIATED(vtau_rspace))
THEN
1429 cpassert(.NOT. (gapw .OR. gapw_xc))
1432 ALLOCATE (tauz_r(nspins))
1433 CALL auxbas_pw_pool%create_pw(work_g)
1434 DO ispin = 1, nspins
1435 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
1437 rho=tauz_r(ispin), rho_gspace=work_g, &
1440 CALL auxbas_pw_pool%give_back_pw(work_g)
1445 IF (
PRESENT(rhopz_r))
THEN
1446 DO ispin = 1, nspins
1447 CALL pw_copy(rhoz_r(ispin), rhopz_r(ispin))
1452 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1457 IF (dft_control%qs_control%gapw_control%accurate_xcint)
THEN
1459 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1460 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1465 CALL qs_rho_set(rho1, rho_r=rhoz_r_xc, rho_g=rhoz_g_xc)
1468 CALL qs_rho_set(rho1, rho_r=rhoz_r, rho_g=rhoz_g)
1472 IF (debug_forces)
THEN
1473 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1474 CALL para_env%sum(fodeb)
1475 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc*dw ", fodeb
1477 IF (debug_stress .AND. use_virial)
THEN
1478 stdeb = fconv*(virial%pv_virial - stdeb)
1479 CALL para_env%sum(stdeb)
1480 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1488 IF (use_virial)
THEN
1491 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
1496 h_stress(:, :) = 0.0_dp
1504 density=rhoz_tot_gspace, &
1505 ehartree=ehartree, &
1506 vhartree=zv_hartree_gspace, &
1507 h_stress=h_stress, &
1508 aux_density=rho_tot_gspace)
1510 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1513 virial%pv_ehartree = virial%pv_ehartree + 2.0_dp*h_stress/real(para_env%num_pe,
dp)
1514 virial%pv_virial = virial%pv_virial + 2.0_dp*h_stress/real(para_env%num_pe,
dp)
1516 IF (debug_stress)
THEN
1517 stdeb = -1.0_dp*fconv*ehartree
1518 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1520 stdeb = -1.0_dp*fconv*ehartree
1521 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1523 stdeb = fconv*(h_stress/real(para_env%num_pe,
dp))
1524 CALL para_env%sum(stdeb)
1525 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1527 stdeb = fconv*(h_stress/real(para_env%num_pe,
dp))
1528 CALL para_env%sum(stdeb)
1529 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1536 DO ispin = 1, nspins
1538 vxc_rspace(ispin)%pw_grid%dvol
1540 IF (
ASSOCIATED(vtau_rspace))
THEN
1541 DO ispin = 1, nspins
1543 vtau_rspace(ispin)%pw_grid%dvol
1548 IF (dft_control%qs_control%do_kg)
THEN
1551 exc = exc - ekin_mol
1555 IF (debug_stress)
THEN
1556 stdeb = -1.0_dp*fconv*exc
1557 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1566 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rhoz_tot_gspace)
1567 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1568 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rhoz_tot_gspace)
1571 CALL pw_poisson_solve(poisson_env, rhoz_tot_gspace, ehartree, zv_hartree_gspace)
1574 IF (gapw .OR. gapw_xc)
THEN
1578 IF (debug_forces) fodeb(1:3) = force(1)%rho_core(1:3, 1)
1579 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ehartree
1580 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
1581 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
1583 CALL integrate_v_core_rspace(zv_hartree_rspace, qs_env)
1584 IF (debug_forces)
THEN
1585 fodeb(1:3) = force(1)%rho_core(1:3, 1) - fodeb(1:3)
1586 CALL para_env%sum(fodeb)
1587 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(rhoz)*dncore ", fodeb
1589 IF (debug_stress .AND. use_virial)
THEN
1590 stdeb = fconv*(virial%pv_ehartree - stdeb)
1591 CALL para_env%sum(stdeb)
1592 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1598 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1602 IF (dft_control%do_admm)
THEN
1604 xc_section => admm_env%xc_section_primary
1609 IF (use_virial)
THEN
1610 virial%pv_xc = 0.0_dp
1613 NULLIFY (v_xc, v_xc_tau)
1616 rho=rho_xc, rho1_r=rhoz_r_xc, rho1_g=rhoz_g_xc, tau1_r=tauz_r_xc, &
1617 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1620 rho=rho, rho1_r=rhoz_r, rho1_g=rhoz_g, tau1_r=tauz_r, &
1621 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1624 IF (gapw .OR. gapw_xc)
THEN
1626 NULLIFY (local_rho_set_t)
1629 qs_kind_set, dft_control, para_env)
1630 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1634 qs_kind_set, oce, sab_orb, para_env)
1636 NULLIFY (local_rho_set_gs)
1639 qs_kind_set, dft_control, para_env)
1640 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1643 qs_kind_set, oce, sab_orb, para_env)
1646 ALLOCATE (rho_r_t(nspins), rho_g_t(nspins))
1647 DO ispin = 1, nspins
1648 CALL auxbas_pw_pool%create_pw(rho_r_t(ispin))
1649 CALL auxbas_pw_pool%create_pw(rho_g_t(ispin))
1651 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_t)
1652 total_rho_t = 0.0_dp
1653 CALL pw_zero(rho_tot_gspace_t)
1654 DO ispin = 1, nspins
1656 rho=rho_r_t(ispin), &
1657 rho_gspace=rho_g_t(ispin), &
1659 total_rho=total_rho_t(ispin))
1660 CALL pw_axpy(rho_g_t(ispin), rho_tot_gspace_t)
1664 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rho_tot_gspace_t)
1665 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1666 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_t)
1669 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_t)
1670 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_t)
1671 NULLIFY (hartree_local_t)
1674 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_t, hartree_t, v_hartree_gspace_t)
1675 CALL pw_transfer(v_hartree_gspace_t, v_hartree_rspace_t)
1676 CALL pw_scale(v_hartree_rspace_t, v_hartree_rspace_t%pw_grid%dvol)
1678 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1679 CALL vh_1c_gg_integrals(qs_env, hartree_t, hartree_local_t%ecoul_1c, local_rho_set_gs, para_env, tddft=.false., &
1680 local_rho_set_2nd=local_rho_set_t, core_2nd=.true.)
1682 local_rho_set=local_rho_set_gs, local_rho_set_2nd=local_rho_set_t)
1683 IF (debug_forces)
THEN
1684 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1685 CALL para_env%sum(fodeb)
1686 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(T)*dncore PAWg0", fodeb
1691 IF (gapw .OR. gapw_xc)
THEN
1695 NULLIFY (local_rho_set_f)
1698 qs_kind_set, dft_control, para_env)
1700 qs_kind_set, oce, sab_orb, para_env)
1704 local_rho_set_f%rho_atom_set, &
1705 qs_env, xc_section, para_env, &
1711 IF (use_virial)
THEN
1712 virial%pv_exc = virial%pv_exc + virial%pv_xc
1713 virial%pv_virial = virial%pv_virial + virial%pv_xc
1716 IF (debug_stress .AND. use_virial)
THEN
1717 stdeb = 1.0_dp*fconv*virial%pv_xc
1718 CALL para_env%sum(stdeb)
1719 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1724 IF (use_virial)
THEN
1725 pv_loc = virial%pv_virial
1730 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1732 DO ispin = 1, nspins
1733 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1735 IF ((.NOT. (gapw)) .AND. (.NOT. gapw_xc))
THEN
1736 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1737 DO ispin = 1, nspins
1738 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1739 CALL integrate_v_rspace(qs_env=qs_env, &
1740 v_rspace=v_xc(ispin), &
1741 hmat=matrix_hz(ispin), &
1742 pmat=matrix_p(ispin, 1), &
1744 calculate_forces=.true.)
1746 IF (debug_forces)
THEN
1747 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1748 CALL para_env%sum(fodeb)
1749 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1752 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1754 DO ispin = 1, nspins
1755 CALL integrate_v_rspace(qs_env=qs_env, &
1756 v_rspace=v_xc(ispin), &
1757 hmat=matrix_hz(ispin), &
1758 pmat=matrix_p(ispin, 1), &
1760 calculate_forces=.true.)
1764 DO ispin = 1, nspins
1767 CALL pw_axpy(v_hartree_rspace_t, v_xc(ispin))
1768 ELSEIF (gapw_xc)
THEN
1769 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1771 CALL integrate_v_rspace(qs_env=qs_env, &
1772 v_rspace=v_xc(ispin), &
1773 hmat=matrix_ht(ispin), &
1774 pmat=matrix_p(ispin, 1), &
1776 calculate_forces=.true.)
1778 IF (debug_forces)
THEN
1779 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1780 CALL para_env%sum(fodeb)
1781 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1785 IF (gapw .OR. gapw_xc)
THEN
1788 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1789 CALL update_ks_atom(qs_env, matrix_hz, matrix_p, forces=.true., tddft=.false., &
1790 rho_atom_external=local_rho_set_f%rho_atom_set)
1791 IF (debug_forces)
THEN
1792 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1793 CALL para_env%sum(fodeb)
1794 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKxc*(Dz+T) PAW", fodeb
1799 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1800 CALL update_ks_atom(qs_env, matrix_ht, matrix_p, forces=.true., tddft=.false., &
1801 rho_atom_external=local_rho_set_t%rho_atom_set)
1802 IF (debug_forces)
THEN
1803 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1804 CALL para_env%sum(fodeb)
1805 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKh*(Dz+T) PAW", fodeb
1809 DO ispin = 1, nspins
1810 CALL dbcsr_add(matrix_hz(ispin)%matrix, matrix_ht(ispin)%matrix, 1.0_dp, 1.0_dp)
1821 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_t)
1822 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_t)
1824 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_t)
1825 DO ispin = 1, nspins
1826 CALL auxbas_pw_pool%give_back_pw(rho_r_t(ispin))
1827 CALL auxbas_pw_pool%give_back_pw(rho_g_t(ispin))
1829 DEALLOCATE (rho_r_t, rho_g_t)
1832 IF (debug_stress .AND. use_virial)
THEN
1833 stdeb = fconv*(virial%pv_virial - stdeb)
1834 CALL para_env%sum(stdeb)
1835 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1839 IF (
ASSOCIATED(v_xc_tau))
THEN
1840 cpassert(.NOT. (gapw .OR. gapw_xc))
1841 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1842 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1843 DO ispin = 1, nspins
1844 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
1845 CALL integrate_v_rspace(qs_env=qs_env, &
1846 v_rspace=v_xc_tau(ispin), &
1847 hmat=matrix_hz(ispin), &
1848 pmat=matrix_p(ispin, 1), &
1849 compute_tau=.true., &
1850 gapw=(gapw .OR. gapw_xc), &
1851 calculate_forces=.true.)
1853 IF (debug_forces)
THEN
1854 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1855 CALL para_env%sum(fodeb)
1856 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKtau*tauz ", fodeb
1859 IF (debug_stress .AND. use_virial)
THEN
1860 stdeb = fconv*(virial%pv_virial - stdeb)
1861 CALL para_env%sum(stdeb)
1862 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1866 IF (use_virial)
THEN
1867 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1872 IF (dft_control%qs_control%do_kg)
THEN
1875 IF (use_virial)
THEN
1876 pv_loc = virial%pv_virial
1879 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1880 IF (use_virial) virial%pv_xc = 0.0_dp
1882 ks_matrix=matrix_hz, &
1883 ekin_mol=ekin_mol, &
1884 calc_force=.true., &
1888 IF (debug_forces)
THEN
1889 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1890 CALL para_env%sum(fodeb)
1891 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*d(Kkg)*rhoz ", fodeb
1893 IF (debug_stress .AND. use_virial)
THEN
1894 stdeb = fconv*(virial%pv_virial - pv_loc)
1895 CALL para_env%sum(stdeb)
1896 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1899 stdeb = fconv*(virial%pv_xc)
1900 CALL para_env%sum(stdeb)
1901 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1906 IF (use_virial)
THEN
1908 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1911 virial%pv_exc = virial%pv_exc - virial%pv_xc
1912 virial%pv_virial = virial%pv_virial - virial%pv_xc
1913 virial%pv_xc = 0.0_dp
1917 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
1918 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
1919 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
1920 DO ispin = 1, nspins
1921 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
1922 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
1923 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1925 DEALLOCATE (rhoz_r, rhoz_g, v_xc)
1927 DO ispin = 1, nspins
1928 CALL auxbas_pw_pool%give_back_pw(rhoz_r_xc(ispin))
1929 CALL auxbas_pw_pool%give_back_pw(rhoz_g_xc(ispin))
1931 DEALLOCATE (rhoz_r_xc, rhoz_g_xc)
1933 IF (
ASSOCIATED(v_xc_tau))
THEN
1934 DO ispin = 1, nspins
1935 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
1936 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1938 DEALLOCATE (tauz_r, v_xc_tau)
1940 IF (debug_forces)
THEN
1941 ALLOCATE (ftot3(3, natom))
1943 fodeb(1:3) = ftot3(1:3, 1) - ftot2(1:3, 1)
1944 CALL para_env%sum(fodeb)
1945 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*V(rhoz)", fodeb
1954 IF (dft_control%do_admm)
THEN
1956 exc_aux_fit = 0.0_dp
1960 NULLIFY (mpz, mhz, mhx, mhy)
1964 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=scrm, &
1965 task_list_aux_fit=task_list_aux_fit)
1967 NULLIFY (mpz, mhz, mhx, mhy)
1971 DO ispin = 1, nspins
1972 ALLOCATE (mhx(ispin, 1)%matrix)
1973 CALL dbcsr_create(mhx(ispin, 1)%matrix, template=scrm(1)%matrix)
1974 CALL dbcsr_copy(mhx(ispin, 1)%matrix, scrm(1)%matrix)
1975 CALL dbcsr_set(mhx(ispin, 1)%matrix, 0.0_dp)
1976 ALLOCATE (mhy(ispin, 1)%matrix)
1977 CALL dbcsr_create(mhy(ispin, 1)%matrix, template=scrm(1)%matrix)
1978 CALL dbcsr_copy(mhy(ispin, 1)%matrix, scrm(1)%matrix)
1979 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
1980 ALLOCATE (mpz(ispin, 1)%matrix)
1982 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=p_env%p1_admm(ispin)%matrix)
1983 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
1984 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
1987 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=matrix_pz_admm(ispin)%matrix)
1988 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
1992 xc_section => admm_env%xc_section_aux
1995 IF (use_virial)
THEN
1996 pv_loc = virial%pv_virial
1999 basis_type =
"AUX_FIT"
2000 task_list => task_list_aux_fit
2001 IF (admm_env%do_gapw)
THEN
2002 basis_type =
"AUX_FIT_SOFT"
2003 task_list => admm_env%admm_gapw_env%task_list
2006 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2007 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2008 DO ispin = 1, nspins
2009 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
2010 hmat=mhx(ispin, 1), pmat=mpz(ispin, 1), &
2011 qs_env=qs_env, calculate_forces=.true., &
2012 basis_type=basis_type, task_list_external=task_list)
2014 IF (debug_forces)
THEN
2015 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2016 CALL para_env%sum(fodeb)
2017 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)", fodeb
2019 IF (debug_stress .AND. use_virial)
THEN
2020 stdeb = fconv*(virial%pv_virial - pv_loc)
2021 CALL para_env%sum(stdeb)
2022 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2026 IF (use_virial)
THEN
2027 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2030 IF (admm_env%do_gapw)
THEN
2032 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2033 CALL update_ks_atom(qs_env, mhx(:, 1), mpz(:, 1), forces=.true., tddft=.false., &
2034 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
2035 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2036 oce_external=admm_env%admm_gapw_env%oce, &
2037 sab_external=sab_aux_fit)
2038 IF (debug_forces)
THEN
2039 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2040 CALL para_env%sum(fodeb)
2041 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)PAW", fodeb
2045 NULLIFY (rho_g_aux, rho_r_aux, tau_r_aux)
2046 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux, tau_r=tau_r_aux)
2048 NULLIFY (rhoz_g_aux, rhoz_r_aux)
2049 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
2050 DO ispin = 1, nspins
2051 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
2052 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
2054 DO ispin = 1, nspins
2056 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
2057 basis_type=basis_type, task_list_external=task_list)
2061 IF (use_virial)
THEN
2065 DO ispin = 1, nspins
2066 exc_aux_fit = exc_aux_fit +
pw_integral_ab(rhoz_r_aux(ispin), vadmm_rspace(ispin))/ &
2067 vadmm_rspace(ispin)%pw_grid%dvol
2070 IF (debug_stress)
THEN
2071 stdeb = -1.0_dp*fconv*exc_aux_fit
2072 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T43,2(1X,ES19.11))") &
2080 IF (use_virial) virial%pv_xc = 0.0_dp
2086 rho1_r=rhoz_r_aux, &
2087 rho1_g=rhoz_g_aux, &
2089 xc_section=xc_section, &
2090 compute_virial=use_virial, &
2091 virial_xc=virial%pv_xc)
2094 IF (use_virial)
THEN
2095 virial%pv_exc = virial%pv_exc + virial%pv_xc
2096 virial%pv_virial = virial%pv_virial + virial%pv_xc
2099 IF (debug_stress .AND. use_virial)
THEN
2100 stdeb = 1.0_dp*fconv*virial%pv_xc
2101 CALL para_env%sum(stdeb)
2102 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2106 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2108 IF (use_virial)
THEN
2109 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2111 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2112 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2113 DO ispin = 1, nspins
2114 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
2115 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2116 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
2117 hmat=mhy(ispin, 1), pmat=matrix_p(ispin, 1), &
2118 calculate_forces=.true., &
2119 basis_type=basis_type, task_list_external=task_list)
2121 IF (debug_forces)
THEN
2122 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2123 CALL para_env%sum(fodeb)
2124 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm ", fodeb
2126 IF (debug_stress .AND. use_virial)
THEN
2127 stdeb = fconv*(virial%pv_virial - pv_loc)
2128 CALL para_env%sum(stdeb)
2129 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2133 IF (use_virial)
THEN
2134 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2137 IF (admm_env%do_gapw)
THEN
2138 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2139 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2143 CALL qs_rho_set(rho1, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux)
2148 IF (debug_forces)
THEN
2149 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2150 CALL para_env%sum(fodeb)
2151 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: dKxc*rhoz_admm*dw ", fodeb
2153 IF (debug_stress .AND. use_virial)
THEN
2154 stdeb = fconv*(virial%pv_virial - stdeb)
2155 CALL para_env%sum(stdeb)
2156 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2161 DO ispin = 1, nspins
2162 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2163 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
2164 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
2166 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
2168 IF (admm_env%do_gapw)
THEN
2171 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
2173 admm_env%admm_gapw_env%admm_kind_set, &
2174 admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
2176 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2179 local_rhoz_set_admm%rho_atom_set, &
2180 qs_env, xc_section, para_env, do_triplet=.false., &
2181 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2183 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2184 CALL update_ks_atom(qs_env, mhy(:, 1), matrix_p(:, 1), forces=.true., tddft=.false., &
2185 rho_atom_external=local_rhoz_set_admm%rho_atom_set, &
2186 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2187 oce_external=admm_env%admm_gapw_env%oce, &
2188 sab_external=sab_aux_fit)
2189 IF (debug_forces)
THEN
2190 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2191 CALL para_env%sum(fodeb)
2192 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm[PAW] ", fodeb
2197 nao = admm_env%nao_orb
2198 nao_aux = admm_env%nao_aux_fit
2200 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2201 DO ispin = 1, nspins
2203 admm_env%work_aux_orb, nao)
2205 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2206 admm_env%work_orb_orb)
2207 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2210 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2227 cpassert(n_rep_hf == 1)
2231 IF (hfx_treat_lsd_in_core) mspin = nspins
2232 IF (use_virial) virial%pv_fock_4c = 0.0_dp
2234 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, &
2235 s_mstruct_changed=s_mstruct_changed)
2236 distribute_fock_matrix = .true.
2241 IF (dft_control%do_admm)
THEN
2242 CALL get_qs_env(qs_env=qs_env, admm_env=admm_env)
2243 CALL get_admm_env(admm_env, matrix_s_aux_fit=scrm, rho_aux_fit=rho_aux_fit)
2244 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2245 NULLIFY (mpz, mhz, mpd, mhd)
2250 DO ispin = 1, nspins
2251 ALLOCATE (mhz(ispin, 1)%matrix, mhd(ispin, 1)%matrix)
2252 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=scrm(1)%matrix)
2253 CALL dbcsr_create(mhd(ispin, 1)%matrix, template=scrm(1)%matrix)
2254 CALL dbcsr_copy(mhz(ispin, 1)%matrix, scrm(1)%matrix)
2255 CALL dbcsr_copy(mhd(ispin, 1)%matrix, scrm(1)%matrix)
2256 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
2257 CALL dbcsr_set(mhd(ispin, 1)%matrix, 0.0_dp)
2258 ALLOCATE (mpz(ispin, 1)%matrix)
2260 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2261 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
2262 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2265 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2266 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2268 mpd(ispin, 1)%matrix => matrix_p(ispin, 1)%matrix
2271 IF (x_data(1, 1)%do_hfx_ri)
THEN
2274 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2275 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2276 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2279 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhd, eh1, rho_ao=mpd, &
2280 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2281 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2287 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2293 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2299 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
2300 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
2301 nao = admm_env%nao_orb
2302 nao_aux = admm_env%nao_aux_fit
2304 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2305 DO ispin = 1, nspins
2307 admm_env%work_aux_orb, nao)
2309 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2310 admm_env%work_orb_orb)
2311 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2314 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2319 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
2320 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2321 DO ispin = 1, nspins
2322 CALL dbcsr_add(mhd(ispin, 1)%matrix, mhx(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2323 CALL dbcsr_add(mhz(ispin, 1)%matrix, mhy(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2329 IF (debug_forces)
THEN
2330 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
2331 CALL para_env%sum(fodeb)
2332 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx*S' ", fodeb
2337 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2346 ALLOCATE (mpz(nspins, 1), mhz(nspins, 1))
2347 DO ispin = 1, nspins
2348 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
2349 mpz(ispin, 1)%matrix => mpa(ispin)%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)
2362 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2366 DEALLOCATE (mhz, mpz)
2374 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
2375 IF (dft_control%do_admm)
THEN
2379 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2380 NULLIFY (matrix_pza)
2382 DO ispin = 1, nspins
2383 ALLOCATE (matrix_pza(ispin)%matrix)
2385 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=p_env%p1_admm(ispin)%matrix)
2386 CALL dbcsr_copy(matrix_pza(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
2387 CALL dbcsr_add(matrix_pza(ispin)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2390 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=matrix_pz_admm(ispin)%matrix)
2391 CALL dbcsr_copy(matrix_pza(ispin)%matrix, matrix_pz_admm(ispin)%matrix)
2394 IF (x_data(1, 1)%do_hfx_ri)
THEN
2397 x_data(1, 1)%general_parameter%fraction, &
2398 rho_ao=matrix_p, rho_ao_resp=matrix_pza, &
2399 use_virial=use_virial, resp_only=resp_only)
2402 1, use_virial, resp_only=resp_only)
2410 IF (x_data(1, 1)%do_hfx_ri)
THEN
2413 x_data(1, 1)%general_parameter%fraction, &
2414 rho_ao=matrix_p, rho_ao_resp=mpa, &
2415 use_virial=use_virial, resp_only=resp_only)
2418 1, use_virial, resp_only=resp_only)
2422 IF (use_virial)
THEN
2423 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
2424 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
2425 virial%pv_calculate = .false.
2428 IF (debug_forces)
THEN
2429 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
2430 CALL para_env%sum(fodeb)
2431 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx ", fodeb
2433 IF (debug_stress .AND. use_virial)
THEN
2434 stdeb = -1.0_dp*fconv*virial%pv_fock_4c
2435 CALL para_env%sum(stdeb)
2436 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2443 IF (use_virial)
THEN
2445 zehartree = zehartree + 2.0_dp*ehartree
2448 IF (dft_control%do_admm)
THEN
2449 zexc_aux_fit = zexc_aux_fit + exc_aux_fit
2456 IF (dft_control%qs_control%do_ls_scf)
THEN
2458 eps_filter = dft_control%qs_control%eps_filter_matrix
2459 CALL calculate_whz_ao_matrix(qs_env, matrix_hz, matrix_wz, eps_filter)
2462 matrix_wz => p_env%w1
2465 IF (nspins == 1) focc = 2.0_dp
2467 DO ispin = 1, nspins
2468 CALL get_mo_set(mo_set=mos(ispin), homo=nocc)
2470 matrix_wz(ispin)%matrix, focc, nocc)
2473 IF (nspins == 2)
THEN
2474 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2475 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
2478 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
2479 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
2482 matrix_name=
"OVERLAP MATRIX", &
2483 basis_type_a=
"ORB", basis_type_b=
"ORB", &
2484 sab_nl=sab_orb, calculate_forces=.true., &
2485 matrix_p=matrix_wz(1)%matrix)
2487 IF (
SIZE(matrix_wz, 1) == 2)
THEN
2488 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2489 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
2492 IF (debug_forces)
THEN
2493 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
2494 CALL para_env%sum(fodeb)
2495 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wz*dS ", fodeb
2497 IF (debug_stress .AND. use_virial)
THEN
2498 stdeb = fconv*(virial%pv_overlap - stdeb)
2499 CALL para_env%sum(stdeb)
2500 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2505 IF (debug_forces)
THEN
2507 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
2508 CALL para_env%sum(fodeb)
2509 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Response Force", fodeb
2510 fodeb(1:3) = ftot2(1:3, 1)
2511 CALL para_env%sum(fodeb)
2512 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Total Force ", fodeb
2513 DEALLOCATE (ftot1, ftot2, ftot3)
2515 IF (debug_stress .AND. use_virial)
THEN
2516 stdeb = fconv*(virial%pv_virial - sttot)
2517 CALL para_env%sum(stdeb)
2518 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2520 stdeb = fconv*(virial%pv_virial)
2521 CALL para_env%sum(stdeb)
2522 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2524 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,3(1X,ES19.11))") &
2525 stdeb(1, 1), stdeb(2, 2), stdeb(3, 3)
2534 CALL timestop(handle)