lambda-lanczos 2.1.1
Loading...
Searching...
No Matches
lambda_lanczos_tridiagonal_lapack.hpp
Go to the documentation of this file.
1#ifndef LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_
2#define LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_
3
4/*
5 * This file is used just for debug and benchmark.
6 */
7
8#include <complex>
9#include <vector>
10
11#if defined(LAMBDA_LANCZOS_USE_LAPACK)
12#include <lapacke.h>
13#elif defined(LAMBDA_LANCZOS_USE_MKL)
14#include <mkl.h>
15#endif
16
18
19namespace lambda_lanczos {
21
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);
24}
25
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);
28}
29
33template <typename T>
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();
36 auto a = alpha; // copy required because the contents will be destroyed
37 auto b = beta; // copy required because the contents will be destroyed
38 auto z = std::vector<T>(1);
39
40 stev(LAPACK_COL_MAJOR, 'N', n, a.data(), b.data(), z.data(), 1);
41
42 return a[index];
43}
44
48template <typename T>
49inline void tridiagonal_eigenpairs(const std::vector<T>& alpha,
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();
55 auto a = alpha;
56 auto b = beta;
57 auto z = std::vector<T>(n * n);
58 char jobz = compute_eigenvector ? 'V' : 'N';
59
60 stev(LAPACK_COL_MAJOR, jobz, n, a.data(), b.data(), z.data(), n);
61
62 eigenvalues = std::move(a);
63 eigenvectors.resize(n);
64 for (size_t k = 0; k < n; ++k) { // k-th eigenvector
65 eigenvectors[k] = std::vector<T>(n);
66 for (size_t i = 0; i < n; ++i) {
67 eigenvectors[k][i] = z[k * n + i];
68 }
69 }
70}
71
82template <typename T>
83inline void tridiagonal_eigenvalues(const std::vector<T>& alpha,
84 const std::vector<T>& beta,
85 std::vector<T>& eigenvalues) {
86 std::vector<std::vector<T>> dummy_eigenvectors;
87 return tridiagonal_eigenpairs(alpha, beta, eigenvalues, dummy_eigenvectors, false);
88}
89
90} /* namespace tridiagonal_lapack */
91} /* namespace lambda_lanczos */
92
93#endif /* LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_ */
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