16#include "libmesh/preconditioner.h"
17#include "libmesh/linear_implicit_system.h"
18#include "libmesh/enum_preconditioner_type.h"
46 std::vector<unsigned int> off_diag,
53 virtual void apply(
const NumericVector<Number> & x, NumericVector<Number> & y);
76 std::vector<libMesh::LinearImplicitSystem *>
_systems;
Base class for MOOSE preconditioners.
Nonlinear system to be solved.
Implements a segregated solve preconditioner.
virtual void setup()
This is called every time the "operator might have changed".
std::vector< unsigned int > _solve_order
Holds the order the blocks are solved for.
virtual void clear()
Release all memory and clear data structures.
static InputParameters validParams()
Constructor.
virtual ~PhysicsBasedPreconditioner()
std::vector< std::vector< libMesh::SparseMatrix< Number > * > > _off_diag_mats
Holds pointers to the off-diagonal matrices.
NonlinearSystemBase & _nl
The nonlinear system this PBP is associated with (convenience reference)
virtual void apply(const NumericVector< Number > &x, NumericVector< Number > &y)
Computes the preconditioned vector "y" based on input "x".
std::vector< libMesh::LinearImplicitSystem * > _systems
List of linear system that build up the preconditioner.
std::vector< std::unique_ptr< libMesh::Preconditioner< Number > > > _preconditioners
Holds one Preconditioner object per small system to solve.
std::vector< libMesh::PreconditionerType > _pre_type
Which preconditioner to use for each solve.
std::vector< std::vector< unsigned int > > _off_diag
Holds which off diagonal blocks to compute.
void addSystem(unsigned int var, std::vector< unsigned int > off_diag, libMesh::PreconditionerType type=libMesh::AMG_PRECOND)
Add a diagonal system + possibly off-diagonals ones as well, also specifying type of preconditioning.
virtual void init()
Initialize data structures if not done so already.
PreconditionerType type() const