44#ifndef AMESOS2_UMFPACK_DEF_HPP
45#define AMESOS2_UMFPACK_DEF_HPP
47#include <Teuchos_Tuple.hpp>
48#include <Teuchos_ParameterList.hpp>
49#include <Teuchos_StandardParameterEntryValidators.hpp>
52#include "Amesos2_Umfpack_decl.hpp"
57template <
class Matrix,
class Vector>
59 Teuchos::RCP<const Matrix> A,
60 Teuchos::RCP<Vector> X,
61 Teuchos::RCP<const Vector> B )
63 , is_contiguous_(true)
65 data_.Symbolic = NULL;
70template <
class Matrix,
class Vector>
73 if (data_.Symbolic) function_map::umfpack_free_symbolic (&data_.Symbolic);
74 if (data_.Numeric) function_map::umfpack_free_numeric (&data_.Numeric);
77template <
class Matrix,
class Vector>
81 std::ostringstream oss;
82 oss <<
"Umfpack solver interface";
86template<
class Matrix,
class Vector>
94template <
class Matrix,
class Vector>
100 if (data_.Symbolic) {
101 function_map::umfpack_free_symbolic(&(data_.Symbolic));
104 function_map::umfpack_defaults(data_.Control);
106 status = function_map::umfpack_symbolic(
109 &(this->
nzvals_view_[0]), &(data_.Symbolic), data_.Control, data_.Info);
116template <
class Matrix,
class Vector>
122 if(!data_.Symbolic) {
126 function_map::umfpack_defaults(data_.Control);
129 function_map::umfpack_free_numeric(&(data_.Numeric));
132 status = function_map::umfpack_numeric(
135 &(data_.Numeric), data_.Control, data_.Info);
140template <
class Matrix,
class Vector>
147 const global_size_type ld_rhs = this->
root_ ? X->getGlobalLength() : 0;
148 const size_t nrhs = X->getGlobalNumVectors();
150 const size_t val_store_size = as<size_t>(ld_rhs * nrhs);
151 Teuchos::Array<umfpack_type> xValues(val_store_size);
152 Teuchos::Array<umfpack_type> bValues(val_store_size);
155#ifdef HAVE_AMESOS2_TIMERS
156 Teuchos::TimeMonitor mvConvTimer(this->
timers_.vecConvTime_);
157 Teuchos::TimeMonitor redistTimer( this->
timers_.vecRedistTime_ );
159 if ( is_contiguous_ ==
true ) {
161 umfpack_type>::do_get(B, bValues(),
168 umfpack_type>::do_get(B, bValues(),
175 int UmfpackRequest = this->
control_.useTranspose_ ? UMFPACK_At : UMFPACK_A;
181#ifdef HAVE_AMESOS2_TIMER
182 Teuchos::TimeMonitor solveTimer(this->
timers_.solveTime_);
184 if (data_.Symbolic) {
185 function_map::umfpack_free_symbolic(&(data_.Symbolic));
189 int i_ld_rhs = as<int>(ld_rhs);
191 for(
size_t j = 0 ; j < nrhs; j++) {
192 int status = function_map::umfpack_solve(
195 &xValues.getRawPtr()[j*i_ld_rhs],
196 &bValues.getRawPtr()[j*i_ld_rhs],
197 data_.Numeric, data_.Control, data_.Info);
208 Teuchos::broadcast(*(this->
getComm()), 0, &ierr);
210 TEUCHOS_TEST_FOR_EXCEPTION( ierr != 0, std::runtime_error,
211 "umfpack_solve has error code: " << ierr );
215#ifdef HAVE_AMESOS2_TIMERS
216 Teuchos::TimeMonitor redistTimer(this->
timers_.vecRedistTime_);
219 if ( is_contiguous_ ==
true ) {
239template <
class Matrix,
class Vector>
246 return( this->
matrixA_->getGlobalNumRows() == this->matrixA_->getGlobalNumCols() );
250template <
class Matrix,
class Vector>
252Umfpack<Matrix,Vector>::setParameters_impl(
const Teuchos::RCP<Teuchos::ParameterList> & parameterList )
255 using Teuchos::getIntegralValue;
256 using Teuchos::ParameterEntryValidator;
258 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
260 if( parameterList->isParameter(
"IsContiguous") ){
261 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
266template <
class Matrix,
class Vector>
267Teuchos::RCP<const Teuchos::ParameterList>
270 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
272 if( is_null(valid_params) ){
273 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
275 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
284template <
class Matrix,
class Vector>
288 if(current_phase == SOLVE) {
292#ifdef HAVE_AMESOS2_TIMERS
293 Teuchos::TimeMonitor convTimer(this->
timers_.mtxConvTime_);
305#ifdef HAVE_AMESOS2_TIMERS
306 Teuchos::TimeMonitor mtxRedistTimer( this->
timers_.mtxRedistTime_ );
311 "Row and column maps have different indexbase ");
312 if ( is_contiguous_ ==
true ) {
314 host_value_type_array,host_ordinal_type_array, host_size_type_array>::do_get(this->
matrixA_.ptr(),
319 this->rowIndexBase_);
322 host_value_type_array,host_ordinal_type_array, host_size_type_array>::do_get(this->
matrixA_.ptr(),
327 this->rowIndexBase_);
335template<
class Matrix,
class Vector>
@ ROOTED
Definition Amesos2_TypeDecl.hpp:127
@ CONTIGUOUS_AND_ROOTED
Definition Amesos2_TypeDecl.hpp:128
@ ARBITRARY
Definition Amesos2_TypeDecl.hpp:143
Utility functions for Amesos2.
Teuchos::RCP< const MatrixAdapter< Matrix > > matrixA_
Definition Amesos2_SolverCore_decl.hpp:455
bool root_
Definition Amesos2_SolverCore_decl.hpp:506
SolverCore(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
global_size_type rowIndexBase_
Definition Amesos2_SolverCore_decl.hpp:485
global_size_type globalNumCols_
Definition Amesos2_SolverCore_decl.hpp:479
global_size_type columnIndexBase_
Definition Amesos2_SolverCore_decl.hpp:488
Timers timers_
Definition Amesos2_SolverCore_decl.hpp:497
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
Definition Amesos2_SolverCore_decl.hpp:363
global_size_type globalNumNonZeros_
Definition Amesos2_SolverCore_decl.hpp:482
global_size_type globalNumRows_
Definition Amesos2_SolverCore_decl.hpp:476
Control control_
Definition Amesos2_SolverCore_decl.hpp:494
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition Amesos2_Umfpack_def.hpp:286
int numericFactorization_impl()
Umfpack specific numeric factorization.
Definition Amesos2_Umfpack_def.hpp:118
host_size_type_array colptr_view_
Stores the row indices of the nonzero entries.
Definition Amesos2_Umfpack_decl.hpp:211
host_value_type_array nzvals_view_
Stores the values of the nonzero entries for Umfpack.
Definition Amesos2_Umfpack_decl.hpp:207
host_ordinal_type_array rowind_view_
Stores the location in Ai_ and Aval_ that starts row j.
Definition Amesos2_Umfpack_decl.hpp:209
~Umfpack()
Destructor.
Definition Amesos2_Umfpack_def.hpp:71
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
Umfpack specific solve.
Definition Amesos2_Umfpack_def.hpp:142
std::string description() const
Returns a short description of this Solver.
Definition Amesos2_Umfpack_def.hpp:79
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition Amesos2_Umfpack_def.hpp:88
Umfpack(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition Amesos2_Umfpack_def.hpp:58
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using Umfpack.
Definition Amesos2_Umfpack_def.hpp:96
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition Amesos2_Umfpack_def.hpp:241
static const char * name
Name of this solver interface.
Definition Amesos2_Umfpack_decl.hpp:71
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition Amesos2_Umfpack_def.hpp:268
EPhase
Used to indicate a phase in the direct solution.
Definition Amesos2_TypeDecl.hpp:65
A templated MultiVector class adapter for Amesos2.
Definition Amesos2_MultiVecAdapter_decl.hpp:176
Helper class for getting 1-D copies of multivectors.
Definition Amesos2_MultiVecAdapter_decl.hpp:267
A generic helper class for getting a CCS representation of a Matrix.
Definition Amesos2_Util.hpp:652
Helper class for putting 1-D data arrays into multivectors.
Definition Amesos2_MultiVecAdapter_decl.hpp:373