61 integer,
intent(in) :: cloud_idx
62 integer,
intent(inout) :: ib_idx
63 type(ib_patch_parameters),
intent(inout),
dimension(:) :: particle_cloud_ibs
64 integer :: n_placed, geom, seed
65 integer(8) :: n_attempts, max_attempts
66 real(wp) :: xmin, xmax, ymin, ymax, zmin, zmax, min_dist
67 real(wp) :: rx, ry, rz, dist
69 real(wp),
allocatable :: placed(:,:)
70 integer :: hash_size, slot
71 integer :: bx, by, bz, nbx, nby, nbz
72 integer :: dx_b, dy_b, dz_b, dz_lo, dz_hi, j
73 integer,
allocatable :: hash_head(:), chain_next(:)
94 max_attempts = int(
particle_cloud(cloud_idx)%num_particles, 8)*1000_8
98 if (seed == 0) seed = 1 + cloud_idx*1013904223
105 allocate (hash_head(hash_size))
110 do while (n_placed <
particle_cloud(cloud_idx)%num_particles .and. n_attempts < max_attempts)
111 n_attempts = n_attempts + 1
121 bx = int(floor(rx/min_dist))
122 by = int(floor(ry/min_dist))
124 if (
p /= 0) bz = int(floor(rz/min_dist))
128 outer:
do dx_b = -1, 1
130 do dz_b = dz_lo, dz_hi
138 dist = sqrt((rx - placed(1, j))**2 + (ry - placed(2, j))**2)
140 dist = sqrt((rx - placed(1, j))**2 + (ry - placed(2, j))**2 + (rz - placed(3, j))**2)
142 if (dist < min_dist)
then
152 if (.not. overlaps)
then
153 n_placed = n_placed + 1
154 placed(1, n_placed) = rx
155 placed(2, n_placed) = ry
156 placed(3, n_placed) = rz
160 chain_next(n_placed) = hash_head(slot)
161 hash_head(slot) = n_placed
166 particle_cloud_ibs(ib_idx)%gbl_patch_id = ib_idx
167 particle_cloud_ibs(ib_idx)%geometry = geom
168 particle_cloud_ibs(ib_idx)%x_centroid = rx
169 particle_cloud_ibs(ib_idx)%y_centroid = ry
170 particle_cloud_ibs(ib_idx)%z_centroid = rz
171 particle_cloud_ibs(ib_idx)%step_x_centroid = rx
172 particle_cloud_ibs(ib_idx)%step_y_centroid = ry
173 particle_cloud_ibs(ib_idx)%step_z_centroid = rz
174 particle_cloud_ibs(ib_idx)%angles(:) = 0._wp
175 particle_cloud_ibs(ib_idx)%step_angles(:) = 0._wp
176 particle_cloud_ibs(ib_idx)%vel(:) = 0._wp
177 particle_cloud_ibs(ib_idx)%step_vel(:) = 0._wp
178 particle_cloud_ibs(ib_idx)%angular_vel(:) = 0._wp
179 particle_cloud_ibs(ib_idx)%step_angular_vel(:) = 0._wp
180 particle_cloud_ibs(ib_idx)%force(:) = 0._wp
181 particle_cloud_ibs(ib_idx)%torque(:) = 0._wp
182 particle_cloud_ibs(ib_idx)%centroid_offset(:) = 0._wp
183 particle_cloud_ibs(ib_idx)%rotation_matrix = 0._wp
184 particle_cloud_ibs(ib_idx)%rotation_matrix(1, 1) = 1._wp
185 particle_cloud_ibs(ib_idx)%rotation_matrix(2, 2) = 1._wp
186 particle_cloud_ibs(ib_idx)%rotation_matrix(3, 3) = 1._wp
187 particle_cloud_ibs(ib_idx)%rotation_matrix_inverse = particle_cloud_ibs(ib_idx)%rotation_matrix
188 particle_cloud_ibs(ib_idx)%radius =
particle_cloud(cloud_idx)%radius
190 particle_cloud_ibs(ib_idx)%moment =
dflt_real
191 particle_cloud_ibs(ib_idx)%moving_ibm =
particle_cloud(cloud_idx)%moving_ibm
192 particle_cloud_ibs(ib_idx)%slip = .false.
197 call s_mpi_abort(
"Error :: Failed to place all particles in particle bed")
200 deallocate (placed, hash_head, chain_next)
Generates particle beds by converting particle_cloud patch specifications into individual immersed bo...
impure subroutine, public s_generate_particle_clouds(particle_cloud_ibs)
Generate all particle beds and fill particle_cloud_ibs. Called on all ranks before s_reduce_ib_patch_...
real(wp) function f_xorshift(seed)
Xorshift PRNG. Advances seed in-place and returns a value in [0, 1).
integer function f_bin_hash(bx, by, bz, hash_size)
Hash bin coordinates to a 1-indexed slot in [1, hash_size]. Uses large prime multipliers to spread bi...
subroutine s_particle_cloud_random_box(cloud_idx, ib_idx, particle_cloud_ibs)
Generates a random distributions of particles in a box with a minimum spacing.