From 56be2ebad3f1ce3fdeab38dec4f457774840190d Mon Sep 17 00:00:00 2001 From: Luca Carniato Date: Wed, 20 Dec 2023 15:28:56 +0100 Subject: [PATCH] Use unique pointer for mesh refinement interpolant --- .../benchmark/src/perf_mesh_refinement.cpp | 18 +- .../include/MeshKernel/MeshRefinement.hpp | 6 +- libs/MeshKernel/src/MeshRefinement.cpp | 8 +- .../tests/src/MeshRefinementTests.cpp | 172 ++++++++++-------- libs/MeshKernelApi/src/MeshKernel.cpp | 33 ++-- 5 files changed, 129 insertions(+), 108 deletions(-) diff --git a/libs/MeshKernel/benchmark/src/perf_mesh_refinement.cpp b/libs/MeshKernel/benchmark/src/perf_mesh_refinement.cpp index 751ff69d2..2aa3c1617 100644 --- a/libs/MeshKernel/benchmark/src/perf_mesh_refinement.cpp +++ b/libs/MeshKernel/benchmark/src/perf_mesh_refinement.cpp @@ -33,14 +33,14 @@ static void BM_MeshRefinementBasedOnSamples(benchmark::State& state) } } - auto const interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::MinAbsValue, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::MinAbsValue, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters mesh_refinement_parameters; mesh_refinement_parameters.max_num_refinement_iterations = 1; @@ -55,7 +55,7 @@ static void BM_MeshRefinementBasedOnSamples(benchmark::State& state) state.ResumeTiming(); MeshRefinement meshRefinement(*mesh, - interpolator, + std::move(interpolator), mesh_refinement_parameters); meshRefinement.Compute(); diff --git a/libs/MeshKernel/include/MeshKernel/MeshRefinement.hpp b/libs/MeshKernel/include/MeshKernel/MeshRefinement.hpp index c0c27d830..807c925a5 100644 --- a/libs/MeshKernel/include/MeshKernel/MeshRefinement.hpp +++ b/libs/MeshKernel/include/MeshKernel/MeshRefinement.hpp @@ -95,7 +95,7 @@ namespace meshkernel /// @param[in] interpolant The averaging interpolation to use /// @param[in] meshRefinementParameters The mesh refinement parameters MeshRefinement(Mesh2D& mesh, - std::shared_ptr interpolant, + std::unique_ptr interpolant, const MeshRefinementParameters& meshRefinementParameters); /// @brief The constructor for refining based on samples @@ -104,7 +104,7 @@ namespace meshkernel /// @param[in] meshRefinementParameters The mesh refinement parameters /// @param[in] useNodalRefinement Use nodal refinement MeshRefinement(Mesh2D& mesh, - std::shared_ptr interpolant, + std::unique_ptr interpolant, const MeshRefinementParameters& meshRefinementParameters, bool useNodalRefinement); @@ -240,7 +240,7 @@ namespace meshkernel bool m_directionalRefinement = false; ///< Whether there is directional refinement Mesh2D& m_mesh; ///< A reference to the mesh - std::shared_ptr m_interpolant; ///< Pointer to the AveragingInterpolation instance + std::unique_ptr m_interpolant; ///< Pointer to the AveragingInterpolation instance Polygons m_polygons; ///< Polygons MeshRefinementParameters m_meshRefinementParameters; ///< The mesh refinement parameters bool m_useNodalRefinement = false; ///< Use refinement based on interpolated values at nodes diff --git a/libs/MeshKernel/src/MeshRefinement.cpp b/libs/MeshKernel/src/MeshRefinement.cpp index 86fc0d1d9..254f48c33 100644 --- a/libs/MeshKernel/src/MeshRefinement.cpp +++ b/libs/MeshKernel/src/MeshRefinement.cpp @@ -38,10 +38,10 @@ using meshkernel::Mesh2D; using meshkernel::MeshRefinement; MeshRefinement::MeshRefinement(Mesh2D& mesh, - std::shared_ptr interpolant, + std::unique_ptr interpolant, const MeshRefinementParameters& meshRefinementParameters) : m_samplesRTree(RTreeFactory::Create(mesh.m_projection)), m_mesh(mesh), - m_interpolant(interpolant) + m_interpolant(std::move(interpolant)) { CheckMeshRefinementParameters(meshRefinementParameters); m_isRefinementBasedOnSamples = true; @@ -50,11 +50,11 @@ MeshRefinement::MeshRefinement(Mesh2D& mesh, } MeshRefinement::MeshRefinement(Mesh2D& mesh, - std::shared_ptr interpolant, + std::unique_ptr interpolant, const MeshRefinementParameters& meshRefinementParameters, bool useNodalRefinement) : m_samplesRTree(RTreeFactory::Create(mesh.m_projection)), m_mesh(mesh), - m_interpolant(interpolant), + m_interpolant(std::move(interpolant)), m_useNodalRefinement(useNodalRefinement) { CheckMeshRefinementParameters(meshRefinementParameters); diff --git a/libs/MeshKernel/tests/src/MeshRefinementTests.cpp b/libs/MeshKernel/tests/src/MeshRefinementTests.cpp index 0181029ec..c418336f7 100644 --- a/libs/MeshKernel/tests/src/MeshRefinementTests.cpp +++ b/libs/MeshKernel/tests/src/MeshRefinementTests.cpp @@ -24,14 +24,14 @@ TEST(MeshRefinement, FourByFourWithFourSamples) {15.5396099, 24.2669525, 1.0}, {23.8305721, 23.9275551, 1.0}}; - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::MinAbsValue, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::MinAbsValue, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 1; @@ -43,7 +43,9 @@ TEST(MeshRefinement, FourByFourWithFourSamples) meshRefinementParameters.refinement_type = 2; meshRefinementParameters.smoothing_iterations = 0; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters); meshRefinement.Compute(); @@ -116,14 +118,14 @@ TEST(MeshRefinement, RefinementOnAFourByFourMeshWithSamplesShouldRefine) {15.5396099, 24.2669525, 0.1}, {23.8305721, 23.9275551, 0.1}}; - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::MinAbsValue, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::MinAbsValue, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 4; @@ -135,7 +137,9 @@ TEST(MeshRefinement, RefinementOnAFourByFourMeshWithSamplesShouldRefine) meshRefinementParameters.refinement_type = 1; meshRefinementParameters.smoothing_iterations = 0; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters); meshRefinement.Compute(); // Assert number of edges and nodes @@ -217,14 +221,14 @@ TEST(MeshRefinement, SmallTriangualMeshTwoSamples) {359.8657532, 350.3144836, 1.0}, {387.5152588, 299.2614746, 1.0}}; - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::MinAbsValue, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::MinAbsValue, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 1; @@ -236,7 +240,9 @@ TEST(MeshRefinement, SmallTriangualMeshTwoSamples) meshRefinementParameters.refinement_type = 2; meshRefinementParameters.smoothing_iterations = 0; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters); meshRefinement.Compute(); @@ -343,14 +349,14 @@ TEST(MeshRefinement, ThreeBythreeWithThreeSamplesPerFace) {13.5837603, 12.1783361, 3.0000000}, {17.2156067, 16.9106121, 3.0000000}}; - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::MinAbsValue, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::MinAbsValue, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 2; @@ -361,7 +367,7 @@ TEST(MeshRefinement, ThreeBythreeWithThreeSamplesPerFace) meshRefinementParameters.connect_hanging_nodes = 1; meshRefinementParameters.refinement_type = 1; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters); + MeshRefinement meshRefinement(*mesh, std::move(interpolator), meshRefinementParameters); meshRefinement.Compute(); @@ -412,14 +418,14 @@ TEST(MeshRefinement, WindowOfRefinementFile) // Sample points std::vector samples = ReadSampleFile(TEST_FOLDER + "/data/MeshRefinementTests/WindowOfRefinementFile.xyz"); - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::MinAbsValue, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::MinAbsValue, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 4; @@ -431,7 +437,9 @@ TEST(MeshRefinement, WindowOfRefinementFile) meshRefinementParameters.refinement_type = 1; meshRefinementParameters.smoothing_iterations = 0; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters); meshRefinement.Compute(); @@ -478,14 +486,14 @@ TEST(MeshRefinement, WindowOfRefinementFileBasedOnLevels) // Sample points std::vector samples = ReadSampleFile(TEST_FOLDER + "/data/MeshRefinementTests/WindowOfRefinementFile.xyz"); - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::Max, - Location::Faces, - 1.01, - false, - true, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::Max, + Location::Faces, + 1.01, + false, + true, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 10; @@ -497,7 +505,9 @@ TEST(MeshRefinement, WindowOfRefinementFileBasedOnLevels) meshRefinementParameters.refinement_type = 2; meshRefinementParameters.smoothing_iterations = 0; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters); meshRefinement.Compute(); @@ -637,14 +647,14 @@ TEST(MeshRefinement, FourByFourWithFourSamplesSpherical) {41.1085625, 41.1083946, 1.0}, {41.1052971, 41.1083336, 1.0}}; - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::MinAbsValue, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::MinAbsValue, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 1; @@ -656,7 +666,9 @@ TEST(MeshRefinement, FourByFourWithFourSamplesSpherical) meshRefinementParameters.refinement_type = 2; meshRefinementParameters.smoothing_iterations = 0; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters); meshRefinement.Compute(); ASSERT_EQ(60, mesh->GetNumEdges()); @@ -809,7 +821,7 @@ TEST(MeshRefinement, BilinearInterpolationWithGriddedSamplesOnLandShouldNotRefin std::vector values{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; Point origin{-5.0, -5.0}; - const auto interpolator = std::make_shared(*mesh, 2, 2, origin, 10.0, values); + auto interpolator = std::make_unique(*mesh, 2, 2, origin, 10.0, values); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 1; @@ -820,7 +832,7 @@ TEST(MeshRefinement, BilinearInterpolationWithGriddedSamplesOnLandShouldNotRefin meshRefinementParameters.connect_hanging_nodes = 1; meshRefinementParameters.refinement_type = 1; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters, true); + MeshRefinement meshRefinement(*mesh, std::move(interpolator), meshRefinementParameters, true); // Execute meshRefinement.Compute(); @@ -836,7 +848,7 @@ TEST(MeshRefinement, BilinearInterpolationWithGriddedSamplesOnLandAndSeaShouldRe std::vector values{-1.0, -2.0, 3.0, -4.0, -5.0, 6.0, 7.0, 8.0, 9.0}; Point origin{-5.0, -5.0}; - const auto interpolator = std::make_shared(*mesh, 3, 3, origin, 10.0, values); + auto interpolator = std::make_unique(*mesh, 3, 3, origin, 10.0, values); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 1; @@ -847,7 +859,7 @@ TEST(MeshRefinement, BilinearInterpolationWithGriddedSamplesOnLandAndSeaShouldRe meshRefinementParameters.connect_hanging_nodes = 1; meshRefinementParameters.refinement_type = 1; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters, true); + MeshRefinement meshRefinement(*mesh, std::move(interpolator), meshRefinementParameters, true); // Execute meshRefinement.Compute(); @@ -863,7 +875,7 @@ TEST(MeshRefinement, BilinearInterpolationWithAllGriddedSamplesOnSeaShouldRefine std::vector values{-1.0, -2.0, -3.0, -4.0, -5.0, -6.0, -7.0, -8.0, -9.0}; Point origin{-5.0, -5.0}; - const auto interpolator = std::make_shared(*mesh, 2, 2, origin, 10.0, values); + auto interpolator = std::make_unique(*mesh, 2, 2, origin, 10.0, values); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 1; @@ -874,7 +886,9 @@ TEST(MeshRefinement, BilinearInterpolationWithAllGriddedSamplesOnSeaShouldRefine meshRefinementParameters.connect_hanging_nodes = 1; meshRefinementParameters.refinement_type = 1; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters, true); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters, true); // Execute meshRefinement.Compute(); @@ -1015,14 +1029,14 @@ TEST_P(RidgeRefinementTestCases, expectedResults) auto samples = SamplesHessianCalculator::ComputeSamplesHessian(sampleData, mesh->m_projection, 0, sampleNx, sampleNy); - const auto interpolator = std::make_shared(*mesh, - samples, - AveragingInterpolation::Method::Max, - Location::Faces, - 1.0, - false, - false, - 1); + auto interpolator = std::make_unique(*mesh, + samples, + AveragingInterpolation::Method::Max, + Location::Faces, + 1.0, + false, + false, + 1); MeshRefinementParameters meshRefinementParameters; meshRefinementParameters.max_num_refinement_iterations = 3; @@ -1034,7 +1048,9 @@ TEST_P(RidgeRefinementTestCases, expectedResults) meshRefinementParameters.refinement_type = 3; meshRefinementParameters.smoothing_iterations = 0; - MeshRefinement meshRefinement(*mesh, interpolator, meshRefinementParameters, false); + MeshRefinement meshRefinement(*mesh, + std::move(interpolator), + meshRefinementParameters, false); // Execute meshRefinement.Compute(); diff --git a/libs/MeshKernelApi/src/MeshKernel.cpp b/libs/MeshKernelApi/src/MeshKernel.cpp index 0b685ad82..887ab4c93 100644 --- a/libs/MeshKernelApi/src/MeshKernel.cpp +++ b/libs/MeshKernelApi/src/MeshKernel.cpp @@ -1711,16 +1711,18 @@ namespace meshkernelapi const bool refineOutsideFace = meshRefinementParameters.account_for_samples_outside == 1 ? true : false; const bool transformSamples = meshRefinementParameters.refinement_type == 2 ? true : false; - const auto averaging = std::make_shared(*meshKernelState[meshKernelId].m_mesh2d, - samplesVector, - averagingMethod, - meshkernel::Location::Faces, - relativeSearchRadius, - refineOutsideFace, - transformSamples, - static_cast(minimumNumSamples)); - - meshkernel::MeshRefinement meshRefinement(*meshKernelState[meshKernelId].m_mesh2d, averaging, meshRefinementParameters); + auto averaging = std::make_unique(*meshKernelState[meshKernelId].m_mesh2d, + samplesVector, + averagingMethod, + meshkernel::Location::Faces, + relativeSearchRadius, + refineOutsideFace, + transformSamples, + static_cast(minimumNumSamples)); + + meshkernel::MeshRefinement meshRefinement(*meshKernelState[meshKernelId].m_mesh2d, + std::move(averaging), + meshRefinementParameters); meshRefinement.Compute(); } catch (...) @@ -1753,11 +1755,11 @@ namespace meshkernelapi values[i] = griddedSamples.values[i]; } - std::shared_ptr interpolant; + std::unique_ptr interpolant; if (griddedSamples.x_coordinates == nullptr && griddedSamples.y_coordinates == nullptr) { meshkernel::Point origin{griddedSamples.x_origin, griddedSamples.y_origin}; - interpolant = std::make_shared(*meshKernelState[meshKernelId].m_mesh2d, + interpolant = std::make_unique(*meshKernelState[meshKernelId].m_mesh2d, griddedSamples.num_x, griddedSamples.num_y, origin, @@ -1787,13 +1789,16 @@ namespace meshkernelapi yCoordinates[i] = griddedSamples.y_coordinates[i]; } - interpolant = std::make_shared(*meshKernelState[meshKernelId].m_mesh2d, + interpolant = std::make_unique(*meshKernelState[meshKernelId].m_mesh2d, xCoordinates, yCoordinates, values); } - meshkernel::MeshRefinement meshRefinement(*meshKernelState[meshKernelId].m_mesh2d, interpolant, meshRefinementParameters, useNodalRefinement); + meshkernel::MeshRefinement meshRefinement(*meshKernelState[meshKernelId].m_mesh2d, + std::move(interpolant), + meshRefinementParameters, + useNodalRefinement); meshRefinement.Compute(); } catch (...)