9 constexpr real zero_diag_tol = 1
e-15;
12 throw std::invalid_argument(
"Dimension mismatch in Jacobi solver");
17 for (
idx iter = 0; iter < max_iter; ++iter) {
19#ifdef NUMERICS_HAS_OMP
20#pragma omp parallel for schedule(static) if (backend == Backend::omp)
22 for (
idx i = 0; i < n; ++i) {
23 if (std::abs(A(i, i)) < zero_diag_tol)
24 throw std::runtime_error(
"Zero diagonal in Jacobi solver at row " +
27 for (
idx j = 0; j < n; ++j)
29 sigma += A(i, j) * x[j];
30 x_new[i] = (b[i] - sigma) / A(i, i);
33 for (
idx i = 0; i < n; ++i)
38#ifdef NUMERICS_HAS_OMP
39#pragma omp parallel for reduction(+ : res) \
40 schedule(static) if (backend == Backend::omp)
42 for (
idx i = 0; i < n; ++i) {
44 for (
idx j = 0; j < n; ++j)
48 result.residual = std::sqrt(res);
49 result.iterations = iter + 1;
51 if (result.residual < tol) {
52 result.converged =
true;
SolverResult jacobi(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Jacobi iterative solver for Ax = b.