]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add read_hyperslab()
authorDaniel Garcia-Sanchez <daniel.garcia-sanchez@insp.upmc.fr>
Mon, 29 Oct 2018 19:19:26 +0000 (20:19 +0100)
committerDaniel Garcia-Sanchez <daniel.garcia-sanchez@insp.upmc.fr>
Wed, 9 Jan 2019 18:28:44 +0000 (19:28 +0100)
include/deal.II/base/hdf5.h
source/base/hdf5.cc
source/base/hdf5.inst.in

index 8787327df123492eed4101169f8cd3653583b199..1c1de3405e54879256635ba68a9f8da01c109173 100644 (file)
@@ -506,6 +506,46 @@ namespace HDF5
     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`,
index cc507af1c47cf332f68de8376c215083be697099..3517b607a85be6f3c5cb38d5983812bcf39e23e2 100644 (file)
@@ -882,6 +882,76 @@ namespace HDF5
 
 
 
+  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()
@@ -1565,6 +1635,21 @@ namespace HDF5
     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
index d082f7562d108135305b910fb34499f7673865ec..87bf2c2a28d99ab8d8212c1b1e1b47284e54ea40 100644 (file)
@@ -35,6 +35,25 @@ for (number : REAL_AND_COMPLEX_SCALARS)
     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>>(

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.