15 constexpr real zero_diag_tol = 1
e-15;
18 throw std::invalid_argument(
"Dimension mismatch in Gauss-Seidel solver");
22 for (
idx iter = 0; iter < max_iter; ++iter) {
24 for (
idx i = 0; i < n; ++i) {
25 if (std::abs(A(i, i)) < zero_diag_tol)
26 throw std::runtime_error(
"Zero diagonal in Gauss-Seidel at row " +
29 for (
idx j = 0; j < n; ++j)
31 sigma += A(i, j) * x[j];
32 x[i] = (b[i] - sigma) / A(i, i);
37#ifdef NUMERICS_HAS_OMP
38#pragma omp parallel for reduction(+ : res) \
39 schedule(static) if (backend == Backend::omp)
41 for (
idx i = 0; i < n; ++i) {
43 for (
idx j = 0; j < n; ++j)
47 result.residual = std::sqrt(res);
48 result.iterations = iter + 1;
50 if (result.residual < tol) {
51 result.converged =
true;
constexpr idx size() const noexcept
Dense row-major matrix with optional GPU storage.
constexpr idx rows() const noexcept
constexpr idx cols() const noexcept
Gauss-Seidel iterative solver.
Backend
Selects which backend handles a linalg operation.
SolverResult gauss_seidel(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Gauss-Seidel iterative solver for Ax = b.