19 { M_op.rows() } -> std::convertible_to<idx>;
20 { M_op.cols() } -> std::convertible_to<idx>;
27 : inv_diag_(std::move(inv_diag)) {}
29 [[nodiscard]]
idx rows() const noexcept {
return inv_diag_.
size(); }
30 [[nodiscard]]
idx cols() const noexcept {
return inv_diag_.
size(); }
35 throw std::invalid_argument(
"JacobiPreconditioner: dimension mismatch");
40 for (
idx i = 0; i < n; ++i) {
41 z[i] = inv_diag_[i] * r[i];
51 throw std::invalid_argument(
"jacobi_preconditioner: matrix must be square");
54 for (
idx i = 0; i < A.
rows(); ++i) {
55 if (std::abs(A(i, i)) <
real(1
e-15)) {
56 throw std::invalid_argument(
"jacobi_preconditioner: zero diagonal");
58 inv[i] =
real(1) / A(i, i);
65 throw std::invalid_argument(
"jacobi_preconditioner: matrix must be square");
71 for (
idx p = row_begin; p < row_end; ++p) {
77 if (std::abs(inv[i]) <
real(1
e-15)) {
78 throw std::invalid_argument(
"jacobi_preconditioner: zero diagonal");
80 inv[i] =
real(1) / inv[i];
constexpr idx rows() const noexcept
constexpr idx cols() const noexcept
constexpr idx size() const noexcept
void apply(const Vector &r, Vector &z) const
idx rows() const noexcept
JacobiPreconditioner(Vector inv_diag)
idx cols() const noexcept
Sparse matrix in Compressed Sparse Row (CSR) format.
const idx * row_ptr() const
const idx * col_idx() const
const real * values() const
Dense row-major matrix templated over scalar type T.
JacobiPreconditioner jacobi_preconditioner(const Matrix &A)
BasicVector< real > Vector
Real-valued dense vector with full backend dispatch (CPU + GPU)
Compressed Sparse Row (CSR) matrix and operations.
Dense vector storage and operations.