18#ifdef DEAL_II_WITH_HDF5
32#ifdef DEAL_II_WITH_HDF5
371 template <
typename T>
387 template <
typename T>
434 DataSet(
const std::string &
name,
const hid_t &parent_group_id,
bool mpi);
441 const hid_t &parent_group_id,
443 const std::shared_ptr<hid_t> &t_type,
464 template <
typename Container>
501 template <
typename Container>
540 template <
typename Container>
543 const std::vector<hsize_t> &count);
577 template <
typename Container>
580 const std::vector<hsize_t> &offset,
581 const std::vector<hsize_t> &stride,
582 const std::vector<hsize_t> &count,
583 const std::vector<hsize_t> &block);
596 template <
typename number>
618 template <
typename Container>
650 template <
typename Container>
653 const std::vector<hsize_t> &coordinates);
682 template <
typename Container>
685 const std::vector<hsize_t> &offset,
686 const std::vector<hsize_t> &count);
720 template <
typename Container>
723 const std::vector<hsize_t> &data_dimensions,
724 const std::vector<hsize_t> &offset,
725 const std::vector<hsize_t> &stride,
726 const std::vector<hsize_t> &count,
727 const std::vector<hsize_t> &block);
746 template <
typename number>
808 H5D_mpio_actual_io_mode_t
1002 const Group &parent_group,
1042 template <
typename number>
1045 const std::vector<hsize_t> &dimensions)
const;
1065 template <
typename Container>
1136 template <
typename number>
1137 std::shared_ptr<hid_t>
1149 template <
typename number>
1150 std::vector<hsize_t>
1157 template <
typename number>
1158 std::vector<hsize_t>
1165 template <
typename number>
1166 std::vector<hsize_t>
1173 template <
typename number>
1181 template <
typename number>
1189 template <
typename number>
1211 template <
typename Container>
1213 std::is_same_v<Container, std::vector<typename Container::value_type>>,
1220 template <
typename Container>
1222 std::is_same_v<Container, Vector<typename Container::value_type>>,
1229 template <
typename Container>
1231 std::is_same_v<Container, FullMatrix<typename Container::value_type>>,
1242 set_plist(hid_t &plist,
const bool mpi);
1254 H5D_mpio_actual_io_mode_t &io_mode,
1255 std::uint32_t &local_no_collective_cause,
1256 std::uint32_t &global_no_collective_cause,
1258 const bool query_io_mode);
1273 template <
typename number>
1274 std::shared_ptr<hid_t>
1277 static_assert(std::is_same_v<number, float> ||
1278 std::is_same_v<number, double> ||
1279 std::is_same_v<number, int> ||
1280 std::is_same_v<number, bool> ||
1281 std::is_same_v<number, unsigned int> ||
1282 std::is_same_v<number, std::complex<float>> ||
1283 std::is_same_v<number, std::complex<double>>,
1284 "The data type you are trying to get the HDF5 tag for "
1285 "is not supported by this function.");
1287 if (std::is_same_v<number, float>)
1289 return std::make_shared<hid_t>(H5T_NATIVE_FLOAT);
1291 else if (std::is_same_v<number, double>)
1293 return std::make_shared<hid_t>(H5T_NATIVE_DOUBLE);
1295 else if (std::is_same_v<number, int>)
1297 return std::make_shared<hid_t>(H5T_NATIVE_INT);
1299 else if (std::is_same_v<number, unsigned int>)
1301 return std::make_shared<hid_t>(H5T_NATIVE_UINT);
1303 else if (std::is_same_v<number, bool>)
1305 return std::make_shared<hid_t>(H5T_NATIVE_HBOOL);
1307 else if (std::is_same_v<number, std::complex<float>>)
1309 std::shared_ptr<hid_t> t_type =
1310 std::shared_ptr<hid_t>(
new hid_t, [](hid_t *
pointer) {
1312 const herr_t ret = H5Tclose(*
pointer);
1317 *t_type = H5Tcreate(H5T_COMPOUND,
sizeof(std::complex<float>));
1322 herr_t ret = H5Tinsert(*t_type,
"r", 0, H5T_NATIVE_FLOAT);
1324 ret = H5Tinsert(*t_type,
"i",
sizeof(
float), H5T_NATIVE_FLOAT);
1329 else if (std::is_same_v<number, std::complex<double>>)
1331 std::shared_ptr<hid_t> t_type =
1332 std::shared_ptr<hid_t>(
new hid_t, [](hid_t *
pointer) {
1334 const herr_t ret = H5Tclose(*
pointer);
1338 *t_type = H5Tcreate(H5T_COMPOUND,
sizeof(std::complex<double>));
1343 herr_t ret = H5Tinsert(*t_type,
"r", 0, H5T_NATIVE_DOUBLE);
1345 ret = H5Tinsert(*t_type,
"i",
sizeof(
double), H5T_NATIVE_DOUBLE);
1358 template <
typename number>
1359 std::vector<hsize_t>
1362 std::vector<hsize_t> dimensions = {
data.size()};
1368 template <
typename number>
1369 std::vector<hsize_t>
1372 std::vector<hsize_t> dimensions = {
data.size()};
1378 template <
typename number>
1379 std::vector<hsize_t>
1382 std::vector<hsize_t> dimensions = {
data.m(),
data.n()};
1388 template <
typename number>
1392 return static_cast<unsigned int>(
data.size());
1397 template <
typename number>
1401 return static_cast<unsigned int>(
data.size());
1406 template <
typename number>
1410 return static_cast<unsigned int>(
data.m() *
data.n());
1415 template <
typename Container>
1417 std::is_same_v<Container, std::vector<typename Container::value_type>>,
1421 return Container(std::accumulate(
1422 dimensions.begin(), dimensions.end(), 1, std::multiplies<int>()));
1427 template <
typename Container>
1429 std::is_same_v<Container, Vector<typename Container::value_type>>,
1433 return Container(std::accumulate(
1434 dimensions.begin(), dimensions.end(), 1, std::multiplies<int>()));
1439 template <
typename Container>
1441 std::is_same_v<Container, FullMatrix<typename Container::value_type>>,
1449 std::vector<hsize_t> squeezed_dimensions;
1451 if (dimensions.size() > 2)
1453 for (
const auto &dimension : dimensions)
1456 squeezed_dimensions.push_back(dimension);
1461 squeezed_dimensions = dimensions;
1465 return Container(squeezed_dimensions[0], squeezed_dimensions[1]);
1474# ifdef DEAL_II_WITH_MPI
1475 plist = H5Pcreate(H5P_DATASET_XFER);
1477 const herr_t ret = H5Pset_dxpl_mpio(plist, H5FD_MPIO_COLLECTIVE);
1486 plist = H5P_DEFAULT;
1496 H5D_mpio_actual_io_mode_t &io_mode,
1497 std::uint32_t &local_no_collective_cause,
1498 std::uint32_t &global_no_collective_cause,
1500 const bool query_io_mode)
1504# ifdef DEAL_II_WITH_MPI
1509 ret = H5Pget_mpio_actual_io_mode(plist, &io_mode);
1512 H5Pget_mpio_no_collective_cause(plist,
1513 &local_no_collective_cause,
1514 &global_no_collective_cause);
1517 ret = H5Pclose(plist);
1526 (void)local_no_collective_cause;
1527 (void)global_no_collective_cause;
1529 (void)query_io_mode;
1536 std::string message;
1538 auto append_to_message = [&message](
const char *p) {
1539 if (message.size() > 0)
1554 if (no_collective_cause == 0x00)
1556 append_to_message(
"H5D_MPIO_COLLECTIVE");
1559 if ((no_collective_cause & 0x01) == 0x01)
1561 append_to_message(
"H5D_MPIO_SET_INDEPENDENT");
1564 if ((no_collective_cause & 0x02) == 0x02)
1566 append_to_message(
"H5D_MPIO_DATATYPE_CONVERSION");
1569 if ((no_collective_cause & 0x04) == 0x04)
1571 append_to_message(
"H5D_MPIO_DATA_TRANSFORMS");
1574 if ((no_collective_cause & 0x10) == 0x10)
1576 append_to_message(
"H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES");
1579 if ((no_collective_cause & 0x20) == 0x20)
1581 append_to_message(
"H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET");
1584 if ((no_collective_cause & 0x40) == 0x40)
1586 append_to_message(
"H5D_MPIO_FILTERS");
1593 template <
typename T>
1597 const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<T>();
1605 ret = H5Aread(attr, *t_type, &value);
1608 ret = H5Aclose(attr);
1638 type = H5Tcopy(H5T_C_S1);
1642 ret = H5Tset_cset(type, H5T_CSET_UTF8);
1645 ret = H5Tset_size(type, H5T_VARIABLE);
1651 ret = H5Aread(attr, type, &string_out);
1654 std::string string_value(string_out);
1657 std::free(string_out);
1658 ret = H5Tclose(type);
1661 ret = H5Aclose(attr);
1665 return string_value;
1670 template <
typename T>
1678 const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<T>();
1684 aid = H5Screate(H5S_SCALAR);
1697 ret = H5Awrite(attr, *t_type, &value);
1700 ret = H5Sclose(aid);
1702 ret = H5Aclose(attr);
1713 const std::string value)
1726 t_type = H5Tcopy(H5T_C_S1);
1730 ret = H5Tset_cset(t_type, H5T_CSET_UTF8);
1733 ret = H5Tset_size(t_type, H5T_VARIABLE);
1739 aid = H5Screate(H5S_SCALAR);
1742 *
hdf5_reference, attr_name.data(), t_type, aid, H5P_DEFAULT, H5P_DEFAULT);
1751 const char *c_string_value = value.c_str();
1752 ret = H5Awrite(attr, t_type, &c_string_value);
1755 ret = H5Sclose(aid);
1757 ret = H5Aclose(attr);
1765 template <
typename Container>
1769 const std::shared_ptr<hid_t> t_type =
1770 internal::get_hdf5_datatype<typename Container::value_type>();
1774 Container
data = internal::initialize_container<Container>(
dimensions);
1800 template <
typename Container>
1806 "The dimension of coordinates has to be divisible by the rank"));
1807 const std::shared_ptr<hid_t> t_type =
1808 internal::get_hdf5_datatype<typename Container::value_type>();
1810 hid_t memory_dataspace;
1813 std::vector<hsize_t> data_dimensions{
1814 static_cast<hsize_t
>(coordinates.size() /
rank)};
1816 Container
data = internal::initialize_container<Container>(data_dimensions);
1818 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
1823 coordinates.data());
1843 ret = H5Sclose(memory_dataspace);
1852 template <
typename Container>
1855 const std::vector<hsize_t> &count)
1857 const std::shared_ptr<hid_t> t_type =
1858 internal::get_hdf5_datatype<typename Container::value_type>();
1860 hid_t memory_dataspace;
1865 std::vector<hsize_t> data_dimensions = count;
1867 Container
data = internal::initialize_container<Container>(data_dimensions);
1870 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
1897 ret = H5Sclose(memory_dataspace);
1906 template <
typename Container>
1909 const std::vector<hsize_t> &offset,
1910 const std::vector<hsize_t> &stride,
1911 const std::vector<hsize_t> &count,
1912 const std::vector<hsize_t> &block)
1914 const std::shared_ptr<hid_t> t_type =
1915 internal::get_hdf5_datatype<typename Container::value_type>();
1917 hid_t memory_dataspace;
1920 Container
data = internal::initialize_container<Container>(data_dimensions);
1923 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
1950 ret = H5Sclose(memory_dataspace);
1959 template <
typename number>
1963 const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
1964 const std::vector<hsize_t> data_dimensions = {0};
1966 hid_t memory_dataspace;
1970 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
1991 ret = H5Sclose(memory_dataspace);
1999 template <
typename Container>
2004 const std::shared_ptr<hid_t> t_type =
2005 internal::get_hdf5_datatype<typename Container::value_type>();
2031 template <
typename Container>
2034 const std::vector<hsize_t> &coordinates)
2037 const std::shared_ptr<hid_t> t_type =
2038 internal::get_hdf5_datatype<typename Container::value_type>();
2039 const std::vector<hsize_t> data_dimensions =
2042 hid_t memory_dataspace;
2047 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
2052 coordinates.data());
2072 ret = H5Sclose(memory_dataspace);
2080 template <
typename Container>
2083 const std::vector<hsize_t> &offset,
2084 const std::vector<hsize_t> &count)
2089 std::multiplies<unsigned int>()),
2091 const std::shared_ptr<hid_t> t_type =
2092 internal::get_hdf5_datatype<typename Container::value_type>();
2095 const std::vector<hsize_t> &data_dimensions = count;
2097 hid_t memory_dataspace;
2102 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
2129 ret = H5Sclose(memory_dataspace);
2137 template <
typename Container>
2140 const std::vector<hsize_t> &data_dimensions,
2141 const std::vector<hsize_t> &offset,
2142 const std::vector<hsize_t> &stride,
2143 const std::vector<hsize_t> &count,
2144 const std::vector<hsize_t> &block)
2146 const std::shared_ptr<hid_t> t_type =
2147 internal::get_hdf5_datatype<typename Container::value_type>();
2149 hid_t memory_dataspace;
2154 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
2181 ret = H5Sclose(memory_dataspace);
2189 template <
typename number>
2193 std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
2194 std::vector<hsize_t> data_dimensions = {0};
2196 hid_t memory_dataspace;
2200 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
2221 ret = H5Sclose(memory_dataspace);
2229 template <
typename number>
2232 const std::vector<hsize_t> &dimensions)
const
2234 std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
2240 template <
typename Container>
2246 create_dataset<typename Container::value_type>(
name, dimensions);
2247 dataset.write(
data);
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
unsigned int get_rank() const
void write(const Container &data)
std::vector< hsize_t > get_dimensions() const
std::vector< hsize_t > dimensions
std::uint32_t get_local_no_collective_cause_as_hdf5_type()
void write_hyperslab(const Container &data, const std::vector< hsize_t > &offset, const std::vector< hsize_t > &count)
unsigned int get_size() const
void write_selection(const Container &data, const std::vector< hsize_t > &coordinates)
std::shared_ptr< hid_t > dataspace
std::string get_local_no_collective_cause()
std::string get_io_mode()
std::uint32_t local_no_collective_cause
std::string get_global_no_collective_cause()
bool get_query_io_mode() const
std::uint32_t global_no_collective_cause
std::uint32_t get_global_no_collective_cause_as_hdf5_type()
Container read_selection(const std::vector< hsize_t > &coordinates)
H5D_mpio_actual_io_mode_t get_io_mode_as_hdf5_type()
void set_query_io_mode(const bool new_query_io_mode)
Container read_hyperslab(const std::vector< hsize_t > &offset, const std::vector< hsize_t > &count)
H5D_mpio_actual_io_mode_t io_mode
DataSet open_dataset(const std::string &name) const
Group open_group(const std::string &name) const
DataSet create_dataset(const std::string &name, const std::vector< hsize_t > &dimensions) const
Group create_group(const std::string &name) const
void write_dataset(const std::string &name, const Container &data) const
std::shared_ptr< hid_t > hdf5_reference
std::string get_name() const
T get_attribute(const std::string &attr_name) const
void set_attribute(const std::string &attr_name, const T value)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertNothrow(cond, exc)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
std::vector< index_type > data
void release_plist(hid_t &plist, H5D_mpio_actual_io_mode_t &io_mode, std::uint32_t &local_no_collective_cause, std::uint32_t &global_no_collective_cause, const bool mpi, const bool query_io_mode)
std::string no_collective_cause_to_string(const std::uint32_t no_collective_cause)
std::enable_if_t< std::is_same_v< Container, std::vector< typename Container::value_type > >, Container > initialize_container(const std::vector< hsize_t > &dimensions)
unsigned int get_container_size(const std::vector< number > &data)
void set_plist(hid_t &plist, const bool mpi)
std::shared_ptr< hid_t > get_hdf5_datatype()
std::vector< hsize_t > get_container_dimensions(const std::vector< number > &data)