Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • dumux dumux
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 104
    • Issues 104
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 88
    • Merge requests 88
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Container Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • dumux-repositoriesdumux-repositories
  • dumuxdumux
  • Merge requests
  • !1989

[WIP] [linear] Add first draft of SIMPLE preconditioner

  • Review changes

  • Download
  • Email patches
  • Plain diff
Open Kilian Weishaupt requested to merge feature/simple-preconditioner into master Apr 16, 2020
  • Overview 35
  • Commits 8
  • Pipelines 0
  • Changes 2

SIMPLE

Goal: solve

\begin{pmatrix}
A & B\\
C & D
\end{pmatrix}
\begin{pmatrix}
u\\
p
\end{pmatrix}
=
\begin{pmatrix}
f\\
g
\end{pmatrix}

Equations

Exact velocity: ~~~~~~u = u^* + \delta u ~~~~~~~ (1)

Exact pressure: ~~~~~~p = p^* + \delta p ~~~~~~~ (2)

Exact velocity equation: ~~~~~~A u + B p = f ~~~~~~~ (3)

Approximate velocity equation using some pressure guess p^*: ~~~~~~A u^* + B p^* = f ~~~~~~~ (4)

Substract: (3-4) : ~~~~~~A (u - u^*) + B (p-p^*) = 0 ~~~~~~~ (5)

~~~~~~A \delta u + B \delta p = 0 ~~~~~~~ (6)

Assumption (SIMPLE): ~~~~~~diag(A) \approx A ~~~~~~~ (7)

Rearrange (6) and insert (7): ~~~~~~\delta u = - diag(A)^{-1} B \delta p~~~~~~~ (7)

Mass conservation: ~~~~~~C u = g~~~~~~~ (8)

~~~~~~C (u^* + \delta u) = g~~~~~~~ (9)

~~~~~~C (u^* + - C diag(A)^{-1} B \delta p) = g~~~~~~~ (10)

~~~~~~C u^* = g + C diag(A)^{-1} B \delta p~~~~~~~ (11)

Schur complement ~~~~~~C diag(A)^{-1} B \delta p = C u^* - g ~~~~~~~ (12)

Algorithm

1.) Solve (4) for u^*

2.) Solve (12) for \delta p

3.) Get \delta u from (7)

4.) update p=p^* + \alpha \delta p

5.) update u= u^* +\delta u

Naive implementation of https://www.cs.umd.edu/~elman/papers/tax.pdf

Converges, but is slower than Uzawa.

The internal GMRES solver to invert the Schur complement is not preconditioned yet (Richardson, w = 1). Richardson seems to be the only preconditioner that does not require an assembled matrix.

Maybe we can write our own Jacobi preconditioner? If one can apply the action of the Schur complement without a matrix (what we do right now), is it also possible to apply the inverse of its diagonal without having the matrix?

Udpate : There seem to be various matrix-free preconditioning methods

http://www2.cs.cas.cz/~tuma/ps/cutu06.pdf

https://hal.inria.fr/inria-00074080/document

http://www2.cs.cas.cz/semincm/lectures/2009-05-15-DuintjerTebbens.pdf

https://arxiv.org/pdf/1805.11930.pdf

https://arxiv.org/pdf/2006.06052.pdf

https://gitlab.dune-project.org/exadune/exadune-appl/-/blob/feature/blockiterative-preconditioner-FlexibleGMRES/src/blockiterativesolver/blockdiagonalpreconditioner.hh

A very simple (and probably expensive) option to test if preconditioning helps inverting the approximate Schur \tilde{S} complement would be

\tilde{S}^{-1}_{0,0}  = \left(\tilde{S} \cdot (1, 0, ... ,n)^T \right) \cdot (1, 0, ... ,n)^T \\

\tilde{S}^{-1}_{1,1}  = \left(\tilde{S} \cdot (0, 1, ... ,n)^T \right) \cdot (0, 1, ... ,n)^T \\
....

With that, one could construct a Jacobi preconditioner after doing n matrix vector operations.

Edited Jul 30, 2020 by Kilian Weishaupt
Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: feature/simple-preconditioner