]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Use Container in read_selection and write_selection
authorDaniel Garcia-Sanchez <daniel.garcia-sanchez@insp.upmc.fr>
Tue, 30 Oct 2018 09:26:35 +0000 (10:26 +0100)
committerDaniel Garcia-Sanchez <daniel.garcia-sanchez@insp.upmc.fr>
Wed, 9 Jan 2019 18:29:02 +0000 (19:29 +0100)
include/deal.II/base/hdf5.h
source/base/hdf5.cc
source/base/hdf5.inst.in
tests/base/hdf5_03.cc
tests/base/hdf5_04.cc
tests/base/hdf5_05.cc

index 2f9baad0bf156574d9dcde9b7218a89335e057ed..52c0ed048c66200e427e6f414d81d2d9ab1ca875 100644 (file)
@@ -452,8 +452,8 @@ namespace HDF5
      * Transfer: Datatype Conversion and Selection</a>  section in the HDF5
      * User's Guide.
      */
-    template <typename number>
-    std::vector<number>
+    template <typename Container>
+    Container
     read_selection(const std::vector<hsize_t> &coordinates);
 
     /**
@@ -595,9 +595,9 @@ namespace HDF5
      * Transfer: Datatype Conversion and Selection</a>  section in the HDF5
      * User's Guide.
      */
-    template <typename number>
+    template <typename Container>
     void
-    write_selection(const std::vector<number> & data,
+    write_selection(const Container &           data,
                     const std::vector<hsize_t> &coordinates);
 
     // clang-format off
index 8e8db82d8f1ddc4fb7a07658584ea94bef3ce084..873f7cb0ae0013e5191d90ca0c3a56ed64a98a77 100644 (file)
@@ -734,23 +734,23 @@ namespace HDF5
 
 
 
-  template <typename number>
-  std::vector<number>
+  template <typename Container>
+  Container
   DataSet::read_selection(const std::vector<hsize_t> &coordinates)
   {
     Assert(coordinates.size() % rank == 0,
            ExcMessage(
              "The dimension of coordinates has to be divisible by the rank"));
-    const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
-    hid_t                        plist;
-    hid_t                        memory_dataspace;
-    herr_t                       ret;
+    const std::shared_ptr<hid_t> t_type =
+      internal::get_hdf5_datatype<typename Container::value_type>();
+    hid_t  plist;
+    hid_t  memory_dataspace;
+    herr_t ret;
 
     std::vector<hsize_t> data_dimensions{
       static_cast<hsize_t>(coordinates.size() / rank)};
 
-    std::vector<number> data(
-      static_cast<unsigned int>(coordinates.size() / rank));
+    Container data = internal::initialize_container<Container>(data_dimensions);
 
     memory_dataspace = H5Screate_simple(1, data_dimensions.data(), NULL);
     Assert(memory_dataspace >= 0, ExcMessage("Error at H5Screate_simple"));
@@ -777,7 +777,7 @@ namespace HDF5
                   memory_dataspace,
                   *dataspace,
                   plist,
-                  data.data());
+                  internal::get_container_pointer(data));
     Assert(ret >= 0, ExcMessage("Error at H5Dread"));
 
     if (mpi)
@@ -1055,14 +1055,16 @@ namespace HDF5
 
 
 
-  template <typename number>
+  template <typename Container>
   void
-  DataSet::write_selection(const std::vector<number> & data,
+  DataSet::write_selection(const Container &           data,
                            const std::vector<hsize_t> &coordinates)
   {
     AssertDimension(coordinates.size(), data.size() * rank);
-    const std::shared_ptr<hid_t> t_type = internal::get_hdf5_datatype<number>();
-    const std::vector<hsize_t>   data_dimensions = {data.size()};
+    const std::shared_ptr<hid_t> t_type =
+      internal::get_hdf5_datatype<typename Container::value_type>();
+    const std::vector<hsize_t> data_dimensions =
+      internal::get_container_dimensions(data);
 
     hid_t  memory_dataspace;
     hid_t  plist;
@@ -1094,7 +1096,7 @@ namespace HDF5
                    memory_dataspace,
                    *dataspace,
                    plist,
-                   data.data());
+                   internal::get_container_const_pointer(data));
     Assert(ret >= 0, ExcMessage("Error at H5Dwrite"));
 
     if (mpi)
@@ -1637,9 +1639,10 @@ namespace HDF5
   DataSet::read<std::vector<unsigned int>>();
 
   template std::vector<int>
-  DataSet::read_selection<int>(const std::vector<hsize_t> &coordinates);
+  DataSet::read_selection<std::vector<int>>(
+    const std::vector<hsize_t> &coordinates);
   template std::vector<unsigned int>
-  DataSet::read_selection<unsigned int>(
+  DataSet::read_selection<std::vector<unsigned int>>(
     const std::vector<hsize_t> &coordinates);
 
   template std::vector<int>
@@ -1677,10 +1680,11 @@ namespace HDF5
     const std::vector<unsigned int> &data);
 
   template void
-  DataSet::write_selection<int>(const std::vector<int> &    data,
-                                const std::vector<hsize_t> &coordinates);
+  DataSet::write_selection<std::vector<int>>(
+    const std::vector<int> &    data,
+    const std::vector<hsize_t> &coordinates);
   template void
-  DataSet::write_selection<unsigned int>(
+  DataSet::write_selection<std::vector<unsigned int>>(
     const std::vector<unsigned int> &data,
     const std::vector<hsize_t> &     coordinates);
 
index 87bf2c2a28d99ab8d8212c1b1e1b47284e54ea40..01aaa687f44ee771b0c65077cd171d5945c71599 100644 (file)
@@ -25,7 +25,9 @@ for (number : REAL_AND_COMPLEX_SCALARS)
     template Vector<number>      DataSet::read<Vector<number>>();
     template FullMatrix<number>  DataSet::read<FullMatrix<number>>();
 
-    template std::vector<number> DataSet::read_selection<number>(
+    template std::vector<number> DataSet::read_selection<std::vector<number>>(
+      const std::vector<hsize_t> &coordinates);
+    template Vector<number> DataSet::read_selection<Vector<number>>(
       const std::vector<hsize_t> &coordinates);
 
     template std::vector<number> DataSet::read_hyperslab<std::vector<number>>(
@@ -62,8 +64,10 @@ for (number : REAL_AND_COMPLEX_SCALARS)
     template void DataSet::write<FullMatrix<number>>(
       const FullMatrix<number> &data);
 
-    template void DataSet::write_selection<number>(
+    template void DataSet::write_selection<std::vector<number>>(
       const std::vector<number> &data, const std::vector<hsize_t> &coordinates);
+    template void DataSet::write_selection<Vector<number>>(
+      const Vector<number> &data, const std::vector<hsize_t> &coordinates);
 
     template void DataSet::write_hyperslab<std::vector<number>>(
       const std::vector<number> & data,
index dba6dde6e51fa7399c18e96b14db9c4ddb5e1647..a19402fd3fbc27829d3928c8ce80796b8683e00e 100644 (file)
@@ -602,7 +602,8 @@ read_test(HDF5::Group        root_group,
                                             4, // third point
                                             25,
                                             12}; // fourth point
-      auto data_a = dataset.template read_selection<Number>(coordinates_a);
+      auto                 data_a =
+        dataset.template read_selection<std::vector<Number>>(coordinates_a);
       deallog << "Selection " + dataset_name << " " << container_name << "<"
               << type_name << ">"
               << " (Read): " << data_a[0] << ", " << data_a[1] << ", "
index 882b7dd923476372cf6e5364263a873b51add33d..2dd9c0676132e3aeec497a94e42b688a455cf8e1 100644 (file)
@@ -556,7 +556,8 @@ read_test(HDF5::Group root_group)
                                             4, // third point
                                             25,
                                             12}; // fourth point
-      auto data_a = dataset.template read_selection<Number>(coordinates_a);
+      auto                 data_a =
+        dataset.template read_selection<std::vector<Number>>(coordinates_a);
       deallog << "Selection " + dataset_name << " " << container_name << "<"
               << type_name << ">"
               << " (Read): " << data_a[0] << ", " << data_a[1] << ", "
index 7be7ec55ef933a8c9063c88451f4d5d477026d1b..a5482dc7976d550c0b9f67f5f8adcc74a90bf404 100644 (file)
@@ -972,7 +972,7 @@ read_test(HDF5::Group        root_group,
                                           3,
                                           2}; // fith point
 
-      auto data = dataset.read_selection<Number>(coordinates);
+      auto data = dataset.read_selection<std::vector<Number>>(coordinates);
 
       pcout << "Sub-matrix" << std::endl;
       pcout << "IO mode " + dataset_name << "<" << type_name << ">"

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.