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