42 #ifndef BELOS_BICGSTAB_SOLMGR_HPP
43 #define BELOS_BICGSTAB_SOLMGR_HPP
63 #ifdef BELOS_TEUCHOS_TIME_MONITOR
108 template<
class ScalarType,
class MV,
class OP>
172 return Teuchos::tuple(timerSolve_);
279 static constexpr
int maxIters_default_ = 1000;
280 static constexpr
bool showMaxResNormOnly_default_ =
false;
283 static constexpr
int outputFreq_default_ = -1;
284 static constexpr
int defQuorum_default_ = 1;
285 static constexpr
const char * resScale_default_ =
"Norm of Initial Residual";
286 static constexpr
const char * label_default_ =
"Belos";
287 static constexpr std::ostream * outputStream_default_ = &std::cout;
290 MagnitudeType convtol_,achievedTol_;
291 int maxIters_, numIters_;
292 int verbosity_, outputStyle_, outputFreq_, defQuorum_;
293 bool showMaxResNormOnly_;
294 std::string resScale_;
305 template<
class ScalarType,
class MV,
class OP>
307 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
309 maxIters_(maxIters_default_),
311 verbosity_(verbosity_default_),
312 outputStyle_(outputStyle_default_),
313 outputFreq_(outputFreq_default_),
314 defQuorum_(defQuorum_default_),
315 showMaxResNormOnly_(showMaxResNormOnly_default_),
316 resScale_(resScale_default_),
317 label_(label_default_),
322 template<
class ScalarType,
class MV,
class OP>
327 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
329 maxIters_(maxIters_default_),
331 verbosity_(verbosity_default_),
332 outputStyle_(outputStyle_default_),
333 outputFreq_(outputFreq_default_),
334 defQuorum_(defQuorum_default_),
335 showMaxResNormOnly_(showMaxResNormOnly_default_),
336 resScale_(resScale_default_),
337 label_(label_default_),
341 problem_.is_null (), std::invalid_argument,
342 "Belos::BiCGStabSolMgr two-argument constructor: "
343 "'problem' is null. You must supply a non-null Belos::LinearProblem "
344 "instance when calling this constructor.");
352 template<
class ScalarType,
class MV,
class OP>
356 using Teuchos::parameterList;
359 RCP<const ParameterList> defaultParams = getValidParameters();
362 if (params_.is_null()) {
363 params_ = parameterList (*defaultParams);
370 maxIters_ = params->
get(
"Maximum Iterations",maxIters_default_);
373 params_->set(
"Maximum Iterations", maxIters_);
374 if (maxIterTest_!=Teuchos::null)
375 maxIterTest_->setMaxIters( maxIters_ );
380 std::string tempLabel = params->
get(
"Timer Label", label_default_);
383 if (tempLabel != label_) {
385 params_->set(
"Timer Label", label_);
386 std::string solveLabel = label_ +
": BiCGStabSolMgr total solve time";
387 #ifdef BELOS_TEUCHOS_TIME_MONITOR
395 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
396 verbosity_ = params->
get(
"Verbosity", verbosity_default_);
398 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
402 params_->set(
"Verbosity", verbosity_);
403 if (printer_ != Teuchos::null)
404 printer_->setVerbosity(verbosity_);
409 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
410 outputStyle_ = params->
get(
"Output Style", outputStyle_default_);
412 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
416 params_->set(
"Output Style", outputStyle_);
417 outputTest_ = Teuchos::null;
422 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
425 params_->set(
"Output Stream", outputStream_);
426 if (printer_ != Teuchos::null)
427 printer_->setOStream( outputStream_ );
433 outputFreq_ = params->
get(
"Output Frequency", outputFreq_default_);
437 params_->set(
"Output Frequency", outputFreq_);
438 if (outputTest_ != Teuchos::null)
439 outputTest_->setOutputFrequency( outputFreq_ );
443 if (printer_ == Teuchos::null) {
452 if (params->
isParameter(
"Convergence Tolerance")) {
453 if (params->
isType<MagnitudeType> (
"Convergence Tolerance")) {
454 convtol_ = params->
get (
"Convergence Tolerance",
462 params_->set(
"Convergence Tolerance", convtol_);
463 if (convTest_ != Teuchos::null)
464 convTest_->setTolerance( convtol_ );
467 if (params->
isParameter(
"Show Maximum Residual Norm Only")) {
468 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
471 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
472 if (convTest_ != Teuchos::null)
473 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
477 bool newResTest =
false;
482 std::string tempResScale = resScale_;
483 bool implicitResidualScalingName =
false;
485 tempResScale = params->
get<std::string> (
"Residual Scaling");
487 else if (params->
isParameter (
"Implicit Residual Scaling")) {
488 tempResScale = params->
get<std::string> (
"Implicit Residual Scaling");
489 implicitResidualScalingName =
true;
493 if (resScale_ != tempResScale) {
495 resScale_ = tempResScale;
499 if (implicitResidualScalingName) {
500 params_->set (
"Implicit Residual Scaling", resScale_);
503 params_->set (
"Residual Scaling", resScale_);
506 if (! convTest_.is_null()) {
510 catch (std::exception& e) {
520 defQuorum_ = params->
get(
"Deflation Quorum", defQuorum_);
521 params_->set(
"Deflation Quorum", defQuorum_);
522 if (convTest_ != Teuchos::null)
523 convTest_->setQuorum( defQuorum_ );
529 if (maxIterTest_ == Teuchos::null)
533 if (convTest_ == Teuchos::null || newResTest) {
534 convTest_ =
Teuchos::rcp(
new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
538 if (sTest_ == Teuchos::null || newResTest)
539 sTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
541 if (outputTest_ == Teuchos::null || newResTest) {
549 std::string solverDesc =
" Pseudo Block BiCGStab ";
550 outputTest_->setSolverDesc( solverDesc );
555 if (timerSolve_ == Teuchos::null) {
556 std::string solveLabel = label_ +
": BiCGStabSolMgr total solve time";
557 #ifdef BELOS_TEUCHOS_TIME_MONITOR
567 template<
class ScalarType,
class MV,
class OP>
572 using Teuchos::parameterList;
575 if (validParams_.is_null()) {
577 RCP<ParameterList> pl = parameterList ();
582 "The relative residual tolerance that needs to be achieved by the\n"
583 "iterative solver in order for the linera system to be declared converged.");
584 pl->set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
585 "The maximum number of block iterations allowed for each\n"
586 "set of RHS solved.");
587 pl->set(
"Verbosity", static_cast<int>(verbosity_default_),
588 "What type(s) of solver information should be outputted\n"
589 "to the output stream.");
590 pl->set(
"Output Style", static_cast<int>(outputStyle_default_),
591 "What style is used for the solver information outputted\n"
592 "to the output stream.");
593 pl->set(
"Output Frequency", static_cast<int>(outputFreq_default_),
594 "How often convergence information should be outputted\n"
595 "to the output stream.");
596 pl->set(
"Deflation Quorum", static_cast<int>(defQuorum_default_),
597 "The number of linear systems that need to converge before\n"
598 "they are deflated. This number should be <= block size.");
599 pl->set(
"Output Stream",
Teuchos::rcp(outputStream_default_,
false),
600 "A reference-counted pointer to the output stream where all\n"
601 "solver output is sent.");
602 pl->set(
"Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
603 "When convergence information is printed, only show the maximum\n"
604 "relative residual norm when the block size is greater than one.");
605 pl->set(
"Implicit Residual Scaling", static_cast<const char *>(resScale_default_),
606 "The type of scaling used in the residual convergence test.");
612 pl->set(
"Residual Scaling", static_cast<const char *>(resScale_default_),
613 "The type of scaling used in the residual convergence test. This "
614 "name is deprecated; the new name is \"Implicit Residual Scaling\".");
615 pl->set(
"Timer Label", static_cast<const char *>(label_default_),
616 "The string to use as a prefix for the timer labels.");
623 template<
class ScalarType,
class MV,
class OP>
630 setParameters (params_);
637 "Belos::BiCGStabSolMgr::solve: Linear problem is not ready. "
638 "You must call setProblem() on the LinearProblem before you may solve it.");
640 (problem_->isLeftPrec (), std::logic_error,
"Belos::BiCGStabSolMgr::solve: "
641 "The left-preconditioned case has not yet been implemented. Please use "
642 "right preconditioning for now. If you need to use left preconditioning, "
643 "please contact the Belos developers. Left preconditioning is more "
644 "interesting in BiCGStab because whether it works depends on the initial "
645 "guess (e.g., an initial guess of all zeros might NOT work).");
649 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
650 int numCurrRHS = numRHS2Solve;
652 std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
653 for (
int i=0; i<numRHS2Solve; ++i) {
654 currIdx[i] = startPtr+i;
659 problem_->setLSIndex( currIdx );
666 outputTest_->reset();
669 bool isConverged =
true;
679 #ifdef BELOS_TEUCHOS_TIME_MONITOR
684 while ( numRHS2Solve > 0 ) {
686 std::vector<int> convRHSIdx;
687 std::vector<int> currRHSIdx( currIdx );
688 currRHSIdx.resize(numCurrRHS);
691 block_cg_iter->resetNumIters();
694 outputTest_->resetNumCalls();
697 Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
702 block_cg_iter->initializeBiCGStab(newState);
709 block_cg_iter->iterate();
716 if ( convTest_->getStatus() ==
Passed ) {
723 if (convIdx.size() == currRHSIdx.size())
727 problem_->setCurrLS();
731 std::vector<int> unconvIdx(currRHSIdx.size());
732 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
734 for (
unsigned int j=0; j<convIdx.size(); ++j) {
735 if (currRHSIdx[i] == convIdx[j]) {
741 currIdx2[have] = currIdx2[i];
742 currRHSIdx[have++] = currRHSIdx[i];
745 currRHSIdx.resize(have);
746 currIdx2.resize(have);
749 problem_->setLSIndex( currRHSIdx );
752 std::vector<MagnitudeType> norms;
753 R_0 = MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
754 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
759 block_cg_iter->initializeBiCGStab(defstate);
767 else if ( maxIterTest_->getStatus() ==
Passed ) {
782 "Belos::BiCGStabSolMgr::solve(): Invalid return from BiCGStabIter::iterate().");
785 catch (
const std::exception &e) {
786 printer_->stream(
Errors) <<
"Error! Caught std::exception in BiCGStabIter::iterate() at iteration "
787 << block_cg_iter->getNumIters() << std::endl
788 << e.what() << std::endl;
794 problem_->setCurrLS();
797 startPtr += numCurrRHS;
798 numRHS2Solve -= numCurrRHS;
800 if ( numRHS2Solve > 0 ) {
802 numCurrRHS = numRHS2Solve;
803 currIdx.resize( numCurrRHS );
804 currIdx2.resize( numCurrRHS );
805 for (
int i=0; i<numCurrRHS; ++i)
806 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
809 problem_->setLSIndex( currIdx );
812 currIdx.resize( numRHS2Solve );
824 #ifdef BELOS_TEUCHOS_TIME_MONITOR
833 numIters_ = maxIterTest_->getNumIters();
838 const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
839 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
849 template<
class ScalarType,
class MV,
class OP>
852 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.
BiCGStabSolMgrOrthoFailure is thrown when the orthogonalization manager is unable to generate orthono...
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...
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.
Teuchos::RCP< const MV > R
The current residual.
ScaleType
The type of scaling to use on the residual norm value.
T & get(const std::string &name, T def_value)
bool is_null(const std::shared_ptr< T > &p)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
A factory class for generating StatusTestOutput objects.
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.
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.
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
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)
BiCGStabSolMgr()
Empty constructor for BiCGStabSolMgr. This constructor takes no arguments and sets the default values...
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.
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.
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
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.
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.
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...
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
BiCGStabSolMgrOrthoFailure(const std::string &what_arg)
Belos concrete class for performing the pseudo-block BiCGStab iteration.