4#ifndef DUNE_FUFEM_HDF5_SINGLETONWRITER_HH
5#define DUNE_FUFEM_HDF5_SINGLETONWRITER_HH
9#if __has_include(<hdf5.h>)
20#include "typetraits.hh"
23template <
int spatialDimensions,
typename ctype =
double,
typename T = h
size_t>
24class SingletonWriter {
26 int static const dimensions = spatialDimensions;
29 template <
typename... Args>
30 SingletonWriter(Grouplike &file,
std::string datasetname, Args... args)
31 : file_(file), capacity_{{T(args)...}} {
32 static_assert(
sizeof...(args) == spatialDimensions,
33 "wrong number of arguments");
34 if (file_.isReadOnly())
37 if (file_.hasDataset(datasetname)) {
38 dset_ = file_.openDataset(datasetname);
43 auto const initial_dims = maxExtent();
44 auto const max_dims = maxExtent();
46 H5Screate_simple(dimensions, initial_dims.data(), max_dims.data());
48 hid_t plist = H5Pcreate(H5P_DATASET_CREATE);
49 H5Pset_layout(plist, H5D_CONTIGUOUS);
50 dset_ = file_.createDataset(datasetname, file_space, plist,
51 TypeTraits<ctype>::getType());
58 ~SingletonWriter() { H5Dclose(dset_); }
61 if (buffer.
size() != entrySize())
64 hid_t file_space = H5Dget_space(dset_);
65 auto const start = minExtent();
66 auto const count = maxExtent();
67 H5Sselect_hyperslab(file_space, H5S_SELECT_SET,
start.data(), NULL,
70 hid_t mem_space = H5Screate_simple(dimensions,
count.data(), NULL);
71 H5Dwrite(dset_, TypeTraits<ctype>::getType(), mem_space, file_space,
72 H5P_DEFAULT, buffer.
data());
84 hid_t plist = H5Dget_create_plist(dset_);
85 H5D_layout_t layout = H5Pget_layout(plist);
86 if (layout != H5D_CONTIGUOUS)
92 void checkDimensions() {
93 hid_t file_space = H5Dget_space(dset_);
95 int const rank = H5Sget_simple_extent_dims(file_space, dims.
data(), NULL);
97 if (rank != dimensions)
99 if (capacity_ != dims)
102 H5Sclose(file_space);
105 void checkDatatype() {
106 if (!H5Tequal(H5Dget_type(dset_), TypeTraits<ctype>::getType()))
124template <
int spatialDimensions,
typename ctype,
typename T,
class Data>
125void setEntry(SingletonWriter<spatialDimensions, ctype, T> &writer,
134 #warning Including the hdf5/singletonwriter.hh but hdf5.h is missing.
void toBuffer(Dune::Matrix< Dune::FieldVector< ctype, k > > const &data, std::vector< ctype > &buffer)
Definition tobuffer.hh:12
#define DUNE_THROW(E,...)
void start()
Start embedded python interpreter.
Definition common.hh:130