MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_collisions.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
2!>
3!! @file
4!! @brief Contains module m_collisions
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20
21# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32
33# 167 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34! New line at end of file is required for FYPP
35# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
36# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
37# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
38# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
42# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49
50# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53
54# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59
60# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61
62# 167 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
63! New line at end of file is required for FYPP
64# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
65
66# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
68# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
70# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71
72# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73
74# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75
76# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77
78# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 126 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 156 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 197 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 211 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 236 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 247 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 249 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117# 260 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 310 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 320 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 356 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 366 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 373 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 379 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 385 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 391 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 397 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 403 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142! New line at end of file is required for FYPP
143# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
144# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
145# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
146# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
148# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151
152# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
154# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155
156# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157
158# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161
162# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165
166# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167
168# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 167 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171! New line at end of file is required for FYPP
172# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
173
174# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175
176# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177
178# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179
180# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181
182# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183
184# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185
186# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223
224# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225
226# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
227
228# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
229! New line at end of file is required for FYPP
230# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
231
232! GPU parallel region (scalar reductions, maxval/minval)
233# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
234
235! GPU parallel loop over threads (most common GPU macro)
236# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237
238! Required closing for GPU_PARALLEL_LOOP
239# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
240
241! Mark routine for device compilation
242# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243
244! Declare device-resident data
245# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! Inner loop within a GPU parallel region
248# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Scoped GPU data region
251# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Host code with device pointers (for MPI with GPU buffers)
254# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Allocate device memory (unscoped)
257# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! Free device memory
260# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Atomic operation on device
263# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! End atomic capture block
266# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Copy data between host and device
269# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Synchronization barrier
272# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Import GPU library module (openacc or omp_lib)
275# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! Emit code only for AMD compiler
278# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Emit code for non-Cray compilers
281# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Emit code only for Cray compiler
284# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Emit code for non-NVIDIA compilers
287# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291! New line at end of file is required for FYPP
292# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
293
294# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
295
296! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
297! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
298! example see misc/nvidia_uvm/bind.sh.
299# 55 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
300
301! Allocate and create GPU device memory
302# 75 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
303
304! Free GPU device memory and deallocate
305# 83 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
306
307! Cray-specific GPU pointer setup for vector fields
308# 107 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
309
310! Cray-specific GPU pointer setup for scalar fields
311# 123 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313! Cray-specific GPU pointer setup for acoustic source spatials
314# 148 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
315
316# 154 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
317
318# 161 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
319! New line at end of file is required for FYPP
320# 6 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp" 2
321
322!> @brief Ghost-node immersed boundary method: locates ghost/image points, computes interpolation coefficients, and corrects the
323!! flow state
325
326 use m_derived_types !< definitions of the derived types
327 use m_global_parameters !< definitions of the global parameters
328 use m_helper
329 use m_helper_basic !< functions to compare floating point numbers
330 use m_constants
332 use m_ib_patches
333 use m_model
334 use m_mpi_proxy
335
336 implicit none
337
340 ! overlap distances for computing collisions
341 integer, allocatable, dimension(:,:) :: collision_lookup
342 real(wp), allocatable, dimension(:,:) :: wall_overlap_distances
344
345# 29 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
346#if defined(MFC_OpenACC)
347# 29 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
348!$acc declare create(spring_stiffness, damping_parameter)
349# 29 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
350#elif defined(MFC_OpenMP)
351# 29 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
352!$omp declare target (spring_stiffness, damping_parameter)
353# 29 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
354#endif
355
356# 30 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
357#if defined(MFC_OpenACC)
358# 30 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
359!$acc declare create(collision_lookup, wall_overlap_distances)
360# 30 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
361#elif defined(MFC_OpenMP)
362# 30 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
363!$omp declare target (collision_lookup, wall_overlap_distances)
364# 30 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
365#endif
366
367 integer, dimension(:), allocatable :: ib_gbl_idx_lookup
368
369# 33 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
370#if defined(MFC_OpenACC)
371# 33 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
372!$acc declare create(ib_gbl_idx_lookup)
373# 33 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
374#elif defined(MFC_OpenMP)
375# 33 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
376!$omp declare target (ib_gbl_idx_lookup)
377# 33 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
378#endif
379
380contains
381
383
384 real(wp) :: e
385
386 e = coefficient_of_restitution
387 damping_parameter = -2._wp*log(e)/collision_time
388 spring_stiffness = (pi**2 + log(e)**2)/(collision_time**2)
389
390# 44 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
391#if defined(MFC_OpenACC)
392# 44 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
393!$acc update device(damping_parameter, spring_stiffness)
394# 44 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
395#elif defined(MFC_OpenMP)
396# 44 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
397!$omp target update to(damping_parameter, spring_stiffness)
398# 44 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
399#endif
400
401#ifdef MFC_DEBUG
402# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
403 block
404# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
405 use iso_fortran_env, only: output_unit
406# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
407
408# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
409 print *, 'm_collisions.fpp:46: ', '@:ALLOCATE(collision_lookup(num_local_ibs_max * 27 * 8, 4))'
410# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
411
412# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
413 call flush (output_unit)
414# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
415 end block
416# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
417#endif
418# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
419 allocate (collision_lookup(num_local_ibs_max * 27 * 8, 4))
420# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
421
422# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
423
424# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
425#if defined(MFC_OpenACC)
426# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
427!$acc enter data create(collision_lookup)
428# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
429#elif defined(MFC_OpenMP)
430# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
431!$omp target enter data map(always,alloc:collision_lookup)
432# 46 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
433#endif
434#ifdef MFC_DEBUG
435# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
436 block
437# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
438 use iso_fortran_env, only: output_unit
439# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
440
441# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
442 print *, 'm_collisions.fpp:47: ', '@:ALLOCATE(wall_overlap_distances(num_local_ibs_max*27, 6))'
443# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
444
445# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
446 call flush (output_unit)
447# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
448 end block
449# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
450#endif
451# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
452 allocate (wall_overlap_distances(num_local_ibs_max*27, 6))
453# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
454
455# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
456
457# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
458#if defined(MFC_OpenACC)
459# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
460!$acc enter data create(wall_overlap_distances)
461# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
462#elif defined(MFC_OpenMP)
463# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
464!$omp target enter data map(always,alloc:wall_overlap_distances)
465# 47 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
466#endif
467
469
470# 50 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
471#if defined(MFC_OpenACC)
472# 50 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
473!$acc update device(wall_overlap_distances)
474# 50 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
475#elif defined(MFC_OpenMP)
476# 50 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
477!$omp target update to(wall_overlap_distances)
478# 50 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
479#endif
480
481# 51 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
482#if defined(MFC_OpenACC)
483# 51 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
484!$acc update device(ib_coefficient_of_friction)
485# 51 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
486#elif defined(MFC_OpenMP)
487# 51 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
488!$omp target update to(ib_coefficient_of_friction)
489# 51 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
490#endif
491
492 end subroutine s_initialize_collisions_module
493
494 subroutine s_apply_collision_forces(ghost_points, num_gps, ib_markers, forces, torques)
495
496 type(ghost_point), dimension(:), intent(in) :: ghost_points
497 integer, intent(in) :: num_gps
498 type(integer_field), intent(in) :: ib_markers
499 real(wp), dimension(num_ibs, 3), intent(inout) :: forces, torques
500 integer :: num_considered_collisions
501
502 ! return if no collisions
503
504 if (collision_model == 0) return
505
506 ! get is distance used in the force calculation with each IB and each wall
508 call s_detect_ib_collisions(ghost_points, ib_markers, num_gps, num_considered_collisions)
509
510 select case (collision_model)
511 case (1) ! soft sphere model
513 call s_apply_ib_collision_forces_soft_sphere(num_considered_collisions, forces, torques)
514 end select
515
516 end subroutine s_apply_collision_forces
517
518 !> @brief applies collision forces to IBs assuming a soft-sphere collision model (all IBs are circles or spheres)
519 subroutine s_apply_ib_collision_forces_soft_sphere(num_considered_collisions, forces, torques)
520
521 integer, intent(in) :: num_considered_collisions
522 real(wp), dimension(num_ibs, 3), intent(inout) :: forces, torques
523 integer :: i, encoded_pid1, encoded_pid2, xp1, xp2, yp1, yp2, zp1, zp2, pid1, pid2, l ! iterators and patch IDs
524 real(wp) :: overlap_distance
525 real(wp), dimension(3) :: normal_vector, centroid_1, centroid_2
526 real(wp), dimension(3) :: normal_velocity, tangential_vector, normal_force, tangential_force, torque, radial_vector, &
527 & rotation_velocity, vel1, vel2
528 real(wp) :: k, eta, effective_mass ! the spring stiffness and damping coefficient and mass of a specific interaction
529
530 if (num_considered_collisions == 0) return
531
532 ! print *, "Checking Collisions: ", num_considered_collisions, " on rank ", proc_rank
533
534 ! Iterate over all collisions detected
535
536# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
537
538# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
539#if defined(MFC_OpenACC)
540# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
541!$acc parallel loop gang vector default(present) private(i, l, encoded_pid1, encoded_pid2, xp1, xp2, yp1, yp2, zp1, zp2, pid1, pid2, centroid_1, centroid_2, normal_vector, overlap_distance, &
542# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
543!$acc& effective_mass, k, eta, normal_velocity, tangential_vector, normal_force, tangential_force, torque, radial_vector, rotation_velocity, vel1, vel2) copy(forces, torques)
544# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
545#elif defined(MFC_OpenMP)
546# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
547
548# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
549
550# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
551
552# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
553!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(i, l, encoded_pid1, &
554# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
555!$omp& encoded_pid2, xp1, xp2, yp1, yp2, zp1, zp2, pid1, pid2, centroid_1, centroid_2, normal_vector, overlap_distance, effective_mass, k, eta, normal_velocity, tangential_vector, normal_force, &
556# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
557!$omp& tangential_force, torque, radial_vector, rotation_velocity, vel1, vel2) map(tofrom:forces, torques)
558# 96 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
559#endif
560# 100 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
561 do i = 1, num_considered_collisions
562 encoded_pid1 = collision_lookup(i, 3)
563 encoded_pid2 = collision_lookup(i, 4)
564 call s_decode_patch_periodicity(encoded_pid1, pid1, xp1, yp1, zp1)
565 call s_decode_patch_periodicity(encoded_pid2, pid2, xp2, yp2, zp2)
566 pid1 = collision_lookup(i, 1)
567 pid2 = collision_lookup(i, 2)
568
569 ! call s_get_neighborhood_idx(pid1, pid1) ! global patch ID -> local index call s_get_neighborhood_idx(pid2, pid2)
570 if (pid1 <= 0 .or. pid2 <= 0) cycle
571
572 centroid_1(1) = patch_ib(pid1)%x_centroid + real(xp1, wp)*(glb_bounds(1)%end - glb_bounds(1)%beg)
573 centroid_1(2) = patch_ib(pid1)%y_centroid + real(yp1, wp)*(glb_bounds(2)%end - glb_bounds(2)%beg)
574 centroid_1(3) = 0._wp
575 centroid_2(1) = patch_ib(pid2)%x_centroid + real(xp2, wp)*(glb_bounds(1)%end - glb_bounds(1)%beg)
576 centroid_2(2) = patch_ib(pid2)%y_centroid + real(yp2, wp)*(glb_bounds(2)%end - glb_bounds(2)%beg)
577 centroid_2(3) = 0._wp
578 if (num_dims == 3) then
579 centroid_1(3) = patch_ib(pid1)%z_centroid + real(zp1, wp)*(glb_bounds(3)%end - glb_bounds(3)%beg)
580 centroid_2(3) = patch_ib(pid2)%z_centroid + real(zp2, wp)*(glb_bounds(3)%end - glb_bounds(3)%beg)
581 end if
582
583 normal_vector = centroid_2 - centroid_1
584 overlap_distance = patch_ib(pid1)%radius + patch_ib(pid2)%radius - norm2(normal_vector)
585 if (overlap_distance > 0._wp) then ! if the two patches are close enough to collide
586 normal_vector = normal_vector/norm2(normal_vector)
587 if (f_local_rank_owns_location(centroid_1)) then
588 ! compute constants of the collision
589 effective_mass = 1.0_wp/((1.0_wp/patch_ib(pid1)%mass) + (1._wp/(patch_ib(pid2)%mass)))
590 k = spring_stiffness*effective_mass
591 eta = damping_parameter*effective_mass
592
593 ! Get the vectors and velcoities
594 radial_vector = normal_vector*(patch_ib(pid1)%radius - 0.5_wp*overlap_distance)
595 call s_cross_product(patch_ib(pid1)%angular_vel, radial_vector, rotation_velocity)
596 vel1 = patch_ib(pid1)%vel + rotation_velocity
597 radial_vector = normal_vector*(-1.0_wp)*(patch_ib(pid2)%radius - 0.5_wp*overlap_distance)
598 call s_cross_product(patch_ib(pid2)%angular_vel, radial_vector, rotation_velocity)
599 vel2 = patch_ib(pid2)%vel + rotation_velocity
600
601 normal_velocity = dot_product(vel1 - vel2, normal_vector)*normal_vector
602 tangential_vector = (vel1 - vel2) - normal_velocity
603 if (.not. f_approx_equal(norm2(tangential_vector), &
604 & 0._wp)) tangential_vector = tangential_vector/norm2(tangential_vector)
605
606 ! compute force and torque
607 normal_force = -k*overlap_distance*normal_vector - eta*normal_velocity
608 tangential_force = -ib_coefficient_of_friction*norm2(normal_force)*tangential_vector
609 call s_cross_product(normal_vector*patch_ib(pid1)%radius, tangential_force, torque)
610
611 do l = 1, num_dims
612 ! update the first IB
613
614# 152 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
615#if defined(MFC_OpenACC)
616# 152 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
617!$acc atomic update
618# 152 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
619#elif defined(MFC_OpenMP)
620# 152 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
621!$omp atomic update
622# 152 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
623#endif
624 forces(pid1, l) = forces(pid1, l) + (normal_force(l) + tangential_force(l))
625
626# 154 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
627#if defined(MFC_OpenACC)
628# 154 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
629!$acc atomic update
630# 154 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
631#elif defined(MFC_OpenMP)
632# 154 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
633!$omp atomic update
634# 154 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
635#endif
636 torques(pid1, l) = torques(pid1, l) + torque(l)
637
638 ! apply equal and opposite force/torque to second IB
639
640# 158 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
641#if defined(MFC_OpenACC)
642# 158 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
643!$acc atomic update
644# 158 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
645#elif defined(MFC_OpenMP)
646# 158 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
647!$omp atomic update
648# 158 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
649#endif
650 forces(pid2, l) = forces(pid2, l) - (normal_force(l) + tangential_force(l))
651
652# 160 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
653#if defined(MFC_OpenACC)
654# 160 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
655!$acc atomic update
656# 160 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
657#elif defined(MFC_OpenMP)
658# 160 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
659!$omp atomic update
660# 160 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
661#endif
662 torques(pid2, l) = torques(pid2, l) + torque(l)*patch_ib(pid2)%radius/patch_ib(pid1)%radius
663 end do
664 end if
665 end if
666 end do
667
668# 166 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
669#if defined(MFC_OpenACC)
670# 166 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
671!$acc end parallel loop
672# 166 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
673#elif defined(MFC_OpenMP)
674# 166 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
675
676# 166 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
677!$omp end target teams loop
678# 166 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
679#endif
680
682
683 !> @brief applies collision forces to IBs assuming a soft-sphere collision model (all IBs are circles or spheres)
685
686 real(wp), dimension(num_ibs, 3), intent(inout) :: forces, torques
687 integer :: patch_id, i, l
688 real(wp), dimension(3) :: normal_force, tangential_force, normal_vector, normal_velocity, tangential_vector, &
689 & collision_location, torque, radial_vector, rotation_velocity, velocity
690 real(wp) :: k, eta ! the spring stiffness and damping coefficient for a specific IB
691
692
693# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
694
695# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
696#if defined(MFC_OpenACC)
697# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
698!$acc parallel loop collapse(2) gang vector default(present) &
699# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
700!$acc& private(patch_id, i, l, collision_location, normal_vector, k, eta, normal_velocity, tangential_vector, normal_force, tangential_force, torque, radial_vector, rotation_velocity, velocity) &
701# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
702!$acc& copy(forces, torques)
703# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
704#elif defined(MFC_OpenMP)
705# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
706
707# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
708
709# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
710
711# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
712!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(2) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
713# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
714!$omp& private(patch_id, i, l, collision_location, normal_vector, k, eta, normal_velocity, tangential_vector, normal_force, tangential_force, torque, radial_vector, rotation_velocity, velocity) &
715# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
716!$omp& map(tofrom:forces, torques)
717# 179 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
718#endif
719# 182 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
720 do patch_id = 1, num_ibs
721 do i = 1, num_dims*2
722 ! only compute force contributions if there was an overlap
723 if (f_approx_equal(wall_overlap_distances(patch_id, i), 0._wp)) cycle
724
725 select case (i)
726 case (1) ! x domain left
727 normal_vector = [-1._wp, 0._wp, 0._wp]
728 case (2) ! x domain right
729 normal_vector = [1._wp, 0._wp, 0._wp]
730 case (3) ! y domain bottom
731 normal_vector = [0._wp, -1._wp, 0._wp]
732 case (4) ! y domain top
733 normal_vector = [0._wp, 1._wp, 0._wp]
734 case (5) ! z domain back
735 normal_vector = [0._wp, 0._wp, -1._wp]
736 case (6) ! z domain front
737 normal_vector = [0._wp, 0._wp, 1._wp]
738 end select
739
740 ! ensure the local rank owns that collision before proceeding
741 collision_location = [patch_ib(patch_id)%x_centroid, patch_ib(patch_id)%y_centroid, 0._wp]
742 if (num_dims == 3) collision_location(3) = patch_ib(patch_id)%z_centroid
743 if (f_local_rank_owns_location(collision_location)) then
744 k = spring_stiffness*patch_ib(patch_id)%mass
745 eta = damping_parameter*patch_ib(patch_id)%mass
746
747 ! get the vector that points from the centroid to the point of collision
748 radial_vector = normal_vector*(patch_ib(patch_id)%radius - wall_overlap_distances(patch_id, i))
749 ! convert the angular velocity to linear velocity
750 call s_cross_product(patch_ib(patch_id)%angular_vel, radial_vector, rotation_velocity)
751 velocity = patch_ib(patch_id)%vel + rotation_velocity
752
753 ! standard soft-sphere collision with the wall
754 normal_velocity = dot_product(velocity, normal_vector)*normal_vector
755 tangential_vector = velocity - normal_velocity
756 if (.not. f_approx_equal(norm2(tangential_vector), &
757 & 0._wp)) tangential_vector = tangential_vector/norm2(tangential_vector)
758 normal_force = -k*wall_overlap_distances(patch_id, i)*normal_vector - eta*normal_velocity
759 tangential_force = -ib_coefficient_of_friction*norm2(normal_force)*tangential_vector
760 call s_cross_product(normal_vector*patch_ib(patch_id)%radius, tangential_force, torque)
761
762 do l = 1, num_dims
763
764# 225 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
765#if defined(MFC_OpenACC)
766# 225 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
767!$acc atomic update
768# 225 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
769#elif defined(MFC_OpenMP)
770# 225 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
771!$omp atomic update
772# 225 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
773#endif
774 forces(patch_id, l) = forces(patch_id, l) + (normal_force(l) + tangential_force(l))
775
776# 227 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
777#if defined(MFC_OpenACC)
778# 227 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
779!$acc atomic update
780# 227 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
781#elif defined(MFC_OpenMP)
782# 227 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
783!$omp atomic update
784# 227 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
785#endif
786 torques(patch_id, l) = torques(patch_id, l) + torque(l)
787 end do
788 end if
789 end do
790 end do
791
792# 233 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
793#if defined(MFC_OpenACC)
794# 233 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
795!$acc end parallel loop
796# 233 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
797#elif defined(MFC_OpenMP)
798# 233 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
799
800# 233 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
801!$omp end target teams loop
802# 233 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
803#endif
804
806
807 !> uses ghost-point/image-point information to determine if it is possible if two IBs are colliding, effectively an optimized
808 !! nearest neighbor search
809 subroutine s_detect_ib_collisions(gps, ib_markers, num_gps, num_considered_collisions)
810
811 type(ghost_point), dimension(num_gps), intent(in) :: gps
812 type(integer_field), intent(in) :: ib_markers
813 integer, intent(in) :: num_gps
814 integer, intent(out) :: num_considered_collisions
815 integer :: i, j, k, z_bound, ii, jj, kk
816 integer, dimension(2) :: decoded_pairs
817 integer :: gp_idx, gp_patch_id, neighbor_patch_id
818 integer :: pair_idx, out_idx
819 logical :: already_found
820
821 ! Temporary array to hold all detected pairs (with potential duplicates)
822 integer, dimension(num_gps, 2) :: raw_pairs
823 integer :: num_raw, local_num_raw
824
825 num_raw = 0
826 z_bound = 0; if (num_dims == 3) z_bound = 2
827
828
829# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
830
831# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
832#if defined(MFC_OpenACC)
833# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
834!$acc parallel loop gang vector default(present) private(gp_idx, gp_patch_id, neighbor_patch_id, local_num_raw, i, j, k, ii, jj, kk) copy(raw_pairs, num_raw) copyin(z_bound)
835# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
836#elif defined(MFC_OpenMP)
837# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
838
839# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
840
841# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
842
843# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
844!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
845# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
846!$omp& private(gp_idx, gp_patch_id, neighbor_patch_id, local_num_raw, i, j, k, ii, jj, kk) map(tofrom:raw_pairs, num_raw) map(to:z_bound)
847# 258 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
848#endif
849# 260 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
850 do gp_idx = 1, num_gps
851 i = gps(gp_idx)%loc(1)
852 j = gps(gp_idx)%loc(2)
853 k = 0; if (num_dims == 3) k = gps(gp_idx)%loc(3)
854 gp_patch_id = ib_markers%sf(i, j, k)
855
856 ! search in a cube around the BG for Ib markers belonging to another patch
857 neighbor_search: do ii = i - 2, i + 2
858 do jj = j - 2, j + 2
859 do kk = k - z_bound, k + z_bound
860 neighbor_patch_id = ib_markers%sf(ii, jj, kk)
861
862 ! If any neighbors are of a different/higher marker value, we consider it for possible collision
863 if (gp_patch_id < neighbor_patch_id) then
864
865# 274 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
866#if defined(MFC_OpenACC)
867# 274 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
868!$acc atomic capture
869# 274 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
870#elif defined(MFC_OpenMP)
871# 274 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
872!$omp atomic capture
873# 274 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
874#endif
875 num_raw = num_raw + 1
876 local_num_raw = num_raw
877#if defined(MFC_OpenACC)
878# 277 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
879!$acc end atomic
880# 277 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
881#elif defined(MFC_OpenMP)
882# 277 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
883!$omp end atomic
884# 277 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
885#endif
886
887 ! Store with smaller ID first for consistent ordering
888 raw_pairs(local_num_raw, 1) = gp_patch_id
889 raw_pairs(local_num_raw, 2) = neighbor_patch_id
890 exit neighbor_search
891 end if
892 end do
893 end do
894 end do neighbor_search
895 end do
896
897# 288 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
898#if defined(MFC_OpenACC)
899# 288 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
900!$acc end parallel loop
901# 288 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
902#elif defined(MFC_OpenMP)
903# 288 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
904
905# 288 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
906!$omp end target teams loop
907# 288 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
908#endif
909
910 ! Coalesce collisions unique pairs
911 num_considered_collisions = 0
913 ! for each pair found in the raw collection
914 do pair_idx = 1, num_raw
915 already_found = .false.
916
917 ! get the decoded pairs for checking if they exist, using ii,jj,kk as dummy indices
918 call s_decode_patch_periodicity(raw_pairs(pair_idx, 1), decoded_pairs(1), ii, jj, kk)
919 call s_decode_patch_periodicity(raw_pairs(pair_idx, 2), decoded_pairs(2), ii, jj, kk)
920 decoded_pairs(1) = ib_gbl_idx_lookup(decoded_pairs(1))
921 decoded_pairs(2) = ib_gbl_idx_lookup(decoded_pairs(2))
922
923 ! skip self-collisions (an IB cannot collide with its own periodic image)
924 if (decoded_pairs(1) == decoded_pairs(2)) cycle
925
926 ! need to swap to guarantee the smaller decoded marker value is in index 1 and prevent double-counting
927 if (decoded_pairs(2) < decoded_pairs(1)) then
928 decoded_pairs(1) = decoded_pairs(1) + decoded_pairs(2)
929 decoded_pairs(2) = decoded_pairs(1) - decoded_pairs(2)
930 decoded_pairs(1) = decoded_pairs(1) - decoded_pairs(2)
931 raw_pairs(pair_idx, 1) = raw_pairs(pair_idx, 1) + raw_pairs(pair_idx, 2)
932 raw_pairs(pair_idx, 2) = raw_pairs(pair_idx, 1) - raw_pairs(pair_idx, 2)
933 raw_pairs(pair_idx, 1) = raw_pairs(pair_idx, 1) - raw_pairs(pair_idx, 2)
934 end if
935
936 ! check if it is already in the list
937 do out_idx = 1, num_considered_collisions
938 if (collision_lookup(out_idx, 1) == decoded_pairs(1) .and. collision_lookup(out_idx, 2) == decoded_pairs(2)) then
939 already_found = .true.
940 exit
941 end if
942 end do
943
944 ! and if it is not, append it to the list of pairs
945 if (.not. already_found) then
946 num_considered_collisions = num_considered_collisions + 1
947 if (num_considered_collisions > size(collision_lookup, 1)) then
948# 327 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
949 call s_prohibit_abort("num_considered_collisions > size(collision_lookup, 1)", "More collisions detected than memory to hold them. Consider increasing the size of the collision_lookup array")
950# 327 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
951 end if
952# 329 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
953
954 collision_lookup(num_considered_collisions, 1) = decoded_pairs(1)
955 collision_lookup(num_considered_collisions, 2) = decoded_pairs(2)
956 collision_lookup(num_considered_collisions, 3) = raw_pairs(pair_idx, 1)
957 collision_lookup(num_considered_collisions, 4) = raw_pairs(pair_idx, 2)
958 end if
959 end do
960
961# 336 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
962#if defined(MFC_OpenACC)
963# 336 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
964!$acc update device(collision_lookup)
965# 336 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
966#elif defined(MFC_OpenMP)
967# 336 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
968!$omp target update to(collision_lookup)
969# 336 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
970#endif
971
972 end subroutine s_detect_ib_collisions
973
974 !> @brief uses boundary conditions and particle locations to check for wall conditions
976
977 integer :: gp_idx, i, j, k, patch_id
978 real(wp) :: edge_location, overlap_distance
979
980 ! iterate over all ghost points to detect the one that is most-overlapping in each direction
981
982
983# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
984
985# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
986#if defined(MFC_OpenACC)
987# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
988!$acc parallel loop gang vector default(present) private(patch_id, edge_location, overlap_distance)
989# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
990#elif defined(MFC_OpenMP)
991# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
992
993# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
994
995# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
996
997# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
998!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
999# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1000!$omp& private(patch_id, edge_location, overlap_distance)
1001# 348 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1002#endif
1003 do patch_id = 1, num_ibs
1004# 351 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1005 ! check if the boundaries are either of the two conditions we should compute collisions with
1006 if (ib_bc_x%beg == bc_slip_wall .or. ib_bc_x%beg == bc_no_slip_wall) then
1007 ! get the location of the true IB surface towards the domain boundary
1008 edge_location = patch_ib(patch_id)%x_centroid - patch_ib(patch_id)%radius
1009 ! check if that edge actually extends out of the comutational domain
1010 if (edge_location < glb_bounds(1)%beg) then
1011 ! the distance that the IB extends out of the domain
1012 overlap_distance = glb_bounds(1)%beg - edge_location
1013 else
1014 overlap_distance = 0._wp
1015 end if
1016 wall_overlap_distances(patch_id, 1) = overlap_distance
1017 end if
1018
1019 if (ib_bc_x%end == bc_slip_wall .or. ib_bc_x%end == bc_no_slip_wall) then
1020 edge_location = patch_ib(patch_id)%x_centroid + patch_ib(patch_id)%radius
1021 if (edge_location > glb_bounds(1)%end) then
1022 overlap_distance = edge_location - glb_bounds(1)%end
1023 else
1024 overlap_distance = 0._wp
1025 end if
1026 wall_overlap_distances(patch_id, 1 + 1) = overlap_distance
1027 end if
1028# 351 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1029 ! check if the boundaries are either of the two conditions we should compute collisions with
1030 if (ib_bc_y%beg == bc_slip_wall .or. ib_bc_y%beg == bc_no_slip_wall) then
1031 ! get the location of the true IB surface towards the domain boundary
1032 edge_location = patch_ib(patch_id)%y_centroid - patch_ib(patch_id)%radius
1033 ! check if that edge actually extends out of the comutational domain
1034 if (edge_location < glb_bounds(2)%beg) then
1035 ! the distance that the IB extends out of the domain
1036 overlap_distance = glb_bounds(2)%beg - edge_location
1037 else
1038 overlap_distance = 0._wp
1039 end if
1040 wall_overlap_distances(patch_id, 3) = overlap_distance
1041 end if
1042
1043 if (ib_bc_y%end == bc_slip_wall .or. ib_bc_y%end == bc_no_slip_wall) then
1044 edge_location = patch_ib(patch_id)%y_centroid + patch_ib(patch_id)%radius
1045 if (edge_location > glb_bounds(2)%end) then
1046 overlap_distance = edge_location - glb_bounds(2)%end
1047 else
1048 overlap_distance = 0._wp
1049 end if
1050 wall_overlap_distances(patch_id, 3 + 1) = overlap_distance
1051 end if
1052# 351 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1053 ! check if the boundaries are either of the two conditions we should compute collisions with
1054 if (ib_bc_z%beg == bc_slip_wall .or. ib_bc_z%beg == bc_no_slip_wall) then
1055 ! get the location of the true IB surface towards the domain boundary
1056 edge_location = patch_ib(patch_id)%z_centroid - patch_ib(patch_id)%radius
1057 ! check if that edge actually extends out of the comutational domain
1058 if (edge_location < glb_bounds(3)%beg) then
1059 ! the distance that the IB extends out of the domain
1060 overlap_distance = glb_bounds(3)%beg - edge_location
1061 else
1062 overlap_distance = 0._wp
1063 end if
1064 wall_overlap_distances(patch_id, 5) = overlap_distance
1065 end if
1066
1067 if (ib_bc_z%end == bc_slip_wall .or. ib_bc_z%end == bc_no_slip_wall) then
1068 edge_location = patch_ib(patch_id)%z_centroid + patch_ib(patch_id)%radius
1069 if (edge_location > glb_bounds(3)%end) then
1070 overlap_distance = edge_location - glb_bounds(3)%end
1071 else
1072 overlap_distance = 0._wp
1073 end if
1074 wall_overlap_distances(patch_id, 5 + 1) = overlap_distance
1075 end if
1076# 375 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1077 end do
1078
1079# 376 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1080#if defined(MFC_OpenACC)
1081# 376 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1082!$acc end parallel loop
1083# 376 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1084#elif defined(MFC_OpenMP)
1085# 376 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1086
1087# 376 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1088!$omp end target teams loop
1089# 376 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1090#endif
1091
1092 end subroutine s_detect_wall_collisions
1093
1094 !> @brief function checks if this local MPI processor owns this specific collision
1095 function f_local_rank_owns_location(location) result(owns_collision)
1096
1097
1098# 383 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1099#if MFC_OpenACC
1100# 383 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1101!$acc routine seq
1102# 383 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1103#elif MFC_OpenMP
1104# 383 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1105
1106# 383 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1107
1108# 383 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1109!$omp declare target device_type(any)
1110# 383 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1111#endif
1112
1113 real(wp), dimension(3), intent(in) :: location
1114 logical :: owns_collision
1115 real(wp), dimension(3) :: projected_location
1116
1117 owns_collision = .true.
1118
1119#ifdef MFC_MPI
1120 if (num_procs > 1) then
1121 projected_location(:) = location(:)
1122
1123 ! catch the edge case where th collision lies just outside the computational domain
1124# 397 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1125 if (num_dims >= 1) then
1126 if (ib_bc_x%beg /= bc_periodic) then
1127 ! if it is outside the domain in one direction, project it somewhere inside so at least one rank owns it
1128 if (location(1) < glb_bounds(1)%beg) then
1129 projected_location(1) = glb_bounds(1)%beg
1130 else if (glb_bounds(1)%end < location(1)) then
1131 projected_location(1) = glb_bounds(1)%end - 1.0e-10_wp
1132 end if
1133 end if
1134 owns_collision = owns_collision .and. x_cb(-1) <= projected_location(1) &
1135 & .and. projected_location(1) < x_cb(m)
1136 end if
1137# 397 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1138 if (num_dims >= 2) then
1139 if (ib_bc_y%beg /= bc_periodic) then
1140 ! if it is outside the domain in one direction, project it somewhere inside so at least one rank owns it
1141 if (location(2) < glb_bounds(2)%beg) then
1142 projected_location(2) = glb_bounds(2)%beg
1143 else if (glb_bounds(2)%end < location(2)) then
1144 projected_location(2) = glb_bounds(2)%end - 1.0e-10_wp
1145 end if
1146 end if
1147 owns_collision = owns_collision .and. y_cb(-1) <= projected_location(2) &
1148 & .and. projected_location(2) < y_cb(n)
1149 end if
1150# 397 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1151 if (num_dims >= 3) then
1152 if (ib_bc_z%beg /= bc_periodic) then
1153 ! if it is outside the domain in one direction, project it somewhere inside so at least one rank owns it
1154 if (location(3) < glb_bounds(3)%beg) then
1155 projected_location(3) = glb_bounds(3)%beg
1156 else if (glb_bounds(3)%end < location(3)) then
1157 projected_location(3) = glb_bounds(3)%end - 1.0e-10_wp
1158 end if
1159 end if
1160 owns_collision = owns_collision .and. z_cb(-1) <= projected_location(3) &
1161 & .and. projected_location(3) < z_cb(p)
1162 end if
1163# 410 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1164 end if
1165#endif
1166
1167 end function f_local_rank_owns_location
1168
1169 !> @brief function checks if this local MPI processor owns this specific collision
1170 function f_neighborhood_ranks_own_location(location) result(owns_collision)
1171
1172 real(wp), dimension(3), intent(in) :: location
1173 logical :: owns_collision, periodic_owner
1174 real(wp) :: temp_neighbor_domain
1175 integer :: i
1176
1177 owns_collision = .true.
1178
1179#ifdef MFC_MPI
1180 if (num_procs > 2) then
1181 ! catch the edge case where th collision lies just outside the computational domain
1182 owns_collision = .true.
1183# 430 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1184 if (num_dims >= 1) then
1185 if (ib_bc_x%beg == bc_periodic .and. neighbor_domain_x%beg >= neighbor_domain_x%end) then
1186 ! project right side to the left
1187 temp_neighbor_domain = neighbor_domain_x%end + (glb_bounds(1)%end - glb_bounds(1)%beg)
1188 periodic_owner = neighbor_domain_x%beg <= location(1) .and. location(1) < temp_neighbor_domain
1189 ! project the left side to the right
1190 temp_neighbor_domain = neighbor_domain_x%beg - (glb_bounds(1)%end - glb_bounds(1)%beg)
1191 periodic_owner = periodic_owner .or. (temp_neighbor_domain <= location(1) .and. location(1) &
1192 & < neighbor_domain_x%end)
1193
1194 owns_collision = owns_collision .and. periodic_owner
1195 else
1196 owns_collision = owns_collision .and. neighbor_domain_x%beg <= location(1) .and. location(1) &
1197 & < neighbor_domain_x%end
1198 end if
1199 end if
1200# 430 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1201 if (num_dims >= 2) then
1202 if (ib_bc_y%beg == bc_periodic .and. neighbor_domain_y%beg >= neighbor_domain_y%end) then
1203 ! project right side to the left
1204 temp_neighbor_domain = neighbor_domain_y%end + (glb_bounds(2)%end - glb_bounds(2)%beg)
1205 periodic_owner = neighbor_domain_y%beg <= location(2) .and. location(2) < temp_neighbor_domain
1206 ! project the left side to the right
1207 temp_neighbor_domain = neighbor_domain_y%beg - (glb_bounds(2)%end - glb_bounds(2)%beg)
1208 periodic_owner = periodic_owner .or. (temp_neighbor_domain <= location(2) .and. location(2) &
1209 & < neighbor_domain_y%end)
1210
1211 owns_collision = owns_collision .and. periodic_owner
1212 else
1213 owns_collision = owns_collision .and. neighbor_domain_y%beg <= location(2) .and. location(2) &
1214 & < neighbor_domain_y%end
1215 end if
1216 end if
1217# 430 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1218 if (num_dims >= 3) then
1219 if (ib_bc_z%beg == bc_periodic .and. neighbor_domain_z%beg >= neighbor_domain_z%end) then
1220 ! project right side to the left
1221 temp_neighbor_domain = neighbor_domain_z%end + (glb_bounds(3)%end - glb_bounds(3)%beg)
1222 periodic_owner = neighbor_domain_z%beg <= location(3) .and. location(3) < temp_neighbor_domain
1223 ! project the left side to the right
1224 temp_neighbor_domain = neighbor_domain_z%beg - (glb_bounds(3)%end - glb_bounds(3)%beg)
1225 periodic_owner = periodic_owner .or. (temp_neighbor_domain <= location(3) .and. location(3) &
1226 & < neighbor_domain_z%end)
1227
1228 owns_collision = owns_collision .and. periodic_owner
1229 else
1230 owns_collision = owns_collision .and. neighbor_domain_z%beg <= location(3) .and. location(3) &
1231 & < neighbor_domain_z%end
1232 end if
1233 end if
1234# 447 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1235 end if
1236#endif
1237
1239
1241
1242#ifdef MFC_DEBUG
1243# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1244 block
1245# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1246 use iso_fortran_env, only: output_unit
1247# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1248
1249# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1250 print *, 'm_collisions.fpp:454: ', '@:DEALLOCATE(collision_lookup)'
1251# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1252
1253# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1254 call flush (output_unit)
1255# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1256 end block
1257# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1258#endif
1259# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1260
1261# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1262#if defined(MFC_OpenACC)
1263# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1264!$acc exit data delete(collision_lookup)
1265# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1266#elif defined(MFC_OpenMP)
1267# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1268!$omp target exit data map(release:collision_lookup)
1269# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1270#endif
1271# 454 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1272 deallocate (collision_lookup)
1273#ifdef MFC_DEBUG
1274# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1275 block
1276# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1277 use iso_fortran_env, only: output_unit
1278# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1279
1280# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1281 print *, 'm_collisions.fpp:455: ', '@:DEALLOCATE(wall_overlap_distances)'
1282# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1283
1284# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1285 call flush (output_unit)
1286# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1287 end block
1288# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1289#endif
1290# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1291
1292# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1293#if defined(MFC_OpenACC)
1294# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1295!$acc exit data delete(wall_overlap_distances)
1296# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1297#elif defined(MFC_OpenMP)
1298# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1299!$omp target exit data map(release:wall_overlap_distances)
1300# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1301#endif
1302# 455 "/home/runner/work/MFC/MFC/src/simulation/m_collisions.fpp"
1303 deallocate (wall_overlap_distances)
1304
1305 end subroutine s_finalize_collisions_module
1306
1307end module m_collisions
Ghost-node immersed boundary method: locates ghost/image points, computes interpolation coefficients,...
real(wp) damping_parameter
real(wp), dimension(:,:), allocatable wall_overlap_distances
subroutine s_detect_wall_collisions()
uses boundary conditions and particle locations to check for wall conditions
subroutine, public s_finalize_collisions_module()
logical function, public f_neighborhood_ranks_own_location(location)
function checks if this local MPI processor owns this specific collision
subroutine s_detect_ib_collisions(gps, ib_markers, num_gps, num_considered_collisions)
uses ghost-point/image-point information to determine if it is possible if two IBs are colliding,...
logical function, public f_local_rank_owns_location(location)
function checks if this local MPI processor owns this specific collision
subroutine, public s_initialize_collisions_module()
subroutine s_apply_ib_collision_forces_soft_sphere(num_considered_collisions, forces, torques)
applies collision forces to IBs assuming a soft-sphere collision model (all IBs are circles or sphere...
real(wp) spring_stiffness
subroutine, public s_apply_collision_forces(ghost_points, num_gps, ib_markers, forces, torques)
integer, dimension(:), allocatable, public ib_gbl_idx_lookup
integer, dimension(:,:), allocatable collision_lookup
subroutine s_apply_wall_collision_forces_soft_sphere(forces, torques)
applies collision forces to IBs assuming a soft-sphere collision model (all IBs are circles or sphere...
Computes signed-distance level-set fields and surface normals for immersed-boundary patch geometries.
Compile-time constant parameters: default values, tolerances, and physical constants.
integer, parameter num_local_ibs_max
Maximum number of immersed boundary patches (legacy, not used for patch_ib sizing) Fixed capacity of ...
real(wp), parameter pi
Pi.
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Global parameters for the computational domain, fluid properties, and simulation algorithm configurat...
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
Allocate memory and read initial condition data for IC extrusion.
Binary STL file reader and processor for immersed boundary geometry.
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.