9 #include "HDF5Interface.h"
10 #include <Eigen/Dense>
11 #include <dolfinx/common/MPI.h>
28 HDF5File(MPI_Comm comm,
const std::string& filename,
29 const std::string& file_mode);
41 bool has_dataset(
const std::string& dataset_name)
const;
50 hid_t
h5_id()
const {
return _hdf5_file_id; }
58 void write_data(
const std::string& dataset_name,
const std::vector<T>& data,
59 const std::vector<std::int64_t>& global_size,
65 void write_data(
const std::string& dataset_name,
66 const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic,
67 Eigen::RowMajor>& data,
82 const std::vector<T>& data,
83 const std::vector<std::int64_t>& global_size,
86 assert(_hdf5_file_id > 0);
87 assert(global_size.size() > 0);
90 std::int64_t num_local_items = 1;
91 for (std::size_t i = 1; i < global_size.size(); ++i)
92 num_local_items *= global_size[i];
93 num_local_items = data.size() / num_local_items;
96 const std::int64_t offset
98 std::array<std::int64_t, 2> range = {{offset, offset + num_local_items}};
101 std::string dset_name(dataset_name);
102 if (dset_name[0] !=
'/')
103 dset_name =
"/" + dataset_name;
109 template <
typename T>
111 const Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic,
112 Eigen::RowMajor>& data,
115 assert(_hdf5_file_id > 0);
118 const std::int64_t offset
120 std::array<std::int64_t, 2> range = {{offset, offset + data.rows()}};
123 std::string dset_name(dataset_name);
124 if (dset_name[0] !=
'/')
125 dset_name =
"/" + dataset_name;
127 std::int64_t global_rows = 0;
128 const std::int64_t local_rows = data.rows();
129 MPI_Allreduce(&local_rows, &global_rows, 1, MPI_INT64_T, MPI_SUM,
132 std::vector<std::int64_t> global_size = {global_rows, data.cols()};
133 if (data.cols() == 1)
134 global_size = {global_rows};