diff --git a/libs/MeshKernel/src/Mesh2D.cpp b/libs/MeshKernel/src/Mesh2D.cpp index 147794ce3..da6635883 100644 --- a/libs/MeshKernel/src/Mesh2D.cpp +++ b/libs/MeshKernel/src/Mesh2D.cpp @@ -2186,9 +2186,9 @@ std::unique_ptr Mesh2D::Merge(const Mesh2D& mesh1, const Mesh2D& mesh2) // Initialise with mesh1, Mesh2D mergedMesh(mesh1.m_edges, mesh1.m_nodes, mesh1.m_projection); - const auto mesh1NodeOffset = static_cast(mesh1.m_nodes.size()); - const auto mesh1EdgeOffset = static_cast(mesh1.m_edges.size()); - const auto mesh1FaceOffset = static_cast(mesh1.m_numFacesNodes.size()); + const auto mesh1NodeOffset = static_cast(mergedMesh.m_nodes.size()); + const auto mesh1EdgeOffset = static_cast(mergedMesh.m_edges.size()); + const auto mesh1FaceOffset = static_cast(mergedMesh.m_numFacesNodes.size()); // Merge node arrays mergedMesh.m_nodes.insert(mergedMesh.m_nodes.end(), mesh2.m_nodes.begin(), mesh2.m_nodes.end()); diff --git a/libs/MeshKernelApi/tests/src/Mesh2DRefinmentTests.cpp b/libs/MeshKernelApi/tests/src/Mesh2DRefinmentTests.cpp index f04976bfc..c8c59fec1 100644 --- a/libs/MeshKernelApi/tests/src/Mesh2DRefinmentTests.cpp +++ b/libs/MeshKernelApi/tests/src/Mesh2DRefinmentTests.cpp @@ -1096,3 +1096,90 @@ TEST(MeshRefinement, SplitAlongRow_FailureTests) errorCode = meshkernelapi::mkernel_mesh2d_split_row(meshKernelId, node1, node2); ASSERT_EQ(meshkernel::ExitCode::ConstraintErrorCode, errorCode); } + +TEST(MeshRefinement, ConnectingTwoMeshesAfterCasulliRefinementDoesNotCrash) +{ + // This test is really just to check that the sequence of steps involved does not cause a crash. + + // Prepare + int meshKernelId1; + int meshKernelId2; + constexpr int isSpherical = 0; + int errorCode = meshkernelapi::mkernel_allocate_state(isSpherical, meshKernelId1); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + errorCode = meshkernelapi::mkernel_allocate_state(isSpherical, meshKernelId2); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + meshkernel::MakeGridParameters gridParameters; + gridParameters.num_columns = 3; + gridParameters.num_rows = 3; + gridParameters.block_size_x = 10.0; + gridParameters.block_size_y = 10.0; + gridParameters.origin_x = 0.0; + gridParameters.origin_y = 0.0; + gridParameters.angle = 0.0; + + errorCode = meshkernelapi::mkernel_mesh2d_make_rectangular_mesh(meshKernelId1, gridParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + gridParameters.origin_x = 30.5; + gridParameters.origin_y = 0.0; + + errorCode = meshkernelapi::mkernel_mesh2d_make_rectangular_mesh(meshKernelId2, gridParameters); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + //-------------------------------- + + std::vector polygonPointsX({-5.0, 15.0, 15.0, -5.0, -5.0}); + std::vector polygonPointsY({15.0, 15.0, -5.0, -5.0, 15.0}); + meshkernelapi::GeometryList polygon; + polygon.num_coordinates = 5; + polygon.coordinates_x = polygonPointsX.data(); + polygon.coordinates_y = polygonPointsY.data(); + + errorCode = meshkernelapi::mkernel_mesh2d_casulli_refinement_on_polygon(meshKernelId1, polygon); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + //-------------------------------- + + meshkernelapi::Mesh2D mesh2d1{}; + errorCode = mkernel_mesh2d_get_dimensions(meshKernelId2, mesh2d1); + + std::vector node_x(mesh2d1.num_nodes); + std::vector node_y(mesh2d1.num_nodes); + std::vector edge_nodes(mesh2d1.num_edges * 2); + + mesh2d1.node_x = node_x.data(); + mesh2d1.node_y = node_y.data(); + mesh2d1.edge_nodes = edge_nodes.data(); + + errorCode = mkernel_mesh2d_get_node_edge_data(meshKernelId2, mesh2d1); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + // Connect the two meshes + // to note: the mesh associated with meshKernelId1 has gaps in the node and edge data arrays (with invalid data) + // after the Casulli refinement. The mesh data, mesh2d1, does not have any such gaps. + // The mesh with gaps in the data must appear first in the mesh connection. + errorCode = meshkernelapi::mkernel_mesh2d_connect_meshes(meshKernelId1, mesh2d1, 0.1); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + //-------------------------------- + + meshkernelapi::Mesh2D mesh2d2{}; + errorCode = mkernel_mesh2d_get_dimensions(meshKernelId1, mesh2d2); + + std::vector node_x2(mesh2d2.num_nodes); + std::vector node_y2(mesh2d2.num_nodes); + std::vector edge_nodes2(mesh2d2.num_edges * 2); + + mesh2d2.node_x = node_x2.data(); + mesh2d2.node_y = node_y2.data(); + mesh2d2.edge_nodes = edge_nodes2.data(); + + errorCode = mkernel_mesh2d_get_node_edge_data(meshKernelId1, mesh2d2); + ASSERT_EQ(meshkernel::ExitCode::Success, errorCode); + + EXPECT_EQ(mesh2d2.num_nodes, 44); + EXPECT_EQ(mesh2d2.num_edges, 72); +}