From 005537ed15ada9f28ba3d42907ff721f0b17a021 Mon Sep 17 00:00:00 2001
From: rinkk <karsten.rink@ufz.de>
Date: Mon, 13 May 2019 18:28:27 +0200
Subject: [PATCH] added transfer of arbitrary node- and cell arrays with one
 component

---
 MeshLib/MeshSurfaceExtraction.cpp | 71 +++++++++++++++++++++----------
 MeshLib/MeshSurfaceExtraction.h   |  2 +
 2 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/MeshLib/MeshSurfaceExtraction.cpp b/MeshLib/MeshSurfaceExtraction.cpp
index f1bfbb3d9d6..ddcddab1d0b 100644
--- a/MeshLib/MeshSurfaceExtraction.cpp
+++ b/MeshLib/MeshSurfaceExtraction.cpp
@@ -110,13 +110,10 @@ MeshLib::Mesh* MeshSurfaceExtraction::getMeshSurface(
                   [](MeshLib::Element* e) { delete e; });
 
     std::vector<std::size_t> id_map;
-    if (!subsfc_node_id_prop_name.empty())
+    id_map.reserve(sfc_nodes.size());
+    for (auto const* node : sfc_nodes)
     {
-        id_map.reserve(sfc_nodes.size());
-        for (auto const* node : sfc_nodes)
-        {
-            id_map.push_back(node->getID());
-        }
+        id_map.push_back(node->getID());
     }
     MeshLib::Mesh* result(
         new Mesh(subsfc_mesh.getName() + "-Surface", sfc_nodes, new_elements));
@@ -147,7 +144,7 @@ MeshLib::Mesh* MeshSurfaceExtraction::getMeshSurface(
     if (!createSfcMeshProperties(*result, subsfc_mesh.getProperties(),
                                  id_map, element_ids_map))
     {
-        ERR("Transferring subsurface properties incomplete or failed.");
+        ERR("Transferring subsurface properties failed.");
     }
     return result;
 }
@@ -367,8 +364,7 @@ bool MeshSurfaceExtraction::createSfcMeshProperties(
 {
     if (node_ids_map.size() != sfc_mesh.getNumberOfNodes())
     {
-        ERR("MeshSurfaceExtraction::createSfcMeshProperties() - Incorrect "
-            "number of node IDs.");
+        ERR("MeshSurfaceExtraction::createSfcMeshProperties() - Incorrect number of node IDs.");
         return false;
     }
 
@@ -378,21 +374,52 @@ bool MeshSurfaceExtraction::createSfcMeshProperties(
         return false;
     }
 
-    std::string const vec_name ("MaterialIDs");
-    if (!properties.existsPropertyVector<int>(vec_name, MeshLib::MeshItemType::Cell, 1))
+    std::array<MeshLib::MeshItemType, 2> const type{
+        {MeshLib::MeshItemType::Node, MeshLib::MeshItemType::Cell}};
+    std::array<std::vector<std::size_t>, 2> const id_map{
+        {node_ids_map, element_ids_map}};
+    std::array<std::size_t, 2> const vec_size{
+        {sfc_mesh.getNumberOfNodes(), sfc_mesh.getNumberOfElements()}};
+    std::size_t vectors_copied (0), vectors_skipped (0);
+    for (std::size_t i=0; i<type.size(); ++i)
     {
-        ERR("MeshSurfaceExtraction::createSfcMeshProperties() - Scalar array \"%s\" not found.", vec_name.c_str());
-        return false;
-    }
-    std::vector<int> const& org_vec =
-        *properties.getPropertyVector<int>( vec_name, MeshLib::MeshItemType::Cell, 1);
-    std::vector<int> sfc_prop;
-    sfc_prop.reserve(sfc_mesh.getNumberOfElements());
-    for (auto bulk_id : element_ids_map)
-    {
-        sfc_prop.push_back(org_vec[bulk_id]);
+        std::vector<std::string> const& array_names = properties.getPropertyVectorNames(type[i]);
+        for (std::string const& name : array_names)
+        {
+            if (properties.existsPropertyVector<double>(name, type[i], 1))
+            {
+                std::vector<double> const& org_vec =
+                    *properties.getPropertyVector<double>(name, type[i], 1);
+                std::vector<double> sfc_prop;
+                sfc_prop.reserve(vec_size[i]);
+                for (auto bulk_id : id_map[i])
+                {
+                    sfc_prop.push_back(org_vec[bulk_id]);
+                }
+                MeshLib::addPropertyToMesh<double>(sfc_mesh, name, type[i], 1, sfc_prop);
+                vectors_copied++;
+            }
+            else if (properties.existsPropertyVector<int>(name, type[i], 1))
+            {
+                std::vector<int> const& org_vec =
+                    *properties.getPropertyVector<int>(name, type[i], 1);
+                std::vector<int> sfc_prop;
+                sfc_prop.reserve(vec_size[i]);
+                for (auto bulk_id : id_map[i])
+                {
+                    sfc_prop.push_back(org_vec[bulk_id]);
+                }
+                MeshLib::addPropertyToMesh<int>(sfc_mesh, name, type[i], 1, sfc_prop);
+                vectors_copied++;
+            }
+            else
+            {
+                WARN("Skipping property vector \"%s\" - no matching data type found.", name.c_str());
+                vectors_skipped++;
+            }
+        }
     }
-    MeshLib::addPropertyToMesh<int>(sfc_mesh, vec_name, MeshLib::MeshItemType::Cell, 1, sfc_prop);
+    INFO("%d property vectors copied, %d vectors skipped.", vectors_copied, vectors_skipped);
     return true;
 }
 
diff --git a/MeshLib/MeshSurfaceExtraction.h b/MeshLib/MeshSurfaceExtraction.h
index 6628a5bf945..38d069ce784 100644
--- a/MeshLib/MeshSurfaceExtraction.h
+++ b/MeshLib/MeshSurfaceExtraction.h
@@ -97,11 +97,13 @@ private:
         const std::vector<MeshLib::Element*>& sfc_elements,
         std::vector<std::size_t>& node_id_map);
 
+    /// Creates the element vector for the 2d surface mesh
     static std::vector<MeshLib::Element*> createSfcElementVector(
         std::vector<MeshLib::Element*> const& sfc_elems,
         std::vector<MeshLib::Node*> const& sfc_nodes,
         std::vector<std::size_t> const& node_id_map);
 
+    /// Copies relevant parts of scalar arrays to the surface mesh
     static bool createSfcMeshProperties(MeshLib::Mesh& sfc_mesh,
                                         MeshLib::Properties const& properties,
                                         std::vector<std::size_t> const& node_ids_map,
-- 
GitLab