diff --git a/src/MeshKernelNET/Api/IMeshKernelApi.cs b/src/MeshKernelNET/Api/IMeshKernelApi.cs index 1f28904..ad62f82 100644 --- a/src/MeshKernelNET/Api/IMeshKernelApi.cs +++ b/src/MeshKernelNET/Api/IMeshKernelApi.cs @@ -1552,11 +1552,13 @@ int Mesh2dMakeRectangularMeshFromPolygon(int meshKernelId, /// Refine based on gridded samples /// /// The id of the mesh state + /// The region in which refinement is done, if empty the whole mesh will be considered /// The gridded samples /// The mesh refinement parameters /// Use nodal refinement /// Error code int Mesh2dRefineBasedOnGriddedSamples(int meshKernelId, + in DisposableGeometryList polygons, in DisposableGriddedSamples griddedSamplesNative, in MeshRefinementParameters meshRefinementParameters, bool useNodalRefinement); @@ -1565,13 +1567,15 @@ int Mesh2dRefineBasedOnGriddedSamples(int meshKernelId, /// Refines a mesh2d based on samples with ridge refinement. This method automatically detects the ridges in a sample set. /// /// The id of the mesh state - /// The gridded samples + /// The region in which refinement is done, if empty the whole mesh will be considered + /// The gridded samples /// The relative search radius relative to the face size, used for some interpolation algorithms /// The minimum number of samples used for some averaging algorithms /// The number of smoothing iterations to apply to the input sample set /// The mesh refinement parameters /// Error code int Mesh2dRefineRidgesBasedOnGriddedSamples(int meshKernelId, + in DisposableGeometryList polygons, in DisposableGriddedSamples griddedSamples, in MeshRefinementParameters meshRefinementParameters, double relativeSearchRadius, @@ -1593,13 +1597,18 @@ int Mesh2dRefineBasedOnPolygon(int meshKernelId, /// Refines a grid based on samples /// /// Id of the grid state + /// The region in which refinement is done, if empty the whole mesh will be considered /// The input samples /// Search radius for refinement. /// The minimum number of samples that must be added in refinement /// specifying how to refine /// Error code - int Mesh2dRefineBasedOnSamples(int meshKernelId, in DisposableGeometryList disposableGeometryListIn, - double relativeSearchRadius, int minimumNumSamples, in MeshRefinementParameters meshRefinementParameters); + int Mesh2dRefineBasedOnSamples(int meshKernelId, + in DisposableGeometryList polygons, + in DisposableGeometryList disposableGeometryListIn, + double relativeSearchRadius, + int minimumNumSamples, + in MeshRefinementParameters meshRefinementParameters); /// /// Rotates a mesh2d about a given point by a given angle diff --git a/src/MeshKernelNET/Api/MeshKernelApi.cs b/src/MeshKernelNET/Api/MeshKernelApi.cs index 8f203dc..4f3985e 100644 --- a/src/MeshKernelNET/Api/MeshKernelApi.cs +++ b/src/MeshKernelNET/Api/MeshKernelApi.cs @@ -4,7 +4,6 @@ using System.Runtime.InteropServices; using MeshKernelNET.Helpers; using MeshKernelNET.Native; -using NetTopologySuite.Operation.Valid; namespace MeshKernelNET.Api { @@ -1521,30 +1520,36 @@ public int Mesh2dPrepareOuterIterationOrthogonalization(int meshKernelId) } public int Mesh2dRefineBasedOnGriddedSamples(int meshKernelId, - in DisposableGriddedSamples griddedSamples, - in MeshRefinementParameters meshRefinementParameters, - bool useNodalRefinement) + in DisposableGeometryList polygons, + in DisposableGriddedSamples griddedSamples, + in MeshRefinementParameters meshRefinementParameters, + bool useNodalRefinement) { + GeometryListNative polygonsNative = polygons.CreateNativeObject(); GriddedSamplesNative griddedSamplesNative = griddedSamples.CreateNativeObject(); var meshRefinementParametersNative = meshRefinementParameters.ToMeshRefinementParametersNative(); return MeshKernelDll.Mesh2dRefineBasedOnGriddedSamples(meshKernelId, + ref polygonsNative, ref griddedSamplesNative, ref meshRefinementParametersNative, useNodalRefinement); } public int Mesh2dRefineRidgesBasedOnGriddedSamples(int meshKernelId, + in DisposableGeometryList polygons, in DisposableGriddedSamples griddedSamples, in MeshRefinementParameters meshRefinementParameters, double relativeSearchRadius, int minimumNumSamples, int numberOfSmoothingIterations) { + GeometryListNative polygonsNative = polygons.CreateNativeObject(); GriddedSamplesNative griddedSamplesNative = griddedSamples.CreateNativeObject(); var meshRefinementParametersNative = meshRefinementParameters.ToMeshRefinementParametersNative(); return MeshKernelDll.Mesh2dRefineRidgesBasedOnGriddedSamples(meshKernelId, + ref polygonsNative, ref griddedSamplesNative, relativeSearchRadius, minimumNumSamples, @@ -1559,11 +1564,13 @@ public int Mesh2dRefineBasedOnPolygon(int meshKernelId, in DisposableGeometryLis return MeshKernelDll.Mesh2dRefineBasedOnPolygon(meshKernelId, ref disposableGeometryListInNative, ref meshRefinementParametersNative); } - public int Mesh2dRefineBasedOnSamples(int meshKernelId, in DisposableGeometryList disposableGeometryListIn, double relativeSearchRadius, int minimumNumSamples, in MeshRefinementParameters meshRefinementParameters) + public int Mesh2dRefineBasedOnSamples(int meshKernelId, in DisposableGeometryList polygons, in DisposableGeometryList disposableGeometryListIn, double relativeSearchRadius, int minimumNumSamples, in MeshRefinementParameters meshRefinementParameters) { + GeometryListNative polygonsNative = polygons.CreateNativeObject(); GeometryListNative disposableGeometryListInNative = disposableGeometryListIn.CreateNativeObject(); var meshRefinementParametersNative = meshRefinementParameters.ToMeshRefinementParametersNative(); - return MeshKernelDll.Mesh2dRefineBasedOnSamples(meshKernelId, ref disposableGeometryListInNative, relativeSearchRadius, minimumNumSamples, ref meshRefinementParametersNative); + + return MeshKernelDll.Mesh2dRefineBasedOnSamples(meshKernelId, ref polygonsNative, ref disposableGeometryListInNative, relativeSearchRadius, minimumNumSamples, ref meshRefinementParametersNative); } public int Mesh2dRotate(int meshKernelId, double centreX, double centreY, double angle) diff --git a/src/MeshKernelNET/Native/MeshKernelDll.cs b/src/MeshKernelNET/Native/MeshKernelDll.cs index 28a25f4..cc27f80 100644 --- a/src/MeshKernelNET/Native/MeshKernelDll.cs +++ b/src/MeshKernelNET/Native/MeshKernelDll.cs @@ -1786,12 +1786,14 @@ internal static extern int Mesh2dMoveNode([In] int meshKernelId, /// Refine based on gridded samples /// /// The id of the mesh state + /// The region in which refinement is done, if empty the whole mesh will be considered /// The gridded samples /// The mesh refinement parameters /// Use nodal refinement /// Error code [DllImport(MeshKernelDllName, EntryPoint = "mkernel_mesh2d_refine_based_on_gridded_samples", CallingConvention = CallingConvention.Cdecl)] internal static extern int Mesh2dRefineBasedOnGriddedSamples([In] int meshKernelId, + [In] ref GeometryListNative polygons, [In] ref GriddedSamplesNative griddedSamplesNative, [In] ref MeshRefinementParametersNative meshRefinementParameters, [In] bool useNodalRefinement); @@ -1800,6 +1802,7 @@ internal static extern int Mesh2dRefineBasedOnGriddedSamples([In] int meshKernel /// Refines a mesh2d based on samples with ridge refinement. This method automatically detects the ridges in a sample set. /// /// The id of the mesh state + /// The region in which refinement is done, if empty the whole mesh will be considered /// The gridded samples /// The relative search radius relative to the face size, used for some interpolation algorithms /// The minimum number of samples used for some averaging algorithms @@ -1808,6 +1811,7 @@ internal static extern int Mesh2dRefineBasedOnGriddedSamples([In] int meshKernel /// Error code [DllImport(MeshKernelDllName, EntryPoint = "mkernel_mesh2d_refine_ridges_based_on_gridded_samples", CallingConvention = CallingConvention.Cdecl)] internal static extern int Mesh2dRefineRidgesBasedOnGriddedSamples([In] int meshKernelId, + [In] ref GeometryListNative polygons, [In] ref GriddedSamplesNative griddedSamplesNative, [In] double relativeSearchRadius, [In] int minimumNumSamples, @@ -1830,6 +1834,7 @@ internal static extern int Mesh2dRefineBasedOnPolygon([In] int meshKernelId, /// Refine a grid based on the samples contained in the geometry list /// /// Id of the mesh state + /// The region in which refinement is done, if empty the whole mesh will be considered /// The sample set /// /// The relative search radius relative to the face size, used for some interpolation @@ -1840,6 +1845,7 @@ internal static extern int Mesh2dRefineBasedOnPolygon([In] int meshKernelId, /// Error code [DllImport(MeshKernelDllName, EntryPoint = "mkernel_mesh2d_refine_based_on_samples", CallingConvention = CallingConvention.Cdecl)] internal static extern int Mesh2dRefineBasedOnSamples([In] int meshKernelId, + [In] ref GeometryListNative polygons, [In] ref GeometryListNative geometryListNative, [In] double relativeSearchRadius, [In] int minimumNumSamples, diff --git a/test/MeshKernelNETTest/Api/MeshKernelTest.cs b/test/MeshKernelNETTest/Api/MeshKernelTest.cs index cfc51f7..f4c115e 100644 --- a/test/MeshKernelNETTest/Api/MeshKernelTest.cs +++ b/test/MeshKernelNETTest/Api/MeshKernelTest.cs @@ -872,31 +872,34 @@ public void Mesh2dRefineBasedOnSamplesThroughAPI() // Setup using (DisposableMesh2D mesh = CreateMesh2D(4, 4, 100, 200)) using (var api = new MeshKernelApi()) - using (var geometryListIn = new DisposableGeometryList()) + using (var polygons = new DisposableGeometryList()) + using (var samples = new DisposableGeometryList()) { - var id = 0; var mesh2D = new DisposableMesh2D(); try { - id = api.AllocateState(0); + int id = api.AllocateState(0); Assert.That(api.Mesh2dSet(id, mesh), Is.EqualTo(0)); - double geometrySeparator = api.GetSeparator(); - geometryListIn.GeometrySeparator = geometrySeparator; - - geometryListIn.XCoordinates = new[] { 50.0, 150.0, 250.0, 50.0, 150.0, 250.0, 50.0, 150.0, 250.0 }; - - geometryListIn.YCoordinates = new[] { 50.0, 50.0, 50.0, 150.0, 150.0, 150.0, 250.0, 250.0, 250.0 }; - - geometryListIn.Values = new[] { 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0 }; - - geometryListIn.NumberOfCoordinates = geometryListIn.XCoordinates.Length; + + polygons.GeometrySeparator = api.GetSeparator(); + polygons.XCoordinates = new[] { 100.0, 300.0, 300.0, 100.0, 100.0 }; + polygons.YCoordinates = new[] { 200.0, 200.0, 600.0, 600.0, 200.0 }; + polygons.NumberOfCoordinates = polygons.XCoordinates.Length; + + samples.GeometrySeparator = api.GetSeparator(); + samples.XCoordinates = new[] { 50.0, 150.0, 250.0, 50.0, 150.0, 250.0, 50.0, 150.0, 250.0 }; + samples.YCoordinates = new[] { 50.0, 50.0, 50.0, 150.0, 150.0, 150.0, 250.0, 250.0, 250.0 }; + samples.Values = new[] { 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0 }; + samples.NumberOfCoordinates = samples.XCoordinates.Length; var meshRefinementParameters = MeshRefinementParameters.CreateDefault(); var relativeSearchRadius = 1.0; var minimumNumSamples = 1; - Assert.That(api.Mesh2dRefineBasedOnSamples(id, geometryListIn, relativeSearchRadius, minimumNumSamples, meshRefinementParameters), Is.EqualTo(0)); + + Assert.That(api.Mesh2dRefineBasedOnSamples(id, polygons, samples, relativeSearchRadius, minimumNumSamples, meshRefinementParameters), Is.EqualTo(0)); Assert.That(api.Mesh2dGetData(id, out mesh2D), Is.EqualTo(0)); + Assert.That(mesh2D.NumNodes, Is.EqualTo(49)); } finally { @@ -2814,21 +2817,27 @@ public void Mesh2dMakeRectangularMeshOnExtensionThroughAPI() } [Test] - public void Mesh2dRefineBasedOnFloatGriddedSamplesThroughAPI() + public void Mesh2dRefineBasedOnGriddedSamplesThroughAPI() { using (var api = new MeshKernelApi()) using (DisposableMesh2D mesh = CreateMesh2D(4, 4, 100, 200)) { - var id = 0; DisposableMesh2D meshOut = null; + var polygons = new DisposableGeometryList(); var griddedSamples = new DisposableGriddedSamples(6, 7, 0, 0, 0, (int)InterpolationTypes.Float); + try { // Setup - id = api.AllocateState(0); - + int id = api.AllocateState(0); var meshRefinementParameters = MeshRefinementParameters.CreateDefault(); + meshRefinementParameters.MaxNumRefinementIterations = 2; + polygons.GeometrySeparator = api.GetSeparator(); + polygons.XCoordinates = new[] { 100.0, 300.0, 300.0, 100.0, 100.0 }; + polygons.YCoordinates = new[] { 200.0, 200.0, 600.0, 600.0, 200.0 }; + polygons.NumberOfCoordinates = 5; + double coordinate = -50.0; var dx = 100.0; for (var i = 0; i < griddedSamples.NumX; i++) @@ -2845,26 +2854,28 @@ public void Mesh2dRefineBasedOnFloatGriddedSamplesThroughAPI() for (var i = 0; i < griddedSamples.Values.Length; ++i) { - - griddedSamples.Values[i] = -0.05f; + griddedSamples.Values[i] = 0.05f; } Assert.That(api.Mesh2dSet(id, mesh), Is.EqualTo(0)); // Execute Assert.That(api.Mesh2dRefineBasedOnGriddedSamples(id, - griddedSamples, - meshRefinementParameters, - true), Is.EqualTo(0)); + polygons, + griddedSamples, + meshRefinementParameters, + true), Is.EqualTo(0)); meshOut = new DisposableMesh2D(); + Assert.That(api.Mesh2dGetData(id, out meshOut), Is.EqualTo(0)); // Assert Assert.That(meshOut, Is.Not.Null); - Assert.That(meshOut.NumNodes, Is.EqualTo(16)); + Assert.That(meshOut.NumNodes, Is.EqualTo(166)); } finally { api.ClearState(); meshOut?.Dispose(); + polygons.Dispose(); griddedSamples.Dispose(); } } @@ -2874,21 +2885,19 @@ public void Mesh2dRefineBasedOnFloatGriddedSamplesThroughAPI() public void Mesh2dRefineRidgesBasedOnGriddedSamplesThroughAPI() { using (var api = new MeshKernelApi()) - using (DisposableMesh2D mesh = CreateMesh2D(4, - 4, - 100, - 200)) + using (DisposableMesh2D mesh = CreateMesh2D(4, 4, 100, 200)) { - var id = 0; + var polygons = new DisposableGeometryList(); var griddedSamples = new DisposableGriddedSamples(6, 7, 0, 0, 0, (int)InterpolationTypes.Double); + try { // Setup - id = api.AllocateState(0); + int id = api.AllocateState(0); var meshRefinementParameters = new MeshRefinementParameters { - MaxNumRefinementIterations = 10, + MaxNumRefinementIterations = 2, RefineIntersected = false, UseMassCenterWhenRefining = false, MinEdgeSize = 2.0, @@ -2899,7 +2908,11 @@ public void Mesh2dRefineRidgesBasedOnGriddedSamplesThroughAPI() MaxCourantTime = 120.0, DirectionalRefinement = false }; - + + polygons.GeometrySeparator = api.GetSeparator(); + polygons.XCoordinates = new[] { 0.0, 200.0, 200.0, 0.0, 0.0 }; + polygons.YCoordinates = new[] { 0.0, 0.0, 400.0, 400.0, 0.0 }; + polygons.NumberOfCoordinates = polygons.XCoordinates.Length; double coordinate = -50.0; double dx = 100.0; @@ -2941,19 +2954,21 @@ public void Mesh2dRefineRidgesBasedOnGriddedSamplesThroughAPI() Assert.That(startMesh.NumNodes, Is.EqualTo(16)); // Execute Assert.That(api.Mesh2dRefineRidgesBasedOnGriddedSamples(id, - griddedSamples, - meshRefinementParameters, - 1.0, - 1, - 10), Is.EqualTo(0)); + polygons, + griddedSamples, + meshRefinementParameters, + 1.0, + 1, + 10), Is.EqualTo(0)); Assert.That(api.Mesh2dGetData(id, out DisposableMesh2D endMesh), Is.EqualTo(0)); // Assert refinement executed - Assert.That(endMesh.NumNodes, Is.EqualTo(758)); + Assert.That(endMesh.NumNodes, Is.EqualTo(124)); } finally { api.ClearState(); + polygons.Dispose(); griddedSamples.Dispose(); } }