ug4
|
libDiscretization provides two interface types to facilitate the implementation and reusability of discretization. These concepts are described in the following. This is done in three steps.
First, a general describtion of the PDE problems is given.
Then, a categorization of the different problems is presented together with the needs of the implementation. These needs give rise to a first Interface class.
In a third step an even finer splitting of the problem is described. This splitting suggests a second interface class. One implementation of the first Interface class will use this finer grained splitting.
For any questions, contact andre . as.v ogel@ gcsc .uni- fran kfurt .de
This section explains what kind of partial differential equations (PDE) can be discretized using libDiscretization.
The starting point for any discretization is a physical domain, \( \Omega \subset \mathbb{R}^d \). In Ug currently 1d, 2, and 3d domains are supported. Furthermore, for time dependent problems one has a finite time interval \( I := [t_{start}, t_{end}] \) where the solution is searched.
The PDE model the behaviour of a set of \( n \) functions on the domain:
\begin{align*} u_i : \Omega \times I &\mapsto \mathbb{R}\\ (\vec{x}, t) &\mapsto u_i(\vec{x}, t). \end{align*}
The support for each function may not be the whole domain, but be only a subset of the given domain. This case will be documented (hopefully) soon ....
To simplify notations, one can group all functions to one single function
\begin{align*} \vec{u}(\vec{x},t) := \begin{pmatrix} u_1(\vec{x}, t) \\ \vdots \\ u_n(\vec{x}, t) \end{pmatrix}. \end{align*}
Now, a sytem of PDEs for the unknown functions is given by
\begin{align*} \mathcal{M}(\vec{u}) + \mathcal{A}(\vec{u}) &= f, &x\in\Omega,\\ \mathcal{B}(\vec{u}) &= 0, &x\in\partial \Omega. \end{align*}
Here, we have the following notation:
\begin{align*} f(\vec{x}, t) &\text{ is a given right - hand side independent of } \vec{u},\\ \mathcal{M} &\text{ is a time-dependent operator acting on } \vec{u},\\ \mathcal{A} &\text{ is a time-independent operator acting in } \vec{u},\\ \mathcal{B} &\text{ are boundary conditions for } \vec{u}. \end{align*}
Note, that this gives a well-defined separation of the problem. Usually, the term \(\mathcal{M}\) is called Mass-part while \( \mathcal{A}\) is called Stiffness-part (for historic reasons). Some examples:
Convection-Diffusion-Reaction Equation
\begin{align*} \partial_t c - \nabla \left( D \nabla c - \vec{v} c \right) + r(c) &= f, &\text{ in } \Omega,\\ c &= g, &\text{ on } \partial\Omega_D,\\ \frac{\partial c}{\partial \vec{n}} &= h &\text{ on } \partial\Omega_N, \end{align*}
with the notation
Interpreting this problem in the above terms one finds:
For the stationary problem (i.e. time-independent), one finds \( \partial_t c = 0 \) and omits the dependency of \( t \) in for all functions. This problem can be written as above, with \( \mathcal{M}(c) = 0 \).
libDiscretization uses this splitting of the problem into different operators to implement the problem in a modular way. This is described in Categorization of Problems