# Function and FE spaces

`AbstractFunctionSpace`

In Bcube, a `FunctionSpace`

is defined by a type (nodal Lagrange polynomials, modal Taylor expansion, etc) and a degree. For each implemented `FunctionSpace`

, a list of shape functions is associated on a given `Shape`

. For instance, one can get the shape functions associated to the Lagrange polynomials or order 3 on a `Square`

. Note that for "tensor" elements such as `Line`

, `Square`

or `Cube`

; the Lagrange polynomials are available at any order; being computed symbolically.

`AbstractFESpace`

Then, an `FESpace`

(more precisely `SingleFESpace`

) is a function space associated to a numbering of the degrees of freedom. Note that the numbering may depend on the continuous or discontinuous feature of the space. Hence a `SingleFESpace`

takes basically four input to be built : a `FunctionSpace`

, the number of components of this space (scalar or vector), an indicator of the continuous/discontinuous characteristic, and the mesh. The dof numbering is built by combining the mesh numberings (nodes, cells, faces) and the function space. Note that the degree of the `FunctionSpace`

can differ from the "degree" of the mesh elements : it is possible to build a `SingleFESpace`

with P2 polynomials on a mesh only containing straight lines (defined by only two nodes, `Bar2_t`

). Optionaly, a `SingleFESpace`

can also contain the tags of the boundaries where Dirichlet condition(s) applies. A `MultiFESpace`

is simply a set of `SingleFESpace`

, eventually of different natures. Its befenit is that it allows to build a "global" numbering of all the dofs represented by this space. This is especially convenient to solve systems of equations.

`AbstractFEFunction`

With a `SingleFESpace`

, one can build the representation of a function discretized on this space: a `FEFunction`

. This structure stores a vector of values, one for each degree of freedom of the finite element space. To set or get the values of a `FEFunction`

, the functions `set_dof_values!`

and `get_dof_values`

are available respectively. A `FEFunction`

can be projected on another `FESpace`

; or evaluated at some specific mesh location (a coordinates, all the nodes, all the mesh centers, etc).