10 #ifndef BELOS_BICGSTAB_ITER_HPP
11 #define BELOS_BICGSTAB_ITER_HPP
54 template <
class ScalarType,
class MV>
72 P(Teuchos::null),
V(Teuchos::null)
80 template<
class ScalarType,
class MV,
class OP>
175 state.
alpha = alpha_;
176 state.
omega = omega_;
220 "Belos::BiCGStabIter::setBlockSize(): Cannot use a block size that is not one.");
230 void axpy(
const ScalarType alpha,
const MV & A,
231 const std::vector<ScalarType> beta,
const MV& B, MV& mv,
bool minus=
false);
275 std::vector<ScalarType> rho_old_, alpha_, omega_;
280 template<
class ScalarType,
class MV,
class OP>
298 template <
class ScalarType,
class MV,
class OP>
305 "Belos::BiCGStabIter::initialize(): Cannot initialize state storage!");
311 int numRHS = MVT::GetNumberVecs(*tmp);
317 R_ = MVT::Clone( *tmp, numRHS_ );
318 Rhat_ = MVT::Clone( *tmp, numRHS_ );
319 P_ = MVT::Clone( *tmp, numRHS_ );
320 V_ = MVT::Clone( *tmp, numRHS_ );
322 rho_old_.resize(numRHS_);
323 alpha_.resize(numRHS_);
324 omega_.resize(numRHS_);
332 std::string errstr(
"Belos::BlockPseudoCGIter::initialize(): Specified multivectors must have a consistent length and width.");
335 const ScalarType one = SCT::one();
340 std::invalid_argument, errstr );
342 std::invalid_argument, errstr );
345 if (newstate.
R != R_) {
347 MVT::Assign(*newstate.
R, *R_);
351 lp_->computeCurrResVec(R_.get());
357 MVT::Assign(*newstate.
Rhat, *Rhat_);
361 MVT::Assign(*R_, *Rhat_);
367 MVT::Assign(*newstate.
V, *V_);
377 MVT::Assign(*newstate.
P, *P_);
385 if (newstate.
rho_old.size () ==
static_cast<size_t> (numRHS_)) {
391 rho_old_.assign(numRHS_,one);
395 if (newstate.
alpha.size() ==
static_cast<size_t> (numRHS_)) {
397 alpha_ = newstate.
alpha;
401 alpha_.assign(numRHS_,one);
405 if (newstate.
omega.size() ==
static_cast<size_t> (numRHS_)) {
407 omega_ = newstate.
omega;
411 omega_.assign(numRHS_,one);
418 "Belos::BiCGStabIter::initialize(): BiCGStabStateIterState does not have initial residual.");
428 template <
class ScalarType,
class MV,
class OP>
436 if (initialized_ ==
false) {
442 std::vector<ScalarType> rho_new( numRHS_ ), beta( numRHS_ );
443 std::vector<ScalarType> rhatV( numRHS_ ), tT( numRHS_ ), tS( numRHS_ );
446 const ScalarType one = SCT::one();
449 RCP<MV> leftPrecVec, leftPrecVec2;
452 S = MVT::Clone( *R_, numRHS_ );
453 T = MVT::Clone( *R_, numRHS_ );
454 if (lp_->isLeftPrec() || lp_->isRightPrec()) {
455 Y = MVT::Clone( *R_, numRHS_ );
456 Z = MVT::Clone( *R_, numRHS_ );
469 while (stest_->checkStatus(
this) !=
Passed && !breakdown_) {
475 MVT::MvDot(*R_,*Rhat_,rho_new);
479 for(i=0; i<numRHS_; i++) {
482 if (SCT::magnitude(rho_new[i]) < MT::sfmin())
485 beta[i] = (rho_new[i] / rho_old_[i]) * (alpha_[i] / omega_[i]);
491 axpy(one, *P_, omega_, *V_, *P_,
true);
492 axpy(one, *R_, beta, *P_, *P_);
496 if(lp_->isLeftPrec()) {
497 if(lp_->isRightPrec()) {
498 if(leftPrecVec == Teuchos::null) {
499 leftPrecVec = MVT::Clone( *R_, numRHS_ );
501 lp_->applyLeftPrec(*P_,*leftPrecVec);
502 lp_->applyRightPrec(*leftPrecVec,*Y);
505 lp_->applyLeftPrec(*P_,*Y);
508 else if(lp_->isRightPrec()) {
509 lp_->applyRightPrec(*P_,*Y);
513 lp_->applyOp(*Y,*V_);
516 MVT::MvDot(*V_,*Rhat_,rhatV);
517 for(i=0; i<numRHS_; i++) {
518 if (SCT::magnitude(rhatV[i]) < MT::sfmin())
524 alpha_[i] = rho_new[i] / rhatV[i];
528 axpy(one, *R_, alpha_, *V_, *S,
true);
531 if(lp_->isLeftPrec()) {
532 if(lp_->isRightPrec()) {
533 if(leftPrecVec == Teuchos::null) {
534 leftPrecVec = MVT::Clone( *R_, numRHS_ );
536 lp_->applyLeftPrec(*S,*leftPrecVec);
537 lp_->applyRightPrec(*leftPrecVec,*Z);
540 lp_->applyLeftPrec(*S,*Z);
543 else if(lp_->isRightPrec()) {
544 lp_->applyRightPrec(*S,*Z);
551 if(lp_->isLeftPrec()) {
552 if(leftPrecVec == Teuchos::null) {
553 leftPrecVec = MVT::Clone( *R_, numRHS_ );
555 if(leftPrecVec2 == Teuchos::null) {
556 leftPrecVec2 = MVT::Clone( *R_, numRHS_ );
558 lp_->applyLeftPrec(*T,*leftPrecVec2);
559 MVT::MvDot(*leftPrecVec2,*leftPrecVec2,tT);
560 MVT::MvDot(*leftPrecVec,*leftPrecVec2,tS);
563 MVT::MvDot(*T,*T,tT);
564 MVT::MvDot(*S,*T,tS);
566 for(i=0; i<numRHS_; i++) {
567 if (SCT::magnitude(tT[i]) < MT::sfmin())
569 omega_[i] = SCT::zero();
573 omega_[i] = tS[i] / tT[i];
577 axpy(one, *X, alpha_, *Y, *X);
578 axpy(one, *X, omega_, *Z, *X);
581 axpy(one, *S, omega_, *T, *R_,
true);
591 template <
class ScalarType,
class MV,
class OP>
593 const std::vector<ScalarType> beta,
const MV& B, MV& mv,
bool minus)
597 std::vector<int> index(1);
599 for(
int i=0; i<numRHS_; i++) {
601 A1 = MVT::CloneView(A,index);
602 B1 = MVT::CloneView(B,index);
603 mv1 = MVT::CloneViewNonConst(mv,index);
605 MVT::MvAddMv(alpha,*A1,-beta[i],*B1,*mv1);
608 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.
Class which defines basic traits for the operator type.
std::vector< ScalarType > alpha
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...
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::ScalarTraits< MagnitudeType > MT
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.
int getNumIters() const
Get the current iteration count.
SCT::magnitudeType MagnitudeType
MultiVecTraits< ScalarType, MV > MVT
bool breakdownDetected()
Has breakdown been detected in any linear system.
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 ...