42 #ifndef BELOS_PSEUDO_BLOCK_CG_SOLMGR_HPP 
   43 #define BELOS_PSEUDO_BLOCK_CG_SOLMGR_HPP 
   65 #ifdef BELOS_TEUCHOS_TIME_MONITOR 
  113   template<
class ScalarType, 
class MV, 
class OP,
 
  114            const bool supportsScalarType =
 
  118                                                 Belos::Details::LapackSupportsScalar<ScalarType>::value>
 
  120     static const bool scalarTypeIsSupported =
 
  140   template<
class ScalarType, 
class MV, 
class OP>
 
  211       return Teuchos::tuple(timerSolve_);
 
  298     std::string description() 
const override;
 
  305                                      ScalarType & lambda_min,
 
  306                                      ScalarType & lambda_max,
 
  307                                      ScalarType & ConditionNumber );
 
  333     static constexpr 
int maxIters_default_ = 1000;
 
  334     static constexpr 
bool assertPositiveDefiniteness_default_ = 
true;
 
  335     static constexpr 
bool showMaxResNormOnly_default_ = 
false;
 
  338     static constexpr 
int outputFreq_default_ = -1;
 
  339     static constexpr 
int defQuorum_default_ = 1;
 
  340     static constexpr 
const char * resScale_default_ = 
"Norm of Initial Residual";
 
  341     static constexpr 
const char * label_default_ = 
"Belos";
 
  342     static constexpr std::ostream * outputStream_default_ = &std::cout;
 
  343     static constexpr 
bool genCondEst_default_ = 
false;
 
  346     MagnitudeType convtol_,achievedTol_;
 
  347     int maxIters_, numIters_;
 
  348     int verbosity_, outputStyle_, outputFreq_, defQuorum_;
 
  349     bool assertPositiveDefiniteness_, showMaxResNormOnly_;
 
  350     std::string resScale_;
 
  352     ScalarType condEstimate_;
 
  364 template<
class ScalarType, 
class MV, 
class OP>
 
  366   outputStream_(Teuchos::
rcp(outputStream_default_,false)),
 
  368   maxIters_(maxIters_default_),
 
  370   verbosity_(verbosity_default_),
 
  371   outputStyle_(outputStyle_default_),
 
  372   outputFreq_(outputFreq_default_),
 
  373   defQuorum_(defQuorum_default_),
 
  374   assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
 
  375   showMaxResNormOnly_(showMaxResNormOnly_default_),
 
  376   resScale_(resScale_default_),
 
  377   genCondEst_(genCondEst_default_),
 
  378   condEstimate_(-Teuchos::ScalarTraits<ScalarType>::one()),
 
  379   label_(label_default_),
 
  384 template<
class ScalarType, 
class MV, 
class OP>
 
  389   outputStream_(Teuchos::
rcp(outputStream_default_,false)),
 
  391   maxIters_(maxIters_default_),
 
  393   verbosity_(verbosity_default_),
 
  394   outputStyle_(outputStyle_default_),
 
  395   outputFreq_(outputFreq_default_),
 
  396   defQuorum_(defQuorum_default_),
 
  397   assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
 
  398   showMaxResNormOnly_(showMaxResNormOnly_default_),
 
  399   resScale_(resScale_default_),
 
  400   genCondEst_(genCondEst_default_),
 
  401   condEstimate_(-Teuchos::ScalarTraits<ScalarType>::one()),
 
  402   label_(label_default_),
 
  406     problem_.is_null (), std::invalid_argument,
 
  407     "Belos::PseudoBlockCGSolMgr two-argument constructor: " 
  408     "'problem' is null.  You must supply a non-null Belos::LinearProblem " 
  409     "instance when calling this constructor.");
 
  417 template<
class ScalarType, 
class MV, 
class OP>
 
  423   using Teuchos::parameterList;
 
  427   RCP<const ParameterList> defaultParams = this->getValidParameters ();
 
  446   if (params_.is_null ()) {
 
  448     params_ = parameterList (defaultParams->name ());
 
  455     maxIters_ = params->
get (
"Maximum Iterations", maxIters_default_);
 
  458     params_->set (
"Maximum Iterations", maxIters_);
 
  459     if (! maxIterTest_.is_null ()) {
 
  460       maxIterTest_->setMaxIters (maxIters_);
 
  465   if (params->
isParameter (
"Assert Positive Definiteness")) {
 
  466     assertPositiveDefiniteness_ =
 
  467       params->
get (
"Assert Positive Definiteness",
 
  468                    assertPositiveDefiniteness_default_);
 
  471     params_->set (
"Assert Positive Definiteness", assertPositiveDefiniteness_);
 
  476     const std::string tempLabel = params->
get (
"Timer Label", label_default_);
 
  479     if (tempLabel != label_) {
 
  481       params_->set (
"Timer Label", label_);
 
  482       const std::string solveLabel =
 
  483         label_ + 
": PseudoBlockCGSolMgr total solve time";
 
  484 #ifdef BELOS_TEUCHOS_TIME_MONITOR 
  492     if (Teuchos::isParameterType<int> (*params, 
"Verbosity")) {
 
  493       verbosity_ = params->
get (
"Verbosity", verbosity_default_);
 
  495       verbosity_ = (int) Teuchos::getParameter<Belos::MsgType> (*params, 
"Verbosity");
 
  499     params_->set (
"Verbosity", verbosity_);
 
  500     if (! printer_.is_null ()) {
 
  501       printer_->setVerbosity (verbosity_);
 
  507     if (Teuchos::isParameterType<int> (*params, 
"Output Style")) {
 
  508       outputStyle_ = params->
get (
"Output Style", outputStyle_default_);
 
  511       outputStyle_ = (int) Teuchos::getParameter<Belos::OutputType> (*params, 
"Output Style");
 
  516     params_->set (
"Output Style", outputStyle_);
 
  517     outputTest_ = Teuchos::null;
 
  522     outputStream_ = params->
get<RCP<std::ostream> > (
"Output Stream");
 
  525     params_->set (
"Output Stream", outputStream_);
 
  526     if (! printer_.is_null ()) {
 
  527       printer_->setOStream (outputStream_);
 
  534       outputFreq_ = params->
get (
"Output Frequency", outputFreq_default_);
 
  538     params_->set (
"Output Frequency", outputFreq_);
 
  539     if (! outputTest_.is_null ()) {
 
  540       outputTest_->setOutputFrequency (outputFreq_);
 
  545   if (params->
isParameter (
"Estimate Condition Number")) {
 
  546     genCondEst_ = params->
get (
"Estimate Condition Number", genCondEst_default_);
 
  550   if (printer_.is_null ()) {
 
  559   if (params->
isParameter (
"Convergence Tolerance")) {
 
  560     if (params->
isType<MagnitudeType> (
"Convergence Tolerance")) {
 
  561       convtol_ = params->
get (
"Convergence Tolerance",
 
  569     params_->set (
"Convergence Tolerance", convtol_);
 
  570     if (! convTest_.is_null ()) {
 
  571       convTest_->setTolerance (convtol_);
 
  575   if (params->
isParameter (
"Show Maximum Residual Norm Only")) {
 
  576     showMaxResNormOnly_ = params->
get<
bool> (
"Show Maximum Residual Norm Only");
 
  579     params_->set (
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
 
  580     if (! convTest_.is_null ()) {
 
  581       convTest_->setShowMaxResNormOnly (showMaxResNormOnly_);
 
  586   bool newResTest = 
false;
 
  591     std::string tempResScale = resScale_;
 
  592     bool implicitResidualScalingName = 
false;
 
  594       tempResScale = params->
get<std::string> (
"Residual Scaling");
 
  596     else if (params->
isParameter (
"Implicit Residual Scaling")) {
 
  597       tempResScale = params->
get<std::string> (
"Implicit Residual Scaling");
 
  598       implicitResidualScalingName = 
true;
 
  602     if (resScale_ != tempResScale) {
 
  605       resScale_ = tempResScale;
 
  609       if (implicitResidualScalingName) {
 
  610         params_->set (
"Implicit Residual Scaling", resScale_);
 
  613         params_->set (
"Residual Scaling", resScale_);
 
  616       if (! convTest_.is_null ()) {
 
  620         catch (std::exception& e) {
 
  630     defQuorum_ = params->
get (
"Deflation Quorum", defQuorum_);
 
  631     params_->set (
"Deflation Quorum", defQuorum_);
 
  632     if (! convTest_.is_null ()) {
 
  633       convTest_->setQuorum( defQuorum_ );
 
  640   if (maxIterTest_.is_null ()) {
 
  645   if (convTest_.is_null () || newResTest) {
 
  646     convTest_ = 
rcp (
new StatusTestResNorm_t (convtol_, defQuorum_, showMaxResNormOnly_));
 
  650   if (sTest_.is_null () || newResTest) {
 
  651     sTest_ = 
rcp (
new StatusTestCombo_t (StatusTestCombo_t::OR, maxIterTest_, convTest_));
 
  654   if (outputTest_.is_null () || newResTest) {
 
  658     outputTest_ = stoFactory.
create (printer_, sTest_, outputFreq_,
 
  662     const std::string solverDesc = 
" Pseudo Block CG ";
 
  663     outputTest_->setSolverDesc (solverDesc);
 
  667   if (timerSolve_.is_null ()) {
 
  668     const std::string solveLabel =
 
  669       label_ + 
": PseudoBlockCGSolMgr total solve time";
 
  670 #ifdef BELOS_TEUCHOS_TIME_MONITOR 
  680 template<
class ScalarType, 
class MV, 
class OP>
 
  685   using Teuchos::parameterList;
 
  688   if (validParams_.is_null()) {
 
  690     RCP<ParameterList> pl = parameterList ();
 
  692       "The relative residual tolerance that needs to be achieved by the\n" 
  693       "iterative solver in order for the linear system to be declared converged.");
 
  694     pl->set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
 
  695       "The maximum number of block iterations allowed for each\n" 
  696       "set of RHS solved.");
 
  697     pl->set(
"Assert Positive Definiteness", static_cast<bool>(assertPositiveDefiniteness_default_),
 
  698       "Whether or not to assert that the linear operator\n" 
  699       "and the preconditioner are indeed positive definite.");
 
  700     pl->set(
"Verbosity", static_cast<int>(verbosity_default_),
 
  701       "What type(s) of solver information should be outputted\n" 
  702       "to the output stream.");
 
  703     pl->set(
"Output Style", static_cast<int>(outputStyle_default_),
 
  704       "What style is used for the solver information outputted\n" 
  705       "to the output stream.");
 
  706     pl->set(
"Output Frequency", static_cast<int>(outputFreq_default_),
 
  707       "How often convergence information should be outputted\n" 
  708       "to the output stream.");
 
  709     pl->set(
"Deflation Quorum", static_cast<int>(defQuorum_default_),
 
  710       "The number of linear systems that need to converge before\n" 
  711       "they are deflated.  This number should be <= block size.");
 
  712     pl->set(
"Output Stream", 
Teuchos::rcp(outputStream_default_,
false),
 
  713       "A reference-counted pointer to the output stream where all\n" 
  714       "solver output is sent.");
 
  715     pl->set(
"Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
 
  716       "When convergence information is printed, only show the maximum\n" 
  717       "relative residual norm when the block size is greater than one.");
 
  718     pl->set(
"Implicit Residual Scaling", resScale_default_,
 
  719       "The type of scaling used in the residual convergence test.");
 
  720     pl->set(
"Estimate Condition Number", static_cast<bool>(genCondEst_default_),
 
  721       "Whether or not to estimate the condition number of the preconditioned system.");
 
  727     pl->set(
"Residual Scaling", resScale_default_,
 
  728             "The type of scaling used in the residual convergence test.  This " 
  729             "name is deprecated; the new name is \"Implicit Residual Scaling\".");
 
  730     pl->set(
"Timer Label", static_cast<const char *>(label_default_),
 
  731       "The string to use as a prefix for the timer labels.");
 
  739 template<
class ScalarType, 
class MV, 
class OP>
 
  742   const char prefix[] = 
"Belos::PseudoBlockCGSolMgr::solve: ";
 
  747   if (!isSet_) { setParameters( params_ ); }
 
  751      prefix << 
"The linear problem to solve is not ready.  You must call " 
  752      "setProblem() on the Belos::LinearProblem instance before telling the " 
  753      "Belos solver to solve it.");
 
  757   int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
 
  758   int numCurrRHS = numRHS2Solve;
 
  760   std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
 
  761   for (
int i=0; i<numRHS2Solve; ++i) {
 
  762     currIdx[i] = startPtr+i;
 
  767   problem_->setLSIndex( currIdx );
 
  773   plist.
set(
"Assert Positive Definiteness",assertPositiveDefiniteness_);
 
  774   if(genCondEst_) plist.
set(
"Max Size For Condest",maxIters_);
 
  777   outputTest_->reset();
 
  780   bool isConverged = 
true;
 
  785   if (numRHS2Solve == 1) {
 
  794   block_cg_iter->setDoCondEst(genCondEst_);
 
  795   bool condEstPerf = 
false;
 
  799 #ifdef BELOS_TEUCHOS_TIME_MONITOR 
  803     while ( numRHS2Solve > 0 ) {
 
  806       std::vector<int> convRHSIdx;
 
  807       std::vector<int> currRHSIdx( currIdx );
 
  808       currRHSIdx.resize(numCurrRHS);
 
  811       block_cg_iter->resetNumIters();
 
  814       outputTest_->resetNumCalls();
 
  817       Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
 
  822       block_cg_iter->initializeCG(newState);
 
  829           block_cg_iter->iterate();
 
  836           if ( convTest_->getStatus() == 
Passed ) {
 
  843             if (convIdx.size() == currRHSIdx.size())
 
  847             problem_->setCurrLS();
 
  851             for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
 
  853               for (
unsigned int j=0; j<convIdx.size(); ++j) {
 
  854                 if (currRHSIdx[i] == convIdx[j]) {
 
  860                 currIdx2[have] = currIdx2[i];
 
  861                 currRHSIdx[have++] = currRHSIdx[i];
 
  864             currRHSIdx.resize(have);
 
  865             currIdx2.resize(have);
 
  868             if (currRHSIdx[0] != 0 && genCondEst_ && !condEstPerf)
 
  871               ScalarType l_min, l_max;
 
  874               compute_condnum_tridiag_sym(diag,offdiag,l_min,l_max,condEstimate_);
 
  877               block_cg_iter->setDoCondEst(
false); 
 
  882             problem_->setLSIndex( currRHSIdx );
 
  885             std::vector<MagnitudeType> norms;
 
  886             R_0 = MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
 
  887             for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
 
  892             block_cg_iter->initializeCG(defstate);
 
  900           else if ( maxIterTest_->getStatus() == 
Passed ) {
 
  915                                "Belos::PseudoBlockCGSolMgr::solve(): Invalid return from PseudoBlockCGIter::iterate().");
 
  918         catch (
const std::exception &e) {
 
  919           printer_->stream(
Errors) << 
"Error! Caught std::exception in PseudoBlockCGIter::iterate() at iteration " 
  920                                    << block_cg_iter->getNumIters() << std::endl
 
  921                                    << e.what() << std::endl;
 
  927       problem_->setCurrLS();
 
  930       startPtr += numCurrRHS;
 
  931       numRHS2Solve -= numCurrRHS;
 
  933       if ( numRHS2Solve > 0 ) {
 
  935         numCurrRHS = numRHS2Solve;
 
  936         currIdx.resize( numCurrRHS );
 
  937         currIdx2.resize( numCurrRHS );
 
  938         for (
int i=0; i<numCurrRHS; ++i)
 
  939           { currIdx[i] = startPtr+i; currIdx2[i] = i; }
 
  942         problem_->setLSIndex( currIdx );
 
  945         currIdx.resize( numRHS2Solve );
 
  956 #ifdef BELOS_TEUCHOS_TIME_MONITOR 
  965   numIters_ = maxIterTest_->getNumIters();
 
  969   const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
 
  970   if (pTestValues != NULL && pTestValues->size () > 0) {
 
  971     achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
 
  975   if (genCondEst_ && !condEstPerf) {
 
  976     ScalarType l_min, l_max;
 
  979     compute_condnum_tridiag_sym(diag,offdiag,l_min,l_max,condEstimate_);
 
  990 template<
class ScalarType, 
class MV, 
class OP>
 
  993   std::ostringstream oss;
 
 1001 template<
class ScalarType, 
class MV, 
class OP>
 
 1006                              ScalarType & lambda_min,
 
 1007                              ScalarType & lambda_max,
 
 1008                              ScalarType & ConditionNumber )
 
 1019   const int N = diag.
size ();
 
 1020   ScalarType scalar_dummy;
 
 1021   std::vector<MagnitudeType> mag_dummy(4*N);
 
 1025   lambda_min = STS::one ();
 
 1026   lambda_max = STS::one ();
 
 1029                   &scalar_dummy, 1, &mag_dummy[0], &info);
 
 1031       (info < 0, std::logic_error, 
"Belos::PseudoBlockCGSolMgr::" 
 1032        "compute_condnum_tridiag_sym: LAPACK's _PTEQR failed with info = " 
 1033        << info << 
" < 0.  This suggests there might be a bug in the way Belos " 
 1034        "is calling LAPACK.  Please report this to the Belos developers.");
 
 1035     lambda_min = Teuchos::as<ScalarType> (diag[N-1]);
 
 1036     lambda_max = Teuchos::as<ScalarType> (diag[0]);
 
 1043   if (STS::real (lambda_max) < STS::real (lambda_min)) {
 
 1044     ConditionNumber = STS::one ();
 
 1048     ConditionNumber = lambda_max / lambda_min;
 
ScaleType convertStringToScaleType(const std::string &scaleType)
Convert the given string to its ScaleType enum value. 
 
Teuchos::RCP< const MV > R
The current residual. 
 
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...
 
virtual ~PseudoBlockCGSolMgr()
Destructor. 
 
Class which manages the output and verbosity of the Belos solvers. 
 
ScaleType
The type of scaling to use on the residual norm value. 
 
PseudoBlockCGSolMgr(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< Teuchos::ParameterList > &pl)
 
This class implements the preconditioned Conjugate Gradient (CG) iteration. 
 
Structure to contain pointers to CGIteration state variables. 
 
T & get(const std::string &name, T def_value)
 
Belos concrete class for performing the conjugate-gradient (CG) iteration. 
 
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)
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
A factory class for generating StatusTestOutput objects. 
 
PseudoBlockCGSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i...
 
An implementation of StatusTestResNorm using a family of residual norms. 
 
ScalarType getConditionEstimate() const 
Gets the estimated condition number. 
 
void PTEQR(const char &COMPZ, const OrdinalType &n, MagnitudeType *D, MagnitudeType *E, ScalarType *Z, const OrdinalType &ldz, MagnitudeType *WORK, OrdinalType *info) const 
 
static const double convTol
Default convergence tolerance. 
 
Belos::StatusTest class for specifying a maximum number of iterations. 
 
static std::string name()
 
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
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 override
Return a reference to the linear problem being solved by this solver manager. 
 
Traits class which defines basic operations on multivectors. 
 
The Belos::PseudoBlockCGSolMgr provides a powerful and fully-featured solver manager over the pseudo-...
 
Belos::StatusTest for logically combining several status tests. 
 
bool isParameter(const std::string &name) const 
 
This class implements the pseudo-block CG iteration, where the basic CG algorithm is performed on all...
 
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. ...
 
Belos concrete class for performing a single-reduction conjugate-gradient (CG) iteration. 
 
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< StatusTestGenResNorm< ScalarType, MV, OP > > getResidualStatusTest() const 
Return the residual status test. 
 
A linear system to solve, and its associated information. 
 
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const 
Return the timers for this object. 
 
Class which describes the linear problem to be solved by the iterative solver. 
 
PseudoBlockCGSolMgrOrthoFailure(const std::string &what_arg)
 
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve...
 
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII) 
 
int getNumIters() const override
Get the iteration count for the most recent call to solve(). 
 
Type traits class that says whether Teuchos::LAPACK has a valid implementation for the given ScalarTy...
 
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved. 
 
ReturnType
Whether the Belos solve converged for all linear systems. 
 
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const 
 
virtual ~PseudoBlockCGSolMgr()
 
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. 
 
PseudoBlockCGSolMgrLinearProblemFailure(const std::string &what_arg)
 
Belos::StatusTestResNorm for specifying general residual norm stopping criteria. 
 
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
 
bool isType(const std::string &name) const 
 
A class for extending the status testing capabilities of Belos via logical combinations. 
 
PseudoBlockCGSolMgrOrthoFailure is thrown when the orthogonalization manager is unable to generate or...
 
Class which defines basic traits for the operator type. 
 
Belos concrete class for performing the pseudo-block CG iteration. 
 
Parent class to all Belos exceptions. 
 
Default parameters common to most Belos solvers. 
 
Base class for Belos::SolverManager subclasses which normally can only compile with ScalarType types ...
 
Belos header file which uses auto-configuration information to include necessary C++ headers...
 
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation. 
 
Teuchos::RCP< StatusTestGenResNorm< ScalarType, MV, OP > > getResidualStatusTest() const