1# 1 "/home/runner/work/MFC/MFC/src/pre_process/m_data_output.fpp"
23 use m_thermochem,
only: species_names
42 type(
integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
48 character(LEN=path_len + 2*name_len),
private ::
t_step_dir
58 type(
integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
60 character(LEN=15) :: fmt
61 character(LEN=3) :: status
62 character(len=int(floor(log10(real(
sys_size, wp)))) + 1) :: file_num
63 character(LEN=len_trim(t_step_dir) + name_len) :: file_loc
64 integer :: i,
j,
k,
l, r, c
66 real(wp),
dimension(nb) :: nrtmp
68 real(wp) :: gamma, lit_gamma, pi_inf, qv
71 real(wp) :: rhoyks(1:num_species)
95 open (1, file=trim(file_loc), form=
'unformatted', status=status)
101 open (1, file=trim(file_loc), form=
'unformatted', status=status)
107 open (1, file=trim(file_loc), form=
'unformatted', status=status)
114 write (file_num,
'(I0)') i
115 file_loc = trim(
t_step_dir) //
'/q_cons_vf' // trim(file_num) //
'.dat'
116 open (1, file=trim(file_loc), form=
'unformatted', status=status)
124 write (file_num,
'(I0)') r + (i - 1)*nnode +
sys_size
125 file_loc = trim(
t_step_dir) //
'/pb' // trim(file_num) //
'.dat'
126 open (1, file=trim(file_loc), form=
'unformatted', status=status)
127 write (1)
pb%sf(:,:,:,r, i)
134 write (file_num,
'(I0)') r + (i - 1)*nnode +
sys_size
135 file_loc = trim(
t_step_dir) //
'/mv' // trim(file_num) //
'.dat'
136 open (1, file=trim(file_loc), form=
'unformatted', status=status)
137 write (1)
mv%sf(:,:,:,r, i)
157 inquire (file=trim(file_loc), exist=file_exist)
163 if (
n == 0 .and.
p == 0)
then
166 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/prim.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
168 open (2, file=trim(file_loc))
171 do c = 1, num_species
178 lit_gamma = 1._wp/gamma + 1._wp
185 else if (i ==
mom_idx%beg)
then
189 else if (i ==
e_idx)
then
197 & qv, rhoyks, pres, t, pres_mag=pres_mag)
198 write (2, fmt)
x_cb(
j), pres
202 else if (i ==
mom_idx%beg + 2)
then
204 else if (i ==
b_idx%beg)
then
206 else if (i ==
b_idx%beg + 1)
then
235 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
237 open (2, file=trim(file_loc))
247 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
248 &
'.', t_step,
'.dat'
250 open (2, file=trim(file_loc))
252 write (2, fmt)
x_cb(
j),
pb%sf(
j, 0, 0, r, i)
259 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
260 &
'.', t_step,
'.dat'
262 open (2, file=trim(file_loc))
264 write (2, fmt)
x_cb(
j),
mv%sf(
j, 0, 0, r, i)
278 if ((
n > 0) .and. (
p == 0))
then
280 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
281 open (2, file=trim(file_loc))
294 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
295 &
'.', t_step,
'.dat'
297 open (2, file=trim(file_loc))
308 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
309 &
'.', t_step,
'.dat'
311 open (2, file=trim(file_loc))
331 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
332 open (2, file=trim(file_loc))
348 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
349 &
'.', t_step,
'.dat'
351 open (2, file=trim(file_loc))
364 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
365 &
'.', t_step,
'.dat'
367 open (2, file=trim(file_loc))
387 type(
integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
390 integer :: ifile, ierr, data_size
391 integer,
dimension(MPI_STATUS_SIZE) :: status
392 integer(KIND=MPI_OFFSET_KIND) :: disp
393 integer(KIND=MPI_OFFSET_KIND) :: m_mok, n_mok, p_mok
394 integer(KIND=MPI_OFFSET_KIND) :: wp_mok, var_mok, str_mok
395 integer(KIND=MPI_OFFSET_KIND) :: nvars_mok
396 integer(KIND=MPI_OFFSET_KIND) :: mok
397 character(LEN=path_len + 2*name_len) :: file_loc
398 logical :: file_exist, dir_check
399 integer :: i,
j,
k,
l
400 real(wp) :: loc_violations, glb_violations
401 integer :: m_ds, n_ds, p_ds
402 integer :: m_glb_ds, n_glb_ds, p_glb_ds
403 integer :: m_glb_save, n_glb_save, p_glb_save
405 loc_violations = 0._wp
408 if ((mod(
m + 1, 3) > 0) .or. (mod(
n + 1, 3) > 0) .or. (mod(
p + 1, 3) > 0))
then
409 loc_violations = 1._wp
411 call s_mpi_allreduce_sum(loc_violations, glb_violations)
412 if (
proc_rank == 0 .and. nint(glb_violations) > 0)
then
414 &
"WARNING: Attempting to downsample data but there are" &
415 & //
"processors with local problem sizes that are not divisible by 3."
423 file_loc = trim(
case_dir) //
'/restart_data/lustre_0'
425 if (dir_check .neqv. .true.)
then
445 inquire (file=trim(file_loc), exist=file_exist)
446 if (file_exist .and.
proc_rank == 0)
then
449 if (file_exist)
call mpi_file_delete(file_loc,
mpi_info_int, ierr)
450 call mpi_file_open(mpi_comm_self, file_loc, ior(mpi_mode_wronly, mpi_mode_create),
mpi_info_int, ifile, ierr)
453 data_size = (m_ds + 3)*(n_ds + 3)*(p_ds + 3)
454 m_glb_save = m_glb_ds + 3
455 n_glb_save = n_glb_ds + 3
456 p_glb_save = p_glb_ds + 3
458 data_size = (
m + 1)*(
n + 1)*(
p + 1)
459 m_glb_save =
m_glb + 1
460 n_glb_save =
n_glb + 1
461 p_glb_save =
p_glb + 1
465 m_mok = int(m_glb_save, mpi_offset_kind)
466 n_mok = int(n_glb_save, mpi_offset_kind)
467 p_mok = int(p_glb_save, mpi_offset_kind)
468 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
469 mok = int(1._wp, mpi_offset_kind)
470 str_mok = int(name_len, mpi_offset_kind)
471 nvars_mok = int(
sys_size, mpi_offset_kind)
475 var_mok = int(i, mpi_offset_kind)
477 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
481 var_mok = int(i, mpi_offset_kind)
483 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
489 var_mok = int(i, mpi_offset_kind)
491 call mpi_file_write_all(ifile,
q_cons_temp(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
495 var_mok = int(i, mpi_offset_kind)
497 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
502 call mpi_file_close(ifile, ierr)
507 write (file_loc,
'(I0,A)')
n_start,
'.dat'
512 inquire (file=trim(file_loc), exist=file_exist)
513 if (file_exist .and.
proc_rank == 0)
then
516 call mpi_file_open(mpi_comm_world, file_loc, ior(mpi_mode_wronly, mpi_mode_create),
mpi_info_int, ifile, ierr)
518 data_size = (
m + 1)*(
n + 1)*(
p + 1)
521 m_mok = int(
m_glb + 1, mpi_offset_kind)
522 n_mok = int(
n_glb + 1, mpi_offset_kind)
523 p_mok = int(
p_glb + 1, mpi_offset_kind)
524 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
525 mok = int(1._wp, mpi_offset_kind)
526 str_mok = int(name_len, mpi_offset_kind)
527 nvars_mok = int(
sys_size, mpi_offset_kind)
531 var_mok = int(i, mpi_offset_kind)
533 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
536 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
540 var_mok = int(i, mpi_offset_kind)
542 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
545 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
550 var_mok = int(i, mpi_offset_kind)
552 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
555 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
559 call mpi_file_close(ifile, ierr)
576 character(LEN=len_trim(case_dir) + 2*name_len) :: file_loc
577 character(len=15) :: temp
578 character(LEN=1),
dimension(3),
parameter :: coord = (/
'x',
'y',
'z'/)
581 integer :: m_ds, n_ds, p_ds
615 open (1, file=
'indices.dat', status=
'unknown')
617 write (1,
'(A)')
"Warning: The creation of file is currently experimental."
618 write (1,
'(A)')
"This file may contain errors and not support all features."
620 write (1,
'(A3,A20,A20)')
"#",
"Conservative",
"Primitive"
623 write (temp,
'(I0)') i -
contxb + 1
624 write (1,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"} \rho_{" // trim(temp) //
"}", &
625 &
"\alpha_{" // trim(temp) //
"} \rho"
628 write (1,
'(I3,A20,A20)') i,
"\rho u_" // coord(i -
momxb + 1),
"u_" // coord(i -
momxb + 1)
631 write (1,
'(I3,A20,A20)') i,
"\rho U",
"p"
634 write (temp,
'(I0)') i -
contxb + 1
635 write (1,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"}",
"\alpha_{" // trim(temp) //
"}"
638 do i = 1, num_species
639 write (1,
'(I3,A20,A20)')
chemxb + i - 1,
"Y_{" // trim(species_names(i)) //
"} \rho", &
640 &
"Y_{" // trim(species_names(i)) //
"}"
645 if (
momxb /= 0)
write (1,
'("[",I2,",",I2,"]",A)')
momxb,
momxe,
" Momentum"
646 if (
e_idx /= 0)
write (1,
'("[",I2,",",I2,"]",A)')
e_idx,
e_idx,
" Energy/Pressure"
647 if (
advxb /= 0)
write (1,
'("[",I2,",",I2,"]",A)')
advxb,
advxe,
" Advection"
649 if (
bubxb /= 0)
write (1,
'("[",I2,",",I2,"]",A)')
bubxb,
bubxe,
" Bubbles_euler"
650 if (
strxb /= 0)
write (1,
'("[",I2,",",I2,"]",A)')
strxb,
strxe,
" Stress"
651 if (
intxb /= 0)
write (1,
'("[",I2,",",I2,"]",A)')
intxb,
intxe,
" Internal Energies"
657 m_ds = int((
m + 1)/3) - 1
658 n_ds = int((
n + 1)/3) - 1
659 p_ds = int((
p + 1)/3) - 1
663 allocate (
q_cons_temp(i)%sf(-1:m_ds + 1,-1:n_ds + 1,-1:p_ds + 1))
Interface for the conservative data.
type(scalar_field), dimension(sys_size), intent(inout) q_cons_vf
Noncharacteristic and processor boundary condition application for ghost cells and buffer regions.
subroutine, public s_write_serial_boundary_condition_files(q_prim_vf, bc_type, step_dirpath, old_grid_in)
Write boundary condition type and buffer data to serial (unformatted) restart files.
subroutine, public s_write_parallel_boundary_condition_files(q_prim_vf, bc_type)
Write boundary condition type and buffer data to per-rank parallel files using MPI I/O.
impure subroutine, public s_populate_variables_buffers(bc_type, q_prim_vf, pb_in, mv_in)
Populate the buffers of the primitive variables based on the selected boundary conditions.
Applies spatially varying boundary condition patches along domain edges and faces.
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.
type(scalar_field), dimension(:), allocatable q_cons_temp
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.
Rank-staggered file access delays to prevent I/O contention on parallel file systems.
impure subroutine, public delayfileaccess(processrank)
Introduce a rank-dependent busy-wait delay to stagger parallel file access and reduce I/O contention.
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.
logical igr
Use information geometric regularization.
logical, parameter chemistry
Chemistry modeling.
integer mpi_info_int
MPI info for parallel IO with Lustre file systems.
type(int_bounds_info) mom_idx
Indexes of first & last momentum eqns.
type(int_bounds_info) stress_idx
Indexes of elastic shear stress eqns.
integer proc_rank
Rank of the local processor Number of cells in the x-, y- and z-coordinate directions.
integer n_idx
Index of number density.
logical bc_io
whether or not to save BC data
real(wp), dimension(:), allocatable y_cb
character(len=name_len) mpiiofs
integer sys_size
Number of unknowns in the system of equations.
real(wp), dimension(:), allocatable weight
type(int_bounds_info) cont_idx
Indexes of first & last continuity eqns.
type(int_bounds_info) b_idx
Indexes of first and last magnetic field eqns.
integer model_eqns
Multicomponent flow model.
integer precision
Precision of output files.
real(wp), dimension(:), allocatable z_cb
integer num_dims
Number of spatial dimensions.
real(wp), dimension(:), allocatable x_cb
Locations of cell-boundaries (cb) in x-, y- and z-directions, respectively.
logical qbmm
Quadrature moment method.
logical old_grid
Use existing grid data.
type(bub_bounds_info) bub_idx
Indexes of first & last bubble variable eqns.
integer damage_idx
Index of damage state variable (D) for continuum damage model.
real(wp) bx0
Constant magnetic field in the x-direction (1D).
logical adv_n
Solve the number density equation and compute alpha from number density.
character(len=path_len) case_dir
Case folder location.
type(int_bounds_info) adv_idx
Indexes of first & last advection eqns.
logical mhd
Magnetohydrodynamics.
logical parallel_io
Format of the data files.
integer e_idx
Index of total energy equation.
logical down_sample
Down-sample the output data.
logical file_per_process
type of data output
integer t_step_start
Existing IC/grid folder.
type(mpi_io_var), public mpi_io_data
integer alf_idx
Index of void fraction.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
subroutine, public s_downsample_data(q_cons_vf, q_cons_temp, m_ds, n_ds, p_ds, m_glb_ds, n_glb_ds, p_glb_ds)
Downsample conservative variable fields by a factor of 3 in each direction using volume averaging.
subroutine, public s_comp_n_from_cons(vftmp, nrtmp, ntmp, weights)
Compute the bubble number density from the conservative void fraction and weighted bubble radii.
Broadcasts user inputs and decomposes the domain across MPI ranks for pre-processing.
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
real(wp), dimension(:), allocatable, public gammas
real(wp), dimension(:), allocatable, public gs_min
real(wp), dimension(:), allocatable, public qvs
subroutine, public s_compute_pressure(energy, alf, dyn_p, pi_inf, gamma, rho, qv, rhoyks, pres, t, stress, mom, g, pres_mag)
Compute the pressure from the appropriate equation of state.
real(wp), dimension(:), allocatable, public pi_infs
subroutine, public s_convert_to_mixture_variables(q_vf, i, j, k, rho, gamma, pi_inf, qv, re_k, g_k, g)
Dispatch to the s_convert_mixture_to_mixture_variables and s_convert_species_to_mixture_variables sub...
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).