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 "
133 const Teuchos::Ptr<
const MultiVecAdapter<Vector> > B)
const
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 ) {
198 MultiVecAdapter<Vector>,scalar_type>::do_put(X, rhsvals_(),
204 MultiVecAdapter<Vector>,scalar_type>::do_put(X, rhsvals_(),
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");
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];
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