61 type(
integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
63 character(LEN=15) :: fmt
64 character(LEN=3) :: status
65 character(len=int(floor(log10(real(sys_size, wp)))) + 1) :: file_num
66 character(LEN=len_trim(t_step_dir) + name_len) :: file_loc
67 integer :: i,
j,
k,
l, r, c
69 real(wp),
dimension(nb) :: nrtmp
71 real(wp) :: gamma, pi_inf, qv
74 real(wp) :: rhoyks(1:num_species)
99 open (1, file=trim(file_loc), form=
'unformatted', status=status)
105 open (1, file=trim(file_loc), form=
'unformatted', status=status)
111 open (1, file=trim(file_loc), form=
'unformatted', status=status)
118 write (file_num,
'(I0)') i
119 file_loc = trim(
t_step_dir) //
'/q_cons_vf' // trim(file_num) //
'.dat'
120 open (1, file=trim(file_loc), form=
'unformatted', status=status)
125 if (bubbles_lagrange)
then
127 real(stp),
allocatable :: beta_ones(:,:,:)
128 character(LEN=len_trim(t_step_dir) + name_len) :: beta_file_loc
129 integer :: jj, kk, ll
130 allocate (beta_ones(0:m,0:n,0:p))
134 beta_ones(jj, kk, ll) = 1.0_stp
138 write (beta_file_loc,
'(A,I0,A)') trim(
t_step_dir) //
'/q_cons_vf', sys_size + 1,
'.dat'
139 open (1, file=trim(beta_file_loc), form=
'unformatted', status=status)
142 deallocate (beta_ones)
146 if (qbmm .and. .not. polytropic)
then
149 write (file_num,
'(I0)') r + (i - 1)*
nnode + sys_size
150 file_loc = trim(
t_step_dir) //
'/pb' // trim(file_num) //
'.dat'
151 open (1, file=trim(file_loc), form=
'unformatted', status=status)
152 write (1)
pb%sf(:,:,:,r, i)
159 write (file_num,
'(I0)') r + (i - 1)*
nnode + sys_size
160 file_loc = trim(
t_step_dir) //
'/mv' // trim(file_num) //
'.dat'
161 open (1, file=trim(file_loc), form=
'unformatted', status=status)
162 write (1)
mv%sf(:,:,:,r, i)
174 write (
t_step_dir,
'(A,I0,A,I0)') trim(case_dir) //
'/D'
177 inquire (file=trim(file_loc), exist=file_exist)
181 if (
cfl_dt) t_step = n_start
183 if (n == 0 .and. p == 0)
then
186 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/prim.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
188 open (2, file=trim(file_loc))
191 do c = 1, num_species
192 rhoyks(c) =
q_cons_vf(eqn_idx%species%beg + c - 1)%sf(
j, 0, 0)
198 if ((i >= eqn_idx%species%beg) .and. (i <= eqn_idx%species%end))
then
200 else if (((i >= eqn_idx%cont%beg) .and. (i <= eqn_idx%cont%end)) .or. ((i >= eqn_idx%adv%beg) &
201 & .and. (i <= eqn_idx%adv%end)) .or. ((i >= eqn_idx%species%beg) .and. (i <= eqn_idx%species%end) &
204 else if (i == eqn_idx%mom%beg)
then
206 else if (i == eqn_idx%stress%beg)
then
208 else if (i == eqn_idx%E)
then
210 pres_mag = 0.5_wp*(bx0**2 +
q_cons_vf(eqn_idx%B%beg)%sf(
j, 0, &
211 & 0)**2 +
q_cons_vf(eqn_idx%B%beg + 1)%sf(
j, 0, 0)**2)
215 & 0.5_wp*(
q_cons_vf(eqn_idx%mom%beg)%sf(
j, 0, 0)**2._wp)/rho, pi_inf, gamma, &
216 & rho, qv, rhoyks, pres, t, pres_mag=pres_mag)
217 write (2, fmt)
x_cb(
j), pres
219 if (i == eqn_idx%mom%beg + 1)
then
221 else if (i == eqn_idx%mom%beg + 2)
then
223 else if (i == eqn_idx%B%beg)
then
225 else if (i == eqn_idx%B%beg + 1)
then
228 else if ((i >= eqn_idx%bub%beg) .and. (i <= eqn_idx%bub%end) .and. bubbles_euler)
then
243 else if (i == eqn_idx%n .and. adv_n .and. bubbles_euler)
then
245 else if (i == eqn_idx%damage)
then
254 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
256 open (2, file=trim(file_loc))
263 if (qbmm .and. .not. polytropic)
then
266 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
267 &
'.', t_step,
'.dat'
269 open (2, file=trim(file_loc))
271 write (2, fmt)
x_cb(
j),
pb%sf(
j, 0, 0, r, i)
278 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
279 &
'.', t_step,
'.dat'
281 open (2, file=trim(file_loc))
283 write (2, fmt)
x_cb(
j),
mv%sf(
j, 0, 0, r, i)
297 if ((n > 0) .and. (p == 0))
then
299 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
300 open (2, file=trim(file_loc))
310 if (qbmm .and. .not. polytropic)
then
313 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
314 &
'.', t_step,
'.dat'
316 open (2, file=trim(file_loc))
327 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
328 &
'.', t_step,
'.dat'
330 open (2, file=trim(file_loc))
350 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
351 open (2, file=trim(file_loc))
364 if (qbmm .and. .not. polytropic)
then
367 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
368 &
'.', t_step,
'.dat'
370 open (2, file=trim(file_loc))
383 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
384 &
'.', t_step,
'.dat'
386 open (2, file=trim(file_loc))
405 type(scalar_field),
dimension(sys_size),
intent(inout) ::
q_cons_vf, q_prim_vf
406 type(integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
407 type(scalar_field),
optional,
intent(inout) :: q_t_sf
410 integer :: ifile, ierr, data_size
411 integer,
dimension(MPI_STATUS_SIZE) :: status
412 integer(KIND=MPI_OFFSET_KIND) :: disp
413 integer(KIND=MPI_OFFSET_KIND) :: m_mok, n_mok, p_mok
414 integer(KIND=MPI_OFFSET_KIND) :: wp_mok, var_mok, str_mok
415 integer(KIND=MPI_OFFSET_KIND) :: nvars_mok
416 integer(KIND=MPI_OFFSET_KIND) :: mok
417 character(LEN=path_len + 2*name_len) :: file_loc
418 logical :: file_exist, dir_check
419 integer :: i,
j,
k,
l
420 real(wp) :: loc_violations, glb_violations
421 integer :: m_ds, n_ds, p_ds
422 integer :: m_glb_ds, n_glb_ds, p_glb_ds
423 integer :: m_glb_save, n_glb_save, p_glb_save
425 loc_violations = 0._wp
427 if (down_sample)
then
428 if ((mod(m + 1, 3) > 0) .or. (mod(n + 1, 3) > 0) .or. (mod(p + 1, 3) > 0))
then
429 loc_violations = 1._wp
431 call s_mpi_allreduce_sum(loc_violations, glb_violations)
432 if (proc_rank == 0 .and. nint(glb_violations) > 0)
then
434 &
"WARNING: Attempting to downsample data but there are" &
435 & //
"processors with local problem sizes that are not divisible by 3."
437 call s_populate_variables_buffers(bc_type,
q_cons_vf)
441 if (file_per_process)
then
442 if (proc_rank == 0)
then
443 file_loc = trim(case_dir) //
'/restart_data/lustre_0'
444 call my_inquire(file_loc, dir_check)
445 if (dir_check .neqv. .true.)
then
446 call s_create_directory(trim(file_loc))
448 call s_create_directory(trim(file_loc))
451 call s_delay_file_access(proc_rank)
453 if (down_sample)
then
454 call s_initialize_mpi_data_ds(m_ds, n_ds, p_ds)
456 call s_initialize_mpi_data(
q_cons_vf, qbmm_pb=pb, qbmm_mv=mv)
460 write (file_loc,
'(I0,A,i7.7,A)') n_start,
'_', proc_rank,
'.dat'
462 write (file_loc,
'(I0,A,i7.7,A)') t_step_start,
'_', proc_rank,
'.dat'
464 file_loc = trim(
restart_dir) //
'/lustre_0' // trim(mpiiofs) // trim(file_loc)
465 inquire (file=trim(file_loc), exist=file_exist)
466 if (file_exist .and. proc_rank == 0)
then
467 call mpi_file_delete(file_loc, mpi_info_int, ierr)
469 if (file_exist)
call mpi_file_delete(file_loc, mpi_info_int, ierr)
470 call mpi_file_open(mpi_comm_self, file_loc, ior(mpi_mode_wronly, mpi_mode_create), mpi_info_int, ifile, ierr)
472 if (down_sample)
then
473 data_size = (m_ds + 3)*(n_ds + 3)*(p_ds + 3)
474 m_glb_save = m_glb_ds + 3
475 n_glb_save = n_glb_ds + 3
476 p_glb_save = p_glb_ds + 3
478 data_size = (m + 1)*(n + 1)*(p + 1)
479 m_glb_save = m_glb + 1
480 n_glb_save = n_glb + 1
481 p_glb_save = p_glb + 1
485 m_mok = int(m_glb_save, mpi_offset_kind)
486 n_mok = int(n_glb_save, mpi_offset_kind)
487 p_mok = int(p_glb_save, mpi_offset_kind)
488 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
489 mok = int(1._wp, mpi_offset_kind)
490 str_mok = int(name_len, mpi_offset_kind)
491 nvars_mok = int(sys_size, mpi_offset_kind)
493 if (bubbles_euler)
then
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)
499 if (qbmm .and. .not. polytropic)
then
500 do i = sys_size + 1, sys_size + 2*nb*nnode
501 var_mok = int(i, mpi_offset_kind)
503 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
507 if (down_sample)
then
509 var_mok = int(i, mpi_offset_kind)
511 call mpi_file_write_all(ifile,
q_cons_temp(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
515 var_mok = int(i, mpi_offset_kind)
517 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
522 if (bubbles_lagrange)
then
524 real(stp),
allocatable :: beta_ones(:,:,:)
525 integer :: jj, kk, ll
526 allocate (beta_ones(0:m,0:n,0:p))
530 beta_ones(jj, kk, ll) = 1.0_stp
534 call mpi_file_write_all(ifile, beta_ones, data_size*mpi_io_type, mpi_io_p, status, ierr)
535 deallocate (beta_ones)
539 call mpi_file_close(ifile, ierr)
541 call s_initialize_mpi_data(
q_cons_vf, qbmm_pb=pb, qbmm_mv=mv)
544 write (file_loc,
'(I0,A)') n_start,
'.dat'
546 write (file_loc,
'(I0,A)') t_step_start,
'.dat'
548 file_loc = trim(
restart_dir) // trim(mpiiofs) // trim(file_loc)
549 inquire (file=trim(file_loc), exist=file_exist)
550 if (file_exist .and. proc_rank == 0)
then
551 call mpi_file_delete(file_loc, mpi_info_int, ierr)
553 call mpi_file_open(mpi_comm_world, file_loc, ior(mpi_mode_wronly, mpi_mode_create), mpi_info_int, ifile, ierr)
555 data_size = (m + 1)*(n + 1)*(p + 1)
558 m_mok = int(m_glb + 1, mpi_offset_kind)
559 n_mok = int(n_glb + 1, mpi_offset_kind)
560 p_mok = int(p_glb + 1, mpi_offset_kind)
561 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
562 mok = int(1._wp, mpi_offset_kind)
563 str_mok = int(name_len, mpi_offset_kind)
564 nvars_mok = int(sys_size, mpi_offset_kind)
566 if (bubbles_euler)
then
568 var_mok = int(i, mpi_offset_kind)
570 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
572 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(i),
'native', mpi_info_int, ierr)
573 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
575 if (qbmm .and. .not. polytropic)
then
576 do i = sys_size + 1, sys_size + 2*nb*nnode
577 var_mok = int(i, mpi_offset_kind)
579 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
581 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(i),
'native', mpi_info_int, ierr)
582 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
587 var_mok = int(i, mpi_offset_kind)
589 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
591 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(i),
'native', mpi_info_int, ierr)
592 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
596 if (bubbles_lagrange)
then
598 real(stp),
allocatable :: beta_ones(:,:,:)
599 integer :: jj, kk, ll
600 allocate (beta_ones(0:m,0:n,0:p))
604 beta_ones(jj, kk, ll) = 1.0_stp
608 var_mok = int(sys_size + 1, mpi_offset_kind)
609 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
610 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(1),
'native', mpi_info_int, ierr)
611 call mpi_file_write_all(ifile, beta_ones, data_size*mpi_io_type, mpi_io_p, status, ierr)
612 deallocate (beta_ones)
616 call mpi_file_close(ifile, ierr)
622 call s_write_parallel_boundary_condition_files(
q_cons_vf, bc_type)
624 call s_write_parallel_boundary_condition_files(q_prim_vf, bc_type, q_t_sf)
633 character(LEN=len_trim(case_dir) + 2*name_len) :: file_loc
634 character(len=15) :: temp
635 character(LEN=1),
dimension(3),
parameter :: coord = (/
'x',
'y',
'z'/)
638 integer :: m_ds, n_ds, p_ds
640 if (parallel_io .neqv. .true.)
then
641 write (
t_step_dir,
'(A,I0,A)')
'/p_all/p', proc_rank,
'/0'
644 if (old_grid .neqv. .true.)
then
647 call my_inquire(file_loc, dir_check)
649 if (dir_check)
call s_delete_directory(trim(
t_step_dir))
659 if ((old_grid .neqv. .true.) .and. (proc_rank == 0))
then
661 call my_inquire(file_loc, dir_check)
663 if (dir_check)
call s_delete_directory(trim(
restart_dir))
672 open (newunit=iu, file=
'indices.dat', status=
'unknown')
674 write (iu,
'(A)')
"Warning: The creation of file is currently experimental."
675 write (iu,
'(A)')
"This file may contain errors and not support all features."
677 write (iu,
'(A3,A20,A20)')
"#",
"Conservative",
"Primitive"
678 write (iu,
'(A)')
" "
679 do i = eqn_idx%cont%beg, eqn_idx%cont%end
680 write (temp,
'(I0)') i - eqn_idx%cont%beg + 1
681 write (iu,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"} \rho_{" // trim(temp) //
"}", &
682 &
"\alpha_{" // trim(temp) //
"} \rho"
684 do i = eqn_idx%mom%beg, eqn_idx%mom%end
685 write (iu,
'(I3,A20,A20)') i,
"\rho u_" // coord(i - eqn_idx%mom%beg + 1),
"u_" // coord(i - eqn_idx%mom%beg + 1)
687 if (eqn_idx%E /= 0)
write (iu,
'(I3,A20,A20)') eqn_idx%E,
"\rho U",
"p"
688 do i = eqn_idx%adv%beg, eqn_idx%adv%end
689 write (temp,
'(I0)') i - eqn_idx%cont%beg + 1
690 write (iu,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"}",
"\alpha_{" // trim(temp) //
"}"
693 do i = 1, num_species
694 write (iu,
'(I3,A20,A20)') eqn_idx%species%beg + i - 1,
"Y_{" // trim(species_names(i)) //
"} \rho", &
695 &
"Y_{" // trim(species_names(i)) //
"}"
700 call write_range(eqn_idx%cont%beg, eqn_idx%cont%end,
" Continuity")
701 call write_range(eqn_idx%mom%beg, eqn_idx%mom%end,
" Momentum")
702 call write_range(eqn_idx%E, eqn_idx%E,
" Energy/Pressure")
703 call write_range(eqn_idx%adv%beg, eqn_idx%adv%end,
" Advection")
704 call write_range(eqn_idx%bub%beg, eqn_idx%bub%end,
" Bubbles")
705 call write_range(eqn_idx%stress%beg, eqn_idx%stress%end,
" Stress")
706 call write_range(eqn_idx%int_en%beg, eqn_idx%int_en%end,
" Internal Energies")
707 call write_range(eqn_idx%B%beg, eqn_idx%B%end,
" Magnetic Field")
708 call write_range(eqn_idx%c, eqn_idx%c,
" Color Function")
709 call write_range(eqn_idx%species%beg, eqn_idx%species%end,
" Chemistry")
713 if (down_sample)
then
714 m_ds = int((m + 1)/3) - 1
715 n_ds = int((n + 1)/3) - 1
716 p_ds = int((p + 1)/3) - 1
720 allocate (
q_cons_temp(i)%sf(-1:m_ds + 1,-1:n_ds + 1,-1:p_ds + 1))
728 integer,
intent(in) :: beg, end
729 character(*),
intent(in) :: label
731 if (beg /= 0)
write (iu,
'("[",I0,",",I0,"]",A)') beg,
end, label