00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef EIGEN_COMPLEX_SCHUR_MKL_H
00034 #define EIGEN_COMPLEX_SCHUR_MKL_H
00035
00036 #include "Eigen/src/Core/util/MKL_support.h"
00037
00038 namespace Eigen {
00039
00042 #define EIGEN_MKL_SCHUR_COMPLEX(EIGTYPE, MKLTYPE, MKLPREFIX, MKLPREFIX_U, EIGCOLROW, MKLCOLROW) \
00043 template<> inline \
00044 ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
00045 ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, bool computeU) \
00046 { \
00047 typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType; \
00048 typedef MatrixType::Scalar Scalar; \
00049 typedef MatrixType::RealScalar RealScalar; \
00050 typedef std::complex<RealScalar> ComplexScalar; \
00051 \
00052 assert(matrix.cols() == matrix.rows()); \
00053 \
00054 m_matUisUptodate = false; \
00055 if(matrix.cols() == 1) \
00056 { \
00057 m_matT = matrix.cast<ComplexScalar>(); \
00058 if(computeU) m_matU = ComplexMatrixType::Identity(1,1); \
00059 m_info = Success; \
00060 m_isInitialized = true; \
00061 m_matUisUptodate = computeU; \
00062 return *this; \
00063 } \
00064 lapack_int n = matrix.cols(), sdim, info; \
00065 lapack_int lda = matrix.outerStride(); \
00066 lapack_int matrix_order = MKLCOLROW; \
00067 char jobvs, sort='N'; \
00068 LAPACK_##MKLPREFIX_U##_SELECT1 select = 0; \
00069 jobvs = (computeU) ? 'V' : 'N'; \
00070 m_matU.resize(n, n); \
00071 lapack_int ldvs = m_matU.outerStride(); \
00072 m_matT = matrix; \
00073 Matrix<EIGTYPE, Dynamic, Dynamic> w; \
00074 w.resize(n, 1);\
00075 info = LAPACKE_##MKLPREFIX##gees( matrix_order, jobvs, sort, select, n, (MKLTYPE*)m_matT.data(), lda, &sdim, (MKLTYPE*)w.data(), (MKLTYPE*)m_matU.data(), ldvs ); \
00076 if(info == 0) \
00077 m_info = Success; \
00078 else \
00079 m_info = NoConvergence; \
00080 \
00081 m_isInitialized = true; \
00082 m_matUisUptodate = computeU; \
00083 return *this; \
00084 \
00085 }
00086
00087 EIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, ColMajor, LAPACK_COL_MAJOR)
00088 EIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8, c, C, ColMajor, LAPACK_COL_MAJOR)
00089 EIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, RowMajor, LAPACK_ROW_MAJOR)
00090 EIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8, c, C, RowMajor, LAPACK_ROW_MAJOR)
00091
00092 }
00093
00094 #endif // EIGEN_COMPLEX_SCHUR_MKL_H