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