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# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20
21# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32
33# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34! New line at end of file is required for FYPP
35# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
36# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
37# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
38# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
42# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49
50# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53
54# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59
60# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61
62# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
63! New line at end of file is required for FYPP
64# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
65
66# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
68# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
70# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71
72# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73
74# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75
76# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77
78# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142! New line at end of file is required for FYPP
143# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
144# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
145# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
146# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
148# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151
152# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
154# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155
156# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157
158# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161
162# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165
166# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167
168# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 145 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171! New line at end of file is required for FYPP
172# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
173
174# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175
176# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177
178# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179
180# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181
182# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183
184# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185
186# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223
224# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225
226# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
227
228# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
229! New line at end of file is required for FYPP
230# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
231
232! GPU parallel region (scalar reductions, maxval/minval)
233# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
234
235! GPU parallel loop over threads (most common GPU macro)
236# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237
238! Required closing for GPU_PARALLEL_LOOP
239# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
240
241! Mark routine for device compilation
242# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243
244! Declare device-resident data
245# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! Inner loop within a GPU parallel region
248# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Scoped GPU data region
251# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Host code with device pointers (for MPI with GPU buffers)
254# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Allocate device memory (unscoped)
257# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! Free device memory
260# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Atomic operation on device
263# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! End atomic capture block
266# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Copy data between host and device
269# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Synchronization barrier
272# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Import GPU library module (openacc or omp_lib)
275# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! Emit code only for AMD compiler
278# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Emit code for non-Cray compilers
281# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Emit code only for Cray compiler
284# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Emit code for non-NVIDIA compilers
287# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
290# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291! New line at end of file is required for FYPP
292# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
293
294# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
295
296! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
297! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
298! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
299# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
300
301! Allocate and create GPU device memory
302# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
303
304! Free GPU device memory and deallocate
305# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
306
307! Cray-specific GPU pointer setup for vector fields
308# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
309
310! Cray-specific GPU pointer setup for scalar fields
311# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313! Cray-specific GPU pointer setup for acoustic source spatials
314# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
315
316# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
317
318# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
319! New line at end of file is required for FYPP
320# 6 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp" 2
321
322!> @brief Reads and validates user inputs, loads existing grid/IC data, and initializes pre-process modules
324
327 use m_mpi_proxy
328 use m_mpi_common
330 use m_grid
332 use m_data_output
338 use m_helper
339
340#ifdef MFC_MPI
341 use mpi
342#endif
343
346 use m_helper
348 use m_checker
351
352 implicit none
353
354 private
358
359 abstract interface
360
361 !> Abstract interface for reading grid data files in serial or parallel.
363
365
366 !> Abstract interface for reading initial condition data files in serial or parallel.
367 impure subroutine s_read_abstract_ic_data_files(q_cons_vf_in)
368
369 import :: scalar_field, integer_field, sys_size, pres_field
370
371 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf_in
372
373 end subroutine s_read_abstract_ic_data_files
374 end interface
375
376 character(LEN=path_len + name_len) :: proc_rank_dir !< Location of the folder associated with the rank of the local processor
377 character(LEN=path_len + 2*name_len), private :: t_step_dir !< Path to preexisting time-step folder for restart
380
381contains
382
383 !> Reads the configuration file pre_process.inp, in order to populate the parameters in module m_global_parameters.f90 with the
384 !! user provided inputs
385 impure subroutine s_read_input_file
386
387 character(LEN=name_len) :: file_loc
388 logical :: file_check
389 integer :: iostatus
390 character(len=1000) :: line
391
392# 1 "/home/runner/work/MFC/MFC/build/include/pre_process/generated_namelist.fpp" 1
393! AUTO-GENERATED - do not edit directly. Regenerate: cmake reconfigure
394!
395namelist /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, &
396 & bubbles_lagrange, case_dir, cfl_adap_dt, cfl_const_dt, cont_damage, cyl_coord, dist_type, down_sample, elliptic_smoothing, &
397 & elliptic_smoothing_iters, fft_wrt, file_per_process, fluid_pp, fluid_rho, hyper_cleaning, hyperelasticity, hypoelasticity, &
398 & ib, ib_airfoil, igr, igr_order, loops_x, loops_y, loops_z, m, mhd, mixlayer_perturb, mixlayer_perturb_k0, &
399 & mixlayer_perturb_nk, mixlayer_vel_coef, mixlayer_vel_profile, model_eqns, mpp_lim, muscl_order, n, n_start, n_start_old, &
400 & nb, num_bc_patches, num_fluids, num_ibs, num_patches, num_stl_models, old_grid, old_ic, p, palpha_eps, parallel_io, &
401 & patch_bc, patch_ib, patch_icpp, perturb_flow, perturb_flow_fluid, perturb_flow_mag, perturb_sph, perturb_sph_fluid, &
402 & pi_fac, poly_sigma, polydisperse, polytropic, pre_stress, precision, pref, ptgalpha_eps, qbmm, recon_type, relativity, &
403 & relax, relax_model, rhorv, rhoref, sigr, sigv, sigma, simplex_params, simplex_perturb, stl_models, stretch_x, stretch_y, &
404 & stretch_z, surface_tension, t_step_old, t_step_start, thermal, viscous, weno_order, x_a, x_b, x_domain, y_a, y_b, &
405 & y_domain, z_a, z_b, z_domain
406# 78 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp" 2
407
408 file_loc = 'pre_process.inp'
409 inquire (file=trim(file_loc), exist=file_check)
410
411 if (file_check) then
412 open (1, file=trim(file_loc), form='formatted', status='old', action='read')
413 read (1, nml=user_inputs, iostat=iostatus)
414 if (iostatus /= 0) then
415 backspace(1)
416 read (1, fmt='(A)') line
417 print *, 'Invalid line in namelist: ' // trim(line)
418 call s_mpi_abort('Invalid line in pre_process.inp. It is ' // 'likely due to a datatype mismatch. Exiting.')
419 end if
420 close (1)
421
423
424 m_glb = m
425 n_glb = n
426 p_glb = p
427
428 nglobal = int(m_glb + 1, kind=8)*int(n_glb + 1, kind=8)*int(p_glb + 1, kind=8)
429
430 if (cfl_adap_dt .or. cfl_const_dt) cfl_dt = .true.
431
432 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
433 bc_io = .true.
434 end if
435 else
436 call s_mpi_abort('File pre_process.inp is missing. Exiting.')
437 end if
438
439 end subroutine s_read_input_file
440
441 !> Checking that the user inputs make sense, i.e. that the individual choices are compatible with the code's options and that
442 !! the combination of these choices results into a valid configuration for the pre-process
443 impure subroutine s_check_input_file
444
445 character(LEN=len_trim(case_dir)) :: file_loc
446 logical :: dir_check
447
448 case_dir = adjustl(case_dir)
449
450 file_loc = trim(case_dir) // '/.'
451
452 call my_inquire(file_loc, dir_check)
453
454 if (dir_check .neqv. .true.) then
455 print '(A)', 'WARNING: Ensure that compiler flags/choices in Makefiles match your compiler! '
456 print '(A)', 'WARNING: Ensure that preprocessor flags are enabled! '
457 call s_mpi_abort('Unsupported choice for the value of case_dir.' // 'Exiting.')
458 end if
459
461 call s_check_inputs()
462
463 call s_check_patches()
464
465 if (ib) call s_check_ib_patches()
466
467 end subroutine s_check_input_file
468
469 !> The goal of this subroutine is to read in any preexisting grid data as well as based on the imported grid, complete the
470 !! necessary global computational domain parameters.
472
473 character(LEN=len_trim(case_dir) + 3*name_len) :: file_loc
474 logical :: dir_check
475 logical :: file_check
476
477 write (proc_rank_dir, '(A,I0)') '/p_all/p', proc_rank
478 proc_rank_dir = trim(case_dir) // trim(proc_rank_dir)
479
480 write (t_step_dir, '(A,I0)') '/', t_step_start
481 t_step_dir = trim(proc_rank_dir) // trim(t_step_dir)
482
483 file_loc = trim(t_step_dir) // '/.'
484 call my_inquire(file_loc, dir_check)
485
486 if (dir_check .neqv. .true.) then
487 call s_mpi_abort('Time-step folder ' // trim(t_step_dir) // ' is missing. Exiting.')
488 end if
489
490 file_loc = trim(t_step_dir) // '/x_cb.dat'
491 inquire (file=trim(file_loc), exist=file_check)
492
493 if (file_check) then
494 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
495 read (1) x_cb(-1:m)
496 close (1)
497 else
498 call s_mpi_abort('File x_cb.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
499 end if
500
501 x_cc(0:m) = (x_cb(0:m) + x_cb(-1:(m - 1)))/2._wp
502
503 dx = minval(x_cb(0:m) - x_cb(-1:m - 1))
504 if (num_procs > 1) call s_mpi_reduce_min(dx)
505
506 x_domain%beg = x_cb(-1)
507 x_domain%end = x_cb(m)
508
509 if (n > 0) then
510 file_loc = trim(t_step_dir) // '/y_cb.dat'
511 inquire (file=trim(file_loc), exist=file_check)
512
513 if (file_check) then
514 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
515 read (1) y_cb(-1:n)
516 close (1)
517 else
518 call s_mpi_abort('File y_cb.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
519 end if
520
521 y_cc(0:n) = (y_cb(0:n) + y_cb(-1:(n - 1)))/2._wp
522
523 dy = minval(y_cb(0:n) - y_cb(-1:n - 1))
524 if (num_procs > 1) call s_mpi_reduce_min(dy)
525
526 y_domain%beg = y_cb(-1)
527 y_domain%end = y_cb(n)
528
529 if (p > 0) then
530 file_loc = trim(t_step_dir) // '/z_cb.dat'
531 inquire (file=trim(file_loc), exist=file_check)
532
533 if (file_check) then
534 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
535 read (1) z_cb(-1:p)
536 close (1)
537 else
538 call s_mpi_abort('File z_cb.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
539 end if
540
541 z_cc(0:p) = (z_cb(0:p) + z_cb(-1:(p - 1)))/2._wp
542
543 dz = minval(z_cb(0:p) - z_cb(-1:p - 1))
544 if (num_procs > 1) call s_mpi_reduce_min(dz)
545
546 z_domain%beg = z_cb(-1)
547 z_domain%end = z_cb(p)
548 end if
549 end if
550
551 ! Clean processor dir and create time-step dir (unless reading preexisting IC)
552 if (old_ic .neqv. .true.) then
554 call s_create_directory(trim(proc_rank_dir) // '/0')
555 end if
556
557 end subroutine s_read_serial_grid_data_files
558
559 !> Cell-boundary data are checked for consistency by looking at the (non-)uniform cell-width distributions for all the active
560 !! coordinate directions and making sure that all of the cell-widths are positively valued
561 impure subroutine s_check_grid_data_files
562
563 if (any(x_cb(0:m) - x_cb(-1:m - 1) <= 0._wp)) then
564 call s_mpi_abort('x_cb.dat in ' // trim(t_step_dir) // ' contains non-positive cell-spacings. Exiting.')
565 end if
566
567 if (n > 0) then
568 if (any(y_cb(0:n) - y_cb(-1:n - 1) <= 0._wp)) then
569 call s_mpi_abort('y_cb.dat in ' // trim(t_step_dir) // ' contains non-positive cell-spacings. ' // 'Exiting.')
570 end if
571
572 if (p > 0) then
573 if (any(z_cb(0:p) - z_cb(-1:p - 1) <= 0._wp)) then
574 call s_mpi_abort('z_cb.dat in ' // trim(t_step_dir) // ' contains non-positive cell-spacings' // ' .Exiting.')
575 end if
576 end if
577 end if
578
579 end subroutine s_check_grid_data_files
580
581 !> The goal of this subroutine is to read in any preexisting initial condition data files so that they may be used by the
582 !! pre-process as a starting point in the creation of an all new initial condition.
583 impure subroutine s_read_serial_ic_data_files(q_cons_vf_in)
584
585 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf_in
586 character(LEN=len_trim(case_dir) + 3*name_len) :: file_loc
587 character(len=int(floor(log10(real(sys_size, wp)))) + 1) :: file_num
588 logical :: file_check
589 integer :: i, r
590
591 do i = 1, sys_size
592 write (file_num, '(I0)') i
593 file_loc = trim(t_step_dir) // '/q_cons_vf' // trim(file_num) // '.dat'
594 inquire (file=trim(file_loc), exist=file_check)
595
596 if (file_check) then
597 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
598 read (1) q_cons_vf_in(i)%sf
599 close (1)
600 else
601 call s_mpi_abort('File q_cons_vf' // trim(file_num) // '.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
602 end if
603 end do
604
605 if (qbmm .and. .not. polytropic) then
606 do i = 1, nb
607 do r = 1, nnode
608 write (file_num, '(I0)') sys_size + r + (i - 1)*nnode
609 file_loc = trim(t_step_dir) // '/pb' // trim(file_num) // '.dat'
610 inquire (file=trim(file_loc), exist=file_check)
611
612 if (file_check) then
613 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
614 read (1) pb%sf(:,:,:,r, i)
615 close (1)
616 else
617 call s_mpi_abort('File pb' // trim(file_num) // '.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
618 end if
619 end do
620 end do
621
622 do i = 1, nb
623 do r = 1, nnode
624 write (file_num, '(I0)') sys_size + r + (i - 1)*nnode
625 file_loc = trim(t_step_dir) // '/mv' // trim(file_num) // '.dat'
626 inquire (file=trim(file_loc), exist=file_check)
627
628 if (file_check) then
629 open (1, file=trim(file_loc), form='unformatted', status='old', action='read')
630 read (1) mv%sf(:,:,:,r, i)
631 close (1)
632 else
633 call s_mpi_abort('File mv' // trim(file_num) // '.dat is missing in ' // trim(t_step_dir) // '. Exiting.')
634 end if
635 end do
636 end do
637 end if
638
639 ! Since the preexisting grid and initial condition data files have been read in, the directory associated with the rank of
640 ! the local process may be cleaned out to make room for new pre-process data. In addition, the time-step folder that will
641 ! contain the new grid and initial condition data are also generated.
643 call s_create_directory(trim(proc_rank_dir) // '/0')
644
645 end subroutine s_read_serial_ic_data_files
646
647 !> Cell-boundary data are checked for consistency by looking at the (non-)uniform cell-width distributions for all the active
648 !! coordinate directions and making sure that all of the cell-widths are positively valued
650
651#ifdef MFC_MPI
652 real(wp), allocatable, dimension(:) :: x_cb_glb, y_cb_glb, z_cb_glb
653 integer :: ifile, ierr, data_size
654 integer, dimension(MPI_STATUS_SIZE) :: status
655 character(LEN=path_len + 2*name_len) :: file_loc
656 logical :: file_exist
657
658 allocate (x_cb_glb(-1:m_glb))
659 allocate (y_cb_glb(-1:n_glb))
660 allocate (z_cb_glb(-1:p_glb))
661
662 file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // 'x_cb.dat'
663 inquire (file=trim(file_loc), exist=file_exist)
664
665 if (file_exist) then
666 data_size = m_glb + 2
667 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
668 call mpi_file_read_all(ifile, x_cb_glb, data_size, mpi_p, status, ierr)
669 call mpi_file_close(ifile, ierr)
670 else
671 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
672 end if
673
674 x_cb(-1:m) = x_cb_glb((start_idx(1) - 1):(start_idx(1) + m))
675 x_cc(0:m) = (x_cb(0:m) + x_cb(-1:(m - 1)))/2._wp
676 dx = minval(x_cb(0:m) - x_cb(-1:(m - 1)))
677 if (num_procs > 1) call s_mpi_reduce_min(dx)
678 x_domain%beg = x_cb(-1)
679 x_domain%end = x_cb(m)
680
681 if (n > 0) then
682 file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // 'y_cb.dat'
683 inquire (file=trim(file_loc), exist=file_exist)
684
685 if (file_exist) then
686 data_size = n_glb + 2
687 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
688 call mpi_file_read_all(ifile, y_cb_glb, data_size, mpi_p, status, ierr)
689 call mpi_file_close(ifile, ierr)
690 else
691 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
692 end if
693
694 y_cb(-1:n) = y_cb_glb((start_idx(2) - 1):(start_idx(2) + n))
695 y_cc(0:n) = (y_cb(0:n) + y_cb(-1:(n - 1)))/2._wp
696 dy = minval(y_cb(0:n) - y_cb(-1:(n - 1)))
697 if (num_procs > 1) call s_mpi_reduce_min(dy)
698 y_domain%beg = y_cb(-1)
699 y_domain%end = y_cb(n)
700
701 if (p > 0) then
702 file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // 'z_cb.dat'
703 inquire (file=trim(file_loc), exist=file_exist)
704
705 if (file_exist) then
706 data_size = p_glb + 2
707 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
708 call mpi_file_read_all(ifile, z_cb_glb, data_size, mpi_p, status, ierr)
709 call mpi_file_close(ifile, ierr)
710 else
711 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
712 end if
713
714 z_cb(-1:p) = z_cb_glb((start_idx(3) - 1):(start_idx(3) + p))
715 z_cc(0:p) = (z_cb(0:p) + z_cb(-1:(p - 1)))/2._wp
716 dz = minval(z_cb(0:p) - z_cb(-1:(p - 1)))
717 if (num_procs > 1) call s_mpi_reduce_min(dz)
718 z_domain%beg = z_cb(-1)
719 z_domain%end = z_cb(p)
720 end if
721 end if
722
723 deallocate (x_cb_glb, y_cb_glb, z_cb_glb)
724#endif
725
727
728 !> The goal of this subroutine is to read in any preexisting initial condition data files so that they may be used by the
729 !! pre-process as a starting point in the creation of an all new initial condition.
730 impure subroutine s_read_parallel_ic_data_files(q_cons_vf_in)
731
732 type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf_in
733
734#ifdef MFC_MPI
735 integer :: ifile, ierr, data_size
736 integer, dimension(MPI_STATUS_SIZE) :: status
737 integer(KIND=MPI_OFFSET_KIND) :: disp
738 integer(KIND=MPI_OFFSET_KIND) :: m_mok, n_mok, p_mok
739 integer(KIND=MPI_OFFSET_KIND) :: wp_mok, var_mok
740 integer(KIND=MPI_OFFSET_KIND) :: mok
741 character(LEN=path_len + 2*name_len) :: file_loc
742 logical :: file_exist
743 integer :: i
744
745 if (cfl_adap_dt) then
746 write (file_loc, '(I0,A)') n_start, '.dat'
747 else
748 write (file_loc, '(I0,A)') t_step_start, '.dat'
749 end if
750 file_loc = trim(restart_dir) // trim(mpiiofs) // trim(file_loc)
751 inquire (file=trim(file_loc), exist=file_exist)
752
753 if (file_exist) then
754 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly, mpi_info_int, ifile, ierr)
755
756 call s_initialize_mpi_data(q_cons_vf_in)
757
758 data_size = (m + 1)*(n + 1)*(p + 1)
759
760 ! Resize some integers so MPI can read even the biggest files
761 m_mok = int(m_glb + 1, mpi_offset_kind)
762 n_mok = int(n_glb + 1, mpi_offset_kind)
763 p_mok = int(p_glb + 1, mpi_offset_kind)
764 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
765 mok = int(1._wp, mpi_offset_kind)
766
767 do i = 1, sys_size
768 var_mok = int(i, mpi_offset_kind)
769
770 ! Initial displacement to skip at beginning of file
771 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
772
773 call mpi_file_set_view(ifile, disp, mpi_p, mpi_io_data%view(i), 'native', mpi_info_int, ierr)
774 call mpi_file_read(ifile, mpi_io_data%var(i)%sf, data_size, mpi_p, status, ierr)
775 end do
776
777 if (qbmm .and. .not. polytropic) then
778 do i = sys_size + 1, sys_size + 2*nb*nnode
779 var_mok = int(i, mpi_offset_kind)
780
781 ! Initial displacement to skip at beginning of file
782 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
783
784 call mpi_file_set_view(ifile, disp, mpi_p, mpi_io_data%view(i), 'native', mpi_info_int, ierr)
785 call mpi_file_read(ifile, mpi_io_data%var(i)%sf, data_size, mpi_p, status, ierr)
786 end do
787 end if
788
789 call s_mpi_barrier()
790
791 call mpi_file_close(ifile, ierr)
792 else
793 call s_mpi_abort('File ' // trim(file_loc) // ' is missing. Exiting. ')
794 end if
795
796 call s_mpi_barrier()
797#endif
798
799 end subroutine s_read_parallel_ic_data_files
800
801 !> Initialize all pre-process modules, allocate data structures, and set I/O procedure pointers.
802 impure subroutine s_initialize_modules
803
805 if (bubbles_euler .or. bubbles_lagrange) then
807 end if
813 call s_initialize_perturbation_module()
816 if (relax) call s_initialize_phasechange_module()
817
818 ! Create the D directory if it doesn't exit, to store the serial data files
819 call s_create_directory('D')
820
821 if (parallel_io .neqv. .true.) then
826 else
831 end if
832
833 end subroutine s_initialize_modules
834
835 !> Read an existing grid from data files or generate a new grid from user inputs.
836 impure subroutine s_read_grid()
837
838 if (old_grid) then
841 else
842 if (parallel_io .neqv. .true.) then
843 call s_generate_grid()
844 else
845 if (proc_rank == 0) call s_generate_grid()
846 call s_mpi_barrier()
849 end if
850 end if
851
852 end subroutine s_read_grid
853
854 !> Generate or read the initial condition, apply relaxation if needed, and write output data files.
855 impure subroutine s_apply_initial_condition(start, finish)
856
857 real(wp), intent(inout) :: start, finish
858 integer :: j, k, l
859 real(wp) :: r2
860
861 call cpu_time(start)
862
863 if (old_ic) call s_read_ic_data_files(ic%q_cons_vf)
864
866
867 ! hard-coded psi
868 if (hyper_cleaning) then
869 if (.not. (eqn_idx%psi > 0)) then
870# 540 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
871 call s_mpi_abort("m_start_up.fpp:540: " // "Assertion failed: eqn_idx%psi > 0. " &
872# 540 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
873 & // "hyper_cleaning requires eqn_idx%psi to be set")
874# 540 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
875 end if
876 do l = 0, p
877 do k = 0, n
878 do j = 0, m
879 r2 = x_cc(j)**2
880 if (n > 0) r2 = r2 + y_cc(k)**2
881 if (p > 0) r2 = r2 + z_cc(l)**2
882 ic%q_cons_vf(eqn_idx%psi)%sf(j, k, l) = 1.0e-2_wp*exp(-r2/(2.0_wp*0.05_wp**2))
883 ic%q_prim_vf(eqn_idx%psi)%sf(j, k, l) = ic%q_cons_vf(eqn_idx%psi)%sf(j, k, l)
884 end do
885 end do
886 end do
887 end if
888
889 if (relax) then
890 if (proc_rank == 0) then
891 print *, 'initial condition might have been altered due to enforcement of pTg-equilibrium (relax = "T" activated)'
892 end if
893
894 call s_infinite_relaxation_k(ic%q_cons_vf)
895 end if
896
897 if (chemistry) then
898 call s_write_data_files(ic%q_cons_vf, ic%q_prim_vf, ic%bc_type, ic%q_T_sf)
899 else
900 call s_write_data_files(ic%q_cons_vf, ic%q_prim_vf, ic%bc_type)
901 end if
902
903 call cpu_time(finish)
904
905 end subroutine s_apply_initial_condition
906
907 !> Gather processor timing data and write elapsed wall-clock time to a summary file.
908 impure subroutine s_save_data(proc_time, time_avg, time_final, file_exists)
909
910 real(wp), dimension(:), intent(inout) :: proc_time
911 real(wp), intent(inout) :: time_avg, time_final
912 logical, intent(inout) :: file_exists
913
914 call s_mpi_barrier()
915
916 if (num_procs > 1) then
917 call mpi_bcast_time_step_values(proc_time, time_avg)
918 end if
919
920 if (proc_rank == 0) then
921 time_final = 0._wp
922 if (num_procs == 1) then
923 time_final = time_avg
924 print *, "Elapsed Time", time_final
925 else
926 time_final = maxval(proc_time)
927 print *, "Elapsed Time", time_final
928 end if
929 inquire (file='pre_time_data.dat', exist=file_exists)
930 if (file_exists) then
931 open (1, file='pre_time_data.dat', position='append', status='old')
932 write (1, *) num_procs, time_final
933 close (1)
934 else
935 open (1, file='pre_time_data.dat', status='new')
936 write (1, *) num_procs, time_final
937 close (1)
938 end if
939 end if
940
941 end subroutine s_save_data
942
943 !> Initialize MPI, read and validate user inputs on rank 0, and decompose the computational domain.
944 impure subroutine s_initialize_mpi_domain
945
946 call s_mpi_initialize()
947
948 if (proc_rank == 0) then
950 call s_read_input_file()
951 call s_check_input_file()
952
953 print '(" Pre-processing a ", I0, "x", I0, "x", I0, " case on ", I0, " rank(s)")', m, n, p, num_procs
954 end if
955
956 ! Broadcasting the user inputs to all of the processors and performing the parallel computational domain decomposition.
957 ! Neither procedure has to be carried out if pre-process is in fact not truly executed in parallel.
961
962 end subroutine s_initialize_mpi_domain
963
964 !> Finalize all pre-process modules, deallocate resources, and shut down MPI.
984 end subroutine s_finalize_modules
985
986end 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.
impure subroutine, public s_initialize_boundary_common_module()
Allocate and set up boundary condition buffer arrays for all coordinate directions.
subroutine, public s_finalize_boundary_common_module()
Deallocate boundary condition buffer arrays allocated during module initialization.
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
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)
Inquires on the existence of a directory.
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_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.
Defines global parameters for the computational domain, simulation algorithm, and initial conditions.
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.
real(wp) dz
Minimum cell-widths in the x-, y- and z-coordinate directions.
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(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.
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:286
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:297
Basic floating-point utilities: approximate equality, default detection, and coordinate bounds.
elemental subroutine, public s_update_cell_bounds(bounds, m, n, p)
Updates 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_initialize_mpi_common_module
Initialize the module.
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_initialize_mpi_data(q_cons_vf, ib_markers, beta)
Set up MPI I/O data views and variable pointers for parallel file output.
impure subroutine s_mpi_finalize
The subroutine finalizes the MPI execution environment.
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.
subroutine s_mpi_decompose_computational_domain
Decompose the computational domain among processors by balancing cells per rank in each coordinate di...
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...
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 by setting saturation curve coefficients for pT- or pTg-equilibriu...
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_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_initialize_variables_conversion_module
Initialize the variables conversion module.
impure subroutine s_finalize_variables_conversion_module()
Deallocate fluid property arrays and post-processing fields allocated during module initialization.
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).