42 #ifndef BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_ITER_HPP 
   43 #define BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_ITER_HPP 
   85   template<
class ScalarType, 
class MV, 
class OP>
 
  220        "Belos::PseudoBlockStochasticCGIter::setBlockSize(): Cannot use a block size that is not one.");
 
  235       const double p0 = -0.322232431088;
 
  236       const double p1 = -1.0;
 
  237       const double p2 = -0.342242088547; 
 
  238       const double p3 = -0.204231210245e-1;
 
  239       const double p4 = -0.453642210148e-4;
 
  240       const double q0 =  0.993484626060e-1;
 
  241       const double q1 =  0.588581570495;
 
  242       const double q2 =  0.531103462366;
 
  243       const double q3 =  0.103537752850;
 
  244       const double q4 =  0.38560700634e-2;
 
  248       Teuchos::randomSyncedMatrix( randvec_ );
 
  250       for (
int i=0; i<numRHS_; i++)
 
  253         r=0.5*randvec_[i] + 1.0;
 
  256         if(r < 0.5) y=std::sqrt(-2.0 * log(r));
 
  257         else y=std::sqrt(-2.0 * log(1.0 - r));
 
  259         p = p0 + y * (p1 + y* (p2 + y * (p3 + y * p4)));
 
  260         q = q0 + y * (q1 + y* (q2 + y * (q3 + y * q4)));
 
  262         if(r < 0.5) z = (p / q) - y;
 
  263         else z = y - (p / q);
 
  265         randvec_[i] = Teuchos::as<ScalarType,double>(z);
 
  296     bool assertPositiveDefiniteness_;
 
  323   template<
class ScalarType, 
class MV, 
class OP>
 
  334     assertPositiveDefiniteness_( params.get(
"Assert Positive Definiteness", true) )
 
  341   template <
class ScalarType, 
class MV, 
class OP>
 
  348            "Belos::PseudoBlockStochasticCGIter::initialize(): Cannot initialize state storage!");
 
  354     int numRHS = MVT::GetNumberVecs(*tmp);
 
  360       R_  = MVT::Clone( *tmp, numRHS_ );
 
  361       Z_  = MVT::Clone( *tmp, numRHS_ );
 
  362       P_  = MVT::Clone( *tmp, numRHS_ );
 
  363       AP_ = MVT::Clone( *tmp, numRHS_ );
 
  364       Y_  = MVT::Clone( *tmp, numRHS_ );
 
  368     randvec_.size( numRHS_ );
 
  372     std::string errstr(
"Belos::BlockPseudoStochasticCGIter::initialize(): Specified multivectors must have a consistent length and width.");
 
  381                           std::invalid_argument, errstr );
 
  383                           std::invalid_argument, errstr );
 
  386       if (newstate.
R != R_) {
 
  388   MVT::MvAddMv( one, *newstate.
R, zero, *newstate.
R, *R_ );
 
  394       if ( lp_->getLeftPrec() != Teuchos::null ) {
 
  395         lp_->applyLeftPrec( *R_, *Z_ );
 
  396         if ( lp_->getRightPrec() != Teuchos::null ) {
 
  398           lp_->applyRightPrec( *Z_, *tmp2 );
 
  402       else if ( lp_->getRightPrec() != Teuchos::null ) {
 
  403   lp_->applyRightPrec( *R_, *Z_ ); 
 
  408       MVT::MvAddMv( one, *Z_, zero, *Z_, *P_ );
 
  413                          "Belos::StochasticCGIter::initialize(): CGStateIterState does not have initial residual.");
 
  423   template <
class ScalarType, 
class MV, 
class OP>
 
  429     if (initialized_ == 
false) {
 
  435     std::vector<int> index(1);
 
  436     std::vector<ScalarType> rHz( numRHS_ ), rHz_old( numRHS_ ), pAp( numRHS_ );
 
  447     MVT::MvDot( *R_, *Z_, rHz );
 
  449     if ( assertPositiveDefiniteness_ )
 
  450         for (i=0; i<numRHS_; ++i)
 
  453                                 "Belos::PseudoBlockStochasticCGIter::iterate(): negative value for r^H*M*r encountered!" );
 
  458     while (stest_->checkStatus(
this) != 
Passed) {
 
  464       lp_->applyOp( *P_, *AP_ );
 
  467       MVT::MvDot( *P_, *AP_, pAp );
 
  471       for (i=0; i<numRHS_; ++i) {
 
  472         if ( assertPositiveDefiniteness_ )
 
  476                                 "Belos::PseudoBlockStochasticCGIter::iterate(): non-positive value for p^H*A*p encountered!" );
 
  478         alpha(i,i) = rHz[i] / pAp[i];
 
  487       MVT::MvTimesMatAddMv( one, *P_, alpha, one, *cur_soln_vec );
 
  488       lp_->updateSolution();
 
  491       MVT::MvTimesMatAddMv( one, *P_, zeta, one, *Y_);
 
  496       for (i=0; i<numRHS_; ++i) {
 
  502       MVT::MvTimesMatAddMv( -one, *AP_, alpha, one, *R_ );
 
  507       if ( lp_->getLeftPrec() != Teuchos::null ) {
 
  508         lp_->applyLeftPrec( *R_, *Z_ );
 
  509         if ( lp_->getRightPrec() != Teuchos::null ) {
 
  511           lp_->applyRightPrec( *Z_, *tmp );
 
  515       else if ( lp_->getRightPrec() != Teuchos::null ) {
 
  516         lp_->applyRightPrec( *R_, *Z_ );
 
  522       MVT::MvDot( *R_, *Z_, rHz );
 
  523       if ( assertPositiveDefiniteness_ )
 
  524           for (i=0; i<numRHS_; ++i)
 
  527                                   "Belos::PseudoBlockStochasticCGIter::iterate(): negative value for r^H*M*r encountered!" );
 
  530       for (i=0; i<numRHS_; ++i) {
 
  531         beta(i,i) = rHz[i] / rHz_old[i];
 
  535         MVT::MvAddMv( one, *Z_i, beta(i,i), *P_i, *P_i );
 
Pure virtual base class which augments the basic interface for a stochastic conjugate gradient linear...
 
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...
 
Class which manages the output and verbosity of the Belos solvers. 
 
MultiVecTraits< ScalarType, MV > MVT
 
SCT::magnitudeType MagnitudeType
 
void initialize()
Initialize the solver with the initial vectors from the linear problem or random data. 
 
void setBlockSize(int blockSize)
Set the blocksize. 
 
bool is_null(const std::shared_ptr< T > &p)
 
Pure virtual base class for defining the status testing capabilities of Belos. 
 
Teuchos::RCP< MV > getStochasticVector() const 
Get the stochastic vector. 
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
Declaration of basic traits for the multivector type. 
 
Teuchos::RCP< const MV > Z
The current preconditioned residual. 
 
A pure virtual class for defining the status tests for the Belos iterative solvers. 
 
Class which defines basic traits for the operator type. 
 
CGIterateFailure is thrown when the CGIteration object is unable to compute the next iterate in the C...
 
virtual ~PseudoBlockStochasticCGIter()
Destructor. 
 
int getNumIters() const 
Get the current iteration count. 
 
const LinearProblem< ScalarType, MV, OP > & getProblem() const 
Get a constant reference to the linear problem. 
 
Traits class which defines basic operations on multivectors. 
 
void resetNumIters(int iter=0)
Reset the iteration count. 
 
StochasticCGIterationState< ScalarType, MV > getState() const 
Get the current state of the linear solver. 
 
OperatorTraits< ScalarType, MV, OP > OPT
 
void iterate()
This method performs stochastic CG iterations on each linear system until the status test indicates t...
 
Teuchos::RCP< const MV > AP
The matrix A applied to current decent direction vector. 
 
A linear system to solve, and its associated information. 
 
bool isInitialized()
States whether the solver has been initialized or not. 
 
Class which describes the linear problem to be solved by the iterative solver. 
 
Teuchos::RCP< const MV > R
The current residual. 
 
Teuchos::RCP< const MV > getNativeResiduals(std::vector< MagnitudeType > *) const 
Get the norms of the residuals native to the solver. 
 
PseudoBlockStochasticCGIter(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)
PseudoBlockStochasticCGIter constructor with linear problem, solver utilities, and parameter list of ...
 
void initializeCG(StochasticCGIterationState< ScalarType, MV > &newstate)
Initialize the solver to an iterate, providing a complete state. 
 
Teuchos::RCP< const MV > P
The current decent direction vector. 
 
int getBlockSize() const 
Get the blocksize to be used by the iterative solver in solving this linear problem. 
 
Teuchos::RCP< MV > getCurrentUpdate() const 
Get the current update to the linear system. 
 
This class implements the stochastic pseudo-block CG iteration, where the basic stochastic CG algorit...
 
Class which defines basic traits for the operator type. 
 
Belos header file which uses auto-configuration information to include necessary C++ headers...
 
Teuchos::RCP< const MV > Y
The current stochastic recurrence vector. 
 
Teuchos::ScalarTraits< ScalarType > SCT
 
Templated virtual class for providing orthogonalization/orthonormalization methods with matrix-based ...
 
Structure to contain pointers to CGIteration state variables.