1# 1 "/home/runner/work/MFC/MFC/src/pre_process/m_start_up.fpp"
13 use m_mpi_proxy !< message passing interface (mpi) module proxy
20 use m_grid !< procedures to generate (non-)uniform grids
24 use m_data_output !< procedures to write the grid data and the
40 use mpi !< message passing interface (mpi) module
89 dimension(sys_size), &
90 intent(inout) :: q_cons_vf_in
99 character(LEN=path_len + 2*name_len),
private ::
t_step_dir
113 character(LEN=name_len) :: file_loc
116 logical :: file_check
123 character(len=1000) :: line
153 file_loc =
'pre_process.inp'
154 inquire (file=trim(file_loc), exist=file_check)
159 open (1, file=trim(file_loc), form=
'formatted', &
160 status=
'old', action=
'read')
161 read (1, nml=user_inputs, iostat=iostatus)
162 if (iostatus /= 0)
then
164 read (1, fmt=
'(A)') line
165 print *,
'Invalid line in namelist: '//trim(line)
166 call s_mpi_abort(
'Invalid line in pre_process.inp. It is '// &
167 'likely due to a datatype mismatch. Exiting.')
188 call s_mpi_abort(
'File pre_process.inp is missing. Exiting.')
199 character(LEN=len_trim(case_dir)) :: file_loc
212 if (dir_check .neqv. .true.)
then
213 print
'(A)',
'WARNING: Ensure that compiler flags/choices in Makefiles match your compiler! '
214 print
'(A)',
'WARNING: Ensure that preprocessor flags are enabled! '
215 call s_mpi_abort(
'Unsupported choice for the value of case_dir.'// &
235 character(LEN=len_trim(case_dir) + 3*name_len) :: file_loc
242 logical :: file_check
256 if (dir_check .neqv. .true.)
then
258 ' is missing. Exiting.')
265 inquire (file=trim(file_loc), exist=file_check)
269 open (1, file=trim(file_loc), form=
'unformatted', &
270 status=
'old', action=
'read')
274 call s_mpi_abort(
'File x_cb.dat is missing in '// &
295 inquire (file=trim(file_loc), exist=file_check)
299 open (1, file=trim(file_loc), form=
'unformatted', &
300 status=
'old', action=
'read')
304 call s_mpi_abort(
'File y_cb.dat is missing in '// &
324 inquire (file=trim(file_loc), exist=file_check)
328 open (1, file=trim(file_loc), form=
'unformatted', &
329 status=
'old', action=
'read')
333 call s_mpi_abort(
'File z_cb.dat is missing in '// &
358 if (
old_ic .neqv. .true.)
then
373 if (any(
x_cb(0:
m) -
x_cb(-1:
m - 1) <= 0._wp))
then
375 ' contains non-positive cell-spacings. Exiting.')
382 if (any(
y_cb(0:
n) -
y_cb(-1:
n - 1) <= 0._wp))
then
384 ' contains non-positive cell-spacings. '// &
392 if (any(
z_cb(0:
p) -
z_cb(-1:
p - 1) <= 0._wp))
then
394 ' contains non-positive cell-spacings'// &
412 dimension(sys_size), &
413 intent(inout) :: q_cons_vf_in
415 character(LEN=len_trim(case_dir) + 3*name_len) :: file_loc
419 int(floor(log10(real(
sys_size, wp)))) + 1) :: file_num
423 logical :: file_check
434 write (file_num,
'(I0)') i
436 trim(file_num)//
'.dat'
437 inquire (file=trim(file_loc), exist=file_check)
441 open (1, file=trim(file_loc), form=
'unformatted', &
442 status=
'old', action=
'read')
443 read (1) q_cons_vf_in(i)%sf
446 call s_mpi_abort(
'File q_cons_vf'//trim(file_num)// &
459 write (file_num,
'(I0)')
sys_size + r + (i - 1)*nnode
461 trim(file_num)//
'.dat'
462 inquire (file=trim(file_loc), exist=file_check)
466 open (1, file=trim(file_loc), form=
'unformatted', &
467 status=
'old', action=
'read')
468 read (1)
pb%sf(:, :, :, r, i)
483 write (file_num,
'(I0)')
sys_size + r + (i - 1)*4
485 trim(file_num)//
'.dat'
486 inquire (file=trim(file_loc), exist=file_check)
490 open (1, file=trim(file_loc), form=
'unformatted', &
491 status=
'old', action=
'read')
492 read (1)
mv%sf(:, :, :, r, i)
522 real(wp),
allocatable,
dimension(:) :: x_cb_glb, y_cb_glb, z_cb_glb
524 integer :: ifile, ierr, data_size
525 integer,
dimension(MPI_STATUS_SIZE) :: status
527 character(LEN=path_len + 2*name_len) :: file_loc
528 logical :: file_exist
530 allocate (x_cb_glb(-1:
m_glb))
531 allocate (y_cb_glb(-1:
n_glb))
532 allocate (z_cb_glb(-1:
p_glb))
536 inquire (file=trim(file_loc), exist=file_exist)
539 data_size =
m_glb + 2
540 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly,
mpi_info_int, ifile, ierr)
541 call mpi_file_read_all(ifile, x_cb_glb, data_size, mpi_p, status, ierr)
542 call mpi_file_close(ifile, ierr)
544 call s_mpi_abort(
'File '//trim(file_loc)//
' is missing. Exiting. ')
561 inquire (file=trim(file_loc), exist=file_exist)
564 data_size =
n_glb + 2
565 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly,
mpi_info_int, ifile, ierr)
566 call mpi_file_read_all(ifile, y_cb_glb, data_size, mpi_p, status, ierr)
567 call mpi_file_close(ifile, ierr)
569 call s_mpi_abort(
'File '//trim(file_loc)//
' is missing. Exiting. ')
586 inquire (file=trim(file_loc), exist=file_exist)
589 data_size =
p_glb + 2
590 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly,
mpi_info_int, ifile, ierr)
591 call mpi_file_read_all(ifile, z_cb_glb, data_size, mpi_p, status, ierr)
592 call mpi_file_close(ifile, ierr)
594 call s_mpi_abort(
'File '//trim(file_loc)//
' is missing. Exiting. ')
611 deallocate (x_cb_glb, y_cb_glb, z_cb_glb)
625 dimension(sys_size), &
626 intent(inout) :: q_cons_vf_in
630 integer :: ifile, ierr, data_size
631 integer,
dimension(MPI_STATUS_SIZE) :: status
632 integer(KIND=MPI_OFFSET_KIND) :: disp
633 integer(KIND=MPI_OFFSET_KIND) :: m_mok, n_mok, p_mok
634 integer(KIND=MPI_OFFSET_KIND) :: wp_mok, var_mok, str_mok
635 integer(KIND=MPI_OFFSET_KIND) :: nvars_mok
636 integer(KIND=MPI_OFFSET_KIND) :: mok
638 character(LEN=path_len + 2*name_len) :: file_loc
639 logical :: file_exist
645 write (file_loc,
'(I0,A)')
n_start,
'.dat'
650 inquire (file=trim(file_loc), exist=file_exist)
653 call mpi_file_open(mpi_comm_world, file_loc, mpi_mode_rdonly,
mpi_info_int, ifile, ierr)
658 data_size = (
m + 1)*(
n + 1)*(
p + 1)
661 m_mok = int(
m_glb + 1, mpi_offset_kind)
662 n_mok = int(
n_glb + 1, mpi_offset_kind)
663 p_mok = int(
p_glb + 1, mpi_offset_kind)
664 wp_mok = int(8._wp, mpi_offset_kind)
665 mok = int(1._wp, mpi_offset_kind)
666 str_mok = int(name_len, mpi_offset_kind)
667 nvars_mok = int(
sys_size, mpi_offset_kind)
671 var_mok = int(i, mpi_offset_kind)
674 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
676 call mpi_file_set_view(ifile, disp, mpi_p,
mpi_io_data%view(i), &
678 call mpi_file_read(ifile,
mpi_io_data%var(i)%sf, data_size, &
684 var_mok = int(i, mpi_offset_kind)
687 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
689 call mpi_file_set_view(ifile, disp, mpi_p,
mpi_io_data%view(i), &
691 call mpi_file_read(ifile,
mpi_io_data%var(i)%sf, data_size, &
698 call mpi_file_close(ifile, ierr)
701 call s_mpi_abort(
'File '//trim(file_loc)//
' is missing. Exiting. ')
723 call s_initialize_perturbation_module()
769 real(wp),
intent(inout) :: start, finish
801 print *,
'initial condition might have been altered due to enforcement of &
802& pTg-equilirium (relax = "T" activated)'
810 call cpu_time(finish)
814 impure subroutine s_save_data(proc_time, time_avg, time_final, file_exists)
816 real(wp),
dimension(:),
intent(inout) :: proc_time
817 real(wp),
intent(inout) :: time_avg, time_final
818 logical,
intent(inout) :: file_exists
829 time_final = time_avg
830 print *,
"Elapsed Time", time_final
832 time_final = maxval(proc_time)
833 print *,
"Elapsed Time", time_final
835 inquire (file=
'pre_time_data.dat', exist=file_exists)
836 if (file_exists)
then
837 open (1, file=
'pre_time_data.dat', position=
'append', status=
'old')
841 open (1, file=
'pre_time_data.dat', status=
'new')
864 print
'(" Pre-processing a ", I0, "x", I0, "x", I0, " case on ", I0, " rank(s)")',
m,
n,
p,
num_procs
890 call s_finalize_perturbation_module()
Abstract interface for reading grid data files in serial or parallel.
Abstract interface for reading initial condition data files in serial or parallel.
Assigns initial primitive variables to computational cells based on patch geometry.
impure subroutine, public s_initialize_assign_variables_module
Allocates volume fraction sum and sets the patch primitive variable assignment procedure pointer.
impure subroutine, public s_finalize_assign_variables_module
Nullifies 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()
Allocates and sets up boundary condition buffer arrays for all coordinate directions.
subroutine, public s_finalize_boundary_common_module()
Deallocates 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
Validates 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
Validates 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 deletes 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)
Creates 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
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)
Writes grid and initial condition data files in parallel to the "0" time-step directory in the local ...
impure subroutine, public s_write_serial_data_files(q_cons_vf, q_prim_vf, bc_type)
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), 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.
real(wp) perturb_flow_mag
Magnitude of perturbation with perturb_flow flag.
real(wp) mixlayer_perturb_k0
Peak wavenumber of prescribed energy spectra with mixlayer_perturb flag Default value (k0 = 0....
logical cont_damage
continuum damage modeling
integer p_glb
Global number of cells in each direction.
logical igr
Use information geometric regularization.
logical hypoelasticity
activate hypoelasticity
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
Deallocates all global grid, index, and equation-of-state parameter arrays.
integer perturb_flow_fluid
Fluid to be perturbed with perturb_flow flag.
integer recon_type
Reconstruction Type.
integer mpi_info_int
MPI info for parallel IO with Lustre file systems.
logical elliptic_smoothing
type(ib_patch_parameters), dimension(num_patches_max) patch_ib
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.
integer num_fluids
Number of different fluids present in the flow.
integer elliptic_smoothing_iters
logical pre_stress
activate pre_stressed domain
real(wp), dimension(:), allocatable y_cc
integer proc_rank
Rank of the local processor.
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.
character(len=name_len) mpiiofs
integer, dimension(:), allocatable start_idx
Starting cell-center index of local processor in global grid.
integer sys_size
Number of unknowns in the system of equations.
type(simplex_noise_params) simplex_params
integer muscl_order
Order of accuracy for the MUSCL reconstruction.
type(bounds_info) x_domain
real(wp) ptgalpha_eps
trigger parameter for the pTg relaxation procedure, phase change model
integer relax_model
Relax Model.
integer num_patches
Number of patches composing initial condition.
logical ib
Turn immersed boundaries on.
integer num_bc_patches
Number of boundary condition patches.
type(bc_patch_parameters), dimension(num_bc_patches_max) patch_bc
integer model_eqns
Multicomponent flow model.
integer precision
Precision of output files.
logical hyperelasticity
activate hyperelasticity
real(wp), dimension(:), allocatable z_cb
Locations of cell-boundaries (cb) in x-, y- and z-directions, respectively.
type(physical_parameters), dimension(num_fluids_max) fluid_pp
Database of the physical parameters of each of the fluids that is present in the flow....
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
integer mixlayer_perturb_nk
Number of Fourier modes for perturbation with mixlayer_perturb flag.
integer perturb_sph_fluid
Fluid to be perturbed with perturb_sph flag.
type(int_bounds_info) bc_x
real(wp), dimension(:), allocatable x_cb
type(bounds_info) y_domain
logical relax
activate phase change
logical qbmm
Quadrature moment method.
logical old_grid
Use existing grid data.
real(wp) pi_fac
Factor for artificial pi_inf.
logical hyper_cleaning
Hyperbolic cleaning for MHD.
real(wp), dimension(num_fluids_max) fluid_rho
real(wp), dimension(:), allocatable z_cc
Locations of cell-centers (cc) in x-, y- and z-directions, respectively.
real(wp) pref
Reference parameters for Tait EOS.
real(wp) bx0
Constant magnetic field in the x-direction (1D).
logical stretch_z
Grid stretching flags for the x-, y- and z-coordinate directions.
logical adv_n
Solve the number density equation and compute alpha from number density.
integer num_procs
Number of processors.
character(len=path_len) case_dir
Case folder location.
type(ic_patch_parameters), dimension(num_patches_max) patch_icpp
Database of the initial condition patch parameters (icpp) for each of the patches employed in the con...
integer weno_order
Order of accuracy for the WENO reconstruction.
logical mhd
Magnetohydrodynamics.
logical parallel_io
Format of the data files.
type(cell_num_bounds) cells_bounds
logical down_sample
Down-sample the output data.
logical file_per_process
type of data output
real(wp) palpha_eps
trigger parameter for the p relaxation procedure, phase change model
integer t_step_start
Existing IC/grid folder.
type(mpi_io_var), public mpi_io_data
real(wp) mixlayer_vel_coef
Coefficient for the hyperbolic tangent streamwise velocity profile.
impure subroutine s_initialize_parallel_io
Configures MPI parallel I/O settings and allocates processor coordinate arrays.
logical mpp_lim
Alpha limiter.
integer igr_order
IGR reconstruction order.
integer psi_idx
Index of hyperbolic cleaning state variable for MHD.
type(subgrid_bubble_physical_parameters) bub_pp
real(wp) rhorv
standard deviations in R/V
logical relativity
Relativity for RMHD.
integer num_ibs
Number of immersed boundaries.
logical mixlayer_vel_profile
Set hyperbolic tangent streamwise velocity profile.
integer(kind=8) nglobal
Global number of cells in the domain.
logical mixlayer_perturb
Superimpose instability waves to surrounding fluid flow.
Generates uniform or stretched rectilinear grids with hyperbolic-tangent spacing.
impure subroutine, public s_generate_serial_grid
The following subroutine generates either a uniform or non-uniform rectilinear grid in serial,...
impure subroutine, public s_initialize_grid_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
procedure(s_generate_abstract_grid), pointer, public s_generate_grid
impure subroutine, public s_generate_parallel_grid
The following subroutine generates either a uniform or non-uniform rectilinear grid in parallel,...
impure subroutine, public s_finalize_grid_module
Deallocation procedures for the module.
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()
bubbles_euler + polytropic bubbles_euler + non-polytropic bubbles_lagrange + non-polytropic
Allocate memory and read initial condition data for IC extrusion.
Assembles initial conditions by layering prioritized patches via constructive solid geometry.
type(scalar_field), dimension(:), allocatable q_cons_vf
conservative variables
type(integer_field), dimension(:, :), allocatable bc_type
bc_type fields
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.
type(scalar_field), dimension(:), allocatable q_prim_vf
primitive variables
impure subroutine s_generate_initial_condition
This subroutine peruses the patches and depending on the type of geometry associated with a particula...
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
The computation of parameters, the allocation of memory, the association of pointers and/or the execu...
impure subroutine s_mpi_barrier
Halts all processes until all have reached barrier.
impure subroutine s_mpi_initialize
The subroutine initializes the MPI execution environment and queries both the number of processors wh...
impure subroutine s_initialize_mpi_data(q_cons_vf, ib_markers, beta)
impure subroutine s_mpi_finalize
The subroutine finalizes the MPI execution environment.
impure subroutine mpi_bcast_time_step_values(proc_time, time_avg)
Gathers per-rank time step wall-clock times onto rank 0 for performance reporting.
impure subroutine s_mpi_reduce_min(var_loc)
The following subroutine takes the inputted variable and determines its minimum value on the entire c...
impure subroutine s_finalize_mpi_common_module
Module deallocation and/or disassociation procedures.
subroutine s_mpi_decompose_computational_domain
The purpose of this procedure is to optimally decompose the computational domain among the available ...
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
This subroutine finalizes the phase change module.
subroutine, public s_infinite_relaxation_k(q_cons_vf)
This subroutine is created to activate either the pT- (N fluids) or the pTg-equilibrium (2 fluids for...
impure subroutine, public s_initialize_phasechange_module
The purpose of this subroutine is to initialize the phase change module by setting the parameters nee...
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
Initializes all pre-process modules, allocates data structures, and sets I/O procedure pointers.
impure subroutine, public s_save_data(proc_time, time_avg, time_final, file_exists)
Gathers processor timing data and writes elapsed wall-clock time to a summary file.
impure subroutine, public s_apply_initial_condition(start, finish)
Generates or reads the initial condition, applies relaxation if needed, and writes 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()
Reads an existing grid from data files or generates 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
Initializes MPI, reads and validates user inputs on rank 0, and decomposes the computational domain.
impure subroutine, public s_finalize_modules
Finalizes all pre-process modules, deallocates resources, and shuts 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
The computation of parameters, the allocation of memory, the association of pointers and/or the execu...
impure subroutine s_finalize_variables_conversion_module()
Deallocates 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).