10 #ifndef BELOS_PSEUDO_BLOCK_CG_SOLMGR_HPP
11 #define BELOS_PSEUDO_BLOCK_CG_SOLMGR_HPP
32 #ifdef BELOS_TEUCHOS_TIME_MONITOR
73 template<
class ScalarType,
class MV,
class OP,
74 const bool supportsScalarType =
78 Belos::Details::LapackSupportsScalar<ScalarType>::value>
80 static const bool scalarTypeIsSupported =
100 template<
class ScalarType,
class MV,
class OP>
171 return Teuchos::tuple(timerSolve_);
259 std::string description()
const override;
267 ScalarType & lambda_min,
268 ScalarType & lambda_max,
269 ScalarType & ConditionNumber );
295 static constexpr
int maxIters_default_ = 1000;
296 static constexpr
bool assertPositiveDefiniteness_default_ =
true;
297 static constexpr
bool showMaxResNormOnly_default_ =
false;
300 static constexpr
int outputFreq_default_ = -1;
301 static constexpr
int defQuorum_default_ = 1;
302 static constexpr
bool foldConvergenceDetectionIntoAllreduce_default_ =
false;
303 static constexpr
const char * resScale_default_ =
"Norm of Initial Residual";
304 static constexpr
const char * label_default_ =
"Belos";
305 static constexpr
bool genCondEst_default_ =
false;
308 MagnitudeType convtol_,achievedTol_;
309 int maxIters_, numIters_;
310 int verbosity_, outputStyle_, outputFreq_, defQuorum_;
311 bool assertPositiveDefiniteness_, showMaxResNormOnly_;
312 bool foldConvergenceDetectionIntoAllreduce_;
313 std::string resScale_;
315 ScalarType condEstimate_;
328 template<
class ScalarType,
class MV,
class OP>
330 outputStream_(Teuchos::rcpFromRef(std::cout)),
332 maxIters_(maxIters_default_),
334 verbosity_(verbosity_default_),
335 outputStyle_(outputStyle_default_),
336 outputFreq_(outputFreq_default_),
337 defQuorum_(defQuorum_default_),
338 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
339 showMaxResNormOnly_(showMaxResNormOnly_default_),
340 foldConvergenceDetectionIntoAllreduce_(foldConvergenceDetectionIntoAllreduce_default_),
341 resScale_(resScale_default_),
342 genCondEst_(genCondEst_default_),
343 condEstimate_(-Teuchos::ScalarTraits<ScalarType>::one()),
344 label_(label_default_),
349 template<
class ScalarType,
class MV,
class OP>
354 outputStream_(Teuchos::rcpFromRef(std::cout)),
356 maxIters_(maxIters_default_),
358 verbosity_(verbosity_default_),
359 outputStyle_(outputStyle_default_),
360 outputFreq_(outputFreq_default_),
361 defQuorum_(defQuorum_default_),
362 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
363 showMaxResNormOnly_(showMaxResNormOnly_default_),
364 foldConvergenceDetectionIntoAllreduce_(foldConvergenceDetectionIntoAllreduce_default_),
365 resScale_(resScale_default_),
366 genCondEst_(genCondEst_default_),
367 condEstimate_(-Teuchos::ScalarTraits<ScalarType>::one()),
368 label_(label_default_),
372 problem_.is_null (), std::invalid_argument,
373 "Belos::PseudoBlockCGSolMgr two-argument constructor: "
374 "'problem' is null. You must supply a non-null Belos::LinearProblem "
375 "instance when calling this constructor.");
383 template<
class ScalarType,
class MV,
class OP>
389 using Teuchos::parameterList;
393 RCP<const ParameterList> defaultParams = this->getValidParameters ();
412 if (params_.is_null ()) {
414 params_ = parameterList (defaultParams->name ());
421 maxIters_ = params->
get (
"Maximum Iterations", maxIters_default_);
424 params_->set (
"Maximum Iterations", maxIters_);
425 if (! maxIterTest_.is_null ()) {
426 maxIterTest_->setMaxIters (maxIters_);
431 if (params->
isParameter (
"Assert Positive Definiteness")) {
432 assertPositiveDefiniteness_ =
433 params->
get (
"Assert Positive Definiteness",
434 assertPositiveDefiniteness_default_);
437 params_->set (
"Assert Positive Definiteness", assertPositiveDefiniteness_);
440 if (params->
isParameter(
"Fold Convergence Detection Into Allreduce")) {
441 foldConvergenceDetectionIntoAllreduce_ = params->
get(
"Fold Convergence Detection Into Allreduce",
442 foldConvergenceDetectionIntoAllreduce_default_);
447 const std::string tempLabel = params->
get (
"Timer Label", label_default_);
450 if (tempLabel != label_) {
452 params_->set (
"Timer Label", label_);
453 const std::string solveLabel =
454 label_ +
": PseudoBlockCGSolMgr total solve time";
455 #ifdef BELOS_TEUCHOS_TIME_MONITOR
463 if (Teuchos::isParameterType<int> (*params,
"Verbosity")) {
464 verbosity_ = params->
get (
"Verbosity", verbosity_default_);
466 verbosity_ = (int) Teuchos::getParameter<Belos::MsgType> (*params,
"Verbosity");
470 params_->set (
"Verbosity", verbosity_);
471 if (! printer_.is_null ()) {
472 printer_->setVerbosity (verbosity_);
478 if (Teuchos::isParameterType<int> (*params,
"Output Style")) {
479 outputStyle_ = params->
get (
"Output Style", outputStyle_default_);
482 outputStyle_ = (int) Teuchos::getParameter<Belos::OutputType> (*params,
"Output Style");
487 params_->set (
"Output Style", outputStyle_);
488 outputTest_ = Teuchos::null;
493 outputStream_ = params->
get<RCP<std::ostream> > (
"Output Stream");
496 params_->set (
"Output Stream", outputStream_);
497 if (! printer_.is_null ()) {
498 printer_->setOStream (outputStream_);
505 outputFreq_ = params->
get (
"Output Frequency", outputFreq_default_);
509 params_->set (
"Output Frequency", outputFreq_);
510 if (! outputTest_.is_null ()) {
511 outputTest_->setOutputFrequency (outputFreq_);
516 if (params->
isParameter (
"Estimate Condition Number")) {
517 genCondEst_ = params->
get (
"Estimate Condition Number", genCondEst_default_);
521 if (printer_.is_null ()) {
530 if (params->
isParameter (
"Convergence Tolerance")) {
531 if (params->
isType<MagnitudeType> (
"Convergence Tolerance")) {
532 convtol_ = params->
get (
"Convergence Tolerance",
540 params_->set (
"Convergence Tolerance", convtol_);
541 if (! convTest_.is_null ()) {
542 convTest_->setTolerance (convtol_);
546 if (params->
isParameter (
"Show Maximum Residual Norm Only")) {
547 showMaxResNormOnly_ = params->
get<
bool> (
"Show Maximum Residual Norm Only");
550 params_->set (
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
551 if (! convTest_.is_null ()) {
552 convTest_->setShowMaxResNormOnly (showMaxResNormOnly_);
557 bool newResTest =
false;
562 std::string tempResScale = resScale_;
563 bool implicitResidualScalingName =
false;
565 tempResScale = params->
get<std::string> (
"Residual Scaling");
567 else if (params->
isParameter (
"Implicit Residual Scaling")) {
568 tempResScale = params->
get<std::string> (
"Implicit Residual Scaling");
569 implicitResidualScalingName =
true;
573 if (resScale_ != tempResScale) {
576 resScale_ = tempResScale;
580 if (implicitResidualScalingName) {
581 params_->set (
"Implicit Residual Scaling", resScale_);
584 params_->set (
"Residual Scaling", resScale_);
587 if (! convTest_.is_null ()) {
591 catch (std::exception& e) {
601 defQuorum_ = params->
get (
"Deflation Quorum", defQuorum_);
602 params_->set (
"Deflation Quorum", defQuorum_);
603 if (! convTest_.is_null ()) {
604 convTest_->setQuorum( defQuorum_ );
611 if (maxIterTest_.is_null ()) {
616 if (convTest_.is_null () || newResTest) {
617 convTest_ =
rcp (
new StatusTestResNorm_t (convtol_, defQuorum_, showMaxResNormOnly_));
621 if (sTest_.is_null () || newResTest) {
622 sTest_ =
rcp (
new StatusTestCombo_t (StatusTestCombo_t::OR, maxIterTest_, convTest_));
625 if (outputTest_.is_null () || newResTest) {
629 outputTest_ = stoFactory.
create (printer_, sTest_, outputFreq_,
633 const std::string solverDesc =
" Pseudo Block CG ";
634 outputTest_->setSolverDesc (solverDesc);
638 if (timerSolve_.is_null ()) {
639 const std::string solveLabel =
640 label_ +
": PseudoBlockCGSolMgr total solve time";
641 #ifdef BELOS_TEUCHOS_TIME_MONITOR
651 template<
class ScalarType,
class MV,
class OP>
656 using Teuchos::parameterList;
659 if (validParams_.is_null()) {
661 RCP<ParameterList> pl = parameterList ();
663 "The relative residual tolerance that needs to be achieved by the\n"
664 "iterative solver in order for the linear system to be declared converged.");
665 pl->set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
666 "The maximum number of block iterations allowed for each\n"
667 "set of RHS solved.");
668 pl->set(
"Assert Positive Definiteness", static_cast<bool>(assertPositiveDefiniteness_default_),
669 "Whether or not to assert that the linear operator\n"
670 "and the preconditioner are indeed positive definite.");
671 pl->set(
"Verbosity", static_cast<int>(verbosity_default_),
672 "What type(s) of solver information should be outputted\n"
673 "to the output stream.");
674 pl->set(
"Output Style", static_cast<int>(outputStyle_default_),
675 "What style is used for the solver information outputted\n"
676 "to the output stream.");
677 pl->set(
"Output Frequency", static_cast<int>(outputFreq_default_),
678 "How often convergence information should be outputted\n"
679 "to the output stream.");
680 pl->set(
"Deflation Quorum", static_cast<int>(defQuorum_default_),
681 "The number of linear systems that need to converge before\n"
682 "they are deflated. This number should be <= block size.");
683 pl->set(
"Output Stream", Teuchos::rcpFromRef(std::cout),
684 "A reference-counted pointer to the output stream where all\n"
685 "solver output is sent.");
686 pl->set(
"Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
687 "When convergence information is printed, only show the maximum\n"
688 "relative residual norm when the block size is greater than one.");
689 pl->set(
"Implicit Residual Scaling", resScale_default_,
690 "The type of scaling used in the residual convergence test.");
691 pl->set(
"Estimate Condition Number", static_cast<bool>(genCondEst_default_),
692 "Whether or not to estimate the condition number of the preconditioned system.");
698 pl->set(
"Residual Scaling", resScale_default_,
699 "The type of scaling used in the residual convergence test. This "
700 "name is deprecated; the new name is \"Implicit Residual Scaling\".");
701 pl->set(
"Timer Label", static_cast<const char *>(label_default_),
702 "The string to use as a prefix for the timer labels.");
703 pl->set(
"Fold Convergence Detection Into Allreduce",static_cast<bool>(foldConvergenceDetectionIntoAllreduce_default_),
704 "Merge the allreduce for convergence detection with the one for CG.\n"
705 "This saves one all-reduce, but incurs more computation.");
713 template<
class ScalarType,
class MV,
class OP>
716 const char prefix[] =
"Belos::PseudoBlockCGSolMgr::solve: ";
721 if (!isSet_) { setParameters( params_ ); }
725 prefix <<
"The linear problem to solve is not ready. You must call "
726 "setProblem() on the Belos::LinearProblem instance before telling the "
727 "Belos solver to solve it.");
731 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
732 int numCurrRHS = numRHS2Solve;
734 std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
735 for (
int i=0; i<numRHS2Solve; ++i) {
736 currIdx[i] = startPtr+i;
741 problem_->setLSIndex( currIdx );
747 plist.
set(
"Assert Positive Definiteness",assertPositiveDefiniteness_);
748 if(genCondEst_) plist.
set(
"Max Size For Condest",maxIters_);
751 outputTest_->reset();
754 bool isConverged =
true;
759 if (numRHS2Solve == 1) {
760 plist.
set(
"Fold Convergence Detection Into Allreduce",
761 foldConvergenceDetectionIntoAllreduce_);
770 block_cg_iter->setDoCondEst(genCondEst_);
771 bool condEstPerf =
false;
775 #ifdef BELOS_TEUCHOS_TIME_MONITOR
779 while ( numRHS2Solve > 0 ) {
782 std::vector<int> convRHSIdx;
783 std::vector<int> currRHSIdx( currIdx );
784 currRHSIdx.resize(numCurrRHS);
787 block_cg_iter->resetNumIters();
790 outputTest_->resetNumCalls();
793 Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
798 block_cg_iter->initializeCG(newState);
805 block_cg_iter->iterate();
812 if ( convTest_->getStatus() ==
Passed ) {
819 if (convIdx.size() == currRHSIdx.size())
823 problem_->setCurrLS();
827 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
829 for (
unsigned int j=0; j<convIdx.size(); ++j) {
830 if (currRHSIdx[i] == convIdx[j]) {
836 currIdx2[have] = currIdx2[i];
837 currRHSIdx[have++] = currRHSIdx[i];
840 currRHSIdx.resize(have);
841 currIdx2.resize(have);
844 if (currRHSIdx[0] != 0 && genCondEst_ && !condEstPerf)
847 ScalarType l_min, l_max;
850 compute_condnum_tridiag_sym(diag,offdiag,eigenEstimates_,l_min,l_max,condEstimate_);
853 block_cg_iter->setDoCondEst(
false);
858 problem_->setLSIndex( currRHSIdx );
861 std::vector<MagnitudeType> norms;
862 R_0 = MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
863 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
868 block_cg_iter->initializeCG(defstate);
876 else if ( maxIterTest_->getStatus() ==
Passed ) {
891 "Belos::PseudoBlockCGSolMgr::solve(): Invalid return from PseudoBlockCGIter::iterate().");
896 achievedTol_ = MT::one();
898 MVT::MvInit( *X, SCT::zero() );
899 printer_->stream(
Warnings) <<
"Belos::PseudoBlockCGSolMgr::solve(): Warning! NaN has been detected!"
903 catch (
const std::exception &e) {
904 printer_->stream(
Errors) <<
"Error! Caught std::exception in PseudoBlockCGIter::iterate() at iteration "
905 << block_cg_iter->getNumIters() << std::endl
906 << e.what() << std::endl;
912 problem_->setCurrLS();
915 startPtr += numCurrRHS;
916 numRHS2Solve -= numCurrRHS;
918 if ( numRHS2Solve > 0 ) {
920 numCurrRHS = numRHS2Solve;
921 currIdx.resize( numCurrRHS );
922 currIdx2.resize( numCurrRHS );
923 for (
int i=0; i<numCurrRHS; ++i)
924 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
927 problem_->setLSIndex( currIdx );
930 currIdx.resize( numRHS2Solve );
941 #ifdef BELOS_TEUCHOS_TIME_MONITOR
950 numIters_ = maxIterTest_->getNumIters();
954 const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
955 if (pTestValues != NULL && pTestValues->size () > 0) {
956 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
960 if (genCondEst_ && !condEstPerf) {
961 ScalarType l_min, l_max;
964 compute_condnum_tridiag_sym(diag,offdiag,eigenEstimates_,l_min,l_max,condEstimate_);
975 template<
class ScalarType,
class MV,
class OP>
978 std::ostringstream oss;
986 template<
class ScalarType,
class MV,
class OP>
992 ScalarType & lambda_min,
993 ScalarType & lambda_max,
994 ScalarType & ConditionNumber )
1005 const int N = diag.
size ();
1006 ScalarType scalar_dummy;
1007 std::vector<MagnitudeType> mag_dummy(4*N);
1012 lambda_min = STS::one ();
1013 lambda_max = STS::one ();
1016 &scalar_dummy, 1, &mag_dummy[0], &info);
1018 (info < 0, std::logic_error,
"Belos::PseudoBlockCGSolMgr::"
1019 "compute_condnum_tridiag_sym: LAPACK's _PTEQR failed with info = "
1020 << info <<
" < 0. This suggests there might be a bug in the way Belos "
1021 "is calling LAPACK. Please report this to the Belos developers.");
1022 for (
int k = 0; k < N; k++) {
1023 lambdas[k] = diag[N - 1 - k];
1025 lambda_min = Teuchos::as<ScalarType> (diag[N-1]);
1026 lambda_max = Teuchos::as<ScalarType> (diag[0]);
1033 if (STS::real (lambda_max) < STS::real (lambda_min)) {
1034 ConditionNumber = STS::one ();
1038 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.
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.
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
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.
void resize(const size_type n, const T &val=T())
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::ArrayRCP< MagnitudeType > getEigenEstimates() const
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.
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.
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