22 #include "./base/base_uses.f90"
27 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
28 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mm_collocate_potential'
50 SUBROUTINE collocate_gf_npbc(grid, xdat, ydat, zdat, bo1, bo2, zlb, zub, ylb, yub, xlb, xub)
52 INTEGER,
INTENT(IN) :: bo1(2, 3)
53 REAL(dp),
INTENT(INOUT) :: &
54 grid(bo1(1, 1):bo1(2, 1), bo1(1, 2):bo1(2, 2), bo1(1, 3):bo1(2, 3))
55 INTEGER,
INTENT(IN) :: bo2(2, 3)
56 REAL(dp),
INTENT(IN) :: zdat(bo2(1, 3):bo2(2, 3)), &
57 ydat(bo2(1, 2):bo2(2, 2)), &
58 xdat(bo2(1, 1):bo2(2, 1))
59 INTEGER,
INTENT(IN) :: zlb, zub, ylb, yub, xlb, xub
66 tmp1 = zdat(iz)*ydat(iy)
68 grid(ix, iy, iz) = grid(ix, iy, iz) + xdat(ix)*tmp1
73 END SUBROUTINE collocate_gf_npbc
90 SUBROUTINE integrate_gf_npbc(grid, xdat, ydat, zdat, bo, zlb, zub, ylb, yub, xlb, xub, force)
92 INTEGER,
INTENT(IN) :: bo(2, 3)
93 REAL(dp),
INTENT(IN) :: zdat(2, bo(1, 3):bo(2, 3)), &
94 ydat(2, bo(1, 2):bo(2, 2)), &
95 xdat(2, bo(1, 1):bo(2, 1))
96 REAL(dp),
INTENT(INOUT) :: grid(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3))
97 INTEGER,
INTENT(IN) :: zlb, zub, ylb, yub, xlb, xub
98 REAL(dp),
INTENT(INOUT) :: force(3)
100 INTEGER :: ix, iy, iy2, iz
101 REAL(dp) :: fx1, fx2, fyz1, fyz2, g1, g2, x1, x2
106 DO iy = ylb, yub - 1, 2
113 g1 = grid(ix, iy, iz)
114 g2 = grid(ix, iy2, iz)
122 force(1) = force(1) + fx1*zdat(1, iz)*ydat(1, iy)
123 force(2) = force(2) + fyz1*zdat(1, iz)*ydat(2, iy)
124 force(3) = force(3) + fyz1*zdat(2, iz)*ydat(1, iy)
125 force(1) = force(1) + fx2*zdat(1, iz)*ydat(1, iy2)
126 force(2) = force(2) + fyz2*zdat(1, iz)*ydat(2, iy2)
127 force(3) = force(3) + fyz2*zdat(2, iz)*ydat(1, iy2)
131 IF (iy2 .NE. yub)
THEN
136 g2 = grid(ix, iy2, iz)
142 force(1) = force(1) + fx2*zdat(1, iz)*ydat(1, iy2)
143 force(2) = force(2) + fyz2*zdat(1, iz)*ydat(2, iy2)
144 force(3) = force(3) + fyz2*zdat(2, iz)*ydat(1, iy2)
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
176 TYPE(pw_r3d_rs_type),
INTENT(IN) :: pwgrid
177 TYPE(cube_info_type),
INTENT(IN) :: cube_info
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
182 TYPE(cell_type),
POINTER :: mm_cell
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
299 TYPE(pw_r3d_rs_type),
INTENT(IN) :: pwgrid
300 TYPE(cube_info_type),
INTENT(IN) :: cube_info
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
308 TYPE(cell_type),
POINTER :: mm_cell
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
395 zlb, zub, ylb, yub, xlb, xub, force)
All kind of helpful little routines.
real(kind=dp) function, public exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
The radius of a primitive Gaussian function for a given threshold is calculated. g(r) = prefactor*r**...
Handles all functions related to the CELL.
for a given dr()/dh(r) this will provide the bounds to be used if one wants to go over a sphere-subre...
subroutine, public return_cube(info, radius, lb_cube, ub_cube, sphere_bounds)
...
Defines the basic variable types.
integer, parameter, public dp
Calculate the MM potential by collocating the primitive Gaussian functions (pgf)
subroutine, public collocate_gf_rspace_nopbc(zetp, rp, scale, W, pwgrid, cube_info, eps_mm_rspace, xdat, ydat, zdat, bo2, n_rep_real, mm_cell)
Main driver to collocate gaussian functions on grid without using periodic boundary conditions (NoPBC...
subroutine, public integrate_gf_rspace_nopbc(zetp, rp, scale, W, pwgrid, cube_info, eps_mm_rspace, xdat, ydat, zdat, bo, force, n_rep_real, mm_cell)
Main driver to integrate gaussian functions on a grid function without using periodic boundary condit...
subroutine integrate_gf_npbc(grid, xdat, ydat, zdat, bo, zlb, zub, ylb, yub, xlb, xub, force)
...