22#ifndef BELFEM_FN_GEEV_HPP
23#define BELFEM_FN_GEEV_HPP
135 template<
typename T >
153 "geev not implemented for selected data type" );
165 std::complex< float > * w,
176 const_cast< char *
>( jobvl ),
177 const_cast< char *
>( jobvr ),
178 const_cast< int_t *
>( n ),
180 const_cast< int_t *
>( lda ),
184 const_cast< int_t *
>( ldvl ),
186 const_cast< int_t *
>( ldvr ),
188 const_cast< int_t *
>( lwork ),
196 for (
int_t k = 0; k < *n; ++k )
198 w[ k ] = std::complex< float >( rwork[ k ], rwork[ k + *n ] );
212 std::complex< double > * w,
223 const_cast< char *
>( jobvl ),
224 const_cast< char *
>( jobvr ),
225 const_cast< int_t *
>( n ),
227 const_cast< int_t *
>( lda ),
231 const_cast< int_t *
>( ldvl ),
233 const_cast< int_t *
>( ldvr ),
235 const_cast< int_t *
>( lwork ),
241 for (
int_t k = 0; k < *n; ++k )
243 w[ k ] = std::complex< double >( rwork[ k ], rwork[ k + *n ] );
255 std::complex< float > * a,
257 std::complex< float > * w,
258 std::complex< float > * vl,
260 std::complex< float > * vr,
262 std::complex< float > * work,
268 const_cast< char *
>( jobvl ),
269 const_cast< char *
>( jobvr ),
270 const_cast< int_t *
>( n ),
272 const_cast< int_t *
>( lda ),
275 const_cast< int_t *
>( ldvl ),
277 const_cast< int_t *
>( ldvr ),
279 const_cast< int_t *
>( lwork ),
292 std::complex< double > * a,
294 std::complex< double > * w,
295 std::complex< double > * vl,
297 std::complex< double > * vr,
299 std::complex< double > * work,
305 const_cast< char *
>( jobvl ),
306 const_cast< char *
>( jobvr ),
307 const_cast< int_t *
>( n ),
309 const_cast< int_t *
>( lda ),
312 const_cast< int_t *
>( ldvl ),
314 const_cast< int_t *
>( ldvr ),
316 const_cast< int_t *
>( lwork ),
352 template<
typename T >
360 const char jobvl =
'V',
361 const char jobvr =
'V',
362 const bool AbortOnError =
true )
365 "Matrix A must be square ( is %lu x %lu )",
366 (
long unsigned int ) A.
n_rows(),
367 (
long unsigned int ) A.
n_cols() );
369 "unsupported jobvl flag '%c'", jobvl );
371 "unsupported jobvr flag '%c'", jobvr );
374 constexpr int_t tRealsPerT =
375 std::is_same< T, lapack::real_t< T > >
::value ? 1 : 2 ;
399 int_t lwork = std::max< int_t >( 1, tRealsPerT == 1 ?
400 ( ( jobvl ==
'V' || jobvr ==
'V' ) ? 4 * n : 3 * n ) : 2 * n );
405 if (
static_cast< int_t >( Work.length() ) < tRealsPerT * lwork + 2 * n )
408 Work.set_size( tRealsPerT + 2 * n );
414 reinterpret_cast< T *
>( Work.data() ), &query,
415 Work.data() + tRealsPerT, &info );
418 "LAPACK geev workspace query has thrown an error: %i", (
int ) info );
420 if ( info != 0 )
return info ;
425 Work.set_size( tRealsPerT * lwork + 2 * n );
430 lwork = ( (
int_t ) Work.length() - 2 * n ) / tRealsPerT ;
436 reinterpret_cast< T *
>( Work.data() ), &lwork,
437 Work.data() + tRealsPerT * lwork, &info );
442 "LAPACK geev has thrown an error: %i", (
int ) info );
460 template<
typename T >
466 const bool AbortOnError =
true )
469 "Matrix A must be square ( is %lu x %lu )",
470 (
long unsigned int ) A.
n_rows(),
471 (
long unsigned int ) A.
n_cols() );
473 constexpr int_t tRealsPerT =
474 std::is_same< T, lapack::real_t< T > >
::value ? 1 : 2 ;
486 int_t lwork = std::max< int_t >( 1, tRealsPerT == 1 ? 3 * n : 2 * n );
490 if (
static_cast< int_t >( Work.length() ) < tRealsPerT * lwork + 2 * n )
492 Work.set_size( tRealsPerT + 2 * n );
497 static_cast< T *
>(
nullptr ), &ldv,
498 static_cast< T *
>(
nullptr ), &ldv,
499 reinterpret_cast< T *
>( Work.data() ), &query,
500 Work.data() + tRealsPerT, &info );
503 "LAPACK geev workspace query has thrown an error: %i", (
int ) info );
505 if ( info != 0 )
return info ;
509 Work.set_size( tRealsPerT * lwork + 2 * n );
513 lwork = ( (
int_t ) Work.length() - 2 * n ) / tRealsPerT ;
517 static_cast< T *
>(
nullptr ), &ldv,
518 static_cast< T *
>(
nullptr ), &ldv,
519 reinterpret_cast< T *
>( Work.data() ), &lwork,
520 Work.data() + tRealsPerT * lwork, &info );
523 "LAPACK geev has thrown an error: %i", (
int ) info );
#define BELFEM_ERROR(aCheck,...)
Definition assert.hpp:264
#define BELFEM_ASSERT(aCheck,...)
Definition assert.hpp:244
Dense column-major matrix.
Definition cl_BZ_Matrix.hpp:28
void set_size(const size_t aNumRows, const size_t aNumCols)
Definition cl_AR_Matrix.hpp:186
size_t n_rows() const
Definition cl_AR_Matrix.hpp:205
size_t n_cols() const
Definition cl_AR_Matrix.hpp:213
T * data()
Definition cl_AR_Matrix.hpp:135
Column vector.
Definition cl_BZ_Vector.hpp:41
Definition fn_gees.hpp:33
void geev(const char *jobvl, const char *jobvr, const int_t *n, T *a, const int_t *lda, cplx_t< T > *w, T *vl, const int_t *ldvl, T *vr, const int_t *ldvr, T *work, const int_t *lwork, real_t< T > *rwork, int_t *info)
Definition fn_geev.hpp:136
void cgeev_(char *jobvl, char *jobvr, int_t *n, cplx_float_t *a, int_t *lda, cplx_float_t *w, cplx_float_t *vl, int_t *ldvl, cplx_float_t *vr, int_t *ldvr, cplx_float_t *work, int_t *lwork, float *rwork, int_t *info, fortran_charlen_t lvl, fortran_charlen_t lvr)
void zgeev_(char *jobvl, char *jobvr, int_t *n, cplx_double_t *a, int_t *lda, cplx_double_t *w, cplx_double_t *vl, int_t *ldvl, cplx_double_t *vr, int_t *ldvr, cplx_double_t *work, int_t *lwork, double *rwork, int_t *info, fortran_charlen_t lvl, fortran_charlen_t lvr)
constexpr bool dependent_false
Definition lapacktools.hpp:49
float cplx_float_t
Definition lapacktools.hpp:90
int_t leading_dimension(const Vector< T > &A)
logical length of a vector operand, as passed to LAPACK as LDB; vector storage is contiguous under bo...
Definition lapacktools.hpp:143
int_t work_size(const float &aValue)
lapack reports the optimal work size in the first entry of the work array, which stays real valued fo...
Definition lapacktools.hpp:191
size_t fortran_charlen_t
Definition lapacktools.hpp:100
void sgeev_(char *jobvl, char *jobvr, int_t *n, float *a, int_t *lda, float *wr, float *wi, float *vl, int_t *ldvl, float *vr, int_t *ldvr, float *work, int_t *lwork, int_t *info, fortran_charlen_t lvl, fortran_charlen_t lvr)
void dgeev_(char *jobvl, char *jobvr, int_t *n, double *a, int_t *lda, double *wr, double *wi, double *vl, int_t *ldvl, double *vr, int_t *ldvr, double *work, int_t *lwork, int_t *info, fortran_charlen_t lvl, fortran_charlen_t lvr)
double cplx_double_t
Definition lapacktools.hpp:91
typename real_type< T >::type real_t
Definition lapacktools.hpp:63
typename cplx_type< T >::type cplx_t
Definition lapacktools.hpp:75
USER GUIDES:
Definition cl_Capacitor.cpp:16
std::pair< real, unit > value
Definition typedefs.hpp:74
int_t geev(Matrix< T > &A, Vector< lapack::cplx_t< T > > &W, Matrix< T > &VL, Matrix< T > &VR, Vector< lapack::real_t< T > > &Work, const char jobvl='V', const char jobvr='V', const bool AbortOnError=true)
eigenvalues and eigenvectors of a general square matrix, A * v = lambda * v, via LAPACK ?...
Definition fn_geev.hpp:354
int32_t int_t
Definition typedefs.hpp:51