using Deltares.UGrid.Entities;
using ProtoBuf;
namespace Deltares.UGrid.Api
{
[ProtoContract(AsReferenceDefault = true)]
public class Disposable2DMeshGeometry : DisposableMeshObject
{
///
/// Name of the mesh
///
[ProtoMember(1)]
public string Name;
///
/// X position of the nodes
///
[ProtoMember(2)]
public double[] NodesX;
///
/// Y position of the nodes
///
[ProtoMember(3)]
public double[] NodesY;
///
/// Edge node connections {[from, to], [from, to] ... }
///
[ProtoMember(4)]
public int[] EdgeNodes;
///
/// Nodes for each face (using )
///
[ProtoMember(5)]
public int[] FaceNodes;
///
/// X position of face the center
///
[ProtoMember(6)]
public double[] FaceX;
///
/// Y position of face the center
///
[ProtoMember(7)]
public double[] FaceY;
///
/// Maximum number of nodes for a face (used in )
///
[ProtoMember(8)]
public int MaxNumberOfFaceNodes;
internal Mesh2DGeometryDimensions CreateMeshDimensions()
{
return new Mesh2DGeometryDimensions
{
dim = 2, //-> Type of grid 1d (=1)/2d (=2)
numnode = NodesX?.Length ?? 0,
numedge = EdgeNodes?.Length /2 ?? 0,
numface = FaceX?.Length ?? 0,
maxnumfacenodes = MaxNumberOfFaceNodes,
numlayer = 1,
layertype = 1,
nnodes = 0,
nbranches = 0,
ngeometry = 0
};
}
internal Mesh2DGeometry CreateMeshGeometry()
{
if (!IsMemoryPinned)
{
PinMemory();
}
return new Mesh2DGeometry
{
nodex = GetPinnedObjectPointer(NodesX),
nodey = GetPinnedObjectPointer(NodesY),
edge_nodes = GetPinnedObjectPointer(EdgeNodes),
facex = GetPinnedObjectPointer(FaceX),
facey = GetPinnedObjectPointer(FaceY),
face_nodes = GetPinnedObjectPointer(FaceNodes),
startIndex = 0
};
}
internal void InitializeWithEmptyData(Mesh2DGeometryDimensions mesh2dDimensions)
{
var numberOfNodes = mesh2dDimensions.numnode;
var numberOfEdges = mesh2dDimensions.numedge;
var numberOfFaces = mesh2dDimensions.numface;
NodesX = new double[numberOfNodes];
NodesY = new double[numberOfNodes];
EdgeNodes = new int[numberOfEdges * 2];
FaceNodes = new int[numberOfFaces * mesh2dDimensions.maxnumfacenodes];
FaceX = new double[numberOfFaces];
FaceY = new double[numberOfFaces];
}
}
}