WIP: Uzawa algorithm for Navier Stokes
Provide two linear solvers for NavierStokes 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 Andersonaccelerated 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 maxItersized containers? can be very large) 
Maybe extend for multidomain problems, i.e., allow to handle additional matrix blocks with given preconditioners