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)
 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 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

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 )

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

Definition at line 203 of file HdfWriter.cpp.

210 : _hdf5_filepath(filepath),
211 _file(createFile(filepath, n_files)),
213 H5Gcreate2(_file, "/meshes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)),
214 _step_times{initial_time},
215 _use_compression(checkCompression() && use_compression),
216 _is_file_manager(is_file_manager)
217{
218 for (auto const& mesh : meshes)
219 {
220 hid_t const group = H5Gcreate2(_meshes_group, mesh.name.c_str(),
221 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
222
223 auto const createAndWriteDataSet = [&](auto const& attribute) -> hid_t
224 {
225 hid_t const dataset = createDataSet(
226 attribute.data_type, attribute.data_space, attribute.file_space,
227 attribute.chunk_space, _use_compression, group, attribute.name);
228
229 checkHdfStatus(dataset, "Creating HDF5 Dataset: {:s} failed.",
230 attribute.name);
231
232 writeDataSet(attribute.data_start, attribute.data_type,
233 attribute.data_space, attribute.offsets,
234 attribute.file_space, attribute.chunk_space,
235 attribute.name, initial_step, dataset);
236 return dataset;
237 };
238
239 for (auto const& attribute : mesh.constant_attributes)
240 {
241 hid_t const dataset = createAndWriteDataSet(attribute);
242 H5Dclose(dataset);
243 }
244
245 std::map<std::string, hid_t> datasets;
246 for (auto const& attribute : mesh.variable_attributes)
247 {
248 hid_t const dataset = createAndWriteDataSet(attribute);
249 // datasets are kept open
250 datasets.insert({attribute.name, dataset});
251 }
252
253 _hdf_meshes.push_back(std::make_unique<HdfMesh>(
254 HdfMesh{group, datasets, mesh.variable_attributes}));
255 }
256}
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
bool const _use_compression
Definition HdfWriter.h:67
std::filesystem::path const _hdf5_filepath
Definition HdfWriter.h:62
std::vector< std::unique_ptr< HdfMesh > > _hdf_meshes
Definition HdfWriter.h:65
bool const _is_file_manager
Definition HdfWriter.h:68
hid_t const _meshes_group
Definition HdfWriter.h:64
std::vector< double > _step_times
Definition HdfWriter.h:66
int64_t createFile(std::filesystem::path const &filepath, unsigned int n_files)

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

◆ ~HdfWriter()

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

Definition at line 258 of file HdfWriter.cpp.

259{
261
262 for (auto const& mesh : _hdf_meshes)
263 {
264 for (auto const& dataset : mesh->datasets)
265 {
266 if (auto const status = H5Dclose(dataset.second); status < 0)
267 {
268 ERR("Could not close dataset with id '{}' - status is '{}'.",
269 dataset.second, status);
270 }
271 }
272 if (auto const err = H5Gclose(mesh->group); err < 0)
273 {
274 ERR("Could not close group with group id '{}' - status is '{}'.",
275 mesh->group, err);
276 }
277 }
278 if (auto const group_err = H5Gclose(_meshes_group); group_err < 0)
279 {
280 ERR("Could not close group with group id '{}' - status is '{}'.",
281 _meshes_group, group_err);
282 }
283 if (auto const status = H5Fflush(_file, H5F_SCOPE_LOCAL); status < 0)
284 {
285 ERR("Could not flush data to file '{}' - status is '{}'.",
286 _hdf5_filepath.string(), status);
287 }
288 H5Fclose(_file);
289}
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.
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40

References _file, _hdf5_filepath, _hdf_meshes, _is_file_manager, _meshes_group, _step_times, ERR(), and writeTimeSeries().

Member Function Documentation

◆ 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 291 of file HdfWriter.cpp.

292{
293 auto const output_step = _step_times.size();
294 _step_times.push_back(time);
295
296 for (auto const& mesh : _hdf_meshes)
297 {
298 for (auto const& attribute : mesh->variable_attributes)
299 {
300 auto const& dataset_hid = mesh->datasets.find(attribute.name);
301 if (dataset_hid == mesh->datasets.end())
302 {
303 OGS_FATAL("Writing HDF5 Dataset: '{:s}' to file '{}' failed.",
304 attribute.name, _hdf5_filepath.string());
305 }
306
308 attribute.data_start, attribute.data_type, attribute.data_space,
309 attribute.offsets, attribute.file_space, attribute.chunk_space,
310 attribute.name, output_step, mesh->datasets.at(attribute.name));
311 if (auto const flush_status = H5Fflush(_file, H5F_SCOPE_LOCAL);
312 flush_status < 0)
313 {
314 ERR("HdfWriter::writeStep(): Could not flush to file '{}' - "
315 "status is '{}'.",
316 _hdf5_filepath.string(), flush_status);
317 }
318 }
319 }
320}
#define OGS_FATAL(...)
Definition Error.h:19

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

Member Data Documentation

◆ _file

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

Definition at line 63 of file HdfWriter.h.

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

◆ _hdf5_filepath

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

Definition at line 62 of file HdfWriter.h.

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

◆ _hdf_meshes

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

Definition at line 65 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 68 of file HdfWriter.h.

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

◆ _meshes_group

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

Definition at line 64 of file HdfWriter.h.

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

◆ _step_times

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

Definition at line 66 of file HdfWriter.h.

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

◆ _use_compression

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

Definition at line 67 of file HdfWriter.h.

Referenced by HdfWriter().


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