read_hyperslab(const std::vector<hsize_t> &offset,
const std::vector<hsize_t> &count);
+ /**
+ * * Writes a data hyperslab to the dataset. The parameters are summarized
+ * below:
+ * - Dataset_dimensions: the dimensions of the data memory block.
+ * - Offset: The starting location for the hyperslab.
+ * - Stride: The number of elements to separate each element or block to be
+ * selected.
+ * - Count: The number of elements or blocks to select along each
+ * dimension.
+ * - Block: The size of the block selected from the dataspace.
+ *
+ * See the <a
+ * href="https://support.hdfgroup.org/HDF5/doc/UG/HDF5_Users_Guide-Responsive%20HTML5/HDF5_Users_Guide/Dataspaces/HDF5_Dataspaces_and_Partial_I_O.htm?rhtocid=7.2#TOC_7_4_Dataspaces_and_Databc-6">Dataspaces
+ * and Data Transfer</a> section in the HDF5 User's Guide. See as well the
+ * <a
+ * href="https://support.hdfgroup.org/HDF5/doc1.8/RM/RM_H5S.html#Dataspace-SelectHyperslab">H5Sselect_hyperslab
+ * definition</a>.
+ *
+ * Datatype conversion takes place at the time of a read or write and is
+ * automatic. See the <a
+ * href="https://support.hdfgroup.org/HDF5/doc/UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FDatatypes%2FHDF5_Datatypes.htm%23TOC_6_10_Data_Transferbc-26&rhtocid=6.5_2">Data
+ * Transfer: Datatype Conversion and Selection</a> section in the HDF5
+ * User's Guide.
+ *
+ * `Container` can be `std::vector<float>`, `std::vector<double>`,
+ * `std::vector<std::complex<float>>`, `std::vector<std::complex<double>>`,
+ * `std::vector<int>`, `std::vector<unsigned int>`, `Vector<float>`,
+ * `Vector<double>`, `Vector<std::complex<float>>`,
+ * `Vector<std::complex<double>>`, `FullMatrix<float>`,
+ * `FullMatrix<double>`, `FullMatrix<std::complex<float>>` or
+ * `FullMatrix<std::complex<double>>`.
+ */
+ template <typename Container>
+ Container
+ read_hyperslab(const std::vector<hsize_t> &data_dimensions,
+ const std::vector<hsize_t> &offset,
+ const std::vector<hsize_t> &stride,
+ const std::vector<hsize_t> &count,
+ const std::vector<hsize_t> &block);
+
/**
* This function does not read any data, but it can contribute to a
* collective read call. @p number can be `float`, `double`,
+ template <typename Container>
+ Container
+ DataSet::read_hyperslab(const std::vector<hsize_t> &data_dimensions,
+ const std::vector<hsize_t> &offset,
+ const std::vector<hsize_t> &stride,
+ const std::vector<hsize_t> &count,
+ const std::vector<hsize_t> &block)
+ {
+ const std::shared_ptr<hid_t> t_type =
+ internal::get_hdf5_datatype<typename Container::value_type>();
+ hid_t plist;
+ hid_t memory_dataspace;
+
+ Container data = internal::initialize_container<Container>(data_dimensions);
+
+ memory_dataspace =
+ H5Screate_simple(data_dimensions.size(), data_dimensions.data(), NULL);
+ Assert(memory_dataspace >= 0, ExcMessage("Error at H5Screate_simple"));
+ ret = H5Sselect_hyperslab(*dataspace,
+ H5S_SELECT_SET,
+ offset.data(),
+ stride.data(),
+ count.data(),
+ block.data());
+ Assert(ret >= 0, ExcMessage("Error at H5Sselect_hyperslab"));
+
+ if (mpi)
+ {
+ plist = H5Pcreate(H5P_DATASET_XFER);
+ Assert(plist >= 0, ExcMessage("Error at H5Pcreate"));
+ ret = H5Pset_dxpl_mpio(plist, H5FD_MPIO_COLLECTIVE);
+ Assert(ret >= 0, ExcMessage("Error at H5Pset_dxpl_mpio"));
+ }
+ else
+ {
+ plist = H5P_DEFAULT;
+ }
+
+ ret = H5Dread(*hdf5_reference,
+ *t_type,
+ memory_dataspace,
+ *dataspace,
+ plist,
+ internal::get_container_pointer(data));
+ Assert(ret >= 0, ExcMessage("Error at H5Dread"));
+
+ if (mpi)
+ {
+ if (query_io_mode)
+ {
+ ret = H5Pget_mpio_actual_io_mode(plist, &io_mode);
+ Assert(ret >= 0, ExcMessage("Error at H5Pget_mpio_actual_io_mode"));
+ ret = H5Pget_mpio_no_collective_cause(plist,
+ &local_no_collective_cause,
+ &global_no_collective_cause);
+ Assert(ret >= 0,
+ ExcMessage("Error at H5Pget_mpio_no_collective_cause"));
+ }
+ ret = H5Pclose(plist);
+ Assert(ret >= 0, ExcMessage("Error at H5Pclose"));
+ }
+
+ ret = H5Sclose(memory_dataspace);
+ Assert(ret >= 0, ExcMessage("Error at H5SClose"));
+
+ return data;
+ }
+
+
+
template <typename number>
void
DataSet::read_none()
const std::vector<hsize_t> &offset,
const std::vector<hsize_t> &count);
+ template std::vector<int>
+ DataSet::read_hyperslab<std::vector<int>>(
+ const std::vector<hsize_t> &data_dimensions,
+ const std::vector<hsize_t> &offset,
+ const std::vector<hsize_t> &stride,
+ const std::vector<hsize_t> &count,
+ const std::vector<hsize_t> &block);
+ template std::vector<unsigned int>
+ DataSet::read_hyperslab<std::vector<unsigned int>>(
+ const std::vector<hsize_t> &data_dimensions,
+ const std::vector<hsize_t> &offset,
+ const std::vector<hsize_t> &stride,
+ const std::vector<hsize_t> &count,
+ const std::vector<hsize_t> &block);
+
template void
DataSet::read_none<int>();
template void
template FullMatrix<number> DataSet::read_hyperslab<FullMatrix<number>>(
const std::vector<hsize_t> &offset, const std::vector<hsize_t> &count);
+ template std::vector<number> DataSet::read_hyperslab<std::vector<number>>(
+ const std::vector<hsize_t> &data_dimensions,
+ const std::vector<hsize_t> &offset,
+ const std::vector<hsize_t> &stride,
+ const std::vector<hsize_t> &count,
+ const std::vector<hsize_t> &block);
+ template Vector<number> DataSet::read_hyperslab<Vector<number>>(
+ const std::vector<hsize_t> &data_dimensions,
+ const std::vector<hsize_t> &offset,
+ const std::vector<hsize_t> &stride,
+ const std::vector<hsize_t> &count,
+ const std::vector<hsize_t> &block);
+ template FullMatrix<number> DataSet::read_hyperslab<FullMatrix<number>>(
+ const std::vector<hsize_t> &data_dimensions,
+ const std::vector<hsize_t> &offset,
+ const std::vector<hsize_t> &stride,
+ const std::vector<hsize_t> &count,
+ const std::vector<hsize_t> &block);
+
template void DataSet::read_none<number>();
template void DataSet::write<std::vector<number>>(