10 #ifndef BELOS_FIXEDPOINT_SOLMGR_HPP
11 #define BELOS_FIXEDPOINT_SOLMGR_HPP
30 #ifdef BELOS_TEUCHOS_TIME_MONITOR
58 template<
class ScalarType,
class MV,
class OP>
173 std::string solverDesc =
" Fixed Point ";
292 template<
class ScalarType,
class MV,
class OP>
294 outputStream_(Teuchos::rcpFromRef(std::cout)),
297 maxIters_(maxIters_default_),
299 blockSize_(blockSize_default_),
300 verbosity_(verbosity_default_),
301 outputStyle_(outputStyle_default_),
302 outputFreq_(outputFreq_default_),
303 showMaxResNormOnly_(showMaxResNormOnly_default_),
304 label_(label_default_),
310 template<
class ScalarType,
class MV,
class OP>
315 outputStream_(Teuchos::rcpFromRef(std::cout)),
318 maxIters_(maxIters_default_),
320 blockSize_(blockSize_default_),
321 verbosity_(verbosity_default_),
322 outputStyle_(outputStyle_default_),
323 outputFreq_(outputFreq_default_),
324 showMaxResNormOnly_(showMaxResNormOnly_default_),
325 label_(label_default_),
329 "FixedPointSolMgr's constructor requires a nonnull LinearProblem instance.");
339 template<
class ScalarType,
class MV,
class OP>
354 maxIters_ = params->
get(
"Maximum Iterations",maxIters_default_);
357 params_->set(
"Maximum Iterations", maxIters_);
359 maxIterTest_->setMaxIters( maxIters_ );
364 blockSize_ = params->
get(
"Block Size",blockSize_default_);
366 "Belos::FixedPointSolMgr: \"Block Size\" must be strictly positive.");
369 params_->set(
"Block Size", blockSize_);
374 std::string tempLabel = params->
get(
"Timer Label", label_default_);
377 if (tempLabel != label_) {
379 params_->set(
"Timer Label", label_);
380 std::string solveLabel = label_ +
": FixedPointSolMgr total solve time";
381 #ifdef BELOS_TEUCHOS_TIME_MONITOR
389 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
390 verbosity_ = params->
get(
"Verbosity", verbosity_default_);
392 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
396 params_->set(
"Verbosity", verbosity_);
398 printer_->setVerbosity(verbosity_);
403 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
404 outputStyle_ = params->
get(
"Output Style", outputStyle_default_);
406 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
410 params_->set(
"Output Style", outputStyle_);
416 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
419 params_->set(
"Output Stream", outputStream_);
421 printer_->setOStream( outputStream_ );
427 outputFreq_ = params->
get(
"Output Frequency", outputFreq_default_);
431 params_->set(
"Output Frequency", outputFreq_);
433 outputTest_->setOutputFrequency( outputFreq_ );
446 if (params->
isParameter(
"Convergence Tolerance")) {
448 convtol_ = params->
get (
"Convergence Tolerance",
456 params_->set(
"Convergence Tolerance", convtol_);
458 convTest_->setTolerance( convtol_ );
461 if (params->
isParameter(
"Show Maximum Residual Norm Only")) {
462 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
465 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
467 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
478 convTest_ =
Teuchos::rcp(
new StatusTestResNorm_t( convtol_, 1 ) );
481 sTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
491 std::string solverDesc =
" Fixed Point ";
492 outputTest_->setSolverDesc( solverDesc );
498 std::string solveLabel = label_ +
": FixedPointSolMgr total solve time";
499 #ifdef BELOS_TEUCHOS_TIME_MONITOR
509 template<
class ScalarType,
class MV,
class OP>
522 "The relative residual tolerance that needs to be achieved by the\n"
523 "iterative solver in order for the linear system to be declared converged.");
524 pl->
set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
525 "The maximum number of block iterations allowed for each\n"
526 "set of RHS solved.");
527 pl->
set(
"Block Size", static_cast<int>(blockSize_default_),
528 "The number of vectors in each block.");
529 pl->
set(
"Verbosity", static_cast<int>(verbosity_default_),
530 "What type(s) of solver information should be outputted\n"
531 "to the output stream.");
532 pl->
set(
"Output Style", static_cast<int>(outputStyle_default_),
533 "What style is used for the solver information outputted\n"
534 "to the output stream.");
535 pl->
set(
"Output Frequency", static_cast<int>(outputFreq_default_),
536 "How often convergence information should be outputted\n"
537 "to the output stream.");
538 pl->
set(
"Output Stream", Teuchos::rcpFromRef(std::cout),
539 "A reference-counted pointer to the output stream where all\n"
540 "solver output is sent.");
541 pl->
set(
"Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
542 "When convergence information is printed, only show the maximum\n"
543 "relative residual norm when the block size is greater than one.");
544 pl->
set(
"Timer Label", static_cast<const char *>(label_default_),
545 "The string to use as a prefix for the timer labels.");
553 template<
class ScalarType,
class MV,
class OP>
557 using Teuchos::rcp_const_cast;
558 using Teuchos::rcp_dynamic_cast;
565 setParameters(Teuchos::parameterList(*getValidParameters()));
570 "Belos::FixedPointSolMgr::solve(): Linear problem is not ready, setProblem() "
571 "has not been called.");
575 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
576 int numCurrRHS = ( numRHS2Solve < blockSize_) ? numRHS2Solve : blockSize_;
578 std::vector<int> currIdx, currIdx2;
579 currIdx.resize( blockSize_ );
580 currIdx2.resize( blockSize_ );
581 for (
int i=0; i<numCurrRHS; ++i)
582 { currIdx[i] = startPtr+i; currIdx2[i]=i; }
583 for (
int i=numCurrRHS; i<blockSize_; ++i)
584 { currIdx[i] = -1; currIdx2[i] = i; }
587 problem_->setLSIndex( currIdx );
592 plist.
set(
"Block Size",blockSize_);
595 outputTest_->reset();
599 bool isConverged =
true;
604 RCP<FixedPointIteration<ScalarType,MV,OP> > block_fp_iter;
609 #ifdef BELOS_TEUCHOS_TIME_MONITOR
613 while ( numRHS2Solve > 0 ) {
616 std::vector<int> convRHSIdx;
617 std::vector<int> currRHSIdx( currIdx );
618 currRHSIdx.resize(numCurrRHS);
621 block_fp_iter->resetNumIters();
624 outputTest_->resetNumCalls();
627 RCP<MV> R_0 = MVT::CloneViewNonConst( *(rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
632 block_fp_iter->initializeFixedPoint(newstate);
638 block_fp_iter->iterate();
642 if (convTest_->getStatus() ==
Passed) {
646 std::vector<int> convIdx = convTest_->convIndices();
651 if (convIdx.size() == currRHSIdx.size())
656 problem_->setCurrLS();
661 std::vector<int> unconvIdx(currRHSIdx.size());
662 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
664 for (
unsigned int j=0; j<convIdx.size(); ++j) {
665 if (currRHSIdx[i] == convIdx[j]) {
671 currIdx2[have] = currIdx2[i];
672 currRHSIdx[have++] = currRHSIdx[i];
677 currRHSIdx.resize(have);
678 currIdx2.resize(have);
681 problem_->setLSIndex( currRHSIdx );
684 std::vector<MagnitudeType> norms;
685 R_0 = MVT::CloneCopy( *(block_fp_iter->getNativeResiduals(&norms)),currIdx2 );
686 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
689 block_fp_iter->setBlockSize( have );
694 block_fp_iter->initializeFixedPoint(defstate);
700 else if (maxIterTest_->getStatus() ==
Passed) {
710 "Belos::FixedPointSolMgr::solve(): Neither the convergence test nor "
711 "the maximum iteration count test passed. Please report this bug "
712 "to the Belos developers.");
717 achievedTol_ = MT::one();
719 MVT::MvInit( *X, SCT::zero() );
720 printer_->stream(
Warnings) <<
"Belos::FixedPointSolMgr::solve(): Warning! NaN has been detected!"
724 catch (
const std::exception &e) {
725 std::ostream& err = printer_->stream (
Errors);
726 err <<
"Error! Caught std::exception in FixedPointIteration::iterate() at "
727 <<
"iteration " << block_fp_iter->getNumIters() << std::endl
728 << e.what() << std::endl;
735 problem_->setCurrLS();
738 startPtr += numCurrRHS;
739 numRHS2Solve -= numCurrRHS;
740 if ( numRHS2Solve > 0 ) {
741 numCurrRHS = ( numRHS2Solve < blockSize_) ? numRHS2Solve : blockSize_;
744 currIdx.resize( blockSize_ );
745 currIdx2.resize( blockSize_ );
746 for (
int i=0; i<numCurrRHS; ++i)
747 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
748 for (
int i=numCurrRHS; i<blockSize_; ++i)
749 { currIdx[i] = -1; currIdx2[i] = i; }
752 problem_->setLSIndex( currIdx );
755 block_fp_iter->setBlockSize( blockSize_ );
758 currIdx.resize( numRHS2Solve );
769 #ifdef BELOS_TEUCHOS_TIME_MONITOR
780 numIters_ = maxIterTest_->getNumIters();
785 const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
788 "Belos::FixedPointSolMgr::solve(): The convergence test's getTestValue() "
789 "method returned NULL. Please report this bug to the Belos developers.");
792 "Belos::FixedPointSolMgr::solve(): The convergence test's getTestValue() "
793 "method returned a vector of length zero. Please report this bug to the "
794 "Belos developers.");
799 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
809 template<
class ScalarType,
class MV,
class OP>
812 std::ostringstream oss;
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...
The Belos::FixedPointSolMgr provides a powerful and fully-featured solver manager over the FixedPoint...
Class which manages the output and verbosity of the Belos solvers.
Teuchos::ScalarTraits< ScalarType >::magnitudeType MagnitudeType
bool is_null(const boost::shared_ptr< T > &p)
Teuchos::RCP< Teuchos::ParameterList > params_
Current parameter list.
Belos concrete class for performing fixed point iteration iteration.
OperatorTraits< ScalarType, MV, OP > OPT
FixedPointSolMgr()
Empty constructor for FixedPointSolMgr. This constructor takes no arguments and sets the default valu...
static constexpr int outputStyle_default_
T & get(ParameterList &l, const std::string &name)
static constexpr int maxIters_default_
Belos concrete class for performing the conjugate-gradient (CG) iteration.
bool is_null(const std::shared_ptr< T > &p)
Teuchos::ScalarTraits< MagnitudeType > MT
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
A factory class for generating StatusTestOutput objects.
static constexpr int outputFreq_default_
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.
An abstract class of StatusTest for stopping criteria using residual norms.
static constexpr int verbosity_default_
An implementation of StatusTestResNorm using a family of residual norms.
static constexpr bool showMaxResNormOnly_default_
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
static const double convTol
Default convergence tolerance.
Belos::StatusTest class for specifying a maximum number of iterations.
MultiVecTraits< ScalarType, MV > MVT
static std::string name()
static constexpr int blockSize_default_
A factory class for generating StatusTestOutput objects.
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Set the parameters the solver manager should use to solve the linear problem.
bool isParameter(const std::string &name) const
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
Teuchos::RCP< std::ostream > outputStream_
Output stream to which the output manager prints.
A Belos::StatusTest class for specifying a maximum number of iterations.
ResetType
How to reset the solver.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Pure virtual base class which describes the basic interface for a solver manager. ...
static void summarize(Ptr< const Comm< int > > comm, std::ostream &out=std::cout, const bool alwaysWriteLocal=false, const bool writeGlobalStats=true, const bool writeZeroTimers=true, const ECounterSetOp setOp=Intersection, const std::string &filter="", const bool ignoreZeroTimers=false)
bool is_null(const RCP< T > &p)
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
virtual ~FixedPointSolMgr()
Destructor.
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
int numIters_
Number of iterations taken by the last solve() invocation.
std::string description() const override
Method to return description of the block CG solver manager.
ReturnType solve() override
This method performs possibly repeated calls to the underlying linear solver's iterate() routine unti...
bool isSet_
Whether or not the parameters have been set (via setParameters()).
int maxIters_
Maximum iteration count (read from parameter list).
Teuchos::RCP< StatusTestMaxIters< ScalarType, MV, OP > > maxIterTest_
Maximum iteration count stopping criterion.
ReturnType
Whether the Belos solve converged for all linear systems.
Teuchos::RCP< Teuchos::Time > timerSolve_
Solve timer.
void replaceUserConvStatusTest(const Teuchos::RCP< StatusTestResNorm< ScalarType, MV, OP > > &userConvStatusTest)
Set user-defined convergence status test.
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
Teuchos::RCP< OutputManager< ScalarType > > printer_
Output manager, that handles printing of different kinds of messages.
Teuchos::RCP< const MV > R
The current residual.
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
static constexpr const char * label_default_
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
FixedPointSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i...
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
Teuchos::RCP< StatusTestOutput< ScalarType, MV, OP > > create(const Teuchos::RCP< OutputManager< ScalarType > > &printer, Teuchos::RCP< StatusTest< ScalarType, MV, OP > > test, int mod, int printStates)
Create the StatusTestOutput object specified by the outputStyle.
Structure to contain pointers to FixedPointIteration state variables.
FixedPointSolMgrLinearProblemFailure(const std::string &what_arg)
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Teuchos::RCP< StatusTestOutput< ScalarType, MV, OP > > outputTest_
Output "status test" that controls all the other status tests.
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
bool isType(const std::string &name) const
A class for extending the status testing capabilities of Belos via logical combinations.
int getNumIters() const override
Get the iteration count for the most recent call to solve().
Teuchos::RCP< StatusTestResNorm< ScalarType, MV, OP > > convTest_
Convergence stopping criterion.
Class which defines basic traits for the operator type.
MagnitudeType achievedTol_
Tolerance achieved by the last solve() invocation.
Parent class to all Belos exceptions.
Default parameters common to most Belos solvers.
Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > problem_
The linear problem to solve.
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
Teuchos::ScalarTraits< ScalarType > SCT
Belos header file which uses auto-configuration information to include necessary C++ headers...
This class implements the preconditioned fixed point iteration.
std::string label_
Prefix label for all the timers.
const LinearProblem< ScalarType, MV, OP > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
Teuchos::RCP< StatusTest< ScalarType, MV, OP > > sTest_
Aggregate stopping criterion.
MagnitudeType convtol_
Convergence tolerance (read from parameter list).