16 throw std::invalid_argument(
"Dimension mismatch in CG solver");
20 const_cast<Matrix&
>(A).to_gpu();
21 const_cast<Vector&
>(b).to_gpu();
34 scale(r, -1.0, backend);
35 axpy(1.0, b, r, backend);
38 for (
idx i = 0; i < n; ++i)
40 for (
idx i = 0; i < n; ++i)
44 real rsold =
dot(r, r, backend);
47 for (
idx iter = 0; iter < max_iter; ++iter) {
52 if (std::abs(pAp) < 1
e-15)
54 real alpha = rsold / pAp;
56 axpy(alpha, p, x, backend);
57 axpy(-alpha, Ap, r, backend);
59 real rsnew =
dot(r, r, backend);
60 result.residual = std::sqrt(rsnew);
62 if (result.residual < tol) {
63 result.converged =
true;
69 axpy(1.0, r, p, backend);
Conjugate gradient solvers.
constexpr idx rows() const noexcept
constexpr idx cols() const noexcept
constexpr idx size() const noexcept
void to_device(real *dst, const real *src, idx n)
Copy host to device.
real beta(real a, real b)
B(a, b) – beta function.
void matvec(const Matrix &A, const Vector &x, Vector &y, Backend b=default_backend)
y = A * x
void scale(Vector &v, real alpha, Backend b=default_backend)
Compute .
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
Compute .
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
Compute .
SolverResult cg(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
idx iterations
Number of iterations performed.