From f24df1a6e1512df5395eca2899595f0ccff14f26 Mon Sep 17 00:00:00 2001 From: Timo Koch <timokoch@uio.no> Date: Thu, 29 Jun 2023 00:31:06 +0200 Subject: [PATCH] [doxygen] Add numerics section from handbook --- doc/doxygen/DoxygenDumuxLayout.xml | 1 + doc/doxygen/pages/numerics.md | 113 +++++++++++++++++++ doc/handbook/0_dumux-handbook.tex | 6 - doc/handbook/5_assemblinglinearsystem.tex | 123 --------------------- doc/handbook/6_temporaldiscretizations.tex | 66 ----------- 5 files changed, 114 insertions(+), 195 deletions(-) create mode 100644 doc/doxygen/pages/numerics.md delete mode 100644 doc/handbook/5_assemblinglinearsystem.tex delete mode 100644 doc/handbook/6_temporaldiscretizations.tex diff --git a/doc/doxygen/DoxygenDumuxLayout.xml b/doc/doxygen/DoxygenDumuxLayout.xml index b8dcb4f257..40aa7c4931 100644 --- a/doc/doxygen/DoxygenDumuxLayout.xml +++ b/doc/doxygen/DoxygenDumuxLayout.xml @@ -25,6 +25,7 @@ SPDX-License-Identifier: GPL-3.0-or-later </tab> <tab type="modules" visible="yes" title="Module documentation" intro=""/> <tab type="user" url="@ref flow-and-transport-in-porous-media" visible="yes" title="Flow and transport in porous media" intro=""/> + <tab type="user" url="@ref basic-numerics" visible="yes" title="Basic numerics" intro=""/> <tab type="user" url="@ref python-bindings" visible="yes" title="Python bindings" intro=""/> <tab type="usergroup" title="Developer documentation"> <tab type="user" url="@ref dumux-and-dune" visible="yes" title="Dumux and Dune" intro=""/> diff --git a/doc/doxygen/pages/numerics.md b/doc/doxygen/pages/numerics.md new file mode 100644 index 0000000000..809e8aa47f --- /dev/null +++ b/doc/doxygen/pages/numerics.md @@ -0,0 +1,113 @@ +# Basic numerics + +In this section we discuss some basic numerical concepts for the +solution of partial differential equations used in DuMux. + +## Newton's method + +Nonlinear systems of equations can be solved with Newton's method. +Newton's method is quadratically convergent, if the initial solution is +close enough to the root of the residual equation. It does however not +guarantee global convergence. + +The discrete differential equations are formulated in residual form. All terms are +on the left hand side and are summed up. The terms contain values for the primary +variables which are part of the solution vector $\textbf{u}$. The sum of the terms +is called residual $\textbf{r}(\textbf{u})$ which is a function of the solution. For +example: + +\begin{align*} +\underbrace{ + \phi \frac{\partial \varrho_\alpha S_\alpha}{\partial t} + - + \text{div} \left( + \varrho_\alpha \frac{k_{r\alpha}}{\mu_\alpha} \boldsymbol{K} + \left(\nabla p_\alpha - \varrho_{\alpha} \boldsymbol{g} \right) + \right) - q_\alpha} _ +{=: \, \textbf{r}(\textbf{u})} += 0 +\end{align*} + +We are looking for the unknown solution $\textbf{u}$ and use Newton's method to +create a series of $\textbf{u}^i$ that we hope converges to $\textbf{u}$. +We start with an initial guess $\textbf{u}^0$ and +calculate the initial residual $\textbf{r}(\textbf{u}^0)$. Next, +we calculate the derivative of the residual with respect to the solution. +This is the Jacobian matrix + +\begin{align*} + \frac{\text{d}}{\text{d}\textbf{u}}\textbf{r} \left(\textbf{u}^i\right) + = J_{\textbf{r} \left(\textbf{u}^i\right)} + = \left(\frac{\text{d}}{\text{d}\textbf{u}^i_m}\textbf{r} \left(\textbf{u}^i\right)_n\right)_{m,n} +\end{align*} + +with $i$ denoting the Newton iteration step. +Each column is the residual derived with respect to the $m$th entry of $\textbf{u}^i$. + +The Jacobian indicates the direction where the residual increases. By solving the +linear system + +\begin{align*} + J_{\textbf{r}(\textbf{u}^i)} \cdot \textbf{x}^i = \textbf{r}(\textbf{u}^i) +\end{align*} + +we calculate the direction of maximum growth $\textbf{x}^i$. We subtract it from +our current solution to get a new, better solution +$\textbf{u}^{i+1} = \textbf{u}^i - \textbf{x}^i$. + +We repeat the calculation of the Jacobian $J_{\textbf{r}(\textbf{u}^i)}$ and the +direction of maximum growth $\textbf{x}^i$ until our approximated solution becomes good enough. +See `Dumux::NewtonSolver` for the implementation of the Newton method based solver in DuMux +which features various convergence criteria and a simple line search algorithm to improve the update. + +## Time discretization + +In the following, we describe two basic time stepping schemes which are first-order accurate. +Our systems of partial differential equations are discretized in space and in time. + +Let us consider the general case of a balance equation of the following form + +\begin{equation} +\frac{\partial m(u)}{\partial t} + \nabla\cdot\boldsymbol{f}(u, \nabla u) + q(u) = 0, +\end{equation} + +seeking an unknown quantity $u$ in terms of storage $m$, flux $\boldsymbol{f}$ and source $q$. +All available Dumux models can be written mathematically in this form +with possibly vector-valued quantities $u$, $m$, $q$ and a tensor-valued flux $\boldsymbol{f}$. +For the sake of simplicity, we here assume scalar quantities $u$, $m$, $q$ and a vector-valued +flux $\boldsymbol{f}$. + +To discretize the continuous form of the balance equations, we need to choose an +approximation for the temporal derivative $\partial m(u)/\partial t$. +While many elaborate methods for this approximation exist, +we focus on the simplest one of a first order difference quotient + +\begin{equation} +\frac{\partial m(u_{k/k+1})}{\partial t} +\approx \frac{m(u_{k+1}) - m(u_k)}{\Delta t_{k+1}} +\end{equation} + +for approximating the solution $u$ at time $t_k$ (forward) or $t_{k+1}$ (backward). +The question of whether to choose the forward or the backward quotient leads to the +explicit and implicit Euler method, respectively. +Using the explicit Euler method leads to + +\begin{equation} +\frac{m(u_{k+1}) - m(u_k)}{\Delta t_{k+1}} + \nabla\cdot\boldsymbol{f}(u_k, \nabla u_k) + q(u_k) = 0, +\end{equation} + +whereas the implicit Euler method is described as + +\begin{equation} +\frac{m(u_{k+1}) - m(u_k)}{\Delta t_{k+1}} ++ \nabla\cdot\boldsymbol{f}(u_{k+1}, \nabla u_{k+1}) + q(u_{k+1}) = 0. +\end{equation} + +Once the solution $u_k$ at time $t_k$ is known, it is straightforward +to determine $m(u_{k+1})$, +while attempting to do the same for the equation discreized with the implicit Euler +involves the solution of a system of equations. +The explicit method is stable only +if the time step size $\Delta t_{k+1}$ is below a certain limit that depends +on the specific balance equation, whereas the implicit method +is unconditionally stable. diff --git a/doc/handbook/0_dumux-handbook.tex b/doc/handbook/0_dumux-handbook.tex index be940e0112..a90966bcc6 100644 --- a/doc/handbook/0_dumux-handbook.tex +++ b/doc/handbook/0_dumux-handbook.tex @@ -120,12 +120,6 @@ The handbook is in the process of being dissolved. \input{5_structure} \input{5_newfoldersetup} \input{5_scripts} -\input{5_assemblinglinearsystem} - -\chapter{Advanced \Dumux\ -- Detailed Instructions} -This chapter contains detailed information for those who are interested -in deeper modifications of underlying \Dumux models, classes, functions, etc. -\input{6_temporaldiscretizations} \bibliographystyle{plainnat} \bibliography{dumux-handbook} diff --git a/doc/handbook/5_assemblinglinearsystem.tex b/doc/handbook/5_assemblinglinearsystem.tex deleted file mode 100644 index affcf49ba3..0000000000 --- a/doc/handbook/5_assemblinglinearsystem.tex +++ /dev/null @@ -1,123 +0,0 @@ -% SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder -% SPDX-License-Identifier: CC-BY-4.0 - -\section{Assembling the linear system} -\label{sc_linearsystem} -The physical system is implemented as the mathematical differential equation in -local operators. \Dumux generates the linear system automatically. Read on, to -learn what is done internally. - -\subsection{Newton's method} -The differential equations are implemented in the residual form. All terms are -on the left hand side and are summed up. The terms contain values for the primary -variables which are part of the solution vector $\textbf{u}$. The sum of the terms -is called residual $\textbf{r}(\textbf{u})$ which is a function of the solution. For -example: -\begin{align*} -\underbrace{ - \phi \frac{\partial \varrho_\alpha S_\alpha}{\partial t} - - - \text{div} \left( - \varrho_\alpha \frac{k_{r\alpha}}{\mu_\alpha} \mathbf{K} - \left(\grad\, p_\alpha - \varrho_{\alpha} \mathbf{g} \right) - \right) - q_\alpha} _ -{=: \, \textbf{r}(\textbf{u})} -= 0 -\end{align*} - -We don't know the solution $\textbf{u}$, so we use the iterative Newton's method to -obtain a good estimate of $\textbf{u}$. We start with an initial guess $\textbf{u}^0$ and -calculate it's residual $\textbf{r}(\textbf{u}^0)$. To minimize the error, we calculate -the derivative of the residual with respect to the solution. This is the Jacobian -matrix -\begin{align*} - \frac{\text{d}}{\text{d}\textbf{u}}\textbf{r} \left(\textbf{u}^i\right) - = J_{\textbf{r} \left(\textbf{u}^i\right)} - = \left(\frac{\text{d}}{\text{d}\textbf{u}^i_m}\textbf{r} \left(\textbf{u}^i\right)_n\right)_{m,n} -\end{align*} -with $i$ denoting the Newton iteration step. -Each column is the residual derived with respect to the $m$th entry of $\textbf{u}^i$. - -The Jacobian indicates the direction where the residual increases. By solving the -linear system -\begin{align*} - J_{\textbf{r}(\textbf{u}^i)} \cdot \textbf{x}^i = \textbf{r}(\textbf{u}^i) -\end{align*} -we calculate the direction of maximum growth $\textbf{x}^i$. We subtract it from -our current solution to get a new, better solution -$\textbf{u}^{i+1} = \textbf{u}^i - \textbf{x}^i$. - -We repeat the calculation of the Jacobian $J_{\textbf{r}(\textbf{u}^i)}$ and the -direction of maximum growth $\textbf{x}^i$ until our approximated solution becomes good enough. - -\subsection{Structure of matrix and vectors} -To understand the meaning of an entry in the matrix or the vector of the linear system, we have -to define their structure. Both have a block structure. Each block contains the degrees of -freedom (also called variables or unknowns) for a control volume. The equation index is used -to order the degrees of freedom. For each control volume we have one block. The mapper is -used to order the blocks. - -\begin{figure}[htbp] -\begin{center} -\begin{tikzpicture}[fill=dumuxBlue] - %% blocking structure - % matrix - \node at (0.3,4.2){\footnotesize 1. CV}; - \node at (1.7,4.2){\footnotesize 2. CV}; - \node at (3.5,4.2){\footnotesize $n$. CV}; - - \draw (0,0) rectangle (4,4); - - \fill (0.1,3.1) rectangle (0.9,3.9); - \fill (1.1,3.1) rectangle (1.9,3.9); - \node at (2.5,3.5) {$\dots$}; - \fill (3.1,3.1) rectangle (3.9,3.9); - \node at (4,3.5) [right]{\footnotesize 1. CV}; - - \fill (0.1,2.1) rectangle (0.9,2.9); - \fill (1.1,2.1) rectangle (1.9,2.9); - \node at (2.5,2.5) {$\dots$}; - \fill (3.1,2.1) rectangle (3.9,2.9); - \node at (4,2.5) [right]{\footnotesize 2. CV}; - - \node at (0.5,1.5) {$\vdots$}; - \node at (1.5,1.5) {$\vdots$}; - \node at (2.5,1.5) {$\ddots$}; - \node at (3.5,1.5) {$\vdots$}; - - \fill (0.1,0.1) rectangle (0.9,0.9); - \fill (1.1,0.1) rectangle (1.9,0.9); - \node at (2.5,0.5) {$\dots$}; - \fill (3.1,0.1) rectangle (3.9,0.9); - \node at (4,0.5) [right]{\footnotesize $n$. CV}; - - % vector - \draw (5.5,0) rectangle (5.9,4); - \fill (5.6,3.1) rectangle (5.8,3.9); - \fill (5.6,2.1) rectangle (5.8,2.9); - \node at (5.7,1.5) {$\vdots$}; - \fill (5.6,0.1) rectangle (5.8,0.9); - - %% intra-block structure - \fill (8.1,2.1) rectangle (8.9,2.9); - \draw (9,2.8) -- (9.6,3.4); - \draw (9,2.6) -- (9.6,2.8); - \draw (9,2.2) -- (9.3,1.6); - - \node at (10,4) {${eqIdx}$}; - \node at (10,3.4) {$0$}; - \node at (10,2.8) {$1$}; - \node at (10,2.2) {$\vdots$}; - \node at (10,1.6) {$m-1$}; - - \fill (11.1,2.1) rectangle (11.3,2.9); - \draw (11,2.8) -- (10.4,3.4); - \draw (11,2.6) -- (10.4,2.8); - \draw (11,2.2) -- (10.7,1.6); -\end{tikzpicture} -\end{center} -\caption{Structure of matrix and vector, left: block structure, right: within block} -\end{figure} - -Accessing entries follows this structure. You can access the pressure value in the third ($n=3$) sub-control volume in -a solution vector \lstinline{sol} with \lstinline{sol[n-1][pressureIdx]=sol[2][pressureIdx]}. diff --git a/doc/handbook/6_temporaldiscretizations.tex b/doc/handbook/6_temporaldiscretizations.tex deleted file mode 100644 index 5608500442..0000000000 --- a/doc/handbook/6_temporaldiscretizations.tex +++ /dev/null @@ -1,66 +0,0 @@ -% SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder -% SPDX-License-Identifier: CC-BY-4.0 - -\section{Temporal Discretization and Solution Strategies} -In this section, the temporal discretization as well as solution strategies (monolithic/sequential) are presented. - -\subsection{Temporal discretization} - -Our systems of partial differential equations are discretized in space and in time. - -Let us consider the general case of a balance equation of the following form -\begin{equation}\label{eq:generalbalance} -\frac{\partial m(u)}{\partial t} + \nabla\cdot\mathbf{f}(u, \nabla u) + q(u) = 0, -\end{equation} -seeking an unknown quantity $u$ in terms of storage $m$, flux $\mathbf{f}$ and source $q$. -All available Dumux models can be written mathematically in form of \eqref{eq:generalbalance} -with possibly vector-valued quantities $u$, $m$, $q$ and a tensor-valued flux $\mathbf{f}$. -For the sake of simplicity, we assume scalar quantities $u$, $m$, $q$ and a vector-valued -flux $\mathbf{f}$ in the notation below. - -For discretizing \eqref{eq:generalbalance}, we need to choose an -approximation for the temporal derivative $\partial m(u)/\partial t$. -While many elaborate methods for this approximation exist, -we focus on the simplest one of a first order difference quotient -\begin{equation}\label{eq:euler} -\frac{\partial m(u_{k/k+1})}{\partial t} -\approx \frac{m(u_{k+1}) - m(u_k)}{\Delta t_{k+1}} -\end{equation} -for approximating the solution $u$ at time $t_k$ (forward) or $t_{k+1}$ (backward). -The question of whether to choose the forward or the backward quotient leads to the -explicit and implicit Euler method, respectively. -In case of the former, inserting \eqref{eq:euler} in \eqref{eq:generalbalance} -at time $t_k$ leads to -\begin{equation}\label{eq:expliciteuler} -\frac{m(u_{k+1}) - m(u_k)}{\Delta t_{k+1}} + \nabla\cdot\mathbf{f}(u_k, \nabla u_k) + q(u_k) = 0, -\end{equation} -whereas the implicit Euler method is described as -\begin{equation}\label{eq:impliciteuler} -\frac{m(u_{k+1}) - m(u_k)}{\Delta t_{k+1}} -+ \nabla\cdot\mathbf{f}(u_{k+1}, \nabla u_{k+1}) + q(u_{k+1}) = 0. -\end{equation} -Once the solution $u_k$ at time $t_k$ is known, it is straightforward -to determine $m(u_{k+1})$ from \eqref{eq:expliciteuler}, -while attempting to do the same based on \eqref{eq:impliciteuler} -involves the solution of a system of equations. -On the other hand, the explicit method \eqref{eq:expliciteuler} is stable only -if the time step size $\Delta t_{k+1}$ is below a certain limit that depends -on the specific balance equation, whereas the implicit method \eqref{eq:impliciteuler} -is unconditionally stable. - -\subsection{Solution strategies to solve equations} -The governing equations of each model can be solved monolithically or sequentially. -The basic idea of the sequential algorithm is to reformulate the -equations of multi-phase flow into one equation for -pressure and equations for phase/component/... transport. The pressure equation -is the sum of the mass balance equations and thus considers the total flow of the -fluid system. The new set of equations is considered as decoupled (or weakly coupled) -and can thus be solved sequentially. The most popular sequential model is the -fractional flow formulation for two-phase flow which is usually implemented applying -an IMplicit Pressure Explicit Saturation algorithm (IMPES). -In comparison to solving the equations monolithically, the sequential structure allows the use of -different discretization methods for the different equations. The standard method -used in the sequential algorithm is a cell-centered finite volume method. Further schemes, -so far only available for the two-phase pressure equation, are cell-centered finite -volumes with multi-point flux approximation (Mpfa-O method) and mimetic finite differences. -An $h$-adaptive implementation of both sequential algorithms is provided for two dimensions. -- GitLab