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