PardisoSupport.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2011, Intel Corporation. All rights reserved.
3 
4  Redistribution and use in source and binary forms, with or without modification,
5  are permitted provided that the following conditions are met:
6 
7  * Redistributions of source code must retain the above copyright notice, this
8  list of conditions and the following disclaimer.
9  * Redistributions in binary form must reproduce the above copyright notice,
10  this list of conditions and the following disclaimer in the documentation
11  and/or other materials provided with the distribution.
12  * Neither the name of Intel Corporation nor the names of its contributors may
13  be used to endorse or promote products derived from this software without
14  specific prior written permission.
15 
16  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 
27  ********************************************************************************
28  * Content : Eigen bindings to Intel(R) MKL PARDISO
29  ********************************************************************************
30 */
31 
32 #ifndef EIGEN_PARDISOSUPPORT_H
33 #define EIGEN_PARDISOSUPPORT_H
34 
35 // IWYU pragma: private
36 #include "./InternalHeaderCheck.h"
37 
38 namespace Eigen {
39 
40 template <typename MatrixType_>
41 class PardisoLU;
42 template <typename MatrixType_, int Options = Upper>
43 class PardisoLLT;
44 template <typename MatrixType_, int Options = Upper>
45 class PardisoLDLT;
46 
47 namespace internal {
48 template <typename IndexType>
50  static IndexType run(_MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase,
51  IndexType n, void* a, IndexType* ia, IndexType* ja, IndexType* perm, IndexType nrhs,
52  IndexType* iparm, IndexType msglvl, void* b, void* x) {
53  IndexType error = 0;
54  ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
55  return error;
56  }
57 };
58 template <>
59 struct pardiso_run_selector<long long int> {
60  typedef long long int IndexType;
61  static IndexType run(_MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase,
62  IndexType n, void* a, IndexType* ia, IndexType* ja, IndexType* perm, IndexType nrhs,
63  IndexType* iparm, IndexType msglvl, void* b, void* x) {
64  IndexType error = 0;
65  ::pardiso_64(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
66  return error;
67  }
68 };
69 
70 template <class Pardiso>
72 
73 template <typename MatrixType_>
74 struct pardiso_traits<PardisoLU<MatrixType_> > {
75  typedef MatrixType_ MatrixType;
76  typedef typename MatrixType_::Scalar Scalar;
78  typedef typename MatrixType_::StorageIndex StorageIndex;
79 };
80 
81 template <typename MatrixType_, int Options>
82 struct pardiso_traits<PardisoLLT<MatrixType_, Options> > {
83  typedef MatrixType_ MatrixType;
84  typedef typename MatrixType_::Scalar Scalar;
86  typedef typename MatrixType_::StorageIndex StorageIndex;
87 };
88 
89 template <typename MatrixType_, int Options>
90 struct pardiso_traits<PardisoLDLT<MatrixType_, Options> > {
91  typedef MatrixType_ MatrixType;
92  typedef typename MatrixType_::Scalar Scalar;
94  typedef typename MatrixType_::StorageIndex StorageIndex;
95 };
96 
97 } // end namespace internal
98 
99 template <class Derived>
100 class PardisoImpl : public SparseSolverBase<Derived> {
101  protected:
103  using Base::derived;
104  using Base::m_isInitialized;
105 
107 
108  public:
109  using Base::_solve_impl;
110 
111  typedef typename Traits::MatrixType MatrixType;
112  typedef typename Traits::Scalar Scalar;
113  typedef typename Traits::RealScalar RealScalar;
114  typedef typename Traits::StorageIndex StorageIndex;
121 
123  eigen_assert((sizeof(StorageIndex) >= sizeof(_INTEGER_t) && sizeof(StorageIndex) <= 8) &&
124  "Non-supported index type");
125  m_iparm.setZero();
126  m_msglvl = 0; // No output
127  m_isInitialized = false;
128  }
129 
131 
132  inline Index cols() const { return m_size; }
133  inline Index rows() const { return m_size; }
134 
141  eigen_assert(m_isInitialized && "Decomposition is not initialized.");
142  return m_info;
143  }
144 
149 
156  Derived& analyzePattern(const MatrixType& matrix);
157 
164  Derived& factorize(const MatrixType& matrix);
165 
166  Derived& compute(const MatrixType& matrix);
167 
168  template <typename Rhs, typename Dest>
169  void _solve_impl(const MatrixBase<Rhs>& b, MatrixBase<Dest>& dest) const;
170 
171  protected:
172  void pardisoRelease() {
173  if (m_isInitialized) // Factorization ran at least once
174  {
176  internal::convert_index<StorageIndex>(m_size), 0, 0, 0,
177  m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
178  m_isInitialized = false;
179  }
180  }
181 
182  void pardisoInit(int type) {
183  m_type = type;
184  bool symmetric = std::abs(m_type) < 10;
185  m_iparm[0] = 1; // No solver default
186  m_iparm[1] = 2; // use Metis for the ordering
187  m_iparm[2] = 0; // Reserved. Set to zero. (??Numbers of processors, value of OMP_NUM_THREADS??)
188  m_iparm[3] = 0; // No iterative-direct algorithm
189  m_iparm[4] = 0; // No user fill-in reducing permutation
190  m_iparm[5] = 0; // Write solution into x, b is left unchanged
191  m_iparm[6] = 0; // Not in use
192  m_iparm[7] = 2; // Max numbers of iterative refinement steps
193  m_iparm[8] = 0; // Not in use
194  m_iparm[9] = 13; // Perturb the pivot elements with 1E-13
195  m_iparm[10] = symmetric ? 0 : 1; // Use nonsymmetric permutation and scaling MPS
196  m_iparm[11] = 0; // Not in use
197  m_iparm[12] = symmetric ? 0 : 1; // Maximum weighted matching algorithm is switched-off (default for symmetric).
198  // Try m_iparm[12] = 1 in case of inappropriate accuracy
199  m_iparm[13] = 0; // Output: Number of perturbed pivots
200  m_iparm[14] = 0; // Not in use
201  m_iparm[15] = 0; // Not in use
202  m_iparm[16] = 0; // Not in use
203  m_iparm[17] = -1; // Output: Number of nonzeros in the factor LU
204  m_iparm[18] = -1; // Output: Mflops for LU factorization
205  m_iparm[19] = 0; // Output: Numbers of CG Iterations
206 
207  m_iparm[20] = 0; // 1x1 pivoting
208  m_iparm[26] = 0; // No matrix checker
209  m_iparm[27] = (sizeof(RealScalar) == 4) ? 1 : 0;
210  m_iparm[34] = 1; // C indexing
211  m_iparm[36] = 0; // CSR
212  m_iparm[59] = 0; // 0 - In-Core ; 1 - Automatic switch between In-Core and Out-of-Core modes ; 2 - Out-of-Core
213 
214  memset(m_pt, 0, sizeof(m_pt));
215  }
216 
217  protected:
218  // cached data to reduce reallocation, etc.
219 
221  switch (error) {
222  case 0:
223  m_info = Success;
224  break;
225  case -4:
226  case -7:
228  break;
229  default:
231  }
232  }
233 
238  mutable void* m_pt[64];
242 };
243 
244 template <class Derived>
246  m_size = a.rows();
247  eigen_assert(a.rows() == a.cols());
248 
249  pardisoRelease();
250  m_perm.setZero(m_size);
251  derived().getMatrix(a);
252 
253  Index error;
255  m_pt, 1, 1, m_type, 12, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
256  m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
257  manageErrorCode(error);
258  m_analysisIsOk = m_info == Eigen::Success;
259  m_factorizationIsOk = m_info == Eigen::Success;
260  m_isInitialized = true;
261  return derived();
262 }
263 
264 template <class Derived>
266  m_size = a.rows();
267  eigen_assert(m_size == a.cols());
268 
269  pardisoRelease();
270  m_perm.setZero(m_size);
271  derived().getMatrix(a);
272 
273  Index error;
275  m_pt, 1, 1, m_type, 11, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
276  m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
277 
278  manageErrorCode(error);
279  m_analysisIsOk = m_info == Eigen::Success;
280  m_factorizationIsOk = false;
281  m_isInitialized = true;
282  return derived();
283 }
284 
285 template <class Derived>
287  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
288  eigen_assert(m_size == a.rows() && m_size == a.cols());
289 
290  derived().getMatrix(a);
291 
292  Index error;
294  m_pt, 1, 1, m_type, 22, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
295  m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
296 
297  manageErrorCode(error);
298  m_factorizationIsOk = m_info == Eigen::Success;
299  return derived();
300 }
301 
302 template <class Derived>
303 template <typename BDerived, typename XDerived>
305  if (m_iparm[0] == 0) // Factorization was not computed
306  {
307  m_info = InvalidInput;
308  return;
309  }
310 
311  // Index n = m_matrix.rows();
312  Index nrhs = Index(b.cols());
313  eigen_assert(m_size == b.rows());
314  eigen_assert(((MatrixBase<BDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) &&
315  "Row-major right hand sides are not supported");
316  eigen_assert(((MatrixBase<XDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) &&
317  "Row-major matrices of unknowns are not supported");
318  eigen_assert(((nrhs == 1) || b.outerStride() == b.rows()));
319 
320  // switch (transposed) {
321  // case SvNoTrans : m_iparm[11] = 0 ; break;
322  // case SvTranspose : m_iparm[11] = 2 ; break;
323  // case SvAdjoint : m_iparm[11] = 1 ; break;
324  // default:
325  // //std::cerr << "Eigen: transposition option \"" << transposed << "\" not supported by the PARDISO backend\n";
326  // m_iparm[11] = 0;
327  // }
328 
329  Scalar* rhs_ptr = const_cast<Scalar*>(b.derived().data());
331 
332  // Pardiso cannot solve in-place
333  if (rhs_ptr == x.derived().data()) {
334  tmp = b;
335  rhs_ptr = tmp.data();
336  }
337 
338  Index error;
340  m_pt, 1, 1, m_type, 33, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
341  m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), internal::convert_index<StorageIndex>(nrhs),
342  m_iparm.data(), m_msglvl, rhs_ptr, x.derived().data());
343 
344  manageErrorCode(error);
345 }
346 
364 template <typename MatrixType>
365 class PardisoLU : public PardisoImpl<PardisoLU<MatrixType> > {
366  protected:
368  using Base::m_matrix;
369  using Base::pardisoInit;
370  friend class PardisoImpl<PardisoLU<MatrixType> >;
371 
372  public:
373  typedef typename Base::Scalar Scalar;
374  typedef typename Base::RealScalar RealScalar;
375 
376  using Base::compute;
377  using Base::solve;
378 
380 
381  explicit PardisoLU(const MatrixType& matrix) : Base() {
383  compute(matrix);
384  }
385 
386  protected:
387  void getMatrix(const MatrixType& matrix) {
388  m_matrix = matrix;
390  }
391 };
392 
412 template <typename MatrixType, int UpLo_>
413 class PardisoLLT : public PardisoImpl<PardisoLLT<MatrixType, UpLo_> > {
414  protected:
416  using Base::m_matrix;
417  using Base::pardisoInit;
418  friend class PardisoImpl<PardisoLLT<MatrixType, UpLo_> >;
419 
420  public:
421  typedef typename Base::Scalar Scalar;
422  typedef typename Base::RealScalar RealScalar;
424  enum { UpLo = UpLo_ };
425  using Base::compute;
426 
428 
429  explicit PardisoLLT(const MatrixType& matrix) : Base() {
431  compute(matrix);
432  }
433 
434  protected:
435  void getMatrix(const MatrixType& matrix) {
436  // PARDISO supports only upper, row-major matrices
438  m_matrix.resize(matrix.rows(), matrix.cols());
439  m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
441  }
442 };
443 
466 template <typename MatrixType, int Options>
467 class PardisoLDLT : public PardisoImpl<PardisoLDLT<MatrixType, Options> > {
468  protected:
470  using Base::m_matrix;
471  using Base::pardisoInit;
472  friend class PardisoImpl<PardisoLDLT<MatrixType, Options> >;
473 
474  public:
475  typedef typename Base::Scalar Scalar;
476  typedef typename Base::RealScalar RealScalar;
478  using Base::compute;
479  enum { UpLo = Options & (Upper | Lower) };
480 
481  PardisoLDLT() : Base() { pardisoInit(Base::ScalarIsComplex ? (bool(Options & Symmetric) ? 6 : -4) : -2); }
482 
483  explicit PardisoLDLT(const MatrixType& matrix) : Base() {
484  pardisoInit(Base::ScalarIsComplex ? (bool(Options & Symmetric) ? 6 : -4) : -2);
485  compute(matrix);
486  }
487 
488  void getMatrix(const MatrixType& matrix) {
489  // PARDISO supports only upper, row-major matrices
491  m_matrix.resize(matrix.rows(), matrix.cols());
492  m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
494  }
495 };
496 
497 } // end namespace Eigen
498 
499 #endif // EIGEN_PARDISOSUPPORT_H
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define eigen_assert(x)
Definition: Macros.h:910
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
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
Definition: PardisoSupport.h:100
Derived & compute(const MatrixType &matrix)
Definition: PardisoSupport.h:245
StorageIndex m_type
Definition: PardisoSupport.h:237
void * m_pt[64]
Definition: PardisoSupport.h:238
Matrix< StorageIndex, MatrixType::RowsAtCompileTime, 1 > IntColVectorType
Definition: PardisoSupport.h:118
void _solve_impl(const MatrixBase< Rhs > &b, MatrixBase< Dest > &dest) const
@ MaxColsAtCompileTime
Definition: PardisoSupport.h:120
@ ColsAtCompileTime
Definition: PardisoSupport.h:120
@ ScalarIsComplex
Definition: PardisoSupport.h:120
Traits::StorageIndex StorageIndex
Definition: PardisoSupport.h:114
~PardisoImpl()
Definition: PardisoSupport.h:130
Traits::MatrixType MatrixType
Definition: PardisoSupport.h:111
PardisoImpl()
Definition: PardisoSupport.h:122
IntColVectorType m_perm
Definition: PardisoSupport.h:240
ParameterType & pardisoParameterArray()
Definition: PardisoSupport.h:148
SparseMatrixType m_matrix
Definition: PardisoSupport.h:234
Traits::RealScalar RealScalar
Definition: PardisoSupport.h:113
void pardisoInit(int type)
Definition: PardisoSupport.h:182
Index rows() const
Definition: PardisoSupport.h:133
Index cols() const
Definition: PardisoSupport.h:132
Array< StorageIndex, 64, 1, DontAlign > ParameterType
Definition: PardisoSupport.h:119
Matrix< Scalar, Dynamic, 1 > VectorType
Definition: PardisoSupport.h:116
Derived & factorize(const MatrixType &matrix)
Definition: PardisoSupport.h:286
Index m_size
Definition: PardisoSupport.h:241
ComputationInfo info() const
Reports whether previous computation was successful.
Definition: PardisoSupport.h:140
StorageIndex m_msglvl
Definition: PardisoSupport.h:237
internal::pardiso_traits< Derived > Traits
Definition: PardisoSupport.h:106
bool m_factorizationIsOk
Definition: PardisoSupport.h:236
Matrix< StorageIndex, 1, MatrixType::ColsAtCompileTime > IntRowVectorType
Definition: PardisoSupport.h:117
ComputationInfo m_info
Definition: PardisoSupport.h:235
void pardisoRelease()
Definition: PardisoSupport.h:172
SparseMatrix< Scalar, RowMajor, StorageIndex > SparseMatrixType
Definition: PardisoSupport.h:115
bool m_isInitialized
Definition: SparseSolverBase.h:110
void manageErrorCode(Index error) const
Definition: PardisoSupport.h:220
Traits::Scalar Scalar
Definition: PardisoSupport.h:112
SparseSolverBase< Derived > Base
Definition: PardisoSupport.h:102
ParameterType m_iparm
Definition: PardisoSupport.h:239
Derived & analyzePattern(const MatrixType &matrix)
Definition: PardisoSupport.h:265
bool m_analysisIsOk
Definition: PardisoSupport.h:236
A sparse direct Cholesky (LDLT) factorization and solver based on the PARDISO library.
Definition: PardisoSupport.h:467
Base::RealScalar RealScalar
Definition: PardisoSupport.h:476
Base::Scalar Scalar
Definition: PardisoSupport.h:475
PardisoLDLT(const MatrixType &matrix)
Definition: PardisoSupport.h:483
PardisoImpl< PardisoLDLT< MatrixType, Options > > Base
Definition: PardisoSupport.h:469
PardisoLDLT()
Definition: PardisoSupport.h:481
@ UpLo
Definition: PardisoSupport.h:479
void getMatrix(const MatrixType &matrix)
Definition: PardisoSupport.h:488
Base::StorageIndex StorageIndex
Definition: PardisoSupport.h:477
A sparse direct Cholesky (LLT) factorization and solver based on the PARDISO library.
Definition: PardisoSupport.h:413
PardisoImpl< PardisoLLT< MatrixType, UpLo_ > > Base
Definition: PardisoSupport.h:415
Base::StorageIndex StorageIndex
Definition: PardisoSupport.h:423
void getMatrix(const MatrixType &matrix)
Definition: PardisoSupport.h:435
Base::Scalar Scalar
Definition: PardisoSupport.h:421
PardisoLLT(const MatrixType &matrix)
Definition: PardisoSupport.h:429
PardisoLLT()
Definition: PardisoSupport.h:427
Base::RealScalar RealScalar
Definition: PardisoSupport.h:422
@ UpLo
Definition: PardisoSupport.h:424
A sparse direct LU factorization and solver based on the PARDISO library.
Definition: PardisoSupport.h:365
Derived & compute(const MatrixType &matrix)
Definition: PardisoSupport.h:245
SparseMatrixType m_matrix
Definition: PardisoSupport.h:234
void pardisoInit(int type)
Definition: PardisoSupport.h:182
Base::RealScalar RealScalar
Definition: PardisoSupport.h:374
PardisoImpl< PardisoLU > Base
Definition: PardisoSupport.h:367
PardisoLU()
Definition: PardisoSupport.h:379
Base::Scalar Scalar
Definition: PardisoSupport.h:373
PardisoLU(const MatrixType &matrix)
Definition: PardisoSupport.h:381
void getMatrix(const MatrixType &matrix)
Definition: PardisoSupport.h:387
constexpr EIGEN_DEVICE_FUNC const Scalar * data() const
Definition: PlainObjectBase.h:273
EIGEN_DEVICE_FUNC Derived & setZero(Index size)
Definition: CwiseNullaryOp.h:569
void makeCompressed()
Definition: SparseMatrix.h:589
void resize(Index rows, Index cols)
Definition: SparseMatrix.h:734
A base class for sparse solvers.
Definition: SparseSolverBase.h:67
const Solve< Derived, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition: SparseSolverBase.h:84
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
@ Symmetric
Definition: Constants.h:229
@ Lower
Definition: Constants.h:211
@ Upper
Definition: Constants.h:213
@ NumericalIssue
Definition: Constants.h:442
@ InvalidInput
Definition: Constants.h:447
@ Success
Definition: Constants.h:440
const unsigned int RowMajorBit
Definition: Constants.h:70
return int(ret)+1
const Scalar * a
Definition: level2_cplx_impl.h:32
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
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
const int Dynamic
Definition: Constants.h:25
int error
Definition: calibrate.py:297
type
Definition: compute_granudrum_aor.py:141
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
long long int IndexType
Definition: PardisoSupport.h:60
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)
Definition: PardisoSupport.h:61
Definition: PardisoSupport.h:49
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)
Definition: PardisoSupport.h:50
MatrixType_::RealScalar RealScalar
Definition: PardisoSupport.h:93
MatrixType_::Scalar Scalar
Definition: PardisoSupport.h:92
MatrixType_::StorageIndex StorageIndex
Definition: PardisoSupport.h:94
MatrixType_::RealScalar RealScalar
Definition: PardisoSupport.h:85
MatrixType_::Scalar Scalar
Definition: PardisoSupport.h:84
MatrixType_::StorageIndex StorageIndex
Definition: PardisoSupport.h:86
MatrixType_::Scalar Scalar
Definition: PardisoSupport.h:76
MatrixType_::StorageIndex StorageIndex
Definition: PardisoSupport.h:78
MatrixType_ MatrixType
Definition: PardisoSupport.h:75
MatrixType_::RealScalar RealScalar
Definition: PardisoSupport.h:77
Definition: PardisoSupport.h:71