60 type(
integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
62 character(LEN=15) :: fmt
63 character(LEN=3) :: status
64 character(len=int(floor(log10(real(sys_size, wp)))) + 1) :: file_num
65 character(LEN=len_trim(t_step_dir) + name_len) :: file_loc
66 integer :: i,
j,
k,
l, r, c
68 real(wp),
dimension(nb) :: nrtmp
70 real(wp) :: gamma, lit_gamma, pi_inf, qv
73 real(wp) :: rhoyks(1:num_species)
93 call s_write_serial_boundary_condition_files(q_prim_vf, bc_type,
t_step_dir, old_grid, q_t_sf)
98 open (1, file=trim(file_loc), form=
'unformatted', status=status)
104 open (1, file=trim(file_loc), form=
'unformatted', status=status)
110 open (1, file=trim(file_loc), form=
'unformatted', status=status)
117 write (file_num,
'(I0)') i
118 file_loc = trim(
t_step_dir) //
'/q_cons_vf' // trim(file_num) //
'.dat'
119 open (1, file=trim(file_loc), form=
'unformatted', status=status)
124 if (qbmm .and. .not. polytropic)
then
127 write (file_num,
'(I0)') r + (i - 1)*
nnode + sys_size
128 file_loc = trim(
t_step_dir) //
'/pb' // trim(file_num) //
'.dat'
129 open (1, file=trim(file_loc), form=
'unformatted', status=status)
130 write (1)
pb%sf(:,:,:,r, i)
137 write (file_num,
'(I0)') r + (i - 1)*
nnode + sys_size
138 file_loc = trim(
t_step_dir) //
'/mv' // trim(file_num) //
'.dat'
139 open (1, file=trim(file_loc), form=
'unformatted', status=status)
140 write (1)
mv%sf(:,:,:,r, i)
157 write (
t_step_dir,
'(A,I0,A,I0)') trim(case_dir) //
'/D'
160 inquire (file=trim(file_loc), exist=file_exist)
164 if (
cfl_dt) t_step = n_start
166 if (n == 0 .and. p == 0)
then
169 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/prim.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
171 open (2, file=trim(file_loc))
174 do c = 1, num_species
175 rhoyks(c) =
q_cons_vf(eqn_idx%species%beg + c - 1)%sf(
j, 0, 0)
181 lit_gamma = 1._wp/gamma + 1._wp
183 if ((i >= eqn_idx%species%beg) .and. (i <= eqn_idx%species%end))
then
185 else if (((i >= eqn_idx%cont%beg) .and. (i <= eqn_idx%cont%end)) .or. ((i >= eqn_idx%adv%beg) &
186 & .and. (i <= eqn_idx%adv%end)) .or. ((i >= eqn_idx%species%beg) .and. (i <= eqn_idx%species%end) &
189 else if (i == eqn_idx%mom%beg)
then
191 else if (i == eqn_idx%stress%beg)
then
193 else if (i == eqn_idx%E)
then
195 pres_mag = 0.5_wp*(bx0**2 +
q_cons_vf(eqn_idx%B%beg)%sf(
j, 0, &
196 & 0)**2 +
q_cons_vf(eqn_idx%B%beg + 1)%sf(
j, 0, 0)**2)
200 & 0.5_wp*(
q_cons_vf(eqn_idx%mom%beg)%sf(
j, 0, 0)**2._wp)/rho, pi_inf, gamma, &
201 & rho, qv, rhoyks, pres, t, pres_mag=pres_mag)
202 write (2, fmt)
x_cb(
j), pres
204 if (i == eqn_idx%mom%beg + 1)
then
206 else if (i == eqn_idx%mom%beg + 2)
then
208 else if (i == eqn_idx%B%beg)
then
210 else if (i == eqn_idx%B%beg + 1)
then
213 else if ((i >= eqn_idx%bub%beg) .and. (i <= eqn_idx%bub%end) .and. bubbles_euler)
then
228 else if (i == eqn_idx%n .and. adv_n .and. bubbles_euler)
then
230 else if (i == eqn_idx%damage)
then
239 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
241 open (2, file=trim(file_loc))
248 if (qbmm .and. .not. polytropic)
then
251 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
252 &
'.', t_step,
'.dat'
254 open (2, file=trim(file_loc))
256 write (2, fmt)
x_cb(
j),
pb%sf(
j, 0, 0, r, i)
263 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
264 &
'.', t_step,
'.dat'
266 open (2, file=trim(file_loc))
268 write (2, fmt)
x_cb(
j),
mv%sf(
j, 0, 0, r, i)
282 if ((n > 0) .and. (p == 0))
then
284 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
285 open (2, file=trim(file_loc))
295 if (qbmm .and. .not. polytropic)
then
298 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
299 &
'.', t_step,
'.dat'
301 open (2, file=trim(file_loc))
312 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
313 &
'.', t_step,
'.dat'
315 open (2, file=trim(file_loc))
335 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
336 open (2, file=trim(file_loc))
349 if (qbmm .and. .not. polytropic)
then
352 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
353 &
'.', t_step,
'.dat'
355 open (2, file=trim(file_loc))
368 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
369 &
'.', t_step,
'.dat'
371 open (2, file=trim(file_loc))
391 type(
integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
395 integer :: ifile, ierr, data_size
396 integer,
dimension(MPI_STATUS_SIZE) :: status
397 integer(KIND=MPI_OFFSET_KIND) :: disp
398 integer(KIND=MPI_OFFSET_KIND) :: m_mok, n_mok, p_mok
399 integer(KIND=MPI_OFFSET_KIND) :: wp_mok, var_mok, str_mok
400 integer(KIND=MPI_OFFSET_KIND) :: nvars_mok
401 integer(KIND=MPI_OFFSET_KIND) :: mok
402 character(LEN=path_len + 2*name_len) :: file_loc
403 logical :: file_exist, dir_check
404 integer :: i,
j,
k,
l
405 real(wp) :: loc_violations, glb_violations
406 integer :: m_ds, n_ds, p_ds
407 integer :: m_glb_ds, n_glb_ds, p_glb_ds
408 integer :: m_glb_save, n_glb_save, p_glb_save
410 loc_violations = 0._wp
412 if (down_sample)
then
413 if ((mod(m + 1, 3) > 0) .or. (mod(n + 1, 3) > 0) .or. (mod(p + 1, 3) > 0))
then
414 loc_violations = 1._wp
416 call s_mpi_allreduce_sum(loc_violations, glb_violations)
417 if (
proc_rank == 0 .and. nint(glb_violations) > 0)
then
419 &
"WARNING: Attempting to downsample data but there are" &
420 & //
"processors with local problem sizes that are not divisible by 3."
426 if (file_per_process)
then
428 file_loc = trim(case_dir) //
'/restart_data/lustre_0'
430 if (dir_check .neqv. .true.)
then
438 if (down_sample)
then
445 write (file_loc,
'(I0,A,i7.7,A)') n_start,
'_',
proc_rank,
'.dat'
447 write (file_loc,
'(I0,A,i7.7,A)') t_step_start,
'_',
proc_rank,
'.dat'
449 file_loc = trim(
restart_dir) //
'/lustre_0' // trim(mpiiofs) // trim(file_loc)
450 inquire (file=trim(file_loc), exist=file_exist)
451 if (file_exist .and.
proc_rank == 0)
then
452 call mpi_file_delete(file_loc, mpi_info_int, ierr)
454 if (file_exist)
call mpi_file_delete(file_loc, mpi_info_int, ierr)
455 call mpi_file_open(mpi_comm_self, file_loc, ior(mpi_mode_wronly, mpi_mode_create), mpi_info_int, ifile, ierr)
457 if (down_sample)
then
458 data_size = (m_ds + 3)*(n_ds + 3)*(p_ds + 3)
459 m_glb_save = m_glb_ds + 3
460 n_glb_save = n_glb_ds + 3
461 p_glb_save = p_glb_ds + 3
463 data_size = (m + 1)*(n + 1)*(p + 1)
464 m_glb_save =
m_glb + 1
465 n_glb_save =
n_glb + 1
466 p_glb_save =
p_glb + 1
470 m_mok = int(m_glb_save, mpi_offset_kind)
471 n_mok = int(n_glb_save, mpi_offset_kind)
472 p_mok = int(p_glb_save, mpi_offset_kind)
473 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
474 mok = int(1._wp, mpi_offset_kind)
475 str_mok = int(
name_len, mpi_offset_kind)
476 nvars_mok = int(sys_size, mpi_offset_kind)
478 if (bubbles_euler)
then
480 var_mok = int(i, mpi_offset_kind)
482 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
484 if (qbmm .and. .not. polytropic)
then
485 do i = sys_size + 1, sys_size + 2*nb*
nnode
486 var_mok = int(i, mpi_offset_kind)
488 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
492 if (down_sample)
then
494 var_mok = int(i, mpi_offset_kind)
496 call mpi_file_write_all(ifile,
q_cons_temp(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
500 var_mok = int(i, mpi_offset_kind)
502 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
507 call mpi_file_close(ifile, ierr)
512 write (file_loc,
'(I0,A)') n_start,
'.dat'
514 write (file_loc,
'(I0,A)') t_step_start,
'.dat'
516 file_loc = trim(
restart_dir) // trim(mpiiofs) // trim(file_loc)
517 inquire (file=trim(file_loc), exist=file_exist)
518 if (file_exist .and.
proc_rank == 0)
then
519 call mpi_file_delete(file_loc, mpi_info_int, ierr)
521 call mpi_file_open(mpi_comm_world, file_loc, ior(mpi_mode_wronly, mpi_mode_create), mpi_info_int, ifile, ierr)
523 data_size = (m + 1)*(n + 1)*(p + 1)
526 m_mok = int(
m_glb + 1, mpi_offset_kind)
527 n_mok = int(
n_glb + 1, mpi_offset_kind)
528 p_mok = int(
p_glb + 1, mpi_offset_kind)
529 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
530 mok = int(1._wp, mpi_offset_kind)
531 str_mok = int(
name_len, mpi_offset_kind)
532 nvars_mok = int(sys_size, mpi_offset_kind)
534 if (bubbles_euler)
then
536 var_mok = int(i, mpi_offset_kind)
538 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
540 call mpi_file_set_view(ifile, disp, mpi_io_p,
mpi_io_data%view(i),
'native', mpi_info_int, ierr)
541 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
543 if (qbmm .and. .not. polytropic)
then
544 do i = sys_size + 1, sys_size + 2*nb*
nnode
545 var_mok = int(i, mpi_offset_kind)
547 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
549 call mpi_file_set_view(ifile, disp, mpi_io_p,
mpi_io_data%view(i),
'native', mpi_info_int, ierr)
550 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
555 var_mok = int(i, mpi_offset_kind)
557 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
559 call mpi_file_set_view(ifile, disp, mpi_io_p,
mpi_io_data%view(i),
'native', mpi_info_int, ierr)
560 call mpi_file_write_all(ifile,
mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
564 call mpi_file_close(ifile, ierr)
570 call s_write_parallel_boundary_condition_files(
q_cons_vf, bc_type)
572 call s_write_parallel_boundary_condition_files(q_prim_vf, bc_type, q_t_sf)
581 character(LEN=len_trim(case_dir) + 2*name_len) :: file_loc
582 character(len=15) :: temp
583 character(LEN=1),
dimension(3),
parameter :: coord = (/
'x',
'y',
'z'/)
586 integer :: m_ds, n_ds, p_ds
588 if (parallel_io .neqv. .true.)
then
592 if (old_grid .neqv. .true.)
then
607 if ((old_grid .neqv. .true.) .and. (
proc_rank == 0))
then
620 open (newunit=iu, file=
'indices.dat', status=
'unknown')
622 write (iu,
'(A)')
"Warning: The creation of file is currently experimental."
623 write (iu,
'(A)')
"This file may contain errors and not support all features."
625 write (iu,
'(A3,A20,A20)')
"#",
"Conservative",
"Primitive"
626 write (iu,
'(A)')
" "
627 do i = eqn_idx%cont%beg, eqn_idx%cont%end
628 write (temp,
'(I0)') i - eqn_idx%cont%beg + 1
629 write (iu,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"} \rho_{" // trim(temp) //
"}", &
630 &
"\alpha_{" // trim(temp) //
"} \rho"
632 do i = eqn_idx%mom%beg, eqn_idx%mom%end
633 write (iu,
'(I3,A20,A20)') i,
"\rho u_" // coord(i - eqn_idx%mom%beg + 1),
"u_" // coord(i - eqn_idx%mom%beg + 1)
635 if (eqn_idx%E /= 0)
write (iu,
'(I3,A20,A20)') eqn_idx%E,
"\rho U",
"p"
636 do i = eqn_idx%adv%beg, eqn_idx%adv%end
637 write (temp,
'(I0)') i - eqn_idx%cont%beg + 1
638 write (iu,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"}",
"\alpha_{" // trim(temp) //
"}"
641 do i = 1, num_species
642 write (iu,
'(I3,A20,A20)') eqn_idx%species%beg + i - 1,
"Y_{" // trim(species_names(i)) //
"} \rho", &
643 &
"Y_{" // trim(species_names(i)) //
"}"
648 call write_range(eqn_idx%cont%beg, eqn_idx%cont%end,
" Continuity")
649 call write_range(eqn_idx%mom%beg, eqn_idx%mom%end,
" Momentum")
650 call write_range(eqn_idx%E, eqn_idx%E,
" Energy/Pressure")
651 call write_range(eqn_idx%adv%beg, eqn_idx%adv%end,
" Advection")
652 call write_range(eqn_idx%bub%beg, eqn_idx%bub%end,
" Bubbles")
653 call write_range(eqn_idx%stress%beg, eqn_idx%stress%end,
" Stress")
654 call write_range(eqn_idx%int_en%beg, eqn_idx%int_en%end,
" Internal Energies")
655 call write_range(eqn_idx%xi%beg, eqn_idx%xi%end,
" Reference Map")
656 call write_range(eqn_idx%B%beg, eqn_idx%B%end,
" Magnetic Field")
657 call write_range(eqn_idx%c, eqn_idx%c,
" Color Function")
658 call write_range(eqn_idx%species%beg, eqn_idx%species%end,
" Chemistry")
662 if (down_sample)
then
663 m_ds = int((m + 1)/3) - 1
664 n_ds = int((n + 1)/3) - 1
665 p_ds = int((p + 1)/3) - 1
669 allocate (
q_cons_temp(i)%sf(-1:m_ds + 1,-1:n_ds + 1,-1:p_ds + 1))
677 integer,
intent(in) :: beg, end
678 character(*),
intent(in) :: label
680 if (beg /= 0)
write (iu,
'("[",I0,",",I0,"]",A)') beg,
end, label