63 typedef Teuchos::ScalarTraits<ScalarType> SCT;
64 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
65 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
89 const Teuchos::RCP<Teuchos::ParameterList> &pl );
95 Teuchos::RCP<SolverManager<ScalarType, MV, OP> >
clone ()
const override {
120 Teuchos::Array<Teuchos::RCP<Teuchos::Time> >
getTimers()
const {
121 return Teuchos::tuple(timerSolve_);
143 void setParameters(
const Teuchos::RCP<Teuchos::ParameterList> ¶ms )
override;
194 Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > problem_;
197 Teuchos::RCP<OutputManager<ScalarType> > printer_;
198 Teuchos::RCP<std::ostream> outputStream_;
201 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > sTest_;
202 Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP> > maxIterTest_;
203 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> > convTest_;
204 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP> > outputTest_;
207 Teuchos::RCP<Teuchos::ParameterList> params_;
214 mutable Teuchos::RCP<const Teuchos::ParameterList> validParams_;
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_;
236 Teuchos::RCP<Teuchos::Time> timerSolve_;
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_),
269 const Teuchos::RCP<Teuchos::ParameterList> &pl ) :
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_),
285 TEUCHOS_TEST_FOR_EXCEPTION(
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.");
291 if (! pl.is_null ()) {
300 using Teuchos::ParameterList;
301 using Teuchos::parameterList;
307 if (params_.is_null()) {
308 params_ = parameterList (*defaultParams);
310 params->validateParameters (*defaultParams);
314 if (params->isParameter(
"Maximum Iterations")) {
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_);
332 if (params->isParameter(
"Timer Label")) {
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
341 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
347 if (params->isParameter(
"Verbosity")) {
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_);
361 if (params->isParameter(
"Output Style")) {
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;
374 if (params->isParameter(
"Output Stream")) {
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_ );
385 if (params->isParameter(
"Output Frequency")) {
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;
437 if (params->isParameter (
"Residual Scaling")) {
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) {
472 if (params->isParameter(
"Deflation Quorum")) {
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
511 timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
589 "Belos::PseudoBlockStochasticCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
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 );
607 Teuchos::ParameterList plist;
609 plist.set(
"Assert Positive Definiteness",assertPositiveDefiniteness_);
612 outputTest_->reset();
615 bool isConverged =
true;
620 Teuchos::RCP<PseudoBlockStochasticCGIter<ScalarType,MV,OP> > block_cg_iter
625#ifdef BELOS_TEUCHOS_TIME_MONITOR
626 Teuchos::TimeMonitor slvtimer(*timerSolve_);
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 ) {
664 std::vector<int> convIdx = Teuchos::rcp_dynamic_cast<StatusTestGenResNorm<ScalarType,MV,OP> >(convTest_)->convIndices();
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 ) {
726 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
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
777 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails) );
781 numIters_ = maxIterTest_->getNumIters();