OGS
MeshLib::IO::HdfWriter Class Referencefinal

Detailed Description

Definition at line 24 of file HdfWriter.h.

#include <HdfWriter.h>

Classes

struct  HdfMesh

Public Member Functions

 HdfWriter (std::vector< MeshHdfData > const &meshes, unsigned long long initial_step, double initial_time, std::filesystem::path const &filepath, bool use_compression, bool is_file_manager, unsigned int n_files, bool static_file)
 Write file with geometry and topology data. The data itself is held by a structure outside of this class. The writer assumes the data holder to not change during writing.
void writeStep (double time)
 Writes attributes. The data itself is hold by a structure outside of this class. The writer assumes the data holder to not change during writing and HdfData given to constructor to be still valid.
 ~HdfWriter ()

Private Member Functions

void closeMeshesGroupAndFile ()

Private Attributes

std::filesystem::path const _hdf5_filepath
hid_t const _file
hid_t const _meshes_group
std::vector< std::unique_ptr< HdfMesh > > _hdf_meshes
std::vector< double > _step_times
bool const _use_compression
bool const _is_file_manager
bool const _static_file

Constructor & Destructor Documentation

◆ HdfWriter()

MeshLib::IO::HdfWriter::HdfWriter ( std::vector< MeshHdfData > const & meshes,
unsigned long long initial_step,
double initial_time,
std::filesystem::path const & filepath,
bool use_compression,
bool is_file_manager,
unsigned int n_files,
bool static_file )

Write file with geometry and topology data. The data itself is held by a structure outside of this class. The writer assumes the data holder to not change during writing.

Parameters
meshesmeta data of meshes to be written
initial_stepnumber of the step (temporal collection), usually 0, greater 0 with continuation of simulation
initial_timestart time; usually 0, but may differ (e.g. for restart).
filepathabsolute or relative filepath to the hdf5 file
use_compressionif true gzip compression is enabled
is_file_managerTrue if process (in parallel execution) is
n_filesNumber of output files
static_fileIf true, only the constant_attributes of each mesh are written, the file is flushed and closed inside the constructor, and subsequent calls to writeStep() are no-ops. Use this for data that does not change over time (e.g. mesh geometry/topology).

Definition at line 203 of file HdfWriter.cpp.

211 : _hdf5_filepath(filepath),
212 _file(createFile(filepath, n_files)),
214 H5Gcreate2(_file, "/meshes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)),
215 _step_times{initial_time},
216 _use_compression(checkCompression() && use_compression),
217 _is_file_manager(is_file_manager),
218 _static_file(static_file)
219{
220 auto const createAndWriteDataSet = [&](hid_t const group,
221 auto const& attribute) -> hid_t
222 {
223 hid_t const dataset = createDataSet(
224 attribute.data_type, attribute.data_space, attribute.file_space,
225 attribute.chunk_space, _use_compression, group, attribute.name);
226
227 checkHdfStatus(dataset, "Creating HDF5 Dataset: {:s} failed.",
228 attribute.name);
229
230 writeDataSet(attribute.data_start, attribute.data_type,
231 attribute.data_space, attribute.offsets,
232 attribute.file_space, attribute.chunk_space,
233 attribute.name, initial_step, dataset);
234 return dataset;
235 };
236
237 if (_static_file)
238 {
239 for (auto const& mesh : meshes)
240 {
241 hid_t const group =
242 H5Gcreate2(_meshes_group, mesh.name.c_str(), H5P_DEFAULT,
243 H5P_DEFAULT, H5P_DEFAULT);
244
245 for (auto const& attribute : mesh.constant_attributes)
246 {
247 hid_t const dataset = createAndWriteDataSet(group, attribute);
248 if (auto const err = H5Dclose(dataset); err < 0)
249 {
250 ERR("Could not close dataset with dataset id '{}' - status "
251 "is '{}'.",
252 dataset, err);
253 }
254 }
255
256 if (auto const err = H5Gclose(group); err < 0)
257 {
258 ERR("Could not close group with group id '{}' - status is "
259 "'{}'.",
260 group, err);
261 }
262 }
264 return;
265 }
266
267 for (auto const& mesh : meshes)
268 {
269 hid_t const group = H5Gcreate2(_meshes_group, mesh.name.c_str(),
270 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
271
272 for (auto const& attribute : mesh.constant_attributes)
273 {
274 hid_t const dataset = createAndWriteDataSet(group, attribute);
275 if (auto const err = H5Dclose(dataset); err < 0)
276 {
277 ERR("Could not close dataset with dataset id '{}' - status is "
278 "'{}'.",
279 dataset, err);
280 }
281 }
282
283 std::map<std::string, hid_t> datasets;
284 for (auto const& attribute : mesh.variable_attributes)
285 {
286 hid_t const dataset = createAndWriteDataSet(group, attribute);
287 // datasets are kept open
288 datasets.insert({attribute.name, dataset});
289 }
290
291 _hdf_meshes.push_back(std::make_unique<HdfMesh>(
292 HdfMesh{group, datasets, mesh.variable_attributes}));
293 }
294}
static void writeDataSet(void const *nodes_data, hid_t const data_type, std::vector< Hdf5DimType > const &data_dims, std::vector< Hdf5DimType > const &offset_dims, std::vector< Hdf5DimType > const &max_dims, std::vector< Hdf5DimType > const &chunk_dims, std::string const &dataset_name, Hdf5DimType const step, hid_t const dataset)
Assumes a dataset is already opened by createDatasetFunction.
void checkHdfStatus(const hid_t status, fmt::format_string< Args... > formatting, Args &&... args)
Definition HdfWriter.cpp:16
static hid_t createDataSet(hid_t const data_type, std::vector< Hdf5DimType > const &data_dims, std::vector< Hdf5DimType > const &max_dims, std::vector< Hdf5DimType > const &chunk_dims, bool const use_compression, hid_t const section, std::string const &dataset_name)
Definition HdfWriter.cpp:57
static bool checkCompression()
Definition HdfWriter.cpp:29
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
bool const _use_compression
Definition HdfWriter.h:77
std::filesystem::path const _hdf5_filepath
Definition HdfWriter.h:72
std::vector< std::unique_ptr< HdfMesh > > _hdf_meshes
Definition HdfWriter.h:75
bool const _is_file_manager
Definition HdfWriter.h:78
hid_t const _meshes_group
Definition HdfWriter.h:74
bool const _static_file
Definition HdfWriter.h:79
std::vector< double > _step_times
Definition HdfWriter.h:76
int64_t createFile(std::filesystem::path const &filepath, unsigned int n_files)

References _file, _hdf5_filepath, _hdf_meshes, _is_file_manager, _meshes_group, _static_file, _step_times, _use_compression, checkCompression(), checkHdfStatus(), closeMeshesGroupAndFile(), createDataSet(), MeshLib::IO::createFile(), ERR(), and writeDataSet().

◆ ~HdfWriter()

MeshLib::IO::HdfWriter::~HdfWriter ( )

Definition at line 296 of file HdfWriter.cpp.

297{
298 if (_static_file)
299 {
300 return;
301 }
302
304
305 for (auto const& mesh : _hdf_meshes)
306 {
307 for (auto const& dataset : mesh->datasets)
308 {
309 if (auto const status = H5Dclose(dataset.second); status < 0)
310 {
311 ERR("Could not close dataset with id '{}' - status is '{}'.",
312 dataset.second, status);
313 }
314 }
315 if (auto const err = H5Gclose(mesh->group); err < 0)
316 {
317 ERR("Could not close group with group id '{}' - status is '{}'.",
318 mesh->group, err);
319 }
320 }
322}
static void writeTimeSeries(hid_t const file, std::vector< double > const &step_times, bool const is_file_manager)
Write vector with time values into open hdf file.

References _file, _hdf_meshes, _is_file_manager, _static_file, _step_times, closeMeshesGroupAndFile(), ERR(), and writeTimeSeries().

Member Function Documentation

◆ closeMeshesGroupAndFile()

void MeshLib::IO::HdfWriter::closeMeshesGroupAndFile ( )
private

Closes the meshes group, flushes and closes the HDF5 file, logging a diagnostic on any failure. Shared by the static-file constructor path and the destructor.

Definition at line 324 of file HdfWriter.cpp.

325{
326 if (auto const group_err = H5Gclose(_meshes_group); group_err < 0)
327 {
328 ERR("Could not close group with group id '{}' - status is '{}'.",
329 _meshes_group, group_err);
330 }
331 if (auto const status = H5Fflush(_file, H5F_SCOPE_LOCAL); status < 0)
332 {
333 ERR("Could not flush data to file '{}' - status is '{}'.",
334 _hdf5_filepath.string(), status);
335 }
336 if (auto const err = H5Fclose(_file); err < 0)
337 {
338 ERR("Could not close file '{}' - status is '{}'.",
339 _hdf5_filepath.string(), err);
340 }
341}

References _file, _hdf5_filepath, _meshes_group, and ERR().

Referenced by HdfWriter(), and ~HdfWriter().

◆ writeStep()

void MeshLib::IO::HdfWriter::writeStep ( double time)

Writes attributes. The data itself is hold by a structure outside of this class. The writer assumes the data holder to not change during writing and HdfData given to constructor to be still valid.

Parameters
timetime_value of step to be written to temporal collection

Definition at line 343 of file HdfWriter.cpp.

344{
345 if (_static_file)
346 {
347 return;
348 }
349
350 auto const output_step = _step_times.size();
351 _step_times.push_back(time);
352
353 for (auto const& mesh : _hdf_meshes)
354 {
355 for (auto const& attribute : mesh->variable_attributes)
356 {
357 auto const& dataset_hid = mesh->datasets.find(attribute.name);
358 if (dataset_hid == mesh->datasets.end())
359 {
360 OGS_FATAL("Writing HDF5 Dataset: '{:s}' to file '{}' failed.",
361 attribute.name, _hdf5_filepath.string());
362 }
363
365 attribute.data_start, attribute.data_type, attribute.data_space,
366 attribute.offsets, attribute.file_space, attribute.chunk_space,
367 attribute.name, output_step, mesh->datasets.at(attribute.name));
368 if (auto const flush_status = H5Fflush(_file, H5F_SCOPE_LOCAL);
369 flush_status < 0)
370 {
371 ERR("HdfWriter::writeStep(): Could not flush to file '{}' - "
372 "status is '{}'.",
373 _hdf5_filepath.string(), flush_status);
374 }
375 }
376 }
377}
#define OGS_FATAL(...)
Definition Error.h:10

References _file, _hdf5_filepath, _hdf_meshes, _static_file, _step_times, ERR(), OGS_FATAL, and writeDataSet().

Member Data Documentation

◆ _file

hid_t const MeshLib::IO::HdfWriter::_file
private

Definition at line 73 of file HdfWriter.h.

Referenced by HdfWriter(), ~HdfWriter(), closeMeshesGroupAndFile(), and writeStep().

◆ _hdf5_filepath

std::filesystem::path const MeshLib::IO::HdfWriter::_hdf5_filepath
private

Definition at line 72 of file HdfWriter.h.

Referenced by HdfWriter(), closeMeshesGroupAndFile(), and writeStep().

◆ _hdf_meshes

std::vector<std::unique_ptr<HdfMesh> > MeshLib::IO::HdfWriter::_hdf_meshes
private

Definition at line 75 of file HdfWriter.h.

Referenced by HdfWriter(), ~HdfWriter(), and writeStep().

◆ _is_file_manager

bool const MeshLib::IO::HdfWriter::_is_file_manager
private

Definition at line 78 of file HdfWriter.h.

Referenced by HdfWriter(), and ~HdfWriter().

◆ _meshes_group

hid_t const MeshLib::IO::HdfWriter::_meshes_group
private

Definition at line 74 of file HdfWriter.h.

Referenced by HdfWriter(), and closeMeshesGroupAndFile().

◆ _static_file

bool const MeshLib::IO::HdfWriter::_static_file
private

Definition at line 79 of file HdfWriter.h.

Referenced by HdfWriter(), ~HdfWriter(), and writeStep().

◆ _step_times

std::vector<double> MeshLib::IO::HdfWriter::_step_times
private

Definition at line 76 of file HdfWriter.h.

Referenced by HdfWriter(), ~HdfWriter(), and writeStep().

◆ _use_compression

bool const MeshLib::IO::HdfWriter::_use_compression
private

Definition at line 77 of file HdfWriter.h.

Referenced by HdfWriter().


The documentation for this class was generated from the following files: