15template<
class Op,
class M>
16 requires SPDLinearOperator<Op, Vector, Vector> && Preconditioner<M>
25 if (A.rows() != n || A.cols() != n || M_op.rows() != n || M_op.cols() != n
27 throw std::invalid_argument(
"pcg: dimension mismatch");
30 Vector r(n), z(n), p(n), Ap(n);
32 for (
idx i = 0; i < n; ++i) {
38 real rzold =
dot(r, z, backend);
41 for (
idx iter = 0; iter < max_iter; ++iter) {
45 const real pAp =
dot(p, Ap, backend);
46 if (std::abs(pAp) <
real(1
e-15)) {
50 const real alpha = rzold / pAp;
51 axpy(alpha, p, x, backend);
52 axpy(-alpha, Ap, r, backend);
54 result.residual =
norm(r, backend);
55 if (result.residual < tol) {
56 result.converged =
true;
61 const real rznew =
dot(r, z, backend);
constexpr idx size() const noexcept
Storage and operator concepts for numerical routines.
Backend enum and default backend selection.
real beta(real a, real b)
B(a, b) – beta function.
void scale(Vector &v, real alpha, Backend b=default_backend)
Compute .
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
Compute .
real norm(const Vector &x, Backend b=default_backend)
Compute .
SolverResult pcg(const Op &A, const M &M_op, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
Compute .
constexpr Backend default_backend
Preconditioner concept and diagonal preconditioners.
Common result type shared by all iterative solvers.
idx iterations
Number of iterations performed.
Dense vector storage and operations.