10#ifndef BELOS_RCG_ITER_HPP
11#define BELOS_RCG_ITER_HPP
28#include "Teuchos_LAPACK.hpp"
29#include "Teuchos_SerialDenseMatrix.hpp"
30#include "Teuchos_SerialDenseVector.hpp"
31#include "Teuchos_ScalarTraits.hpp"
32#include "Teuchos_ParameterList.hpp"
33#include "Teuchos_TimeMonitor.hpp"
59 template <
class ScalarType,
class MV>
83 Teuchos::RCP<MV>
U,
AU;
87 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
Alpha;
88 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
Beta;
89 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
D;
90 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
rTz_old;
93 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
Delta;
96 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
LUUTAU;
98 Teuchos::RCP<std::vector<int> >
ipiv;
112 template<
class ScalarType,
class MV,
class OP>
122 typedef Teuchos::ScalarTraits<ScalarType>
SCT;
138 Teuchos::ParameterList &
params );
212 if (!initialized_)
return 0;
246 "Belos::RCGIter::setBlockSize(): Cannot use a block size that is not one.");
266 const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > lp_;
267 const Teuchos::RCP<OutputManager<ScalarType> > om_;
268 const Teuchos::RCP<StatusTest<ScalarType,MV,OP> > stest_;
297 Teuchos::RCP<MV> Ap_;
308 Teuchos::RCP<MV> U_, AU_;
311 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > Alpha_,Beta_,D_;
314 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > Delta_;
317 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > LUUTAU_;
320 Teuchos::RCP<std::vector<int> > ipiv_;
323 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > rTz_old_;
328 template<
class ScalarType,
class MV,
class OP>
332 Teuchos::ParameterList &
params ):
345 "Belos::RCGIter::constructor: mandatory parameter \"Num Blocks\" is not specified.");
346 int nb = Teuchos::getParameter<int>(
params,
"Num Blocks");
349 "Belos::RCGIter::constructor: mandatory parameter \"Recycled Blocks\" is not specified.");
350 int rb = Teuchos::getParameter<int>(
params,
"Recycled Blocks");
358 template <
class ScalarType,
class MV,
class OP>
373 template <
class ScalarType,
class MV,
class OP>
389 newstate.rTz_old != Teuchos::null) {
410 "Belos::RCGIter::initialize(): RCGIterState does not have P initialized.");
413 "Belos::RCGIter::initialize(): RCGIterState does not have Ap initialized.");
416 "Belos::RCGIter::initialize(): RCGIterState does not have r initialized.");
419 "Belos::RCGIter::initialize(): RCGIterState does not have z initialized.");
422 "Belos::RCGIter::initialize(): RCGIterState does not have U initialized.");
425 "Belos::RCGIter::initialize(): RCGIterState does not have AU initialized.");
428 "Belos::RCGIter::initialize(): RCGIterState does not have Alpha initialized.");
431 "Belos::RCGIter::initialize(): RCGIterState does not have Beta initialized.");
434 "Belos::RCGIter::initialize(): RCGIterState does not have D initialized.");
437 "Belos::RCGIter::initialize(): RCGIterState does not have Delta initialized.");
440 "Belos::RCGIter::initialize(): RCGIterState does not have LUUTAU initialized.");
443 "Belos::RCGIter::initialize(): RCGIterState does not have ipiv initialized.");
446 "Belos::RCGIter::initialize(): RCGIterState does not have rTz_old initialized.");
457 template <
class ScalarType,
class MV,
class OP>
461 "Belos::RCGIter::iterate(): RCGIter class not initialized." );
464 Teuchos::LAPACK<int,ScalarType> lapack;
471 std::vector<int> index(1);
472 Teuchos::SerialDenseMatrix<int,ScalarType>
pAp(1,1),
rTz(1,1);
479 "Belos::RCGIter::iterate(): current linear system has more than one std::vector!" );
492 Teuchos::RCP<const MV>
p_ = Teuchos::null;
493 Teuchos::RCP<MV>
pnext_ = Teuchos::null;
494 while (stest_->checkStatus(
this) !=
Passed && curDim_+1 <=
searchDim) {
499 p_ = MVT::CloneView( *P_, index );
500 lp_->applyOp( *
p_, *Ap_ );
503 MVT::MvTransMv(
one, *
p_, *Ap_,
pAp );
504 (*D_)(
i_,0) =
pAp(0,0);
507 (*Alpha_)(
i_,0) = (*rTz_old_)(0,0) /
pAp(0,0);
511 "Belos::RCGIter::iterate(): non-positive value for p^H*A*p encountered!" );
515 lp_->updateSolution();
518 MVT::MvAddMv(
one, *r_, -(*Alpha_)(
i_,0), *Ap_, *r_ );
520 std::vector<MagnitudeType> norm(1);
521 MVT::MvNorm( *r_, norm );
525 if ( lp_->getLeftPrec() != Teuchos::null ) {
526 lp_->applyLeftPrec( *r_, *z_ );
528 else if ( lp_->getRightPrec() != Teuchos::null ) {
529 lp_->applyRightPrec( *r_, *z_ );
536 MVT::MvTransMv(
one, *r_, *z_,
rTz );
539 (*Beta_)(
i_,0) =
rTz(0,0) / (*rTz_old_)(0,0);
542 (*rTz_old_)(0,0) =
rTz(0,0);
547 pnext_ = MVT::CloneViewNonConst( *P_, index );
551 Teuchos::SerialDenseMatrix<int,ScalarType>
mu( Teuchos::View, *Delta_, recycleBlocks_, 1, 0,
i_ );
552 MVT::MvTransMv(
one, *AU_, *z_,
mu );
555 lapack.GETRS(
TRANS, recycleBlocks_, 1, LUUTAU_->values(), LUUTAU_->stride(), &(*ipiv_)[0],
mu.values(),
mu.stride(), &
info );
557 "Belos::RCGIter::solve(): LAPACK GETRS failed to compute a solution.");
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.
CGIterateFailure is thrown when the CGIteration object is unable to compute the next iterate in the C...
CGIterationLAPACKFailure is thrown when a nonzero return value is passed back from an LAPACK routine.
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).
This class implements the RCG iteration, where a single-std::vector Krylov subspace is constructed.
Teuchos::ScalarTraits< ScalarType > SCT
OperatorTraits< ScalarType, MV, OP > OPT
Teuchos::RCP< MV > getCurrentUpdate() const
Get the current update to the linear system.
MultiVecTraits< ScalarType, MV > MVT
int getMaxSubspaceDim() const
Get the maximum dimension allocated for the search subspace.
virtual ~RCGIter()
Destructor.
void resetNumIters(int iter=0)
Reset the iteration count.
void setSize(int recycleBlocks, int numBlocks)
Set the maximum number of blocks used by the iterative solver and the number of recycled vectors.
bool isInitialized()
States whether the solver has been initialized or not.
int getNumBlocks() const
Get the maximum number of blocks used by the iterative solver in solving this linear problem.
int getNumIters() const
Get the current iteration count.
void setBlockSize(int blockSize)
Set the blocksize.
void setRecycledBlocks(int recycleBlocks)
Set the maximum number of recycled blocks used by the iterative solver.
void setNumBlocks(int numBlocks)
Set the maximum number of blocks used by the iterative solver.
int getCurSubspaceDim() const
Get the dimension of the search subspace used to generate the current solution to the linear problem.
SCT::magnitudeType MagnitudeType
void initialize()
Initialize the solver with the initial vectors from the linear problem or random data.
int getRecycledBlocks() const
Get the maximum number of recycled blocks used by the iterative solver in solving this linear problem...
void iterate()
This method performs RCG iterations until the status test indicates the need to stop or an error occu...
RCGIter(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)
RCGIter constructor with linear problem, solver utilities, and parameter list of solver options.
const LinearProblem< ScalarType, MV, OP > & getProblem() const
Get a constant reference to the linear problem.
Teuchos::RCP< const MV > getNativeResiduals(std::vector< MagnitudeType > *) const
Get the norms of the residuals native to the solver.
int getBlockSize() const
Get the blocksize to be used by the iterative solver in solving this linear problem.
Structure to contain pointers to RCGIter state variables.
bool existU
Flag to indicate the recycle space should be used.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Beta
Teuchos::RCP< MV > U
The recycled subspace and its image.
Teuchos::RCP< MV > Ap
A times current search vector.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Delta
Solutions to local least-squares problems.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > D
int curDim
The current dimension of the reduction.
Teuchos::RCP< MV > r
The current residual.
Teuchos::RCP< std::vector< int > > ipiv
Data from LU factorization of U^T A U.
Teuchos::RCP< MV > z
The current preconditioned residual.
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > LUUTAU
The LU factorization of the matrix U^T A U
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > rTz_old
Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Alpha
Coefficients arising in RCG iteration.
Teuchos::RCP< MV > P
The current Krylov basis.