9 #include <containers/KernelMatrix.hpp> 19 template<
typename VIRTUALMATRIX,
typename T>
22 size_t n,
size_t r,
size_t nkrylov,
23 std::vector<T> &Sigma, std::vector<T> &V )
26 assert( r > 0 && r <= nkrylov );
43 for (
size_t i = 0; i < n; i ++ )
44 U( i, (
size_t)0 ) /= beta[ 0 ];
48 for (
size_t i = 0; i < n; i ++ ) w[ i ] = U[ i ];
52 for (
size_t i = 0; i < n; i ++ )
54 alpha[ 0 ] += w[ i ] * U( i, (
size_t)0 );
58 for (
size_t i = 0; i < n; i ++ )
60 w[ i ] = w[ i ] - alpha[ 0 ] * U( i, (
size_t)0 );
64 for (
size_t iter = 1; iter < nkrylov; iter ++ )
68 for (
size_t i = 0; i < n; i ++ )
70 beta[ iter ] += w[ i ] * w[ i ];
72 beta[ iter ] = std::sqrt( beta[ iter ] );
74 if ( beta[ iter ] == 0.0 )
76 printf(
"problemaic\n" );
82 for (
size_t i = 0; i < n; i ++ )
84 U( i, iter ) = w[ i ] / beta[ iter ];
91 for (
size_t i = 0; i < n; i ++ ) w[ i ] = U( i, iter );
95 for (
size_t i = 0; i < n; i ++ )
97 alpha[ iter ] += w[ i ] * U( i, iter );
101 for (
size_t i = 0; i < n; i ++ )
103 w[ i ] = w[ i ] - alpha[ iter ] * U( i ,iter );
104 w[ i ] = w[ i ] - beta[ iter ] * U( i ,iter - 1 );
121 Z.data(), nkrylov, work.data() );
131 xgemm(
"Transpose",
"Transpose",
133 1.0, Z.columndata( nkrylov - r ), nkrylov,
138 for (
size_t j = 0; j < r; j ++ )
140 Sigma[ j ] = alpha[ j ];
double xnrm2(int n, double *x, int incx)
DNRM2 wrapper.
Definition: blas_lapack.cpp:83
void xstev(const char *jobz, int n, double *D, double *E, double *Z, int ldz, double *work)
Definition: blas_lapack.cpp:1127
void xgemm(const char *transA, const char *transB, int m, int n, int k, double alpha, const double *A, int lda, const double *B, int ldb, double beta, double *C, int ldc)
DGEMM wrapper.
Definition: blas_lapack.cpp:130
void lanczos(VIRTUALMATRIX &A, size_t n, size_t r, size_t nkrylov, std::vector< T > &Sigma, std::vector< T > &V)
Definition: lanczos.hpp:20