42 #ifndef BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_SOLMGR_HPP 43 #define BELOS_PSEUDO_BLOCK_STOCHASTIC_CG_SOLMGR_HPP 61 #include "Teuchos_BLAS.hpp" 62 #ifdef BELOS_TEUCHOS_TIME_MONITOR 63 #include "Teuchos_TimeMonitor.hpp" 100 template<
class ScalarType,
class MV,
class OP>
106 typedef Teuchos::ScalarTraits<ScalarType> SCT;
107 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
108 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
132 const Teuchos::RCP<Teuchos::ParameterList> &pl );
147 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters()
const;
158 Teuchos::Array<Teuchos::RCP<Teuchos::Time> >
getTimers()
const {
159 return Teuchos::tuple(timerSolve_);
181 void setParameters(
const Teuchos::RCP<Teuchos::ParameterList> ¶ms );
225 std::string description()
const;
232 Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > problem_;
235 Teuchos::RCP<OutputManager<ScalarType> > printer_;
236 Teuchos::RCP<std::ostream> outputStream_;
239 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > sTest_;
240 Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP> > maxIterTest_;
241 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> > convTest_;
242 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP> > outputTest_;
245 Teuchos::RCP<Teuchos::ParameterList> params_;
252 mutable Teuchos::RCP<const Teuchos::ParameterList> validParams_;
255 static const MagnitudeType convtol_default_;
256 static const int maxIters_default_;
257 static const bool assertPositiveDefiniteness_default_;
258 static const bool showMaxResNormOnly_default_;
259 static const int verbosity_default_;
260 static const int outputStyle_default_;
261 static const int outputFreq_default_;
262 static const int defQuorum_default_;
263 static const std::string resScale_default_;
264 static const std::string label_default_;
265 static const Teuchos::RCP<std::ostream> outputStream_default_;
268 MagnitudeType convtol_;
269 int maxIters_, numIters_;
270 int verbosity_, outputStyle_, outputFreq_, defQuorum_;
271 bool assertPositiveDefiniteness_, showMaxResNormOnly_;
272 std::string resScale_;
276 Teuchos::RCP<Teuchos::Time> timerSolve_;
288 template<
class ScalarType,
class MV,
class OP>
291 template<
class ScalarType,
class MV,
class OP>
294 template<
class ScalarType,
class MV,
class OP>
297 template<
class ScalarType,
class MV,
class OP>
300 template<
class ScalarType,
class MV,
class OP>
303 template<
class ScalarType,
class MV,
class OP>
306 template<
class ScalarType,
class MV,
class OP>
309 template<
class ScalarType,
class MV,
class OP>
312 template<
class ScalarType,
class MV,
class OP>
315 template<
class ScalarType,
class MV,
class OP>
318 template<
class ScalarType,
class MV,
class OP>
323 template<
class ScalarType,
class MV,
class OP>
325 outputStream_(outputStream_default_),
326 convtol_(convtol_default_),
327 maxIters_(maxIters_default_),
329 verbosity_(verbosity_default_),
330 outputStyle_(outputStyle_default_),
331 outputFreq_(outputFreq_default_),
332 defQuorum_(defQuorum_default_),
333 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
334 showMaxResNormOnly_(showMaxResNormOnly_default_),
335 resScale_(resScale_default_),
336 label_(label_default_),
341 template<
class ScalarType,
class MV,
class OP>
344 const Teuchos::RCP<Teuchos::ParameterList> &pl ) :
346 outputStream_(outputStream_default_),
347 convtol_(convtol_default_),
348 maxIters_(maxIters_default_),
350 verbosity_(verbosity_default_),
351 outputStyle_(outputStyle_default_),
352 outputFreq_(outputFreq_default_),
353 defQuorum_(defQuorum_default_),
354 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
355 showMaxResNormOnly_(showMaxResNormOnly_default_),
356 resScale_(resScale_default_),
357 label_(label_default_),
360 TEUCHOS_TEST_FOR_EXCEPTION(
361 problem_.is_null (), std::invalid_argument,
362 "Belos::PseudoBlockStochasticCGSolMgr two-argument constructor: " 363 "'problem' is null. You must supply a non-null Belos::LinearProblem " 364 "instance when calling this constructor.");
366 if (! pl.is_null ()) {
372 template<
class ScalarType,
class MV,
class OP>
375 using Teuchos::ParameterList;
376 using Teuchos::parameterList;
382 if (params_.is_null()) {
383 params_ = parameterList (*defaultParams);
385 params->validateParameters (*defaultParams);
389 if (params->isParameter(
"Maximum Iterations")) {
390 maxIters_ = params->get(
"Maximum Iterations",maxIters_default_);
393 params_->set(
"Maximum Iterations", maxIters_);
394 if (maxIterTest_!=Teuchos::null)
395 maxIterTest_->setMaxIters( maxIters_ );
399 if (params->isParameter(
"Assert Positive Definiteness")) {
400 assertPositiveDefiniteness_ = params->get(
"Assert Positive Definiteness",assertPositiveDefiniteness_default_);
403 params_->set(
"Assert Positive Definiteness", assertPositiveDefiniteness_);
407 if (params->isParameter(
"Timer Label")) {
408 std::string tempLabel = params->get(
"Timer Label", label_default_);
411 if (tempLabel != label_) {
413 params_->set(
"Timer Label", label_);
414 std::string solveLabel = label_ +
": PseudoBlockStochasticCGSolMgr total solve time";
415 #ifdef BELOS_TEUCHOS_TIME_MONITOR 416 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
422 if (params->isParameter(
"Verbosity")) {
423 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
424 verbosity_ = params->get(
"Verbosity", verbosity_default_);
426 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
430 params_->set(
"Verbosity", verbosity_);
431 if (printer_ != Teuchos::null)
432 printer_->setVerbosity(verbosity_);
436 if (params->isParameter(
"Output Style")) {
437 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
438 outputStyle_ = params->get(
"Output Style", outputStyle_default_);
440 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
444 params_->set(
"Output Style", outputStyle_);
445 outputTest_ = Teuchos::null;
449 if (params->isParameter(
"Output Stream")) {
450 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
453 params_->set(
"Output Stream", outputStream_);
454 if (printer_ != Teuchos::null)
455 printer_->setOStream( outputStream_ );
460 if (params->isParameter(
"Output Frequency")) {
461 outputFreq_ = params->get(
"Output Frequency", outputFreq_default_);
465 params_->set(
"Output Frequency", outputFreq_);
466 if (outputTest_ != Teuchos::null)
467 outputTest_->setOutputFrequency( outputFreq_ );
471 if (printer_ == Teuchos::null) {
480 if (params->isParameter(
"Convergence Tolerance")) {
481 convtol_ = params->get(
"Convergence Tolerance",convtol_default_);
484 params_->set(
"Convergence Tolerance", convtol_);
485 if (convTest_ != Teuchos::null)
486 convTest_->setTolerance( convtol_ );
489 if (params->isParameter(
"Show Maximum Residual Norm Only")) {
490 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
493 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
494 if (convTest_ != Teuchos::null)
495 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
499 bool newResTest =
false;
504 std::string tempResScale = resScale_;
505 bool implicitResidualScalingName =
false;
506 if (params->isParameter (
"Residual Scaling")) {
507 tempResScale = params->get<std::string> (
"Residual Scaling");
509 else if (params->isParameter (
"Implicit Residual Scaling")) {
510 tempResScale = params->get<std::string> (
"Implicit Residual Scaling");
511 implicitResidualScalingName =
true;
515 if (resScale_ != tempResScale) {
517 resScale_ = tempResScale;
521 if (implicitResidualScalingName) {
522 params_->set (
"Implicit Residual Scaling", resScale_);
525 params_->set (
"Residual Scaling", resScale_);
528 if (! convTest_.is_null()) {
532 catch (std::exception& e) {
541 if (params->isParameter(
"Deflation Quorum")) {
542 defQuorum_ = params->get(
"Deflation Quorum", defQuorum_);
543 params_->set(
"Deflation Quorum", defQuorum_);
544 if (convTest_ != Teuchos::null)
545 convTest_->setQuorum( defQuorum_ );
551 if (maxIterTest_ == Teuchos::null)
555 if (convTest_ == Teuchos::null || newResTest) {
556 convTest_ = Teuchos::rcp(
new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
560 if (sTest_ == Teuchos::null || newResTest)
561 sTest_ = Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
563 if (outputTest_ == Teuchos::null || newResTest) {
571 std::string solverDesc =
" Pseudo Block CG ";
572 outputTest_->setSolverDesc( solverDesc );
577 if (timerSolve_ == Teuchos::null) {
578 std::string solveLabel = label_ +
": PseudoBlockStochasticCGSolMgr total solve time";
579 #ifdef BELOS_TEUCHOS_TIME_MONITOR 580 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
589 template<
class ScalarType,
class MV,
class OP>
590 Teuchos::RCP<const Teuchos::ParameterList>
593 using Teuchos::ParameterList;
594 using Teuchos::parameterList;
597 if (validParams_.is_null()) {
599 RCP<ParameterList> pl = parameterList ();
600 pl->set(
"Convergence Tolerance", convtol_default_,
601 "The relative residual tolerance that needs to be achieved by the\n" 602 "iterative solver in order for the linera system to be declared converged.");
603 pl->set(
"Maximum Iterations", maxIters_default_,
604 "The maximum number of block iterations allowed for each\n" 605 "set of RHS solved.");
606 pl->set(
"Assert Positive Definiteness", assertPositiveDefiniteness_default_,
607 "Whether or not to assert that the linear operator\n" 608 "and the preconditioner are indeed positive definite.");
609 pl->set(
"Verbosity", verbosity_default_,
610 "What type(s) of solver information should be outputted\n" 611 "to the output stream.");
612 pl->set(
"Output Style", outputStyle_default_,
613 "What style is used for the solver information outputted\n" 614 "to the output stream.");
615 pl->set(
"Output Frequency", outputFreq_default_,
616 "How often convergence information should be outputted\n" 617 "to the output stream.");
618 pl->set(
"Deflation Quorum", defQuorum_default_,
619 "The number of linear systems that need to converge before\n" 620 "they are deflated. This number should be <= block size.");
621 pl->set(
"Output Stream", outputStream_default_,
622 "A reference-counted pointer to the output stream where all\n" 623 "solver output is sent.");
624 pl->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_default_,
625 "When convergence information is printed, only show the maximum\n" 626 "relative residual norm when the block size is greater than one.");
627 pl->set(
"Implicit Residual Scaling", resScale_default_,
628 "The type of scaling used in the residual convergence test.");
634 pl->set(
"Residual Scaling", resScale_default_,
635 "The type of scaling used in the residual convergence test. This " 636 "name is deprecated; the new name is \"Implicit Residual Scaling\".");
637 pl->set(
"Timer Label", label_default_,
638 "The string to use as a prefix for the timer labels.");
646 template<
class ScalarType,
class MV,
class OP>
654 Teuchos::BLAS<int,ScalarType> blas;
657 "Belos::PseudoBlockStochasticCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
662 int numCurrRHS = numRHS2Solve;
664 std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
665 for (
int i=0; i<numRHS2Solve; ++i) {
666 currIdx[i] = startPtr+i;
671 problem_->setLSIndex( currIdx );
675 Teuchos::ParameterList plist;
677 plist.set(
"Assert Positive Definiteness",assertPositiveDefiniteness_);
680 outputTest_->reset();
683 bool isConverged =
true;
688 Teuchos::RCP<PseudoBlockStochasticCGIter<ScalarType,MV,OP> > block_cg_iter
693 #ifdef BELOS_TEUCHOS_TIME_MONITOR 694 Teuchos::TimeMonitor slvtimer(*timerSolve_);
697 while ( numRHS2Solve > 0 ) {
700 std::vector<int> convRHSIdx;
701 std::vector<int> currRHSIdx( currIdx );
702 currRHSIdx.resize(numCurrRHS);
705 block_cg_iter->resetNumIters();
708 outputTest_->resetNumCalls();
711 Teuchos::RCP<MV> R_0 =
MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
716 block_cg_iter->initializeCG(newState);
722 block_cg_iter->iterate();
729 if ( convTest_->getStatus() ==
Passed ) {
736 if (convIdx.size() == currRHSIdx.size())
740 problem_->setCurrLS();
744 std::vector<int> unconvIdx(currRHSIdx.size());
745 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
747 for (
unsigned int j=0; j<convIdx.size(); ++j) {
748 if (currRHSIdx[i] == convIdx[j]) {
754 currIdx2[have] = currIdx2[i];
755 currRHSIdx[have++] = currRHSIdx[i];
758 currRHSIdx.resize(have);
759 currIdx2.resize(have);
762 problem_->setLSIndex( currRHSIdx );
765 std::vector<MagnitudeType> norms;
766 R_0 =
MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
767 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
772 block_cg_iter->initializeCG(defstate);
780 else if ( maxIterTest_->getStatus() ==
Passed ) {
794 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
795 "Belos::PseudoBlockStochasticCGSolMgr::solve(): Invalid return from PseudoBlockStochasticCGIter::iterate().");
798 catch (
const std::exception &e) {
799 printer_->stream(
Errors) <<
"Error! Caught std::exception in PseudoBlockStochasticCGIter::iterate() at iteration " 800 << block_cg_iter->getNumIters() << std::endl
801 << e.what() << std::endl;
807 problem_->setCurrLS();
810 startPtr += numCurrRHS;
811 numRHS2Solve -= numCurrRHS;
813 if ( numRHS2Solve > 0 ) {
815 numCurrRHS = numRHS2Solve;
816 currIdx.resize( numCurrRHS );
817 currIdx2.resize( numCurrRHS );
818 for (
int i=0; i<numCurrRHS; ++i)
819 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
822 problem_->setLSIndex( currIdx );
825 currIdx.resize( numRHS2Solve );
833 Y_=block_cg_iter->getStochasticVector();
840 #ifdef BELOS_TEUCHOS_TIME_MONITOR 845 Teuchos::TimeMonitor::summarize( printer_->stream(TimingDetails) );
849 numIters_ = maxIterTest_->getNumIters();
858 template<
class ScalarType,
class MV,
class OP>
861 std::ostringstream oss;
862 oss <<
"Belos::PseudoBlockStochasticCGSolMgr<...,"<<Teuchos::ScalarTraits<ScalarType>::name()<<
">";
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...
Class which manages the output and verbosity of the Belos solvers.
std::string description() const
Method to return description of the block CG solver manager.
ScaleType
The type of scaling to use on the residual norm value.
PseudoBlockStochasticCGSolMgrOrthoFailure is thrown when the orthogonalization manager is unable to g...
A factory class for generating StatusTestOutput objects.
An implementation of StatusTestResNorm using a family of residual norms.
bool isLOADetected() const
Return whether a loss of accuracy was detected by this solver during the most current solve...
Belos::StatusTest class for specifying a maximum number of iterations.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Get a parameter list containing the valid parameters for this object.
static int GetNumberVecs(const MV &mv)
Obtain the number of vectors in mv.
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const
Get a parameter list containing the current parameters for this object.
A factory class for generating StatusTestOutput objects.
const LinearProblem< ScalarType, MV, OP > & getProblem() const
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.
void reset(const ResetType type)
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
A Belos::StatusTest class for specifying a maximum number of iterations.
Belos concrete class for performing the stochastic pseudo-block CG iteration.
static Teuchos::RCP< MV > CloneViewNonConst(MV &mv, const std::vector< int > &index)
Creates a new MV that shares the selected contents of mv (shallow copy).
ResetType
How to reset the solver.
Pure virtual base class which describes the basic interface for a solver manager. ...
PseudoBlockStochasticCGSolMgrOrthoFailure(const std::string &what_arg)
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Set the parameters the solver manager should use to solve the linear problem.
int getNumIters() const
Get the iteration count for the most recent call to solve().
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.
static Teuchos::RCP< MV > CloneCopy(const MV &mv)
Creates a new MV and copies contents of mv into the new vector (deep copy).
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 ...
virtual ~PseudoBlockStochasticCGSolMgr()
Destructor.
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.
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...
Teuchos::RCP< MV > getStochasticVector()
Get a copy of the final stochastic vector.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem)
Set the linear problem that needs to be solved.
A class for extending the status testing capabilities of Belos via logical combinations.
PseudoBlockStochasticCGSolMgrLinearProblemFailure(const std::string &what_arg)
ReturnType solve()
This method performs possibly repeated calls to the underlying linear solver's iterate() routine unti...
Class which defines basic traits for the operator type.
Parent class to all Belos exceptions.
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.