217 REAL(kind=
dp),
INTENT(IN) :: dr(3), dh(3, 3), dh_inv(3, 3)
218 LOGICAL,
INTENT(IN) :: ortho
219 REAL(kind=
dp),
INTENT(IN) :: max_radius
221 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_cube_info'
223 INTEGER :: check_1, check_2, handle, i, igmin, imr, &
224 jg, jg2, jgmin, k, kg, kg2, kgmin, &
226 REAL(kind=
dp) :: drmin, dxi, dy2, dyi, dz2, dzi, radius, &
229 CALL timeset(routinen, handle)
233 info%orthorhombic = ortho
234 info%max_rad_ga = max_radius
238 NULLIFY (info%lb_cube, info%ub_cube, &
239 info%sphere_bounds_count, info%sphere_bounds)
241 IF (.NOT. info%orthorhombic)
THEN
248 info%max_radius = max(maxval(abs(lb)), maxval(abs(ub)))
253 imr = ceiling((max_radius)/drmin)
254 info%max_radius = imr
261 ALLOCATE (info%lb_cube(3, imr), info%ub_cube(3, imr), &
262 info%sphere_bounds_count(imr), info%sphere_bounds(imr))
271 kgmin = do_and_hide_it_1(dzi, i, drmin, 0.0_dp, 0.0_dp, 0, 0)
275 jgmin = do_and_hide_it_1(dyi, i, drmin, dz2, 0.0_dp, kg2, 0)
279 igmin = do_and_hide_it_1(dxi, i, drmin, dz2, dy2, kg2, jg2)
280 check_1 =
modulo((kgmin*97 + jgmin*37 + igmin*113)*check_1 + 1277, 9343)
284 info%sphere_bounds_count(i) = k - 1
285 ALLOCATE (info%sphere_bounds(i)%p(info%sphere_bounds_count(i)))
293 info%lb_cube(:, i) = -1
295 kgmin = do_and_hide_it_1(dzi, i, drmin, 0.0_dp, 0.0_dp, 0, 0)
296 info%lb_cube(3, i) = min(kgmin, info%lb_cube(3, i))
297 info%sphere_bounds(i)%p(k) = kgmin
301 jgmin = do_and_hide_it_1(dyi, i, drmin, dz2, 0.0_dp, kg2, 0)
302 info%lb_cube(2, i) = min(jgmin, info%lb_cube(2, i))
303 info%sphere_bounds(i)%p(k) = jgmin
307 igmin = do_and_hide_it_1(dxi, i, drmin, dz2, dy2, kg2, jg2)
308 check_2 =
modulo((kgmin*97 + jgmin*37 + igmin*113)*check_2 + 1277, 9343)
309 info%lb_cube(1, i) = min(igmin, info%lb_cube(1, i))
310 info%sphere_bounds(i)%p(k) = igmin
314 info%ub_cube(:, i) = 1 - info%lb_cube(:, i)
316 IF (check_1 /= check_2)
THEN
317 cpabort(
"Irreproducible fp math caused memory corruption")
322 CALL timestop(handle)