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