Skip to content

Commit

Permalink
GRIDEDIT-1526: Refactor ProjectionsOptions, correct orthogonalization…
Browse files Browse the repository at this point in the history
… projection
  • Loading branch information
lucacarniato committed Nov 19, 2024
1 parent 95323e6 commit 2bc3039
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 46 deletions.
15 changes: 7 additions & 8 deletions libs/MeshKernel/include/MeshKernel/LandBoundaries.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,13 @@ namespace meshkernel
{

public:
/// Enumerator describing the options how to project to the land boundary
enum class ProjectToLandBoundaryOption
/// Enumerator describing the options how to project
enum class ProjectionsOptions
{
DoNotProjectToLandBoundary = 0,
ToOriginalNetBoundary = 1,
OuterMeshBoundaryToLandBoundary = 2,
InnerAndOuterMeshBoundaryToLandBoundary = 3,
WholeMesh = 4
DoNotProject = 0,
ToOriginalMeshBoundary = 1,
OuterMeshBoundaryToLandBoundaries = 2,
InnerAndOuterMeshBoundaryToLandboundaries = 3
};

/// @brief Default constructor
Expand All @@ -81,7 +80,7 @@ namespace meshkernel

/// @brief Find the mesh boundary line closest to the land boundary (find_nearest_meshline).
/// @param[in] projectToLandBoundaryOption The option describing the projection to the land boundary.
void FindNearestMeshBoundary(ProjectToLandBoundaryOption projectToLandBoundaryOption);
void FindNearestMeshBoundary(ProjectionsOptions projectToLandBoundaryOption);

/// @brief Snap the mesh nodes to land boundaries (snap_to_landboundary)
[[nodiscard]] std::unique_ptr<UndoAction> SnapMeshToLandBoundaries() const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ namespace meshkernel
std::unique_ptr<Orthogonalizer> orthogonalizer,
std::unique_ptr<Polygons> polygon,
std::unique_ptr<LandBoundaries> landBoundaries,
LandBoundaries::ProjectToLandBoundaryOption projectToLandBoundaryOption,
LandBoundaries::ProjectionsOptions projectToLandBoundaryOption,
const OrthogonalizationParameters& orthogonalizationParameters);

/// @brief Initializes the object
Expand Down Expand Up @@ -140,13 +140,13 @@ namespace meshkernel
/// @brief Compute nodes local coordinates (comp_local_coords)
void ComputeCoordinates() const;

Mesh2D& m_mesh; ///< A reference to mesh
std::unique_ptr<Smoother> m_smoother; ///< A pointer to the smoother
std::unique_ptr<Orthogonalizer> m_orthogonalizer; ///< A pointer to the orthogonalizer
std::unique_ptr<Polygons> m_polygons; ///< The polygon pointer where to perform the orthogonalization
std::unique_ptr<LandBoundaries> m_landBoundaries; ///< The land boundaries pointer
LandBoundaries::ProjectToLandBoundaryOption m_projectToLandBoundaryOption; ///< The project to land boundary option
OrthogonalizationParameters m_orthogonalizationParameters; ///< The orthogonalization parameters
Mesh2D& m_mesh; ///< A reference to mesh
std::unique_ptr<Smoother> m_smoother; ///< A pointer to the smoother
std::unique_ptr<Orthogonalizer> m_orthogonalizer; ///< A pointer to the orthogonalizer
std::unique_ptr<Polygons> m_polygons; ///< The polygon pointer where to perform the orthogonalization
std::unique_ptr<LandBoundaries> m_landBoundaries; ///< The land boundaries pointer
LandBoundaries::ProjectionsOptions m_projectOptions; ///< The projection options
OrthogonalizationParameters m_orthogonalizationParameters; ///< The orthogonalization parameters

std::vector<UInt> m_localCoordinatesIndices; ///< Used in sphericalAccurate projection (iloc)
std::vector<Point> m_localCoordinates; ///< Used in sphericalAccurate projection (xloc,yloc)
Expand Down
2 changes: 1 addition & 1 deletion libs/MeshKernel/src/FlipEdges.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ FlipEdges::FlipEdges(Mesh2D& mesh,
{
if (m_projectToLandBoundary)
{
m_landBoundaries.FindNearestMeshBoundary(LandBoundaries::ProjectToLandBoundaryOption::WholeMesh);
m_landBoundaries.FindNearestMeshBoundary(LandBoundaries::ProjectionsOptions::OuterMeshBoundaryToLandBoundaries);
}
}

Expand Down
14 changes: 8 additions & 6 deletions libs/MeshKernel/src/LandBoundaries.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,18 +98,20 @@ void LandBoundaries::Administrate()
}
}

void LandBoundaries::FindNearestMeshBoundary(ProjectToLandBoundaryOption projectToLandBoundaryOption)
void LandBoundaries::FindNearestMeshBoundary(ProjectionsOptions projectToLandBoundaryOption)
{
if (m_landBoundary.IsEmpty() || projectToLandBoundaryOption == ProjectToLandBoundaryOption::DoNotProjectToLandBoundary)
if (m_landBoundary.IsEmpty())
{
return;
}

if (projectToLandBoundaryOption == ProjectToLandBoundaryOption::OuterMeshBoundaryToLandBoundary ||
projectToLandBoundaryOption == ProjectToLandBoundaryOption::InnerAndOuterMeshBoundaryToLandBoundary)
if (projectToLandBoundaryOption != ProjectionsOptions::OuterMeshBoundaryToLandBoundaries &&
projectToLandBoundaryOption != ProjectionsOptions::InnerAndOuterMeshBoundaryToLandboundaries)
{
m_findOnlyOuterMeshBoundary = true;
return;
}
m_findOnlyOuterMeshBoundary = true;


Administrate();

Expand All @@ -124,7 +126,7 @@ void LandBoundaries::FindNearestMeshBoundary(ProjectToLandBoundaryOption project
{
const auto [_, numRejectedPaths] = MakePath(landBoundarySegment);

if (numRejectedPaths > 0 && projectToLandBoundaryOption == ProjectToLandBoundaryOption::InnerAndOuterMeshBoundaryToLandBoundary)
if (numRejectedPaths > 0 && projectToLandBoundaryOption == ProjectionsOptions::InnerAndOuterMeshBoundaryToLandboundaries)
{
m_findOnlyOuterMeshBoundary = false;
MakePath(landBoundarySegment);
Expand Down
12 changes: 8 additions & 4 deletions libs/MeshKernel/src/OrthogonalizationAndSmoothing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ OrthogonalizationAndSmoothing::OrthogonalizationAndSmoothing(Mesh2D& mesh,
std::unique_ptr<Orthogonalizer> orthogonalizer,
std::unique_ptr<Polygons> polygon,
std::unique_ptr<LandBoundaries> landBoundaries,
LandBoundaries::ProjectToLandBoundaryOption projectToLandBoundaryOption,
LandBoundaries::ProjectionsOptions projectToLandBoundaryOption,
const OrthogonalizationParameters& orthogonalizationParameters)
: m_mesh(mesh),
m_smoother(std::move(smoother)),
m_orthogonalizer(std::move(orthogonalizer)),
m_polygons(std::move(polygon)),
m_landBoundaries(std::move(landBoundaries)),
m_projectToLandBoundaryOption(projectToLandBoundaryOption)
m_projectOptions(projectToLandBoundaryOption)
{
CheckOrthogonalizationParameters(orthogonalizationParameters);
m_orthogonalizationParameters = orthogonalizationParameters;
Expand Down Expand Up @@ -91,8 +91,12 @@ std::unique_ptr<meshkernel::UndoAction> OrthogonalizationAndSmoothing::Initializ
m_originalNodes = m_mesh.Nodes();
m_orthogonalCoordinates = m_mesh.Nodes();

// account for enclosing polygon
m_landBoundaries->FindNearestMeshBoundary(m_projectToLandBoundaryOption);
//
if (m_projectOptions == LandBoundaries::ProjectionsOptions::OuterMeshBoundaryToLandBoundaries ||
m_projectOptions == LandBoundaries::ProjectionsOptions::InnerAndOuterMeshBoundaryToLandboundaries)
{
m_landBoundaries->FindNearestMeshBoundary(m_projectOptions);
}

// for spherical accurate computations we need to call PrapareOuterIteration (orthonet_comp_ops)
if (m_mesh.m_projection == Projection::sphericalAccurate)
Expand Down
8 changes: 4 additions & 4 deletions libs/MeshKernel/tests/src/LandBoundaryTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ TEST(LandBoundaries, OneLandBoundary)

// Execute
auto landboundaries = meshkernel::LandBoundaries(landBoundaryPolygon, *mesh, polygons);
landboundaries.FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectToLandBoundaryOption ::OuterMeshBoundaryToLandBoundary);
landboundaries.FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectionsOptions ::OuterMeshBoundaryToLandBoundaries);

// Checks
EXPECT_EQ(1, landboundaries.m_meshNodesLandBoundarySegments[0]);
Expand Down Expand Up @@ -62,7 +62,7 @@ TEST(LandBoundaries, TwoLandBoundaries)

// Execute
auto landboundaries = std::make_shared<meshkernel::LandBoundaries>(landBoundaryPolygon, *mesh, polygons);
landboundaries->FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectToLandBoundaryOption::OuterMeshBoundaryToLandBoundary);
landboundaries->FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectionsOptions::OuterMeshBoundaryToLandBoundaries);

// Checks
EXPECT_EQ(2, landboundaries->m_meshNodesLandBoundarySegments[0]);
Expand Down Expand Up @@ -94,7 +94,7 @@ TEST(LandBoundaries, OneCrossingLandBoundary)

// Execute
auto landboundaries = std::make_shared<meshkernel::LandBoundaries>(landBoundaryPolygon, *mesh, polygons);
landboundaries->FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectToLandBoundaryOption ::OuterMeshBoundaryToLandBoundary);
landboundaries->FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectionsOptions ::OuterMeshBoundaryToLandBoundaries);

// Checks
EXPECT_EQ(0, landboundaries->m_meshNodesLandBoundarySegments[0]);
Expand Down Expand Up @@ -130,7 +130,7 @@ TEST(LandBoundaries, TwoCrossingLandBoundary)

// Execute
auto landboundaries = std::make_shared<meshkernel::LandBoundaries>(landBoundaryPolygon, *mesh, polygons);
landboundaries->FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectToLandBoundaryOption ::OuterMeshBoundaryToLandBoundary);
landboundaries->FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectionsOptions ::OuterMeshBoundaryToLandBoundaries);

// Checks
EXPECT_EQ(2, landboundaries->m_meshNodesLandBoundarySegments[0]);
Expand Down
24 changes: 12 additions & 12 deletions libs/MeshKernel/tests/src/OrthogonalizationTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationOneQuadOneTriangle)
{3, 2},
{3, 1}};

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.inner_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -82,7 +82,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationSmallTriangularGrid)

// now build node-edge mapping
auto mesh = ReadLegacyMesh2DFromFile(TEST_FOLDER + "/data/SmallTriangularGrid_net.nc");
const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -140,7 +140,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationSmallTriangularGridAsNcFile
// now build node-edge mapping
auto mesh = MakeSmallSizeTriangularMeshForTestingAsNcFile();

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -200,7 +200,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationMediumTriangularGridWithPol
// The original mesh nodes
const std::vector<meshkernel::Point> meshNodes(mesh->Nodes());

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -278,7 +278,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationMediumTriangularGridWithUnd
// now build node-edge mapping
auto mesh = ReadLegacyMesh2DFromFile(TEST_FOLDER + "/data/TestOrthogonalizationMediumTriangularGrid_net.nc");

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -346,7 +346,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationFourQuads)
{
auto mesh = MakeRectangularMeshForTesting(3, 3, 1.0, Projection::cartesian);

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.inner_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -393,7 +393,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizeAndSnapToLandBoundaries)
{missing::doubleValue, missing::doubleValue}};

// snap to land boundaries
const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::OuterMeshBoundaryToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::OuterMeshBoundaryToLandBoundaries;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -449,7 +449,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationSphericalRectangular)
// 1 Setup
auto mesh = MakeRectangularMeshForTesting(4, 4, 0.003, Projection::spherical, {41.1, 41.1});

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -537,7 +537,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationSmallTriangulargridSpherica

auto mesh = std::make_shared<Mesh2D>(edges, nodes, Projection::spherical);

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -598,7 +598,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationSmallTriangulargridSpherica

auto mesh = std::make_shared<Mesh2D>(edges, nodes, Projection::spherical);

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -692,7 +692,7 @@ TEST(OrthogonalizationAndSmoothing, RefineUndoThenOrthogonalise)
auto refinementUndoAction = meshRefinement.Compute();
refinementUndoAction->Restore();

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.inner_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down Expand Up @@ -778,7 +778,7 @@ TEST(OrthogonalizationAndSmoothing, OrthogonalizationWithGapsInNodeAndEdgeLists)

FlipEdges flipEdges1(mesh, *boundary, true, false);

const auto projectToLandBoundaryOption = LandBoundaries::ProjectToLandBoundaryOption::DoNotProjectToLandBoundary;
const auto projectToLandBoundaryOption = LandBoundaries::ProjectionsOptions::DoNotProject;
OrthogonalizationParameters orthogonalizationParameters;
orthogonalizationParameters.outer_iterations = 2;
orthogonalizationParameters.boundary_iterations = 25;
Expand Down
6 changes: 3 additions & 3 deletions libs/MeshKernelApi/src/MeshKernel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,7 @@ namespace meshkernelapi
// Construct all dependencies
const auto polygon = meshkernel::Polygons(polygonNodes, meshKernelState[meshKernelId].m_projection);
auto landBoundary = meshkernel::LandBoundaries(landBoundariesPoints, *meshKernelState[meshKernelId].m_mesh2d, polygon);
landBoundary.FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectToLandBoundaryOption::InnerAndOuterMeshBoundaryToLandBoundary);
landBoundary.FindNearestMeshBoundary(meshkernel::LandBoundaries::ProjectionsOptions::InnerAndOuterMeshBoundaryToLandboundaries);

// Execute algorithm
meshKernelUndoStack.Add(landBoundary.SnapMeshToLandBoundaries());
Expand Down Expand Up @@ -1274,7 +1274,7 @@ namespace meshkernelapi
std::move(orthogonalizer),
std::move(polygon),
std::move(landBoundary),
static_cast<meshkernel::LandBoundaries::ProjectToLandBoundaryOption>(projectToLandBoundaryOption),
static_cast<meshkernel::LandBoundaries::ProjectionsOptions>(projectToLandBoundaryOption),
orthogonalizationParameters);
meshKernelUndoStack.Add(ortogonalization.Initialize(), meshKernelId);
ortogonalization.Compute();
Expand Down Expand Up @@ -1322,7 +1322,7 @@ namespace meshkernelapi
std::move(orthogonalizer),
std::move(polygon),
std::move(landBoundary),
static_cast<meshkernel::LandBoundaries::ProjectToLandBoundaryOption>(projectToLandBoundaryOption),
static_cast<meshkernel::LandBoundaries::ProjectionsOptions>(projectToLandBoundaryOption),
orthogonalizationParameters);
meshKernelUndoStack.Add(meshKernelState[meshKernelId].m_meshOrthogonalization->Initialize(), meshKernelId);
}
Expand Down

0 comments on commit 2bc3039

Please sign in to comment.