inline MKL_INT eigen_factor(MKL_INT n, T a[], T vectors[], MKL_Complex16 values[], T d[], MKL_INT(*gees)(MKL_INT, char, char, int(*)(const T*, const T*), MKL_INT, T* a, MKL_INT, MKL_INT*, T*, T*, T*, MKL_INT), MKL_INT(*trevc)(MKL_INT, char, char, lapack_logical*, MKL_INT, const T*, MKL_INT, T*, MKL_INT, T*, MKL_INT, MKL_INT, MKL_INT*)) { T* clone_a = Clone(n, n, a); T* wr = new T[n]; T* wi = new T[n]; MKL_INT sdim; MKL_INT info = gees(LAPACK_COL_MAJOR, 'V', 'N', nullptr, n, clone_a, n, &sdim, wr, wi, vectors, n); if (info != 0) { delete[] clone_a; delete[] wr; delete[] wi; return info; } MKL_INT m; info = trevc(LAPACK_COL_MAJOR, 'R', 'B', nullptr, n, clone_a, n, nullptr, n, vectors, n, n, &m); if (info != 0) { delete[] clone_a; delete[] wr; delete[] wi; return info; } for (MKL_INT index = 0; index < n; ++index) { values[index] = MKL_Complex16(wr[index], wi[index]); } for (MKL_INT i = 0; i < n; ++i) { MKL_INT in = i * n; d[in + i] = wr[i]; if (wi[i] > 0) { d[in + n + i] = wi[i]; } else if (wi[i] < 0) { d[in - n + i] = wi[i]; } } delete[] clone_a; delete[] wr; delete[] wi; return info; }
inline int operator() (char jobvs, MatrA& a, EigVal& w, SchVec& vs, minimal_workspace ) const { typedef typename MatrA::value_type value_type ; typedef typename traits::type_traits< value_type >::real_type real_type ; int n = traits::matrix_size1( a ); traits::detail::array<value_type> work( 3*n ); return gees( jobvs, a, w, vs, work ); } // gees()
inline MKL_INT eigen_complex_factor(MKL_INT n, T a[], T vectors[], MKL_Complex16 values[], T d[], MKL_INT(*gees)(MKL_INT, char, char, int(*)(const T*), MKL_INT, T* a, MKL_INT, MKL_INT*, T*, T*, MKL_INT), MKL_INT(*trevc)(MKL_INT, char, char, const lapack_logical*, MKL_INT, T*, MKL_INT, T*, MKL_INT, T*, MKL_INT, MKL_INT, MKL_INT*)) { T* clone_a = Clone(n, n, a); T* w = new T[n]; MKL_INT sdim; MKL_INT info = gees(LAPACK_COL_MAJOR, 'V', 'N', nullptr, n, clone_a, n, &sdim, w, vectors, n); if (info != 0) { delete[] clone_a; delete[] w; return info; } MKL_INT m; info = trevc(LAPACK_COL_MAJOR, 'R', 'B', nullptr, n, clone_a, n, nullptr, n, vectors, n, n, &m); if (info != 0) { delete[] clone_a; delete[] w; return info; } for (MKL_INT i = 0; i < n; ++i) { values[i] = w[i]; d[i * n + i] = w[i]; } delete[] clone_a; delete[] w; return info; }
inline int operator() (char jobvs, MatrA& a, EigVal& w, SchVec& vs, detail::workspace1<Work> workspace ) const { return gees( jobvs, a, w, vs, workspace.w_ ); } // gees()
inline int operator() (char jobvs, MatrA& a, EigVal& w, SchVec& vs, workspace2<Work,RWork>& workspace ) const { return gees( jobvs, a, w, vs, workspace.w_, workspace.wr_ ); } // gees()