numerics 0.1.0
Loading...
Searching...
No Matches
lanczos.hpp
Go to the documentation of this file.
1/// @file eigen/lanczos.hpp
2/// @brief Lanczos algorithm -- k extreme eigenvalues of a large sparse matrix
3///
4/// The Lanczos algorithm builds a k-dimensional Krylov subspace
5///
6/// K_k(A, v) = span{v, Av, A^2v, ..., A^{k-1}v}
7///
8/// and finds the k Ritz pairs (approximate eigenpairs) that are the extreme
9/// eigenvalues of the projected kxk tridiagonal matrix T_k.
10///
11/// Key properties:
12/// - Matrix-free: A is given as a MatVecFn callable (works with sparse,
13/// structured A)
14/// - O(k*nnz) work for k steps (nnz = cost of one matvec)
15/// - Finds the k LARGEST and k SMALLEST eigenvalues accurately
16///
17/// Usage:
18/// @code
19/// lanczos(mv, n, k); // sequential
20/// lanczos(mv, n, k, 1e-10, 0, num::omp); // OMP reorthogonalisation
21/// @endcode
22#pragma once
23
24#include "core/matrix.hpp"
25#include "core/policy.hpp"
26#include "core/vector.hpp"
28#include "linalg/solvers/cg.hpp" // MatVecFn
29
30namespace num {
31
32/// @brief Result of a Lanczos eigensolver
34 Vector ritz_values; ///< k Ritz values (approximate eigenvalues), ascending
35 Matrix ritz_vectors; ///< nxk matrix -- each column is a Ritz vector
36 idx steps = 0; ///< Actual Lanczos steps taken
37 bool converged =
38 false; ///< Whether all requested Ritz pairs met the tolerance
39};
40
41/// @brief Lanczos eigensolver for large sparse symmetric matrices.
42///
43/// @param matvec Callable computing w = A*v (matrix-free)
44/// @param n Dimension of the problem
45/// @param k Number of eigenvalues requested (k << n)
46/// @param tol Convergence on ||A*u - lambda*u|| for each Ritz pair
47/// @param max_steps Maximum Lanczos steps (default: min(3k, n))
48/// @param backend Backend for reorthogonalisation inner products (default:
49/// seq)
51 idx max_steps = 0, Backend backend = Backend::seq);
52
53} // namespace num
Conjugate gradient solvers (dense and matrix-free)
Dense row-major matrix with optional GPU storage.
Definition matrix.hpp:12
Backend enum for linear algebra operations.
Full symmetric eigendecomposition via cyclic Jacobi sweeps.
Matrix operations.
double real
Definition types.hpp:10
Backend
Selects which backend handles a linalg operation.
Definition policy.hpp:19
@ seq
Naive textbook loops – always available.
std::function< void(const Vector &, Vector &)> MatVecFn
Callable type for matrix-free matvec: computes y = A*x.
Definition cg.hpp:13
std::size_t idx
Definition types.hpp:11
void matvec(const Matrix &A, const Vector &x, Vector &y, Backend b=default_backend)
y = A * x
Definition matrix.cpp:120
constexpr real e
Definition math.hpp:43
LanczosResult lanczos(MatVecFn matvec, idx n, idx k, real tol=1e-10, idx max_steps=0, Backend backend=Backend::seq)
Lanczos eigensolver for large sparse symmetric matrices.
Definition lanczos.cpp:32
Result of a Lanczos eigensolver.
Definition lanczos.hpp:33
bool converged
Whether all requested Ritz pairs met the tolerance.
Definition lanczos.hpp:37
idx steps
Actual Lanczos steps taken.
Definition lanczos.hpp:36
Matrix ritz_vectors
nxk matrix – each column is a Ritz vector
Definition lanczos.hpp:35
Vector ritz_values
k Ritz values (approximate eigenvalues), ascending
Definition lanczos.hpp:34
Vector operations.