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>
619 write(
const Container &data);
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);
1316 *t_type = H5Tcreate(H5T_COMPOUND,
sizeof(std::complex<float>));
1321 herr_t ret = H5Tinsert(*t_type,
"r", 0, H5T_NATIVE_FLOAT);
1323 ret = H5Tinsert(*t_type,
"i",
sizeof(
float), H5T_NATIVE_FLOAT);
1328 else if (std::is_same_v<number, std::complex<double>>)
1330 std::shared_ptr<hid_t> t_type =
1331 std::shared_ptr<hid_t>(
new hid_t, [](hid_t *pointer) {
1333 const herr_t ret = H5Tclose(*pointer);
1337 *t_type = H5Tcreate(H5T_COMPOUND,
sizeof(std::complex<double>));
1342 herr_t ret = H5Tinsert(*t_type,
"r", 0, H5T_NATIVE_DOUBLE);
1344 ret = H5Tinsert(*t_type,
"i",
sizeof(
double), H5T_NATIVE_DOUBLE);
1357 template <
typename number>
1358 std::vector<hsize_t>
1361 std::vector<hsize_t> dimensions = {data.size()};
1367 template <
typename number>
1368 std::vector<hsize_t>
1371 std::vector<hsize_t> dimensions = {data.
size()};
1377 template <
typename number>
1378 std::vector<hsize_t>
1381 std::vector<hsize_t> dimensions = {data.
m(), data.
n()};
1387 template <
typename number>
1391 return static_cast<unsigned int>(data.size());
1396 template <
typename number>
1400 return static_cast<unsigned int>(data.
size());
1405 template <
typename number>
1409 return static_cast<unsigned int>(data.
m() * data.
n());
1414 template <
typename Container>
1416 std::is_same_v<Container, std::vector<typename Container::value_type>>,
1420 return Container(std::accumulate(
1421 dimensions.begin(), dimensions.end(), 1, std::multiplies<int>()));
1426 template <
typename Container>
1428 std::is_same_v<Container, Vector<typename Container::value_type>>,
1432 return Container(std::accumulate(
1433 dimensions.begin(), dimensions.end(), 1, std::multiplies<int>()));
1438 template <
typename Container>
1440 std::is_same_v<Container, FullMatrix<typename Container::value_type>>,
1448 std::vector<hsize_t> squeezed_dimensions;
1450 if (dimensions.size() > 2)
1452 for (
const auto &
dimension : dimensions)
1455 squeezed_dimensions.push_back(
dimension);
1460 squeezed_dimensions = dimensions;
1464 return Container(squeezed_dimensions[0], squeezed_dimensions[1]);
1473# ifdef DEAL_II_WITH_MPI
1474 plist = H5Pcreate(H5P_DATASET_XFER);
1476 const herr_t ret = H5Pset_dxpl_mpio(plist, H5FD_MPIO_COLLECTIVE);
1485 plist = H5P_DEFAULT;
1495 H5D_mpio_actual_io_mode_t &io_mode,
1496 std::uint32_t &local_no_collective_cause,
1497 std::uint32_t &global_no_collective_cause,
1499 const bool query_io_mode)
1503# ifdef DEAL_II_WITH_MPI
1508 ret = H5Pget_mpio_actual_io_mode(plist, &io_mode);
1511 H5Pget_mpio_no_collective_cause(plist,
1512 &local_no_collective_cause,
1513 &global_no_collective_cause);
1516 ret = H5Pclose(plist);
1525 (void)local_no_collective_cause;
1526 (void)global_no_collective_cause;
1528 (void)query_io_mode;
1535 std::string message;
1537 auto append_to_message = [&message](
const char *p) {
1538 if (message.size() > 0)
1553 if (no_collective_cause == 0x00)
1555 append_to_message(
"H5D_MPIO_COLLECTIVE");
1558 if ((no_collective_cause & 0x01) == 0x01)
1560 append_to_message(
"H5D_MPIO_SET_INDEPENDENT");
1563 if ((no_collective_cause & 0x02) == 0x02)
1565 append_to_message(
"H5D_MPIO_DATATYPE_CONVERSION");
1568 if ((no_collective_cause & 0x04) == 0x04)
1570 append_to_message(
"H5D_MPIO_DATA_TRANSFORMS");
1573 if ((no_collective_cause & 0x10) == 0x10)
1575 append_to_message(
"H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES");
1578 if ((no_collective_cause & 0x20) == 0x20)
1580 append_to_message(
"H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET");
1583 if ((no_collective_cause & 0x40) == 0x40)
1585 append_to_message(
"H5D_MPIO_FILTERS");
1592 template <
typename T>
1604 ret = H5Aread(attr, *t_type, &
value);
1607 ret = H5Aclose(attr);
1637 type = H5Tcopy(H5T_C_S1);
1641 ret = H5Tset_cset(type, H5T_CSET_UTF8);
1644 ret = H5Tset_size(type, H5T_VARIABLE);
1650 ret = H5Aread(attr, type, &string_out);
1653 std::string string_value(string_out);
1656 std::free(string_out);
1657 ret = H5Tclose(type);
1660 ret = H5Aclose(attr);
1664 return string_value;
1669 template <
typename T>
1683 aid = H5Screate(H5S_SCALAR);
1696 ret = H5Awrite(attr, *t_type, &
value);
1699 ret = H5Sclose(aid);
1701 ret = H5Aclose(attr);
1712 const std::string
value)
1725 t_type = H5Tcopy(H5T_C_S1);
1729 ret = H5Tset_cset(t_type, H5T_CSET_UTF8);
1732 ret = H5Tset_size(t_type, H5T_VARIABLE);
1738 aid = H5Screate(H5S_SCALAR);
1741 *
hdf5_reference, attr_name.data(), t_type, aid, H5P_DEFAULT, H5P_DEFAULT);
1750 const char *c_string_value =
value.c_str();
1751 ret = H5Awrite(attr, t_type, &c_string_value);
1754 ret = H5Sclose(aid);
1756 ret = H5Aclose(attr);
1764 template <
typename Container>
1768 const std::shared_ptr<hid_t> t_type =
1799 template <
typename Container>
1805 "The dimension of coordinates has to be divisible by the rank"));
1806 const std::shared_ptr<hid_t> t_type =
1809 hid_t memory_dataspace;
1812 std::vector<hsize_t> data_dimensions{
1813 static_cast<hsize_t
>(coordinates.size() /
rank)};
1817 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
1822 coordinates.data());
1842 ret = H5Sclose(memory_dataspace);
1851 template <
typename Container>
1854 const std::vector<hsize_t> &count)
1856 const std::shared_ptr<hid_t> t_type =
1859 hid_t memory_dataspace;
1864 std::vector<hsize_t> data_dimensions = count;
1869 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
1896 ret = H5Sclose(memory_dataspace);
1905 template <
typename Container>
1908 const std::vector<hsize_t> &offset,
1909 const std::vector<hsize_t> &stride,
1910 const std::vector<hsize_t> &count,
1911 const std::vector<hsize_t> &block)
1913 const std::shared_ptr<hid_t> t_type =
1916 hid_t memory_dataspace;
1922 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
1949 ret = H5Sclose(memory_dataspace);
1958 template <
typename number>
1963 const std::vector<hsize_t> data_dimensions = {0};
1965 hid_t memory_dataspace;
1969 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
1990 ret = H5Sclose(memory_dataspace);
1998 template <
typename Container>
2003 const std::shared_ptr<hid_t> t_type =
2030 template <
typename Container>
2033 const std::vector<hsize_t> &coordinates)
2036 const std::shared_ptr<hid_t> t_type =
2038 const std::vector<hsize_t> data_dimensions =
2041 hid_t memory_dataspace;
2046 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
2051 coordinates.data());
2071 ret = H5Sclose(memory_dataspace);
2079 template <
typename Container>
2082 const std::vector<hsize_t> &offset,
2083 const std::vector<hsize_t> &count)
2088 std::multiplies<unsigned int>()),
2090 const std::shared_ptr<hid_t> t_type =
2094 const std::vector<hsize_t> &data_dimensions = count;
2096 hid_t memory_dataspace;
2101 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
2128 ret = H5Sclose(memory_dataspace);
2136 template <
typename Container>
2139 const std::vector<hsize_t> &data_dimensions,
2140 const std::vector<hsize_t> &offset,
2141 const std::vector<hsize_t> &stride,
2142 const std::vector<hsize_t> &count,
2143 const std::vector<hsize_t> &block)
2145 const std::shared_ptr<hid_t> t_type =
2148 hid_t memory_dataspace;
2153 H5Screate_simple(data_dimensions.size(), data_dimensions.data(),
nullptr);
2180 ret = H5Sclose(memory_dataspace);
2188 template <
typename number>
2193 std::vector<hsize_t> data_dimensions = {0};
2195 hid_t memory_dataspace;
2199 memory_dataspace = H5Screate_simple(1, data_dimensions.data(),
nullptr);
2220 ret = H5Sclose(memory_dataspace);
2228 template <
typename number>
2231 const std::vector<hsize_t> &dimensions)
const
2239 template <
typename Container>
2246 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
DataSet(const std::string &name, const hid_t &parent_group_id, bool mpi)
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
File(const std::string &name, const FileAccessMode mode)
DataSet open_dataset(const std::string &name) const
Group open_group(const std::string &name) const
Group(const std::string &name, const Group &parent_group, const bool mpi, const GroupAccessMode mode)
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)
HDF5Object(const std::string &name, const bool mpi)
virtual size_type size() const override
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
const unsigned int DoFAccessor< structdim, dim, spacedim, level_dof_access >::dimension
#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)
const bool IsBlockVector< VectorType >::value
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)