42 #ifndef BELOS_BLOCK_CG_SOLMGR_HPP
43 #define BELOS_BLOCK_CG_SOLMGR_HPP
66 #ifdef BELOS_TEUCHOS_TIME_MONITOR
69 #if defined(HAVE_TEUCHOSCORE_CXX11)
70 # include <type_traits>
71 #endif // defined(HAVE_TEUCHOSCORE_CXX11)
116 template<
class ScalarType,
class MV,
class OP,
117 const bool lapackSupportsScalarType =
122 static const bool requiresLapack =
142 template<
class ScalarType,
class MV,
class OP>
254 return Teuchos::tuple(timerSolve_);
325 std::string description()
const override;
363 static constexpr
int maxIters_default_ = 1000;
364 static constexpr
bool adaptiveBlockSize_default_ =
true;
365 static constexpr
bool showMaxResNormOnly_default_ =
false;
366 static constexpr
bool useSingleReduction_default_ =
false;
367 static constexpr
int blockSize_default_ = 1;
370 static constexpr
int outputFreq_default_ = -1;
371 static constexpr
const char * resNorm_default_ =
"TwoNorm";
372 static constexpr
bool foldConvergenceDetectionIntoAllreduce_default_ =
false;
373 static constexpr
const char * resScale_default_ =
"Norm of Initial Residual";
374 static constexpr
const char * label_default_ =
"Belos";
375 static constexpr
const char * orthoType_default_ =
"ICGS";
376 static constexpr
bool assertPositiveDefiniteness_default_ =
true;
377 static constexpr std::ostream * outputStream_default_ = &std::cout;
384 MagnitudeType convtol_;
387 MagnitudeType orthoKappa_;
394 MagnitudeType achievedTol_;
403 int blockSize_, verbosity_, outputStyle_, outputFreq_;
404 bool adaptiveBlockSize_, showMaxResNormOnly_, useSingleReduction_;
405 std::string orthoType_, resScale_;
406 bool assertPositiveDefiniteness_;
407 bool foldConvergenceDetectionIntoAllreduce_;
421 template<
class ScalarType,
class MV,
class OP>
423 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
426 achievedTol_(Teuchos::ScalarTraits<MagnitudeType>::zero()),
427 maxIters_(maxIters_default_),
429 blockSize_(blockSize_default_),
430 verbosity_(verbosity_default_),
431 outputStyle_(outputStyle_default_),
432 outputFreq_(outputFreq_default_),
433 adaptiveBlockSize_(adaptiveBlockSize_default_),
434 showMaxResNormOnly_(showMaxResNormOnly_default_),
435 useSingleReduction_(useSingleReduction_default_),
436 orthoType_(orthoType_default_),
437 resScale_(resScale_default_),
438 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
439 foldConvergenceDetectionIntoAllreduce_(foldConvergenceDetectionIntoAllreduce_default_),
440 label_(label_default_),
446 template<
class ScalarType,
class MV,
class OP>
451 outputStream_(Teuchos::
rcp(outputStream_default_,false)),
454 achievedTol_(Teuchos::ScalarTraits<MagnitudeType>::zero()),
455 maxIters_(maxIters_default_),
457 blockSize_(blockSize_default_),
458 verbosity_(verbosity_default_),
459 outputStyle_(outputStyle_default_),
460 outputFreq_(outputFreq_default_),
461 adaptiveBlockSize_(adaptiveBlockSize_default_),
462 showMaxResNormOnly_(showMaxResNormOnly_default_),
463 useSingleReduction_(useSingleReduction_default_),
464 orthoType_(orthoType_default_),
465 resScale_(resScale_default_),
466 assertPositiveDefiniteness_(assertPositiveDefiniteness_default_),
467 foldConvergenceDetectionIntoAllreduce_(foldConvergenceDetectionIntoAllreduce_default_),
468 label_(label_default_),
472 "BlockCGSolMgr's constructor requires a nonnull LinearProblem instance.");
482 template<
class ScalarType,
class MV,
class OP>
488 if (params_ == Teuchos::null) {
497 maxIters_ = params->
get(
"Maximum Iterations",maxIters_default_);
500 params_->set(
"Maximum Iterations", maxIters_);
501 if (maxIterTest_!=Teuchos::null)
502 maxIterTest_->setMaxIters( maxIters_ );
507 blockSize_ = params->
get(
"Block Size",blockSize_default_);
509 "Belos::BlockCGSolMgr: \"Block Size\" must be strictly positive.");
512 params_->set(
"Block Size", blockSize_);
517 adaptiveBlockSize_ = params->
get(
"Adaptive Block Size",adaptiveBlockSize_default_);
520 params_->set(
"Adaptive Block Size", adaptiveBlockSize_);
525 useSingleReduction_ = params->
get(
"Use Single Reduction", useSingleReduction_default_);
526 if (useSingleReduction_)
527 foldConvergenceDetectionIntoAllreduce_ = params->
get(
"Fold Convergence Detection Into Allreduce",
528 foldConvergenceDetectionIntoAllreduce_default_);
533 std::string tempLabel = params->
get(
"Timer Label", label_default_);
536 if (tempLabel != label_) {
538 params_->set(
"Timer Label", label_);
539 std::string solveLabel = label_ +
": BlockCGSolMgr total solve time";
540 #ifdef BELOS_TEUCHOS_TIME_MONITOR
543 if (ortho_ != Teuchos::null) {
544 ortho_->setLabel( label_ );
551 if (Teuchos::isParameterType<int>(*params,
"Verbosity")) {
552 verbosity_ = params->
get(
"Verbosity", verbosity_default_);
554 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,
"Verbosity");
558 params_->set(
"Verbosity", verbosity_);
559 if (printer_ != Teuchos::null)
560 printer_->setVerbosity(verbosity_);
565 if (Teuchos::isParameterType<int>(*params,
"Output Style")) {
566 outputStyle_ = params->
get(
"Output Style", outputStyle_default_);
568 outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,
"Output Style");
572 params_->set(
"Output Style", outputStyle_);
573 outputTest_ = Teuchos::null;
578 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,
"Output Stream");
581 params_->set(
"Output Stream", outputStream_);
582 if (printer_ != Teuchos::null)
583 printer_->setOStream( outputStream_ );
589 outputFreq_ = params->
get(
"Output Frequency", outputFreq_default_);
593 params_->set(
"Output Frequency", outputFreq_);
594 if (outputTest_ != Teuchos::null)
595 outputTest_->setOutputFrequency( outputFreq_ );
599 if (printer_ == Teuchos::null) {
604 bool changedOrthoType =
false;
606 std::string tempOrthoType = params->
get(
"Orthogonalization",orthoType_default_);
607 if (tempOrthoType != orthoType_) {
608 orthoType_ = tempOrthoType;
609 changedOrthoType =
true;
612 params_->set(
"Orthogonalization", orthoType_);
615 if (params->
isParameter(
"Orthogonalization Constant")) {
616 if (params->
isType<MagnitudeType> (
"Orthogonalization Constant")) {
617 orthoKappa_ = params->
get (
"Orthogonalization Constant",
621 orthoKappa_ = params->
get (
"Orthogonalization Constant",
626 params_->set(
"Orthogonalization Constant",orthoKappa_);
627 if (orthoType_==
"DGKS") {
628 if (orthoKappa_ > 0 && ortho_ != Teuchos::null && !changedOrthoType) {
635 if (ortho_ == Teuchos::null || changedOrthoType) {
638 if (orthoType_==
"DGKS" && orthoKappa_ > 0) {
639 paramsOrtho->
set (
"depTol", orthoKappa_ );
642 ortho_ = factory.
makeMatOrthoManager (orthoType_, Teuchos::null, printer_, label_, paramsOrtho);
650 if (params->
isParameter(
"Convergence Tolerance")) {
651 if (params->
isType<MagnitudeType> (
"Convergence Tolerance")) {
652 convtol_ = params->
get (
"Convergence Tolerance",
660 params_->set(
"Convergence Tolerance", convtol_);
661 if (convTest_ != Teuchos::null)
662 convTest_->setTolerance( convtol_ );
665 if (params->
isParameter(
"Show Maximum Residual Norm Only")) {
666 showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,
"Show Maximum Residual Norm Only");
669 params_->set(
"Show Maximum Residual Norm Only", showMaxResNormOnly_);
670 if (convTest_ != Teuchos::null)
671 convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
675 bool newResTest =
false;
677 std::string tempResScale = resScale_;
678 if (params->
isParameter (
"Implicit Residual Scaling")) {
679 tempResScale = params->
get<std::string> (
"Implicit Residual Scaling");
683 if (resScale_ != tempResScale) {
686 resScale_ = tempResScale;
689 params_->set (
"Implicit Residual Scaling", resScale_);
691 if (! convTest_.is_null ()) {
695 if (params->
isType<std::string> (
"Residual Norm")) {
699 convTest_->defineResForm(StatusTestResNorm_t::Implicit, normType);
702 catch (std::exception& e) {
713 if (maxIterTest_ == Teuchos::null)
717 if (convTest_.is_null () || newResTest) {
721 if (params->
isType<std::string> (
"Residual Norm")) {
726 convTest_ =
rcp (
new StatusTestResNorm_t (convtol_, 1, showMaxResNormOnly_));
727 convTest_->defineResForm(StatusTestResNorm_t::Implicit, normType);
731 if (sTest_.is_null () || newResTest)
732 sTest_ =
Teuchos::rcp(
new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
734 if (outputTest_.is_null () || newResTest) {
742 std::string solverDesc =
" Block CG ";
743 outputTest_->setSolverDesc( solverDesc );
748 if (params->
isParameter(
"Assert Positive Definiteness")) {
749 assertPositiveDefiniteness_ = Teuchos::getParameter<bool>(*params,
"Assert Positive Definiteness");
750 params_->set(
"Assert Positive Definiteness", assertPositiveDefiniteness_);
754 if (timerSolve_ == Teuchos::null) {
755 std::string solveLabel = label_ +
": BlockCGSolMgr total solve time";
756 #ifdef BELOS_TEUCHOS_TIME_MONITOR
766 template<
class ScalarType,
class MV,
class OP>
776 "The relative residual tolerance that needs to be achieved by the\n"
777 "iterative solver in order for the linear system to be declared converged.");
778 pl->
set(
"Maximum Iterations", static_cast<int>(maxIters_default_),
779 "The maximum number of block iterations allowed for each\n"
780 "set of RHS solved.");
781 pl->
set(
"Block Size", static_cast<int>(blockSize_default_),
782 "The number of vectors in each block.");
783 pl->
set(
"Adaptive Block Size", static_cast<bool>(adaptiveBlockSize_default_),
784 "Whether the solver manager should adapt to the block size\n"
785 "based on the number of RHS to solve.");
786 pl->
set(
"Verbosity", static_cast<int>(verbosity_default_),
787 "What type(s) of solver information should be outputted\n"
788 "to the output stream.");
789 pl->
set(
"Output Style", static_cast<int>(outputStyle_default_),
790 "What style is used for the solver information outputted\n"
791 "to the output stream.");
792 pl->
set(
"Output Frequency", static_cast<int>(outputFreq_default_),
793 "How often convergence information should be outputted\n"
794 "to the output stream.");
796 "A reference-counted pointer to the output stream where all\n"
797 "solver output is sent.");
798 pl->
set(
"Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
799 "When convergence information is printed, only show the maximum\n"
800 "relative residual norm when the block size is greater than one.");
801 pl->
set(
"Use Single Reduction", static_cast<bool>(useSingleReduction_default_),
802 "Use single reduction iteration when the block size is one.");
803 pl->
set(
"Implicit Residual Scaling", resScale_default_,
804 "The type of scaling used in the residual convergence test.");
805 pl->
set(
"Timer Label", static_cast<const char *>(label_default_),
806 "The string to use as a prefix for the timer labels.");
807 pl->
set(
"Orthogonalization", static_cast<const char *>(orthoType_default_),
808 "The type of orthogonalization to use: DGKS, ICGS, or IMGS.");
809 pl->
set(
"Assert Positive Definiteness",static_cast<bool>(assertPositiveDefiniteness_default_),
810 "Assert for positivity of p^H*A*p in CG iteration.");
812 "The constant used by DGKS orthogonalization to determine\n"
813 "whether another step of classical Gram-Schmidt is necessary.");
814 pl->
set(
"Residual Norm",static_cast<const char *>(resNorm_default_),
815 "Norm used for the convergence check on the residual.");
816 pl->
set(
"Fold Convergence Detection Into Allreduce",static_cast<bool>(foldConvergenceDetectionIntoAllreduce_default_),
817 "Merge the allreduce for convergence detection with the one for CG.\n"
818 "This saves one all-reduce, but incurs more computation.");
826 template<
class ScalarType,
class MV,
class OP>
830 using Teuchos::rcp_const_cast;
831 using Teuchos::rcp_dynamic_cast;
838 setParameters(Teuchos::parameterList(*getValidParameters()));
846 "Belos::BlockCGSolMgr::solve(): Linear problem is not ready, setProblem() "
847 "has not been called.");
851 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
852 int numCurrRHS = ( numRHS2Solve < blockSize_) ? numRHS2Solve : blockSize_;
854 std::vector<int> currIdx, currIdx2;
859 if ( adaptiveBlockSize_ ) {
860 blockSize_ = numCurrRHS;
861 currIdx.resize( numCurrRHS );
862 currIdx2.resize( numCurrRHS );
863 for (
int i=0; i<numCurrRHS; ++i)
864 { currIdx[i] = startPtr+i; currIdx2[i]=i; }
868 currIdx.resize( blockSize_ );
869 currIdx2.resize( blockSize_ );
870 for (
int i=0; i<numCurrRHS; ++i)
871 { currIdx[i] = startPtr+i; currIdx2[i]=i; }
872 for (
int i=numCurrRHS; i<blockSize_; ++i)
873 { currIdx[i] = -1; currIdx2[i] = i; }
877 problem_->setLSIndex( currIdx );
882 plist.
set(
"Block Size",blockSize_);
885 outputTest_->reset();
889 bool isConverged =
true;
894 plist.
set(
"Assert Positive Definiteness", assertPositiveDefiniteness_);
896 RCP<CGIteration<ScalarType,MV,OP> > block_cg_iter;
897 if (blockSize_ == 1) {
901 if (useSingleReduction_) {
902 plist.
set(
"Fold Convergence Detection Into Allreduce",
903 foldConvergenceDetectionIntoAllreduce_);
906 outputTest_, convTest_, plist));
911 outputTest_, plist));
922 #ifdef BELOS_TEUCHOS_TIME_MONITOR
926 while ( numRHS2Solve > 0 ) {
929 std::vector<int> convRHSIdx;
930 std::vector<int> currRHSIdx( currIdx );
931 currRHSIdx.resize(numCurrRHS);
934 block_cg_iter->resetNumIters();
937 outputTest_->resetNumCalls();
940 RCP<MV> R_0 = MVT::CloneViewNonConst( *(rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
945 block_cg_iter->initializeCG(newstate);
951 block_cg_iter->iterate();
955 if (convTest_->getStatus() ==
Passed) {
960 std::vector<int> convIdx =
961 rcp_dynamic_cast<conv_test_type>(convTest_)->convIndices();
966 if (convIdx.size() == currRHSIdx.size())
971 problem_->setCurrLS();
976 std::vector<int> unconvIdx(currRHSIdx.size());
977 for (
unsigned int i=0; i<currRHSIdx.size(); ++i) {
979 for (
unsigned int j=0; j<convIdx.size(); ++j) {
980 if (currRHSIdx[i] == convIdx[j]) {
986 currIdx2[have] = currIdx2[i];
987 currRHSIdx[have++] = currRHSIdx[i];
992 currRHSIdx.resize(have);
993 currIdx2.resize(have);
996 problem_->setLSIndex( currRHSIdx );
999 std::vector<MagnitudeType> norms;
1000 R_0 = MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
1001 for (
int i=0; i<have; ++i) { currIdx2[i] = i; }
1004 block_cg_iter->setBlockSize( have );
1009 block_cg_iter->initializeCG(defstate);
1015 else if (maxIterTest_->getStatus() ==
Passed) {
1016 isConverged =
false;
1025 "Belos::BlockCGSolMgr::solve(): Neither the convergence test nor "
1026 "the maximum iteration count test passed. Please report this bug "
1027 "to the Belos developers.");
1030 catch (
const std::exception &e) {
1031 std::ostream& err = printer_->stream (
Errors);
1032 err <<
"Error! Caught std::exception in CGIteration::iterate() at "
1033 <<
"iteration " << block_cg_iter->getNumIters() << std::endl
1034 << e.what() << std::endl;
1041 problem_->setCurrLS();
1044 startPtr += numCurrRHS;
1045 numRHS2Solve -= numCurrRHS;
1046 if ( numRHS2Solve > 0 ) {
1047 numCurrRHS = ( numRHS2Solve < blockSize_) ? numRHS2Solve : blockSize_;
1049 if ( adaptiveBlockSize_ ) {
1050 blockSize_ = numCurrRHS;
1051 currIdx.resize( numCurrRHS );
1052 currIdx2.resize( numCurrRHS );
1053 for (
int i=0; i<numCurrRHS; ++i)
1054 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
1057 currIdx.resize( blockSize_ );
1058 currIdx2.resize( blockSize_ );
1059 for (
int i=0; i<numCurrRHS; ++i)
1060 { currIdx[i] = startPtr+i; currIdx2[i] = i; }
1061 for (
int i=numCurrRHS; i<blockSize_; ++i)
1062 { currIdx[i] = -1; currIdx2[i] = i; }
1065 problem_->setLSIndex( currIdx );
1068 block_cg_iter->setBlockSize( blockSize_ );
1071 currIdx.resize( numRHS2Solve );
1082 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1093 numIters_ = maxIterTest_->getNumIters();
1099 const std::vector<MagnitudeType>* pTestValues =
1100 rcp_dynamic_cast<conv_test_type>(convTest_)->getTestValue();
1103 "Belos::BlockCGSolMgr::solve(): The convergence test's getTestValue() "
1104 "method returned NULL. Please report this bug to the Belos developers.");
1107 "Belos::BlockCGSolMgr::solve(): The convergence test's getTestValue() "
1108 "method returned a vector of length zero. Please report this bug to the "
1109 "Belos developers.");
1114 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
1124 template<
class ScalarType,
class MV,
class OP>
1127 std::ostringstream oss;
1130 oss <<
"Ortho Type='"<<orthoType_<<
"\', Block Size=" << blockSize_;
static const double orthoKappa
DGKS orthogonalization constant.
ScaleType convertStringToScaleType(const std::string &scaleType)
Convert the given string to its ScaleType enum value.
Teuchos::RCP< const MV > R
The current residual.
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve...
Collection of types and exceptions used within the Belos solvers.
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
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.
bool is_null(const boost::shared_ptr< T > &p)
ScaleType
The type of scaling to use on the residual norm value.
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
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.
Belos concrete class for performing the block conjugate-gradient (CG) iteration.
An implementation of StatusTestResNorm using a family of residual norms.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
The Belos::BlockCGSolMgr provides a powerful and fully-featured solver manager over the CG and BlockC...
static const double convTol
Default convergence tolerance.
Belos::StatusTest class for specifying a maximum number of iterations.
static std::string name()
BlockCGSolMgrLinearProblemFailure(const std::string &what_arg)
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.
BlockCGSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i.e.
A factory class for generating StatusTestOutput objects.
BlockCGSolMgr(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< Teuchos::ParameterList > &pl)
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
bool isParameter(const std::string &name) const
virtual ~BlockCGSolMgr()
Destructor.
A Belos::StatusTest class for specifying a maximum number of iterations.
ResetType
How to reset the solver.
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
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)
NormType convertStringToNormType(const std::string &normType)
Convert the given string to its NormType enum value.
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
BlockCGSolMgrOrthoFailure is thrown when the orthogonalization manager is unable to generate orthonor...
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
Type traits class that says whether Teuchos::LAPACK has a valid implementation for the given ScalarTy...
ReturnType
Whether the Belos solve converged for all linear systems.
int getNumIters() const override
Get the iteration count for the most recent call to solve().
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
BlockCGSolMgrOrthoFailure(const std::string &what_arg)
NormType
The type of vector norm to compute.
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.
bool isType(const std::string &name) const
An implementation of the Belos::MatOrthoManager that performs orthogonalization using (potentially) m...
A class for extending the status testing capabilities of Belos via logical combinations.
const LinearProblem< ScalarType, MV, OP > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
Class which defines basic traits for the operator type.
Parent class to all Belos exceptions.
Default parameters common to most Belos solvers.
This class implements the preconditioned single-reduction Conjugate Gradient (CG) iteration...
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...
Stub implementation of BlockCGIter, for ScalarType types for which Teuchos::LAPACK does NOT have a va...
Teuchos::RCP< Belos::MatOrthoManager< Scalar, MV, OP > > makeMatOrthoManager(const std::string &ortho, const Teuchos::RCP< const OP > &M, const Teuchos::RCP< OutputManager< Scalar > > &, const std::string &label, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Return an instance of the specified MatOrthoManager subclass.