From f0e9dcbc1ac59a8581604443e162afe969f23bf4 Mon Sep 17 00:00:00 2001
From: Kilian <kilian.weishaupt@iws.uni-stuttgart.de>
Date: Mon, 6 Apr 2020 19:50:46 +0200
Subject: [PATCH] [linear][uzawa] Improve docu

---
 doc/handbook/dumux-handbook.bib | 25 ++++++++++++++++
 dumux/linear/preconditioners.hh | 53 +++++++++++++++++++++++++++++++++
 2 files changed, 78 insertions(+)

diff --git a/doc/handbook/dumux-handbook.bib b/doc/handbook/dumux-handbook.bib
index 88860ce45f..9b5588c9ac 100644
--- a/doc/handbook/dumux-handbook.bib
+++ b/doc/handbook/dumux-handbook.bib
@@ -1882,3 +1882,28 @@ year={1999}
 	pages={37},
 	year={1964}
 }
+
+@article{benzi2005,
+  doi = {10.1017/s0962492904000212},
+  url = {https://doi.org/10.1017/s0962492904000212},
+  year = {2005},
+  publisher = {Cambridge University Press ({CUP})},
+  volume = {14},
+  pages = {1--137},
+  author = {Michele Benzi and Gene H. Golub and J\"{o}rg Liesen},
+  title = {Numerical solution of saddle point problems},
+  journal = {Acta Numerica}
+}
+
+@article{ho2017,
+  doi = {10.1137/16m1076770},
+  url = {https://doi.org/10.1137/16m1076770},
+  year = {2017},
+  publisher = {Society for Industrial {\&} Applied Mathematics ({SIAM})},
+  volume = {39},
+  number = {5},
+  pages = {S461--S476},
+  author = {Nguyenho Ho and Sarah D. Olson and Homer F. Walker},
+  title = {Accelerating the Uzawa Algorithm},
+  journal = {{SIAM} Journal on Scientific Computing}
+}
diff --git a/dumux/linear/preconditioners.hh b/dumux/linear/preconditioners.hh
index 346c3dfc71..16df85cfba 100644
--- a/dumux/linear/preconditioners.hh
+++ b/dumux/linear/preconditioners.hh
@@ -44,6 +44,40 @@
 namespace Dumux {
 
 #if DUNE_VERSION_GTE(DUNE_ISTL,2,7)
+/*!
+ * \ingroup Linear
+ * \brief A preconditioner based on the Uzawa algorithm for saddle-point problems of the form
+ * \f$
+ \begin{pmatrix}
+    A & B \\
+    C & D
+ \end{pmatrix}
+
+ \begin{pmatrix}
+    u\\
+    p
+ \end{pmatrix}
+
+ =
+
+ \begin{pmatrix}
+    f\\
+    g
+ \end{pmatrix}
+  * \f$
+ *
+ * This preconditioner is especially suited for solving the incompressible (Navier-)Stokes equations.
+ * Here, \f$D = 0\f$ and \f$B = C^T\f$ if \f$\rho = 1\f$.
+ * We do not expect good convergence if energy or mass transport is considered.
+ *
+ * See: Benzi, M., Golub, G. H., & Liesen, J. (2005). Numerical solution of saddle point problems. Acta numerica, 14, 1-137 \cite benzi2005 and <BR>
+ *      Ho, N., Olson, S. D., & Walker, H. F. (2017). Accelerating the Uzawa algorithm. SIAM Journal on Scientific Computing, 39(5), S461-S476 \cite ho2017
+ *
+ * \tparam M Type of the matrix.
+ * \tparam X Type of the update.
+ * \tparam Y Type of the defect.
+ * \tparam l Preconditioner block level (for compatibility reasons, unused).
+ */
 template<class M, class X, class Y, int l = 1>
 class SeqUzawa : public Dune::Preconditioner<X,Y>
 {
@@ -189,6 +223,25 @@ private:
 #endif
     }
 
+    /*!
+     * \brief Estimate the relaxation factor omega
+     *
+     * The optimal relaxation factor is omega = 2/(lambdaMin + lambdaMax), where lambdaMin and lambdaMax are the smallest and largest
+     * eigenvalues of the Schur complement -C*Ainv*B (assuming D = 0).
+     * lambdaMax can be easily determined using the power iteration algorithm (https://en.wikipedia.org/wiki/Power_iteration) and lambdaMin
+     * could be estimated in a similar manner. We do not consider lambdaMin because for certain cases, e.g., when C contains some rows of zeroes only,
+     * this estimate will fail.
+     *
+     * Instead we assume that lambdaMin is sufficiently close to lambdaMax such that omega = 1/lambdaMax.
+     * This seems to work rather well for various applications.
+     * We will underestimate omega by a factor of 2 in the worst case (i.e, lambdaMin = 0).
+     *
+     * When facing convergence issues, you may set LinearSolver.Preconditioner.Verbosity = 1 to see the estimate of lambdaMax.
+     * In a new simulation run, you can then set LinearSolver.Preconditioner.DetermineRelaxationFactor = false and set some other value
+     * for LinearSolver.Preconditioner.Relaxation based on the estimate of lambdaMax.
+     *
+     * See: Benzi, M., Golub, G. H., & Liesen, J. (2005). Numerical solution of saddle point problems. Acta numerica, 14, 1-137.
+     */
     scalar_field_type estimateOmega_() const
     {
         using namespace Dune::Indices;
-- 
GitLab