10#ifndef BELOS_CG_ITER_HPP
11#define BELOS_CG_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"
53 template <
class ScalarType,
class MV>
65 void initialize(Teuchos::RCP<const MV> tmp,
int _numVectors) {
67 TEUCHOS_ASSERT(_numVectors == 1);
71 S = MVT::Clone( *tmp, 2 );
72 std::vector<int> index(1,0);
74 this->
R = MVT::CloneViewNonConst( *
S, index );
76 this->
Z = MVT::CloneViewNonConst( *
S, index );
78 this->
P = MVT::Clone( *tmp, 1 );
79 this->
AP = MVT::Clone(*tmp, 1);
84 bool matches(Teuchos::RCP<const MV> tmp,
int _numVectors=1)
const {
93template<
class ScalarType,
class MV,
class OP>
103 using SCT = Teuchos::ScalarTraits<ScalarType>;
118 Teuchos::ParameterList ¶ms );
172 Teuchos::RCP<CGIterationStateBase<ScalarType,MV> >
getState()
const {
183 auto s = Teuchos::rcp_dynamic_cast<CGIterationState<ScalarType,MV> >(state,
true);
206 if (foldConvergenceDetectionIntoAllreduce_ && convTest_->getResNormType() ==
Belos::TwoNorm) {
207 (*norms)[0] = std::sqrt(Teuchos::ScalarTraits<ScalarType>::magnitude(rHr_));
208 return Teuchos::null;
231 TEUCHOS_TEST_FOR_EXCEPTION(blockSize!=1,std::invalid_argument,
232 "Belos::CGIter::setBlockSize(): Cannot use a block size that is not one.");
241 if (numEntriesForCondEst_ != 0) doCondEst_=val;
249 using size_type =
typename Teuchos::ArrayView<MagnitudeType>::size_type;
250 if (
static_cast<size_type
> (iter_) >= diag_.size ()) {
253 return diag_ (0, iter_);
264 using size_type =
typename Teuchos::ArrayView<MagnitudeType>::size_type;
265 if (
static_cast<size_type
> (iter_) >= offdiag_.size ()) {
268 return offdiag_ (0, iter_);
281 const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > lp_;
282 const Teuchos::RCP<OutputManager<ScalarType> > om_;
283 const Teuchos::RCP<StatusTest<ScalarType,MV,OP> > stest_;
284 const Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> > convTest_;
298 bool foldConvergenceDetectionIntoAllreduce_;
304 bool assertPositiveDefiniteness_;
307 Teuchos::ArrayRCP<MagnitudeType> diag_, offdiag_;
308 int numEntriesForCondEst_;
326 Teuchos::RCP<MV> AP_;
334 template<
class ScalarType,
class MV,
class OP>
339 Teuchos::ParameterList ¶ms ):
343 convTest_(convTester),
346 assertPositiveDefiniteness_( params.get(
"Assert Positive Definiteness", true) ),
347 numEntriesForCondEst_(params.get(
"Max Size For Condest",0) ),
350 foldConvergenceDetectionIntoAllreduce_ = params.get<
bool>(
"Fold Convergence Detection Into Allreduce",
false);
356 template <
class ScalarType,
class MV,
class OP>
360 Teuchos::RCP<const MV> lhsMV = lp_->getLHS();
361 Teuchos::RCP<const MV> rhsMV = lp_->getRHS();
362 Teuchos::RCP<const MV> tmp = ( (rhsMV!=Teuchos::null)? rhsMV: lhsMV );
363 TEUCHOS_ASSERT(!newstate.is_null());
365 newstate->initialize(tmp, 1);
369 if(numEntriesForCondEst_ > 0) {
370 diag_.resize(numEntriesForCondEst_);
371 offdiag_.resize(numEntriesForCondEst_-1);
374 std::string errstr(
"Belos::CGIter::initialize(): Specified multivectors must have a consistent length and width.");
378 std::invalid_argument, errstr );
380 std::invalid_argument, errstr );
391 if ( lp_->getLeftPrec() != Teuchos::null ) {
392 lp_->applyLeftPrec( *R_, *Z_ );
393 if ( lp_->getRightPrec() != Teuchos::null ) {
395 lp_->applyRightPrec( *tmp2, *Z_ );
398 else if ( lp_->getRightPrec() != Teuchos::null ) {
399 lp_->applyRightPrec( *R_, *Z_ );
414 template <
class ScalarType,
class MV,
class OP>
425 std::vector<ScalarType> alpha(1);
426 std::vector<ScalarType> beta(1);
427 std::vector<ScalarType> rHz(1);
428 std::vector<ScalarType> rHz_old(1);
429 std::vector<ScalarType> pAp(1);
430 Teuchos::SerialDenseMatrix<int,ScalarType> rHs( 1, 2 );
433 const ScalarType one = Teuchos::ScalarTraits<ScalarType>::one();
434 const MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero();
437 ScalarType pAp_old = one;
438 ScalarType beta_old = one;
439 ScalarType rHz_old2 = one;
442 Teuchos::RCP<MV> cur_soln_vec = lp_->getCurrLHSVec();
446 "Belos::CGIter::iterate(): current linear system has more than one vector!" );
449 if (foldConvergenceDetectionIntoAllreduce_ && convTest_->getResNormType() ==
Belos::TwoNorm) {
459 while (stest_->checkStatus(
this) !=
Passed) {
465 lp_->applyOp( *P_, *AP_ );
469 alpha[0] = rHz[0] / pAp[0];
472 if(assertPositiveDefiniteness_) {
474 "Belos::CGIter::iterate(): non-positive value for p^H*A*p encountered!" );
480 MVT::MvAddMv( one, *cur_soln_vec, alpha[0], *P_, *cur_soln_vec );
481 lp_->updateSolution();
494 if ( lp_->getLeftPrec() != Teuchos::null ) {
495 lp_->applyLeftPrec( *R_, *Z_ );
496 if ( lp_->getRightPrec() != Teuchos::null ) {
498 lp_->applyRightPrec( *tmp, *Z_ );
501 else if ( lp_->getRightPrec() != Teuchos::null ) {
502 lp_->applyRightPrec( *R_, *Z_ );
508 if (foldConvergenceDetectionIntoAllreduce_ && convTest_->getResNormType() ==
Belos::TwoNorm) {
515 beta[0] = rHz[0] / rHz_old[0];
522 diag_[iter_-1] = Teuchos::ScalarTraits<ScalarType>::real((beta_old * beta_old * pAp_old + pAp[0]) / rHz_old[0]);
523 offdiag_[iter_-2] = -Teuchos::ScalarTraits<ScalarType>::real(beta_old * pAp_old / (sqrt( rHz_old[0] * rHz_old2)));
526 diag_[iter_-1] = Teuchos::ScalarTraits<ScalarType>::real(pAp[0] / rHz_old[0]);
528 rHz_old2 = rHz_old[0];
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.
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.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Pure virtual base class for defining the status testing capabilities of Belos.
Collection of types and exceptions used within the Belos solvers.
OperatorTraits< ScalarType, MV, OP > OPT
void iterate()
This method performs CG iterations until the status test indicates the need to stop or an error occur...
virtual ~CGIter()=default
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 > *norms) const
const LinearProblem< ScalarType, MV, OP > & getProblem() const
Get a constant reference to the linear problem.
int getBlockSize() const
Get the blocksize to be used by the iterative solver in solving this linear problem.
void setState(Teuchos::RCP< CGIterationStateBase< ScalarType, MV > > state)
void initializeCG(Teuchos::RCP< CGIterationStateBase< ScalarType, MV > > newstate, Teuchos::RCP< MV > R_0)
Initialize the solver to an iterate, providing a complete state.
int getNumIters() const
Get the current iteration count.
bool isInitialized()
States whether the solver has been initialized or not.
void setBlockSize(int blockSize)
Set the blocksize to be used by the iterative solver in solving this linear problem.
void setDoCondEst(bool val)
Sets whether or not to store the diagonal for condition estimation.
Teuchos::RCP< MV > getCurrentUpdate() const
Get the current update to the linear system.
Teuchos::ArrayView< MagnitudeType > getOffDiag()
Gets the off-diagonal for condition estimation.
Teuchos::RCP< CGIterationStateBase< ScalarType, MV > > getState() const
Get the current state of the linear solver.
void resetNumIters(int iter=0)
Reset the iteration count.
typename SCT::magnitudeType MagnitudeType
MultiVecTraits< ScalarType, MV > MVT
CGIter(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< OutputManager< ScalarType > > &printer, const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &tester, const Teuchos::RCP< StatusTestGenResNorm< ScalarType, MV, OP > > &convTester, Teuchos::ParameterList ¶ms)
CGIter constructor with linear problem, solver utilities, and parameter list of solver options.
Teuchos::ScalarTraits< ScalarType > SCT
Teuchos::ArrayView< MagnitudeType > getDiag()
Gets the diagonal for condition estimation.
CGIterateFailure is thrown when the CGIteration object is unable to compute the next iterate in the C...
Structure to contain pointers to CGIteration state variables.
Teuchos::RCP< MV > R
The current residual.
Teuchos::RCP< MV > P
The current decent direction vector.
virtual void initialize(Teuchos::RCP< const MV > tmp, int _numVectors)
virtual bool matches(Teuchos::RCP< const MV > tmp, int _numVectors=1) const
Teuchos::RCP< MV > Z
The current preconditioned residual.
Teuchos::RCP< MV > AP
The matrix A applied to current decent direction vector.
Structure to contain pointers to CGIteration state variables.
virtual ~CGIterationState()=default
CGIterationState()=default
CGIterationState(Teuchos::RCP< const MV > tmp)
bool matches(Teuchos::RCP< const MV > tmp, int _numVectors=1) const
void initialize(Teuchos::RCP< const MV > tmp, int _numVectors)
CGPositiveDefiniteFailure is thrown when the the CG 'alpha = p^H*A*P' value is less than zero,...
Traits class which defines basic operations on multivectors.
static void MvTransMv(const ScalarType alpha, const MV &A, const MV &mv, Teuchos::SerialDenseMatrix< int, ScalarType > &B)
Compute a dense matrix B through the matrix-matrix multiply .
static Teuchos::RCP< MV > CloneCopy(const MV &mv)
Creates a new MV and copies contents of mv into the new vector (deep copy).
static ptrdiff_t GetGlobalLength(const MV &mv)
Return the number of rows in the given multivector mv.
static void MvDot(const MV &mv, const MV &A, std::vector< ScalarType > &b)
Compute a vector b where the components are the individual dot-products of the i-th columns of A and ...
static void MvAddMv(const ScalarType alpha, const MV &A, const ScalarType beta, const MV &B, MV &mv)
Replace mv with .
static int GetNumberVecs(const MV &mv)
Obtain the number of vectors in mv.
static void Assign(const MV &A, MV &mv)
mv := A
Class which defines basic traits for the operator type.
Belos's basic output manager for sending information of select verbosity levels to the appropriate ou...
An implementation of StatusTestResNorm using a family of residual norms.
A pure virtual class for defining the status tests for the Belos iterative solvers.