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/pre_process/m_start_up.fpp"
2!>
3!! @file
4!! @brief Contains module m_start_up
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
21! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
22! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
23# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
24# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
25# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
26
27# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29
30# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31
32# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33
34# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35
36# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37
38# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39
40# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45! New line at end of file is required for FYPP
46# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
47# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
48# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
49# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54
55# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58
59# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
61! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
62! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
63# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
64# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
65# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
66
67# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
68# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
69
70# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
71
72# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
73
74# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
75
76# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
77
78# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
79
80# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
81
82# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
83
84# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
85! New line at end of file is required for FYPP
86# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
87
88# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 95 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 100 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 105 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 110 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117
118# 115 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119
120# 120 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121
122# 125 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123
124# 130 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125
126# 135 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127
128# 165 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129
130# 219 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131
132# 233 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133
134# 258 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135
136# 269 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137
138# 271 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139# 282 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 332 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142
143# 342 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
144
145# 352 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
146
147# 361 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
148
149# 378 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
150
151# 388 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
152
153# 395 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
154
155# 401 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
156
157# 407 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
158
159# 413 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
160
161# 419 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
162
163# 425 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
164! New line at end of file is required for FYPP
165# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
166# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
167# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
168# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173
174# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
175# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
177
178# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
179# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
180! Default for Fypp runs outside the toolchain (e.g. documentation). Searched last, so the
181! build/include/<target>/thermochem.fpp the toolchain writes from m_thermochem takes precedence.
182# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
183# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
184# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
185
186# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
187# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
188
189# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
190
191# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
192
193# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
194
195# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
196
197# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
198
199# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
200
201# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
202
203# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
204! New line at end of file is required for FYPP
205# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
206
207# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
208
209# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210
211# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212
213# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214
215# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216
217# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218
219# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220
221# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222
223# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224
225# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226
227# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228
229# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230
231# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232
233# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234
235# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236
237# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238
239# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240
241# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
242
243# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
244
245# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
246
247# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
248
249# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
250
251# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
252
253# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
254
255# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
256
257# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
258
259# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
260
261# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
262! New line at end of file is required for FYPP
263# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
264
265! GPU parallel region (scalar reductions, maxval/minval)
266# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! GPU parallel loop over threads (most common GPU macro)
269# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Required closing for GPU_PARALLEL_LOOP
272# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Mark routine for device compilation
275# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! Declare device-resident data
278# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Inner loop within a GPU parallel region
281# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Scoped GPU data region
284# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Host code with device pointers (for MPI with GPU buffers)
287# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289! Allocate device memory (unscoped)
290# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291
292! Free device memory
293# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
294
295! Atomic operation on device
296# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
297
298! End atomic capture block
299# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
300
301! Copy data between host and device
302# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
303
304! Synchronization barrier
305# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
306
307! Import GPU library module (openacc or omp_lib)
308# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
309
310! Emit code only for AMD compiler
311# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
312
313! Emit code for non-Cray compilers
314# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
315
316! Emit code only for Cray compiler
317# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
318
319! Emit code for non-NVIDIA compilers
320# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
321
322# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
323# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
324! New line at end of file is required for FYPP
325# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
326
327# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
328
329! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
330! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
331! example see misc/nvidia_uvm/bind.sh.
332# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
333
334! Allocate and create GPU device memory
335# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
336
337! Free GPU device memory and deallocate
338# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
339
340! Cray-specific GPU pointer setup for vector fields
341# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
342
343! Cray-specific GPU pointer setup for scalar fields
344# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
345
346! Cray-specific GPU pointer setup for acoustic source spatials
347# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
348
349# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
350
351# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
352! New line at end of file is required for FYPP
353# 6 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp" 2
354
355!> @brief Reads and validates user inputs, loads existing grid/IC data, and initializes pre-process modules
357
360 use m_mpi_proxy
361 use m_mpi_common
364 use m_grid
366 use m_data_output
372 use m_helper
373
374#ifdef MFC_MPI
375 use mpi
376#endif
377
381 use m_helper
383 use m_checker
386
387 implicit none
388
389 private
394
395 abstract interface
396
397 !> Abstract interface for reading grid data files in serial or parallel.
399
401
402 !> Abstract interface for reading initial condition data files in serial or parallel.
403 impure subroutine s_read_abstract_ic_data_files(q_cons_vf_in)
404
405 import :: scalar_field, integer_field, sys_size, pres_field
406
407 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf_in
408
409 end subroutine s_read_abstract_ic_data_files
410 end interface
411
412 character(LEN=path_len + name_len) :: proc_rank_dir !< Location of the folder associated with the rank of the local processor
413 character(LEN=path_len + 2*name_len), private :: t_step_dir !< Path to preexisting time-step folder for restart
416
417contains
418
419 !> Reads the configuration file pre_process.inp, in order to populate the parameters in module m_global_parameters.f90 with the
420 !! user provided inputs
421 impure subroutine s_read_input_file
422
423 character(LEN=name_len) :: file_loc
424 logical :: file_check
425 integer :: iostatus
426 character(len=1000) :: line
427
428# 1 "/home/runner/work/MFC/MFC/build/include/pre_process/generated_namelist.fpp" 1
429! AUTO-GENERATED - do not edit directly. Regenerate: cmake reconfigure
430!
431namelist /user_inputs/ bx0, ca, r0ref, re_inv, web, a_x, a_y, a_z, adv_n, bc_x, bc_y, bc_z, bub_pp, bubbles_euler, &
432 & bubbles_lagrange, case_dir, cfl_adap_dt, cfl_const_dt, cont_damage, cyl_coord, dist_type, down_sample, elliptic_smoothing, &
433 & elliptic_smoothing_iters, fft_wrt, file_extension, file_per_process, files_dir, fluid_pp, fluid_rho, hyper_cleaning, &
434 & hypoelasticity, ib, ib_airfoil, igr, igr_order, loops_x, loops_y, loops_z, m, mhd, mixlayer_perturb, mixlayer_perturb_k0, &
435 & mixlayer_perturb_nk, mixlayer_vel_coef, mixlayer_vel_profile, model_eqns, mpp_lim, muscl_order, n, n_start, n_start_old, &
436 & nb, num_bc_patches, num_fluids, num_ibs, num_particle_clouds, num_patches, num_stl_models, old_grid, old_ic, p, &
437 & palpha_eps, parallel_io, particle_cloud, patch_bc, patch_ib, patch_icpp, perturb_flow, perturb_flow_fluid, &
438 & perturb_flow_mag, perturb_sph, perturb_sph_fluid, pi_fac, poly_sigma, polydisperse, polytropic, precision, ptgalpha_eps, &
439 & qbmm, rburn, reactive_burn, recon_type, relativity, relax, relax_model, rhorv, sigr, sigv, sigma, simplex_params, &
440 & simplex_perturb, stl_models, stretch_x, stretch_y, stretch_z, surface_tension, t_step_old, t_step_start, thermal, viscous, &
441 & weno_order, x_a, x_b, x_domain, y_a, y_b, y_domain, z_a, z_b, z_domain
442# 81 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp" 2
443
444 file_loc = 'pre_process.inp'
445 inquire (file=trim(file_loc), exist=file_check)
446
447 if (file_check) then
448 open (1, file=trim(file_loc), form='formatted', status='old', action='read')
449 read (1, nml=user_inputs, iostat=iostatus)
450 if (iostatus /= 0) then
451 backspace(1)
452 read (1, fmt='(A)') line
453 print *, 'Invalid line in namelist: ' // trim(line)
454 call s_mpi_abort('Invalid line in pre_process.inp. It is ' // 'likely due to a datatype mismatch. Exiting.')
455 end if
456 close (1)
457
459
460 m_glb = m
461 n_glb = n
462 p_glb = p
463
464 nglobal = int(m_glb + 1, kind=8)*int(n_glb + 1, kind=8)*int(p_glb + 1, kind=8)
465
466 if (cfl_adap_dt .or. cfl_const_dt) cfl_dt = .true.
467
468 if (any((/bc_x%beg, bc_x%end, bc_y%beg, bc_y%end, bc_z%beg, bc_z%end/) == bc_dirichlet) .or. num_bc_patches > 0) then
469 bc_io = .true.
470 end if
471 else
472 call s_mpi_abort('File pre_process.inp is missing. Exiting.')
473 end if
474
475 end subroutine s_read_input_file
476
477 !> Checking that the user inputs make sense, i.e. that the individual choices are compatible with the code's options and that
478 !! the combination of these choices results into a valid configuration for the pre-process
479 impure subroutine s_check_input_file
480
481 character(LEN=len_trim(case_dir)) :: file_loc
482 logical :: dir_check
483
484 case_dir = adjustl(case_dir)
485
486 file_loc = trim(case_dir) // '/.'
487
488 call my_inquire(file_loc, dir_check)
489
490 if (dir_check .neqv. .true.) then
491 print '(A)', 'WARNING: Ensure that compiler flags/choices in Makefiles match your compiler! '
492 print '(A)', 'WARNING: Ensure that preprocessor flags are enabled! '
493 call s_mpi_abort('Unsupported choice for the value of case_dir.' // 'Exiting.')
494 end if
495
496 call s_check_inputs_common(check_total_cells=.true., n_global=nglobal)
497 call s_check_inputs()
498
499 call s_check_patches()
500
501 if (ib) call s_check_ib_patches()
502
503 end subroutine s_check_input_file
504
505 !> @brief Generates the particle-cloud beds (if any) and writes the initial IB state file that simulation reads back at startup
506 !! (src/simulation/m_start_up.fpp:s_read_ib_restart_data). Must run after the domain is decomposed (s_initialize_mpi_domain) and
507 !! the grid is populated (s_read_grid). Under file_per_process every rank computes the same deterministic placement and keeps
508 !! only the IBs f_local_rank_owns_location says are its own; otherwise rank 0 alone generates and writes every IB.
509 impure subroutine s_write_ib_state_0()
510
511 type(ib_patch_parameters), allocatable :: particle_cloud_ibs(:)
512 integer :: num_particle_cloud_ibs
513 type(bounds_info), dimension(3) :: glb_bounds
514
515 if (.not. ib) return
516 if (.not. file_per_process .and. proc_rank /= 0) return
517
518 glb_bounds = (/x_domain_glb, y_domain_glb, z_domain_glb/)
519
520 call s_generate_particle_clouds(glb_bounds, particle_cloud_ibs, num_particle_cloud_ibs)
521 call s_write_ib_state_0_file(glb_bounds, particle_cloud_ibs, num_particle_cloud_ibs)
522 deallocate (particle_cloud_ibs)
523
524 end subroutine s_write_ib_state_0
525
526 !> The goal of this subroutine is to read in any preexisting grid data as well as based on the imported grid, complete the
527 !! necessary global computational domain parameters.
529
530 character(LEN=len_trim(case_dir) + 3*name_len) :: file_loc
531 logical :: dir_check
532 logical :: file_check
533
534 write (proc_rank_dir, '(A,I0)') '/p_all/p', proc_rank
535 proc_rank_dir = trim(case_dir) // trim(proc_rank_dir)
536
537 write (t_step_dir, '(A,I0)') '/', t_step_start
538 t_step_dir = trim(proc_rank_dir) // trim(t_step_dir)
539
540 file_loc = trim(t_step_dir) // '/.'
541 call my_inquire(file_loc, dir_check)
542
543 if (dir_check .neqv. .true.) then
544 call s_mpi_abort('Time-step folder ' // trim(t_step_dir) // ' is missing. Exiting.')
545 end if
546
547 file_loc = trim(t_step_dir) // '/x_cb.dat'
548 inquire (file=trim(file_loc), exist=file_check)
549
550 if (file_check) then
551 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
552 read (1) x_cb(-1:m)
553 close (1)
554 else
555 call s_mpi_abort('File x_cb.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
556 end if
557
558 x_cc(0:m) = (x_cb(0:m) + x_cb(-1:(m - 1)))/2._wp
559
560 dx_min = minval(x_cb(0:m) - x_cb(-1:m - 1))
561 if (num_procs > 1) call s_mpi_reduce_min(dx_min)
562
563 x_domain%beg = x_cb(-1)
564 x_domain%end = x_cb(m)
565
566 if (n > 0) then
567 file_loc = trim(t_step_dir) // '/y_cb.dat'
568 inquire (file=trim(file_loc), exist=file_check)
569
570 if (file_check) then
571 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
572 read (1) y_cb(-1:n)
573 close (1)
574 else
575 call s_mpi_abort('File y_cb.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
576 end if
577
578 y_cc(0:n) = (y_cb(0:n) + y_cb(-1:(n - 1)))/2._wp
579
580 dy_min = minval(y_cb(0:n) - y_cb(-1:n - 1))
581 if (num_procs > 1) call s_mpi_reduce_min(dy_min)
582
583 y_domain%beg = y_cb(-1)
584 y_domain%end = y_cb(n)
585
586 if (p > 0) then
587 file_loc = trim(t_step_dir) // '/z_cb.dat'
588 inquire (file=trim(file_loc), exist=file_check)
589
590 if (file_check) then
591 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
592 read (1) z_cb(-1:p)
593 close (1)
594 else
595 call s_mpi_abort('File z_cb.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
596 end if
597
598 z_cc(0:p) = (z_cb(0:p) + z_cb(-1:(p - 1)))/2._wp
599
600 dz_min = minval(z_cb(0:p) - z_cb(-1:p - 1))
601 if (num_procs > 1) call s_mpi_reduce_min(dz_min)
602
603 z_domain%beg = z_cb(-1)
604 z_domain%end = z_cb(p)
605 end if
606 end if
607
608 ! Clean processor dir and create time-step dir (unless reading preexisting IC)
609 if (old_ic .neqv. .true.) then
611 call s_create_directory(trim(proc_rank_dir) // '/0')
612 end if
613
614 end subroutine s_read_serial_grid_data_files
615
616 !> Cell-boundary data are checked for consistency by looking at the (non-)uniform cell-width distributions for all the active
617 !! coordinate directions and making sure that all of the cell-widths are positively valued
618 impure subroutine s_check_grid_data_files
619
620 if (any(x_cb(0:m) - x_cb(-1:m - 1) <= 0._wp)) then
621 call s_mpi_abort('x_cb.dat in ' // trim(t_step_dir) // ' contains non-positive cell-spacings. Exiting.')
622 end if
623
624 if (n > 0) then
625 if (any(y_cb(0:n) - y_cb(-1:n - 1) <= 0._wp)) then
626 call s_mpi_abort('y_cb.dat in ' // trim(t_step_dir) // ' contains non-positive cell-spacings. ' // 'Exiting.')
627 end if
628
629 if (p > 0) then
630 if (any(z_cb(0:p) - z_cb(-1:p - 1) <= 0._wp)) then
631 call s_mpi_abort('z_cb.dat in ' // trim(t_step_dir) // ' contains non-positive cell-spacings' // ' .Exiting.')
632 end if
633 end if
634 end if
635
636 end subroutine s_check_grid_data_files
637
638 !> The goal of this subroutine is to read in any preexisting initial condition data files so that they may be used by the
639 !! pre-process as a starting point in the creation of an all new initial condition.
640 impure subroutine s_read_serial_ic_data_files(q_cons_vf_in)
641
642 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf_in
643 character(LEN=len_trim(case_dir) + 3*name_len) :: file_loc
644 character(len=int(floor(log10(real(sys_size, wp)))) + 1) :: file_num
645 logical :: file_check
646 integer :: i, r
647
648 do i = 1, sys_size
649 write (file_num, '(I0)') i
650 file_loc = trim(t_step_dir) // '/q_cons_vf' // trim(file_num) // '.dat'
651 inquire (file=trim(file_loc), exist=file_check)
652
653 if (file_check) then
654 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
655 read (1) q_cons_vf_in(i)%sf
656 close (1)
657 else
658 call s_mpi_abort('File q_cons_vf' // trim(file_num) // '.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
659 end if
660 end do
661
662 if (qbmm .and. .not. polytropic) then
663 do i = 1, nb
664 do r = 1, nnode
665 write (file_num, '(I0)') sys_size + r + (i - 1)*nnode
666 file_loc = trim(t_step_dir) // '/pb' // trim(file_num) // '.dat'
667 inquire (file=trim(file_loc), exist=file_check)
668
669 if (file_check) then
670 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
671 read (1) pb%sf(:,:,:,r, i)
672 close (1)
673 else
674 call s_mpi_abort('File pb' // trim(file_num) // '.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
675 end if
676 end do
677 end do
678
679 do i = 1, nb
680 do r = 1, nnode
681 write (file_num, '(I0)') sys_size + r + (i - 1)*nnode
682 file_loc = trim(t_step_dir) // '/mv' // trim(file_num) // '.dat'
683 inquire (file=trim(file_loc), exist=file_check)
684
685 if (file_check) then
686 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
687 read (1) mv%sf(:,:,:,r, i)
688 close (1)
689 else
690 call s_mpi_abort('File mv' // trim(file_num) // '.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
691 end if
692 end do
693 end do
694 end if
695
696 ! Since the preexisting grid and initial condition data files have been read in, the directory associated with the rank of
697 ! the local process may be cleaned out to make room for new pre-process data. In addition, the time-step folder that will
698 ! contain the new grid and initial condition data are also generated.
700 call s_create_directory(trim(proc_rank_dir) // '/0')
701
702 end subroutine s_read_serial_ic_data_files
703
704 !> Cell-boundary data are checked for consistency by looking at the (non-)uniform cell-width distributions for all the active
705 !! coordinate directions and making sure that all of the cell-widths are positively valued
707
708#ifdef MFC_MPI
709 real(wp), allocatable, dimension(:) :: x_cb_glb, y_cb_glb, z_cb_glb
710 integer :: ifile, ierr, data_size
711 integer, dimension(MPI_STATUS_SIZE) :: status
712 character(LEN=path_len + 2*name_len) :: file_loc
713 logical :: file_exist
714
715 allocate (x_cb_glb(-1:m_glb))
716 allocate (y_cb_glb(-1:n_glb))
717 allocate (z_cb_glb(-1:p_glb))
718
719 file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // 'x_cb.dat'
720 inquire (file=trim(file_loc), exist=file_exist)
721
722 if (file_exist) then
723 data_size = m_glb + 2
724 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
725 call s_check_mpi_file_open(ierr, file_loc)
726 call mpi_file_read_all(ifile, x_cb_glb, data_size, mpi_p, status, ierr)
727 call mpi_file_close(ifile, ierr)
728 else
729 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
730 end if
731
732 x_cb(-1:m) = x_cb_glb((start_idx(1) - 1):(start_idx(1) + m))
733 x_cc(0:m) = (x_cb(0:m) + x_cb(-1:(m - 1)))/2._wp
734 dx_min = minval(x_cb(0:m) - x_cb(-1:(m - 1)))
735 if (num_procs > 1) call s_mpi_reduce_min(dx_min)
736 x_domain%beg = x_cb(-1)
737 x_domain%end = x_cb(m)
738
739 if (n > 0) then
740 file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // 'y_cb.dat'
741 inquire (file=trim(file_loc), exist=file_exist)
742
743 if (file_exist) then
744 data_size = n_glb + 2
745 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
746 call s_check_mpi_file_open(ierr, file_loc)
747 call mpi_file_read_all(ifile, y_cb_glb, data_size, mpi_p, status, ierr)
748 call mpi_file_close(ifile, ierr)
749 else
750 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
751 end if
752
753 y_cb(-1:n) = y_cb_glb((start_idx(2) - 1):(start_idx(2) + n))
754 y_cc(0:n) = (y_cb(0:n) + y_cb(-1:(n - 1)))/2._wp
755 dy_min = minval(y_cb(0:n) - y_cb(-1:(n - 1)))
756 if (num_procs > 1) call s_mpi_reduce_min(dy_min)
757 y_domain%beg = y_cb(-1)
758 y_domain%end = y_cb(n)
759
760 if (p > 0) then
761 file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // 'z_cb.dat'
762 inquire (file=trim(file_loc), exist=file_exist)
763
764 if (file_exist) then
765 data_size = p_glb + 2
766 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
767 call s_check_mpi_file_open(ierr, file_loc)
768 call mpi_file_read_all(ifile, z_cb_glb, data_size, mpi_p, status, ierr)
769 call mpi_file_close(ifile, ierr)
770 else
771 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
772 end if
773
774 z_cb(-1:p) = z_cb_glb((start_idx(3) - 1):(start_idx(3) + p))
775 z_cc(0:p) = (z_cb(0:p) + z_cb(-1:(p - 1)))/2._wp
776 dz_min = minval(z_cb(0:p) - z_cb(-1:(p - 1)))
777 if (num_procs > 1) call s_mpi_reduce_min(dz_min)
778 z_domain%beg = z_cb(-1)
779 z_domain%end = z_cb(p)
780 end if
781 end if
782
783 deallocate (x_cb_glb, y_cb_glb, z_cb_glb)
784#endif
785
787
788 !> The goal of this subroutine is to read in any preexisting initial condition data files so that they may be used by the
789 !! pre-process as a starting point in the creation of an all new initial condition.
790 impure subroutine s_read_parallel_ic_data_files(q_cons_vf_in)
791
792 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf_in
793
794#ifdef MFC_MPI
795 integer :: ifile, ierr, data_size
796 integer, dimension(MPI_STATUS_SIZE) :: status
797 integer(KIND=MPI_OFFSET_KIND) :: disp
798 integer(KIND=MPI_OFFSET_KIND) :: m_mok, n_mok, p_mok
799 integer(KIND=MPI_OFFSET_KIND) :: wp_mok, var_mok
800 integer(KIND=MPI_OFFSET_KIND) :: mok
801 character(LEN=path_len + 2*name_len) :: file_loc
802 logical :: file_exist
803 integer :: i
804
805 if (cfl_adap_dt) then
806 write (file_loc, '(I0,A)') n_start, '.dat'
807 else
808 write (file_loc, '(I0,A)') t_step_start, '.dat'
809 end if
810 file_loc = trim(restart_dir) // trim(mpiiofs) // trim(file_loc)
811 inquire (file=trim(file_loc), exist=file_exist)
812
813 if (file_exist) then
814 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
815 call s_check_mpi_file_open(ierr, file_loc)
816
817 call s_initialize_mpi_data(q_cons_vf_in, qbmm_pb=pb, qbmm_mv=mv)
818
819 data_size = (m + 1)*(n + 1)*(p + 1)
820
821 ! Resize some integers so MPI can read even the biggest files
822 m_mok = int(m_glb + 1, mpi_offset_kind)
823 n_mok = int(n_glb + 1, mpi_offset_kind)
824 p_mok = int(p_glb + 1, mpi_offset_kind)
825 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
826 mok = int(1._wp, mpi_offset_kind)
827
828 do i = 1, sys_size
829 var_mok = int(i, mpi_offset_kind)
830
831 ! Initial displacement to skip at beginning of file
832 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
833
834 call mpi_file_set_view(ifile, disp, mpi_p, mpi_io_data%view(i), 'native', mpi_info_int, ierr)
835 call mpi_file_read(ifile, mpi_io_data%var(i)%sf, data_size, mpi_p, status, ierr)
836 end do
837
838 if (qbmm .and. .not. polytropic) then
839 do i = sys_size + 1, sys_size + 2*nb*nnode
840 var_mok = int(i, mpi_offset_kind)
841
842 ! Initial displacement to skip at beginning of file
843 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
844
845 call mpi_file_set_view(ifile, disp, mpi_p, mpi_io_data%view(i), 'native', mpi_info_int, ierr)
846 call mpi_file_read(ifile, mpi_io_data%var(i)%sf, data_size, mpi_p, status, ierr)
847 end do
848 end if
849
850 call s_mpi_barrier()
851
852 call mpi_file_close(ifile, ierr)
853 else
854 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
855 end if
856
857 call s_mpi_barrier()
858#endif
859
860 end subroutine s_read_parallel_ic_data_files
861
862 !> Initialize all pre-process modules, allocate data structures, and set I/O procedure pointers.
863 impure subroutine s_initialize_modules
864
866 if (bubbles_euler .or. bubbles_lagrange) then
868 end if
869 call s_initialize_mpi_common_module(exchange_all_chemistry_temperatures_in=.false., use_rdma_transport_in=.false.)
875 call s_initialize_perturbation_module()
878 if (relax) call s_initialize_phasechange_module()
879
880 ! Create the D directory if it doesn't exit, to store the serial data files
881 call s_create_directory('D')
882
883 if (parallel_io .neqv. .true.) then
888 else
893 end if
894
895 end subroutine s_initialize_modules
896
897 !> Read an existing grid from data files or generate a new grid from user inputs.
898 impure subroutine s_read_grid()
899
900 if (old_grid) then
903 else
904 if (parallel_io .neqv. .true.) then
905 call s_generate_grid()
906 else
907 if (proc_rank == 0) call s_generate_grid()
908 call s_mpi_barrier()
911 end if
912 end if
913
914 end subroutine s_read_grid
915
916 !> Generate or read the initial condition, apply relaxation if needed, and write output data files.
917 impure subroutine s_apply_initial_condition(start, finish)
918
919 real(wp), intent(inout) :: start, finish
920 integer :: j, k, l
921 real(wp) :: r2
922
923 call cpu_time(start)
924
925 if (old_ic) call s_read_ic_data_files(ic%q_cons_vf)
926
928
929 ! hard-coded psi
930 if (hyper_cleaning) then
931 if (.not. (eqn_idx%psi > 0)) then
932# 569 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
933 call s_mpi_abort("m_start_up.fpp:569: " // "Assertion failed: eqn_idx%psi > 0. " &
934# 569 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
935 & // "hyper_cleaning requires eqn_idx%psi to be set")
936# 569 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
937 end if
938# 570 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
939 do l = 0, p
940 do k = 0, n
941 do j = 0, m
942 r2 = x_cc(j)**2
943 if (n > 0) r2 = r2 + y_cc(k)**2
944 if (p > 0) r2 = r2 + z_cc(l)**2
945 ic%q_cons_vf(eqn_idx%psi)%sf(j, k, l) = 1.0e-2_wp*exp(-r2/(2.0_wp*0.05_wp**2))
946 ic%q_prim_vf(eqn_idx%psi)%sf(j, k, l) = ic%q_cons_vf(eqn_idx%psi)%sf(j, k, l)
947 end do
948 end do
949 end do
950 end if
951
952 if (relax) then
953 if (proc_rank == 0) then
954 print *, 'initial condition might have been altered due to enforcement of pTg-equilibrium (relax = "T" activated)'
955 end if
956
957 call s_infinite_relaxation_k(ic%q_cons_vf)
958 end if
959
960 if (chemistry) then
961 call s_write_data_files(ic%q_cons_vf, ic%q_prim_vf, ic%bc_type, ic%q_T_sf)
962 else
963 call s_write_data_files(ic%q_cons_vf, ic%q_prim_vf, ic%bc_type)
964 end if
965
966 call cpu_time(finish)
967
968 end subroutine s_apply_initial_condition
969
970 !> Gather processor timing data and write elapsed wall-clock time to a summary file.
971 impure subroutine s_save_data(proc_time, time_avg, time_final, file_exists)
972
973 real(wp), dimension(:), intent(inout) :: proc_time
974 real(wp), intent(inout) :: time_avg, time_final
975 logical, intent(inout) :: file_exists
976
977 call s_mpi_barrier()
978
979 if (num_procs > 1) then
980 call mpi_bcast_time_step_values(proc_time, time_avg)
981 end if
982
983 if (proc_rank == 0) then
984 time_final = 0._wp
985 if (num_procs == 1) then
986 time_final = time_avg
987 print *, "Elapsed Time", time_final
988 else
989 time_final = maxval(proc_time)
990 print *, "Elapsed Time", time_final
991 end if
992 inquire (file='pre_time_data.dat', exist=file_exists)
993 if (file_exists) then
994 open (1, file='pre_time_data.dat', position='append', status='old')
995 write (1, *) num_procs, time_final
996 close (1)
997 else
998 open (1, file='pre_time_data.dat', status='new')
999 write (1, *) num_procs, time_final
1000 close (1)
1001 end if
1002 end if
1003
1004 end subroutine s_save_data
1005
1006 !> Initialize MPI, read and validate user inputs on rank 0, and decompose the computational domain.
1007 impure subroutine s_initialize_mpi_domain
1008
1009 type(bounds_info), dimension(3) :: local_domains
1010
1011 call s_mpi_initialize()
1012
1013 if (proc_rank == 0) then
1015 call s_read_input_file()
1016 call s_check_input_file()
1017
1018 print '(" Pre-processing a ", I0, "x", I0, "x", I0, " case on ", I0, " rank(s)")', m, n, p, num_procs
1019 end if
1020
1021 ! Broadcasting the user inputs to all of the processors and performing the parallel computational domain decomposition.
1022 ! Neither procedure has to be carried out if pre-process is in fact not truly executed in parallel.
1024
1025 ! Save original BCs before decomposition overwrites them with MPI neighbor ranks
1026 ib_bc_x = bc_x
1027 ib_bc_y = bc_y
1028 ib_bc_z = bc_z
1029
1031
1032 ! Save the global domain bounds before decomposition overwrites x/y/z_domain with each processor's local sub-domain bounds
1036
1037 local_domains = (/x_domain, y_domain, z_domain/)
1038 call s_mpi_decompose_computational_domain(write_silo_ghost_offsets=.false., adjust_local_domains= .not. old_grid, &
1039 & local_domains=local_domains)
1040 x_domain = local_domains(1)
1041 y_domain = local_domains(2)
1042 z_domain = local_domains(3)
1043
1045
1046 end subroutine s_initialize_mpi_domain
1047
1048 !> Finalize all pre-process modules, deallocate resources, and shut down MPI.
1049 impure subroutine s_finalize_modules
1050
1051 s_generate_grid => null()
1052 s_read_grid_data_files => null()
1053 s_read_ic_data_files => null()
1054 s_write_data_files => null()
1055
1063 call s_finalize_perturbation_module()
1065 if (relax) call s_finalize_relaxation_solver_module()
1067 call s_mpi_finalize()
1068
1069 end subroutine s_finalize_modules
1070
1071end module m_start_up
Abstract interface for reading grid data files in serial or parallel.
Abstract interface for reading initial condition data files in serial or parallel.
integer, intent(in) k
integer, intent(in) j
integer, intent(in) l
Assigns initial primitive variables to computational cells based on patch geometry.
impure subroutine, public s_initialize_assign_variables_module
Allocate volume fraction sum and set the patch primitive variable assignment procedure pointer.
impure subroutine, public s_finalize_assign_variables_module
Nullify the patch primitive variable assignment procedure pointer.
Noncharacteristic and processor boundary condition application for ghost cells and buffer regions.
subroutine, public s_finalize_boundary_common_module()
Deallocate boundary condition buffer arrays allocated during module initialization.
impure subroutine, public s_initialize_boundary_common_module(use_dirichlet_buffers)
Allocate and set up boundary condition buffer arrays for all coordinate directions.
Applies spatially varying boundary condition patches along domain edges and faces.
Validates geometry parameters and constraints for immersed boundary patches.
impure subroutine, public s_check_ib_patches
Validate the geometry parameters of all active and inactive immersed boundary patches.
Validates geometry parameters and constraints for initial condition patches.
impure subroutine, public s_check_patches
Validate the geometry parameters of all active and inactive initial condition patches.
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.
Checks pre-process input file parameters for compatibility and correctness.
impure subroutine, public s_check_inputs
Checks compatibility of parameters in the input file. Used by the pre_process stage.
Platform-specific file and directory operations: create, delete, inquire, getcwd, and basename.
impure subroutine s_delete_directory(dir_name)
Recursively delete a directory 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.
Writes grid and initial condition data to serial or parallel output files.
procedure(s_write_abstract_data_files), pointer, public s_write_data_files
impure subroutine, public s_write_ib_state_0_file(glb_bounds, particle_cloud_ibs, num_particle_cloud_ibs)
Writes the initial IB layout (namelist patch_ib entries, then generated particle-cloud beds) that sim...
impure subroutine, public s_write_serial_data_files(q_cons_vf, q_prim_vf, bc_type, q_t_sf)
Writes grid and initial condition data files to the "0" time-step directory in the local processor ra...
character(len=path_len+2 *name_len), private t_step_dir
Time-step folder into which grid and initial condition data will be placed.
impure subroutine, public s_initialize_data_output_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
impure subroutine, public s_finalize_data_output_module
Resets s_write_data_files pointer.
impure subroutine, public s_write_parallel_data_files(q_cons_vf, q_prim_vf, bc_type, q_t_sf)
Writes grid and initial condition data files in parallel to the "0" time-step directory in the local ...
character(len=path_len+2 *name_len), public restart_dir
Restart data folder.
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Equations of state in Gamma/Pi form, rho e = Gamma(rho) p + Pi(rho).
impure subroutine, public s_finalize_eos_module()
Deallocate the fluid property arrays allocated in s_initialize_eos_module.
impure subroutine, public s_initialize_eos_module()
Resolve every fluid's EOS coefficients once, before any conversion runs.
Defines global parameters for the computational domain, simulation algorithm, and initial conditions.
type(int_bounds_info) ib_bc_z
bc_x/y/z before decomposition overwrites them with MPI neighbor ranks
integer p_glb
Global number of cells in each direction.
impure subroutine s_assign_default_values_to_user_inputs
Assigns default values to user inputs prior to reading them in. This allows for an easier consistency...
impure subroutine s_finalize_global_parameters_module
Deallocate all global grid, index, and equation-of-state parameter arrays.
type(int_bounds_info) ib_bc_y
type(int_bounds_info) ib_bc_x
type(int_bounds_info) bc_z
Boundary conditions in the x-, y- and z-coordinate directions.
real(wp), dimension(:), allocatable y_cc
integer proc_rank
Rank of the local processor Number of cells in the x-, y- and z-coordinate directions.
logical bc_io
whether or not to save BC data
real(wp), dimension(:), allocatable y_cb
type(bounds_info) z_domain
Locations of the domain bounds in the x-, y- and z-coordinate directions.
real(wp), dimension(:), allocatable z_cb
type(int_bounds_info) bc_y
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
Locations of cell-centers (cc) in x-, y- and z-directions, respectively.
type(int_bounds_info) bc_x
real(wp), dimension(:), allocatable x_cb
Locations of cell-boundaries (cb) in x-, y- and z-directions, respectively.
real(wp), dimension(:), allocatable z_cc
integer num_procs
Number of processors.
type(bounds_info) x_domain_glb
Global (pre-decomposition) domain bounds, needed by s_generate_serial_grid to stretch the grid using ...
type(cell_num_bounds) cells_bounds
type(mpi_io_var), public mpi_io_data
impure subroutine s_initialize_parallel_io
Configure MPI parallel I/O settings and allocate processor coordinate arrays.
type(bc_xyz_info) bc
Combined BC storage (used by the shared beta-buffer routines; pre-process-local).
integer(kind=8) nglobal
Global number of cells in the domain.
Generates uniform or stretched rectilinear grids with hyperbolic-tangent spacing.
Definition m_grid.f90:6
impure subroutine, public s_generate_serial_grid
Generate a uniform or stretched rectilinear grid in serial from user parameters.
Definition m_grid.f90:35
impure subroutine, public s_initialize_grid_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
Definition m_grid.f90:289
procedure(s_generate_abstract_grid), pointer, public s_generate_grid
Definition m_grid.f90:29
impure subroutine, public s_generate_parallel_grid
Generate a uniform or stretched rectilinear grid in parallel from user parameters.
Definition m_grid.f90:157
impure subroutine, public s_finalize_grid_module
Deallocation procedures for the module.
Definition m_grid.f90:300
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
elemental subroutine, public s_update_cell_bounds(bounds, m, n, p)
Update the min and max number of cells in each set of axes.
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.
Allocate memory and read initial condition data for IC extrusion.
Assembles initial conditions by layering prioritized patches via constructive solid geometry.
type(ic_context) ic
Initial-condition state (fields, bc types, patch ids).
impure subroutine s_initialize_initial_condition_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
impure subroutine s_finalize_initial_condition_module
Deallocation procedures for the module.
impure subroutine s_generate_initial_condition
Iterate over patches and, depending on the geometry type, call the related subroutine to setup the sa...
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_mpi_barrier
Halts all processes until all have reached barrier.
impure subroutine s_mpi_initialize
Initialize the MPI execution environment and query the number of processors and local rank.
impure subroutine s_check_mpi_file_open(ierr, file_loc)
Abort naming the file if MPI_FILE_OPEN failed. File errors default to MPI_ERRORS_RETURN,...
impure subroutine s_mpi_finalize
The subroutine finalizes the MPI execution environment.
impure subroutine s_initialize_mpi_data(q_cons_vf, ib_markers, ib_mpi_data, beta, qbmm_pb, qbmm_mv)
Set up MPI I/O data views and variable pointers for parallel file output.
subroutine s_mpi_decompose_computational_domain(write_silo_ghost_offsets, adjust_local_domains, output_offsets, local_domains)
The purpose of this procedure is to optimally decompose the computational domain among the available ...
impure subroutine mpi_bcast_time_step_values(proc_time, time_avg)
Gather per-rank time step wall-clock times onto rank 0 for performance reporting.
impure subroutine s_mpi_reduce_min(var_loc)
Reduce a local real value to its global minimum across all ranks.
impure subroutine s_finalize_mpi_common_module
Module deallocation and/or disassociation procedures.
impure subroutine s_initialize_mpi_common_module(exchange_all_chemistry_temperatures_in, use_rdma_transport_in)
Initialize the module.
Broadcasts user inputs and decomposes the domain across MPI ranks for pre-processing.
impure subroutine s_mpi_bcast_user_inputs
Since only processor with rank 0 is in charge of reading and checking the consistency of the user pro...
Generates particle beds by converting particle_cloud patch specifications into individual immersed bo...
impure subroutine, public s_generate_particle_clouds(glb_bounds, particle_cloud_ibs, num_particle_cloud_ibs)
Generate all particle beds and fill particle_cloud_ibs, keeping only the particles this rank owns und...
Phase transition relaxation solvers for liquid-vapor flows with cavitation and boiling.
impure subroutine, public s_finalize_relaxation_solver_module
Finalize the phase change module.
subroutine, public s_infinite_relaxation_k(q_cons_vf)
Apply pT- or pTg-equilibrium relaxation with mass depletion based on the incoming state conditions.
impure subroutine, public s_initialize_phasechange_module
Initialize the phase change module (no module-level state to set up; the pT/pTg relaxation solvers ar...
Reads and validates user inputs, loads existing grid/IC data, and initializes pre-process modules.
impure subroutine, public s_read_serial_ic_data_files(q_cons_vf_in)
The goal of this subroutine is to read in any preexisting initial condition data files so that they m...
impure subroutine, public s_initialize_modules
Initialize all pre-process modules, allocate data structures, and set I/O procedure pointers.
impure subroutine, public s_save_data(proc_time, time_avg, time_final, file_exists)
Gather processor timing data and write elapsed wall-clock time to a summary file.
impure subroutine, public s_write_ib_state_0()
Generates the particle-cloud beds (if any) and writes the initial IB state file that simulation reads...
impure subroutine, public s_apply_initial_condition(start, finish)
Generate or read the initial condition, apply relaxation if needed, and write output data files.
character(len=path_len+name_len) proc_rank_dir
Location of the folder associated with the rank of the local processor.
impure subroutine, public s_read_serial_grid_data_files
The goal of this subroutine is to read in any preexisting grid data as well as based on the imported ...
impure subroutine, public s_read_parallel_ic_data_files(q_cons_vf_in)
The goal of this subroutine is to read in any preexisting initial condition data files so that they m...
procedure(s_read_abstract_ic_data_files), pointer, public s_read_ic_data_files
impure subroutine, public s_read_grid()
Read an existing grid from data files or generate a new grid from user inputs.
impure subroutine, public s_check_grid_data_files
Cell-boundary data are checked for consistency by looking at the (non-)uniform cell-width distributio...
impure subroutine, public s_initialize_mpi_domain
Initialize MPI, read and validate user inputs on rank 0, and decompose the computational domain.
impure subroutine, public s_finalize_modules
Finalize all pre-process modules, deallocate resources, and shut down MPI.
impure subroutine, public s_read_input_file
Reads the configuration file pre_process.inp, in order to populate the parameters in module m_global_...
impure subroutine, public s_check_input_file
Checking that the user inputs make sense, i.e. that the individual choices are compatible with the co...
procedure(s_read_abstract_grid_data_files), pointer, public s_read_grid_data_files
impure subroutine, public s_read_parallel_grid_data_files
Cell-boundary data are checked for consistency by looking at the (non-)uniform cell-width distributio...
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
impure subroutine, public s_finalize_variables_conversion_module()
Deallocate fluid property arrays and post-processing fields allocated during module initialization.
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.
Groups the x, y, z boundary condition begin/end codes for passing as a single argument.
Derived type adding beginning (beg) and end bounds info as attributes.
Derived type annexing an integer scalar field (SF).
Derived type for bubble variables pb and mv at quadrature nodes (qbmm).
Derived type annexing a scalar field (SF).