WIP: Uzawa algorithm for Navier Stokes
Provide two linear solvers for Navier-Stokes that use the Uzawa algorithm.
The Uzawa algorithm is implemented in form of the preconditioner SeqUzawa
. By default, the direct UMFPack
solver is used for the velocity subsystem. Alternatively, setting LinearSolver.InexactVelocitySolver
to true will use one AMG cycle instead. The success is rather sensitive to the relaxation parameter LinearSolver.PreconditionerRelaxation
that depends (at least) on the mesh size and the viscosity.
The solver UzawaSolver
employs the preconditioner by default in a simple loop. Setting LinearSolver.AndersonAcceleration
to true will speed up the convergence by using Anderson acceleration. The solver UzawaBiCGSTABBackend
uses a BiCGSTAB solver around the Uzawa preconditioner.
Tests test_ff_navierstokes_sincos_uzawasolver
and ...uzawapreconditioner
have been added to test/freeflow/navierstokes/sincos
and are supposed to reproduce the results of test_ff_navierstokes_sincos_instationary
.
The promising fact is that both solvers work, meaning that we are no longer restricted to direct solvers. However, the number of required iterations is very high, especially when starting from an already small residual. For the considered tests, the UzawaBiCGSTABBackend
is superior to the Anderson-accelerated UzawaSolver
.
Dumux Day 25.03.20 Only consider Uzawa preconditioner for 3.2
TODO
-
Remove dependency on grid geometry -
Use Dune::Indices for improved readability -
Revise incorporation of boundary conditions in Uzawa preconditioner -
Make Uzawa preconditioner usable without solver factory -
Extract parameter tree conversion from solver factory to make it reusable -
Revisit memory usage of Anderson Acceleration (do we really need maxIter-sized containers? can be very large) -
Maybe extend for multidomain problems, i.e., allow to handle additional matrix blocks with given preconditioners