10 #ifndef BELOS_BICGSTAB_SOLMGR_HPP
11 #define BELOS_BICGSTAB_SOLMGR_HPP
29 #ifdef BELOS_TEUCHOS_TIME_MONITOR
64 template<
class ScalarType,
class MV,
class OP>
260 template<
class ScalarType,
class MV,
class OP>
262 outputStream_(Teuchos::rcpFromRef(std::cout)),
264 maxIters_(maxIters_default_),
266 verbosity_(verbosity_default_),
267 outputStyle_(outputStyle_default_),
268 outputFreq_(outputFreq_default_),
269 defQuorum_(defQuorum_default_),
270 showMaxResNormOnly_(showMaxResNormOnly_default_),
271 resScale_(resScale_default_),
272 label_(label_default_),
277 template<
class ScalarType,
class MV,
class OP>
282 outputStream_(Teuchos::rcpFromRef(std::cout)),
284 maxIters_(maxIters_default_),
286 verbosity_(verbosity_default_),
287 outputStyle_(outputStyle_default_),
288 outputFreq_(outputFreq_default_),
289 defQuorum_(defQuorum_default_),
290 showMaxResNormOnly_(showMaxResNormOnly_default_),
291 resScale_(resScale_default_),
292 label_(label_default_),
296 problem_.is_null (), std::invalid_argument,
297 "Belos::BiCGStabSolMgr two-argument constructor: "
298 "'problem' is null. You must supply a non-null Belos::LinearProblem "
299 "instance when calling this constructor.");
307 template<
class ScalarType,
class MV,
class OP>
311 using Teuchos::parameterList;
314 RCP<const ParameterList> defaultParams = getValidParameters();
317 if (params_.is_null()) {
318 params_ = parameterList (*defaultParams);
325 maxIters_ = params->
get(
"Maximum Iterations",maxIters_default_);
328 params_->set(
"Maximum Iterations", maxIters_);
330 maxIterTest_->setMaxIters( maxIters_ );
335 std::string tempLabel = params->
get(
"Timer Label", label_default_);
338 if (tempLabel != label_) {
340 params_->set(
"Timer Label", label_);
341 std::string solveLabel = label_ +
": BiCGStabSolMgr total solve time";
342 #ifdef BELOS_TEUCHOS_TIME_MONITOR
350 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
351 verbosity_ = params->
get(
"Verbosity", verbosity_default_);
353 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
357 params_->set(
"Verbosity", verbosity_);
359 printer_->setVerbosity(verbosity_);
364 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
365 outputStyle_ = params->
get(
"Output Style", outputStyle_default_);
367 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
371 params_->set(
"Output Style", outputStyle_);
377 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
380 params_->set(
"Output Stream", outputStream_);
382 printer_->setOStream( outputStream_ );
388 outputFreq_ = params->
get(
"Output Frequency", outputFreq_default_);
392 params_->set(
"Output Frequency", outputFreq_);
394 outputTest_->setOutputFrequency( outputFreq_ );
407 if (params->
isParameter(
"Convergence Tolerance")) {
409 convtol_ = params->
get (
"Convergence Tolerance",
417 params_->set(
"Convergence Tolerance", convtol_);
419 convTest_->setTolerance( convtol_ );
422 if (params->
isParameter(
"Show Maximum Residual Norm Only")) {
423 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
426 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
428 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
432 bool newResTest =
false;
437 std::string tempResScale = resScale_;
438 bool implicitResidualScalingName =
false;
440 tempResScale = params->
get<std::string> (
"Residual Scaling");
442 else if (params->
isParameter (
"Implicit Residual Scaling")) {
443 tempResScale = params->
get<std::string> (
"Implicit Residual Scaling");
444 implicitResidualScalingName =
true;
448 if (resScale_ != tempResScale) {
450 resScale_ = tempResScale;
454 if (implicitResidualScalingName) {
455 params_->set (
"Implicit Residual Scaling", resScale_);
458 params_->set (
"Residual Scaling", resScale_);
461 if (! convTest_.is_null()) {
465 catch (std::exception& e) {
475 defQuorum_ = params->
get(
"Deflation Quorum", defQuorum_);
476 params_->set(
"Deflation Quorum", defQuorum_);
478 convTest_->setQuorum( defQuorum_ );
489 convTest_ =
Teuchos::rcp(
new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
494 sTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
504 std::string solverDesc =
" Pseudo Block BiCGStab ";
505 outputTest_->setSolverDesc( solverDesc );
511 std::string solveLabel = label_ +
": BiCGStabSolMgr total solve time";
512 #ifdef BELOS_TEUCHOS_TIME_MONITOR
522 template<
class ScalarType,
class MV,
class OP>
527 using Teuchos::parameterList;
530 if (validParams_.is_null()) {
532 RCP<ParameterList> pl = parameterList ();
537 "The relative residual tolerance that needs to be achieved by the\n"
538 "iterative solver in order for the linera system to be declared converged.");
539 pl->set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
540 "The maximum number of block iterations allowed for each\n"
541 "set of RHS solved.");
542 pl->set(
"Verbosity", static_cast<int>(verbosity_default_),
543 "What type(s) of solver information should be outputted\n"
544 "to the output stream.");
545 pl->set(
"Output Style", static_cast<int>(outputStyle_default_),
546 "What style is used for the solver information outputted\n"
547 "to the output stream.");
548 pl->set(
"Output Frequency", static_cast<int>(outputFreq_default_),
549 "How often convergence information should be outputted\n"
550 "to the output stream.");
551 pl->set(
"Deflation Quorum", static_cast<int>(defQuorum_default_),
552 "The number of linear systems that need to converge before\n"
553 "they are deflated. This number should be <= block size.");
554 pl->set(
"Output Stream", Teuchos::rcpFromRef(std::cout),
555 "A reference-counted pointer to the output stream where all\n"
556 "solver output is sent.");
557 pl->set(
"Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
558 "When convergence information is printed, only show the maximum\n"
559 "relative residual norm when the block size is greater than one.");
560 pl->set(
"Implicit Residual Scaling", static_cast<const char *>(resScale_default_),
561 "The type of scaling used in the residual convergence test.");
567 pl->set(
"Residual Scaling", static_cast<const char *>(resScale_default_),
568 "The type of scaling used in the residual convergence test. This "
569 "name is deprecated; the new name is \"Implicit Residual Scaling\".");
570 pl->set(
"Timer Label", static_cast<const char *>(label_default_),
571 "The string to use as a prefix for the timer labels.");
578 template<
class ScalarType,
class MV,
class OP>
585 setParameters (params_);
590 "Belos::BiCGStabSolMgr::solve: Linear problem is not ready. "
591 "You must call setProblem() on the LinearProblem before you may solve it.");
593 (problem_->isLeftPrec (), std::logic_error,
"Belos::BiCGStabSolMgr::solve: "
594 "The left-preconditioned case has not yet been implemented. Please use "
595 "right preconditioning for now. If you need to use left preconditioning, "
596 "please contact the Belos developers. Left preconditioning is more "
597 "interesting in BiCGStab because whether it works depends on the initial "
598 "guess (e.g., an initial guess of all zeros might NOT work).");
602 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
603 int numCurrRHS = numRHS2Solve;
605 std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
606 for (
int i=0; i<numRHS2Solve; ++i) {
607 currIdx[i] = startPtr+i;
612 problem_->setLSIndex( currIdx );
619 outputTest_->reset();
622 bool isConverged =
true;
632 #ifdef BELOS_TEUCHOS_TIME_MONITOR
637 while ( numRHS2Solve > 0 ) {
639 std::vector<int> convRHSIdx;
640 std::vector<int> currRHSIdx( currIdx );
641 currRHSIdx.resize(numCurrRHS);
644 bicgstab_iter->resetNumIters();
647 outputTest_->resetNumCalls();
650 Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
655 bicgstab_iter->initializeBiCGStab(newState);
662 bicgstab_iter->iterate();
669 if ( convTest_->getStatus() ==
Passed ) {
676 if (convIdx.size() == currRHSIdx.size())
680 problem_->setCurrLS();
684 std::vector<int> unconvIdx(currRHSIdx.size());
685 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
687 for (
unsigned int j=0; j<convIdx.size(); ++j) {
688 if (currRHSIdx[i] == convIdx[j]) {
694 currIdx2[have] = currIdx2[i];
695 currRHSIdx[have++] = currRHSIdx[i];
698 currRHSIdx.resize(have);
699 currIdx2.resize(have);
702 problem_->setLSIndex( currRHSIdx );
705 std::vector<MagnitudeType> norms;
706 R_0 = MVT::CloneCopy( *(bicgstab_iter->getNativeResiduals(&norms)),currIdx2 );
707 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
712 bicgstab_iter->initializeBiCGStab(defstate);
720 else if ( maxIterTest_->getStatus() ==
Passed ) {
733 else if ( bicgstab_iter->breakdownDetected() ) {
737 "Belos::BiCGStabSolMgr::solve(): Warning! Solver has experienced a breakdown!" << std::endl;
750 "Belos::BiCGStabSolMgr::solve(): Invalid return from BiCGStabIter::iterate().");
755 achievedTol_ = MT::one();
757 MVT::MvInit( *X, SCT::zero() );
758 printer_->stream(
Warnings) <<
"Belos::BiCGStabSolMgr::solve(): Warning! NaN has been detected!"
762 catch (
const std::exception &e) {
763 printer_->stream(
Errors) <<
"Error! Caught std::exception in BiCGStabIter::iterate() at iteration "
764 << bicgstab_iter->getNumIters() << std::endl
765 << e.what() << std::endl;
771 problem_->setCurrLS();
774 startPtr += numCurrRHS;
775 numRHS2Solve -= numCurrRHS;
777 if ( numRHS2Solve > 0 ) {
779 numCurrRHS = numRHS2Solve;
780 currIdx.resize( numCurrRHS );
781 currIdx2.resize( numCurrRHS );
782 for (
int i=0; i<numCurrRHS; ++i)
783 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
786 problem_->setLSIndex( currIdx );
789 currIdx.resize( numRHS2Solve );
801 #ifdef BELOS_TEUCHOS_TIME_MONITOR
810 numIters_ = maxIterTest_->getNumIters();
815 const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
816 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
826 template<
class ScalarType,
class MV,
class OP>
829 std::ostringstream oss;
const LinearProblem< ScalarType, MV, OP > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
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.
Belos's basic output manager for sending information of select verbosity levels to the appropriate ou...
This class implements the pseudo-block BiCGStab iteration, where the basic BiCGStab algorithm is perf...
Teuchos::ScalarTraits< ScalarType >::magnitudeType MagnitudeType
Teuchos::RCP< const Teuchos::ParameterList > validParams_
List of valid parameters and their default values.
Class which manages the output and verbosity of the Belos solvers.
Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > problem_
Teuchos::ScalarTraits< MagnitudeType > MT
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Set the parameters the solver manager should use to solve the linear problem.
Teuchos::RCP< const MV > R
The current residual.
ScaleType
The type of scaling to use on the residual norm value.
T & get(ParameterList &l, const std::string &name)
OperatorTraits< ScalarType, MV, OP > OPT
bool is_null(const std::shared_ptr< T > &p)
Teuchos::RCP< StatusTest< ScalarType, MV, OP > > sTest_
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
A factory class for generating StatusTestOutput objects.
static constexpr bool showMaxResNormOnly_default_
Structure to contain pointers to BiCGStabIteration state variables.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
An implementation of StatusTestResNorm using a family of residual norms.
static constexpr int maxIters_default_
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.
static const double convTol
Default convergence tolerance.
static constexpr int outputFreq_default_
Belos::StatusTest class for specifying a maximum number of iterations.
static std::string name()
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
A factory class for generating StatusTestOutput objects.
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
BiCGStabSolMgrLinearProblemFailure(const std::string &what_arg)
bool isParameter(const std::string &name) const
Teuchos::RCP< StatusTestOutput< ScalarType, MV, OP > > outputTest_
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)
BiCGStabSolMgr()
Empty constructor for BiCGStabSolMgr. This constructor takes no arguments and sets the default values...
Teuchos::RCP< StatusTestGenResNorm< ScalarType, MV, OP > > convTest_
Teuchos::RCP< StatusTestMaxIters< ScalarType, MV, OP > > maxIterTest_
virtual ~BiCGStabSolMgr()
Destructor.
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
Teuchos::RCP< std::ostream > outputStream_
BiCGStabSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i...
ReturnType solve() override
This method performs possibly repeated calls to the underlying linear solver's iterate() routine unti...
ReturnType
Whether the Belos solve converged for all linear systems.
MultiVecTraits< ScalarType, MV > MVT
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
static constexpr const char * resScale_default_
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
Teuchos::RCP< Teuchos::Time > timerSolve_
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
static constexpr int defQuorum_default_
The Belos::BiCGStabSolMgr provides a powerful and fully-featured solver manager over the pseudo-block...
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.
std::string description() const override
Method to return description of the block BiCGStab solver manager.
static constexpr int verbosity_default_
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Teuchos::ScalarTraits< ScalarType > SCT
static constexpr int outputStyle_default_
bool isType(const std::string &name) const
Teuchos::RCP< OutputManager< ScalarType > > printer_
A class for extending the status testing capabilities of Belos via logical combinations.
Class which defines basic traits for the operator type.
Parent class to all Belos exceptions.
int getNumIters() const override
Get the iteration count for the most recent call to solve().
Default parameters common to most Belos solvers.
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve...
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
Belos header file which uses auto-configuration information to include necessary C++ headers...
static constexpr const char * label_default_
Teuchos::RCP< Teuchos::ParameterList > params_
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
MagnitudeType achievedTol_
Belos concrete class for performing the pseudo-block BiCGStab iteration.