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();
}
}