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.