MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_boundary_common.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
2!>
3!! @file
4!! @brief Contains module m_boundary_common
5
6!> @brief Noncharacteristic and processor boundary condition application for ghost cells and buffer regions
7# 1 "/home/runner/work/MFC/MFC/src/common/include/case.fpp" 1
8! This file exists so that Fypp can be run without generating case.fpp files for
9! each target. This is useful when generating documentation, for example. This
10! should also let MFC be built with CMake directly, without invoking mfc.sh.
11
12! For pre-process.
13# 8 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
14
15! For moving immersed boundaries in simulation
16# 12 "/home/runner/work/MFC/MFC/src/common/include/case.fpp"
17# 7 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp" 2
18# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
19# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
20# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
21# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
23# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
25# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32
33# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34
35# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
36
37# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
38
39# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40
41# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
42
43# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
44
45# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46! New line at end of file is required for FYPP
47# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
48# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
49# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
50# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59
60# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61
62# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
63
64# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
65
66# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
67
68# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
69
70# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
71
72# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
73
74# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
75! New line at end of file is required for FYPP
76# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
77
78# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
80# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
82# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117
118# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119
120# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121
122# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123
124# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125
126# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127
128# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142
143# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
144
145# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
146
147# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
148
149# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
150
151# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
152
153# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
154! New line at end of file is required for FYPP
155# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
156# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
157# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
158# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
160# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167
168# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171
172# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173
174# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
175
176# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
177
178# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
179
180# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
181
182# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
183! New line at end of file is required for FYPP
184# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
185
186# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223
224# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225
226# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
227
228# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
229
230# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
231
232# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
233
234# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
235
236# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
237
238# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
239
240# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
241! New line at end of file is required for FYPP
242# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
243
244! GPU parallel region (scalar reductions, maxval/minval)
245# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! GPU parallel loop over threads (most common GPU macro)
248# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Required closing for GPU_PARALLEL_LOOP
251# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Mark routine for device compilation
254# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Declare device-resident data
257# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! Inner loop within a GPU parallel region
260# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Scoped GPU data region
263# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! Host code with device pointers (for MPI with GPU buffers)
266# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Allocate device memory (unscoped)
269# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Free device memory
272# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Atomic operation on device
275# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! End atomic capture block
278# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Copy data between host and device
281# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Synchronization barrier
284# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Import GPU library module (openacc or omp_lib)
287# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289! Emit code only for AMD compiler
290# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291
292! Emit code for non-Cray compilers
293# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
294
295! Emit code only for Cray compiler
296# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
297
298! Emit code for non-NVIDIA compilers
299# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
300
301# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
302# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
303! New line at end of file is required for FYPP
304# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
305
306# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
307
308! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
309! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
310! example see misc/nvidia_uvm/bind.sh.
311# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313! Allocate and create GPU device memory
314# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
315
316! Free GPU device memory and deallocate
317# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
318
319! Cray-specific GPU pointer setup for vector fields
320# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
321
322! Cray-specific GPU pointer setup for scalar fields
323# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
324
325! Cray-specific GPU pointer setup for acoustic source spatials
326# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
327
328# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
329
330# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
331! New line at end of file is required for FYPP
332# 8 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp" 2
333
335
338 use m_mpi_proxy
339 use m_mpi_common
340 use m_constants
342 use m_boundary_io
343
344 implicit none
345
348
349 public :: bc_buffers
350
351#ifdef MFC_MPI
353#endif
354
355 !> Lagrangian-bubble beta (void-fraction) buffer bounds (#1290)
356 type(int_bounds_info), dimension(3) :: beta_bc_bounds
357
358# 32 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
359#if defined(MFC_OpenACC)
360# 32 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
361!$acc declare create(beta_bc_bounds)
362# 32 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
363#elif defined(MFC_OpenMP)
364# 32 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
365!$omp declare target (beta_bc_bounds)
366# 32 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
367#endif
368
369contains
370
371 !> Allocate and set up boundary condition buffer arrays for all coordinate directions.
373
374 integer :: i, j, sys_size_alloc
375
376#ifdef MFC_DEBUG
377# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
378 block
379# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
380 use iso_fortran_env, only: output_unit
381# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
382
383# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
384 print *, 'm_boundary_common.fpp:41: ', '@:ALLOCATE(bc_buffers(1:3, 1:2))'
385# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
386
387# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
388 call flush (output_unit)
389# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
390 end block
391# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
392#endif
393# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
394 allocate (bc_buffers(1:3, 1:2))
395# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
396
397# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
398
399# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
400#if defined(MFC_OpenACC)
401# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
402!$acc enter data create(bc_buffers)
403# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
404#elif defined(MFC_OpenMP)
405# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
406!$omp target enter data map(always,alloc:bc_buffers)
407# 41 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
408#endif
409
410 if (bc_io) then
411 sys_size_alloc = sys_size
412 if (chemistry) sys_size_alloc = sys_size + 1
413
414#ifdef MFC_DEBUG
415# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
416 block
417# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
418 use iso_fortran_env, only: output_unit
419# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
420
421# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
422 print *, 'm_boundary_common.fpp:47: ', '@:ALLOCATE(bc_buffers(1, 1)%sf(1:sys_size_alloc, 0:n, 0:p))'
423# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
424
425# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
426 call flush (output_unit)
427# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
428 end block
429# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
430#endif
431# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
432 allocate (bc_buffers(1, 1)%sf(1:sys_size_alloc, 0:n, 0:p))
433# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
434
435# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
436
437# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
438#if defined(MFC_OpenACC)
439# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
440!$acc enter data create(bc_buffers(1, 1)%sf)
441# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
442#elif defined(MFC_OpenMP)
443# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
444!$omp target enter data map(always,alloc:bc_buffers(1, 1)%sf)
445# 47 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
446#endif
447#ifdef MFC_DEBUG
448# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
449 block
450# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
451 use iso_fortran_env, only: output_unit
452# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
453
454# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
455 print *, 'm_boundary_common.fpp:48: ', '@:ALLOCATE(bc_buffers(1, 2)%sf(1:sys_size_alloc, 0:n, 0:p))'
456# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
457
458# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
459 call flush (output_unit)
460# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
461 end block
462# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
463#endif
464# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
465 allocate (bc_buffers(1, 2)%sf(1:sys_size_alloc, 0:n, 0:p))
466# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
467
468# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
469
470# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
471#if defined(MFC_OpenACC)
472# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
473!$acc enter data create(bc_buffers(1, 2)%sf)
474# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
475#elif defined(MFC_OpenMP)
476# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
477!$omp target enter data map(always,alloc:bc_buffers(1, 2)%sf)
478# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
479#endif
480# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
481 if (n > 0) then
482#ifdef MFC_DEBUG
483# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
484 block
485# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
486 use iso_fortran_env, only: output_unit
487# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
488
489# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
490 print *, 'm_boundary_common.fpp:51: ', '@:ALLOCATE(bc_buffers(2,1)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))'
491# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
492
493# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
494 call flush (output_unit)
495# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
496 end block
497# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
498#endif
499# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
500 allocate (bc_buffers(2,1)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))
501# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
502
503# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
504
505# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
506#if defined(MFC_OpenACC)
507# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
508!$acc enter data create(bc_buffers(2,1)%sf)
509# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
510#elif defined(MFC_OpenMP)
511# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
512!$omp target enter data map(always,alloc:bc_buffers(2,1)%sf)
513# 51 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
514#endif
515#ifdef MFC_DEBUG
516# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
517 block
518# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
519 use iso_fortran_env, only: output_unit
520# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
521
522# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
523 print *, 'm_boundary_common.fpp:52: ', '@:ALLOCATE(bc_buffers(2,2)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))'
524# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
525
526# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
527 call flush (output_unit)
528# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
529 end block
530# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
531#endif
532# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
533 allocate (bc_buffers(2,2)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))
534# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
535
536# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
537
538# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
539#if defined(MFC_OpenACC)
540# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
541!$acc enter data create(bc_buffers(2,2)%sf)
542# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
543#elif defined(MFC_OpenMP)
544# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
545!$omp target enter data map(always,alloc:bc_buffers(2,2)%sf)
546# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
547#endif
548# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
549 if (p > 0) then
550#ifdef MFC_DEBUG
551# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
552 block
553# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
554 use iso_fortran_env, only: output_unit
555# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
556
557# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
558 print *, 'm_boundary_common.fpp:55: ', '@:ALLOCATE(bc_buffers(3,1)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))'
559# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
560
561# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
562 call flush (output_unit)
563# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
564 end block
565# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
566#endif
567# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
568 allocate (bc_buffers(3,1)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))
569# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
570
571# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
572
573# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
574#if defined(MFC_OpenACC)
575# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
576!$acc enter data create(bc_buffers(3,1)%sf)
577# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
578#elif defined(MFC_OpenMP)
579# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
580!$omp target enter data map(always,alloc:bc_buffers(3,1)%sf)
581# 55 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
582#endif
583#ifdef MFC_DEBUG
584# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
585 block
586# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
587 use iso_fortran_env, only: output_unit
588# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
589
590# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
591 print *, 'm_boundary_common.fpp:56: ', '@:ALLOCATE(bc_buffers(3,2)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))'
592# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
593
594# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
595 call flush (output_unit)
596# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
597 end block
598# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
599#endif
600# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
601 allocate (bc_buffers(3,2)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))
602# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
603
604# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
605
606# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
607#if defined(MFC_OpenACC)
608# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
609!$acc enter data create(bc_buffers(3,2)%sf)
610# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
611#elif defined(MFC_OpenMP)
612# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
613!$omp target enter data map(always,alloc:bc_buffers(3,2)%sf)
614# 56 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
615#endif
616 end if
617# 59 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
618 end if
619# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
620 do i = 1, num_dims
621 do j = 1, 2
622#ifdef _CRAYFTN
623# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
624 block
625# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
626#ifdef MFC_DEBUG
627# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
628 block
629# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
630 use iso_fortran_env, only: output_unit
631# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
632
633# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
634 print *, 'm_boundary_common.fpp:63: ', '@:ACC_SETUP_SFs(bc_buffers(i,j))'
635# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
636
637# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
638 call flush (output_unit)
639# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
640 end block
641# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
642#endif
643# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
644
645# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
646
647# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
648#if defined(MFC_OpenACC)
649# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
650!$acc enter data copyin(bc_buffers(i,j))
651# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
652#elif defined(MFC_OpenMP)
653# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
654!$omp target enter data map(to:bc_buffers(i,j))
655# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
656#endif
657# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
658 if (associated(bc_buffers(i,j)%sf)) then
659# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
660
661# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
662#if defined(MFC_OpenACC)
663# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
664!$acc enter data copyin(bc_buffers(i,j)%sf)
665# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
666#elif defined(MFC_OpenMP)
667# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
668!$omp target enter data map(to:bc_buffers(i,j)%sf)
669# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
670#endif
671# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
672 end if
673# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
674 end block
675# 63 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
676#endif
677 end do
678 end do
679 end if
680
681 if (bubbles_lagrange) then
682 beta_bc_bounds(1)%beg = -mapcells - 1
683 beta_bc_bounds(1)%end = m + mapcells + 1
684 ! n > 0 always for bubbles_lagrange
685 beta_bc_bounds(2)%beg = -mapcells - 1
686 beta_bc_bounds(2)%end = n + mapcells + 1
687 if (p == 0) then
688 beta_bc_bounds(3)%beg = 0
689 beta_bc_bounds(3)%end = 0
690 else
691 beta_bc_bounds(3)%beg = -mapcells - 1
692 beta_bc_bounds(3)%end = p + mapcells + 1
693 end if
694 end if
695
696# 82 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
697#if defined(MFC_OpenACC)
698# 82 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
699!$acc update device(beta_bc_bounds)
700# 82 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
701#elif defined(MFC_OpenMP)
702# 82 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
703!$omp target update to(beta_bc_bounds)
704# 82 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
705#endif
706
708
709 !> Populate the buffers of the primitive variables based on the selected boundary conditions.
710 impure subroutine s_populate_variables_buffers(bc_type, q_prim_vf, pb_in, mv_in, q_T_sf)
711
712 type(scalar_field), dimension(sys_size), intent(inout) :: q_prim_vf
713 real(stp), optional, dimension(idwbuff(1)%beg:,idwbuff(2)%beg:,idwbuff(3)%beg:,1:,1:), intent(inout) :: pb_in, mv_in
714 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
715 type(scalar_field), optional, intent(inout) :: q_t_sf
716
717 call s_populate_bc_direction(1, -1, bc_x, bc_type(1, 1), q_prim_vf, pb_in, mv_in, q_t_sf)
718 call s_populate_bc_direction(1, 1, bc_x, bc_type(1, 2), q_prim_vf, pb_in, mv_in, q_t_sf)
719
720 if (n == 0) return
721
722# 100 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
723 call s_populate_bc_direction(2, -1, bc_y, bc_type(2, 1), q_prim_vf, pb_in, mv_in, q_t_sf)
724 call s_populate_bc_direction(2, 1, bc_y, bc_type(2, 2), q_prim_vf, pb_in, mv_in, q_t_sf)
725# 103 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
726
727 if (p == 0) return
728
729# 107 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
730 call s_populate_bc_direction(3, -1, bc_z, bc_type(3, 1), q_prim_vf, pb_in, mv_in, q_t_sf)
731 call s_populate_bc_direction(3, 1, bc_z, bc_type(3, 2), q_prim_vf, pb_in, mv_in, q_t_sf)
732# 110 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
733
734 end subroutine s_populate_variables_buffers
735
736 !> Populate the variable buffers along one direction and location, via MPI exchange for processor boundaries or by dispatching
737 !! the per-cell BC routines over the boundary face.
738 impure subroutine s_populate_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, q_prim_vf, pb_in, mv_in, q_T_sf)
739
740 integer, intent(in) :: bc_dir, bc_loc
741 type(int_bounds_info), intent(in) :: bc_bounds
742 type(integer_field), intent(in) :: bc_type_edge
743 type(scalar_field), dimension(sys_size), intent(inout) :: q_prim_vf
744 real(stp), optional, dimension(idwbuff(1)%beg:,idwbuff(2)%beg:,idwbuff(3)%beg:,1:,1:), intent(inout) :: pb_in, mv_in
745 type(scalar_field), optional, intent(inout) :: q_t_sf
746 integer :: bc_edge, k_beg, k_end, l_beg, l_end
747 integer :: bc_code, k, l
748
749 if (bc_loc == -1) then
750 bc_edge = bc_bounds%beg
751 else
752 bc_edge = bc_bounds%end
753 end if
754
755 ! BC type codes defined in m_constants.fpp; non-negative values are MPI boundaries
756 if (bc_edge >= 0) then
757 call s_mpi_sendrecv_variables_buffers(q_prim_vf, bc_dir, bc_loc, sys_size, pb_in, mv_in, q_t_sf)
758 return
759 end if
760
761 if (bc_dir == 1) then
762 k_beg = 0; k_end = n; l_beg = 0; l_end = p
763 else if (bc_dir == 2) then
764 k_beg = -buff_size; k_end = m + buff_size; l_beg = 0; l_end = p
765 else
766 k_beg = -buff_size; k_end = m + buff_size; l_beg = -buff_size; l_end = n + buff_size
767 end if
768
769
770# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
771
772# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
773#if defined(MFC_OpenACC)
774# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
775!$acc parallel loop collapse(2) gang vector default(present) private(l, k, bc_code)
776# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
777#elif defined(MFC_OpenMP)
778# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
779
780# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
781
782# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
783
784# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
785!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(2) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(l, k, bc_code)
786# 146 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
787#endif
788 do l = l_beg, l_end
789 do k = k_beg, k_end
790 if (bc_dir == 1) then
791 bc_code = int(bc_type_edge%sf(0, k, l))
792 else if (bc_dir == 2) then
793 bc_code = int(bc_type_edge%sf(k, 0, l))
794 else
795 bc_code = int(bc_type_edge%sf(k, l, 0))
796 end if
797
798 select case (bc_code)
799 case (bc_char_sup_outflow:bc_ghost_extrap)
800 call s_ghost_cell_extrapolation(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
801 case (bc_axis)
802 if (bc_dir == 2 .and. bc_loc == -1) call s_axis(q_prim_vf, pb_in, mv_in, k, l)
803 case (bc_reflective)
804 call s_symmetry(q_prim_vf, bc_dir, bc_loc, k, l, pb_in, mv_in, q_t_sf)
805 case (bc_periodic)
806 call s_periodic(q_prim_vf, bc_dir, bc_loc, k, l, pb_in, mv_in, q_t_sf)
807 case (bc_slip_wall)
808 call s_slip_wall(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
809 case (bc_no_slip_wall)
810 call s_no_slip_wall(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
811 case (bc_dirichlet)
812 call s_dirichlet(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
813 end select
814
815 if (qbmm .and. (.not. polytropic) .and. present(pb_in) .and. present(mv_in) .and. (bc_code <= bc_ghost_extrap) &
816 & .and. .not. (bc_dir == 2 .and. bc_loc == -1 .and. bc_code == bc_axis)) then
817 call s_qbmm_extrapolation(bc_dir, bc_loc, k, l, pb_in, mv_in)
818 end if
819 end do
820 end do
821
822# 180 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
823#if defined(MFC_OpenACC)
824# 180 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
825!$acc end parallel loop
826# 180 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
827#elif defined(MFC_OpenMP)
828# 180 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
829
830# 180 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
831!$omp end target teams loop
832# 180 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
833#endif
834
835 end subroutine s_populate_bc_direction
836
837 !> Populate ghost cell buffers for the color function and its divergence used in capillary surface tension.
838 impure subroutine s_populate_capillary_buffers(c_divs, bc_type, bc)
839
840 type(scalar_field), dimension(num_dims + 1), intent(inout) :: c_divs
841 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
842 type(bc_xyz_info), intent(in) :: bc
843
844 call s_populate_capillary_bc_direction(1, -1, bc%x, bc_type(1, 1), c_divs)
845 call s_populate_capillary_bc_direction(1, 1, bc%x, bc_type(1, 2), c_divs)
846
847 if (n == 0) return
848
849# 197 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
850 call s_populate_capillary_bc_direction(2, -1, bc%y, bc_type(2, 1), c_divs)
851 call s_populate_capillary_bc_direction(2, 1, bc%y, bc_type(2, 2), c_divs)
852# 200 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
853
854 if (p == 0) return
855
856# 204 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
857 call s_populate_capillary_bc_direction(3, -1, bc%z, bc_type(3, 1), c_divs)
858 call s_populate_capillary_bc_direction(3, 1, bc%z, bc_type(3, 2), c_divs)
859# 207 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
860
861 end subroutine s_populate_capillary_buffers
862
863 !> Populate ghost cell buffers for one capillary BC direction and location, via MPI exchange for processor boundaries or by
864 !! dispatching the per-cell capillary BC routines over the boundary face.
865 impure subroutine s_populate_capillary_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, c_divs)
866
867 integer, intent(in) :: bc_dir, bc_loc
868 type(int_bounds_info), intent(in) :: bc_bounds
869 type(scalar_field), dimension(num_dims + 1), intent(inout) :: c_divs
870 type(integer_field), intent(in) :: bc_type_edge
871 integer :: bc_edge, k_beg, k_end, l_beg, l_end, k, l, bc_code
872
873 if (bc_loc == -1) then
874 bc_edge = bc_bounds%beg
875 else
876 bc_edge = bc_bounds%end
877 end if
878
879 if (bc_edge >= 0) then
880 call s_mpi_sendrecv_variables_buffers(c_divs, bc_dir, bc_loc, num_dims + 1)
881 return
882 end if
883
884 if (bc_dir == 1) then
885 k_beg = 0; k_end = n; l_beg = 0; l_end = p
886 else if (bc_dir == 2) then
887 k_beg = -buff_size; k_end = m + buff_size; l_beg = 0; l_end = p
888 else
889 k_beg = -buff_size; k_end = m + buff_size; l_beg = -buff_size; l_end = n + buff_size
890 end if
891
892
893# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
894
895# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
896#if defined(MFC_OpenACC)
897# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
898!$acc parallel loop collapse(2) gang vector default(present) private(l, k, bc_code)
899# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
900#elif defined(MFC_OpenMP)
901# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
902
903# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
904
905# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
906
907# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
908!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(2) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(l, k, bc_code)
909# 239 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
910#endif
911 do l = l_beg, l_end
912 do k = k_beg, k_end
913 if (bc_dir == 1) then
914 bc_code = int(bc_type_edge%sf(0, k, l))
915 else if (bc_dir == 2) then
916 bc_code = int(bc_type_edge%sf(k, 0, l))
917 else
918 bc_code = int(bc_type_edge%sf(k, l, 0))
919 end if
920
921 select case (bc_code)
922 case (bc_periodic)
923 call s_color_function_periodic(c_divs, bc_dir, bc_loc, k, l)
924 case (bc_reflective)
925 call s_color_function_reflective(c_divs, bc_dir, bc_loc, k, l)
926 case default
927 call s_color_function_ghost_cell_extrapolation(c_divs, bc_dir, bc_loc, k, l)
928 end select
929 end do
930 end do
931
932# 260 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
933#if defined(MFC_OpenACC)
934# 260 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
935!$acc end parallel loop
936# 260 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
937#elif defined(MFC_OpenMP)
938# 260 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
939
940# 260 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
941!$omp end target teams loop
942# 260 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
943#endif
944
946
947 !> Populate ghost cell buffers for the Jacobian scalar field used in the IGR elliptic solver.
948 impure subroutine s_populate_f_igr_buffers(bc_type, jac_sf)
949
950 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
951 type(scalar_field), dimension(1:), intent(inout) :: jac_sf
952
953 call s_populate_f_igr_bc_direction(1, -1, bc_x, bc_type(1, 1), jac_sf)
954 call s_populate_f_igr_bc_direction(1, 1, bc_x, bc_type(1, 2), jac_sf)
955
956 if (n == 0) return
957
958# 276 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
959 call s_populate_f_igr_bc_direction(2, -1, bc_y, bc_type(2, 1), jac_sf)
960 call s_populate_f_igr_bc_direction(2, 1, bc_y, bc_type(2, 2), jac_sf)
961# 279 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
962
963 if (p == 0) return
964
965# 283 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
966 call s_populate_f_igr_bc_direction(3, -1, bc_z, bc_type(3, 1), jac_sf)
967 call s_populate_f_igr_bc_direction(3, 1, bc_z, bc_type(3, 2), jac_sf)
968# 286 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
969
970 end subroutine s_populate_f_igr_buffers
971
972 !> Populate ghost cell buffers for one IGR Jacobian BC direction and location, via MPI exchange for processor boundaries or by
973 !! dispatching the per-cell IGR Jacobian BC routines over the boundary face.
974 impure subroutine s_populate_f_igr_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, jac_sf)
975
976 integer, intent(in) :: bc_dir, bc_loc
977 type(int_bounds_info), intent(in) :: bc_bounds
978 type(integer_field), intent(in) :: bc_type_edge
979 type(scalar_field), dimension(1:), intent(inout) :: jac_sf
980 integer :: bc_edge, k_beg, k_end, l_beg, l_end, k, l, j, bc_code
981
982 if (bc_loc == -1) then
983 bc_edge = bc_bounds%beg
984 else
985 bc_edge = bc_bounds%end
986 end if
987
988 if (bc_edge >= 0) then
989 call s_mpi_sendrecv_variables_buffers(jac_sf, bc_dir, bc_loc, 1)
990 return
991 end if
992
993 if (bc_dir == 1) then
994 k_beg = 0; k_end = n; l_beg = 0; l_end = p
995 else if (bc_dir == 2) then
996 k_beg = idwbuff(1)%beg; k_end = idwbuff(1)%end; l_beg = 0; l_end = p
997 else
998 k_beg = idwbuff(1)%beg; k_end = idwbuff(1)%end; l_beg = idwbuff(2)%beg; l_end = idwbuff(2)%end
999 end if
1000
1001
1002# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1003
1004# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1005#if defined(MFC_OpenACC)
1006# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1007!$acc parallel loop collapse(2) gang vector default(present) private(l, k, bc_code)
1008# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1009#elif defined(MFC_OpenMP)
1010# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1011
1012# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1013
1014# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1015
1016# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1017!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(2) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(l, k, bc_code)
1018# 318 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1019#endif
1020 do l = l_beg, l_end
1021 do k = k_beg, k_end
1022 if (bc_dir == 1) then
1023 bc_code = int(bc_type_edge%sf(0, k, l))
1024 else if (bc_dir == 2) then
1025 bc_code = int(bc_type_edge%sf(k, 0, l))
1026 else
1027 bc_code = int(bc_type_edge%sf(k, l, 0))
1028 end if
1029
1030 select case (bc_code)
1031 case (bc_periodic)
1032 call s_f_igr_periodic(jac_sf, bc_dir, bc_loc, k, l)
1033 case (bc_reflective)
1034 call s_f_igr_reflective(jac_sf, bc_dir, bc_loc, k, l)
1035 case default
1036 call s_f_igr_ghost_cell_extrapolation(jac_sf, bc_dir, bc_loc, k, l)
1037 end select
1038 end do
1039 end do
1040
1041# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1042#if defined(MFC_OpenACC)
1043# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1044!$acc end parallel loop
1045# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1046#elif defined(MFC_OpenMP)
1047# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1048
1049# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1050!$omp end target teams loop
1051# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1052#endif
1053
1054 end subroutine s_populate_f_igr_bc_direction
1055
1056 !> Populate the buffers of the grid variables, which are constituted of the cell-boundary locations and cell-width
1057 !! distributions, based on the boundary conditions.
1059
1060#ifdef MFC_SIMULATION
1061 ! Simulation allocates the cell-boundary arrays with buff_size ghost layers, so the
1062 ! ghost extrapolation extends over the full buffer. In post-process the module-level
1063 ! offset_x/y/z (which the x_cb/y_cb/z_cb allocations are sized to) are used instead.
1064 type(int_bounds_info) :: offset_x, offset_y, offset_z
1065
1066 offset_x%beg = buff_size; offset_x%end = buff_size
1067 offset_y%beg = buff_size; offset_y%end = buff_size
1068 offset_z%beg = buff_size; offset_z%end = buff_size
1069
1070 ! Global domain bounds
1071#ifdef MFC_MPI
1072 call s_mpi_allreduce_min(x_cb(-1), glb_bounds(1)%beg)
1073 call s_mpi_allreduce_max(x_cb(m), glb_bounds(1)%end)
1074 if (n > 0) then
1075 call s_mpi_allreduce_min(y_cb(-1), glb_bounds(2)%beg)
1076 call s_mpi_allreduce_max(y_cb(n), glb_bounds(2)%end)
1077 if (p > 0) then
1078 call s_mpi_allreduce_min(z_cb(-1), glb_bounds(3)%beg)
1079 call s_mpi_allreduce_max(z_cb(p), glb_bounds(3)%end)
1080 end if
1081 end if
1082#else
1083 glb_bounds(1)%beg = x_cb(-1); glb_bounds(1)%end = x_cb(m)
1084 if (n > 0) then
1085 glb_bounds(2)%beg = y_cb(-1); glb_bounds(2)%end = y_cb(n)
1086 if (p > 0) then
1087 glb_bounds(3)%beg = z_cb(-1); glb_bounds(3)%end = z_cb(p)
1088 end if
1089 end if
1090#endif
1091
1092# 378 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1093#if defined(MFC_OpenACC)
1094# 378 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1095!$acc update device(glb_bounds)
1096# 378 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1097#elif defined(MFC_OpenMP)
1098# 378 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1099!$omp target update to(glb_bounds)
1100# 378 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1101#endif
1102#endif
1103
1104#ifndef MFC_PRE_PROCESS
1105 call s_populate_grid_bc_direction(1, -1, bc_x, offset_x)
1106 call s_populate_grid_bc_direction(1, 1, bc_x, offset_x)
1107
1108 if (n == 0) return
1109
1110# 388 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1111 call s_populate_grid_bc_direction(2, -1, bc_y, offset_y)
1112 call s_populate_grid_bc_direction(2, 1, bc_y, offset_y)
1113# 391 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1114
1115 if (p == 0) return
1116
1117# 395 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1118 call s_populate_grid_bc_direction(3, -1, bc_z, offset_z)
1119 call s_populate_grid_bc_direction(3, 1, bc_z, offset_z)
1120# 398 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1121#endif
1122
1124
1125#ifndef MFC_PRE_PROCESS
1126 !> Populate grid variable buffers (cell widths and centers) for one direction and location.
1127 subroutine s_populate_grid_bc_direction(bc_dir, bc_loc, bc_bounds, offset_dir)
1128
1129 integer, intent(in) :: bc_dir, bc_loc
1130 type(int_bounds_info), intent(in) :: bc_bounds, offset_dir
1131 integer :: bc_edge
1132
1133 if (bc_loc == -1) then
1134 bc_edge = bc_bounds%beg
1135 else
1136 bc_edge = bc_bounds%end
1137 end if
1138
1139 if (bc_edge >= 0) then
1140 call s_mpi_sendrecv_grid_variables_buffers(bc_dir, bc_loc, offset_dir)
1141 return
1142 end if
1143
1144 select case (bc_edge)
1145 case (bc_periodic)
1146 call s_grid_periodic_bc(bc_dir, bc_loc, offset_dir)
1147 case (bc_reflective)
1148 call s_grid_reflective_bc(bc_dir, bc_loc, offset_dir)
1149 case (bc_axis)
1150 if (bc_dir == 2) call s_grid_axis_bc(bc_loc, offset_dir)
1151 case default
1152 call s_grid_ghost_cell_extrapolation_bc(bc_dir, bc_loc, offset_dir)
1153 end select
1154
1155 end subroutine s_populate_grid_bc_direction
1156#endif
1157
1158 !> Deallocate boundary condition buffer arrays allocated during module initialization.
1160
1161 if (bc_io) then
1162#ifdef MFC_DEBUG
1163# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1164 block
1165# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1166 use iso_fortran_env, only: output_unit
1167# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1168
1169# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1170 print *, 'm_boundary_common.fpp:439: ', '@:DEALLOCATE(bc_buffers(1, 1)%sf)'
1171# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1172
1173# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1174 call flush (output_unit)
1175# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1176 end block
1177# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1178#endif
1179# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1180
1181# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1182#if defined(MFC_OpenACC)
1183# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1184!$acc exit data delete(bc_buffers(1, 1)%sf)
1185# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1186#elif defined(MFC_OpenMP)
1187# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1188!$omp target exit data map(release:bc_buffers(1, 1)%sf)
1189# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1190#endif
1191# 439 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1192 deallocate (bc_buffers(1, 1)%sf)
1193#ifdef MFC_DEBUG
1194# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1195 block
1196# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1197 use iso_fortran_env, only: output_unit
1198# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1199
1200# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1201 print *, 'm_boundary_common.fpp:440: ', '@:DEALLOCATE(bc_buffers(1, 2)%sf)'
1202# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1203
1204# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1205 call flush (output_unit)
1206# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1207 end block
1208# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1209#endif
1210# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1211
1212# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1213#if defined(MFC_OpenACC)
1214# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1215!$acc exit data delete(bc_buffers(1, 2)%sf)
1216# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1217#elif defined(MFC_OpenMP)
1218# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1219!$omp target exit data map(release:bc_buffers(1, 2)%sf)
1220# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1221#endif
1222# 440 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1223 deallocate (bc_buffers(1, 2)%sf)
1224# 442 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1225 if (n > 0) then
1226#ifdef MFC_DEBUG
1227# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1228 block
1229# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1230 use iso_fortran_env, only: output_unit
1231# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1232
1233# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1234 print *, 'm_boundary_common.fpp:443: ', '@:DEALLOCATE(bc_buffers(2, 1)%sf)'
1235# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1236
1237# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1238 call flush (output_unit)
1239# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1240 end block
1241# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1242#endif
1243# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1244
1245# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1246#if defined(MFC_OpenACC)
1247# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1248!$acc exit data delete(bc_buffers(2, 1)%sf)
1249# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1250#elif defined(MFC_OpenMP)
1251# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1252!$omp target exit data map(release:bc_buffers(2, 1)%sf)
1253# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1254#endif
1255# 443 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1256 deallocate (bc_buffers(2, 1)%sf)
1257#ifdef MFC_DEBUG
1258# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1259 block
1260# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1261 use iso_fortran_env, only: output_unit
1262# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1263
1264# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1265 print *, 'm_boundary_common.fpp:444: ', '@:DEALLOCATE(bc_buffers(2, 2)%sf)'
1266# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1267
1268# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1269 call flush (output_unit)
1270# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1271 end block
1272# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1273#endif
1274# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1275
1276# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1277#if defined(MFC_OpenACC)
1278# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1279!$acc exit data delete(bc_buffers(2, 2)%sf)
1280# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1281#elif defined(MFC_OpenMP)
1282# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1283!$omp target exit data map(release:bc_buffers(2, 2)%sf)
1284# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1285#endif
1286# 444 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1287 deallocate (bc_buffers(2, 2)%sf)
1288# 446 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1289 if (p > 0) then
1290#ifdef MFC_DEBUG
1291# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1292 block
1293# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1294 use iso_fortran_env, only: output_unit
1295# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1296
1297# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1298 print *, 'm_boundary_common.fpp:447: ', '@:DEALLOCATE(bc_buffers(3, 1)%sf)'
1299# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1300
1301# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1302 call flush (output_unit)
1303# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1304 end block
1305# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1306#endif
1307# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1308
1309# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1310#if defined(MFC_OpenACC)
1311# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1312!$acc exit data delete(bc_buffers(3, 1)%sf)
1313# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1314#elif defined(MFC_OpenMP)
1315# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1316!$omp target exit data map(release:bc_buffers(3, 1)%sf)
1317# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1318#endif
1319# 447 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1320 deallocate (bc_buffers(3, 1)%sf)
1321#ifdef MFC_DEBUG
1322# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1323 block
1324# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1325 use iso_fortran_env, only: output_unit
1326# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1327
1328# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1329 print *, 'm_boundary_common.fpp:448: ', '@:DEALLOCATE(bc_buffers(3, 2)%sf)'
1330# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1331
1332# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1333 call flush (output_unit)
1334# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1335 end block
1336# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1337#endif
1338# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1339
1340# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1341#if defined(MFC_OpenACC)
1342# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1343!$acc exit data delete(bc_buffers(3, 2)%sf)
1344# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1345#elif defined(MFC_OpenMP)
1346# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1347!$omp target exit data map(release:bc_buffers(3, 2)%sf)
1348# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1349#endif
1350# 448 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1351 deallocate (bc_buffers(3, 2)%sf)
1352 end if
1353# 451 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1354 end if
1355# 453 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1356 end if
1357#ifdef MFC_DEBUG
1358# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1359 block
1360# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1361 use iso_fortran_env, only: output_unit
1362# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1363
1364# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1365 print *, 'm_boundary_common.fpp:454: ', '@:DEALLOCATE(bc_buffers)'
1366# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1367
1368# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1369 call flush (output_unit)
1370# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1371 end block
1372# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1373#endif
1374# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1375
1376# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1377#if defined(MFC_OpenACC)
1378# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1379!$acc exit data delete(bc_buffers)
1380# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1381#elif defined(MFC_OpenMP)
1382# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1383!$omp target exit data map(release:bc_buffers)
1384# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1385#endif
1386# 454 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1387 deallocate (bc_buffers)
1388
1390
1391 !> Populate ghost cell buffers of the Lagrangian-bubble beta (void fraction) variables based on the boundary conditions.
1392 impure subroutine s_populate_beta_buffers(q_beta, kahan_comp, bc_type, nvar)
1393
1394 type(scalar_field), dimension(:), intent(inout) :: q_beta
1395 type(scalar_field), dimension(:), intent(inout) :: kahan_comp
1396 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
1397 integer, intent(in) :: nvar
1398
1399 call s_populate_beta_bc_direction(1, -1, bc%x, bc_type(1, 1), q_beta, kahan_comp, nvar)
1400 call s_populate_beta_bc_direction(1, 1, bc%x, bc_type(1, 2), q_beta, kahan_comp, nvar)
1401
1402 ! n > 0 always for bubbles_lagrange
1403# 471 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1404 call s_populate_beta_bc_direction(2, -1, bc%y, bc_type(2, 1), q_beta, kahan_comp, nvar)
1405 call s_populate_beta_bc_direction(2, 1, bc%y, bc_type(2, 2), q_beta, kahan_comp, nvar)
1406# 474 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1407
1408 if (p == 0) return
1409
1410# 478 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1411 call s_populate_beta_bc_direction(3, -1, bc%z, bc_type(3, 1), q_beta, kahan_comp, nvar)
1412 call s_populate_beta_bc_direction(3, 1, bc%z, bc_type(3, 2), q_beta, kahan_comp, nvar)
1413# 481 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1414
1415 end subroutine s_populate_beta_buffers
1416
1417 !> Populate beta variable buffers for one direction and location, by dispatching the per-cell beta BC routines over the boundary
1418 !! face and performing the paired MPI reduction for processor boundaries.
1419 impure subroutine s_populate_beta_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, q_beta, kahan_comp, nvar)
1420
1421 integer, intent(in) :: bc_dir, bc_loc
1422 type(int_bounds_info), intent(in) :: bc_bounds
1423 type(integer_field), intent(in) :: bc_type_edge
1424 type(scalar_field), dimension(:), intent(inout) :: q_beta
1425 type(scalar_field), dimension(:), intent(inout) :: kahan_comp
1426 integer, intent(in) :: nvar
1427 integer :: bc_edge, k_beg, k_end, l_beg, l_end, k, l, bc_code
1428
1429 if (bc_loc == -1) then
1430 bc_edge = bc_bounds%beg
1431 else
1432 bc_edge = bc_bounds%end
1433 end if
1434
1435 if (bc_edge < 0) then
1436 if (bc_dir == 1) then
1437 k_beg = beta_bc_bounds(2)%beg; k_end = beta_bc_bounds(2)%end
1438 l_beg = beta_bc_bounds(3)%beg; l_end = beta_bc_bounds(3)%end
1439 else if (bc_dir == 2) then
1440 k_beg = beta_bc_bounds(1)%beg; k_end = beta_bc_bounds(1)%end
1441 l_beg = beta_bc_bounds(3)%beg; l_end = beta_bc_bounds(3)%end
1442 else
1443 k_beg = beta_bc_bounds(1)%beg; k_end = beta_bc_bounds(1)%end
1444 l_beg = beta_bc_bounds(2)%beg; l_end = beta_bc_bounds(2)%end
1445 end if
1446
1447
1448# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1449
1450# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1451#if defined(MFC_OpenACC)
1452# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1453!$acc parallel loop collapse(2) gang vector default(present) private(l, k, bc_code)
1454# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1455#elif defined(MFC_OpenMP)
1456# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1457
1458# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1459
1460# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1461
1462# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1463!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(2) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(l, k, bc_code)
1464# 514 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1465#endif
1466 do l = l_beg, l_end
1467 do k = k_beg, k_end
1468 ! bc_type is not allocated over the beta ghost extents in x and y, so those directions dispatch on the
1469 ! domain-edge BC; in z it is allocated with buff_size (>= mapcells + 1) ghost layers and dispatches per cell.
1470 if (bc_dir == 3) then
1471 bc_code = int(bc_type_edge%sf(k, l, 0))
1472 else
1473 bc_code = bc_edge
1474 end if
1475
1476 select case (bc_code)
1477 case (bc_periodic)
1478 call s_beta_periodic(q_beta, kahan_comp, bc_dir, bc_loc, k, l, nvar)
1479 case (bc_reflective)
1480 call s_beta_reflective(q_beta, kahan_comp, bc_dir, bc_loc, k, l, nvar)
1481 end select
1482 end do
1483 end do
1484
1485# 533 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1486#if defined(MFC_OpenACC)
1487# 533 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1488!$acc end parallel loop
1489# 533 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1490#elif defined(MFC_OpenMP)
1491# 533 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1492
1493# 533 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1494!$omp end target teams loop
1495# 533 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1496#endif
1497 end if
1498
1499 ! The beta reduction is a paired exchange (rightward accumulate at bc_loc = -1, leftward distribute at bc_loc = 1), so it
1500 ! must run at both locations whenever either edge of the direction is a processor boundary.
1501 if (bc_bounds%beg >= 0 .or. bc_bounds%end >= 0) then
1502 call s_mpi_reduce_beta_variables_buffers(q_beta, kahan_comp, bc_dir, bc_loc, nvar)
1503 end if
1504
1505 end subroutine s_populate_beta_bc_direction
1506
1507end module m_boundary_common
integer, intent(in) k
integer, intent(in) j
integer, intent(in) l
Noncharacteristic and processor boundary condition application for ghost cells and buffer regions.
impure subroutine s_populate_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, q_prim_vf, pb_in, mv_in, q_t_sf)
Populate the variable buffers along one direction and location, via MPI exchange for processor bounda...
impure subroutine s_populate_capillary_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, c_divs)
Populate ghost cell buffers for one capillary BC direction and location, via MPI exchange for process...
impure subroutine s_populate_beta_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, q_beta, kahan_comp, nvar)
Populate beta variable buffers for one direction and location, by dispatching the per-cell beta BC ro...
impure subroutine s_populate_f_igr_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, jac_sf)
Populate ghost cell buffers for one IGR Jacobian BC direction and location, via MPI exchange for proc...
impure subroutine, public s_initialize_boundary_common_module()
Allocate and set up boundary condition buffer arrays for all coordinate directions.
impure subroutine, public s_populate_f_igr_buffers(bc_type, jac_sf)
Populate ghost cell buffers for the Jacobian scalar field used in the IGR elliptic solver.
subroutine, public s_finalize_boundary_common_module()
Deallocate boundary condition buffer arrays allocated during module initialization.
subroutine, public s_populate_grid_variables_buffers
Populate the buffers of the grid variables, which are constituted of the cell-boundary locations and ...
impure subroutine, public s_populate_variables_buffers(bc_type, q_prim_vf, pb_in, mv_in, q_t_sf)
Populate the buffers of the primitive variables based on the selected boundary conditions.
type(int_bounds_info), dimension(3) beta_bc_bounds
Lagrangian-bubble beta (void-fraction) buffer bounds (#1290).
subroutine s_populate_grid_bc_direction(bc_dir, bc_loc, bc_bounds, offset_dir)
Populate grid variable buffers (cell widths and centers) for one direction and location.
impure subroutine, public s_populate_capillary_buffers(c_divs, bc_type, bc)
Populate ghost cell buffers for the color function and its divergence used in capillary surface tensi...
impure subroutine, public s_populate_beta_buffers(q_beta, kahan_comp, bc_type, nvar)
Populate ghost cell buffers of the Lagrangian-bubble beta (void fraction) variables based on the boun...
Boundary condition restart I/O, capillary/IGR buffer population, and grid-variable buffers.
integer, dimension(1:3, 1:2) mpi_bc_type_type
integer, dimension(1:3, 1:2) mpi_bc_buffer_type
Per-cell noncharacteristic boundary condition primitives applied in the ghost cells.
type(scalar_field), dimension(:,:), allocatable bc_buffers
Compile-time constant parameters: default values, tolerances, and physical constants.
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...
MPI communication layer: domain decomposition, halo exchange, reductions, and parallel I/O setup.
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.
Integer bounds for variables.