The dune-functions module provides an abstraction layer for global finite element functions. Its two main concepts are functions implemented as callable objects, and bases of finite element spaces.
dune-functions provides an interface to “functions” in the mathematical sense, in particular to finite element functions defined on a grid, but going far beyond that.
The interface revolves around the concept of a “callable”. It encompasses any type of C++ object that can be evaluated with
operator(), like free functions, function objects, and even C++11 lambdas. Dynamic polymorphism is realized using type erasure and the
std::function class, which does not sacrifice efficiency in purely static code.
dune-functions extends the “callable” concept into several directions. First, it allows for differentiable functions. Such functions can hand out their derivative as new function objects. Second, for functions defined piecewisely on a finite element grid, the concept of local function is introduced. Local functions can be bound to grid elements. All further evaluations of a function bound to an element are in local coordinates of that element. This approach allows to avoid overhead when there are many consecutive evaluations of a function on a single element.
Function Space Bases
The second part of dune-functions provides a well-defined interface to bases of finite element function spaces. For this interface, a finite element basis is a set of functions with a prescribed ordering, and a way to index them. The core functionality has three parts:
- For a given grid element, obtain the restrictions of all basis functions to this element, except for those functions where the restriction is zero. In other words: get the shape functions for the element.
- Get a local numbering for these shape functions. This is needed to index the element stiffness matrix.
- Get a global numbering for the shape functions. This is needed to index the global stiffness matrix.
While local numbers are always integers, global numbers can be multi-indices, if appropriate.
A central feature is that finite element bases for vector-valued and mixed spaced can be constructed by tensor multiplication of simpler bases. The resulting expressions can be interpreted as tree structures. For example, the tree for the three-dimensional Taylor-Hood basis is shown below. This tree structure is directly exposed in the dune-functions interface.
Implementations of Function Space Bases
Some of the finite element bases currently available are:
- LagrangeBasis: A k-th order Lagrangian bases, with k a run-time or compile-time parameter.
- LagrangeDGBasis: A k-th order DG basis, using Lagrangian shape functions.
- NedelecBasis: For H(curl)-conforming problems
- RaviartThomasBasis: For H(div)-conforming problems
- BrezziDouglasMariniBasis: The Brezzi-Douglas-Marini-Element
- RannacherTurekBasis: Combines the Rannacher-Turek element on quadrilateral elements with the Crouzeix-Raviart element on simplices
- BSplineBasis: A basis of B-Spline functions of given arbitrary order on a structured grid.
You can download the current development version using anonymous git.
git clone https://gitlab.dune-project.org/staging/dune-functions.git
The latest release is dune-functions 2.9, available from the Dune download page. It is to be used with the 2.9 release of the Dune core modules.
dune-functions depends on the dune-typetree module, also available from the download page. Please install that before trying to install dune-functions.
The class documentation generated with doxygen is available online:
The module contains a manual that can be build using
make doc. Furthermore it contains example programs in the
dune-functions has been originally written by
- Christian Engwer
- Carsten Gräser
- Steffen Müthing
- Oliver Sander
Additionally, there are significant contributions by Ansgar Burchardt, Simon Praetorius, and many others.
See the git history for a complete list.
We welcome interest and contributions by additional developers.