Finite elements#

This page follows the same section structure as the defelement “finite elements” overview, but the content is written for BIEKIT and explicitly covers both dim = spacedim and the surface case dim = 2, spacedim = 3.

Reference cells#

We start from reference cells with simple coordinates. Common choices are:

\[ \begin{align}\begin{aligned}\hat{K}_{\text{interval}} = [0, 1],\\\hat{K}_{\triangle} = \{(\hat{x}, \hat{y}) \mid \hat{x} \ge 0,\ \hat{y} \ge 0,\ \hat{x} + \hat{y} \le 1\},\\\hat{K}_{\square} = [0, 1]^2.\end{aligned}\end{align} \]

Any physical cell K is obtained by a mapping F : \hat{K} \to K.

Reference interval, triangle, and quadrilateral.

Cell sub-entities#

A cell has sub-entities of different topological dimensions. For a triangle:

  • vertices (dimension 0): v0, v1, v2

  • edges (dimension 1): e0, e1, e2

  • cell interior (dimension 2): the face itself

Orientation of edges matters for vector elements. BIEKIT uses a consistent orientation to define signs for basis functions on shared edges.

Triangle with oriented edges and vertex labels.

Finite elements#

A finite element is the triple (K, P, N):

  • K: the cell

  • P: a polynomial (or function) space on K

  • N: a set of linearly independent functionals (degrees of freedom)

Unisolvence means there is a unique basis {phi_i} such that

\[N_j(\phi_i) = \delta_{ij}.\]

Example: Lagrange element#

For Lagrange elements, P is a scalar polynomial space and N are point evaluations. For the triangle, let \lambda_1, \lambda_2, \lambda_3 be the barycentric coordinates. The P1 basis is:

\[\phi_1 = \lambda_1,\quad \phi_2 = \lambda_2,\quad \phi_3 = \lambda_3.\]

The interpolation operator satisfies

\[Iu(\mathbf{x}) = \sum_i u(\mathbf{x}_i) \phi_i(\mathbf{x}),\]

where \mathbf{x}_i are the nodes. Higher order elements place additional nodes on edges and in the interior.

Integral moments#

Some finite elements use integral moments instead of point evaluations. A typical moment functional is

\[N(v) = \int_E v \cdot q\, ds,\]

where E is an edge or a face and q is a test function. For H(div) on a surface, a common choice is flux moments:

\[N_e(v) = \int_e v \cdot n_e\ q\, ds,\]

where n_e is the outward unit normal to the edge within the surface.

Example: Nedelec element#

Nedelec (H(curl)) elements use tangential moments on edges:

\[N_e(v) = \int_e v \cdot t_e\ ds,\]

where t_e is the edge tangent. On a triangle, one possible basis for the lowest-order Nedelec element is

\[\mathbf{N}_{12} = \lambda_1 \nabla \lambda_2 - \lambda_2 \nabla \lambda_1,\]

with cyclic permutations. BIEKIT does not implement Nedelec elements yet, but the mapping rules are the same as for other H(curl) spaces.

Mapping finite elements#

Let F : \hat{K} \to K be the geometry map with Jacobian

\[J(\hat{x}) = \frac{\partial F}{\partial \hat{x}}.\]

Scalar fields use pullback:

\[u(x) = \hat{u}(\hat{x}),\quad x = F(\hat{x}).\]

The gradient transforms as

\[\nabla u(x) = J(\hat{x})^{-T} \nabla_{\hat{x}} \hat{u}(\hat{x}) \quad\text{(dim = spacedim)}.\]

Case 1: dim = spacedim (volume cells). For H(div), the contravariant Piola transform is

\[v(x) = \frac{1}{\det J(\hat{x})} J(\hat{x}) \hat{v}(\hat{x}).\]

This preserves normal fluxes across element boundaries:

\[\int_{\partial K} v \cdot n\, ds = \int_{\partial \hat{K}} \hat{v} \cdot \hat{n}\, d\hat{s}.\]

Case 2: dim = 2, spacedim = 3 (surface cells). Here J is a 3x2 matrix. The surface measure is

\[|J| = \sqrt{\det(J^T J)}.\]

The surface normal is

\[n = \frac{J_1 \times J_2}{|J|},\]

where J_1, J_2 are the columns of J. BIEKIT uses the surface contravariant Piola transform for H(div) fields:

\[v(x) = \frac{1}{|J(\hat{x})|} J(\hat{x}) \hat{v}(\hat{x}).\]

This yields a tangential vector field on the surface and preserves surface fluxes across edges. Note that Piola maps basis functions, while |J| is the measure used in integration.

Reference triangle mapped onto a surface patch, showing J and n.

Scalar-valued basis functions#

For scalar bases, mapping is done by composition, and integrals use the Jacobian measure:

\[\int_K u(x)\, dx = \int_{\hat{K}} \hat{u}(\hat{x}) \, |\det J|\, d\hat{x} \quad\text{(dim = spacedim)},\]
\[\int_K u(x)\, dS = \int_{\hat{K}} \hat{u}(\hat{x}) \, |J|\, d\hat{x} \quad\text{(dim = 2, spacedim = 3)}.\]

Vector-valued basis functions#

Vector bases are mapped with Piola transforms to preserve continuity. For H(div) on surfaces (BIEKIT’s RWG basis), the mapping is:

\[v(x) = \frac{1}{|J|} J \hat{v}(\hat{x}).\]

RWG basis functions on a shared edge e of two triangles T^+ and T^- are

\[\begin{split}f_e(r) = \begin{cases} \frac{l_e}{2A^+}(r - r_+), & r \in T^+,\\ \frac{l_e}{2A^-}(r_- - r), & r \in T^-, \end{cases}\end{split}\]

where l_e is the edge length, A^\pm are triangle areas, and r_\pm are the opposite vertices.

RWG basis supported on two triangles sharing an edge.

Matrix-valued basis functions#

Matrix-valued bases can be mapped component-wise. If each row is a vector field, apply Piola row-by-row. If each column is a vector field, apply Piola column-by-column. The same Jacobian measure |J| is used in integration.

Variants of finite elements#

Variants specify different node placements or polynomial representations. For example, Lagrange elements may use equispaced nodes or optimized nodes. The function space is the same, but interpolation and conditioning can differ.

The degree of a finite element#

The degree is the highest polynomial order in P. For triangles:

\[\dim P_k(\triangle) = \frac{(k+1)(k+2)}{2}.\]

Higher degree improves accuracy but increases the number of degrees of freedom.

Notation#

  • K: physical cell, \hat{K}: reference cell

  • F: mapping from \hat{K} to K

  • J: Jacobian of F

  • dim: reference dimension, spacedim: embedding dimension

  • |J|: measure for surface elements (dim=2, spacedim=3)