28template < OperatorLike OperatorT, SolverLike PreconditionerT = IdentitySolver< OperatorT > >
39 using ScalarType =
typename SolutionVectorType::ScalarType;
46 const std::shared_ptr< util::Table >& statistics,
47 const std::vector< SolutionVectorType >& tmps )
57 const std::shared_ptr< util::Table >& statistics,
58 const std::vector< SolutionVectorType >& tmps,
59 const PreconditionerT preconditioner )
60 : tag_(
"pcg_solver" )
62 , statistics_( statistics )
64 , preconditioner_( preconditioner )
66 if ( tmps.size() < 4 )
68 throw std::runtime_error(
"PCG: tmps.size() < 4. Need at least 4 tmp vectors." );
74 void set_tag(
const std::string& tag ) { tag_ = tag; }
90 lincomb( r_, { 1.0, -1.0 }, { b, r_ } );
92 solve( preconditioner_, A, z_, r_ );
97 const ScalarType initial_residual = std::sqrt(
dot( r_, r_ ) );
101 statistics_->add_row(
104 {
"relative_residual", 1.0 },
105 {
"absolute_residual", initial_residual } } );
113 for (
int iteration = 1; iteration <= params_.
max_iterations(); ++iteration )
120 if ( std::abs( alpha_den ) < std::numeric_limits< ScalarType >::min() )
127 const ScalarType alpha = alpha_num / alpha_den;
129 lincomb( x, { 1.0, alpha }, { x, p_ } );
130 lincomb( r_, { 1.0, -alpha }, { r_, ap_ } );
133 const ScalarType absolute_residual = std::sqrt(
dot( r_, r_ ) );
135 const ScalarType relative_residual = absolute_residual / initial_residual;
139 statistics_->add_row(
141 {
"iteration", iteration },
142 {
"relative_residual", relative_residual },
143 {
"absolute_residual", absolute_residual } } );
156 solve( preconditioner_, A, z_, r_ );
160 if ( std::abs( alpha_num ) < std::numeric_limits< ScalarType >::min() )
167 lincomb( p_, { 1.0, beta }, { z_, p_ } );
176 std::shared_ptr< util::Table > statistics_;
178 std::vector< SolutionVectorType > tmps_;
180 PreconditionerT preconditioner_;
186 PCG< linalg::detail::
Dummy vector class for concept checks and testing. Implements required vector operations as no-ops.
Definition vector.hpp:210
"Identity solver" for linear systems.
Definition identity_solver.hpp:21
Definition iterative_solver_info.hpp:7
double absolute_residual_tolerance() const
Definition iterative_solver_info.hpp:20
int max_iterations() const
Definition iterative_solver_info.hpp:18
double relative_residual_tolerance() const
Definition iterative_solver_info.hpp:19
Preconditioned Conjugate Gradient (PCG) iterative solver for symmetric positive definite linear syste...
Definition pcg.hpp:30
DstOf< OperatorType > RHSVectorType
Right-hand side vector type.
Definition pcg.hpp:37
SrcOf< OperatorType > SolutionVectorType
Solution vector type.
Definition pcg.hpp:35
void solve_impl(OperatorType &A, SolutionVectorType &x, const RHSVectorType &b)
Solve the linear system using PCG. Calls the iterative solver and updates statistics.
Definition pcg.hpp:81
void set_tag(const std::string &tag)
Set a tag string for statistics output.
Definition pcg.hpp:74
typename SolutionVectorType::ScalarType ScalarType
Scalar type for computations.
Definition pcg.hpp:39
PCG(const IterativeSolverParameters ¶ms, const std::shared_ptr< util::Table > &statistics, const std::vector< SolutionVectorType > &tmps, const PreconditionerT preconditioner)
Construct a PCG solver with a custom preconditioner.
Definition pcg.hpp:56
OperatorT OperatorType
Operator type to be solved.
Definition pcg.hpp:33
PCG(const IterativeSolverParameters ¶ms, const std::shared_ptr< util::Table > &statistics, const std::vector< SolutionVectorType > &tmps)
Construct a PCG solver with default identity preconditioner.
Definition pcg.hpp:45
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
ScalarOf< Vector > dot(const Vector &y, const Vector &x)
Compute the dot product of two vectors. Implements: .
Definition vector.hpp:118
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
void assign(Vector &y, const ScalarOf< Vector > &c0)
Assign a scalar value to a vector. Implements: .
Definition vector.hpp:97