42 #ifndef BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_SOLMGR_HPP
43 #define BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_SOLMGR_HPP
62 #ifdef BELOS_TEUCHOS_TIME_MONITOR
100 template<
class ScalarType,
class MV,
class OP>
164 return Teuchos::tuple(timerSolve_);
260 static constexpr
int maxIters_default_ = 1000;
261 static constexpr
bool assertPositiveDefiniteness_default_ =
true;
262 static constexpr
bool showMaxResNormOnly_default_ =
false;
265 static constexpr
int outputFreq_default_ = -1;
266 static constexpr
int defQuorum_default_ = 1;
267 static constexpr
const char * resScale_default_ =
"Norm of Initial Residual";
268 static constexpr
const char * label_default_ =
"Belos";
269 static constexpr std::ostream * outputStream_default_ = &std::cout;
272 MagnitudeType convtol_;
273 int maxIters_, numIters_;
274 int verbosity_, outputStyle_, outputFreq_, defQuorum_;
275 bool assertPositiveDefiniteness_, showMaxResNormOnly_;
276 std::string resScale_;
292 template<
class ScalarType,
class MV,
class OP>
294 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
296 maxIters_(maxIters_default_),
298 verbosity_(verbosity_default_),
299 outputStyle_(outputStyle_default_),
300 outputFreq_(outputFreq_default_),
301 defQuorum_(defQuorum_default_),
302 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
303 showMaxResNormOnly_(showMaxResNormOnly_default_),
304 resScale_(resScale_default_),
305 label_(label_default_),
310 template<
class ScalarType,
class MV,
class OP>
315 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
317 maxIters_(maxIters_default_),
319 verbosity_(verbosity_default_),
320 outputStyle_(outputStyle_default_),
321 outputFreq_(outputFreq_default_),
322 defQuorum_(defQuorum_default_),
323 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
324 showMaxResNormOnly_(showMaxResNormOnly_default_),
325 resScale_(resScale_default_),
326 label_(label_default_),
330 problem_.is_null (), std::invalid_argument,
331 "Belos::PseudoBlockStochasticCGSolMgr two-argument constructor: "
332 "'problem' is null. You must supply a non-null Belos::LinearProblem "
333 "instance when calling this constructor.");
341 template<
class ScalarType,
class MV,
class OP>
345 using Teuchos::parameterList;
348 RCP<const ParameterList> defaultParams = getValidParameters();
351 if (params_.is_null()) {
352 params_ = parameterList (*defaultParams);
359 maxIters_ = params->
get(
"Maximum Iterations",maxIters_default_);
362 params_->set(
"Maximum Iterations", maxIters_);
363 if (maxIterTest_!=Teuchos::null)
364 maxIterTest_->setMaxIters( maxIters_ );
368 if (params->
isParameter(
"Assert Positive Definiteness")) {
369 assertPositiveDefiniteness_ = params->
get(
"Assert Positive Definiteness",assertPositiveDefiniteness_default_);
372 params_->set(
"Assert Positive Definiteness", assertPositiveDefiniteness_);
377 std::string tempLabel = params->
get(
"Timer Label", label_default_);
380 if (tempLabel != label_) {
382 params_->set(
"Timer Label", label_);
383 std::string solveLabel = label_ +
": PseudoBlockStochasticCGSolMgr total solve time";
384 #ifdef BELOS_TEUCHOS_TIME_MONITOR
392 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
393 verbosity_ = params->
get(
"Verbosity", verbosity_default_);
395 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
399 params_->set(
"Verbosity", verbosity_);
400 if (printer_ != Teuchos::null)
401 printer_->setVerbosity(verbosity_);
406 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
407 outputStyle_ = params->
get(
"Output Style", outputStyle_default_);
409 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
413 params_->set(
"Output Style", outputStyle_);
414 outputTest_ = Teuchos::null;
419 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
422 params_->set(
"Output Stream", outputStream_);
423 if (printer_ != Teuchos::null)
424 printer_->setOStream( outputStream_ );
430 outputFreq_ = params->
get(
"Output Frequency", outputFreq_default_);
434 params_->set(
"Output Frequency", outputFreq_);
435 if (outputTest_ != Teuchos::null)
436 outputTest_->setOutputFrequency( outputFreq_ );
440 if (printer_ == Teuchos::null) {
449 if (params->
isParameter(
"Convergence Tolerance")) {
450 if (params->
isType<MagnitudeType> (
"Convergence Tolerance")) {
451 convtol_ = params->
get (
"Convergence Tolerance",
459 params_->set(
"Convergence Tolerance", convtol_);
460 if (convTest_ != Teuchos::null)
461 convTest_->setTolerance( convtol_ );
464 if (params->
isParameter(
"Show Maximum Residual Norm Only")) {
465 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
468 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
469 if (convTest_ != Teuchos::null)
470 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
474 bool newResTest =
false;
479 std::string tempResScale = resScale_;
480 bool implicitResidualScalingName =
false;
482 tempResScale = params->
get<std::string> (
"Residual Scaling");
484 else if (params->
isParameter (
"Implicit Residual Scaling")) {
485 tempResScale = params->
get<std::string> (
"Implicit Residual Scaling");
486 implicitResidualScalingName =
true;
490 if (resScale_ != tempResScale) {
492 resScale_ = tempResScale;
496 if (implicitResidualScalingName) {
497 params_->set (
"Implicit Residual Scaling", resScale_);
500 params_->set (
"Residual Scaling", resScale_);
503 if (! convTest_.is_null()) {
507 catch (std::exception& e) {
517 defQuorum_ = params->
get(
"Deflation Quorum", defQuorum_);
518 params_->set(
"Deflation Quorum", defQuorum_);
519 if (convTest_ != Teuchos::null)
520 convTest_->setQuorum( defQuorum_ );
526 if (maxIterTest_ == Teuchos::null)
530 if (convTest_ == Teuchos::null || newResTest) {
531 convTest_ =
Teuchos::rcp(
new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
535 if (sTest_ == Teuchos::null || newResTest)
536 sTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
538 if (outputTest_ == Teuchos::null || newResTest) {
546 std::string solverDesc =
" Pseudo Block CG ";
547 outputTest_->setSolverDesc( solverDesc );
552 if (timerSolve_ == Teuchos::null) {
553 std::string solveLabel = label_ +
": PseudoBlockStochasticCGSolMgr total solve time";
554 #ifdef BELOS_TEUCHOS_TIME_MONITOR
564 template<
class ScalarType,
class MV,
class OP>
569 using Teuchos::parameterList;
572 if (validParams_.is_null()) {
577 RCP<ParameterList> pl = parameterList ();
579 "The relative residual tolerance that needs to be achieved by the\n"
580 "iterative solver in order for the linera system to be declared converged.");
581 pl->set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
582 "The maximum number of block iterations allowed for each\n"
583 "set of RHS solved.");
584 pl->set(
"Assert Positive Definiteness", static_cast<bool>(assertPositiveDefiniteness_default_),
585 "Whether or not to assert that the linear operator\n"
586 "and the preconditioner are indeed positive definite.");
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", resScale_default_,
606 "The type of scaling used in the residual convergence test.");
612 pl->set(
"Residual Scaling", 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.");
624 template<
class ScalarType,
class MV,
class OP>
630 if (!isSet_) { setParameters( params_ ); }
635 "Belos::PseudoBlockStochasticCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
639 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
640 int numCurrRHS = numRHS2Solve;
642 std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
643 for (
int i=0; i<numRHS2Solve; ++i) {
644 currIdx[i] = startPtr+i;
649 problem_->setLSIndex( currIdx );
655 plist.
set(
"Assert Positive Definiteness",assertPositiveDefiniteness_);
658 outputTest_->reset();
661 bool isConverged =
true;
671 #ifdef BELOS_TEUCHOS_TIME_MONITOR
675 while ( numRHS2Solve > 0 ) {
678 std::vector<int> convRHSIdx;
679 std::vector<int> currRHSIdx( currIdx );
680 currRHSIdx.resize(numCurrRHS);
683 block_cg_iter->resetNumIters();
686 outputTest_->resetNumCalls();
689 Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
694 block_cg_iter->initializeCG(newState);
700 block_cg_iter->iterate();
707 if ( convTest_->getStatus() ==
Passed ) {
714 if (convIdx.size() == currRHSIdx.size())
718 problem_->setCurrLS();
722 std::vector<int> unconvIdx(currRHSIdx.size());
723 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
725 for (
unsigned int j=0; j<convIdx.size(); ++j) {
726 if (currRHSIdx[i] == convIdx[j]) {
732 currIdx2[have] = currIdx2[i];
733 currRHSIdx[have++] = currRHSIdx[i];
736 currRHSIdx.resize(have);
737 currIdx2.resize(have);
740 problem_->setLSIndex( currRHSIdx );
743 std::vector<MagnitudeType> norms;
744 R_0 = MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
745 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
750 block_cg_iter->initializeCG(defstate);
758 else if ( maxIterTest_->getStatus() ==
Passed ) {
773 "Belos::PseudoBlockStochasticCGSolMgr::solve(): Invalid return from PseudoBlockStochasticCGIter::iterate().");
776 catch (
const std::exception &e) {
777 printer_->stream(
Errors) <<
"Error! Caught std::exception in PseudoBlockStochasticCGIter::iterate() at iteration "
778 << block_cg_iter->getNumIters() << std::endl
779 << e.what() << std::endl;
785 problem_->setCurrLS();
788 startPtr += numCurrRHS;
789 numRHS2Solve -= numCurrRHS;
791 if ( numRHS2Solve > 0 ) {
793 numCurrRHS = numRHS2Solve;
794 currIdx.resize( numCurrRHS );
795 currIdx2.resize( numCurrRHS );
796 for (
int i=0; i<numCurrRHS; ++i)
797 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
800 problem_->setLSIndex( currIdx );
803 currIdx.resize( numRHS2Solve );
811 Y_=block_cg_iter->getStochasticVector();
818 #ifdef BELOS_TEUCHOS_TIME_MONITOR
827 numIters_ = maxIterTest_->getNumIters();
836 template<
class ScalarType,
class MV,
class OP>
839 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.
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current 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.
ScaleType
The type of scaling to use on the residual norm value.
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)
PseudoBlockStochasticCGSolMgrOrthoFailure is thrown when the orthogonalization manager is unable to g...
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
A factory class for generating StatusTestOutput objects.
int getNumIters() const override
Get the iteration count for the most recent call to solve().
std::string description() const override
Method to return description of the block CG solver manager.
An implementation of StatusTestResNorm using a family of residual norms.
static const double convTol
Default convergence tolerance.
Belos::StatusTest class for specifying a maximum number of iterations.
static std::string name()
A factory class for generating StatusTestOutput objects.
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.
const LinearProblem< ScalarType, MV, OP > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
bool isParameter(const std::string &name) const
A Belos::StatusTest class for specifying a maximum number of iterations.
Belos concrete class for performing the stochastic pseudo-block CG iteration.
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. ...
PseudoBlockStochasticCGSolMgrOrthoFailure(const std::string &what_arg)
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)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Set the parameters the solver manager should use to solve the linear problem.
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
Teuchos::RCP< const MV > R
The current residual.
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 ...
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
virtual ~PseudoBlockStochasticCGSolMgr()
Destructor.
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
PseudoBlockStochasticCGSolMgr()
Empty constructor for BlockStochasticCGSolMgr. This constructor takes no arguments and sets the defau...
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.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
ReturnType solve() override
This method performs possibly repeated calls to the underlying linear solver's iterate() routine unti...
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
This class implements the stochastic pseudo-block CG iteration, where the basic stochastic CG algorit...
The Belos::PseudoBlockStochasticCGSolMgr provides a powerful and fully-featured solver manager over t...
bool isType(const std::string &name) const
Teuchos::RCP< MV > getStochasticVector()
Get a copy of the final stochastic vector.
A class for extending the status testing capabilities of Belos via logical combinations.
PseudoBlockStochasticCGSolMgrLinearProblemFailure(const std::string &what_arg)
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
Class which defines basic traits for the operator type.
Parent class to all Belos exceptions.
Default parameters common to most Belos solvers.
Belos header file which uses auto-configuration information to include necessary C++ headers...
PseudoBlockStochasticCGSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i...
Structure to contain pointers to CGIteration state variables.