172 eps_mm_rspace, xdat, ydat, zdat, bo2, n_rep_real, mm_cell)
173 REAL(kind=dp),
INTENT(IN) :: zetp
174 REAL(kind=dp),
DIMENSION(3),
INTENT(IN) :: rp
175 REAL(kind=dp),
INTENT(IN) :: scale, w
178 REAL(kind=dp),
INTENT(IN) :: eps_mm_rspace
179 REAL(kind=dp),
DIMENSION(:),
POINTER :: xdat, ydat, zdat
180 INTEGER,
DIMENSION(2, 3),
INTENT(IN) :: bo2
181 INTEGER,
DIMENSION(3),
INTENT(IN) :: n_rep_real
184 INTEGER :: ig, ix, iy, iz, xlb, xub, ylb, yub, zlb, &
186 INTEGER,
DIMENSION(2, 3) :: bo, gbo
187 INTEGER,
DIMENSION(3) :: cubecenter, lb_cube, ub_cube
188 INTEGER,
DIMENSION(:),
POINTER :: sphere_bounds
189 REAL(kind=dp) :: radius, rpg, xap, yap, zap
190 REAL(kind=dp),
DIMENSION(3) :: dr, my_shift, rpl
191 REAL(kind=dp),
DIMENSION(:, :, :),
POINTER :: grid
193 radius =
exp_radius(0, zetp, eps_mm_rspace, scale*w)
194 IF (radius .EQ. 0.0_dp)
THEN
200 dr(:) = pwgrid%pw_grid%dr(:)
202 bo = pwgrid%pw_grid%bounds_local
203 gbo = pwgrid%pw_grid%bounds
206 CALL return_cube(cube_info, radius, lb_cube, ub_cube, sphere_bounds)
208 IF (all(n_rep_real == 0))
THEN
209 cubecenter(:) = floor(rpl(:)/dr(:)) + gbo(1, :)
210 zub = min(bo(2, 3), cubecenter(3) + ub_cube(3))
211 zlb = max(bo(1, 3), cubecenter(3) + lb_cube(3))
212 yub = min(bo(2, 2), cubecenter(2) + ub_cube(2))
213 ylb = max(bo(1, 2), cubecenter(2) + lb_cube(2))
214 xub = min(bo(2, 1), cubecenter(1) + ub_cube(1))
215 xlb = max(bo(1, 1), cubecenter(1) + lb_cube(1))
216 IF (zlb .GT. zub .OR. ylb .GT. yub .OR. xlb .GT. xub)
RETURN
218 rpg = real(ig - gbo(1, 3), dp)*dr(3) - rpl(3)
219 zap = exp(-zetp*rpg**2)
220 zdat(ig) = scale*w*zap
223 rpg = real(ig - gbo(1, 2), dp)*dr(2) - rpl(2)
224 yap = exp(-zetp*rpg**2)
228 rpg = real(ig - gbo(1, 1), dp)*dr(1) - rpl(1)
229 xap = exp(-zetp*rpg**2)
232 CALL collocate_gf_npbc(grid, xdat, ydat, zdat, bo, bo2, zlb, zub, ylb, yub, xlb, xub)
234 DO iz = -n_rep_real(3), n_rep_real(3)
235 my_shift(3) = mm_cell%hmat(3, 3)*real(iz, kind=dp)
236 DO iy = -n_rep_real(2), n_rep_real(2)
237 my_shift(2) = mm_cell%hmat(2, 2)*real(iy, kind=dp)
238 DO ix = -n_rep_real(1), n_rep_real(1)
239 my_shift(1) = mm_cell%hmat(1, 1)*real(ix, kind=dp)
240 rpl = rp + my_shift(:)
241 cubecenter(:) = floor(rpl(:)/dr(:)) + gbo(1, :)
242 zub = min(bo(2, 3), cubecenter(3) + ub_cube(3))
243 zlb = max(bo(1, 3), cubecenter(3) + lb_cube(3))
244 yub = min(bo(2, 2), cubecenter(2) + ub_cube(2))
245 ylb = max(bo(1, 2), cubecenter(2) + lb_cube(2))
246 xub = min(bo(2, 1), cubecenter(1) + ub_cube(1))
247 xlb = max(bo(1, 1), cubecenter(1) + lb_cube(1))
248 IF (zlb .GT. zub .OR. ylb .GT. yub .OR. xlb .GT. xub) cycle
250 rpg = real(ig - gbo(1, 3), dp)*dr(3) - rpl(3)
251 zap = exp(-zetp*rpg**2)
252 zdat(ig) = scale*w*zap
255 rpg = real(ig - gbo(1, 2), dp)*dr(2) - rpl(2)
256 yap = exp(-zetp*rpg**2)
260 rpg = real(ig - gbo(1, 1), dp)*dr(1) - rpl(1)
261 xap = exp(-zetp*rpg**2)
264 CALL collocate_gf_npbc(grid, xdat, ydat, zdat, bo, bo2, zlb, zub, ylb, yub, xlb, xub)
295 eps_mm_rspace, xdat, ydat, zdat, bo, force, n_rep_real, mm_cell)
296 REAL(kind=dp),
INTENT(IN) :: zetp
297 REAL(kind=dp),
DIMENSION(3),
INTENT(IN) :: rp
298 REAL(kind=dp),
INTENT(IN) :: scale, w
301 REAL(kind=dp),
INTENT(IN) :: eps_mm_rspace
302 INTEGER,
DIMENSION(2, 3),
INTENT(IN) :: bo
303 REAL(kind=dp),
DIMENSION(2, bo(1, 3):bo(2, 3)) :: zdat
304 REAL(kind=dp),
DIMENSION(2, bo(1, 2):bo(2, 2)) :: ydat
305 REAL(kind=dp),
DIMENSION(2, bo(1, 1):bo(2, 1)) :: xdat
306 REAL(kind=dp),
DIMENSION(3),
INTENT(OUT) :: force
307 INTEGER,
DIMENSION(3),
INTENT(IN) :: n_rep_real
310 INTEGER :: ig, ix, iy, iz, xlb, xub, ylb, yub, zlb, &
312 INTEGER,
DIMENSION(2, 3) :: gbo
313 INTEGER,
DIMENSION(3) :: cubecenter, lb_cube, ub_cube
314 INTEGER,
DIMENSION(:),
POINTER :: sphere_bounds
315 REAL(kind=dp) :: radius, rpg, xap, yap, zap
316 REAL(kind=dp),
DIMENSION(3) :: dr, my_shift, rpl
317 REAL(kind=dp),
DIMENSION(:, :, :),
POINTER :: grid
320 radius =
exp_radius(0, zetp, eps_mm_rspace, scale*w)
321 IF (radius .EQ. 0.0_dp)
RETURN
325 dr(:) = pwgrid%pw_grid%dr(:)
327 gbo = pwgrid%pw_grid%bounds
330 CALL return_cube(cube_info, radius, lb_cube, ub_cube, sphere_bounds)
332 IF (all(n_rep_real == 0))
THEN
333 cubecenter(:) = floor(rpl(:)/dr(:)) + gbo(1, :)
334 zub = min(bo(2, 3), cubecenter(3) + ub_cube(3))
335 zlb = max(bo(1, 3), cubecenter(3) + lb_cube(3))
336 yub = min(bo(2, 2), cubecenter(2) + ub_cube(2))
337 ylb = max(bo(1, 2), cubecenter(2) + lb_cube(2))
338 xub = min(bo(2, 1), cubecenter(1) + ub_cube(1))
339 xlb = max(bo(1, 1), cubecenter(1) + lb_cube(1))
340 IF (zlb .GT. zub .OR. ylb .GT. yub .OR. xlb .GT. xub)
RETURN
342 rpg = real(ig - gbo(1, 3), dp)*dr(3) - rpl(3)
343 zap = exp(-zetp*rpg**2)
344 zdat(1, ig) = scale*w*zap
345 zdat(2, ig) = rpg*zdat(1, ig)*zetp*2.0_dp
348 rpg = real(ig - gbo(1, 2), dp)*dr(2) - rpl(2)
349 yap = exp(-zetp*rpg**2)
351 ydat(2, ig) = rpg*ydat(1, ig)*zetp*2.0_dp
354 rpg = real(ig - gbo(1, 1), dp)*dr(1) - rpl(1)
355 xap = exp(-zetp*rpg**2)
357 xdat(2, ig) = rpg*xdat(1, ig)*zetp*2.0_dp
359 CALL integrate_gf_npbc(grid, xdat, ydat, zdat, bo, zlb, zub, ylb, yub, xlb, xub, force)
361 DO iz = -n_rep_real(3), n_rep_real(3)
362 my_shift(3) = mm_cell%hmat(3, 3)*real(iz, kind=dp)
363 DO iy = -n_rep_real(2), n_rep_real(2)
364 my_shift(2) = mm_cell%hmat(2, 2)*real(iy, kind=dp)
365 DO ix = -n_rep_real(1), n_rep_real(1)
366 my_shift(1) = mm_cell%hmat(1, 1)*real(ix, kind=dp)
367 rpl = rp + my_shift(:)
368 cubecenter(:) = floor(rpl(:)/dr(:)) + gbo(1, :)
369 zub = min(bo(2, 3), cubecenter(3) + ub_cube(3))
370 zlb = max(bo(1, 3), cubecenter(3) + lb_cube(3))
371 yub = min(bo(2, 2), cubecenter(2) + ub_cube(2))
372 ylb = max(bo(1, 2), cubecenter(2) + lb_cube(2))
373 xub = min(bo(2, 1), cubecenter(1) + ub_cube(1))
374 xlb = max(bo(1, 1), cubecenter(1) + lb_cube(1))
375 IF (zlb .GT. zub .OR. ylb .GT. yub .OR. xlb .GT. xub) cycle
377 rpg = real(ig - gbo(1, 3), dp)*dr(3) - rpl(3)
378 zap = exp(-zetp*rpg**2)
379 zdat(1, ig) = scale*w*zap
380 zdat(2, ig) = rpg*zdat(1, ig)*zetp*2.0_dp
383 rpg = real(ig - gbo(1, 2), dp)*dr(2) - rpl(2)
384 yap = exp(-zetp*rpg**2)
386 ydat(2, ig) = rpg*ydat(1, ig)*zetp*2.0_dp
389 rpg = real(ig - gbo(1, 1), dp)*dr(1) - rpl(1)
390 xap = exp(-zetp*rpg**2)
392 xdat(2, ig) = rpg*xdat(1, ig)*zetp*2.0_dp
394 CALL integrate_gf_npbc(grid, xdat, ydat, zdat, bo, &
395 zlb, zub, ylb, yub, xlb, xub, force)