@@ -109,17 +109,25 @@ contains
109109 end subroutine s_mpi_initialize
110110
111111 !> Set up MPI I/ O data views and variable pointers for parallel file output.
112- impure subroutine s_initialize_mpi_data (q_cons_vf , ib_markers , beta )
112+ impure subroutine s_initialize_mpi_data (q_cons_vf , ib_markers , ib_mpi_data , beta , qbmm_pb , qbmm_mv )
113113
114114 type(scalar_field), dimension (sys_size), intent (in ) :: q_cons_vf
115115 type(integer_field), optional, intent (in ) :: ib_markers
116+ type(mpi_io_ib_var), optional, intent (inout ) :: ib_mpi_data
116117 type(scalar_field), intent (in ), optional :: beta
118+ type(pres_field), intent (in ), optional :: qbmm_pb, qbmm_mv
117119 integer , dimension (num_dims) :: sizes_glb, sizes_loc
118120
119121#ifdef MFC_MPI
120122 integer :: i, j
121123 integer :: ierr !< Generic flag used to identify and report MPI errors
122124 integer :: alt_sys
125+ logical :: bind_qbmm_fields
126+
127+ if (present (qbmm_pb) .neqv. present (qbmm_mv)) then
128+ call s_mpi_abort(' QBMM MPI I/O requires both pressure and moment fields.' )
129+ end if
130+ bind_qbmm_fields = qbmm .and. .not. polytropic .and. present (qbmm_pb) .and. present (qbmm_mv)
123131
124132 if (present (beta)) then
125133 alt_sys = sys_size + 1
@@ -136,16 +144,11 @@ contains
136144 end if
137145
138146 ! Additional variables pb and mv for non- polytropic qbmm
139- if (qbmm .and. .not. polytropic ) then
147+ if (bind_qbmm_fields ) then
140148 do i = 1 , nb
141149 do j = 1 , nnode
142- #ifdef MFC_PRE_PROCESS
143- MPI_IO_DATA%var(sys_size + (i - 1 )* nnode + j)%sf = > pb%sf(0 :m,0 :n,0 :p,j, i)
144- MPI_IO_DATA%var(sys_size + (i - 1 )* nnode + j + nb* nnode)%sf = > mv%sf(0 :m,0 :n,0 :p,j, i)
145- #elif defined (MFC_SIMULATION)
146- MPI_IO_DATA%var(sys_size + (i - 1 )* nnode + j)%sf = > pb_ts(1 )%sf(0 :m,0 :n,0 :p,j, i)
147- MPI_IO_DATA%var(sys_size + (i - 1 )* nnode + j + nb* nnode)%sf = > mv_ts(1 )%sf(0 :m,0 :n,0 :p,j, i)
148- #endif
150+ MPI_IO_DATA%var(sys_size + (i - 1 )* nnode + j)%sf = > qbmm_pb%sf(0 :m,0 :n,0 :p,j, i)
151+ MPI_IO_DATA%var(sys_size + (i - 1 )* nnode + j + nb* nnode)%sf = > qbmm_mv%sf(0 :m,0 :n,0 :p,j, i)
149152 end do
150153 end do
151154 end if
@@ -166,56 +169,46 @@ contains
166169 call MPI_TYPE_COMMIT(MPI_IO_DATA%view(i), ierr)
167170 end do
168171
169- #ifndef MFC_POST_PROCESS
170- if (qbmm .and. .not. polytropic) then
172+ if (bind_qbmm_fields) then
171173 do i = sys_size + 1 , sys_size + 2 * nb* nnode
172174 call MPI_TYPE_CREATE_SUBARRAY(num_dims, sizes_glb, sizes_loc, start_idx, MPI_ORDER_FORTRAN, mpi_p, &
173175 & MPI_IO_DATA%view(i), ierr)
174176 call MPI_TYPE_COMMIT(MPI_IO_DATA%view(i), ierr)
175177 end do
176178 end if
177- #endif
178179
179- # ifndef MFC_PRE_PROCESS
180- if ( present (ib_markers)) then
181- MPI_IO_IB_DATA%var%sf = > ib_markers%sf( 0 :m, 0 :n, 0 :p)
180+ if ( present (ib_markers) .neqv. present (ib_mpi_data)) then
181+ call s_mpi_abort( ' Immersed-boundary MPI I/O requires both marker and descriptor fields. ' )
182+ end if
182183
184+ if (present (ib_markers)) then
185+ ib_mpi_data%var%sf = > ib_markers%sf(0 :m,0 :n,0 :p)
183186 call MPI_TYPE_CREATE_SUBARRAY(num_dims, sizes_glb, sizes_loc, start_idx, MPI_ORDER_FORTRAN, MPI_INTEGER, &
184- & MPI_IO_IB_DATA %view, ierr)
185- call MPI_TYPE_COMMIT(MPI_IO_IB_DATA %view, ierr)
187+ & ib_mpi_data %view, ierr)
188+ call MPI_TYPE_COMMIT(ib_mpi_data %view, ierr)
186189 end if
187- #endif
188190#endif
189191
190192 end subroutine s_initialize_mpi_data
191193
192194 !> Set up MPI I/ O data views for downsampled (coarsened) parallel file output.
193- subroutine s_initialize_mpi_data_ds (q_cons_vf )
195+ subroutine s_initialize_mpi_data_ds (m_ds , n_ds , p_ds , q_cons_vf )
194196
195- type(scalar_field), dimension (sys_size), intent (in ) :: q_cons_vf
196- integer , dimension (num_dims) :: sizes_loc
197- integer , dimension (3 ) :: sf_start_idx
197+ integer , intent (in ) :: m_ds, n_ds, p_ds
198+ type(scalar_field), dimension (sys_size), intent (in ), optional :: q_cons_vf
199+ integer , dimension (num_dims) :: sizes_loc
200+ integer , dimension (3 ) :: sf_start_idx
198201
199202#ifdef MFC_MPI
200- integer :: i, m_ds, n_ds, p_ds, ierr
203+ integer :: i, ierr
201204
202205 sf_start_idx = (/ 0 , 0 , 0 / )
203206
204- #ifndef MFC_POST_PROCESS
205- m_ds = int ((m + 1 )/ 3 ) - 1
206- n_ds = int ((n + 1 )/ 3 ) - 1
207- p_ds = int ((p + 1 )/ 3 ) - 1
208- #else
209- m_ds = m
210- n_ds = n
211- p_ds = p
212- #endif
213-
214- #ifdef MFC_POST_PROCESS
215- do i = 1 , sys_size
216- MPI_IO_DATA%var(i)%sf = > q_cons_vf(i)%sf(- 1 :m_ds + 1 ,- 1 :n_ds + 1 ,- 1 :p_ds + 1 )
217- end do
218- #endif
207+ if (present (q_cons_vf)) then
208+ do i = 1 , sys_size
209+ MPI_IO_DATA%var(i)%sf = > q_cons_vf(i)%sf(- 1 :m_ds + 1 ,- 1 :n_ds + 1 ,- 1 :p_ds + 1 )
210+ end do
211+ end if
219212 ! Define global(g) and local(l) sizes for flow variables
220213 sizes_loc(1 ) = m_ds + 3
221214 if (n > 0 ) then
0 commit comments