42 #ifndef BELOS_TFQMR_SOLMGR_HPP
43 #define BELOS_TFQMR_SOLMGR_HPP
61 #ifdef BELOS_TEUCHOS_TIME_MONITOR
103 template<
class ScalarType,
class MV,
class OP>
174 return Teuchos::tuple(timerSolve_);
254 bool checkStatusTest();
274 static constexpr
int maxIters_default_ = 1000;
275 static constexpr
bool expResTest_default_ =
false;
278 static constexpr
int outputFreq_default_ = -1;
279 static constexpr
const char * impResScale_default_ =
"Norm of Preconditioned Initial Residual";
280 static constexpr
const char * expResScale_default_ =
"Norm of Initial Residual";
281 static constexpr
const char * label_default_ =
"Belos";
282 static constexpr std::ostream * outputStream_default_ = &std::cout;
285 MagnitudeType convtol_, impTolScale_, achievedTol_;
286 int maxIters_, numIters_;
287 int verbosity_, outputStyle_, outputFreq_;
290 std::string impResScale_, expResScale_;
297 bool isSet_, isSTSet_;
302 template<
class ScalarType,
class MV,
class OP>
304 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
307 achievedTol_(Teuchos::ScalarTraits<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>::zero()),
308 maxIters_(maxIters_default_),
310 verbosity_(verbosity_default_),
311 outputStyle_(outputStyle_default_),
312 outputFreq_(outputFreq_default_),
314 expResTest_(expResTest_default_),
315 impResScale_(impResScale_default_),
316 expResScale_(expResScale_default_),
317 label_(label_default_),
324 template<
class ScalarType,
class MV,
class OP>
329 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
332 achievedTol_(Teuchos::ScalarTraits<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>::zero()),
333 maxIters_(maxIters_default_),
335 verbosity_(verbosity_default_),
336 outputStyle_(outputStyle_default_),
337 outputFreq_(outputFreq_default_),
339 expResTest_(expResTest_default_),
340 impResScale_(impResScale_default_),
341 expResScale_(expResScale_default_),
342 label_(label_default_),
354 template<
class ScalarType,
class MV,
class OP>
358 if (params_ == Teuchos::null) {
367 maxIters_ = params->
get(
"Maximum Iterations",maxIters_default_);
370 params_->set(
"Maximum Iterations", maxIters_);
371 if (maxIterTest_!=Teuchos::null)
372 maxIterTest_->setMaxIters( maxIters_ );
377 blockSize_ = params->
get(
"Block Size",1);
379 "Belos::TFQMRSolMgr: \"Block Size\" must be 1.");
382 params_->set(
"Block Size", blockSize_);
387 std::string tempLabel = params->
get(
"Timer Label", label_default_);
390 if (tempLabel != label_) {
392 params_->set(
"Timer Label", label_);
393 std::string solveLabel = label_ +
": TFQMRSolMgr total solve time";
394 #ifdef BELOS_TEUCHOS_TIME_MONITOR
402 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
403 verbosity_ = params->
get(
"Verbosity", verbosity_default_);
405 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
409 params_->set(
"Verbosity", verbosity_);
410 if (printer_ != Teuchos::null)
411 printer_->setVerbosity(verbosity_);
416 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
417 outputStyle_ = params->
get(
"Output Style", outputStyle_default_);
419 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
423 params_->set(
"Output Style", outputStyle_);
429 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
432 params_->set(
"Output Stream", outputStream_);
433 if (printer_ != Teuchos::null)
434 printer_->setOStream( outputStream_ );
440 outputFreq_ = params->
get(
"Output Frequency", outputFreq_default_);
444 params_->set(
"Output Frequency", outputFreq_);
445 if (outputTest_ != Teuchos::null)
446 outputTest_->setOutputFrequency( outputFreq_ );
450 if (printer_ == Teuchos::null) {
455 if (params->
isParameter(
"Convergence Tolerance")) {
456 if (params->
isType<MagnitudeType> (
"Convergence Tolerance")) {
457 convtol_ = params->
get (
"Convergence Tolerance",
465 params_->set(
"Convergence Tolerance", convtol_);
470 if (params->
isParameter(
"Implicit Tolerance Scale Factor")) {
471 if (params->
isType<MagnitudeType> (
"Implicit Tolerance Scale Factor")) {
472 impTolScale_ = params->
get (
"Implicit Tolerance Scale Factor",
477 impTolScale_ = params->
get (
"Implicit Tolerance Scale Factor",
482 params_->set(
"Implicit Tolerance Scale Factor", impTolScale_);
487 if (params->
isParameter(
"Implicit Residual Scaling")) {
488 std::string tempImpResScale = Teuchos::getParameter<std::string>( *params,
"Implicit Residual Scaling" );
491 if (impResScale_ != tempImpResScale) {
492 impResScale_ = tempImpResScale;
495 params_->set(
"Implicit Residual Scaling", impResScale_);
502 if (params->
isParameter(
"Explicit Residual Scaling")) {
503 std::string tempExpResScale = Teuchos::getParameter<std::string>( *params,
"Explicit Residual Scaling" );
506 if (expResScale_ != tempExpResScale) {
507 expResScale_ = tempExpResScale;
510 params_->set(
"Explicit Residual Scaling", expResScale_);
517 if (params->
isParameter(
"Explicit Residual Test")) {
518 expResTest_ = Teuchos::getParameter<bool>( *params,
"Explicit Residual Test" );
521 params_->set(
"Explicit Residual Test", expResTest_);
522 if (expConvTest_ == Teuchos::null) {
528 if (timerSolve_ == Teuchos::null) {
529 std::string solveLabel = label_ +
": TFQMRSolMgr total solve time";
530 #ifdef BELOS_TEUCHOS_TIME_MONITOR
541 template<
class ScalarType,
class MV,
class OP>
554 Teuchos::rcp(
new StatusTestGenResNorm_t( impTolScale_*convtol_ ) );
556 impConvTest_ = tmpImpConvTest;
561 tmpExpConvTest->defineResForm( StatusTestGenResNorm_t::Explicit,
Belos::TwoNorm );
563 expConvTest_ = tmpExpConvTest;
566 convTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::SEQ, impConvTest_, expConvTest_ ) );
574 impConvTest_ = tmpImpConvTest;
577 expConvTest_ = impConvTest_;
578 convTest_ = impConvTest_;
580 sTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
584 StatusTestOutputFactory<ScalarType,MV,OP> stoFactory( outputStyle_ );
588 std::string solverDesc =
" TFQMR ";
589 outputTest_->setSolverDesc( solverDesc );
599 template<
class ScalarType,
class MV,
class OP>
612 "The relative residual tolerance that needs to be achieved by the\n"
613 "iterative solver in order for the linear system to be declared converged.");
615 "The scale factor used by the implicit residual test when explicit residual\n"
616 "testing is used. May enable faster convergence when TFQMR bound is too loose.");
617 pl->
set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
618 "The maximum number of block iterations allowed for each\n"
619 "set of RHS solved.");
620 pl->
set(
"Verbosity", static_cast<int>(verbosity_default_),
621 "What type(s) of solver information should be outputted\n"
622 "to the output stream.");
623 pl->
set(
"Output Style", static_cast<int>(outputStyle_default_),
624 "What style is used for the solver information outputted\n"
625 "to the output stream.");
626 pl->
set(
"Output Frequency", static_cast<int>(outputFreq_default_),
627 "How often convergence information should be outputted\n"
628 "to the output stream.");
630 "A reference-counted pointer to the output stream where all\n"
631 "solver output is sent.");
632 pl->
set(
"Explicit Residual Test", static_cast<bool>(expResTest_default_),
633 "Whether the explicitly computed residual should be used in the convergence test.");
634 pl->
set(
"Implicit Residual Scaling", static_cast<const char *>(impResScale_default_),
635 "The type of scaling used in the implicit residual convergence test.");
636 pl->
set(
"Explicit Residual Scaling", static_cast<const char *>(expResScale_default_),
637 "The type of scaling used in the explicit residual convergence test.");
638 pl->
set(
"Timer Label", static_cast<const char *>(label_default_),
639 "The string to use as a prefix for the timer labels.");
647 template<
class ScalarType,
class MV,
class OP>
654 setParameters(Teuchos::parameterList(*getValidParameters()));
658 "Belos::TFQMRSolMgr::solve(): Linear problem is not a valid object.");
661 "Belos::TFQMRSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
665 "Belos::TFQMRSolMgr::solve(): Linear problem and requested status tests are incompatible.");
670 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
671 int numCurrRHS = blockSize_;
673 std::vector<int> currIdx, currIdx2;
676 currIdx.resize( blockSize_ );
677 currIdx2.resize( blockSize_ );
678 for (
int i=0; i<numCurrRHS; ++i)
679 { currIdx[i] = startPtr+i; currIdx2[i]=i; }
682 problem_->setLSIndex( currIdx );
687 plist.
set(
"Block Size",blockSize_);
690 outputTest_->reset();
693 bool isConverged =
true;
703 #ifdef BELOS_TEUCHOS_TIME_MONITOR
707 while ( numRHS2Solve > 0 ) {
710 std::vector<int> convRHSIdx;
711 std::vector<int> currRHSIdx( currIdx );
712 currRHSIdx.resize(numCurrRHS);
715 tfqmr_iter->resetNumIters();
718 outputTest_->resetNumCalls();
721 Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitPrecResVec())), currIdx );
726 tfqmr_iter->initializeTFQMR(newstate);
732 tfqmr_iter->iterate();
739 if ( convTest_->getStatus() ==
Passed ) {
748 else if ( maxIterTest_->getStatus() ==
Passed ) {
763 "Belos::TFQMRSolMgr::solve(): Invalid return from TFQMRIter::iterate().");
766 catch (
const std::exception &e) {
767 printer_->stream(
Errors) <<
"Error! Caught std::exception in TFQMRIter::iterate() at iteration "
768 << tfqmr_iter->getNumIters() << std::endl
769 << e.what() << std::endl;
775 problem_->updateSolution( tfqmr_iter->getCurrentUpdate(), true );
778 problem_->setCurrLS();
781 startPtr += numCurrRHS;
782 numRHS2Solve -= numCurrRHS;
783 if ( numRHS2Solve > 0 ) {
784 numCurrRHS = blockSize_;
786 currIdx.resize( blockSize_ );
787 currIdx2.resize( blockSize_ );
788 for (
int i=0; i<numCurrRHS; ++i)
789 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
791 problem_->setLSIndex( currIdx );
794 tfqmr_iter->setBlockSize( blockSize_ );
797 currIdx.resize( numRHS2Solve );
808 #ifdef BELOS_TEUCHOS_TIME_MONITOR
817 numIters_ = maxIterTest_->getNumIters();
830 const std::vector<MagnitudeType>* pTestValues = NULL;
832 pTestValues = expConvTest_->getTestValue();
833 if (pTestValues == NULL || pTestValues->size() < 1) {
834 pTestValues = impConvTest_->getTestValue();
839 pTestValues = impConvTest_->getTestValue();
842 "Belos::TFQMRSolMgr::solve(): The implicit convergence test's "
843 "getTestValue() method returned NULL. Please report this bug to the "
844 "Belos developers.");
846 "Belos::TMQMRSolMgr::solve(): The implicit convergence test's "
847 "getTestValue() method returned a vector of length zero. Please report "
848 "this bug to the Belos developers.");
853 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
863 template<
class ScalarType,
class MV,
class OP>
866 std::ostringstream oss;
ScaleType convertStringToScaleType(const std::string &scaleType)
Convert the given string to its ScaleType enum value.
Collection of types and exceptions used within the Belos solvers.
This class implements the preconditioned transpose-free QMR algorithm for solving non-Hermitian linea...
int getNumIters() const override
Get the iteration count for the most recent call to solve().
Belos's basic output manager for sending information of select verbosity levels to the appropriate ou...
Class which manages the output and verbosity of the Belos solvers.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Set the parameters the solver manager should use to solve the linear problem.
bool is_null(const boost::shared_ptr< T > &p)
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
bool isLOADetected() const override
Whether loss of accuracy was detected during the last solve() invocation.
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
bool is_null(const std::shared_ptr< T > &p)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
const LinearProblem< ScalarType, MV, OP > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
An implementation of StatusTestResNorm using a family of residual norms.
Belos concrete class for generating iterations with the preconditioned tranpose-free QMR (TFQMR) meth...
Teuchos::RCP< const MV > R
The current residual basis.
static const double convTol
Default convergence tolerance.
Belos::StatusTest class for specifying a maximum number of iterations.
std::string description() const override
Method to return description of the TFQMR solver manager.
static std::string name()
A factory class for generating StatusTestOutput objects.
TFQMRSolMgrOrthoFailure(const std::string &what_arg)
ReturnType solve() override
This method performs possibly repeated calls to the underlying linear solver's iterate() routine unti...
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
bool isParameter(const std::string &name) const
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
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 const double impTolScale
"Implicit Tolerance Scale Factor"
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)
A linear system to solve, and its associated information.
Structure to contain pointers to TFQMRIter state variables.
Class which describes the linear problem to be solved by the iterative solver.
TFQMRSolMgr()
Empty constructor for TFQMRSolMgr. This constructor takes no arguments and sets the default values fo...
virtual ~TFQMRSolMgr()
Destructor.
ReturnType
Whether the Belos solve converged for all linear systems.
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
The Belos::TFQMRSolMgr provides a powerful and fully-featured solver manager over the TFQMR linear so...
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
bool isType(const std::string &name) const
A class for extending the status testing capabilities of Belos via logical combinations.
TFQMRSolMgrLinearProblemFailure(const std::string &what_arg)
Class which defines basic traits for the operator type.
TFQMRSolMgrOrthoFailure is thrown when the orthogonalization manager is unable to generate orthonorma...
Parent class to all Belos exceptions.
Default parameters common to most Belos solvers.
TFQMRSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i.e.
Belos header file which uses auto-configuration information to include necessary C++ headers...
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.