5 #ifndef DUNE_DYNMATRIXEIGENVALUES_HH 6 #define DUNE_DYNMATRIXEIGENVALUES_HH 11 #include <dune-common-config.hh> 26 namespace DynamicMatrixHelp {
29 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall;
40 template <
typename K,
class C>
49 const long int N = matrix.
rows();
50 const char jobvl =
'n';
51 const char jobvr = eigenVectors ?
'v' :
'n';
55 auto matrixVector = std::make_unique<double[]>(N*N);
59 for(
int i=0;
i<N; ++
i)
61 for(
int j=0; j<N; ++j, ++row)
63 matrixVector[ row ] = matrix[
i ][ j ];
68 auto eigenR = std::make_unique<double[]>(N);
69 auto eigenI = std::make_unique<double[]>(N);
71 const long int lwork = eigenVectors ? 4*N : 3*N;
72 auto work = std::make_unique<double[]>(lwork);
73 auto vr = eigenVectors ? std::make_unique<double[]>(N*N) : std::unique_ptr<
double[]>{};
79 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N,
80 eigenR.get(), eigenI.get(),
nullptr, &N, vr.get(), &N, work.get(),
85 std::cerr <<
"For matrix " << matrix <<
" eigenvalue calculation failed! " << std::endl;
90 for (
int i=0;
i<N; ++
i)
94 eigenVectors->resize(N);
95 for (
int i = 0;
i < N; ++
i) {
96 auto& v = (*eigenVectors)[
i];
98 std::copy(vr.get() + N*
i, vr.get() + N*(
i+1), &v[0]);
102 #else // #if HAVE_LAPACK I i
Definition: hybridmultiindex.hh:328
Dune namespace
Definition: alignedallocator.hh:12
static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
calculates the eigenvalues of a symmetric field matrix
Definition: fmatrixev.hh:524
This file implements a dense matrix with dynamic numbers of rows and columns.
Construct a vector with a dynamic size.
Definition: dynvector.hh:34
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
Construct a matrix with a dynamic size.
Definition: dynmatrix.hh:31
static void eigenValuesNonSym(const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K >> *eigenVectors=nullptr)
calculates the eigenvalues of a symmetric field matrix
Definition: dynmatrixev.hh:41
constexpr size_type rows() const
number of rows
Definition: densematrix.hh:714
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:375
Default exception for dummy implementations.
Definition: exceptions.hh:357
Eigenvalue computations for the FieldMatrix class.