From 1c2a2f11042a552d7b2b49c8f40a16b9f8b64388 Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Tue, 14 Mar 2017 11:26:29 +0100
Subject: [PATCH] [A/U/MP] Impl. writePropertyVectorBinary.

---
 .../PartitionMesh/NodeWiseMeshPartitioner.cpp | 59 ++++---------------
 .../PartitionMesh/NodeWiseMeshPartitioner.h   | 20 +++++++
 2 files changed, 33 insertions(+), 46 deletions(-)

diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
index e41e0c7e791..b3535273ca4 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
@@ -24,7 +24,6 @@
 #include "BaseLib/Error.h"
 
 #include "MeshLib/IO/VtkIO/VtuInterface.h"
-#include "MeshLib/IO/MPI_IO/PropertyVectorMetaData.h"
 
 #include "MeshLib/Elements/Element.h"
 
@@ -338,8 +337,7 @@ NodeWiseMeshPartitioner::getNumberOfIntegerVariablesOfElements(
 void NodeWiseMeshPartitioner::writePropertiesBinary(
     const std::string& file_name_base) const
 {
-    auto const& properties(_partitioned_properties);
-    auto const& property_names(properties.getPropertyVectorNames());
+    auto const& property_names(_partitioned_properties.getPropertyVectorNames());
     if (property_names.empty())
         return;
     const std::string fname_cfg = file_name_base +
@@ -357,49 +355,18 @@ void NodeWiseMeshPartitioner::writePropertiesBinary(
               sizeof(number_of_properties));
     for (auto const& name : property_names)
     {
-        MeshLib::IO::PropertyVectorMetaData pvmd;
-        pvmd.property_name = name;
-        {
-            if (properties.existsPropertyVector<double>(name))
-            {
-                auto* pv = properties.getPropertyVector<double>(name);
-                MeshLib::IO::fillPropertyVectorMetaDataTypeInfo<double>(pvmd);
-                pvmd.number_of_components = pv->getNumberOfComponents();
-                pvmd.number_of_tuples = pv->getNumberOfTuples();
-                writePropertyVectorValuesBinary(out_val, *pv);
-            }
-        }
-        {
-            if (properties.existsPropertyVector<float>(name))
-            {
-                auto* pv = properties.getPropertyVector<float>(name);
-                MeshLib::IO::fillPropertyVectorMetaDataTypeInfo<float>(pvmd);
-                pvmd.number_of_components = pv->getNumberOfComponents();
-                pvmd.number_of_tuples = pv->getNumberOfTuples();
-                writePropertyVectorValuesBinary(out_val, *pv);
-            }
-        }
-        {
-            if (properties.existsPropertyVector<int>(name))
-            {
-                auto* pv = properties.getPropertyVector<int>(name);
-                MeshLib::IO::fillPropertyVectorMetaDataTypeInfo<int>(pvmd);
-                pvmd.number_of_components = pv->getNumberOfComponents();
-                pvmd.number_of_tuples = pv->getNumberOfTuples();
-                writePropertyVectorValuesBinary(out_val, *pv);
-            }
-        }
-        {
-            if (properties.existsPropertyVector<unsigned>(name))
-            {
-                auto* pv = properties.getPropertyVector<unsigned>(name);
-                MeshLib::IO::fillPropertyVectorMetaDataTypeInfo<unsigned>(pvmd);
-                pvmd.number_of_components = pv->getNumberOfComponents();
-                pvmd.number_of_tuples = pv->getNumberOfTuples();
-                writePropertyVectorValuesBinary(out_val, *pv);
-            }
-        }
-        MeshLib::IO::writePropertyVectorMetaDataBinary(out, pvmd);
+        bool success =
+            writePropertyVectorBinary<double>(name, out_val, out) ||
+            writePropertyVectorBinary<float>(name, out_val, out) ||
+            writePropertyVectorBinary<int>(name, out_val, out) ||
+            writePropertyVectorBinary<long>(name, out_val, out) ||
+            writePropertyVectorBinary<unsigned>(name, out_val, out) ||
+            writePropertyVectorBinary<unsigned long>(name, out_val, out) ||
+            writePropertyVectorBinary<std::size_t>(name, out_val, out);
+        if (!success)
+            OGS_FATAL(
+                "writePropertiesBinary: Could not write PropertyVector '%s'.",
+                name.c_str());
     }
     unsigned long offset = 0;
     for (const auto& partition : _partitions)
diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
index 4d92d8be85e..190e1cdc1e5 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
@@ -22,6 +22,7 @@
 
 #include "MeshLib/Mesh.h"
 #include "MeshLib/Node.h"
+#include "MeshLib/IO/MPI_IO/PropertyVectorMetaData.h"
 
 namespace ApplicationUtils
 {
@@ -210,6 +211,25 @@ private:
                  number_of_components * number_of_tuples * sizeof(T));
     }
 
+    template <typename T>
+    bool writePropertyVectorBinary(std::string const& name,
+                                   std::ostream& out_val,
+                                   std::ostream& out_meta) const
+    {
+        if (!_partitioned_properties.existsPropertyVector<T>(name))
+            return false;
+
+        MeshLib::IO::PropertyVectorMetaData pvmd;
+        pvmd.property_name = name;
+        auto* pv = _partitioned_properties.getPropertyVector<T>(name);
+        pvmd.fillPropertyVectorMetaDataTypeInfo<T>();
+        pvmd.number_of_components = pv->getNumberOfComponents();
+        pvmd.number_of_tuples = pv->getNumberOfTuples();
+        writePropertyVectorValuesBinary(out_val, *pv);
+        MeshLib::IO::writePropertyVectorMetaDataBinary(out_meta, pvmd);
+        return true;
+     }
+
     /*!
          \brief Write the configuration data of the partition data in
                 binary files.
-- 
GitLab