10 #ifndef EIGEN_PASTIXSUPPORT_H
11 #define EIGEN_PASTIXSUPPORT_H
19 #define PASTIX_COMPLEX COMPLEX
20 #define PASTIX_DCOMPLEX DCOMPLEX
22 #define PASTIX_COMPLEX std::complex<float>
23 #define PASTIX_DCOMPLEX std::complex<double>
34 template <
typename MatrixType_,
bool IsStrSym = false>
36 template <
typename MatrixType_,
int Options>
38 template <
typename MatrixType_,
int Options>
43 template <
class Pastix>
46 template <
typename MatrixType_>
54 template <
typename MatrixType_,
int Options>
62 template <
typename MatrixType_,
int Options>
70 inline void eigen_pastix(pastix_data_t **pastix_data,
int pastix_comm,
int n,
int *ptr,
int *idx,
float *vals,
71 int *perm,
int *invp,
float *
x,
int nbrhs,
int *iparm,
double *dparm) {
81 s_pastix(pastix_data, pastix_comm,
n, ptr, idx, vals, perm, invp,
x, nbrhs, iparm, dparm);
84 inline void eigen_pastix(pastix_data_t **pastix_data,
int pastix_comm,
int n,
int *ptr,
int *idx,
double *vals,
85 int *perm,
int *invp,
double *
x,
int nbrhs,
int *iparm,
double *dparm) {
95 d_pastix(pastix_data, pastix_comm,
n, ptr, idx, vals, perm, invp,
x, nbrhs, iparm, dparm);
98 inline void eigen_pastix(pastix_data_t **pastix_data,
int pastix_comm,
int n,
int *ptr,
int *idx,
99 std::complex<float> *vals,
int *perm,
int *invp, std::complex<float> *
x,
int nbrhs,
int *iparm,
110 c_pastix(pastix_data, pastix_comm,
n, ptr, idx,
reinterpret_cast<PASTIX_COMPLEX *
>(vals), perm, invp,
114 inline void eigen_pastix(pastix_data_t **pastix_data,
int pastix_comm,
int n,
int *ptr,
int *idx,
115 std::complex<double> *vals,
int *perm,
int *invp, std::complex<double> *
x,
int nbrhs,
116 int *iparm,
double *dparm) {
126 z_pastix(pastix_data, pastix_comm,
n, ptr, idx,
reinterpret_cast<PASTIX_DCOMPLEX *
>(vals), perm, invp,
131 template <
typename MatrixType>
141 template <
typename MatrixType>
154 template <
class Derived>
180 template <
typename Rhs,
typename Dest>
236 m_iparm(IPARM_START_TASK) = API_TASK_CLEAN;
237 m_iparm(IPARM_END_TASK) = API_TASK_CLEAN;
238 internal::eigen_pastix(&
m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (
Scalar *)0,
m_perm.
data(),
m_invp.
data(), 0, 0,
261 template <
class Derived>
264 m_iparm.setZero(IPARM_SIZE);
265 m_dparm.setZero(DPARM_SIZE);
267 m_iparm(IPARM_MODIFY_PARAMETER) = API_NO;
268 pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, 0, 0, 0, 0, 1, m_iparm.data(), m_dparm.data());
270 m_iparm[IPARM_MATRIX_VERIFICATION] = API_NO;
271 m_iparm[IPARM_VERBOSE] = API_VERBOSE_NOT;
272 m_iparm[IPARM_ORDERING] = API_ORDER_SCOTCH;
273 m_iparm[IPARM_INCOMPLETE] = API_NO;
274 m_iparm[IPARM_OOC_LIMIT] = 2000;
275 m_iparm[IPARM_RHS_MAKING] = API_RHS_B;
276 m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
278 m_iparm(IPARM_START_TASK) = API_TASK_INIT;
279 m_iparm(IPARM_END_TASK) = API_TASK_INIT;
280 internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (
Scalar *)0, 0, 0, 0, 0, m_iparm.data(),
284 if (m_iparm(IPARM_ERROR_NUMBER)) {
293 template <
class Derived>
300 m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
303 template <
class Derived>
305 eigen_assert(m_initisOk &&
"The initialization of PaSTiX failed");
308 if (m_size > 0) clean();
310 m_size = internal::convert_index<int>(
mat.
rows());
311 m_perm.resize(m_size);
312 m_invp.resize(m_size);
314 m_iparm(IPARM_START_TASK) = API_TASK_ORDERING;
315 m_iparm(IPARM_END_TASK) = API_TASK_ANALYSE;
317 mat.
valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
320 if (m_iparm(IPARM_ERROR_NUMBER)) {
322 m_analysisIsOk =
false;
325 m_analysisIsOk =
true;
329 template <
class Derived>
332 eigen_assert(m_analysisIsOk &&
"The analysis phase should be called before the factorization phase");
333 m_iparm(IPARM_START_TASK) = API_TASK_NUMFACT;
334 m_iparm(IPARM_END_TASK) = API_TASK_NUMFACT;
335 m_size = internal::convert_index<int>(
mat.
rows());
338 mat.
valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
341 if (m_iparm(IPARM_ERROR_NUMBER)) {
343 m_factorizationIsOk =
false;
344 m_isInitialized =
false;
347 m_factorizationIsOk =
true;
348 m_isInitialized =
true;
353 template <
typename Base>
354 template <
typename Rhs,
typename Dest>
356 eigen_assert(m_isInitialized &&
"The matrix should be factorized first");
362 for (
int i = 0;
i <
b.cols();
i++) {
363 m_iparm[IPARM_START_TASK] = API_TASK_SOLVE;
364 m_iparm[IPARM_END_TASK] = API_TASK_REFINE;
367 m_perm.data(), m_invp.data(), &
x(0,
i), rhs, m_iparm.data(), m_dparm.data());
373 return m_iparm(IPARM_ERROR_NUMBER) == 0;
397 template <
typename MatrixType_,
bool IsStrSym>
449 m_iparm(IPARM_SYM) = API_SYM_NO;
450 m_iparm(IPARM_FACTORIZATION) = API_FACT_LU;
496 template <
typename MatrixType_,
int UpLo_>
543 m_iparm(IPARM_SYM) = API_SYM_YES;
544 m_iparm(IPARM_FACTORIZATION) = API_FACT_LLT;
550 out.template selfadjointView<Lower>() =
matrix.template selfadjointView<UpLo>();
571 template <
typename MatrixType_,
int UpLo_>
618 m_iparm(IPARM_SYM) = API_SYM_YES;
619 m_iparm(IPARM_FACTORIZATION) = API_FACT_LDLT;
625 out.template selfadjointView<Lower>() =
matrix.template selfadjointView<UpLo>();
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define eigen_assert(x)
Definition: Macros.h:910
#define PASTIX_DCOMPLEX
Definition: PaStiXSupport.h:23
#define PASTIX_COMPLEX
Definition: PaStiXSupport.h:22
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
Definition: PaStiXSupport.h:155
Index rows() const
Definition: PaStiXSupport.h:208
Matrix< StorageIndex, Dynamic, 1 > m_invp
Definition: PaStiXSupport.h:253
@ ColsAtCompileTime
Definition: PaStiXSupport.h:171
@ MaxColsAtCompileTime
Definition: PaStiXSupport.h:171
void analyzePattern(ColSpMatrix &mat)
Definition: PaStiXSupport.h:304
int m_factorizationIsOk
Definition: PaStiXSupport.h:246
internal::pastix_traits< Derived >::MatrixType MatrixType_
Definition: PaStiXSupport.h:164
MatrixType::StorageIndex StorageIndex
Definition: PaStiXSupport.h:168
Array< StorageIndex, IPARM_SIZE, 1 > & iparm()
Definition: PaStiXSupport.h:188
MatrixType::RealScalar RealScalar
Definition: PaStiXSupport.h:167
void compute(ColSpMatrix &mat)
Definition: PaStiXSupport.h:294
ComputationInfo info() const
Reports whether previous computation was successful.
Definition: PaStiXSupport.h:218
Matrix< Scalar, Dynamic, 1 > Vector
Definition: PaStiXSupport.h:169
PastixBase()
Definition: PaStiXSupport.h:174
int & iparm(int idxparam)
Definition: PaStiXSupport.h:194
bool _solve_impl(const MatrixBase< Rhs > &b, MatrixBase< Dest > &x) const
Definition: PaStiXSupport.h:355
Index cols() const
Definition: PaStiXSupport.h:207
double & dparm(int idxparam)
Definition: PaStiXSupport.h:205
Matrix< StorageIndex, Dynamic, 1 > m_perm
Definition: PaStiXSupport.h:252
int m_analysisIsOk
Definition: PaStiXSupport.h:245
MatrixType::Scalar Scalar
Definition: PaStiXSupport.h:166
int m_initisOk
Definition: PaStiXSupport.h:244
void clean()
Definition: PaStiXSupport.h:234
int m_size
Definition: PaStiXSupport.h:254
~PastixBase()
Definition: PaStiXSupport.h:178
Array< int, IPARM_SIZE, 1 > m_iparm
Definition: PaStiXSupport.h:250
bool m_isInitialized
Definition: SparseSolverBase.h:110
void init()
Definition: PaStiXSupport.h:262
MatrixType_ MatrixType
Definition: PaStiXSupport.h:165
void factorize(ColSpMatrix &mat)
Definition: PaStiXSupport.h:330
pastix_data_t * m_pastixdata
Definition: PaStiXSupport.h:248
ComputationInfo m_info
Definition: PaStiXSupport.h:247
SparseMatrix< Scalar, ColMajor > ColSpMatrix
Definition: PaStiXSupport.h:170
Array< double, DPARM_SIZE, 1 > & dparm()
Definition: PaStiXSupport.h:200
Array< double, DPARM_SIZE, 1 > m_dparm
Definition: PaStiXSupport.h:251
int m_comm
Definition: PaStiXSupport.h:249
SparseSolverBase< Derived > Base
Definition: PaStiXSupport.h:157
A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library.
Definition: PaStiXSupport.h:572
@ UpLo
Definition: PaStiXSupport.h:579
Base::ColSpMatrix ColSpMatrix
Definition: PaStiXSupport.h:576
void grabMatrix(const MatrixType &matrix, ColSpMatrix &out)
Definition: PaStiXSupport.h:622
PastixBase< PastixLDLT< MatrixType, UpLo_ > > Base
Definition: PaStiXSupport.h:575
PastixLDLT()
Definition: PaStiXSupport.h:580
PastixLDLT(const MatrixType &matrix)
Definition: PaStiXSupport.h:582
void compute(const MatrixType &matrix)
Definition: PaStiXSupport.h:590
void init()
Definition: PaStiXSupport.h:617
void analyzePattern(const MatrixType &matrix)
Definition: PaStiXSupport.h:600
Array< int, IPARM_SIZE, 1 > m_iparm
Definition: PaStiXSupport.h:250
MatrixType_ MatrixType
Definition: PaStiXSupport.h:574
void factorize(const MatrixType &matrix)
Definition: PaStiXSupport.h:608
A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library.
Definition: PaStiXSupport.h:497
@ UpLo
Definition: PaStiXSupport.h:504
void init()
Definition: PaStiXSupport.h:542
MatrixType_ MatrixType
Definition: PaStiXSupport.h:499
PastixLLT(const MatrixType &matrix)
Definition: PaStiXSupport.h:507
void compute(const MatrixType &matrix)
Definition: PaStiXSupport.h:515
void factorize(const MatrixType &matrix)
Definition: PaStiXSupport.h:533
void analyzePattern(const MatrixType &matrix)
Definition: PaStiXSupport.h:525
PastixBase< PastixLLT< MatrixType, UpLo_ > > Base
Definition: PaStiXSupport.h:500
Array< int, IPARM_SIZE, 1 > m_iparm
Definition: PaStiXSupport.h:250
void grabMatrix(const MatrixType &matrix, ColSpMatrix &out)
Definition: PaStiXSupport.h:547
Base::ColSpMatrix ColSpMatrix
Definition: PaStiXSupport.h:501
PastixLLT()
Definition: PaStiXSupport.h:505
Interface to the PaStix solver.
Definition: PaStiXSupport.h:398
bool m_structureIsUptodate
Definition: PaStiXSupport.h:477
void analyzePattern(const MatrixType &matrix)
Definition: PaStiXSupport.h:428
void factorize(const MatrixType &matrix)
Definition: PaStiXSupport.h:440
void compute(const MatrixType &matrix)
Definition: PaStiXSupport.h:417
void init()
Definition: PaStiXSupport.h:447
PastixLU(const MatrixType &matrix)
Definition: PaStiXSupport.h:408
PastixBase< PastixLU< MatrixType > > Base
Definition: PaStiXSupport.h:401
MatrixType_ MatrixType
Definition: PaStiXSupport.h:400
void grabMatrix(const MatrixType &matrix, ColSpMatrix &out)
Definition: PaStiXSupport.h:453
PastixLU()
Definition: PaStiXSupport.h:406
MatrixType::StorageIndex StorageIndex
Definition: PaStiXSupport.h:403
Array< int, IPARM_SIZE, 1 > m_iparm
Definition: PaStiXSupport.h:250
ColSpMatrix m_transposedStructure
Definition: PaStiXSupport.h:476
Base::ColSpMatrix ColSpMatrix
Definition: PaStiXSupport.h:402
constexpr EIGEN_DEVICE_FUNC const Scalar * data() const
Definition: PlainObjectBase.h:273
Index nonZeros() const
Definition: SparseCompressedBase.h:64
Index cols() const
Definition: SparseMatrix.h:161
Index outerSize() const
Definition: SparseMatrix.h:166
const Scalar * valuePtr() const
Definition: SparseMatrix.h:171
Index rows() const
Definition: SparseMatrix.h:159
Base::InnerIterator InnerIterator
Definition: SparseMatrix.h:138
const StorageIndex * outerIndexPtr() const
Definition: SparseMatrix.h:189
const StorageIndex * innerIndexPtr() const
Definition: SparseMatrix.h:180
A base class for sparse solvers.
Definition: SparseSolverBase.h:67
void _solve_impl(const SparseMatrixBase< Rhs > &b, SparseMatrixBase< Dest > &dest) const
Definition: SparseSolverBase.h:104
bool m_isInitialized
Definition: SparseSolverBase.h:110
Derived & derived()
Definition: SparseSolverBase.h:76
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
ComputationInfo
Definition: Constants.h:438
@ NumericalIssue
Definition: Constants.h:442
@ InvalidInput
Definition: Constants.h:447
@ Success
Definition: Constants.h:440
const unsigned int RowMajorBit
Definition: Constants.h:70
void fortran_to_c_numbering(MatrixType &mat)
Definition: PaStiXSupport.h:142
void c_to_fortran_numbering(MatrixType &mat)
Definition: PaStiXSupport.h:132
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)
Definition: PaStiXSupport.h:70
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
MatrixType_::RealScalar RealScalar
Definition: PaStiXSupport.h:66
MatrixType_::StorageIndex StorageIndex
Definition: PaStiXSupport.h:67
MatrixType_ MatrixType
Definition: PaStiXSupport.h:64
MatrixType_::Scalar Scalar
Definition: PaStiXSupport.h:65
MatrixType_::Scalar Scalar
Definition: PaStiXSupport.h:57
MatrixType_ MatrixType
Definition: PaStiXSupport.h:56
MatrixType_::StorageIndex StorageIndex
Definition: PaStiXSupport.h:59
MatrixType_::RealScalar RealScalar
Definition: PaStiXSupport.h:58
MatrixType_::Scalar Scalar
Definition: PaStiXSupport.h:49
MatrixType_::RealScalar RealScalar
Definition: PaStiXSupport.h:50
MatrixType_::StorageIndex StorageIndex
Definition: PaStiXSupport.h:51
MatrixType_ MatrixType
Definition: PaStiXSupport.h:48
Definition: PaStiXSupport.h:44
std::ofstream out("Result.txt")
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2