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);
87 for (
idx i = 0; i < n; ++i)
89 for (
idx i = 0; i < n; ++i)
95 for (
idx iter = 0; iter < max_iter; ++iter) {
100 if (std::abs(pAp) < 1
e-15)
102 real alpha = rsold / pAp;
108 result.residual = std::sqrt(rsnew);
109 if (result.residual < tol) {
110 result.converged =
true;
Conjugate gradient solvers (dense and matrix-free)
constexpr idx size() const noexcept
Dense row-major matrix with optional GPU storage.
constexpr idx rows() const noexcept
constexpr idx cols() const noexcept
void to_device(real *dst, const real *src, idx n)
Copy host to device.
Backend
Selects which backend handles a linalg operation.
@ gpu
CUDA – custom kernels or cuBLAS.
@ seq
Naive textbook loops – always available.
real beta(real a, real b)
B(a, b) – beta function.
std::function< void(const Vector &, Vector &)> MatVecFn
Callable type for matrix-free matvec: computes y = A*x.
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)
v *= alpha
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
dot product
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
y += alpha * x
SolverResult cg_matfree(MatVecFn matvec, const Vector &b, Vector &x, real tol=1e-6, idx max_iter=1000)
Matrix-free conjugate gradient for Ax = b where A is SPD.
SolverResult cg(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Conjugate gradient solver for Ax = b.
idx iterations
Number of iterations performed.