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>
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);
93template<
class ScalarType,
class MV,
class OP>
103 using SCT = Teuchos::ScalarTraits<ScalarType>;
118 Teuchos::ParameterList &
params );
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;
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 &
params ):
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();
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 );
385 MVT::Assign( *
R_0, *R_ );
391 if ( lp_->getLeftPrec() != Teuchos::null ) {
392 lp_->applyLeftPrec( *R_, *Z_ );
393 if ( lp_->getRightPrec() != Teuchos::null ) {
394 Teuchos::RCP<MV>
tmp2 = MVT::CloneCopy( *Z_ );
395 lp_->applyRightPrec( *
tmp2, *Z_ );
398 else if ( lp_->getRightPrec() != Teuchos::null ) {
399 lp_->applyRightPrec( *R_, *Z_ );
402 MVT::Assign( *R_, *Z_ );
404 MVT::Assign( *Z_, *P_ );
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();
446 "Belos::CGIter::iterate(): current linear system has more than one vector!" );
449 if (foldConvergenceDetectionIntoAllreduce_ && convTest_->getResNormType() ==
Belos::TwoNorm) {
450 MVT::MvTransMv(
one, *R_, *S_,
rHs );
454 MVT::MvDot( *R_, *Z_,
rHz );
459 while (stest_->checkStatus(
this) !=
Passed) {
465 lp_->applyOp( *P_, *AP_ );
468 MVT::MvDot( *P_, *AP_,
pAp );
469 alpha[0] =
rHz[0] /
pAp[0];
472 if(assertPositiveDefiniteness_) {
474 "Belos::CGIter::iterate(): non-positive value for p^H*A*p encountered!" );
481 lp_->updateSolution();
489 MVT::MvAddMv(
one, *R_, -alpha[0], *AP_, *R_ );
494 if ( lp_->getLeftPrec() != Teuchos::null ) {
495 lp_->applyLeftPrec( *R_, *Z_ );
496 if ( lp_->getRightPrec() != Teuchos::null ) {
497 Teuchos::RCP<MV>
tmp = MVT::CloneCopy( *Z_);
498 lp_->applyRightPrec( *
tmp, *Z_ );
501 else if ( lp_->getRightPrec() != Teuchos::null ) {
502 lp_->applyRightPrec( *R_, *Z_ );
505 MVT::Assign( *R_, *Z_ );
508 if (foldConvergenceDetectionIntoAllreduce_ && convTest_->getResNormType() ==
Belos::TwoNorm) {
509 MVT::MvTransMv(
one, *R_, *S_,
rHs );
513 MVT::MvDot( *R_, *Z_,
rHz );
517 MVT::MvAddMv(
one, *Z_, beta[0], *P_, *P_ );
526 diag_[iter_-1] = Teuchos::ScalarTraits<ScalarType>::real(
pAp[0] /
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.
This class implements the preconditioned Conjugate Gradient (CG) iteration.
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
Get the norms of the residuals native to the solver.
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
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)
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,...
Alternative run-time polymorphic interface for operators.
Operator()
Default constructor (does nothing).