42#ifndef BELOS_FIXEDPOINT_ITER_HPP
43#define BELOS_FIXEDPOINT_ITER_HPP
59#include "Teuchos_SerialDenseMatrix.hpp"
60#include "Teuchos_SerialDenseVector.hpp"
61#include "Teuchos_ScalarTraits.hpp"
62#include "Teuchos_ParameterList.hpp"
63#include "Teuchos_TimeMonitor.hpp"
76template<
class ScalarType,
class MV,
class OP>
86 typedef Teuchos::ScalarTraits<ScalarType>
SCT;
100 Teuchos::ParameterList ¶ms );
213 const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> >
lp_;
214 const Teuchos::RCP<OutputManager<ScalarType> >
om_;
215 const Teuchos::RCP<StatusTest<ScalarType,MV,OP> >
stest_;
252 template<
class ScalarType,
class MV,
class OP>
256 Teuchos::ParameterList ¶ms ):
262 stateStorageInitialized_(false),
270 template <
class ScalarType,
class MV,
class OP>
273 if (!stateStorageInitialized_) {
275 Teuchos::RCP<const MV> lhsMV = lp_->getLHS();
276 Teuchos::RCP<const MV> rhsMV = lp_->getRHS();
277 if (lhsMV == Teuchos::null && rhsMV == Teuchos::null) {
278 stateStorageInitialized_ =
false;
285 if (R_ == Teuchos::null) {
287 Teuchos::RCP<const MV> tmp = ( (rhsMV!=Teuchos::null)? rhsMV: lhsMV );
288 TEUCHOS_TEST_FOR_EXCEPTION(tmp == Teuchos::null,std::invalid_argument,
289 "Belos::FixedPointIter::setStateSize(): linear problem does not specify multivectors to clone from.");
290 R_ = MVT::Clone( *tmp, numRHS_ );
291 Z_ = MVT::Clone( *tmp, numRHS_ );
295 stateStorageInitialized_ =
true;
302 template <
class ScalarType,
class MV,
class OP>
308 TEUCHOS_TEST_FOR_EXCEPTION(blockSize != MVT::GetNumberVecs(*lp_->getCurrRHSVec()), std::invalid_argument,
"Belos::FixedPointIter::setBlockSize size must match # RHS.");
310 TEUCHOS_TEST_FOR_EXCEPTION(blockSize <= 0, std::invalid_argument,
"Belos::FixedPointIter::setBlockSize was passed a non-positive argument.");
311 if (blockSize == numRHS_) {
316 if (blockSize!=numRHS_)
317 stateStorageInitialized_ =
false;
321 initialized_ =
false;
330 template <
class ScalarType,
class MV,
class OP>
334 if (!stateStorageInitialized_)
337 TEUCHOS_TEST_FOR_EXCEPTION(!stateStorageInitialized_,std::invalid_argument,
338 "Belos::FixedPointIter::initialize(): Cannot initialize state storage!");
342 std::string errstr(
"Belos::FixedPointIter::initialize(): Specified multivectors must have a consistent length and width.");
345 const ScalarType one = Teuchos::ScalarTraits<ScalarType>::one();
346 const ScalarType zero = Teuchos::ScalarTraits<ScalarType>::zero();
348 if (newstate.
R != Teuchos::null) {
349 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*R_) != MVT::GetNumberVecs(*newstate.
R),
350 std::invalid_argument, errstr );
352 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
R) != MVT::GetGlobalLength(*R_),
353 std::invalid_argument, errstr );
354 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
R) != numRHS_,
355 std::invalid_argument, errstr );
358 if (newstate.
R != R_) {
360 MVT::MvAddMv( one, *newstate.
R, zero, *newstate.
R, *R_ );
365 TEUCHOS_TEST_FOR_EXCEPTION(newstate.
R == Teuchos::null,std::invalid_argument,
366 "Belos::FixedPointIter::initialize(): FixedPointIterationState does not have initial residual.");
376 template <
class ScalarType,
class MV,
class OP>
382 if (initialized_ ==
false) {
387 const ScalarType one = Teuchos::ScalarTraits<ScalarType>::one();
388 const MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero();
391 Teuchos::RCP<MV> cur_soln_vec = lp_->getCurrLHSVec();
394 Teuchos::RCP<MV> tmp = MVT::Clone( *R_, numRHS_ );
396 if (lp_->getRightPrec() != Teuchos::null) {
398 Teuchos::RCP<MV> rhs = MVT::CloneCopy( *R_ );
401 MVT::MvInit( *Z_, zero );
406 while (stest_->checkStatus(
this) !=
Passed) {
412 lp_->applyRightPrec( *R_, *tmp );
415 MVT::MvAddMv( one, *cur_soln_vec, one, *tmp, *cur_soln_vec );
416 lp_->updateSolution();
419 MVT::MvAddMv( one, *Z_, one, *tmp, *Z_ );
422 lp_->applyOp (*Z_, *tmp );
423 MVT::MvAddMv( one, *rhs, -one, *tmp, *R_ );
428 Teuchos::RCP<const MV> rhs = lp_->getCurrRHSVec();
433 while (stest_->checkStatus(
this) !=
Passed) {
439 if ( lp_->getLeftPrec() != Teuchos::null ) {
440 lp_->applyLeftPrec( *R_, *Z_ );
447 MVT::MvAddMv(one,*cur_soln_vec,one,*Z_,*cur_soln_vec);
448 lp_->updateSolution();
451 lp_->applyOp(*cur_soln_vec,*tmp);
452 MVT::MvAddMv(one,*rhs,-one,*tmp,*R_);
Belos header file which uses auto-configuration information to include necessary C++ headers.
Pure virtual base class which augments the basic interface for a fixed point linear solver iteration.
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.
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 fixed point iteration.
Teuchos::ScalarTraits< ScalarType > SCT
const LinearProblem< ScalarType, MV, OP > & getProblem() const
Get a constant reference to the linear problem.
void setBlockSize(int blockSize)
Set the blocksize to be used by the iterative solver in solving this linear problem.
SCT::magnitudeType MagnitudeType
const Teuchos::RCP< OutputManager< ScalarType > > om_
void resetNumIters(int iter=0)
Reset the iteration count.
Teuchos::RCP< const MV > getNativeResiduals(std::vector< MagnitudeType > *) const
Get the norms of the residuals native to the solver.
virtual ~FixedPointIter()
Destructor.
void setStateSize()
Method for initalizing the state storage needed by FixedPoint.
bool stateStorageInitialized_
const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > stest_
Teuchos::RCP< MV > getCurrentUpdate() const
Get the current update to the linear system.
void initialize()
Initialize the solver with the initial vectors from the linear problem or random data.
int getBlockSize() const
Get the blocksize to be used by the iterative solver in solving this linear problem.
bool isInitialized()
States whether the solver has been initialized or not.
int getNumIters() const
Get the current iteration count.
FixedPointIter(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)
FixedPointIter constructor with linear problem, solver utilities, and parameter list of solver option...
void initializeFixedPoint(FixedPointIterationState< ScalarType, MV > &newstate)
Initialize the solver to an iterate, providing a complete state.
OperatorTraits< ScalarType, MV, OP > OPT
const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > lp_
void iterate()
This method performs Fixed Point iterations until the status test indicates the need to stop or an er...
MultiVecTraits< ScalarType, MV > MVT
FixedPointIterationState< ScalarType, MV > getState() const
Get the current state of the linear solver.
A linear system to solve, and its associated information.
Traits class which defines basic operations on multivectors.
static int GetNumberVecs(const MV &mv)
Obtain the number of vectors in mv.
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...
A pure virtual class for defining the status tests for the Belos iterative solvers.
Structure to contain pointers to FixedPointIteration state variables.
Teuchos::RCP< const MV > R
The current residual.
Teuchos::RCP< const MV > Z
The current preconditioned residual.