1#ifndef LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_
2#define LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_
11#if defined(LAMBDA_LANCZOS_USE_LAPACK)
13#elif defined(LAMBDA_LANCZOS_USE_MKL)
22inline lapack_int
stev(
int matrix_layout,
char jobz, lapack_int n,
float* d,
float* e,
float* z, lapack_int ldz) {
23 return LAPACKE_sstev(matrix_layout, jobz, n, d, e, z, ldz);
26inline lapack_int
stev(
int matrix_layout,
char jobz, lapack_int n,
double* d,
double* e,
double* z, lapack_int ldz) {
27 return LAPACKE_dstev(matrix_layout, jobz, n, d, e, z, ldz);
34inline T
find_mth_eigenvalue(
const std::vector<T>& alpha,
const std::vector<T>& beta,
const size_t index) {
35 const size_t n = alpha.size();
38 auto z = std::vector<T>(1);
40 stev(LAPACK_COL_MAJOR,
'N', n, a.data(), b.data(), z.data(), 1);
50 const std::vector<T>& beta,
51 std::vector<T>& eigenvalues,
52 std::vector<std::vector<T>>& eigenvectors,
53 bool compute_eigenvector =
true) {
54 const size_t n = alpha.size();
57 auto z = std::vector<T>(n * n);
58 char jobz = compute_eigenvector ?
'V' :
'N';
60 stev(LAPACK_COL_MAJOR, jobz, n, a.data(), b.data(), z.data(), n);
62 eigenvalues = std::move(a);
63 eigenvectors.resize(n);
64 for (
size_t k = 0; k < n; ++k) {
65 eigenvectors[k] = std::vector<T>(n);
66 for (
size_t i = 0; i < n; ++i) {
67 eigenvectors[k][i] = z[k * n + i];
84 const std::vector<T>& beta,
85 std::vector<T>& eigenvalues) {
86 std::vector<std::vector<T>> dummy_eigenvectors;
Definition lambda_lanczos_tridiagonal_lapack.hpp:20
T find_mth_eigenvalue(const std::vector< T > &alpha, const std::vector< T > &beta, const size_t index)
Finds the mth smaller eigenvalue of given tridiagonal matrix.
Definition lambda_lanczos_tridiagonal_lapack.hpp:34
lapack_int stev(int matrix_layout, char jobz, lapack_int n, float *d, float *e, float *z, lapack_int ldz)
Definition lambda_lanczos_tridiagonal_lapack.hpp:22
void tridiagonal_eigenpairs(const std::vector< T > &alpha, const std::vector< T > &beta, std::vector< T > &eigenvalues, std::vector< std::vector< T > > &eigenvectors, bool compute_eigenvector=true)
Computes all eigenpairs (eigenvalues and eigenvectors) for given tri-diagonal matrix.
Definition lambda_lanczos_tridiagonal_lapack.hpp:49
void tridiagonal_eigenvalues(const std::vector< T > &alpha, const std::vector< T > &beta, std::vector< T > &eigenvalues)
Computes all eigenvalues for given tri-diagonal matrix using the Implicitly Shifted QR algorithm.
Definition lambda_lanczos_tridiagonal_lapack.hpp:83
Definition eigenpair_manager.hpp:9