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