65 CHARACTER(LEN=*),
PARAMETER :: routinen =
'derive_fdm_cd3'
67 INTEGER :: handle, i, j, k
68 INTEGER,
DIMENSION(3) :: lb, ub
69 REAL(kind=dp),
DIMENSION(3) :: h
70 REAL(kind=dp),
DIMENSION(:, :, :),
POINTER :: drdx, drdy, drdz, r
74 CALL timeset(routinen, handle)
77 rs_desc => rs_grid%desc
84 lb(1:3) = rs_grid%lb_real(1:3)
85 ub(1:3) = rs_grid%ub_real(1:3)
92 h(1:3) = 2.0_dp*f%pw_grid%dr(1:3)
99 drdx(i, j, k) = (r(i + 1, j, k) - r(i - 1, j, k))/h(1)
100 drdy(i, j, k) = (r(i, j + 1, k) - r(i, j - 1, k))/h(2)
101 drdz(i, j, k) = (r(i, j, k + 1) - r(i, j, k - 1))/h(3)
113 CALL timestop(handle)
134 CHARACTER(LEN=*),
PARAMETER :: routinen =
'derive_fdm_cd5'
136 INTEGER :: handle, i, j, k
137 INTEGER,
DIMENSION(3) :: lb, ub
138 REAL(kind=dp),
DIMENSION(3) :: h
139 REAL(kind=dp),
DIMENSION(:, :, :),
POINTER :: drdx, drdy, drdz, r
143 CALL timeset(routinen, handle)
146 rs_desc => rs_grid%desc
153 lb(1:3) = rs_grid%lb_real(1:3)
154 ub(1:3) = rs_grid%ub_real(1:3)
156 drdx => drs_grid(1)%r
157 drdy => drs_grid(2)%r
158 drdz => drs_grid(3)%r
161 h(1:3) = 12.0_dp*f%pw_grid%dr(1:3)
168 drdx(i, j, k) = (r(i - 2, j, k) - r(i + 2, j, k) + 8.0_dp*(r(i + 1, j, k) - r(i - 1, j, k)))/h(1)
169 drdy(i, j, k) = (r(i, j - 2, k) - r(i, j + 2, k) + 8.0_dp*(r(i, j + 1, k) - r(i, j - 1, k)))/h(2)
170 drdz(i, j, k) = (r(i, j, k - 2) - r(i, j, k + 2) + 8.0_dp*(r(i, j, k + 1) - r(i, j, k - 1)))/h(3)
182 CALL timestop(handle)
203 CHARACTER(LEN=*),
PARAMETER :: routinen =
'derive_fdm_cd7'
205 INTEGER :: handle, i, j, k
206 INTEGER,
DIMENSION(3) :: lb, ub
207 REAL(kind=dp),
DIMENSION(3) :: h
208 REAL(kind=dp),
DIMENSION(:, :, :),
POINTER :: drdx, drdy, drdz, r
212 CALL timeset(routinen, handle)
215 rs_desc => rs_grid%desc
222 lb(1:3) = rs_grid%lb_real(1:3)
223 ub(1:3) = rs_grid%ub_real(1:3)
225 drdx => drs_grid(1)%r
226 drdy => drs_grid(2)%r
227 drdz => drs_grid(3)%r
230 h(1:3) = 60.0_dp*f%pw_grid%dr(1:3)
237 drdx(i, j, k) = (r(i + 3, j, k) - r(i - 3, j, k) + 9.0_dp*(r(i - 2, j, k) - r(i + 2, j, k)) + &
238 45.0_dp*(r(i + 1, j, k) - r(i - 1, j, k)))/h(1)
239 drdy(i, j, k) = (r(i, j + 3, k) - r(i, j - 3, k) + 9.0_dp*(r(i, j - 2, k) - r(i, j + 2, k)) + &
240 45.0_dp*(r(i, j + 1, k) - r(i, j - 1, k)))/h(2)
241 drdz(i, j, k) = (r(i, j, k + 3) - r(i, j, k - 3) + 9.0_dp*(r(i, j, k - 2) - r(i, j, k + 2)) + &
242 45.0_dp*(r(i, j, k + 1) - r(i, j, k - 1)))/h(3)
254 CALL timestop(handle)
276 REAL(dp),
ALLOCATABLE,
DIMENSION(:),
INTENT(OUT) :: x_glbl, y_glbl, z_glbl, x_locl, y_locl, &
279 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_grid_axes'
281 INTEGER :: glb1, glb2, glb3, gub1, gub2, gub3, &
282 handle, i, lb1, lb2, lb3, ub1, ub2, ub3
283 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: gindx, gindy, gindz, lindx, lindy, lindz
284 INTEGER,
DIMENSION(2, 3) :: bounds, bounds_local
285 INTEGER,
DIMENSION(3) :: npts, npts_local
286 REAL(dp),
DIMENSION(3) :: dr
288 CALL timeset(routinen, handle)
291 bounds = pw_grid%bounds
292 bounds_local = pw_grid%bounds_local
294 npts_local = pw_grid%npts_local
297 glb1 = bounds(1, 1); gub1 = bounds(2, 1)
298 glb2 = bounds(1, 2); gub2 = bounds(2, 2)
299 glb3 = bounds(1, 3); gub3 = bounds(2, 3)
300 lb1 = bounds_local(1, 1); ub1 = bounds_local(2, 1)
301 lb2 = bounds_local(1, 2); ub2 = bounds_local(2, 2)
302 lb3 = bounds_local(1, 3); ub3 = bounds_local(2, 3)
304 ALLOCATE (lindx(lb1:ub1), lindy(lb2:ub2), lindz(lb3:ub3))
305 ALLOCATE (gindx(glb1:gub1), gindy(glb2:gub2), gindz(glb3:gub3))
306 ALLOCATE (x_locl(lb1:ub1), y_locl(lb2:ub2), z_locl(lb3:ub3))
307 ALLOCATE (x_glbl(glb1:gub1), y_glbl(glb2:gub2), z_glbl(glb3:gub3))
309 gindx(:) = (/(i, i=0, npts(1) - 1)/)
310 gindy(:) = (/(i, i=0, npts(2) - 1)/)
311 gindz(:) = (/(i, i=0, npts(3) - 1)/)
312 lindx(:) = (/(i, i=0, npts_local(1) - 1)/)
313 lindy(:) = (/(i, i=0, npts_local(2) - 1)/)
314 lindz(:) = (/(i, i=0, npts_local(3) - 1)/)
316 x_glbl(:) = gindx*dr(1)
317 y_glbl(:) = gindy*dr(2)
318 z_glbl(:) = gindz*dr(3)
321 IF (lb1 .EQ. ub1)
THEN
324 lindx(:) = lindx(:)*((ub1 - lb1)/(npts_local(1) - 1)) + lb1
326 IF (lb2 .EQ. ub2)
THEN
329 lindy(:) = lindy(:)*((ub2 - lb2)/(npts_local(2) - 1)) + lb2
331 IF (lb3 .EQ. ub3)
THEN
334 lindz(:) = lindz(:)*((ub3 - lb3)/(npts_local(3) - 1)) + lb3
337 x_locl(:) = x_glbl(lindx)
338 y_locl(:) = y_glbl(lindy)
339 z_locl(:) = z_glbl(lindz)
341 CALL timestop(handle)
365 SUBROUTINE pw_mollifier(pw_pool, zeta, x_glbl, y_glbl, z_glbl, pw_in, pw_out)
368 REAL(dp),
INTENT(IN) :: zeta
369 REAL(dp),
ALLOCATABLE,
DIMENSION(:),
INTENT(IN) :: x_glbl, y_glbl, z_glbl
373 CHARACTER(LEN=*),
PARAMETER :: routinen =
'pw_mollifier'
375 INTEGER :: handle, i, j, k, lb1, lb2, lb3, ub1, &
377 INTEGER,
DIMENSION(2, 3) :: bounds, bounds_local
378 REAL(dp) :: normfact, xi, xmax, xmin, yj, ymax, &
380 REAL(dp),
DIMENSION(3, 3) :: dh
385 CALL timeset(routinen, handle)
387 pw_grid => pw_in%pw_grid
389 bounds_local = pw_grid%bounds_local
390 bounds = pw_grid%bounds
392 lb1 = bounds_local(1, 1); ub1 = bounds_local(2, 1)
393 lb2 = bounds_local(1, 2); ub2 = bounds_local(2, 2)
394 lb3 = bounds_local(1, 3); ub3 = bounds_local(2, 3)
396 CALL pw_pool%create_pw(g)
397 CALL pw_pool%create_pw(g_gs)
398 CALL pw_pool%create_pw(pw_in_gs)
399 CALL pw_pool%create_pw(pw_out_gs)
402 xmin = x_glbl(bounds(1, 1)); xmax = x_glbl(bounds(2, 1))
403 ymin = y_glbl(bounds(1, 2)); ymax = y_glbl(bounds(2, 2))
404 zmin = z_glbl(bounds(1, 3)); zmax = z_glbl(bounds(2, 3))
409 xi = x_glbl(i); yj = y_glbl(j); zk = z_glbl(k)
410 IF (norm2((/(xi - xmin), (yj - ymin), (zk - zmin)/)) .LT. zeta - small_value)
THEN
411 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmin), (yj - ymin), (zk - zmin)/)/zeta)**2 - 1))
412 ELSE IF (norm2((/(xi - xmax), (yj - ymax), (zk - zmax)/)) .LT. zeta - small_value)
THEN
413 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmax), (yj - ymax), (zk - zmax)/)/zeta)**2 - 1))
414 ELSE IF (norm2((/(xi - xmin), (yj - ymax), (zk - zmax)/)) .LT. zeta - small_value)
THEN
415 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmin), (yj - ymax), (zk - zmax)/)/zeta)**2 - 1))
416 ELSE IF (norm2((/(xi - xmax), (yj - ymin), (zk - zmax)/)) .LT. zeta - small_value)
THEN
417 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmax), (yj - ymin), (zk - zmax)/)/zeta)**2 - 1))
418 ELSE IF (norm2((/(xi - xmax), (yj - ymax), (zk - zmin)/)) .LT. zeta - small_value)
THEN
419 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmax), (yj - ymax), (zk - zmin)/)/zeta)**2 - 1))
420 ELSE IF (norm2((/(xi - xmin), (yj - ymin), (zk - zmax)/)) .LT. zeta - small_value)
THEN
421 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmin), (yj - ymin), (zk - zmax)/)/zeta)**2 - 1))
422 ELSE IF (norm2((/(xi - xmin), (yj - ymax), (zk - zmin)/)) .LT. zeta - small_value)
THEN
423 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmin), (yj - ymax), (zk - zmin)/)/zeta)**2 - 1))
424 ELSE IF (norm2((/(xi - xmax), (yj - ymin), (zk - zmin)/)) .LT. zeta - small_value)
THEN
425 g%array(i, j, k) = exp(1.0_dp/(norm2((/(xi - xmax), (yj - ymin), (zk - zmin)/)/zeta)**2 - 1))
436 pw_out_gs%array = g_gs%array*pw_in_gs%array
440 CALL pw_scale(pw_out, real(pw_grid%ngpts, kind=dp))
447 IF (abs(pw_out%array(i, j, k)) .LE. 1.0e-10_dp) pw_out%array(i, j, k) = 0.0_dp
452 CALL pw_pool%give_back_pw(g)
453 CALL pw_pool%give_back_pw(g_gs)
454 CALL pw_pool%give_back_pw(pw_in_gs)
455 CALL pw_pool%give_back_pw(pw_out_gs)
456 CALL timestop(handle)