19 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 std::unique_ptr<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_;
113 std::vector<BlockOverride> overrides = {});
121 virtual void Mult(
const mfem::Vector& in, mfem::Vector& out)
const;
128 virtual void SetOperator(
const mfem::Operator& jacobian);
134 mfem::Array<int> block_offsets_;
137 const int num_blocks_;
140 const mfem::BlockOperator* block_jacobian_;
143 mutable std::vector<std::unique_ptr<mfem::Solver>> mfem_solvers_;
154 void LowerSweep(
const mfem::Vector& in, mfem::Vector& out)
const;
162 void UpperSweep(
const mfem::Vector& in, mfem::Vector& out)
const;
165 std::vector<std::unique_ptr<const mfem::Operator>> block_op_overrides_;
215 std::vector<BlockOverride> overrides = {});
223 virtual void Mult(
const mfem::Vector& in, mfem::Vector& out)
const;
232 virtual void SetOperator(
const mfem::Operator& jacobian);
238 mfem::Array<int> block_offsets_;
241 const mfem::BlockOperator* block_jacobian_;
244 std::unique_ptr<mfem::BlockOperator> solver_diag_;
247 mutable std::vector<std::unique_ptr<mfem::Solver>> mfem_solvers_;
250 const mfem::Operator* A_12_ =
nullptr;
251 const mfem::Operator* A_21_ =
nullptr;
258 mutable std::unique_ptr<const mfem::Operator> S_approx_owned_;
259 const mfem::Operator* S_approx_view_ =
nullptr;
271 void LowerBlock(
const mfem::Vector& in, mfem::Vector& out)
const;
279 void UpperBlock(
const mfem::Vector& in, mfem::Vector& out)
const;
282 std::vector<std::unique_ptr<const mfem::Operator>> block_op_overrides_;
284 mfem::HypreParMatrix* BuildSchurDiagApprox_(
const mfem::HypreParMatrix& A11,
const mfem::HypreParMatrix& A12,
285 const mfem::HypreParMatrix& A21,
const mfem::HypreParMatrix& A22)
const;
Simple block diagonal 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_n)
virtual void SetOperator(const mfem::Operator &jacobian)
Set the preconditioner to use the supplied linearized block Jacobian.
BlockDiagonalPreconditioner(std::vector< std::unique_ptr< mfem::Solver >> solvers, std::vector< BlockOverride > overrides={})
Construct a new N by N block diagonal preconditioner.
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)
virtual void SetOperator(const mfem::Operator &jacobian)
Set the preconditioner to use the supplied linearized block Jacobian.
BlockSchurPreconditioner(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.
Simple block triangular 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_n)
BlockTriangularPreconditioner(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 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.