Loading [MathJax]/extensions/tex2jax.js
MeshKernel
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages Concepts
Mesh.hpp
1//---- GPL ---------------------------------------------------------------------
2//
3// Copyright (C) Stichting Deltares, 2011-2021.
4//
5// This program is free software: you can redistribute it and/or modify
6// it under the terms of the GNU General Public License as published by
7// the Free Software Foundation version 3.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16//
17// contact: delft3d.support@deltares.nl
18// Stichting Deltares
19// P.O. Box 177
20// 2600 MH Delft, The Netherlands
21//
22// All indications and logos of, and references to, "Delft3D" and "Deltares"
23// are registered trademarks of Stichting Deltares, and remain the property of
24// Stichting Deltares. All rights reserved.
25//
26//------------------------------------------------------------------------------
27
28#pragma once
29#include <cstdint>
30#include <memory>
31
32#include "MeshKernel/BoundingBox.hpp"
33#include "MeshKernel/Entities.hpp"
34#include "MeshKernel/Exceptions.hpp"
35#include "MeshKernel/UndoActions/AddEdgeAction.hpp"
36#include "MeshKernel/UndoActions/AddNodeAction.hpp"
37#include "MeshKernel/UndoActions/CompoundUndoAction.hpp"
38#include "MeshKernel/UndoActions/DeleteEdgeAction.hpp"
39#include "MeshKernel/UndoActions/DeleteNodeAction.hpp"
40#include "MeshKernel/UndoActions/FullUnstructuredGridUndo.hpp"
41#include "MeshKernel/UndoActions/MeshConversionAction.hpp"
42#include "MeshKernel/UndoActions/NodeTranslationAction.hpp"
43#include "MeshKernel/UndoActions/ResetEdgeAction.hpp"
44#include "MeshKernel/UndoActions/ResetNodeAction.hpp"
45#include "MeshKernel/UndoActions/UndoAction.hpp"
46#include "Utilities/RTreeBase.hpp"
47
50namespace meshkernel
51{
52 class Polygons;
53
98 class Mesh
99 {
100 public:
102 enum class Type
103 {
104 Mesh1D,
105 Mesh2D
106 };
107
109 virtual ~Mesh() = default;
110
113
115 Mesh& operator=(const Mesh& mesh) = delete;
116
118 Mesh& operator=(Mesh&& mesh) = delete;
119
121 Mesh(const Mesh& mesh) = delete;
122
124 Mesh(Mesh&& mesh) = delete;
125
128 explicit Mesh(Projection projection);
129
134 Mesh(const std::vector<Edge>& edges,
135 const std::vector<Point>& nodes,
136 Projection projection);
137
141 [[nodiscard]] bool IsNodeOnBoundary(UInt node) const { return m_nodesNumEdges[node] == 1; }
142
145 [[nodiscard]] auto GetNumNodes() const { return static_cast<UInt>(m_nodes.size()); }
146
149 [[nodiscard]] auto GetNumEdges() const { return static_cast<UInt>(m_edges.size()); }
150
153 [[nodiscard]] auto GetNumFaces() const { return static_cast<UInt>(m_facesNodes.size()); }
154
157 [[nodiscard]] UInt GetNumValidNodes() const;
158
161 [[nodiscard]] UInt GetNumValidEdges() const;
162
166 [[nodiscard]] UInt GetNumNodesEdges(UInt nodeIndex) const { return static_cast<UInt>(m_nodesNumEdges[nodeIndex]); }
167
171 [[nodiscard]] UInt GetNumFaceEdges(UInt faceIndex) const { return static_cast<UInt>(m_numFacesNodes[faceIndex]); }
172
176 [[nodiscard]] UInt GetNumEdgesFaces(UInt edgeIndex) const { return static_cast<UInt>(m_edgesNumFaces[edgeIndex]); }
177
179 // TODO add unit test and with all failing cases
180 [[nodiscard]] UInt GetEdgeIndex(const UInt elementId, const UInt edgeId) const;
181
183 // TODO add unit test and with all failing cases
184 [[nodiscard]] UInt GetNodeIndex(const UInt elementId, const UInt nodeId) const;
185
189 [[nodiscard]] bool IsEdgeOnBoundary(UInt edge) const { return m_edgesNumFaces[edge] == 1; }
190
194 [[nodiscard]] bool IsFaceOnBoundary(UInt face) const;
195
197 // TODO Can this be removed?
198 const std::vector<Point>& Nodes() const;
199
201 const Point& Node(const UInt index) const;
202
204 void SetNodes(const std::vector<Point>& newValues);
205
207 void SetNode(const UInt index, const Point& newValue);
208
210 [[nodiscard]] std::unique_ptr<ResetNodeAction> ResetNode(const UInt index, const Point& newValue);
211
213 // TODO get rid of this function
214 const std::vector<Edge>& Edges() const;
215
217 const Edge& GetEdge(const UInt index) const;
218
220 void SetEdges(const std::vector<Edge>& newValues);
221
223 void SetEdge(const UInt index, const Edge& edge);
224
226 [[nodiscard]] std::unique_ptr<ResetEdgeAction> ResetEdge(UInt edgeId, const Edge& edge);
227
231 UInt GetLocalFaceNodeIndex(const UInt faceIndex, const UInt nodeIndex) const;
232
236 [[nodiscard]] std::unique_ptr<UndoAction> MergeTwoNodes(UInt startNode, UInt endNode);
237
241 [[nodiscard]] std::unique_ptr<UndoAction> MergeNodesInPolygon(const Polygons& polygons, double mergingDistance);
242
246 [[nodiscard]] std::tuple<UInt, std::unique_ptr<AddNodeAction>> InsertNode(const Point& newPoint);
247
254 [[nodiscard]] std::tuple<UInt, std::unique_ptr<AddEdgeAction>> ConnectNodes(UInt startNode, UInt endNode, const bool collectUndo = true);
255
260 [[nodiscard]] std::unique_ptr<DeleteNodeAction> DeleteNode(UInt node, const bool collectUndo = true);
261
266 [[nodiscard]] UInt FindEdge(UInt firstNodeIndex, UInt secondNodeIndex) const;
267
272 [[nodiscard]] UInt FindEdgeWithLinearSearch(UInt firstNodeIndex, UInt secondNodeIndex) const;
273
277 [[nodiscard]] std::unique_ptr<UndoAction> MoveNode(Point newPoint, UInt nodeindex);
278
285 [[nodiscard]] UInt FindLocationIndex(Point point,
286 Location location,
287 const std::vector<bool>& locationMask = {},
288 const BoundingBox& boundingBox = {});
289
294 [[nodiscard]] UInt FindNodeCloseToAPoint(Point const& point, double searchRadius);
295
300 [[nodiscard]] std::unique_ptr<DeleteEdgeAction> DeleteEdge(UInt edge, const bool collectUndo = true);
301
307 [[nodiscard]] UInt FindCommonNode(UInt firstEdgeIndex, UInt secondEdgeIndex) const;
308
312
315
317 virtual void Administrate(CompoundUndoAction* undoAction = nullptr);
318
320 void AdministrateNodesEdges(CompoundUndoAction* undoAction = nullptr);
321
326
330 void BuildTree(Location location, const BoundingBox& boundingBox = {});
331
336 [[nodiscard]] std::vector<Point> ComputeLocations(Location location) const;
337
342 [[nodiscard]] std::vector<Boolean> IsLocationInPolygon(const Polygons& polygon, Location location) const;
343
348 Mesh& operator+=(Mesh const& rhs);
349
354 std::unique_ptr<UndoAction> Join(const Mesh& rhs);
355
357 std::vector<UInt> GetValidNodeMapping() const;
358
360 std::vector<UInt> GetValidEdgeMapping() const;
361
368 bool IsValidEdge(const UInt edgeId) const;
369
371 void CommitAction(const ResetNodeAction& undoAction);
372
374 void CommitAction(const AddNodeAction& undoAction);
375
377 void CommitAction(const AddEdgeAction& undoAction);
378
380 void CommitAction(const ResetEdgeAction& undoAction);
381
383 void CommitAction(const DeleteNodeAction& undoAction);
384
386 void CommitAction(NodeTranslationAction& undoAction);
387
389 void CommitAction(MeshConversionAction& undoAction);
390
392 void CommitAction(const DeleteEdgeAction& undoAction);
393
395 void CommitAction(FullUnstructuredGridUndo& undoAction);
396
400 void RestoreAction(const ResetNodeAction& undoAction);
401
405 void RestoreAction(const AddNodeAction& undoAction);
406
410 void RestoreAction(const AddEdgeAction& undoAction);
411
415 void RestoreAction(const ResetEdgeAction& undoAction);
416
420 void RestoreAction(const DeleteNodeAction& undoAction);
421
425 void RestoreAction(NodeTranslationAction& undoAction);
426
430 void RestoreAction(MeshConversionAction& undoAction);
431
435 void RestoreAction(const DeleteEdgeAction& undoAction);
436
440 void RestoreAction(FullUnstructuredGridUndo& undoAction);
441
443 RTreeBase& GetRTree(Location location) const { return *m_RTrees.at(location); }
444
447 void SetNodesRTreeRequiresUpdate(bool value) { m_nodesRTreeRequiresUpdate = value; }
448
451 void SetEdgesRTreeRequiresUpdate(bool value) { m_edgesRTreeRequiresUpdate = value; }
452
455 void SetFacesRTreeRequiresUpdate(bool value) { m_facesRTreeRequiresUpdate = value; }
456
460 void ComputeFaceClosedPolygon(UInt faceIndex, std::vector<Point>& polygonNodesCache) const;
461
462 // nodes
463 std::vector<std::vector<UInt>> m_nodesEdges;
464 std::vector<std::uint8_t> m_nodesNumEdges;
465
466 // edges
467 std::vector<std::array<UInt, 2>> m_edgesFaces;
468 std::vector<std::uint8_t> m_edgesNumFaces;
469
470 // faces
471 std::vector<std::vector<UInt>> m_facesNodes;
472 std::vector<std::uint8_t> m_numFacesNodes;
473 std::vector<std::vector<UInt>> m_facesEdges;
474 std::vector<Point> m_facesMassCenters;
475 std::vector<double> m_faceArea;
476
478
479 protected:
481 bool AdministrationRequired() const;
482
484 void SetAdministrationRequired(const bool value);
485
486 // Make private
487 std::vector<Point> m_nodes;
488 std::vector<Edge> m_edges;
489
490 private:
491 static double constexpr m_minimumDeltaCoordinate = 1e-14;
492
493 // RTrees
494 bool m_nodesRTreeRequiresUpdate = true;
495 bool m_edgesRTreeRequiresUpdate = true;
496 bool m_facesRTreeRequiresUpdate = true;
497 bool m_administrationRequired = true;
498 std::unordered_map<Location, std::unique_ptr<RTreeBase>> m_RTrees;
499 BoundingBox m_boundingBoxCache;
500
502 void SetUnConnectedNodesAndEdgesToInvalid(CompoundUndoAction* undoAction);
503
508 void FindConnectedNodes(std::vector<bool>& connectedNodes,
509 UInt& numInvalidEdges) const;
510
512 void InvalidateUnConnectedNodes(const std::vector<bool>& connectedNodes,
513 UInt& numInvalidNodes,
514 CompoundUndoAction* undoAction = nullptr);
515 };
516} // namespace meshkernel
517
518inline const std::vector<meshkernel::Point>& meshkernel::Mesh::Nodes() const
519{
520 return m_nodes;
521}
522
523inline const meshkernel::Point& meshkernel::Mesh::Node(const UInt index) const
524{
525 if (index >= GetNumNodes())
526 {
527 throw ConstraintError("The node index, {}, is not in range.", index);
528 }
529
530 return m_nodes[index];
531}
532
533inline void meshkernel::Mesh::SetNodes(const std::vector<Point>& newValues)
534{
535 m_nodes = newValues;
536 m_nodesRTreeRequiresUpdate = true;
537 m_edgesRTreeRequiresUpdate = true;
538 m_facesRTreeRequiresUpdate = true;
539 m_administrationRequired = true;
540}
541
542inline const meshkernel::Edge& meshkernel::Mesh::GetEdge(const UInt index) const
543{
544 if (index >= GetNumEdges())
545 {
546 throw ConstraintError("The edge index, {}, is not in range.", index);
547 }
548
549 return m_edges[index];
550}
551
552inline void meshkernel::Mesh::SetEdge(const UInt index, const Edge& edge)
553{
554 if (index >= GetNumEdges())
555 {
556 throw ConstraintError("The edge index, {}, is not in range.", index);
557 }
558
559 m_administrationRequired = true;
560 m_edges[index] = edge;
561}
562
563inline const std::vector<meshkernel::Edge>& meshkernel::Mesh::Edges() const
564{
565 return m_edges;
566}
567
568inline void meshkernel::Mesh::SetEdges(const std::vector<Edge>& newValues)
569{
570 m_edges = newValues;
571 m_nodesRTreeRequiresUpdate = true;
572 m_edgesRTreeRequiresUpdate = true;
573 m_facesRTreeRequiresUpdate = true;
574 m_administrationRequired = true;
575}
576
578{
579 return m_administrationRequired;
580}
A class defining a bounding box.
Definition BoundingBox.hpp:40
An exception class thrown when an attempt is made that violates a range constraint.
Definition Exceptions.hpp:267
A class derived from Mesh, which describes unstructures 2d meshes.
Definition Mesh2D.hpp:58
A class describing an unstructured mesh. This class contains the shared functionality between 1d or 2...
Definition Mesh.hpp:99
Projection m_projection
The projection used.
Definition Mesh.hpp:477
const std::vector< Edge > & Edges() const
Get all edges.
Definition Mesh.hpp:563
std::unique_ptr< UndoAction > MoveNode(Point newPoint, UInt nodeindex)
Move a node to a new location.
std::vector< std::vector< UInt > > m_nodesEdges
For each node, the indices of connected edges (nodlin)
Definition Mesh.hpp:463
std::vector< Point > ComputeLocations(Location location) const
Computes a vector with the mesh locations coordinates (nodes, edges or faces coordinates).
void CommitAction(const DeleteEdgeAction &undoAction)
Apply the delete edge action.
const Edge & GetEdge(const UInt index) const
Get constant reference to an edge.
Definition Mesh.hpp:542
Mesh(Mesh &&mesh)=delete
Move constructor taking only a mesh.
UInt GetEdgeIndex(const UInt elementId, const UInt edgeId) const
Get the local edge number for an element edge.
void SetFacesRTreeRequiresUpdate(bool value)
Set the m_facesRTreeRequiresUpdate flag.
Definition Mesh.hpp:455
std::vector< Point > m_nodes
The mesh nodes (xk, yk)
Definition Mesh.hpp:487
void SetNodesRTreeRequiresUpdate(bool value)
Set the m_nodesRTreeRequiresUpdate flag.
Definition Mesh.hpp:447
void SetEdgesRTreeRequiresUpdate(bool value)
Set the m_edgesRTreeRequiresUpdate flag.
Definition Mesh.hpp:451
UInt GetNumFaceEdges(UInt faceIndex) const
Get the number of edges for a face.
Definition Mesh.hpp:171
std::vector< std::vector< UInt > > m_facesEdges
The edge indices composing the face (netcelllin)
Definition Mesh.hpp:473
RTreeBase & GetRTree(Location location) const
Get a reference to the RTree for a specific location.
Definition Mesh.hpp:443
void SetNode(const UInt index, const Point &newValue)
Set a node to a new value, bypassing the undo action.
UInt FindLocationIndex(Point point, Location location, const std::vector< bool > &locationMask={}, const BoundingBox &boundingBox={})
Get the index of a location (node/edge or face) close to a point.
void RestoreAction(const ResetNodeAction &undoAction)
Undo the reset node action.
std::vector< double > m_faceArea
The face area.
Definition Mesh.hpp:475
Type
Enumerator describing the different mesh types.
Definition Mesh.hpp:103
void ComputeFaceClosedPolygon(UInt faceIndex, std::vector< Point > &polygonNodesCache) const
For a face create a closed polygon.
std::unique_ptr< UndoAction > MergeTwoNodes(UInt startNode, UInt endNode)
Merges two mesh nodes.
virtual void Administrate(CompoundUndoAction *undoAction=nullptr)
Perform complete administration.
Mesh & operator=(const Mesh &mesh)=delete
Delete assignment operator.
void RestoreAction(const AddEdgeAction &undoAction)
Undo the add edge action.
std::vector< std::uint8_t > m_nodesNumEdges
For each node, the number of connected edges (nmk)
Definition Mesh.hpp:464
std::vector< UInt > GetValidEdgeMapping() const
Get the mapping/indexing from the edge array mapped to valid edges.
const Point & Node(const UInt index) const
Get the node at the position.
Definition Mesh.hpp:523
std::vector< std::vector< UInt > > m_facesNodes
The nodes composing the faces, in ccw order (netcellNod)
Definition Mesh.hpp:471
std::tuple< UInt, std::unique_ptr< AddEdgeAction > > ConnectNodes(UInt startNode, UInt endNode, const bool collectUndo=true)
Connect two existing nodes, checking if the nodes are already connected. If the nodes are not connect...
void RestoreAction(MeshConversionAction &undoAction)
Undo the node translation action.
UInt FindNodeCloseToAPoint(Point const &point, double searchRadius)
Get the index of a node close to a point.
void SetNodes(const std::vector< Point > &newValues)
Set all nodes to a new set of values.
Definition Mesh.hpp:533
void CommitAction(NodeTranslationAction &undoAction)
Apply the node translation action.
auto GetNumFaces() const
Get the number of valid faces.
Definition Mesh.hpp:153
auto GetNumEdges() const
Get the number of valid edges.
Definition Mesh.hpp:149
UInt FindEdgeWithLinearSearch(UInt firstNodeIndex, UInt secondNodeIndex) const
Find the edge using a linear search, without connectivity information (much slower than FindEdge)
bool IsNodeOnBoundary(UInt node) const
Inquire if a node is on boundary.
Definition Mesh.hpp:141
std::vector< std::uint8_t > m_edgesNumFaces
For each edge, the number of shared faces(lnn)
Definition Mesh.hpp:468
bool IsFaceOnBoundary(UInt face) const
Inquire if a face is on boundary.
std::unique_ptr< UndoAction > MergeNodesInPolygon(const Polygons &polygons, double mergingDistance)
Merge close mesh nodes inside a polygon (MERGENODESINPOLYGON)
void CommitAction(FullUnstructuredGridUndo &undoAction)
Set the node and edge values.
void AdministrateNodesEdges(CompoundUndoAction *undoAction=nullptr)
Perform node and edges administration.
bool IsValidEdge(const UInt edgeId) const
Indicate if the edge-id is a valid edge.
UInt GetNodeIndex(const UInt elementId, const UInt nodeId) const
Get the local node number for an element node.
Mesh & operator=(Mesh &&mesh)=delete
Delete move assignment operator.
Mesh(Projection projection)
Constructs an empty mesh, sets only the projection.
bool AdministrationRequired() const
Determine if a administration is required.
Definition Mesh.hpp:577
std::unique_ptr< UndoAction > Join(const Mesh &rhs)
Add meshes: result is a mesh composed of the additions firstMesh += secondmesh results in the second ...
void CommitAction(MeshConversionAction &undoAction)
Apply the node translation action.
void RestoreAction(const DeleteNodeAction &undoAction)
Undo the delete node action.
std::unique_ptr< DeleteNodeAction > DeleteNode(UInt node, const bool collectUndo=true)
Deletes a node and removes any connected edges.
bool IsEdgeOnBoundary(UInt edge) const
Inquire if an edge is on boundary.
Definition Mesh.hpp:189
Mesh(const std::vector< Edge > &edges, const std::vector< Point > &nodes, Projection projection)
Construct a mesh starting from the edges and nodes.
std::vector< Point > m_facesMassCenters
The faces centers of mass (xzw, yzw)
Definition Mesh.hpp:474
void CommitAction(const DeleteNodeAction &undoAction)
Apply the delete node action.
const std::vector< Point > & Nodes() const
Get vector of all nodes.
Definition Mesh.hpp:518
std::vector< Edge > m_edges
The edges, defined as first and second node(kn)
Definition Mesh.hpp:488
UInt FindCommonNode(UInt firstEdgeIndex, UInt secondEdgeIndex) const
Find the common node two edges share This method uses return parameters since the success is evaluate...
std::vector< UInt > GetValidNodeMapping() const
Get the mapping/indexing from the node array mapped to valid nodes.
std::unique_ptr< ResetEdgeAction > ResetEdge(UInt edgeId, const Edge &edge)
Change the nodes referenced by the edge.
Mesh & operator+=(Mesh const &rhs)
Add meshes: result is a mesh composed of the additions firstMesh += secondmesh results in the second ...
Mesh()
Default constructor, setting a cartesian projection.
void RestoreAction(NodeTranslationAction &undoAction)
Undo the node translation action.
void CommitAction(const AddEdgeAction &undoAction)
Apply the add edge action.
void SetEdge(const UInt index, const Edge &edge)
Set the edge to a new value, bypassing the undo action.
Definition Mesh.hpp:552
void RestoreAction(FullUnstructuredGridUndo &undoAction)
Undo entire node and edge values.
UInt GetNumValidNodes() const
Get the number of valid nodes.
std::vector< std::array< UInt, 2 > > m_edgesFaces
For each edge, the shared face index (lne)
Definition Mesh.hpp:467
virtual ~Mesh()=default
Define virtual destructor.
std::unique_ptr< ResetNodeAction > ResetNode(const UInt index, const Point &newValue)
Set the node to a new value, this value may be the in-valid value.
auto GetNumNodes() const
Get the number of valid nodes.
Definition Mesh.hpp:145
void SetAdministrationRequired(const bool value)
Determine if a administration is required.
void RestoreAction(const AddNodeAction &undoAction)
Undo the add node action.
void CommitAction(const ResetNodeAction &undoAction)
Apply the reset node action.
std::unique_ptr< DeleteEdgeAction > DeleteEdge(UInt edge, const bool collectUndo=true)
Deletes an edge.
UInt GetNumValidEdges() const
Get the number of valid edges.
UInt GetLocalFaceNodeIndex(const UInt faceIndex, const UInt nodeIndex) const
Get the local index of the node belong to a face.
UInt GetNumEdgesFaces(UInt edgeIndex) const
Get the number of faces an edges shares.
Definition Mesh.hpp:176
void SortEdgesInCounterClockWiseOrder(UInt startNode, UInt endNode)
Sort mesh edges around a node in counterclockwise order (Sort_links_ccw)
void BuildTree(Location location, const BoundingBox &boundingBox={})
Build the rtree for the corresponding location, using only the locations inside the bounding box.
UInt GetNumNodesEdges(UInt nodeIndex) const
Get the number of edges for a node.
Definition Mesh.hpp:166
void RestoreAction(const ResetEdgeAction &undoAction)
Undo the reset edge action.
bool NodeAdministration()
Node administration (setnodadmin)
void DeleteInvalidNodesAndEdges()
Removes all invalid nodes and edges.
UInt FindEdge(UInt firstNodeIndex, UInt secondNodeIndex) const
Find the edge sharing two nodes.
void CommitAction(const AddNodeAction &undoAction)
Apply the add node action.
void CommitAction(const ResetEdgeAction &undoAction)
Apply the reset edge action.
void RestoreAction(const DeleteEdgeAction &undoAction)
Undo the delete edge action.
void SetEdges(const std::vector< Edge > &newValues)
Set all edges to a new set of values.
Definition Mesh.hpp:568
std::vector< std::uint8_t > m_numFacesNodes
The number of nodes composing the face (netcellN)
Definition Mesh.hpp:472
std::tuple< UInt, std::unique_ptr< AddNodeAction > > InsertNode(const Point &newPoint)
Insert a new node in the mesh (setnewpoint)
Mesh(const Mesh &mesh)=delete
Copy constructor taking only a mesh.
std::vector< Boolean > IsLocationInPolygon(const Polygons &polygon, Location location) const
Computes if a location is in polygon.
A struct describing a point in a two-dimensional space.
Definition Point.hpp:41
A class containing a list of polygonaly enclosed regions.
Definition Polygons.hpp:45
Contains the logic of the C++ static library.
Definition AveragingInterpolation.hpp:37
std::pair< UInt, UInt > Edge
Describes an edge with two indices.
Definition Entities.hpp:50
Projection
Enumerator describing the supported projections.
Definition Definitions.hpp:43
Location
Mesh locations enumeration.
Definition Definitions.hpp:76
std::uint32_t UInt
Integer type used when indexing mesh graph entities.
Definition Definitions.hpp:39