diff --git a/MeshLib/MeshEditing/DuplicateMeshComponents.cpp b/MeshLib/MeshEditing/DuplicateMeshComponents.cpp index fb089427248d3fc35628e74d9136d8ad0fda822f..6f8b0031b35e4afe8028e2e88350993c11f731ca 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 9c910eb577e5e6aa75e4c11920c37a1e0ec94980..1aae2785700e108b14f8a6c43ab5888c7c8a021b 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 d9a9ad8c7612c35c4640458a2dffd382c4cca5cf..00cfc3aeaab7aaaad7fe1465eecf42d363de1ad9 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 a654c57659168f5c3447bae767c4e3c55e3f0cda..4f60df600815fc52b2e0f450e68eb434b40f39f9 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 6b6efc9f6c69a6f0869450f43e4b28b98b9b4660..6119668b3efbae79406da781827eb38b319c9449 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);