@@ -89,20 +89,71 @@ def read_mesh_data(
8989
9090 with h5pyfile (filename , "r" , comm = comm ) as h5file :
9191 hdf = h5file ["VTKHDF" ]
92- num_cells_global = hdf ["Types" ].size
9392
94- local_cell_range = compute_local_range (comm , num_cells_global )
95- cell_types_local = hdf ["Types" ][local_cell_range [0 ] : local_cell_range [1 ]]
93+ if time is None :
94+ num_cells_global = hdf ["Types" ].size
95+ local_cell_range = compute_local_range (comm , num_cells_global )
96+ cell_types_local = hdf ["Types" ][slice (* local_cell_range )]
97+
98+ num_points_global = hdf ["NumberOfPoints" ][0 ]
99+ local_point_range = compute_local_range (comm , num_points_global )
100+ points_local = hdf ["Points" ][slice (* local_point_range )]
101+
102+ # Connectivity read
103+ offsets = hdf ["Offsets" ]
104+ local_connectivity_offset = offsets [local_cell_range [0 ] : local_cell_range [1 ] + 1 ]
105+ topology = hdf ["Connectivity" ][
106+ local_connectivity_offset [0 ] : local_connectivity_offset [- 1 ]
107+ ]
108+ offset = local_connectivity_offset - local_connectivity_offset [0 ]
109+ else :
110+ if "Steps" not in hdf .keys ():
111+ raise RuntimeError (f"No timestepping information found in { filename } ." )
112+ stamps = hdf ["Steps" ]["Values" ][:]
113+ pos = np .flatnonzero (np .isclose (stamps , time ))
114+ if len (pos ) == 0 :
115+ raise RuntimeError (f"Could not find mesh at t={ time } in { filename } ." )
116+ elif len (pos ) > 1 :
117+ raise RuntimeError (f"Multiple time steps for mesh at t={ time } in { filename } " )
96118
97- num_points_global = hdf [ "NumberOfPoints" ][ 0 ]
98- local_point_range = compute_local_range ( comm , num_points_global )
99- points_local = hdf ["Points " ][local_point_range [ 0 ] : local_point_range [ 1 ]]
119+ # Get number of points
120+ point_node = hdf [ "Points" ]
121+ step_start = hdf ["Steps " ]["PointOffsets" ][ pos [ 0 ]]
100122
101- # Connectivity read
102- offsets = hdf ["Offsets" ]
103- local_connectivity_offset = offsets [local_cell_range [0 ] : local_cell_range [1 ] + 1 ]
104- topology = hdf ["Connectivity" ][local_connectivity_offset [0 ] : local_connectivity_offset [- 1 ]]
105- offset = local_connectivity_offset - local_connectivity_offset [0 ]
123+ # NOTE: currently, it doesn't seem like we follow:
124+ # https://docs.vtk.org/en/latest/vtk_file_formats/vtkhdf_file_format/vtkhdf_specifications.html#temporal-unstructuredgrid-and-polydata
125+ # As only one num_points is stored irregardless of time steps added.
126+ if hdf ["NumberOfPoints" ].shape [0 ] != len (stamps ):
127+ num_pts = hdf ["NumberOfPoints" ][0 ]
128+ else :
129+ num_pts = hdf ["NumberOfPoints" ][pos [0 ]]
130+ lr = compute_local_range (comm , num_pts )
131+ points_local = point_node [step_start + lr [0 ] : step_start + lr [1 ]]
132+
133+ # Get cell-types in step
134+ cell_start = hdf ["Steps" ]["CellOffsets" ][pos [0 ]]
135+ if hdf ["NumberOfCells" ].shape [0 ] != len (stamps ):
136+ num_cells = hdf ["NumberOfCells" ][0 ]
137+ else :
138+ num_cells = hdf ["NumberOfCells" ][pos [0 ]]
139+ local_cell_range = compute_local_range (comm , num_cells )
140+ cell_types_local = hdf ["Types" ][
141+ cell_start + local_cell_range [0 ] : cell_start + local_cell_range [1 ]
142+ ]
143+
144+ # Get connectivity in step
145+ connectivity_start = hdf ["Steps" ]["ConnectivityIdOffsets" ][pos [0 ]]
146+ # Connectivity read
147+ offsets = hdf ["Offsets" ]
148+ local_connectivity_offset = offsets [
149+ connectivity_start + local_cell_range [0 ] : connectivity_start
150+ + local_cell_range [1 ]
151+ + 1
152+ ]
153+ topology = hdf ["Connectivity" ][
154+ local_connectivity_offset [0 ] : local_connectivity_offset [- 1 ]
155+ ]
156+ offset = local_connectivity_offset - local_connectivity_offset [0 ]
106157
107158 # NOTE: Currently we limit ourselfs to a single celltype, as it makes life easier,
108159 # other things have to change in `MeshReadData` to support this.
@@ -172,13 +223,15 @@ def read_point_data(
172223 raise RuntimeError (f"Could not find { name } (t={ time } ) in { filename } ." )
173224 elif len (pos ) > 1 :
174225 raise RuntimeError (f"Multiple time steps for { name } (t={ time } ) in { filename } " )
175- pd_offsets = hdf ["Steps" ]["PointDataOffsets" ][name ][:]
176- pd_offsets = np .hstack ([pd_offsets , [func_node .shape [0 ]]])
177-
178- step_start = pd_offsets [pos [0 ]]
179- step_end = pd_offsets [pos [0 ] + 1 ]
180- global_size = step_end - step_start
181- lr = compute_local_range (comm , global_size )
226+ step_start = hdf ["Steps" ]["PointDataOffsets" ][name ][pos [0 ]]
227+ # NOTE: currently, it doesn't seem like we follow:
228+ # https://docs.vtk.org/en/latest/vtk_file_formats/vtkhdf_file_format/vtkhdf_specifications.html#temporal-unstructuredgrid-and-polydata
229+ # As only one num_points is stored irregardless of time steps added.
230+ if hdf ["NumberOfPoints" ].shape [0 ] != len (stamps ):
231+ num_pts = hdf ["NumberOfPoints" ][0 ]
232+ else :
233+ num_pts = hdf ["NumberOfPoints" ][pos [0 ]]
234+ lr = compute_local_range (comm , num_pts )
182235 return func_node [step_start + lr [0 ] : step_start + lr [1 ]], lr [0 ]
183236
184237
@@ -197,12 +250,37 @@ def read_cell_data(
197250 raise RuntimeError (f"No cell data found in { filename } ." )
198251 cell_data = hdf ["CellData" ]
199252 assert cell_data is not None
253+ if name not in cell_data .keys ():
254+ raise ValueError (f"No cell data with name { name } in { filename } " )
200255 cell_data_node = cell_data [name ]
201- cell_data_shape = cell_data_node .shape
202- num_cells_global = hdf ["Types" ].size
203- assert num_cells_global == cell_data_shape [0 ]
204- local_cell_range = compute_local_range (comm , num_cells_global )
205- data = cell_data_node [slice (* local_cell_range )]
256+ assert cell_data_node is not None
257+ if time is None :
258+ cell_data_shape = cell_data_node .shape
259+ num_cells_global = hdf ["Types" ].size
260+ assert num_cells_global == cell_data_shape [0 ]
261+ local_cell_range = compute_local_range (comm , num_cells_global )
262+ data = cell_data_node [slice (* local_cell_range )]
263+ else :
264+ if "Steps" not in hdf .keys ():
265+ raise RuntimeError (f"No timestepping information found in { filename } ." )
266+ stamps = hdf ["Steps" ]["Values" ][:]
267+ pos = np .flatnonzero (np .isclose (stamps , time ))
268+ if len (pos ) == 0 :
269+ raise RuntimeError (f"Could not find { name } (t={ time } ) in { filename } ." )
270+ elif len (pos ) > 1 :
271+ raise RuntimeError (f"Multiple time steps for { name } (t={ time } ) in { filename } " )
272+ cd_start = hdf ["Steps" ]["CellDataOffsets" ][name ][pos [0 ]]
273+
274+ # NOTE: currently, it doesn't seem like we follow:
275+ # https://docs.vtk.org/en/latest/vtk_file_formats/vtkhdf_file_format/vtkhdf_specifications.html#temporal-unstructuredgrid-and-polydata
276+ # As only one num_points is stored irregardless of time steps added.
277+ if hdf ["NumberOfCells" ].shape [0 ] != len (stamps ):
278+ number_of_cells = hdf ["NumberOfCells" ][0 ]
279+ else :
280+ number_of_cells = hdf ["NumberOfCells" ][pos [0 ]]
281+ lr = compute_local_range (comm , number_of_cells )
282+ data = cell_data_node [cd_start + lr [0 ] : cd_start + lr [1 ]]
283+
206284 # NOTE: THis could be optimized by hand-coding some communication in
207285 # `read_cell_data` on the frontend side
208286 md = read_mesh_data (filename , comm , time = time , read_from_partition = False , backend_args = None )
0 commit comments