10#ifndef BELOS_BICGSTAB_SOLMGR_HPP
11#define BELOS_BICGSTAB_SOLMGR_HPP
32#ifdef BELOS_TEUCHOS_TIME_MONITOR
33#include "Teuchos_TimeMonitor.hpp"
67 template<
class ScalarType,
class MV,
class OP,
class DM = DefaultDenseMatrix<
int, ScalarType>>
73 typedef Teuchos::ScalarTraits<ScalarType> SCT;
74 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
75 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
99 const Teuchos::RCP<Teuchos::ParameterList> &
pl );
105 Teuchos::RCP<SolverManager<ScalarType, MV, OP, DM> >
clone ()
const override {
130 Teuchos::Array<Teuchos::RCP<Teuchos::Time> >
getTimers()
const {
131 return Teuchos::tuple(timerSolve_);
215 Teuchos::RCP<LinearProblem<ScalarType,MV,OP,DM> > problem_;
218 Teuchos::RCP<OutputManager<ScalarType> > printer_;
219 Teuchos::RCP<std::ostream> outputStream_;
222 Teuchos::RCP<StatusTest<ScalarType,MV,OP,DM> > sTest_;
223 Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP,DM> > maxIterTest_;
224 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP,DM> > convTest_;
225 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP,DM> > outputTest_;
228 Teuchos::RCP<Teuchos::ParameterList> params_;
235 mutable Teuchos::RCP<const Teuchos::ParameterList> validParams_;
238 static constexpr int maxIters_default_ = 1000;
239 static constexpr bool showMaxResNormOnly_default_ =
false;
242 static constexpr int outputFreq_default_ = -1;
243 static constexpr int defQuorum_default_ = 1;
244 static constexpr const char * resScale_default_ =
"Norm of Initial Residual";
245 static constexpr const char * label_default_ =
"Belos";
248 MagnitudeType convtol_,achievedTol_;
249 int maxIters_, numIters_;
250 int verbosity_, outputStyle_, outputFreq_, defQuorum_;
251 bool showMaxResNormOnly_;
252 std::string resScale_;
256 Teuchos::RCP<Teuchos::Time> timerSolve_;
263template<
class ScalarType,
class MV,
class OP,
class DM>
267 maxIters_(maxIters_default_),
269 verbosity_(verbosity_default_),
270 outputStyle_(outputStyle_default_),
271 outputFreq_(outputFreq_default_),
272 defQuorum_(defQuorum_default_),
273 showMaxResNormOnly_(showMaxResNormOnly_default_),
274 resScale_(resScale_default_),
275 label_(label_default_),
280template<
class ScalarType,
class MV,
class OP,
class DM>
283 const Teuchos::RCP<Teuchos::ParameterList> &
pl ) :
287 maxIters_(maxIters_default_),
289 verbosity_(verbosity_default_),
290 outputStyle_(outputStyle_default_),
291 outputFreq_(outputFreq_default_),
292 defQuorum_(defQuorum_default_),
293 showMaxResNormOnly_(showMaxResNormOnly_default_),
294 resScale_(resScale_default_),
295 label_(label_default_),
299 problem_.is_null (), std::invalid_argument,
300 "Belos::BiCGStabSolMgr two-argument constructor: "
301 "'problem' is null. You must supply a non-null Belos::LinearProblem "
302 "instance when calling this constructor.");
304 if (!
pl.is_null ()) {
310template<
class ScalarType,
class MV,
class OP,
class DM>
313 using Teuchos::ParameterList;
314 using Teuchos::parameterList;
320 if (params_.is_null()) {
327 if (
params->isParameter(
"Maximum Iterations")) {
328 maxIters_ =
params->get(
"Maximum Iterations",maxIters_default_);
331 params_->set(
"Maximum Iterations", maxIters_);
332 if (maxIterTest_!=Teuchos::null)
333 maxIterTest_->setMaxIters( maxIters_ );
337 if (
params->isParameter(
"Timer Label")) {
343 params_->set(
"Timer Label", label_);
344 std::string
solveLabel = label_ +
": BiCGStabSolMgr total solve time";
345#ifdef BELOS_TEUCHOS_TIME_MONITOR
346 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(
solveLabel);
352 if (
params->isParameter(
"Verbosity")) {
353 if (Teuchos::isParameterType<int>(*
params,
"Verbosity")) {
354 verbosity_ =
params->get(
"Verbosity", verbosity_default_);
356 verbosity_ = (
int)Teuchos::getParameter<Belos::MsgType>(*
params,
"Verbosity");
360 params_->set(
"Verbosity", verbosity_);
361 if (printer_ != Teuchos::null)
362 printer_->setVerbosity(verbosity_);
366 if (
params->isParameter(
"Output Style")) {
367 if (Teuchos::isParameterType<int>(*
params,
"Output Style")) {
368 outputStyle_ =
params->get(
"Output Style", outputStyle_default_);
370 outputStyle_ = (
int)Teuchos::getParameter<Belos::OutputType>(*
params,
"Output Style");
374 params_->set(
"Output Style", outputStyle_);
375 outputTest_ = Teuchos::null;
379 if (
params->isParameter(
"Output Stream")) {
380 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*
params,
"Output Stream");
383 params_->set(
"Output Stream", outputStream_);
384 if (printer_ != Teuchos::null)
385 printer_->setOStream( outputStream_ );
390 if (
params->isParameter(
"Output Frequency")) {
391 outputFreq_ =
params->get(
"Output Frequency", outputFreq_default_);
395 params_->set(
"Output Frequency", outputFreq_);
396 if (outputTest_ != Teuchos::null)
397 outputTest_->setOutputFrequency( outputFreq_ );
401 if (printer_ == Teuchos::null) {
410 if (
params->isParameter(
"Convergence Tolerance")) {
411 if (
params->isType<MagnitudeType> (
"Convergence Tolerance")) {
412 convtol_ =
params->get (
"Convergence Tolerance",
420 params_->set(
"Convergence Tolerance", convtol_);
421 if (convTest_ != Teuchos::null)
422 convTest_->setTolerance( convtol_ );
425 if (
params->isParameter(
"Show Maximum Residual Norm Only")) {
426 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*
params,
"Show Maximum Residual Norm Only");
429 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
430 if (convTest_ != Teuchos::null)
431 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
442 if (
params->isParameter (
"Residual Scaling")) {
445 else if (
params->isParameter (
"Implicit Residual Scaling")) {
458 params_->set (
"Implicit Residual Scaling", resScale_);
461 params_->set (
"Residual Scaling", resScale_);
464 if (! convTest_.is_null()) {
468 catch (std::exception&
e) {
477 if (
params->isParameter(
"Deflation Quorum")) {
478 defQuorum_ =
params->get(
"Deflation Quorum", defQuorum_);
479 params_->set(
"Deflation Quorum", defQuorum_);
480 if (convTest_ != Teuchos::null)
481 convTest_->setQuorum( defQuorum_ );
487 if (maxIterTest_ == Teuchos::null)
491 if (convTest_ == Teuchos::null ||
newResTest) {
492 convTest_ = Teuchos::rcp(
new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
497 sTest_ = Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
499 if (outputTest_ == Teuchos::null ||
newResTest) {
507 std::string
solverDesc =
" Pseudo Block BiCGStab ";
513 if (timerSolve_ == Teuchos::null) {
514 std::string
solveLabel = label_ +
": BiCGStabSolMgr total solve time";
515#ifdef BELOS_TEUCHOS_TIME_MONITOR
516 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(
solveLabel);
525template<
class ScalarType,
class MV,
class OP,
class DM>
526Teuchos::RCP<const Teuchos::ParameterList>
529 using Teuchos::ParameterList;
530 using Teuchos::parameterList;
533 if (validParams_.is_null()) {
540 "The relative residual tolerance that needs to be achieved by the\n"
541 "iterative solver in order for the linera system to be declared converged.");
542 pl->set(
"Maximum Iterations",
static_cast<int>(maxIters_default_),
543 "The maximum number of block iterations allowed for each\n"
544 "set of RHS solved.");
545 pl->set(
"Verbosity",
static_cast<int>(verbosity_default_),
546 "What type(s) of solver information should be outputted\n"
547 "to the output stream.");
548 pl->set(
"Output Style",
static_cast<int>(outputStyle_default_),
549 "What style is used for the solver information outputted\n"
550 "to the output stream.");
551 pl->set(
"Output Frequency",
static_cast<int>(outputFreq_default_),
552 "How often convergence information should be outputted\n"
553 "to the output stream.");
554 pl->set(
"Deflation Quorum",
static_cast<int>(defQuorum_default_),
555 "The number of linear systems that need to converge before\n"
556 "they are deflated. This number should be <= block size.");
557 pl->set(
"Output Stream", Teuchos::rcpFromRef(std::cout),
558 "A reference-counted pointer to the output stream where all\n"
559 "solver output is sent.");
560 pl->set(
"Show Maximum Residual Norm Only",
static_cast<bool>(showMaxResNormOnly_default_),
561 "When convergence information is printed, only show the maximum\n"
562 "relative residual norm when the block size is greater than one.");
563 pl->set(
"Implicit Residual Scaling",
static_cast<const char *
>(resScale_default_),
564 "The type of scaling used in the residual convergence test.");
570 pl->set(
"Residual Scaling",
static_cast<const char *
>(resScale_default_),
571 "The type of scaling used in the residual convergence test. This "
572 "name is deprecated; the new name is \"Implicit Residual Scaling\".");
573 pl->set(
"Timer Label",
static_cast<const char *
>(label_default_),
574 "The string to use as a prefix for the timer labels.");
581template<
class ScalarType,
class MV,
class OP,
class DM>
590 setParameters (params_);
595 "Belos::BiCGStabSolMgr::solve: Linear problem is not ready. "
596 "You must call setProblem() on the LinearProblem before you may solve it.");
598 (problem_->isLeftPrec (), std::logic_error,
"Belos::BiCGStabSolMgr::solve: "
599 "The left-preconditioned case has not yet been implemented. Please use "
600 "right preconditioning for now. If you need to use left preconditioning, "
601 "please contact the Belos developers. Left preconditioning is more "
602 "interesting in BiCGStab because whether it works depends on the initial "
603 "guess (e.g., an initial guess of all zeros might NOT work).");
607 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
617 problem_->setLSIndex(
currIdx );
621 Teuchos::ParameterList
plist;
624 outputTest_->reset();
632 Teuchos::RCP<BiCGStabIter<ScalarType,MV,OP,DM> >
bicgstab_iter
637#ifdef BELOS_TEUCHOS_TIME_MONITOR
638 Teuchos::TimeMonitor
slvtimer(*timerSolve_);
652 outputTest_->resetNumCalls();
655 Teuchos::RCP<MV>
R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())),
currIdx );
674 if ( convTest_->getStatus() ==
Passed ) {
677 std::vector<int>
convIdx = Teuchos::rcp_dynamic_cast<StatusTestGenResNorm<ScalarType,MV,OP,DM> >(convTest_)->convIndices();
685 problem_->setCurrLS();
692 for (
unsigned int j=0;
j<
convIdx.size(); ++
j) {
710 std::vector<MagnitudeType>
norms;
725 else if ( maxIterTest_->getStatus() ==
Passed ) {
744 "Belos::BiCGStabSolMgr::solve(): Warning! Solver has experienced a breakdown!" << std::endl;
758 "Belos::BiCGStabSolMgr::solve(): Invalid return from BiCGStabIter::iterate().");
764 achievedTol_ = MT::one();
765 Teuchos::RCP<MV>
X = problem_->getLHS();
766 MVT::MvInit( *
X, SCT::zero() );
767 printer_->stream(
Warnings) <<
"Belos::BiCGStabSolMgr::solve(): Warning! NaN has been detected!"
771 catch (
const std::exception &
e) {
773 printer_->stream(
Errors) <<
"Error! Caught std::exception in BiCGStabIter::iterate() at iteration "
775 <<
e.what() << std::endl;
781 problem_->setCurrLS();
796 problem_->setLSIndex(
currIdx );
811#ifdef BELOS_TEUCHOS_TIME_MONITOR
816 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails) );
820 numIters_ = maxIterTest_->getNumIters();
825 const std::vector<MagnitudeType>*
pTestValues = convTest_->getTestValue();
836template<
class ScalarType,
class MV,
class OP,
class DM>
839 std::ostringstream
oss;
840 oss <<
"Belos::BiCGStabSolMgr<...,"<<Teuchos::ScalarTraits<ScalarType>::name()<<
">";
Belos concrete class for performing the pseudo-block BiCGStab iteration.
Belos header file which uses auto-configuration information to include necessary C++ headers.
Full specialization of Belos::DenseMatTraits for Kokkos::DualView with arbitrary scalarType....
Class which describes the linear problem to be solved by the iterative solver.
Class which manages the output and verbosity of the Belos solvers.
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.
Full specialization of Belos::DenseMatTraits for Teuchos::SerialDenseMatrix with ordinal type int and...
Collection of types and exceptions used within the Belos solvers.
Parent class to all Belos exceptions.
The Belos::BiCGStabSolMgr provides a powerful and fully-featured solver manager over the pseudo-block...
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP, DM > > &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.
Teuchos::RCP< SolverManager< ScalarType, MV, OP, DM > > clone() const override
clone for Inverted Injection (DII)
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve.
int getNumIters() const override
Get the iteration count for the most recent call to solve().
const LinearProblem< ScalarType, MV, OP, DM > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Set the parameters the solver manager should use to solve the linear problem.
ReturnType solve() override
This method performs possibly repeated calls to the underlying linear solver's iterate() routine unti...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
std::string description() const override
Method to return description of the block BiCGStab solver manager.
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
virtual ~BiCGStabSolMgr()
Destructor.
BiCGStabSolMgr()
Empty constructor for BiCGStabSolMgr. This constructor takes no arguments and sets the default values...
BiCGStabSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i....
BiCGStabSolMgrLinearProblemFailure(const std::string &what_arg)
Alternative run-time polymorphic interface for operators.
Operator()
Default constructor (does nothing).
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
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.