53#ifndef AMESOS2_LAPACK_DEF_HPP
54#define AMESOS2_LAPACK_DEF_HPP
56#include <Teuchos_RCP.hpp>
64 template <
class Matrix,
class Vector>
66 Teuchos::RCP<Vector> X,
67 Teuchos::RCP<const Vector> B)
69 , is_contiguous_(true)
72 Teuchos::RCP<Teuchos::ParameterList> default_params
78 template <
class Matrix,
class Vector>
87 template<
class Matrix,
class Vector>
95 template <
class Matrix,
class Vector>
103 template <
class Matrix,
class Vector>
111 solver_.setMatrix( Teuchos::rcpFromRef(lu_) );
114#ifdef HAVE_AMESOS2_TIMERS
115 Teuchos::TimeMonitor numFactTimer( this->timers_.numFactTime_ );
117 factor_ierr = solver_.factor();
121 Teuchos::broadcast(*(this->getComm()), 0, &factor_ierr);
122 TEUCHOS_TEST_FOR_EXCEPTION( factor_ierr != 0,
124 "Lapack factor routine returned error code "
130 template <
class Matrix,
class Vector>
138 const global_size_type ld_rhs = this->root_ ? X->getGlobalLength() : 0;
139 const size_t nrhs = X->getGlobalNumVectors();
141 const size_t val_store_size = as<size_t>(ld_rhs * nrhs);
143 rhsvals_.resize(val_store_size);
147#ifdef HAVE_AMESOS2_TIMERS
148 Teuchos::TimeMonitor mvConvTimer( this->timers_.vecConvTime_ );
149 Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ );
152 scalar_type> copy_helper;
153 if ( is_contiguous_ ==
true ) {
154 copy_helper::do_get(B, rhsvals_(), as<size_t>(ld_rhs),
ROOTED, 0);
165#ifdef HAVE_AMESOS2_TIMERS
166 Teuchos::TimeMonitor solveTimer( this->timers_.solveTime_ );
169 using Teuchos::rcpFromRef;
170 typedef Teuchos::SerialDenseMatrix<int,scalar_type> DenseMat;
172 DenseMat rhs_dense_mat(Teuchos::View, rhsvals_.getRawPtr(),
173 as<int>(ld_rhs), as<int>(ld_rhs), as<int>(nrhs));
175 solver_.setVectors( rcpFromRef(rhs_dense_mat),
176 rcpFromRef(rhs_dense_mat) );
178 solve_ierr = solver_.solve();
184 Teuchos::broadcast(*(this->getComm()), 0, &solve_ierr);
185 TEUCHOS_TEST_FOR_EXCEPTION( solve_ierr != 0,
187 "Lapack solver solve method returned with error code "
192#ifdef HAVE_AMESOS2_TIMERS
193 Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ );
196 if ( is_contiguous_ ==
true ) {
214 template <
class Matrix,
class Vector>
221 return( this->globalNumCols_ == this->globalNumRows_ );
225 template <
class Matrix,
class Vector>
229 solver_.solveWithTranspose( parameterList->get<
bool>(
"Transpose",
230 this->control_.useTranspose_) );
232 solver_.factorWithEquilibration( parameterList->get<
bool>(
"Equilibrate",
true) );
234 if( parameterList->isParameter(
"IsContiguous") ){
235 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
241 template <
class Matrix,
class Vector>
242 Teuchos::RCP<const Teuchos::ParameterList>
245 using Teuchos::ParameterList;
247 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
249 if( is_null(valid_params) ){
250 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
252 pl->set(
"Equilibrate",
true,
"Whether to equilibrate the input matrix");
254 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
265 template <
class Matrix,
class Vector>
269#ifdef HAVE_AMESOS2_TIMERS
270 Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
274 if( current_phase < NUMFACT )
return(
false );
277 Kokkos::resize(nzvals_view_,this->globalNumNonZeros_);
278 Kokkos::resize(rowind_view_,this->globalNumNonZeros_);
279 Kokkos::resize(colptr_view_,this->globalNumCols_ + 1);
285#ifdef HAVE_AMESOS2_TIMERS
286 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
292 host_value_type_array, host_ordinal_type_array, host_ordinal_type_array> ccs_helper;
293 if ( is_contiguous_ ==
true ) {
294 ccs_helper::do_get(this->matrixA_.ptr(),
295 nzvals_view_, rowind_view_, colptr_view_,
299 ccs_helper::do_get(this->matrixA_.ptr(),
300 nzvals_view_, rowind_view_, colptr_view_,
307 lu_.shape(this->globalNumRows_, this->globalNumCols_);
310 global_size_type end_col = this->globalNumCols_;
311 for( global_size_type col = 0; col < end_col; ++col ){
312 global_ordinal_type ptr = colptr_view_[col];
313 global_ordinal_type end_ptr = colptr_view_[col+1];
314 for( ; ptr < end_ptr; ++ptr ){
315 lu_(rowind_view_[ptr], col) = nzvals_view_[ptr];
326 template<
class Matrix,
class Vector>
Declarations for the Amesos2 interface to LAPACK.
@ ROOTED
Definition: Amesos2_TypeDecl.hpp:127
@ CONTIGUOUS_AND_ROOTED
Definition: Amesos2_TypeDecl.hpp:128
@ ARBITRARY
Definition: Amesos2_TypeDecl.hpp:143
Amesos2 interface to the LAPACK.
Definition: Amesos2_Lapack_decl.hpp:81
~Lapack()
Destructor.
Definition: Amesos2_Lapack_def.hpp:79
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_Lapack_def.hpp:227
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_Lapack_def.hpp:216
int numericFactorization_impl()
Perform numeric factorization using LAPACK.
Definition: Amesos2_Lapack_def.hpp:105
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_Lapack_def.hpp:243
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_Lapack_def.hpp:267
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
Lapack solve.
Definition: Amesos2_Lapack_def.hpp:132
int preOrdering_impl()
No-op.
Definition: Amesos2_Lapack_def.hpp:89
int symbolicFactorization_impl()
No-op.
Definition: Amesos2_Lapack_def.hpp:97
Lapack(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition: Amesos2_Lapack_def.hpp:65
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers.
Definition: Amesos2_SolverCore_decl.hpp:106
super_type & setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Set/update internal variables and solver options.
Definition: Amesos2_SolverCore_def.hpp:518
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Return a const parameter list of all of the valid parameters that this->setParameterList(....
Definition: Amesos2_SolverCore_def.hpp:550
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