61 [[nodiscard]]
virtual idx rows() const noexcept = 0;
62 [[nodiscard]] virtual
idx cols() const noexcept = 0;
73 [[nodiscard]]
idx rows() const noexcept
override {
return A_.rows(); }
74 [[nodiscard]]
idx cols() const noexcept
override {
return A_.cols(); }
86 [[nodiscard]]
idx rows() const noexcept
override {
return A_.n_rows(); }
87 [[nodiscard]]
idx cols() const noexcept
override {
return A_.n_cols(); }
115 [[nodiscard]]
idx rows() const noexcept
override {
return n_; }
116 [[nodiscard]]
idx cols() const noexcept
override {
return n_; }
137 return std::make_unique<CallableOp<F>>(std::move(f), n);
161 std::vector<real>& h,
204 std::vector<Vector>& basis,
205 std::vector<real>& h,
constexpr idx size() const noexcept
Dense row-major matrix with optional GPU storage.
Sparse matrix in Compressed Sparse Row (CSR) format.
Backend enum for linear algebra operations.
CallableOp< F > make_op(F f, idx n)
Factory: wrap a callable as a stack-allocated CallableOp<F>.
real arnoldi_step(const LinearOp &A, std::vector< Vector > &basis, std::vector< real > &h, idx k, Vector &scratch, real breakdown_tol=real(1e-14))
One Arnoldi step: expand the orthonormal basis by one vector.
std::unique_ptr< LinearOp > make_op_ptr(F f, idx n)
Factory: wrap a callable as a heap-allocated LinearOp.
real mgs_orthogonalize(const std::vector< Vector > &basis, Vector &v, std::vector< real > &h, idx k)
Modified Gram-Schmidt: orthogonalize v against basis[0..k-1].
Backend
Selects which backend handles a linalg operation.
constexpr Backend default_backend
Compressed Sparse Row (CSR) matrix and operations.
Wrap any callable void(const Vector&, Vector&) as a LinearOp.
void apply(const Vector &x, Vector &y) const override
y = A*x (y must be pre-allocated to the correct size)
idx rows() const noexcept override
idx cols() const noexcept override
Wrap a dense Matrix as a LinearOp.
DenseOp(const Matrix &A, Backend b=default_backend)
idx rows() const noexcept override
idx cols() const noexcept override
Abstract matrix-free linear operator: y = A*x.
virtual void apply(const Vector &x, Vector &y) const =0
y = A*x (y must be pre-allocated to the correct size)
virtual ~LinearOp()=default
virtual idx cols() const noexcept=0
virtual idx rows() const noexcept=0
Wrap a SparseMatrix as a LinearOp.
idx rows() const noexcept override
SparseOp(const SparseMatrix &A)
idx cols() const noexcept override