MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_start_up.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
2# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
3# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
4# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
5# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
6# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
7# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
8# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
9# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10
11# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
17! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
18! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
19# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
20# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
21# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
22
23# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
25
26# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
27
28# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29
30# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31
32# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33
34# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35
36# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37
38# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39
40# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41! New line at end of file is required for FYPP
42# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
43# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
44# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
45# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
48# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50
51# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54
55# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
57! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
58! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
59# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
60# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
61# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
62
63# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
64# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
65
66# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
67
68# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
69
70# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
71
72# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
73
74# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
75
76# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
77
78# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
79
80# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
81! New line at end of file is required for FYPP
82# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
83
84# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
86# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
88# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 95 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 100 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 105 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 110 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 115 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 120 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117
118# 125 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119
120# 130 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121
122# 135 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123
124# 165 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125
126# 219 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127
128# 233 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 258 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 269 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 271 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135# 282 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 332 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 342 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 352 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142
143# 361 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
144
145# 378 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
146
147# 388 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
148
149# 395 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
150
151# 401 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
152
153# 407 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
154
155# 413 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
156
157# 419 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
158
159# 425 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
160! New line at end of file is required for FYPP
161# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
162# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
163# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
164# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
168# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173
174# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
175# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
176! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
177! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
178# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
179# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
180# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
181
182# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
183# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
184
185# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
186
187# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
188
189# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
190
191# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
192
193# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
194
195# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
196
197# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
198
199# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
200! New line at end of file is required for FYPP
201# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
202
203# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
204
205# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
206
207# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234
235# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236
237# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238
239# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240
241# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
242
243# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
244
245# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
246
247# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
248
249# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
250
251# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
252
253# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
254
255# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
256
257# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
258! New line at end of file is required for FYPP
259# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
260
261! GPU parallel region (scalar reductions, maxval/minval)
262# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263
264! GPU parallel loop over threads (most common GPU macro)
265# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267! Required closing for GPU_PARALLEL_LOOP
268# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
269
270! Mark routine for device compilation
271# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273! Declare device-resident data
274# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
275
276! Inner loop within a GPU parallel region
277# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
278
279! Scoped GPU data region
280# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
281
282! Host code with device pointers (for MPI with GPU buffers)
283# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
284
285! Allocate device memory (unscoped)
286# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
287
288! Free device memory
289# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290
291! Atomic operation on device
292# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
293
294! End atomic capture block
295# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
296
297! Copy data between host and device
298# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
299
300! Synchronization barrier
301# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
302
303! Import GPU library module (openacc or omp_lib)
304# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
305
306! Emit code only for AMD compiler
307# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
308
309! Emit code for non-Cray compilers
310# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
311
312! Emit code only for Cray compiler
313# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
314
315! Emit code for non-NVIDIA compilers
316# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
317
318# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
319# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
320! New line at end of file is required for FYPP
321# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
322
323# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
324
325! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
326! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
327! example see misc/nvidia_uvm/bind.sh.
328# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
329
330! Allocate and create GPU device memory
331# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
332
333! Free GPU device memory and deallocate
334# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
335
336! Cray-specific GPU pointer setup for vector fields
337# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
338
339! Cray-specific GPU pointer setup for scalar fields
340# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
341
342! Cray-specific GPU pointer setup for acoustic source spatials
343# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
344
345# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
346
347# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
348! New line at end of file is required for FYPP
349# 2 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp" 2
350
351!>
352!! @file
353!! @brief Contains module m_start_up
354
355!> @brief Reads and validates user inputs, allocates variables, and configures MPI decomposition and I/O for post-processing
356
358
359 use, intrinsic :: iso_c_binding
360
363 use m_mpi_proxy
364 use m_mpi_common
366 use m_boundary_io
368 use m_eos
369 use m_data_input
370 use m_data_output
372 use m_helper
375 use m_checker
376 use m_thermochem, only: num_species, species_names
379 use m_chemistry
380
381#ifdef MFC_MPI
382 use mpi
383#endif
384
385 implicit none
386
387 include 'fftw3.f03'
388
390 complex(c_double_complex), allocatable :: data_in(:), data_out(:)
391 complex(c_double_complex), allocatable :: data_cmplx(:,:,:), data_cmplx_y(:,:,:), data_cmplx_z(:,:,:)
392 real(wp), allocatable, dimension(:,:,:) :: en_real
393 real(wp), allocatable, dimension(:) :: en
394 integer :: nx, ny, nz, nxloc, nyloc, nyloc2, nzloc, nf
395 integer :: ierr
397 integer, dimension(3) :: cart3d_coords
398 integer, dimension(2) :: cart2d12_coords, cart2d13_coords
400
401contains
402
403 !> Reads the configuration file post_process.inp, in order to populate parameters in module m_global_parameters.f90 with the
404 !! user provided inputs
405 impure subroutine s_read_input_file
406
407 character(LEN=name_len) :: file_loc
408 logical :: file_check
409 integer :: iostatus
410 character(len=1000) :: line
411
412# 1 "/home/runner/work/MFC/MFC/build/include/post_process/generated_namelist.fpp" 1
413! AUTO-GENERATED - do not edit directly. Regenerate: cmake reconfigure
414!
415namelist /user_inputs/ bx0, ca, e_wrt, g, r0ref, re_inv, t_wrt, web, adv_n, alpha_rho_e_wrt, alpha_rho_wrt, alpha_wrt, &
416 & alt_soundspeed, avg_state, bc_x, bc_y, bc_z, bub_pp, bubbles_euler, bubbles_lagrange, c_wrt, case_dir, cf_wrt, &
417 & cfl_adap_dt, cfl_const_dt, cfl_target, chem_wrt_t, chem_wrt_y, cons_vars_wrt, cont_damage, cyl_coord, down_sample, &
418 & fd_order, fft_wrt, file_per_process, fluid_pp, flux_lim, flux_wrt, format, gamma_wrt, heat_ratio_wrt, hyper_cleaning, &
419 & hypoelasticity, ib, ib_force_stride, ib_force_wrt, ib_state_wrt, igr, igr_order, lag_betac_wrt, lag_betat_wrt, lag_db_wrt, &
420 & lag_dphidt_wrt, lag_header, lag_id_wrt, lag_mg_wrt, lag_mv_wrt, lag_pos_prev_wrt, lag_pos_wrt, lag_pres_wrt, lag_r0_wrt, &
421 & lag_rad_wrt, lag_rmax_wrt, lag_rmin_wrt, lag_rvel_wrt, lag_txt_wrt, lag_vel_wrt, liutex_wrt, m, mhd, mixture_err, &
422 & model_eqns, mom_wrt, mpp_lim, muscl_order, n, n_start, nb, num_bc_patches, num_fluids, num_ibs, num_particle_clouds, &
423 & omega_wrt, output_partial_domain, p, parallel_io, particle_cloud, pi_inf_wrt, poly_sigma, polydisperse, polytropic, &
424 & precision, pres_inf_wrt, pres_wrt, prim_vars_wrt, qbmm, qm_wrt, rburn, reactive_burn, recon_type, relativity, relax, &
425 & relax_model, rho_wrt, schlieren_alpha, schlieren_wrt, sigr, sigma, sim_data, surface_tension, t_save, t_step_save, &
426 & t_step_start, t_step_stop, t_stop, thermal, vel_wrt, weno_order, x_output, y_output, z_output
427# 65 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp" 2
428
429 file_loc = 'post_process.inp'
430 inquire (file=trim(file_loc), exist=file_check)
431
432 if (file_check) then
433 open (1, file=trim(file_loc), form='formatted', status='old', action='read')
434 read (1, nml=user_inputs, iostat=iostatus)
435
436 if (iostatus /= 0) then
437 backspace(1)
438 read (1, fmt='(A)') line
439 print *, 'Invalid line in namelist: ' // trim(line)
440 call s_mpi_abort('Invalid line in post_process.inp. It is ' // 'likely due to a datatype mismatch. Exiting.')
441 end if
442
443 close (1)
444
445 call s_update_cell_bounds(cells_bounds, m, n, p)
446
447 if (down_sample) then
448 m = int((m + 1)/3) - 1
449 n = int((n + 1)/3) - 1
450 p = int((p + 1)/3) - 1
451 end if
452
453 m_glb = m
454 n_glb = n
455 p_glb = p
456
457 nglobal = int(m_glb + 1, kind=8)*int(n_glb + 1, kind=8)*int(p_glb + 1, kind=8)
458
459 if (cfl_adap_dt .or. cfl_const_dt) cfl_dt = .true.
460
461 if (any((/bc_x%beg, bc_x%end, bc_y%beg, bc_y%end, bc_z%beg, bc_z%end/) == -17) .or. num_bc_patches > 0) then
462 bc_io = .true.
463 end if
464 else
465 call s_mpi_abort('File post_process.inp is missing. Exiting.')
466 end if
467
468 end subroutine s_read_input_file
469
470 !> Checking that the user inputs make sense, i.e. that the individual choices are compatible with the code's options and that
471 !! the combination of these choices results into a valid configuration for the post-process
472 impure subroutine s_check_input_file
473
474 character(LEN=len_trim(case_dir)) :: file_loc
475 logical :: dir_check
476
477 case_dir = adjustl(case_dir)
478
479 file_loc = trim(case_dir) // '/.'
480
481 call my_inquire(file_loc, dir_check)
482
483 if (dir_check .neqv. .true.) then
484 call s_mpi_abort('Unsupported choice for the value of ' // 'case_dir. Exiting.')
485 end if
486
487 call s_check_inputs_common(check_total_cells=.true., n_global=nglobal)
488 call s_check_inputs()
489
490 end subroutine s_check_input_file
491
492 !> Load grid and conservative data for a time step, fill ghost-cell buffers, and convert to primitive variables.
493 impure subroutine s_perform_time_step(t_step)
494
495 integer, intent(inout) :: t_step
496 integer :: eta_hh, eta_mm, eta_ss
497 real(wp) :: eta_sec
498
499 if (proc_rank == 0) then
500 if (cfl_dt) then
501 eta_sec = wall_time_avg*real(n_save - 1 - t_step, wp)
502 eta_hh = int(eta_sec)/3600
503 eta_mm = mod(int(eta_sec), 3600)/60
504 eta_ss = mod(int(eta_sec), 60)
505 print '(" [", I3, "%] Saving ", I0, " of ", I0, " t/step ", ES9.2, "s (avg ", ES9.2, "s) ETA ", I0, ":", I2.2, ":", I2.2)', &
506 & int(ceiling(100._wp*(real(t_step - n_start)/(n_save)))), t_step, n_save, wall_time, wall_time_avg, eta_hh, &
507 & eta_mm, eta_ss
508 else
509 eta_sec = wall_time_avg*real((t_step_stop - t_step)/t_step_save, wp)
510 eta_hh = int(eta_sec)/3600
511 eta_mm = mod(int(eta_sec), 3600)/60
512 eta_ss = mod(int(eta_sec), 60)
513 print '(" [", I3, "%] Saving ", I0, " of ", I0, " (t_step ", I0, ") t/step ", ES9.2, "s (avg ", ES9.2, "s) ETA ", I0, ":", I2.2, ":", I2.2)', &
514 & int(ceiling(100._wp*(real(t_step - t_step_start)/(t_step_stop - t_step_start + 1)))), &
515 & (t_step - t_step_start)/t_step_save + 1, (t_step_stop - t_step_start)/t_step_save + 1, t_step, wall_time, &
516 & wall_time_avg, eta_hh, eta_mm, eta_ss
517 end if
518 end if
519
520 call s_read_data_files(t_step)
521
522 ! seed the chemistry temperature over the INTERIOR only (mirrors the simulation,
523 ! m_start_up): the ghost q_cons is unread at this point, so a ghost-inclusive sweep
524 ! would Newton-iterate on garbage (NaN under NaN-init builds) at rank seams and
525 ! physical boundaries; s_populate_variables_buffers below extends q_T into the ghosts
526 if (chemistry) call s_compute_q_t_sf(q_t_sf, q_cons_vf, idwint)
527
528 if (buff_size > 0) then
529 if (n == 0) then
531 else if (p == 0) then
533 else
535 end if
537 end if
538
540
541 end subroutine s_perform_time_step
542
543 !> Derive requested flow quantities from primitive variables and write them to the formatted database files.
544 impure subroutine s_save_data(t_step, varname, pres, c)
545
546 integer, intent(inout) :: t_step
547 character(LEN=name_len), intent(inout) :: varname
548 real(wp), intent(inout) :: pres, c
549
550 real(wp), dimension(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end, & & -offset_z%beg:p + offset_z%end) :: liutex_mag
551 real(wp), dimension(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end,-offset_z%beg:p + offset_z%end, & & 3) :: liutex_axis
552 integer :: i, j, k, l, kx, ky, kz, kf, j_glb, k_glb, l_glb
553 character(50) :: filename
554 logical :: file_exists
555 real(wp), dimension(num_fluids) :: alpha_rho
556 real(wp) :: t
557 integer :: x_beg, x_end, y_beg, y_end, z_beg, z_end
558
559 if (output_partial_domain) then
561 x_beg = -offset_x%beg + x_output_idx%beg
562 x_end = offset_x%end + x_output_idx%end
563 y_beg = -offset_y%beg + y_output_idx%beg
564 y_end = offset_y%end + y_output_idx%end
565 z_beg = -offset_z%beg + z_output_idx%beg
566 z_end = offset_z%end + z_output_idx%end
567 else
568 x_beg = -offset_x%beg
569 x_end = offset_x%end + m
570 y_beg = -offset_y%beg
571 y_end = offset_y%end + n
572 z_beg = -offset_z%beg
573 z_end = offset_z%end + p
574 end if
575
577
578 if (sim_data .and. proc_rank == 0) then
581 end if
582
583 if (sim_data) then
586 end if
587
589
590 if (omega_wrt(2) .or. omega_wrt(3) .or. qm_wrt .or. liutex_wrt .or. schlieren_wrt) then
592 end if
593
594 if (omega_wrt(1) .or. omega_wrt(3) .or. qm_wrt .or. liutex_wrt .or. (n > 0 .and. schlieren_wrt)) then
596 end if
597
598 if (omega_wrt(1) .or. omega_wrt(2) .or. qm_wrt .or. liutex_wrt .or. (p > 0 .and. schlieren_wrt)) then
600 end if
601
602 if ((model_eqns == model_eqns_5eq) .or. (model_eqns == model_eqns_6eq)) then
603 do i = 1, num_fluids
604 if (alpha_rho_wrt(i) .or. (cons_vars_wrt .or. prim_vars_wrt)) then
605 write (varname, '(A,I0)') 'alpha_rho', i
606 call s_write_field(varname, t_step, q_cons_vf(i), x_beg, x_end, y_beg, y_end, z_beg, z_end)
607 end if
608 end do
609 end if
610
611 if ((rho_wrt .or. (model_eqns == model_eqns_gamma_law .and. (cons_vars_wrt .or. prim_vars_wrt))) .and. (.not. relativity)) &
612 & then
613 out%q_sf(:,:,:) = rho_sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
614 write (varname, '(A)') 'rho'
615 call s_write_field(varname, t_step)
616 end if
617
618 if (relativity .and. (rho_wrt .or. prim_vars_wrt)) then
619 write (varname, '(A)') 'rho'
620 call s_write_field(varname, t_step, q_prim_vf(1), x_beg, x_end, y_beg, y_end, z_beg, z_end)
621 end if
622
623 if (relativity .and. (rho_wrt .or. cons_vars_wrt)) then
624 ! For relativistic flow, conservative and primitive densities are different Hard-coded single-component for now
625 write (varname, '(A)') 'D'
626 call s_write_field(varname, t_step, q_cons_vf(1), x_beg, x_end, y_beg, y_end, z_beg, z_end)
627 end if
628
629 do i = 1, eqn_idx%E - eqn_idx%mom%beg
630 if (mom_wrt(i) .or. cons_vars_wrt) then
631 write (varname, '(A,I0)') 'mom', i
632 call s_write_field(varname, t_step, q_cons_vf(i + eqn_idx%cont%end), x_beg, x_end, y_beg, y_end, z_beg, z_end)
633 end if
634 end do
635
636 do i = 1, eqn_idx%E - eqn_idx%mom%beg
637 if (vel_wrt(i) .or. prim_vars_wrt) then
638 write (varname, '(A,I0)') 'vel', i
639 call s_write_field(varname, t_step, q_prim_vf(i + eqn_idx%cont%end), x_beg, x_end, y_beg, y_end, z_beg, z_end)
640 end if
641 end do
642
643 if (chemistry) then
644 do i = 1, num_species
645 if (chem_wrt_y(i) .or. prim_vars_wrt) then
646 write (varname, '(A,A)') 'Y_', trim(species_names(i))
647 call s_write_field(varname, t_step, q_prim_vf(eqn_idx%species%beg + i - 1), x_beg, x_end, y_beg, y_end, &
648 & z_beg, z_end)
649 end if
650 end do
651
652 if (chem_wrt_t) then
653 out%q_sf(:,:,:) = q_t_sf%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
654 write (varname, '(A)') 'T'
655 call s_write_field(varname, t_step)
656 end if
657 end if
658
659 do i = 1, eqn_idx%E - eqn_idx%mom%beg
660 if (flux_wrt(i)) then
661 call s_derive_flux_limiter(i, q_prim_vf, out%q_sf)
662 write (varname, '(A,I0)') 'flux', i
663 call s_write_field(varname, t_step)
664 end if
665 end do
666
667 if (e_wrt .or. cons_vars_wrt) then
668 write (varname, '(A)') 'E'
669 call s_write_field(varname, t_step, q_cons_vf(eqn_idx%E), x_beg, x_end, y_beg, y_end, z_beg, z_end)
670 end if
671
672 if (model_eqns == model_eqns_6eq) then
673 do i = 1, num_fluids
674 if (alpha_rho_e_wrt(i) .or. cons_vars_wrt) then
675 write (varname, '(A,I0)') 'alpha_rho_e', i
676 call s_write_field(varname, t_step, q_cons_vf(i + eqn_idx%int_en%beg - 1), x_beg, x_end, y_beg, y_end, z_beg, &
677 & z_end)
678 end if
679 end do
680 end if
681
682 if (fft_wrt) then
683 do l = 0, p
684 do k = 0, n
685 do j = 0, m
686 data_cmplx(j + 1, k + 1, l + 1) = cmplx(q_cons_vf(eqn_idx%mom%beg)%sf(j, k, l)/q_cons_vf(1)%sf(j, k, l), &
687 & 0._wp)
688 end do
689 end do
690 end do
691
692 call s_mpi_fft_fwd()
693
694 en_real = 0.5_wp*abs(data_cmplx_z)**2._wp/(1._wp*nx*ny*nz)**2._wp
695
696 do l = 0, p
697 do k = 0, n
698 do j = 0, m
699 data_cmplx(j + 1, k + 1, l + 1) = cmplx(q_cons_vf(eqn_idx%mom%beg + 1)%sf(j, k, l)/q_cons_vf(1)%sf(j, k, &
700 & l), 0._wp)
701 end do
702 end do
703 end do
704
705 call s_mpi_fft_fwd()
706
707 en_real = en_real + 0.5_wp*abs(data_cmplx_z)**2._wp/(1._wp*nx*ny*nz)**2._wp
708
709 do l = 0, p
710 do k = 0, n
711 do j = 0, m
712 data_cmplx(j + 1, k + 1, l + 1) = cmplx(q_cons_vf(eqn_idx%mom%beg + 2)%sf(j, k, l)/q_cons_vf(1)%sf(j, k, &
713 & l), 0._wp)
714 end do
715 end do
716 end do
717
718 call s_mpi_fft_fwd()
719
720 en_real = en_real + 0.5_wp*abs(data_cmplx_z)**2._wp/(1._wp*nx*ny*nz)**2._wp
721
722 do kf = 1, nf
723 en(kf) = 0._wp
724 end do
725
726 do l = 1, nz
727 do k = 1, nyloc2
728 do j = 1, nxloc
729 j_glb = j + cart3d_coords(2)*nxloc
730 k_glb = k + cart3d_coords(3)*nyloc2
731 l_glb = l
732
733 if (j_glb >= (m_glb + 1)/2) then
734 kx = (j_glb - 1) - (m_glb + 1)
735 else
736 kx = j_glb - 1
737 end if
738
739 if (k_glb >= (n_glb + 1)/2) then
740 ky = (k_glb - 1) - (n_glb + 1)
741 else
742 ky = k_glb - 1
743 end if
744
745 if (l_glb >= (p_glb + 1)/2) then
746 kz = (l_glb - 1) - (p_glb + 1)
747 else
748 kz = l_glb - 1
749 end if
750
751 kf = nint(sqrt(kx**2._wp + ky**2._wp + kz**2._wp)) + 1
752
753 en(kf) = en(kf) + en_real(j, k, l)
754 end do
755 end do
756 end do
757
758#ifdef MFC_MPI
759 call mpi_allreduce(mpi_in_place, en, nf, mpi_p, mpi_sum, mpi_comm_world, ierr)
760#endif
761
762 if (proc_rank == 0) then
763 call s_create_directory('En_FFT_DATA')
764 write (filename, '(a,i0,a)') 'En_FFT_DATA/En_tot', t_step, '.dat'
765 inquire (file=filename, exist=file_exists)
766 if (file_exists) then
767 call s_delete_file(trim(filename))
768 end if
769 end if
770
771 do kf = 1, nf
772 if (proc_rank == 0) then
773 write (filename, '(a,i0,a)') 'En_FFT_DATA/En_tot', t_step, '.dat'
774 inquire (file=filename, exist=file_exists)
775 if (file_exists) then
776 open (1, file=filename, position='append', status='old')
777 write (1, *) en(kf), t_step
778 close (1)
779 else
780 open (1, file=filename, status='new')
781 write (1, *) en(kf), t_step
782 close (1)
783 end if
784 end if
785 end do
786 end if
787
788 if (mhd .and. prim_vars_wrt) then
789 do i = eqn_idx%B%beg, eqn_idx%B%end
790 ! 1D: output By, Bz
791 if (n == 0) then
792 if (i == eqn_idx%B%beg) then
793 write (varname, '(A)') 'By'
794 else
795 write (varname, '(A)') 'Bz'
796 end if
797 ! 2D/3D: output Bx, By, Bz
798 else
799 if (i == eqn_idx%B%beg) then
800 write (varname, '(A)') 'Bx'
801 else if (i == eqn_idx%B%beg + 1) then
802 write (varname, '(A)') 'By'
803 else
804 write (varname, '(A)') 'Bz'
805 end if
806 end if
807 call s_write_field(varname, t_step, q_prim_vf(i), x_beg, x_end, y_beg, y_end, z_beg, z_end)
808 end do
809 end if
810
811 if (hypoelasticity) then
812 do i = 1, eqn_idx%stress%end - eqn_idx%stress%beg + 1
813 if (prim_vars_wrt) then
814 write (varname, '(A,I0)') 'tau', i
815 call s_write_field(varname, t_step, q_prim_vf(i - 1 + eqn_idx%stress%beg), x_beg, x_end, y_beg, y_end, z_beg, &
816 & z_end)
817 end if
818 end do
819 end if
820
821 if (cont_damage) then
822 write (varname, '(A)') 'damage_state'
823 call s_write_field(varname, t_step, q_prim_vf(eqn_idx%damage), x_beg, x_end, y_beg, y_end, z_beg, z_end)
824 end if
825
826 if (hyper_cleaning) then
827 write (varname, '(A)') 'psi'
828 call s_write_field(varname, t_step, q_cons_vf(eqn_idx%psi), x_beg, x_end, y_beg, y_end, z_beg, z_end)
829 end if
830
831 if (pres_wrt .or. prim_vars_wrt) then
832 write (varname, '(A)') 'pres'
833 call s_write_field(varname, t_step, q_prim_vf(eqn_idx%E), x_beg, x_end, y_beg, y_end, z_beg, z_end)
834 end if
835
836 if (((model_eqns == model_eqns_5eq) .and. (bubbles_euler .neqv. .true.)) .or. (model_eqns == model_eqns_6eq)) then
837 do i = 1, num_fluids - 1
838 if (alpha_wrt(i) .or. (cons_vars_wrt .or. prim_vars_wrt)) then
839 write (varname, '(A,I0)') 'alpha', i
840 call s_write_field(varname, t_step, q_cons_vf(i + eqn_idx%E), x_beg, x_end, y_beg, y_end, z_beg, z_end)
841 end if
842 end do
843
844 if (alpha_wrt(num_fluids) .or. (cons_vars_wrt .or. prim_vars_wrt)) then
845 if (igr) then
846 do k = z_beg, z_end
847 do j = y_beg, y_end
848 do i = x_beg, x_end
849 out%q_sf(i, j, k) = 1._wp
850 do l = 1, num_fluids - 1
851 out%q_sf(i, j, k) = out%q_sf(i, j, k) - q_cons_vf(eqn_idx%E + l)%sf(i, j, k)
852 end do
853 end do
854 end do
855 end do
856 else
857 out%q_sf(:,:,:) = q_cons_vf(eqn_idx%adv%end)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
858 end if
859 write (varname, '(A,I0)') 'alpha', num_fluids
860 call s_write_field(varname, t_step)
861 end if
862 end if
863
864 if (gamma_wrt .or. (model_eqns == model_eqns_gamma_law .and. (cons_vars_wrt .or. prim_vars_wrt))) then
865 out%q_sf(:,:,:) = gamma_sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
866 write (varname, '(A)') 'gamma'
867 call s_write_field(varname, t_step)
868 end if
869
870 if (heat_ratio_wrt) then
872 write (varname, '(A)') 'heat_ratio'
873 call s_write_field(varname, t_step)
874 end if
875
876 if (pi_inf_wrt .or. (model_eqns == model_eqns_gamma_law .and. (cons_vars_wrt .or. prim_vars_wrt))) then
877 out%q_sf(:,:,:) = pi_inf_sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
878 write (varname, '(A)') 'pi_inf'
879 call s_write_field(varname, t_step)
880 end if
881
882 if (pres_inf_wrt) then
884 write (varname, '(A)') 'pres_inf'
885 call s_write_field(varname, t_step)
886 end if
887
888 if (c_wrt) then
889 do k = -offset_z%beg, p + offset_z%end
890 do j = -offset_y%beg, n + offset_y%end
891 do i = -offset_x%beg, m + offset_x%end
892 do l = 1, eqn_idx%adv%end - eqn_idx%E
893 adv(l) = q_prim_vf(eqn_idx%E + l)%sf(i, j, k)
894 alpha_rho(l) = q_prim_vf(eqn_idx%cont%beg + l - 1)%sf(i, j, k)
895 end do
896
897 pres = q_prim_vf(eqn_idx%E)%sf(i, j, k)
898
899 call s_compute_speed_of_sound(pres, rho_sf(i, j, k), gamma_sf(i, j, k), pi_inf_sf(i, j, k), adv, c, &
900 & alpha_rho)
901
902 out%q_sf(i, j, k) = c
903 end do
904 end do
905 end do
906
907 write (varname, '(A)') 'c'
908 call s_write_field(varname, t_step)
909 end if
910
911 if (t_wrt) then
912 do l = 1, num_fluids
913 do k = -offset_z%beg, p + offset_z%end
914 do j = -offset_y%beg, n + offset_y%end
915 do i = -offset_x%beg, m + offset_x%end
916 call s_phase_temperature(q_prim_vf(eqn_idx%cont%beg + l - 1)%sf(i, j, &
917 & k)/max(q_prim_vf(eqn_idx%E + l)%sf(i, j, k), sgm_eps), &
918 & q_prim_vf(eqn_idx%E)%sf(i, j, k), l, t)
919 out%q_sf(i, j, k) = t
920 end do
921 end do
922 end do
923 write (varname, '(A,I0)') 'T', l
924 call s_write_field(varname, t_step)
925 end do
926 end if
927
928 do i = 1, 3
929 if (omega_wrt(i)) then
931 write (varname, '(A,I0)') 'omega', i
932 call s_write_field(varname, t_step)
933 end if
934 end do
935
936 if (ib) then
937 out%q_sf(:,:,:) = real(ib_markers%sf(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end, &
938 & -offset_z%beg:p + offset_z%end), wp)
939 varname = 'ib_markers'
940 call s_write_field(varname, t_step)
941 end if
942
943 if (p > 0 .and. qm_wrt) then
944 call s_derive_qm(q_prim_vf, out%q_sf)
945 write (varname, '(A)') 'qm'
946 call s_write_field(varname, t_step)
947 end if
948
949 if (liutex_wrt) then
950 call s_derive_liutex(q_prim_vf, liutex_mag, liutex_axis)
951
952 out%q_sf = liutex_mag
953 write (varname, '(A)') 'liutex_mag'
954 call s_write_field(varname, t_step)
955
956 do i = 1, 3
957 out%q_sf = liutex_axis(:,:,:,i)
958 write (varname, '(A,I0)') 'liutex_axis', i
959 call s_write_field(varname, t_step)
960 end do
961 end if
962
963 if (schlieren_wrt) then
965 write (varname, '(A)') 'schlieren'
966 call s_write_field(varname, t_step)
967 end if
968
969 if (cf_wrt) then
970 write (varname, '(A,I0)') 'color_function'
971 call s_write_field(varname, t_step, q_cons_vf(eqn_idx%c), x_beg, x_end, y_beg, y_end, z_beg, z_end)
972 end if
973
974 if (bubbles_euler) then
975 do i = eqn_idx%adv%beg, eqn_idx%adv%end
976 write (varname, '(A,I0)') 'alpha', i - eqn_idx%E
977 call s_write_field(varname, t_step, q_cons_vf(i), x_beg, x_end, y_beg, y_end, z_beg, z_end)
978 end do
979 end if
980
981 if (bubbles_euler) then
982 ! nR
983 do i = 1, nb
984 write (varname, '(A,I3.3)') 'nR', i
985 call s_write_field(varname, t_step, q_cons_vf(qbmm_idx%rs(i)), x_beg, x_end, y_beg, y_end, z_beg, z_end)
986 end do
987
988 ! nRdot
989 do i = 1, nb
990 write (varname, '(A,I3.3)') 'nV', i
991 call s_write_field(varname, t_step, q_cons_vf(qbmm_idx%vs(i)), x_beg, x_end, y_beg, y_end, z_beg, z_end)
992 end do
993 if ((polytropic .neqv. .true.) .and. (.not. qbmm)) then
994 ! nP
995 do i = 1, nb
996 write (varname, '(A,I3.3)') 'nP', i
997 call s_write_field(varname, t_step, q_cons_vf(qbmm_idx%ps(i)), x_beg, x_end, y_beg, y_end, z_beg, z_end)
998 end do
999
1000 ! nM
1001 do i = 1, nb
1002 write (varname, '(A,I3.3)') 'nM', i
1003 call s_write_field(varname, t_step, q_cons_vf(qbmm_idx%ms(i)), x_beg, x_end, y_beg, y_end, z_beg, z_end)
1004 end do
1005 end if
1006
1007 ! number density
1008 if (adv_n) then
1009 write (varname, '(A)') 'n'
1010 call s_write_field(varname, t_step, q_cons_vf(eqn_idx%n), x_beg, x_end, y_beg, y_end, z_beg, z_end)
1011 end if
1012 end if
1013
1014 if (bubbles_lagrange) then
1015 ! Void fraction field
1016 out%q_sf(:,:,:) = 1._wp - q_cons_vf(beta_idx)%sf(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end, &
1017 & -offset_z%beg:p + offset_z%end)
1018 write (varname, '(A)') 'voidFraction'
1019 call s_write_field(varname, t_step)
1020
1021 if (lag_txt_wrt) call s_write_lag_bubbles_results_to_text(t_step) ! text output
1022 if (lag_db_wrt) call s_write_lag_bubbles_to_formatted_database_file(t_step) ! silo file output
1023 end if
1024
1025 if (ib_state_wrt) call s_write_ib_bodies_to_formatted_database_file(t_step)
1026
1027 if (sim_data .and. proc_rank == 0) then
1030 end if
1031
1033
1034 end subroutine s_save_data
1035
1036 !> Fill out%q_sf from src (if given), write varname to the database, and clear varname.
1037 !! @param varname field name (set by caller); blanked on return
1038 !! @param t_step current time step
1039 !! @param src optional scalar_field to slice into out%q_sf
1040 !! @param x_beg, x_end, y_beg, y_end, z_beg, z_end output region bounds (required if src present)
1041 impure subroutine s_write_field(varname, t_step, src, x_beg, x_end, y_beg, y_end, z_beg, z_end)
1042
1043 character(LEN=name_len), intent(inout) :: varname
1044 integer, intent(in) :: t_step
1045 type(scalar_field), intent(in), optional :: src
1046 integer, intent(in), optional :: x_beg, x_end, y_beg, y_end, z_beg, z_end
1047
1048 if (present(src)) then
1049 if (.not. (present(x_beg) .and. present(x_end) .and. present(y_beg) .and. present(y_end) .and. present(z_beg) .and. present(z_end))) then
1050# 688 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1051 call s_mpi_abort("m_start_up.fpp:688: " // .and..and..and..and..and."Assertion failed: present(x_beg) present(x_end) present(y_beg) present(y_end) present(z_beg) present(z_end). " &
1052# 688 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1053 & // "s_write_field: src requires all six output bounds")
1054# 688 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1055 end if
1056# 690 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1057 out%q_sf(:,:,:) = src%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
1058 end if
1060 varname(:) = ' '
1061
1062 end subroutine s_write_field
1063
1064 !> Transpose 3-D complex data from x-pencil to y-pencil layout via MPI_Alltoall.
1065 subroutine s_mpi_transpose_x2y
1066
1067 complex(c_double_complex), allocatable :: sendbuf(:), recvbuf(:)
1068 integer :: dest_rank, src_rank
1069 integer :: i, j, k, l
1070
1071#ifdef MFC_MPI
1072 allocate (sendbuf(nx*nyloc*nzloc))
1073 allocate (recvbuf(nx*nyloc*nzloc))
1074
1075 do dest_rank = 0, num_procs_y - 1
1076 do l = 1, nzloc
1077 do k = 1, nyloc
1078 do j = 1, nxloc
1079 sendbuf(j + (k - 1)*nxloc + (l - 1)*nxloc*nyloc + dest_rank*nxloc*nyloc*nzloc) = data_cmplx(j &
1080 & + dest_rank*nxloc, k, l)
1081 end do
1082 end do
1083 end do
1084 end do
1085
1086 call mpi_alltoall(sendbuf, nxloc*nyloc*nzloc, mpi_c_double_complex, recvbuf, nxloc*nyloc*nzloc, mpi_c_double_complex, &
1088
1089 do src_rank = 0, num_procs_y - 1
1090 do l = 1, nzloc
1091 do k = 1, nyloc
1092 do j = 1, nxloc
1093 data_cmplx_y(j, k + src_rank*nyloc, &
1094 & l) = recvbuf(j + (k - 1)*nxloc + (l - 1)*nxloc*nyloc + src_rank*nxloc*nyloc*nzloc)
1095 end do
1096 end do
1097 end do
1098 end do
1099
1100 deallocate (sendbuf)
1101 deallocate (recvbuf)
1102#endif
1103
1104 end subroutine s_mpi_transpose_x2y
1105
1106 !> Transpose 3-D complex data from y-pencil to z-pencil layout via MPI_Alltoall.
1107 subroutine s_mpi_transpose_y2z
1108
1109 complex(c_double_complex), allocatable :: sendbuf(:), recvbuf(:)
1110 integer :: dest_rank, src_rank
1111 integer :: j, k, l
1112
1113#ifdef MFC_MPI
1114 allocate (sendbuf(ny*nxloc*nzloc))
1115 allocate (recvbuf(ny*nxloc*nzloc))
1116
1117 do dest_rank = 0, num_procs_z - 1
1118 do l = 1, nzloc
1119 do j = 1, nxloc
1120 do k = 1, nyloc2
1121 sendbuf(k + (j - 1)*nyloc2 + (l - 1)*(nyloc2*nxloc) + dest_rank*nyloc2*nxloc*nzloc) = data_cmplx_y(j, &
1122 & k + dest_rank*nyloc2, l)
1123 end do
1124 end do
1125 end do
1126 end do
1127
1128 call mpi_alltoall(sendbuf, nyloc2*nxloc*nzloc, mpi_c_double_complex, recvbuf, nyloc2*nxloc*nzloc, mpi_c_double_complex, &
1130
1131 do src_rank = 0, num_procs_z - 1
1132 do l = 1, nzloc
1133 do j = 1, nxloc
1134 do k = 1, nyloc2
1135 data_cmplx_z(j, k, &
1136 & l + src_rank*nzloc) = recvbuf(k + (j - 1)*nyloc2 + (l - 1)*(nyloc2*nxloc) &
1137 & + src_rank*nyloc2*nxloc*nzloc)
1138 end do
1139 end do
1140 end do
1141 end do
1142
1143 deallocate (sendbuf)
1144 deallocate (recvbuf)
1145#endif
1146
1147 end subroutine s_mpi_transpose_y2z
1148
1149 !> Initialize all post-process sub-modules, set up I/O pointers, and prepare FFTW plans and MPI communicators.
1150 impure subroutine s_initialize_modules
1151
1152 integer :: size_n(1), inembed(1), onembed(1)
1153
1155 if (bubbles_euler .or. bubbles_lagrange) then
1157 end if
1158 if (num_procs > 1) then
1160 call s_initialize_mpi_common_module(exchange_all_chemistry_temperatures_in=.true., use_rdma_transport_in=.false.)
1161 end if
1164 call s_initialize_variables_conversion_module(store_mixture_fields=.true., lagrange_beta_index=beta_idx)
1168
1169 if (parallel_io .neqv. .true.) then
1171 else
1173 end if
1174
1175#ifdef MFC_MPI
1176 if (fft_wrt) then
1177 num_procs_x = (m_glb + 1)/(m + 1)
1178 num_procs_y = (n_glb + 1)/(n + 1)
1179 num_procs_z = (p_glb + 1)/(p + 1)
1180
1181 nx = m_glb + 1
1182 ny = n_glb + 1
1183 nz = p_glb + 1
1184
1185 nxloc = (m_glb + 1)/num_procs_y
1186 nyloc = n + 1
1187 nyloc2 = (n_glb + 1)/num_procs_z
1188 nzloc = p + 1
1189
1190 nf = max(nx, ny, nz)
1191
1192#ifdef MFC_DEBUG
1193# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1194 block
1195# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1196 use iso_fortran_env, only: output_unit
1197# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1198
1199# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1200 print *, 'm_start_up.fpp:825: ', '@:ALLOCATE(data_in(Nx*Nyloc*Nzloc))'
1201# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1202
1203# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1204 call flush (output_unit)
1205# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1206 end block
1207# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1208#endif
1209# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1210 allocate (data_in(nx*nyloc*nzloc))
1211# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1212
1213# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1214
1215# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1216#if defined(MFC_OpenACC)
1217# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1218!$acc enter data create(data_in)
1219# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1220#elif defined(MFC_OpenMP)
1221# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1222!$omp target enter data map(always,alloc:data_in)
1223# 825 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1224#endif
1225# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1226#ifdef MFC_DEBUG
1227# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1228 block
1229# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1230 use iso_fortran_env, only: output_unit
1231# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1232
1233# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1234 print *, 'm_start_up.fpp:826: ', '@:ALLOCATE(data_out(Nx*Nyloc*Nzloc))'
1235# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1236
1237# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1238 call flush (output_unit)
1239# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1240 end block
1241# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1242#endif
1243# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1244 allocate (data_out(nx*nyloc*nzloc))
1245# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1246
1247# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1248
1249# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1250#if defined(MFC_OpenACC)
1251# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1252!$acc enter data create(data_out)
1253# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1254#elif defined(MFC_OpenMP)
1255# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1256!$omp target enter data map(always,alloc:data_out)
1257# 826 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1258#endif
1259# 827 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1260
1261#ifdef MFC_DEBUG
1262# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1263 block
1264# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1265 use iso_fortran_env, only: output_unit
1266# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1267
1268# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1269 print *, 'm_start_up.fpp:828: ', '@:ALLOCATE(data_cmplx(Nx, Nyloc, Nzloc))'
1270# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1271
1272# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1273 call flush (output_unit)
1274# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1275 end block
1276# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1277#endif
1278# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1279 allocate (data_cmplx(nx, nyloc, nzloc))
1280# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1281
1282# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1283
1284# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1285#if defined(MFC_OpenACC)
1286# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1287!$acc enter data create(data_cmplx)
1288# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1289#elif defined(MFC_OpenMP)
1290# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1291!$omp target enter data map(always,alloc:data_cmplx)
1292# 828 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1293#endif
1294# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1295#ifdef MFC_DEBUG
1296# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1297 block
1298# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1299 use iso_fortran_env, only: output_unit
1300# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1301
1302# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1303 print *, 'm_start_up.fpp:829: ', '@:ALLOCATE(data_cmplx_y(Nxloc, Ny, Nzloc))'
1304# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1305
1306# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1307 call flush (output_unit)
1308# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1309 end block
1310# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1311#endif
1312# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1313 allocate (data_cmplx_y(nxloc, ny, nzloc))
1314# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1315
1316# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1317
1318# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1319#if defined(MFC_OpenACC)
1320# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1321!$acc enter data create(data_cmplx_y)
1322# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1323#elif defined(MFC_OpenMP)
1324# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1325!$omp target enter data map(always,alloc:data_cmplx_y)
1326# 829 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1327#endif
1328# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1329#ifdef MFC_DEBUG
1330# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1331 block
1332# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1333 use iso_fortran_env, only: output_unit
1334# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1335
1336# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1337 print *, 'm_start_up.fpp:830: ', '@:ALLOCATE(data_cmplx_z(Nxloc, Nyloc2, Nz))'
1338# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1339
1340# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1341 call flush (output_unit)
1342# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1343 end block
1344# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1345#endif
1346# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1347 allocate (data_cmplx_z(nxloc, nyloc2, nz))
1348# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1349
1350# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1351
1352# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1353#if defined(MFC_OpenACC)
1354# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1355!$acc enter data create(data_cmplx_z)
1356# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1357#elif defined(MFC_OpenMP)
1358# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1359!$omp target enter data map(always,alloc:data_cmplx_z)
1360# 830 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1361#endif
1362# 831 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1363
1364#ifdef MFC_DEBUG
1365# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1366 block
1367# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1368 use iso_fortran_env, only: output_unit
1369# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1370
1371# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1372 print *, 'm_start_up.fpp:832: ', '@:ALLOCATE(En_real(Nxloc, Nyloc2, Nz))'
1373# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1374
1375# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1376 call flush (output_unit)
1377# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1378 end block
1379# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1380#endif
1381# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1382 allocate (en_real(nxloc, nyloc2, nz))
1383# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1384
1385# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1386
1387# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1388#if defined(MFC_OpenACC)
1389# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1390!$acc enter data create(En_real)
1391# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1392#elif defined(MFC_OpenMP)
1393# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1394!$omp target enter data map(always,alloc:En_real)
1395# 832 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1396#endif
1397# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1398#ifdef MFC_DEBUG
1399# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1400 block
1401# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1402 use iso_fortran_env, only: output_unit
1403# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1404
1405# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1406 print *, 'm_start_up.fpp:833: ', '@:ALLOCATE(En(Nf))'
1407# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1408
1409# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1410 call flush (output_unit)
1411# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1412 end block
1413# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1414#endif
1415# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1416 allocate (en(nf))
1417# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1418
1419# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1420
1421# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1422#if defined(MFC_OpenACC)
1423# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1424!$acc enter data create(En)
1425# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1426#elif defined(MFC_OpenMP)
1427# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1428!$omp target enter data map(always,alloc:En)
1429# 833 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1430#endif
1431# 834 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1432
1433 size_n(1) = nx
1434 inembed(1) = nx
1435 onembed(1) = nx
1436
1437 fwd_plan_x = fftw_plan_many_dft(1, size_n, nyloc*nzloc, data_in, inembed, 1, nx, data_out, onembed, 1, nx, &
1438 & fftw_forward, fftw_measure)
1439
1440 size_n(1) = ny
1441 inembed(1) = ny
1442 onembed(1) = ny
1443
1444 fwd_plan_y = fftw_plan_many_dft(1, size_n, nxloc*nzloc, data_out, inembed, 1, ny, data_in, onembed, 1, ny, &
1445 & fftw_forward, fftw_measure)
1446
1447 size_n(1) = nz
1448 inembed(1) = nz
1449 onembed(1) = nz
1450
1451 fwd_plan_z = fftw_plan_many_dft(1, size_n, nxloc*nyloc2, data_in, inembed, 1, nz, data_out, onembed, 1, nz, &
1452 & fftw_forward, fftw_measure)
1453
1454 call mpi_cart_create(mpi_comm_world, 3, (/num_procs_x, num_procs_y, num_procs_z/), (/.true., .true., .true./), &
1455 & .false., mpi_comm_cart, ierr)
1456 call mpi_cart_coords(mpi_comm_cart, proc_rank, 3, cart3d_coords, ierr)
1457
1458 call mpi_cart_sub(mpi_comm_cart, (/.true., .true., .false./), mpi_comm_cart12, ierr)
1459 call mpi_comm_rank(mpi_comm_cart12, proc_rank12, ierr)
1460 call mpi_cart_coords(mpi_comm_cart12, proc_rank12, 2, cart2d12_coords, ierr)
1461
1462 call mpi_cart_sub(mpi_comm_cart, (/.true., .false., .true./), mpi_comm_cart13, ierr)
1463 call mpi_comm_rank(mpi_comm_cart13, proc_rank13, ierr)
1464 call mpi_cart_coords(mpi_comm_cart13, proc_rank13, 2, cart2d13_coords, ierr)
1465 end if
1466#endif
1467
1468 end subroutine s_initialize_modules
1469
1470 !> Perform a distributed forward 3-D FFT using pencil decomposition with FFTW and MPI transposes.
1471 subroutine s_mpi_fft_fwd
1472
1473 integer :: j, k, l
1474
1475#ifdef MFC_MPI
1476 do l = 1, nzloc
1477 do k = 1, nyloc
1478 do j = 1, nx
1479 data_in(j + (k - 1)*nx + (l - 1)*nx*nyloc) = data_cmplx(j, k, l)
1480 end do
1481 end do
1482 end do
1483
1484 call fftw_execute_dft(fwd_plan_x, data_in, data_out)
1485
1486 do l = 1, nzloc
1487 do k = 1, nyloc
1488 do j = 1, nx
1489 data_cmplx(j, k, l) = data_out(j + (k - 1)*nx + (l - 1)*nx*nyloc)
1490 end do
1491 end do
1492 end do
1493
1494 call s_mpi_transpose_x2y !!Change Pencil from data_cmplx to data_cmpx_y
1495
1496 do l = 1, nzloc
1497 do k = 1, nxloc
1498 do j = 1, ny
1499 data_out(j + (k - 1)*ny + (l - 1)*ny*nxloc) = data_cmplx_y(k, j, l)
1500 end do
1501 end do
1502 end do
1503
1504 call fftw_execute_dft(fwd_plan_y, data_out, data_in)
1505
1506 do l = 1, nzloc
1507 do k = 1, nxloc
1508 do j = 1, ny
1509 data_cmplx_y(k, j, l) = data_in(j + (k - 1)*ny + (l - 1)*ny*nxloc)
1510 end do
1511 end do
1512 end do
1513
1514 call s_mpi_transpose_y2z !!Change Pencil from data_cmplx_y to data_cmpx_z
1515
1516 do l = 1, nyloc2
1517 do k = 1, nxloc
1518 do j = 1, nz
1519 data_in(j + (k - 1)*nz + (l - 1)*nz*nxloc) = data_cmplx_z(k, l, j)
1520 end do
1521 end do
1522 end do
1523
1524 call fftw_execute_dft(fwd_plan_z, data_in, data_out)
1525
1526 do l = 1, nyloc2
1527 do k = 1, nxloc
1528 do j = 1, nz
1529 data_cmplx_z(k, l, j) = data_out(j + (k - 1)*nz + (l - 1)*nz*nxloc)
1530 end do
1531 end do
1532 end do
1533#endif
1534
1535 end subroutine s_mpi_fft_fwd
1536
1537 !> Set up the MPI environment, read and broadcast user inputs, and decompose the computational domain.
1538 impure subroutine s_initialize_mpi_domain
1539
1540 type(int_bounds_info), dimension(3) :: output_offsets
1541
1542 num_dims = 1 + min(1, n) + min(1, p)
1543
1544 call s_mpi_initialize()
1545
1546 if (proc_rank == 0) then
1547 call s_assign_default_values_to_user_inputs()
1548 call s_read_input_file()
1549 call s_check_input_file()
1550
1551 print '(" Post-processing a ", I0, "x", I0, "x", I0, " case on ", I0, " rank(s)")', m, n, p, num_procs
1552 end if
1553
1554 call s_mpi_bcast_user_inputs()
1555
1556 ! Save original BCs before decomposition overwrites them with MPI neighbor ranks
1557 ib_bc_x = bc_x
1558 ib_bc_y = bc_y
1559 ib_bc_z = bc_z
1560
1561 call s_initialize_parallel_io()
1562 output_offsets = (/offset_x, offset_y, offset_z/)
1563 call s_mpi_decompose_computational_domain(write_silo_ghost_offsets=format == format_silo, adjust_local_domains=.false., &
1564 & output_offsets=output_offsets)
1565 offset_x = output_offsets(1)
1566 offset_y = output_offsets(2)
1567 offset_z = output_offsets(3)
1568 call s_check_inputs_fft()
1569
1570 bc = bc_xyz_info(bc_x, bc_y, bc_z)
1571
1572 end subroutine s_initialize_mpi_domain
1573
1574 !> Destroy FFTW plans, free MPI communicators, and finalize all post-process sub-modules.
1575 impure subroutine s_finalize_modules
1576
1577 s_read_data_files => null()
1578
1579 if (fft_wrt) then
1580 if (c_associated(fwd_plan_x)) call fftw_destroy_plan(fwd_plan_x)
1581 if (c_associated(fwd_plan_y)) call fftw_destroy_plan(fwd_plan_y)
1582 if (c_associated(fwd_plan_z)) call fftw_destroy_plan(fwd_plan_z)
1583 if (allocated(data_in)) deallocate (data_in)
1584 if (allocated(data_out)) deallocate (data_out)
1585 if (allocated(data_cmplx)) deallocate (data_cmplx)
1586 if (allocated(data_cmplx_y)) deallocate (data_cmplx_y)
1587 if (allocated(data_cmplx_z)) deallocate (data_cmplx_z)
1588 if (allocated(en_real)) deallocate (en_real)
1589 if (allocated(en)) deallocate (en)
1590 call fftw_cleanup()
1591 end if
1592
1593#ifdef MFC_MPI
1594 if (fft_wrt) then
1595 if (mpi_comm_cart12 /= mpi_comm_null) call mpi_comm_free(mpi_comm_cart12, ierr)
1596 if (mpi_comm_cart13 /= mpi_comm_null) call mpi_comm_free(mpi_comm_cart13, ierr)
1597 if (mpi_comm_cart /= mpi_comm_null) call mpi_comm_free(mpi_comm_cart, ierr)
1598 end if
1599#endif
1600
1601 call s_finalize_data_output_module()
1602 call s_finalize_derived_variables_module()
1603 call s_finalize_data_input_module()
1604 call s_finalize_variables_conversion_module()
1605 call s_finalize_eos_module()
1606 if (num_procs > 1) then
1607 call s_finalize_mpi_proxy_module()
1608 call s_finalize_mpi_common_module()
1609 end if
1610 call s_finalize_global_parameters_module()
1611
1612 call s_mpi_finalize()
1613
1614 end subroutine s_finalize_modules
1615
1616end module m_start_up
1617
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 ...
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.
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.
Shared input validation checks for grid dimensions and AMD GPU compiler limits.
impure subroutine, public s_check_inputs_common(check_total_cells, n_global)
Checks compatibility of parameters in the input file. Used by all three stages.
Validates post-process input parameters and output format consistency.
impure subroutine, public s_check_inputs
Checks compatibility of parameters in the input file. Used by the post_process stage.
Multi-species chemistry interface for thermodynamic properties, reaction rates, and transport coeffic...
subroutine s_compute_q_t_sf(q_t_sf, q_cons_vf, bounds)
Initialize the temperature field from conservative variables by inverting the energy equation.
Platform-specific file and directory operations: create, delete, inquire, getcwd, and basename.
impure subroutine s_delete_file(filepath)
Delete a file at the given path using a platform-specific system command.
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.
integer, parameter model_eqns_5eq
integer, parameter format_silo
real(wp), parameter sgm_eps
Segmentation tolerance.
integer, parameter model_eqns_6eq
integer, parameter model_eqns_gamma_law
Reads raw simulation grid and conservative-variable data for a given time-step and fills buffer regio...
impure subroutine, public s_read_parallel_data_files(t_step)
Parallel-read the raw data files present in the corresponding time-step directory and to populate the...
type(scalar_field), public q_t_sf
Temperature field.
type(scalar_field), dimension(:), allocatable, public q_cons_vf
Conservative variables.
impure subroutine, public s_initialize_data_input_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
type(scalar_field), dimension(:), allocatable, public q_prim_vf
Primitive variables.
impure subroutine, public s_read_serial_data_files(t_step)
Read the raw data files present in the corresponding time-step directory and to populate the associat...
procedure(s_read_abstract_data_files), pointer, public s_read_data_files
type(integer_field), dimension(:,:), allocatable, public bc_type
Boundary condition identifiers.
type(integer_field), public ib_markers
Writes post-processed grid and flow-variable data to Silo-HDF5 or binary database files.
impure subroutine, public s_write_grid_to_formatted_database_file(t_step)
Write the computational grid (cell-boundary coordinates) to the formatted database slave and master f...
impure subroutine, public s_write_variable_to_formatted_database_file(varname, t_step)
Write a single flow variable field to the formatted database slave and master files for a given time ...
impure subroutine, public s_open_energy_data_file()
Open the energy data file for appending volume-integrated energy budget quantities.
impure subroutine, public s_open_intf_data_file()
Open the interface data file for appending extracted interface coordinates.
impure subroutine, public s_write_energy_data_file(q_prim_vf, q_cons_vf)
Compute volume-integrated kinetic, potential, and internal energies and write the energy budget to th...
impure subroutine, public s_write_lag_bubbles_to_formatted_database_file(t_step)
Read Lagrangian bubble restart data and write bubble positions and scalar fields to the Silo database...
impure subroutine, public s_write_intf_data_file(q_prim_vf)
Extract the volume-fraction interface contour from primitive fields and write the coordinates to the ...
impure subroutine, public s_initialize_data_output_module()
Allocate storage arrays, configure output directories, and count flow variables for formatted databas...
impure subroutine, public s_close_energy_data_file()
Close the energy data file.
impure subroutine, public s_close_formatted_database_file()
Close the formatted database slave file and, for the root process, the master file.
impure subroutine, public s_open_formatted_database_file(t_step)
Open (or create) the Silo-HDF5 or Binary formatted database slave and master files for a given time s...
impure subroutine, public s_close_intf_data_file()
Close the interface data file.
impure subroutine, public s_write_lag_bubbles_results_to_text(t_step)
Write the post-processed results in the folder 'lag_bubbles_data'.
impure subroutine, public s_define_output_region
Compute the cell-index bounds for the user-specified partial output domain in each coordinate directi...
impure subroutine, public s_write_ib_bodies_to_formatted_database_file(t_step)
Read IB state and write a Silo point mesh with per-body scalar fields.
type(output_context), public out
Output workspace: flow variable buffers, VisIt extents/offsets, directory paths, file handles,...
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Computes derived flow quantities (sound speed, vorticity, Schlieren, etc.) from conservative and prim...
type(fd_context), public fd
Finite-difference state: density gradient magnitude and centered FD coefficients in x-,...
impure subroutine, public s_derive_liutex(q_prim_vf, liutex_mag, liutex_axis)
Compute the Liutex vector and its magnitude based on Xu et al. (2019).
subroutine, public s_derive_specific_heat_ratio(q_sf)
Derive the specific heat ratio from the specific heat ratio function gamma_sf. The latter is stored i...
subroutine, public s_derive_liquid_stiffness(q_sf)
Compute the liquid stiffness from the specific heat ratio function gamma_sf and the liquid stiffness ...
impure subroutine, public s_initialize_derived_variables_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
subroutine, public s_derive_vorticity_component(i, q_prim_vf, q_sf)
Compute the specified component of the vorticity from the primitive variables. From those inputs,...
impure subroutine, public s_derive_numerical_schlieren_function(q_cons_vf, q_sf)
Compute the values of the numerical Schlieren function, which are subsequently stored in the derived ...
subroutine, public s_derive_flux_limiter(i, q_prim_vf, q_sf)
Derive the flux limiter at cell boundary i+1/2. This is an approximation because the velocity used to...
subroutine, public s_derive_qm(q_prim_vf, q_sf)
Compute the Q_M criterion from the primitive variables. The Q_M function, which are subsequently stor...
Equations of state in Gamma/Pi form, rho e = Gamma(rho) p + Pi(rho).
subroutine, public s_phase_temperature(rho, pres, i, t)
Temperature of phase i at (rho, p): the stiffened-gas relation, or T_ref(rho) + (e - e_ref)/c_v.
impure subroutine, public s_initialize_eos_module()
Resolve every fluid's EOS coefficients once, before any conversion runs.
subroutine, public s_compute_speed_of_sound(pres, rho, gamma, pi_inf, adv, c, alpha_rho)
Speed of sound of a thermodynamic state. Enthalpy is not an argument: for a real state H,...
Finite difference operators for computing divergence of velocity fields.
subroutine s_compute_finite_difference_coefficients(q, s_cc, fd_coeff_s, local_buff_size, fd_number_in, fd_order_in, offset_s)
Compute the centered finite-difference coefficients for first-order spatial derivatives in the s-coor...
Global parameters for the post-process: domain geometry, equation of state, and output database setti...
type(int_bounds_info), dimension(1:3) idwint
integer beta_idx
Index of lagrange bubbles beta.
type(int_bounds_info) offset_y
type(qbmm_idx_info) qbmm_idx
QBMM moment index mappings.
real(wp), dimension(:), allocatable y_cc
integer proc_rank
Rank of the local processor.
real(wp), dimension(:), allocatable adv
Advection variables.
type(int_bounds_info) z_output_idx
Indices of domain to output for post-processing.
real(wp), dimension(:), allocatable y_cb
real(wp), dimension(:), allocatable dz
integer fd_number
Finite-difference half-stencil size: MAX(1, fd_order/2).
type(int_bounds_info), dimension(1:3) idwbuff
integer buff_size
Number of ghost cells for boundary condition storage.
real(wp), dimension(:), allocatable z_cb
type(bounds_info) z_output
Portion of domain to output for post-processing.
type(int_bounds_info) x_output_idx
impure subroutine s_initialize_global_parameters_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
real(wp), dimension(:), allocatable x_cc
real(wp), dimension(:), allocatable x_cb
real(wp), dimension(:), allocatable dy
type(int_bounds_info) offset_x
real(wp), dimension(:), allocatable z_cc
integer num_procs
Number of processors.
type(int_bounds_info) y_output_idx
type(int_bounds_info) offset_z
type(cell_num_bounds) cells_bounds
real(wp) wall_time_avg
Wall time measurements.
real(wp), dimension(:), allocatable dx
Cell-width distributions in the x-, y- and z-coordinate directions.
integer(kind=8) nglobal
Total number of cells in global domain.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
impure subroutine, public s_initialize_bubbles_model()
Initialize bubble model arrays for Euler or Lagrangian bubbles with polytropic or non-polytropic gas.
MPI communication layer: domain decomposition, halo exchange, reductions, and parallel I/O setup.
impure subroutine s_mpi_abort(prnt, code)
The subroutine terminates the MPI execution environment.
impure subroutine s_initialize_mpi_common_module(exchange_all_chemistry_temperatures_in, use_rdma_transport_in)
Initialize the module.
MPI gather and scatter operations for distributing post-process grid and flow-variable data.
impure subroutine s_initialize_mpi_proxy_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
Reads and validates user inputs, allocates variables, and configures MPI decomposition and I/O for po...
impure subroutine s_check_input_file
Checking that the user inputs make sense, i.e. that the individual choices are compatible with the co...
real(wp), dimension(:), allocatable en
complex(c_double_complex), dimension(:,:,:), allocatable data_cmplx_y
impure subroutine s_save_data(t_step, varname, pres, c)
Derive requested flow quantities from primitive variables and write them to the formatted database fi...
subroutine s_mpi_fft_fwd
Perform a distributed forward 3-D FFT using pencil decomposition with FFTW and MPI transposes.
type(c_ptr) fwd_plan_y
integer mpi_comm_cart13
impure subroutine s_initialize_mpi_domain
Set up the MPI environment, read and broadcast user inputs, and decompose the computational domain.
complex(c_double_complex), dimension(:,:,:), allocatable data_cmplx_z
impure subroutine s_read_input_file
Reads the configuration file post_process.inp, in order to populate parameters in module m_global_par...
complex(c_double_complex), dimension(:), allocatable data_out
integer, dimension(2) cart2d13_coords
type(c_ptr) fwd_plan_z
impure subroutine s_write_field(varname, t_step, src, x_beg, x_end, y_beg, y_end, z_beg, z_end)
Fill outq_sf from src (if given), write varname to the database, and clear varname.
real(wp), dimension(:,:,:), allocatable en_real
complex(c_double_complex), dimension(:), allocatable data_in
integer, dimension(3) cart3d_coords
impure subroutine s_perform_time_step(t_step)
Load grid and conservative data for a time step, fill ghost-cell buffers, and convert to primitive va...
integer mpi_comm_cart
complex(c_double_complex), dimension(:,:,:), allocatable data_cmplx
integer proc_rank12
subroutine s_mpi_transpose_x2y
Transpose 3-D complex data from x-pencil to y-pencil layout via MPI_Alltoall.
impure subroutine s_finalize_modules
Destroy FFTW plans, free MPI communicators, and finalize all post-process sub-modules.
subroutine s_mpi_transpose_y2z
Transpose 3-D complex data from y-pencil to z-pencil layout via MPI_Alltoall.
impure subroutine s_initialize_modules
Initialize all post-process sub-modules, set up I/O pointers, and prepare FFTW plans and MPI communic...
integer mpi_comm_cart12
type(c_ptr) fwd_plan_x
integer proc_rank13
integer, dimension(2) cart2d12_coords
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
subroutine, public s_convert_conservative_to_primitive_variables(qk_cons_vf, q_t_sf, qk_prim_vf, ibounds)
Convert conserved variables (rho*alpha, rho*u, E, alpha) to primitives (rho, u, p,...
real(wp), dimension(:,:,:), allocatable, public pi_inf_sf
Scalar liquid stiffness function.
real(wp), dimension(:,:,:), allocatable, public gamma_sf
Scalar sp. heat ratio function.
impure subroutine, public s_initialize_variables_conversion_module(store_mixture_fields, enforce_density_floor, preserve_qbmm_number, lagrange_beta_index)
Initialize the variables conversion module.
real(wp), dimension(:,:,:), allocatable, public rho_sf
Scalar density function.
Derived type annexing a scalar field (SF).