52 "The solution vector of the BlockPreconditioner2x2 must be Block2VectorLike." );
55 "The RHS vector of the BlockPreconditioner2x2 must be Block2VectorLike." );
74 const Block11T& block11,
75 const Block22T& block22,
76 const Block11Preconditioner& block11_preconditioner,
77 const Block22Preconditioner& block22_preconditioner )
80 , block11_preconditioner_( block11_preconditioner )
81 , block22_preconditioner_( block22_preconditioner )
93 solve( block11_preconditioner_, block11_, x.block_1(), b.block_1() );
94 solve( block22_preconditioner_, block22_, x.block_2(), b.block_2() );
101 Block11Preconditioner block11_preconditioner_;
102 Block22Preconditioner block22_preconditioner_;
106static_assert( SolverLike< BlockDiagonalPreconditioner2x2<
110 detail::DummySolver< linalg::detail::DummyConcreteBlock2x2Operator::Block11Type >,
111 detail::DummySolver< linalg::detail::DummyConcreteBlock2x2Operator::Block22Type > > > );
143 SolverLike Block11Preconditioner,
144 SolverLike Block22Preconditioner >
158 "The solution vector of the BlockPreconditioner2x2 must be Block2VectorLike." );
161 "The RHS vector of the BlockPreconditioner2x2 must be Block2VectorLike." );
181 const Block11T& block11,
182 const Block22T& block22,
183 const Block12T& block12,
185 const Block11Preconditioner& block11_preconditioner,
186 const Block22Preconditioner& block22_preconditioner )
187 : block11_( block11 )
188 , block22_( block22 )
189 , block12_( block12 )
191 , block11_preconditioner_( block11_preconditioner )
192 , block22_preconditioner_( block22_preconditioner )
208 solve( block22_preconditioner_, block22_, x.block_2(), b.block_2() );
211 apply( block12_, x.block_2(), tmp_.block_1() );
214 lincomb( tmp_.block_1(), { 1, 1 }, { tmp_.block_1(), b.block_1() } );
217 lincomb( x.block_2(), { -1 }, { x.block_2() } );
220 solve( block11_preconditioner_, block11_, x.block_1(), tmp_.block_1() );
230 Block11Preconditioner block11_preconditioner_;
231 Block22Preconditioner block22_preconditioner_;
235static_assert( SolverLike< BlockTriangularPreconditioner2x2<
240 detail::DummySolver< linalg::detail::DummyConcreteBlock2x2Operator::Block11Type >,
241 detail::DummySolver< linalg::detail::DummyConcreteBlock2x2Operator::Block22Type > > > );
Dummy block 2x2 operator for concept checks. Contains four DummyConcreteOperator blocks.
Definition operator.hpp:203
DummyConcreteOperator Block22Type
Definition operator.hpp:211
DummyConcreteOperator Block12Type
Definition operator.hpp:209
DummyConcreteOperator Block11Type
Definition operator.hpp:208
Block-diagonal preconditioner for 2x2 block operators.
Definition block_preconditioner_2x2.hpp:40
OperatorT OperatorType
Operator type to be solved.
Definition block_preconditioner_2x2.hpp:43
void solve_impl(OperatorType &A, SolutionVectorType &x, const RHSVectorType &b)
Solve the block-diagonal preconditioner system.
Definition block_preconditioner_2x2.hpp:91
SrcOf< OperatorType > SolutionVectorType
Solution vector type (must be Block2VectorLike).
Definition block_preconditioner_2x2.hpp:45
BlockDiagonalPreconditioner2x2(const Block11T &block11, const Block22T &block22, const Block11Preconditioner &block11_preconditioner, const Block22Preconditioner &block22_preconditioner)
Static assertions to ensure block vector types.
Definition block_preconditioner_2x2.hpp:73
DstOf< OperatorType > RHSVectorType
Right-hand side vector type (must be Block2VectorLike).
Definition block_preconditioner_2x2.hpp:47
Static assertion: BlockDiagonalPreconditioner2x2 satisfies SolverLike concept.
Definition block_preconditioner_2x2.hpp:146
SrcOf< OperatorType > SolutionVectorType
Solution vector type (must be Block2VectorLike).
Definition block_preconditioner_2x2.hpp:151
void solve_impl(OperatorType &A, SolutionVectorType &x, const RHSVectorType &b)
Solve the block-triangular preconditioner system by block-backward substitution.
Definition block_preconditioner_2x2.hpp:205
DstOf< OperatorType > RHSVectorType
Right-hand side vector type (must be Block2VectorLike).
Definition block_preconditioner_2x2.hpp:153
BlockTriangularPreconditioner2x2(const Block11T &block11, const Block22T &block22, const Block12T &block12, SolutionVectorType &tmp, const Block11Preconditioner &block11_preconditioner, const Block22Preconditioner &block22_preconditioner)
Static assertions to ensure block vector types.
Definition block_preconditioner_2x2.hpp:180
OperatorT OperatorType
Operator type to be solved.
Definition block_preconditioner_2x2.hpp:149
Concept for types that behave like block 2-vectors. Extends VectorLike and requires block types and a...
Definition vector.hpp:47
Concept for types that behave like block 2x2 operators. Extends OperatorLike and requires block types...
Definition operator.hpp:117
Concept for types that behave like linear operators.
Definition operator.hpp:57
Concept for types that behave like linear solvers. Requires exposing OperatorType and a solve_impl me...
Definition solver.hpp:19
Definition block_preconditioner_2x2.hpp:7
void solve(Solver &solver, Operator &A, SolutionVector &x, const RHSVector &b)
Solve a linear system using the given solver and operator. Calls the solver's solve_impl method.
Definition solver.hpp:51
void lincomb(Vector &y, const std::vector< ScalarOf< Vector > > &c, const std::vector< Vector > &x, const ScalarOf< Vector > &c0)
Compute a linear combination of vectors. Implements: .
Definition vector.hpp:72
Operator::SrcVectorType SrcOf
Alias for the source vector type of an operator.
Definition operator.hpp:145
void apply(LinearForm &L, typename LinearForm::DstVectorType &dst)
Apply a linear form and write to a destination vector.
Definition linear_form.hpp:37
Operator::DstVectorType DstOf
Alias for the destination vector type of an operator.
Definition operator.hpp:149