42 #ifndef BELOS_BICGSTAB_ITER_HPP
43 #define BELOS_BICGSTAB_ITER_HPP
87 template <
class ScalarType,
class MV>
105 P(Teuchos::null),
V(Teuchos::null)
113 template<
class ScalarType,
class MV,
class OP>
249 "Belos::BiCGStabIter::setBlockSize(): Cannot use a block size that is not one.");
259 void axpy(
const ScalarType alpha,
const MV &
A,
260 const std::vector<ScalarType> beta,
const MV&
B, MV& mv,
bool minus=
false);
306 template<
class ScalarType,
class MV,
class OP>
323 template <
class ScalarType,
class MV,
class OP>
330 "Belos::BiCGStabIter::initialize(): Cannot initialize state storage!");
336 int numRHS = MVT::GetNumberVecs(*tmp);
342 R_ = MVT::Clone( *tmp, numRHS_ );
343 Rhat_ = MVT::Clone( *tmp, numRHS_ );
344 P_ = MVT::Clone( *tmp, numRHS_ );
345 V_ = MVT::Clone( *tmp, numRHS_ );
347 rho_old_.resize(numRHS_);
348 alpha_.resize(numRHS_);
349 omega_.resize(numRHS_);
354 std::string errstr(
"Belos::BlockPseudoCGIter::initialize(): Specified multivectors must have a consistent length and width.");
362 std::invalid_argument, errstr );
364 std::invalid_argument, errstr );
367 if (newstate.
R != R_) {
369 MVT::Assign(*newstate.
R, *R_);
373 lp_->computeCurrResVec(R_.get());
379 MVT::Assign(*newstate.
Rhat, *Rhat_);
383 MVT::Assign(*R_, *Rhat_);
389 MVT::Assign(*newstate.
V, *V_);
399 MVT::Assign(*newstate.
P, *P_);
407 if (newstate.
rho_old.size () ==
static_cast<size_t> (numRHS_)) {
413 rho_old_.assign(numRHS_,one);
417 if (newstate.
alpha.size() ==
static_cast<size_t> (numRHS_)) {
419 alpha_ = newstate.
alpha;
423 alpha_.assign(numRHS_,one);
427 if (newstate.
omega.size() ==
static_cast<size_t> (numRHS_)) {
429 omega_ = newstate.
omega;
433 omega_.assign(numRHS_,one);
440 "Belos::BiCGStabIter::initialize(): BiCGStabStateIterState does not have initial residual.");
450 template <
class ScalarType,
class MV,
class OP>
458 if (initialized_ ==
false) {
464 std::vector<ScalarType> rho_new( numRHS_ ), beta( numRHS_ );
465 std::vector<ScalarType> rhatV( numRHS_ ), tT( numRHS_ ), tS( numRHS_ );
471 RCP<MV> leftPrecVec, leftPrecVec2;
474 S = MVT::Clone( *R_, numRHS_ );
475 T = MVT::Clone( *R_, numRHS_ );
476 if (lp_->isLeftPrec() || lp_->isRightPrec()) {
477 Y = MVT::Clone( *R_, numRHS_ );
478 Z = MVT::Clone( *R_, numRHS_ );
491 while (stest_->checkStatus(
this) !=
Passed) {
503 MVT::MvDot(*R_,*Rhat_,rho_new);
511 for(i=0; i<numRHS_; i++) {
512 beta[i] = (rho_new[i] / rho_old_[i]) * (alpha_[i] / omega_[i]);
519 axpy(one, *P_, omega_, *V_, *P_,
true);
520 axpy(one, *R_, beta, *P_, *P_);
524 if(lp_->isLeftPrec()) {
525 if(lp_->isRightPrec()) {
527 leftPrecVec = MVT::Clone( *R_, numRHS_ );
529 lp_->applyLeftPrec(*P_,*leftPrecVec);
530 lp_->applyRightPrec(*leftPrecVec,*Y);
533 lp_->applyLeftPrec(*P_,*Y);
536 else if(lp_->isRightPrec()) {
537 lp_->applyRightPrec(*P_,*Y);
541 lp_->applyOp(*Y,*V_);
544 MVT::MvDot(*V_,*Rhat_,rhatV);
545 for(i=0; i<numRHS_; i++) {
546 alpha_[i] = rho_new[i] / rhatV[i];
554 axpy(one, *R_, alpha_, *V_, *S,
true);
557 if(lp_->isLeftPrec()) {
558 if(lp_->isRightPrec()) {
560 leftPrecVec = MVT::Clone( *R_, numRHS_ );
562 lp_->applyLeftPrec(*S,*leftPrecVec);
563 lp_->applyRightPrec(*leftPrecVec,*Z);
566 lp_->applyLeftPrec(*S,*Z);
569 else if(lp_->isRightPrec()) {
570 lp_->applyRightPrec(*S,*Z);
580 if(lp_->isLeftPrec()) {
582 leftPrecVec = MVT::Clone( *R_, numRHS_ );
585 leftPrecVec2 = MVT::Clone( *R_, numRHS_ );
587 lp_->applyLeftPrec(*T,*leftPrecVec2);
588 MVT::MvDot(*leftPrecVec2,*leftPrecVec2,tT);
589 MVT::MvDot(*leftPrecVec,*leftPrecVec2,tS);
592 MVT::MvDot(*T,*T,tT);
593 MVT::MvDot(*T,*S,tS);
595 for(i=0; i<numRHS_; i++) {
596 omega_[i] = tS[i] / tT[i];
604 axpy(one, *X, alpha_, *Y, *X);
605 axpy(one, *X, omega_, *Z, *X);
608 axpy(one, *S, omega_, *T, *R_,
true);
618 template <
class ScalarType,
class MV,
class OP>
620 const std::vector<ScalarType> beta,
const MV&
B, MV& mv,
bool minus)
624 std::vector<int> index(1);
626 for(
int i=0; i<numRHS_; i++) {
628 A1 = MVT::CloneView(A,index);
629 B1 = MVT::CloneView(B,index);
630 mv1 = MVT::CloneViewNonConst(mv,index);
632 MVT::MvAddMv(alpha,*A1,-beta[i],*B1,*mv1);
635 MVT::MvAddMv(alpha,*A1,beta[i],*B1,*mv1);
Collection of types and exceptions used within the Belos solvers.
Belos's basic output manager for sending information of select verbosity levels to the appropriate ou...
This class implements the pseudo-block BiCGStab iteration, where the basic BiCGStab algorithm is perf...
Class which manages the output and verbosity of the Belos solvers.
Teuchos::ScalarTraits< ScalarType > SCT
Teuchos::RCP< const MV > R
The current residual.
OperatorTraits< ScalarType, MV, OP > OPT
Teuchos::RCP< const MV > Rhat
The initial residual.
Pure virtual base class which augments the basic interface for a conjugate gradient linear solver ite...
bool is_null(const std::shared_ptr< T > &p)
Teuchos::RCP< MV > getCurrentUpdate() const
Get the current update to the linear system.
Pure virtual base class for defining the status testing capabilities of Belos.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Structure to contain pointers to BiCGStabIteration state variables.
Declaration of basic traits for the multivector type.
void initializeBiCGStab(BiCGStabIterationState< ScalarType, MV > &newstate)
Initialize the solver to an iterate, providing a complete state.
void setBlockSize(int blockSize)
Set the blocksize.
void resetNumIters(int iter=0)
Reset the iteration count.
A pure virtual class for defining the status tests for the Belos iterative solvers.
std::vector< ScalarType > rho_old_
Class which defines basic traits for the operator type.
std::vector< ScalarType > alpha
const Teuchos::RCP< OutputManager< ScalarType > > om_
Traits class which defines basic operations on multivectors.
std::vector< ScalarType > omega
BiCGStabIter(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< OutputManager< ScalarType > > &printer, const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &tester, Teuchos::ParameterList ¶ms)
BiCGStabIter constructor with linear problem, solver utilities, and parameter list of solver options...
void axpy(const ScalarType alpha, const MV &A, const std::vector< ScalarType > beta, const MV &B, MV &mv, bool minus=false)
const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > lp_
A linear system to solve, and its associated information.
Teuchos::RCP< const MV > V
A * M * the first decent direction vector.
Class which describes the linear problem to be solved by the iterative solver.
virtual ~BiCGStabIter()
Destructor.
void initialize()
Initialize the solver with the initial vectors from the linear problem or random data.
Teuchos::RCP< const MV > getNativeResiduals(std::vector< MagnitudeType > *) const
Get the norms of the residuals native to the solver.
Teuchos::RCP< const MV > P
The first decent direction vector.
int getBlockSize() const
Get the blocksize to be used by the iterative solver in solving this linear problem.
const LinearProblem< ScalarType, MV, OP > & getProblem() const
Get a constant reference to the linear problem.
void iterate()
This method performs BiCGStab iterations on each linear system until the status test indicates the ne...
std::vector< ScalarType > rho_old
bool isInitialized()
States whether the solver has been initialized or not.
Class which defines basic traits for the operator type.
const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > stest_
int getNumIters() const
Get the current iteration count.
std::vector< ScalarType > alpha_
SCT::magnitudeType MagnitudeType
MultiVecTraits< ScalarType, MV > MVT
Belos header file which uses auto-configuration information to include necessary C++ headers...
BiCGStabIterationState< ScalarType, MV > getState() const
Get the current state of the linear solver.
Templated virtual class for providing orthogonalization/orthonormalization methods with matrix-based ...
std::vector< ScalarType > omega_