From 081cfea06b63569f93e295be42d25f8ad91dd550 Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Mon, 10 Apr 2017 10:03:42 +0200
Subject: [PATCH] [MeL/IO/MPI_IO] Refactor readNodePropertiesBinary.

---
 .../IO/MPI_IO/NodePartitionedMeshReader.cpp   | 57 ++++++++++++-------
 MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h | 13 ++++-
 2 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
index 1efa7e01dd3..c2078d6fc01 100644
--- a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
+++ b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
@@ -198,20 +198,25 @@ MeshLib::NodePartitionedMesh* NodePartitionedMeshReader::readBinary(
 MeshLib::Properties NodePartitionedMeshReader::readPropertiesBinary(
     const std::string& file_name_base) const
 {
-    return readNodePropertiesBinary(file_name_base);
+    MeshLib::Properties p;
+    readNodePropertiesBinary(file_name_base, MeshLib::MeshItemType::Node, p);
+    return p;
 }
 
-MeshLib::Properties NodePartitionedMeshReader::readNodePropertiesBinary(
-    const std::string& file_name_base) const
+void NodePartitionedMeshReader::readNodePropertiesBinary(
+    const std::string& file_name_base, MeshLib::MeshItemType t,
+    MeshLib::Properties& p) const
 {
-    const std::string fname_cfg = file_name_base +
-                                  "_partitioned_node_properties_cfg" +
+    std::string const item_type =
+        t == MeshLib::MeshItemType::Node ? "node" : "cell";
+    const std::string fname_cfg = file_name_base + "_partitioned_" + item_type +
+                                  "_properties_cfg" +
                                   std::to_string(_mpi_comm_size) + ".bin";
     std::ifstream is(fname_cfg.c_str(), std::ios::binary | std::ios::in);
     if (!is)
     {
         WARN("Could not open file '%s' in binary mode.", fname_cfg.c_str());
-        return MeshLib::Properties();
+        return;
     }
     std::size_t number_of_properties = 0;
     is.read(reinterpret_cast<char*>(&number_of_properties), sizeof(std::size_t));
@@ -257,8 +262,8 @@ MeshLib::Properties NodePartitionedMeshReader::readNodePropertiesBinary(
     DBUG("[%d] %d tuples in partition.", _mpi_rank, pvpmd->number_of_tuples);
     is.close();
 
-    const std::string fname_val = file_name_base +
-                                  "_partitioned_node_properties_val" +
+    const std::string fname_val = file_name_base + "_partitioned_" + item_type +
+                                  "_properties_val" +
                                   std::to_string(_mpi_comm_size) + ".bin";
     is.open(fname_val.c_str(), std::ios::binary | std::ios::in);
     if (!is)
@@ -266,25 +271,34 @@ MeshLib::Properties NodePartitionedMeshReader::readNodePropertiesBinary(
         ERR("Could not open file '%s' in binary mode.", fname_val.c_str());
     }
 
-    MeshLib::Properties p;
+    readDomainSpecificPartOfPropertyVectors(vec_pvmd, *pvpmd, t, is, p);
+}
 
-    // Read the specific parts of the PropertyVector values for this process.
+void NodePartitionedMeshReader::readDomainSpecificPartOfPropertyVectors(
+    std::vector<boost::optional<MeshLib::IO::PropertyVectorMetaData>> const&
+        vec_pvmd,
+    MeshLib::IO::PropertyVectorPartitionMetaData const& pvpmd,
+    MeshLib::MeshItemType t,
+    std::istream& is,
+    MeshLib::Properties& p) const
+{
     unsigned long global_offset = 0;
+    std::size_t const number_of_properties = vec_pvmd.size();
     for (std::size_t i(0); i < number_of_properties; ++i)
     {
-        INFO("[%d] global offset: %d, offset within the PropertyVector: %d.",
+        DBUG("[%d] global offset: %d, offset within the PropertyVector: %d.",
              _mpi_rank, global_offset,
              global_offset +
-                 pvpmd->offset * vec_pvmd[i]->data_type_size_in_bytes);
+                 pvpmd.offset * vec_pvmd[i]->data_type_size_in_bytes);
         if (vec_pvmd[i]->is_int_type)
         {
             if (vec_pvmd[i]->is_data_type_signed)
             {
                 if (vec_pvmd[i]->data_type_size_in_bytes == sizeof(int))
-                    createPropertyVectorPart<int>(is, *vec_pvmd[i], *pvpmd,
+                    createPropertyVectorPart<int>(is, *vec_pvmd[i], pvpmd,
                                                   global_offset, p);
                 if (vec_pvmd[i]->data_type_size_in_bytes == sizeof(long))
-                    createPropertyVectorPart<long>(is, *vec_pvmd[i], *pvpmd,
+                    createPropertyVectorPart<long>(is, *vec_pvmd[i], pvpmd,
                                                    global_offset, p);
             }
             else
@@ -292,32 +306,31 @@ MeshLib::Properties NodePartitionedMeshReader::readNodePropertiesBinary(
                 if (vec_pvmd[i]->data_type_size_in_bytes ==
                     sizeof(unsigned int))
                     createPropertyVectorPart<unsigned int>(
-                        is, *vec_pvmd[i], *pvpmd, global_offset, p);
+                        is, *vec_pvmd[i], pvpmd, global_offset, p);
                 if (vec_pvmd[i]->data_type_size_in_bytes ==
                     sizeof(unsigned long))
                     createPropertyVectorPart<unsigned long>(
-                        is, *vec_pvmd[i], *pvpmd, global_offset, p);
+                        is, *vec_pvmd[i], pvpmd, global_offset, p);
             }
         }
         else
         {
             if (vec_pvmd[i]->data_type_size_in_bytes == sizeof(float))
-                createPropertyVectorPart<float>(is, *vec_pvmd[i], *pvpmd,
+                createPropertyVectorPart<float>(is, *vec_pvmd[i], pvpmd,
                                                 global_offset, p);
             if (vec_pvmd[i]->data_type_size_in_bytes == sizeof(double))
-                createPropertyVectorPart<double>(is, *vec_pvmd[i], *pvpmd,
+                createPropertyVectorPart<double>(is, *vec_pvmd[i], pvpmd,
                                                  global_offset, p);
         }
         global_offset += vec_pvmd[i]->data_type_size_in_bytes *
                          vec_pvmd[i]->number_of_tuples *
                          vec_pvmd[i]->number_of_components;
     }
-
-    return p;
 }
 
-bool NodePartitionedMeshReader::openASCIIFiles(std::string const& file_name_base,
-    std::ifstream& is_cfg, std::ifstream& is_node, std::ifstream& is_elem) const
+bool NodePartitionedMeshReader::openASCIIFiles(
+    std::string const& file_name_base, std::ifstream& is_cfg,
+    std::ifstream& is_node, std::ifstream& is_elem) const
 {
     const std::string fname_header = file_name_base +  "_partitioned_";
     const std::string fname_num_p_ext = std::to_string(_mpi_comm_size) + ".msh";
diff --git a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h
index 372c32bf5d9..edead978c1f 100644
--- a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h
+++ b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h
@@ -168,8 +168,17 @@ private:
     MeshLib::Properties readPropertiesBinary(
         const std::string& file_name_base) const;
 
-    MeshLib::Properties readNodePropertiesBinary(
-        const std::string& file_name_base) const;
+    void readNodePropertiesBinary(const std::string& file_name_base,
+                                  MeshLib::MeshItemType t,
+                                  MeshLib::Properties& p) const;
+
+    void readDomainSpecificPartOfPropertyVectors(
+        std::vector<boost::optional<MeshLib::IO::PropertyVectorMetaData>> const&
+            vec_pvmd,
+        MeshLib::IO::PropertyVectorPartitionMetaData const& pvpmd,
+        MeshLib::MeshItemType t,
+        std::istream& is,
+        MeshLib::Properties& p) const;
 
     template <typename T>
     void createPropertyVectorPart(
-- 
GitLab