18 using BlockOverride = std::pair<int, std::unique_ptr<const mfem::Operator>>;
41 std::vector<BlockOverride> overrides = {});
49 virtual void Mult(
const mfem::Vector& in, mfem::Vector& out)
const;
56 virtual void SetOperator(
const mfem::Operator& jacobian);
62 mfem::Array<int>& block_offsets_;
65 const int num_blocks_;
68 const mfem::BlockOperator* block_jacobian_;
71 mfem::BlockOperator solver_diag_;
74 mutable std::vector<std::unique_ptr<mfem::Solver>> mfem_solvers_;
77 std::vector<std::unique_ptr<const mfem::Operator>> block_op_overrides_;
114 std::vector<BlockOverride> overrides = {});
122 virtual void Mult(
const mfem::Vector& in, mfem::Vector& out)
const;
129 virtual void SetOperator(
const mfem::Operator& jacobian);
135 mfem::Array<int>& block_offsets_;
138 const int num_blocks_;
141 const mfem::BlockOperator* block_jacobian_;
144 mutable std::vector<std::unique_ptr<mfem::Solver>> mfem_solvers_;
155 void LowerSweep(
const mfem::Vector& in, mfem::Vector& out)
const;
163 void UpperSweep(
const mfem::Vector& in, mfem::Vector& out)
const;
166 std::vector<std::unique_ptr<const mfem::Operator>> block_op_overrides_;
217 std::vector<BlockOverride> overrides = {});
225 virtual void Mult(
const mfem::Vector& in, mfem::Vector& out)
const;
234 virtual void SetOperator(
const mfem::Operator& jacobian);
240 mfem::Array<int>& block_offsets_;
243 const mfem::BlockOperator* block_jacobian_;
246 mfem::BlockOperator solver_diag_;
249 mutable std::vector<std::unique_ptr<mfem::Solver>> mfem_solvers_;
252 const mfem::Operator* A_12_ =
nullptr;
253 const mfem::Operator* A_21_ =
nullptr;
260 mutable std::unique_ptr<const mfem::Operator> S_approx_owned_;
261 const mfem::Operator* S_approx_view_ =
nullptr;
273 void LowerBlock(
const mfem::Vector& in, mfem::Vector& out)
const;
281 void UpperBlock(
const mfem::Vector& in, mfem::Vector& out)
const;
284 std::vector<std::unique_ptr<const mfem::Operator>> block_op_overrides_;
286 mfem::HypreParMatrix* BuildSchurDiagApprox_(
const mfem::HypreParMatrix& A11,
const mfem::HypreParMatrix& A12,
287 const mfem::HypreParMatrix& A21,
const mfem::HypreParMatrix& A22)
const;
Simple block diagonal preconditioner for block systems.
BlockDiagonalPreconditioner(mfem::Array< int > &offsets, std::vector< std::unique_ptr< mfem::Solver >> solvers, std::vector< BlockOverride > overrides={})
Construct a new N by N block diagonal preconditioner.
virtual void Mult(const mfem::Vector &in, mfem::Vector &out) const
The action of the precondition on the block vector (b_1, ..., b_n)
virtual void SetOperator(const mfem::Operator &jacobian)
Set the preconditioner to use the supplied linearized block Jacobian.
Simple 2x2 block Schur complement preconditioner for block systems.
virtual void Mult(const mfem::Vector &in, mfem::Vector &out) const
The action of the precondition on the block vector (b_1, b_2)
BlockSchurPreconditioner(mfem::Array< int > &offsets, std::vector< std::unique_ptr< mfem::Solver >> solvers, BlockSchurType type=BlockSchurType::Diagonal, SchurApproxType approxType=SchurApproxType::DiagInv, std::vector< BlockOverride > overrides={})
Construct a new 2x2 block Schur complement preconditioner.
virtual void SetOperator(const mfem::Operator &jacobian)
Set the preconditioner to use the supplied linearized block Jacobian.
Simple block triangular preconditioner for block systems.
BlockTriangularPreconditioner(mfem::Array< int > &offsets, std::vector< std::unique_ptr< mfem::Solver >> solvers, BlockTriangularType type=BlockTriangularType::Lower, std::vector< BlockOverride > overrides={})
Construct a new nxn block triangular preconditioner.
virtual void Mult(const mfem::Vector &in, mfem::Vector &out) const
The action of the precondition on the block vector (b_1, ..., b_n)
virtual void SetOperator(const mfem::Operator &jacobian)
Set the preconditioner to use the supplied linearized block Jacobian.
Accelerator functionality.
SchurApproxType
Selects how the (1,1) Schur operator is approximated.
BlockTriangularType
Selects the block triangular sweep used by BlockTriangularPreconditioner.
BlockSchurType
Selects the block Schur preconditioner variant.
std::pair< int, std::unique_ptr< const mfem::Operator > > BlockOverride
Optional override for a diagonal block operator.