10#ifndef BELOS_PSEUDO_BLOCK_CG_SOLMGR_HPP
11#define BELOS_PSEUDO_BLOCK_CG_SOLMGR_HPP
31#include "Teuchos_LAPACK.hpp"
32#ifdef BELOS_TEUCHOS_TIME_MONITOR
33#include "Teuchos_TimeMonitor.hpp"
73 template<
class ScalarType,
class MV,
class OP,
74 const bool supportsScalarType =
78 Belos::Details::LapackSupportsScalar<ScalarType>::value>
80 static const bool scalarTypeIsSupported =
89 const Teuchos::RCP<Teuchos::ParameterList> &
pl) :
94 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> >
99 template<
class ScalarType,
class MV,
class OP>
106 using SCT = Teuchos::ScalarTraits<ScalarType>;
107 using MagnitudeType =
typename Teuchos::ScalarTraits<ScalarType>::magnitudeType;
108 using MT = Teuchos::ScalarTraits<MagnitudeType>;
138 const Teuchos::RCP<Teuchos::ParameterList> &
pl );
144 Teuchos::RCP<SolverManager<ScalarType, MV, OP> >
clone ()
const override {
158 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters()
const override;
169 Teuchos::Array<Teuchos::RCP<Teuchos::Time> >
getTimers()
const {
170 return Teuchos::tuple(timerSolve_);
205 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> >
217 void setParameters(
const Teuchos::RCP<Teuchos::ParameterList> &
params )
override;
258 std::string description()
const override;
263 void compute_condnum_tridiag_sym(Teuchos::ArrayView<MagnitudeType>
diag,
264 Teuchos::ArrayView<MagnitudeType>
offdiag,
265 Teuchos::ArrayRCP<MagnitudeType>&
lambdas,
271 Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > problem_;
274 Teuchos::RCP<OutputManager<ScalarType> > printer_;
275 Teuchos::RCP<std::ostream> outputStream_;
278 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > sTest_;
279 Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP> > maxIterTest_;
280 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> > convTest_;
281 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP> > outputTest_;
284 Teuchos::RCP<Teuchos::ParameterList> params_;
291 mutable Teuchos::RCP<const Teuchos::ParameterList> validParams_;
294 static constexpr int maxIters_default_ = 1000;
295 static constexpr bool assertPositiveDefiniteness_default_ =
true;
296 static constexpr bool showMaxResNormOnly_default_ =
false;
299 static constexpr int outputFreq_default_ = -1;
300 static constexpr int defQuorum_default_ = 1;
301 static constexpr bool foldConvergenceDetectionIntoAllreduce_default_ =
false;
302 static constexpr const char * resScale_default_ =
"Norm of Initial Residual";
303 static constexpr const char * label_default_ =
"Belos";
304 static constexpr bool genCondEst_default_ =
false;
307 MagnitudeType convtol_,achievedTol_;
308 int maxIters_, numIters_;
309 int verbosity_, outputStyle_, outputFreq_, defQuorum_;
310 bool assertPositiveDefiniteness_, showMaxResNormOnly_;
311 bool foldConvergenceDetectionIntoAllreduce_;
312 std::string resScale_;
315 Teuchos::ArrayRCP<MagnitudeType> eigenEstimates_;
317 Teuchos::RCP<CGIterationStateBase<ScalarType, MV> > state_;
321 Teuchos::RCP<Teuchos::Time> timerSolve_;
329template<
class ScalarType,
class MV,
class OP>
333 maxIters_(maxIters_default_),
335 verbosity_(verbosity_default_),
336 outputStyle_(outputStyle_default_),
337 outputFreq_(outputFreq_default_),
338 defQuorum_(defQuorum_default_),
339 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
340 showMaxResNormOnly_(showMaxResNormOnly_default_),
341 foldConvergenceDetectionIntoAllreduce_(foldConvergenceDetectionIntoAllreduce_default_),
342 resScale_(resScale_default_),
343 genCondEst_(genCondEst_default_),
345 label_(label_default_),
350template<
class ScalarType,
class MV,
class OP>
353 const Teuchos::RCP<Teuchos::ParameterList> &
pl ) :
357 maxIters_(maxIters_default_),
359 verbosity_(verbosity_default_),
360 outputStyle_(outputStyle_default_),
361 outputFreq_(outputFreq_default_),
362 defQuorum_(defQuorum_default_),
363 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
364 showMaxResNormOnly_(showMaxResNormOnly_default_),
365 foldConvergenceDetectionIntoAllreduce_(foldConvergenceDetectionIntoAllreduce_default_),
366 resScale_(resScale_default_),
367 genCondEst_(genCondEst_default_),
369 label_(label_default_),
373 problem_.is_null (), std::invalid_argument,
374 "Belos::PseudoBlockCGSolMgr two-argument constructor: "
375 "'problem' is null. You must supply a non-null Belos::LinearProblem "
376 "instance when calling this constructor.");
378 if (!
pl.is_null ()) {
384template<
class ScalarType,
class MV,
class OP>
389 using Teuchos::ParameterList;
390 using Teuchos::parameterList;
413 if (params_.is_null ()) {
421 if (
params->isParameter (
"Maximum Iterations")) {
422 maxIters_ =
params->get (
"Maximum Iterations", maxIters_default_);
425 params_->set (
"Maximum Iterations", maxIters_);
426 if (! maxIterTest_.is_null ()) {
427 maxIterTest_->setMaxIters (maxIters_);
432 if (
params->isParameter (
"Assert Positive Definiteness")) {
433 assertPositiveDefiniteness_ =
434 params->get (
"Assert Positive Definiteness",
435 assertPositiveDefiniteness_default_);
438 params_->set (
"Assert Positive Definiteness", assertPositiveDefiniteness_);
441 if (
params->isParameter(
"Fold Convergence Detection Into Allreduce")) {
442 foldConvergenceDetectionIntoAllreduce_ =
params->get(
"Fold Convergence Detection Into Allreduce",
443 foldConvergenceDetectionIntoAllreduce_default_);
447 if (
params->isParameter (
"Timer Label")) {
448 const std::string
tempLabel =
params->get (
"Timer Label", label_default_);
453 params_->set (
"Timer Label", label_);
455 label_ +
": PseudoBlockCGSolMgr total solve time";
456#ifdef BELOS_TEUCHOS_TIME_MONITOR
457 timerSolve_ = Teuchos::TimeMonitor::getNewCounter (
solveLabel);
463 if (
params->isParameter (
"Verbosity")) {
464 if (Teuchos::isParameterType<int> (*
params,
"Verbosity")) {
465 verbosity_ =
params->get (
"Verbosity", verbosity_default_);
467 verbosity_ = (
int) Teuchos::getParameter<Belos::MsgType> (*
params,
"Verbosity");
471 params_->set (
"Verbosity", verbosity_);
472 if (! printer_.is_null ()) {
473 printer_->setVerbosity (verbosity_);
478 if (
params->isParameter (
"Output Style")) {
479 if (Teuchos::isParameterType<int> (*
params,
"Output Style")) {
480 outputStyle_ =
params->get (
"Output Style", outputStyle_default_);
483 outputStyle_ = (
int) Teuchos::getParameter<Belos::OutputType> (*
params,
"Output Style");
488 params_->set (
"Output Style", outputStyle_);
489 outputTest_ = Teuchos::null;
493 if (
params->isParameter (
"Output Stream")) {
497 params_->set (
"Output Stream", outputStream_);
498 if (! printer_.is_null ()) {
499 printer_->setOStream (outputStream_);
505 if (
params->isParameter (
"Output Frequency")) {
506 outputFreq_ =
params->get (
"Output Frequency", outputFreq_default_);
510 params_->set (
"Output Frequency", outputFreq_);
511 if (! outputTest_.is_null ()) {
512 outputTest_->setOutputFrequency (outputFreq_);
517 if (
params->isParameter (
"Estimate Condition Number")) {
518 genCondEst_ =
params->get (
"Estimate Condition Number", genCondEst_default_);
522 if (printer_.is_null ()) {
531 if (
params->isParameter (
"Convergence Tolerance")) {
532 if (
params->isType<MagnitudeType> (
"Convergence Tolerance")) {
533 convtol_ =
params->get (
"Convergence Tolerance",
541 params_->set (
"Convergence Tolerance", convtol_);
542 if (! convTest_.is_null ()) {
543 convTest_->setTolerance (convtol_);
547 if (
params->isParameter (
"Show Maximum Residual Norm Only")) {
548 showMaxResNormOnly_ =
params->get<
bool> (
"Show Maximum Residual Norm Only");
551 params_->set (
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
552 if (! convTest_.is_null ()) {
553 convTest_->setShowMaxResNormOnly (showMaxResNormOnly_);
565 if (
params->isParameter (
"Residual Scaling")) {
568 else if (
params->isParameter (
"Implicit Residual Scaling")) {
582 params_->set (
"Implicit Residual Scaling", resScale_);
585 params_->set (
"Residual Scaling", resScale_);
588 if (! convTest_.is_null ()) {
592 catch (std::exception&
e) {
601 if (
params->isParameter (
"Deflation Quorum")) {
602 defQuorum_ =
params->get (
"Deflation Quorum", defQuorum_);
603 params_->set (
"Deflation Quorum", defQuorum_);
604 if (! convTest_.is_null ()) {
605 convTest_->setQuorum( defQuorum_ );
612 if (maxIterTest_.is_null ()) {
618 convTest_ =
rcp (
new StatusTestResNorm_t (convtol_, defQuorum_, showMaxResNormOnly_));
623 sTest_ =
rcp (
new StatusTestCombo_t (StatusTestCombo_t::OR, maxIterTest_, convTest_));
630 outputTest_ =
stoFactory.create (printer_, sTest_, outputFreq_,
634 const std::string
solverDesc =
" Pseudo Block CG ";
639 if (timerSolve_.is_null ()) {
641 label_ +
": PseudoBlockCGSolMgr total solve time";
642#ifdef BELOS_TEUCHOS_TIME_MONITOR
643 timerSolve_ = Teuchos::TimeMonitor::getNewCounter (
solveLabel);
652template<
class ScalarType,
class MV,
class OP>
653Teuchos::RCP<const Teuchos::ParameterList>
656 using Teuchos::ParameterList;
657 using Teuchos::parameterList;
660 if (validParams_.is_null()) {
664 "The relative residual tolerance that needs to be achieved by the\n"
665 "iterative solver in order for the linear system to be declared converged.");
666 pl->set(
"Maximum Iterations",
static_cast<int>(maxIters_default_),
667 "The maximum number of block iterations allowed for each\n"
668 "set of RHS solved.");
669 pl->set(
"Assert Positive Definiteness",
static_cast<bool>(assertPositiveDefiniteness_default_),
670 "Whether or not to assert that the linear operator\n"
671 "and the preconditioner are indeed positive definite.");
672 pl->set(
"Verbosity",
static_cast<int>(verbosity_default_),
673 "What type(s) of solver information should be outputted\n"
674 "to the output stream.");
675 pl->set(
"Output Style",
static_cast<int>(outputStyle_default_),
676 "What style is used for the solver information outputted\n"
677 "to the output stream.");
678 pl->set(
"Output Frequency",
static_cast<int>(outputFreq_default_),
679 "How often convergence information should be outputted\n"
680 "to the output stream.");
681 pl->set(
"Deflation Quorum",
static_cast<int>(defQuorum_default_),
682 "The number of linear systems that need to converge before\n"
683 "they are deflated. This number should be <= block size.");
684 pl->set(
"Output Stream", Teuchos::rcpFromRef(std::cout),
685 "A reference-counted pointer to the output stream where all\n"
686 "solver output is sent.");
687 pl->set(
"Show Maximum Residual Norm Only",
static_cast<bool>(showMaxResNormOnly_default_),
688 "When convergence information is printed, only show the maximum\n"
689 "relative residual norm when the block size is greater than one.");
690 pl->set(
"Implicit Residual Scaling", resScale_default_,
691 "The type of scaling used in the residual convergence test.");
692 pl->set(
"Estimate Condition Number",
static_cast<bool>(genCondEst_default_),
693 "Whether or not to estimate the condition number of the preconditioned system.");
699 pl->set(
"Residual Scaling", resScale_default_,
700 "The type of scaling used in the residual convergence test. This "
701 "name is deprecated; the new name is \"Implicit Residual Scaling\".");
702 pl->set(
"Timer Label",
static_cast<const char *
>(label_default_),
703 "The string to use as a prefix for the timer labels.");
704 pl->set(
"Fold Convergence Detection Into Allreduce",
static_cast<bool>(foldConvergenceDetectionIntoAllreduce_default_),
705 "Merge the allreduce for convergence detection with the one for CG.\n"
706 "This saves one all-reduce, but incurs more computation.");
714template<
class ScalarType,
class MV,
class OP>
717 const char prefix[] =
"Belos::PseudoBlockCGSolMgr::solve: ";
722 if (!isSet_) { setParameters( params_ ); }
726 prefix <<
"The linear problem to solve is not ready. You must call "
727 "setProblem() on the Belos::LinearProblem instance before telling the "
728 "Belos solver to solve it.");
732 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
742 problem_->setLSIndex(
currIdx );
746 Teuchos::ParameterList
plist;
748 plist.set(
"Assert Positive Definiteness",assertPositiveDefiniteness_);
749 if(genCondEst_)
plist.set(
"Max Size For Condest",maxIters_);
752 outputTest_->reset();
761 plist.set(
"Fold Convergence Detection Into Allreduce",
762 foldConvergenceDetectionIntoAllreduce_);
780#ifdef BELOS_TEUCHOS_TIME_MONITOR
781 Teuchos::TimeMonitor
slvtimer(*timerSolve_);
795 outputTest_->resetNumCalls();
798 Teuchos::RCP<MV>
R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())),
currIdx );
815 if ( convTest_->getStatus() ==
Passed ) {
818 std::vector<int>
convIdx = Teuchos::rcp_dynamic_cast<StatusTestGenResNorm<ScalarType,MV,OP> >(convTest_)->convIndices();
826 problem_->setCurrLS();
832 for (
unsigned int j=0;
j<
convIdx.size(); ++
j) {
864 std::vector<MagnitudeType>
norms;
877 else if ( maxIterTest_->getStatus() ==
Passed ) {
892 "Belos::PseudoBlockCGSolMgr::solve(): Invalid return from PseudoBlockCGIter::iterate().");
897 achievedTol_ = MT::one();
898 Teuchos::RCP<MV>
X = problem_->getLHS();
899 MVT::MvInit( *
X, SCT::zero() );
900 printer_->stream(
Warnings) <<
"Belos::PseudoBlockCGSolMgr::solve(): Warning! NaN has been detected!"
904 catch (
const std::exception &
e) {
905 printer_->stream(
Errors) <<
"Error! Caught std::exception in PseudoBlockCGIter::iterate() at iteration "
907 <<
e.what() << std::endl;
913 problem_->setCurrLS();
928 problem_->setLSIndex(
currIdx );
942#ifdef BELOS_TEUCHOS_TIME_MONITOR
947 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails) );
951 numIters_ = maxIterTest_->getNumIters();
955 const std::vector<MagnitudeType>*
pTestValues = convTest_->getTestValue();
976template<
class ScalarType,
class MV,
class OP>
979 std::ostringstream
oss;
980 oss <<
"Belos::PseudoBlockCGSolMgr<...,"<<Teuchos::ScalarTraits<ScalarType>::name()<<
">";
987template<
class ScalarType,
class MV,
class OP>
991 Teuchos::ArrayView<MagnitudeType>
offdiag,
992 Teuchos::ArrayRCP<MagnitudeType>&
lambdas,
997 using STS = Teuchos::ScalarTraits<ScalarType>;
1006 const int N =
diag.size ();
1010 Teuchos::LAPACK<int,ScalarType> lapack;
1019 (
info < 0, std::logic_error,
"Belos::PseudoBlockCGSolMgr::"
1020 "compute_condnum_tridiag_sym: LAPACK's _PTEQR failed with info = "
1021 <<
info <<
" < 0. This suggests there might be a bug in the way Belos "
1022 "is calling LAPACK. Please report this to the Belos developers.");
1023 for (
int k = 0;
k <
N;
k++) {
Belos concrete class for performing the conjugate-gradient (CG) iteration.
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.
Class which manages the output and verbosity of the Belos solvers.
Belos concrete class for performing the pseudo-block CG iteration.
Pure virtual base class which describes the basic interface for a solver manager.
Belos::StatusTest for logically combining several status tests.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Belos::StatusTest class for specifying a maximum number of iterations.
A factory class for generating StatusTestOutput objects.
Collection of types and exceptions used within the Belos solvers.
Parent class to all Belos exceptions.
Type traits class that says whether Teuchos::LAPACK has a valid implementation for the given ScalarTy...
Base class for Belos::SolverManager subclasses which normally can only compile with ScalarType types ...
Alternative run-time polymorphic interface for operators.
Operator()
Default constructor (does nothing).
PseudoBlockCGSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i....
PseudoBlockCGSolMgrLinearProblemFailure(const std::string &what_arg)
Teuchos::ArrayRCP< MagnitudeType > getEigenEstimates() const
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
virtual ~PseudoBlockCGSolMgr()=default
Destructor.
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
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)
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
Teuchos::RCP< StatusTestGenResNorm< ScalarType, MV, OP > > getResidualStatusTest() const
Return the residual status test.
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
ScalarType getConditionEstimate() const
Gets the estimated condition number.
int getNumIters() const override
Get the iteration count for the most recent call to solve().
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve.
The Belos::PseudoBlockCGSolMgr provides a powerful and fully-featured solver manager over the pseudo-...
Teuchos::RCP< StatusTestGenResNorm< ScalarType, MV, OP > > getResidualStatusTest() const
virtual ~PseudoBlockCGSolMgr()=default
PseudoBlockCGSolMgr(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< Teuchos::ParameterList > &pl)
ScaleType convertStringToScaleType(const std::string &scaleType)
Convert the given string to its ScaleType enum value.
ReturnType
Whether the Belos solve converged for all linear systems.
ScaleType
The type of scaling to use on the residual norm value.
ResetType
How to reset the solver.
Default parameters common to most Belos solvers.
static const double convTol
Default convergence tolerance.