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.
constexpr SMITH_HOST_DEVICE auto type(const tuple< T... > &values)
a function intended to be used for extracting the ith type from a tuple.
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.