37 const std::string value = std::to_string(series_number);
47 const std::size_t cur_size =
static_cast<std::size_t
>(data_set.dataspace().size());
48 data_set.
resize({cur_size + 1});
49 data_set.write_at(
static_cast<hsize_t
>(cur_size), value);
59 template <
typename T>
void scalar(
const std::string &name,
const T value)
63 throw std::runtime_error(
"HDF5Output::scalar: The scalar '" + name +
"' has not been registered before!");
76 if (data_set.datatype() != type)
77 throw std::runtime_error(
78 "HDF5Output::scalar: The type of the value does not match the type of the dataset '" + name +
84 throw std::runtime_error(
"HDF5Output::scalar: The scalar '" + name +
85 "' has already been written to the file '" +
output_name +
"'.");
88 const std::size_t cur_size =
static_cast<std::size_t
>(data_set.dataspace().size());
89 data_set.resize({cur_size + 1});
90 data_set.write_at(
static_cast<hsize_t
>(cur_size), value);
95 template <
typename COORD>
97 void map(
const std::string &name,
const COORD &coordinates)
100 throw std::runtime_error(
"HDF5Output::map: The coordinates '" + name +
101 "' have already been written to the file '" +
output_name +
"'.");
106 const auto grid_data =
make_grid(coordinates);
109 for (
const auto &dim : coordinates.sizes())
112 using coord_type = std::decay_t<
decltype(grid_data[0])>;
116 dataset.
write(grid_data);
121 template <
typename COORD,
typename T>
123 void map(
const std::string &name,
const COORD &coordinates, T *data)
127 const std::string coord_name = coordinates.to_string();
130 using value_type = std::decay_t<T>;
140 throw std::runtime_error(
"HDF5Output::map: The map '" + name +
"' has already been written to the file '" +
147 for (
const auto &dim : coordinates.sizes())
151 auto dataset = group.create_dataset(
"data", d_type, space);
153 dataset.write(data, coordinates.size());
155 group.create_soft_link(
"coordinates",
"/coordinates/" + coord_name);
161 template <
typename INTERP>
163 void map(
const std::string &name,
const INTERP &_interpolator)
165 map(name, _interpolator.get_coordinates().to_string(), _interpolator);
168 template <
typename INTERP>
170 void map(
const std::string &name,
const std::string &coord_name,
const INTERP &_interpolator)
174 using value_type =
typename std::decay_t<INTERP>::value_type;
176 const auto &interpolator = _interpolator.template get_on<CPU_memory>();
188 throw std::runtime_error(
"HDF5Output::map: The map '" + name +
"' has already been written to the file '" +
195 const auto coordinates = interpolator.get_coordinates();
196 for (
const auto &dim : coordinates.sizes())
200 auto dataset = group.create_dataset(
"data", d_type, space);
202 std::vector<value_type> data(interpolator.get_coordinates().size());
203 for (
size_t i = 0; i < data.size(); ++i) {
204 const auto lcoord = coordinates.forward(coordinates.from_linear_index(i));
205 data[i] = device::apply([&](
const auto &...x) {
return interpolator(x...); }, lcoord);
209 group.create_soft_link(
"coordinates",
"/coordinates/" + coord_name);
236 template <
typename COORD>
void check_coordinates(
const std::string &coord_name,
const COORD &coordinates)
239 map(coord_name, coordinates);
244 throw std::runtime_error(
"HDF5Output::map: The coordinates '" + coord_name +
245 "' do not match the interpolator's coordinates.");
A class to output data to a CSV file.
Definition hdf5_output.hh:22
void check_coordinates(const std::string &coord_name, const COORD &coordinates)
Definition hdf5_output.hh:236
void map(const std::string &name, const std::string &coord_name, const INTERP &_interpolator)
Definition hdf5_output.hh:170
DiFfRG::hdf5::File & get_file()
std::map< std::string, size_t > map_series_numbers
Definition hdf5_output.hh:231
const JSONValue & json
Definition hdf5_output.hh:223
void map(const std::string &name, const INTERP &_interpolator)
Definition hdf5_output.hh:163
bool opened
Definition hdf5_output.hh:227
void map(const std::string &name, const COORD &coordinates, T *data)
Definition hdf5_output.hh:123
void flush(const double time)
std::list< std::string > written_scalars
Definition hdf5_output.hh:229
void write_series_record(DiFfRG::hdf5::Group &group, const int series_number)
Definition hdf5_output.hh:35
const std::string top_folder
Definition hdf5_output.hh:224
DiFfRG::hdf5::Group scalars
Definition hdf5_output.hh:249
void scalar(const std::string &name, const T value)
Add a value to the output.
Definition hdf5_output.hh:59
DiFfRG::hdf5::Group maps
Definition hdf5_output.hh:250
void map(const std::string &name, const COORD &coordinates)
Definition hdf5_output.hh:97
HDF5Output(const std::string top_folder, const std::string output_name, const JSONValue &json)
Construct a new Csv Output object.
std::list< std::string > initial_scalars
Definition hdf5_output.hh:234
void scalar(const std::string &name, const char *value)
Definition hdf5_output.hh:93
std::list< std::string > written_maps
Definition hdf5_output.hh:230
DiFfRG::hdf5::Group coords
Definition hdf5_output.hh:251
const std::string output_name
Definition hdf5_output.hh:225
std::map< std::string, std::string > coord_identifiers
Definition hdf5_output.hh:232
DiFfRG::hdf5::File h5_file
Definition hdf5_output.hh:248
std::filesystem::path path
Definition hdf5_output.hh:253
A wrapper around the boost json value class.
Definition json.hh:19
void resize(const Dims &dims)
Definition dataset.hh:38
void write(const T &value)
Definition dataset.hh:49
void write_at(hsize_t offset, const T &value)
Definition dataset.hh:61
static Dataspace simple_unlimited(const Dims &dims)
Definition dataspace.hh:65
static Dataspace simple(const Dims &dims)
Definition dataspace.hh:56
Dataset open_dataset(const std::string &name)
Definition group.hh:71
bool has_dataset(const std::string &name) const
Definition group.hh:42
Group create_group(const std::string &name)
Definition group.hh:27
Dataset create_chunked_dataset(const std::string &name, const Datatype &type, const Dataspace &space, const Dims &chunk)
Definition group.hh:55
Dataset create_dataset(const std::string &name, const Datatype &type, const Dataspace &space)
Definition group.hh:46
bool has_group(const std::string &name) const
Definition group.hh:41
Group open_group(const std::string &name)
Definition group.hh:34
Definition coordinates.hh:19
A concept for what is an interpolator class.
Definition interpolation.hh:42
std::vector< hsize_t > Dims
Definition dataspace.hh:9
Datatype type_of()
Convenience factory — type_of<T>() returns the HDF5 datatype for T.
Definition datatype.hh:56
Definition complex_math.hh:10
auto make_grid(const Coordinates &coordinates)
Definition coordinates.hh:388