10#ifndef BELOS_BICGSTAB_ITER_HPP
11#define BELOS_BICGSTAB_ITER_HPP
28#include "Teuchos_SerialDenseMatrix.hpp"
29#include "Teuchos_SerialDenseVector.hpp"
30#include "Teuchos_ScalarTraits.hpp"
31#include "Teuchos_ParameterList.hpp"
32#include "Teuchos_TimeMonitor.hpp"
54 template <
class ScalarType,
class MV>
58 Teuchos::RCP<const MV>
R;
61 Teuchos::RCP<const MV>
Rhat;
64 Teuchos::RCP<const MV>
P;
67 Teuchos::RCP<const MV>
V;
80 template<
class ScalarType,
class MV,
class OP>
90 typedef Teuchos::ScalarTraits<ScalarType>
SCT;
92 typedef Teuchos::ScalarTraits<MagnitudeType>
MT;
105 Teuchos::ParameterList &
params );
174 state.rho_old = rho_old_;
175 state.alpha = alpha_;
176 state.omega = omega_;
220 "Belos::BiCGStabIter::setBlockSize(): Cannot use a block size that is not one.");
231 const std::vector<ScalarType> beta,
const MV& B, MV&
mv,
bool minus=
false);
236 const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > lp_;
237 const Teuchos::RCP<OutputManager<ScalarType> > om_;
238 const Teuchos::RCP<StatusTest<ScalarType,MV,OP> > stest_;
264 Teuchos::RCP<MV> Rhat_;
275 std::vector<ScalarType> rho_old_, alpha_, omega_;
280 template<
class ScalarType,
class MV,
class OP>
284 Teuchos::ParameterList & ):
298 template <
class ScalarType,
class MV,
class OP>
302 Teuchos::RCP<const MV>
lhsMV = lp_->getCurrLHSVec();
303 Teuchos::RCP<const MV>
rhsMV = lp_->getCurrRHSVec();
305 "Belos::BiCGStabIter::initialize(): Cannot initialize state storage!");
316 if (Teuchos::is_null(R_) || MVT::GetNumberVecs(*R_)!=numRHS_) {
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.");
337 if (!Teuchos::is_null(
newstate.R)) {
340 std::invalid_argument,
errstr );
342 std::invalid_argument,
errstr );
351 lp_->computeCurrResVec(R_.get());
357 MVT::Assign(*
newstate.Rhat, *Rhat_);
361 MVT::Assign(*R_, *Rhat_);
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_)) {
401 alpha_.assign(numRHS_,
one);
405 if (
newstate.omega.size() ==
static_cast<size_t> (numRHS_)) {
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_ );
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_ );
464 Teuchos::RCP<MV>
X = lp_->getCurrLHSVec();
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()) {
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())
528 axpy(
one, *R_, alpha_, *V_, *S,
true);
531 if(lp_->isLeftPrec()) {
532 if(lp_->isRightPrec()) {
540 lp_->applyLeftPrec(*S,*Z);
543 else if(lp_->isRightPrec()) {
544 lp_->applyRightPrec(*S,*Z);
551 if(lp_->isLeftPrec()) {
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();
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)
595 Teuchos::RCP<const MV>
A1,
B1;
596 Teuchos::RCP<MV>
mv1;
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);
Pure virtual base class which augments the basic interface for a conjugate gradient linear solver ite...
Belos header file which uses auto-configuration information to include necessary C++ headers.
Class which describes the linear problem to be solved by the iterative solver.
Templated virtual class for providing orthogonalization/orthonormalization methods with matrix-based ...
Declaration of basic traits for the multivector type.
Class which defines basic traits for the operator type.
Class which manages the output and verbosity of the Belos solvers.
Pure virtual base class for defining the status testing capabilities of Belos.
Collection of types and exceptions used within the Belos solvers.
This class implements the pseudo-block BiCGStab iteration, where the basic BiCGStab algorithm is perf...
void setBlockSize(int blockSize)
Set the blocksize.
Teuchos::ScalarTraits< ScalarType > SCT
bool breakdownDetected()
Has breakdown been detected in any linear system.
const LinearProblem< ScalarType, MV, OP > & getProblem() const
Get a constant reference to the linear problem.
Teuchos::RCP< MV > getCurrentUpdate() const
Get the current update to the linear system.
void resetNumIters(int iter=0)
Reset the iteration count.
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.
int getBlockSize() const
Get the blocksize to be used by the iterative solver in solving this linear problem.
bool isInitialized()
States whether the solver has been initialized or not.
MultiVecTraits< ScalarType, MV > MVT
virtual ~BiCGStabIter()
Destructor.
void iterate()
This method performs BiCGStab iterations on each linear system until the status test indicates the ne...
int getNumIters() const
Get the current iteration count.
void initializeBiCGStab(BiCGStabIterationState< ScalarType, MV > &newstate)
Initialize the solver to an iterate, providing a complete state.
Teuchos::RCP< const MV > getNativeResiduals(std::vector< MagnitudeType > *) const
Get the norms of the residuals native to the solver.
BiCGStabIterationState< ScalarType, MV > getState() const
Get the current state of the linear solver.
Teuchos::ScalarTraits< MagnitudeType > MT
SCT::magnitudeType MagnitudeType
void initialize()
Initialize the solver with the initial vectors from the linear problem or random data.
OperatorTraits< ScalarType, MV, OP > OPT
Alternative run-time polymorphic interface for operators.
Operator()
Default constructor (does nothing).
Structure to contain pointers to BiCGStabIteration state variables.
std::vector< ScalarType > omega
Teuchos::RCP< const MV > R
The current residual.
Teuchos::RCP< const MV > Rhat
The initial residual.
std::vector< ScalarType > rho_old
Teuchos::RCP< const MV > P
The first decent direction vector.
std::vector< ScalarType > alpha
Teuchos::RCP< const MV > V
A * M * the first decent direction vector.