42 #ifndef BELOS_RCG_ITER_HPP
43 #define BELOS_RCG_ITER_HPP
91 template <
class ScalarType,
class MV>
136 U(Teuchos::null),
AU(Teuchos::null),
137 Alpha(Teuchos::null),
Beta(Teuchos::null),
D(Teuchos::null),
rTz_old(Teuchos::null),
195 template<
class ScalarType,
class MV,
class OP>
295 if (!initialized_)
return 0;
329 "Belos::RCGIter::setBlockSize(): Cannot use a block size that is not one.");
333 void setSize(
int recycleBlocks,
int numBlocks );
411 template<
class ScalarType,
class MV,
class OP>
428 "Belos::RCGIter::constructor: mandatory parameter \"Num Blocks\" is not specified.");
429 int nb = Teuchos::getParameter<int>(params,
"Num Blocks");
432 "Belos::RCGIter::constructor: mandatory parameter \"Recycled Blocks\" is not specified.");
433 int rb = Teuchos::getParameter<int>(params,
"Recycled Blocks");
441 template <
class ScalarType,
class MV,
class OP>
445 TEUCHOS_TEST_FOR_EXCEPTION(numBlocks <= 0, std::invalid_argument,
"Belos::RCGIter::setSize() was passed a non-positive argument for \"Num Blocks\".");
446 TEUCHOS_TEST_FOR_EXCEPTION(recycleBlocks <= 0, std::invalid_argument,
"Belos::RCGIter::setSize() was passed a non-positive argument for \"Recycled Blocks\".");
447 TEUCHOS_TEST_FOR_EXCEPTION(recycleBlocks >= numBlocks, std::invalid_argument,
"Belos::RCGIter::setSize() the number of recycled blocks is larger than the allowable subspace.");
449 numBlocks_ = numBlocks;
450 recycleBlocks_ = recycleBlocks;
456 template <
class ScalarType,
class MV,
class OP>
460 if (newstate.
P != Teuchos::null &&
461 newstate.
Ap != Teuchos::null &&
462 newstate.
r != Teuchos::null &&
463 newstate.
z != Teuchos::null &&
464 newstate.
U != Teuchos::null &&
465 newstate.
AU != Teuchos::null &&
466 newstate.
Alpha != Teuchos::null &&
467 newstate.
Beta != Teuchos::null &&
468 newstate.
D != Teuchos::null &&
469 newstate.
Delta != Teuchos::null &&
470 newstate.
LUUTAU != Teuchos::null &&
471 newstate.
ipiv != Teuchos::null &&
472 newstate.
rTz_old != Teuchos::null) {
474 curDim_ = newstate.
curDim;
479 existU_ = newstate.
existU;
482 Alpha_ = newstate.
Alpha;
483 Beta_ = newstate.
Beta;
485 Delta_ = newstate.
Delta;
486 LUUTAU_ = newstate.
LUUTAU;
487 ipiv_ = newstate.
ipiv;
493 "Belos::RCGIter::initialize(): RCGIterState does not have P initialized.");
496 "Belos::RCGIter::initialize(): RCGIterState does not have Ap initialized.");
499 "Belos::RCGIter::initialize(): RCGIterState does not have r initialized.");
502 "Belos::RCGIter::initialize(): RCGIterState does not have z initialized.");
505 "Belos::RCGIter::initialize(): RCGIterState does not have U initialized.");
508 "Belos::RCGIter::initialize(): RCGIterState does not have AU initialized.");
511 "Belos::RCGIter::initialize(): RCGIterState does not have Alpha initialized.");
514 "Belos::RCGIter::initialize(): RCGIterState does not have Beta initialized.");
517 "Belos::RCGIter::initialize(): RCGIterState does not have D initialized.");
520 "Belos::RCGIter::initialize(): RCGIterState does not have Delta initialized.");
523 "Belos::RCGIter::initialize(): RCGIterState does not have LUUTAU initialized.");
526 "Belos::RCGIter::initialize(): RCGIterState does not have ipiv initialized.");
529 "Belos::RCGIter::initialize(): RCGIterState does not have rTz_old initialized.");
540 template <
class ScalarType,
class MV,
class OP>
544 "Belos::RCGIter::iterate(): RCGIter class not initialized." );
554 std::vector<int> index(1);
562 "Belos::RCGIter::iterate(): current linear system has more than one std::vector!" );
565 int searchDim = numBlocks_+1;
577 while (stest_->checkStatus(
this) !=
Passed && curDim_+1 <= searchDim) {
582 p_ = MVT::CloneView( *P_, index );
583 lp_->applyOp( *p_, *Ap_ );
586 MVT::MvTransMv( one, *p_, *Ap_, pAp );
587 (*D_)(i_,0) = pAp(0,0);
590 (*Alpha_)(i_,0) = (*rTz_old_)(0,0) / pAp(0,0);
596 MVT::MvAddMv( one, *cur_soln_vec, (*Alpha_)(i_,0), *p_, *cur_soln_vec );
597 lp_->updateSolution();
600 MVT::MvAddMv( one, *r_, -(*Alpha_)(i_,0), *Ap_, *r_ );
602 std::vector<MagnitudeType> norm(1);
603 MVT::MvNorm( *r_, norm );
607 if ( lp_->getLeftPrec() != Teuchos::null ) {
608 lp_->applyLeftPrec( *r_, *z_ );
610 else if ( lp_->getRightPrec() != Teuchos::null ) {
611 lp_->applyRightPrec( *r_, *z_ );
618 MVT::MvTransMv( one, *r_, *z_, rTz );
621 (*Beta_)(i_,0) = rTz(0,0) / (*rTz_old_)(0,0);
624 (*rTz_old_)(0,0) = rTz(0,0);
629 pnext_ = MVT::CloneViewNonConst( *P_, index );
634 MVT::MvTransMv( one, *AU_, *z_, mu );
637 lapack.
GETRS(
TRANS, recycleBlocks_, 1, LUUTAU_->values(), LUUTAU_->stride(), &(*ipiv_)[0], mu.
values(), mu.
stride(), &info );
639 "Belos::RCGIter::solve(): LAPACK GETRS failed to compute a solution.");
642 MVT::MvAddMv( (*Beta_)(i_,0), *p_, one, *z_, *pnext_ );
644 MVT::MvTimesMatAddMv( -one, *U_, mu, one, *pnext_ );
648 MVT::MvAddMv( (*Beta_)(i_,0), *p_, one, *z_, *pnext_ );
653 pnext_ = Teuchos::null;