10 #ifndef BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_SOLMGR_HPP
11 #define BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_SOLMGR_HPP
29 #ifdef BELOS_TEUCHOS_TIME_MONITOR
57 template<
class ScalarType,
class MV,
class OP>
121 return Teuchos::tuple(timerSolve_);
217 static constexpr
int maxIters_default_ = 1000;
218 static constexpr
bool assertPositiveDefiniteness_default_ =
true;
219 static constexpr
bool showMaxResNormOnly_default_ =
false;
222 static constexpr
int outputFreq_default_ = -1;
223 static constexpr
int defQuorum_default_ = 1;
224 static constexpr
const char * resScale_default_ =
"Norm of Initial Residual";
225 static constexpr
const char * label_default_ =
"Belos";
228 MagnitudeType convtol_;
229 int maxIters_, numIters_;
230 int verbosity_, outputStyle_, outputFreq_, defQuorum_;
231 bool assertPositiveDefiniteness_, showMaxResNormOnly_;
232 std::string resScale_;
248 template<
class ScalarType,
class MV,
class OP>
250 outputStream_(Teuchos::rcpFromRef(std::cout)),
252 maxIters_(maxIters_default_),
254 verbosity_(verbosity_default_),
255 outputStyle_(outputStyle_default_),
256 outputFreq_(outputFreq_default_),
257 defQuorum_(defQuorum_default_),
258 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
259 showMaxResNormOnly_(showMaxResNormOnly_default_),
260 resScale_(resScale_default_),
261 label_(label_default_),
266 template<
class ScalarType,
class MV,
class OP>
271 outputStream_(Teuchos::rcpFromRef(std::cout)),
273 maxIters_(maxIters_default_),
275 verbosity_(verbosity_default_),
276 outputStyle_(outputStyle_default_),
277 outputFreq_(outputFreq_default_),
278 defQuorum_(defQuorum_default_),
279 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
280 showMaxResNormOnly_(showMaxResNormOnly_default_),
281 resScale_(resScale_default_),
282 label_(label_default_),
286 problem_.is_null (), std::invalid_argument,
287 "Belos::PseudoBlockStochasticCGSolMgr two-argument constructor: "
288 "'problem' is null. You must supply a non-null Belos::LinearProblem "
289 "instance when calling this constructor.");
297 template<
class ScalarType,
class MV,
class OP>
301 using Teuchos::parameterList;
304 RCP<const ParameterList> defaultParams = getValidParameters();
307 if (params_.is_null()) {
308 params_ = parameterList (*defaultParams);
315 maxIters_ = params->
get(
"Maximum Iterations",maxIters_default_);
318 params_->set(
"Maximum Iterations", maxIters_);
319 if (maxIterTest_!=Teuchos::null)
320 maxIterTest_->setMaxIters( maxIters_ );
324 if (params->
isParameter(
"Assert Positive Definiteness")) {
325 assertPositiveDefiniteness_ = params->
get(
"Assert Positive Definiteness",assertPositiveDefiniteness_default_);
328 params_->set(
"Assert Positive Definiteness", assertPositiveDefiniteness_);
333 std::string tempLabel = params->
get(
"Timer Label", label_default_);
336 if (tempLabel != label_) {
338 params_->set(
"Timer Label", label_);
339 std::string solveLabel = label_ +
": PseudoBlockStochasticCGSolMgr total solve time";
340 #ifdef BELOS_TEUCHOS_TIME_MONITOR
348 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
349 verbosity_ = params->
get(
"Verbosity", verbosity_default_);
351 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
355 params_->set(
"Verbosity", verbosity_);
356 if (printer_ != Teuchos::null)
357 printer_->setVerbosity(verbosity_);
362 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
363 outputStyle_ = params->
get(
"Output Style", outputStyle_default_);
365 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
369 params_->set(
"Output Style", outputStyle_);
370 outputTest_ = Teuchos::null;
375 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
378 params_->set(
"Output Stream", outputStream_);
379 if (printer_ != Teuchos::null)
380 printer_->setOStream( outputStream_ );
386 outputFreq_ = params->
get(
"Output Frequency", outputFreq_default_);
390 params_->set(
"Output Frequency", outputFreq_);
391 if (outputTest_ != Teuchos::null)
392 outputTest_->setOutputFrequency( outputFreq_ );
396 if (printer_ == Teuchos::null) {
405 if (params->
isParameter(
"Convergence Tolerance")) {
406 if (params->
isType<MagnitudeType> (
"Convergence Tolerance")) {
407 convtol_ = params->
get (
"Convergence Tolerance",
415 params_->set(
"Convergence Tolerance", convtol_);
416 if (convTest_ != Teuchos::null)
417 convTest_->setTolerance( convtol_ );
420 if (params->
isParameter(
"Show Maximum Residual Norm Only")) {
421 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
424 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
425 if (convTest_ != Teuchos::null)
426 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
430 bool newResTest =
false;
435 std::string tempResScale = resScale_;
436 bool implicitResidualScalingName =
false;
438 tempResScale = params->
get<std::string> (
"Residual Scaling");
440 else if (params->
isParameter (
"Implicit Residual Scaling")) {
441 tempResScale = params->
get<std::string> (
"Implicit Residual Scaling");
442 implicitResidualScalingName =
true;
446 if (resScale_ != tempResScale) {
448 resScale_ = tempResScale;
452 if (implicitResidualScalingName) {
453 params_->set (
"Implicit Residual Scaling", resScale_);
456 params_->set (
"Residual Scaling", resScale_);
459 if (! convTest_.is_null()) {
463 catch (std::exception& e) {
473 defQuorum_ = params->
get(
"Deflation Quorum", defQuorum_);
474 params_->set(
"Deflation Quorum", defQuorum_);
475 if (convTest_ != Teuchos::null)
476 convTest_->setQuorum( defQuorum_ );
482 if (maxIterTest_ == Teuchos::null)
486 if (convTest_ == Teuchos::null || newResTest) {
487 convTest_ =
Teuchos::rcp(
new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
491 if (sTest_ == Teuchos::null || newResTest)
492 sTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
494 if (outputTest_ == Teuchos::null || newResTest) {
502 std::string solverDesc =
" Pseudo Block CG ";
503 outputTest_->setSolverDesc( solverDesc );
508 if (timerSolve_ == Teuchos::null) {
509 std::string solveLabel = label_ +
": PseudoBlockStochasticCGSolMgr total solve time";
510 #ifdef BELOS_TEUCHOS_TIME_MONITOR
520 template<
class ScalarType,
class MV,
class OP>
525 using Teuchos::parameterList;
528 if (validParams_.is_null()) {
533 RCP<ParameterList> pl = parameterList ();
535 "The relative residual tolerance that needs to be achieved by the\n"
536 "iterative solver in order for the linera system to be declared converged.");
537 pl->set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
538 "The maximum number of block iterations allowed for each\n"
539 "set of RHS solved.");
540 pl->set(
"Assert Positive Definiteness", static_cast<bool>(assertPositiveDefiniteness_default_),
541 "Whether or not to assert that the linear operator\n"
542 "and the preconditioner are indeed positive definite.");
543 pl->set(
"Verbosity", static_cast<int>(verbosity_default_),
544 "What type(s) of solver information should be outputted\n"
545 "to the output stream.");
546 pl->set(
"Output Style", static_cast<int>(outputStyle_default_),
547 "What style is used for the solver information outputted\n"
548 "to the output stream.");
549 pl->set(
"Output Frequency", static_cast<int>(outputFreq_default_),
550 "How often convergence information should be outputted\n"
551 "to the output stream.");
552 pl->set(
"Deflation Quorum", static_cast<int>(defQuorum_default_),
553 "The number of linear systems that need to converge before\n"
554 "they are deflated. This number should be <= block size.");
555 pl->set(
"Output Stream", Teuchos::rcpFromRef(std::cout),
556 "A reference-counted pointer to the output stream where all\n"
557 "solver output is sent.");
558 pl->set(
"Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
559 "When convergence information is printed, only show the maximum\n"
560 "relative residual norm when the block size is greater than one.");
561 pl->set(
"Implicit Residual Scaling", resScale_default_,
562 "The type of scaling used in the residual convergence test.");
568 pl->set(
"Residual Scaling", resScale_default_,
569 "The type of scaling used in the residual convergence test. This "
570 "name is deprecated; the new name is \"Implicit Residual Scaling\".");
571 pl->set(
"Timer Label", static_cast<const char *>(label_default_),
572 "The string to use as a prefix for the timer labels.");
580 template<
class ScalarType,
class MV,
class OP>
586 if (!isSet_) { setParameters( params_ ); }
589 "Belos::PseudoBlockStochasticCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
593 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
594 int numCurrRHS = numRHS2Solve;
596 std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
597 for (
int i=0; i<numRHS2Solve; ++i) {
598 currIdx[i] = startPtr+i;
603 problem_->setLSIndex( currIdx );
609 plist.
set(
"Assert Positive Definiteness",assertPositiveDefiniteness_);
612 outputTest_->reset();
615 bool isConverged =
true;
625 #ifdef BELOS_TEUCHOS_TIME_MONITOR
629 while ( numRHS2Solve > 0 ) {
632 std::vector<int> convRHSIdx;
633 std::vector<int> currRHSIdx( currIdx );
634 currRHSIdx.resize(numCurrRHS);
637 block_cg_iter->resetNumIters();
640 outputTest_->resetNumCalls();
643 Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
648 block_cg_iter->initializeCG(newState);
654 block_cg_iter->iterate();
661 if ( convTest_->getStatus() ==
Passed ) {
668 if (convIdx.size() == currRHSIdx.size())
672 problem_->setCurrLS();
676 std::vector<int> unconvIdx(currRHSIdx.size());
677 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
679 for (
unsigned int j=0; j<convIdx.size(); ++j) {
680 if (currRHSIdx[i] == convIdx[j]) {
686 currIdx2[have] = currIdx2[i];
687 currRHSIdx[have++] = currRHSIdx[i];
690 currRHSIdx.resize(have);
691 currIdx2.resize(have);
694 problem_->setLSIndex( currRHSIdx );
697 std::vector<MagnitudeType> norms;
698 R_0 = MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
699 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
704 block_cg_iter->initializeCG(defstate);
712 else if ( maxIterTest_->getStatus() ==
Passed ) {
727 "Belos::PseudoBlockStochasticCGSolMgr::solve(): Invalid return from PseudoBlockStochasticCGIter::iterate().");
730 catch (
const std::exception &e) {
731 printer_->stream(
Errors) <<
"Error! Caught std::exception in PseudoBlockStochasticCGIter::iterate() at iteration "
732 << block_cg_iter->getNumIters() << std::endl
733 << e.what() << std::endl;
739 problem_->setCurrLS();
742 startPtr += numCurrRHS;
743 numRHS2Solve -= numCurrRHS;
745 if ( numRHS2Solve > 0 ) {
747 numCurrRHS = numRHS2Solve;
748 currIdx.resize( numCurrRHS );
749 currIdx2.resize( numCurrRHS );
750 for (
int i=0; i<numCurrRHS; ++i)
751 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
754 problem_->setLSIndex( currIdx );
757 currIdx.resize( numRHS2Solve );
765 Y_=block_cg_iter->getStochasticVector();
772 #ifdef BELOS_TEUCHOS_TIME_MONITOR
781 numIters_ = maxIterTest_->getNumIters();
790 template<
class ScalarType,
class MV,
class OP>
793 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)
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.
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.
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
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. ...
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.