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. NVIDIA unified memory page placement hint
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_constants
341 use m_boundary_io
342#ifndef MFC_PRE_PROCESS
344#endif
345
346 implicit none
347
350
351 public :: bc_buffers
352
353#ifdef MFC_MPI
355#endif
356
357contains
358
359 !> Allocate and set up boundary condition buffer arrays for all coordinate directions.
361
362 integer :: i, j, sys_size_alloc
363
364#ifdef MFC_DEBUG
365# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
366 block
367# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
368 use iso_fortran_env, only: output_unit
369# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
370
371# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
372 print *, 'm_boundary_common.fpp:39: ', '@:ALLOCATE(bc_buffers(1:3, 1:2))'
373# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
374
375# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
376 call flush (output_unit)
377# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
378 end block
379# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
380#endif
381# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
382 allocate (bc_buffers(1:3, 1:2))
383# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
384
385# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
386
387# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
388#if defined(MFC_OpenACC)
389# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
390!$acc enter data create(bc_buffers)
391# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
392#elif defined(MFC_OpenMP)
393# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
394!$omp target enter data map(always,alloc:bc_buffers)
395# 39 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
396#endif
397
398 if (bc_io) then
399 sys_size_alloc = sys_size
400 if (chemistry) sys_size_alloc = sys_size + 1
401
402#ifdef MFC_DEBUG
403# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
404 block
405# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
406 use iso_fortran_env, only: output_unit
407# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
408
409# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
410 print *, 'm_boundary_common.fpp:45: ', '@:ALLOCATE(bc_buffers(1, 1)%sf(1:sys_size_alloc, 0:n, 0:p))'
411# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
412
413# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
414 call flush (output_unit)
415# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
416 end block
417# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
418#endif
419# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
420 allocate (bc_buffers(1, 1)%sf(1:sys_size_alloc, 0:n, 0:p))
421# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
422
423# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
424
425# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
426#if defined(MFC_OpenACC)
427# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
428!$acc enter data create(bc_buffers(1, 1)%sf)
429# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
430#elif defined(MFC_OpenMP)
431# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
432!$omp target enter data map(always,alloc:bc_buffers(1, 1)%sf)
433# 45 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
434#endif
435#ifdef MFC_DEBUG
436# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
437 block
438# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
439 use iso_fortran_env, only: output_unit
440# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
441
442# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
443 print *, 'm_boundary_common.fpp:46: ', '@:ALLOCATE(bc_buffers(1, 2)%sf(1:sys_size_alloc, 0:n, 0:p))'
444# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
445
446# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
447 call flush (output_unit)
448# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
449 end block
450# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
451#endif
452# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
453 allocate (bc_buffers(1, 2)%sf(1:sys_size_alloc, 0:n, 0:p))
454# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
455
456# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
457
458# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
459#if defined(MFC_OpenACC)
460# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
461!$acc enter data create(bc_buffers(1, 2)%sf)
462# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
463#elif defined(MFC_OpenMP)
464# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
465!$omp target enter data map(always,alloc:bc_buffers(1, 2)%sf)
466# 46 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
467#endif
468# 48 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
469 if (n > 0) then
470#ifdef MFC_DEBUG
471# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
472 block
473# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
474 use iso_fortran_env, only: output_unit
475# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
476
477# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
478 print *, 'm_boundary_common.fpp:49: ', '@:ALLOCATE(bc_buffers(2,1)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))'
479# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
480
481# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
482 call flush (output_unit)
483# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
484 end block
485# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
486#endif
487# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
488 allocate (bc_buffers(2,1)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))
489# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
490
491# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
492
493# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
494#if defined(MFC_OpenACC)
495# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
496!$acc enter data create(bc_buffers(2,1)%sf)
497# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
498#elif defined(MFC_OpenMP)
499# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
500!$omp target enter data map(always,alloc:bc_buffers(2,1)%sf)
501# 49 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
502#endif
503#ifdef MFC_DEBUG
504# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
505 block
506# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
507 use iso_fortran_env, only: output_unit
508# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
509
510# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
511 print *, 'm_boundary_common.fpp:50: ', '@:ALLOCATE(bc_buffers(2,2)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))'
512# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
513
514# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
515 call flush (output_unit)
516# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
517 end block
518# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
519#endif
520# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
521 allocate (bc_buffers(2,2)%sf(-buff_size:m+buff_size,1:sys_size_alloc,0:p))
522# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
523
524# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
525
526# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
527#if defined(MFC_OpenACC)
528# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
529!$acc enter data create(bc_buffers(2,2)%sf)
530# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
531#elif defined(MFC_OpenMP)
532# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
533!$omp target enter data map(always,alloc:bc_buffers(2,2)%sf)
534# 50 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
535#endif
536# 52 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
537 if (p > 0) then
538#ifdef MFC_DEBUG
539# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
540 block
541# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
542 use iso_fortran_env, only: output_unit
543# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
544
545# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
546 print *, 'm_boundary_common.fpp:53: ', '@:ALLOCATE(bc_buffers(3,1)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))'
547# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
548
549# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
550 call flush (output_unit)
551# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
552 end block
553# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
554#endif
555# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
556 allocate (bc_buffers(3,1)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))
557# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
558
559# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
560
561# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
562#if defined(MFC_OpenACC)
563# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
564!$acc enter data create(bc_buffers(3,1)%sf)
565# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
566#elif defined(MFC_OpenMP)
567# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
568!$omp target enter data map(always,alloc:bc_buffers(3,1)%sf)
569# 53 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
570#endif
571#ifdef MFC_DEBUG
572# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
573 block
574# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
575 use iso_fortran_env, only: output_unit
576# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
577
578# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
579 print *, 'm_boundary_common.fpp:54: ', '@:ALLOCATE(bc_buffers(3,2)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))'
580# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
581
582# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
583 call flush (output_unit)
584# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
585 end block
586# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
587#endif
588# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
589 allocate (bc_buffers(3,2)%sf(-buff_size:m+buff_size,-buff_size:n+buff_size,1:sys_size_alloc))
590# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
591
592# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
593
594# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
595#if defined(MFC_OpenACC)
596# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
597!$acc enter data create(bc_buffers(3,2)%sf)
598# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
599#elif defined(MFC_OpenMP)
600# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
601!$omp target enter data map(always,alloc:bc_buffers(3,2)%sf)
602# 54 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
603#endif
604 end if
605# 57 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
606 end if
607# 59 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
608 do i = 1, num_dims
609 do j = 1, 2
610#ifdef _CRAYFTN
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#ifdef MFC_DEBUG
615# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
616 block
617# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
618 use iso_fortran_env, only: output_unit
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 print *, 'm_boundary_common.fpp:61: ', '@:ACC_SETUP_SFs(bc_buffers(i,j))'
623# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
624
625# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
626 call flush (output_unit)
627# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
628 end block
629# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
630#endif
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
635# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
636#if defined(MFC_OpenACC)
637# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
638!$acc enter data copyin(bc_buffers(i,j))
639# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
640#elif defined(MFC_OpenMP)
641# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
642!$omp target enter data map(to:bc_buffers(i,j))
643# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
644#endif
645# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
646 if (associated(bc_buffers(i,j)%sf)) then
647# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
648
649# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
650#if defined(MFC_OpenACC)
651# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
652!$acc enter data copyin(bc_buffers(i,j)%sf)
653# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
654#elif defined(MFC_OpenMP)
655# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
656!$omp target enter data map(to:bc_buffers(i,j)%sf)
657# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
658#endif
659# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
660 end if
661# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
662 end block
663# 61 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
664#endif
665 end do
666 end do
667 end if
668
670
671 !> Populate the buffers of the primitive variables based on the selected boundary conditions.
672 impure subroutine s_populate_variables_buffers(bc_type, q_prim_vf, pb_in, mv_in, q_T_sf)
673
674 type(scalar_field), dimension(sys_size), intent(inout) :: q_prim_vf
675 real(stp), optional, dimension(idwbuff(1)%beg:,idwbuff(2)%beg:,idwbuff(3)%beg:,1:,1:), intent(inout) :: pb_in, mv_in
676 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
677 type(scalar_field), optional, intent(inout) :: q_t_sf
678
679 call s_populate_bc_direction(1, -1, bc_x, bc_type(1, 1), q_prim_vf, pb_in, mv_in, q_t_sf)
680 call s_populate_bc_direction(1, 1, bc_x, bc_type(1, 2), q_prim_vf, pb_in, mv_in, q_t_sf)
681
682 ! Population of Buffers in y-direction
683
684 if (n == 0) return
685
686# 84 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
687 call s_populate_bc_direction(2, -1, bc_y, bc_type(2, 1), q_prim_vf, pb_in, mv_in, q_t_sf)
688 call s_populate_bc_direction(2, 1, bc_y, bc_type(2, 2), q_prim_vf, pb_in, mv_in, q_t_sf)
689# 87 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
690
691 ! Population of Buffers in z-direction
692
693 if (p == 0) return
694
695# 93 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
696 call s_populate_bc_direction(3, -1, bc_z, bc_type(3, 1), q_prim_vf, pb_in, mv_in, q_t_sf)
697 call s_populate_bc_direction(3, 1, bc_z, bc_type(3, 2), q_prim_vf, pb_in, mv_in, q_t_sf)
698# 96 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
699
700 end subroutine s_populate_variables_buffers
701
702 !> Populate the variable buffers along one direction and location, via MPI exchange for processor boundaries or by dispatching
703 !! the per-cell BC routines over the boundary face.
704 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)
705
706 integer, intent(in) :: bc_dir, bc_loc
707 type(int_bounds_info), intent(in) :: bc_bounds
708 type(integer_field), intent(in) :: bc_type_edge
709 type(scalar_field), dimension(sys_size), intent(inout) :: q_prim_vf
710 real(stp), optional, dimension(idwbuff(1)%beg:,idwbuff(2)%beg:,idwbuff(3)%beg:,1:,1:), intent(inout) :: pb_in, mv_in
711 type(scalar_field), optional, intent(inout) :: q_t_sf
712 integer :: bc_edge, k_beg, k_end, l_beg, l_end
713 integer :: bc_code, k, l
714
715 if (bc_loc == -1) then
716 bc_edge = bc_bounds%beg
717 else
718 bc_edge = bc_bounds%end
719 end if
720
721 ! BC type codes defined in m_constants.fpp; non-negative values are MPI boundaries
722 if (bc_edge >= 0) then
723 call s_mpi_sendrecv_variables_buffers(q_prim_vf, bc_dir, bc_loc, sys_size, pb_in, mv_in, q_t_sf)
724 return
725 end if
726
727 if (bc_dir == 1) then
728 k_beg = 0; k_end = n; l_beg = 0; l_end = p
729 else if (bc_dir == 2) then
730 k_beg = -buff_size; k_end = m + buff_size; l_beg = 0; l_end = p
731 else
732 k_beg = -buff_size; k_end = m + buff_size; l_beg = -buff_size; l_end = n + buff_size
733 end if
734
735
736# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
737
738# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
739#if defined(MFC_OpenACC)
740# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
741!$acc parallel loop collapse(2) gang vector default(present) private(l, k, bc_code)
742# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
743#elif defined(MFC_OpenMP)
744# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
745
746# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
747
748# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
749
750# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
751!$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)
752# 132 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
753#endif
754 do l = l_beg, l_end
755 do k = k_beg, k_end
756 if (bc_dir == 1) then
757 bc_code = int(bc_type_edge%sf(0, k, l))
758 else if (bc_dir == 2) then
759 bc_code = int(bc_type_edge%sf(k, 0, l))
760 else
761 bc_code = int(bc_type_edge%sf(k, l, 0))
762 end if
763
764 select case (bc_code)
765 case (bc_char_sup_outflow:bc_ghost_extrap)
766 call s_ghost_cell_extrapolation(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
767 case (bc_axis)
768 if (bc_dir == 2 .and. bc_loc == -1) call s_axis(q_prim_vf, pb_in, mv_in, k, l)
769 case (bc_reflective)
770 call s_symmetry(q_prim_vf, bc_dir, bc_loc, k, l, pb_in, mv_in, q_t_sf)
771 case (bc_periodic)
772 call s_periodic(q_prim_vf, bc_dir, bc_loc, k, l, pb_in, mv_in, q_t_sf)
773 case (bc_slip_wall)
774 call s_slip_wall(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
775 case (bc_no_slip_wall)
776 call s_no_slip_wall(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
777 case (bc_dirichlet)
778 call s_dirichlet(q_prim_vf, bc_dir, bc_loc, k, l, q_t_sf)
779 end select
780
781 if (qbmm .and. (.not. polytropic) .and. present(pb_in) .and. present(mv_in) .and. (bc_code <= bc_ghost_extrap) &
782 & .and. .not. (bc_dir == 2 .and. bc_loc == -1 .and. bc_code == bc_axis)) then
783 call s_qbmm_extrapolation(bc_dir, bc_loc, k, l, pb_in, mv_in)
784 end if
785 end do
786 end do
787
788# 166 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
789#if defined(MFC_OpenACC)
790# 166 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
791!$acc end parallel loop
792# 166 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
793#elif defined(MFC_OpenMP)
794# 166 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
795
796# 166 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
797!$omp end target teams loop
798# 166 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
799#endif
800
801 end subroutine s_populate_bc_direction
802
803 !> Populate ghost cell buffers for the color function and its divergence used in capillary surface tension.
804 impure subroutine s_populate_capillary_buffers(c_divs, bc_type, bc)
805
806 type(scalar_field), dimension(num_dims + 1), intent(inout) :: c_divs
807 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
808 type(bc_xyz_info), intent(in) :: bc
809
810 call s_populate_capillary_bc_direction(1, -1, bc%x, bc_type(1, 1), c_divs)
811 call s_populate_capillary_bc_direction(1, 1, bc%x, bc_type(1, 2), c_divs)
812
813 if (n == 0) return
814
815# 183 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
816 call s_populate_capillary_bc_direction(2, -1, bc%y, bc_type(2, 1), c_divs)
817 call s_populate_capillary_bc_direction(2, 1, bc%y, bc_type(2, 2), c_divs)
818# 186 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
819
820 if (p == 0) return
821
822# 190 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
823 call s_populate_capillary_bc_direction(3, -1, bc%z, bc_type(3, 1), c_divs)
824 call s_populate_capillary_bc_direction(3, 1, bc%z, bc_type(3, 2), c_divs)
825# 193 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
826
827 end subroutine s_populate_capillary_buffers
828
829 !> Populate ghost cell buffers for one capillary BC direction and location, via MPI exchange for processor boundaries or by
830 !! dispatching the per-cell capillary BC routines over the boundary face.
831 impure subroutine s_populate_capillary_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, c_divs)
832
833 integer, intent(in) :: bc_dir, bc_loc
834 type(int_bounds_info), intent(in) :: bc_bounds
835 type(scalar_field), dimension(num_dims + 1), intent(inout) :: c_divs
836 type(integer_field), intent(in) :: bc_type_edge
837 integer :: bc_edge, k_beg, k_end, l_beg, l_end, k, l, bc_code
838
839 if (bc_loc == -1) then
840 bc_edge = bc_bounds%beg
841 else
842 bc_edge = bc_bounds%end
843 end if
844
845 if (bc_edge >= 0) then
846 call s_mpi_sendrecv_variables_buffers(c_divs, bc_dir, bc_loc, num_dims + 1)
847 return
848 end if
849
850 if (bc_dir == 1) then
851 k_beg = 0; k_end = n; l_beg = 0; l_end = p
852 else if (bc_dir == 2) then
853 k_beg = -buff_size; k_end = m + buff_size; l_beg = 0; l_end = p
854 else
855 k_beg = -buff_size; k_end = m + buff_size; l_beg = -buff_size; l_end = n + buff_size
856 end if
857
858
859# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
860
861# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
862#if defined(MFC_OpenACC)
863# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
864!$acc parallel loop collapse(2) gang vector default(present) private(l, k, bc_code)
865# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
866#elif defined(MFC_OpenMP)
867# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
868
869# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
870
871# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
872
873# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
874!$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)
875# 225 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
876#endif
877 do l = l_beg, l_end
878 do k = k_beg, k_end
879 if (bc_dir == 1) then
880 bc_code = int(bc_type_edge%sf(0, k, l))
881 else if (bc_dir == 2) then
882 bc_code = int(bc_type_edge%sf(k, 0, l))
883 else
884 bc_code = int(bc_type_edge%sf(k, l, 0))
885 end if
886
887 select case (bc_code)
888 case (bc_periodic)
889 call s_color_function_periodic(c_divs, bc_dir, bc_loc, k, l)
890 case (bc_reflective)
891 call s_color_function_reflective(c_divs, bc_dir, bc_loc, k, l)
892 case default
893 call s_color_function_ghost_cell_extrapolation(c_divs, bc_dir, bc_loc, k, l)
894 end select
895 end do
896 end do
897
898# 246 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
899#if defined(MFC_OpenACC)
900# 246 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
901!$acc end parallel loop
902# 246 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
903#elif defined(MFC_OpenMP)
904# 246 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
905
906# 246 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
907!$omp end target teams loop
908# 246 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
909#endif
910
912
913 !> Populate ghost cell buffers for the Jacobian scalar field used in the IGR elliptic solver.
914 impure subroutine s_populate_f_igr_buffers(bc_type, jac_sf)
915
916 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
917 type(scalar_field), dimension(1:), intent(inout) :: jac_sf
918
919 call s_populate_f_igr_bc_direction(1, -1, bc_x, bc_type(1, 1), jac_sf)
920 call s_populate_f_igr_bc_direction(1, 1, bc_x, bc_type(1, 2), jac_sf)
921
922 if (n == 0) return
923
924# 262 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
925 call s_populate_f_igr_bc_direction(2, -1, bc_y, bc_type(2, 1), jac_sf)
926 call s_populate_f_igr_bc_direction(2, 1, bc_y, bc_type(2, 2), jac_sf)
927# 265 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
928
929 if (p == 0) return
930
931# 269 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
932 call s_populate_f_igr_bc_direction(3, -1, bc_z, bc_type(3, 1), jac_sf)
933 call s_populate_f_igr_bc_direction(3, 1, bc_z, bc_type(3, 2), jac_sf)
934# 272 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
935
936 end subroutine s_populate_f_igr_buffers
937
938 !> Populate ghost cell buffers for one IGR Jacobian BC direction and location, via MPI exchange for processor boundaries or by
939 !! dispatching the per-cell IGR Jacobian BC routines over the boundary face.
940 impure subroutine s_populate_f_igr_bc_direction(bc_dir, bc_loc, bc_bounds, bc_type_edge, jac_sf)
941
942 integer, intent(in) :: bc_dir, bc_loc
943 type(int_bounds_info), intent(in) :: bc_bounds
944 type(integer_field), intent(in) :: bc_type_edge
945 type(scalar_field), dimension(1:), intent(inout) :: jac_sf
946 integer :: bc_edge, k_beg, k_end, l_beg, l_end, k, l, j, bc_code
947
948 if (bc_loc == -1) then
949 bc_edge = bc_bounds%beg
950 else
951 bc_edge = bc_bounds%end
952 end if
953
954 if (bc_edge >= 0) then
955 call s_mpi_sendrecv_variables_buffers(jac_sf, bc_dir, bc_loc, 1)
956 return
957 end if
958
959 if (bc_dir == 1) then
960 k_beg = 0; k_end = n; l_beg = 0; l_end = p
961 else if (bc_dir == 2) then
962 k_beg = idwbuff(1)%beg; k_end = idwbuff(1)%end; l_beg = 0; l_end = p
963 else
964 k_beg = idwbuff(1)%beg; k_end = idwbuff(1)%end; l_beg = idwbuff(2)%beg; l_end = idwbuff(2)%end
965 end if
966
967
968# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
969
970# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
971#if defined(MFC_OpenACC)
972# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
973!$acc parallel loop collapse(2) gang vector default(present) private(l, k, bc_code)
974# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
975#elif defined(MFC_OpenMP)
976# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
977
978# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
979
980# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
981
982# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
983!$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)
984# 304 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
985#endif
986 do l = l_beg, l_end
987 do k = k_beg, k_end
988 if (bc_dir == 1) then
989 bc_code = int(bc_type_edge%sf(0, k, l))
990 else if (bc_dir == 2) then
991 bc_code = int(bc_type_edge%sf(k, 0, l))
992 else
993 bc_code = int(bc_type_edge%sf(k, l, 0))
994 end if
995
996 select case (bc_code)
997 case (bc_periodic)
998 call s_f_igr_periodic(jac_sf, bc_dir, bc_loc, k, l)
999 case (bc_reflective)
1000 call s_f_igr_reflective(jac_sf, bc_dir, bc_loc, k, l)
1001 case default
1002 call s_f_igr_ghost_cell_extrapolation(jac_sf, bc_dir, bc_loc, k, l)
1003 end select
1004 end do
1005 end do
1006
1007# 325 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1008#if defined(MFC_OpenACC)
1009# 325 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1010!$acc end parallel loop
1011# 325 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1012#elif defined(MFC_OpenMP)
1013# 325 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1014
1015# 325 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1016!$omp end target teams loop
1017# 325 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1018#endif
1019
1020 end subroutine s_populate_f_igr_bc_direction
1021
1022 !> Populate the buffers of the grid variables, which are constituted of the cell-boundary locations and cell-width
1023 !! distributions, based on the boundary conditions.
1025
1026#ifdef MFC_SIMULATION
1027 ! Simulation allocates the cell-boundary arrays with buff_size ghost layers, so the
1028 ! ghost extrapolation extends over the full buffer. In post-process the module-level
1029 ! offset_x/y/z (which the x_cb/y_cb/z_cb allocations are sized to) are used instead.
1030 type(int_bounds_info) :: offset_x, offset_y, offset_z
1031
1032 offset_x%beg = buff_size; offset_x%end = buff_size
1033 offset_y%beg = buff_size; offset_y%end = buff_size
1034 offset_z%beg = buff_size; offset_z%end = buff_size
1035#endif
1036
1037#ifndef MFC_PRE_PROCESS
1038 call s_populate_grid_bc_direction(1, -1, bc_x, offset_x)
1039 call s_populate_grid_bc_direction(1, 1, bc_x, offset_x)
1040
1041 if (n == 0) return
1042
1043# 351 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1044 call s_populate_grid_bc_direction(2, -1, bc_y, offset_y)
1045 call s_populate_grid_bc_direction(2, 1, bc_y, offset_y)
1046# 354 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1047
1048 if (p == 0) return
1049
1050# 358 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1051 call s_populate_grid_bc_direction(3, -1, bc_z, offset_z)
1052 call s_populate_grid_bc_direction(3, 1, bc_z, offset_z)
1053# 361 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1054#endif
1055
1057
1058#ifndef MFC_PRE_PROCESS
1059 !> Populate grid variable buffers (cell widths and centers) for one direction and location.
1060 subroutine s_populate_grid_bc_direction(bc_dir, bc_loc, bc_bounds, offset_dir)
1061
1062 integer, intent(in) :: bc_dir, bc_loc
1063 type(int_bounds_info), intent(in) :: bc_bounds, offset_dir
1064 integer :: bc_edge
1065
1066 if (bc_loc == -1) then
1067 bc_edge = bc_bounds%beg
1068 else
1069 bc_edge = bc_bounds%end
1070 end if
1071
1072 if (bc_edge >= 0) then
1073 call s_mpi_sendrecv_grid_variables_buffers(bc_dir, bc_loc, offset_dir)
1074 return
1075 end if
1076
1077 select case (bc_edge)
1078 case (bc_periodic)
1079 call s_grid_periodic_bc(bc_dir, bc_loc, offset_dir)
1080 case (bc_reflective)
1081 call s_grid_reflective_bc(bc_dir, bc_loc, offset_dir)
1082 case (bc_axis)
1083 if (bc_dir == 2) call s_grid_axis_bc(bc_loc, offset_dir)
1084 case default
1085 call s_grid_ghost_cell_extrapolation_bc(bc_dir, bc_loc, offset_dir)
1086 end select
1087
1088 end subroutine s_populate_grid_bc_direction
1089#endif
1090
1091 !> Deallocate boundary condition buffer arrays allocated during module initialization.
1093
1094 if (bc_io) then
1095#ifdef MFC_DEBUG
1096# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1097 block
1098# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1099 use iso_fortran_env, only: output_unit
1100# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1101
1102# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1103 print *, 'm_boundary_common.fpp:402: ', '@:DEALLOCATE(bc_buffers(1, 1)%sf)'
1104# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1105
1106# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1107 call flush (output_unit)
1108# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1109 end block
1110# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1111#endif
1112# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1113
1114# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1115#if defined(MFC_OpenACC)
1116# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1117!$acc exit data delete(bc_buffers(1, 1)%sf)
1118# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1119#elif defined(MFC_OpenMP)
1120# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1121!$omp target exit data map(release:bc_buffers(1, 1)%sf)
1122# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1123#endif
1124# 402 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1125 deallocate (bc_buffers(1, 1)%sf)
1126#ifdef MFC_DEBUG
1127# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1128 block
1129# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1130 use iso_fortran_env, only: output_unit
1131# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1132
1133# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1134 print *, 'm_boundary_common.fpp:403: ', '@:DEALLOCATE(bc_buffers(1, 2)%sf)'
1135# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1136
1137# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1138 call flush (output_unit)
1139# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1140 end block
1141# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1142#endif
1143# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1144
1145# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1146#if defined(MFC_OpenACC)
1147# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1148!$acc exit data delete(bc_buffers(1, 2)%sf)
1149# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1150#elif defined(MFC_OpenMP)
1151# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1152!$omp target exit data map(release:bc_buffers(1, 2)%sf)
1153# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1154#endif
1155# 403 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1156 deallocate (bc_buffers(1, 2)%sf)
1157# 405 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1158 if (n > 0) then
1159#ifdef MFC_DEBUG
1160# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1161 block
1162# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1163 use iso_fortran_env, only: output_unit
1164# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1165
1166# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1167 print *, 'm_boundary_common.fpp:406: ', '@:DEALLOCATE(bc_buffers(2, 1)%sf)'
1168# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1169
1170# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1171 call flush (output_unit)
1172# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1173 end block
1174# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1175#endif
1176# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1177
1178# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1179#if defined(MFC_OpenACC)
1180# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1181!$acc exit data delete(bc_buffers(2, 1)%sf)
1182# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1183#elif defined(MFC_OpenMP)
1184# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1185!$omp target exit data map(release:bc_buffers(2, 1)%sf)
1186# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1187#endif
1188# 406 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1189 deallocate (bc_buffers(2, 1)%sf)
1190#ifdef MFC_DEBUG
1191# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1192 block
1193# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1194 use iso_fortran_env, only: output_unit
1195# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1196
1197# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1198 print *, 'm_boundary_common.fpp:407: ', '@:DEALLOCATE(bc_buffers(2, 2)%sf)'
1199# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1200
1201# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1202 call flush (output_unit)
1203# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1204 end block
1205# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1206#endif
1207# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1208
1209# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1210#if defined(MFC_OpenACC)
1211# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1212!$acc exit data delete(bc_buffers(2, 2)%sf)
1213# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1214#elif defined(MFC_OpenMP)
1215# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1216!$omp target exit data map(release:bc_buffers(2, 2)%sf)
1217# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1218#endif
1219# 407 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1220 deallocate (bc_buffers(2, 2)%sf)
1221# 409 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1222 if (p > 0) then
1223#ifdef MFC_DEBUG
1224# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1225 block
1226# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1227 use iso_fortran_env, only: output_unit
1228# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1229
1230# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1231 print *, 'm_boundary_common.fpp:410: ', '@:DEALLOCATE(bc_buffers(3, 1)%sf)'
1232# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1233
1234# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1235 call flush (output_unit)
1236# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1237 end block
1238# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1239#endif
1240# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1241
1242# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1243#if defined(MFC_OpenACC)
1244# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1245!$acc exit data delete(bc_buffers(3, 1)%sf)
1246# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1247#elif defined(MFC_OpenMP)
1248# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1249!$omp target exit data map(release:bc_buffers(3, 1)%sf)
1250# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1251#endif
1252# 410 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1253 deallocate (bc_buffers(3, 1)%sf)
1254#ifdef MFC_DEBUG
1255# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1256 block
1257# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1258 use iso_fortran_env, only: output_unit
1259# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1260
1261# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1262 print *, 'm_boundary_common.fpp:411: ', '@:DEALLOCATE(bc_buffers(3, 2)%sf)'
1263# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1264
1265# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1266 call flush (output_unit)
1267# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1268 end block
1269# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1270#endif
1271# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1272
1273# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1274#if defined(MFC_OpenACC)
1275# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1276!$acc exit data delete(bc_buffers(3, 2)%sf)
1277# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1278#elif defined(MFC_OpenMP)
1279# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1280!$omp target exit data map(release:bc_buffers(3, 2)%sf)
1281# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1282#endif
1283# 411 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1284 deallocate (bc_buffers(3, 2)%sf)
1285 end if
1286# 414 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1287 end if
1288# 416 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1289 end if
1290#ifdef MFC_DEBUG
1291# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1292 block
1293# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1294 use iso_fortran_env, only: output_unit
1295# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1296
1297# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1298 print *, 'm_boundary_common.fpp:417: ', '@:DEALLOCATE(bc_buffers)'
1299# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1300
1301# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1302 call flush (output_unit)
1303# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1304 end block
1305# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1306#endif
1307# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1308
1309# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1310#if defined(MFC_OpenACC)
1311# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1312!$acc exit data delete(bc_buffers)
1313# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1314#elif defined(MFC_OpenMP)
1315# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1316!$omp target exit data map(release:bc_buffers)
1317# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1318#endif
1319# 417 "/home/runner/work/MFC/MFC/src/common/m_boundary_common.fpp"
1320 deallocate (bc_buffers)
1321
1323
1324end 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_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.
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...
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.
subroutine s_mpi_sendrecv_grid_variables_buffers(mpi_dir, pbc_loc, offset)
The goal of this procedure is to populate the buffers of the grid variables by communicating with the...
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.