26 requires operators::LinearOperator<Op, Vector, Vector>
34 if (A.rows() != n || A.cols() != n || x.
size() != n) {
35 throw std::invalid_argument(
"Dimension mismatch in operator CG solver");
40 for (
idx i = 0; i < n; ++i) {
45 real rsold =
dot(r, r, backend);
48 for (
idx iter = 0; iter < max_iter; ++iter) {
52 const real pAp =
dot(p, Ap, backend);
53 if (std::abs(pAp) <
real(1
e-15)) {
56 const real alpha = rsold / pAp;
58 axpy(alpha, p, x, backend);
59 axpy(-alpha, Ap, r, backend);
61 const real rsnew =
dot(r, r, backend);
62 result.residual = std::sqrt(rsnew);
63 if (result.residual < tol) {
64 result.converged =
true;
constexpr idx size() const noexcept
Backend enum and default backend selection.
Dense row-major matrix templated over scalar type T.
real beta(real a, real b)
B(a, b) – beta function.
void scale(Vector &v, real alpha, Backend b=default_backend)
Compute .
BasicMatrix< real > Matrix
Double-precision dense matrix with full backend dispatch (CPU + GPU).
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
Compute .
BasicVector< real > Vector
Real-valued dense vector with full backend dispatch (CPU + GPU)
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
Compute .
constexpr Backend default_backend
SolverResult cg(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Concepts for operator-oriented numerical algorithms.
Common result type shared by all iterative solvers.
idx iterations
Number of iterations performed.
Dense vector storage and operations.