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;
 
   91     using Teuchos::MpiComm;
 
   94     using Teuchos::rcp_dynamic_cast;
 
   97     mumps_par.comm_fortran = -987654;
 
   98     RCP<const Comm<int> > matComm = this->
matrixA_->getComm();
 
  100     TEUCHOS_TEST_FOR_EXCEPTION(
 
  101                                matComm.is_null(), std::logic_error, 
"Amesos2::Comm");
 
  102     RCP<const MpiComm<int> > matMpiComm = 
 
  103       rcp_dynamic_cast<
const MpiComm<int> >(matComm);
 
  105     TEUCHOS_TEST_FOR_EXCEPTION(
 
  106                                matMpiComm->getRawMpiComm().is_null(), 
 
  107                                std::logic_error, 
"Amesos2::MPI");
 
  108     MPI_Comm rawMpiComm = (* (matMpiComm->getRawMpiComm()) )();
 
  109     mumps_par.comm_fortran = (int) MPI_Comm_c2f(rawMpiComm);
 
  116     function_map::mumps_c(&(mumps_par)); 
 
  122     mumps_par.icntl[0] = -1; 
 
  123     mumps_par.icntl[1] = -1; 
 
  124     mumps_par.icntl[2] = -1; 
 
  125     mumps_par.icntl[3] = 1; 
 
  126     mumps_par.icntl[4] = 0;  
 
  127     mumps_par.icntl[5] = 7;  
 
  128     mumps_par.icntl[6] = 7;  
 
  129     mumps_par.icntl[7] = 7; 
 
  130     mumps_par.icntl[8] = 1;  
 
  131     mumps_par.icntl[9] = 0;  
 
  132     mumps_par.icntl[10] = 0; 
 
  133     mumps_par.icntl[11] = 0; 
 
  134     mumps_par.icntl[12] = 0; 
 
  135     mumps_par.icntl[13] = 20; 
 
  136     mumps_par.icntl[17] = 0; 
 
  137     mumps_par.icntl[18] = 0; 
 
  138     mumps_par.icntl[19] = 0; 
 
  139     mumps_par.icntl[20] = 0; 
 
  140     mumps_par.icntl[21] = 0; 
 
  141     mumps_par.icntl[22] = 0; 
 
  142     mumps_par.icntl[23] = 0; 
 
  143     mumps_par.icntl[24] = 0; 
 
  144     mumps_par.icntl[25] = 0; 
 
  145     mumps_par.icntl[27] = 1; 
 
  146     mumps_par.icntl[28] = 0; 
 
  147     mumps_par.icntl[29] = 0; 
 
  148     mumps_par.icntl[30] = 0; 
 
  149     mumps_par.icntl[31] = 0; 
 
  150     mumps_par.icntl[32] = 0; 
 
  154   template <
class Matrix, 
class Vector>
 
  155   MUMPS<Matrix,Vector>::~MUMPS( )
 
  158     if(MUMPS_STRUCT == 
true)
 
  166   template<
class Matrix, 
class Vector>
 
  172     #ifdef HAVE_AMESOS2_TIMERS 
  173     Teuchos::TimeMonitor preOrderTimer(this->timers_.preOrderTime_);
 
  179   template <
class Matrix, 
class Vector>
 
  188     function_map::mumps_c(&(mumps_par));
 
  195   template <
class Matrix, 
class Vector>
 
  205           #ifdef HAVE_AMESOS2_TIMERS 
  206           Teuchos::TimeMonitor numFactTimer(this->timers_.numFactTime_);
 
  209           #ifdef HAVE_AMESOS2_VERBOSE_DEBUG 
  210           std::cout << 
"MUMPS:: Before numeric factorization" << std::endl;
 
  211           std::cout << 
"nzvals_ : " << nzvals_.toString() << std::endl;
 
  212           std::cout << 
"rowind_ : " << rowind_.toString() << std::endl;
 
  213           std::cout << 
"colptr_ : " << colptr_.toString() << std::endl;
 
  218     function_map::mumps_c(&(mumps_par));
 
  225   template <
class Matrix, 
class Vector>
 
  236     const global_size_type ld_rhs = this->root_ ? X->getGlobalLength() : 0;
 
  237     const size_t nrhs = X->getGlobalNumVectors();
 
  239     const size_t val_store_size = as<size_t>(ld_rhs * nrhs);
 
  241     xvals_.resize(val_store_size);
 
  242     bvals_.resize(val_store_size);
 
  244     #ifdef HAVE_AMESOS2_TIMERS 
  245     Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_);
 
  246     Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ );
 
  249     if ( is_contiguous_ == 
true ) {
 
  251         slu_type>::do_get(B, bvals_(),as<size_t>(ld_rhs), ROOTED, this->rowIndexBase_);
 
  255         slu_type>::do_get(B, bvals_(),as<size_t>(ld_rhs), CONTIGUOUS_AND_ROOTED, this->rowIndexBase_);
 
  260     mumps_par.nrhs = nrhs;
 
  261     mumps_par.lrhs = mumps_par.n;
 
  266         mumps_par.rhs = bvals_.getRawPtr();
 
  269     #ifdef HAVE_AMESOS2_TIMERS 
  270     Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_);
 
  273     function_map::mumps_c(&(mumps_par));
 
  277     #ifdef HAVE_AMESOS2_TIMERS 
  278     Teuchos::TimeMonitor redistTimer2(this->timers_.vecRedistTime_);
 
  281     if ( is_contiguous_ == 
true ) {
 
  291             CONTIGUOUS_AND_ROOTED);
 
  298   template <
class Matrix, 
class Vector>
 
  303     return( this->globalNumRows_ == this->globalNumCols_ );
 
  307   template <
class Matrix, 
class Vector>
 
  312     using Teuchos::getIntegralValue;
 
  313     using Teuchos::ParameterEntryValidator;
 
  315     RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
 
  318     if(parameterList->isParameter(
"ICNTL(1)"))
 
  320         mumps_par.icntl[0] = getIntegralValue<local_ordinal_type>(*parameterList, 
 
  323     if(parameterList->isParameter(
"ICNTL(2)"))
 
  325         mumps_par.icntl[0] = getIntegralValue<local_ordinal_type>(*parameterList, 
 
  328     if(parameterList->isParameter(
"ICNTL(3)"))
 
  330         mumps_par.icntl[0] = getIntegralValue<local_ordinal_type>(*parameterList, 
 
  333     if(parameterList->isParameter(
"ICNTL(4)"))
 
  335         mumps_par.icntl[0] = getIntegralValue<local_ordinal_type>(*parameterList, 
 
  338     if(parameterList->isParameter(
"ICNTL(6)"))
 
  340         mumps_par.icntl[0] = getIntegralValue<local_ordinal_type>(*parameterList, 
 
  343     if(parameterList->isParameter(
"ICNTL(9)"))
 
  345         mumps_par.icntl[0] = getIntegralValue<local_ordinal_type>(*parameterList, 
 
  348     if(parameterList->isParameter(
"ICNTL(11)"))
 
  350         mumps_par.icntl[0] = getIntegralValue<local_ordinal_type>(*parameterList, 
 
  354     if( parameterList->isParameter(
"IsContiguous") ){
 
  355       is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
 
  361   template <
class Matrix, 
class Vector>
 
  362   Teuchos::RCP<const Teuchos::ParameterList>
 
  365     using Teuchos::ParameterList;
 
  367     static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
 
  369     if( is_null(valid_params) ){
 
  370       Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
 
  372       pl->set(
"ICNTL(1)", 
"no", 
"See Manual" );
 
  373       pl->set(
"ICNTL(2)", 
"no", 
"See Manual" );
 
  374       pl->set(
"ICNTL(3)", 
"no", 
"See Manual" );
 
  375       pl->set(
"ICNTL(4)", 
"no", 
"See Manual" );
 
  376       pl->set(
"ICNTL(6)", 
"no", 
"See Manual" );
 
  377       pl->set(
"ICNTL(9)", 
"no", 
"See Manual" );
 
  378       pl->set(
"ICNTL(11)", 
"no", 
"See Manual" );
 
  380       pl->set(
"IsContiguous", 
true, 
"Whether GIDs contiguous");
 
  389   template <
class Matrix, 
class Vector>
 
  395     #ifdef HAVE_AMESOS2_TIMERS 
  396     Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
 
  399     if(MUMPS_MATRIX_LOAD == 
false)
 
  403           nzvals_.resize(this->globalNumNonZeros_);
 
  404           rowind_.resize(this->globalNumNonZeros_);
 
  405           colptr_.resize(this->globalNumCols_ + 1);
 
  408         local_ordinal_type nnz_ret = 0;
 
  410         #ifdef HAVE_AMESOS2_TIMERS 
  411         Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
 
  414         if ( is_contiguous_ == 
true ) {
 
  417             ::do_get(this->matrixA_.ptr(), nzvals_(), rowind_(), colptr_(),
 
  418                 nnz_ret, ROOTED, ARBITRARY, this->rowIndexBase_);
 
  423             ::do_get(this->matrixA_.ptr(), nzvals_(), rowind_(), colptr_(),
 
  424                 nnz_ret, CONTIGUOUS_AND_ROOTED, ARBITRARY, this->rowIndexBase_);
 
  428                   TEUCHOS_TEST_FOR_EXCEPTION( nnz_ret != as<local_ordinal_type>(this->globalNumNonZeros_),
 
  430                         "Did not get the expected number of non-zero vals");
 
  439     MUMPS_MATRIX_LOAD = 
true;
 
  443   template <
class Matrix, 
class Vector>
 
  448     mumps_par.n =  this->globalNumCols_;
 
  449     mumps_par.nz = this->globalNumNonZeros_;
 
  450     mumps_par.a = (magnitude_type*)malloc(mumps_par.nz * 
sizeof(magnitude_type));
 
  451     mumps_par.irn = (MUMPS_INT*)malloc(mumps_par.nz *
sizeof(MUMPS_INT));
 
  452     mumps_par.jcn = (MUMPS_INT*)malloc(mumps_par.nz * 
sizeof(MUMPS_INT));
 
  454     if((mumps_par.a == NULL) || (mumps_par.irn == NULL) 
 
  455        || (mumps_par.jcn == NULL))
 
  461     local_ordinal_type tri_count = 0;
 
  462     local_ordinal_type i,j;
 
  463     local_ordinal_type max_local_ordinal = 0;
 
  465     for(i = 0; i < (local_ordinal_type)this->globalNumCols_; i++)
 
  467         for( j = colptr_[i]; j < colptr_[i+1]-1; j++)
 
  469             mumps_par.jcn[tri_count] = (MUMPS_INT)i+1; 
 
  470             mumps_par.irn[tri_count] = (MUMPS_INT)rowind_[j]+1; 
 
  471             mumps_par.a[tri_count] = nzvals_[j];
 
  477         mumps_par.jcn[tri_count] = (MUMPS_INT)i+1; 
 
  478         mumps_par.irn[tri_count] = (MUMPS_INT)rowind_[j]+1; 
 
  479         mumps_par.a[tri_count] = nzvals_[j];
 
  483         if(rowind_[j] > max_local_ordinal)
 
  485             max_local_ordinal = rowind_[j];
 
  488     TEUCHOS_TEST_FOR_EXCEPTION(std::numeric_limits<MUMPS_INT>::max() <= max_local_ordinal,
 
  490                                "Matrix index larger than MUMPS_INT");
 
  495   template<
class Matrix, 
class Vector>
 
  497   MUMPS<Matrix,Vector>::MUMPS_ERROR()
const 
  499     if(mumps_par.info[0] < 0)
 
  501         TEUCHOS_TEST_FOR_EXCEPTION(
false,
 
  508   template<
class Matrix, 
class Vector>
 
  509   const char* MUMPS<Matrix,Vector>::name = 
"MUMPS";
 
  513 #endif  // AMESOS2_MUMPS_DEF_HPP 
int numericFactorization_impl()
MUMPS specific numeric factorization. 
Definition: Amesos2_MUMPS_def.hpp:197
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:168
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:227
A generic helper class for getting a CCS representation of a Matrix. 
Definition: Amesos2_Util.hpp:654
bool matrixShapeOK_impl() const 
Determines whether the shape of the matrix is OK for this solver. 
Definition: Amesos2_MUMPS_def.hpp:300
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures. 
Definition: Amesos2_MUMPS_def.hpp:391
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:363
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_MUMPS_def.hpp:309
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: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