13 constexpr real zero_diag_tol = 1
e-15;
16 throw std::invalid_argument(
"Dimension mismatch in Jacobi solver");
22 for (
idx iter = 0; iter < max_iter; ++iter) {
24#ifdef NUMERICS_HAS_OMP
25 #pragma omp parallel for schedule(static) if (backend == Backend::omp)
27 for (
idx i = 0; i < n; ++i) {
28 if (std::abs(A(i, i)) < zero_diag_tol)
29 throw std::runtime_error(
"Zero diagonal in Jacobi solver at row "
32 for (
idx j = 0; j < n; ++j)
34 sigma += A(i, j) * x[j];
35 x_new[i] = (b[i] - sigma) / A(i, i);
38 for (
idx i = 0; i < n; ++i)
43#ifdef NUMERICS_HAS_OMP
44 #pragma omp parallel for reduction(+ : res) \
45 schedule(static) if (backend == Backend::omp)
47 for (
idx i = 0; i < n; ++i) {
49 for (
idx j = 0; j < n; ++j)
53 result.residual = std::sqrt(res);
54 result.iterations = iter + 1;
56 if (result.residual < tol) {
57 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.