lambda-lanczos 2.0.0
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/*
6 * This file is used just for debug and benchmark.
7 */
8
9#include <vector>
10#include <complex>
11
12#if defined(LAMBDA_LANCZOS_USE_LAPACK)
13#include <lapacke.h>
14#elif defined(LAMBDA_LANCZOS_USE_MKL)
15#include <mkl.h>
16#endif
17
19
20
21namespace lambda_lanczos { namespace tridiagonal_lapack {
22
23
24inline lapack_int stev(int matrix_layout, char jobz, lapack_int n, float* d, float* e, float* z, lapack_int ldz) {
25 return LAPACKE_sstev(matrix_layout, jobz, n, d, e, z, ldz);
26}
27
28inline lapack_int stev(int matrix_layout, char jobz, lapack_int n, double* d, double* e, double* z, lapack_int ldz) {
29 return LAPACKE_dstev(matrix_layout, jobz, n, d, e, z, ldz);
30}
31
35template <typename T>
36inline T find_mth_eigenvalue(const std::vector<T>& alpha,
37 const std::vector<T>& beta,
38 const size_t index) {
39 const size_t n = alpha.size();
40 auto a = alpha; // copy required because the contents will be destroyed
41 auto b = beta; // copy required because the contents will be destroyed
42 auto z = std::vector<T>(1);
43
44
45 stev(LAPACK_COL_MAJOR, 'N', n, a.data(), b.data(), z.data(), 1);
46
47 return a[index];
48}
49
50
54template <typename T>
55inline void tridiagonal_eigenpairs(const std::vector<T>& alpha,
56 const std::vector<T>& beta,
57 std::vector<T>& eigenvalues,
58 std::vector<std::vector<T>>& eigenvectors,
59 bool compute_eigenvector = true) {
60 const size_t n = alpha.size();
61 auto a = alpha;
62 auto b = beta;
63 auto z = std::vector<T>(n*n);
64 char jobz = compute_eigenvector ? 'V' : 'N';
65
66 stev(LAPACK_COL_MAJOR, jobz, n, a.data(), b.data(), z.data(), n);
67
68
69 eigenvalues = std::move(a);
70 eigenvectors.resize(n);
71 for(size_t k = 0; k < n; ++k) { // k-th eigenvector
72 eigenvectors[k] = std::vector<T>(n);
73 for(size_t i = 0; i < n; ++i) {
74 eigenvectors[k][i] = z[k*n + i];
75 }
76 }
77}
78
79
90template <typename T>
91inline void tridiagonal_eigenvalues(const std::vector<T>& alpha,
92 const std::vector<T>& beta,
93 std::vector<T>& eigenvalues) {
94 std::vector<std::vector<T>> dummy_eigenvectors;
95 return tridiagonal_eigenpairs(alpha, beta, eigenvalues, dummy_eigenvectors, false);
96}
97
98
99}} // namespace lambda_lanczos::tridiagonal_lapack
100
101#endif /* LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_ */
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:36
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:24
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:55
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:91
Definition: eigenpair_manager.hpp:10