52 #ifndef AMESOS2_SUPERLUDIST_DEF_HPP
53 #define AMESOS2_SUPERLUDIST_DEF_HPP
55 #include <Teuchos_Tuple.hpp>
56 #include <Teuchos_StandardParameterEntryValidators.hpp>
57 #include <Teuchos_DefaultMpiComm.hpp>
67 template <
class Matrix,
class Vector>
69 Teuchos::RCP<Vector> X,
70 Teuchos::RCP<const Vector> B)
78 , is_contiguous_(true)
83 using Teuchos::MpiComm;
84 using Teuchos::outArg;
85 using Teuchos::ParameterList;
86 using Teuchos::parameterList;
89 using Teuchos::rcp_dynamic_cast;
90 using Teuchos::REDUCE_SUM;
91 using Teuchos::reduceAll;
92 typedef global_ordinal_type GO;
93 typedef Tpetra::Map<local_ordinal_type, GO, node_type> map_type;
99 RCP<const Comm<int> > comm = this->
getComm ();
100 const int myRank = comm->getRank ();
101 const int numProcs = comm->getSize ();
103 SLUD::int_t nprow, npcol;
110 RCP<const Comm<int> > matComm = this->
matrixA_->getComm ();
111 TEUCHOS_TEST_FOR_EXCEPTION(
112 matComm.is_null (), std::logic_error,
"Amesos2::Superlustdist "
113 "constructor: The matrix's communicator is null!");
114 RCP<const MpiComm<int> > matMpiComm =
115 rcp_dynamic_cast<
const MpiComm<int> > (matComm);
120 TEUCHOS_TEST_FOR_EXCEPTION(
121 matMpiComm.is_null (), std::logic_error,
"Amesos2::Superlustdist "
122 "constructor: The matrix's communicator is not an MpiComm!");
123 TEUCHOS_TEST_FOR_EXCEPTION(
124 matMpiComm->getRawMpiComm ().is_null (), std::logic_error,
"Amesos2::"
125 "Superlustdist constructor: The matrix's communicator claims to be a "
126 "Teuchos::MpiComm<int>, but its getRawPtrComm() method returns "
127 "Teuchos::null! This means that the underlying MPI_Comm doesn't even "
128 "exist, which likely implies that the Teuchos::MpiComm was constructed "
129 "incorrectly. It means something different than if the MPI_Comm were "
131 MPI_Comm rawMpiComm = (* (matMpiComm->getRawMpiComm ())) ();
132 data_.mat_comm = rawMpiComm;
138 SLUD::superlu_gridinit(data_.mat_comm, nprow, npcol, &(data_.grid));
147 SLUD::set_default_options_dist(&data_.options);
149 RCP<ParameterList> default_params =
154 data_.options.Fact = SLUD::DOFACT;
155 data_.equed = SLUD::NOEQUIL;
156 data_.options.SolveInitialized = SLUD::NO;
157 data_.options.RefineInitialized = SLUD::NO;
158 data_.rowequ =
false;
159 data_.colequ =
false;
167 data_.symb_comm = MPI_COMM_NULL;
172 data_.domains = (int) ( pow(2.0, floor(log10((
double)nprow*npcol)/log10(2.0))) );
174 const int color = (myRank < data_.domains) ? 0 : MPI_UNDEFINED;
175 MPI_Comm_split (data_.mat_comm, color, myRank, &(data_.symb_comm));
187 int myProcParticipates = 0;
188 if (myRank < nprow * npcol) {
190 myProcParticipates = 1;
195 int numParticipatingProcs = 0;
196 reduceAll<int, int> (*comm, REDUCE_SUM, myProcParticipates,
197 outArg (numParticipatingProcs));
198 TEUCHOS_TEST_FOR_EXCEPTION(
200 std::logic_error,
"Amesos2::Superludist constructor: The matrix has "
201 << this->
globalNumRows_ <<
" > 0 global row(s), but no processes in the "
202 "communicator want to participate in its factorization! nprow = "
203 << nprow <<
" and npcol = " << npcol <<
".");
206 size_t myNumRows = 0;
209 const GO quotient = (numParticipatingProcs == 0) ? static_cast<GO> (0) :
210 GNR /
static_cast<GO
> (numParticipatingProcs);
212 GNR - quotient *
static_cast<GO
> (numParticipatingProcs);
213 const GO lclNumRows = (
static_cast<GO
> (myRank) < remainder) ?
214 (quotient +
static_cast<GO
> (1)) : quotient;
215 myNumRows =
static_cast<size_t> (lclNumRows);
219 const GO indexBase = this->
matrixA_->getRowMap ()->getIndexBase ();
221 rcp (
new map_type (this->
globalNumRows_, myNumRows, indexBase, comm));
227 data_.A.Store = NULL;
229 SLUD::PStatInit(&(data_.stat));
232 data_.scale_perm.perm_r = data_.perm_r.getRawPtr();
233 data_.scale_perm.perm_c = data_.perm_c.getRawPtr();
237 template <
class Matrix,
class Vector>
249 if ( this->status_.getNumPreOrder() > 0 ){
251 #if defined(AMESOS2_ENABLES_SUPERLUDIST_VERSION5_AND_HIGHER)
252 SUPERLU_FREE( data_.sizes );
253 SUPERLU_FREE( data_.fstVtxSep );
256 free( data_.fstVtxSep );
262 if( data_.A.Store != NULL ){
263 SLUD::Destroy_SuperMatrix_Store_dist( &(data_.A) );
267 if ( this->status_.getNumNumericFact() > 0 ){
268 function_map::Destroy_LU(this->globalNumRows_, &(data_.grid), &(data_.lu));
270 function_map::LUstructFree(&(data_.lu));
276 if ( this->status_.symbolicFactorizationDone() &&
277 !this->status_.numericFactorizationDone() ){
278 if ( data_.pslu_freeable.xlsub != NULL ){
279 #if defined(AMESOS2_ENABLES_SUPERLUDIST_VERSION5_AND_HIGHER)
280 SUPERLU_FREE( data_.pslu_freeable.xlsub );
281 SUPERLU_FREE( data_.pslu_freeable.lsub );
283 free( data_.pslu_freeable.xlsub );
284 free( data_.pslu_freeable.lsub );
287 if ( data_.pslu_freeable.xusub != NULL ){
288 #if defined(AMESOS2_ENABLES_SUPERLUDIST_VERSION5_AND_HIGHER)
289 SUPERLU_FREE( data_.pslu_freeable.xusub );
290 SUPERLU_FREE( data_.pslu_freeable.usub );
292 free( data_.pslu_freeable.xusub );
293 free( data_.pslu_freeable.usub );
296 if ( data_.pslu_freeable.supno_loc != NULL ){
297 #if defined(AMESOS2_ENABLES_SUPERLUDIST_VERSION5_AND_HIGHER)
298 SUPERLU_FREE( data_.pslu_freeable.supno_loc );
299 SUPERLU_FREE( data_.pslu_freeable.xsup_beg_loc );
300 SUPERLU_FREE( data_.pslu_freeable.xsup_end_loc );
302 free( data_.pslu_freeable.supno_loc );
303 free( data_.pslu_freeable.xsup_beg_loc );
304 free( data_.pslu_freeable.xsup_end_loc );
307 #if defined(AMESOS2_ENABLES_SUPERLUDIST_VERSION5_AND_HIGHER)
308 SUPERLU_FREE( data_.pslu_freeable.globToLoc );
310 free( data_.pslu_freeable.globToLoc );
314 SLUD::PStatFree( &(data_.stat) ) ;
319 if ( data_.options.SolveInitialized == SLUD::YES )
320 function_map::SolveFinalize(&(data_.options), &(data_.solve_struct));
322 SLUD::superlu_gridexit(&(data_.grid));
326 if ( data_.symb_comm != MPI_COMM_NULL ) MPI_Comm_free(&(data_.symb_comm));
329 template<
class Matrix,
class Vector>
338 SLUD::int_t slu_rows_ub = Teuchos::as<SLUD::int_t>(this->globalNumRows_);
339 for( SLUD::int_t i = 0; i < slu_rows_ub; ++i ) data_.perm_r[i] = i;
349 if( this->status_.getNumPreOrder() > 0 ){
350 #if defined(AMESOS2_ENABLES_SUPERLUDIST_VERSION5_AND_HIGHER)
351 SUPERLU_FREE( data_.sizes );
352 SUPERLU_FREE( data_.fstVtxSep );
355 free( data_.fstVtxSep );
358 #ifdef HAVE_AMESOS2_TIMERS
359 Teuchos::TimeMonitor preOrderTime( this->timers_.preOrderTime_ );
363 info = SLUD::get_perm_c_parmetis( &(data_.A),
364 data_.perm_r.getRawPtr(), data_.perm_c.getRawPtr(),
365 data_.grid.nprow * data_.grid.npcol, data_.domains,
366 &(data_.sizes), &(data_.fstVtxSep),
367 &(data_.grid), &(data_.symb_comm) );
369 TEUCHOS_TEST_FOR_EXCEPTION( info > 0.0,
371 "SuperLU_DIST pre-ordering ran out of memory after allocating "
372 << info <<
" bytes of memory" );
384 template <
class Matrix,
class Vector>
392 #ifdef HAVE_AMESOS2_TIMERS
393 Teuchos::TimeMonitor symFactTime( this->timers_.symFactTime_ );
397 info = SLUD::symbfact_dist((data_.grid.nprow) * (data_.grid.npcol),
398 data_.domains, &(data_.A), data_.perm_c.getRawPtr(),
399 data_.perm_r.getRawPtr(), data_.sizes,
400 data_.fstVtxSep, &(data_.pslu_freeable),
401 &(data_.grid.comm), &(data_.symb_comm),
404 TEUCHOS_TEST_FOR_EXCEPTION( info > 0.0,
406 "SuperLU_DIST symbolic factorization ran out of memory after"
407 " allocating " << info <<
" bytes of memory" );
409 same_symbolic_ =
false;
410 same_solve_struct_ =
false;
416 template <
class Matrix,
class Vector>
435 size_t nnz_loc = ((SLUD::NRformat_loc*)data_.A.Store)->nnz_loc;
436 for(
size_t i = 0; i < nnz_loc; ++i ) colind_[i] = data_.perm_c[colind_[i]];
439 if( same_symbolic_ ){
444 function_map::pdistribute(SLUD::SamePattern_SameRowPerm,
445 as<SLUD::int_t>(this->globalNumRows_),
446 &(data_.A), &(data_.scale_perm),
447 &(data_.glu_freeable), &(data_.lu),
450 function_map::dist_psymbtonum(SLUD::DOFACT,
451 as<SLUD::int_t>(this->globalNumRows_),
452 &(data_.A), &(data_.scale_perm),
453 &(data_.pslu_freeable), &(data_.lu),
458 double anorm = function_map::plangs((
char *)
"I", &(data_.A), &(data_.grid));
462 #ifdef HAVE_AMESOS2_TIMERS
463 Teuchos::TimeMonitor numFactTimer(this->timers_.numFactTime_);
466 function_map::gstrf(&(data_.options), this->globalNumRows_,
467 this->globalNumCols_, anorm, &(data_.lu),
468 &(data_.grid), &(data_.stat), &info);
472 TEUCHOS_TEST_FOR_EXCEPTION( info > 0,
474 "L and U factors have been computed but U("
475 << info <<
"," << info <<
") is exactly zero "
476 "(i.e. U is singular)");
483 data_.options.Fact = SLUD::FACTORED;
484 same_symbolic_ =
true;
490 template <
class Matrix,
class Vector>
499 const size_t local_len_rhs = superlu_rowmap_->getNodeNumElements();
500 const global_size_type nrhs = X->getGlobalNumVectors();
501 const global_ordinal_type first_global_row_b = superlu_rowmap_->getMinGlobalIndex();
504 bvals_.resize(nrhs * local_len_rhs);
505 xvals_.resize(nrhs * local_len_rhs);
511 #ifdef HAVE_AMESOS2_TIMERS
512 Teuchos::TimeMonitor convTimer(this->timers_.vecConvTime_);
522 #ifdef HAVE_AMESOS2_TIMERS
523 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
529 copy_helper::do_get(B,
532 Teuchos::ptrInArg(*superlu_rowmap_));
553 if( !same_solve_struct_ ){
554 if( data_.options.SolveInitialized == SLUD::YES ){
555 function_map::SolveFinalize(&(data_.options), &(data_.solve_struct));
557 function_map::SolveInit(&(data_.options), &(data_.A), data_.perm_r.getRawPtr(),
558 data_.perm_c.getRawPtr(), as<SLUD::int_t>(nrhs), &(data_.lu),
559 &(data_.grid), &(data_.solve_struct));
563 same_solve_struct_ =
true;
568 #ifdef HAVE_AMESOS2_TIMERS
569 Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_);
572 function_map::gstrs(as<SLUD::int_t>(this->globalNumRows_), &(data_.lu),
573 &(data_.scale_perm), &(data_.grid), bvals_.getRawPtr(),
574 as<SLUD::int_t>(local_len_rhs), as<SLUD::int_t>(first_global_row_b),
575 as<SLUD::int_t>(local_len_rhs), as<int>(nrhs),
576 &(data_.solve_struct), &(data_.stat), &ierr);
579 TEUCHOS_TEST_FOR_EXCEPTION( ierr < 0,
581 "Argument " << -ierr <<
" to gstrs had an illegal value" );
596 #ifdef HAVE_AMESOS2_TIMERS
597 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
599 SLUD::int_t ld = as<SLUD::int_t>(local_len_rhs);
600 function_map::permute_Dense_Matrix(as<SLUD::int_t>(first_global_row_b),
601 as<SLUD::int_t>(local_len_rhs),
602 data_.solve_struct.row_to_proc,
603 data_.solve_struct.inv_perm_c,
604 bvals_.getRawPtr(), ld,
605 xvals_.getRawPtr(), ld,
613 #ifdef HAVE_AMESOS2_TIMERS
614 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
618 put_helper::do_put(X,
621 Teuchos::ptrInArg(*superlu_rowmap_));
628 template <
class Matrix,
class Vector>
633 return( this->globalNumRows_ == this->globalNumCols_ );
637 template <
class Matrix,
class Vector>
643 using Teuchos::getIntegralValue;
644 using Teuchos::ParameterEntryValidator;
646 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
648 if( parameterList->isParameter(
"npcol") || parameterList->isParameter(
"nprow") ){
649 TEUCHOS_TEST_FOR_EXCEPTION( !(parameterList->isParameter(
"nprow") &&
650 parameterList->isParameter(
"npcol")),
651 std::invalid_argument,
652 "nprow and npcol must be set together" );
654 SLUD::int_t nprow = parameterList->template get<SLUD::int_t>(
"nprow");
655 SLUD::int_t npcol = parameterList->template get<SLUD::int_t>(
"npcol");
657 TEUCHOS_TEST_FOR_EXCEPTION( nprow * npcol > this->getComm()->getSize(),
658 std::invalid_argument,
659 "nprow and npcol combination invalid" );
661 if( (npcol != data_.grid.npcol) || (nprow != data_.grid.nprow) ){
663 SLUD::superlu_gridexit(&(data_.grid));
665 SLUD::superlu_gridinit(data_.mat_comm, nprow, npcol, &(data_.grid));
669 TEUCHOS_TEST_FOR_EXCEPTION( this->control_.useTranspose_,
670 std::invalid_argument,
671 "SuperLU_DIST does not support solving the tranpose system" );
673 data_.options.Trans = SLUD::NOTRANS;
678 data_.options.Equil = SLUD::NO;
680 if( parameterList->isParameter(
"ColPerm") ){
681 RCP<const ParameterEntryValidator> colperm_validator = valid_params->getEntry(
"ColPerm").validator();
682 parameterList->getEntry(
"ColPerm").setValidator(colperm_validator);
684 data_.options.ColPerm = getIntegralValue<SLUD::colperm_t>(*parameterList,
"ColPerm");
691 data_.options.RowPerm = SLUD::NOROWPERM;
700 data_.options.IterRefine = SLUD::NOREFINE;
702 bool replace_tiny = parameterList->get<
bool>(
"ReplaceTinyPivot",
true);
703 data_.options.ReplaceTinyPivot = replace_tiny ? SLUD::YES : SLUD::NO;
705 if( parameterList->isParameter(
"IsContiguous") ){
706 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
711 template <
class Matrix,
class Vector>
712 Teuchos::RCP<const Teuchos::ParameterList>
716 using Teuchos::tuple;
717 using Teuchos::ParameterList;
718 using Teuchos::EnhancedNumberValidator;
719 using Teuchos::setStringToIntegralParameter;
720 using Teuchos::stringToIntegralParameterEntryValidator;
722 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
724 if( is_null(valid_params) ){
725 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
727 Teuchos::RCP<EnhancedNumberValidator<SLUD::int_t> > col_row_validator
728 = Teuchos::rcp(
new EnhancedNumberValidator<SLUD::int_t>() );
729 col_row_validator->setMin(1);
731 pl->set(
"npcol", data_.grid.npcol,
732 "Number of columns in the processor grid. "
733 "Must be set with nprow", col_row_validator);
734 pl->set(
"nprow", data_.grid.nprow,
735 "Number of rows in the SuperLU_DIST processor grid. "
736 "Must be set together with npcol", col_row_validator);
739 setStringToIntegralParameter<SLUD::trans_t>(
"Trans",
"NOTRANS",
740 "Solve for the transpose system or not",
741 tuple<string>(
"NOTRANS"),
742 tuple<string>(
"Do not solve with transpose"),
743 tuple<SLUD::trans_t>(SLUD::NOTRANS),
759 pl->set(
"ReplaceTinyPivot",
true,
760 "Specifies whether to replace tiny diagonals during LU factorization");
762 setStringToIntegralParameter<SLUD::colperm_t>(
"ColPerm",
"PARMETIS",
763 "Specifies how to permute the columns of the "
764 "matrix for sparsity preservation",
765 tuple<string>(
"NATURAL",
"PARMETIS"),
766 tuple<string>(
"Natural ordering",
767 "ParMETIS ordering on A^T + A"),
768 tuple<SLUD::colperm_t>(SLUD::NATURAL,
772 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
781 template <
class Matrix,
class Vector>
785 SLUD::int_t& npcol)
const {
786 TEUCHOS_TEST_FOR_EXCEPTION( nprocs < 1,
787 std::invalid_argument,
788 "Number of MPI processes must be at least 1" );
789 SLUD::int_t c, r = 1;
790 while( r*r <= nprocs ) r++;
793 while( (r--)*c != nprocs ){
799 if( r > 1 || nprocs < 9){
806 template <
class Matrix,
class Vector>
810 using Teuchos::Array;
811 using Teuchos::ArrayView;
812 using Teuchos::ptrInArg;
817 #ifdef HAVE_AMESOS2_TIMERS
818 Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
822 if( data_.A.Store != NULL ){
823 SLUD::Destroy_SuperMatrix_Store_dist( &(data_.A) );
824 data_.A.Store = NULL;
827 Teuchos::RCP<const MatrixAdapter<Matrix> > redist_mat
828 = this->matrixA_->get(ptrInArg(*superlu_rowmap_));
830 int_t l_nnz, l_rows, g_rows, g_cols, fst_global_row;
831 l_nnz = as<int_t>(redist_mat->getLocalNNZ());
832 l_rows = as<int_t>(redist_mat->getLocalNumRows());
833 g_rows = as<int_t>(redist_mat->getGlobalNumRows());
835 fst_global_row = as<int_t>(superlu_rowmap_->getMinGlobalIndex());
837 nzvals_.resize(l_nnz);
838 colind_.resize(l_nnz);
839 rowptr_.resize(l_rows + 1);
843 #ifdef HAVE_AMESOS2_TIMERS
844 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
849 slu_type, int_t, int_t >::do_get(redist_mat.ptr(),
850 nzvals_(), colind_(), rowptr_(),
852 ptrInArg(*superlu_rowmap_),
857 TEUCHOS_TEST_FOR_EXCEPTION( nnz_ret != l_nnz,
859 "Did not get the expected number of non-zero vals");
862 SLUD::Dtype_t dtype = type_map::dtype;
865 function_map::create_CompRowLoc_Matrix(&(data_.A),
867 l_nnz, l_rows, fst_global_row,
872 dtype, SLUD::SLU_GE);
879 template<
class Matrix,
class Vector>
885 #endif // AMESOS2_SUPERLUDIST_DEF_HPP
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers...
Definition: Amesos2_SolverCore_decl.hpp:105
Amesos2 interface to the distributed memory version of SuperLU.
Definition: Amesos2_Superludist_decl.hpp:90
EPhase
Used to indicate a phase in the direct solution.
Definition: Amesos2_TypeDecl.hpp:65
Similar to get_ccs_helper , but used to get a CRS representation of the given matrix.
Definition: Amesos2_Util.hpp:780
global_size_type globalNumCols_
Number of global columns in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:478
Superludist(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition: Amesos2_Superludist_def.hpp:68
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_Superludist_def.hpp:639
global_size_type globalNumRows_
Number of global rows in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:475
Helper class for getting 1-D copies of multivectors.
Definition: Amesos2_MultiVecAdapter_decl.hpp:266
Utility functions for Amesos2.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_Superludist_def.hpp:713
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Return a const parameter list of all of the valid parameters that this->setParameterList(...) will accept.
Definition: Amesos2_SolverCore_def.hpp:314
Provides definition of SuperLU_DIST types as well as conversions and type traits. ...
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition: Amesos2_Superludist_def.hpp:331
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
A Matrix adapter interface for Amesos2.
Definition: Amesos2_MatrixAdapter_decl.hpp:76
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_Superludist_def.hpp:630
Teuchos::RCP< const Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > > superlu_rowmap_
Maps rows of the matrix to processors in the SuperLU_DIST processor grid.
Definition: Amesos2_Superludist_decl.hpp:329
~Superludist()
Destructor.
Definition: Amesos2_Superludist_def.hpp:238
super_type & setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Set/update internal variables and solver options.
Definition: Amesos2_SolverCore_def.hpp:282
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using SuperLU_DIST.
Definition: Amesos2_Superludist_def.hpp:386
void get_default_grid_size(int nprocs, SLUD::int_t &nprow, SLUD::int_t &npcol) const
Definition: Amesos2_Superludist_def.hpp:783
bool in_grid_
true if this processor is in SuperLU_DISTS's 2D process grid
Definition: Amesos2_Superludist_decl.hpp:322
Helper class for putting 1-D data arrays into multivectors.
Definition: Amesos2_MultiVecAdapter_decl.hpp:344
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
SuperLU_DIST specific solve.
Definition: Amesos2_Superludist_def.hpp:492
A templated MultiVector class adapter for Amesos2.
Definition: Amesos2_MultiVecAdapter_decl.hpp:176
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal solver structures.
Definition: Amesos2_Superludist_def.hpp:808
Teuchos::RCP< const MatrixAdapter< Matrix > > matrixA_
The LHS operator.
Definition: Amesos2_SolverCore_decl.hpp:454
int numericFactorization_impl()
SuperLU_DIST specific numeric factorization.
Definition: Amesos2_Superludist_def.hpp:418