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, lit_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)
179 write (
t_step_dir,
'(A,I0,A,I0)') trim(case_dir) //
'/D'
182 inquire (file=trim(file_loc), exist=file_exist)
186 if (
cfl_dt) t_step = n_start
188 if (n == 0 .and. p == 0)
then
191 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/prim.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
193 open (2, file=trim(file_loc))
196 do c = 1, num_species
197 rhoyks(c) =
q_cons_vf(eqn_idx%species%beg + c - 1)%sf(
j, 0, 0)
203 lit_gamma = 1._wp/gamma + 1._wp
205 if ((i >= eqn_idx%species%beg) .and. (i <= eqn_idx%species%end))
then
207 else if (((i >= eqn_idx%cont%beg) .and. (i <= eqn_idx%cont%end)) .or. ((i >= eqn_idx%adv%beg) &
208 & .and. (i <= eqn_idx%adv%end)) .or. ((i >= eqn_idx%species%beg) .and. (i <= eqn_idx%species%end) &
211 else if (i == eqn_idx%mom%beg)
then
213 else if (i == eqn_idx%stress%beg)
then
215 else if (i == eqn_idx%E)
then
217 pres_mag = 0.5_wp*(bx0**2 +
q_cons_vf(eqn_idx%B%beg)%sf(
j, 0, &
218 & 0)**2 +
q_cons_vf(eqn_idx%B%beg + 1)%sf(
j, 0, 0)**2)
222 & 0.5_wp*(
q_cons_vf(eqn_idx%mom%beg)%sf(
j, 0, 0)**2._wp)/rho, pi_inf, gamma, &
223 & rho, qv, rhoyks, pres, t, pres_mag=pres_mag)
224 write (2, fmt)
x_cb(
j), pres
226 if (i == eqn_idx%mom%beg + 1)
then
228 else if (i == eqn_idx%mom%beg + 2)
then
230 else if (i == eqn_idx%B%beg)
then
232 else if (i == eqn_idx%B%beg + 1)
then
235 else if ((i >= eqn_idx%bub%beg) .and. (i <= eqn_idx%bub%end) .and. bubbles_euler)
then
250 else if (i == eqn_idx%n .and. adv_n .and. bubbles_euler)
then
252 else if (i == eqn_idx%damage)
then
261 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
263 open (2, file=trim(file_loc))
270 if (qbmm .and. .not. polytropic)
then
273 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
274 &
'.', t_step,
'.dat'
276 open (2, file=trim(file_loc))
278 write (2, fmt)
x_cb(
j),
pb%sf(
j, 0, 0, r, i)
285 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
286 &
'.', t_step,
'.dat'
288 open (2, file=trim(file_loc))
290 write (2, fmt)
x_cb(
j),
mv%sf(
j, 0, 0, r, i)
304 if ((n > 0) .and. (p == 0))
then
306 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
307 open (2, file=trim(file_loc))
317 if (qbmm .and. .not. polytropic)
then
320 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
321 &
'.', t_step,
'.dat'
323 open (2, file=trim(file_loc))
334 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
335 &
'.', t_step,
'.dat'
337 open (2, file=trim(file_loc))
357 write (file_loc,
'(A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/cons.', i,
'.',
proc_rank,
'.', t_step,
'.dat'
358 open (2, file=trim(file_loc))
371 if (qbmm .and. .not. polytropic)
then
374 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/pres.', i,
'.', r,
'.',
proc_rank, &
375 &
'.', t_step,
'.dat'
377 open (2, file=trim(file_loc))
390 write (file_loc,
'(A,I0,A,I0,A,I2.2,A,I6.6,A)') trim(
t_step_dir) //
'/mv.', i,
'.', r,
'.',
proc_rank, &
391 &
'.', t_step,
'.dat'
393 open (2, file=trim(file_loc))
412 type(scalar_field),
dimension(sys_size),
intent(inout) ::
q_cons_vf, q_prim_vf
413 type(integer_field),
dimension(1:num_dims,-1:1),
intent(in) :: bc_type
414 type(scalar_field),
optional,
intent(inout) :: q_t_sf
417 integer :: ifile, ierr, data_size
418 integer,
dimension(MPI_STATUS_SIZE) :: status
419 integer(KIND=MPI_OFFSET_KIND) :: disp
420 integer(KIND=MPI_OFFSET_KIND) :: m_mok, n_mok, p_mok
421 integer(KIND=MPI_OFFSET_KIND) :: wp_mok, var_mok, str_mok
422 integer(KIND=MPI_OFFSET_KIND) :: nvars_mok
423 integer(KIND=MPI_OFFSET_KIND) :: mok
424 character(LEN=path_len + 2*name_len) :: file_loc
425 logical :: file_exist, dir_check
426 integer :: i,
j,
k,
l
427 real(wp) :: loc_violations, glb_violations
428 integer :: m_ds, n_ds, p_ds
429 integer :: m_glb_ds, n_glb_ds, p_glb_ds
430 integer :: m_glb_save, n_glb_save, p_glb_save
432 loc_violations = 0._wp
434 if (down_sample)
then
435 if ((mod(m + 1, 3) > 0) .or. (mod(n + 1, 3) > 0) .or. (mod(p + 1, 3) > 0))
then
436 loc_violations = 1._wp
438 call s_mpi_allreduce_sum(loc_violations, glb_violations)
439 if (proc_rank == 0 .and. nint(glb_violations) > 0)
then
441 &
"WARNING: Attempting to downsample data but there are" &
442 & //
"processors with local problem sizes that are not divisible by 3."
444 call s_populate_variables_buffers(bc_type,
q_cons_vf)
448 if (file_per_process)
then
449 if (proc_rank == 0)
then
450 file_loc = trim(case_dir) //
'/restart_data/lustre_0'
451 call my_inquire(file_loc, dir_check)
452 if (dir_check .neqv. .true.)
then
453 call s_create_directory(trim(file_loc))
455 call s_create_directory(trim(file_loc))
458 call delayfileaccess(proc_rank)
460 if (down_sample)
then
467 write (file_loc,
'(I0,A,i7.7,A)') n_start,
'_', proc_rank,
'.dat'
469 write (file_loc,
'(I0,A,i7.7,A)') t_step_start,
'_', proc_rank,
'.dat'
471 file_loc = trim(
restart_dir) //
'/lustre_0' // trim(mpiiofs) // trim(file_loc)
472 inquire (file=trim(file_loc), exist=file_exist)
473 if (file_exist .and. proc_rank == 0)
then
474 call mpi_file_delete(file_loc, mpi_info_int, ierr)
476 if (file_exist)
call mpi_file_delete(file_loc, mpi_info_int, ierr)
477 call mpi_file_open(mpi_comm_self, file_loc, ior(mpi_mode_wronly, mpi_mode_create), mpi_info_int, ifile, ierr)
479 if (down_sample)
then
480 data_size = (m_ds + 3)*(n_ds + 3)*(p_ds + 3)
481 m_glb_save = m_glb_ds + 3
482 n_glb_save = n_glb_ds + 3
483 p_glb_save = p_glb_ds + 3
485 data_size = (m + 1)*(n + 1)*(p + 1)
486 m_glb_save = m_glb + 1
487 n_glb_save = n_glb + 1
488 p_glb_save = p_glb + 1
492 m_mok = int(m_glb_save, mpi_offset_kind)
493 n_mok = int(n_glb_save, mpi_offset_kind)
494 p_mok = int(p_glb_save, mpi_offset_kind)
495 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
496 mok = int(1._wp, mpi_offset_kind)
497 str_mok = int(name_len, mpi_offset_kind)
498 nvars_mok = int(sys_size, mpi_offset_kind)
500 if (bubbles_euler)
then
502 var_mok = int(i, mpi_offset_kind)
504 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
506 if (qbmm .and. .not. polytropic)
then
507 do i = sys_size + 1, sys_size + 2*nb*nnode
508 var_mok = int(i, mpi_offset_kind)
510 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
514 if (down_sample)
then
516 var_mok = int(i, mpi_offset_kind)
518 call mpi_file_write_all(ifile,
q_cons_temp(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
522 var_mok = int(i, mpi_offset_kind)
524 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
529 if (bubbles_lagrange)
then
531 real(stp),
allocatable :: beta_ones(:,:,:)
532 integer :: jj, kk, ll
533 allocate (beta_ones(0:m,0:n,0:p))
537 beta_ones(jj, kk, ll) = 1.0_stp
541 call mpi_file_write_all(ifile, beta_ones, data_size*mpi_io_type, mpi_io_p, status, ierr)
542 deallocate (beta_ones)
546 call mpi_file_close(ifile, ierr)
551 write (file_loc,
'(I0,A)') n_start,
'.dat'
553 write (file_loc,
'(I0,A)') t_step_start,
'.dat'
555 file_loc = trim(
restart_dir) // trim(mpiiofs) // trim(file_loc)
556 inquire (file=trim(file_loc), exist=file_exist)
557 if (file_exist .and. proc_rank == 0)
then
558 call mpi_file_delete(file_loc, mpi_info_int, ierr)
560 call mpi_file_open(mpi_comm_world, file_loc, ior(mpi_mode_wronly, mpi_mode_create), mpi_info_int, ifile, ierr)
562 data_size = (m + 1)*(n + 1)*(p + 1)
565 m_mok = int(m_glb + 1, mpi_offset_kind)
566 n_mok = int(n_glb + 1, mpi_offset_kind)
567 p_mok = int(p_glb + 1, mpi_offset_kind)
568 wp_mok = int(storage_size(0._stp)/8, mpi_offset_kind)
569 mok = int(1._wp, mpi_offset_kind)
570 str_mok = int(name_len, mpi_offset_kind)
571 nvars_mok = int(sys_size, mpi_offset_kind)
573 if (bubbles_euler)
then
575 var_mok = int(i, mpi_offset_kind)
577 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
579 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(i),
'native', mpi_info_int, ierr)
580 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
582 if (qbmm .and. .not. polytropic)
then
583 do i = sys_size + 1, sys_size + 2*nb*nnode
584 var_mok = int(i, mpi_offset_kind)
586 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
588 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(i),
'native', mpi_info_int, ierr)
589 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
594 var_mok = int(i, mpi_offset_kind)
596 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
598 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(i),
'native', mpi_info_int, ierr)
599 call mpi_file_write_all(ifile, mpi_io_data%var(i)%sf, data_size*mpi_io_type, mpi_io_p, status, ierr)
603 if (bubbles_lagrange)
then
605 real(stp),
allocatable :: beta_ones(:,:,:)
606 integer :: jj, kk, ll
607 allocate (beta_ones(0:m,0:n,0:p))
611 beta_ones(jj, kk, ll) = 1.0_stp
615 var_mok = int(sys_size + 1, mpi_offset_kind)
616 disp = m_mok*max(mok, n_mok)*max(mok, p_mok)*wp_mok*(var_mok - 1)
617 call mpi_file_set_view(ifile, disp, mpi_io_p, mpi_io_data%view(1),
'native', mpi_info_int, ierr)
618 call mpi_file_write_all(ifile, beta_ones, data_size*mpi_io_type, mpi_io_p, status, ierr)
619 deallocate (beta_ones)
623 call mpi_file_close(ifile, ierr)
629 call s_write_parallel_boundary_condition_files(
q_cons_vf, bc_type)
631 call s_write_parallel_boundary_condition_files(q_prim_vf, bc_type, q_t_sf)
640 character(LEN=len_trim(case_dir) + 2*name_len) :: file_loc
641 character(len=15) :: temp
642 character(LEN=1),
dimension(3),
parameter :: coord = (/
'x',
'y',
'z'/)
645 integer :: m_ds, n_ds, p_ds
647 if (parallel_io .neqv. .true.)
then
648 write (
t_step_dir,
'(A,I0,A)')
'/p_all/p', proc_rank,
'/0'
651 if (old_grid .neqv. .true.)
then
654 call my_inquire(file_loc, dir_check)
656 if (dir_check)
call s_delete_directory(trim(
t_step_dir))
666 if ((old_grid .neqv. .true.) .and. (proc_rank == 0))
then
668 call my_inquire(file_loc, dir_check)
670 if (dir_check)
call s_delete_directory(trim(
restart_dir))
679 open (newunit=iu, file=
'indices.dat', status=
'unknown')
681 write (iu,
'(A)')
"Warning: The creation of file is currently experimental."
682 write (iu,
'(A)')
"This file may contain errors and not support all features."
684 write (iu,
'(A3,A20,A20)')
"#",
"Conservative",
"Primitive"
685 write (iu,
'(A)')
" "
686 do i = eqn_idx%cont%beg, eqn_idx%cont%end
687 write (temp,
'(I0)') i - eqn_idx%cont%beg + 1
688 write (iu,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"} \rho_{" // trim(temp) //
"}", &
689 &
"\alpha_{" // trim(temp) //
"} \rho"
691 do i = eqn_idx%mom%beg, eqn_idx%mom%end
692 write (iu,
'(I3,A20,A20)') i,
"\rho u_" // coord(i - eqn_idx%mom%beg + 1),
"u_" // coord(i - eqn_idx%mom%beg + 1)
694 if (eqn_idx%E /= 0)
write (iu,
'(I3,A20,A20)') eqn_idx%E,
"\rho U",
"p"
695 do i = eqn_idx%adv%beg, eqn_idx%adv%end
696 write (temp,
'(I0)') i - eqn_idx%cont%beg + 1
697 write (iu,
'(I3,A20,A20)') i,
"\alpha_{" // trim(temp) //
"}",
"\alpha_{" // trim(temp) //
"}"
700 do i = 1, num_species
701 write (iu,
'(I3,A20,A20)') eqn_idx%species%beg + i - 1,
"Y_{" // trim(species_names(i)) //
"} \rho", &
702 &
"Y_{" // trim(species_names(i)) //
"}"
707 call write_range(eqn_idx%cont%beg, eqn_idx%cont%end,
" Continuity")
708 call write_range(eqn_idx%mom%beg, eqn_idx%mom%end,
" Momentum")
709 call write_range(eqn_idx%E, eqn_idx%E,
" Energy/Pressure")
710 call write_range(eqn_idx%adv%beg, eqn_idx%adv%end,
" Advection")
711 call write_range(eqn_idx%bub%beg, eqn_idx%bub%end,
" Bubbles")
712 call write_range(eqn_idx%stress%beg, eqn_idx%stress%end,
" Stress")
713 call write_range(eqn_idx%int_en%beg, eqn_idx%int_en%end,
" Internal Energies")
714 call write_range(eqn_idx%xi%beg, eqn_idx%xi%end,
" Reference Map")
715 call write_range(eqn_idx%B%beg, eqn_idx%B%end,
" Magnetic Field")
716 call write_range(eqn_idx%c, eqn_idx%c,
" Color Function")
717 call write_range(eqn_idx%species%beg, eqn_idx%species%end,
" Chemistry")
721 if (down_sample)
then
722 m_ds = int((m + 1)/3) - 1
723 n_ds = int((n + 1)/3) - 1
724 p_ds = int((p + 1)/3) - 1
728 allocate (
q_cons_temp(i)%sf(-1:m_ds + 1,-1:n_ds + 1,-1:p_ds + 1))
736 integer,
intent(in) :: beg, end
737 character(*),
intent(in) :: label
739 if (beg /= 0)
write (iu,
'("[",I0,",",I0,"]",A)') beg,
end, label