4#ifndef DUNE_FUFEM_HDF5_SEQUENCEIO_HH
5#define DUNE_FUFEM_HDF5_SEQUENCEIO_HH
12#if __has_include(<hdf5.h>)
24#include "typetraits.hh"
27template <
int spatialDimensions,
typename ctype =
double,
typename T = h
size_t>
29 int static const dimensions = 1 + spatialDimensions;
32 template <
typename... Args>
33 SequenceIO(Grouplike &file,
std::string datasetname, Args... args)
34 : file_(file), capacity_{{T(args)...}} {
35 static_assert(
sizeof...(args) == spatialDimensions,
36 "wrong number of arguments");
38 if (file_.hasDataset(datasetname)) {
39 dset_ = file_.openDataset(datasetname);
44 if (file_.isReadOnly())
47 auto const initial_dims = maxExtent(0);
48 auto const max_dims = maxExtent(H5S_UNLIMITED);
50 H5Screate_simple(dimensions, initial_dims.data(), max_dims.data());
52 hid_t plist = H5Pcreate(H5P_DATASET_CREATE);
53 H5Pset_layout(plist, H5D_CHUNKED);
54 auto const chunk_dims = maxExtent(1);
55 H5Pset_chunk(plist, dimensions, chunk_dims.data());
57 dset_ = file_.createDataset(datasetname, file_space, plist,
58 TypeTraits<ctype>::getType());
65 ~SequenceIO() { H5Dclose(dset_); }
68 if (buffer.
size() != entrySize())
71 auto dims = getExtent();
72 if (timeStep >= dims[0]) {
73 dims[0] = timeStep + 1;
74 H5Dset_extent(dset_, dims.data());
76 auto const start = minExtent(timeStep);
77 H5DOwrite_chunk(dset_, H5P_DEFAULT, 0,
start.data(),
78 entrySize() *
sizeof(ctype), buffer.
data());
81#if H5_VERSION_GE(1, 10, 0)
83 if (buffer.
size() != entrySize())
86 H5DOappend(dset_, H5P_DEFAULT, skip, 1, TypeTraits<ctype>::getType(),
93 buffer.
resize(entrySize());
95 hid_t file_space = H5Dget_space(dset_);
98 H5Sget_simple_extent_dims(file_space, dims.
data(), NULL);
99 if (timeStep >= dims[0])
102 auto const start = minExtent(timeStep);
103 auto const count = maxExtent(1);
104 H5Sselect_hyperslab(file_space, H5S_SELECT_SET,
start.data(), NULL,
107 hid_t mem_space = H5Screate_simple(dimensions,
count.data(), NULL);
108 H5Dread(dset_, TypeTraits<ctype>::getType(), mem_space, file_space,
109 H5P_DEFAULT, buffer.
data());
112 H5Sclose(file_space);
113 capacity = capacity_;
118 hid_t file_space = H5Dget_space(dset_);
120 H5Sget_simple_extent_dims(file_space, dims.
data(), NULL);
121 H5Sclose(file_space);
130 void checkChunkSize() {
131 hid_t plist = H5Dget_create_plist(dset_);
132 H5D_layout_t layout = H5Pget_layout(plist);
133 if (layout != H5D_CHUNKED)
137 int const rank = H5Pget_chunk(plist, dimensions, chunk_dims.
data());
138 if (rank != dimensions)
140 if (!
std::equal(capacity_.begin(), capacity_.end(), chunk_dims.
begin() + 1))
142 if (chunk_dims[0] != 1)
148 void checkDimensions() {
149 hid_t file_space = H5Dget_space(dset_);
151 int const rank = H5Sget_simple_extent_dims(file_space, dims.
data(), NULL);
153 if (rank != dimensions)
158 H5Sclose(file_space);
161 void checkDatatype() {
162 if (!H5Tequal(H5Dget_type(dset_), TypeTraits<ctype>::getType()))
186template <
int spatialDimensions,
typename ctype,
typename T,
class Data>
187void addEntry(SequenceIO<spatialDimensions, ctype, T> &writer,
size_t timeStep,
191 writer.add(timeStep, buffer);
194#if H5_VERSION_GE(1, 10, 0)
195template <
int spatialDimensions,
typename ctype,
typename T,
class Data>
196void appendEntry(SequenceIO<spatialDimensions, ctype, T> &writer,
200 writer.append(buffer);
204template <
int spatialDimensions,
typename ctype,
typename T,
class Data>
205void readEntry(SequenceIO<spatialDimensions, ctype, T> &reader,
size_t timeStep,
209 reader.read(timeStep, buffer, dimensions);
215 #warning Including the hdf5/sequenceio.hh but hdf5.h is missing.
void add(const Vertex &vertex)
void fromBuffer(std::vector< ctype > const &buffer, std::array< T, 3 > dimensions, Dune::Matrix< Dune::FieldVector< ctype, k > > &data)
Definition frombuffer.hh:14
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