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