Skip to content

Commit 221b61a

Browse files
danieljvickersCopilotsbryngelson
authored
File-Per-Process IB markers (#1802)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Spencer Bryngelson <sbryngelson@gmail.com>
1 parent d2d8cac commit 221b61a

2 files changed

Lines changed: 52 additions & 18 deletions

File tree

src/post_process/m_data_input.f90

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,12 @@ end subroutine s_setup_mpi_io_params
104104
!> Helper subroutine to read IB data files
105105
impure subroutine s_read_ib_data_files(file_loc_base, t_step)
106106

107-
character(len=*), intent(in) :: file_loc_base
108-
integer, intent(in), optional :: t_step
109-
character(LEN=len_trim(file_loc_base) + 20) :: file_loc
110-
logical :: file_exist
111-
integer :: ifile, ierr, data_size
107+
character(len=*), intent(in) :: file_loc_base
108+
integer, intent(in), optional :: t_step
109+
character(LEN=path_len + 2*name_len) :: file_loc
110+
logical :: file_exist
111+
integer :: ifile, ierr, data_size
112+
character(len=10) :: t_step_string
112113

113114
#ifdef MFC_MPI
114115
integer, dimension(MPI_STATUS_SIZE) :: status
@@ -119,15 +120,29 @@ impure subroutine s_read_ib_data_files(file_loc_base, t_step)
119120

120121
if (.not. ib) return
121122

122-
if (parallel_io) then
123+
if (parallel_io .and. file_per_process) then
124+
call s_int_to_str(t_step, t_step_string)
125+
write (file_loc, '(A,I0,A,i7.7,A)') 'ib_markers_', t_step, '_', proc_rank, '.dat'
126+
file_loc = trim(case_dir) // '/restart_data/lustre_' // trim(t_step_string) // '/' // trim(file_loc)
127+
else if (parallel_io) then
123128
write (file_loc, '(A)') trim(file_loc_base) // 'ib.dat'
124129
else
125130
write (file_loc, '(A)') trim(file_loc_base) // '/ib_data.dat'
126131
end if
127132
inquire (FILE=trim(file_loc), EXIST=file_exist)
128133

129134
if (file_exist) then
130-
if (parallel_io) then
135+
if (parallel_io .and. file_per_process) then
136+
#ifdef MFC_MPI
137+
call MPI_FILE_OPEN(MPI_COMM_SELF, file_loc, MPI_MODE_RDONLY, mpi_info_int, ifile, ierr)
138+
139+
data_size = (m + 1)*(n + 1)*(p + 1)
140+
141+
call MPI_FILE_READ(ifile, MPI_IO_IB_DATA%var%sf, data_size, MPI_INTEGER, status, ierr)
142+
143+
call MPI_FILE_CLOSE(ifile, ierr)
144+
#endif
145+
else if (parallel_io) then
131146
#ifdef MFC_MPI
132147
call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, MPI_MODE_RDONLY, mpi_info_int, ifile, ierr)
133148

src/simulation/m_data_output.fpp

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,7 @@ contains
897897
integer(kind=MPI_OFFSET_kind) :: WP_MOK, var_MOK, MOK
898898
integer :: ifile, ierr, data_size
899899
integer, dimension(MPI_STATUS_SIZE) :: status
900+
character(len=10) :: t_step_string
900901

901902
$:GPU_UPDATE(host='[ib_markers%sf]')
902903

@@ -907,21 +908,39 @@ contains
907908
WP_MOK = int(storage_size(0._stp)/8, MPI_OFFSET_KIND)
908909
MOK = int(1._wp, MPI_OFFSET_KIND)
909910

910-
write (file_loc, '(A)') 'ib.dat'
911-
file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // trim(file_loc)
911+
if (file_per_process) then
912+
call s_int_to_str(time_step, t_step_string)
912913

913-
call s_mpi_barrier()
914-
call s_delay_file_access(proc_rank)
914+
if (proc_rank == 0) then
915+
file_loc = trim(case_dir) // '/restart_data/lustre_' // trim(t_step_string)
916+
call s_create_directory(trim(file_loc))
917+
end if
918+
call s_mpi_barrier()
919+
call s_delay_file_access(proc_rank)
920+
921+
write (file_loc, '(A,I0,A,i7.7,A)') 'ib_markers_', time_step, '_', proc_rank, '.dat'
922+
file_loc = trim(case_dir) // '/restart_data/lustre_' // trim(t_step_string) // '/' // trim(file_loc)
915923

916-
call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), mpi_info_int, ifile, ierr)
924+
call MPI_FILE_OPEN(MPI_COMM_SELF, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), mpi_info_int, ifile, ierr)
925+
call MPI_FILE_WRITE_ALL(ifile, MPI_IO_IB_DATA%var%sf, data_size, MPI_INTEGER, status, ierr)
926+
call MPI_FILE_CLOSE(ifile, ierr)
927+
else
928+
write (file_loc, '(A)') 'ib.dat'
929+
file_loc = trim(case_dir) // '/restart_data' // trim(mpiiofs) // trim(file_loc)
917930

918-
var_MOK = int(sys_size + 1, MPI_OFFSET_KIND)
919-
disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1 + int(time_step/t_step_save))
920-
if (time_step == 0) disp = 0
931+
call s_mpi_barrier()
932+
call s_delay_file_access(proc_rank)
921933

922-
call MPI_FILE_SET_VIEW(ifile, disp, MPI_INTEGER, MPI_IO_IB_DATA%view, 'native', mpi_info_int, ierr)
923-
call MPI_FILE_WRITE_ALL(ifile, MPI_IO_IB_DATA%var%sf, data_size, MPI_INTEGER, status, ierr)
924-
call MPI_FILE_CLOSE(ifile, ierr)
934+
call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), mpi_info_int, ifile, ierr)
935+
936+
var_MOK = int(sys_size + 1, MPI_OFFSET_KIND)
937+
disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1 + int(time_step/t_step_save))
938+
if (time_step == 0) disp = 0
939+
940+
call MPI_FILE_SET_VIEW(ifile, disp, MPI_INTEGER, MPI_IO_IB_DATA%view, 'native', mpi_info_int, ierr)
941+
call MPI_FILE_WRITE_ALL(ifile, MPI_IO_IB_DATA%var%sf, data_size, MPI_INTEGER, status, ierr)
942+
call MPI_FILE_CLOSE(ifile, ierr)
943+
end if
925944
#endif
926945

927946
end subroutine s_write_parallel_ib_data

0 commit comments

Comments
 (0)