From 83e8cc0f2e88b51c5ba286661cb9d84a76a93517 Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Wed, 15 Feb 2017 12:25:02 +0100
Subject: [PATCH] [A/U/MP] Impl. and use writePropertyVectorValuesBinary.

---
 .../PartitionMesh/NodeWiseMeshPartitioner.cpp | 17 +++++++++---
 .../PartitionMesh/NodeWiseMeshPartitioner.h   | 26 +++++++++++++++++++
 2 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
index e8e0602a1da..50f70284c1b 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
@@ -266,9 +266,15 @@ NodeWiseMeshPartitioner::getNumberOfIntegerVariablesOfElements(
 void NodeWiseMeshPartitioner::writePropertiesBinary(
     const std::string& file_name_base) const
 {
-    const std::string fname = file_name_base + "_partitioned_properties_cfg"
-                              + std::to_string(_npartitions) + ".bin";
-    std::ofstream out(fname.c_str(), std::ios::binary | std::ios::out);
+    const std::string fname_cfg = file_name_base +
+                                  "_partitioned_properties_cfg" +
+                                  std::to_string(_npartitions) + ".bin";
+    std::ofstream out(fname_cfg.c_str(), std::ios::binary | std::ios::out);
+
+    const std::string fname_val = file_name_base +
+                                  "_partitioned_properties_val" +
+                                  std::to_string(_npartitions) + ".bin";
+    std::ofstream out_val(fname_val.c_str(), std::ios::binary | std::ios::out);
 
     auto const& properties(_mesh->getProperties());
     auto const& property_names(properties.getPropertyVectorNames());
@@ -289,6 +295,7 @@ void NodeWiseMeshPartitioner::writePropertiesBinary(
                 pvmd.data_type_size_in_bytes = sizeof(double);
                 pvmd.number_of_components = pv->getNumberOfComponents();
                 pvmd.number_of_tuples = pv->getNumberOfTuples();
+                writePropertyVectorValuesBinary(out_val, *pv);
             }
         }
         {
@@ -300,6 +307,7 @@ void NodeWiseMeshPartitioner::writePropertiesBinary(
                 pvmd.data_type_size_in_bytes = sizeof(float);
                 pvmd.number_of_components = pv->getNumberOfComponents();
                 pvmd.number_of_tuples = pv->getNumberOfTuples();
+                writePropertyVectorValuesBinary(out_val, *pv);
             }
         }
         {
@@ -311,6 +319,7 @@ void NodeWiseMeshPartitioner::writePropertiesBinary(
                 pvmd.data_type_size_in_bytes = sizeof(int);
                 pvmd.number_of_components = pv->getNumberOfComponents();
                 pvmd.number_of_tuples = pv->getNumberOfTuples();
+                writePropertyVectorValuesBinary(out_val, *pv);
             }
         }
         {
@@ -322,6 +331,7 @@ void NodeWiseMeshPartitioner::writePropertiesBinary(
                 pvmd.data_type_size_in_bytes = sizeof(unsigned);
                 pvmd.number_of_components = pv->getNumberOfComponents();
                 pvmd.number_of_tuples = pv->getNumberOfTuples();
+                writePropertyVectorValuesBinary(out_val, *pv);
             }
         }
         MeshLib::IO::writePropertyVectorMetaDataBinary(out, pvmd);
@@ -333,6 +343,7 @@ void NodeWiseMeshPartitioner::writePropertiesBinary(
         MeshLib::IO::writePropertyVectorPartitionMetaData(out, pvpmd);
     }
     out.close();
+    out_val.close();
 }
 
 void NodeWiseMeshPartitioner::readPropertiesConfigDataBinary(
diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
index f3d139cc53a..66fbb920623 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
@@ -130,6 +130,32 @@ private:
 
     void writePropertiesBinary(std::string const& file_name_base) const;
 
+    template <typename T>
+    void writePropertyVectorValuesBinary(
+        std::ostream& os, MeshLib::PropertyVector<T> const& pv) const
+    {
+        std::size_t number_of_components(pv.getNumberOfComponents());
+        std::size_t number_of_tuples(pv.getNumberOfTuples());
+        std::vector<T> property_vector_buffer;
+        property_vector_buffer.resize(number_of_tuples * number_of_components);
+        std::size_t cnt(0);
+        for (std::size_t part_id = 0; part_id < _partitions.size(); part_id++)
+        {
+            for (std::size_t i = 0; i < pv.getNumberOfTuples(); ++i)
+            {
+                if (_nodes_partition_ids[i] == part_id)
+                {
+                    for (std::size_t c(0); c < number_of_components; ++c)
+                        property_vector_buffer[cnt * number_of_components + c] =
+                            pv.getComponent(i, c);
+                    cnt++;
+                }
+            }
+        }
+        os.write(reinterpret_cast<char*>(property_vector_buffer.data()),
+                 number_of_components * number_of_tuples * sizeof(T));
+    }
+
     void readPropertiesConfigDataBinary(
         std::string const& file_name_base) const;
 
-- 
GitLab