The aim of this PR is the implementation of generic (linear/nonlinear), hierarchical block preconditioners.
The idea is that we want to have a preconditioner with a block structure, such that each block can be a regular solver (Direct/Iterative) or another block solver. Moreover, the iterative solvers can themselves be preconditioned.
Another difficulty is the fact that some of the blocks can be nonlinear (i.e the matrix for that block changes every time the solver is called) and possibly are NOT the system matrix (i.e the case of a preconditioner that changes at each nonlinear iteration but which requires integrating it's own components).
All in all, I have identified three types of blocks:
Blocks that solve the system matrix block (which can be linear or nonlinear).
Blocks that solve an alternative fixed matrix which is not the matrix from the linear system (always linear).
Blocks that solve an alternative problem given with a weakform (linear or nonlinear).
In addition, I also aim to implement structures that allow for efficient re-assembly of block systems: In most cases, not all the blocks in a multi-physics problem will have non-linearity. For instance, in the MHD equations only the u-u block has the Navier-Stokes nonlinear term. We would like to exploit this and only re-assemble the blocks containing that non-linearity. To this purpose:
We will require a BlockFEOperator, which has knowledge of which blocks are nonlinear.
We will require the weakform to also be block-wise, i.e a BlockFunctional type of object.
Other stuff:
GMRES/FGMRES: Restart mode and modified how iterations are counted.
Added enhanced version of NewtonRaphson solver. Very similar to the one in Gridap, but with better logging and control of tolerances.
The aim of this PR is the implementation of generic (linear/nonlinear), hierarchical block preconditioners.
The idea is that we want to have a preconditioner with a block structure, such that each block can be a regular solver (Direct/Iterative) or another block solver. Moreover, the iterative solvers can themselves be preconditioned.
Another difficulty is the fact that some of the blocks can be nonlinear (i.e the matrix for that block changes every time the solver is called) and possibly are NOT the system matrix (i.e the case of a preconditioner that changes at each nonlinear iteration but which requires integrating it's own components).
All in all, I have identified three types of blocks:
In addition, I also aim to implement structures that allow for efficient re-assembly of block systems: In most cases, not all the blocks in a multi-physics problem will have non-linearity. For instance, in the MHD equations only the u-u block has the Navier-Stokes nonlinear term. We would like to exploit this and only re-assemble the blocks containing that non-linearity. To this purpose:
BlockFEOperator
, which has knowledge of which blocks are nonlinear.BlockFunctional
type of object.Other stuff: