From d6a8f8b0b3dbef7a50f49c08d9dc967118068cbe Mon Sep 17 00:00:00 2001 From: Thomas Fischer <thomas.fischer@ufz.de> Date: Thu, 18 May 2017 14:08:56 +0200 Subject: [PATCH] [MGTL] Use pntr. to store search_length_algorithm. This is needed for polymorphism of the SearchLength alg. --- .../CreateBoundaryConditionsAlongPolylines.cpp | 7 ++++--- MeshGeoToolsLib/CreateSearchLength.h | 13 +++++++++---- MeshGeoToolsLib/MeshNodeSearcher.cpp | 16 ++++++++-------- MeshGeoToolsLib/MeshNodeSearcher.h | 8 +++++--- .../BoundaryCondition/BoundaryCondition.cpp | 6 +++--- .../BoundaryConditionBuilder.cpp | 5 +++-- Tests/MeshLib/TestBoundaryElementSearch.cpp | 10 +++++++--- Tests/MeshLib/TestMeshNodeSearch.cpp | 15 ++++++++++----- .../LocalToGlobalIndexMapMultiComponent.cpp | 3 ++- Tests/NumLib/TestDistribution.cpp | 8 ++++++-- 10 files changed, 57 insertions(+), 34 deletions(-) diff --git a/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp b/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp index 99928d989d0..09551a33782 100644 --- a/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp +++ b/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp @@ -197,10 +197,11 @@ int main (int argc, char* argv[]) return EXIT_FAILURE; } - MeshGeoToolsLib::SearchLength search_length_strategy; + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_strategy{ + new MeshGeoToolsLib::SearchLength}; if (search_length_arg.isSet()) { - search_length_strategy = - MeshGeoToolsLib::SearchLength(search_length_arg.getValue()); + search_length_strategy.reset( + new MeshGeoToolsLib::SearchLength(search_length_arg.getValue())); } GeoLib::GEOObjects geometry_sets; diff --git a/MeshGeoToolsLib/CreateSearchLength.h b/MeshGeoToolsLib/CreateSearchLength.h index cf974de42c3..769b5185ba5 100644 --- a/MeshGeoToolsLib/CreateSearchLength.h +++ b/MeshGeoToolsLib/CreateSearchLength.h @@ -11,6 +11,8 @@ #pragma once +#include <memory> + #include "BaseLib/ConfigTree.h" #include "MeshGeoToolsLib/HeuristicSearchLength.h" @@ -18,7 +20,7 @@ namespace MeshGeoToolsLib { -MeshGeoToolsLib::SearchLength createSearchLengthAlgorithm( +std::unique_ptr<MeshGeoToolsLib::SearchLength> createSearchLengthAlgorithm( BaseLib::ConfigTree const& external_config, MeshLib::Mesh const& mesh) { boost::optional<BaseLib::ConfigTree> config = @@ -26,7 +28,8 @@ MeshGeoToolsLib::SearchLength createSearchLengthAlgorithm( external_config.getConfigSubtreeOptional("search_length_algorithm"); if (!config) - return MeshGeoToolsLib::SearchLength(); + return std::unique_ptr<MeshGeoToolsLib::SearchLength>{ + new MeshGeoToolsLib::SearchLength()}; //! \ogs_file_param{prj__search_length_algorithm__type} std::string const type = config->getConfigParameter<std::string>("type"); @@ -35,11 +38,13 @@ MeshGeoToolsLib::SearchLength createSearchLengthAlgorithm( { //! \ogs_file_param{prj__search_length_algorithm__value} double const length = config->getConfigParameter<double>("value"); - return MeshGeoToolsLib::SearchLength(length); + return std::unique_ptr<MeshGeoToolsLib::SearchLength>{ + new MeshGeoToolsLib::SearchLength(length)}; } if (type == "heuristic") { - return MeshGeoToolsLib::HeuristicSearchLength(mesh); + return std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength>{ + new MeshGeoToolsLib::HeuristicSearchLength(mesh)}; } OGS_FATAL("Unknown search length algorithm type '%s'.", type.c_str()); } diff --git a/MeshGeoToolsLib/MeshNodeSearcher.cpp b/MeshGeoToolsLib/MeshNodeSearcher.cpp index 1d3469a189f..6b328cdbd6c 100644 --- a/MeshGeoToolsLib/MeshNodeSearcher.cpp +++ b/MeshGeoToolsLib/MeshNodeSearcher.cpp @@ -33,7 +33,7 @@ std::vector<std::unique_ptr<MeshNodeSearcher>> MeshNodeSearcher::_mesh_node_sear MeshNodeSearcher::MeshNodeSearcher( MeshLib::Mesh const& mesh, - MeshGeoToolsLib::SearchLength&& search_length_algorithm, + std::unique_ptr<MeshGeoToolsLib::SearchLength>&& search_length_algorithm, SearchAllNodes search_all_nodes) : _mesh(mesh), _mesh_grid(_mesh.getNodes().cbegin(), _mesh.getNodes().cend()), @@ -41,7 +41,7 @@ MeshNodeSearcher::MeshNodeSearcher( _search_all_nodes(search_all_nodes) { DBUG("The search length for mesh \"%s\" is %e.", - _mesh.getName().c_str(), _search_length_algorithm.getSearchLength()); + _mesh.getName().c_str(), _search_length_algorithm->getSearchLength()); } MeshNodeSearcher::~MeshNodeSearcher() @@ -108,7 +108,7 @@ MeshNodesOnPoint& MeshNodeSearcher::getMeshNodesOnPoint( new MeshNodesOnPoint(_mesh, _mesh_grid, pnt, - _search_length_algorithm.getSearchLength(), + _search_length_algorithm->getSearchLength(), _search_all_nodes)); return *_mesh_nodes_on_points.back(); } @@ -126,7 +126,7 @@ MeshNodesAlongPolyline& MeshNodeSearcher::getMeshNodesAlongPolyline( // compute nodes (and supporting points) along polyline _mesh_nodes_along_polylines.push_back(new MeshNodesAlongPolyline( - _mesh, ply, _search_length_algorithm.getSearchLength(), + _mesh, ply, _search_length_algorithm->getSearchLength(), _search_all_nodes)); return *_mesh_nodes_along_polylines.back(); } @@ -146,14 +146,14 @@ MeshNodesAlongSurface& MeshNodeSearcher::getMeshNodesAlongSurface( _mesh_nodes_along_surfaces.push_back( new MeshNodesAlongSurface(_mesh, sfc, - _search_length_algorithm.getSearchLength(), + _search_length_algorithm->getSearchLength(), _search_all_nodes)); return *_mesh_nodes_along_surfaces.back(); } MeshNodeSearcher const& MeshNodeSearcher::getMeshNodeSearcher( MeshLib::Mesh const& mesh, - MeshGeoToolsLib::SearchLength&& search_length_algorithm) + std::unique_ptr<MeshGeoToolsLib::SearchLength>&& search_length_algorithm) { std::size_t const mesh_id = mesh.getID(); if (_mesh_node_searchers.size() < mesh_id+1) @@ -166,8 +166,8 @@ MeshNodeSearcher const& MeshNodeSearcher::getMeshNodeSearcher( // lenght are the same, else recreate the searcher if (typeid(m._search_length_algorithm) == typeid(search_length_algorithm) && - m._search_length_algorithm.getSearchLength() == - search_length_algorithm.getSearchLength()) + m._search_length_algorithm->getSearchLength() == + search_length_algorithm->getSearchLength()) { return m; } diff --git a/MeshGeoToolsLib/MeshNodeSearcher.h b/MeshGeoToolsLib/MeshNodeSearcher.h index 11c698efcac..2d682df1f24 100644 --- a/MeshGeoToolsLib/MeshNodeSearcher.h +++ b/MeshGeoToolsLib/MeshNodeSearcher.h @@ -62,7 +62,8 @@ public: * searching the base nodes. */ MeshNodeSearcher(MeshLib::Mesh const& mesh, - MeshGeoToolsLib::SearchLength&& search_length_algorithm, + std::unique_ptr<MeshGeoToolsLib::SearchLength>&& + search_length_algorithm, SearchAllNodes search_all_nodes); virtual ~MeshNodeSearcher(); @@ -142,12 +143,13 @@ public: */ static MeshNodeSearcher const& getMeshNodeSearcher( MeshLib::Mesh const& mesh, - MeshGeoToolsLib::SearchLength&& search_length_algorithm); + std::unique_ptr<MeshGeoToolsLib::SearchLength>&& + search_length_algorithm); private: MeshLib::Mesh const& _mesh; GeoLib::Grid<MeshLib::Node> _mesh_grid; - MeshGeoToolsLib::SearchLength _search_length_algorithm; + std::unique_ptr<MeshGeoToolsLib::SearchLength> _search_length_algorithm; SearchAllNodes _search_all_nodes; // with newer compiler we can omit to use a pointer here mutable std::vector<MeshNodesOnPoint*> _mesh_nodes_on_points; diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp index 2af1707012b..98a44215c09 100644 --- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp +++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp @@ -62,7 +62,7 @@ BoundaryConditionBuilder::createDirichletBoundaryCondition( const unsigned /*shapefunction_order*/, const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters) { - MeshGeoToolsLib::SearchLength search_length_algorithm = + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_algorithm = MeshGeoToolsLib::createSearchLengthAlgorithm(config.config, mesh); MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher = @@ -116,7 +116,7 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition( const unsigned shapefunction_order, const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters) { - MeshGeoToolsLib::SearchLength search_length_algorithm = + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_algorithm = MeshGeoToolsLib::createSearchLengthAlgorithm(config.config, mesh); MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher = @@ -142,7 +142,7 @@ BoundaryConditionBuilder::createRobinBoundaryCondition( const unsigned shapefunction_order, const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters) { - MeshGeoToolsLib::SearchLength search_length_algorithm = + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_algorithm = MeshGeoToolsLib::createSearchLengthAlgorithm(config.config, mesh); MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher = diff --git a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp index a79074eb986..98027d69cb3 100644 --- a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp +++ b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp @@ -29,10 +29,11 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition( const unsigned shapefunction_order, const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters) { - MeshGeoToolsLib::SearchLength search_length_algorithm; + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_strategy{ + new MeshGeoToolsLib::SearchLength}; MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher = MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeSearcher( - mesh, std::move(search_length_algorithm)); + mesh, std::move(search_length_strategy)); MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher( mesh, mesh_node_searcher); diff --git a/Tests/MeshLib/TestBoundaryElementSearch.cpp b/Tests/MeshLib/TestBoundaryElementSearch.cpp index 25a20a4caf4..f5077d4f674 100644 --- a/Tests/MeshLib/TestBoundaryElementSearch.cpp +++ b/Tests/MeshLib/TestBoundaryElementSearch.cpp @@ -78,8 +78,10 @@ TEST_F(MeshLibBoundaryElementSearchInSimpleQuadMesh, PolylineSearch) ply0.addPoint(0); // perform search on the polyline - MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh, - MeshGeoToolsLib::HeuristicSearchLength(*_quad_mesh), + MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher( + *_quad_mesh, + std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength>{ + new MeshGeoToolsLib::HeuristicSearchLength(*_quad_mesh)}, MeshGeoToolsLib::SearchAllNodes::Yes); MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher(*_quad_mesh, mesh_node_searcher); std::vector<MeshLib::Element*> const& found_edges_ply0(boundary_element_searcher.getBoundaryElements(ply0)); @@ -148,7 +150,9 @@ TEST_F(MeshLibBoundaryElementSearchInSimpleHexMesh, SurfaceSearch) // perform search on the bottom surface MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher( - *_hex_mesh, MeshGeoToolsLib::HeuristicSearchLength(*_hex_mesh), + *_hex_mesh, + std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength>{ + new MeshGeoToolsLib::HeuristicSearchLength(*_hex_mesh)}, MeshGeoToolsLib::SearchAllNodes::Yes); MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher(*_hex_mesh, mesh_node_searcher); std::vector<MeshLib::Element*> const& found_faces_sfc_b(boundary_element_searcher.getBoundaryElements(*sfc_bottom)); diff --git a/Tests/MeshLib/TestMeshNodeSearch.cpp b/Tests/MeshLib/TestMeshNodeSearch.cpp index fbc28fd917b..6bdd6166024 100644 --- a/Tests/MeshLib/TestMeshNodeSearch.cpp +++ b/Tests/MeshLib/TestMeshNodeSearch.cpp @@ -66,7 +66,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, PointSearchEpsHalfEdge) ASSERT_TRUE(_quad_mesh != nullptr); // 2 perform search and compare results with expected vals - MeshGeoToolsLib::SearchLength search_length(dx_half); + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{ + new MeshGeoToolsLib::SearchLength(dx_half)}; MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh, std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes); @@ -92,7 +93,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, PointSearchZeroEps) // 1 create a geometry // 2 perform search and compare results with expected vals - MeshGeoToolsLib::SearchLength search_length; + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{ + new MeshGeoToolsLib::SearchLength}; MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh, std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes); @@ -138,7 +140,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, PolylineSearch) ply0.addPoint(1); // perform search and compare results with expected vals - MeshGeoToolsLib::HeuristicSearchLength search_length(*_quad_mesh); + std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength> search_length{ + new MeshGeoToolsLib::HeuristicSearchLength(*_quad_mesh)}; MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh, std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes); std::vector<std::size_t> const& found_ids_ply0(mesh_node_searcher.getMeshNodeIDsAlongPolyline(ply0)); @@ -220,7 +223,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, SurfaceSearch) pnts.push_back(new GeoLib::Point(_geometric_size, 0.5*_geometric_size, 0.0)); pnts.push_back(new GeoLib::Point(0.0, 0.5*_geometric_size, 0.0)); - MeshGeoToolsLib::SearchLength search_length; + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{ + new MeshGeoToolsLib::SearchLength}; MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh, std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes); @@ -271,7 +275,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleHexMesh, SurfaceSearch) pnts.push_back(new GeoLib::Point(_geometric_size, _geometric_size, _geometric_size)); pnts.push_back(new GeoLib::Point(0.0, _geometric_size, _geometric_size)); - MeshGeoToolsLib::SearchLength search_length; + std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{ + new MeshGeoToolsLib::SearchLength}; MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_hex_mesh, std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes); diff --git a/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp b/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp index 723ace16e5a..04fa8ed191d 100644 --- a/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp +++ b/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp @@ -55,7 +55,8 @@ public: geo_objs.addPolylineVec(std::move(plys), geometry_0, nullptr); - MGTL::SearchLength search_length; + std::unique_ptr<MGTL::SearchLength> search_length{ + new MGTL::SearchLength}; MGTL::MeshNodeSearcher const& searcher_nodes = MGTL::MeshNodeSearcher::getMeshNodeSearcher( *mesh, std::move(search_length)); diff --git a/Tests/NumLib/TestDistribution.cpp b/Tests/NumLib/TestDistribution.cpp index 4fc9016b8c7..055a16ac14a 100644 --- a/Tests/NumLib/TestDistribution.cpp +++ b/Tests/NumLib/TestDistribution.cpp @@ -35,7 +35,9 @@ public: _msh(MeshLib::MeshGenerator::generateRegularQuadMesh( _geometric_size, _number_of_subdivisions_per_direction)), _project_name("test"), - _mshNodesSearcher(*_msh, MeshGeoToolsLib::SearchLength(), + _mshNodesSearcher(*_msh, + std::unique_ptr<MeshGeoToolsLib::SearchLength>{ + new MeshGeoToolsLib::SearchLength}, MeshGeoToolsLib::SearchAllNodes::Yes), _ply0(nullptr) { @@ -92,7 +94,9 @@ public: _msh(MeshLib::MeshGenerator::generateRegularHexMesh( _geometric_size, _number_of_subdivisions_per_direction)), _project_name("test"), - _mshNodesSearcher(*_msh, MeshGeoToolsLib::SearchLength(), + _mshNodesSearcher(*_msh, + std::unique_ptr<MeshGeoToolsLib::SearchLength>{ + new MeshGeoToolsLib::SearchLength}, MeshGeoToolsLib::SearchAllNodes::Yes), _ply0(nullptr) { -- GitLab