From 8a86aa00ffc1ca388b929e019ae6908bd28a463e Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Mon, 28 May 2018 00:09:48 +0200
Subject: [PATCH] [MeL] Implement cloneElements. Use in BCs.

The cloneElements is needed outside of MeshGeoToolsLib.
---
 .../MeshEditing/DuplicateMeshComponents.cpp   | 11 ++++++
 MeshLib/MeshEditing/DuplicateMeshComponents.h |  3 ++
 .../BoundaryCondition/BoundaryCondition.cpp   | 36 +++++++------------
 .../BoundaryCondition/BoundaryCondition.h     |  4 ---
 .../BoundaryConditionBuilder.cpp              |  4 ++-
 5 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/MeshLib/MeshEditing/DuplicateMeshComponents.cpp b/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
index fb089427248..6f8b0031b35 100644
--- a/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
+++ b/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
@@ -70,4 +70,15 @@ MeshLib::Element* copyElement(MeshLib::Element const*const element, const std::v
     return new E(new_nodes);
 }
 
+std::vector<MeshLib::Element*> cloneElements(
+    std::vector<MeshLib::Element*> const& elements)
+{
+    std::vector<MeshLib::Element*> cloned_elements;
+    cloned_elements.reserve(elements.size());
+    std::transform(begin(elements), end(elements),
+                   std::back_inserter(cloned_elements),
+                   [](MeshLib::Element* const e) { return e->clone(); });
+    return cloned_elements;
+}
+
 } // namespace MeshLib
diff --git a/MeshLib/MeshEditing/DuplicateMeshComponents.h b/MeshLib/MeshEditing/DuplicateMeshComponents.h
index 9c910eb577e..1aae2785700 100644
--- a/MeshLib/MeshEditing/DuplicateMeshComponents.h
+++ b/MeshLib/MeshEditing/DuplicateMeshComponents.h
@@ -41,4 +41,7 @@ namespace MeshLib
     template <typename E>
     MeshLib::Element* copyElement(MeshLib::Element const*const element, const std::vector<MeshLib::Node*> &nodes);
 
+    /// Clones a vector of elements using the Element::clone() function.
+    std::vector<MeshLib::Element*> cloneElements(
+        std::vector<MeshLib::Element*> const& elements);
 } // end namespace MeshLib
diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
index d9a9ad8c761..00cfc3aeaab 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
@@ -14,6 +14,7 @@
 #include "MeshGeoToolsLib/CreateSearchLength.h"
 #include "MeshGeoToolsLib/MeshNodeSearcher.h"
 #include "MeshGeoToolsLib/SearchLength.h"
+#include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
 #include "NeumannBoundaryCondition.h"
 #include "NonuniformDirichletBoundaryCondition.h"
 #include "NonuniformNeumannBoundaryCondition.h"
@@ -152,9 +153,10 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
 
     return ProcessLib::createNeumannBoundaryCondition(
         config.config,
-        getClonedElements(boundary_element_searcher, config.geometry),
-        dof_table, variable_id, *config.component_id,
-        mesh.isAxiallySymmetric(), integration_order, shapefunction_order, mesh.getDimension(),
+        MeshLib::cloneElements(
+            boundary_element_searcher.getBoundaryElements(config.geometry)),
+        dof_table, variable_id, *config.component_id, mesh.isAxiallySymmetric(),
+        integration_order, shapefunction_order, mesh.getDimension(),
         parameters);
 }
 
@@ -178,9 +180,10 @@ BoundaryConditionBuilder::createRobinBoundaryCondition(
 
     return ProcessLib::createRobinBoundaryCondition(
         config.config,
-        getClonedElements(boundary_element_searcher, config.geometry),
-        dof_table, variable_id, *config.component_id,
-        mesh.isAxiallySymmetric(), integration_order, shapefunction_order, mesh.getDimension(),
+        MeshLib::cloneElements(
+            boundary_element_searcher.getBoundaryElements(config.geometry)),
+        dof_table, variable_id, *config.component_id, mesh.isAxiallySymmetric(),
+        integration_order, shapefunction_order, mesh.getDimension(),
         parameters);
 }
 
@@ -227,7 +230,8 @@ BoundaryConditionBuilder::createNormalTractionBoundaryCondition(
     return ProcessLib::NormalTractionBoundaryCondition::
         createNormalTractionBoundaryCondition(
             config.config,
-            getClonedElements(boundary_element_searcher, config.geometry),
+            MeshLib::cloneElements(
+                boundary_element_searcher.getBoundaryElements(config.geometry)),
             dof_table, variable_id, mesh.isAxiallySymmetric(),
             integration_order, shapefunction_order, mesh.getDimension(),
             parameters);
@@ -248,20 +252,4 @@ std::unique_ptr<BoundaryCondition> BoundaryConditionBuilder::
             config.config, dof_table, mesh, variable_id, *config.component_id);
 }
 
-std::vector<MeshLib::Element*> BoundaryConditionBuilder::getClonedElements(
-    MeshGeoToolsLib::BoundaryElementsSearcher& boundary_element_searcher,
-    GeoLib::GeoObject const& geometry)
-{
-    std::vector<MeshLib::Element*> elements =
-        boundary_element_searcher.getBoundaryElements(geometry);
-
-    // Deep copy all the elements, because the searcher might destroy the
-    // originals. Store pointers to the copies in the elements vector (i.e.,
-    // in-place modification).
-    for (auto& e : elements)
-        e = e->clone();
-
-    return elements;
-}
-
-}  // ProcessLib
+}  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.h b/ProcessLib/BoundaryCondition/BoundaryCondition.h
index a654c576591..4f60df60081 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.h
@@ -141,10 +141,6 @@ protected:
         const unsigned /*shapefunction_order*/,
         const std::vector<
             std::unique_ptr<ProcessLib::ParameterBase>>& /*parameters*/);
-
-    static std::vector<MeshLib::Element*> getClonedElements(
-        MeshGeoToolsLib::BoundaryElementsSearcher& boundary_element_searcher,
-        GeoLib::GeoObject const& geometry);
 };
 
 }  // ProcessLib
diff --git a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
index 6b6efc9f6c6..6119668b3ef 100644
--- a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
+++ b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
@@ -13,6 +13,7 @@
 #include "MeshGeoToolsLib/MeshNodeSearcher.h"
 #include "MeshGeoToolsLib/SearchLength.h"
 #include "MeshLib/Mesh.h"
+#include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
 #include "ProcessLib/BoundaryCondition/BoundaryConditionConfig.h"
 
 #include "NeumannBoundaryCondition.h"
@@ -40,7 +41,8 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
 
     return ProcessLib::LIE::createNeumannBoundaryCondition(
         config.config,
-        getClonedElements(boundary_element_searcher, config.geometry),
+        MeshLib::cloneElements(
+            boundary_element_searcher.getBoundaryElements(config.geometry)),
         dof_table, variable_id, *config.component_id, mesh.isAxiallySymmetric(),
         integration_order, shapefunction_order, mesh.getDimension(), parameters,
         _fracture_prop);
-- 
GitLab