numerics
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, structured A)
13/// - O(k*nnz) work for k steps (nnz = cost of one matvec)
14/// - Finds the k LARGEST and k SMALLEST eigenvalues accurately
15///
16/// Usage:
17/// @code
18/// lanczos(mv, n, k); // sequential
19/// lanczos(mv, n, k, 1e-10, 0, num::omp); // OMP reorthogonalisation
20/// @endcode
21#pragma once
22
23#include "core/vector.hpp"
24#include "core/matrix.hpp"
25#include "core/policy.hpp"
26#include "linalg/solvers/cg.hpp" // MatVecFn
28
29namespace num {
30
31/// @brief Result of a Lanczos eigensolver
33 Vector ritz_values; ///< k Ritz values (approximate eigenvalues), ascending
34 Matrix ritz_vectors; ///< nxk matrix -- each column is a Ritz vector
35 idx steps; ///< Actual Lanczos steps taken
36 bool converged; ///< Whether all requested Ritz pairs met the tolerance
37};
38
39/// @brief Lanczos eigensolver for large sparse symmetric matrices.
40///
41/// @param matvec Callable computing w = A*v (matrix-free)
42/// @param n Dimension of the problem
43/// @param k Number of eigenvalues requested (k << n)
44/// @param tol Convergence on ||A*u - lambda*u|| for each Ritz pair
45/// @param max_steps Maximum Lanczos steps (default: min(3k, n))
46/// @param backend Backend for reorthogonalisation inner products (default: seq)
48 real tol = 1e-10, idx max_steps = 0,
49 Backend backend = Backend::seq);
50
51} // namespace num
Conjugate gradient solvers (dense and matrix-free)
Dense row-major matrix with optional GPU storage.
Definition matrix.hpp:12
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.
constexpr T ipow(T x) noexcept
Compute x^N at compile time via repeated squaring.
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:94
constexpr real e
Definition math.hpp:41
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:30
std::function< void(const Vector &, Vector &)> MatVecFn
Callable type for matrix-free matvec: computes y = A*x.
Definition cg.hpp:13
Backend enum for linear algebra operations.
Result of a Lanczos eigensolver.
Definition lanczos.hpp:32
bool converged
Whether all requested Ritz pairs met the tolerance.
Definition lanczos.hpp:36
idx steps
Actual Lanczos steps taken.
Definition lanczos.hpp:35
Matrix ritz_vectors
nxk matrix – each column is a Ritz vector
Definition lanczos.hpp:34
Vector ritz_values
k Ritz values (approximate eigenvalues), ascending
Definition lanczos.hpp:33
Vector operations.