52 #ifndef AMESOS2_MUMPS_DEF_HPP
53 #define AMESOS2_MUMPS_DEF_HPP
55 #include <Teuchos_Tuple.hpp>
56 #include <Teuchos_ParameterList.hpp>
57 #include <Teuchos_StandardParameterEntryValidators.hpp>
60 #include <Teuchos_DefaultMpiComm.hpp>
72 template <
class Matrix,
class Vector>
73 MUMPS<Matrix,Vector>::MUMPS(
74 Teuchos::RCP<const Matrix> A,
75 Teuchos::RCP<Vector> X,
76 Teuchos::RCP<const Vector> B )
77 : SolverCore<Amesos2::MUMPS,Matrix,Vector>(A, X, B)
81 , is_contiguous_(true)
84 typedef FunctionMap<MUMPS,scalar_type> function_map;
86 MUMPS_MATRIX_LOAD =
false;
88 MUMPS_MATRIX_LOAD_PREORDERING =
false;
92 using Teuchos::MpiComm;
95 using Teuchos::rcp_dynamic_cast;
98 mumps_par.comm_fortran = -987654;
99 RCP<const Comm<int> > matComm = this->
matrixA_->getComm();
101 TEUCHOS_TEST_FOR_EXCEPTION(
102 matComm.is_null(), std::logic_error,
"Amesos2::Comm");
103 RCP<const MpiComm<int> > matMpiComm =
104 rcp_dynamic_cast<
const MpiComm<int> >(matComm);
106 TEUCHOS_TEST_FOR_EXCEPTION(
107 matMpiComm->getRawMpiComm().is_null(),
108 std::logic_error,
"Amesos2::MPI");
109 MPI_Comm rawMpiComm = (* (matMpiComm->getRawMpiComm()) )();
110 mumps_par.comm_fortran = (int) MPI_Comm_c2f(rawMpiComm);
117 function_map::mumps_c(&(mumps_par));
123 mumps_par.icntl[0] = -1;
124 mumps_par.icntl[1] = -1;
125 mumps_par.icntl[2] = -1;
126 mumps_par.icntl[3] = 1;
127 mumps_par.icntl[4] = 0;
128 mumps_par.icntl[5] = 7;
129 mumps_par.icntl[6] = 7;
130 mumps_par.icntl[7] = 7;
131 mumps_par.icntl[8] = 1;
132 mumps_par.icntl[9] = 0;
133 mumps_par.icntl[10] = 0;
134 mumps_par.icntl[11] = 0;
135 mumps_par.icntl[12] = 0;
136 mumps_par.icntl[13] = 20;
137 mumps_par.icntl[17] = 0;
138 mumps_par.icntl[18] = 0;
139 mumps_par.icntl[19] = 0;
140 mumps_par.icntl[20] = 0;
141 mumps_par.icntl[21] = 0;
142 mumps_par.icntl[22] = 0;
143 mumps_par.icntl[23] = 0;
144 mumps_par.icntl[24] = 0;
145 mumps_par.icntl[25] = 0;
146 mumps_par.icntl[27] = 1;
147 mumps_par.icntl[28] = 0;
148 mumps_par.icntl[29] = 0;
149 mumps_par.icntl[30] = 0;
150 mumps_par.icntl[31] = 0;
151 mumps_par.icntl[32] = 0;
155 template <
class Matrix,
class Vector>
156 MUMPS<Matrix,Vector>::~MUMPS( )
159 if(MUMPS_STRUCT ==
true)
166 if (this->rank_ < this->nprocs_) {
167 function_map::mumps_c(&(mumps_par));
172 template<
class Matrix,
class Vector>
178 #ifdef HAVE_AMESOS2_TIMERS
179 Teuchos::TimeMonitor preOrderTimer(this->timers_.preOrderTime_);
185 template <
class Matrix,
class Vector>
194 function_map::mumps_c(&(mumps_par));
201 template <
class Matrix,
class Vector>
211 #ifdef HAVE_AMESOS2_TIMERS
212 Teuchos::TimeMonitor numFactTimer(this->timers_.numFactTime_);
215 #ifdef HAVE_AMESOS2_VERBOSE_DEBUG
216 std::cout <<
"MUMPS:: Before numeric factorization" << std::endl;
217 std::cout <<
"nzvals_ : " << nzvals_.toString() << std::endl;
218 std::cout <<
"rowind_ : " << rowind_.toString() << std::endl;
219 std::cout <<
"colptr_ : " << colptr_.toString() << std::endl;
224 function_map::mumps_c(&(mumps_par));
231 template <
class Matrix,
class Vector>
242 const global_size_type ld_rhs = this->root_ ? X->getGlobalLength() : 0;
243 const size_t nrhs = X->getGlobalNumVectors();
245 const size_t val_store_size = as<size_t>(ld_rhs * nrhs);
247 xvals_.resize(val_store_size);
248 bvals_.resize(val_store_size);
250 #ifdef HAVE_AMESOS2_TIMERS
251 Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_);
252 Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ );
255 if ( is_contiguous_ ==
true ) {
257 slu_type>::do_get(B, bvals_(),as<size_t>(ld_rhs), ROOTED, this->rowIndexBase_);
261 slu_type>::do_get(B, bvals_(),as<size_t>(ld_rhs), CONTIGUOUS_AND_ROOTED, this->rowIndexBase_);
266 mumps_par.nrhs = nrhs;
267 mumps_par.lrhs = mumps_par.n;
272 mumps_par.rhs = bvals_.getRawPtr();
275 #ifdef HAVE_AMESOS2_TIMERS
276 Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_);
279 function_map::mumps_c(&(mumps_par));
283 #ifdef HAVE_AMESOS2_TIMERS
284 Teuchos::TimeMonitor redistTimer2(this->timers_.vecRedistTime_);
287 if ( is_contiguous_ ==
true ) {
297 CONTIGUOUS_AND_ROOTED);
300 MUMPS_MATRIX_LOAD_PREORDERING =
false;
305 template <
class Matrix,
class Vector>
310 return( this->globalNumRows_ == this->globalNumCols_ );
314 template <
class Matrix,
class Vector>
319 using Teuchos::getIntegralValue;
320 using Teuchos::ParameterEntryValidator;
322 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
324 if(parameterList->isParameter(
"ICNTL(1)")){
325 mumps_par.icntl[0] = parameterList->get<
int>(
"ICNTL(1)", -1);
327 if(parameterList->isParameter(
"ICNTL(2)")){
328 mumps_par.icntl[1] = parameterList->get<
int>(
"ICNTL(2)", -1);
330 if(parameterList->isParameter(
"ICNTL(3)")){
331 mumps_par.icntl[2] = parameterList->get<
int>(
"ICNTL(3)", -1);
333 if(parameterList->isParameter(
"ICNTL(4)")){
334 mumps_par.icntl[3] = parameterList->get<
int>(
"ICNTL(4)", 1);
336 if(parameterList->isParameter(
"ICNTL(6)")){
337 mumps_par.icntl[5] = parameterList->get<
int>(
"ICNTL(6)", 0);
339 if(parameterList->isParameter(
"ICNTL(7)")){
340 mumps_par.icntl[6] = parameterList->get<
int>(
"ICNTL(7)", 7);
342 if(parameterList->isParameter(
"ICNTL(9)")){
343 mumps_par.icntl[8] = parameterList->get<
int>(
"ICNTL(9)", 1);
345 if(parameterList->isParameter(
"ICNTL(11)")){
346 mumps_par.icntl[10] = parameterList->get<
int>(
"ICNTL(11)", 0);
348 if(parameterList->isParameter(
"ICNTL(14)")){
349 mumps_par.icntl[13] = parameterList->get<
int>(
"ICNTL(14)", 20);
351 if( parameterList->isParameter(
"IsContiguous") ){
352 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
357 template <
class Matrix,
class Vector>
358 Teuchos::RCP<const Teuchos::ParameterList>
361 using Teuchos::ParameterList;
363 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
365 if( is_null(valid_params) ){
366 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
368 pl->set(
"ICNTL(1)", -1,
"See Manual" );
369 pl->set(
"ICNTL(2)", -1,
"See Manual" );
370 pl->set(
"ICNTL(3)", -1,
"See Manual" );
371 pl->set(
"ICNTL(4)", 1,
"See Manual" );
372 pl->set(
"ICNTL(6)", 0,
"See Manual" );
373 pl->set(
"ICNTL(9)", 1,
"See Manual" );
374 pl->set(
"ICNTL(11)", 0,
"See Manual" );
375 pl->set(
"ICNTL(14)", 20,
"See Manual" );
376 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
385 template <
class Matrix,
class Vector>
391 #ifdef HAVE_AMESOS2_TIMERS
392 Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
394 if(MUMPS_MATRIX_LOAD ==
false || (current_phase==NUMFACT && !MUMPS_MATRIX_LOAD_PREORDERING))
397 if( !MUMPS_MATRIX_LOAD && this->root_ ){
398 nzvals_.resize(this->globalNumNonZeros_);
399 rowind_.resize(this->globalNumNonZeros_);
400 colptr_.resize(this->globalNumCols_ + 1);
403 local_ordinal_type nnz_ret = 0;
405 #ifdef HAVE_AMESOS2_TIMERS
406 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
409 if ( is_contiguous_ ==
true ) {
412 ::do_get(this->matrixA_.ptr(), nzvals_(), rowind_(), colptr_(),
413 nnz_ret, ROOTED, ARBITRARY, this->rowIndexBase_);
418 ::do_get(this->matrixA_.ptr(), nzvals_(), rowind_(), colptr_(),
419 nnz_ret, CONTIGUOUS_AND_ROOTED, ARBITRARY, this->rowIndexBase_);
423 TEUCHOS_TEST_FOR_EXCEPTION( nnz_ret != as<local_ordinal_type>(this->globalNumNonZeros_),
425 "Did not get the expected number of non-zero vals");
437 if (current_phase==PREORDERING){
438 MUMPS_MATRIX_LOAD_PREORDERING =
true;
444 MUMPS_MATRIX_LOAD =
true;
448 template <
class Matrix,
class Vector>
452 if ( !MUMPS_STRUCT ) {
454 mumps_par.n = this->globalNumCols_;
455 mumps_par.nz = this->globalNumNonZeros_;
456 mumps_par.a = (magnitude_type*)malloc(mumps_par.nz *
sizeof(magnitude_type));
457 mumps_par.irn = (MUMPS_INT*)malloc(mumps_par.nz *
sizeof(MUMPS_INT));
458 mumps_par.jcn = (MUMPS_INT*)malloc(mumps_par.nz *
sizeof(MUMPS_INT));
460 if((mumps_par.a == NULL) || (mumps_par.irn == NULL)
461 || (mumps_par.jcn == NULL))
467 local_ordinal_type tri_count = 0;
468 local_ordinal_type i,j;
469 local_ordinal_type max_local_ordinal = 0;
471 for(i = 0; i < (local_ordinal_type)this->globalNumCols_; i++)
473 for( j = colptr_[i]; j < colptr_[i+1]-1; j++)
475 mumps_par.jcn[tri_count] = (MUMPS_INT)i+1;
476 mumps_par.irn[tri_count] = (MUMPS_INT)rowind_[j]+1;
477 mumps_par.a[tri_count] = nzvals_[j];
483 mumps_par.jcn[tri_count] = (MUMPS_INT)i+1;
484 mumps_par.irn[tri_count] = (MUMPS_INT)rowind_[j]+1;
485 mumps_par.a[tri_count] = nzvals_[j];
489 if(rowind_[j] > max_local_ordinal)
491 max_local_ordinal = rowind_[j];
494 TEUCHOS_TEST_FOR_EXCEPTION(std::numeric_limits<MUMPS_INT>::max() <= max_local_ordinal,
496 "Matrix index larger than MUMPS_INT");
501 template<
class Matrix,
class Vector>
503 MUMPS<Matrix,Vector>::MUMPS_ERROR()
const
507 bool Wrong = ((mumps_par.info[0] != 0) || (mumps_par.infog[0] != 0)) && (this->rank_ < this->nprocs_);
509 if (this->rank_==0) {
510 std::cerr <<
"Amesos_Mumps : ERROR" << std::endl;
511 std::cerr <<
"Amesos_Mumps : INFOG(1) = " << mumps_par.infog[0] << std::endl;
512 std::cerr <<
"Amesos_Mumps : INFOG(2) = " << mumps_par.infog[1] << std::endl;
514 if (mumps_par.info[0] != 0 && Wrong) {
515 std::cerr <<
"Amesos_Mumps : On process " << this->matrixA_->getComm()->getRank()
516 <<
", INFO(1) = " << mumps_par.info[0] << std::endl;
517 std::cerr <<
"Amesos_Mumps : On process " << this->matrixA_->getComm()->getRank()
518 <<
", INFO(2) = " << mumps_par.info[1] << std::endl;
524 int WrongInt = Wrong;
525 RCP<const Comm<int> > matComm = this->matrixA_->getComm();
526 Teuchos::broadcast<int,int>(*matComm,0,1,&WrongInt);
527 TEUCHOS_TEST_FOR_EXCEPTION(WrongInt>0,
534 template<
class Matrix,
class Vector>
535 const char* MUMPS<Matrix,Vector>::name =
"MUMPS";
539 #endif // AMESOS2_MUMPS_DEF_HPP
int numericFactorization_impl()
MUMPS specific numeric factorization.
Definition: Amesos2_MUMPS_def.hpp:203
EPhase
Used to indicate a phase in the direct solution.
Definition: Amesos2_TypeDecl.hpp:65
global_size_type globalNumCols_
Number of global columns in matrixA_.
Definition: Amesos2_SolverCore_decl.hpp:478
Amesos2 MUMPS declarations.
Helper class for getting 1-D copies of multivectors.
Definition: Amesos2_MultiVecAdapter_decl.hpp:266
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition: Amesos2_MUMPS_def.hpp:174
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
MUMPS specific solve.
Definition: Amesos2_MUMPS_def.hpp:233
A generic helper class for getting a CCS representation of a Matrix.
Definition: Amesos2_Util.hpp:765
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_MUMPS_def.hpp:307
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_MUMPS_def.hpp:387
Amesos2 interface to the MUMPS package.
Definition: Amesos2_MUMPS_decl.hpp:84
A Matrix adapter interface for Amesos2.
Definition: Amesos2_MatrixAdapter_decl.hpp:76
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_MUMPS_def.hpp:359
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_MUMPS_def.hpp:316
Passes functions to TPL functions based on type.
Definition: Amesos2_FunctionMap.hpp:76
Helper class for putting 1-D data arrays into multivectors.
Definition: Amesos2_MultiVecAdapter_decl.hpp:344
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