From 48a16f1b434ee6afff3d69a4555f6fc86a144d24 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Tue, 29 May 2018 00:07:44 +0200
Subject: [PATCH] [PL] LIE: Use boundary mesh in BCs.

---
 .../BoundaryConditionBuilder.cpp              | 22 ++---------
 .../GenericNaturalBoundaryCondition-impl.h    | 38 ++++++-------------
 .../GenericNaturalBoundaryCondition.h         | 13 ++-----
 .../NeumannBoundaryCondition.cpp              |  6 +--
 .../NeumannBoundaryCondition.h                |  3 +-
 5 files changed, 22 insertions(+), 60 deletions(-)

diff --git a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
index 6119668b3ef..8491b57ad0d 100644
--- a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
+++ b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
@@ -9,11 +9,7 @@
 
 #include "BoundaryConditionBuilder.h"
 
-#include "MeshGeoToolsLib/BoundaryElementsSearcher.h"
-#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"
@@ -30,22 +26,10 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
     const unsigned shapefunction_order,
     const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters)
 {
-    auto search_length_strategy =
-        std::make_unique<MeshGeoToolsLib::SearchLength>();
-    MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher =
-        MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeSearcher(
-            mesh, std::move(search_length_strategy));
-
-    MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher(
-        mesh, mesh_node_searcher);
-
     return ProcessLib::LIE::createNeumannBoundaryCondition(
-        config.config,
-        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);
+        config.config, config.mesh, dof_table, variable_id,
+        *config.component_id, mesh.isAxiallySymmetric(), integration_order,
+        shapefunction_order, mesh.getDimension(), parameters, _fracture_prop);
 }
 
 }  // namespace LIE
diff --git a/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h b/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
index 6a6ea4959e2..8334c65d7da 100644
--- a/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
+++ b/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
@@ -9,8 +9,6 @@
 
 #pragma once
 
-#include "MeshLib/MeshSearch/NodeSearch.h"  // for getUniqueNodes
-
 #include "ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h"
 #include "ProcessLib/Utils/CreateLocalAssemblers.h"
 
@@ -32,41 +30,29 @@ GenericNaturalBoundaryCondition<BoundaryConditionData,
         unsigned const integration_order, unsigned const shapefunction_order,
         NumLib::LocalToGlobalIndexMap const& dof_table_bulk,
         int const variable_id, int const component_id,
-        unsigned const global_dim, std::vector<MeshLib::Element*>&& elements,
-        Data&& data, FractureProperty const& fracture_prop)
+        unsigned const global_dim, MeshLib::Mesh& bc_mesh, Data&& data,
+        FractureProperty const& fracture_prop)
     : _data(std::forward<Data>(data)),
-      _elements(std::move(elements)),
+      _bc_mesh(bc_mesh),
       _integration_order(integration_order)
 {
     assert(component_id < dof_table_bulk.getNumberOfComponents());
 
-    std::vector<MeshLib::Node*> nodes = MeshLib::getUniqueNodes(_elements);
+    std::vector<MeshLib::Node*> const& bc_nodes = _bc_mesh.getNodes();
     DBUG("Found %d nodes for Natural BCs for the variable %d and component %d",
-         nodes.size(), variable_id, component_id);
+         bc_nodes.size(), variable_id, component_id);
 
-    MeshLib::MeshSubset mesh_subset =
-        dof_table_bulk.getMeshSubset(variable_id, component_id);
+    MeshLib::MeshSubset bc_mesh_subset(_bc_mesh, bc_nodes);
 
-    // Create local DOF table from intersected mesh subsets for the given
-    // variable and component ids.
+    // Create local DOF table from the bc mesh subset for the given variable and
+    // component id.
     _dof_table_boundary.reset(dof_table_bulk.deriveBoundaryConstrainedMap(
-        variable_id, {component_id}, std::move(mesh_subset), _elements));
+        variable_id, {component_id}, std::move(bc_mesh_subset)));
 
     createLocalAssemblers<LocalAssemblerImplementation>(
-        global_dim, _elements, *_dof_table_boundary, shapefunction_order,
-        _local_assemblers, is_axially_symmetric, _integration_order, _data,
-        fracture_prop, variable_id);
-}
-
-template <typename BoundaryConditionData,
-          template <typename, typename, unsigned>
-          class LocalAssemblerImplementation>
-GenericNaturalBoundaryCondition<
-    BoundaryConditionData,
-    LocalAssemblerImplementation>::~GenericNaturalBoundaryCondition()
-{
-    for (auto e : _elements)
-        delete e;
+        global_dim, _bc_mesh.getElements(), *_dof_table_boundary,
+        shapefunction_order, _local_assemblers, is_axially_symmetric,
+        _integration_order, _data, fracture_prop, variable_id);
 }
 
 template <typename BoundaryConditionData,
diff --git a/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition.h b/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition.h
index 984190b9650..ed01287d06a 100644
--- a/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition.h
+++ b/ProcessLib/LIE/BoundaryCondition/GenericNaturalBoundaryCondition.h
@@ -44,10 +44,8 @@ public:
         unsigned const integration_order, unsigned const shapefunction_order,
         NumLib::LocalToGlobalIndexMap const& dof_table_bulk,
         int const variable_id, int const component_id,
-        unsigned const global_dim, std::vector<MeshLib::Element*>&& elements,
-        Data&& data, FractureProperty const& fracture_prop);
-
-    ~GenericNaturalBoundaryCondition() override;
+        unsigned const global_dim, MeshLib::Mesh& mesh, Data&& data,
+        FractureProperty const& fracture_prop);
 
     /// Calls local assemblers which calculate their contributions to the global
     /// matrix and the right-hand-side.
@@ -60,11 +58,8 @@ private:
     /// Data used in the assembly of the specific boundary condition.
     BoundaryConditionData _data;
 
-    /// Vector of lower-dimensional elements on which the boundary condition is
-    /// defined.
-    std::vector<MeshLib::Element*> _elements;
-
-    std::unique_ptr<MeshLib::MeshSubset const> _mesh_subset_all_nodes;
+    /// A lower-dimensional mesh on which the boundary condition is defined.
+    MeshLib::Mesh& _bc_mesh;
 
     /// Local dof table, a subset of the global one restricted to the
     /// participating #_elements of the boundary condition.
diff --git a/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.cpp b/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.cpp
index a3f42bafb02..7c431ca1627 100644
--- a/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.cpp
+++ b/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.cpp
@@ -23,8 +23,7 @@ using NeumannBoundaryCondition =
                                     NeumannBoundaryConditionLocalAssembler>;
 
 std::unique_ptr<BoundaryCondition> createNeumannBoundaryCondition(
-    BaseLib::ConfigTree const& config,
-    std::vector<MeshLib::Element*>&& elements,
+    BaseLib::ConfigTree const& config, MeshLib::Mesh& mesh,
     NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id,
     int const component_id, bool is_axially_symmetric,
     unsigned const integration_order, unsigned const shapefunction_order,
@@ -44,8 +43,7 @@ std::unique_ptr<BoundaryCondition> createNeumannBoundaryCondition(
 
     return std::make_unique<NeumannBoundaryCondition>(
         is_axially_symmetric, integration_order, shapefunction_order, dof_table,
-        variable_id, component_id, global_dim, std::move(elements), param,
-        fracture_prop);
+        variable_id, component_id, global_dim, mesh, param, fracture_prop);
 }
 
 }  // namespace LIE
diff --git a/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.h b/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.h
index ce2a0bd7e5f..999a4e5510d 100644
--- a/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.h
+++ b/ProcessLib/LIE/BoundaryCondition/NeumannBoundaryCondition.h
@@ -29,8 +29,7 @@ namespace ProcessLib
 namespace LIE
 {
 std::unique_ptr<BoundaryCondition> createNeumannBoundaryCondition(
-    BaseLib::ConfigTree const& config,
-    std::vector<MeshLib::Element*>&& elements,
+    BaseLib::ConfigTree const& config, MeshLib::Mesh& mesh,
     NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id,
     int const component_id, bool is_axially_symmetric,
     unsigned const integration_order, unsigned const shapefunction_order,
-- 
GitLab