Belos Package Browser (Single Doxygen Collection)  Development
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
BelosBiCGStabSolMgr.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Belos: Block Linear Solvers Package
4 //
5 // Copyright 2004-2016 NTESS and the Belos contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef BELOS_BICGSTAB_SOLMGR_HPP
11 #define BELOS_BICGSTAB_SOLMGR_HPP
12 
17 #include "BelosConfigDefs.hpp"
18 #include "BelosTypes.hpp"
19 
20 #include "BelosLinearProblem.hpp"
21 #include "BelosSolverManager.hpp"
22 
23 #include "BelosBiCGStabIter.hpp"
26 #include "BelosStatusTestCombo.hpp"
28 #include "BelosOutputManager.hpp"
29 #ifdef BELOS_TEUCHOS_TIME_MONITOR
30 #include "Teuchos_TimeMonitor.hpp"
31 #endif
32 
49 namespace Belos {
50 
52 
53 
61  BiCGStabSolMgrLinearProblemFailure(const std::string& what_arg) : BelosError(what_arg)
62  {}};
63 
64  template<class ScalarType, class MV, class OP>
65  class BiCGStabSolMgr : public SolverManager<ScalarType,MV,OP> {
66 
67  private:
73 
74  public:
75 
77 
78 
85 
97 
99  virtual ~BiCGStabSolMgr() {};
100 
104  }
106 
108 
109 
110  const LinearProblem<ScalarType,MV,OP>& getProblem() const override {
111  return *problem_;
112  }
113 
117 
121 
128  return Teuchos::tuple(timerSolve_);
129  }
130 
131 
142  MagnitudeType achievedTol() const override {
143  return achievedTol_;
144  }
145 
147  int getNumIters() const override {
148  return numIters_;
149  }
150 
154  bool isLOADetected() const override { return false; }
155 
157 
159 
160 
162  void setProblem( const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > &problem ) override { problem_ = problem; }
163 
165  void setParameters( const Teuchos::RCP<Teuchos::ParameterList> &params ) override;
166 
168 
170 
171 
175  void reset( const ResetType type ) override { if ((type & Belos::Problem) && !Teuchos::is_null(problem_)) problem_->setProblem(); }
177 
179 
180 
198  ReturnType solve() override;
199 
201 
204 
206  std::string description() const override;
207 
209  private:
210 
211  // Linear problem.
213 
214  // Output manager.
217 
218  // Status test.
223 
224  // Current parameter list.
226 
233 
234  // Default solver values.
235  static constexpr int maxIters_default_ = 1000;
236  static constexpr bool showMaxResNormOnly_default_ = false;
237  static constexpr int verbosity_default_ = Belos::Errors;
238  static constexpr int outputStyle_default_ = Belos::General;
239  static constexpr int outputFreq_default_ = -1;
240  static constexpr int defQuorum_default_ = 1;
241  static constexpr const char * resScale_default_ = "Norm of Initial Residual";
242  static constexpr const char * label_default_ = "Belos";
243 
244  // Current solver values.
249  std::string resScale_;
250 
251  // Timers.
252  std::string label_;
254 
255  // Internal state variables.
256  bool isSet_;
257  };
258 
259 // Empty Constructor
260 template<class ScalarType, class MV, class OP>
262  outputStream_(Teuchos::rcpFromRef(std::cout)),
263  convtol_(DefaultSolverParameters::convTol),
264  maxIters_(maxIters_default_),
265  numIters_(0),
266  verbosity_(verbosity_default_),
267  outputStyle_(outputStyle_default_),
268  outputFreq_(outputFreq_default_),
269  defQuorum_(defQuorum_default_),
270  showMaxResNormOnly_(showMaxResNormOnly_default_),
271  resScale_(resScale_default_),
272  label_(label_default_),
273  isSet_(false)
274 {}
275 
276 // Basic Constructor
277 template<class ScalarType, class MV, class OP>
281  problem_(problem),
282  outputStream_(Teuchos::rcpFromRef(std::cout)),
283  convtol_(DefaultSolverParameters::convTol),
284  maxIters_(maxIters_default_),
285  numIters_(0),
286  verbosity_(verbosity_default_),
287  outputStyle_(outputStyle_default_),
288  outputFreq_(outputFreq_default_),
289  defQuorum_(defQuorum_default_),
290  showMaxResNormOnly_(showMaxResNormOnly_default_),
291  resScale_(resScale_default_),
292  label_(label_default_),
293  isSet_(false)
294 {
296  problem_.is_null (), std::invalid_argument,
297  "Belos::BiCGStabSolMgr two-argument constructor: "
298  "'problem' is null. You must supply a non-null Belos::LinearProblem "
299  "instance when calling this constructor.");
300 
301  if (! pl.is_null ()) {
302  // Set the parameters using the list that was passed in.
303  setParameters (pl);
304  }
305 }
306 
307 template<class ScalarType, class MV, class OP>
309 {
311  using Teuchos::parameterList;
312  using Teuchos::RCP;
313 
314  RCP<const ParameterList> defaultParams = getValidParameters();
315 
316  // Create the internal parameter list if one doesn't already exist.
317  if (params_.is_null()) {
318  params_ = parameterList (*defaultParams);
319  } else {
320  params->validateParameters (*defaultParams);
321  }
322 
323  // Check for maximum number of iterations
324  if (params->isParameter("Maximum Iterations")) {
325  maxIters_ = params->get("Maximum Iterations",maxIters_default_);
326 
327  // Update parameter in our list and in status test.
328  params_->set("Maximum Iterations", maxIters_);
329  if (maxIterTest_!=Teuchos::null)
330  maxIterTest_->setMaxIters( maxIters_ );
331  }
332 
333  // Check to see if the timer label changed.
334  if (params->isParameter("Timer Label")) {
335  std::string tempLabel = params->get("Timer Label", label_default_);
336 
337  // Update parameter in our list and solver timer
338  if (tempLabel != label_) {
339  label_ = tempLabel;
340  params_->set("Timer Label", label_);
341  std::string solveLabel = label_ + ": BiCGStabSolMgr total solve time";
342 #ifdef BELOS_TEUCHOS_TIME_MONITOR
343  timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
344 #endif
345  }
346  }
347 
348  // Check for a change in verbosity level
349  if (params->isParameter("Verbosity")) {
350  if (Teuchos::isParameterType<int>(*params,"Verbosity")) {
351  verbosity_ = params->get("Verbosity", verbosity_default_);
352  } else {
353  verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,"Verbosity");
354  }
355 
356  // Update parameter in our list.
357  params_->set("Verbosity", verbosity_);
358  if (printer_ != Teuchos::null)
359  printer_->setVerbosity(verbosity_);
360  }
361 
362  // Check for a change in output style
363  if (params->isParameter("Output Style")) {
364  if (Teuchos::isParameterType<int>(*params,"Output Style")) {
365  outputStyle_ = params->get("Output Style", outputStyle_default_);
366  } else {
367  outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,"Output Style");
368  }
369 
370  // Reconstruct the convergence test if the explicit residual test is not being used.
371  params_->set("Output Style", outputStyle_);
372  outputTest_ = Teuchos::null;
373  }
374 
375  // output stream
376  if (params->isParameter("Output Stream")) {
377  outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,"Output Stream");
378 
379  // Update parameter in our list.
380  params_->set("Output Stream", outputStream_);
381  if (printer_ != Teuchos::null)
382  printer_->setOStream( outputStream_ );
383  }
384 
385  // frequency level
386  if (verbosity_ & Belos::StatusTestDetails) {
387  if (params->isParameter("Output Frequency")) {
388  outputFreq_ = params->get("Output Frequency", outputFreq_default_);
389  }
390 
391  // Update parameter in out list and output status test.
392  params_->set("Output Frequency", outputFreq_);
393  if (outputTest_ != Teuchos::null)
394  outputTest_->setOutputFrequency( outputFreq_ );
395  }
396 
397  // Create output manager if we need to.
398  if (printer_ == Teuchos::null) {
399  printer_ = Teuchos::rcp( new OutputManager<ScalarType>(verbosity_, outputStream_) );
400  }
401 
402  // Convergence
403  typedef Belos::StatusTestCombo<ScalarType,MV,OP> StatusTestCombo_t;
404  typedef Belos::StatusTestGenResNorm<ScalarType,MV,OP> StatusTestResNorm_t;
405 
406  // Check for convergence tolerance
407  if (params->isParameter("Convergence Tolerance")) {
408  if (params->isType<MagnitudeType> ("Convergence Tolerance")) {
409  convtol_ = params->get ("Convergence Tolerance",
410  static_cast<MagnitudeType> (DefaultSolverParameters::convTol));
411  }
412  else {
413  convtol_ = params->get ("Convergence Tolerance", DefaultSolverParameters::convTol);
414  }
415 
416  // Update parameter in our list and residual tests.
417  params_->set("Convergence Tolerance", convtol_);
418  if (convTest_ != Teuchos::null)
419  convTest_->setTolerance( convtol_ );
420  }
421 
422  if (params->isParameter("Show Maximum Residual Norm Only")) {
423  showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,"Show Maximum Residual Norm Only");
424 
425  // Update parameter in our list and residual tests
426  params_->set("Show Maximum Residual Norm Only", showMaxResNormOnly_);
427  if (convTest_ != Teuchos::null)
428  convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
429  }
430 
431  // Check for a change in scaling, if so we need to build new residual tests.
432  bool newResTest = false;
433  {
434  // "Residual Scaling" is the old parameter name; "Implicit
435  // Residual Scaling" is the new name. We support both options for
436  // backwards compatibility.
437  std::string tempResScale = resScale_;
438  bool implicitResidualScalingName = false;
439  if (params->isParameter ("Residual Scaling")) {
440  tempResScale = params->get<std::string> ("Residual Scaling");
441  }
442  else if (params->isParameter ("Implicit Residual Scaling")) {
443  tempResScale = params->get<std::string> ("Implicit Residual Scaling");
444  implicitResidualScalingName = true;
445  }
446 
447  // Only update the scaling if it's different.
448  if (resScale_ != tempResScale) {
449  Belos::ScaleType resScaleType = convertStringToScaleType( tempResScale );
450  resScale_ = tempResScale;
451 
452  // Update parameter in our list and residual tests, using the
453  // given parameter name.
454  if (implicitResidualScalingName) {
455  params_->set ("Implicit Residual Scaling", resScale_);
456  }
457  else {
458  params_->set ("Residual Scaling", resScale_);
459  }
460 
461  if (! convTest_.is_null()) {
462  try {
463  convTest_->defineScaleForm( resScaleType, Belos::TwoNorm );
464  }
465  catch (std::exception& e) {
466  // Make sure the convergence test gets constructed again.
467  newResTest = true;
468  }
469  }
470  }
471  }
472 
473  // Get the deflation quorum, or number of converged systems before deflation is allowed
474  if (params->isParameter("Deflation Quorum")) {
475  defQuorum_ = params->get("Deflation Quorum", defQuorum_);
476  params_->set("Deflation Quorum", defQuorum_);
477  if (convTest_ != Teuchos::null)
478  convTest_->setQuorum( defQuorum_ );
479  }
480 
481  // Create status tests if we need to.
482 
483  // Basic test checks maximum iterations and native residual.
484  if (maxIterTest_ == Teuchos::null)
485  maxIterTest_ = Teuchos::rcp( new StatusTestMaxIters<ScalarType,MV,OP>( maxIters_ ) );
486 
487  // Implicit residual test, using the native residual to determine if convergence was achieved.
488  if (convTest_ == Teuchos::null || newResTest) {
489  convTest_ = Teuchos::rcp( new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
490  convTest_->defineScaleForm( convertStringToScaleType( resScale_ ), Belos::TwoNorm );
491  }
492 
493  if (sTest_ == Teuchos::null || newResTest)
494  sTest_ = Teuchos::rcp( new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
495 
496  if (outputTest_ == Teuchos::null || newResTest) {
497 
498  // Create the status test output class.
499  // This class manages and formats the output from the status test.
500  StatusTestOutputFactory<ScalarType,MV,OP> stoFactory( outputStyle_ );
501  outputTest_ = stoFactory.create( printer_, sTest_, outputFreq_, Passed+Failed+Undefined );
502 
503  // Set the solver string for the output test
504  std::string solverDesc = " Pseudo Block BiCGStab ";
505  outputTest_->setSolverDesc( solverDesc );
506 
507  }
508 
509  // Create the timer if we need to.
510  if (timerSolve_ == Teuchos::null) {
511  std::string solveLabel = label_ + ": BiCGStabSolMgr total solve time";
512 #ifdef BELOS_TEUCHOS_TIME_MONITOR
513  timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
514 #endif
515  }
516 
517  // Inform the solver manager that the current parameters were set.
518  isSet_ = true;
519 }
520 
521 
522 template<class ScalarType, class MV, class OP>
525 {
527  using Teuchos::parameterList;
528  using Teuchos::RCP;
529 
530  if (validParams_.is_null()) {
531  // Set all the valid parameters and their default values.
532  RCP<ParameterList> pl = parameterList ();
533 
534  // The static_cast is to resolve an issue with older clang versions which
535  // would cause the constexpr to link fail. With c++17 the problem is resolved.
536  pl->set("Convergence Tolerance", static_cast<MagnitudeType>(DefaultSolverParameters::convTol),
537  "The relative residual tolerance that needs to be achieved by the\n"
538  "iterative solver in order for the linera system to be declared converged.");
539  pl->set("Maximum Iterations", static_cast<int>(maxIters_default_),
540  "The maximum number of block iterations allowed for each\n"
541  "set of RHS solved.");
542  pl->set("Verbosity", static_cast<int>(verbosity_default_),
543  "What type(s) of solver information should be outputted\n"
544  "to the output stream.");
545  pl->set("Output Style", static_cast<int>(outputStyle_default_),
546  "What style is used for the solver information outputted\n"
547  "to the output stream.");
548  pl->set("Output Frequency", static_cast<int>(outputFreq_default_),
549  "How often convergence information should be outputted\n"
550  "to the output stream.");
551  pl->set("Deflation Quorum", static_cast<int>(defQuorum_default_),
552  "The number of linear systems that need to converge before\n"
553  "they are deflated. This number should be <= block size.");
554  pl->set("Output Stream", Teuchos::rcpFromRef(std::cout),
555  "A reference-counted pointer to the output stream where all\n"
556  "solver output is sent.");
557  pl->set("Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
558  "When convergence information is printed, only show the maximum\n"
559  "relative residual norm when the block size is greater than one.");
560  pl->set("Implicit Residual Scaling", static_cast<const char *>(resScale_default_),
561  "The type of scaling used in the residual convergence test.");
562  // We leave the old name as a valid parameter for backwards
563  // compatibility (so that validateParametersAndSetDefaults()
564  // doesn't raise an exception if it encounters "Residual
565  // Scaling"). The new name was added for compatibility with other
566  // solvers, none of which use "Residual Scaling".
567  pl->set("Residual Scaling", static_cast<const char *>(resScale_default_),
568  "The type of scaling used in the residual convergence test. This "
569  "name is deprecated; the new name is \"Implicit Residual Scaling\".");
570  pl->set("Timer Label", static_cast<const char *>(label_default_),
571  "The string to use as a prefix for the timer labels.");
572  validParams_ = pl;
573  }
574  return validParams_;
575 }
576 
577 
578 template<class ScalarType, class MV, class OP>
580 {
581  // Set the current parameters if they were not set before.
582  // NOTE: This may occur if the user generated the solver manager with the default constructor and
583  // then didn't set any parameters using setParameters().
584  if (! isSet_) {
585  setParameters (params_);
586  }
587 
589  (! problem_->isProblemSet (), BiCGStabSolMgrLinearProblemFailure,
590  "Belos::BiCGStabSolMgr::solve: Linear problem is not ready. "
591  "You must call setProblem() on the LinearProblem before you may solve it.");
593  (problem_->isLeftPrec (), std::logic_error, "Belos::BiCGStabSolMgr::solve: "
594  "The left-preconditioned case has not yet been implemented. Please use "
595  "right preconditioning for now. If you need to use left preconditioning, "
596  "please contact the Belos developers. Left preconditioning is more "
597  "interesting in BiCGStab because whether it works depends on the initial "
598  "guess (e.g., an initial guess of all zeros might NOT work).");
599 
600  // Create indices for the linear systems to be solved.
601  int startPtr = 0;
602  int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
603  int numCurrRHS = numRHS2Solve;
604 
605  std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
606  for (int i=0; i<numRHS2Solve; ++i) {
607  currIdx[i] = startPtr+i;
608  currIdx2[i]=i;
609  }
610 
611  // Inform the linear problem of the current linear system to solve.
612  problem_->setLSIndex( currIdx );
613 
615  // Parameter list (iteration)
617 
618  // Reset the status test.
619  outputTest_->reset();
620 
621  // Assume convergence is achieved, then let any failed convergence set this to false.
622  bool isConverged = true;
623 
625  // Pseudo-Block BiCGStab solver
626 
628  = Teuchos::rcp( new BiCGStabIter<ScalarType,MV,OP>(problem_,printer_,outputTest_,plist) );
629 
630  // Enter solve() iterations
631  {
632 #ifdef BELOS_TEUCHOS_TIME_MONITOR
633  Teuchos::TimeMonitor slvtimer(*timerSolve_);
634 #endif
635 
636  //bool first_time=true;
637  while ( numRHS2Solve > 0 ) {
638  // Reset the active / converged vectors from this block
639  std::vector<int> convRHSIdx;
640  std::vector<int> currRHSIdx( currIdx );
641  currRHSIdx.resize(numCurrRHS);
642 
643  // Reset the number of iterations.
644  bicgstab_iter->resetNumIters();
645 
646  // Reset the number of calls that the status test output knows about.
647  outputTest_->resetNumCalls();
648 
649  // Get the current residual for this block of linear systems.
650  Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
651 
652  // Get a new state struct and initialize the solver.
654  newState.R = R_0;
655  bicgstab_iter->initializeBiCGStab(newState);
656 
657  while(1) {
658 
659  // tell block_gmres_iter to iterate
660  try {
661 
662  bicgstab_iter->iterate();
663 
665  //
666  // check convergence first
667  //
669  if ( convTest_->getStatus() == Passed ) {
670 
671  // Figure out which linear systems converged.
672  std::vector<int> convIdx = Teuchos::rcp_dynamic_cast<StatusTestGenResNorm<ScalarType,MV,OP> >(convTest_)->convIndices();
673 
674  // If the number of converged linear systems is equal to the
675  // number of current linear systems, then we are done with this block.
676  if (convIdx.size() == currRHSIdx.size())
677  break; // break from while(1){bicgstab_iter->iterate()}
678 
679  // Inform the linear problem that we are finished with this current linear system.
680  problem_->setCurrLS();
681 
682  // Reset currRHSIdx to have the right-hand sides that are left to converge for this block.
683  int have = 0;
684  std::vector<int> unconvIdx(currRHSIdx.size());
685  for (unsigned int i=0; i<currRHSIdx.size(); ++i) {
686  bool found = false;
687  for (unsigned int j=0; j<convIdx.size(); ++j) {
688  if (currRHSIdx[i] == convIdx[j]) {
689  found = true;
690  break;
691  }
692  }
693  if (!found) {
694  currIdx2[have] = currIdx2[i];
695  currRHSIdx[have++] = currRHSIdx[i];
696  }
697  }
698  currRHSIdx.resize(have);
699  currIdx2.resize(have);
700 
701  // Set the remaining indices after deflation.
702  problem_->setLSIndex( currRHSIdx );
703 
704  // Get the current residual vector.
705  std::vector<MagnitudeType> norms;
706  R_0 = MVT::CloneCopy( *(bicgstab_iter->getNativeResiduals(&norms)),currIdx2 );
707  for (int i=0; i<have; ++i) { currIdx2[i] = i; }
708 
709  // Set the new state and initialize the solver.
711  defstate.R = R_0;
712  bicgstab_iter->initializeBiCGStab(defstate);
713  }
714 
716  //
717  // check for maximum iterations
718  //
720  else if ( maxIterTest_->getStatus() == Passed ) {
721  // we don't have convergence
722  isConverged = false;
723  break; // break from while(1){bicgstab_iter->iterate()}
724  }
725 
727  //
728  // we returned from iterate(), but none of our status tests Passed.
729  // breakdown was detected within the solver iteration.
730  //
732 
733  else if ( bicgstab_iter->breakdownDetected() ) {
734  // we don't have convergence
735  isConverged = false;
736  printer_->stream(Warnings) <<
737  "Belos::BiCGStabSolMgr::solve(): Warning! Solver has experienced a breakdown!" << std::endl;
738  break; // break from while(1){bicgstab_iter->iterate()}
739  }
740 
742  //
743  // we returned from iterate(), but none of our status tests Passed.
744  // something is wrong, and it is probably our fault.
745  //
747 
748  else {
749  TEUCHOS_TEST_FOR_EXCEPTION(true,std::logic_error,
750  "Belos::BiCGStabSolMgr::solve(): Invalid return from BiCGStabIter::iterate().");
751  }
752  }
753  catch (const StatusTestNaNError& e) {
754  // A NaN was detected in the solver. Set the solution to zero and return unconverged.
755  achievedTol_ = MT::one();
756  Teuchos::RCP<MV> X = problem_->getLHS();
757  MVT::MvInit( *X, SCT::zero() );
758  printer_->stream(Warnings) << "Belos::BiCGStabSolMgr::solve(): Warning! NaN has been detected!"
759  << std::endl;
760  return Unconverged;
761  }
762  catch (const std::exception &e) {
763  printer_->stream(Errors) << "Error! Caught std::exception in BiCGStabIter::iterate() at iteration "
764  << bicgstab_iter->getNumIters() << std::endl
765  << e.what() << std::endl;
766  throw;
767  }
768  }
769 
770  // Inform the linear problem that we are finished with this block linear system.
771  problem_->setCurrLS();
772 
773  // Update indices for the linear systems to be solved.
774  startPtr += numCurrRHS;
775  numRHS2Solve -= numCurrRHS;
776 
777  if ( numRHS2Solve > 0 ) {
778 
779  numCurrRHS = numRHS2Solve;
780  currIdx.resize( numCurrRHS );
781  currIdx2.resize( numCurrRHS );
782  for (int i=0; i<numCurrRHS; ++i)
783  { currIdx[i] = startPtr+i; currIdx2[i] = i; }
784 
785  // Set the next indices.
786  problem_->setLSIndex( currIdx );
787  }
788  else {
789  currIdx.resize( numRHS2Solve );
790  }
791 
792  //first_time=false;
793  }// while ( numRHS2Solve > 0 )
794 
795  }
796 
797  // print final summary
798  sTest_->print( printer_->stream(FinalSummary) );
799 
800  // print timing information
801 #ifdef BELOS_TEUCHOS_TIME_MONITOR
802  // Calling summarize() can be expensive, so don't call unless the
803  // user wants to print out timing details. summarize() will do all
804  // the work even if it's passed a "black hole" output stream.
805  if (verbosity_ & TimingDetails)
806  Teuchos::TimeMonitor::summarize( printer_->stream(TimingDetails) );
807 #endif
808 
809  // get iteration information for this solve
810  numIters_ = maxIterTest_->getNumIters();
811 
812 
813  // Save the convergence test value ("achieved tolerance") for this
814  // solve.
815  const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
816  achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
817 
818 
819  if (!isConverged ) {
820  return Unconverged; // return from BiCGStabSolMgr::solve()
821  }
822  return Converged; // return from BiCGStabSolMgr::solve()
823 }
824 
825 // This method requires the solver manager to return a std::string that describes itself.
826 template<class ScalarType, class MV, class OP>
828 {
829  std::ostringstream oss;
830  oss << "Belos::BiCGStabSolMgr<...,"<<Teuchos::ScalarTraits<ScalarType>::name()<<">";
831  oss << "{";
832  oss << "}";
833  return oss.str();
834 }
835 
836 
837 
838 } // end Belos namespace
839 
840 #endif /* BELOS_BICGSTAB_SOLMGR_HPP */
const LinearProblem< ScalarType, MV, OP > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
ScaleType convertStringToScaleType(const std::string &scaleType)
Convert the given string to its ScaleType enum value.
Definition: BelosTypes.cpp:74
Collection of types and exceptions used within the Belos solvers.
Belos&#39;s basic output manager for sending information of select verbosity levels to the appropriate ou...
This class implements the pseudo-block BiCGStab iteration, where the basic BiCGStab algorithm is perf...
Teuchos::ScalarTraits< ScalarType >::magnitudeType MagnitudeType
Teuchos::RCP< const Teuchos::ParameterList > validParams_
List of valid parameters and their default values.
Class which manages the output and verbosity of the Belos solvers.
Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > problem_
Teuchos::ScalarTraits< MagnitudeType > MT
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > &params) override
Set the parameters the solver manager should use to solve the linear problem.
Teuchos::RCP< const MV > R
The current residual.
ScaleType
The type of scaling to use on the residual norm value.
Definition: BelosTypes.hpp:88
T & get(ParameterList &l, const std::string &name)
OperatorTraits< ScalarType, MV, OP > OPT
static RCP< Time > getNewCounter(const std::string &name)
bool is_null(const std::shared_ptr< T > &p)
Teuchos::RCP< StatusTest< ScalarType, MV, OP > > sTest_
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
A factory class for generating StatusTestOutput objects.
static constexpr bool showMaxResNormOnly_default_
Structure to contain pointers to BiCGStabIteration state variables.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
An implementation of StatusTestResNorm using a family of residual norms.
static constexpr int maxIters_default_
void reset(const ResetType type) override
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.
static const double convTol
Default convergence tolerance.
Definition: BelosTypes.hpp:261
static constexpr int outputFreq_default_
Belos::StatusTest class for specifying a maximum number of iterations.
static std::string name()
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
A factory class for generating StatusTestOutput objects.
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
BiCGStabSolMgrLinearProblemFailure(const std::string &what_arg)
bool isParameter(const std::string &name) const
Teuchos::RCP< StatusTestOutput< ScalarType, MV, OP > > outputTest_
A Belos::StatusTest class for specifying a maximum number of iterations.
ResetType
How to reset the solver.
Definition: BelosTypes.hpp:174
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. ...
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)
bool is_null(const RCP< T > &p)
BiCGStabSolMgr()
Empty constructor for BiCGStabSolMgr. This constructor takes no arguments and sets the default values...
Teuchos::RCP< StatusTestGenResNorm< ScalarType, MV, OP > > convTest_
Teuchos::RCP< StatusTestMaxIters< ScalarType, MV, OP > > maxIterTest_
virtual ~BiCGStabSolMgr()
Destructor.
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
Teuchos::RCP< std::ostream > outputStream_
BiCGStabSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i...
ReturnType solve() override
This method performs possibly repeated calls to the underlying linear solver&#39;s iterate() routine unti...
ReturnType
Whether the Belos solve converged for all linear systems.
Definition: BelosTypes.hpp:123
MultiVecTraits< ScalarType, MV > MVT
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
static constexpr const char * resScale_default_
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
Teuchos::RCP< Teuchos::Time > timerSolve_
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
static constexpr int defQuorum_default_
The Belos::BiCGStabSolMgr provides a powerful and fully-featured solver manager over the pseudo-block...
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.
std::string description() const override
Method to return description of the block BiCGStab solver manager.
static constexpr int verbosity_default_
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Teuchos::ScalarTraits< ScalarType > SCT
static constexpr int outputStyle_default_
bool isType(const std::string &name) const
Teuchos::RCP< OutputManager< ScalarType > > printer_
A class for extending the status testing capabilities of Belos via logical combinations.
Class which defines basic traits for the operator type.
Parent class to all Belos exceptions.
Definition: BelosTypes.hpp:28
int getNumIters() const override
Get the iteration count for the most recent call to solve().
Default parameters common to most Belos solvers.
Definition: BelosTypes.hpp:251
bool isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve...
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
Belos header file which uses auto-configuration information to include necessary C++ headers...
static constexpr const char * label_default_
Teuchos::RCP< Teuchos::ParameterList > params_
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
Belos concrete class for performing the pseudo-block BiCGStab iteration.