MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_boundary_io.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
2!>
3!! @file
4!! @brief Contains module m_boundary_io
5
6!> @brief Boundary condition restart I/O, capillary/IGR buffer population, and grid-variable buffers
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_io.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_io.fpp" 2
366
368
371 use m_mpi_proxy
372 use m_constants
376
377 implicit none
378
379#ifdef MFC_MPI
380 integer, dimension(1:3,1:2) :: mpi_bc_type_type
381 integer, dimension(1:3,1:2) :: mpi_bc_buffer_type
382#endif
383
384contains
385
386 !> Create MPI derived datatypes for boundary condition type arrays and buffer arrays used in parallel I/O.
387 impure subroutine s_create_mpi_types(bc_type)
388
389 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
390
391#ifdef MFC_MPI
392 integer :: dir, loc
393 integer, dimension(3) :: sf_start_idx, sf_extents_loc
394 integer :: ierr
395
396 do dir = 1, num_dims
397 do loc = 1, 2
398 sf_start_idx = (/0, 0, 0/)
399 sf_extents_loc = shape(bc_type(dir, loc)%sf)
400
401 call mpi_type_create_subarray(num_dims, sf_extents_loc, sf_extents_loc, sf_start_idx, mpi_order_fortran, &
402 & mpi_integer, mpi_bc_type_type(dir, loc), ierr)
403 call mpi_type_commit(mpi_bc_type_type(dir, loc), ierr)
404 end do
405 end do
406
407 do dir = 1, num_dims
408 do loc = 1, 2
409 sf_start_idx = (/0, 0, 0/)
410 sf_extents_loc = shape(bc_buffers(dir, loc)%sf)
411
412 call mpi_type_create_subarray(num_dims, sf_extents_loc*mpi_io_type, sf_extents_loc*mpi_io_type, sf_start_idx, &
413 & mpi_order_fortran, mpi_io_p, mpi_bc_buffer_type(dir, loc), ierr)
414 call mpi_type_commit(mpi_bc_buffer_type(dir, loc), ierr)
415 end do
416 end do
417#endif
418
419 end subroutine s_create_mpi_types
420
421 !> Write boundary condition type and buffer data to serial (unformatted) restart files.
422 subroutine s_write_serial_boundary_condition_files(q_prim_vf, bc_type, step_dirpath, old_grid_in, q_T_sf)
423
424 type(scalar_field), dimension(sys_size), intent(in) :: q_prim_vf
425 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
426 logical, intent(in) :: old_grid_in
427 character(LEN=*), intent(in) :: step_dirpath
428 integer :: dir, loc
429 character(len=path_len) :: file_path
430 character(len=10) :: status
431 type(scalar_field), optional, intent(in) :: q_T_sf
432
433 if (old_grid_in) then
434 status = 'old'
435 else
436 status = 'new'
437 end if
438
439 call s_pack_boundary_condition_buffers(q_prim_vf, q_t_sf)
440
441 file_path = trim(step_dirpath) // '/bc_type.dat'
442 open (1, file=trim(file_path), form='unformatted', status=status)
443 do dir = 1, num_dims
444 do loc = 1, 2
445 write (1) bc_type(dir, loc)%sf
446 end do
447 end do
448 close (1)
449
450 file_path = trim(step_dirpath) // '/bc_buffers.dat'
451 open (1, file=trim(file_path), form='unformatted', status=status)
452 do dir = 1, num_dims
453 do loc = 1, 2
454 write (1) bc_buffers(dir, loc)%sf
455 end do
456 end do
457 close (1)
458
460
461 !> Write boundary condition type and buffer data to per-rank parallel files using MPI I/O.
462 subroutine s_write_parallel_boundary_condition_files(q_prim_vf, bc_type, q_T_sf)
463
464 type(scalar_field), dimension(sys_size), intent(in) :: q_prim_vf
465 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
466 integer :: dir, loc
467 character(len=path_len) :: file_loc, file_path
468 type(scalar_field), intent(in), optional :: q_T_sf
469
470#ifdef MFC_MPI
471 integer :: ierr
472 integer :: file_id
473 character(len=7) :: proc_rank_str
474 logical :: dir_check
475 integer :: nelements
476
477 call s_pack_boundary_condition_buffers(q_prim_vf, q_t_sf)
478
479 file_loc = trim(case_dir) // '/restart_data/boundary_conditions'
480 if (proc_rank == 0) then
481 call my_inquire(file_loc, dir_check)
482 if (dir_check .neqv. .true.) then
483 call s_create_directory(trim(file_loc))
484 end if
485 end if
486
487 call s_create_mpi_types(bc_type)
488
489 call s_mpi_barrier()
490
492
493 write (proc_rank_str, '(I7.7)') proc_rank
494 file_path = trim(file_loc) // '/bc_' // trim(proc_rank_str) // '.dat'
495 call mpi_file_open(mpi_comm_self, trim(file_path), mpi_mode_create + mpi_mode_wronly, mpi_info_null, file_id, ierr)
496
497 ! Write bc_types
498 do dir = 1, num_dims
499 do loc = 1, 2
500#ifdef MFC_MIXED_PRECISION
501 nelements = sizeof(bc_type(dir, loc)%sf)
502 call mpi_file_write_all(file_id, bc_type(dir, loc)%sf, nelements, mpi_byte, mpi_status_ignore, ierr)
503#else
504 nelements = sizeof(bc_type(dir, loc)%sf)/4
505 call mpi_file_write_all(file_id, bc_type(dir, loc)%sf, nelements, mpi_integer, mpi_status_ignore, ierr)
506#endif
507 end do
508 end do
509
510 ! Write bc_buffers
511 do dir = 1, num_dims
512 do loc = 1, 2
513 nelements = sizeof(bc_buffers(dir, loc)%sf)*mpi_io_type/stp
514 call mpi_file_write_all(file_id, bc_buffers(dir, loc)%sf, nelements, mpi_io_p, mpi_status_ignore, ierr)
515 end do
516 end do
517
518 call mpi_file_close(file_id, ierr)
519#endif
520
522
523 !> Read boundary condition type and buffer data from serial (unformatted) restart files.
524 subroutine s_read_serial_boundary_condition_files(step_dirpath, bc_type)
525
526 character(LEN=*), intent(in) :: step_dirpath
527 type(integer_field), dimension(1:num_dims,1:2), intent(inout) :: bc_type
528 integer :: dir, loc
529 logical :: file_exist
530 character(len=path_len) :: file_path
531
532 ! Read bc_types
533
534 file_path = trim(step_dirpath) // '/bc_type.dat'
535 inquire (file=trim(file_path), exist=file_exist)
536 if (.not. file_exist) then
537 call s_mpi_abort(trim(file_path) // ' is missing. Exiting.')
538 end if
539
540 open (1, file=trim(file_path), form='unformatted', status='unknown')
541 do dir = 1, num_dims
542 do loc = 1, 2
543 read (1) bc_type(dir, loc)%sf
544
545# 186 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
546#if defined(MFC_OpenACC)
547# 186 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
548!$acc update device(bc_type(dir, loc)%sf)
549# 186 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
550#elif defined(MFC_OpenMP)
551# 186 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
552!$omp target update to(bc_type(dir, loc)%sf)
553# 186 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
554#endif
555# 187 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
556 end do
557 end do
558 close (1)
559
560 ! Read bc_buffers
561 file_path = trim(step_dirpath) // '/bc_buffers.dat'
562 inquire (file=trim(file_path), exist=file_exist)
563 if (.not. file_exist) then
564 call s_mpi_abort(trim(file_path) // ' is missing. Exiting.')
565 end if
566
567 open (1, file=trim(file_path), form='unformatted', status='unknown')
568 do dir = 1, num_dims
569 do loc = 1, 2
570 read (1) bc_buffers(dir, loc)%sf
571
572# 202 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
573#if defined(MFC_OpenACC)
574# 202 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
575!$acc update device(bc_buffers(dir, loc)%sf)
576# 202 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
577#elif defined(MFC_OpenMP)
578# 202 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
579!$omp target update to(bc_buffers(dir, loc)%sf)
580# 202 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
581#endif
582# 203 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
583 end do
584 end do
585 close (1)
586
588
589 !> Read boundary condition type and buffer data from per-rank parallel files using MPI I/O.
591
592 type(integer_field), dimension(1:num_dims,1:2), intent(inout) :: bc_type
593 integer :: dir, loc
594 character(len=path_len) :: file_loc, file_path
595
596#ifdef MFC_MPI
597 integer :: ierr
598 integer :: file_id
599 character(len=7) :: proc_rank_str
600 logical :: dir_check
601 integer :: nelements
602
603 file_loc = trim(case_dir) // '/restart_data/boundary_conditions'
604
605 if (proc_rank == 0) then
606 call my_inquire(file_loc, dir_check)
607 if (dir_check .neqv. .true.) then
608 call s_mpi_abort(trim(file_loc) // ' is missing. Exiting.')
609 end if
610 end if
611
612 call s_create_mpi_types(bc_type)
613
614 call s_mpi_barrier()
615
617
618 write (proc_rank_str, '(I7.7)') proc_rank
619 file_path = trim(file_loc) // '/bc_' // trim(proc_rank_str) // '.dat'
620 call mpi_file_open(mpi_comm_self, trim(file_path), mpi_mode_rdonly, mpi_info_null, file_id, ierr)
621
622 ! Read bc_types
623 do dir = 1, num_dims
624 do loc = 1, 2
625#ifdef MFC_MIXED_PRECISION
626 nelements = sizeof(bc_type(dir, loc)%sf)
627 call mpi_file_read_all(file_id, bc_type(dir, loc)%sf, nelements, mpi_byte, mpi_status_ignore, ierr)
628#else
629 nelements = sizeof(bc_type(dir, loc)%sf)/4
630 call mpi_file_read_all(file_id, bc_type(dir, loc)%sf, nelements, mpi_integer, mpi_status_ignore, ierr)
631#endif
632
633# 252 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
634#if defined(MFC_OpenACC)
635# 252 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
636!$acc update device(bc_type(dir, loc)%sf)
637# 252 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
638#elif defined(MFC_OpenMP)
639# 252 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
640!$omp target update to(bc_type(dir, loc)%sf)
641# 252 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
642#endif
643# 253 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
644 end do
645 end do
646
647 ! Read bc_buffers
648 do dir = 1, num_dims
649 do loc = 1, 2
650 nelements = sizeof(bc_buffers(dir, loc)%sf)*mpi_io_type/stp
651 call mpi_file_read_all(file_id, bc_buffers(dir, loc)%sf, nelements, mpi_io_p, mpi_status_ignore, ierr)
652
653# 261 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
654#if defined(MFC_OpenACC)
655# 261 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
656!$acc update device(bc_buffers(dir, loc)%sf)
657# 261 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
658#elif defined(MFC_OpenMP)
659# 261 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
660!$omp target update to(bc_buffers(dir, loc)%sf)
661# 261 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
662#endif
663# 262 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
664 end do
665 end do
666
667 call mpi_file_close(file_id, ierr)
668#endif
669
671
672 !> Pack primitive variable boundary slices into bc_buffers arrays for serialization.
673 subroutine s_pack_boundary_condition_buffers(q_prim_vf, q_T_sf)
674
675 type(scalar_field), dimension(sys_size), intent(in) :: q_prim_vf
676 integer :: i, j, k
677 type(scalar_field), intent(in), optional :: q_T_sf
678
679 do k = 0, p
680 do j = 0, n
681 do i = 1, sys_size
682 bc_buffers(1, 1)%sf(i, j, k) = q_prim_vf(i)%sf(0, j, k)
683 bc_buffers(1, 2)%sf(i, j, k) = q_prim_vf(i)%sf(m, j, k)
684 end do
685 if ((chemistry .or. heat_conduction) .and. present(q_t_sf)) then
686 bc_buffers(1, 1)%sf(sys_size + 1, j, k) = q_t_sf%sf(0, j, k)
687 bc_buffers(1, 2)%sf(sys_size + 1, j, k) = q_t_sf%sf(m, j, k)
688 end if
689 end do
690 end do
691
692# 291 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
693 if (n > 0) then
694 do k = 0, p
695 do j = 1, sys_size
696 do i = 0, m
697 bc_buffers(2, 1)%sf(i, j, k) = q_prim_vf(j)%sf(i, 0, k)
698 bc_buffers(2, 2)%sf(i, j, k) = q_prim_vf(j)%sf(i, n, k)
699 end do
700 end do
701 if ((chemistry .or. heat_conduction) .and. present(q_t_sf)) then
702 do i = 0, m
703 bc_buffers(2, 1)%sf(i, sys_size + 1, k) = q_t_sf%sf(i, 0, k)
704 bc_buffers(2, 2)%sf(i, sys_size + 1, k) = q_t_sf%sf(i, n, k)
705 end do
706 end if
707 end do
708
709# 308 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
710 if (p > 0) then
711 do k = 1, sys_size
712 do j = 0, n
713 do i = 0, m
714 bc_buffers(3, 1)%sf(i, j, k) = q_prim_vf(k)%sf(i, j, 0)
715 bc_buffers(3, 2)%sf(i, j, k) = q_prim_vf(k)%sf(i, j, p)
716 end do
717 end do
718 end do
719 if ((chemistry .or. heat_conduction) .and. present(q_t_sf)) then
720 do j = 0, n
721 do i = 0, m
722 bc_buffers(3, 1)%sf(i, j, sys_size + 1) = q_t_sf%sf(i, j, 0)
723 bc_buffers(3, 2)%sf(i, j, sys_size + 1) = q_t_sf%sf(i, j, p)
724 end do
725 end do
726 end if
727 end if
728# 327 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
729 end if
730# 329 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
731
733
734 !> Initialize the per-cell boundary condition type arrays with the global default BC values.
735 subroutine s_assign_default_bc_type(bc_type)
736
737 type(integer_field), dimension(1:num_dims,1:2), intent(in) :: bc_type
738
739 bc_type(1, 1)%sf(:,:,:) = int(min(bc_x%beg, 0), kind=1)
740 bc_type(1, 2)%sf(:,:,:) = int(min(bc_x%end, 0), kind=1)
741
742# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
743#if defined(MFC_OpenACC)
744# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
745!$acc update device(bc_type(1, 1)%sf, bc_type(1, 2)%sf)
746# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
747#elif defined(MFC_OpenMP)
748# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
749!$omp target update to(bc_type(1, 1)%sf, bc_type(1, 2)%sf)
750# 339 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
751#endif
752# 340 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
753
754# 342 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
755 if (n > 0) then
756 bc_type(2, 1)%sf(:,:,:) = int(min(bc_y%beg, 0), kind=1)
757 bc_type(2, 2)%sf(:,:,:) = int(min(bc_y%end, 0), kind=1)
758
759# 345 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
760#if defined(MFC_OpenACC)
761# 345 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
762!$acc update device(bc_type(2, 1)%sf, bc_type(2, 2)%sf)
763# 345 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
764#elif defined(MFC_OpenMP)
765# 345 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
766!$omp target update to(bc_type(2, 1)%sf, bc_type(2, 2)%sf)
767# 345 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
768#endif
769# 346 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
770# 347 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
771 if (p > 0) then
772 bc_type(3, 1)%sf(:,:,:) = int(min(bc_z%beg, 0), kind=1)
773 bc_type(3, 2)%sf(:,:,:) = int(min(bc_z%end, 0), kind=1)
774
775# 350 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
776#if defined(MFC_OpenACC)
777# 350 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
778!$acc update device(bc_type(3, 1)%sf, bc_type(3, 2)%sf)
779# 350 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
780#elif defined(MFC_OpenMP)
781# 350 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
782!$omp target update to(bc_type(3, 1)%sf, bc_type(3, 2)%sf)
783# 350 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
784#endif
785# 351 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
786 end if
787# 353 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
788 end if
789# 355 "/home/runner/work/MFC/MFC/src/common/m_boundary_io.fpp"
790
791 end subroutine s_assign_default_bc_type
792
793end module m_boundary_io
Boundary condition restart I/O, capillary/IGR buffer population, and grid-variable buffers.
integer, dimension(1:3, 1:2) mpi_bc_type_type
subroutine s_write_parallel_boundary_condition_files(q_prim_vf, bc_type, q_t_sf)
Write boundary condition type and buffer data to per-rank parallel files using MPI I/O.
integer, dimension(1:3, 1:2) mpi_bc_buffer_type
subroutine s_assign_default_bc_type(bc_type)
Initialize the per-cell boundary condition type arrays with the global default BC values.
subroutine s_read_serial_boundary_condition_files(step_dirpath, bc_type)
Read boundary condition type and buffer data from serial (unformatted) restart files.
impure subroutine s_create_mpi_types(bc_type)
Create MPI derived datatypes for boundary condition type arrays and buffer arrays used in parallel I/...
subroutine s_pack_boundary_condition_buffers(q_prim_vf, q_t_sf)
Pack primitive variable boundary slices into bc_buffers arrays for serialization.
subroutine s_read_parallel_boundary_condition_files(bc_type)
Read boundary condition type and buffer data from per-rank parallel files using MPI I/O.
subroutine s_write_serial_boundary_condition_files(q_prim_vf, bc_type, step_dirpath, old_grid_in, q_t_sf)
Write boundary condition type and buffer data to serial (unformatted) restart files.
Per-cell noncharacteristic boundary condition primitives applied in the ghost cells.
type(scalar_field), dimension(:,:), allocatable bc_buffers
Platform-specific file and directory operations: create, delete, inquire, getcwd, and basename.
impure subroutine my_inquire(fileloc, dircheck)
Inquire on the existence of a directory or file.
impure subroutine s_create_directory(dir_name)
Create a directory and all its parents if it does not exist.
Compile-time constant parameters: default values, tolerances, and physical constants.
Rank-staggered file access delays to prevent I/O contention on parallel file systems.
impure subroutine, public s_delay_file_access(process_rank)
Introduce a rank-dependent busy-wait delay to stagger parallel file access and reduce I/O contention.
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...
integer proc_rank
Rank of the local processor.
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.
Derived type annexing an integer scalar field (SF).
Derived type annexing a scalar field (SF).