# The mesh

In FEAT2, a mesh is a set of cells on top of a set of vertices. The following figure visualises a simple mesh in 2D. It contains 16 cells and 25 vertices.

The FEAT2 representation of a mesh is carried out with the structure `t_triangulation`. From within this structure, all necessary information about the mesh can be accessed.

## Dimension variables

The following table depicts the most important variables describing dimensions of the mesh:

Variable Meaning
ndim Dimension. 1=1D, 2=2D, 3=3D
NVT Total number of vertices (1D, 2D, 3D)
NMT Total number of edges (2D, 3D)
NAT Total number of faces (3D)
NEL Total number of cells/elements (1D, 2D, 3D)
--------
NVBD Total number of vertices on the boundary (1D, 2D, 3D)
NMBD Total number of edges on the boundary (2D, 3D)
--------
NNVE Maximum number of vertices per element (1D, 2D, 3D). 3 for 2D triangles, 4 for 2D quads or 3D tetrahedrons, 12 for 3D hexas
NNEE Maximum number of edges per element (2D, 3D). 3 for 2D triangles, 4 for 2D quads or 3D tetrahedrons, 12 for 3D hexas
NNAE Maximum number of faces per element (3D); ne hexa has e.g. 6 areas
NNVA Maximum number of vertices per face (3D). 3 for 3D tetraheral meshes, 4 for 3D hexahedral meshes
NNelAtVertex Maximum number of elements adjacent to a vertex
NNelAtEdge Maximum number of elements adjacent to an edge
--------
InelOfType Number of elements with a defined number of vertices per element.
InelOfType(TRIA_NVELINE1D) = number of lines in the mesh (1D).
InelOfType(TRIA_NVETRI2D) = number of triangles in the mesh (2D).
InelOfType(TRIA_NVEPYR3D) = number of pyramides in the mesh (3D).
InelOfType(TRIA_NVEPRIS3D) = number of prisms in the mesh (3D).
InelOfType(TRIA_NVETET3D) = number of tetrahedra in the mesh (3D).
InelOfType(TRIA_NVEHEXA3D) = number of hexahedra in the mesh (3D).

## Structural arrays

The structure furthermode contains a set of handles which point to different arrays encapsuling mesh information. Pointer to such arrays can be obtained using the usual storage management routines. For example, a pointer `p_DvertexCoords` to an array `DvertexCoords` can be obtained from the handle `h_DvertexCoords` in the structure using the following command:

`call storage_getbase_double2d (rtriangulation%h_DvertexCoords, p_DvertexCoords)`

provided that `rtriangulation` is the name of the `t_triangulation` structure. The following sections describe the basic arrays inside of the triangulation.

### DvertexCoords: Vertex coordinates

The array `DvertexCoords(:,:)` contains for every vertex the (x,y) coordinates:

• `DvertexCoords(1,i)` = x-coordinate of vertex i
• `DvertexCoords(2,i)` = y-coordinate of vertex i
• `DvertexCoords(3,i)` = z-coordinate of vertex i

Example: In the above mesh there are 25 vertices with an (x,y)-coordinate associated to each.

The array is defined as

`real(DP), dimension(2,25) :: DvertexCoords`

### IverticesAtElement: Vertices on each cell

The array `IverticesAtElement(:,i)` contains for element i the associated vertices.

For example, for the above mesh there is

`IverticesAtElement(:,6) = (/ 7, 8, 13, 12/)`

Special case: 2D mesh

• The vertices are stored in counterclockwise order.

Remarks:

• For mixed meshes, not all positions in `IverticesAtElement` are used. Unused vertex numbers are filled with zero. For example, a if triangles and quadrilaterals are mixed in a mesh, there is

• `IverticesAtElement(:,i) = (/ ..., ..., ..., .../)`
if cell i is a quad (all positions used)
• `IverticesAtElement(:,i) = (/ ..., ..., ..., 0 /)`
if cell i is a triangle (last entry zero)

### IedgesAtElement: Edges on each cell

The array `IedgesAtElement(:,i)` contains for element i the associated edges.

For example, for the above mesh there is

`IedgesAtElement(:,6) = (/ 7, 17, 18, 15/)`

Special case: 2D mesh

• The edges are stored in counterclockwise order.
• `IedgesAtElement(i,j)` is always the edge following vertex `IverticesAtElement(i,j)` on element j.

Remarks:

• For mixed meshes, not all positions in `IedgesAtElement` are used. Unused vertex numbers are filled with zero. For example, a if triangles and quadrilaterals are mixed in a mesh, there is

• `IegdesAtElement(:,i) = (/ ..., ..., ..., .../)`
if cell i is a quad (all positions used)
• `IedgesAtElement(:,i) = (/ ..., ..., ..., 0 /)`
if cell i is a triangle (last entry zero)

### IfacesAtElement: Faces on each cell

The array `IfacesAtElement(:,i)` contains for element i the associated faces.

Remarks:

• For mixed meshes, not all positions in `IfacesAtElement` are used. Unused vertex numbers are filled with zero. For example, a if tetras and hexas are mixed in a mesh, there is

• `IfacesAtElement(:,i) = (/ ..., ..., ..., ..., ..., ..., ..., .../)`
if cell i is a hex (all positions used)
• `IfacesAtElement(:,i) = (/ ..., ..., ..., ..., 0, 0, 0, 0 /)`
if cell i is a tetra (last entries zero)

### IneighboursAtElement: Element neighbours

The array `IneighboursAtElement(:,i)` contains for element i the neighbouring elements:

• 2D: Neighbours associated via the edges
• 3D: Neighbours associated via the faces.

For example, for the above mesh there is

`IneighboursAtElement(:,6) = (/ 2, 7, 10, 5/)`

Special case: 2D mesh

• The elements are stored in counterclockwise order.
• `IneighboursAtElement(i,j)` is always the element associated to element j via edge `IedgesAtElement(i,j)`.

Special case: 3D mesh

• `IneighboursAtElement(i,j)` is always the element associated to element j via face `IfacesAtElement(i,j)`.

Remarks:

• For mixed meshes, not all positions in `IedgesAtElement` are used. Unused vertex numbers are filled with zero. For example, a if triangles and quadrilaterals are mixed in a mesh, there is

• `IneighboursAtElement(:,i) = (/ ..., ..., ..., .../)`
if cell i is a hex (all positions used)

• `IneighboursAtElement(:,i) = (/ ..., ..., ..., 0 /)`
if cell i is a tetra (last entry zero)

### IelementsAtEdge: Elements on an edge (only 2D)

The array `IelementsAtEdge(1:2,i)` contains for a 2D mesh for edge i the associated elements.

In the above example, there is for edge i

• `IelementsAtEdge(:,i) = (/ 6, 7 /)`

### IverticesAtEdge: Vertices on an edge

The array `IverticesAtEdge(1:2,i)` contains for edge i the associated vertices.

In the above example, there is for edge 18

• `IelementsAtEdge(:,18) = (/ 13, 12 /)`

### InodalProperty

The nodal property array defines for every vertex, every edge and every face whether it is on the boudary or not. There is:

• `InodalProperty(...) = 0` if the vertex/edge/face is in the domain
• `InodalProperty(...) = k > 0` if the vertex/edge/face is on the boundary on boundary component `k`.

The array is organised as follows:

• `InodalProperty (1:NVT)` = nodal property for the vertices.
• `InodalProperty (NVT+1:NVT+NMT)` = nodal property for the edges (2D, 3D).
• `InodalProperty (NVT+NMT+1:NVT+NMT+NAT)` = nodal property for the faces (3D).

In this example, there is `InodalProperty(i)=1` for the boudary vertices

i=1,2,3,4,5,10,15,20,25,24,23,22,21,16,11,6.

For all other vertices j<>i, there is InodalProperty(j)=0.

### DelementVolume

• `DelementVolume(i)` is the volume of cell i.
• `DelementVolume(NEL+1)` is the volume of the complete domain.