32 #ifndef EIGEN_PARDISOSUPPORT_H 33 #define EIGEN_PARDISOSUPPORT_H 38 template<
typename _MatrixType,
int Options=Upper>
class PardisoLLT;
39 template<
typename _MatrixType,
int Options=Upper>
class PardisoLDLT;
43 template<
typename IndexType>
46 static IndexType
run( _MKL_DSS_HANDLE_t
pt, IndexType maxfct, IndexType mnum, IndexType
type, IndexType phase, IndexType
n,
void *
a,
47 IndexType *ia, IndexType *ja, IndexType *
perm, IndexType nrhs, IndexType *iparm, IndexType msglvl,
void *
b,
void *
x)
50 ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
58 static IndexType
run( _MKL_DSS_HANDLE_t
pt, IndexType maxfct, IndexType mnum, IndexType
type, IndexType phase, IndexType
n,
void *
a,
59 IndexType *ia, IndexType *ja, IndexType *
perm, IndexType nrhs, IndexType *iparm, IndexType msglvl,
void *
b,
void *
x)
62 ::pardiso_64(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
69 template<
typename _MatrixType>
78 template<
typename _MatrixType,
int Options>
87 template<
typename _MatrixType,
int Options>
98 template<
class Derived>
104 using Base::m_isInitialized;
108 using Base::_solve_impl;
126 : m_analysisIsOk(false), m_factorizationIsOk(false)
128 eigen_assert((
sizeof(StorageIndex) >=
sizeof(_INTEGER_t) &&
sizeof(StorageIndex) <= 8) &&
"Non-supported index type");
131 m_isInitialized =
false;
149 eigen_assert(m_isInitialized &&
"Decomposition is not initialized.");
167 Derived& analyzePattern(
const MatrixType&
matrix);
175 Derived& factorize(
const MatrixType& matrix);
177 Derived&
compute(
const MatrixType& matrix);
179 template<
typename Rhs,
typename Dest>
187 internal::pardiso_run_selector<StorageIndex>::run(m_pt, 1, 1, m_type, -1, internal::convert_index<StorageIndex>(m_size),0, 0, 0, m_perm.data(), 0,
188 m_iparm.data(), m_msglvl,
NULL,
NULL);
189 m_isInitialized =
false;
196 bool symmetric =
std::abs(m_type) < 10;
207 m_iparm[10] = symmetric ? 0 : 1;
209 m_iparm[12] = symmetric ? 0 : 1;
221 m_iparm[27] = (
sizeof(
RealScalar) == 4) ? 1 : 0;
226 memset(m_pt, 0,
sizeof(m_pt));
252 mutable void *m_pt[64];
259 template<
class Derived>
266 m_perm.setZero(m_size);
267 derived().getMatrix(a);
271 m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
272 m_perm.data(), 0, m_iparm.data(), m_msglvl,
NULL,
NULL);
273 manageErrorCode(error);
274 m_analysisIsOk =
true;
275 m_factorizationIsOk =
true;
276 m_isInitialized =
true;
280 template<
class Derived>
287 m_perm.setZero(m_size);
288 derived().getMatrix(a);
292 m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
293 m_perm.data(), 0, m_iparm.data(), m_msglvl,
NULL,
NULL);
295 manageErrorCode(error);
296 m_analysisIsOk =
true;
297 m_factorizationIsOk =
false;
298 m_isInitialized =
true;
302 template<
class Derived>
305 eigen_assert(m_analysisIsOk &&
"You must first call analyzePattern()");
308 derived().getMatrix(a);
312 m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
313 m_perm.data(), 0, m_iparm.data(), m_msglvl,
NULL,
NULL);
315 manageErrorCode(error);
316 m_factorizationIsOk =
true;
320 template<
class Derived>
321 template<
typename BDerived,
typename XDerived>
335 eigen_assert(((nrhs == 1) || b.outerStride() == b.rows()));
347 Scalar* rhs_ptr =
const_cast<Scalar*
>(b.derived().data());
351 if(rhs_ptr == x.derived().data())
354 rhs_ptr = tmp.
data();
359 m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
360 m_perm.data(), internal::convert_index<StorageIndex>(nrhs), m_iparm.data(), m_msglvl,
361 rhs_ptr, x.derived().data());
363 manageErrorCode(error);
384 template<
typename MatrixType>
389 using Base::pardisoInit;
390 using Base::m_matrix;
404 pardisoInit(Base::ScalarIsComplex ? 13 : 11);
410 pardisoInit(Base::ScalarIsComplex ? 13 : 11);
417 m_matrix.makeCompressed();
440 template<
typename MatrixType,
int _UpLo>
445 using Base::pardisoInit;
446 using Base::m_matrix;
454 enum { UpLo = _UpLo };
460 pardisoInit(Base::ScalarIsComplex ? 4 : 2);
466 pardisoInit(Base::ScalarIsComplex ? 4 : 2);
476 m_matrix.
resize(matrix.rows(), matrix.cols());
477 m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
478 m_matrix.makeCompressed();
503 template<
typename MatrixType,
int Options>
508 using Base::pardisoInit;
509 using Base::m_matrix;
523 pardisoInit(Base::ScalarIsComplex ? (
bool(Options&
Symmetric) ? 6 : -4 ) : -2);
529 pardisoInit(Base::ScalarIsComplex ? (
bool(Options&
Symmetric) ? 6 : -4 ) : -2);
537 m_matrix.
resize(matrix.rows(), matrix.cols());
538 m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
539 m_matrix.makeCompressed();
545 #endif // EIGEN_PARDISOSUPPORT_H
static IndexType run(_MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase, IndexType n, void *a, IndexType *ia, IndexType *ja, IndexType *perm, IndexType nrhs, IndexType *iparm, IndexType msglvl, void *b, void *x)
Matrix< StorageIndex, 1, MatrixType::ColsAtCompileTime > IntRowVectorType
_MatrixType::Scalar Scalar
SparseMatrix< Scalar, RowMajor, StorageIndex > SparseMatrixType
Derived & compute(const MatrixType &matrix)
Derived & factorize(const MatrixType &matrix)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar * data() const
_MatrixType::StorageIndex StorageIndex
PardisoLDLT(const MatrixType &matrix)
A base class for sparse solvers.
_MatrixType::StorageIndex StorageIndex
Namespace containing all symbols from the Eigen library.
Matrix< StorageIndex, MatrixType::RowsAtCompileTime, 1 > IntColVectorType
Traits::StorageIndex StorageIndex
PardisoImpl< PardisoLLT< MatrixType, _UpLo > > Base
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Array< StorageIndex, 64, 1, DontAlign > ParameterType
static const Point3 pt(1.0, 2.0, 3.0)
void getMatrix(const MatrixType &matrix)
void _solve_impl(const MatrixBase< Rhs > &b, MatrixBase< Dest > &dest) const
_MatrixType::RealScalar RealScalar
const unsigned int RowMajorBit
static IndexType run(_MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase, IndexType n, void *a, IndexType *ia, IndexType *ja, IndexType *perm, IndexType nrhs, IndexType *iparm, IndexType msglvl, void *b, void *x)
Traits::RealScalar RealScalar
Base::RealScalar RealScalar
A sparse direct Cholesky (LLT) factorization and solver based on the PARDISO library.
Base::StorageIndex StorageIndex
void pardisoInit(int type)
void manageErrorCode(Index error) const
Derived & analyzePattern(const MatrixType &matrix)
_MatrixType::StorageIndex StorageIndex
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
_MatrixType::RealScalar RealScalar
PardisoImpl< PardisoLU > Base
idx_t idx_t idx_t idx_t idx_t * perm
Base::RealScalar RealScalar
A sparse direct LU factorization and solver based on the PARDISO library.
Matrix< Scalar, Dynamic, 1 > VectorType
NumTraits< Scalar >::Real RealScalar
ComputationInfo info() const
Reports whether previous computation was successful.
internal::pardiso_traits< Derived > Traits
void getMatrix(const MatrixType &matrix)
Base::RealScalar RealScalar
SparseSolverBase< Derived > Base
PardisoImpl< PardisoLDLT< MatrixType, Options > > Base
A sparse direct Cholesky (LDLT) factorization and solver based on the PARDISO library.
ParameterType & pardisoParameterArray()
void getMatrix(const MatrixType &matrix)
Traits::MatrixType MatrixType
EIGEN_DONT_INLINE void compute(Solver &solver, const MatrixType &A)
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
void resize(Index newSize)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Base class for all dense matrices, vectors, and expressions.
SparseMatrixType m_matrix
_MatrixType::Scalar Scalar
_MatrixType::RealScalar RealScalar
PardisoLLT(const MatrixType &matrix)
PardisoLU(const MatrixType &matrix)
Base::StorageIndex StorageIndex
_MatrixType::Scalar Scalar