diff --git a/libs/MeshKernel/CMakeLists.txt b/libs/MeshKernel/CMakeLists.txt index b7dfaf46e..c39bdc675 100644 --- a/libs/MeshKernel/CMakeLists.txt +++ b/libs/MeshKernel/CMakeLists.txt @@ -72,6 +72,8 @@ set( CURVILINEAR_GRID_SRC_LIST ${CURVILINEAR_GRID_SRC_DIR}/CurvilinearGrid.cpp ${CURVILINEAR_GRID_SRC_DIR}/CurvilinearGridAlgorithm.cpp + ${CURVILINEAR_GRID_SRC_DIR}/CurvilinearGridDeleteInterior.cpp + ${CURVILINEAR_GRID_SRC_DIR}/CurvilinearGridDeleteExterior.cpp ${CURVILINEAR_GRID_SRC_DIR}/CurvilinearGridDeRefinement.cpp ${CURVILINEAR_GRID_SRC_DIR}/CurvilinearGridFromPolygon.cpp ${CURVILINEAR_GRID_SRC_DIR}/CurvilinearGridFromSplines.cpp @@ -149,6 +151,8 @@ set( CURVILINEAR_GRID_INC_LIST ${CURVILINEAR_GRID_INC_DIR}/CurvilinearGrid.hpp ${CURVILINEAR_GRID_INC_DIR}/CurvilinearGridAlgorithm.hpp + ${CURVILINEAR_GRID_INC_DIR}/CurvilinearGridDeleteInterior.hpp + ${CURVILINEAR_GRID_INC_DIR}/CurvilinearGridDeleteExterior.hpp ${CURVILINEAR_GRID_INC_DIR}/CurvilinearGridDeRefinement.hpp ${CURVILINEAR_GRID_INC_DIR}/CurvilinearGridFromPolygon.hpp ${CURVILINEAR_GRID_INC_DIR}/CurvilinearGridFromSplines.hpp diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGrid.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGrid.hpp index 9af109748..af57ee2ae 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGrid.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGrid.hpp @@ -80,6 +80,10 @@ namespace meshkernel /// @param[in] projection The projection to use CurvilinearGrid(lin_alg::Matrix const& grid, Projection projection); + /// @brief Set the grid nodes of a curvilinear grid instance + /// @param[in] gridNodes The input grid points + void SetGridNodes(lin_alg::Matrix gridNodes); + /// @brief Deletes a curvilinear grid inside a polygon /// @param[in] polygons The polygons /// @param[in] polygonIndex The index of the polygon to use for deletion @@ -153,7 +157,7 @@ namespace meshkernel /// @param[in] firstNode The node indices of the first node /// @param[in] secondNode The node indices of the second node /// @return The upper left and lower right of the box defined by the two points - [[nodiscard]] std::tuple ComputeBlockFromCornerPoints(const CurvilinearGridNodeIndices& firstNode, const CurvilinearGridNodeIndices& secondNode) const; + std::tuple ComputeBlockFromCornerPoints(const CurvilinearGridNodeIndices& firstNode, const CurvilinearGridNodeIndices& secondNode) const; /// @brief From two points expressed in cartesian coordinates, get the two corner nodes defining a block in m and n coordinates /// @param[in] firstCornerPoint The first corner point @@ -186,10 +190,6 @@ namespace meshkernel /// @return The new displacement [[nodiscard]] Point TransformDisplacement(Point const& displacement, CurvilinearGridNodeIndices const& node, bool isLocal) const; - /// @brief Clones the curvilinear grid instance - /// @return A pointer to a deep copy of current curvilinear grid instance - [[nodiscard]] CurvilinearGrid CloneCurvilinearGrid() const; - /// @brief Allocates a new grid line at the boundary of the curvilinear grid if needed. /// @param firstNode The first node of the boundary grid line. /// @param secondNode The second node of the boundary grid line. @@ -206,10 +206,6 @@ namespace meshkernel /// @param[in] point The input point coordinate. The closest grid node will be deleted. void DeleteNode(Point const& point); - /// @brief Set all the nodes interior to the block to be invalid. - /// @note If any index is the null value or is out of range a ConstraintError will be thrown - void DeleteInterior(const CurvilinearGridNodeIndices& firstNode, const CurvilinearGridNodeIndices& secondNode); - /// @brief Moves a node from one position to another /// @param[in] fromPoint The input position, the closest node will be used /// @param[in] toPoint The coordinates of the new position diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridAlgorithm.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridAlgorithm.hpp index abc0ed21c..efffb4812 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridAlgorithm.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridAlgorithm.hpp @@ -27,11 +27,8 @@ #pragma once -#include - #include #include -#include #include namespace meshkernel @@ -44,10 +41,10 @@ namespace meshkernel public: /// @brief Class constructor /// @param[in] grid The input curvilinear grid - CurvilinearGridAlgorithm(std::shared_ptr grid); + explicit CurvilinearGridAlgorithm(CurvilinearGrid& grid); /// @brief Executes the algorithm - virtual CurvilinearGrid Compute() = 0; + virtual void Compute() = 0; /// @brief Sets a block where the algorithm should execute /// @param[in] firstCornerPoint The first point defining the bounding box @@ -63,7 +60,7 @@ namespace meshkernel /// @brief Virtual destructor virtual ~CurvilinearGridAlgorithm() = default; - CurvilinearGrid m_grid; ///< A deep copy of the original grid, modified by the algorithms + CurvilinearGrid& m_grid; ///< A reference of the grid, modified by the algorithms std::vector m_lines; ///< Selected grid lines CurvilinearGridNodeIndices m_lowerLeft; ///< The lower left corner of the block CurvilinearGridNodeIndices m_upperRight; ///< The upper right corner of the block diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeRefinement.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeRefinement.hpp index 34000ac9a..d8cc8d213 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeRefinement.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeRefinement.hpp @@ -42,9 +42,9 @@ namespace meshkernel public: /// @brief Class constructor /// @param[in] grid The input curvilinear grid - CurvilinearGridDeRefinement(std::shared_ptr grid); + CurvilinearGridDeRefinement(CurvilinearGrid& grid); /// @brief Refine the curvilinear grid - CurvilinearGrid Compute() override; + void Compute() override; }; } // namespace meshkernel diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeleteExterior.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeleteExterior.hpp new file mode 100644 index 000000000..a6c860bab --- /dev/null +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeleteExterior.hpp @@ -0,0 +1,47 @@ +//---- GPL --------------------------------------------------------------------- +// +// Copyright (C) Stichting Deltares, 2011-2021. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// contact: delft3d.support@deltares.nl +// Stichting Deltares +// P.O. Box 177 +// 2600 MH Delft, The Netherlands +// +// All indications and logos of, and references to, "Delft3D" and "Deltares" +// are registered trademarks of Stichting Deltares, and remain the property of +// Stichting Deltares. All rights reserved. +// +//------------------------------------------------------------------------------ + +#pragma once + +#include "CurvilinearGridAlgorithm.hpp" + +namespace meshkernel +{ + + /// @brief A class implementing the curvilinear grid delete exterior algorithm. + class CurvilinearGridDeleteExterior : public CurvilinearGridAlgorithm + { + public: + /// @brief Class constructor + /// @param[in] grid The input curvilinear grid + explicit CurvilinearGridDeleteExterior(CurvilinearGrid& grid); + + /// @brief Set all the nodes outside of the block to be invalid. + /// @note If any index is the null value or is out of range a ConstraintError will be thrown + void Compute() override; + }; +} // namespace meshkernel diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeleteInterior.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeleteInterior.hpp new file mode 100644 index 000000000..e7c671949 --- /dev/null +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridDeleteInterior.hpp @@ -0,0 +1,47 @@ +//---- GPL --------------------------------------------------------------------- +// +// Copyright (C) Stichting Deltares, 2011-2021. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// contact: delft3d.support@deltares.nl +// Stichting Deltares +// P.O. Box 177 +// 2600 MH Delft, The Netherlands +// +// All indications and logos of, and references to, "Delft3D" and "Deltares" +// are registered trademarks of Stichting Deltares, and remain the property of +// Stichting Deltares. All rights reserved. +// +//------------------------------------------------------------------------------ + +#pragma once + +#include "CurvilinearGridAlgorithm.hpp" + +namespace meshkernel +{ + + /// @brief A class implementing the curvilinear grid delete interior algorithm. + class CurvilinearGridDeleteInterior : public CurvilinearGridAlgorithm + { + public: + /// @brief Class constructor + /// @param[in] grid The input curvilinear grid + explicit CurvilinearGridDeleteInterior(CurvilinearGrid& grid); + + /// @brief Set all the nodes interior to the block to be invalid. + /// @note If any index is the null value or is out of range a ConstraintError will be thrown + void Compute() override; + }; +} // namespace meshkernel diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.hpp index 53a0aec9b..1d748eb3c 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.hpp @@ -45,14 +45,13 @@ namespace meshkernel /// @brief Class constructor /// @param[in] grid The input curvilinear grid /// @param[in] attractionFactor The input attraction/repulsion factor (positive attracts lines/negative repulses lines) - CurvilinearGridLineAttractionRepulsion(std::shared_ptr grid, double attractionFactor); + CurvilinearGridLineAttractionRepulsion(CurvilinearGrid& grid, double attractionFactor); /// @brief Computes a new curvilinear grid with line attracted towards \ref m_lines[0] - /// @return The shifted curvilinear grid - CurvilinearGrid Compute() override; + void Compute() override; private: - std::shared_ptr m_originalGrid; ///< A pointer to the original grid, used for computation of quantities - double m_attractionFactor; ///< The attraction factor. If 0.0 no line will be attracted to m_lines[0] + CurvilinearGrid m_originalGrid; ///< A pointer to the original grid, used for computation of quantities + double m_attractionFactor; ///< The attraction factor. If 0.0 no line will be attracted to m_lines[0] }; } // namespace meshkernel diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineMirror.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineMirror.hpp index c9b289abf..f722e2a1a 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineMirror.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineMirror.hpp @@ -43,11 +43,10 @@ namespace meshkernel /// @brief Class constructor /// @param[in] grid The input curvilinear grid /// @param[in] mirroringFactor The mirroringFactor factor - CurvilinearGridLineMirror(std::shared_ptr grid, double mirroringFactor); + CurvilinearGridLineMirror(CurvilinearGrid& grid, double mirroringFactor); /// @brief Computes a new curvilinear grid with the line shift - /// @return The shifted curvilinear grid - CurvilinearGrid Compute() override; + void Compute() override; private: CurvilinearGrid m_originalGrid; ///< The new grid, storing the new positions diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineShift.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineShift.hpp index 5f7338651..a2b7a8b66 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineShift.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridLineShift.hpp @@ -45,11 +45,10 @@ namespace meshkernel public: /// @brief Class constructor /// @param[in] grid The input curvilinear grid - CurvilinearGridLineShift(std::shared_ptr grid); + CurvilinearGridLineShift(CurvilinearGrid& grid); /// @brief Computes a new curvilinear grid with the line shift - /// @return The shifted curvilinear grid - CurvilinearGrid Compute() override; + void Compute() override; /// @brief Moves a node from one position to another /// @param[in] fromPoint The input position, the closest node on the \ref m_grid grid will be used @@ -68,6 +67,6 @@ namespace meshkernel /// @return The new displacement Point TransformDisplacement(Point const& displacement, CurvilinearGridNodeIndices const& node, bool toLocal) const; - std::shared_ptr m_originalGrid; ///< A pointer to the original grid + CurvilinearGrid m_originalGrid; ///< A pointer to the original grid }; } // namespace meshkernel diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridOrthogonalization.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridOrthogonalization.hpp index a236b0a9b..2fc8a2844 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridOrthogonalization.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridOrthogonalization.hpp @@ -45,11 +45,11 @@ namespace meshkernel /// @brief Class constructor /// @param[in] grid The input curvilinear grid /// @param[in] orthogonalizationParameters The orthogonalization parameters - CurvilinearGridOrthogonalization(std::shared_ptr grid, + CurvilinearGridOrthogonalization(CurvilinearGrid& grid, const OrthogonalizationParameters& orthogonalizationParameters); /// @brief Orthogonalize the curvilinear grid (modifies the grid point by m_grid) - CurvilinearGrid Compute() override; + void Compute() override; private: /// @brief Solve one orthogonalization iteration, using the method of successive over-relaxation SOR (ORTSOR) diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridRefinement.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridRefinement.hpp index dcac2acb6..3524b54bf 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridRefinement.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridRefinement.hpp @@ -45,10 +45,10 @@ namespace meshkernel /// \p firstPoint and \p secondPoint must lie on the same gridline /// @param[in] grid The input curvilinear grid /// @param[in] refinement The number of refinement lines between the points set by SetBlock() - CurvilinearGridRefinement(const std::shared_ptr& grid, UInt refinement); + CurvilinearGridRefinement(CurvilinearGrid& grid, UInt refinement); /// @brief Refine the curvilinear grid - CurvilinearGrid Compute() override; + void Compute() override; private: UInt m_refinement; ///< The selected number of refinement lines diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSmoothing.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSmoothing.hpp index 940ab45f3..47d15d191 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSmoothing.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSmoothing.hpp @@ -31,7 +31,6 @@ #include #include -#include namespace meshkernel { @@ -43,11 +42,10 @@ namespace meshkernel /// @brief Class constructor /// @param[in] grid The input curvilinear grid /// @param[in] smoothingIterations The number of smoothing iterations to perform - CurvilinearGridSmoothing(std::shared_ptr grid, UInt smoothingIterations); + CurvilinearGridSmoothing(CurvilinearGrid& grid, UInt smoothingIterations); /// @brief Compute curvilinear grid block smoothing (modifies the m_grid nodal values) - /// @return The smoothed grid - CurvilinearGrid Compute() override; + void Compute() override; /// @brief Compute curvilinear grid line smoothing. The algorithm smooths the grid along the direction specified by the line. /// The line must be an m or n grid line of the curvilinear grid. diff --git a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSnapping.hpp b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSnapping.hpp index 8cbcbe85c..9a15d1d93 100644 --- a/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSnapping.hpp +++ b/libs/MeshKernel/include/MeshKernel/CurvilinearGrid/CurvilinearGridSnapping.hpp @@ -137,12 +137,12 @@ namespace meshkernel /// @param [in] grid The input curvilinear grid /// @param [in] landBoundary The land boundary to which the grid is to be snapped. /// @param [in] points The points used to control the snapping and smoothing. - CurvilinearGridSnapping(std::shared_ptr grid, + CurvilinearGridSnapping(CurvilinearGrid& grid, const LandBoundary& landBoundary, const std::vector& points); /// @brief Executes the snapping and smoothing algorithm - CurvilinearGrid Compute() override; + void Compute() override; private: /// @brief Tolerance to determine if point is on (close to) boundary @@ -174,7 +174,7 @@ namespace meshkernel void Initialise(); /// @brief The grid to be smoothed - const CurvilinearGrid& m_originalGrid; + const CurvilinearGrid m_originalGrid; /// @brief The land boundary to which the grid is to be snapped. const LandBoundary& m_landBoundary; diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGrid.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGrid.cpp index ecb77b6c8..5f0e1730c 100644 --- a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGrid.cpp +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGrid.cpp @@ -36,14 +36,20 @@ using meshkernel::CurvilinearGridNodeIndices; CurvilinearGrid::CurvilinearGrid(Projection projection) : Mesh(projection) {} -CurvilinearGrid::CurvilinearGrid(lin_alg::Matrix const& grid, Projection projection) : m_gridNodes(grid) +CurvilinearGrid::CurvilinearGrid(lin_alg::Matrix const& grid, Projection projection) : Mesh(projection) { + SetGridNodes(grid); +} + +void CurvilinearGrid::SetGridNodes(lin_alg::Matrix gridNodes) +{ + m_gridNodes = gridNodes; + if (!IsValid()) { throw std::invalid_argument("CurvilinearGrid::CurvilinearGrid: Invalid curvilinear grid"); } - m_projection = projection; m_numM = static_cast(m_gridNodes.rows()); m_numN = static_cast(m_gridNodes.cols()); @@ -278,8 +284,25 @@ std::tuple CurvilinearGr std::tuple CurvilinearGrid::ComputeBlockFromCornerPoints(const CurvilinearGridNodeIndices& firstNode, const CurvilinearGridNodeIndices& secondNode) const { - return {{std::min(firstNode.m_m, secondNode.m_m), std::min(firstNode.m_n, secondNode.m_n)}, - {std::max(firstNode.m_m, secondNode.m_m), std::max(firstNode.m_n, secondNode.m_n)}}; + CurvilinearGridNodeIndices lowerLeft(std::min(firstNode.m_m, secondNode.m_m), std::min(firstNode.m_n, secondNode.m_n)); + CurvilinearGridNodeIndices upperRight(std::max(firstNode.m_m, secondNode.m_m), std::max(firstNode.m_n, secondNode.m_n)); + + if (!lowerLeft.IsValid() || !upperRight.IsValid()) + { + throw ConstraintError("Invalid index: first index - {{{}, {}}}, second index - {{{}, {}}}", lowerLeft.m_m, lowerLeft.m_n, upperRight.m_m, upperRight.m_n); + } + + if (lowerLeft.m_m >= m_numM || lowerLeft.m_n >= m_numN) + { + throw ConstraintError("Invalid index: first index {{{}, {}}} not in mesh limits {{{}, {}}}", lowerLeft.m_m, lowerLeft.m_n, m_numM, m_numN); + } + + if (upperRight.m_m >= m_numM || upperRight.m_n >= m_numN) + { + throw ConstraintError("Invalid index: second index {{{}, {}}} not in mesh limits {{{}, {}}}", upperRight.m_m, upperRight.m_n, m_numM, m_numN); + } + + return {lowerLeft, upperRight}; } void CurvilinearGrid::ComputeGridFacesMask() @@ -773,11 +796,6 @@ CurvilinearGrid::ComputeDirectionalSmoothingFactors(CurvilinearGridNodeIndices c return {mSmoothingFactor, nSmoothingFactor, mixedSmoothingFactor}; } -CurvilinearGrid CurvilinearGrid::CloneCurvilinearGrid() const -{ - return CurvilinearGrid(m_gridNodes, m_projection); -} - double CurvilinearGrid::ComputeAverageNodalDistance(CurvilinearGridNodeIndices const& index, CurvilinearGridLine::GridLineDirection direction) { if (index.m_m > m_gridNodes.rows() || index.m_n > m_gridNodes.cols()) @@ -872,39 +890,6 @@ void CurvilinearGrid::DeleteNode(Point const& point) } } -void CurvilinearGrid::DeleteInterior(const CurvilinearGridNodeIndices& firstNode, const CurvilinearGridNodeIndices& secondNode) -{ - - if (!firstNode.IsValid() || !secondNode.IsValid()) - { - throw ConstraintError("Invalid index: first index - {{{}, {}}}, second index - {{{}, {}}}", firstNode.m_m, firstNode.m_n, secondNode.m_m, secondNode.m_n); - } - - if (firstNode.m_m >= m_numM || firstNode.m_n >= m_numN) - { - throw ConstraintError("Invalid index: first index {{{}, {}}} not in mesh limits {{{}, {}}}", firstNode.m_m, firstNode.m_n, m_numM, m_numN); - } - - if (secondNode.m_m >= m_numM || secondNode.m_n >= m_numN) - { - throw ConstraintError("Invalid index: second index {{{}, {}}} not in mesh limits {{{}, {}}}", secondNode.m_m, secondNode.m_n, m_numM, m_numN); - } - - UInt lowerLimitI = std::min(firstNode.m_n, secondNode.m_n); - UInt upperLimitI = std::max(firstNode.m_n, secondNode.m_n); - - UInt lowerLimitJ = std::min(firstNode.m_m, secondNode.m_m); - UInt upperLimitJ = std::max(firstNode.m_m, secondNode.m_m); - - for (UInt n = lowerLimitI + 1; n < upperLimitI; ++n) - { - for (UInt m = lowerLimitJ + 1; m < upperLimitJ; ++m) - { - m_gridNodes(n, m).SetInvalid(); - } - } -} - void CurvilinearGrid::MoveNode(Point const& fromPoint, Point const& toPoint) { // Get the node indices of fromPoint diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridAlgorithm.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridAlgorithm.cpp index 2fa04eef9..ad0712b31 100644 --- a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridAlgorithm.cpp +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridAlgorithm.cpp @@ -34,9 +34,8 @@ using meshkernel::CurvilinearGrid; using meshkernel::CurvilinearGridAlgorithm; using meshkernel::CurvilinearGridLine; -CurvilinearGridAlgorithm::CurvilinearGridAlgorithm(std::shared_ptr grid) +CurvilinearGridAlgorithm::CurvilinearGridAlgorithm(CurvilinearGrid& grid) : m_grid(grid) { - m_grid = grid->CloneCurvilinearGrid(); } void CurvilinearGridAlgorithm::SetBlock(Point const& firstCornerPoint, Point const& secondCornerPoint) @@ -62,13 +61,13 @@ void CurvilinearGridAlgorithm::SetLine(Point const& firstPoint, Point const& sec // Coinciding nodes, no valid line, nothing to do if (newLineLowerLeft == newLineUpperRight) { - throw std::invalid_argument("CurvilinearGridAlgorithm::SetLine the start and the end points of the line are coinciding"); + throw AlgorithmError("The start and the end points of the line are coinciding"); } // The points of the frozen line, must be on the same grid-line if (!newLineLowerLeft.IsOnTheSameGridLine(newLineUpperRight)) { - throw std::invalid_argument("CurvilinearGridAlgorithm::SetLine the nodes do not define a grid line"); + throw AlgorithmError("The nodes do not define a grid line"); } CurvilinearGridLine const newGridline{newLineLowerLeft, newLineUpperRight}; diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeRefinement.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeRefinement.cpp index 995ce29ff..8013c2f64 100644 --- a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeRefinement.cpp +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeRefinement.cpp @@ -32,11 +32,11 @@ using meshkernel::CurvilinearGrid; using meshkernel::CurvilinearGridDeRefinement; -CurvilinearGridDeRefinement::CurvilinearGridDeRefinement(std::shared_ptr grid) : CurvilinearGridAlgorithm(grid) +CurvilinearGridDeRefinement::CurvilinearGridDeRefinement(CurvilinearGrid& grid) : CurvilinearGridAlgorithm(grid) { } -CurvilinearGrid CurvilinearGridDeRefinement::Compute() +void CurvilinearGridDeRefinement::Compute() { if (!m_lowerLeft.IsValid() || !m_upperRight.IsValid()) { @@ -77,5 +77,5 @@ CurvilinearGrid CurvilinearGridDeRefinement::Compute() } // substitute original grid with the derefined one - return CurvilinearGrid(lin_alg::STLVectorOfVectorsToMatrix(deRefinedGrid), m_grid.m_projection); + m_grid.SetGridNodes(lin_alg::STLVectorOfVectorsToMatrix(deRefinedGrid)); } diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeleteExterior.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeleteExterior.cpp new file mode 100644 index 000000000..0b378b88d --- /dev/null +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeleteExterior.cpp @@ -0,0 +1,87 @@ +//---- GPL --------------------------------------------------------------------- +// +// Copyright (C) Stichting Deltares, 2011-2021. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// contact: delft3d.support@deltares.nl +// Stichting Deltares +// P.O. Box 177 +// 2600 MH Delft, The Netherlands +// +// All indications and logos of, and references to, "Delft3D" and "Deltares" +// are registered trademarks of Stichting Deltares, and remain the property of +// Stichting Deltares. All rights reserved. +// +//------------------------------------------------------------------------------ + +#include "MeshKernel/CurvilinearGrid/CurvilinearGridDeleteExterior.hpp" + +#include +#include + +using meshkernel::CurvilinearGrid; +using meshkernel::CurvilinearGridLine; +using meshkernel::CurvilinearGridNodeIndices; + +meshkernel::CurvilinearGridDeleteExterior::CurvilinearGridDeleteExterior(CurvilinearGrid& grid) + : CurvilinearGridAlgorithm(grid) +{ +} + +void meshkernel::CurvilinearGridDeleteExterior::Compute() +{ + const UInt lowerLimitI = m_lowerLeft.m_n; + const UInt upperLimitI = m_upperRight.m_n; + + const UInt lowerLimitJ = m_lowerLeft.m_m; + const UInt upperLimitJ = m_upperRight.m_m; + + // Split into 4 regions, setting the nodes in each region to invalid + // + // First region: all nodes "south" the designated box + for (UInt n = 0; n < m_grid.m_numN; ++n) + { + for (UInt m = 0; m < lowerLimitJ; ++m) + { + m_grid.m_gridNodes(n, m).SetInvalid(); + } + } + + // Second region: all nodes "directly west of" the designated box + for (UInt n = 0; n < lowerLimitI; ++n) + { + for (UInt m = lowerLimitJ; m <= upperLimitJ; ++m) + { + m_grid.m_gridNodes(n, m).SetInvalid(); + } + } + + // Third region: all nodes "directly east of" the designated box + for (UInt n = upperLimitI + 1; n < m_grid.m_numN; ++n) + { + for (UInt m = lowerLimitJ; m <= upperLimitJ; ++m) + { + m_grid.m_gridNodes(n, m).SetInvalid(); + } + } + + // Fourth region: all nodes "north" the designated box + for (UInt n = 0; n < m_grid.m_numN; ++n) + { + for (UInt m = upperLimitJ + 1; m < m_grid.m_numM; ++m) + { + m_grid.m_gridNodes(n, m).SetInvalid(); + } + } +} diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeleteInterior.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeleteInterior.cpp new file mode 100644 index 000000000..d50252438 --- /dev/null +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridDeleteInterior.cpp @@ -0,0 +1,56 @@ +//---- GPL --------------------------------------------------------------------- +// +// Copyright (C) Stichting Deltares, 2011-2021. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// contact: delft3d.support@deltares.nl +// Stichting Deltares +// P.O. Box 177 +// 2600 MH Delft, The Netherlands +// +// All indications and logos of, and references to, "Delft3D" and "Deltares" +// are registered trademarks of Stichting Deltares, and remain the property of +// Stichting Deltares. All rights reserved. +// +//------------------------------------------------------------------------------ + +#include "MeshKernel/CurvilinearGrid/CurvilinearGridDeleteInterior.hpp" +#include +#include + +using meshkernel::CurvilinearGrid; +using meshkernel::CurvilinearGridLine; +using meshkernel::CurvilinearGridNodeIndices; + +meshkernel::CurvilinearGridDeleteInterior::CurvilinearGridDeleteInterior(CurvilinearGrid& grid) + : CurvilinearGridAlgorithm(grid) +{ +} + +void meshkernel::CurvilinearGridDeleteInterior::Compute() +{ + const UInt lowerLimitI = m_lowerLeft.m_n; + const UInt upperLimitI = m_upperRight.m_n; + + const UInt lowerLimitJ = m_lowerLeft.m_m; + const UInt upperLimitJ = m_upperRight.m_m; + + for (UInt n = lowerLimitI + 1; n < upperLimitI; ++n) + { + for (UInt m = lowerLimitJ + 1; m < upperLimitJ; ++m) + { + m_grid.m_gridNodes(n, m).SetInvalid(); + } + } +} diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.cpp index b7fe4f072..ed2002747 100644 --- a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.cpp +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineAttractionRepulsion.cpp @@ -34,13 +34,13 @@ using meshkernel::CurvilinearGrid; using meshkernel::CurvilinearGridLineAttractionRepulsion; using meshkernel::Point; -CurvilinearGridLineAttractionRepulsion::CurvilinearGridLineAttractionRepulsion(std::shared_ptr grid, +CurvilinearGridLineAttractionRepulsion::CurvilinearGridLineAttractionRepulsion(CurvilinearGrid& grid, double attractionFactor) : CurvilinearGridAlgorithm(grid), m_originalGrid(grid), m_attractionFactor(attractionFactor) { } -CurvilinearGrid CurvilinearGridLineAttractionRepulsion::Compute() +void CurvilinearGridLineAttractionRepulsion::Compute() { if (lin_alg::MatrixIsEmpty(m_grid.m_gridNodes)) { @@ -69,7 +69,7 @@ CurvilinearGrid CurvilinearGridLineAttractionRepulsion::Compute() for (auto n = startN; n <= endN; ++n) { // Not a valid grid node - if (!m_originalGrid->m_gridNodes(m, n).IsValid()) + if (!m_originalGrid.m_gridNodes(m, n).IsValid()) { continue; } @@ -84,7 +84,7 @@ CurvilinearGrid CurvilinearGridLineAttractionRepulsion::Compute() const auto [mSmoothing, nSmoothing, mixedSmoothing] = CurvilinearGrid::ComputeDirectionalSmoothingFactors(nodeIndex, m_lines[0].m_startNode, m_lowerLeft, m_upperRight); - auto const distance = m_originalGrid->ComputeAverageNodalDistance(nodeIndex, m_lines[0].m_gridLineType); + auto const distance = m_originalGrid.ComputeAverageNodalDistance(nodeIndex, m_lines[0].m_gridLineType); auto displacement = Point{0.0, 0.0}; if (m_lines[0].IsMGridLine()) @@ -99,12 +99,10 @@ CurvilinearGrid CurvilinearGridLineAttractionRepulsion::Compute() } // project transformation - displacement = m_originalGrid->TransformDisplacement(displacement, nodeIndex, false); + displacement = m_originalGrid.TransformDisplacement(displacement, nodeIndex, false); // adjust nodes m_grid.m_gridNodes(m, n) += displacement; } } - - return m_grid; } diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineMirror.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineMirror.cpp index e7d70b52e..57ea1cb8b 100644 --- a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineMirror.cpp +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridLineMirror.cpp @@ -34,7 +34,7 @@ using meshkernel::CurvilinearGrid; using meshkernel::CurvilinearGridLineMirror; using meshkernel::Point; -CurvilinearGridLineMirror::CurvilinearGridLineMirror(std::shared_ptr grid, double mirroringFactor) : CurvilinearGridAlgorithm(grid), m_mirroringFactor(mirroringFactor) +CurvilinearGridLineMirror::CurvilinearGridLineMirror(CurvilinearGrid& grid, double mirroringFactor) : CurvilinearGridAlgorithm(grid), m_mirroringFactor(mirroringFactor) { if (m_mirroringFactor <= 0) @@ -43,7 +43,7 @@ CurvilinearGridLineMirror::CurvilinearGridLineMirror(std::shared_ptr grid) : CurvilinearGridAlgorithm(grid), m_originalGrid(grid) +CurvilinearGridLineShift::CurvilinearGridLineShift(CurvilinearGrid& grid) : CurvilinearGridAlgorithm(grid), m_originalGrid(grid) { } -CurvilinearGrid CurvilinearGridLineShift::Compute() +void CurvilinearGridLineShift::Compute() { if (m_lines.empty()) { @@ -50,7 +50,7 @@ CurvilinearGrid CurvilinearGridLineShift::Compute() /// The first delta auto const previousNodeIndex = m_lines[0].m_startNode; auto previousDelta = m_grid.m_gridNodes(previousNodeIndex.m_m, previousNodeIndex.m_n) - - m_originalGrid->m_gridNodes(previousNodeIndex.m_m, previousNodeIndex.m_n); + m_originalGrid.m_gridNodes(previousNodeIndex.m_m, previousNodeIndex.m_n); const double eps = 1e-5; auto previousCoordinate = m_lines[0].m_startCoordinate; @@ -59,7 +59,7 @@ CurvilinearGrid CurvilinearGridLineShift::Compute() auto const currentNodeIndex = m_lines[0].GetNodeIndexFromCoordinate(i); auto const currentDelta = m_grid.m_gridNodes(currentNodeIndex.m_m, currentNodeIndex.m_n) - - m_originalGrid->m_gridNodes(currentNodeIndex.m_m, currentNodeIndex.m_n); + m_originalGrid.m_gridNodes(currentNodeIndex.m_m, currentNodeIndex.m_n); if (std::abs(currentDelta.x) < eps && std::abs(currentDelta.y) < eps && i != m_lines[0].m_endCoordinate) { @@ -78,7 +78,7 @@ CurvilinearGrid CurvilinearGridLineShift::Compute() auto const secondFactor = 1.0 - firstFactor; // Now distribute the shifting - m_grid.m_gridNodes(nodeIndex.m_m, nodeIndex.m_n) = m_originalGrid->m_gridNodes(nodeIndex.m_m, nodeIndex.m_n) + + m_grid.m_gridNodes(nodeIndex.m_m, nodeIndex.m_n) = m_originalGrid.m_gridNodes(nodeIndex.m_m, nodeIndex.m_n) + previousDelta * secondFactor + currentDelta * firstFactor; // Field transformation on the influence area TransformGrid(nodeIndex); @@ -86,14 +86,12 @@ CurvilinearGrid CurvilinearGridLineShift::Compute() previousCoordinate = i; previousDelta = currentDelta; } - - return m_grid; } void CurvilinearGridLineShift::TransformGrid(CurvilinearGridNodeIndices const& node) { - auto delta = m_grid.m_gridNodes(node.m_m, node.m_n) - m_originalGrid->m_gridNodes(node.m_m, node.m_n); - delta = m_originalGrid->TransformDisplacement(delta, node, true); + auto delta = m_grid.m_gridNodes(node.m_m, node.m_n) - m_originalGrid.m_gridNodes(node.m_m, node.m_n); + delta = m_originalGrid.TransformDisplacement(delta, node, true); auto const start = m_lines[0].IsMGridLine() ? m_lowerLeft.m_n : m_lowerLeft.m_m; auto const end = m_lines[0].IsMGridLine() ? m_upperRight.m_n : m_upperRight.m_m; @@ -103,7 +101,7 @@ void CurvilinearGridLineShift::TransformGrid(CurvilinearGridNodeIndices const& n CurvilinearGridNodeIndices currentNode{m_lines[0].IsMGridLine() ? node.m_m : i, m_lines[0].IsMGridLine() ? i : node.m_n}; - if (!m_originalGrid->m_gridNodes(currentNode.m_m, currentNode.m_n).IsValid()) + if (!m_originalGrid.m_gridNodes(currentNode.m_m, currentNode.m_n).IsValid()) { continue; } @@ -119,8 +117,8 @@ void CurvilinearGridLineShift::TransformGrid(CurvilinearGridNodeIndices const& n currentDelta = delta * mSmoothing; } - currentDelta = m_originalGrid->TransformDisplacement(currentDelta, currentNode, false); - m_grid.m_gridNodes(currentNode.m_m, currentNode.m_n) = m_originalGrid->m_gridNodes(currentNode.m_m, currentNode.m_n) + currentDelta; + currentDelta = m_originalGrid.TransformDisplacement(currentDelta, currentNode, false); + m_grid.m_gridNodes(currentNode.m_m, currentNode.m_n) = m_originalGrid.m_gridNodes(currentNode.m_m, currentNode.m_n) + currentDelta; } } diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridOrthogonalization.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridOrthogonalization.cpp index 86f17b0d9..ee9acaf3e 100644 --- a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridOrthogonalization.cpp +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridOrthogonalization.cpp @@ -36,7 +36,7 @@ using meshkernel::CurvilinearGrid; using meshkernel::CurvilinearGridOrthogonalization; -CurvilinearGridOrthogonalization::CurvilinearGridOrthogonalization(std::shared_ptr grid, +CurvilinearGridOrthogonalization::CurvilinearGridOrthogonalization(CurvilinearGrid& grid, const OrthogonalizationParameters& orthogonalizationParameters) : CurvilinearGridAlgorithm(grid), m_orthoEqTerms(m_grid.m_numM, m_grid.m_numN), @@ -62,7 +62,7 @@ void CurvilinearGridOrthogonalization::ComputeFrozenGridPoints() } } -CurvilinearGrid CurvilinearGridOrthogonalization::Compute() +void CurvilinearGridOrthogonalization::Compute() { if (!m_lowerLeft.IsValid() || !m_upperRight.IsValid()) { @@ -86,8 +86,6 @@ CurvilinearGrid CurvilinearGridOrthogonalization::Compute() ProjectVerticalBoundariesGridNodes(); } } - - return m_grid; } void CurvilinearGridOrthogonalization::ProjectHorizontalBoundaryGridNodes() diff --git a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridRefinement.cpp b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridRefinement.cpp index 8a6371e04..c7fd2f1f5 100644 --- a/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridRefinement.cpp +++ b/libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridRefinement.cpp @@ -33,7 +33,7 @@ using meshkernel::CurvilinearGrid; using meshkernel::CurvilinearGridRefinement; -CurvilinearGridRefinement::CurvilinearGridRefinement(const std::shared_ptr& grid, UInt refinement) +CurvilinearGridRefinement::CurvilinearGridRefinement(CurvilinearGrid& grid, UInt refinement) : CurvilinearGridAlgorithm(grid), m_refinement(refinement) { @@ -41,7 +41,7 @@ CurvilinearGridRefinement::CurvilinearGridRefinement(const std::shared_ptr grid, UInt smoothingIterations) : CurvilinearGridAlgorithm(grid), m_smoothingIterations(smoothingIterations) +CurvilinearGridSmoothing::CurvilinearGridSmoothing(CurvilinearGrid& grid, UInt smoothingIterations) : CurvilinearGridAlgorithm(grid), m_smoothingIterations(smoothingIterations) { // Allocate cache for storing grid nodes values @@ -45,14 +45,13 @@ CurvilinearGridSmoothing::CurvilinearGridSmoothing(std::shared_ptr grid, +meshkernel::CurvilinearGridSnapping::CurvilinearGridSnapping(CurvilinearGrid& grid, const LandBoundary& lb, const std::vector& points) : CurvilinearGridAlgorithm(grid), - m_originalGrid(*grid), + m_originalGrid(grid), m_landBoundary(lb), m_points(points) { @@ -184,7 +184,7 @@ void meshkernel::CurvilinearGridSnapping::ApplySmoothingToGrid(const Curvilinear } } -meshkernel::CurvilinearGrid meshkernel::CurvilinearGridSnapping::Compute() +void meshkernel::CurvilinearGridSnapping::Compute() { std::unique_ptr smoothingFactorCalculator; @@ -227,6 +227,4 @@ meshkernel::CurvilinearGrid meshkernel::CurvilinearGridSnapping::Compute() } } } - - return m_grid; } diff --git a/libs/MeshKernel/tests/src/CurvilinearGridDeRefinementTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridDeRefinementTests.cpp index a080f4bb4..66dfdab03 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridDeRefinementTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridDeRefinementTests.cpp @@ -16,16 +16,16 @@ TEST(CurvilinearGridDeRefinement, Compute_OnCurvilinearGrid_ShouldDeRefineVertic Point{20, 0}, Point{20, 10}, Point{20, 20}, Point{20, 30}, Point{30, 0}, Point{30, 10}, Point{30, 20}, Point{30, 30}; - const auto curvilinearGrid = std::make_shared(grid, Projection::cartesian); + CurvilinearGrid curvilinearGrid(grid, Projection::cartesian); CurvilinearGridDeRefinement curvilinearGridDeRefinement(curvilinearGrid); curvilinearGridDeRefinement.SetBlock({10, 20}, {20, 20}); // Execute - const auto derefinedGrid = curvilinearGridDeRefinement.Compute(); + curvilinearGridDeRefinement.Compute(); // Assert (the vertical line at x=15 is removed) - ASSERT_EQ(4, derefinedGrid.m_numM); - ASSERT_EQ(4, derefinedGrid.m_numN); + ASSERT_EQ(4, curvilinearGrid.m_numM); + ASSERT_EQ(4, curvilinearGrid.m_numN); } TEST(CurvilinearGridDeRefinement, Compute_OnCurvilinearGridWithMissingFaces_ShouldDeRefineVerticalGridLines) @@ -42,17 +42,16 @@ TEST(CurvilinearGridDeRefinement, Compute_OnCurvilinearGridWithMissingFaces_Shou Point{40, 0}, Point{40, 10}, Point{40, 20}, Point{40, 30}, Point{50, 0}, Point{50, 10}, Point{50, 20}, Point{50, 30}; - const auto curvilinearGrid = std::make_shared(grid, Projection::cartesian); + CurvilinearGrid curvilinearGrid(grid, Projection::cartesian); CurvilinearGridDeRefinement curvilinearGridDeRefinement(curvilinearGrid); curvilinearGridDeRefinement.SetBlock({10, 20}, {20, 20}); // Execute - - const auto derefinedGrid = curvilinearGridDeRefinement.Compute(); + curvilinearGridDeRefinement.Compute(); // Assert - ASSERT_EQ(6, derefinedGrid.m_numM); - ASSERT_EQ(4, derefinedGrid.m_numN); + ASSERT_EQ(6, curvilinearGrid.m_numM); + ASSERT_EQ(4, curvilinearGrid.m_numN); } TEST(CurvilinearGridDeRefinement, Compute_OnCurvilinearGrid_ShouldDeRefineHorizontalGridLines) @@ -64,14 +63,14 @@ TEST(CurvilinearGridDeRefinement, Compute_OnCurvilinearGrid_ShouldDeRefineHorizo Point{20, 0}, Point{20, 10}, Point{20, 11}, Point{20, 20}, Point{20, 30}, Point{30, 0}, Point{30, 10}, Point{30, 11}, Point{30, 20}, Point{30, 30}; - auto curvilinearGrid = std::make_shared(grid, Projection::cartesian); + CurvilinearGrid curvilinearGrid(grid, Projection::cartesian); CurvilinearGridDeRefinement curvilinearGridDeRefinement(curvilinearGrid); curvilinearGridDeRefinement.SetBlock({10, 10}, {10, 20}); // Execute - const auto derefinedGrid = curvilinearGridDeRefinement.Compute(); + curvilinearGridDeRefinement.Compute(); // Assert (the vertical line at x=15 is removed) - ASSERT_EQ(4, derefinedGrid.m_numM); - ASSERT_EQ(4, derefinedGrid.m_numN); -} \ No newline at end of file + ASSERT_EQ(4, curvilinearGrid.m_numM); + ASSERT_EQ(4, curvilinearGrid.m_numN); +} diff --git a/libs/MeshKernel/tests/src/CurvilinearGridLineAttractionRepulsionTest.cpp b/libs/MeshKernel/tests/src/CurvilinearGridLineAttractionRepulsionTest.cpp index e460db009..1e59bcf52 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridLineAttractionRepulsionTest.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridLineAttractionRepulsionTest.cpp @@ -7,107 +7,107 @@ TEST(CurvilinearLineAttraction, Compute_OnMLine_ShouldAttractMLines) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineAttractionRepulsion curvilinearLineAttractionRepulsion(curvilinearGrid, 0.5); curvilinearLineAttractionRepulsion.SetLine({80266.8, 367104.0}, {80419.3, 366566.2}); curvilinearLineAttractionRepulsion.SetBlock({80198.2, 366750.6}, {80583.1, 366889.8}); // Execute - const auto modifiedGrid = curvilinearLineAttractionRepulsion.Compute(); + curvilinearLineAttractionRepulsion.Compute(); // Asserts const double tolerance = 1e-6; - ASSERT_NEAR(80178.014482303217, modifiedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80266.910680413363, modifiedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80322.584162464715, modifiedGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(80350.500795549306, modifiedGrid.m_gridNodes(3, 2).x, tolerance); - ASSERT_NEAR(80362.879671417410, modifiedGrid.m_gridNodes(4, 2).x, tolerance); - - ASSERT_NEAR(367069.60110549850, modifiedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(366937.57246542675, modifiedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366803.23746104678, modifiedGrid.m_gridNodes(2, 2).y, tolerance); - ASSERT_NEAR(366683.98469820933, modifiedGrid.m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(366555.11052078847, modifiedGrid.m_gridNodes(4, 2).y, tolerance); + ASSERT_NEAR(80178.014482303217, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80266.910680413363, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80322.584162464715, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(80350.500795549306, curvilinearGrid.m_gridNodes(3, 2).x, tolerance); + ASSERT_NEAR(80362.879671417410, curvilinearGrid.m_gridNodes(4, 2).x, tolerance); + + ASSERT_NEAR(367069.60110549850, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(366937.57246542675, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366803.23746104678, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + ASSERT_NEAR(366683.98469820933, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(366555.11052078847, curvilinearGrid.m_gridNodes(4, 2).y, tolerance); } TEST(CurvilinearLineAttraction, Compute_OnNLine_ShouldAttractNLines) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineAttractionRepulsion curvilinearLineAttractionRepulsion(curvilinearGrid, 0.5); curvilinearLineAttractionRepulsion.SetLine({80198.2, 366750.6}, {80583.1, 366889.8}); curvilinearLineAttractionRepulsion.SetBlock({80266.8, 367104.0}, {80419.3, 366566.2}); // Execute - const auto modifiedGrid = curvilinearLineAttractionRepulsion.Compute(); + curvilinearLineAttractionRepulsion.Compute(); // Asserts const double tolerance = 1e-6; - ASSERT_NEAR(80145.970831448722, modifiedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80247.575117740766, modifiedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80292.449108019704, modifiedGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(80316.537053694148, modifiedGrid.m_gridNodes(3, 2).x, tolerance); - ASSERT_NEAR(80331.200564142913, modifiedGrid.m_gridNodes(4, 2).x, tolerance); - - ASSERT_NEAR(367047.36276461056, modifiedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(366897.17707224732, modifiedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366792.50812354451, modifiedGrid.m_gridNodes(2, 2).y, tolerance); - ASSERT_NEAR(366703.03776077798, modifiedGrid.m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(366552.40947499714, modifiedGrid.m_gridNodes(4, 2).y, tolerance); + ASSERT_NEAR(80145.970831448722, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80247.575117740766, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80292.449108019704, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(80316.537053694148, curvilinearGrid.m_gridNodes(3, 2).x, tolerance); + ASSERT_NEAR(80331.200564142913, curvilinearGrid.m_gridNodes(4, 2).x, tolerance); + + ASSERT_NEAR(367047.36276461056, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(366897.17707224732, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366792.50812354451, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + ASSERT_NEAR(366703.03776077798, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(366552.40947499714, curvilinearGrid.m_gridNodes(4, 2).y, tolerance); } TEST(CurvilinearLineRepulsion, Compute_OnMLine_ShouldRepulseMLines) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineAttractionRepulsion curvilinearLineAttractionRepulsion(curvilinearGrid, -0.5); curvilinearLineAttractionRepulsion.SetLine({80266.8, 367104.0}, {80419.3, 366566.2}); curvilinearLineAttractionRepulsion.SetBlock({80198.2, 366750.6}, {80583.1, 366889.8}); // Execute - const auto modifiedGrid = curvilinearLineAttractionRepulsion.Compute(); + curvilinearLineAttractionRepulsion.Compute(); // Asserts const double tolerance = 1e-6; - ASSERT_NEAR(80113.927180594226, modifiedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80202.937709587452, modifiedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80262.314053574693, modifiedGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(80290.291966405988, modifiedGrid.m_gridNodes(3, 2).x, tolerance); - ASSERT_NEAR(80299.521456868417, modifiedGrid.m_gridNodes(4, 2).x, tolerance); - - ASSERT_NEAR(367025.12442372262, modifiedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(366900.80385695840, modifiedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366781.77878604224, modifiedGrid.m_gridNodes(2, 2).y, tolerance); - ASSERT_NEAR(366674.26710998092, modifiedGrid.m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(366549.70842920581, modifiedGrid.m_gridNodes(4, 2).y, tolerance); + ASSERT_NEAR(80113.927180594226, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80202.937709587452, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80262.314053574693, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(80290.291966405988, curvilinearGrid.m_gridNodes(3, 2).x, tolerance); + ASSERT_NEAR(80299.521456868417, curvilinearGrid.m_gridNodes(4, 2).x, tolerance); + + ASSERT_NEAR(367025.12442372262, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(366900.80385695840, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366781.77878604224, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + ASSERT_NEAR(366674.26710998092, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(366549.70842920581, curvilinearGrid.m_gridNodes(4, 2).y, tolerance); } TEST(CurvilinearLineRepulsion, Compute_OnNLine_ShouldRepulseNLines) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineAttractionRepulsion curvilinearLineAttractionRepulsion(curvilinearGrid, -0.5); curvilinearLineAttractionRepulsion.SetLine({80198.2, 366750.6}, {80583.1, 366889.8}); curvilinearLineAttractionRepulsion.SetBlock({80266.8, 367104.0}, {80419.3, 366566.2}); // Execute - const auto modifiedGrid = curvilinearLineAttractionRepulsion.Compute(); + curvilinearLineAttractionRepulsion.Compute(); // Asserts const double tolerance = 1e-6; - ASSERT_NEAR(80145.970831448722, modifiedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80222.273272260049, modifiedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80292.449108019704, modifiedGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(80324.255708261146, modifiedGrid.m_gridNodes(3, 2).x, tolerance); - ASSERT_NEAR(80331.200564142913, modifiedGrid.m_gridNodes(4, 2).x, tolerance); - - ASSERT_NEAR(367047.36276461056, modifiedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(366941.19925013784, modifiedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366792.50812354451, modifiedGrid.m_gridNodes(2, 2).y, tolerance); - ASSERT_NEAR(366655.21404741227, modifiedGrid.m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(366552.40947499714, modifiedGrid.m_gridNodes(4, 2).y, tolerance); + ASSERT_NEAR(80145.970831448722, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80222.273272260049, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80292.449108019704, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(80324.255708261146, curvilinearGrid.m_gridNodes(3, 2).x, tolerance); + ASSERT_NEAR(80331.200564142913, curvilinearGrid.m_gridNodes(4, 2).x, tolerance); + + ASSERT_NEAR(367047.36276461056, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(366941.19925013784, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366792.50812354451, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + ASSERT_NEAR(366655.21404741227, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(366552.40947499714, curvilinearGrid.m_gridNodes(4, 2).y, tolerance); } diff --git a/libs/MeshKernel/tests/src/CurvilinearGridLineMirrorTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridLineMirrorTests.cpp index c24a189e2..5b14f88ca 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridLineMirrorTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridLineMirrorTests.cpp @@ -7,32 +7,32 @@ TEST(CurvilinearLineMirror, Compute_LineMirrorOnBottomBoundary_ShouldAddFacesOnBottomBoundary) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineMirror curvilinearLineMirror(curvilinearGrid, 1.2); curvilinearLineMirror.SetLine({79983.0, 366936.2}, {80155.8, 366529.5}); // Execute - const auto mirroredGrid = curvilinearLineMirror.Compute(); + curvilinearLineMirror.Compute(); // Asserts constexpr double tolerance = 1e-6; - ASSERT_NEAR(79885.972404917018, mirroredGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(79945.113707304932, mirroredGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(79997.648681153471, mirroredGrid.m_gridNodes(2, 0).x, tolerance); - ASSERT_NEAR(80022.752290748060, mirroredGrid.m_gridNodes(3, 0).x, tolerance); - ASSERT_NEAR(80049.721398047535, mirroredGrid.m_gridNodes(4, 0).x, tolerance); - - ASSERT_NEAR(366871.50371491740, mirroredGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(366772.69280839822, mirroredGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366659.31789138837, mirroredGrid.m_gridNodes(2, 0).y, tolerance); - ASSERT_NEAR(366598.79661874950, mirroredGrid.m_gridNodes(3, 0).y, tolerance); - ASSERT_NEAR(366516.53233619139, mirroredGrid.m_gridNodes(4, 0).y, tolerance); + ASSERT_NEAR(79885.972404917018, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(79945.113707304932, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(79997.648681153471, curvilinearGrid.m_gridNodes(2, 0).x, tolerance); + ASSERT_NEAR(80022.752290748060, curvilinearGrid.m_gridNodes(3, 0).x, tolerance); + ASSERT_NEAR(80049.721398047535, curvilinearGrid.m_gridNodes(4, 0).x, tolerance); + + ASSERT_NEAR(366871.50371491740, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(366772.69280839822, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366659.31789138837, curvilinearGrid.m_gridNodes(2, 0).y, tolerance); + ASSERT_NEAR(366598.79661874950, curvilinearGrid.m_gridNodes(3, 0).y, tolerance); + ASSERT_NEAR(366516.53233619139, curvilinearGrid.m_gridNodes(4, 0).y, tolerance); } TEST(CurvilinearLineMirror, Compute_LineMirrorOnBottomBoundaryWithZeroMirrowingFactor_ShouldNotAddFacesOnBottomBoundary) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); // Assert ASSERT_THROW(meshkernel::CurvilinearGridLineMirror(curvilinearGrid, 0.0), std::invalid_argument); @@ -41,92 +41,92 @@ TEST(CurvilinearLineMirror, Compute_LineMirrorOnBottomBoundaryWithZeroMirrowingF TEST(CurvilinearLineMirror, Compute_LineMirrorOnUpperBoundary_ShouldAddFacesOnUpperBoundary) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineMirror curvilinearLineMirror(curvilinearGrid, 1.2); curvilinearLineMirror.SetLine({80960.2, 366520.7}, {80609.8, 367406.0}); // Execute - const auto mirroredGrid = curvilinearLineMirror.Compute(); + curvilinearLineMirror.Compute(); // Asserts constexpr double tolerance = 1e-6; - Eigen::Index const last = mirroredGrid.m_gridNodes.cols() - 1; - ASSERT_NEAR(80703.065731618568, mirroredGrid.m_gridNodes(0, last).x, tolerance); - ASSERT_NEAR(80878.447265919545, mirroredGrid.m_gridNodes(1, last).x, tolerance); - ASSERT_NEAR(81010.674000571220, mirroredGrid.m_gridNodes(2, last).x, tolerance); - ASSERT_NEAR(81097.939900259138, mirroredGrid.m_gridNodes(3, last).x, tolerance); - ASSERT_NEAR(81096.681464918671, mirroredGrid.m_gridNodes(4, last).x, tolerance); - - ASSERT_NEAR(367480.69596951915, mirroredGrid.m_gridNodes(0, last).y, tolerance); - ASSERT_NEAR(367242.36746145069, mirroredGrid.m_gridNodes(1, last).y, tolerance); - ASSERT_NEAR(367002.07900554762, mirroredGrid.m_gridNodes(2, last).y, tolerance); - ASSERT_NEAR(366719.73488287395, mirroredGrid.m_gridNodes(3, last).y, tolerance); - ASSERT_NEAR(366511.72792605805, mirroredGrid.m_gridNodes(4, last).y, tolerance); + Eigen::Index const last = curvilinearGrid.m_gridNodes.cols() - 1; + ASSERT_NEAR(80703.065731618568, curvilinearGrid.m_gridNodes(0, last).x, tolerance); + ASSERT_NEAR(80878.447265919545, curvilinearGrid.m_gridNodes(1, last).x, tolerance); + ASSERT_NEAR(81010.674000571220, curvilinearGrid.m_gridNodes(2, last).x, tolerance); + ASSERT_NEAR(81097.939900259138, curvilinearGrid.m_gridNodes(3, last).x, tolerance); + ASSERT_NEAR(81096.681464918671, curvilinearGrid.m_gridNodes(4, last).x, tolerance); + + ASSERT_NEAR(367480.69596951915, curvilinearGrid.m_gridNodes(0, last).y, tolerance); + ASSERT_NEAR(367242.36746145069, curvilinearGrid.m_gridNodes(1, last).y, tolerance); + ASSERT_NEAR(367002.07900554762, curvilinearGrid.m_gridNodes(2, last).y, tolerance); + ASSERT_NEAR(366719.73488287395, curvilinearGrid.m_gridNodes(3, last).y, tolerance); + ASSERT_NEAR(366511.72792605805, curvilinearGrid.m_gridNodes(4, last).y, tolerance); } TEST(CurvilinearLineMirror, Compute_LineMirrorOnLeftBoundary_ShouldAddFacesOnLeftBoundary) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineMirror curvilinearLineMirror(curvilinearGrid, 1.2); curvilinearLineMirror.SetLine({79983.0, 366936.2}, {80609.8, 367406.0}); // Execute - const auto mirroredGrid = curvilinearLineMirror.Compute(); + curvilinearLineMirror.Compute(); // Asserts constexpr double tolerance = 1e-6; - ASSERT_NEAR(79899.555713630645, mirroredGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(79970.016439946601, mirroredGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(80039.226795186711, mirroredGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80107.373974174203, mirroredGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(80174.667394645265, mirroredGrid.m_gridNodes(0, 4).x, tolerance); - ASSERT_NEAR(80233.729789995661, mirroredGrid.m_gridNodes(0, 5).x, tolerance); - ASSERT_NEAR(80293.934851283411, mirroredGrid.m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80355.263363179940, mirroredGrid.m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80417.692693760589, mirroredGrid.m_gridNodes(0, 8).x, tolerance); - - ASSERT_NEAR(367068.55540497036, mirroredGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(367133.95424016198, mirroredGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(367201.17228871223, mirroredGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(367270.06081416988, mirroredGrid.m_gridNodes(0, 3).y, tolerance); - ASSERT_NEAR(367340.45903014857, mirroredGrid.m_gridNodes(0, 4).y, tolerance); - ASSERT_NEAR(367425.25311140029, mirroredGrid.m_gridNodes(0, 5).y, tolerance); - ASSERT_NEAR(367508.49440735363, mirroredGrid.m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367590.20902999706, mirroredGrid.m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367670.42773418076, mirroredGrid.m_gridNodes(0, 8).y, tolerance); + ASSERT_NEAR(79899.555713630645, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(79970.016439946601, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(80039.226795186711, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80107.373974174203, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(80174.667394645265, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + ASSERT_NEAR(80233.729789995661, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + ASSERT_NEAR(80293.934851283411, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80355.263363179940, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80417.692693760589, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + ASSERT_NEAR(367068.55540497036, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(367133.95424016198, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(367201.17228871223, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367270.06081416988, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(367340.45903014857, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + ASSERT_NEAR(367425.25311140029, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + ASSERT_NEAR(367508.49440735363, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367590.20902999706, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367670.42773418076, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); } TEST(CurvilinearLineMirror, Compute_LineMirrorOnRightBoundary_ShouldAddFacesOnRightBoundary) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineMirror curvilinearLineMirror(curvilinearGrid, 1.2); curvilinearLineMirror.SetLine({80155.8, 366529.5}, {80960.2, 366520.72}); // Execute - const auto mirroredGrid = curvilinearLineMirror.Compute(); + curvilinearLineMirror.Compute(); // Asserts constexpr double tolerance = 1e-6; - Eigen::Index const last = mirroredGrid.m_gridNodes.rows() - 1; - ASSERT_NEAR(272501.90233055683, mirroredGrid.m_gridNodes(last, 0).x, tolerance); - ASSERT_NEAR(272806.24608551903, mirroredGrid.m_gridNodes(last, 1).x, tolerance); - ASSERT_NEAR(273113.11689828755, mirroredGrid.m_gridNodes(last, 2).x, tolerance); - ASSERT_NEAR(273421.82178223983, mirroredGrid.m_gridNodes(last, 3).x, tolerance); - ASSERT_NEAR(273731.95226017234, mirroredGrid.m_gridNodes(last, 4).x, tolerance); - ASSERT_NEAR(274115.35433400975, mirroredGrid.m_gridNodes(last, 5).x, tolerance); - ASSERT_NEAR(274499.35511354846, mirroredGrid.m_gridNodes(last, 6).x, tolerance); - ASSERT_NEAR(274883.99770888803, mirroredGrid.m_gridNodes(last, 7).x, tolerance); - ASSERT_NEAR(275268.64743354439, mirroredGrid.m_gridNodes(last, 8).x, tolerance); - - ASSERT_NEAR(1246326.3868120508, mirroredGrid.m_gridNodes(last, 0).y, tolerance); - ASSERT_NEAR(1246385.9365869928, mirroredGrid.m_gridNodes(last, 1).y, tolerance); - ASSERT_NEAR(1246430.2519299081, mirroredGrid.m_gridNodes(last, 2).y, tolerance); - ASSERT_NEAR(1246461.7442429555, mirroredGrid.m_gridNodes(last, 3).y, tolerance); - ASSERT_NEAR(1246482.6999190229, mirroredGrid.m_gridNodes(last, 4).y, tolerance); - ASSERT_NEAR(1246466.1900003948, mirroredGrid.m_gridNodes(last, 5).y, tolerance); - ASSERT_NEAR(1246448.5627491081, mirroredGrid.m_gridNodes(last, 6).y, tolerance); - ASSERT_NEAR(1246429.5894027406, mirroredGrid.m_gridNodes(last, 7).y, tolerance); - ASSERT_NEAR(1246411.3593545749, mirroredGrid.m_gridNodes(last, 8).y, tolerance); + Eigen::Index const last = curvilinearGrid.m_gridNodes.rows() - 1; + ASSERT_NEAR(272501.90233055683, curvilinearGrid.m_gridNodes(last, 0).x, tolerance); + ASSERT_NEAR(272806.24608551903, curvilinearGrid.m_gridNodes(last, 1).x, tolerance); + ASSERT_NEAR(273113.11689828755, curvilinearGrid.m_gridNodes(last, 2).x, tolerance); + ASSERT_NEAR(273421.82178223983, curvilinearGrid.m_gridNodes(last, 3).x, tolerance); + ASSERT_NEAR(273731.95226017234, curvilinearGrid.m_gridNodes(last, 4).x, tolerance); + ASSERT_NEAR(274115.35433400975, curvilinearGrid.m_gridNodes(last, 5).x, tolerance); + ASSERT_NEAR(274499.35511354846, curvilinearGrid.m_gridNodes(last, 6).x, tolerance); + ASSERT_NEAR(274883.99770888803, curvilinearGrid.m_gridNodes(last, 7).x, tolerance); + ASSERT_NEAR(275268.64743354439, curvilinearGrid.m_gridNodes(last, 8).x, tolerance); + + ASSERT_NEAR(1246326.3868120508, curvilinearGrid.m_gridNodes(last, 0).y, tolerance); + ASSERT_NEAR(1246385.9365869928, curvilinearGrid.m_gridNodes(last, 1).y, tolerance); + ASSERT_NEAR(1246430.2519299081, curvilinearGrid.m_gridNodes(last, 2).y, tolerance); + ASSERT_NEAR(1246461.7442429555, curvilinearGrid.m_gridNodes(last, 3).y, tolerance); + ASSERT_NEAR(1246482.6999190229, curvilinearGrid.m_gridNodes(last, 4).y, tolerance); + ASSERT_NEAR(1246466.1900003948, curvilinearGrid.m_gridNodes(last, 5).y, tolerance); + ASSERT_NEAR(1246448.5627491081, curvilinearGrid.m_gridNodes(last, 6).y, tolerance); + ASSERT_NEAR(1246429.5894027406, curvilinearGrid.m_gridNodes(last, 7).y, tolerance); + ASSERT_NEAR(1246411.3593545749, curvilinearGrid.m_gridNodes(last, 8).y, tolerance); } diff --git a/libs/MeshKernel/tests/src/CurvilinearGridLineShiftTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridLineShiftTests.cpp index 906c9cf1f..6c05dc095 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridLineShiftTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridLineShiftTests.cpp @@ -7,63 +7,63 @@ TEST(CurvilinearLineShift, Compute_OnMGridlineShiftingOneNode_ShouldShiftLine) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineShift curvilinearLineShift(curvilinearGrid); curvilinearLineShift.SetLine({79982.0, 366934.0}, {80155.0, 366530.0}); curvilinearLineShift.SetBlock({80108.0, 366707.0}, {80291.0, 366792.0}); curvilinearLineShift.MoveNode({79982.0, 366934.0}, {79872.0, 366876.0}); // Execute - const auto shiftedGrid = curvilinearLineShift.Compute(); + curvilinearLineShift.Compute(); // Asserts const double tolerance = 1e-6; - ASSERT_NEAR(79872.000000000000, shiftedGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(80010.039799507853, shiftedGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(80145.970831448722, shiftedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80225.900042018140, shiftedGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(80305.243756829266, shiftedGrid.m_gridNodes(0, 4).x, tolerance); - ASSERT_NEAR(80381.747982750283, shiftedGrid.m_gridNodes(0, 5).x, tolerance); - ASSERT_NEAR(80458.252208671300, shiftedGrid.m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80534.756434592317, shiftedGrid.m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80611.260660513333, shiftedGrid.m_gridNodes(0, 8).x, tolerance); - - ASSERT_NEAR(79970.149644452977, shiftedGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80103.062377666603, shiftedGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80234.924195000407, shiftedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80324.671765221428, shiftedGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80414.057391982613, shiftedGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80505.096476712482, shiftedGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80595.183339827883, shiftedGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80684.333994102650, shiftedGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80772.567299473958, shiftedGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(366876.00000000000, shiftedGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(366959.82623907487, shiftedGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(367047.36276461056, shiftedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(367104.62934968271, shiftedGrid.m_gridNodes(0, 3).y, tolerance); - ASSERT_NEAR(367163.01691965276, shiftedGrid.m_gridNodes(0, 4).y, tolerance); - ASSERT_NEAR(367224.10904462705, shiftedGrid.m_gridNodes(0, 5).y, tolerance); - ASSERT_NEAR(367285.20116960135, shiftedGrid.m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367346.29329457565, shiftedGrid.m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367407.38541954994, shiftedGrid.m_gridNodes(0, 8).y, tolerance); - - ASSERT_NEAR(366781.50715811126, shiftedGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366849.28921837400, shiftedGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366919.18816119258, shiftedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366966.76979594346, shiftedGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367015.14849423966, shiftedGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367056.48898898275, shiftedGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367099.12347147451, shiftedGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367143.03018172452, shiftedGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367188.18349069095, shiftedGrid.m_gridNodes(1, 8).y, tolerance); + ASSERT_NEAR(79872.000000000000, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(80010.039799507853, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(80145.970831448722, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80225.900042018140, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(80305.243756829266, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + ASSERT_NEAR(80381.747982750283, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + ASSERT_NEAR(80458.252208671300, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80534.756434592317, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80611.260660513333, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + ASSERT_NEAR(79970.149644452977, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80103.062377666603, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80234.924195000407, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80324.671765221428, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80414.057391982613, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80505.096476712482, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80595.183339827883, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80684.333994102650, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80772.567299473958, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(366876.00000000000, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(366959.82623907487, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(367047.36276461056, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367104.62934968271, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(367163.01691965276, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + ASSERT_NEAR(367224.10904462705, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + ASSERT_NEAR(367285.20116960135, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367346.29329457565, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367407.38541954994, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); + + ASSERT_NEAR(366781.50715811126, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366849.28921837400, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366919.18816119258, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366966.76979594346, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367015.14849423966, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367056.48898898275, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367099.12347147451, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367143.03018172452, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367188.18349069095, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); } TEST(CurvilinearLineShift, Compute_OnMGridlineShiftingTwoNodes_ShouldShiftLine) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); meshkernel::CurvilinearGridLineShift curvilinearLineShift(curvilinearGrid); curvilinearLineShift.SetLine({79982.0, 366934.0}, {80155.0, 366530.0}); curvilinearLineShift.SetBlock({80108.0, 366707.0}, {80291.0, 366792.0}); @@ -73,48 +73,48 @@ TEST(CurvilinearLineShift, Compute_OnMGridlineShiftingTwoNodes_ShouldShiftLine) curvilinearLineShift.MoveNode({80053.0, 366823.0}, {79932.0, 366773.0}); // Execute - const auto shiftedGrid = curvilinearLineShift.Compute(); + curvilinearLineShift.Compute(); // Asserts const double tolerance = 1e-6; - ASSERT_NEAR(79872.000000000000, shiftedGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(80010.039799507853, shiftedGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(80145.970831448722, shiftedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80225.900042018140, shiftedGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(80305.243756829266, shiftedGrid.m_gridNodes(0, 4).x, tolerance); - ASSERT_NEAR(80381.747982750283, shiftedGrid.m_gridNodes(0, 5).x, tolerance); - ASSERT_NEAR(80458.252208671300, shiftedGrid.m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80534.756434592317, shiftedGrid.m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80611.260660513333, shiftedGrid.m_gridNodes(0, 8).x, tolerance); - - ASSERT_NEAR(79932.000000000000, shiftedGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80084.035373914361, shiftedGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80234.924195000407, shiftedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80324.671765221428, shiftedGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80414.057391982613, shiftedGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80505.096476712482, shiftedGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80595.183339827883, shiftedGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80684.333994102650, shiftedGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80772.567299473958, shiftedGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(366876.00000000000, shiftedGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(366959.82623907487, shiftedGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(367047.36276461056, shiftedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(367104.62934968271, shiftedGrid.m_gridNodes(0, 3).y, tolerance); - ASSERT_NEAR(367163.01691965276, shiftedGrid.m_gridNodes(0, 4).y, tolerance); - ASSERT_NEAR(367224.10904462705, shiftedGrid.m_gridNodes(0, 5).y, tolerance); - ASSERT_NEAR(367285.20116960135, shiftedGrid.m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367346.29329457565, shiftedGrid.m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367407.38541954994, shiftedGrid.m_gridNodes(0, 8).y, tolerance); - - ASSERT_NEAR(366773.00000000000, shiftedGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366844.82660636236, shiftedGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366919.18816119258, shiftedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366966.76979594346, shiftedGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367015.14849423966, shiftedGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367056.48898898275, shiftedGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367099.12347147451, shiftedGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367143.03018172452, shiftedGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367188.18349069095, shiftedGrid.m_gridNodes(1, 8).y, tolerance); -} \ No newline at end of file + ASSERT_NEAR(79872.000000000000, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(80010.039799507853, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(80145.970831448722, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80225.900042018140, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(80305.243756829266, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + ASSERT_NEAR(80381.747982750283, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + ASSERT_NEAR(80458.252208671300, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80534.756434592317, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80611.260660513333, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + ASSERT_NEAR(79932.000000000000, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80084.035373914361, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80234.924195000407, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80324.671765221428, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80414.057391982613, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80505.096476712482, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80595.183339827883, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80684.333994102650, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80772.567299473958, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(366876.00000000000, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(366959.82623907487, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(367047.36276461056, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367104.62934968271, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(367163.01691965276, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + ASSERT_NEAR(367224.10904462705, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + ASSERT_NEAR(367285.20116960135, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367346.29329457565, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367407.38541954994, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); + + ASSERT_NEAR(366773.00000000000, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366844.82660636236, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366919.18816119258, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366966.76979594346, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367015.14849423966, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367056.48898898275, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367099.12347147451, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367143.03018172452, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367188.18349069095, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); +} diff --git a/libs/MeshKernel/tests/src/CurvilinearGridOrthogonalizationTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridOrthogonalizationTests.cpp index 46cb5cd37..dacd0eb61 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridOrthogonalizationTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridOrthogonalizationTests.cpp @@ -18,10 +18,10 @@ TEST(CurvilinearGridOrthogonalization, Compute_OnStronglyNonOrthogonalCurvilinea Point{20, 0}, Point{20, 10}, Point{20, 20}, Point{20, 30}, Point{30, 0}, Point{30, 10}, Point{30, 20}, Point{30, 30}; - const auto curvilinearGrid = std::make_shared(grid, meshkernel::Projection::cartesian); + CurvilinearGrid curvilinearGrid(grid, meshkernel::Projection::cartesian); // Move a node, to make the grid strongly non orthogonal - curvilinearGrid->MoveNode({10.0, 20.0}, {18.0, 12.0}); + curvilinearGrid.MoveNode({10.0, 20.0}, {18.0, 12.0}); OrthogonalizationParameters orthogonalizationParameters; orthogonalizationParameters.outer_iterations = 1; @@ -32,12 +32,12 @@ TEST(CurvilinearGridOrthogonalization, Compute_OnStronglyNonOrthogonalCurvilinea curvilinearGridOrthogonalization.SetBlock({0, 0}, {30, 30}); // Execute - auto const orthogonalizedCurvilinearGrid = curvilinearGridOrthogonalization.Compute(); + curvilinearGridOrthogonalization.Compute(); // Assert the moved nodes has moved towards its original location, making the grid more orthogonal constexpr double tolerance = 1e-6; - ASSERT_NEAR(11.841396536135521, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(18.158586078094562, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(11.841396536135521, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(18.158586078094562, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); } TEST(CurvilinearGridOrthogonalization, Compute_OnOrthogonalCurvilinearGrid_ShouldNotModifyGrid) @@ -49,7 +49,7 @@ TEST(CurvilinearGridOrthogonalization, Compute_OnOrthogonalCurvilinearGrid_Shoul Point{20, 0}, Point{20, 10}, Point{20, 20}, Point{20, 30}, Point{30, 0}, Point{30, 10}, Point{30, 20}, Point{30, 30}; - const auto curvilinearGrid = std::make_shared(grid, meshkernel::Projection::cartesian); + meshkernel::CurvilinearGrid curvilinearGrid(grid, meshkernel::Projection::cartesian); OrthogonalizationParameters orthogonalizationParameters; orthogonalizationParameters.outer_iterations = 1; @@ -60,56 +60,56 @@ TEST(CurvilinearGridOrthogonalization, Compute_OnOrthogonalCurvilinearGrid_Shoul curvilinearGridOrthogonalization.SetBlock({0, 0}, {30, 30}); // Execute - auto const orthogonalizedCurvilinearGrid = curvilinearGridOrthogonalization.Compute(); + curvilinearGridOrthogonalization.Compute(); // Assert nodes are on the same location because the grid is already orthogonal constexpr double tolerance = 1e-6; - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).x, tolerance); - - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).x, tolerance); - - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 0).x, tolerance); - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 1).x, tolerance); - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 3).x, tolerance); - - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 0).x, tolerance); - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 1).x, tolerance); - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 2).x, tolerance); - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 3).x, tolerance); - - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).y, tolerance); - - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).y, tolerance); - - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 0).y, tolerance); - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 1).y, tolerance); - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 2).y, tolerance); - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(2, 3).y, tolerance); - - ASSERT_NEAR(0.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 0).y, tolerance); - ASSERT_NEAR(10.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 1).y, tolerance); - ASSERT_NEAR(20.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(30.0, orthogonalizedCurvilinearGrid.m_gridNodes(3, 3).y, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 0).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 1).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 3).x, tolerance); + + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 0).x, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 1).x, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 2).x, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 3).x, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(2, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(2, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(2, 3).y, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(3, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(3, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 3).y, tolerance); } TEST(CurvilinearGridOrthogonalization, Compute_OnONonOrthogonalCurvilinearGrid_ShouldOrthogonalizeGrid) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); OrthogonalizationParameters orthogonalizationParameters; orthogonalizationParameters.outer_iterations = 2; @@ -119,56 +119,56 @@ TEST(CurvilinearGridOrthogonalization, Compute_OnONonOrthogonalCurvilinearGrid_S meshkernel::CurvilinearGridOrthogonalization curvilinearGridOrthogonalization(curvilinearGrid, orthogonalizationParameters); curvilinearGridOrthogonalization.SetBlock({80154, 366530}, {80610, 367407}); // Execute - auto const orthogonalizedCurvilinearGrid = curvilinearGridOrthogonalization.Compute(); + curvilinearGridOrthogonalization.Compute(); // Assert constexpr double tolerance = 1e-6; - ASSERT_NEAR(79983.796374595549, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(80067.930920933941, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(80150.164245250286, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80231.651392830841, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(80312.801762204603, orthogonalizedCurvilinearGrid.m_gridNodes(0, 4).x, tolerance); - ASSERT_NEAR(80390.860703898958, orthogonalizedCurvilinearGrid.m_gridNodes(0, 5).x, tolerance); - ASSERT_NEAR(80466.956631008565, orthogonalizedCurvilinearGrid.m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80540.510527743099, orthogonalizedCurvilinearGrid.m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80611.260660513333, orthogonalizedCurvilinearGrid.m_gridNodes(0, 8).x, tolerance); - - ASSERT_NEAR(80056.139417226193, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80143.392341684361, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80232.701973556381, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80323.273756955823, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80415.126141636414, orthogonalizedCurvilinearGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80506.879117047443, orthogonalizedCurvilinearGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80595.173874885382, orthogonalizedCurvilinearGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80680.093103208215, orthogonalizedCurvilinearGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80761.372120477128, orthogonalizedCurvilinearGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(366936.89538054139, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(366993.16520344437, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(367050.33461904334, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(367108.77222890750, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).y, tolerance); - ASSERT_NEAR(367168.86295006215, orthogonalizedCurvilinearGrid.m_gridNodes(0, 4).y, tolerance); - ASSERT_NEAR(367231.44573248079, orthogonalizedCurvilinearGrid.m_gridNodes(0, 5).y, tolerance); - ASSERT_NEAR(367292.13654755038, orthogonalizedCurvilinearGrid.m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367350.89140520856, orthogonalizedCurvilinearGrid.m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367407.38541954994, orthogonalizedCurvilinearGrid.m_gridNodes(0, 8).y, tolerance); - - ASSERT_NEAR(366823.20595668437, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366869.41001402331, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366915.26601702173, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366961.36595671845, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367008.20690690872, orthogonalizedCurvilinearGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367056.34885035310, orthogonalizedCurvilinearGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367105.00611276925, orthogonalizedCurvilinearGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367154.47604494903, orthogonalizedCurvilinearGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367204.88319783867, orthogonalizedCurvilinearGrid.m_gridNodes(1, 8).y, tolerance); + ASSERT_NEAR(79983.796374595549, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(80067.930920933941, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(80150.164245250286, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80231.651392830841, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(80312.801762204603, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + ASSERT_NEAR(80390.860703898958, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + ASSERT_NEAR(80466.956631008565, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80540.510527743099, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80611.260660513333, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + ASSERT_NEAR(80056.139417226193, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80143.392341684361, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80232.701973556381, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80323.273756955823, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80415.126141636414, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80506.879117047443, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80595.173874885382, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80680.093103208215, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80761.372120477128, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(366936.89538054139, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(366993.16520344437, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(367050.33461904334, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367108.77222890750, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(367168.86295006215, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + ASSERT_NEAR(367231.44573248079, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + ASSERT_NEAR(367292.13654755038, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367350.89140520856, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367407.38541954994, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); + + ASSERT_NEAR(366823.20595668437, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366869.41001402331, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366915.26601702173, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366961.36595671845, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367008.20690690872, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367056.34885035310, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367105.00611276925, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367154.47604494903, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367204.88319783867, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); } TEST(CurvilinearGridOrthogonalization, Compute_OnONonOrthogonalCurvilinearGridWithMissingElements_ShouldOrthogonalizeGrid) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGridWithMissingFaces(); + auto curvilinearGrid = MakeSmallCurvilinearGridWithMissingFaces(); OrthogonalizationParameters orthogonalizationParameters; orthogonalizationParameters.outer_iterations = 2; @@ -179,76 +179,76 @@ TEST(CurvilinearGridOrthogonalization, Compute_OnONonOrthogonalCurvilinearGridWi curvilinearGridOrthogonalization.SetBlock({80154, 366530}, {80610, 367407}); // Execute - auto const orthogonalizedCurvilinearGrid = curvilinearGridOrthogonalization.Compute(); + curvilinearGridOrthogonalization.Compute(); // Assert constexpr double tolerance = 1e-6; - EXPECT_NEAR(79983.796374595549, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).x, tolerance); - EXPECT_NEAR(80069.224277354806, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).x, tolerance); - EXPECT_NEAR(80152.817263131525, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).x, tolerance); - EXPECT_NEAR(80235.609244143387, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).x, tolerance); - EXPECT_NEAR(80317.466702245743, orthogonalizedCurvilinearGrid.m_gridNodes(0, 4).x, tolerance); - EXPECT_NEAR(80395.149908970227, orthogonalizedCurvilinearGrid.m_gridNodes(0, 5).x, tolerance); - EXPECT_NEAR(80470.021886679329, orthogonalizedCurvilinearGrid.m_gridNodes(0, 6).x, tolerance); - EXPECT_NEAR(80542.049673235932, orthogonalizedCurvilinearGrid.m_gridNodes(0, 7).x, tolerance); - EXPECT_NEAR(80611.260660513333, orthogonalizedCurvilinearGrid.m_gridNodes(0, 8).x, tolerance); - - EXPECT_NEAR(80055.199856352847, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).x, tolerance); - EXPECT_NEAR(80143.721071059583, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).x, tolerance); - EXPECT_NEAR(80234.545379411153, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).x, tolerance); - EXPECT_NEAR(80326.293574499403, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).x, tolerance); - EXPECT_NEAR(80418.809428865279, orthogonalizedCurvilinearGrid.m_gridNodes(1, 4).x, tolerance); - EXPECT_NEAR(80510.299874655640, orthogonalizedCurvilinearGrid.m_gridNodes(1, 5).x, tolerance); - EXPECT_NEAR(80597.036324757821, orthogonalizedCurvilinearGrid.m_gridNodes(1, 6).x, tolerance); - EXPECT_NEAR(80680.228401363493, orthogonalizedCurvilinearGrid.m_gridNodes(1, 7).x, tolerance); - EXPECT_NEAR(80759.822363775238, orthogonalizedCurvilinearGrid.m_gridNodes(1, 8).x, tolerance); - - EXPECT_NEAR(80104.514488846587, orthogonalizedCurvilinearGrid.m_gridNodes(2, 0).x, tolerance); - EXPECT_NEAR(80197.383420613070, orthogonalizedCurvilinearGrid.m_gridNodes(2, 1).x, tolerance); - EXPECT_NEAR(80292.449108019704, orthogonalizedCurvilinearGrid.m_gridNodes(2, 2).x, tolerance); - EXPECT_NEAR(80387.175475807715, orthogonalizedCurvilinearGrid.m_gridNodes(2, 3).x, tolerance); - EXPECT_NEAR(80480.608251576487, orthogonalizedCurvilinearGrid.m_gridNodes(2, 4).x, tolerance); - EXPECT_NEAR(80583.120607369667, orthogonalizedCurvilinearGrid.m_gridNodes(2, 5).x, tolerance); - EXPECT_NEAR(80682.512780448465, orthogonalizedCurvilinearGrid.m_gridNodes(2, 6).x, tolerance); - EXPECT_NEAR(80780.894620879248, orthogonalizedCurvilinearGrid.m_gridNodes(2, 7).x, tolerance); - EXPECT_NEAR(80877.580909293247, orthogonalizedCurvilinearGrid.m_gridNodes(2, 8).x, tolerance); - - EXPECT_NEAR(366936.89538054139, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).y, tolerance); - EXPECT_NEAR(366994.04511051433, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).y, tolerance); - EXPECT_NEAR(367052.21760805714, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).y, tolerance); - EXPECT_NEAR(367111.62432093697, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).y, tolerance); - EXPECT_NEAR(367172.50484630122, orthogonalizedCurvilinearGrid.m_gridNodes(0, 4).y, tolerance); - EXPECT_NEAR(367234.88964184484, orthogonalizedCurvilinearGrid.m_gridNodes(0, 5).y, tolerance); - EXPECT_NEAR(367294.58040378935, orthogonalizedCurvilinearGrid.m_gridNodes(0, 6).y, tolerance); - EXPECT_NEAR(367352.12121038162, orthogonalizedCurvilinearGrid.m_gridNodes(0, 7).y, tolerance); - EXPECT_NEAR(367407.38541954994, orthogonalizedCurvilinearGrid.m_gridNodes(0, 8).y, tolerance); - - EXPECT_NEAR(366824.95581170503, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).y, tolerance); - EXPECT_NEAR(366871.97091034410, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).y, tolerance); - EXPECT_NEAR(366918.90326042997, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).y, tolerance); - EXPECT_NEAR(366966.74273245712, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).y, tolerance); - EXPECT_NEAR(367014.95754932362, orthogonalizedCurvilinearGrid.m_gridNodes(1, 4).y, tolerance); - EXPECT_NEAR(367062.00790467981, orthogonalizedCurvilinearGrid.m_gridNodes(1, 5).y, tolerance); - EXPECT_NEAR(367109.50790550862, orthogonalizedCurvilinearGrid.m_gridNodes(1, 6).y, tolerance); - EXPECT_NEAR(367157.80620957806, orthogonalizedCurvilinearGrid.m_gridNodes(1, 7).y, tolerance); - EXPECT_NEAR(367207.16259613103, orthogonalizedCurvilinearGrid.m_gridNodes(1, 8).y, tolerance); - - EXPECT_NEAR(366718.00768776325, orthogonalizedCurvilinearGrid.m_gridNodes(2, 0).y, tolerance); - EXPECT_NEAR(366755.34794646013, orthogonalizedCurvilinearGrid.m_gridNodes(2, 1).y, tolerance); - EXPECT_NEAR(366792.50812354451, orthogonalizedCurvilinearGrid.m_gridNodes(2, 2).y, tolerance); - EXPECT_NEAR(366832.52615748829, orthogonalizedCurvilinearGrid.m_gridNodes(2, 3).y, tolerance); - EXPECT_NEAR(366870.46128228144, orthogonalizedCurvilinearGrid.m_gridNodes(2, 4).y, tolerance); - EXPECT_NEAR(366891.62363194284, orthogonalizedCurvilinearGrid.m_gridNodes(2, 5).y, tolerance); - EXPECT_NEAR(366923.14004067366, orthogonalizedCurvilinearGrid.m_gridNodes(2, 6).y, tolerance); - EXPECT_NEAR(366957.61329611664, orthogonalizedCurvilinearGrid.m_gridNodes(2, 7).y, tolerance); - EXPECT_NEAR(366996.07892524434, orthogonalizedCurvilinearGrid.m_gridNodes(2, 8).y, tolerance); + EXPECT_NEAR(79983.796374595549, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + EXPECT_NEAR(80069.224277354806, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + EXPECT_NEAR(80152.817263131525, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + EXPECT_NEAR(80235.609244143387, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + EXPECT_NEAR(80317.466702245743, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + EXPECT_NEAR(80395.149908970227, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + EXPECT_NEAR(80470.021886679329, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + EXPECT_NEAR(80542.049673235932, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + EXPECT_NEAR(80611.260660513333, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + EXPECT_NEAR(80055.199856352847, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + EXPECT_NEAR(80143.721071059583, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + EXPECT_NEAR(80234.545379411153, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + EXPECT_NEAR(80326.293574499403, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + EXPECT_NEAR(80418.809428865279, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + EXPECT_NEAR(80510.299874655640, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + EXPECT_NEAR(80597.036324757821, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + EXPECT_NEAR(80680.228401363493, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + EXPECT_NEAR(80759.822363775238, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + EXPECT_NEAR(80104.514488846587, curvilinearGrid.m_gridNodes(2, 0).x, tolerance); + EXPECT_NEAR(80197.383420613070, curvilinearGrid.m_gridNodes(2, 1).x, tolerance); + EXPECT_NEAR(80292.449108019704, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + EXPECT_NEAR(80387.175475807715, curvilinearGrid.m_gridNodes(2, 3).x, tolerance); + EXPECT_NEAR(80480.608251576487, curvilinearGrid.m_gridNodes(2, 4).x, tolerance); + EXPECT_NEAR(80583.120607369667, curvilinearGrid.m_gridNodes(2, 5).x, tolerance); + EXPECT_NEAR(80682.512780448465, curvilinearGrid.m_gridNodes(2, 6).x, tolerance); + EXPECT_NEAR(80780.894620879248, curvilinearGrid.m_gridNodes(2, 7).x, tolerance); + EXPECT_NEAR(80877.580909293247, curvilinearGrid.m_gridNodes(2, 8).x, tolerance); + + EXPECT_NEAR(366936.89538054139, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + EXPECT_NEAR(366994.04511051433, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + EXPECT_NEAR(367052.21760805714, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + EXPECT_NEAR(367111.62432093697, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + EXPECT_NEAR(367172.50484630122, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + EXPECT_NEAR(367234.88964184484, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + EXPECT_NEAR(367294.58040378935, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + EXPECT_NEAR(367352.12121038162, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + EXPECT_NEAR(367407.38541954994, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); + + EXPECT_NEAR(366824.95581170503, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + EXPECT_NEAR(366871.97091034410, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + EXPECT_NEAR(366918.90326042997, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + EXPECT_NEAR(366966.74273245712, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + EXPECT_NEAR(367014.95754932362, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + EXPECT_NEAR(367062.00790467981, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + EXPECT_NEAR(367109.50790550862, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + EXPECT_NEAR(367157.80620957806, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + EXPECT_NEAR(367207.16259613103, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); + + EXPECT_NEAR(366718.00768776325, curvilinearGrid.m_gridNodes(2, 0).y, tolerance); + EXPECT_NEAR(366755.34794646013, curvilinearGrid.m_gridNodes(2, 1).y, tolerance); + EXPECT_NEAR(366792.50812354451, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + EXPECT_NEAR(366832.52615748829, curvilinearGrid.m_gridNodes(2, 3).y, tolerance); + EXPECT_NEAR(366870.46128228144, curvilinearGrid.m_gridNodes(2, 4).y, tolerance); + EXPECT_NEAR(366891.62363194284, curvilinearGrid.m_gridNodes(2, 5).y, tolerance); + EXPECT_NEAR(366923.14004067366, curvilinearGrid.m_gridNodes(2, 6).y, tolerance); + EXPECT_NEAR(366957.61329611664, curvilinearGrid.m_gridNodes(2, 7).y, tolerance); + EXPECT_NEAR(366996.07892524434, curvilinearGrid.m_gridNodes(2, 8).y, tolerance); } TEST(CurvilinearGridOrthogonalization, SetFrozenLine_OnONonOrthogonalGrid_WithCrossingFrozenLines_ShouldThrowAnStdException) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); OrthogonalizationParameters orthogonalizationParameters; orthogonalizationParameters.outer_iterations = 2; @@ -266,7 +266,7 @@ TEST(CurvilinearGridOrthogonalization, SetFrozenLine_OnONonOrthogonalGrid_WithCr TEST(CurvilinearGridOrthogonalization, Compute_OnONonOrthogonalCurvilinearGridWithFrozenLines_ShouldOrthogonalizeGrid) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); OrthogonalizationParameters orthogonalizationParameters; orthogonalizationParameters.outer_iterations = 2; @@ -278,48 +278,48 @@ TEST(CurvilinearGridOrthogonalization, Compute_OnONonOrthogonalCurvilinearGridWi curvilinearGridOrthogonalization.SetLine({80144, 367046}, {80329, 366550}); // Execute - auto const orthogonalizedCurvilinearGrid = curvilinearGridOrthogonalization.Compute(); + curvilinearGridOrthogonalization.Compute(); // Assert constexpr double tolerance = 1e-6; - ASSERT_NEAR(79983.796374595549, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(80069.479272425073, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(80153.235772058310, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80234.211288098682, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(80314.661153602894, orthogonalizedCurvilinearGrid.m_gridNodes(0, 4).x, tolerance); - ASSERT_NEAR(80392.150195938390, orthogonalizedCurvilinearGrid.m_gridNodes(0, 5).x, tolerance); - ASSERT_NEAR(80467.771942028790, orthogonalizedCurvilinearGrid.m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80540.898431866168, orthogonalizedCurvilinearGrid.m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80611.260660513333, orthogonalizedCurvilinearGrid.m_gridNodes(0, 8).x, tolerance); - - ASSERT_NEAR(80055.196755132944, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80143.960692327732, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80234.924195000407, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80324.849820521486, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80416.240608373060, orthogonalizedCurvilinearGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80507.596543850144, orthogonalizedCurvilinearGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80595.526594976516, orthogonalizedCurvilinearGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80680.087189144266, orthogonalizedCurvilinearGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80760.998582117099, orthogonalizedCurvilinearGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(366936.89538054139, orthogonalizedCurvilinearGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(366994.21866791911, orthogonalizedCurvilinearGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(367052.51483841456, orthogonalizedCurvilinearGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(367110.61675055756, orthogonalizedCurvilinearGrid.m_gridNodes(0, 3).y, tolerance); - ASSERT_NEAR(367170.31164987158, orthogonalizedCurvilinearGrid.m_gridNodes(0, 4).y, tolerance); - ASSERT_NEAR(367232.48168405943, orthogonalizedCurvilinearGrid.m_gridNodes(0, 5).y, tolerance); - ASSERT_NEAR(367292.78650072071, orthogonalizedCurvilinearGrid.m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367351.20135266299, orthogonalizedCurvilinearGrid.m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367407.38541954994, orthogonalizedCurvilinearGrid.m_gridNodes(0, 8).y, tolerance); - - ASSERT_NEAR(366824.96156769694, orthogonalizedCurvilinearGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366872.12740536616, orthogonalizedCurvilinearGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366919.18816119258, orthogonalizedCurvilinearGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366964.42115637776, orthogonalizedCurvilinearGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367010.41102564143, orthogonalizedCurvilinearGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367057.91817534604, orthogonalizedCurvilinearGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367106.12547266396, orthogonalizedCurvilinearGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367155.26906854485, orthogonalizedCurvilinearGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367205.43327878905, orthogonalizedCurvilinearGrid.m_gridNodes(1, 8).y, tolerance); + ASSERT_NEAR(79983.796374595549, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(80069.479272425073, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(80153.235772058310, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80234.211288098682, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(80314.661153602894, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + ASSERT_NEAR(80392.150195938390, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + ASSERT_NEAR(80467.771942028790, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80540.898431866168, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80611.260660513333, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + ASSERT_NEAR(80055.196755132944, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80143.960692327732, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80234.924195000407, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80324.849820521486, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80416.240608373060, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80507.596543850144, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80595.526594976516, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80680.087189144266, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80760.998582117099, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(366936.89538054139, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(366994.21866791911, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(367052.51483841456, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367110.61675055756, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(367170.31164987158, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + ASSERT_NEAR(367232.48168405943, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + ASSERT_NEAR(367292.78650072071, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367351.20135266299, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367407.38541954994, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); + + ASSERT_NEAR(366824.96156769694, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366872.12740536616, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366919.18816119258, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366964.42115637776, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367010.41102564143, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367057.91817534604, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367106.12547266396, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367155.26906854485, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367205.43327878905, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); } diff --git a/libs/MeshKernel/tests/src/CurvilinearGridRectangularTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridRectangularTests.cpp index dca7d0811..f7845761d 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridRectangularTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridRectangularTests.cpp @@ -1,5 +1,7 @@ #include +#include "MeshKernel/CurvilinearGrid/CurvilinearGridDeleteExterior.hpp" +#include "MeshKernel/CurvilinearGrid/CurvilinearGridDeleteInterior.hpp" #include #include #include @@ -9,7 +11,7 @@ using namespace meshkernel; -TEST(CurvilinearGridRectangular, CurvilinearGridRectangular_WithPolygon_ShouldComputeCurvilinearGrid) +TEST(CurvilinearGridUniform, CurvilinearGridRectangular_WithPolygon_ShouldComputeCurvilinearGrid) { // Setup std::vector polygonNodes{{0.5, 2.5}, @@ -25,19 +27,19 @@ TEST(CurvilinearGridRectangular, CurvilinearGridRectangular_WithPolygon_ShouldCo const double blockSizeY = 1.0; // Execution - CurvilinearGridRectangular const grid(Projection::cartesian); - const auto curvilinearGrid = std::make_shared(grid.Compute(angle, - blockSizeX, - blockSizeY, - polygons, - 0)); + CurvilinearGridRectangular const curvilinearGridRectangular(Projection::cartesian); + const auto curvilinearGrid = curvilinearGridRectangular.Compute(angle, + blockSizeX, + blockSizeY, + polygons, + 0); // Assert, also invalid nodes and edges are included in the curvilinear grid auto const numValidNodes = CurvilinearGridCountValidNodes(curvilinearGrid); ASSERT_EQ(9, numValidNodes); } -TEST(CurvilinearGridRectangular, MakeCurvilinearInPolygonSpherical) +TEST(CurvilinearGridUniform, MakeCurvilinearInPolygonSpherical) { // Setup std::vector polygonNodes{{302.002502, 472.130371}, @@ -54,19 +56,19 @@ TEST(CurvilinearGridRectangular, MakeCurvilinearInPolygonSpherical) const double blockSizeY = 500.0; // Execution: function not producing grid points because too large block size - CurvilinearGridRectangular const grid(Projection::spherical); - const auto curvilinearGrid = std::make_shared(grid.Compute(angle, - blockSizeX, - blockSizeY, - polygons, - 0)); + CurvilinearGridRectangular curvilinearGridCreateRectangular(Projection::spherical); + const auto grid = curvilinearGridCreateRectangular.Compute(angle, + blockSizeX, + blockSizeY, + polygons, + 0); // Assert - auto const numValidNodes = CurvilinearGridCountValidNodes(curvilinearGrid); + auto const numValidNodes = CurvilinearGridCountValidNodes(grid); ASSERT_EQ(0, numValidNodes); } -TEST(CurvilinearGridRectangular, MakeCurvilinearInEmptyPolygonSpherical) +TEST(CurvilinearGridUniform, MakeCurvilinearInEmptyPolygonSpherical) { // 1 Setup const double angle = 0.0; @@ -78,14 +80,14 @@ TEST(CurvilinearGridRectangular, MakeCurvilinearInEmptyPolygonSpherical) const double blockSizeY = 0.1; // 2 Execution - CurvilinearGridRectangular const grid(Projection::spherical); - const auto [nodes, edges, gridIndices] = grid.Compute(numColumns, - numRows, - originX, - originY, - angle, - blockSizeX, - blockSizeY) + CurvilinearGridRectangular const curvilinearGridCreateRectangular(Projection::spherical); + const auto [nodes, edges, gridIndices] = curvilinearGridCreateRectangular.Compute(numColumns, + numRows, + originX, + originY, + angle, + blockSizeX, + blockSizeY) .ConvertCurvilinearToNodesAndEdges(); Mesh2D mesh(edges, nodes, Projection::spherical); @@ -117,137 +119,137 @@ TEST(CurvilinearGridRectangular, MakeCurvilinearInEmptyPolygonSpherical) ASSERT_EQ(90.0, mesh.m_nodes[7].y); } -TEST(CurvilinearGridRectangularCurvilinearGridRectangular, InsertFace_OnBottomLeft_ShouldInsertFace) +TEST(CurvilinearGridUniformCurvilinearGridUniform, InsertFace_OnBottomLeft_ShouldInsertFace) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); // Execution - curvilinearGrid->InsertFace({80009.0, 366937.0}); + curvilinearGrid.InsertFace({80009.0, 366937.0}); // Assert the new coordinates constexpr double tolerance = 1e-12; - ASSERT_NEAR(79913.595823791460, curvilinearGrid->m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(79985.899758176762, curvilinearGrid->m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(-999.00000000000000, curvilinearGrid->m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(79913.595823791460, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(79985.899758176762, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(-999.00000000000000, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(367046.61206756550, curvilinearGrid->m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(367110.19327267300, curvilinearGrid->m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(-999.0000000000000, curvilinearGrid->m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367046.61206756550, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(367110.19327267300, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(-999.0000000000000, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); } -TEST(CurvilinearGridRectangular, InsertFace_OnBottomRight_ShouldInsertFace) +TEST(CurvilinearGridUniform, InsertFace_OnBottomRight_ShouldInsertFace) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); // Execution - curvilinearGrid->InsertFace({80166.0, 366544.0}); + curvilinearGrid.InsertFace({80166.0, 366544.0}); // Assert the new coordinates constexpr double tolerance = 1e-12; - ASSERT_NEAR(80176.237835892549, curvilinearGrid->m_gridNodes(5, 0).x, tolerance); - ASSERT_NEAR(80259.193944680519, curvilinearGrid->m_gridNodes(5, 1).x, tolerance); - ASSERT_NEAR(-999.0000000000000, curvilinearGrid->m_gridNodes(5, 2).x, tolerance); + ASSERT_NEAR(80176.237835892549, curvilinearGrid.m_gridNodes(5, 0).x, tolerance); + ASSERT_NEAR(80259.193944680519, curvilinearGrid.m_gridNodes(5, 1).x, tolerance); + ASSERT_NEAR(-999.0000000000000, curvilinearGrid.m_gridNodes(5, 2).x, tolerance); - ASSERT_NEAR(366433.98982542212, curvilinearGrid->m_gridNodes(5, 0).y, tolerance); - ASSERT_NEAR(366433.75796857959, curvilinearGrid->m_gridNodes(5, 1).y, tolerance); - ASSERT_NEAR(-999.0000000000000, curvilinearGrid->m_gridNodes(5, 2).y, tolerance); + ASSERT_NEAR(366433.98982542212, curvilinearGrid.m_gridNodes(5, 0).y, tolerance); + ASSERT_NEAR(366433.75796857959, curvilinearGrid.m_gridNodes(5, 1).y, tolerance); + ASSERT_NEAR(-999.0000000000000, curvilinearGrid.m_gridNodes(5, 2).y, tolerance); } -TEST(CurvilinearGridRectangular, InsertFace_OnTopLeft_ShouldInsertFace) +TEST(CurvilinearGridUniform, InsertFace_OnTopLeft_ShouldInsertFace) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); // Execution - curvilinearGrid->InsertFace({80612.0, 367407.0}); + curvilinearGrid.InsertFace({80612.0, 367407.0}); // Assert the new coordinates constexpr double tolerance = 1e-12; - ASSERT_NEAR(-999.0000000000000, curvilinearGrid->m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80385.178875081983, curvilinearGrid->m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80449.954021552709, curvilinearGrid->m_gridNodes(0, 8).x, tolerance); + ASSERT_NEAR(-999.0000000000000, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80385.178875081983, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80449.954021552709, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); - ASSERT_NEAR(-999.0000000000000, curvilinearGrid->m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367549.55640742677, curvilinearGrid->m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367626.58734840894, curvilinearGrid->m_gridNodes(0, 8).y, tolerance); + ASSERT_NEAR(-999.0000000000000, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367549.55640742677, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367626.58734840894, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); } -TEST(CurvilinearGridRectangular, InsertFace_OnTopRight_ShouldInsertFace) +TEST(CurvilinearGridUniform, InsertFace_OnTopRight_ShouldInsertFace) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); // Execution - curvilinearGrid->InsertFace({80870.0, 366541.0}); + curvilinearGrid.InsertFace({80870.0, 366541.0}); // Assert the new coordinates constexpr double tolerance = 1e-12; - ASSERT_NEAR(-999.0000000000000, curvilinearGrid->m_gridNodes(5, 6).x, tolerance); - ASSERT_NEAR(80846.719054016474, curvilinearGrid->m_gridNodes(5, 7).x, tolerance); - ASSERT_NEAR(80959.766315635425, curvilinearGrid->m_gridNodes(5, 8).x, tolerance); + ASSERT_NEAR(-999.0000000000000, curvilinearGrid.m_gridNodes(5, 6).x, tolerance); + ASSERT_NEAR(80846.719054016474, curvilinearGrid.m_gridNodes(5, 7).x, tolerance); + ASSERT_NEAR(80959.766315635425, curvilinearGrid.m_gridNodes(5, 8).x, tolerance); - ASSERT_NEAR(-999.0000000000000, curvilinearGrid->m_gridNodes(5, 6).y, tolerance); - ASSERT_NEAR(366346.42989900074, curvilinearGrid->m_gridNodes(5, 7).y, tolerance); - ASSERT_NEAR(366327.01674911042, curvilinearGrid->m_gridNodes(5, 8).y, tolerance); + ASSERT_NEAR(-999.0000000000000, curvilinearGrid.m_gridNodes(5, 6).y, tolerance); + ASSERT_NEAR(366346.42989900074, curvilinearGrid.m_gridNodes(5, 7).y, tolerance); + ASSERT_NEAR(366327.01674911042, curvilinearGrid.m_gridNodes(5, 8).y, tolerance); } -TEST(CurvilinearGridRectangular, InsertFace_OnGridWithHoles_ShouldInsertFace) +TEST(CurvilinearGridUniform, InsertFace_OnGridWithHoles_ShouldInsertFace) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGridWithMissingFaces(); + auto curvilinearGrid = MakeSmallCurvilinearGridWithMissingFaces(); // Execution - curvilinearGrid->InsertFace({80398.0, 366854.0}); + curvilinearGrid.InsertFace({80398.0, 366854.0}); // Assert the new coordinates constexpr double tolerance = 1e-12; - ASSERT_NEAR(80133.930743945661, curvilinearGrid->m_gridNodes(3, 0).x, tolerance); - ASSERT_NEAR(80226.579454943669, curvilinearGrid->m_gridNodes(3, 1).x, tolerance); - ASSERT_NEAR(80320.396380977647, curvilinearGrid->m_gridNodes(3, 2).x, tolerance); - ASSERT_NEAR(80447.108241179725, curvilinearGrid->m_gridNodes(3, 3).x, tolerance); - ASSERT_NEAR(80545.663179203286, curvilinearGrid->m_gridNodes(3, 4).x, tolerance); - ASSERT_NEAR(80623.151266424975, curvilinearGrid->m_gridNodes(3, 5).x, tolerance); - ASSERT_NEAR(80735.800935924854, curvilinearGrid->m_gridNodes(3, 6).x, tolerance); - ASSERT_NEAR(80848.959456291268, curvilinearGrid->m_gridNodes(3, 7).x, tolerance); - ASSERT_NEAR(80962.132385367571, curvilinearGrid->m_gridNodes(3, 8).x, tolerance); - - ASSERT_NEAR(366629.99913221149, curvilinearGrid->m_gridNodes(3, 0).y, tolerance); - ASSERT_NEAR(366656.00122676318, curvilinearGrid->m_gridNodes(3, 1).y, tolerance); - ASSERT_NEAR(366679.12590409513, curvilinearGrid->m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(366697.14301043766, curvilinearGrid->m_gridNodes(3, 3).y, tolerance); - ASSERT_NEAR(366725.32926280121, curvilinearGrid->m_gridNodes(3, 4).y, tolerance); - ASSERT_NEAR(366718.43748113938, curvilinearGrid->m_gridNodes(3, 5).y, tolerance); - ASSERT_NEAR(366717.43216295895, curvilinearGrid->m_gridNodes(3, 6).y, tolerance); - ASSERT_NEAR(366716.74631036510, curvilinearGrid->m_gridNodes(3, 7).y, tolerance); - ASSERT_NEAR(366718.10475241451, curvilinearGrid->m_gridNodes(3, 8).y, tolerance); + ASSERT_NEAR(80133.930743945661, curvilinearGrid.m_gridNodes(3, 0).x, tolerance); + ASSERT_NEAR(80226.579454943669, curvilinearGrid.m_gridNodes(3, 1).x, tolerance); + ASSERT_NEAR(80320.396380977647, curvilinearGrid.m_gridNodes(3, 2).x, tolerance); + ASSERT_NEAR(80447.108241179725, curvilinearGrid.m_gridNodes(3, 3).x, tolerance); + ASSERT_NEAR(80545.663179203286, curvilinearGrid.m_gridNodes(3, 4).x, tolerance); + ASSERT_NEAR(80623.151266424975, curvilinearGrid.m_gridNodes(3, 5).x, tolerance); + ASSERT_NEAR(80735.800935924854, curvilinearGrid.m_gridNodes(3, 6).x, tolerance); + ASSERT_NEAR(80848.959456291268, curvilinearGrid.m_gridNodes(3, 7).x, tolerance); + ASSERT_NEAR(80962.132385367571, curvilinearGrid.m_gridNodes(3, 8).x, tolerance); + + ASSERT_NEAR(366629.99913221149, curvilinearGrid.m_gridNodes(3, 0).y, tolerance); + ASSERT_NEAR(366656.00122676318, curvilinearGrid.m_gridNodes(3, 1).y, tolerance); + ASSERT_NEAR(366679.12590409513, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(366697.14301043766, curvilinearGrid.m_gridNodes(3, 3).y, tolerance); + ASSERT_NEAR(366725.32926280121, curvilinearGrid.m_gridNodes(3, 4).y, tolerance); + ASSERT_NEAR(366718.43748113938, curvilinearGrid.m_gridNodes(3, 5).y, tolerance); + ASSERT_NEAR(366717.43216295895, curvilinearGrid.m_gridNodes(3, 6).y, tolerance); + ASSERT_NEAR(366716.74631036510, curvilinearGrid.m_gridNodes(3, 7).y, tolerance); + ASSERT_NEAR(366718.10475241451, curvilinearGrid.m_gridNodes(3, 8).y, tolerance); } -TEST(CurvilinearGridRectangular, DeleteNode_OnRectangularGrid_ShouldDeleteNode) +TEST(CurvilinearGridUniform, DeleteNode_OnUniformGrid_ShouldDeleteNode) { // Prepare - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); // Execute - curvilinearGrid->DeleteNode({80398.0, 366854.0}); + curvilinearGrid.DeleteNode({80398.0, 366854.0}); // The number of nodes was 45 now is 44 auto const numValidNodes = CurvilinearGridCountValidNodes(curvilinearGrid); ASSERT_EQ(numValidNodes, 44); } -void TestDeleteInteriorNodes(std::shared_ptr curvilinearGrid, +void TestDeleteInteriorNodes(meshkernel::CurvilinearGrid curvilinearGrid, const meshkernel::CurvilinearGridNodeIndices first, const meshkernel::CurvilinearGridNodeIndices second) { // Check first, that all nodes are valid - for (meshkernel::UInt i = 0; i < curvilinearGrid->m_numN; ++i) + for (meshkernel::UInt i = 0; i < curvilinearGrid.m_numN; ++i) { - for (meshkernel::UInt j = 0; j < curvilinearGrid->m_numM; ++j) + for (meshkernel::UInt j = 0; j < curvilinearGrid.m_numM; ++j) { - EXPECT_TRUE(curvilinearGrid->GetNode(i, j).IsValid()); + EXPECT_TRUE(curvilinearGrid.GetNode(i, j).IsValid()); } } @@ -258,10 +260,13 @@ void TestDeleteInteriorNodes(std::shared_ptr curvil meshkernel::UInt upperLimitJ = std::max(first.m_m, second.m_m) - 1; meshkernel::UInt expectedInvalidated = (upperLimitI - lowerLimitI + 1) * (upperLimitJ - lowerLimitJ + 1); - meshkernel::UInt initialSize = static_cast(CurvilinearGridCountValidNodes(curvilinearGrid)); + const auto initialSize = static_cast(CurvilinearGridCountValidNodes(curvilinearGrid)); + CurvilinearGridDeleteInterior curvilinearGridDeleteInterior(curvilinearGrid); + curvilinearGridDeleteInterior.m_lowerLeft = {lowerLimitJ - 1, lowerLimitI - 1}; + curvilinearGridDeleteInterior.m_upperRight = {upperLimitJ + 1, upperLimitI + 1}; // Delete the nodes interior to a block - curvilinearGrid->DeleteInterior(first, second); + curvilinearGridDeleteInterior.Compute(); auto inRange = [](const meshkernel::UInt v, const meshkernel::UInt l, const meshkernel::UInt u) { return l <= v && v <= u; }; @@ -269,17 +274,17 @@ void TestDeleteInteriorNodes(std::shared_ptr curvil EXPECT_EQ(initialSize - expectedInvalidated, CurvilinearGridCountValidNodes(curvilinearGrid)); // Check that these nodes have been set to invalid. - for (meshkernel::UInt i = 0; i < curvilinearGrid->m_numN; ++i) + for (meshkernel::UInt i = 0; i < curvilinearGrid.m_numN; ++i) { - for (meshkernel::UInt j = 0; j < curvilinearGrid->m_numM; ++j) + for (meshkernel::UInt j = 0; j < curvilinearGrid.m_numM; ++j) { if (inRange(i, lowerLimitI, upperLimitI) && inRange(j, lowerLimitJ, upperLimitJ)) { - EXPECT_FALSE(curvilinearGrid->GetNode(i, j).IsValid()) << "node should be false: " << i << " " << j; + EXPECT_FALSE(curvilinearGrid.GetNode(i, j).IsValid()) << "node should be false: " << i << " " << j; } else { - EXPECT_TRUE(curvilinearGrid->GetNode(i, j).IsValid()) << "node should be true: " << i << " " << j; + EXPECT_TRUE(curvilinearGrid.GetNode(i, j).IsValid()) << "node should be true: " << i << " " << j; } } } @@ -290,7 +295,7 @@ TEST(CurvilinearGridUniform, DeleteInteriorNodesTest) // Basic, testing of setting nodes inside a box to invalid meshkernel::UInt nx = 10; meshkernel::UInt ny = 10; - std::shared_ptr curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); TestDeleteInteriorNodes(curvilinearGrid, {1, 1}, {4, 4}); // Reset the mesh @@ -310,7 +315,7 @@ TEST(CurvilinearGridUniform, DeleteInteriorNodesReverseTest) meshkernel::UInt ny = 10; // Prepare - std::shared_ptr curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); TestDeleteInteriorNodes(curvilinearGrid, {5, 6}, {1, 2}); // Reset the mesh @@ -325,7 +330,7 @@ TEST(CurvilinearGridUniform, DeleteInteriorNodesMixedTest) meshkernel::UInt nx = 100; meshkernel::UInt ny = 100; - std::shared_ptr curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); TestDeleteInteriorNodes(curvilinearGrid, {5, 1}, {1, 6}); // Reset grid @@ -341,10 +346,132 @@ TEST(CurvilinearGridUniform, DeleteInteriorNodesFailureTest) meshkernel::UInt ny = 10; // Prepare - std::shared_ptr curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + CurvilinearGridDeleteInterior curvilinearGridDeleteInterior(curvilinearGrid); + + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{1, meshkernel::constants::missing::uintValue}, CurvilinearGridNodeIndices{nx, ny}), meshkernel::ConstraintError); + + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{1, 1}, CurvilinearGridNodeIndices{meshkernel::constants::missing::uintValue, ny}), meshkernel::ConstraintError); + + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{1, 1}, CurvilinearGridNodeIndices{nx, ny}), meshkernel::ConstraintError); + + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{10, 1}, CurvilinearGridNodeIndices{4, 4}), meshkernel::ConstraintError); +} + +void TestDeleteExteriorNodes(meshkernel::CurvilinearGrid& curvilinearGrid, + const meshkernel::CurvilinearGridNodeIndices first, + const meshkernel::CurvilinearGridNodeIndices second) +{ + // Check first, that all nodes are valid + for (meshkernel::UInt i = 0; i < curvilinearGrid.m_numN; ++i) + { + for (meshkernel::UInt j = 0; j < curvilinearGrid.m_numM; ++j) + { + EXPECT_TRUE(curvilinearGrid.GetNode(i, j).IsValid()); + } + } + + meshkernel::UInt lowerLimitI = std::min(first.m_n, second.m_n); + meshkernel::UInt upperLimitI = std::max(first.m_n, second.m_n); + + meshkernel::UInt lowerLimitJ = std::min(first.m_m, second.m_m); + meshkernel::UInt upperLimitJ = std::max(first.m_m, second.m_m); + + meshkernel::UInt expectedValid = (upperLimitI - lowerLimitI + 1) * (upperLimitJ - lowerLimitJ + 1); + + CurvilinearGridDeleteExterior curvilinearGridDeleteExterior(curvilinearGrid); + curvilinearGridDeleteExterior.m_lowerLeft = {lowerLimitJ, lowerLimitI}; + curvilinearGridDeleteExterior.m_upperRight = {upperLimitJ, upperLimitI}; + + // Delete the nodes outside of a block + curvilinearGridDeleteExterior.Compute(); + + auto inRange = [](const meshkernel::UInt v, const meshkernel::UInt l, const meshkernel::UInt u) + { return l <= v && v <= u; }; + + EXPECT_EQ(expectedValid, CurvilinearGridCountValidNodes(curvilinearGrid)); + + // Check that these exterior nodes have been set to invalid. + for (meshkernel::UInt i = 0; i < curvilinearGrid.m_numN; ++i) + { + for (meshkernel::UInt j = 0; j < curvilinearGrid.m_numM; ++j) + { + if (inRange(i, lowerLimitI, upperLimitI) && inRange(j, lowerLimitJ, upperLimitJ)) + { + EXPECT_TRUE(curvilinearGrid.GetNode(i, j).IsValid()) << "node should be true: " << i << " " << j; + } + else + { + EXPECT_FALSE(curvilinearGrid.GetNode(i, j).IsValid()) << "node should be false: " << i << " " << j; + } + } + } +} + +TEST(CurvilinearGridUniform, DeleteExteriorNodesTest) +{ + // Basic, testing of setting nodes inside a box to invalid + meshkernel::UInt nx = 10; + meshkernel::UInt ny = 10; + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + TestDeleteExteriorNodes(curvilinearGrid, {1, 1}, {4, 4}); + + // Reset the mesh + curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + TestDeleteExteriorNodes(curvilinearGrid, {2, 1}, {5, 4}); + + // Reset the mesh + curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + TestDeleteExteriorNodes(curvilinearGrid, {4, 3}, {7, 8}); +} + +TEST(CurvilinearGridUniform, DeleteExteriorNodesReverseTest) +{ + // testing of setting nodes inside a box to invalid, with lower and upper reversed + + meshkernel::UInt nx = 10; + meshkernel::UInt ny = 10; + + // Prepare + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + TestDeleteExteriorNodes(curvilinearGrid, {5, 6}, {1, 2}); + + // Reset the mesh + curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + TestDeleteExteriorNodes(curvilinearGrid, {5, 6}, {0, 4}); +} + +TEST(CurvilinearGridUniform, DeleteExteriorNodesMixedTest) +{ + // testing of setting nodes inside a box to invalid, with lower and upper reversed for any of i and j index + + meshkernel::UInt nx = 100; + meshkernel::UInt ny = 100; + + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + TestDeleteExteriorNodes(curvilinearGrid, {5, 1}, {1, 6}); + + // Reset grid + curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + TestDeleteExteriorNodes(curvilinearGrid, {1, 6}, {5, 2}); +} + +TEST(CurvilinearGridUniform, DeleteExteriorNodesFailureTest) +{ + // testing of setting nodes inside a box to invalid with invalid or out of range indices. + + meshkernel::UInt nx = 10; + meshkernel::UInt ny = 10; + + // Prepare + auto curvilinearGrid = MakeCurvilinearGrid(0.0, 0.0, 1.0, 1.0, nx, ny); + CurvilinearGridDeleteExterior curvilinearGridDeleteExterior(curvilinearGrid); + + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{1, meshkernel::constants::missing::uintValue}, CurvilinearGridNodeIndices{nx, ny}), meshkernel::ConstraintError); + + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{1, 1}, CurvilinearGridNodeIndices{meshkernel::constants::missing::uintValue, ny}), meshkernel::ConstraintError); + + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{1, 1}, CurvilinearGridNodeIndices{nx, ny}), meshkernel::ConstraintError); - EXPECT_THROW(curvilinearGrid->DeleteInterior({1, meshkernel::constants::missing::uintValue}, {nx, ny}), meshkernel::ConstraintError); - EXPECT_THROW(curvilinearGrid->DeleteInterior({1, 1}, {meshkernel::constants::missing::uintValue, ny}), meshkernel::ConstraintError); - EXPECT_THROW(curvilinearGrid->DeleteInterior({1, 1}, {nx, ny}), meshkernel::ConstraintError); - EXPECT_THROW(curvilinearGrid->DeleteInterior({nx, 1}, {4, 4}), meshkernel::ConstraintError); + EXPECT_THROW(curvilinearGrid.ComputeBlockFromCornerPoints(CurvilinearGridNodeIndices{nx, 1}, CurvilinearGridNodeIndices{4, 4}), meshkernel::ConstraintError); } diff --git a/libs/MeshKernel/tests/src/CurvilinearGridRefinementTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridRefinementTests.cpp index fc80caeca..c56fec19f 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridRefinementTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridRefinementTests.cpp @@ -15,38 +15,38 @@ TEST(CurvilinearGridRefinement, Compute_OnCurvilinearGrid_ShouldRefine) Point{20, 0}, Point{20, 10}, Point{20, 20}, Point{20, 30}, Point{30, 0}, Point{30, 10}, Point{30, 20}, Point{30, 30}; - const auto curvilinearGrid = std::make_shared(grid, Projection::cartesian); + CurvilinearGrid curvilinearGrid(grid, Projection::cartesian); CurvilinearGridRefinement curvilinearGridRefinement(curvilinearGrid, 10); curvilinearGridRefinement.SetBlock({10, 20}, {20, 20}); // Execute - const auto refinedGrid = curvilinearGridRefinement.Compute(); + curvilinearGridRefinement.Compute(); // Assert - ASSERT_EQ(13, refinedGrid.m_numM); - ASSERT_EQ(4, refinedGrid.m_numN); + ASSERT_EQ(13, curvilinearGrid.m_numM); + ASSERT_EQ(4, curvilinearGrid.m_numN); constexpr double tolerance = 1e-12; - ASSERT_NEAR(0.0, refinedGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(10.0, refinedGrid.m_gridNodes(1, 0).x, tolerance); - - ASSERT_NEAR(11.0, refinedGrid.m_gridNodes(2, 0).x, tolerance); - ASSERT_NEAR(12.0, refinedGrid.m_gridNodes(3, 0).x, tolerance); - ASSERT_NEAR(13.0, refinedGrid.m_gridNodes(4, 0).x, tolerance); - ASSERT_NEAR(14.0, refinedGrid.m_gridNodes(5, 0).x, tolerance); - ASSERT_NEAR(15.0, refinedGrid.m_gridNodes(6, 0).x, tolerance); - ASSERT_NEAR(16.0, refinedGrid.m_gridNodes(7, 0).x, tolerance); - ASSERT_NEAR(17.0, refinedGrid.m_gridNodes(8, 0).x, tolerance); - ASSERT_NEAR(18.0, refinedGrid.m_gridNodes(9, 0).x, tolerance); - ASSERT_NEAR(19.0, refinedGrid.m_gridNodes(10, 0).x, tolerance); - - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(11, 0).x, tolerance); - ASSERT_NEAR(30.0, refinedGrid.m_gridNodes(12, 0).x, tolerance); - - ASSERT_NEAR(0.0, refinedGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(10.0, refinedGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(30.0, refinedGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + + ASSERT_NEAR(11.0, curvilinearGrid.m_gridNodes(2, 0).x, tolerance); + ASSERT_NEAR(12.0, curvilinearGrid.m_gridNodes(3, 0).x, tolerance); + ASSERT_NEAR(13.0, curvilinearGrid.m_gridNodes(4, 0).x, tolerance); + ASSERT_NEAR(14.0, curvilinearGrid.m_gridNodes(5, 0).x, tolerance); + ASSERT_NEAR(15.0, curvilinearGrid.m_gridNodes(6, 0).x, tolerance); + ASSERT_NEAR(16.0, curvilinearGrid.m_gridNodes(7, 0).x, tolerance); + ASSERT_NEAR(17.0, curvilinearGrid.m_gridNodes(8, 0).x, tolerance); + ASSERT_NEAR(18.0, curvilinearGrid.m_gridNodes(9, 0).x, tolerance); + ASSERT_NEAR(19.0, curvilinearGrid.m_gridNodes(10, 0).x, tolerance); + + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(11, 0).x, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(12, 0).x, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); } TEST(CurvilinearGridRefinement, Compute_OnCurvilinearGridWithMissingFaces_ShouldRefine) @@ -61,60 +61,60 @@ TEST(CurvilinearGridRefinement, Compute_OnCurvilinearGridWithMissingFaces_Should Point{40, 0}, Point{40, 10}, Point{40, 20}, Point{40, 30}, Point{50, 0}, Point{50, 10}, Point{50, 20}, Point{50, 30}; - const auto curvilinearGrid = std::make_shared(grid, Projection::cartesian); + CurvilinearGrid curvilinearGrid(grid, Projection::cartesian); CurvilinearGridRefinement curvilinearGridRefinement(curvilinearGrid, 10); curvilinearGridRefinement.SetBlock({10, 20}, {20, 20}); // Execute - const auto refinedGrid = curvilinearGridRefinement.Compute(); + curvilinearGridRefinement.Compute(); // Assert - ASSERT_EQ(15, refinedGrid.m_numM); - ASSERT_EQ(4, refinedGrid.m_numN); + ASSERT_EQ(15, curvilinearGrid.m_numM); + ASSERT_EQ(4, curvilinearGrid.m_numN); constexpr double tolerance = 1e-12; // vertical gridline 0 - ASSERT_NEAR(0.0, refinedGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(0.0, refinedGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(0.0, refinedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(0.0, refinedGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(0.0, refinedGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(10.0, refinedGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(30.0, refinedGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); // vertical gridline 2 - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(2, 0).x, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(2, 1).x, tolerance); - ASSERT_NEAR(11.0, refinedGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(11.0, refinedGrid.m_gridNodes(2, 3).x, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(2, 0).x, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(2, 1).x, tolerance); + ASSERT_NEAR(11.0, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(11.0, curvilinearGrid.m_gridNodes(2, 3).x, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(3, 0).y, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(3, 1).y, tolerance); - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(30.0, refinedGrid.m_gridNodes(3, 3).y, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(3, 0).y, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(3, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 3).y, tolerance); // vertical gridline 10 - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(10, 0).x, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(10, 1).x, tolerance); - ASSERT_NEAR(19.0, refinedGrid.m_gridNodes(10, 2).x, tolerance); - ASSERT_NEAR(19.0, refinedGrid.m_gridNodes(10, 3).x, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(10, 0).x, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(10, 1).x, tolerance); + ASSERT_NEAR(19.0, curvilinearGrid.m_gridNodes(10, 2).x, tolerance); + ASSERT_NEAR(19.0, curvilinearGrid.m_gridNodes(10, 3).x, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(10, 0).y, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(10, 1).y, tolerance); - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(10, 2).y, tolerance); - ASSERT_NEAR(30.0, refinedGrid.m_gridNodes(10, 3).y, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(10, 0).y, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(10, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(10, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(10, 3).y, tolerance); // vertical gridline 11 - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(11, 0).x, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(11, 1).x, tolerance); - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(11, 2).x, tolerance); - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(11, 3).x, tolerance); - - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(11, 0).y, tolerance); - ASSERT_NEAR(constants::missing::doubleValue, refinedGrid.m_gridNodes(11, 1).y, tolerance); - ASSERT_NEAR(20.0, refinedGrid.m_gridNodes(11, 2).y, tolerance); - ASSERT_NEAR(30.0, refinedGrid.m_gridNodes(11, 3).y, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(11, 0).x, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(11, 1).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(11, 2).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(11, 3).x, tolerance); + + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(11, 0).y, tolerance); + ASSERT_NEAR(constants::missing::doubleValue, curvilinearGrid.m_gridNodes(11, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(11, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(11, 3).y, tolerance); } diff --git a/libs/MeshKernel/tests/src/CurvilinearGridSmoothingTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridSmoothingTests.cpp index e6168e7c7..281bb3047 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridSmoothingTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridSmoothingTests.cpp @@ -17,255 +17,254 @@ TEST(CurvilinearGridSmoothing, Compute_OnSmoothCurvilinearGrid_ShouldNotSmoothGr Point{20, 0}, Point{20, 10}, Point{20, 20}, Point{20, 30}, Point{30, 0}, Point{30, 10}, Point{30, 20}, Point{30, 30}; - const auto curvilinearGrid = std::make_shared(grid, Projection::cartesian); - + CurvilinearGrid curvilinearGrid(grid, Projection::cartesian); CurvilinearGridSmoothing curvilinearGridSmoothing(curvilinearGrid, 10); // Execute curvilinearGridSmoothing.SetBlock({0, 0}, {30, 30}); - const auto smoothedGrid = curvilinearGridSmoothing.Compute(); + curvilinearGridSmoothing.Compute(); // Assert nodes are on the same location because the grid is already smooth constexpr double tolerance = 1e-6; - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(0, 3).x, tolerance); - - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(1, 3).x, tolerance); - - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(2, 0).x, tolerance); - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(2, 1).x, tolerance); - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(2, 3).x, tolerance); - - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(3, 0).x, tolerance); - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(3, 1).x, tolerance); - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(3, 2).x, tolerance); - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(3, 3).x, tolerance); - - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(0, 3).y, tolerance); - - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(1, 3).y, tolerance); - - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(2, 0).y, tolerance); - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(2, 1).y, tolerance); - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(2, 2).y, tolerance); - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(2, 3).y, tolerance); - - ASSERT_NEAR(0.0, smoothedGrid.m_gridNodes(3, 0).y, tolerance); - ASSERT_NEAR(10.0, smoothedGrid.m_gridNodes(3, 1).y, tolerance); - ASSERT_NEAR(20.0, smoothedGrid.m_gridNodes(3, 2).y, tolerance); - ASSERT_NEAR(30.0, smoothedGrid.m_gridNodes(3, 3).y, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 0).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 1).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 3).x, tolerance); + + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 0).x, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 1).x, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 2).x, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 3).x, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(2, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(2, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(2, 3).y, tolerance); + + ASSERT_NEAR(0.0, curvilinearGrid.m_gridNodes(3, 0).y, tolerance); + ASSERT_NEAR(10.0, curvilinearGrid.m_gridNodes(3, 1).y, tolerance); + ASSERT_NEAR(20.0, curvilinearGrid.m_gridNodes(3, 2).y, tolerance); + ASSERT_NEAR(30.0, curvilinearGrid.m_gridNodes(3, 3).y, tolerance); } TEST(CurvilinearGridSmoothing, Compute_OnONonSmoothCurvilinearGrid_ShouldSmoothGrid) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); CurvilinearGridSmoothing curvilinearGridSmoothing(curvilinearGrid, 10); // Execute curvilinearGridSmoothing.SetBlock({80154, 366530}, {80610, 367407}); - const auto smoothedGrid = curvilinearGridSmoothing.Compute(); + curvilinearGridSmoothing.Compute(); // Assert constexpr double tolerance = 1e-6; - ASSERT_NEAR(79983.796374595549, smoothedGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(80060.011105254613, smoothedGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(80137.131323077789, smoothedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80214.289133171449, smoothedGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(80290.623313344797, smoothedGrid.m_gridNodes(0, 4).x, tolerance); - ASSERT_NEAR(80364.411459799783, smoothedGrid.m_gridNodes(0, 5).x, tolerance); - ASSERT_NEAR(80440.632944042736, smoothedGrid.m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80521.863482944755, smoothedGrid.m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80611.260660513333, smoothedGrid.m_gridNodes(0, 8).x, tolerance); - - ASSERT_NEAR(80049.839878894229, smoothedGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80126.599628477867, smoothedGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80209.094215192861, smoothedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80293.744880346814, smoothedGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80379.324140649813, smoothedGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80465.542584239694, smoothedGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80554.276324305538, smoothedGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80648.676638649602, smoothedGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80756.869964790196, smoothedGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(366936.89538054139, smoothedGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(366987.83821424743, smoothedGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(367041.23176860309, smoothedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(367096.32094200718, smoothedGrid.m_gridNodes(0, 3).y, tolerance); - ASSERT_NEAR(367152.27534010477, smoothedGrid.m_gridNodes(0, 4).y, tolerance); - ASSERT_NEAR(367210.34624999913, smoothedGrid.m_gridNodes(0, 5).y, tolerance); - ASSERT_NEAR(367271.13533544831, smoothedGrid.m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367335.99776061886, smoothedGrid.m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367407.38541954994, smoothedGrid.m_gridNodes(0, 8).y, tolerance); - - ASSERT_NEAR(366833.73477307899, smoothedGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366875.95830515033, smoothedGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366920.06335723272, smoothedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366964.51932115341, smoothedGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367008.36165438319, smoothedGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367051.96991358045, smoothedGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367097.07280781888, smoothedGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367147.66697242024, smoothedGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367208.53384889866, smoothedGrid.m_gridNodes(1, 8).y, tolerance); + ASSERT_NEAR(79983.796374595549, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(80060.011105254613, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(80137.131323077789, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80214.289133171449, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(80290.623313344797, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + ASSERT_NEAR(80364.411459799783, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + ASSERT_NEAR(80440.632944042736, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80521.863482944755, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80611.260660513333, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + ASSERT_NEAR(80049.839878894229, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80126.599628477867, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80209.094215192861, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80293.744880346814, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80379.324140649813, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80465.542584239694, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80554.276324305538, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80648.676638649602, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80756.869964790196, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(366936.89538054139, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(366987.83821424743, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(367041.23176860309, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367096.32094200718, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(367152.27534010477, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + ASSERT_NEAR(367210.34624999913, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + ASSERT_NEAR(367271.13533544831, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367335.99776061886, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367407.38541954994, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); + + ASSERT_NEAR(366833.73477307899, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366875.95830515033, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366920.06335723272, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366964.51932115341, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367008.36165438319, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367051.96991358045, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367097.07280781888, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367147.66697242024, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367208.53384889866, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); } TEST(CurvilinearGridSmoothing, Compute_OnONonSmoothCurvilinearGridWithMissingElements_ShouldSmoothGrid) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGridWithMissingFaces(); + auto curvilinearGrid = MakeSmallCurvilinearGridWithMissingFaces(); CurvilinearGridSmoothing curvilinearGridSmoothing(curvilinearGrid, 10); // Execute curvilinearGridSmoothing.SetBlock({80154, 366530}, {80610, 367407}); - const auto smoothedGrid = curvilinearGridSmoothing.Compute(); + curvilinearGridSmoothing.Compute(); // Assert constexpr double tolerance = 1e-6; - ASSERT_NEAR(79983.796374595549, smoothedGrid.m_gridNodes(0, 0).x, tolerance); - ASSERT_NEAR(80060.788799524904, smoothedGrid.m_gridNodes(0, 1).x, tolerance); - ASSERT_NEAR(80138.938885926123, smoothedGrid.m_gridNodes(0, 2).x, tolerance); - ASSERT_NEAR(80216.491022095070, smoothedGrid.m_gridNodes(0, 3).x, tolerance); - ASSERT_NEAR(80293.293375308422, smoothedGrid.m_gridNodes(0, 4).x, tolerance); - ASSERT_NEAR(80367.153256326288, smoothedGrid.m_gridNodes(0, 5).x, tolerance); - ASSERT_NEAR(80441.975289048860, smoothedGrid.m_gridNodes(0, 6).x, tolerance); - ASSERT_NEAR(80522.272230797375, smoothedGrid.m_gridNodes(0, 7).x, tolerance); - ASSERT_NEAR(80611.260660513333, smoothedGrid.m_gridNodes(0, 8).x, tolerance); - - ASSERT_NEAR(80050.309286359756, smoothedGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80129.710469510028, smoothedGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80217.157476954410, smoothedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80301.619921323407, smoothedGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80387.883340666624, smoothedGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80476.978522055375, smoothedGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80558.979514368868, smoothedGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80649.960798514221, smoothedGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80756.940464565720, smoothedGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(80098.932488001548, smoothedGrid.m_gridNodes(2, 0).x, tolerance); - ASSERT_NEAR(80186.124532376241, smoothedGrid.m_gridNodes(2, 1).x, tolerance); - ASSERT_NEAR(80292.449108019704, smoothedGrid.m_gridNodes(2, 2).x, tolerance); - ASSERT_NEAR(80375.822861451976, smoothedGrid.m_gridNodes(2, 3).x, tolerance); - ASSERT_NEAR(80468.946809326764, smoothedGrid.m_gridNodes(2, 4).x, tolerance); - ASSERT_NEAR(80583.120607369667, smoothedGrid.m_gridNodes(2, 5).x, tolerance); - ASSERT_NEAR(80652.102309464681, smoothedGrid.m_gridNodes(2, 6).x, tolerance); - ASSERT_NEAR(80749.982910696970, smoothedGrid.m_gridNodes(2, 7).x, tolerance); - ASSERT_NEAR(80871.931419427943, smoothedGrid.m_gridNodes(2, 8).x, tolerance); - - ASSERT_NEAR(366936.89538054139, smoothedGrid.m_gridNodes(0, 0).y, tolerance); - ASSERT_NEAR(366988.35803436005, smoothedGrid.m_gridNodes(0, 1).y, tolerance); - ASSERT_NEAR(367042.48402813828, smoothedGrid.m_gridNodes(0, 2).y, tolerance); - ASSERT_NEAR(367097.89403811248, smoothedGrid.m_gridNodes(0, 3).y, tolerance); - ASSERT_NEAR(367154.23426078091, smoothedGrid.m_gridNodes(0, 4).y, tolerance); - ASSERT_NEAR(367212.51011039014, smoothedGrid.m_gridNodes(0, 5).y, tolerance); - ASSERT_NEAR(367272.20589329768, smoothedGrid.m_gridNodes(0, 6).y, tolerance); - ASSERT_NEAR(367336.32413904829, smoothedGrid.m_gridNodes(0, 7).y, tolerance); - ASSERT_NEAR(367407.38541954994, smoothedGrid.m_gridNodes(0, 8).y, tolerance); - - ASSERT_NEAR(366833.00155397120, smoothedGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366875.36856874428, smoothedGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366919.22743417800, smoothedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366964.89754991967, smoothedGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367010.93790833943, smoothedGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367054.20807785576, smoothedGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367097.95891073684, smoothedGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367147.87982618762, smoothedGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367208.42653128889, smoothedGrid.m_gridNodes(1, 8).y, tolerance); - - ASSERT_NEAR(366729.04871992749, smoothedGrid.m_gridNodes(2, 0).y, tolerance); - ASSERT_NEAR(366761.65380535304, smoothedGrid.m_gridNodes(2, 1).y, tolerance); - ASSERT_NEAR(366792.50812354451, smoothedGrid.m_gridNodes(2, 2).y, tolerance); - ASSERT_NEAR(366827.70632165857, smoothedGrid.m_gridNodes(2, 3).y, tolerance); - ASSERT_NEAR(366865.78532145533, smoothedGrid.m_gridNodes(2, 4).y, tolerance); - ASSERT_NEAR(366891.62363194284, smoothedGrid.m_gridNodes(2, 5).y, tolerance); - ASSERT_NEAR(366916.02815869858, smoothedGrid.m_gridNodes(2, 6).y, tolerance); - ASSERT_NEAR(366948.34436165588, smoothedGrid.m_gridNodes(2, 7).y, tolerance); - ASSERT_NEAR(366996.75152488949, smoothedGrid.m_gridNodes(2, 8).y, tolerance); + ASSERT_NEAR(79983.796374595549, curvilinearGrid.m_gridNodes(0, 0).x, tolerance); + ASSERT_NEAR(80060.788799524904, curvilinearGrid.m_gridNodes(0, 1).x, tolerance); + ASSERT_NEAR(80138.938885926123, curvilinearGrid.m_gridNodes(0, 2).x, tolerance); + ASSERT_NEAR(80216.491022095070, curvilinearGrid.m_gridNodes(0, 3).x, tolerance); + ASSERT_NEAR(80293.293375308422, curvilinearGrid.m_gridNodes(0, 4).x, tolerance); + ASSERT_NEAR(80367.153256326288, curvilinearGrid.m_gridNodes(0, 5).x, tolerance); + ASSERT_NEAR(80441.975289048860, curvilinearGrid.m_gridNodes(0, 6).x, tolerance); + ASSERT_NEAR(80522.272230797375, curvilinearGrid.m_gridNodes(0, 7).x, tolerance); + ASSERT_NEAR(80611.260660513333, curvilinearGrid.m_gridNodes(0, 8).x, tolerance); + + ASSERT_NEAR(80050.309286359756, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80129.710469510028, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80217.157476954410, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80301.619921323407, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80387.883340666624, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80476.978522055375, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80558.979514368868, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80649.960798514221, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80756.940464565720, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(80098.932488001548, curvilinearGrid.m_gridNodes(2, 0).x, tolerance); + ASSERT_NEAR(80186.124532376241, curvilinearGrid.m_gridNodes(2, 1).x, tolerance); + ASSERT_NEAR(80292.449108019704, curvilinearGrid.m_gridNodes(2, 2).x, tolerance); + ASSERT_NEAR(80375.822861451976, curvilinearGrid.m_gridNodes(2, 3).x, tolerance); + ASSERT_NEAR(80468.946809326764, curvilinearGrid.m_gridNodes(2, 4).x, tolerance); + ASSERT_NEAR(80583.120607369667, curvilinearGrid.m_gridNodes(2, 5).x, tolerance); + ASSERT_NEAR(80652.102309464681, curvilinearGrid.m_gridNodes(2, 6).x, tolerance); + ASSERT_NEAR(80749.982910696970, curvilinearGrid.m_gridNodes(2, 7).x, tolerance); + ASSERT_NEAR(80871.931419427943, curvilinearGrid.m_gridNodes(2, 8).x, tolerance); + + ASSERT_NEAR(366936.89538054139, curvilinearGrid.m_gridNodes(0, 0).y, tolerance); + ASSERT_NEAR(366988.35803436005, curvilinearGrid.m_gridNodes(0, 1).y, tolerance); + ASSERT_NEAR(367042.48402813828, curvilinearGrid.m_gridNodes(0, 2).y, tolerance); + ASSERT_NEAR(367097.89403811248, curvilinearGrid.m_gridNodes(0, 3).y, tolerance); + ASSERT_NEAR(367154.23426078091, curvilinearGrid.m_gridNodes(0, 4).y, tolerance); + ASSERT_NEAR(367212.51011039014, curvilinearGrid.m_gridNodes(0, 5).y, tolerance); + ASSERT_NEAR(367272.20589329768, curvilinearGrid.m_gridNodes(0, 6).y, tolerance); + ASSERT_NEAR(367336.32413904829, curvilinearGrid.m_gridNodes(0, 7).y, tolerance); + ASSERT_NEAR(367407.38541954994, curvilinearGrid.m_gridNodes(0, 8).y, tolerance); + + ASSERT_NEAR(366833.00155397120, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366875.36856874428, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366919.22743417800, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366964.89754991967, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367010.93790833943, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367054.20807785576, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367097.95891073684, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367147.87982618762, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367208.42653128889, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); + + ASSERT_NEAR(366729.04871992749, curvilinearGrid.m_gridNodes(2, 0).y, tolerance); + ASSERT_NEAR(366761.65380535304, curvilinearGrid.m_gridNodes(2, 1).y, tolerance); + ASSERT_NEAR(366792.50812354451, curvilinearGrid.m_gridNodes(2, 2).y, tolerance); + ASSERT_NEAR(366827.70632165857, curvilinearGrid.m_gridNodes(2, 3).y, tolerance); + ASSERT_NEAR(366865.78532145533, curvilinearGrid.m_gridNodes(2, 4).y, tolerance); + ASSERT_NEAR(366891.62363194284, curvilinearGrid.m_gridNodes(2, 5).y, tolerance); + ASSERT_NEAR(366916.02815869858, curvilinearGrid.m_gridNodes(2, 6).y, tolerance); + ASSERT_NEAR(366948.34436165588, curvilinearGrid.m_gridNodes(2, 7).y, tolerance); + ASSERT_NEAR(366996.75152488949, curvilinearGrid.m_gridNodes(2, 8).y, tolerance); } TEST(CurvilinearGridSmoothing, ComputedDirectionalSmooth_OnMDrirection_ShouldSmoothGrid) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); CurvilinearGridSmoothing curvilinearGridSmoothing(curvilinearGrid, 10); curvilinearGridSmoothing.SetLine({80143, 367041}, {80333, 366553}); curvilinearGridSmoothing.SetBlock({80199, 366749}, {80480, 366869}); // Execute - const auto smoothedGrid = curvilinearGridSmoothing.ComputeDirectional(); + curvilinearGridSmoothing.ComputeDirectional(); // Assert constexpr double tolerance = 1e-6; - ASSERT_NEAR(80053.996925399639, smoothedGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80144.732940478571, smoothedGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80222.990051062123, smoothedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80314.427829118606, smoothedGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80414.057391982613, smoothedGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80505.096476712482, smoothedGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80595.183339827883, smoothedGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80684.333994102650, smoothedGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80772.567299473958, smoothedGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(366827.17869351729, smoothedGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366872.58359778317, smoothedGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366936.38429752010, smoothedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366981.06765786058, smoothedGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367015.14849423966, smoothedGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367056.48898898275, smoothedGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367099.12347147451, smoothedGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367143.03018172452, smoothedGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367188.18349069095, smoothedGrid.m_gridNodes(1, 8).y, tolerance); + ASSERT_NEAR(80053.996925399639, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80144.732940478571, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80222.990051062123, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80314.427829118606, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80414.057391982613, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80505.096476712482, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80595.183339827883, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80684.333994102650, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80772.567299473958, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(366827.17869351729, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366872.58359778317, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366936.38429752010, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366981.06765786058, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367015.14849423966, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367056.48898898275, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367099.12347147451, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367143.03018172452, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367188.18349069095, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); } TEST(CurvilinearGridSmoothing, ComputedDirectionalSmooth_OnNDrirection_ShouldSmoothGrid) { // Set-up - const auto curvilinearGrid = MakeSmallCurvilinearGrid(); + auto curvilinearGrid = MakeSmallCurvilinearGrid(); CurvilinearGridSmoothing curvilinearGridSmoothing(curvilinearGrid, 10); curvilinearGridSmoothing.SetLine({80199, 366749}, {80480, 366869}); curvilinearGridSmoothing.SetBlock({80143, 367041}, {80333, 366553}); // Execute - const auto smoothedGrid = curvilinearGridSmoothing.ComputeDirectional(); + curvilinearGridSmoothing.ComputeDirectional(); // Assert constexpr double tolerance = 1e-6; - ASSERT_NEAR(80053.996925399639, smoothedGrid.m_gridNodes(1, 0).x, tolerance); - ASSERT_NEAR(80144.692538122108, smoothedGrid.m_gridNodes(1, 1).x, tolerance); - ASSERT_NEAR(80234.737077531070, smoothedGrid.m_gridNodes(1, 2).x, tolerance); - ASSERT_NEAR(80324.189331719666, smoothedGrid.m_gridNodes(1, 3).x, tolerance); - ASSERT_NEAR(80413.125110631052, smoothedGrid.m_gridNodes(1, 4).x, tolerance); - ASSERT_NEAR(80505.096476712482, smoothedGrid.m_gridNodes(1, 5).x, tolerance); - ASSERT_NEAR(80595.183339827883, smoothedGrid.m_gridNodes(1, 6).x, tolerance); - ASSERT_NEAR(80684.333994102650, smoothedGrid.m_gridNodes(1, 7).x, tolerance); - ASSERT_NEAR(80772.567299473958, smoothedGrid.m_gridNodes(1, 8).x, tolerance); - - ASSERT_NEAR(366827.17869351729, smoothedGrid.m_gridNodes(1, 0).y, tolerance); - ASSERT_NEAR(366872.56390471710, smoothedGrid.m_gridNodes(1, 1).y, tolerance); - ASSERT_NEAR(366919.09182483586, smoothedGrid.m_gridNodes(1, 2).y, tolerance); - ASSERT_NEAR(366966.51416593988, smoothedGrid.m_gridNodes(1, 3).y, tolerance); - ASSERT_NEAR(367014.64392142039, smoothedGrid.m_gridNodes(1, 4).y, tolerance); - ASSERT_NEAR(367056.48898898275, smoothedGrid.m_gridNodes(1, 5).y, tolerance); - ASSERT_NEAR(367099.12347147451, smoothedGrid.m_gridNodes(1, 6).y, tolerance); - ASSERT_NEAR(367143.03018172452, smoothedGrid.m_gridNodes(1, 7).y, tolerance); - ASSERT_NEAR(367188.18349069095, smoothedGrid.m_gridNodes(1, 8).y, tolerance); + ASSERT_NEAR(80053.996925399639, curvilinearGrid.m_gridNodes(1, 0).x, tolerance); + ASSERT_NEAR(80144.692538122108, curvilinearGrid.m_gridNodes(1, 1).x, tolerance); + ASSERT_NEAR(80234.737077531070, curvilinearGrid.m_gridNodes(1, 2).x, tolerance); + ASSERT_NEAR(80324.189331719666, curvilinearGrid.m_gridNodes(1, 3).x, tolerance); + ASSERT_NEAR(80413.125110631052, curvilinearGrid.m_gridNodes(1, 4).x, tolerance); + ASSERT_NEAR(80505.096476712482, curvilinearGrid.m_gridNodes(1, 5).x, tolerance); + ASSERT_NEAR(80595.183339827883, curvilinearGrid.m_gridNodes(1, 6).x, tolerance); + ASSERT_NEAR(80684.333994102650, curvilinearGrid.m_gridNodes(1, 7).x, tolerance); + ASSERT_NEAR(80772.567299473958, curvilinearGrid.m_gridNodes(1, 8).x, tolerance); + + ASSERT_NEAR(366827.17869351729, curvilinearGrid.m_gridNodes(1, 0).y, tolerance); + ASSERT_NEAR(366872.56390471710, curvilinearGrid.m_gridNodes(1, 1).y, tolerance); + ASSERT_NEAR(366919.09182483586, curvilinearGrid.m_gridNodes(1, 2).y, tolerance); + ASSERT_NEAR(366966.51416593988, curvilinearGrid.m_gridNodes(1, 3).y, tolerance); + ASSERT_NEAR(367014.64392142039, curvilinearGrid.m_gridNodes(1, 4).y, tolerance); + ASSERT_NEAR(367056.48898898275, curvilinearGrid.m_gridNodes(1, 5).y, tolerance); + ASSERT_NEAR(367099.12347147451, curvilinearGrid.m_gridNodes(1, 6).y, tolerance); + ASSERT_NEAR(367143.03018172452, curvilinearGrid.m_gridNodes(1, 7).y, tolerance); + ASSERT_NEAR(367188.18349069095, curvilinearGrid.m_gridNodes(1, 8).y, tolerance); } diff --git a/libs/MeshKernel/tests/src/CurvilinearGridSnappingTests.cpp b/libs/MeshKernel/tests/src/CurvilinearGridSnappingTests.cpp index 192b10cdc..516d06ee4 100644 --- a/libs/MeshKernel/tests/src/CurvilinearGridSnappingTests.cpp +++ b/libs/MeshKernel/tests/src/CurvilinearGridSnappingTests.cpp @@ -89,36 +89,36 @@ TEST(CurvilinearGridSnapping, SnappingThreeSides) {3.364448501894e+00, 9.980938934087e+00, 1.998060582596e+01, 2.998027271784e+01, 3.997993960972e+01, 4.997960650159e+01, 5.997927339347e+01, 6.997894028534e+01, 7.997860717722e+01, 8.997827406910e+01, 9.777374826707e+01}, {4.303172000000e+00, 9.975620656674e+00, 1.997519460719e+01, 2.997476855770e+01, 3.997434250822e+01, 4.997391645874e+01, 5.997349040925e+01, 6.997306435977e+01, 7.997263831028e+01, 8.997221226080e+01, 9.715259600000e+01}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); + CurvilinearGrid grid(gridPoints, Projection::cartesian); snappingLine = std::vector{Point(100, 0), Point(100, 100)}; CurvilinearGridSnapping snappingEast(grid, eastLandBoundary, snappingLine); // First snap the east boundary of the domain - auto computedGrid = snappingEast.Compute(); + snappingEast.Compute(); for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, eastMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).x, eastMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; } } for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, eastMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).y, eastMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; } } //-------------------------------- - auto grid2 = std::make_shared(computedGrid.m_gridNodes, Projection::cartesian); + CurvilinearGrid grid2(grid.m_gridNodes, Projection::cartesian); snappingLine = std::vector{Point(0, 90.0), Point(0.0, 0.0)}; CurvilinearGridSnapping snappingWest(grid2, westLandBoundary, snappingLine); // Next snap the west boundary of the domain - auto computedGrid2 = snappingWest.Compute(); + snappingWest.Compute(); std::vector> westMappedPointsX{{-1.865916600000e+01, -1.865916600000e+01, -1.960069189347e+01, -2.370988900717e+01, -3.123906057660e+01, -3.191016458763e+01, -2.903003538732e+01, -1.992326360550e+01, -1.510684645043e+01, -1.465914200000e+01, 0.000000000000e+00}, {-4.588727360955e+00, -4.588727360955e+00, -5.324862328784e+00, -8.537650958466e+00, -1.442435732467e+01, -1.494906209700e+01, -1.269722406374e+01, -5.577066031841e+00, -1.811335198432e+00, -1.461296072050e+00, 1.000000000000e+01}, @@ -148,25 +148,25 @@ TEST(CurvilinearGridSnapping, SnappingThreeSides) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid2.m_gridNodes(i, j).x, westMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid2.m_gridNodes(i, j).x, westMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; } } for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid2.m_gridNodes(i, j).y, westMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid2.m_gridNodes(i, j).y, westMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; } } //-------------------------------- - auto grid3 = std::make_shared(computedGrid2.m_gridNodes, Projection::cartesian); + CurvilinearGrid grid3(grid2.m_gridNodes, Projection::cartesian); snappingLine = std::vector{Point({0.0e+00, 1.0e+02}), Point({1.043040e+02, 9.715260e+01})}; CurvilinearGridSnapping snappingNorth(grid3, northLandBoundary, snappingLine); // Finally snap the north boundary of the domain - auto computedGrid3 = snappingNorth.Compute(); + snappingNorth.Compute(); std::vector> northMappedPointsX{{-1.865916600000e+01, -1.865916600000e+01, -1.960069189347e+01, -2.370988900717e+01, -3.123906057660e+01, -3.191016458763e+01, -2.903003538732e+01, -1.984793400324e+01, -1.490230187035e+01, -1.444198867385e+01, 4.105750388196e-01}, {-4.588727360955e+00, -4.588727360955e+00, -5.324862328784e+00, -8.537650958466e+00, -1.442435732467e+01, -1.494906209700e+01, -1.269722406374e+01, -5.500065621084e+00, -1.615594343945e+00, -1.234667619608e+00, 1.035463931961e+01}, @@ -196,14 +196,14 @@ TEST(CurvilinearGridSnapping, SnappingThreeSides) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid3.m_gridNodes(i, j).x, northMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid3.m_gridNodes(i, j).x, northMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; } } for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid3.m_gridNodes(i, j).y, northMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid3.m_gridNodes(i, j).y, northMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; } } } @@ -246,25 +246,25 @@ TEST(CurvilinearGridSnapping, SnappingLineToLandBoundaryNorthTheWest) {0.000000000000e+00, 1.000000000000e+01, 2.000000000000e+01, 3.000000000000e+01, 4.000000000000e+01, 5.000000000000e+01, 6.000000000000e+01, 7.027745348015e+01, 8.243267902243e+01, 9.518460383235e+01, 1.064179136971e+02}, {0.000000000000e+00, 1.000000000000e+01, 2.000000000000e+01, 3.000000000000e+01, 4.000000000000e+01, 5.000000000000e+01, 6.000000000000e+01, 7.021158750721e+01, 8.185517402742e+01, 9.395380659904e+01, 1.048943352951e+02}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); + CurvilinearGrid grid(gridPoints, Projection::cartesian); std::vector snappingLine{Point(50.0, 100.0), Point(0.0, 100.0)}; CurvilinearGridSnapping snappingNorth(grid, northLandBoundary, snappingLine); - auto computedGrid = snappingNorth.Compute(); + snappingNorth.Compute(); for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, northMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping north: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).x, northMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping north: (" << i << ", " << j << ")"; } } for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, northMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping north: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).y, northMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping north: (" << i << ", " << j << ")"; } } @@ -287,16 +287,16 @@ TEST(CurvilinearGridSnapping, SnappingLineToLandBoundaryNorthTheWest) {0.000000000000e+00, 1.000000000000e+01, 2.000000000000e+01, 3.000000000000e+01, 4.000000000000e+01, 5.000000000000e+01, 6.000000000000e+01, 7.027745348015e+01, 8.243267902243e+01, 9.518460383235e+01, 1.064179136971e+02}, {0.000000000000e+00, 1.000000000000e+01, 2.000000000000e+01, 3.000000000000e+01, 4.000000000000e+01, 5.000000000000e+01, 6.000000000000e+01, 7.021158750721e+01, 8.185517402742e+01, 9.395380659904e+01, 1.048943352951e+02}}; - auto grid2 = std::make_shared(computedGrid.m_gridNodes, Projection::cartesian); + CurvilinearGrid grid2(grid.m_gridNodes, Projection::cartesian); snappingLine = std::vector{Point(0.0, 90.0), Point(0.0, 0.0)}; CurvilinearGridSnapping snappingWest(grid2, westLandBoundary, snappingLine); - auto computedGrid2 = snappingWest.Compute(); + snappingWest.Compute(); for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid2.m_gridNodes(i, j).x, westMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping west: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid2.m_gridNodes(i, j).x, westMappedPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping west: (" << i << ", " << j << ")"; } } @@ -304,7 +304,7 @@ TEST(CurvilinearGridSnapping, SnappingLineToLandBoundaryNorthTheWest) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid2.m_gridNodes(i, j).y, westMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping west: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid2.m_gridNodes(i, j).y, westMappedPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping west: (" << i << ", " << j << ")"; } } } @@ -345,23 +345,23 @@ TEST(CurvilinearGridSnapping, SnapBoundaryRegionToEastOnePoint) {4.090098002615e+00, 9.976827813659e+00, 1.997642286026e+01, 2.997601790685e+01, 3.997561295345e+01, 4.997520800005e+01, 5.997480304664e+01, 6.997439809324e+01, 7.997399313984e+01, 8.997358818643e+01, 9.729358682083e+01}, {4.303172000000e+00, 9.975620656674e+00, 1.997519460719e+01, 2.997476855770e+01, 3.997434250822e+01, 4.997391645874e+01, 5.997349040925e+01, 6.997306435977e+01, 7.997263831028e+01, 8.997221226080e+01, 9.715259600000e+01}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); - + CurvilinearGrid grid(gridPoints, Projection::cartesian); CurvilinearGridSnapping snapping(grid, eastLandBoundary, snappingLine); - auto computedGrid = snapping.Compute(); + + snapping.Compute(); for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, eastMappedGridPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).x, eastMappedGridPointsX[i][j], snapping::tolerance) << "Difference in x-points after snapping east: (" << i << ", " << j << ")"; } } for (Eigen::Index i = 0; i < gridPoints.rows(); ++i) { for (Eigen::Index j = 0; j < gridPoints.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, eastMappedGridPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).y, eastMappedGridPointsY[i][j], snapping::tolerance) << "Difference in y-points after snapping east: (" << i << ", " << j << ")"; } } } @@ -405,27 +405,27 @@ TEST(CurvilinearGridSnapping, SnapBoundaryRegionToEastTwoPoints) {0.000000000000e+00, 9.976827813659e+00, 1.997642286026e+01, 2.997601790685e+01, 3.997561295345e+01, 4.997520800005e+01, 5.997480304664e+01, 6.997439809324e+01, 7.997399313984e+01, 8.997358818643e+01, 1.000000000000e+02}, {0.000000000000e+00, 9.975620656674e+00, 1.997519460719e+01, 2.997476855770e+01, 3.997434250822e+01, 4.997391645874e+01, 5.997349040925e+01, 6.997306435977e+01, 7.997263831028e+01, 8.997221226080e+01, 1.000000000000e+02}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); + CurvilinearGrid grid(gridPoints, Projection::cartesian); CurvilinearGridSnapping snapping(grid, eastLandBoundary, snappingLine); // Compute snapping to land boundary - auto computedGrid = snapping.Compute(); + snapping.Compute(); // Check results - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance); + EXPECT_NEAR(grid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance); } } - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance); + EXPECT_NEAR(grid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance); } } } @@ -473,26 +473,26 @@ TEST(CurvilinearGridSnapping, SnapPartialBoundaryRegionToWest) {0.000000000000e+00, 1.000000000000e+01, 2.000000000000e+01, 3.000000000000e+01, 4.000000000000e+01, 5.000000000000e+01, 6.000000000000e+01, 7.000000000000e+01, 8.000000000000e+01, 9.000000000000e+01, 1.000000000000e+02}, {0.000000000000e+00, 1.000000000000e+01, 2.000000000000e+01, 3.000000000000e+01, 4.000000000000e+01, 5.000000000000e+01, 6.000000000000e+01, 7.000000000000e+01, 8.000000000000e+01, 9.000000000000e+01, 1.000000000000e+02}}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); + CurvilinearGrid grid(gridPoints, Projection::cartesian); CurvilinearGridSnapping snapping(grid, westLandBoundary, snappingLine); // Compute snapping to land boundary - auto computedGrid = snapping.Compute(); + snapping.Compute(); - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance); + EXPECT_NEAR(grid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance); } } - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance); + EXPECT_NEAR(grid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance); } } } @@ -541,26 +541,25 @@ TEST(CurvilinearGridSnapping, SnapPartialBoundaryRegionToNorthTwoPoints) {0.0e+00, 1.0e+01, 2.0e+01, 3.0e+01, 4.0e+01, 5.0e+01, 6.0e+01, 7.020664439596e+01, 8.181183341756e+01, 9.386143769632e+01, 1.047799937436e+02}, {0.0e+00, 1.0e+01, 2.0e+01, 3.0e+01, 4.0e+01, 5.0e+01, 6.0e+01, 7.000000000000e+01, 8.000000000000e+01, 9.000000000000e+01, 1.000000000000e+02}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); - + CurvilinearGrid grid(gridPoints, Projection::cartesian); CurvilinearGridSnapping snapping(grid, northLandBoundary, snappingLine); // Compute snapping to land boundary - auto computedGrid = snapping.Compute(); + snapping.Compute(); - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance); + EXPECT_NEAR(grid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance); } } - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance); + EXPECT_NEAR(grid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance); } } } @@ -610,26 +609,25 @@ TEST(CurvilinearGridSnapping, SnapPartialBoundaryRegionToNorthFourPoints) {0.0e+00, 1.0e+01, 2.0e+01, 3.0e+01, 4.0e+01, 5.0e+01, 6.0e+01, 7.070001387673e+01, 8.238999687179e+01, 9.407997986685e+01, 1.047799937436e+02}, {0.0e+00, 1.0e+01, 2.0e+01, 3.0e+01, 4.0e+01, 5.0e+01, 6.0e+01, 7.025755535907e+01, 8.087934900000e+01, 9.150114264093e+01, 1.017586980000e+02}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); - + CurvilinearGrid grid(gridPoints, Projection::cartesian); CurvilinearGridSnapping snapping(grid, northLandBoundary, snappingLine); // Compute snapping to land boundary - auto computedGrid = snapping.Compute(); + snapping.Compute(); - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance) << "Difference in x-points: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance) << "Difference in x-points: (" << i << ", " << j << ")"; } } - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance) << "Difference in y-points: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance) << "Difference in y-points: (" << i << ", " << j << ")"; } } } @@ -680,26 +678,25 @@ TEST(CurvilinearGridSnapping, SnapPartialOffsetBoundaryRegionToNorthFourPoints) {0.0e+00, 1.0e+01, 2.0e+01, 3.0e+01, 4.0e+01, 5.0e+01, 6.0e+01, 7.0e+01, 8.0e+01, 9.000000000000e+01, 1.000000000000e+02}, {0.0e+00, 1.0e+01, 2.0e+01, 3.0e+01, 4.0e+01, 5.0e+01, 6.0e+01, 7.0e+01, 8.0e+01, 9.000000000000e+01, 1.000000000000e+02}}; - auto grid = std::make_shared(gridPoints, Projection::cartesian); - + CurvilinearGrid grid(gridPoints, Projection::cartesian); CurvilinearGridSnapping snapping(grid, northLandBoundary, snappingLine); // Compute snapping to land boundary - auto computedGrid = snapping.Compute(); + snapping.Compute(); - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance) << "Difference in x-points: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).x, mappedPointsX[i][j], snapping::tolerance) << "Difference in x-points: (" << i << ", " << j << ")"; } } - for (Eigen::Index i = 0; i < grid->m_gridNodes.rows(); ++i) + for (Eigen::Index i = 0; i < grid.m_gridNodes.rows(); ++i) { - for (Eigen::Index j = 0; j < grid->m_gridNodes.cols(); ++j) + for (Eigen::Index j = 0; j < grid.m_gridNodes.cols(); ++j) { - EXPECT_NEAR(computedGrid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance) << "Difference in y-points: (" << i << ", " << j << ")"; + EXPECT_NEAR(grid.m_gridNodes(i, j).y, mappedPointsY[i][j], snapping::tolerance) << "Difference in y-points: (" << i << ", " << j << ")"; } } } @@ -710,7 +707,9 @@ TEST(CurvilinearGridSnapping, ChecksForFailingTests) // Tests the snapping throws exceptions when expected. LandBoundary eastLandBoundary({{104.303970, 97.152596}, {103.697906, 4.303172}}); - auto grid = std::make_shared(snapping::GetGridPoints10x10(), Projection::cartesian); + + CurvilinearGrid grid(snapping::GetGridPoints10x10(), Projection::cartesian); + std::vector snappingLine{Point(0.0, 100.0)}; // Test should throw as there is only a single point defined for the grid line diff --git a/libs/MeshKernelApi/include/MeshKernelApi/MeshKernel.hpp b/libs/MeshKernelApi/include/MeshKernelApi/MeshKernel.hpp index 9717a633b..c1dfcd4dc 100644 --- a/libs/MeshKernelApi/include/MeshKernelApi/MeshKernel.hpp +++ b/libs/MeshKernelApi/include/MeshKernelApi/MeshKernel.hpp @@ -178,6 +178,32 @@ namespace meshkernelapi /// @brief Converts a curvilinear grid to an unstructured mesh MKERNEL_API int mkernel_curvilinear_convert_to_mesh2d(int meshKernelId); + /// @brief Delete the exterior part of a curvilinear gris + /// @param meshKernelId The id of the mesh state + /// @param[in] xFirstPointCoordinate The x coordinate of the first point + /// @param[in] yFirstPointCoordinate The y coordinate of the first point + /// @param[in] xSecondPointCoordinate The x coordinate of the second point + /// @param[in] ySecondPointCoordinate The y coordinate of the second point + /// @return Error code + MKERNEL_API int mkernel_curvilinear_delete_exterior(int meshKernelId, + double xFirstPointCoordinate, + double yFirstPointCoordinate, + double xSecondPointCoordinate, + double ySecondPointCoordinate); + + /// @brief Delete the interior part of a curvilinear gris + /// @param meshKernelId The id of the mesh state + /// @param[in] xFirstPointCoordinate The x coordinate of the first point + /// @param[in] yFirstPointCoordinate The y coordinate of the first point + /// @param[in] xSecondPointCoordinate The x coordinate of the second point + /// @param[in] ySecondPointCoordinate The y coordinate of the second point + /// @return Error code + MKERNEL_API int mkernel_curvilinear_delete_interior(int meshKernelId, + double xFirstPointCoordinate, + double yFirstPointCoordinate, + double xSecondPointCoordinate, + double ySecondPointCoordinate); + /// @brief Delete the node closest to a point /// @param meshKernelId The id of the mesh state /// @param[in] xPointCoordinate The x coordinate of the point diff --git a/libs/MeshKernelApi/src/MeshKernel.cpp b/libs/MeshKernelApi/src/MeshKernel.cpp index 81071d60c..2fcc78685 100644 --- a/libs/MeshKernelApi/src/MeshKernel.cpp +++ b/libs/MeshKernelApi/src/MeshKernel.cpp @@ -25,8 +25,10 @@ // //------------------------------------------------------------------------------ +#include "MeshKernel/CurvilinearGrid/CurvilinearGridDeleteExterior.hpp" #include "MeshKernel/Mesh2DIntersections.hpp" +#include "MeshKernel/CurvilinearGrid/CurvilinearGridDeleteInterior.hpp" #include #include #include @@ -2423,9 +2425,9 @@ namespace meshkernelapi meshkernel::Point const secondPoint{xUpperRightCorner, yUpperRightCorner}; // Execute - meshkernel::CurvilinearGridRefinement curvilinearGridRefinement(meshKernelState[meshKernelId].m_curvilinearGrid, refinement); + meshkernel::CurvilinearGridRefinement curvilinearGridRefinement(*meshKernelState[meshKernelId].m_curvilinearGrid, refinement); curvilinearGridRefinement.SetBlock(firstPoint, secondPoint); - meshKernelState[meshKernelId].m_curvilinearGrid = std::make_shared(curvilinearGridRefinement.Compute()); + curvilinearGridRefinement.Compute(); } catch (...) { @@ -2452,11 +2454,10 @@ namespace meshkernelapi meshkernel::Point const secondPoint{xUpperRightCorner, yUpperRightCorner}; // Execute - meshkernel::CurvilinearGridDeRefinement curvilinearGridDeRefinement(meshKernelState[meshKernelId].m_curvilinearGrid); + meshkernel::CurvilinearGridDeRefinement curvilinearGridDeRefinement(*meshKernelState[meshKernelId].m_curvilinearGrid); curvilinearGridDeRefinement.SetBlock(firstPoint, secondPoint); - - meshKernelState[meshKernelId].m_curvilinearGrid = std::make_shared(curvilinearGridDeRefinement.Compute()); + curvilinearGridDeRefinement.Compute(); } catch (...) { @@ -2768,7 +2769,7 @@ namespace meshkernelapi throw meshkernel::MeshKernelError("The selected mesh kernel id does not exist."); } - meshKernelState[meshKernelId].m_curvilinearGridOrthogonalization = std::make_shared(meshKernelState[meshKernelId].m_curvilinearGrid, + meshKernelState[meshKernelId].m_curvilinearGridOrthogonalization = std::make_shared(*meshKernelState[meshKernelId].m_curvilinearGrid, orthogonalizationParameters); } catch (...) @@ -2859,7 +2860,7 @@ namespace meshkernelapi } // Execute - *meshKernelState[meshKernelId].m_curvilinearGrid = meshkernel::CurvilinearGrid(meshKernelState[meshKernelId].m_curvilinearGridOrthogonalization->Compute()); + meshKernelState[meshKernelId].m_curvilinearGridOrthogonalization->Compute(); } catch (...) { @@ -2922,11 +2923,11 @@ namespace meshkernelapi const meshkernel::Point secondPoint{xUpperRightCorner, yUpperRightCorner}; // Execute - meshkernel::CurvilinearGridSmoothing curvilinearGridSmoothing(meshKernelState[meshKernelId].m_curvilinearGrid, + meshkernel::CurvilinearGridSmoothing curvilinearGridSmoothing(*meshKernelState[meshKernelId].m_curvilinearGrid, static_cast(smoothingIterations)); curvilinearGridSmoothing.SetBlock(firstPoint, secondPoint); - *meshKernelState[meshKernelId].m_curvilinearGrid = meshkernel::CurvilinearGrid(curvilinearGridSmoothing.Compute()); + curvilinearGridSmoothing.Compute(); } catch (...) { @@ -2970,12 +2971,12 @@ namespace meshkernelapi meshkernel::Point const upperRight{xUpperRightCornerSmootingArea, yUpperRightCornerSmootingArea}; // Execute - meshkernel::CurvilinearGridSmoothing curvilinearGridSmoothing(meshKernelState[meshKernelId].m_curvilinearGrid, smoothingIterations); + meshkernel::CurvilinearGridSmoothing curvilinearGridSmoothing(*meshKernelState[meshKernelId].m_curvilinearGrid, smoothingIterations); curvilinearGridSmoothing.SetLine(firstNode, secondNode); curvilinearGridSmoothing.SetBlock(lowerLeft, upperRight); - *meshKernelState[meshKernelId].m_curvilinearGrid = meshkernel::CurvilinearGrid(curvilinearGridSmoothing.ComputeDirectional()); + *meshKernelState[meshKernelId].m_curvilinearGrid = curvilinearGridSmoothing.ComputeDirectional(); } catch (...) { @@ -3005,7 +3006,7 @@ namespace meshkernelapi throw meshkernel::MeshKernelError("Not valid curvilinear grid."); } - meshKernelState[meshKernelId].m_curvilinearGridLineShift = std::make_shared(meshKernelState[meshKernelId].m_curvilinearGrid); + meshKernelState[meshKernelId].m_curvilinearGridLineShift = std::make_shared(*meshKernelState[meshKernelId].m_curvilinearGrid); } catch (...) { @@ -3137,7 +3138,7 @@ namespace meshkernelapi throw meshkernel::MeshKernelError("Curvilinear grid line shift algorithm instance is null."); } - meshKernelState[meshKernelId].m_curvilinearGrid = std::make_shared(meshKernelState[meshKernelId].m_curvilinearGridLineShift->Compute()); + meshKernelState[meshKernelId].m_curvilinearGridLineShift->Compute(); } catch (...) { @@ -3213,6 +3214,8 @@ namespace meshkernelapi const auto [nodes, edges, gridIndices] = meshKernelState[meshKernelId].m_curvilinearGrid->ConvertCurvilinearToNodesAndEdges(); + const auto curviTemp = meshKernelState[meshKernelId].m_curvilinearGrid; + *meshKernelState[meshKernelId].m_mesh2d += meshkernel::Mesh2D(edges, nodes, meshKernelState[meshKernelId].m_curvilinearGrid->m_projection); // curvilinear grid must be re-setted @@ -3225,6 +3228,80 @@ namespace meshkernelapi return lastExitCode; } + MKERNEL_API int mkernel_curvilinear_delete_exterior(int meshKernelId, + double xFirstPointCoordinate, + double yFirstPointCoordinate, + double xSecondPointCoordinate, + double ySecondPointCoordinate) + { + lastExitCode = meshkernel::ExitCode::Success; + try + { + if (!meshKernelState.contains(meshKernelId)) + { + throw meshkernel::MeshKernelError("The selected mesh kernel id does not exist."); + } + + if (meshKernelState[meshKernelId].m_curvilinearGrid == nullptr) + { + throw meshkernel::MeshKernelError("Not a valid curvilinear grid instance."); + } + + if (!meshKernelState[meshKernelId].m_curvilinearGrid->IsValid()) + { + throw meshkernel::MeshKernelError("Not valid curvilinear grid."); + } + meshkernel::CurvilinearGridDeleteExterior curvilinearDeleteExterior(*meshKernelState[meshKernelId].m_curvilinearGrid); + + curvilinearDeleteExterior.SetBlock({xFirstPointCoordinate, yFirstPointCoordinate}, + {xSecondPointCoordinate, ySecondPointCoordinate}); + + curvilinearDeleteExterior.Compute(); + } + catch (...) + { + lastExitCode = HandleException(); + } + return lastExitCode; + } + + MKERNEL_API int mkernel_curvilinear_delete_interior(int meshKernelId, + double xFirstPointCoordinate, + double yFirstPointCoordinate, + double xSecondPointCoordinate, + double ySecondPointCoordinate) + { + lastExitCode = meshkernel::ExitCode::Success; + try + { + if (!meshKernelState.contains(meshKernelId)) + { + throw meshkernel::MeshKernelError("The selected mesh kernel id does not exist."); + } + + if (meshKernelState[meshKernelId].m_curvilinearGrid == nullptr) + { + throw meshkernel::MeshKernelError("Not a valid curvilinear grid instance."); + } + + if (!meshKernelState[meshKernelId].m_curvilinearGrid->IsValid()) + { + throw meshkernel::MeshKernelError("Not valid curvilinear grid."); + } + meshkernel::CurvilinearGridDeleteInterior curvilinearDeleteInterior(*meshKernelState[meshKernelId].m_curvilinearGrid); + + curvilinearDeleteInterior.SetBlock({xFirstPointCoordinate, yFirstPointCoordinate}, + {xSecondPointCoordinate, ySecondPointCoordinate}); + + curvilinearDeleteInterior.Compute(); + } + catch (...) + { + lastExitCode = HandleException(); + } + return lastExitCode; + } + MKERNEL_API int mkernel_curvilinear_line_attraction_repulsion(int meshKernelId, double repulsionParameter, double xFirstNodeOnTheLine, @@ -3244,7 +3321,7 @@ namespace meshkernelapi throw meshkernel::MeshKernelError("The selected mesh kernel state does not exist."); } - meshkernel::CurvilinearGridLineAttractionRepulsion curvilinearLineAttractionRepulsion(meshKernelState[meshKernelId].m_curvilinearGrid, repulsionParameter); + meshkernel::CurvilinearGridLineAttractionRepulsion curvilinearLineAttractionRepulsion(*meshKernelState[meshKernelId].m_curvilinearGrid, repulsionParameter); meshkernel::Point const lineFrom{xFirstNodeOnTheLine, yFirstNodeOnTheLine}; meshkernel::Point const lineTo{xSecondNodeOnTheLine, ySecondNodeOnTheLine}; @@ -3254,7 +3331,7 @@ namespace meshkernelapi meshkernel::Point const upperRight{xUpperRightCorner, yUpperRightCorner}; curvilinearLineAttractionRepulsion.SetBlock(lowerLeft, upperRight); - *meshKernelState[meshKernelId].m_curvilinearGrid = curvilinearLineAttractionRepulsion.Compute(); + curvilinearLineAttractionRepulsion.Compute(); } catch (...) { @@ -3288,11 +3365,11 @@ namespace meshkernelapi throw meshkernel::MeshKernelError("Not valid curvilinear grid."); } - auto curvilinearGridLineMirror = meshkernel::CurvilinearGridLineMirror(meshKernelState[meshKernelId].m_curvilinearGrid, mirroringFactor); + auto curvilinearGridLineMirror = meshkernel::CurvilinearGridLineMirror(*meshKernelState[meshKernelId].m_curvilinearGrid, mirroringFactor); curvilinearGridLineMirror.SetLine({xFirstGridLineNode, yFirstGridLineNode}, {xSecondGridLineNode, ySecondGridLineNode}); - *meshKernelState[meshKernelId].m_curvilinearGrid = curvilinearGridLineMirror.Compute(); + curvilinearGridLineMirror.Compute(); } catch (...) { diff --git a/libs/MeshKernelApi/tests/CMakeLists.txt b/libs/MeshKernelApi/tests/CMakeLists.txt index c39d80b27..130cf9fa3 100644 --- a/libs/MeshKernelApi/tests/CMakeLists.txt +++ b/libs/MeshKernelApi/tests/CMakeLists.txt @@ -13,6 +13,7 @@ set(INC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) # list of target sources set(SRC_LIST ${SRC_DIR}/ApiTest.cpp + ${SRC_DIR}/CurvilinearGridTests.cpp ${SRC_DIR}/Mesh2DRefinmentTests.cpp ${SRC_DIR}/ErrorHandlingTests.cpp ) diff --git a/libs/MeshKernelApi/tests/include/CartesianApiTestFixture.hpp b/libs/MeshKernelApi/tests/include/CartesianApiTestFixture.hpp index f02d31bfa..ca266ef79 100644 --- a/libs/MeshKernelApi/tests/include/CartesianApiTestFixture.hpp +++ b/libs/MeshKernelApi/tests/include/CartesianApiTestFixture.hpp @@ -3,7 +3,6 @@ #include -#include #include #include diff --git a/libs/MeshKernelApi/tests/src/ApiTest.cpp b/libs/MeshKernelApi/tests/src/ApiTest.cpp index ce84f64d5..06bf5c62c 100644 --- a/libs/MeshKernelApi/tests/src/ApiTest.cpp +++ b/libs/MeshKernelApi/tests/src/ApiTest.cpp @@ -1039,62 +1039,6 @@ TEST(ApiStatelessTests, TestGettingVersionThroughApi) ASSERT_EQ(strcmp(versionFromApi.get(), versionString), 0); } -TEST_F(CartesianApiTestFixture, CurvilinearComputeTransfiniteFromPolygon_ShouldComputeAValidCurvilinearGrid) -{ - /* - - Input polygon: - 6---5---4 - | | - 7 3 - | | - 0---1---2 - - Generated curvilinearGrid: - - 6---7---8 - | | | - 3---4---5 - | | | - 0---1---2 - - */ - - // Prepare - MakeMesh(); - auto const meshKernelId = GetMeshKernelId(); - - meshkernelapi::GeometryList geometryListIn; - geometryListIn.geometry_separator = meshkernel::constants::missing::doubleValue; - std::vector xCoordinatesIn{0, 5, 10, 10, 10, 5, 0, 0, 0}; - std::vector yCoordinatesIn{0, 0, 0, 5, 10, 10, 10, 5, 0}; - std::vector valuesIn{0, 0, 0, 0, 0, 0, 0, 0, 0}; - - geometryListIn.coordinates_x = xCoordinatesIn.data(); - geometryListIn.coordinates_y = yCoordinatesIn.data(); - geometryListIn.values = valuesIn.data(); - geometryListIn.num_coordinates = static_cast(xCoordinatesIn.size()); - - // Execute - auto errorCode = mkernel_curvilinear_compute_transfinite_from_polygon(meshKernelId, - geometryListIn, - 0, - 2, - 4, - false); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Get the new state - meshkernelapi::CurvilinearGrid curvilinear_grid{}; - - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinear_grid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert - ASSERT_EQ(3, curvilinear_grid.num_m); - ASSERT_EQ(3, curvilinear_grid.num_n); -} - TEST_F(CartesianApiTestFixture, GetClosestMeshCoordinateThroughApi) { // Prepare @@ -1177,345 +1121,6 @@ TEST_F(CartesianApiTestFixture, MakeCurvilinearGridFromTriangleThroughApi) ASSERT_EQ(40, mesh2d.num_edges); } -TEST_F(CartesianApiTestFixture, MakeCurvilinearGridThroughApi) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - meshkernel::MakeGridParameters makeGridParameters; - - makeGridParameters.num_columns = 3; - makeGridParameters.num_rows = 2; - makeGridParameters.angle = 0.0; - makeGridParameters.origin_x = 0.0; - makeGridParameters.origin_y = 0.0; - makeGridParameters.block_size_x = 1.0; - makeGridParameters.block_size_y = 1.0; - - // Execute - auto errorCode = meshkernelapi::mkernel_curvilinear_compute_rectangular_grid(meshKernelId, makeGridParameters); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - - // Assert - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - ASSERT_EQ(3, curvilinearGrid.num_m); - ASSERT_EQ(4, curvilinearGrid.num_n); - - // Allocate memory and get data - std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); - std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); - curvilinearGrid.node_x = node_x.data(); - curvilinearGrid.node_y = node_y.data(); - errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - /* 8---9--10---11 - | | | | - 4---5---6---7 - | | | | - 0---1---2---3 - */ - // Assert data - const double tolerance = 1e-6; - // Nodes - ASSERT_NEAR(0.0, curvilinearGrid.node_x[0], tolerance); - ASSERT_NEAR(0.0, curvilinearGrid.node_y[0], tolerance); - ASSERT_NEAR(1.0, curvilinearGrid.node_x[1], tolerance); - ASSERT_NEAR(0.0, curvilinearGrid.node_y[1], tolerance); -} - -TEST_F(CartesianApiTestFixture, GenerateTransfiniteCurvilinearGridThroughApi) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - meshkernelapi::GeometryList geometryListIn; - geometryListIn.geometry_separator = meshkernel::constants::missing::doubleValue; - std::vector xCoordinates{1.340015E+02, 3.642529E+02, 6.927549E+02, meshkernel::constants::missing::doubleValue, - 2.585022E+02, 4.550035E+02, 8.337558E+02, meshkernel::constants::missing::doubleValue, - 1.002513E+02, 4.610035E+02, meshkernel::constants::missing::doubleValue, - 6.522547E+02, 7.197551E+02}; - - std::vector yCoordinates{2.546282E+02, 4.586302E+02, 5.441311E+02, meshkernel::constants::missing::doubleValue, - 6.862631E+01, 2.726284E+02, 3.753794E+02, meshkernel::constants::missing::doubleValue, - 4.068797E+02, 7.912642E+01, meshkernel::constants::missing::doubleValue, - 6.026317E+02, 2.681283E+02}; - - std::vector zCoordinates{0.0, 0.0, 0.0, meshkernel::constants::missing::doubleValue, - 0.0, 0.0, 0.0, meshkernel::constants::missing::doubleValue, - 0.0, 0.0, meshkernel::constants::missing::doubleValue, - 0.0, 0.0}; - - geometryListIn.coordinates_x = xCoordinates.data(); - geometryListIn.coordinates_y = yCoordinates.data(); - geometryListIn.values = zCoordinates.data(); - geometryListIn.num_coordinates = static_cast(xCoordinates.size()); - - meshkernel::CurvilinearParameters curvilinearParameters; - - curvilinearParameters.m_refinement = 10; - curvilinearParameters.n_refinement = 10; - curvilinearParameters.smoothing_iterations = 10; - curvilinearParameters.smoothing_parameter = 0.5; - curvilinearParameters.attraction_parameter = 0.0; - - // Execute - auto errorCode = mkernel_curvilinear_compute_transfinite_from_splines(meshKernelId, - geometryListIn, - curvilinearParameters); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - - // Assert - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - ASSERT_EQ(11, curvilinearGrid.num_m); - ASSERT_EQ(11, curvilinearGrid.num_n); -} - -TEST_F(CartesianApiTestFixture, GenerateOrthogonalCurvilinearGridThroughApi) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - meshkernelapi::GeometryList geometryListIn; - - geometryListIn.geometry_separator = meshkernel::constants::missing::doubleValue; - std::vector xCoordinates{1.175014E+02, 3.755030E+02, 7.730054E+02, meshkernel::constants::missing::doubleValue, - 4.100089E+01, 3.410027E+02}; - - std::vector yCoordinates{2.437587E+01, 3.266289E+02, 4.563802E+02, meshkernel::constants::missing::doubleValue, - 2.388780E+02, 2.137584E+01}; - - std::vector zCoordinates{0.0, 0.0, 0.0, meshkernel::constants::missing::doubleValue, - 0.0, 0.0}; - - geometryListIn.coordinates_x = xCoordinates.data(); - geometryListIn.coordinates_y = yCoordinates.data(); - geometryListIn.values = zCoordinates.data(); - geometryListIn.num_coordinates = static_cast(xCoordinates.size()); - - meshkernel::CurvilinearParameters curvilinearParameters; - curvilinearParameters.m_refinement = 40; - curvilinearParameters.n_refinement = 10; - meshkernel::SplinesToCurvilinearParameters splinesToCurvilinearParameters; - splinesToCurvilinearParameters.aspect_ratio = 0.1; - splinesToCurvilinearParameters.aspect_ratio_grow_factor = 1.1; - splinesToCurvilinearParameters.average_width = 500.0; - splinesToCurvilinearParameters.curvature_adapted_grid_spacing = 1; - splinesToCurvilinearParameters.maximum_num_faces_in_uniform_part = 5; - splinesToCurvilinearParameters.nodes_on_top_of_each_other_tolerance = 0.0001; - splinesToCurvilinearParameters.min_cosine_crossing_angles = 0.95; - splinesToCurvilinearParameters.check_front_collisions = 0; - splinesToCurvilinearParameters.remove_skinny_triangles = 1; - splinesToCurvilinearParameters.grow_grid_outside = 0; - - // Execute - auto errorCode = mkernel_curvilinear_initialize_orthogonal_grid_from_splines(meshKernelId, - geometryListIn, - curvilinearParameters, - splinesToCurvilinearParameters); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Grow grid, from the second layer - for (auto layer = 1; layer <= curvilinearParameters.n_refinement; ++layer) - { - errorCode = meshkernelapi::mkernel_curvilinear_iterate_orthogonal_grid_from_splines(meshKernelId, layer); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - } - - // Puts the computed curvilinear mesh into the mesh state (unstructured mesh) - errorCode = meshkernelapi::mkernel_curvilinear_refresh_orthogonal_grid_from_splines(meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Delete the mesh curvilinearGridFromSplinesInstances vector entry - errorCode = meshkernelapi::mkernel_curvilinear_delete_orthogonal_grid_from_splines(meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Get the new state - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - - // Assert - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - ASSERT_EQ(3, curvilinearGrid.num_m); - ASSERT_EQ(7, curvilinearGrid.num_n); -} - -TEST_F(CartesianApiTestFixture, RefineCompute_OnCurvilinearGrid_ShouldRefine) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - MakeRectangularCurvilinearGrid(3, 3); - - auto errorCode = meshkernelapi::mkernel_curvilinear_refine(meshKernelId, 10.0, 20.0, 20.0, 20.0, 10); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - ASSERT_EQ(4, curvilinearGrid.num_m); - ASSERT_EQ(13, curvilinearGrid.num_n); -} - -TEST_F(CartesianApiTestFixture, DerefineCompute_OnCurvilinearGrid_ShouldDeRefine) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - MakeRectangularCurvilinearGrid(); - - // Execute - auto errorCode = meshkernelapi::mkernel_curvilinear_derefine(meshKernelId, 10.0, 20.0, 30.0, 20.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - ASSERT_EQ(5, curvilinearGrid.num_m); - ASSERT_EQ(4, curvilinearGrid.num_n); -} - -TEST_F(CartesianApiTestFixture, Orthogonalize_CurvilinearGrid_ShouldOrthogonalize) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - MakeRectangularCurvilinearGrid(3, 3); - // Move a node to make the grid non orthogonal - auto errorCode = meshkernelapi::mkernel_curvilinear_move_node(meshKernelId, 10.0, 20.0, 18.0, 12.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernel::OrthogonalizationParameters orthogonalizationParameters{}; - orthogonalizationParameters.outer_iterations = 1; - orthogonalizationParameters.boundary_iterations = 25; - orthogonalizationParameters.inner_iterations = 25; - orthogonalizationParameters.orthogonalization_to_smoothing_factor = 0.975; - - // Execute - errorCode = meshkernelapi::mkernel_curvilinear_initialize_orthogonalize(meshKernelId, orthogonalizationParameters); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - errorCode = meshkernelapi::mkernel_curvilinear_set_block_orthogonalize(meshKernelId, 0.0, 0.0, 30.0, 30.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - errorCode = meshkernelapi::mkernel_curvilinear_orthogonalize(meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert (nothing changed) - ASSERT_EQ(4, curvilinearGrid.num_m); - ASSERT_EQ(4, curvilinearGrid.num_n); - - std::vector xNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); - std::vector yNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); - curvilinearGrid.node_x = xNodesCurvilinearGrid.data(); - curvilinearGrid.node_y = yNodesCurvilinearGrid.data(); - - errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); - double const tolerance = 1e-6; - ASSERT_NEAR(11.841396536135521, curvilinearGrid.node_x[9], tolerance); - ASSERT_NEAR(18.158586078094562, curvilinearGrid.node_y[9], tolerance); -} - -TEST_F(CartesianApiTestFixture, Smoothing_CurvilinearGrid_ShouldSmooth) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - MakeRectangularCurvilinearGrid(); - - // Execute - auto errorCode = meshkernelapi::mkernel_curvilinear_smoothing(meshKernelId, 10, 10.0, 20.0, 30.0, 20.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert (nothing changed) - ASSERT_EQ(5, curvilinearGrid.num_m); - ASSERT_EQ(5, curvilinearGrid.num_n); -} - -TEST_F(CartesianApiTestFixture, ComputedDirectionalSmooth_CurvilinearGrid_ShouldSmooth) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - MakeRectangularCurvilinearGrid(); - - // Execute - auto errorCode = meshkernelapi::mkernel_curvilinear_smoothing_directional(meshKernelId, - 10, - 10.0, - 0.0, - 10.0, - 30.0, - 10.0, - 0.0, - 30.0, - 0.0); - - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert (nothing changed) - ASSERT_EQ(5, curvilinearGrid.num_m); - ASSERT_EQ(5, curvilinearGrid.num_n); -} - -TEST_F(CartesianApiTestFixture, ComputedLineShift_CurvilinearGrid_ShouldShift) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - MakeRectangularCurvilinearGrid(); - - meshkernelapi::mkernel_curvilinear_initialize_line_shift(meshKernelId); - - auto errorCode = meshkernelapi::mkernel_curvilinear_set_line_line_shift(meshKernelId, 0.0, 0.0, 0.0, 30.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - errorCode = meshkernelapi::mkernel_curvilinear_set_block_line_shift(meshKernelId, 0.0, 0.0, 30.0, 30.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - /// Move a gridline point, in this case the origin to -10.0, 0.0 - errorCode = meshkernelapi::mkernel_curvilinear_move_node_line_shift(meshKernelId, 0.0, 0.0, -10.0, 0.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Execute - errorCode = meshkernelapi::mkernel_curvilinear_line_shift(meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - errorCode = meshkernelapi::mkernel_curvilinear_finalize_line_shift(meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert, the nodes along the grid line have changed - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - std::vector xNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); - std::vector yNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); - curvilinearGrid.node_x = xNodesCurvilinearGrid.data(); - curvilinearGrid.node_y = yNodesCurvilinearGrid.data(); - - errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); - ASSERT_EQ(-10.0, curvilinearGrid.node_x[0]); - ASSERT_EQ(2.5, curvilinearGrid.node_x[1]); - ASSERT_EQ(17.5, curvilinearGrid.node_x[2]); - ASSERT_EQ(30.0, curvilinearGrid.node_x[3]); -} - TEST_F(CartesianApiTestFixture, DeleteMesh2D_WithEmptyPolygon_ShouldDeleteMesh2D) { // Prepare @@ -2099,119 +1704,6 @@ TEST_F(CartesianApiTestFixture, Mesh2DDeleteSmallFlowEdgesAndSmallTriangles_OnMe ASSERT_EQ(4, newMesh2d.num_edges); } -TEST_F(CartesianApiTestFixture, CurvilinearComputeOrthogonalGridFromSplines_ShouldMakeCurvilinearGrid) -{ - // Setup - meshkernelapi::GeometryList splines{}; - double geometrySeparator = meshkernelapi::mkernel_get_separator(); - - std::vector coordinatesX{ - 7.7979524E+04, - 7.7979524E+04, - 7.8302860E+04, - 7.9732343E+04, - 8.0889543E+04, - 8.0668314E+04, - 7.9579184E+04, - geometrySeparator, - 7.6618112E+04, - 7.6754253E+04, - 7.7179694E+04, - 7.8404966E+04, - 7.9681290E+04, - 8.0140766E+04, - 7.9477078E+04, - 7.8779354E+04, - geometrySeparator, - 7.7281800E+04, - 7.7366889E+04, - 7.7928471E+04, - 7.9153742E+04, - 8.0242872E+04, - 8.0481119E+04, - 7.9970590E+04, - 7.9579184E+04, - 7.9170760E+04, - geometrySeparator, - 7.613792E+04, - 7.831719E+04, - geometrySeparator, - 7.857202E+04, - 8.003072E+04}; - - std::vector coordinatesY{ - 3.7127829E+05, - 3.7025723E+05, - 3.6898090E+05, - 3.6809598E+05, - 3.6698984E+05, - 3.6578158E+05, - 3.6419894E+05, - geometrySeparator, - 3.7136337E+05, - 3.7005301E+05, - 3.6874265E+05, - 3.6780668E+05, - 3.6721107E+05, - 3.6636018E+05, - 3.6544123E+05, - 3.6452228E+05, - geometrySeparator, - 3.7144846E+05, - 3.6984880E+05, - 3.6874265E+05, - 3.6792581E+05, - 3.6722808E+05, - 3.6641124E+05, - 3.6542421E+05, - 3.6484561E+05, - 3.6431806E+05, - geometrySeparator, - 3.712157E+05, - 3.710751E+05, - geometrySeparator, - 3.649151E+05, - 3.641506E+05}; - - splines.coordinates_x = coordinatesX.data(); - splines.coordinates_y = coordinatesY.data(); - splines.num_coordinates = static_cast(coordinatesX.size()); - - meshkernel::SplinesToCurvilinearParameters splinesToCurvilinearParameters; - meshkernel::CurvilinearParameters curvilinearParameters{}; - - curvilinearParameters.m_refinement = 20; - curvilinearParameters.n_refinement = 40; - splinesToCurvilinearParameters.aspect_ratio = 0.5; - splinesToCurvilinearParameters.aspect_ratio_grow_factor = 1.0; - splinesToCurvilinearParameters.average_width = 500.0; - splinesToCurvilinearParameters.curvature_adapted_grid_spacing = true; - splinesToCurvilinearParameters.grow_grid_outside = 0; - splinesToCurvilinearParameters.maximum_num_faces_in_uniform_part = 8; - - splinesToCurvilinearParameters.nodes_on_top_of_each_other_tolerance = 1e-4; - splinesToCurvilinearParameters.min_cosine_crossing_angles = 0.95; - splinesToCurvilinearParameters.check_front_collisions = false; - splinesToCurvilinearParameters.remove_skinny_triangles = true; - - // Execute, with large length threshold - auto const meshKernelId = GetMeshKernelId(); - auto errorCode = mkernel_curvilinear_compute_orthogonal_grid_from_splines(meshKernelId, - splines, - curvilinearParameters, - splinesToCurvilinearParameters); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert one curvilinear grid is produced - ASSERT_GT(curvilinearGrid.num_m, 0); - ASSERT_GT(curvilinearGrid.num_n, 0); -} - TEST_F(CartesianApiTestFixture, CurvilinearSetFrozenLinesOrthogonalize_ShouldSetFrozenLines) { // Setup @@ -2246,59 +1738,6 @@ TEST_F(CartesianApiTestFixture, CurvilinearFinalizeOrthogonalize_ShouldFinalize) ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); } -TEST_F(CartesianApiTestFixture, CurvilinearInsertFace_ShouldInsertAFace) -{ - // Setup - MakeRectangularCurvilinearGrid(); - auto const meshKernelId = GetMeshKernelId(); - - // Execute - auto errorCode = meshkernelapi::mkernel_curvilinear_insert_face(meshKernelId, -5.0, 5.0); - - // Assert - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); - std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); - curvilinearGrid.node_x = node_x.data(); - curvilinearGrid.node_y = node_y.data(); - errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert two extra nodes have been inserted (before it was 5 by 5 = 25 nodes, not it is 25 + 2 = 27) - auto const numValidNodes = CurvilinearGridCountValidNodes(curvilinearGrid); - ASSERT_EQ(numValidNodes, 27); -} - -TEST_F(CartesianApiTestFixture, CurvilinearLineMirror_ShouldInsertANewGridLine) -{ - // Setup - MakeRectangularCurvilinearGrid(); - auto const meshKernelId = GetMeshKernelId(); - - // Execute - auto errorCode = meshkernelapi::mkernel_curvilinear_line_mirror(meshKernelId, - 1.2, - 0.0, - 0.0, - 0.0, - 50.0); - - // Assert - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert that 5 nodes have been inserted on the bottom boundary, so the total count is 30 - ASSERT_EQ(curvilinearGrid.num_m * curvilinearGrid.num_n, 30); -} - TEST_F(CartesianApiTestFixture, Mesh2dAveragingInterpolation_OnMesh2D_ShouldInterpolateValues) { // Setup @@ -2394,72 +1833,6 @@ TEST_F(CartesianApiTestFixture, Mesh2dTriangulationInterpolation_ShouldInterpola ASSERT_NEAR(computedResultsValues[8], 5.6666666666666670, tolerance); } -TEST_F(CartesianApiTestFixture, CurvilinearLineAttractionRepulsion_ShouldAttractGridlines) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - - MakeRectangularCurvilinearGrid(5, 5); - - // Execute - auto errorCode = meshkernelapi::mkernel_curvilinear_line_attraction_repulsion(meshKernelId, - 0.5, - 30.0, 0.0, 30.0, 50.0, - 10.0, 20.0, 50.0, 20.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); - std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); - curvilinearGrid.node_x = node_x.data(); - curvilinearGrid.node_y = node_y.data(); - errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert data - const double tolerance = 1e-6; - // Nodes - ASSERT_NEAR(17.5, curvilinearGrid.node_x[2], tolerance); - ASSERT_NEAR(0.0, curvilinearGrid.node_y[2], tolerance); - ASSERT_NEAR(42.5, curvilinearGrid.node_x[4], tolerance); - ASSERT_NEAR(0.0, curvilinearGrid.node_y[4], tolerance); -} - -TEST_F(CartesianApiTestFixture, CurvilinearDeleteNode_ShouldDeleteNode) -{ - // Prepare - auto const meshKernelId = GetMeshKernelId(); - MakeRectangularCurvilinearGrid(5, 5); - - meshkernelapi::CurvilinearGrid curvilinearGrid{}; - auto errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); - std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); - curvilinearGrid.node_x = node_x.data(); - curvilinearGrid.node_y = node_y.data(); - errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); - auto const numValidNodesBefore = CurvilinearGridCountValidNodes(curvilinearGrid); - - // Execute - errorCode = meshkernelapi::mkernel_curvilinear_delete_node(meshKernelId, 10.0, 0.0); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Asserts - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Two nodes are removed, one by delete node and one by the administration. The node is at the corner and the entire face will be removed - auto const numValidNodesAfter = CurvilinearGridCountValidNodes(curvilinearGrid); - ASSERT_EQ(numValidNodesBefore - 2, numValidNodesAfter); -} - TEST_F(CartesianApiTestFixture, Network1DComputeFixedChainages_ShouldGenerateMesh1D) { // Prepare @@ -2847,106 +2220,6 @@ TEST(Mesh2D, RemoveMultipleIslands) ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); } -TEST(CurvilinearGrid, MakeRectangular_OnSphericalCoordinates_ShouldMakeCurvilinearGrid) -{ - meshkernel::MakeGridParameters makeGridParameters; - - makeGridParameters.origin_x = -1.0; - makeGridParameters.origin_y = 49.1; - makeGridParameters.block_size_x = 0.1; - makeGridParameters.block_size_y = 0.1; - makeGridParameters.num_columns = 8; - makeGridParameters.num_rows = 11; - - int meshKernelId = 0; - const int projectionType = 1; - auto errorCode = meshkernelapi::mkernel_allocate_state(projectionType, meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - errorCode = meshkernelapi::mkernel_curvilinear_compute_rectangular_grid(meshKernelId, makeGridParameters); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGridResults; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGridResults); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - ASSERT_EQ(12, curvilinearGridResults.num_m); - ASSERT_EQ(9, curvilinearGridResults.num_n); -} -TEST(CurvilinearGrid, MakeRectangular_OnSphericalCoordinatesWithpolygon_ShouldMakeCurvilinearGrid) -{ - // Setup - const double lonMin = -6.0; - const double lonMax = 2.0; - - const double latMin = 48.5; - const double latMax = 51.2; - - const double lonRes = 0.2; - const double latRes = 0.2; - - meshkernel::MakeGridParameters makeGridParameters; - makeGridParameters.origin_x = -6; - makeGridParameters.origin_y = 15.5; - makeGridParameters.num_rows = static_cast(std::ceil((latMax - latMin) / latRes)); - makeGridParameters.num_columns = static_cast(std::ceil((lonMax - lonMin) / lonRes)); - makeGridParameters.block_size_x = lonRes; - makeGridParameters.block_size_y = latRes; - - int meshKernelId = 0; - int projectionType = 1; - auto errorCode = meshkernelapi::mkernel_allocate_state(projectionType, meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Execute - meshkernelapi::GeometryList geometryList{}; - auto coordinates_x = std::vector{-6.0, -4.0, 0.0, -6.0}; - auto coordinates_y = std::vector{48.0, 51.0, 49.5, 48.0}; - geometryList.coordinates_x = coordinates_x.data(); - geometryList.coordinates_y = coordinates_y.data(); - geometryList.num_coordinates = static_cast(coordinates_x.size()); - - errorCode = mkernel_curvilinear_compute_rectangular_grid_from_polygon(meshKernelId, makeGridParameters, geometryList); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGridResults; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGridResults); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert - ASSERT_EQ(125, curvilinearGridResults.num_m); - ASSERT_EQ(61, curvilinearGridResults.num_n); -} - -TEST(CurvilinearGrid, MakeRectangularOnDefinedExtension_OnSphericalCoordinates_ShouldMakeCurvilinearGrid) -{ - // Setup - meshkernel::MakeGridParameters makeGridParameters; - makeGridParameters.origin_x = 0.0; - makeGridParameters.origin_y = 0.0; - makeGridParameters.upper_right_x = 10.0; - makeGridParameters.upper_right_y = 10.0; - makeGridParameters.block_size_x = 1.0; - makeGridParameters.block_size_y = 2.0; - - int meshKernelId = 0; - int projectionType = 0; - auto errorCode = meshkernelapi::mkernel_allocate_state(projectionType, meshKernelId); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Execute - errorCode = meshkernelapi::mkernel_curvilinear_compute_rectangular_grid_on_extension(meshKernelId, makeGridParameters); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - meshkernelapi::CurvilinearGrid curvilinearGridResults; - errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGridResults); - ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); - - // Assert - ASSERT_EQ(6, curvilinearGridResults.num_m); - ASSERT_EQ(11, curvilinearGridResults.num_n); -} - TEST(MeshState, MKernelGetProjection_ShouldGetProjection) { // Setup diff --git a/libs/MeshKernelApi/tests/src/CurvilinearGridTests.cpp b/libs/MeshKernelApi/tests/src/CurvilinearGridTests.cpp new file mode 100644 index 000000000..e1073fc6d --- /dev/null +++ b/libs/MeshKernelApi/tests/src/CurvilinearGridTests.cpp @@ -0,0 +1,797 @@ +#include +#include + +#include +#include + +#include "CartesianApiTestFixture.hpp" +#include +#include + +TEST(CurvilinearGrid, MakeRectangular_OnSphericalCoordinates_ShouldMakeCurvilinearGrid) +{ + meshkernel::MakeGridParameters makeGridParameters; + + makeGridParameters.origin_x = -1.0; + makeGridParameters.origin_y = 49.1; + makeGridParameters.block_size_x = 0.1; + makeGridParameters.block_size_y = 0.1; + makeGridParameters.num_columns = 8; + makeGridParameters.num_rows = 11; + + int meshKernelId = 0; + const int projectionType = 1; + auto errorCode = meshkernelapi::mkernel_allocate_state(projectionType, meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + errorCode = meshkernelapi::mkernel_curvilinear_compute_rectangular_grid(meshKernelId, makeGridParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGridResults; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGridResults); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + ASSERT_EQ(12, curvilinearGridResults.num_m); + ASSERT_EQ(9, curvilinearGridResults.num_n); +} + +TEST(CurvilinearGrid, MakeRectangular_OnSphericalCoordinatesWithpolygon_ShouldMakeCurvilinearGrid) +{ + // Setup + const double lonMin = -6.0; + const double lonMax = 2.0; + + const double latMin = 48.5; + const double latMax = 51.2; + + const double lonRes = 0.2; + const double latRes = 0.2; + + meshkernel::MakeGridParameters makeGridParameters; + makeGridParameters.origin_x = -6; + makeGridParameters.origin_y = 15.5; + makeGridParameters.num_rows = static_cast(std::ceil((latMax - latMin) / latRes)); + makeGridParameters.num_columns = static_cast(std::ceil((lonMax - lonMin) / lonRes)); + makeGridParameters.block_size_x = lonRes; + makeGridParameters.block_size_y = latRes; + + int meshKernelId = 0; + int projectionType = 1; + auto errorCode = meshkernelapi::mkernel_allocate_state(projectionType, meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Execute + meshkernelapi::GeometryList geometryList{}; + auto coordinates_x = std::vector{-6.0, -4.0, 0.0, -6.0}; + auto coordinates_y = std::vector{48.0, 51.0, 49.5, 48.0}; + geometryList.coordinates_x = coordinates_x.data(); + geometryList.coordinates_y = coordinates_y.data(); + geometryList.num_coordinates = static_cast(coordinates_x.size()); + + errorCode = mkernel_curvilinear_compute_rectangular_grid_from_polygon(meshKernelId, makeGridParameters, geometryList); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGridResults; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGridResults); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert + ASSERT_EQ(125, curvilinearGridResults.num_m); + ASSERT_EQ(61, curvilinearGridResults.num_n); +} + +TEST_F(CartesianApiTestFixture, CurvilinearComputeTransfiniteFromPolygon_ShouldComputeAValidCurvilinearGrid) +{ + /* + + Input polygon: + 6---5---4 + | | + 7 3 + | | + 0---1---2 + + Generated curvilinearGrid: + + 6---7---8 + | | | + 3---4---5 + | | | + 0---1---2 + + */ + + // Prepare + MakeMesh(); + auto const meshKernelId = GetMeshKernelId(); + + meshkernelapi::GeometryList geometryListIn; + geometryListIn.geometry_separator = meshkernel::constants::missing::doubleValue; + std::vector xCoordinatesIn{0, 5, 10, 10, 10, 5, 0, 0, 0}; + std::vector yCoordinatesIn{0, 0, 0, 5, 10, 10, 10, 5, 0}; + std::vector valuesIn{0, 0, 0, 0, 0, 0, 0, 0, 0}; + + geometryListIn.coordinates_x = xCoordinatesIn.data(); + geometryListIn.coordinates_y = yCoordinatesIn.data(); + geometryListIn.values = valuesIn.data(); + geometryListIn.num_coordinates = static_cast(xCoordinatesIn.size()); + + // Execute + auto errorCode = mkernel_curvilinear_compute_transfinite_from_polygon(meshKernelId, + geometryListIn, + 0, + 2, + 4, + false); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Get the new state + meshkernelapi::CurvilinearGrid curvilinear_grid{}; + + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinear_grid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert + ASSERT_EQ(3, curvilinear_grid.num_m); + ASSERT_EQ(3, curvilinear_grid.num_n); +} + +TEST_F(CartesianApiTestFixture, MakeCurvilinearGridThroughApi) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + meshkernel::MakeGridParameters makeGridParameters; + + makeGridParameters.num_columns = 3; + makeGridParameters.num_rows = 2; + makeGridParameters.angle = 0.0; + makeGridParameters.origin_x = 0.0; + makeGridParameters.origin_y = 0.0; + makeGridParameters.block_size_x = 1.0; + makeGridParameters.block_size_y = 1.0; + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_compute_rectangular_grid(meshKernelId, makeGridParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + + // Assert + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + ASSERT_EQ(3, curvilinearGrid.num_m); + ASSERT_EQ(4, curvilinearGrid.num_n); + + // Allocate memory and get data + std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = node_x.data(); + curvilinearGrid.node_y = node_y.data(); + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + /* 8---9--10---11 + | | | | + 4---5---6---7 + | | | | + 0---1---2---3 + */ + // Assert data + const double tolerance = 1e-6; + // Nodes + ASSERT_NEAR(0.0, curvilinearGrid.node_x[0], tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.node_y[0], tolerance); + ASSERT_NEAR(1.0, curvilinearGrid.node_x[1], tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.node_y[1], tolerance); +} + +TEST_F(CartesianApiTestFixture, GenerateTransfiniteCurvilinearGridThroughApi) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + meshkernelapi::GeometryList geometryListIn; + geometryListIn.geometry_separator = meshkernel::constants::missing::doubleValue; + std::vector xCoordinates{1.340015E+02, 3.642529E+02, 6.927549E+02, meshkernel::constants::missing::doubleValue, + 2.585022E+02, 4.550035E+02, 8.337558E+02, meshkernel::constants::missing::doubleValue, + 1.002513E+02, 4.610035E+02, meshkernel::constants::missing::doubleValue, + 6.522547E+02, 7.197551E+02}; + + std::vector yCoordinates{2.546282E+02, 4.586302E+02, 5.441311E+02, meshkernel::constants::missing::doubleValue, + 6.862631E+01, 2.726284E+02, 3.753794E+02, meshkernel::constants::missing::doubleValue, + 4.068797E+02, 7.912642E+01, meshkernel::constants::missing::doubleValue, + 6.026317E+02, 2.681283E+02}; + + std::vector zCoordinates{0.0, 0.0, 0.0, meshkernel::constants::missing::doubleValue, + 0.0, 0.0, 0.0, meshkernel::constants::missing::doubleValue, + 0.0, 0.0, meshkernel::constants::missing::doubleValue, + 0.0, 0.0}; + + geometryListIn.coordinates_x = xCoordinates.data(); + geometryListIn.coordinates_y = yCoordinates.data(); + geometryListIn.values = zCoordinates.data(); + geometryListIn.num_coordinates = static_cast(xCoordinates.size()); + + meshkernel::CurvilinearParameters curvilinearParameters; + + curvilinearParameters.m_refinement = 10; + curvilinearParameters.n_refinement = 10; + curvilinearParameters.smoothing_iterations = 10; + curvilinearParameters.smoothing_parameter = 0.5; + curvilinearParameters.attraction_parameter = 0.0; + + // Execute + auto errorCode = mkernel_curvilinear_compute_transfinite_from_splines(meshKernelId, + geometryListIn, + curvilinearParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + + // Assert + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + ASSERT_EQ(11, curvilinearGrid.num_m); + ASSERT_EQ(11, curvilinearGrid.num_n); +} + +TEST_F(CartesianApiTestFixture, GenerateOrthogonalCurvilinearGridThroughApi) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + meshkernelapi::GeometryList geometryListIn; + + geometryListIn.geometry_separator = meshkernel::constants::missing::doubleValue; + std::vector xCoordinates{1.175014E+02, 3.755030E+02, 7.730054E+02, meshkernel::constants::missing::doubleValue, + 4.100089E+01, 3.410027E+02}; + + std::vector yCoordinates{2.437587E+01, 3.266289E+02, 4.563802E+02, meshkernel::constants::missing::doubleValue, + 2.388780E+02, 2.137584E+01}; + + std::vector zCoordinates{0.0, 0.0, 0.0, meshkernel::constants::missing::doubleValue, + 0.0, 0.0}; + + geometryListIn.coordinates_x = xCoordinates.data(); + geometryListIn.coordinates_y = yCoordinates.data(); + geometryListIn.values = zCoordinates.data(); + geometryListIn.num_coordinates = static_cast(xCoordinates.size()); + + meshkernel::CurvilinearParameters curvilinearParameters; + curvilinearParameters.m_refinement = 40; + curvilinearParameters.n_refinement = 10; + meshkernel::SplinesToCurvilinearParameters splinesToCurvilinearParameters; + splinesToCurvilinearParameters.aspect_ratio = 0.1; + splinesToCurvilinearParameters.aspect_ratio_grow_factor = 1.1; + splinesToCurvilinearParameters.average_width = 500.0; + splinesToCurvilinearParameters.curvature_adapted_grid_spacing = 1; + splinesToCurvilinearParameters.maximum_num_faces_in_uniform_part = 5; + splinesToCurvilinearParameters.nodes_on_top_of_each_other_tolerance = 0.0001; + splinesToCurvilinearParameters.min_cosine_crossing_angles = 0.95; + splinesToCurvilinearParameters.check_front_collisions = 0; + splinesToCurvilinearParameters.remove_skinny_triangles = 1; + splinesToCurvilinearParameters.grow_grid_outside = 0; + + // Execute + auto errorCode = mkernel_curvilinear_initialize_orthogonal_grid_from_splines(meshKernelId, + geometryListIn, + curvilinearParameters, + splinesToCurvilinearParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Grow grid, from the second layer + for (auto layer = 1; layer <= curvilinearParameters.n_refinement; ++layer) + { + errorCode = meshkernelapi::mkernel_curvilinear_iterate_orthogonal_grid_from_splines(meshKernelId, layer); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + } + + // Puts the computed curvilinear mesh into the mesh state (unstructured mesh) + errorCode = meshkernelapi::mkernel_curvilinear_refresh_orthogonal_grid_from_splines(meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Delete the mesh curvilinearGridFromSplinesInstances vector entry + errorCode = meshkernelapi::mkernel_curvilinear_delete_orthogonal_grid_from_splines(meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Get the new state + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + + // Assert + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + ASSERT_EQ(3, curvilinearGrid.num_m); + ASSERT_EQ(7, curvilinearGrid.num_n); +} + +TEST_F(CartesianApiTestFixture, RefineCompute_OnCurvilinearGrid_ShouldRefine) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + MakeRectangularCurvilinearGrid(3, 3); + + auto errorCode = meshkernelapi::mkernel_curvilinear_refine(meshKernelId, 10.0, 20.0, 20.0, 20.0, 10); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + ASSERT_EQ(4, curvilinearGrid.num_m); + ASSERT_EQ(13, curvilinearGrid.num_n); +} + +TEST_F(CartesianApiTestFixture, DerefineCompute_OnCurvilinearGrid_ShouldDeRefine) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + MakeRectangularCurvilinearGrid(); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_derefine(meshKernelId, 10.0, 20.0, 30.0, 20.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + ASSERT_EQ(5, curvilinearGrid.num_m); + ASSERT_EQ(4, curvilinearGrid.num_n); +} + +TEST_F(CartesianApiTestFixture, Orthogonalize_CurvilinearGrid_ShouldOrthogonalize) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + MakeRectangularCurvilinearGrid(3, 3); + // Move a node to make the grid non orthogonal + auto errorCode = meshkernelapi::mkernel_curvilinear_move_node(meshKernelId, 10.0, 20.0, 18.0, 12.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernel::OrthogonalizationParameters orthogonalizationParameters{}; + orthogonalizationParameters.outer_iterations = 1; + orthogonalizationParameters.boundary_iterations = 25; + orthogonalizationParameters.inner_iterations = 25; + orthogonalizationParameters.orthogonalization_to_smoothing_factor = 0.975; + + // Execute + errorCode = meshkernelapi::mkernel_curvilinear_initialize_orthogonalize(meshKernelId, orthogonalizationParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + errorCode = meshkernelapi::mkernel_curvilinear_set_block_orthogonalize(meshKernelId, 0.0, 0.0, 30.0, 30.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + errorCode = meshkernelapi::mkernel_curvilinear_orthogonalize(meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert (nothing changed) + ASSERT_EQ(4, curvilinearGrid.num_m); + ASSERT_EQ(4, curvilinearGrid.num_n); + + std::vector xNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector yNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = xNodesCurvilinearGrid.data(); + curvilinearGrid.node_y = yNodesCurvilinearGrid.data(); + + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + double const tolerance = 1e-6; + ASSERT_NEAR(11.841396536135521, curvilinearGrid.node_x[9], tolerance); + ASSERT_NEAR(18.158586078094562, curvilinearGrid.node_y[9], tolerance); +} + +TEST_F(CartesianApiTestFixture, Smoothing_CurvilinearGrid_ShouldSmooth) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + MakeRectangularCurvilinearGrid(); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_smoothing(meshKernelId, 10, 10.0, 20.0, 30.0, 20.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert (nothing changed) + ASSERT_EQ(5, curvilinearGrid.num_m); + ASSERT_EQ(5, curvilinearGrid.num_n); +} + +TEST_F(CartesianApiTestFixture, ComputedDirectionalSmooth_CurvilinearGrid_ShouldSmooth) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + MakeRectangularCurvilinearGrid(); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_smoothing_directional(meshKernelId, + 10, + 10.0, + 0.0, + 10.0, + 30.0, + 10.0, + 0.0, + 30.0, + 0.0); + + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert (nothing changed) + ASSERT_EQ(5, curvilinearGrid.num_m); + ASSERT_EQ(5, curvilinearGrid.num_n); +} + +TEST_F(CartesianApiTestFixture, ComputedLineShift_CurvilinearGrid_ShouldShift) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + MakeRectangularCurvilinearGrid(); + + meshkernelapi::mkernel_curvilinear_initialize_line_shift(meshKernelId); + + auto errorCode = meshkernelapi::mkernel_curvilinear_set_line_line_shift(meshKernelId, 0.0, 0.0, 0.0, 30.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + errorCode = meshkernelapi::mkernel_curvilinear_set_block_line_shift(meshKernelId, 0.0, 0.0, 30.0, 30.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + /// Move a gridline point, in this case the origin to -10.0, 0.0 + errorCode = meshkernelapi::mkernel_curvilinear_move_node_line_shift(meshKernelId, 0.0, 0.0, -10.0, 0.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Execute + errorCode = meshkernelapi::mkernel_curvilinear_line_shift(meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + errorCode = meshkernelapi::mkernel_curvilinear_finalize_line_shift(meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert, the nodes along the grid line have changed + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + std::vector xNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector yNodesCurvilinearGrid(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = xNodesCurvilinearGrid.data(); + curvilinearGrid.node_y = yNodesCurvilinearGrid.data(); + + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + ASSERT_EQ(-10.0, curvilinearGrid.node_x[0]); + ASSERT_EQ(2.5, curvilinearGrid.node_x[1]); + ASSERT_EQ(17.5, curvilinearGrid.node_x[2]); + ASSERT_EQ(30.0, curvilinearGrid.node_x[3]); +} + +TEST_F(CartesianApiTestFixture, CurvilinearComputeOrthogonalGridFromSplines_ShouldMakeCurvilinearGrid) +{ + // Setup + meshkernelapi::GeometryList splines{}; + double geometrySeparator = meshkernelapi::mkernel_get_separator(); + + std::vector coordinatesX{ + 7.7979524E+04, + 7.7979524E+04, + 7.8302860E+04, + 7.9732343E+04, + 8.0889543E+04, + 8.0668314E+04, + 7.9579184E+04, + geometrySeparator, + 7.6618112E+04, + 7.6754253E+04, + 7.7179694E+04, + 7.8404966E+04, + 7.9681290E+04, + 8.0140766E+04, + 7.9477078E+04, + 7.8779354E+04, + geometrySeparator, + 7.7281800E+04, + 7.7366889E+04, + 7.7928471E+04, + 7.9153742E+04, + 8.0242872E+04, + 8.0481119E+04, + 7.9970590E+04, + 7.9579184E+04, + 7.9170760E+04, + geometrySeparator, + 7.613792E+04, + 7.831719E+04, + geometrySeparator, + 7.857202E+04, + 8.003072E+04}; + + std::vector coordinatesY{ + 3.7127829E+05, + 3.7025723E+05, + 3.6898090E+05, + 3.6809598E+05, + 3.6698984E+05, + 3.6578158E+05, + 3.6419894E+05, + geometrySeparator, + 3.7136337E+05, + 3.7005301E+05, + 3.6874265E+05, + 3.6780668E+05, + 3.6721107E+05, + 3.6636018E+05, + 3.6544123E+05, + 3.6452228E+05, + geometrySeparator, + 3.7144846E+05, + 3.6984880E+05, + 3.6874265E+05, + 3.6792581E+05, + 3.6722808E+05, + 3.6641124E+05, + 3.6542421E+05, + 3.6484561E+05, + 3.6431806E+05, + geometrySeparator, + 3.712157E+05, + 3.710751E+05, + geometrySeparator, + 3.649151E+05, + 3.641506E+05}; + + splines.coordinates_x = coordinatesX.data(); + splines.coordinates_y = coordinatesY.data(); + splines.num_coordinates = static_cast(coordinatesX.size()); + + meshkernel::SplinesToCurvilinearParameters splinesToCurvilinearParameters; + meshkernel::CurvilinearParameters curvilinearParameters{}; + + curvilinearParameters.m_refinement = 20; + curvilinearParameters.n_refinement = 40; + splinesToCurvilinearParameters.aspect_ratio = 0.5; + splinesToCurvilinearParameters.aspect_ratio_grow_factor = 1.0; + splinesToCurvilinearParameters.average_width = 500.0; + splinesToCurvilinearParameters.curvature_adapted_grid_spacing = true; + splinesToCurvilinearParameters.grow_grid_outside = 0; + splinesToCurvilinearParameters.maximum_num_faces_in_uniform_part = 8; + + splinesToCurvilinearParameters.nodes_on_top_of_each_other_tolerance = 1e-4; + splinesToCurvilinearParameters.min_cosine_crossing_angles = 0.95; + splinesToCurvilinearParameters.check_front_collisions = false; + splinesToCurvilinearParameters.remove_skinny_triangles = true; + + // Execute, with large length threshold + auto const meshKernelId = GetMeshKernelId(); + auto errorCode = mkernel_curvilinear_compute_orthogonal_grid_from_splines(meshKernelId, + splines, + curvilinearParameters, + splinesToCurvilinearParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert one curvilinear grid is produced + ASSERT_GT(curvilinearGrid.num_m, 0); + ASSERT_GT(curvilinearGrid.num_n, 0); +} + +TEST_F(CartesianApiTestFixture, CurvilinearInsertFace_ShouldInsertAFace) +{ + // Setup + MakeRectangularCurvilinearGrid(); + auto const meshKernelId = GetMeshKernelId(); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_insert_face(meshKernelId, -5.0, 5.0); + + // Assert + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = node_x.data(); + curvilinearGrid.node_y = node_y.data(); + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert two extra nodes have been inserted (before it was 5 by 5 = 25 nodes, not it is 25 + 2 = 27) + auto const numValidNodes = CurvilinearGridCountValidNodes(curvilinearGrid); + ASSERT_EQ(numValidNodes, 27); +} + +TEST_F(CartesianApiTestFixture, CurvilinearLineMirror_ShouldInsertANewGridLine) +{ + // Setup + MakeRectangularCurvilinearGrid(); + auto const meshKernelId = GetMeshKernelId(); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_line_mirror(meshKernelId, + 1.2, + 0.0, + 0.0, + 0.0, + 50.0); + + // Assert + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert that 5 nodes have been inserted on the bottom boundary, so the total count is 30 + ASSERT_EQ(curvilinearGrid.num_m * curvilinearGrid.num_n, 30); +} + +TEST_F(CartesianApiTestFixture, CurvilinearLineAttractionRepulsion_ShouldAttractGridlines) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + + MakeRectangularCurvilinearGrid(5, 5); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_line_attraction_repulsion(meshKernelId, + 0.5, + 30.0, 0.0, 30.0, 50.0, + 10.0, 20.0, 50.0, 20.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = node_x.data(); + curvilinearGrid.node_y = node_y.data(); + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert data + const double tolerance = 1e-6; + // Nodes + ASSERT_NEAR(17.5, curvilinearGrid.node_x[2], tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.node_y[2], tolerance); + ASSERT_NEAR(42.5, curvilinearGrid.node_x[4], tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.node_y[4], tolerance); +} + +TEST_F(CartesianApiTestFixture, CurvilinearDeleteNode_ShouldDeleteNode) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + MakeRectangularCurvilinearGrid(5, 5); + + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + auto errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = node_x.data(); + curvilinearGrid.node_y = node_y.data(); + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + auto const numValidNodesBefore = CurvilinearGridCountValidNodes(curvilinearGrid); + + // Execute + errorCode = meshkernelapi::mkernel_curvilinear_delete_node(meshKernelId, 10.0, 0.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Asserts + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Two nodes are removed, one by delete node and one by the administration. The node is at the corner and the entire face will be removed + auto const numValidNodesAfter = CurvilinearGridCountValidNodes(curvilinearGrid); + ASSERT_EQ(numValidNodesBefore - 2, numValidNodesAfter); +} + +TEST(CurvilinearGrid, MakeRectangularOnDefinedExtension_OnSphericalCoordinates_ShouldMakeCurvilinearGrid) +{ + // Setup + meshkernel::MakeGridParameters makeGridParameters; + makeGridParameters.origin_x = 0.0; + makeGridParameters.origin_y = 0.0; + makeGridParameters.upper_right_x = 10.0; + makeGridParameters.upper_right_y = 10.0; + makeGridParameters.block_size_x = 1.0; + makeGridParameters.block_size_y = 2.0; + + int meshKernelId = 0; + int projectionType = 0; + auto errorCode = meshkernelapi::mkernel_allocate_state(projectionType, meshKernelId); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Execute + errorCode = meshkernelapi::mkernel_curvilinear_compute_rectangular_grid_on_extension(meshKernelId, makeGridParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernelapi::CurvilinearGrid curvilinearGridResults; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGridResults); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert + ASSERT_EQ(6, curvilinearGridResults.num_m); + ASSERT_EQ(11, curvilinearGridResults.num_n); +} + +TEST_F(CartesianApiTestFixture, CurvilinearDeleteExterior_OnCurvilinearGrid_ShouldDeleteExterior) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + MakeRectangularCurvilinearGrid(10, 10, 1.0, 1.0, 0.0, 0.0); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_delete_exterior(meshKernelId, 5.0, 5.0, 15.0, 15.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = node_x.data(); + curvilinearGrid.node_y = node_y.data(); + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + double const tolerance = 1e-6; + ASSERT_NEAR(meshkernel::constants::missing::doubleValue, curvilinearGrid.node_x[0], tolerance); + ASSERT_NEAR(meshkernel::constants::missing::doubleValue, curvilinearGrid.node_y[0], tolerance); + ASSERT_NEAR(5.0, curvilinearGrid.node_x[60], tolerance); + ASSERT_NEAR(5.0, curvilinearGrid.node_y[60], tolerance); +} + +TEST_F(CartesianApiTestFixture, CurvilinearDeleteInterior_OnCurvilinearGrid_ShouldDeleteExterior) +{ + // Prepare + auto const meshKernelId = GetMeshKernelId(); + MakeRectangularCurvilinearGrid(10, 10, 1.0, 1.0, 0.0, 0.0); + + // Execute + auto errorCode = meshkernelapi::mkernel_curvilinear_delete_interior(meshKernelId, 5.0, 5.0, 15.0, 15.0); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Assert + meshkernelapi::CurvilinearGrid curvilinearGrid{}; + errorCode = mkernel_curvilinear_get_dimensions(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + ASSERT_EQ(11, curvilinearGrid.num_m); + ASSERT_EQ(11, curvilinearGrid.num_n); + + std::vector node_x(curvilinearGrid.num_m * curvilinearGrid.num_n); + std::vector node_y(curvilinearGrid.num_m * curvilinearGrid.num_n); + curvilinearGrid.node_x = node_x.data(); + curvilinearGrid.node_y = node_y.data(); + errorCode = mkernel_curvilinear_get_data(meshKernelId, curvilinearGrid); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + double const tolerance = 1e-6; + ASSERT_NEAR(0.0, curvilinearGrid.node_x[0], tolerance); + ASSERT_NEAR(0.0, curvilinearGrid.node_y[0], tolerance); + ASSERT_NEAR(meshkernel::constants::missing::doubleValue, curvilinearGrid.node_x[72], tolerance); + ASSERT_NEAR(meshkernel::constants::missing::doubleValue, curvilinearGrid.node_y[72], tolerance); +} diff --git a/tools/test_utils/include/TestUtils/MakeCurvilinearGrids.hpp b/tools/test_utils/include/TestUtils/MakeCurvilinearGrids.hpp index e18bf5f39..f4bf969ad 100644 --- a/tools/test_utils/include/TestUtils/MakeCurvilinearGrids.hpp +++ b/tools/test_utils/include/TestUtils/MakeCurvilinearGrids.hpp @@ -39,17 +39,17 @@ size_t CurvilinearGridCountValidNodes(meshkernelapi::CurvilinearGrid const& curv /// @brief Counts the number of valid nodes in a meshkernel::CurvilinearGrid instance /// @param The input curvilinear grid /// @return The number of valid nodes -size_t CurvilinearGridCountValidNodes(std::shared_ptr const& curvilinearGrid); +size_t CurvilinearGridCountValidNodes(meshkernel::CurvilinearGrid const& curvilinearGrid); /// @brief Makes a small, real world curvi grid /// See tests/CurvilinearGrids/Orthogonalization/small_curvi_grid.png for a plot of the grid /// @return A pointer to a curvilinear grid -std::shared_ptr MakeSmallCurvilinearGrid(); +meshkernel::CurvilinearGrid MakeSmallCurvilinearGrid(); /// @brief Makes a small, real world curvi grid, with missing faces /// @return A pointer to a curvilinear grid -std::shared_ptr MakeSmallCurvilinearGridWithMissingFaces(); +meshkernel::CurvilinearGrid MakeSmallCurvilinearGridWithMissingFaces(); /// @brief Makes a curvilinear grid /// @return A pointer to a curvilinear grid -std::shared_ptr MakeCurvilinearGrid(double originX, double originY, double deltaX, double deltaY, size_t nx, size_t ny); +meshkernel::CurvilinearGrid MakeCurvilinearGrid(double originX, double originY, double deltaX, double deltaY, size_t nx, size_t ny); diff --git a/tools/test_utils/src/MakeCurvilinearGrids.cpp b/tools/test_utils/src/MakeCurvilinearGrids.cpp index b3cc32157..a5af2be5e 100644 --- a/tools/test_utils/src/MakeCurvilinearGrids.cpp +++ b/tools/test_utils/src/MakeCurvilinearGrids.cpp @@ -20,15 +20,15 @@ size_t CurvilinearGridCountValidNodes(meshkernelapi::CurvilinearGrid const& curv return validNodes; } -size_t CurvilinearGridCountValidNodes(std::shared_ptr const& curvilinearGrid) +size_t CurvilinearGridCountValidNodes(meshkernel::CurvilinearGrid const& curvilinearGrid) { size_t validNodes = 0; size_t index = 0; - for (size_t m = 0; m < curvilinearGrid->m_numM; ++m) + for (size_t m = 0; m < curvilinearGrid.m_numM; ++m) { - for (size_t n = 0; n < curvilinearGrid->m_numN; ++n) + for (size_t n = 0; n < curvilinearGrid.m_numN; ++n) { - if (curvilinearGrid->m_gridNodes(m, n).IsValid()) + if (curvilinearGrid.m_gridNodes(m, n).IsValid()) { validNodes++; } @@ -38,7 +38,7 @@ size_t CurvilinearGridCountValidNodes(std::shared_ptr MakeSmallCurvilinearGrid() +meshkernel::CurvilinearGrid MakeSmallCurvilinearGrid() { using namespace meshkernel; lin_alg::Matrix grid(5, 9); @@ -93,10 +93,10 @@ std::shared_ptr MakeSmallCurvilinearGrid() Point{8.084783925515387091E+04, 3.665315881046829163E+05}, Point{8.096094935050149797E+04, 3.665225607507624663E+05}; - return std::make_shared(grid, meshkernel::Projection::cartesian); + return meshkernel::CurvilinearGrid(grid, meshkernel::Projection::cartesian); } -std::shared_ptr MakeSmallCurvilinearGridWithMissingFaces() +meshkernel::CurvilinearGrid MakeSmallCurvilinearGridWithMissingFaces() { using namespace meshkernel; lin_alg::Matrix grid(5, 9); @@ -151,10 +151,10 @@ std::shared_ptr MakeSmallCurvilinearGridWithMissing Point{8.084783925515387091E+04, 3.665315881046829163E+05}, Point{8.096094935050149797E+04, 3.665225607507624663E+05}; - return std::make_shared(grid, meshkernel::Projection::cartesian); + return meshkernel::CurvilinearGrid(grid, meshkernel::Projection::cartesian); } -std::shared_ptr MakeCurvilinearGrid(double originX, double originY, double deltaX, double deltaY, size_t nx, size_t ny) +meshkernel::CurvilinearGrid MakeCurvilinearGrid(double originX, double originY, double deltaX, double deltaY, size_t nx, size_t ny) { double y = originY; @@ -173,5 +173,5 @@ std::shared_ptr MakeCurvilinearGrid(double originX, y += deltaY; } - return std::make_shared(points, meshkernel::Projection::cartesian); + return meshkernel::CurvilinearGrid(points, meshkernel::Projection::cartesian); }