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;
 
   89        eigenValues.resize(N);
 
   90        for (
int i=0; i<N; ++i)
 
   91          eigenValues[i] = std::complex<double>(eigenR[i], eigenI[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]);
 
constexpr size_type rows() const
number of rows
Definition: densematrix.hh:714
 
Construct a matrix with a dynamic size.
Definition: dynmatrix.hh:61
 
Construct a vector with a dynamic size.
Definition: dynvector.hh:59
 
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
 
This file implements a dense matrix with dynamic numbers of rows and columns.
 
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
 
Eigenvalue computations for the FieldMatrix class.
 
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
 
Dune namespace.
Definition: alignedallocator.hh:13