817 SUBROUTINE response_force(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, &
818 matrix_hz, matrix_pz, matrix_pz_admm, matrix_wz, &
819 zehartree, zexc, zexc_aux_fit, rhopz_r, p_env, ex_env, debug)
822 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: vxc_rspace, vtau_rspace, vadmm_rspace
823 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hz, matrix_pz, matrix_pz_admm, &
825 REAL(kind=
dp),
OPTIONAL :: zehartree, zexc, zexc_aux_fit
827 INTENT(INOUT),
OPTIONAL :: rhopz_r
830 LOGICAL,
INTENT(IN),
OPTIONAL :: debug
832 CHARACTER(LEN=*),
PARAMETER :: routinen =
'response_force'
834 CHARACTER(LEN=default_string_length) :: basis_type, unitstr
835 INTEGER :: handle, iounit, ispin, mspin, myfun, &
836 n_rep_hf, nao, nao_aux, natom, nder, &
838 LOGICAL :: debug_forces, debug_stress, distribute_fock_matrix, do_ex, do_hfx, gapw, gapw_xc, &
839 hfx_treat_lsd_in_core, resp_only, s_mstruct_changed, use_virial
840 REAL(kind=
dp) :: eh1, ehartree, ekin_mol, eps_filter, &
841 exc, exc_aux_fit, fconv, focc, &
842 hartree_gs, hartree_t
843 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot1, ftot2, ftot3
844 REAL(kind=
dp),
DIMENSION(2) :: total_rho_gs, total_rho_t
845 REAL(kind=
dp),
DIMENSION(3) :: fodeb
846 REAL(kind=
dp),
DIMENSION(3, 3) :: h_stress, pv_loc, stdeb, sttot, sttot2
852 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ht, matrix_pd, matrix_pza, &
854 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_p, mhd, mhx, mhy, mhz, &
855 mpa2, mpd, mpz, scrm2
859 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
861 TYPE(
local_rho_type),
POINTER :: local_rho_set_f, local_rho_set_gs, &
862 local_rho_set_t, local_rho_set_vxc, &
867 POINTER :: sab_aux_fit, sab_orb
870 TYPE(
pw_c1d_gs_type) :: rho_tot_gspace, rho_tot_gspace_gs, rho_tot_gspace_t, &
871 rhoz_tot_gspace, v_hartree_gspace_gs, v_hartree_gspace_t, zv_hartree_gspace
872 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g_aux, rho_g_gs, rho_g_t, rhoz_g, &
873 rhoz_g_aux, rhoz_g_xc
878 TYPE(
pw_r3d_rs_type) :: v_hartree_rspace_gs, v_hartree_rspace_t, &
879 vhxc_rspace, zv_hartree_rspace
880 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_aux, rho_r_gs, rho_r_t, rhoz_r, &
881 rhoz_r_aux, rhoz_r_xc, tau_r_aux, &
882 tauz_r, tauz_r_xc, v_xc, v_xc_tau
884 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
886 TYPE(
qs_rho_type),
POINTER :: rho, rho_aux_fit, rho_xc
891 CALL timeset(routinen, handle)
893 IF (
PRESENT(debug))
THEN
897 debug_forces = .false.
898 debug_stress = .false.
902 IF (logger%para_env%is_source())
THEN
909 IF (
PRESENT(ex_env)) do_ex = .true.
911 cpassert(
PRESENT(p_env))
914 NULLIFY (ks_env, sab_orb, virial)
919 dft_control=dft_control, &
923 nspins = dft_control%nspins
924 gapw = dft_control%qs_control%gapw
925 gapw_xc = dft_control%qs_control%gapw_xc
927 IF (debug_forces)
THEN
928 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
929 ALLOCATE (ftot1(3, natom))
934 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
936 IF (use_virial .AND. do_ex)
THEN
937 CALL cp_abort(__location__,
"Stress Tensor not available for TDDFT calculations.")
940 fconv = 1.0e-9_dp*
pascal/cell%deth
941 IF (debug_stress .AND. use_virial)
THEN
942 sttot = virial%pv_virial
952 ALLOCATE (mpa(ispin)%matrix)
953 CALL dbcsr_create(mpa(ispin)%matrix, template=p_env%p1(ispin)%matrix)
954 CALL dbcsr_copy(mpa(ispin)%matrix, p_env%p1(ispin)%matrix)
955 CALL dbcsr_add(mpa(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix, 1.0_dp, 1.0_dp)
956 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
961 ALLOCATE (matrix_ht(ispin)%matrix)
962 CALL dbcsr_create(matrix_ht(ispin)%matrix, template=matrix_hz(ispin)%matrix)
963 CALL dbcsr_copy(matrix_ht(ispin)%matrix, matrix_hz(ispin)%matrix)
964 CALL dbcsr_set(matrix_ht(ispin)%matrix, 0.0_dp)
975 mpa2(1:nspins, 1:1) => mpa(1:nspins)
977 matrix_name=
"KINETIC ENERGY MATRIX", &
979 sab_orb=sab_orb, calculate_forces=.true., &
980 debug_forces=debug_forces, debug_stress=debug_stress)
984 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
988 ALLOCATE (scrm(ispin)%matrix)
989 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_s(1)%matrix)
990 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_s(1)%matrix)
991 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
994 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, &
995 atomic_kind_set=atomic_kind_set)
997 ALLOCATE (matrix_p(nspins, 1), matrix_h(nspins, 1))
999 matrix_p(ispin, 1)%matrix => mpa(ispin)%matrix
1000 matrix_h(ispin, 1)%matrix => scrm(ispin)%matrix
1002 matrix_h(1, 1)%matrix => scrm(1)%matrix
1005 CALL core_matrices(qs_env, matrix_h, matrix_p, .true., nder, &
1006 debug_forces=debug_forces, debug_stress=debug_stress)
1010 IF (dft_control%qs_control%do_kg)
THEN
1012 CALL get_qs_env(qs_env=qs_env, kg_env=kg_env, dbcsr_dist=dbcsr_dist)
1014 IF (use_virial)
THEN
1015 pv_loc = virial%pv_virial
1018 IF (debug_forces) fodeb(1:3) = force(1)%kinetic(1:3, 1)
1019 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1020 CALL build_tnadd_mat(kg_env=kg_env, matrix_p=matrix_p, force=force, virial=virial, &
1021 calculate_forces=.true., use_virial=use_virial, &
1022 qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set, &
1023 particle_set=particle_set, sab_orb=sab_orb, dbcsr_dist=dbcsr_dist)
1024 IF (debug_forces)
THEN
1025 fodeb(1:3) = force(1)%kinetic(1:3, 1) - fodeb(1:3)
1026 CALL para_env%sum(fodeb)
1027 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dTnadd ", fodeb
1029 IF (debug_stress .AND. use_virial)
THEN
1030 stdeb = fconv*(virial%pv_virial - stdeb)
1031 CALL para_env%sum(stdeb)
1032 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1037 IF (use_virial)
THEN
1038 virial%pv_ekinetic = virial%pv_ekinetic + (virial%pv_virial - pv_loc)
1044 DEALLOCATE (matrix_h)
1045 DEALLOCATE (matrix_p)
1053 DO ispin = 1, nspins
1054 ALLOCATE (scrm(ispin)%matrix)
1055 CALL dbcsr_create(scrm(ispin)%matrix, template=matrix_pz(1)%matrix)
1056 CALL dbcsr_copy(scrm(ispin)%matrix, matrix_pz(ispin)%matrix)
1057 CALL dbcsr_set(scrm(ispin)%matrix, 0.0_dp)
1060 IF (debug_forces)
THEN
1061 ALLOCATE (ftot2(3, natom))
1063 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
1064 CALL para_env%sum(fodeb)
1065 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dHcore", fodeb
1067 IF (debug_stress .AND. use_virial)
THEN
1068 stdeb = fconv*(virial%pv_virial - sttot)
1069 CALL para_env%sum(stdeb)
1070 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1073 sttot2 = virial%pv_virial
1081 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
1083 IF (dft_control%do_admm)
THEN
1085 xc_section => admm_env%xc_section_primary
1092 IF (gapw .OR. gapw_xc)
THEN
1093 NULLIFY (oce, sab_orb)
1094 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab_orb)
1096 NULLIFY (local_rho_set_gs)
1101 qs_kind_set, dft_control, para_env)
1102 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1105 qs_kind_set, oce, sab_orb, para_env)
1108 NULLIFY (local_rho_set_t)
1111 qs_kind_set, dft_control, para_env)
1112 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1116 qs_kind_set, oce, sab_orb, para_env)
1120 ALLOCATE (rho_r_gs(nspins), rho_g_gs(nspins))
1121 DO ispin = 1, nspins
1122 CALL auxbas_pw_pool%create_pw(rho_r_gs(ispin))
1123 CALL auxbas_pw_pool%create_pw(rho_g_gs(ispin))
1125 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_gs)
1127 total_rho_gs = 0.0_dp
1128 CALL pw_zero(rho_tot_gspace_gs)
1129 DO ispin = 1, nspins
1131 rho=rho_r_gs(ispin), &
1132 rho_gspace=rho_g_gs(ispin), &
1133 soft_valid=(gapw .OR. gapw_xc), &
1134 total_rho=total_rho_gs(ispin))
1135 CALL pw_axpy(rho_g_gs(ispin), rho_tot_gspace_gs)
1140 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rho0_s_gs, rho_tot_gspace_gs)
1141 IF (
ASSOCIATED(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs))
THEN
1142 CALL pw_axpy(local_rho_set_gs%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_gs)
1144 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1145 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
1146 CALL pw_axpy(rho_core, rho_tot_gspace_gs)
1149 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_gs)
1150 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_gs)
1151 NULLIFY (hartree_local_gs)
1154 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_gs, hartree_gs, v_hartree_gspace_gs)
1155 CALL pw_transfer(v_hartree_gspace_gs, v_hartree_rspace_gs)
1156 CALL pw_scale(v_hartree_rspace_gs, v_hartree_rspace_gs%pw_grid%dvol)
1163 cpassert(.NOT. use_virial)
1164 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1165 CALL vh_1c_gg_integrals(qs_env, hartree_gs, hartree_local_gs%ecoul_1c, local_rho_set_t, para_env, tddft=.true., &
1166 local_rho_set_2nd=local_rho_set_gs, core_2nd=.false.)
1169 local_rho_set=local_rho_set_t, local_rho_set_2nd=local_rho_set_gs)
1170 IF (debug_forces)
THEN
1171 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1172 CALL para_env%sum(fodeb)
1173 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVh[D^GS]PAWg0", fodeb
1176 IF (gapw .OR. gapw_xc)
THEN
1179 NULLIFY (local_rho_set_vxc)
1182 qs_kind_set, dft_control, para_env)
1184 qs_kind_set, oce, sab_orb, para_env)
1187 CALL calculate_vxc_atom(qs_env, .false., exc1=hartree_gs, xc_section_external=xc_section, &
1188 rho_atom_set_external=local_rho_set_vxc%rho_atom_set)
1192 CALL auxbas_pw_pool%create_pw(vhxc_rspace)
1196 IF (use_virial)
THEN
1197 pv_loc = virial%pv_virial
1200 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1201 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1202 IF (gapw .OR. gapw_xc)
THEN
1204 DO ispin = 1, nspins
1207 CALL pw_transfer(v_hartree_rspace_gs, vhxc_rspace)
1208 ELSEIF (gapw_xc)
THEN
1211 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1212 hmat=scrm(ispin), pmat=mpa(ispin), &
1213 qs_env=qs_env, gapw=gapw, &
1214 calculate_forces=.true.)
1217 DO ispin = 1, nspins
1219 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1220 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1221 hmat=scrm(ispin), pmat=mpa(ispin), &
1222 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1223 calculate_forces=.true.)
1227 DO ispin = 1, nspins
1229 CALL pw_axpy(vxc_rspace(ispin), vhxc_rspace)
1230 CALL integrate_v_rspace(v_rspace=vhxc_rspace, &
1231 hmat=scrm(ispin), pmat=mpa(ispin), &
1232 qs_env=qs_env, gapw=gapw, calculate_forces=.true.)
1236 IF (debug_forces)
THEN
1237 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1238 CALL para_env%sum(fodeb)
1239 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS] ", fodeb
1241 IF (debug_stress .AND. use_virial)
THEN
1242 stdeb = fconv*(virial%pv_virial - pv_loc)
1243 CALL para_env%sum(stdeb)
1244 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1248 IF (gapw .OR. gapw_xc)
THEN
1251 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1252 IF (gapw)
CALL update_ks_atom(qs_env, scrm, mpa, forces=.true., tddft=.false., &
1253 rho_atom_external=local_rho_set_gs%rho_atom_set)
1255 rho_atom_external=local_rho_set_vxc%rho_atom_set)
1256 IF (debug_forces)
THEN
1257 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1258 CALL para_env%sum(fodeb)
1259 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: (T+Dz)*dVhxc[D^GS]PAW ", fodeb
1268 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_gs)
1269 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_gs)
1271 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_gs)
1272 IF (
ASSOCIATED(rho_r_gs))
THEN
1273 DO ispin = 1, nspins
1274 CALL auxbas_pw_pool%give_back_pw(rho_r_gs(ispin))
1276 DEALLOCATE (rho_r_gs)
1278 IF (
ASSOCIATED(rho_g_gs))
THEN
1279 DO ispin = 1, nspins
1280 CALL auxbas_pw_pool%give_back_pw(rho_g_gs(ispin))
1282 DEALLOCATE (rho_g_gs)
1286 IF (
ASSOCIATED(vtau_rspace))
THEN
1287 cpassert(.NOT. (gapw .OR. gapw_xc))
1288 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1289 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1290 DO ispin = 1, nspins
1291 CALL integrate_v_rspace(v_rspace=vtau_rspace(ispin), &
1292 hmat=scrm(ispin), pmat=mpa(ispin), &
1293 qs_env=qs_env, gapw=(gapw .OR. gapw_xc), &
1294 calculate_forces=.true., compute_tau=.true.)
1296 IF (debug_forces)
THEN
1297 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1298 CALL para_env%sum(fodeb)
1299 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*dVxc_tau ", fodeb
1301 IF (debug_stress .AND. use_virial)
THEN
1302 stdeb = fconv*(virial%pv_virial - pv_loc)
1303 CALL para_env%sum(stdeb)
1304 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1308 CALL auxbas_pw_pool%give_back_pw(vhxc_rspace)
1311 IF (use_virial)
THEN
1312 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1317 IF (dft_control%qs_control%do_kg)
THEN
1322 IF (use_virial)
THEN
1323 pv_loc = virial%pv_virial
1326 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1329 ekin_mol=ekin_mol, &
1330 calc_force=.true., &
1331 do_kernel=.false., &
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*dVkg ", fodeb
1338 IF (debug_stress .AND. use_virial)
THEN
1341 stdeb = 1.0_dp*fconv*ekin_mol
1342 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1345 stdeb = fconv*(virial%pv_virial - pv_loc)
1346 CALL para_env%sum(stdeb)
1347 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1350 stdeb = fconv*virial%pv_xc
1351 CALL para_env%sum(stdeb)
1352 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1355 IF (use_virial)
THEN
1357 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1368 ALLOCATE (rhoz_r(nspins), rhoz_g(nspins))
1369 DO ispin = 1, nspins
1370 CALL auxbas_pw_pool%create_pw(rhoz_r(ispin))
1371 CALL auxbas_pw_pool%create_pw(rhoz_g(ispin))
1373 CALL auxbas_pw_pool%create_pw(rhoz_tot_gspace)
1374 CALL auxbas_pw_pool%create_pw(zv_hartree_rspace)
1375 CALL auxbas_pw_pool%create_pw(zv_hartree_gspace)
1378 DO ispin = 1, nspins
1380 rho=rhoz_r(ispin), rho_gspace=rhoz_g(ispin), &
1382 CALL pw_axpy(rhoz_g(ispin), rhoz_tot_gspace)
1386 ALLOCATE (rhoz_r_xc(nspins), rhoz_g_xc(nspins))
1387 DO ispin = 1, nspins
1388 CALL auxbas_pw_pool%create_pw(rhoz_r_xc(ispin))
1389 CALL auxbas_pw_pool%create_pw(rhoz_g_xc(ispin))
1391 DO ispin = 1, nspins
1393 rho=rhoz_r_xc(ispin), rho_gspace=rhoz_g_xc(ispin), &
1398 IF (
ASSOCIATED(vtau_rspace))
THEN
1399 cpassert(.NOT. (gapw .OR. gapw_xc))
1402 ALLOCATE (tauz_r(nspins))
1403 CALL auxbas_pw_pool%create_pw(work_g)
1404 DO ispin = 1, nspins
1405 CALL auxbas_pw_pool%create_pw(tauz_r(ispin))
1407 rho=tauz_r(ispin), rho_gspace=work_g, &
1410 CALL auxbas_pw_pool%give_back_pw(work_g)
1415 IF (
PRESENT(rhopz_r))
THEN
1416 DO ispin = 1, nspins
1417 CALL pw_copy(rhoz_r(ispin), rhopz_r(ispin))
1424 IF (use_virial)
THEN
1427 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
1432 h_stress(:, :) = 0.0_dp
1440 density=rhoz_tot_gspace, &
1441 ehartree=ehartree, &
1442 vhartree=zv_hartree_gspace, &
1443 h_stress=h_stress, &
1444 aux_density=rho_tot_gspace)
1446 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1449 virial%pv_ehartree = virial%pv_ehartree + 2.0_dp*h_stress/real(para_env%num_pe,
dp)
1450 virial%pv_virial = virial%pv_virial + 2.0_dp*h_stress/real(para_env%num_pe,
dp)
1452 IF (debug_stress)
THEN
1453 stdeb = -1.0_dp*fconv*ehartree
1454 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1456 stdeb = -1.0_dp*fconv*ehartree
1457 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1459 stdeb = fconv*(h_stress/real(para_env%num_pe,
dp))
1460 CALL para_env%sum(stdeb)
1461 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1463 stdeb = fconv*(h_stress/real(para_env%num_pe,
dp))
1464 CALL para_env%sum(stdeb)
1465 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1472 DO ispin = 1, nspins
1474 vxc_rspace(ispin)%pw_grid%dvol
1476 IF (
ASSOCIATED(vtau_rspace))
THEN
1477 DO ispin = 1, nspins
1479 vtau_rspace(ispin)%pw_grid%dvol
1484 IF (dft_control%qs_control%do_kg)
THEN
1487 exc = exc - ekin_mol
1491 IF (debug_stress)
THEN
1492 stdeb = -1.0_dp*fconv*exc
1493 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1502 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rhoz_tot_gspace)
1503 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1504 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rhoz_tot_gspace)
1507 CALL pw_poisson_solve(poisson_env, rhoz_tot_gspace, ehartree, zv_hartree_gspace)
1510 IF (gapw .OR. gapw_xc)
THEN
1514 IF (debug_forces) fodeb(1:3) = force(1)%rho_core(1:3, 1)
1515 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ehartree
1516 CALL pw_transfer(zv_hartree_gspace, zv_hartree_rspace)
1517 CALL pw_scale(zv_hartree_rspace, zv_hartree_rspace%pw_grid%dvol)
1519 CALL integrate_v_core_rspace(zv_hartree_rspace, qs_env)
1520 IF (debug_forces)
THEN
1521 fodeb(1:3) = force(1)%rho_core(1:3, 1) - fodeb(1:3)
1522 CALL para_env%sum(fodeb)
1523 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(rhoz)*dncore ", fodeb
1525 IF (debug_stress .AND. use_virial)
THEN
1526 stdeb = fconv*(virial%pv_ehartree - stdeb)
1527 CALL para_env%sum(stdeb)
1528 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1534 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1538 IF (dft_control%do_admm)
THEN
1540 xc_section => admm_env%xc_section_primary
1545 IF (use_virial)
THEN
1546 virial%pv_xc = 0.0_dp
1549 NULLIFY (v_xc, v_xc_tau)
1552 rho=rho_xc, rho1_r=rhoz_r_xc, rho1_g=rhoz_g_xc, tau1_r=tauz_r_xc, &
1553 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1556 rho=rho, rho1_r=rhoz_r, rho1_g=rhoz_g, tau1_r=tauz_r, &
1557 xc_section=xc_section, compute_virial=use_virial, virial_xc=virial%pv_xc)
1560 IF (gapw .OR. gapw_xc)
THEN
1562 NULLIFY (local_rho_set_t)
1565 qs_kind_set, dft_control, para_env)
1566 CALL init_rho0(local_rho_set_t, qs_env, dft_control%qs_control%gapw_control, &
1570 qs_kind_set, oce, sab_orb, para_env)
1572 NULLIFY (local_rho_set_gs)
1575 qs_kind_set, dft_control, para_env)
1576 CALL init_rho0(local_rho_set_gs, qs_env, dft_control%qs_control%gapw_control)
1579 qs_kind_set, oce, sab_orb, para_env)
1582 ALLOCATE (rho_r_t(nspins), rho_g_t(nspins))
1583 DO ispin = 1, nspins
1584 CALL auxbas_pw_pool%create_pw(rho_r_t(ispin))
1585 CALL auxbas_pw_pool%create_pw(rho_g_t(ispin))
1587 CALL auxbas_pw_pool%create_pw(rho_tot_gspace_t)
1588 total_rho_t = 0.0_dp
1589 CALL pw_zero(rho_tot_gspace_t)
1590 DO ispin = 1, nspins
1592 rho=rho_r_t(ispin), &
1593 rho_gspace=rho_g_t(ispin), &
1595 total_rho=total_rho_t(ispin))
1596 CALL pw_axpy(rho_g_t(ispin), rho_tot_gspace_t)
1600 CALL pw_axpy(local_rho_set_t%rho0_mpole%rho0_s_gs, rho_tot_gspace_t)
1601 IF (
ASSOCIATED(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs))
THEN
1602 CALL pw_axpy(local_rho_set_t%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace_t)
1605 CALL auxbas_pw_pool%create_pw(v_hartree_gspace_t)
1606 CALL auxbas_pw_pool%create_pw(v_hartree_rspace_t)
1607 NULLIFY (hartree_local_t)
1610 CALL pw_poisson_solve(poisson_env, rho_tot_gspace_t, hartree_t, v_hartree_gspace_t)
1611 CALL pw_transfer(v_hartree_gspace_t, v_hartree_rspace_t)
1612 CALL pw_scale(v_hartree_rspace_t, v_hartree_rspace_t%pw_grid%dvol)
1614 IF (debug_forces) fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1)
1615 CALL vh_1c_gg_integrals(qs_env, hartree_t, hartree_local_t%ecoul_1c, local_rho_set_gs, para_env, tddft=.false., &
1616 local_rho_set_2nd=local_rho_set_t, core_2nd=.true.)
1618 local_rho_set=local_rho_set_gs, local_rho_set_2nd=local_rho_set_t)
1619 IF (debug_forces)
THEN
1620 fodeb(1:3) = force(1)%g0s_Vh_elec(1:3, 1) - fodeb(1:3)
1621 CALL para_env%sum(fodeb)
1622 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Vh(T)*dncore PAWg0", fodeb
1627 IF (gapw .OR. gapw_xc)
THEN
1631 NULLIFY (local_rho_set_f)
1634 qs_kind_set, dft_control, para_env)
1636 qs_kind_set, oce, sab_orb, para_env)
1640 local_rho_set_f%rho_atom_set, &
1641 qs_env, xc_section, para_env, &
1647 IF (use_virial)
THEN
1648 virial%pv_exc = virial%pv_exc + virial%pv_xc
1649 virial%pv_virial = virial%pv_virial + virial%pv_xc
1652 IF (debug_stress .AND. use_virial)
THEN
1653 stdeb = 1.0_dp*fconv*virial%pv_xc
1654 CALL para_env%sum(stdeb)
1655 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1660 IF (use_virial)
THEN
1661 pv_loc = virial%pv_virial
1666 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1668 DO ispin = 1, nspins
1669 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1671 IF ((.NOT. (gapw)) .AND. (.NOT. gapw_xc))
THEN
1672 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1673 DO ispin = 1, nspins
1674 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1675 CALL integrate_v_rspace(qs_env=qs_env, &
1676 v_rspace=v_xc(ispin), &
1677 hmat=matrix_hz(ispin), &
1678 pmat=matrix_p(ispin, 1), &
1680 calculate_forces=.true.)
1682 IF (debug_forces)
THEN
1683 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1684 CALL para_env%sum(fodeb)
1685 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1688 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1690 DO ispin = 1, nspins
1691 CALL integrate_v_rspace(qs_env=qs_env, &
1692 v_rspace=v_xc(ispin), &
1693 hmat=matrix_hz(ispin), &
1694 pmat=matrix_p(ispin, 1), &
1696 calculate_forces=.true.)
1700 DO ispin = 1, nspins
1703 CALL pw_axpy(v_hartree_rspace_t, v_xc(ispin))
1704 ELSEIF (gapw_xc)
THEN
1705 CALL pw_axpy(zv_hartree_rspace, v_xc(ispin))
1707 CALL integrate_v_rspace(qs_env=qs_env, &
1708 v_rspace=v_xc(ispin), &
1709 hmat=matrix_ht(ispin), &
1710 pmat=matrix_p(ispin, 1), &
1712 calculate_forces=.true.)
1714 IF (debug_forces)
THEN
1715 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1716 CALL para_env%sum(fodeb)
1717 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKhxc*rhoz ", fodeb
1721 IF (gapw .OR. gapw_xc)
THEN
1724 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1725 CALL update_ks_atom(qs_env, matrix_hz, matrix_p, forces=.true., tddft=.false., &
1726 rho_atom_external=local_rho_set_f%rho_atom_set)
1727 IF (debug_forces)
THEN
1728 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1729 CALL para_env%sum(fodeb)
1730 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKxc*(Dz+T) PAW", fodeb
1735 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1736 CALL update_ks_atom(qs_env, matrix_ht, matrix_p, forces=.true., tddft=.false., &
1737 rho_atom_external=local_rho_set_t%rho_atom_set)
1738 IF (debug_forces)
THEN
1739 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1740 CALL para_env%sum(fodeb)
1741 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: P^GS*dKh*(Dz+T) PAW", fodeb
1745 DO ispin = 1, nspins
1746 CALL dbcsr_add(matrix_hz(ispin)%matrix, matrix_ht(ispin)%matrix, 1.0_dp, 1.0_dp)
1757 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace_t)
1758 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace_t)
1760 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace_t)
1761 DO ispin = 1, nspins
1762 CALL auxbas_pw_pool%give_back_pw(rho_r_t(ispin))
1763 CALL auxbas_pw_pool%give_back_pw(rho_g_t(ispin))
1765 DEALLOCATE (rho_r_t, rho_g_t)
1768 IF (debug_stress .AND. use_virial)
THEN
1769 stdeb = fconv*(virial%pv_virial - stdeb)
1770 CALL para_env%sum(stdeb)
1771 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1775 IF (
ASSOCIATED(v_xc_tau))
THEN
1776 cpassert(.NOT. (gapw .OR. gapw_xc))
1777 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1778 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1779 DO ispin = 1, nspins
1780 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
1781 CALL integrate_v_rspace(qs_env=qs_env, &
1782 v_rspace=v_xc_tau(ispin), &
1783 hmat=matrix_hz(ispin), &
1784 pmat=matrix_p(ispin, 1), &
1785 compute_tau=.true., &
1786 gapw=(gapw .OR. gapw_xc), &
1787 calculate_forces=.true.)
1789 IF (debug_forces)
THEN
1790 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1791 CALL para_env%sum(fodeb)
1792 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dKtau*tauz ", fodeb
1795 IF (debug_stress .AND. use_virial)
THEN
1796 stdeb = fconv*(virial%pv_virial - stdeb)
1797 CALL para_env%sum(stdeb)
1798 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1802 IF (use_virial)
THEN
1803 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1808 IF (dft_control%qs_control%do_kg)
THEN
1811 IF (use_virial)
THEN
1812 pv_loc = virial%pv_virial
1815 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1816 IF (use_virial) virial%pv_xc = 0.0_dp
1818 ks_matrix=matrix_hz, &
1819 ekin_mol=ekin_mol, &
1820 calc_force=.true., &
1824 IF (debug_forces)
THEN
1825 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1826 CALL para_env%sum(fodeb)
1827 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*d(Kkg)*rhoz ", fodeb
1829 IF (debug_stress .AND. use_virial)
THEN
1830 stdeb = fconv*(virial%pv_virial - pv_loc)
1831 CALL para_env%sum(stdeb)
1832 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1835 stdeb = fconv*(virial%pv_xc)
1836 CALL para_env%sum(stdeb)
1837 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1842 IF (use_virial)
THEN
1844 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1847 virial%pv_exc = virial%pv_exc - virial%pv_xc
1848 virial%pv_virial = virial%pv_virial - virial%pv_xc
1849 virial%pv_xc = 0.0_dp
1853 CALL auxbas_pw_pool%give_back_pw(rhoz_tot_gspace)
1854 CALL auxbas_pw_pool%give_back_pw(zv_hartree_gspace)
1855 CALL auxbas_pw_pool%give_back_pw(zv_hartree_rspace)
1856 DO ispin = 1, nspins
1857 CALL auxbas_pw_pool%give_back_pw(rhoz_r(ispin))
1858 CALL auxbas_pw_pool%give_back_pw(rhoz_g(ispin))
1859 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1861 DEALLOCATE (rhoz_r, rhoz_g, v_xc)
1863 DO ispin = 1, nspins
1864 CALL auxbas_pw_pool%give_back_pw(rhoz_r_xc(ispin))
1865 CALL auxbas_pw_pool%give_back_pw(rhoz_g_xc(ispin))
1867 DEALLOCATE (rhoz_r_xc, rhoz_g_xc)
1869 IF (
ASSOCIATED(v_xc_tau))
THEN
1870 DO ispin = 1, nspins
1871 CALL auxbas_pw_pool%give_back_pw(tauz_r(ispin))
1872 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1874 DEALLOCATE (tauz_r, v_xc_tau)
1876 IF (debug_forces)
THEN
1877 ALLOCATE (ftot3(3, natom))
1879 fodeb(1:3) = ftot3(1:3, 1) - ftot2(1:3, 1)
1880 CALL para_env%sum(fodeb)
1881 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*V(rhoz)", fodeb
1890 IF (dft_control%do_admm)
THEN
1892 exc_aux_fit = 0.0_dp
1896 NULLIFY (mpz, mhz, mhx, mhy)
1900 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=scrm, &
1901 task_list_aux_fit=task_list_aux_fit)
1903 NULLIFY (mpz, mhz, mhx, mhy)
1907 DO ispin = 1, nspins
1908 ALLOCATE (mhx(ispin, 1)%matrix)
1909 CALL dbcsr_create(mhx(ispin, 1)%matrix, template=scrm(1)%matrix)
1910 CALL dbcsr_copy(mhx(ispin, 1)%matrix, scrm(1)%matrix)
1911 CALL dbcsr_set(mhx(ispin, 1)%matrix, 0.0_dp)
1912 ALLOCATE (mhy(ispin, 1)%matrix)
1913 CALL dbcsr_create(mhy(ispin, 1)%matrix, template=scrm(1)%matrix)
1914 CALL dbcsr_copy(mhy(ispin, 1)%matrix, scrm(1)%matrix)
1915 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
1916 ALLOCATE (mpz(ispin, 1)%matrix)
1918 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=p_env%p1_admm(ispin)%matrix)
1919 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
1920 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
1923 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=matrix_pz_admm(ispin)%matrix)
1924 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
1928 xc_section => admm_env%xc_section_aux
1931 IF (use_virial)
THEN
1932 pv_loc = virial%pv_virial
1935 basis_type =
"AUX_FIT"
1936 task_list => task_list_aux_fit
1937 IF (admm_env%do_gapw)
THEN
1938 basis_type =
"AUX_FIT_SOFT"
1939 task_list => admm_env%admm_gapw_env%task_list
1942 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
1943 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
1944 DO ispin = 1, nspins
1945 CALL integrate_v_rspace(v_rspace=vadmm_rspace(ispin), &
1946 hmat=mhx(ispin, 1), pmat=mpz(ispin, 1), &
1947 qs_env=qs_env, calculate_forces=.true., &
1948 basis_type=basis_type, task_list_external=task_list)
1950 IF (debug_forces)
THEN
1951 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
1952 CALL para_env%sum(fodeb)
1953 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)", fodeb
1955 IF (debug_stress .AND. use_virial)
THEN
1956 stdeb = fconv*(virial%pv_virial - pv_loc)
1957 CALL para_env%sum(stdeb)
1958 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
1962 IF (use_virial)
THEN
1963 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
1966 IF (admm_env%do_gapw)
THEN
1968 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
1969 CALL update_ks_atom(qs_env, mhx(:, 1), mpz(:, 1), forces=.true., tddft=.false., &
1970 rho_atom_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set, &
1971 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
1972 oce_external=admm_env%admm_gapw_env%oce, &
1973 sab_external=sab_aux_fit)
1974 IF (debug_forces)
THEN
1975 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
1976 CALL para_env%sum(fodeb)
1977 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*Vxc(rho_admm)PAW", fodeb
1981 NULLIFY (rho_g_aux, rho_r_aux, tau_r_aux)
1982 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux, tau_r=tau_r_aux)
1984 NULLIFY (rhoz_g_aux, rhoz_r_aux)
1985 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
1986 DO ispin = 1, nspins
1987 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
1988 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
1990 DO ispin = 1, nspins
1992 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
1993 basis_type=basis_type, task_list_external=task_list)
1997 IF (use_virial)
THEN
2001 DO ispin = 1, nspins
2002 exc_aux_fit = exc_aux_fit +
pw_integral_ab(rhoz_r_aux(ispin), vadmm_rspace(ispin))/ &
2003 vadmm_rspace(ispin)%pw_grid%dvol
2006 IF (debug_stress)
THEN
2007 stdeb = -1.0_dp*fconv*exc_aux_fit
2008 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T43,2(1X,ES19.11))") &
2016 IF (use_virial) virial%pv_xc = 0.0_dp
2022 rho1_r=rhoz_r_aux, &
2023 rho1_g=rhoz_g_aux, &
2025 xc_section=xc_section, &
2026 compute_virial=use_virial, &
2027 virial_xc=virial%pv_xc)
2030 IF (use_virial)
THEN
2031 virial%pv_exc = virial%pv_exc + virial%pv_xc
2032 virial%pv_virial = virial%pv_virial + virial%pv_xc
2035 IF (debug_stress .AND. use_virial)
THEN
2036 stdeb = 1.0_dp*fconv*virial%pv_xc
2037 CALL para_env%sum(stdeb)
2038 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2042 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2044 IF (use_virial)
THEN
2045 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2047 IF (debug_forces) fodeb(1:3) = force(1)%rho_elec(1:3, 1)
2048 IF (debug_stress .AND. use_virial) stdeb = virial%pv_virial
2049 DO ispin = 1, nspins
2050 CALL dbcsr_set(mhy(ispin, 1)%matrix, 0.0_dp)
2051 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
2052 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
2053 hmat=mhy(ispin, 1), pmat=matrix_p(ispin, 1), &
2054 calculate_forces=.true., &
2055 basis_type=basis_type, task_list_external=task_list)
2057 IF (debug_forces)
THEN
2058 fodeb(1:3) = force(1)%rho_elec(1:3, 1) - fodeb(1:3)
2059 CALL para_env%sum(fodeb)
2060 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm ", fodeb
2062 IF (debug_stress .AND. use_virial)
THEN
2063 stdeb = fconv*(virial%pv_virial - pv_loc)
2064 CALL para_env%sum(stdeb)
2065 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2069 IF (use_virial)
THEN
2070 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
2072 DO ispin = 1, nspins
2073 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
2074 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
2075 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
2077 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
2079 IF (admm_env%do_gapw)
THEN
2082 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
2084 admm_env%admm_gapw_env%admm_kind_set, &
2085 admm_env%admm_gapw_env%oce, sab_aux_fit, para_env)
2087 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2090 local_rhoz_set_admm%rho_atom_set, &
2091 qs_env, xc_section, para_env, do_triplet=.false., &
2092 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
2094 IF (debug_forces) fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1)
2095 CALL update_ks_atom(qs_env, mhy(:, 1), matrix_p(:, 1), forces=.true., tddft=.false., &
2096 rho_atom_external=local_rhoz_set_admm%rho_atom_set, &
2097 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
2098 oce_external=admm_env%admm_gapw_env%oce, &
2099 sab_external=sab_aux_fit)
2100 IF (debug_forces)
THEN
2101 fodeb(1:3) = force(1)%Vhxc_atom(1:3, 1) - fodeb(1:3)
2102 CALL para_env%sum(fodeb)
2103 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pin*dK*rhoz_admm[PAW] ", fodeb
2108 nao = admm_env%nao_orb
2109 nao_aux = admm_env%nao_aux_fit
2111 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2112 DO ispin = 1, nspins
2114 admm_env%work_aux_orb, nao)
2116 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2117 admm_env%work_orb_orb)
2118 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2121 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2138 cpassert(n_rep_hf == 1)
2142 IF (hfx_treat_lsd_in_core) mspin = nspins
2143 IF (use_virial) virial%pv_fock_4c = 0.0_dp
2145 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, &
2146 s_mstruct_changed=s_mstruct_changed)
2147 distribute_fock_matrix = .true.
2152 IF (dft_control%do_admm)
THEN
2153 CALL get_qs_env(qs_env=qs_env, admm_env=admm_env)
2154 CALL get_admm_env(admm_env, matrix_s_aux_fit=scrm, rho_aux_fit=rho_aux_fit)
2155 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2156 NULLIFY (mpz, mhz, mpd, mhd)
2161 DO ispin = 1, nspins
2162 ALLOCATE (mhz(ispin, 1)%matrix, mhd(ispin, 1)%matrix)
2163 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=scrm(1)%matrix)
2164 CALL dbcsr_create(mhd(ispin, 1)%matrix, template=scrm(1)%matrix)
2165 CALL dbcsr_copy(mhz(ispin, 1)%matrix, scrm(1)%matrix)
2166 CALL dbcsr_copy(mhd(ispin, 1)%matrix, scrm(1)%matrix)
2167 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
2168 CALL dbcsr_set(mhd(ispin, 1)%matrix, 0.0_dp)
2169 ALLOCATE (mpz(ispin, 1)%matrix)
2171 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2172 CALL dbcsr_copy(mpz(ispin, 1)%matrix, p_env%p1_admm(ispin)%matrix)
2173 CALL dbcsr_add(mpz(ispin, 1)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2176 CALL dbcsr_create(mpz(ispin, 1)%matrix, template=scrm(1)%matrix)
2177 CALL dbcsr_copy(mpz(ispin, 1)%matrix, matrix_pz_admm(ispin)%matrix)
2179 mpd(ispin, 1)%matrix => matrix_p(ispin, 1)%matrix
2182 IF (x_data(1, 1)%do_hfx_ri)
THEN
2185 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2186 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2187 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2190 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhd, eh1, rho_ao=mpd, &
2191 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2192 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2198 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2204 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2210 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
2211 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
2212 nao = admm_env%nao_orb
2213 nao_aux = admm_env%nao_aux_fit
2215 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
2216 DO ispin = 1, nspins
2218 admm_env%work_aux_orb, nao)
2220 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
2221 admm_env%work_orb_orb)
2222 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
2225 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
2230 IF (debug_forces) fodeb(1:3) = force(1)%overlap_admm(1:3, 1)
2231 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2232 DO ispin = 1, nspins
2233 CALL dbcsr_add(mhd(ispin, 1)%matrix, mhx(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2234 CALL dbcsr_add(mhz(ispin, 1)%matrix, mhy(ispin, 1)%matrix, 1.0_dp, 1.0_dp)
2240 IF (debug_forces)
THEN
2241 fodeb(1:3) = force(1)%overlap_admm(1:3, 1) - fodeb(1:3)
2242 CALL para_env%sum(fodeb)
2243 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx*S' ", fodeb
2248 IF (
ASSOCIATED(mhx) .AND.
ASSOCIATED(mhy))
THEN
2257 ALLOCATE (mpz(nspins, 1), mhz(nspins, 1))
2258 DO ispin = 1, nspins
2259 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
2260 mpz(ispin, 1)%matrix => mpa(ispin)%matrix
2263 IF (x_data(1, 1)%do_hfx_ri)
THEN
2266 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpz, &
2267 geometry_did_change=s_mstruct_changed, nspins=nspins, &
2268 hf_fraction=x_data(1, 1)%general_parameter%fraction)
2273 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
2277 DEALLOCATE (mhz, mpz)
2285 IF (debug_forces) fodeb(1:3) = force(1)%fock_4c(1:3, 1)
2286 IF (dft_control%do_admm)
THEN
2290 CALL qs_rho_get(rho_aux_fit, rho_ao_kp=matrix_p)
2291 NULLIFY (matrix_pza)
2293 DO ispin = 1, nspins
2294 ALLOCATE (matrix_pza(ispin)%matrix)
2296 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=p_env%p1_admm(ispin)%matrix)
2297 CALL dbcsr_copy(matrix_pza(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
2298 CALL dbcsr_add(matrix_pza(ispin)%matrix, ex_env%matrix_pe_admm(ispin)%matrix, &
2301 CALL dbcsr_create(matrix_pza(ispin)%matrix, template=matrix_pz_admm(ispin)%matrix)
2302 CALL dbcsr_copy(matrix_pza(ispin)%matrix, matrix_pz_admm(ispin)%matrix)
2305 IF (x_data(1, 1)%do_hfx_ri)
THEN
2308 x_data(1, 1)%general_parameter%fraction, &
2309 rho_ao=matrix_p, rho_ao_resp=matrix_pza, &
2310 use_virial=use_virial, resp_only=resp_only)
2313 1, use_virial, resp_only=resp_only)
2321 IF (x_data(1, 1)%do_hfx_ri)
THEN
2324 x_data(1, 1)%general_parameter%fraction, &
2325 rho_ao=matrix_p, rho_ao_resp=mpa, &
2326 use_virial=use_virial, resp_only=resp_only)
2329 1, use_virial, resp_only=resp_only)
2333 IF (use_virial)
THEN
2334 virial%pv_exx = virial%pv_exx - virial%pv_fock_4c
2335 virial%pv_virial = virial%pv_virial - virial%pv_fock_4c
2336 virial%pv_calculate = .false.
2339 IF (debug_forces)
THEN
2340 fodeb(1:3) = force(1)%fock_4c(1:3, 1) - fodeb(1:3)
2341 CALL para_env%sum(fodeb)
2342 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pz*hfx ", fodeb
2344 IF (debug_stress .AND. use_virial)
THEN
2345 stdeb = -1.0_dp*fconv*virial%pv_fock_4c
2346 CALL para_env%sum(stdeb)
2347 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2354 IF (use_virial)
THEN
2356 zehartree = zehartree + 2.0_dp*ehartree
2359 IF (dft_control%do_admm)
THEN
2360 zexc_aux_fit = zexc_aux_fit + exc_aux_fit
2367 IF (dft_control%qs_control%do_ls_scf)
THEN
2369 eps_filter = dft_control%qs_control%eps_filter_matrix
2370 CALL calculate_whz_ao_matrix(qs_env, matrix_hz, matrix_wz, eps_filter)
2373 matrix_wz => p_env%w1
2376 IF (nspins == 1) focc = 2.0_dp
2378 DO ispin = 1, nspins
2379 CALL get_mo_set(mo_set=mos(ispin), homo=nocc)
2381 matrix_wz(ispin)%matrix, focc, nocc)
2384 IF (nspins == 2)
THEN
2385 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2386 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
2389 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
2390 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
2393 matrix_name=
"OVERLAP MATRIX", &
2394 basis_type_a=
"ORB", basis_type_b=
"ORB", &
2395 sab_nl=sab_orb, calculate_forces=.true., &
2396 matrix_p=matrix_wz(1)%matrix)
2398 IF (
SIZE(matrix_wz, 1) == 2)
THEN
2399 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
2400 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
2403 IF (debug_forces)
THEN
2404 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
2405 CALL para_env%sum(fodeb)
2406 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wz*dS ", fodeb
2408 IF (debug_stress .AND. use_virial)
THEN
2409 stdeb = fconv*(virial%pv_overlap - stdeb)
2410 CALL para_env%sum(stdeb)
2411 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2416 IF (debug_forces)
THEN
2418 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
2419 CALL para_env%sum(fodeb)
2420 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Response Force", fodeb
2421 fodeb(1:3) = ftot2(1:3, 1)
2422 CALL para_env%sum(fodeb)
2423 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Total Force ", fodeb
2424 DEALLOCATE (ftot1, ftot2, ftot3)
2426 IF (debug_stress .AND. use_virial)
THEN
2427 stdeb = fconv*(virial%pv_virial - sttot)
2428 CALL para_env%sum(stdeb)
2429 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2431 stdeb = fconv*(virial%pv_virial)
2432 CALL para_env%sum(stdeb)
2433 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
2435 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,3(1X,ES19.11))") &
2436 stdeb(1, 1), stdeb(2, 2), stdeb(3, 3)
2445 CALL timestop(handle)