53 #ifndef AMESOS2_SUPERLU_DEF_HPP
54 #define AMESOS2_SUPERLU_DEF_HPP
56 #include <Teuchos_Tuple.hpp>
57 #include <Teuchos_ParameterList.hpp>
58 #include <Teuchos_StandardParameterEntryValidators.hpp>
66 template <
class Matrix,
class Vector>
68 Teuchos::RCP<const Matrix> A,
69 Teuchos::RCP<Vector> X,
70 Teuchos::RCP<const Vector> B )
75 , is_contiguous_(true)
82 SLU::set_default_options(&(data_.options));
84 data_.options.PrintStat = SLU::NO;
86 SLU::StatInit(&(data_.stat));
94 data_.relax = SLU::sp_ienv(2);
95 data_.panel_size = SLU::sp_ienv(1);
100 data_.U.Store = NULL;
101 data_.X.Store = NULL;
102 data_.B.Store = NULL;
108 template <
class Matrix,
class Vector>
116 SLU::StatFree( &(data_.stat) ) ;
119 if ( data_.A.Store != NULL ){
120 SLU::Destroy_SuperMatrix_Store( &(data_.A) );
124 if ( data_.L.Store != NULL ){
125 SLU::Destroy_SuperNode_Matrix( &(data_.L) );
126 SLU::Destroy_CompCol_Matrix( &(data_.U) );
130 template <
class Matrix,
class Vector>
134 std::ostringstream oss;
135 oss <<
"SuperLU solver interface";
137 oss <<
", \"ILUTP\" : {";
138 oss <<
"drop tol = " << data_.options.ILU_DropTol;
139 oss <<
", fill factor = " << data_.options.ILU_FillFactor;
140 oss <<
", fill tol = " << data_.options.ILU_FillTol;
141 switch(data_.options.ILU_MILU) {
153 oss <<
", regular ILU";
155 switch(data_.options.ILU_Norm) {
164 oss <<
", infinity-norm";
168 oss <<
", direct solve";
184 template<
class Matrix,
class Vector>
196 int permc_spec = data_.options.ColPerm;
197 if ( permc_spec != SLU::MY_PERMC && this->root_ ){
198 #ifdef HAVE_AMESOS2_TIMERS
199 Teuchos::TimeMonitor preOrderTimer(this->timers_.preOrderTime_);
202 SLU::get_perm_c(permc_spec, &(data_.A), data_.perm_c.getRawPtr());
209 template <
class Matrix,
class Vector>
224 same_symbolic_ =
false;
225 data_.options.Fact = SLU::DOFACT;
231 template <
class Matrix,
class Vector>
240 if ( !same_symbolic_ && data_.L.Store != NULL ){
241 SLU::Destroy_SuperNode_Matrix( &(data_.L) );
242 SLU::Destroy_CompCol_Matrix( &(data_.U) );
243 data_.L.Store = NULL;
244 data_.U.Store = NULL;
247 if( same_symbolic_ ) data_.options.Fact = SLU::SamePattern_SameRowPerm;
252 #ifdef HAVE_AMESOS2_DEBUG
253 TEUCHOS_TEST_FOR_EXCEPTION( data_.A.ncol != as<int>(this->globalNumCols_),
255 "Error in converting to SuperLU SuperMatrix: wrong number of global columns." );
256 TEUCHOS_TEST_FOR_EXCEPTION( data_.A.nrow != as<int>(this->globalNumRows_),
258 "Error in converting to SuperLU SuperMatrix: wrong number of global rows." );
261 if( data_.options.Equil == SLU::YES ){
262 magnitude_type rowcnd, colcnd, amax;
266 function_map::gsequ(&(data_.A), data_.R.getRawPtr(),
267 data_.C.getRawPtr(), &rowcnd, &colcnd,
269 TEUCHOS_TEST_FOR_EXCEPTION
270 (info2 < 0, std::runtime_error,
271 "SuperLU's gsequ function returned with status " << info2 <<
" < 0."
272 " This means that argument " << (-info2) <<
" given to the function"
273 " had an illegal value.");
275 if (info2 <= data_.A.nrow) {
276 TEUCHOS_TEST_FOR_EXCEPTION
277 (
true, std::runtime_error,
"SuperLU's gsequ function returned with "
278 "info = " << info2 <<
" > 0, and info <= A.nrow = " << data_.A.nrow
279 <<
". This means that row " << info2 <<
" of A is exactly zero.");
281 else if (info2 > data_.A.ncol) {
282 TEUCHOS_TEST_FOR_EXCEPTION
283 (
true, std::runtime_error,
"SuperLU's gsequ function returned with "
284 "info = " << info2 <<
" > 0, and info > A.ncol = " << data_.A.ncol
285 <<
". This means that column " << (info2 - data_.A.nrow) <<
" of "
286 "A is exactly zero.");
289 TEUCHOS_TEST_FOR_EXCEPTION
290 (
true, std::runtime_error,
"SuperLU's gsequ function returned "
291 "with info = " << info2 <<
" > 0, but its value is not in the "
292 "range permitted by the documentation. This should never happen "
293 "(it appears to be SuperLU's fault).");
298 function_map::laqgs(&(data_.A), data_.R.getRawPtr(),
299 data_.C.getRawPtr(), rowcnd, colcnd,
300 amax, &(data_.equed));
309 SLU::sp_preorder(&(data_.options), &(data_.A), data_.perm_c.getRawPtr(),
310 data_.etree.getRawPtr(), &(data_.AC));
313 #ifdef HAVE_AMESOS2_TIMERS
314 Teuchos::TimeMonitor numFactTimer(this->timers_.numFactTime_);
317 #ifdef HAVE_AMESOS2_VERBOSE_DEBUG
318 std::cout <<
"Superlu:: Before numeric factorization" << std::endl;
319 std::cout <<
"nzvals_ : " << nzvals_.toString() << std::endl;
320 std::cout <<
"rowind_ : " << rowind_.toString() << std::endl;
321 std::cout <<
"colptr_ : " << colptr_.toString() << std::endl;
324 if(ILU_Flag_==
false) {
325 function_map::gstrf(&(data_.options), &(data_.AC),
326 data_.relax, data_.panel_size, data_.etree.getRawPtr(),
327 NULL, 0, data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(),
328 &(data_.L), &(data_.U),
329 #ifdef HAVE_AMESOS2_SUPERLU5_API
332 &(data_.stat), &info);
335 function_map::gsitrf(&(data_.options), &(data_.AC),
336 data_.relax, data_.panel_size, data_.etree.getRawPtr(),
337 NULL, 0, data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(),
338 &(data_.L), &(data_.U),
339 #ifdef HAVE_AMESOS2_SUPERLU5_API
342 &(data_.stat), &info);
347 SLU::Destroy_CompCol_Permuted( &(data_.AC) );
350 this->setNnzLU( as<size_t>(((SLU::SCformat*)data_.L.Store)->nnz +
351 ((SLU::NCformat*)data_.U.Store)->nnz) );
355 Teuchos::broadcast(*(this->matrixA_->getComm()), 0, &info);
357 global_size_type info_st = as<global_size_type>(info);
358 TEUCHOS_TEST_FOR_EXCEPTION( (info_st > 0) && (info_st <= this->globalNumCols_),
360 "Factorization complete, but matrix is singular. Division by zero eminent");
361 TEUCHOS_TEST_FOR_EXCEPTION( (info_st > 0) && (info_st > this->globalNumCols_),
363 "Memory allocation failure in Superlu factorization");
365 data_.options.Fact = SLU::FACTORED;
366 same_symbolic_ =
true;
372 template <
class Matrix,
class Vector>
379 const global_size_type ld_rhs = this->root_ ? X->getGlobalLength() : 0;
380 const size_t nrhs = X->getGlobalNumVectors();
382 const size_t val_store_size = as<size_t>(ld_rhs * nrhs);
383 Teuchos::Array<slu_type> xValues(val_store_size);
384 Teuchos::Array<slu_type> bValues(val_store_size);
387 #ifdef HAVE_AMESOS2_TIMERS
388 Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_);
389 Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ );
391 if ( is_contiguous_ ==
true ) {
393 slu_type>::do_get(B, bValues(),
395 ROOTED, this->rowIndexBase_);
399 slu_type>::do_get(B, bValues(),
401 CONTIGUOUS_AND_ROOTED, this->rowIndexBase_);
407 magnitude_type rpg, rcond;
409 data_.ferr.resize(nrhs);
410 data_.berr.resize(nrhs);
413 #ifdef HAVE_AMESOS2_TIMERS
414 Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_);
416 SLU::Dtype_t dtype = type_map::dtype;
417 int i_ld_rhs = as<int>(ld_rhs);
418 function_map::create_Dense_Matrix(&(data_.B), i_ld_rhs, as<int>(nrhs),
419 bValues.getRawPtr(), i_ld_rhs,
420 SLU::SLU_DN, dtype, SLU::SLU_GE);
421 function_map::create_Dense_Matrix(&(data_.X), i_ld_rhs, as<int>(nrhs),
422 xValues.getRawPtr(), i_ld_rhs,
423 SLU::SLU_DN, dtype, SLU::SLU_GE);
430 #ifdef HAVE_AMESOS2_TIMERS
431 Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_);
434 if(ILU_Flag_==
false) {
435 function_map::gssvx(&(data_.options), &(data_.A),
436 data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(),
437 data_.etree.getRawPtr(), &(data_.equed), data_.R.getRawPtr(),
438 data_.C.getRawPtr(), &(data_.L), &(data_.U), NULL, 0, &(data_.B),
439 &(data_.X), &rpg, &rcond, data_.ferr.getRawPtr(),
440 data_.berr.getRawPtr(),
441 #ifdef HAVE_AMESOS2_SUPERLU5_API
444 &(data_.mem_usage), &(data_.stat), &ierr);
447 function_map::gsisx(&(data_.options), &(data_.A),
448 data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(),
449 data_.etree.getRawPtr(), &(data_.equed), data_.R.getRawPtr(),
450 data_.C.getRawPtr(), &(data_.L), &(data_.U), NULL, 0, &(data_.B),
451 &(data_.X), &rpg, &rcond,
452 #ifdef HAVE_AMESOS2_SUPERLU5_API
455 &(data_.mem_usage), &(data_.stat), &ierr);
461 SLU::Destroy_SuperMatrix_Store( &(data_.X) );
462 SLU::Destroy_SuperMatrix_Store( &(data_.B) );
463 data_.X.Store = NULL;
464 data_.B.Store = NULL;
468 Teuchos::broadcast(*(this->getComm()), 0, &ierr);
470 global_size_type ierr_st = as<global_size_type>(ierr);
471 TEUCHOS_TEST_FOR_EXCEPTION( ierr < 0,
472 std::invalid_argument,
473 "Argument " << -ierr <<
" to SuperLU xgssvx had illegal value" );
474 TEUCHOS_TEST_FOR_EXCEPTION( ierr > 0 && ierr_st <= this->globalNumCols_,
476 "Factorization complete, but U is exactly singular" );
477 TEUCHOS_TEST_FOR_EXCEPTION( ierr > 0 && ierr_st > this->globalNumCols_ + 1,
479 "SuperLU allocated " << ierr - this->globalNumCols_ <<
" bytes of "
480 "memory before allocation failure occured." );
484 #ifdef HAVE_AMESOS2_TIMERS
485 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
488 if ( is_contiguous_ ==
true ) {
492 ROOTED, this->rowIndexBase_);
498 CONTIGUOUS_AND_ROOTED, this->rowIndexBase_);
507 template <
class Matrix,
class Vector>
514 return( this->matrixA_->getGlobalNumRows() == this->matrixA_->getGlobalNumCols() );
518 template <
class Matrix,
class Vector>
523 using Teuchos::getIntegralValue;
524 using Teuchos::ParameterEntryValidator;
526 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
528 ILU_Flag_ = parameterList->get<
bool>(
"ILU_Flag",
false);
530 SLU::ilu_set_default_options(&(data_.options));
532 data_.options.PrintStat = SLU::NO;
535 data_.options.Trans = this->control_.useTranspose_ ? SLU::TRANS : SLU::NOTRANS;
537 if( parameterList->isParameter(
"Trans") ){
538 RCP<const ParameterEntryValidator> trans_validator = valid_params->getEntry(
"Trans").validator();
539 parameterList->getEntry(
"Trans").setValidator(trans_validator);
541 data_.options.Trans = getIntegralValue<SLU::trans_t>(*parameterList,
"Trans");
544 if( parameterList->isParameter(
"IterRefine") ){
545 RCP<const ParameterEntryValidator> refine_validator = valid_params->getEntry(
"IterRefine").validator();
546 parameterList->getEntry(
"IterRefine").setValidator(refine_validator);
548 data_.options.IterRefine = getIntegralValue<SLU::IterRefine_t>(*parameterList,
"IterRefine");
551 if( parameterList->isParameter(
"ColPerm") ){
552 RCP<const ParameterEntryValidator> colperm_validator = valid_params->getEntry(
"ColPerm").validator();
553 parameterList->getEntry(
"ColPerm").setValidator(colperm_validator);
555 data_.options.ColPerm = getIntegralValue<SLU::colperm_t>(*parameterList,
"ColPerm");
558 data_.options.DiagPivotThresh = parameterList->get<
double>(
"DiagPivotThresh", 1.0);
560 bool equil = parameterList->get<
bool>(
"Equil",
true);
561 data_.options.Equil = equil ? SLU::YES : SLU::NO;
563 bool symmetric_mode = parameterList->get<
bool>(
"SymmetricMode",
false);
564 data_.options.SymmetricMode = symmetric_mode ? SLU::YES : SLU::NO;
567 if( parameterList->isParameter(
"RowPerm") ){
568 RCP<const ParameterEntryValidator> rowperm_validator = valid_params->getEntry(
"RowPerm").validator();
569 parameterList->getEntry(
"RowPerm").setValidator(rowperm_validator);
570 data_.options.RowPerm = getIntegralValue<SLU::rowperm_t>(*parameterList,
"RowPerm");
579 data_.options.ILU_DropTol = parameterList->get<
double>(
"ILU_DropTol", 0.0001);
581 data_.options.ILU_FillFactor = parameterList->get<
double>(
"ILU_FillFactor", 10.0);
583 if( parameterList->isParameter(
"ILU_Norm") ) {
584 RCP<const ParameterEntryValidator> norm_validator = valid_params->getEntry(
"ILU_Norm").validator();
585 parameterList->getEntry(
"ILU_Norm").setValidator(norm_validator);
586 data_.options.ILU_Norm = getIntegralValue<SLU::norm_t>(*parameterList,
"ILU_Norm");
589 if( parameterList->isParameter(
"ILU_MILU") ) {
590 RCP<const ParameterEntryValidator> milu_validator = valid_params->getEntry(
"ILU_MILU").validator();
591 parameterList->getEntry(
"ILU_MILU").setValidator(milu_validator);
592 data_.options.ILU_MILU = getIntegralValue<SLU::milu_t>(*parameterList,
"ILU_MILU");
595 data_.options.ILU_FillTol = parameterList->get<
double>(
"ILU_FillTol", 0.01);
597 if( parameterList->isParameter(
"IsContiguous") ){
598 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
603 template <
class Matrix,
class Vector>
604 Teuchos::RCP<const Teuchos::ParameterList>
608 using Teuchos::tuple;
609 using Teuchos::ParameterList;
610 using Teuchos::EnhancedNumberValidator;
611 using Teuchos::setStringToIntegralParameter;
612 using Teuchos::stringToIntegralParameterEntryValidator;
614 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
616 if( is_null(valid_params) ){
617 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
619 setStringToIntegralParameter<SLU::trans_t>(
"Trans",
"NOTRANS",
620 "Solve for the transpose system or not",
621 tuple<string>(
"TRANS",
"NOTRANS",
"CONJ"),
622 tuple<string>(
"Solve with transpose",
623 "Do not solve with transpose",
624 "Solve with the conjugate transpose"),
625 tuple<SLU::trans_t>(SLU::TRANS,
630 setStringToIntegralParameter<SLU::IterRefine_t>(
"IterRefine",
"NOREFINE",
631 "Type of iterative refinement to use",
632 tuple<string>(
"NOREFINE",
"SLU_SINGLE",
"SLU_DOUBLE"),
633 tuple<string>(
"Do not use iterative refinement",
634 "Do single iterative refinement",
635 "Do double iterative refinement"),
636 tuple<SLU::IterRefine_t>(SLU::NOREFINE,
642 setStringToIntegralParameter<SLU::colperm_t>(
"ColPerm",
"COLAMD",
643 "Specifies how to permute the columns of the "
644 "matrix for sparsity preservation",
645 tuple<string>(
"NATURAL",
"MMD_AT_PLUS_A",
646 "MMD_ATA",
"COLAMD"),
647 tuple<string>(
"Natural ordering",
648 "Minimum degree ordering on A^T + A",
649 "Minimum degree ordering on A^T A",
650 "Approximate minimum degree column ordering"),
651 tuple<SLU::colperm_t>(SLU::NATURAL,
657 Teuchos::RCP<EnhancedNumberValidator<double> > diag_pivot_thresh_validator
658 = Teuchos::rcp(
new EnhancedNumberValidator<double>(0.0, 1.0) );
659 pl->set(
"DiagPivotThresh", 1.0,
660 "Specifies the threshold used for a diagonal entry to be an acceptable pivot",
661 diag_pivot_thresh_validator);
663 pl->set(
"Equil",
true,
"Whether to equilibrate the system before solve");
665 pl->set(
"SymmetricMode",
false,
666 "Specifies whether to use the symmetric mode. "
667 "Gives preference to diagonal pivots and uses "
668 "an (A^T + A)-based column permutation.");
672 setStringToIntegralParameter<SLU::rowperm_t>(
"RowPerm",
"LargeDiag",
673 "Type of row permutation strategy to use",
674 tuple<string>(
"NOROWPERM",
"LargeDiag",
"MY_PERMR"),
675 tuple<string>(
"Use natural ordering",
676 "Use weighted bipartite matching algorithm",
677 "Use the ordering given in perm_r input"),
678 tuple<SLU::rowperm_t>(SLU::NOROWPERM,
697 pl->set(
"ILU_DropTol", 0.0001,
"ILUT drop tolerance");
699 pl->set(
"ILU_FillFactor", 10.0,
"ILUT fill factor");
701 setStringToIntegralParameter<SLU::norm_t>(
"ILU_Norm",
"INF_NORM",
702 "Type of norm to use",
703 tuple<string>(
"ONE_NORM",
"TWO_NORM",
"INF_NORM"),
704 tuple<string>(
"1-norm",
"2-norm",
"inf-norm"),
705 tuple<SLU::norm_t>(SLU::ONE_NORM,SLU::TWO_NORM,SLU::INF_NORM),
708 setStringToIntegralParameter<SLU::milu_t>(
"ILU_MILU",
"SILU",
709 "Type of modified ILU to use",
710 tuple<string>(
"SILU",
"SMILU_1",
"SMILU_2",
"SMILU_3"),
711 tuple<string>(
"Regular ILU",
"MILU 1",
"MILU 2",
"MILU 3"),
712 tuple<SLU::milu_t>(SLU::SILU,SLU::SMILU_1,SLU::SMILU_2,
716 pl->set(
"ILU_FillTol", 0.01,
"ILUT fill tolerance");
718 pl->set(
"ILU_Flag",
false,
"ILU flag: if true, run ILU routines");
720 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
729 template <
class Matrix,
class Vector>
735 #ifdef HAVE_AMESOS2_TIMERS
736 Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
740 if( current_phase == SYMBFACT )
return false;
743 if( data_.A.Store != NULL ){
744 SLU::Destroy_SuperMatrix_Store( &(data_.A) );
745 data_.A.Store = NULL;
750 nzvals_.resize(this->globalNumNonZeros_);
751 rowind_.resize(this->globalNumNonZeros_);
752 colptr_.resize(this->globalNumCols_ + 1);
757 #ifdef HAVE_AMESOS2_TIMERS
758 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
761 TEUCHOS_TEST_FOR_EXCEPTION( this->rowIndexBase_ != this->columnIndexBase_,
763 "Row and column maps have different indexbase ");
765 if ( is_contiguous_ ==
true ) {
768 nzvals_(), rowind_(),
769 colptr_(), nnz_ret, ROOTED,
771 this->rowIndexBase_);
776 nzvals_(), rowind_(),
777 colptr_(), nnz_ret, CONTIGUOUS_AND_ROOTED,
779 this->rowIndexBase_);
784 SLU::Dtype_t dtype = type_map::dtype;
787 TEUCHOS_TEST_FOR_EXCEPTION( nnz_ret != as<int>(this->globalNumNonZeros_),
789 "Did not get the expected number of non-zero vals");
791 function_map::create_CompCol_Matrix( &(data_.A),
792 this->globalNumRows_, this->globalNumCols_,
797 SLU::SLU_NC, dtype, SLU::SLU_GE);
804 template<
class Matrix,
class Vector>
810 #endif // AMESOS2_SUPERLU_DEF_HPP
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers...
Definition: Amesos2_SolverCore_decl.hpp:105
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_Superlu_def.hpp:731
EPhase
Used to indicate a phase in the direct solution.
Definition: Amesos2_TypeDecl.hpp:65
int numericFactorization_impl()
Superlu specific numeric factorization.
Definition: Amesos2_Superlu_def.hpp:233
global_size_type globalNumCols_
Number of global columns in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:478
~Superlu()
Destructor.
Definition: Amesos2_Superlu_def.hpp:109
global_size_type globalNumRows_
Number of global rows in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:475
Amesos2 Superlu declarations.
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_Superlu_def.hpp:509
Helper class for getting 1-D copies of multivectors.
Definition: Amesos2_MultiVecAdapter_decl.hpp:266
Superlu(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition: Amesos2_Superlu_def.hpp:67
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_Superlu_def.hpp:605
A generic helper class for getting a CCS representation of a Matrix.
Definition: Amesos2_Util.hpp:654
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
Superlu specific solve.
Definition: Amesos2_Superlu_def.hpp:374
A Matrix adapter interface for Amesos2.
Definition: Amesos2_MatrixAdapter_decl.hpp:76
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_Superlu_def.hpp:520
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition: Amesos2_Superlu_def.hpp:186
Helper class for putting 1-D data arrays into multivectors.
Definition: Amesos2_MultiVecAdapter_decl.hpp:322
A templated MultiVector class adapter for Amesos2.
Definition: Amesos2_MultiVecAdapter_decl.hpp:176
std::string description() const
Returns a short description of this Solver.
Definition: Amesos2_Superlu_def.hpp:132
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using Superlu.
Definition: Amesos2_Superlu_def.hpp:211
Amesos2 interface to the SuperLU package.
Definition: Amesos2_Superlu_decl.hpp:73