10 #ifndef EIGEN_SUPERLUSUPPORT_H
11 #define EIGEN_SUPERLUSUPPORT_H
13 #include "./InternalHeaderCheck.h"
17 #if defined(SUPERLU_MAJOR_VERSION) && (SUPERLU_MAJOR_VERSION >= 5)
18 #define DECL_GSSVX(PREFIX,FLOATTYPE,KEYTYPE) \
20 extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, \
21 char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *, \
22 void *, int, SuperMatrix *, SuperMatrix *, \
23 FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, \
24 GlobalLU_t *, mem_usage_t *, SuperLUStat_t *, int *); \
26 inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A, \
27 int *perm_c, int *perm_r, int *etree, char *equed, \
28 FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, \
29 SuperMatrix *U, void *work, int lwork, \
30 SuperMatrix *B, SuperMatrix *X, \
31 FLOATTYPE *recip_pivot_growth, \
32 FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr, \
33 SuperLUStat_t *stats, int *info, KEYTYPE) { \
34 mem_usage_t mem_usage; \
36 PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L, \
37 U, work, lwork, B, X, recip_pivot_growth, rcond, \
38 ferr, berr, &gLU, &mem_usage, stats, info); \
39 return mem_usage.for_lu;
\
42 #define DECL_GSSVX(PREFIX,FLOATTYPE,KEYTYPE) \
44 extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, \
45 char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *, \
46 void *, int, SuperMatrix *, SuperMatrix *, \
47 FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, \
48 mem_usage_t *, SuperLUStat_t *, int *); \
50 inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A, \
51 int *perm_c, int *perm_r, int *etree, char *equed, \
52 FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, \
53 SuperMatrix *U, void *work, int lwork, \
54 SuperMatrix *B, SuperMatrix *X, \
55 FLOATTYPE *recip_pivot_growth, \
56 FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr, \
57 SuperLUStat_t *stats, int *info, KEYTYPE) { \
58 mem_usage_t mem_usage; \
59 PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L, \
60 U, work, lwork, B, X, recip_pivot_growth, rcond, \
61 ferr, berr, &mem_usage, stats, info); \
62 return mem_usage.for_lu;
\
66 DECL_GSSVX(s,
float,
float)
67 DECL_GSSVX(c,
float,std::complex<float>)
68 DECL_GSSVX(d,
double,
double)
69 DECL_GSSVX(z,
double,std::complex<double>)
72 #define EIGEN_SUPERLU_HAS_ILU
75 #ifdef EIGEN_SUPERLU_HAS_ILU
78 #define DECL_GSISX(PREFIX,FLOATTYPE,KEYTYPE) \
80 extern void PREFIX##gsisx(superlu_options_t *, SuperMatrix *, int *, int *, int *, \
81 char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *, \
82 void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *, FLOATTYPE *, \
83 mem_usage_t *, SuperLUStat_t *, int *); \
85 inline float SuperLU_gsisx(superlu_options_t *options, SuperMatrix *A, \
86 int *perm_c, int *perm_r, int *etree, char *equed, \
87 FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, \
88 SuperMatrix *U, void *work, int lwork, \
89 SuperMatrix *B, SuperMatrix *X, \
90 FLOATTYPE *recip_pivot_growth, \
92 SuperLUStat_t *stats, int *info, KEYTYPE) { \
93 mem_usage_t mem_usage; \
94 PREFIX##gsisx(options, A, perm_c, perm_r, etree, equed, R, C, L, \
95 U, work, lwork, B, X, recip_pivot_growth, rcond, \
96 &mem_usage, stats, info); \
97 return mem_usage.for_lu;
\
100 DECL_GSISX(s,
float,
float)
101 DECL_GSISX(c,
float,std::complex<float>)
102 DECL_GSISX(d,
double,
double)
103 DECL_GSISX(z,
double,std::complex<double>)
107 template<
typename MatrixType>
108 struct SluMatrixMapHelper;
117 struct SluMatrix : SuperMatrix
124 SluMatrix(
const SluMatrix& other)
128 storage = other.storage;
131 SluMatrix& operator=(
const SluMatrix& other)
133 SuperMatrix::operator=(
static_cast<const SuperMatrix&
>(other));
135 storage = other.storage;
141 union {
int nnz;
int lda;};
147 void setStorageType(Stype_t t)
150 if (t==SLU_NC || t==SLU_NR || t==SLU_DN)
154 eigen_assert(
false &&
"storage type not supported");
159 template<
typename Scalar>
162 if (internal::is_same<Scalar,float>::value)
164 else if (internal::is_same<Scalar,double>::value)
166 else if (internal::is_same<Scalar,std::complex<float> >::value)
168 else if (internal::is_same<Scalar,std::complex<double> >::value)
172 eigen_assert(
false &&
"Scalar type not supported by SuperLU");
176 template<
typename MatrixType>
177 static SluMatrix Map(MatrixBase<MatrixType>& _mat)
179 MatrixType& mat(_mat.derived());
180 eigen_assert( ((MatrixType::Flags&
RowMajorBit)!=
RowMajorBit) &&
"row-major dense matrices are not supported by SuperLU");
182 res.setStorageType(SLU_DN);
183 res.setScalarType<
typename MatrixType::Scalar>();
186 res.nrow = internal::convert_index<int>(mat.rows());
187 res.ncol = internal::convert_index<int>(mat.cols());
189 res.storage.lda = internal::convert_index<int>(MatrixType::IsVectorAtCompileTime ? mat.size() : mat.outerStride());
190 res.storage.values = (
void*)(mat.data());
194 template<
typename MatrixType>
195 static SluMatrix Map(SparseMatrixBase<MatrixType>& a_mat)
197 MatrixType &mat(a_mat.derived());
201 res.setStorageType(SLU_NR);
202 res.nrow = internal::convert_index<int>(mat.cols());
203 res.ncol = internal::convert_index<int>(mat.rows());
207 res.setStorageType(SLU_NC);
208 res.nrow = internal::convert_index<int>(mat.rows());
209 res.ncol = internal::convert_index<int>(mat.cols());
214 res.storage.nnz = internal::convert_index<int>(mat.nonZeros());
215 res.storage.values = mat.valuePtr();
216 res.storage.innerInd = mat.innerIndexPtr();
217 res.storage.outerInd = mat.outerIndexPtr();
219 res.setScalarType<
typename MatrixType::Scalar>();
222 if (
int(MatrixType::Flags) & int(
Upper))
224 if (
int(MatrixType::Flags) & int(
Lower))
227 eigen_assert(((
int(MatrixType::Flags) &
int(
SelfAdjoint))==0) &&
"SelfAdjoint matrix shape not supported by SuperLU");
233 template<
typename Scalar,
int Rows,
int Cols,
int Options,
int MRows,
int MCols>
234 struct SluMatrixMapHelper<Matrix<Scalar,Rows,Cols,Options,MRows,MCols> >
236 typedef Matrix<Scalar,Rows,Cols,Options,MRows,MCols> MatrixType;
237 static void run(MatrixType& mat, SluMatrix& res)
239 eigen_assert( ((Options&
RowMajor)!=
RowMajor) &&
"row-major dense matrices is not supported by SuperLU");
240 res.setStorageType(SLU_DN);
241 res.setScalarType<Scalar>();
244 res.nrow = mat.rows();
245 res.ncol = mat.cols();
247 res.storage.lda = mat.outerStride();
248 res.storage.values = mat.data();
252 template<
typename Derived>
253 struct SluMatrixMapHelper<SparseMatrixBase<Derived> >
255 typedef Derived MatrixType;
256 static void run(MatrixType& mat, SluMatrix& res)
260 res.setStorageType(SLU_NR);
261 res.nrow = mat.cols();
262 res.ncol = mat.rows();
266 res.setStorageType(SLU_NC);
267 res.nrow = mat.rows();
268 res.ncol = mat.cols();
273 res.storage.nnz = mat.nonZeros();
274 res.storage.values = mat.valuePtr();
275 res.storage.innerInd = mat.innerIndexPtr();
276 res.storage.outerInd = mat.outerIndexPtr();
278 res.setScalarType<
typename MatrixType::Scalar>();
281 if (MatrixType::Flags &
Upper)
283 if (MatrixType::Flags &
Lower)
286 eigen_assert(((MatrixType::Flags &
SelfAdjoint)==0) &&
"SelfAdjoint matrix shape not supported by SuperLU");
292 template<
typename MatrixType>
293 SluMatrix asSluMatrix(MatrixType& mat)
295 return SluMatrix::Map(mat);
299 template<
typename Scalar,
int Flags,
typename Index>
300 Map<SparseMatrix<Scalar,Flags,Index> > map_superlu(SluMatrix& sluMat)
307 return Map<SparseMatrix<Scalar,Flags,Index> >(
308 sluMat.nrow, sluMat.ncol, sluMat.storage.outerInd[outerSize],
309 sluMat.storage.outerInd, sluMat.storage.innerInd,
reinterpret_cast<Scalar*
>(sluMat.storage.values) );
318 template<
typename MatrixType_,
typename Derived>
324 using Base::m_isInitialized;
326 typedef MatrixType_ MatrixType;
327 typedef typename MatrixType::Scalar Scalar;
328 typedef typename MatrixType::RealScalar RealScalar;
329 typedef typename MatrixType::StorageIndex StorageIndex;
336 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
337 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
349 inline Index rows()
const {
return m_matrix.
rows(); }
350 inline Index cols()
const {
return m_matrix.
cols(); }
353 inline superlu_options_t&
options() {
return m_sluOptions; }
362 eigen_assert(m_isInitialized &&
"Decomposition is not initialized.");
369 derived().analyzePattern(matrix);
370 derived().factorize(matrix);
381 m_isInitialized =
true;
383 m_analysisIsOk =
true;
384 m_factorizationIsOk =
false;
387 template<
typename Stream>
388 void dumpMemory(Stream& )
393 void initFactorization(
const MatrixType& a)
395 set_default_options(&this->m_sluOptions);
397 const Index size = a.rows();
400 m_sluA = internal::asSluMatrix(m_matrix);
407 m_sluEtree.resize(size);
410 m_sluB.setStorageType(SLU_DN);
411 m_sluB.setScalarType<Scalar>();
412 m_sluB.Mtype = SLU_GE;
413 m_sluB.storage.values = 0;
416 m_sluB.storage.lda = internal::convert_index<int>(size);
419 m_extractedDataAreDirty =
true;
425 m_isInitialized =
false;
430 void extractData()
const;
435 Destroy_SuperNode_Matrix(&m_sluL);
437 Destroy_CompCol_Matrix(&m_sluU);
442 memset(&m_sluL,0,
sizeof m_sluL);
443 memset(&m_sluU,0,
sizeof m_sluU);
447 mutable LUMatrixType m_l;
448 mutable LUMatrixType m_u;
449 mutable IntColVectorType m_p;
450 mutable IntRowVectorType m_q;
452 mutable LUMatrixType m_matrix;
453 mutable SluMatrix m_sluA;
454 mutable SuperMatrix m_sluL, m_sluU;
455 mutable SluMatrix m_sluB, m_sluX;
456 mutable SuperLUStat_t m_sluStat;
457 mutable superlu_options_t m_sluOptions;
458 mutable std::vector<int> m_sluEtree;
459 mutable Matrix<RealScalar,Dynamic,1> m_sluRscale, m_sluCscale;
460 mutable Matrix<RealScalar,Dynamic,1> m_sluFerr, m_sluBerr;
461 mutable char m_sluEqued;
464 int m_factorizationIsOk;
466 mutable bool m_extractedDataAreDirty;
469 SuperLUBase(SuperLUBase& ) { }
489 template<
typename MatrixType_>
494 typedef MatrixType_ MatrixType;
495 typedef typename Base::Scalar Scalar;
496 typedef typename Base::RealScalar RealScalar;
497 typedef typename Base::StorageIndex StorageIndex;
506 using Base::_solve_impl;
510 explicit SuperLU(
const MatrixType& matrix) :
Base()
529 m_isInitialized =
false;
539 void factorize(
const MatrixType& matrix);
542 template<
typename Rhs,
typename Dest>
545 inline const LMatrixType& matrixL()
const
547 if (m_extractedDataAreDirty) this->extractData();
551 inline const UMatrixType& matrixU()
const
553 if (m_extractedDataAreDirty) this->extractData();
557 inline const IntColVectorType& permutationP()
const
559 if (m_extractedDataAreDirty) this->extractData();
563 inline const IntRowVectorType& permutationQ()
const
565 if (m_extractedDataAreDirty) this->extractData();
569 Scalar determinant()
const;
573 using Base::m_matrix;
574 using Base::m_sluOptions;
580 using Base::m_sluEtree;
581 using Base::m_sluEqued;
582 using Base::m_sluRscale;
583 using Base::m_sluCscale;
586 using Base::m_sluStat;
587 using Base::m_sluFerr;
588 using Base::m_sluBerr;
592 using Base::m_analysisIsOk;
593 using Base::m_factorizationIsOk;
594 using Base::m_extractedDataAreDirty;
595 using Base::m_isInitialized;
602 set_default_options(&this->m_sluOptions);
603 m_sluOptions.PrintStat = NO;
604 m_sluOptions.ConditionNumber = NO;
605 m_sluOptions.Trans = NOTRANS;
606 m_sluOptions.ColPerm = COLAMD;
611 SuperLU(SuperLU& ) { }
614 template<
typename MatrixType>
617 eigen_assert(m_analysisIsOk &&
"You must first call analyzePattern()");
624 this->initFactorization(a);
626 m_sluOptions.ColPerm = COLAMD;
628 RealScalar recip_pivot_growth, rcond;
629 RealScalar ferr, berr;
631 StatInit(&m_sluStat);
632 SuperLU_gssvx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],
633 &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],
637 &recip_pivot_growth, &rcond,
639 &m_sluStat, &info, Scalar());
640 StatFree(&m_sluStat);
642 m_extractedDataAreDirty =
true;
646 m_factorizationIsOk =
true;
649 template<
typename MatrixType>
650 template<
typename Rhs,
typename Dest>
653 eigen_assert(m_factorizationIsOk &&
"The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()");
656 eigen_assert(m_matrix.rows()==b.
rows());
658 m_sluOptions.Trans = NOTRANS;
659 m_sluOptions.Fact = FACTORED;
660 m_sluOptions.IterRefine = NOREFINE;
663 m_sluFerr.resize(rhsCols);
664 m_sluBerr.resize(rhsCols);
669 m_sluB = SluMatrix::Map(b_ref.const_cast_derived());
670 m_sluX = SluMatrix::Map(x_ref.const_cast_derived());
672 typename Rhs::PlainObject b_cpy;
676 m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());
679 StatInit(&m_sluStat);
681 RealScalar recip_pivot_growth, rcond;
682 SuperLU_gssvx(&m_sluOptions, &m_sluA,
683 m_q.data(), m_p.data(),
684 &m_sluEtree[0], &m_sluEqued,
685 &m_sluRscale[0], &m_sluCscale[0],
689 &recip_pivot_growth, &rcond,
690 &m_sluFerr[0], &m_sluBerr[0],
691 &m_sluStat, &info, Scalar());
692 StatFree(&m_sluStat);
694 if(x.
derived().data() != x_ref.data())
707 template<
typename MatrixType,
typename Derived>
708 void SuperLUBase<MatrixType,Derived>::extractData()
const
710 eigen_assert(m_factorizationIsOk &&
"The decomposition is not in a valid state for extracting factors, you must first call either compute() or analyzePattern()/factorize()");
711 if (m_extractedDataAreDirty)
714 int fsupc, istart, nsupr;
715 int lastl = 0, lastu = 0;
716 SCformat *Lstore =
static_cast<SCformat*
>(m_sluL.Store);
717 NCformat *Ustore =
static_cast<NCformat*
>(m_sluU.Store);
720 const Index size = m_matrix.rows();
721 m_l.resize(size,size);
722 m_l.resizeNonZeros(Lstore->nnz);
723 m_u.resize(size,size);
724 m_u.resizeNonZeros(Ustore->nnz);
726 int* Lcol = m_l.outerIndexPtr();
727 int* Lrow = m_l.innerIndexPtr();
728 Scalar* Lval = m_l.valuePtr();
730 int* Ucol = m_u.outerIndexPtr();
731 int* Urow = m_u.innerIndexPtr();
732 Scalar* Uval = m_u.valuePtr();
738 for (
int k = 0; k <= Lstore->nsuper; ++k)
740 fsupc = L_FST_SUPC(k);
741 istart = L_SUB_START(fsupc);
742 nsupr = L_SUB_START(fsupc+1) - istart;
746 for (
int j = fsupc; j < L_FST_SUPC(k+1); ++j)
748 SNptr = &((Scalar*)Lstore->nzval)[L_NZ_START(j)];
751 for (
int i = U_NZ_START(j); i < U_NZ_START(j+1); ++i)
753 Uval[lastu] = ((Scalar*)Ustore->nzval)[i];
755 if (Uval[lastu] != 0.0)
756 Urow[lastu++] = U_SUB(i);
758 for (
int i = 0; i < upper; ++i)
761 Uval[lastu] = SNptr[i];
763 if (Uval[lastu] != 0.0)
764 Urow[lastu++] = L_SUB(istart+i);
770 Lrow[lastl++] = L_SUB(istart + upper - 1);
771 for (
int i = upper; i < nsupr; ++i)
773 Lval[lastl] = SNptr[i];
775 if (Lval[lastl] != 0.0)
776 Lrow[lastl++] = L_SUB(istart+i);
786 m_l.resizeNonZeros(lastl);
787 m_u.resizeNonZeros(lastu);
789 m_extractedDataAreDirty =
false;
793 template<
typename MatrixType>
794 typename SuperLU<MatrixType>::Scalar SuperLU<MatrixType>::determinant()
const
796 eigen_assert(m_factorizationIsOk &&
"The decomposition is not in a valid state for computing the determinant, you must first call either compute() or analyzePattern()/factorize()");
798 if (m_extractedDataAreDirty)
801 Scalar det = Scalar(1);
802 for (
int j=0; j<m_u.cols(); ++j)
804 if (m_u.outerIndexPtr()[j+1]-m_u.outerIndexPtr()[j] > 0)
806 int lastId = m_u.outerIndexPtr()[j+1]-1;
807 eigen_assert(m_u.innerIndexPtr()[lastId]<=j);
808 if (m_u.innerIndexPtr()[lastId]==j)
809 det *= m_u.valuePtr()[lastId];
812 if(PermutationMap(m_p.data(),m_p.size()).determinant()*PermutationMap(m_q.data(),m_q.size()).determinant()<0)
815 return det/m_sluRscale.prod()/m_sluCscale.prod();
820 #ifdef EIGEN_PARSED_BY_DOXYGEN
821 #define EIGEN_SUPERLU_HAS_ILU
824 #ifdef EIGEN_SUPERLU_HAS_ILU
842 template<
typename MatrixType_>
847 typedef MatrixType_ MatrixType;
848 typedef typename Base::Scalar Scalar;
849 typedef typename Base::RealScalar RealScalar;
852 using Base::_solve_impl;
883 void factorize(
const MatrixType& matrix);
885 #ifndef EIGEN_PARSED_BY_DOXYGEN
887 template<
typename Rhs,
typename Dest>
893 using Base::m_matrix;
894 using Base::m_sluOptions;
900 using Base::m_sluEtree;
901 using Base::m_sluEqued;
902 using Base::m_sluRscale;
903 using Base::m_sluCscale;
906 using Base::m_sluStat;
907 using Base::m_sluFerr;
908 using Base::m_sluBerr;
912 using Base::m_analysisIsOk;
913 using Base::m_factorizationIsOk;
914 using Base::m_extractedDataAreDirty;
915 using Base::m_isInitialized;
922 ilu_set_default_options(&m_sluOptions);
923 m_sluOptions.PrintStat = NO;
924 m_sluOptions.ConditionNumber = NO;
925 m_sluOptions.Trans = NOTRANS;
926 m_sluOptions.ColPerm = MMD_AT_PLUS_A;
929 m_sluOptions.ILU_MILU = SILU;
933 m_sluOptions.ILU_DropRule = DROP_BASIC;
938 SuperILU(SuperILU& ) { }
941 template<
typename MatrixType>
944 eigen_assert(m_analysisIsOk &&
"You must first call analyzePattern()");
951 this->initFactorization(a);
954 RealScalar recip_pivot_growth, rcond;
956 StatInit(&m_sluStat);
957 SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],
958 &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],
962 &recip_pivot_growth, &rcond,
963 &m_sluStat, &info, Scalar());
964 StatFree(&m_sluStat);
968 m_factorizationIsOk =
true;
971 #ifndef EIGEN_PARSED_BY_DOXYGEN
972 template<
typename MatrixType>
973 template<
typename Rhs,
typename Dest>
976 eigen_assert(m_factorizationIsOk &&
"The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()");
978 const int rhsCols = b.
cols();
979 eigen_assert(m_matrix.rows()==b.
rows());
981 m_sluOptions.Trans = NOTRANS;
982 m_sluOptions.Fact = FACTORED;
983 m_sluOptions.IterRefine = NOREFINE;
985 m_sluFerr.resize(rhsCols);
986 m_sluBerr.resize(rhsCols);
991 m_sluB = SluMatrix::Map(b_ref.const_cast_derived());
992 m_sluX = SluMatrix::Map(x_ref.const_cast_derived());
994 typename Rhs::PlainObject b_cpy;
998 m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());
1002 RealScalar recip_pivot_growth, rcond;
1004 StatInit(&m_sluStat);
1005 SuperLU_gsisx(&m_sluOptions, &m_sluA,
1006 m_q.data(), m_p.data(),
1007 &m_sluEtree[0], &m_sluEqued,
1008 &m_sluRscale[0], &m_sluCscale[0],
1012 &recip_pivot_growth, &rcond,
1013 &m_sluStat, &info, Scalar());
1014 StatFree(&m_sluStat);
1016 if(x.
derived().data() != x_ref.data())
Derived & derived()
Definition: EigenBase.h:48
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: EigenBase.h:65
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: EigenBase.h:62
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:98
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
void resize(Index rows, Index cols)
Definition: PlainObjectBase.h:283
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:285
Index cols() const
Definition: SparseMatrix.h:142
Index rows() const
Definition: SparseMatrix.h:140
A base class for sparse solvers.
Definition: SparseSolverBase.h:70
A sparse direct incomplete LU factorization and solver based on the SuperLU library.
Definition: SuperLUSupport.h:844
void analyzePattern(const MatrixType &matrix)
Definition: SuperLUSupport.h:872
void factorize(const MatrixType &matrix)
Definition: SuperLUSupport.h:942
The base class for the direct and incomplete LU factorization of SuperLU.
Definition: SuperLUSupport.h:320
void compute(const MatrixType &matrix)
Definition: SuperLUSupport.h:367
ComputationInfo info() const
Reports whether previous computation was successful.
Definition: SuperLUSupport.h:360
superlu_options_t & options()
Definition: SuperLUSupport.h:353
void analyzePattern(const MatrixType &)
Definition: SuperLUSupport.h:379
A sparse direct LU factorization and solver based on the SuperLU library.
Definition: SuperLUSupport.h:491
void factorize(const MatrixType &matrix)
Definition: SuperLUSupport.h:615
void analyzePattern(const MatrixType &matrix)
Definition: SuperLUSupport.h:526
Expression of a triangular part in a matrix.
Definition: TriangularMatrix.h:190
ComputationInfo
Definition: Constants.h:442
@ SelfAdjoint
Definition: Constants.h:227
@ Lower
Definition: Constants.h:211
@ Upper
Definition: Constants.h:213
@ NumericalIssue
Definition: Constants.h:446
@ InvalidInput
Definition: Constants.h:451
@ Success
Definition: Constants.h:444
@ ColMajor
Definition: Constants.h:321
@ RowMajor
Definition: Constants.h:323
const unsigned int RowMajorBit
Definition: Constants.h:68
Namespace containing all symbols from the Eigen library.
Definition: Core:139
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:59
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:231