symfem.elements.dual

Dual elements.

These elements’ definitions appear in https://doi.org/10.1016/j.crma.2004.12.022 (Buffa, Christiansen, 2005)

Classes

DualCiarletElement

Abstract barycentric finite element.

Dual

Barycentric dual finite element.

BuffaChristiansen

Buffa-Christiansen barycentric dual finite element.

RotatedBuffaChristiansen

RotatedBuffa-Christiansen barycentric dual finite element.

Module Contents

class symfem.elements.dual.DualCiarletElement(dual_coefficients: list[list[list[int | sympy.core.expr.Expr]]], fine_space: str, reference: symfem.references.DualPolygon, order: int, dof_entities: list[tuple[int, int]], domain_dim: int, range_dim: int, range_shape: tuple[int, Ellipsis] | None = None, dof_directions: symfem.geometry.SetOfPoints | None = None)

Bases: symfem.finite_element.FiniteElement

Abstract barycentric finite element.

dual_coefficients
fine_space
_basis_functions: list[symfem.functions.Function] | None = None
_dof_entities
_dof_directions = None
get_polynomial_basis(reshape: bool = True) list[symfem.functions.Function]

Get the symbolic polynomial basis for the element.

Returns:

The polynomial basis

get_dual_matrix() sympy.matrices.dense.MutableDenseMatrix

Get the dual matrix.

Returns:

The dual matrix

get_basis_functions(use_tensor_factorisation: bool = False) list[symfem.functions.Function]

Get the basis functions of the element.

Parameters:

use_tensor_factorisation – Should a tensor factorisation be used?

Returns:

The basis functions

entity_dofs(entity_dim: int, entity_number: int) list[int]

Get the numbers of the DOFs associated with the given entity.

Parameters:
  • entity_dim – The dimension of the entity

  • entity_number – The number of the entity

Returns:

The numbers of the DOFs associated with the entity

dof_plot_positions() list[symfem.geometry.PointType]

Get the points to plot each DOF at on a DOF diagram.

Returns:

The DOF positions

dof_directions() list[symfem.geometry.PointType | None]

Get the direction associated with each DOF.

Returns:

The DOF directions

dof_entities() list[tuple[int, int]]

Get the entities that each DOF is associated with.

Returns:

The entities

abstractmethod map_to_cell(vertices_in: symfem.geometry.SetOfPointsInput, basis: list[symfem.functions.Function] | None = None, forward_map: symfem.geometry.PointType | None = None, inverse_map: symfem.geometry.PointType | None = None) list[symfem.functions.Function]

Map the basis onto a cell using the appropriate mapping for the element.

Parameters:
  • vertices_in – The vertices of the cell

  • basis – The basis functions

  • forward_map – The map from the reference to the cell

  • inverse_map – The map to the reference from the cell

Returns:

The basis functions mapped to the cell

class symfem.elements.dual.Dual(reference: symfem.references.DualPolygon, order: int)

Bases: DualCiarletElement

Barycentric dual finite element.

property lagrange_subdegree: int
Abstractmethod:

Get the Lagrange subdegree of the element.

This is the degree of the highest degree Lagrange space whose polynomial space is a subspace of this element’s polynomial space.

property lagrange_superdegree: int | None
Abstractmethod:

Get the Lagrange superdegree of the element.

This is the degree of the highest degree Lagrange space whose polynomial space is a superspace of this element’s polynomial space.

property polynomial_subdegree: int
Abstractmethod:

Get the polynomial subdegree of the element.

This is the degree of the highest degree complete polynomial space that is a subspace of this element’s polynomial space.

property polynomial_superdegree: int | None
Abstractmethod:

Get the polynomial superdegree of the element.

This is the degree of the highest degree complete polynomial space that is a superspace of this element’s polynomial space.

names = ['dual polynomial', 'dual P', 'dual']
references = ['dual polygon']
min_order = 0
max_order = 1
continuity = 'C0'
value_type = 'scalar dual'
last_updated = '2025.12'
class symfem.elements.dual.BuffaChristiansen(reference: symfem.references.DualPolygon, order: int)

Bases: DualCiarletElement

Buffa-Christiansen barycentric dual finite element.

property lagrange_subdegree: int
Abstractmethod:

Get the Lagrange subdegree of the element.

This is the degree of the highest degree Lagrange space whose polynomial space is a subspace of this element’s polynomial space.

property lagrange_superdegree: int | None
Abstractmethod:

Get the Lagrange superdegree of the element.

This is the degree of the highest degree Lagrange space whose polynomial space is a superspace of this element’s polynomial space.

property polynomial_subdegree: int
Abstractmethod:

Get the polynomial subdegree of the element.

This is the degree of the highest degree complete polynomial space that is a subspace of this element’s polynomial space.

property polynomial_superdegree: int | None
Abstractmethod:

Get the polynomial superdegree of the element.

This is the degree of the highest degree complete polynomial space that is a superspace of this element’s polynomial space.

names = ['Buffa-Christiansen', 'BC']
references = ['dual polygon']
min_order = 0
max_order = 0
continuity = 'H(div)'
value_type = 'vector dual'
last_updated = '2025.12'
class symfem.elements.dual.RotatedBuffaChristiansen(reference: symfem.references.DualPolygon, order: int)

Bases: DualCiarletElement

RotatedBuffa-Christiansen barycentric dual finite element.

property lagrange_subdegree: int
Abstractmethod:

Get the Lagrange subdegree of the element.

This is the degree of the highest degree Lagrange space whose polynomial space is a subspace of this element’s polynomial space.

property lagrange_superdegree: int | None
Abstractmethod:

Get the Lagrange superdegree of the element.

This is the degree of the highest degree Lagrange space whose polynomial space is a superspace of this element’s polynomial space.

property polynomial_subdegree: int
Abstractmethod:

Get the polynomial subdegree of the element.

This is the degree of the highest degree complete polynomial space that is a subspace of this element’s polynomial space.

property polynomial_superdegree: int | None
Abstractmethod:

Get the polynomial superdegree of the element.

This is the degree of the highest degree complete polynomial space that is a superspace of this element’s polynomial space.

names = ['rotated Buffa-Christiansen', 'RBC']
references = ['dual polygon']
min_order = 0
max_order = 0
continuity = 'H(div)'
value_type = 'vector dual'
last_updated = '2025.12'