20#ifdef DEAL_II_WITH_HDF5
370 template <
typename T>
386 template <
typename T>
433 DataSet(
const std::string &
name,
const hid_t &parent_group_id,
bool mpi);
440 const hid_t &parent_group_id,
442 const std::shared_ptr<hid_t> &t_type,
463 template <
typename Container>
500 template <
typename Container>
539 template <
typename Container>
542 const std::vector<hsize_t> &count);
576 template <
typename Container>
579 const std::vector<hsize_t> &offset,
580 const std::vector<hsize_t> &stride,
581 const std::vector<hsize_t> &count,
582 const std::vector<hsize_t> &block);
595 template <
typename number>
617 template <
typename Container>
649 template <
typename Container>
652 const std::vector<hsize_t> &coordinates);
681 template <
typename Container>
684 const std::vector<hsize_t> &offset,
685 const std::vector<hsize_t> &count);
719 template <
typename Container>
722 const std::vector<hsize_t> &data_dimensions,
723 const std::vector<hsize_t> &offset,
724 const std::vector<hsize_t> &stride,
725 const std::vector<hsize_t> &count,
726 const std::vector<hsize_t> &block);
745 template <
typename number>
807 H5D_mpio_actual_io_mode_t
1001 const Group &parent_group,
1041 template <
typename number>
1044 const std::vector<hsize_t> &dimensions)
const;
1064 template <
typename Container>
1135 template <
typename number>
1136 std::shared_ptr<hid_t>
1148 template <
typename number>
1149 std::vector<hsize_t>
1156 template <
typename number>
1157 std::vector<hsize_t>
1164 template <
typename number>
1165 std::vector<hsize_t>
1172 template <
typename number>
1180 template <
typename number>
1188 template <
typename number>
1210 template <
typename Container>
1212 std::is_same_v<Container, std::vector<typename Container::value_type>>,
1219 template <
typename Container>
1221 std::is_same_v<Container, Vector<typename Container::value_type>>,
1228 template <
typename Container>
1230 std::is_same_v<Container, FullMatrix<typename Container::value_type>>,
1241 set_plist(hid_t &plist,
const bool mpi);
1253 H5D_mpio_actual_io_mode_t &io_mode,
1254 std::uint32_t &local_no_collective_cause,
1255 std::uint32_t &global_no_collective_cause,
1257 const bool query_io_mode);
1272 template <
typename number>
1273 std::shared_ptr<hid_t>
1276 static_assert(std::is_same_v<number, float> ||
1277 std::is_same_v<number, double> ||
1278 std::is_same_v<number, int> ||
1279 std::is_same_v<number, bool> ||
1280 std::is_same_v<number, unsigned int> ||
1281 std::is_same_v<number, std::complex<float>> ||
1282 std::is_same_v<number, std::complex<double>>,
1283 "The data type you are trying to get the HDF5 tag for "
1284 "is not supported by this function.");
1286 if (std::is_same_v<number, float>)
1288 return std::make_shared<hid_t>(H5T_NATIVE_FLOAT);
1290 else if (std::is_same_v<number, double>)
1292 return std::make_shared<hid_t>(H5T_NATIVE_DOUBLE);
1294 else if (std::is_same_v<number, int>)
1296 return std::make_shared<hid_t>(H5T_NATIVE_INT);
1298 else if (std::is_same_v<number, unsigned int>)
1300 return std::make_shared<hid_t>(H5T_NATIVE_UINT);
1302 else if (std::is_same_v<number, bool>)
1304 return std::make_shared<hid_t>(H5T_NATIVE_HBOOL);
1306 else if (std::is_same_v<number, std::complex<float>>)
1308 std::shared_ptr<hid_t> t_type =
1309 std::shared_ptr<hid_t>(
new hid_t, [](hid_t *pointer) {
1311 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);
1339 *t_type = H5Tcreate(H5T_COMPOUND,
sizeof(std::complex<double>));
1344 herr_t ret = H5Tinsert(*t_type,
"r", 0, H5T_NATIVE_DOUBLE);
1346 ret = H5Tinsert(*t_type,
"i",
sizeof(
double), H5T_NATIVE_DOUBLE);
1359 template <
typename number>
1360 std::vector<hsize_t>
1363 std::vector<hsize_t> dimensions = {
data.size()};
1369 template <
typename number>
1370 std::vector<hsize_t>
1373 std::vector<hsize_t> dimensions = {
data.size()};
1379 template <
typename number>
1380 std::vector<hsize_t>
1383 std::vector<hsize_t> dimensions = {
data.m(),
data.n()};
1389 template <
typename number>
1393 return static_cast<unsigned int>(
data.size());
1398 template <
typename number>
1402 return static_cast<unsigned int>(
data.size());
1407 template <
typename number>
1411 return static_cast<unsigned int>(
data.m() *
data.n());
1416 template <
typename Container>
1418 std::is_same_v<Container, std::vector<typename Container::value_type>>,
1422 return Container(std::accumulate(
1423 dimensions.begin(), dimensions.end(), 1, std::multiplies<int>()));
1428 template <
typename Container>
1430 std::is_same_v<Container, Vector<typename Container::value_type>>,
1434 return Container(std::accumulate(
1435 dimensions.begin(), dimensions.end(), 1, std::multiplies<int>()));
1440 template <
typename Container>
1442 std::is_same_v<Container, FullMatrix<typename Container::value_type>>,
1450 std::vector<hsize_t> squeezed_dimensions;
1452 if (dimensions.size() > 2)
1454 for (
const auto &dimension : dimensions)
1457 squeezed_dimensions.push_back(dimension);
1462 squeezed_dimensions = dimensions;
1466 return Container(squeezed_dimensions[0], squeezed_dimensions[1]);
1475# ifdef DEAL_II_WITH_MPI
1476 plist = H5Pcreate(H5P_DATASET_XFER);
1478 const herr_t ret = H5Pset_dxpl_mpio(plist, H5FD_MPIO_COLLECTIVE);
1487 plist = H5P_DEFAULT;
1497 H5D_mpio_actual_io_mode_t &io_mode,
1498 std::uint32_t &local_no_collective_cause,
1499 std::uint32_t &global_no_collective_cause,
1501 const bool query_io_mode)
1505# ifdef DEAL_II_WITH_MPI
1510 ret = H5Pget_mpio_actual_io_mode(plist, &io_mode);
1513 H5Pget_mpio_no_collective_cause(plist,
1514 &local_no_collective_cause,
1515 &global_no_collective_cause);
1518 ret = H5Pclose(plist);
1527 (void)local_no_collective_cause;
1528 (void)global_no_collective_cause;
1530 (void)query_io_mode;
1537 std::string message;
1539 auto append_to_message = [&message](
const char *p) {
1540 if (message.size() > 0)
1555 if (no_collective_cause == 0x00)
1557 append_to_message(
"H5D_MPIO_COLLECTIVE");
1560 if ((no_collective_cause & 0x01) == 0x01)
1562 append_to_message(
"H5D_MPIO_SET_INDEPENDENT");
1565 if ((no_collective_cause & 0x02) == 0x02)
1567 append_to_message(
"H5D_MPIO_DATATYPE_CONVERSION");
1570 if ((no_collective_cause & 0x04) == 0x04)
1572 append_to_message(
"H5D_MPIO_DATA_TRANSFORMS");
1575 if ((no_collective_cause & 0x10) == 0x10)
1577 append_to_message(
"H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES");
1580 if ((no_collective_cause & 0x20) == 0x20)
1582 append_to_message(
"H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET");
1585 if ((no_collective_cause & 0x40) == 0x40)
1587 append_to_message(
"H5D_MPIO_FILTERS");
1594 template <
typename T>
1598 const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<T>();
1606 ret = H5Aread(attr, *t_type, &value);
1609 ret = H5Aclose(attr);
1639 type = H5Tcopy(H5T_C_S1);
1643 ret = H5Tset_cset(type, H5T_CSET_UTF8);
1646 ret = H5Tset_size(type, H5T_VARIABLE);
1652 ret = H5Aread(attr, type, &string_out);
1655 std::string string_value(string_out);
1659 ret = H5Tclose(type);
1662 ret = H5Aclose(attr);
1666 return string_value;
1671 template <
typename T>
1679 const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<T>();
1685 aid = H5Screate(H5S_SCALAR);
1698 ret = H5Awrite(attr, *t_type, &value);
1701 ret = H5Sclose(aid);
1703 ret = H5Aclose(attr);
1714 const std::string value)
1727 t_type = H5Tcopy(H5T_C_S1);
1731 ret = H5Tset_cset(t_type, H5T_CSET_UTF8);
1734 ret = H5Tset_size(t_type, H5T_VARIABLE);
1740 aid = H5Screate(H5S_SCALAR);
1743 *
hdf5_reference, attr_name.data(), t_type, aid, H5P_DEFAULT, H5P_DEFAULT);
1752 const char *c_string_value = value.c_str();
1753 ret = H5Awrite(attr, t_type, &c_string_value);
1756 ret = H5Sclose(aid);
1758 ret = H5Aclose(attr);
1766 template <
typename Container>
1770 const std::shared_ptr<hid_t> t_type =
1771 internal::get_hdf5_datatype<typename Container::value_type>();
1775 Container
data = internal::initialize_container<Container>(
dimensions);
1801 template <
typename Container>
1807 "The dimension of coordinates has to be divisible by the rank"));
1808 const std::shared_ptr<hid_t> t_type =
1809 internal::get_hdf5_datatype<typename Container::value_type>();
1811 hid_t memory_dataspace;
1814 std::vector<hsize_t> data_dimensions{
1815 static_cast<hsize_t
>(coordinates.size() /
rank)};
1817 Container
data = internal::initialize_container<Container>(data_dimensions);
1819 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
1824 coordinates.data());
1844 ret = H5Sclose(memory_dataspace);
1853 template <
typename Container>
1856 const std::vector<hsize_t> &count)
1858 const std::shared_ptr<hid_t> t_type =
1859 internal::get_hdf5_datatype<typename Container::value_type>();
1861 hid_t memory_dataspace;
1866 std::vector<hsize_t> data_dimensions = count;
1868 Container
data = internal::initialize_container<Container>(data_dimensions);
1871 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
1898 ret = H5Sclose(memory_dataspace);
1907 template <
typename Container>
1910 const std::vector<hsize_t> &offset,
1911 const std::vector<hsize_t> &stride,
1912 const std::vector<hsize_t> &count,
1913 const std::vector<hsize_t> &block)
1915 const std::shared_ptr<hid_t> t_type =
1916 internal::get_hdf5_datatype<typename Container::value_type>();
1918 hid_t memory_dataspace;
1921 Container
data = internal::initialize_container<Container>(data_dimensions);
1924 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
1951 ret = H5Sclose(memory_dataspace);
1960 template <
typename number>
1964 const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
1965 const std::vector<hsize_t> data_dimensions = {0};
1967 hid_t memory_dataspace;
1971 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
1992 ret = H5Sclose(memory_dataspace);
2000 template <
typename Container>
2005 const std::shared_ptr<hid_t> t_type =
2006 internal::get_hdf5_datatype<typename Container::value_type>();
2032 template <
typename Container>
2035 const std::vector<hsize_t> &coordinates)
2038 const std::shared_ptr<hid_t> t_type =
2039 internal::get_hdf5_datatype<typename Container::value_type>();
2040 const std::vector<hsize_t> data_dimensions =
2043 hid_t memory_dataspace;
2048 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
2053 coordinates.data());
2073 ret = H5Sclose(memory_dataspace);
2081 template <
typename Container>
2084 const std::vector<hsize_t> &offset,
2085 const std::vector<hsize_t> &count)
2090 std::multiplies<unsigned int>()),
2092 const std::shared_ptr<hid_t> t_type =
2093 internal::get_hdf5_datatype<typename Container::value_type>();
2096 const std::vector<hsize_t> &data_dimensions = count;
2098 hid_t memory_dataspace;
2103 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
2130 ret = H5Sclose(memory_dataspace);
2138 template <
typename Container>
2141 const std::vector<hsize_t> &data_dimensions,
2142 const std::vector<hsize_t> &offset,
2143 const std::vector<hsize_t> &stride,
2144 const std::vector<hsize_t> &count,
2145 const std::vector<hsize_t> &block)
2147 const std::shared_ptr<hid_t> t_type =
2148 internal::get_hdf5_datatype<typename Container::value_type>();
2150 hid_t memory_dataspace;
2155 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
2182 ret = H5Sclose(memory_dataspace);
2190 template <
typename number>
2194 std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
2195 std::vector<hsize_t> data_dimensions = {0};
2197 hid_t memory_dataspace;
2201 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
2222 ret = H5Sclose(memory_dataspace);
2230 template <
typename number>
2233 const std::vector<hsize_t> &dimensions)
const
2235 std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
2241 template <
typename Container>
2247 create_dataset<typename Container::value_type>(
name, dimensions);
2248 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)