10 #ifndef EIGEN_PASTIXSUPPORT_H    11 #define EIGEN_PASTIXSUPPORT_H    23 template<
typename _MatrixType, 
bool IsStrSym = false> 
class PastixLU;
    24 template<
typename _MatrixType, 
int Options> 
class PastixLLT;
    25 template<
typename _MatrixType, 
int Options> 
class PastixLDLT;
    32   template<
typename _MatrixType>
    36     typedef typename _MatrixType::Scalar 
Scalar;
    38     typedef typename _MatrixType::Index 
Index;
    41   template<
typename _MatrixType, 
int Options>
    45     typedef typename _MatrixType::Scalar 
Scalar;
    47     typedef typename _MatrixType::Index 
Index;
    50   template<
typename _MatrixType, 
int Options>
    54     typedef typename _MatrixType::Scalar 
Scalar;
    56     typedef typename _MatrixType::Index 
Index;
    59   void eigen_pastix(pastix_data_t **pastix_data, 
int pastix_comm, 
int n, 
int *ptr, 
int *idx, 
float *vals, 
int *perm, 
int * invp, 
float *x, 
int nbrhs, 
int *iparm, 
double *dparm)
    61     if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
    62     if (nbrhs == 0) {x = NULL; nbrhs=1;}
    63     s_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); 
    66   void eigen_pastix(pastix_data_t **pastix_data, 
int pastix_comm, 
int n, 
int *ptr, 
int *idx, 
double *vals, 
int *perm, 
int * invp, 
double *x, 
int nbrhs, 
int *iparm, 
double *dparm)
    68     if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
    69     if (nbrhs == 0) {x = NULL; nbrhs=1;}
    70     d_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); 
    73   void eigen_pastix(pastix_data_t **pastix_data, 
int pastix_comm, 
int n, 
int *ptr, 
int *idx, std::complex<float> *vals, 
int *perm, 
int * invp, std::complex<float> *x, 
int nbrhs, 
int *iparm, 
double *dparm)
    75     if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
    76     if (nbrhs == 0) {x = NULL; nbrhs=1;}
    77     c_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<COMPLEX*>(vals), perm, invp, reinterpret_cast<COMPLEX*>(x), nbrhs, iparm, dparm); 
    80   void eigen_pastix(pastix_data_t **pastix_data, 
int pastix_comm, 
int n, 
int *ptr, 
int *idx, std::complex<double> *vals, 
int *perm, 
int * invp, std::complex<double> *x, 
int nbrhs, 
int *iparm, 
double *dparm)
    82     if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
    83     if (nbrhs == 0) {x = NULL; nbrhs=1;}
    84     z_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<DCOMPLEX*>(vals), perm, invp, reinterpret_cast<DCOMPLEX*>(x), nbrhs, iparm, dparm); 
    88   template <
typename MatrixType>
    91     if ( !(mat.outerIndexPtr()[0]) ) 
    94       for(i = 0; i <= mat.rows(); ++i)
    95         ++mat.outerIndexPtr()[i];
    96       for(i = 0; i < mat.nonZeros(); ++i)
    97         ++mat.innerIndexPtr()[i];
   102   template <
typename MatrixType>
   106     if ( mat.outerIndexPtr()[0] == 1 ) 
   109       for(i = 0; i <= mat.rows(); ++i)
   110         --mat.outerIndexPtr()[i];
   111       for(i = 0; i < mat.nonZeros(); ++i)
   112         --mat.innerIndexPtr()[i];
   119 template <
class Derived>
   125     typedef typename MatrixType::Scalar 
Scalar;
   127     typedef typename MatrixType::Index 
Index;
   133     PastixBase() : m_initisOk(false), m_analysisIsOk(false), m_factorizationIsOk(false), m_isInitialized(false), m_pastixdata(0), m_size(0)
   147     template<
typename Rhs>
   151       eigen_assert(m_isInitialized && 
"Pastix solver is not initialized.");
   153                 && 
"PastixBase::solve(): invalid number of rows of the right hand side matrix b");
   157     template<
typename Rhs,
typename Dest>
   162       return *
static_cast<Derived*
>(
this);
   166       return *
static_cast<const Derived*
>(
this);
   185       return m_iparm(idxparam);
   203       return m_dparm(idxparam);
   206     inline Index 
cols()
 const { 
return m_size; }
   207     inline Index 
rows()
 const { 
return m_size; }
   219       eigen_assert(m_isInitialized && 
"Decomposition is not initialized.");
   227     template<
typename Rhs>
   231       eigen_assert(m_isInitialized && 
"Pastix LU, LLT or LDLT is not initialized.");
   233                 && 
"PastixBase::solve(): invalid number of rows of the right hand side matrix b");
   243     void analyzePattern(ColSpMatrix& mat);
   246     void factorize(ColSpMatrix& mat);
   251       eigen_assert(m_initisOk && 
"The Pastix structure should be allocated first"); 
   252       m_iparm(IPARM_START_TASK) = API_TASK_CLEAN;
   253       m_iparm(IPARM_END_TASK) = API_TASK_CLEAN;
   255                              m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
   258     void compute(ColSpMatrix& mat);
   278 template <
class Derived>
   282   m_iparm.setZero(IPARM_SIZE);
   283   m_dparm.setZero(DPARM_SIZE);
   285   m_iparm(IPARM_MODIFY_PARAMETER) = API_NO;
   286   pastix(&m_pastixdata, MPI_COMM_WORLD,
   288          0, 0, 0, 1, m_iparm.data(), m_dparm.data());
   290   m_iparm[IPARM_MATRIX_VERIFICATION] = API_NO;
   291   m_iparm[IPARM_VERBOSE]             = 2;
   292   m_iparm[IPARM_ORDERING]            = API_ORDER_SCOTCH;
   293   m_iparm[IPARM_INCOMPLETE]          = API_NO;
   294   m_iparm[IPARM_OOC_LIMIT]           = 2000;
   295   m_iparm[IPARM_RHS_MAKING]          = API_RHS_B;
   296   m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
   298   m_iparm(IPARM_START_TASK) = API_TASK_INIT;
   299   m_iparm(IPARM_END_TASK) = API_TASK_INIT;
   301                          0, 0, 0, 0, m_iparm.data(), m_dparm.data());
   304   if(m_iparm(IPARM_ERROR_NUMBER)) {
   314 template <
class Derived>
   322   m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
   323   m_isInitialized = m_factorizationIsOk;
   327 template <
class Derived>
   330   eigen_assert(m_initisOk && 
"The initialization of PaSTiX failed");
   337   m_perm.resize(m_size);
   338   m_invp.resize(m_size);
   340   m_iparm(IPARM_START_TASK) = API_TASK_ORDERING;
   341   m_iparm(IPARM_END_TASK) = API_TASK_ANALYSE;
   343                mat.
valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
   346   if(m_iparm(IPARM_ERROR_NUMBER))
   349     m_analysisIsOk = 
false;
   354     m_analysisIsOk = 
true;
   358 template <
class Derived>
   362   eigen_assert(m_analysisIsOk && 
"The analysis phase should be called before the factorization phase");
   363   m_iparm(IPARM_START_TASK) = API_TASK_NUMFACT;
   364   m_iparm(IPARM_END_TASK) = API_TASK_NUMFACT;
   368                mat.
valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
   371   if(m_iparm(IPARM_ERROR_NUMBER))
   374     m_factorizationIsOk = 
false;
   375     m_isInitialized = 
false;
   380     m_factorizationIsOk = 
true;
   381     m_isInitialized = 
true;
   386 template<
typename Base>
   387 template<
typename Rhs,
typename Dest>
   390   eigen_assert(m_isInitialized && 
"The matrix should be factorized first");
   392                      THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
   397   for (
int i = 0; i < b.cols(); i++){
   398     m_iparm[IPARM_START_TASK]          = API_TASK_SOLVE;
   399     m_iparm[IPARM_END_TASK]            = API_TASK_REFINE;
   402                            m_perm.data(), m_invp.data(), &x(0, i), rhs, m_iparm.data(), m_dparm.data());
   408   return m_iparm(IPARM_ERROR_NUMBER)==0;
   430 template<
typename _MatrixType, 
bool IsStrSym>
   437     typedef typename MatrixType::Index 
Index;
   457       m_structureIsUptodate = 
false;
   459       grabMatrix(matrix, temp);
   469       m_structureIsUptodate = 
false;
   471       grabMatrix(matrix, temp);
   472       Base::analyzePattern(temp);
   483       grabMatrix(matrix, temp);
   484       Base::factorize(temp);
   490       m_structureIsUptodate = 
false;
   491       m_iparm(IPARM_SYM) = API_SYM_NO;
   492       m_iparm(IPARM_FACTORIZATION) = API_FACT_LU;
   501         if(!m_structureIsUptodate)
   504           m_transposedStructure = matrix.
transpose();
   507           for (Index j=0; j<m_transposedStructure.outerSize(); ++j) 
   511           m_structureIsUptodate = 
true;
   514         out = m_transposedStructure + matrix;
   540 template<
typename _MatrixType, 
int _UpLo>
   549     enum { UpLo = _UpLo };
   567       grabMatrix(matrix, temp);
   578       grabMatrix(matrix, temp);
   579       Base::analyzePattern(temp);
   587       grabMatrix(matrix, temp);
   588       Base::factorize(temp);
   595       m_iparm(IPARM_SYM) = API_SYM_YES;
   596       m_iparm(IPARM_FACTORIZATION) = API_FACT_LLT;
   602       out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
   621 template<
typename _MatrixType, 
int _UpLo>
   630     enum { UpLo = _UpLo };
   648       grabMatrix(matrix, temp);
   659       grabMatrix(matrix, temp);
   660       Base::analyzePattern(temp);
   668       grabMatrix(matrix, temp);
   669       Base::factorize(temp);
   677       m_iparm(IPARM_SYM) = API_SYM_YES;
   678       m_iparm(IPARM_FACTORIZATION) = API_FACT_LDLT;
   684       out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
   691 template<
typename _MatrixType, 
typename Rhs>
   698   template<typename Dest> 
void evalTo(Dest& dst)
 const   700     dec()._solve(rhs(),dst);
   704 template<
typename _MatrixType, 
typename Rhs>
   711   template<typename Dest> 
void evalTo(Dest& dst)
 const   713     this->defaultEvalTo(dst);
 SparseMatrix< Scalar, ColMajor > ColSpMatrix
void grabMatrix(const MatrixType &matrix, ColSpMatrix &out)
Matrix< Index, Dynamic, 1 > m_perm
_MatrixType::RealScalar RealScalar
void analyzePattern(ColSpMatrix &mat)
PastixLU(const MatrixType &matrix)
void compute(const MatrixType &matrix)
A versatible sparse matrix representation. 
Base::ColSpMatrix ColSpMatrix
PastixLDLT(const MatrixType &matrix)
Matrix< int, IPARM_SIZE, 1 > m_iparm
PastixBase< _MatrixType > Dec
void factorize(const MatrixType &matrix)
PastixLLT(const MatrixType &matrix)
void factorize(const MatrixType &matrix)
MatrixType::RealScalar RealScalar
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
void compute(const MatrixType &matrix)
pastix_data_t * m_pastixdata
ROSCPP_DECL std::string clean(const std::string &name)
const unsigned int RowMajorBit
void compute(const MatrixType &matrix)
const Index * outerIndexPtr() const 
Array< RealScalar, IPARM_SIZE, 1 > & dparm()
const Derived & derived() const 
double & dparm(int idxparam)
void fortran_to_c_numbering(MatrixType &mat)
bool _solve(const MatrixBase< Rhs > &b, MatrixBase< Dest > &x) const 
void compute(ColSpMatrix &mat)
_MatrixType::Scalar Scalar
void analyzePattern(const MatrixType &matrix)
Base class of any sparse matrices or sparse expressions. 
Matrix< Scalar, Dynamic, 1 > Vector
_MatrixType::RealScalar RealScalar
A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library...
PastixBase< _MatrixType > Dec
PastixBase< PastixLLT< MatrixType, _UpLo > > Base
bool m_structureIsUptodate
_MatrixType::RealScalar RealScalar
PastixBase< PastixLU< MatrixType > > Base
int & iparm(int idxparam)
const internal::solve_retval< PastixBase, Rhs > solve(const MatrixBase< Rhs > &b) const 
Transpose< Derived > transpose()
_MatrixType::Scalar Scalar
TFSIMD_FORCE_INLINE const tfScalar & x() const 
_MatrixType::Scalar Scalar
#define EIGEN_MAKE_SPARSE_SOLVE_HELPERS(DecompositionType, Rhs)
void c_to_fortran_numbering(MatrixType &mat)
void analyzePattern(const MatrixType &matrix)
void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, float *vals, int *perm, int *invp, float *x, int nbrhs, int *iparm, double *dparm)
void grabMatrix(const MatrixType &matrix, ColSpMatrix &out)
Base::ColSpMatrix ColSpMatrix
Array< Index, IPARM_SIZE, 1 > & iparm()
const Derived & derived() const 
Base::ColSpMatrix ColSpMatrix
void factorize(ColSpMatrix &mat)
void factorize(const MatrixType &matrix)
const internal::sparse_solve_retval< PastixBase, Rhs > solve(const SparseMatrixBase< Rhs > &b) const 
General-purpose arrays with easy API for coefficient-wise operations. 
const Index * innerIndexPtr() const 
Interface to the PaStix solver. 
Matrix< Index, Dynamic, 1 > m_invp
#define EIGEN_MAKE_SOLVE_HELPERS(DecompositionType, Rhs)
A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library...
ComputationInfo info() const 
Reports whether previous computation was successful. 
ColSpMatrix m_transposedStructure
void grabMatrix(const MatrixType &matrix, ColSpMatrix &out)
internal::pastix_traits< Derived >::MatrixType _MatrixType
const Scalar * valuePtr() const 
void analyzePattern(const MatrixType &matrix)
Matrix< double, DPARM_SIZE, 1 > m_dparm
Base class for all dense matrices, vectors, and expressions. 
PastixBase< PastixLDLT< MatrixType, _UpLo > > Base
MatrixType::Scalar Scalar