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.

A simple 2D mesh

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_NVEQUAD2D) = number of quads 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.

A simple 2D mesh

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.

Vertices at a cell

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.

A simple 2D mesh

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.

Neighbours of a cell

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.

Cells on a 2D edge

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.

Vertices on an edge

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).

Vertices on an edge

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.