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), &(data_.stat), &info);
331 function_map::gsitrf(&(data_.options), &(data_.AC),
332 data_.relax, data_.panel_size, data_.etree.getRawPtr(),
333 NULL, 0, data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(),
334 &(data_.L), &(data_.U), &(data_.stat), &info);
339 SLU::Destroy_CompCol_Permuted( &(data_.AC) );
342 this->
setNnzLU( as<size_t>(((SLU::SCformat*)data_.L.Store)->nnz +
343 ((SLU::NCformat*)data_.U.Store)->nnz) );
347 Teuchos::broadcast(*(this->
matrixA_->getComm()), 0, &info);
349 global_size_type info_st = as<global_size_type>(info);
350 TEUCHOS_TEST_FOR_EXCEPTION( (info_st > 0) && (info_st <= this->
globalNumCols_),
352 "Factorization complete, but matrix is singular. Division by zero eminent");
353 TEUCHOS_TEST_FOR_EXCEPTION( (info_st > 0) && (info_st > this->globalNumCols_),
355 "Memory allocation failure in Superlu factorization");
357 data_.options.Fact = SLU::FACTORED;
358 same_symbolic_ =
true;
364 template <
class Matrix,
class Vector>
371 const global_size_type ld_rhs = this->
root_ ? X->getGlobalLength() : 0;
372 const size_t nrhs = X->getGlobalNumVectors();
374 const size_t val_store_size = as<size_t>(ld_rhs * nrhs);
375 Teuchos::Array<slu_type> xValues(val_store_size);
376 Teuchos::Array<slu_type> bValues(val_store_size);
379 #ifdef HAVE_AMESOS2_TIMERS 380 Teuchos::TimeMonitor mvConvTimer(this->
timers_.vecConvTime_);
381 Teuchos::TimeMonitor redistTimer( this->
timers_.vecRedistTime_ );
383 if ( is_contiguous_ ==
true ) {
385 slu_type>::do_get(B, bValues(),
391 slu_type>::do_get(B, bValues(),
399 magnitude_type rpg, rcond;
401 data_.ferr.resize(nrhs);
402 data_.berr.resize(nrhs);
405 #ifdef HAVE_AMESOS2_TIMERS 406 Teuchos::TimeMonitor mvConvTimer(this->
timers_.vecConvTime_);
408 SLU::Dtype_t dtype = type_map::dtype;
409 int i_ld_rhs = as<int>(ld_rhs);
410 function_map::create_Dense_Matrix(&(data_.B), i_ld_rhs, as<int>(nrhs),
411 bValues.getRawPtr(), i_ld_rhs,
412 SLU::SLU_DN, dtype, SLU::SLU_GE);
413 function_map::create_Dense_Matrix(&(data_.X), i_ld_rhs, as<int>(nrhs),
414 xValues.getRawPtr(), i_ld_rhs,
415 SLU::SLU_DN, dtype, SLU::SLU_GE);
422 #ifdef HAVE_AMESOS2_TIMERS 423 Teuchos::TimeMonitor solveTimer(this->
timers_.solveTime_);
426 if(ILU_Flag_==
false) {
427 function_map::gssvx(&(data_.options), &(data_.A),
428 data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(),
429 data_.etree.getRawPtr(), &(data_.equed), data_.R.getRawPtr(),
430 data_.C.getRawPtr(), &(data_.L), &(data_.U), NULL, 0, &(data_.B),
431 &(data_.X), &rpg, &rcond, data_.ferr.getRawPtr(),
432 data_.berr.getRawPtr(), &(data_.mem_usage), &(data_.stat), &ierr);
435 function_map::gsisx(&(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_.mem_usage), &(data_.stat), &ierr);
445 SLU::Destroy_SuperMatrix_Store( &(data_.X) );
446 SLU::Destroy_SuperMatrix_Store( &(data_.B) );
447 data_.X.Store = NULL;
448 data_.B.Store = NULL;
452 Teuchos::broadcast(*(this->
getComm()), 0, &ierr);
454 global_size_type ierr_st = as<global_size_type>(ierr);
455 TEUCHOS_TEST_FOR_EXCEPTION( ierr < 0,
456 std::invalid_argument,
457 "Argument " << -ierr <<
" to SuperLU xgssvx had illegal value" );
458 TEUCHOS_TEST_FOR_EXCEPTION( ierr > 0 && ierr_st <= this->
globalNumCols_,
460 "Factorization complete, but U is exactly singular" );
461 TEUCHOS_TEST_FOR_EXCEPTION( ierr > 0 && ierr_st > this->globalNumCols_ + 1,
463 "SuperLU allocated " << ierr - this->globalNumCols_ <<
" bytes of " 464 "memory before allocation failure occured." );
468 #ifdef HAVE_AMESOS2_TIMERS 469 Teuchos::TimeMonitor redistTimer(this->
timers_.vecRedistTime_);
472 if ( is_contiguous_ ==
true ) {
491 template <
class Matrix,
class Vector>
498 return( this->
matrixA_->getGlobalNumRows() == this->
matrixA_->getGlobalNumCols() );
502 template <
class Matrix,
class Vector>
507 using Teuchos::getIntegralValue;
508 using Teuchos::ParameterEntryValidator;
512 ILU_Flag_ = parameterList->get<
bool>(
"ILU_Flag",
false);
514 SLU::ilu_set_default_options(&(data_.options));
516 data_.options.PrintStat = SLU::NO;
519 data_.options.Trans = this->
control_.useTranspose_ ? SLU::TRANS : SLU::NOTRANS;
521 if( parameterList->isParameter(
"Trans") ){
522 RCP<const ParameterEntryValidator> trans_validator = valid_params->getEntry(
"Trans").validator();
523 parameterList->getEntry(
"Trans").setValidator(trans_validator);
525 data_.options.Trans = getIntegralValue<SLU::trans_t>(*parameterList,
"Trans");
528 if( parameterList->isParameter(
"IterRefine") ){
529 RCP<const ParameterEntryValidator> refine_validator = valid_params->getEntry(
"IterRefine").validator();
530 parameterList->getEntry(
"IterRefine").setValidator(refine_validator);
532 data_.options.IterRefine = getIntegralValue<SLU::IterRefine_t>(*parameterList,
"IterRefine");
535 if( parameterList->isParameter(
"ColPerm") ){
536 RCP<const ParameterEntryValidator> colperm_validator = valid_params->getEntry(
"ColPerm").validator();
537 parameterList->getEntry(
"ColPerm").setValidator(colperm_validator);
539 data_.options.ColPerm = getIntegralValue<SLU::colperm_t>(*parameterList,
"ColPerm");
542 data_.options.DiagPivotThresh = parameterList->get<
double>(
"DiagPivotThresh", 1.0);
544 bool equil = parameterList->get<
bool>(
"Equil",
true);
545 data_.options.Equil = equil ? SLU::YES : SLU::NO;
547 bool symmetric_mode = parameterList->get<
bool>(
"SymmetricMode",
false);
548 data_.options.SymmetricMode = symmetric_mode ? SLU::YES : SLU::NO;
551 if( parameterList->isParameter(
"RowPerm") ){
552 RCP<const ParameterEntryValidator> rowperm_validator = valid_params->getEntry(
"RowPerm").validator();
553 parameterList->getEntry(
"RowPerm").setValidator(rowperm_validator);
554 data_.options.RowPerm = getIntegralValue<SLU::rowperm_t>(*parameterList,
"RowPerm");
563 data_.options.ILU_DropTol = parameterList->get<
double>(
"ILU_DropTol", 0.0001);
565 data_.options.ILU_FillFactor = parameterList->get<
double>(
"ILU_FillFactor", 10.0);
567 if( parameterList->isParameter(
"ILU_Norm") ) {
568 RCP<const ParameterEntryValidator> norm_validator = valid_params->getEntry(
"ILU_Norm").validator();
569 parameterList->getEntry(
"ILU_Norm").setValidator(norm_validator);
570 data_.options.ILU_Norm = getIntegralValue<SLU::norm_t>(*parameterList,
"ILU_Norm");
573 if( parameterList->isParameter(
"ILU_MILU") ) {
574 RCP<const ParameterEntryValidator> milu_validator = valid_params->getEntry(
"ILU_MILU").validator();
575 parameterList->getEntry(
"ILU_MILU").setValidator(milu_validator);
576 data_.options.ILU_MILU = getIntegralValue<SLU::milu_t>(*parameterList,
"ILU_MILU");
579 data_.options.ILU_FillTol = parameterList->get<
double>(
"ILU_FillTol", 0.01);
581 if( parameterList->isParameter(
"IsContiguous") ){
582 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
587 template <
class Matrix,
class Vector>
588 Teuchos::RCP<const Teuchos::ParameterList>
592 using Teuchos::tuple;
593 using Teuchos::ParameterList;
594 using Teuchos::EnhancedNumberValidator;
595 using Teuchos::setStringToIntegralParameter;
596 using Teuchos::stringToIntegralParameterEntryValidator;
598 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
600 if( is_null(valid_params) ){
601 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
603 setStringToIntegralParameter<SLU::trans_t>(
"Trans",
"NOTRANS",
604 "Solve for the transpose system or not",
605 tuple<string>(
"TRANS",
"NOTRANS",
"CONJ"),
606 tuple<string>(
"Solve with transpose",
607 "Do not solve with transpose",
608 "Solve with the conjugate transpose"),
609 tuple<SLU::trans_t>(SLU::TRANS,
614 setStringToIntegralParameter<SLU::IterRefine_t>(
"IterRefine",
"NOREFINE",
615 "Type of iterative refinement to use",
616 tuple<string>(
"NOREFINE",
"SLU_SINGLE",
"SLU_DOUBLE"),
617 tuple<string>(
"Do not use iterative refinement",
618 "Do single iterative refinement",
619 "Do double iterative refinement"),
620 tuple<SLU::IterRefine_t>(SLU::NOREFINE,
626 setStringToIntegralParameter<SLU::colperm_t>(
"ColPerm",
"COLAMD",
627 "Specifies how to permute the columns of the " 628 "matrix for sparsity preservation",
629 tuple<string>(
"NATURAL",
"MMD_AT_PLUS_A",
630 "MMD_ATA",
"COLAMD"),
631 tuple<string>(
"Natural ordering",
632 "Minimum degree ordering on A^T + A",
633 "Minimum degree ordering on A^T A",
634 "Approximate minimum degree column ordering"),
635 tuple<SLU::colperm_t>(SLU::NATURAL,
641 Teuchos::RCP<EnhancedNumberValidator<double> > diag_pivot_thresh_validator
642 = Teuchos::rcp(
new EnhancedNumberValidator<double>(0.0, 1.0) );
643 pl->set(
"DiagPivotThresh", 1.0,
644 "Specifies the threshold used for a diagonal entry to be an acceptable pivot",
645 diag_pivot_thresh_validator);
647 pl->set(
"Equil",
true,
"Whether to equilibrate the system before solve");
649 pl->set(
"SymmetricMode",
false,
650 "Specifies whether to use the symmetric mode. " 651 "Gives preference to diagonal pivots and uses " 652 "an (A^T + A)-based column permutation.");
656 setStringToIntegralParameter<SLU::rowperm_t>(
"RowPerm",
"LargeDiag",
657 "Type of row permutation strategy to use",
658 tuple<string>(
"NOROWPERM",
"LargeDiag",
"MY_PERMR"),
659 tuple<string>(
"Use natural ordering",
660 "Use weighted bipartite matching algorithm",
661 "Use the ordering given in perm_r input"),
662 tuple<SLU::rowperm_t>(SLU::NOROWPERM,
681 pl->set(
"ILU_DropTol", 0.0001,
"ILUT drop tolerance");
683 pl->set(
"ILU_FillFactor", 10.0,
"ILUT fill factor");
685 setStringToIntegralParameter<SLU::norm_t>(
"ILU_Norm",
"INF_NORM",
686 "Type of norm to use",
687 tuple<string>(
"ONE_NORM",
"TWO_NORM",
"INF_NORM"),
688 tuple<string>(
"1-norm",
"2-norm",
"inf-norm"),
689 tuple<SLU::norm_t>(SLU::ONE_NORM,SLU::TWO_NORM,SLU::INF_NORM),
692 setStringToIntegralParameter<SLU::milu_t>(
"ILU_MILU",
"SILU",
693 "Type of modified ILU to use",
694 tuple<string>(
"SILU",
"SMILU_1",
"SMILU_2",
"SMILU_3"),
695 tuple<string>(
"Regular ILU",
"MILU 1",
"MILU 2",
"MILU 3"),
696 tuple<SLU::milu_t>(SLU::SILU,SLU::SMILU_1,SLU::SMILU_2,
700 pl->set(
"ILU_FillTol", 0.01,
"ILUT fill tolerance");
702 pl->set(
"ILU_Flag",
false,
"ILU flag: if true, run ILU routines");
704 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
713 template <
class Matrix,
class Vector>
719 #ifdef HAVE_AMESOS2_TIMERS 720 Teuchos::TimeMonitor convTimer(this->
timers_.mtxConvTime_);
724 if( current_phase == SYMBFACT )
return false;
727 if( data_.A.Store != NULL ){
728 SLU::Destroy_SuperMatrix_Store( &(data_.A) );
729 data_.A.Store = NULL;
741 #ifdef HAVE_AMESOS2_TIMERS 742 Teuchos::TimeMonitor mtxRedistTimer( this->
timers_.mtxRedistTime_ );
747 "Row and column maps have different indexbase ");
749 if ( is_contiguous_ ==
true ) {
768 SLU::Dtype_t dtype = type_map::dtype;
773 "Did not get the expected number of non-zero vals");
775 function_map::create_CompCol_Matrix( &(data_.A),
776 this->globalNumRows_, this->globalNumCols_,
781 SLU::SLU_NC, dtype, SLU::SLU_GE);
788 template<
class Matrix,
class Vector>
794 #endif // AMESOS2_SUPERLU_DEF_HPP Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers...
Definition: Amesos2_SolverCore_decl.hpp:105
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:366
Teuchos::Array< slu_type > nzvals_
Stores the values of the nonzero entries for SuperLU.
Definition: Amesos2_Superlu_decl.hpp:259
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_Superlu_def.hpp:715
EPhase
Used to indicate a phase in the direct solution.
Definition: Amesos2_TypeDecl.hpp:65
Teuchos::Array< int > colptr_
Stores the row indices of the nonzero entries.
Definition: Amesos2_Superlu_decl.hpp:263
int numericFactorization_impl()
Superlu specific numeric factorization.
Definition: Amesos2_Superlu_def.hpp:233
global_size_type columnIndexBase_
Index base of column map of matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:487
global_size_type globalNumCols_
Number of global columns in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:478
~Superlu()
Destructor.
Definition: Amesos2_Superlu_def.hpp:109
Teuchos::Array< int > rowind_
Stores the location in Ai_ and Aval_ that starts row j.
Definition: Amesos2_Superlu_decl.hpp:261
bool root_
If true, then this is the root processor.
Definition: Amesos2_SolverCore_decl.hpp:506
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_Superlu_def.hpp:589
global_size_type globalNumRows_
Number of global rows in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:475
Amesos2 Superlu declarations.
Helper class for getting 1-D copies of multivectors.
Definition: Amesos2_MultiVecAdapter_decl.hpp:266
Definition: Amesos2_TypeDecl.hpp:143
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
Control control_
Parameters for solving.
Definition: Amesos2_SolverCore_decl.hpp:494
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
Returns a pointer to the Teuchos::Comm communicator with this operator.
Definition: Amesos2_SolverCore_decl.hpp:362
Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
A generic helper class for getting a CCS representation of a Matrix.
Definition: Amesos2_Util.hpp:626
A Matrix adapter interface for Amesos2.
Definition: Amesos2_MatrixAdapter_decl.hpp:76
std::string description() const
Returns a short description of this Solver.
Definition: Amesos2_Superlu_def.hpp:132
global_size_type globalNumNonZeros_
Number of global non-zero values in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:481
void setNnzLU(size_t nnz)
Set the number of non-zero values in the and factors.
Definition: Amesos2_SolverCore_decl.hpp:451
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_Superlu_def.hpp:493
Definition: Amesos2_TypeDecl.hpp:127
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_Superlu_def.hpp:504
Timers timers_
Various timing statistics.
Definition: Amesos2_SolverCore_decl.hpp:497
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
Teuchos::RCP< const MatrixAdapter< Matrix > > matrixA_
The LHS operator.
Definition: Amesos2_SolverCore_decl.hpp:454
global_size_type rowIndexBase_
Index base of rowmap of matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:484
Definition: Amesos2_TypeDecl.hpp:128
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