1# 1 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp"
8# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
9# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
10# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
11# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
15# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
19# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
21# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
23# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
25# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
27# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
42# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
43# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
44# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
48# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
62# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
64# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
66# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
68# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
70# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
72# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
74# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
76# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
78# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
80# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
82# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
84# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
86# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
88# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
94# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
96# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
98# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
100# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
102# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
104# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
106# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
108# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
110# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
112# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114# 126 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116# 156 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118# 197 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120# 211 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122# 236 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124# 247 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126# 249 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127# 260 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129# 310 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131# 320 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137# 356 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139# 366 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
141# 373 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
143# 379 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
145# 385 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
147# 391 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
149# 397 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
151# 403 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
153# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
154# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
155# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
156# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
158# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
160# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
164# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
168# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
174# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
178# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
180# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
182# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
184# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
186# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
188# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
190# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
192# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
194# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
196# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
198# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
200# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
202# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
204# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
206# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
242# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
244# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
247# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
250# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
253# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
256# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
259# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
262# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
265# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
268# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
271# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
274# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
277# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
280# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
283# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
286# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
289# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
292# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
295# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
298# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
301# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
303# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
304# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
306# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
308# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
313# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
316# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
319# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
322# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
325# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
328# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
330# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
332# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
334# 8 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp" 2
363 type(bounds_info),
dimension(3),
intent(in) :: glb_bounds
364 type(ib_patch_parameters),
allocatable,
intent(out),
dimension(:) :: particle_cloud_ibs
365 integer,
intent(out) :: num_particle_cloud_ibs
366 type(ib_patch_parameters),
allocatable :: cloud_ibs(:)
367 integer :: cloud_idx, glbl_idx, num_cloud_ibs, n_total_particles
368 real(wp) :: t_start, t_end
370 if (num_particle_clouds == 0)
then
371 allocate (particle_cloud_ibs(0))
372 num_particle_cloud_ibs = 0
376 call cpu_time(t_start)
378 n_total_particles = 0
379 do cloud_idx = 1, num_particle_clouds
380 n_total_particles = n_total_particles + particle_cloud(cloud_idx)%num_particles
384 num_particle_cloud_ibs = 0
387 do cloud_idx = 1, num_particle_clouds
391 select case (particle_cloud(cloud_idx)%packing_method)
397 call s_mpi_abort(
"Particle cloud packing method is not a known packing method of MFC. Exiting.")
401# 73 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp"
402 call s_prohibit_abort(
"num_particle_cloud_ibs + num_cloud_ibs > num_ib_patches_max_namelist",
"Too many particle-cloud IBs in one rank's neighborhood. Modify case file or increase num_ib_patches_max_namelist.")
403# 73 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp"
405# 75 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp"
406 particle_cloud_ibs(num_particle_cloud_ibs + 1:num_particle_cloud_ibs + num_cloud_ibs) = cloud_ibs(1:num_cloud_ibs)
407 num_particle_cloud_ibs = num_particle_cloud_ibs + num_cloud_ibs
408 deallocate (cloud_ibs)
412 if (
proc_rank == 0) print
'(a,i0,a,f0.3,a)',
'Particle beds placed ', glbl_idx - num_ibs,
' particles in ', &
413 & t_end - t_start,
' seconds.'
425 integer,
intent(in) :: cloud_idx
426 integer,
intent(inout) :: glbl_idx
427 type(bounds_info),
dimension(3),
intent(in) :: glb_bounds
428 type(ib_patch_parameters),
allocatable,
intent(out),
dimension(:) :: cloud_ibs
429 integer,
intent(out) :: num_cloud_ibs
430 integer :: ib_idx, n_placed, seed, alloc_stat
431 integer(8) :: n_attempts, max_attempts
432 real(wp) :: min_dist, rx, ry, rz
433 logical :: overlaps, reject, periodic_pack
434 real(wp),
allocatable :: placed(:,:)
435 integer :: hash_size, slot
436 integer :: bx, by, bz, nx_bins, ny_bins, nz_bins
437 integer,
allocatable :: hash_head(:), chain_next(:)
438 real(wp) :: xmin, ymin, zmin, length_x, length_y, length_z
440 allocate (cloud_ibs(particle_cloud(cloud_idx)%num_particles), stat=alloc_stat)
441 if (alloc_stat /= 0)
then
442 call s_mpi_abort(
"Error :: Ran out of CPU memory trying to allocate particle cloud IB array. " &
443 & //
"Current system resources cannot perform rejection packing with the specified number of particles.")
447 min_dist = 2._wp*particle_cloud(cloud_idx)%radius + particle_cloud(cloud_idx)%min_spacing
448 periodic_pack = particle_cloud(cloud_idx)%cloud_geometry == 1 .and. particle_cloud(cloud_idx)%periodic == 1
449 length_x = particle_cloud(cloud_idx)%length_x
450 length_y = particle_cloud(cloud_idx)%length_y
451 length_z = particle_cloud(cloud_idx)%length_z
452 xmin = particle_cloud(cloud_idx)%x_centroid - 0.5_wp*length_x
453 ymin = particle_cloud(cloud_idx)%y_centroid - 0.5_wp*length_y
454 zmin = particle_cloud(cloud_idx)%z_centroid - 0.5_wp*length_z
455 nx_bins = max(1, ceiling(length_x/min_dist))
456 ny_bins = max(1, ceiling(length_y/min_dist))
457 nz_bins = max(1, ceiling(length_z/min_dist))
458 if (num_dims < 3) nz_bins = 1
460 max_attempts = int(particle_cloud(cloud_idx)%num_particles, 8)*1000_8
463 seed = particle_cloud(cloud_idx)%seed
464 if (seed == 0) seed = 1 + cloud_idx*1013904223
466 allocate (placed(3, particle_cloud(cloud_idx)%num_particles))
470 hash_size = max(16, 4*particle_cloud(cloud_idx)%num_particles)
471 allocate (hash_head(hash_size))
472 allocate (chain_next(particle_cloud(cloud_idx)%num_particles))
476 do while (n_placed < particle_cloud(cloud_idx)%num_particles .and. n_attempts < max_attempts)
477 n_attempts = n_attempts + 1
483 & xmin, ymin, zmin, length_x, length_y, length_z, nx_bins, ny_bins, nz_bins, &
484 & overlaps, bx, by, bz)
486 if (.not. overlaps)
then
487 n_placed = n_placed + 1
488 placed(1, n_placed) = rx
489 placed(2, n_placed) = ry
490 placed(3, n_placed) = rz
494 chain_next(n_placed) = hash_head(slot)
495 hash_head(slot) = n_placed
497 glbl_idx = glbl_idx + 1
502 if (n_placed < particle_cloud(cloud_idx)%num_particles)
then
503 call s_mpi_abort(
"Error :: Failed to place all particles in particle bed")
506 deallocate (placed, hash_head, chain_next)
509 num_cloud_ibs = ib_idx
520 integer,
intent(in) :: cloud_idx
521 integer,
intent(inout) :: seed
522 real(wp),
intent(out) :: rx, ry, rz
523 logical,
intent(out) :: reject
524 real(wp) :: xmin, xmax, ymin, ymax, zmin, zmax
525 real(wp) :: theta, phi, r_shell, rho, u, zdir, r_inner, r_outer
529 select case (particle_cloud(cloud_idx)%cloud_geometry)
531 xmin = particle_cloud(cloud_idx)%x_centroid - 0.5_wp*particle_cloud(cloud_idx)%length_x
532 xmax = particle_cloud(cloud_idx)%x_centroid + 0.5_wp*particle_cloud(cloud_idx)%length_x
533 ymin = particle_cloud(cloud_idx)%y_centroid - 0.5_wp*particle_cloud(cloud_idx)%length_y
534 ymax = particle_cloud(cloud_idx)%y_centroid + 0.5_wp*particle_cloud(cloud_idx)%length_y
535 zmin = particle_cloud(cloud_idx)%z_centroid - 0.5_wp*particle_cloud(cloud_idx)%length_z
536 zmax = particle_cloud(cloud_idx)%z_centroid + 0.5_wp*particle_cloud(cloud_idx)%length_z
540 if (num_dims < 3)
then
541 rz = particle_cloud(cloud_idx)%z_centroid
546 r_inner = particle_cloud(cloud_idx)%shell_inner_radius + particle_cloud(cloud_idx)%radius
547 r_outer = particle_cloud(cloud_idx)%shell_outer_radius - particle_cloud(cloud_idx)%radius
549 if (num_dims < 3)
then
552 r_shell = sqrt((r_outer**2 - r_inner**2)*u + r_inner**2)
553 rx = particle_cloud(cloud_idx)%x_centroid + r_shell*cos(theta)
554 ry = particle_cloud(cloud_idx)%y_centroid + r_shell*sin(theta)
555 rz = particle_cloud(cloud_idx)%z_centroid
556 if (ry < particle_cloud(cloud_idx)%y_centroid + particle_cloud(cloud_idx)%radius) reject = .true.
560 rho = sqrt(max(0._wp, 1._wp - zdir**2))
562 r_shell = ((r_outer**3 - r_inner**3)*u + r_inner**3)**(1._wp/3._wp)
563 rx = particle_cloud(cloud_idx)%x_centroid + r_shell*rho*cos(phi)
564 ry = particle_cloud(cloud_idx)%y_centroid + r_shell*rho*sin(phi)
565 rz = particle_cloud(cloud_idx)%z_centroid + r_shell*zdir
566 if (rz < particle_cloud(cloud_idx)%z_centroid + particle_cloud(cloud_idx)%radius) reject = .true.
569 call s_mpi_abort(
"Particle cloud geometry is not a known cloud geometry of MFC. Exiting.")
582 integer,
intent(in) :: cloud_idx
583 integer,
intent(inout) :: glbl_idx
584 type(bounds_info),
dimension(3),
intent(in) :: glb_bounds
585 type(ib_patch_parameters),
allocatable,
intent(out),
dimension(:) :: cloud_ibs
586 integer,
intent(out) :: num_cloud_ibs
587 integer :: ib_idx, n_placed, n_target
588 integer :: row, col, ncx, ncy, ix, jy, kz, b
589 real(wp) :: xmin, xmax, ymin, ymax, zmin, zmax, min_dist
590 real(wp) :: spacing, row_dy, cell, x0, px, py
591 real(wp),
dimension(4) :: bx_off, by_off, bz_off
592 real(wp),
dimension(3) :: centroid
597 xmin = particle_cloud(cloud_idx)%x_centroid - 0.5_wp*particle_cloud(cloud_idx)%length_x
598 xmax = particle_cloud(cloud_idx)%x_centroid + 0.5_wp*particle_cloud(cloud_idx)%length_x
599 ymin = particle_cloud(cloud_idx)%y_centroid - 0.5_wp*particle_cloud(cloud_idx)%length_y
600 ymax = particle_cloud(cloud_idx)%y_centroid + 0.5_wp*particle_cloud(cloud_idx)%length_y
601 zmin = particle_cloud(cloud_idx)%z_centroid - 0.5_wp*particle_cloud(cloud_idx)%length_z
602 zmax = particle_cloud(cloud_idx)%z_centroid + 0.5_wp*particle_cloud(cloud_idx)%length_z
604 min_dist = 2._wp*particle_cloud(cloud_idx)%radius + particle_cloud(cloud_idx)%min_spacing
605 n_target = particle_cloud(cloud_idx)%num_particles
608 if (num_dims < 3)
then
610 spacing = sqrt(2._wp*(xmax - xmin)*(ymax - ymin)/(sqrt(3._wp)*real(n_target, wp)))
613 spacing = (sqrt(2._wp)*(xmax - xmin)*(ymax - ymin)*(zmax - zmin)/real(n_target, wp))**(1._wp/3._wp)
616 if (spacing < min_dist)
then
617 call s_mpi_abort(
"Error :: Particle cloud is too dense for lattice packing; " &
618 & //
"reduce num_particles or min_spacing, or enlarge the cloud region")
621 if (num_dims < 3)
then
623 row_dy = spacing*sqrt(3._wp)/2._wp
625 do while (n_placed < n_target)
626 py = ymin + real(row, wp)*row_dy
628 if (mod(row, 2) == 1) x0 = xmin + 0.5_wp*spacing
631 do while (px <= xmax .and. n_placed < n_target)
632 glbl_idx = glbl_idx + 1
633 centroid = [px, py, particle_cloud(cloud_idx)%z_centroid]
635 call s_add_cloud_particle(cloud_idx, ib_idx, glbl_idx, centroid(1), centroid(2), centroid(3), cloud_ibs)
637 n_placed = n_placed + 1
639 px = x0 + real(col, wp)*spacing
645 cell = spacing*sqrt(2._wp)
646 bx_off = [0._wp, 0.5_wp, 0.5_wp, 0._wp]*cell
647 by_off = [0._wp, 0.5_wp, 0._wp, 0.5_wp]*cell
648 bz_off = [0._wp, 0._wp, 0.5_wp, 0.5_wp]*cell
649 ncx = max(1, ceiling((xmax - xmin)/cell))
650 ncy = max(1, ceiling((ymax - ymin)/cell))
652 do while (n_placed < n_target)
656 if (n_placed >= n_target)
exit
657 centroid = [xmin + real(ix, wp)*cell + bx_off(b), ymin + real(jy, wp)*cell + by_off(b), &
658 & zmin + real(kz, wp)*cell + bz_off(b)]
659 glbl_idx = glbl_idx + 1
664 n_placed = n_placed + 1
672 num_cloud_ibs = ib_idx
681 type(ib_patch_parameters),
intent(inout),
dimension(:) :: cloud_ibs
682 type(bounds_info),
dimension(3),
intent(in) :: glb_bounds
683 integer,
intent(inout) :: num_cloud_ibs
684 integer :: i, write_idx
685 real(wp),
dimension(3) :: centroid
688 do i = 1, num_cloud_ibs
689 centroid = [cloud_ibs(i)%x_centroid, cloud_ibs(i)%y_centroid, 0._wp]
690 if (num_dims == 3) centroid(3) = cloud_ibs(i)%z_centroid
692 write_idx = write_idx + 1
693 if (write_idx /= i) cloud_ibs(write_idx) = cloud_ibs(i)
696 num_cloud_ibs = write_idx
705 integer,
intent(in) :: cloud_idx, glbl_idx
706 integer,
intent(inout) :: ib_idx
707 real(wp),
intent(in) :: px, py, pz
708 type(ib_patch_parameters),
intent(inout),
dimension(:) :: particle_cloud_ibs
711 if (ib_idx >
size(particle_cloud_ibs))
then
712# 380 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp"
713 call s_prohibit_abort(
"ib_idx > size(particle_cloud_ibs)",
"Too many particle-cloud IBs on one rank. Modify case file or increase num_ib_patches_max_namelist.")
714# 380 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp"
716# 382 "/home/runner/work/MFC/MFC/src/pre_process/m_particle_cloud.fpp"
718 particle_cloud_ibs(ib_idx)%gbl_patch_id = glbl_idx
719 particle_cloud_ibs(ib_idx)%x_centroid = px
720 particle_cloud_ibs(ib_idx)%y_centroid = py
721 particle_cloud_ibs(ib_idx)%z_centroid = pz
722 particle_cloud_ibs(ib_idx)%vel(:) = 0._wp
723 particle_cloud_ibs(ib_idx)%angular_vel(:) = 0._wp
724 particle_cloud_ibs(ib_idx)%angles(:) = 0._wp
725 particle_cloud_ibs(ib_idx)%radius = particle_cloud(cloud_idx)%radius
730 subroutine s_get_cloud_bin(px, py, pz, min_dist, periodic_pack, xmin, ymin, zmin, nx_bins, ny_bins, nz_bins, bx, by, bz)
732 real(wp),
intent(in) :: px, py, pz, min_dist
733 logical,
intent(in) :: periodic_pack
734 real(wp),
intent(in) :: xmin, ymin, zmin
735 integer,
intent(in) :: nx_bins, ny_bins, nz_bins
736 integer,
intent(out) :: bx, by, bz
738 if (periodic_pack)
then
739 bx = modulo(int(floor((px - xmin)/min_dist)), nx_bins)
740 by = modulo(int(floor((py - ymin)/min_dist)), ny_bins)
741 if (num_dims < 3)
then
744 bz = modulo(int(floor((pz - zmin)/min_dist)), nz_bins)
747 bx = int(floor(px/min_dist))
748 by = int(floor(py/min_dist))
749 if (num_dims < 3)
then
752 bz = int(floor(pz/min_dist))
762 & xmin, ymin, zmin, length_x, length_y, length_z, nx_bins, ny_bins, nz_bins, overlaps, bx, by, bz)
764 real(wp),
intent(in) :: px, py, pz, min_dist
765 real(wp),
intent(in),
dimension(:,:) :: placed
766 integer,
intent(in),
dimension(:) :: hash_head, chain_next
767 integer,
intent(in) :: hash_size
768 logical,
intent(in) :: periodic_pack
769 real(wp),
intent(in) :: xmin, ymin, zmin, length_x, length_y, length_z
770 integer,
intent(in) :: nx_bins, ny_bins, nz_bins
771 logical,
intent(out) :: overlaps
772 integer,
intent(out) :: bx, by, bz
773 integer :: nbx, nby, nbz, slot
774 integer :: dx_b, dy_b, dz_b, dz_lo, dz_hi, j
775 real(wp) :: dist_sq, min_dist_sq, dx, dy, dz
777 call s_get_cloud_bin(px, py, pz, min_dist, periodic_pack, xmin, ymin, zmin, nx_bins, ny_bins, nz_bins, bx, by, bz)
781 if (num_dims < 3)
then
786 min_dist_sq = min_dist**2
791 do dz_b = dz_lo, dz_hi
795 if (periodic_pack)
then
796 nbx = modulo(nbx, nx_bins)
797 nby = modulo(nby, ny_bins)
798 if (num_dims == 3) nbz = modulo(nbz, nz_bins)
803 dx = abs(px - placed(1, j))
804 dy = abs(py - placed(2, j))
805 if (periodic_pack)
then
806 dx = min(dx, length_x - dx)
807 dy = min(dy, length_y - dy)
809 if (num_dims < 3)
then
810 dist_sq = dx**2 + dy**2
812 dz = abs(pz - placed(3, j))
813 if (periodic_pack) dz = min(dz, length_z - dz)
814 dist_sq = dx**2 + dy**2 + dz**2
816 if (dist_sq < min_dist_sq)
then
831 integer,
intent(inout) :: seed
834 seed = ieor(seed, ishft(seed, 13))
835 seed = ieor(seed, ishft(seed, -17))
836 seed = ieor(seed, ishft(seed, 5))
841 rval = real(iand(seed, huge(seed)), wp)/real(huge(seed), wp)
849 integer,
intent(in) :: bx, by, bz, hash_size
853 key = ieor(ieor(int(bx, 8)*73856093_8, int(by, 8)*19349663_8), int(bz, 8)*83492791_8)
854 slot = int(mod(abs(key), int(hash_size, 8))) + 1
Compile-time constant parameters: default values, tolerances, and physical constants.
integer, parameter num_ib_patches_max_namelist
real(wp), parameter pi
Pi.
Defines global parameters for the computational domain, simulation algorithm, and initial conditions.
integer proc_rank
Rank of the local processor Number of cells in the x-, y- and z-coordinate directions.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
logical function, public f_local_rank_owns_location(location, glb_bounds_in)
True if location falls within this rank's own subdomain (a strict partition - each location is owned ...
MPI communication layer: domain decomposition, halo exchange, reductions, and parallel I/O setup.
impure subroutine s_mpi_abort(prnt, code)
The subroutine terminates the MPI execution environment.
impure subroutine s_prohibit_abort(condition, message)
Print a case file error with the prohibited condition and message, then abort execution.
Generates particle beds by converting particle_cloud patch specifications into individual immersed bo...
subroutine s_add_cloud_particle(cloud_idx, ib_idx, glbl_idx, px, py, pz, particle_cloud_ibs)
Writes a single placed particle into particle_cloud_ibs at the next free slot, advancing ib_idx,...
subroutine s_particle_cloud_rejection_pack(cloud_idx, glbl_idx, glb_bounds, cloud_ibs, num_cloud_ibs)
Rejection-samples particle centres into a box or hemisphere-shell region with a minimum centre-to-cen...
impure subroutine, public s_generate_particle_clouds(glb_bounds, particle_cloud_ibs, num_particle_cloud_ibs)
Generate all particle beds and fill particle_cloud_ibs, keeping only the particles this rank owns und...
real(wp) function f_xorshift(seed)
Xorshift PRNG. Advances seed in-place and returns a value in [0, 1).
subroutine s_particle_cloud_lattice(cloud_idx, glbl_idx, glb_bounds, cloud_ibs, num_cloud_ibs)
Places particles on the optimally dense lattice for the cloud region: a triangular lattice in 2D,...
subroutine s_check_cloud_particle_overlap(px, py, pz, placed, hash_head, chain_next, hash_size, min_dist, periodic_pack, xmin, ymin, zmin, length_x, length_y, length_z, nx_bins, ny_bins, nz_bins, overlaps, bx, by, bz)
Check whether a candidate particle centre overlaps any already-placed particle in neighbouring spatia...
subroutine s_reduce_particle_cloud_ibs(cloud_ibs, glb_bounds, num_cloud_ibs)
Compacts cloud_ibs(1:num_cloud_ibs) in place, discarding entries this rank does not own (f_local_rank...
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_get_cloud_bin(px, py, pz, min_dist, periodic_pack, xmin, ymin, zmin, nx_bins, ny_bins, nz_bins, bx, by, bz)
Convert a candidate particle centre to spatial-hash bin coordinates.
subroutine s_sample_cloud_candidate(cloud_idx, seed, rx, ry, rz, reject)
Draws one rejection-sampling candidate centre (rx, ry, rz) for cloud_idx, advancing seed in place....