Belos Version of the Day
Loading...
Searching...
No Matches
BelosMinresSolMgr.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_MINRES_SOLMGR_HPP
11#define BELOS_MINRES_SOLMGR_HPP
12
15
16#include "BelosConfigDefs.hpp"
17#include "BelosTypes.hpp"
18
21
22#include "BelosMinresIter.hpp"
30
31#ifdef BELOS_TEUCHOS_TIME_MONITOR
32#include "Teuchos_TimeMonitor.hpp"
33#endif
34
35#include "Teuchos_StandardParameterEntryValidators.hpp"
36// Teuchos::ScalarTraits<int> doesn't define rmax(), alas, so we get
37// INT_MAX from here.
38#include <climits>
39
40namespace Belos {
41
43
44
54 //
59 public:
63 };
64
83 template<class ScalarType, class MV, class OP, class DM = DefaultDenseMatrix<int,ScalarType>>
84 class MinresSolMgr : public SolverManager<ScalarType,MV,OP,DM> {
85
86 private:
89 typedef Teuchos::ScalarTraits<ScalarType> SCT;
90 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
91 typedef Teuchos::ScalarTraits< MagnitudeType > MST;
92
93 public:
94
106 static Teuchos::RCP<const Teuchos::ParameterList> defaultParameters();
107
109
110
119 MinresSolMgr();
120
153 const Teuchos::RCP<Teuchos::ParameterList> &params);
154
156 virtual ~MinresSolMgr() {};
157
159 Teuchos::RCP<SolverManager<ScalarType, MV, OP, DM> > clone () const override {
160 return Teuchos::rcp(new MinresSolMgr<ScalarType,MV,OP,DM>);
161 }
163
165
166
169 return *problem_;
170 }
171
173 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const override {
174 if (defaultParams_.is_null()) {
175 defaultParams_ = defaultParameters ();
176 }
177 return defaultParams_;
178 }
179
181 Teuchos::RCP<const Teuchos::ParameterList> getCurrentParameters() const override {
182 return params_;
183 }
184
194 Teuchos::Array<Teuchos::RCP<Teuchos::Time> > getTimers() const {
195 return Teuchos::tuple (timerSolve_);
196 }
197
203 MagnitudeType achievedTol() const override {
204 return achievedTol_;
205 }
206
208 int getNumIters() const override {
209 return numIters_;
210 }
211
217 bool isLOADetected() const override { return false; }
218
220
222
223
224 void
226 {
227 problem_ = problem;
228 }
229
230 void
231 setParameters (const Teuchos::RCP<Teuchos::ParameterList>& params) override;
232
234
236
237
238 void
239 reset (const ResetType type) override
240 {
241 if ((type & Belos::Problem) && ! problem_.is_null()) {
242 problem_->setProblem ();
243 }
244 }
246
248
249
267 ReturnType solve() override;
268
270
273
274 std::string description() const override;
275
277
278 private:
280 Teuchos::RCP<LinearProblem<ScalarType,MV,OP,DM> > problem_;
281
283 Teuchos::RCP<OutputManager<ScalarType> > printer_;
284 Teuchos::RCP<std::ostream> outputStream_;
285
292 Teuchos::RCP<StatusTest<ScalarType,MV,OP,DM> > sTest_;
293
297 Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP,DM> > maxIterTest_;
298
302 Teuchos::RCP<StatusTest<ScalarType,MV,OP,DM> > convTest_;
303
307 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP,DM> > impConvTest_;
308
312 Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP,DM> > expConvTest_;
313
318 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP,DM> > outputTest_;
319
323 mutable Teuchos::RCP<const Teuchos::ParameterList> defaultParams_;
324
326 Teuchos::RCP<Teuchos::ParameterList> params_;
327
329 MagnitudeType convtol_;
330
332 MagnitudeType achievedTol_;
333
335 int maxIters_;
336
338 int numIters_;
339
341 int blockSize_;
342
344 int verbosity_;
345
347 int outputStyle_;
348
350 int outputFreq_;
351
353 std::string label_;
354
356 Teuchos::RCP<Teuchos::Time> timerSolve_;
357
359 bool parametersSet_;
360
366 static void
367 validateProblem (const Teuchos::RCP<LinearProblem<ScalarType, MV, OP, DM> >& problem);
368 };
369
370
371 template<class ScalarType, class MV, class OP, class DM>
372 Teuchos::RCP<const Teuchos::ParameterList>
374 {
375 using Teuchos::ParameterList;
376 using Teuchos::parameterList;
377 using Teuchos::RCP;
378 using Teuchos::rcp;
379 using Teuchos::rcpFromRef;
380 using Teuchos::EnhancedNumberValidator;
381 typedef MagnitudeType MT;
382
383 // List of parameters accepted by MINRES, and their default values.
385
386 pl->set ("Convergence Tolerance", MST::squareroot (MST::eps()),
387 "Relative residual tolerance that needs to be achieved by "
388 "the iterative solver, in order for the linear system to be "
389 "declared converged.",
390 rcp (new EnhancedNumberValidator<MT> (MST::zero(), MST::rmax())));
391 pl->set ("Maximum Iterations", static_cast<int>(1000),
392 "Maximum number of iterations allowed for each right-hand "
393 "side solved.",
395 pl->set ("Num Blocks", static_cast<int> (-1),
396 "Ignored, but permitted, for compatibility with other Belos "
397 "solvers.");
398 pl->set ("Block Size", static_cast<int> (1),
399 "Number of vectors in each block. WARNING: The current "
400 "implementation of MINRES only accepts a block size of 1, "
401 "since it can only solve for 1 right-hand side at a time.",
402 rcp (new EnhancedNumberValidator<int> (1, 1)));
403 pl->set ("Verbosity", (int) Belos::Errors,
404 "The type(s) of solver information that should "
405 "be written to the output stream.");
406 pl->set ("Output Style", (int) Belos::General,
407 "What style is used for the solver information written "
408 "to the output stream.");
409 pl->set ("Output Frequency", static_cast<int>(-1),
410 "How often (in terms of number of iterations) intermediate "
411 "convergence information should be written to the output stream."
412 " -1 means never.");
413 pl->set ("Output Stream", rcpFromRef(std::cout),
414 "A reference-counted pointer to the output stream where all "
415 "solver output is sent. The output stream defaults to stdout.");
416 pl->set ("Timer Label", std::string("Belos"),
417 "The string to use as a prefix for the timer labels.");
418 return pl;
419 }
420
421 //
422 // Empty Constructor
423 //
424 template<class ScalarType, class MV, class OP, class DM>
426 convtol_(0.0),
427 achievedTol_(0.0),
428 maxIters_(0),
429 numIters_ (0),
430 blockSize_(0),
431 verbosity_(0),
432 outputStyle_(0),
433 outputFreq_(0),
434 parametersSet_ (false)
435 {}
436
437 //
438 // Primary constructor (use this one)
439 //
440 template<class ScalarType, class MV, class OP, class DM>
443 const Teuchos::RCP<Teuchos::ParameterList>& params) :
444 problem_ (problem),
445 numIters_ (0),
446 parametersSet_ (false)
447 {
448 TEUCHOS_TEST_FOR_EXCEPTION(problem_.is_null(), std::invalid_argument,
449 "MinresSolMgr: The version of the constructor "
450 "that takes a LinearProblem to solve was given a "
451 "null LinearProblem.");
453 }
454
455 template<class ScalarType, class MV, class OP, class DM>
458 {
461 "MINRES requires that you have provided a nonnull LinearProblem to the "
462 "solver manager, before you call the solve() method.");
463 TEUCHOS_TEST_FOR_EXCEPTION(problem->getOperator().is_null(),
465 "MINRES requires a LinearProblem object with a non-null operator (the "
466 "matrix A).");
467 TEUCHOS_TEST_FOR_EXCEPTION(problem->getRHS().is_null(),
469 "MINRES requires a LinearProblem object with a non-null right-hand side.");
470 TEUCHOS_TEST_FOR_EXCEPTION( ! problem->isProblemSet(),
472 "MINRES requires that before you give it a LinearProblem to solve, you "
473 "must first call the linear problem's setProblem() method.");
474 }
475
476 template<class ScalarType, class MV, class OP, class DM>
478 setParameters (const Teuchos::RCP<Teuchos::ParameterList>& params)
479 {
480 using Teuchos::ParameterList;
481 using Teuchos::parameterList;
482 using Teuchos::RCP;
483 using Teuchos::rcp;
484 using Teuchos::rcpFromRef;
485 using Teuchos::null;
486 using Teuchos::is_null;
487 using std::string;
488 using std::ostream;
489 using std::endl;
490
491 if (params_.is_null()) {
492 params_ = parameterList (*getValidParameters());
493 }
495 pl->validateParametersAndSetDefaults (*params_);
496
497 //
498 // Read parameters from the parameter list. We have already
499 // populated it with defaults.
500 //
501 blockSize_ = pl->get<int> ("Block Size");
502 verbosity_ = pl->get<int> ("Verbosity");
503 outputStyle_ = pl->get<int> ("Output Style");
504 outputFreq_ = pl->get<int>("Output Frequency");
505 outputStream_ = pl->get<RCP<std::ostream> > ("Output Stream");
506 convtol_ = pl->get<MagnitudeType> ("Convergence Tolerance");
507 maxIters_ = pl->get<int> ("Maximum Iterations");
508 //
509 // All done reading parameters from the parameter list.
510 // Now we know it's valid and we can store it.
511 //
512 params_ = pl;
513
514 // Change the timer label, and create the timer if necessary.
515 const string newLabel = pl->get<string> ("Timer Label");
516 {
517 if (newLabel != label_ || timerSolve_.is_null()) {
518 label_ = newLabel;
519#ifdef BELOS_TEUCHOS_TIME_MONITOR
520 const string solveLabel = label_ + ": MinresSolMgr total solve time";
521 // Unregister the old timer before creating a new one.
522 if (! timerSolve_.is_null()) {
523 Teuchos::TimeMonitor::clearCounter (label_);
524 timerSolve_ = Teuchos::null;
525 }
526 timerSolve_ = Teuchos::TimeMonitor::getNewCounter (solveLabel);
527#endif // BELOS_TEUCHOS_TIME_MONITOR
528 }
529 }
530
531 // Create output manager, if necessary; otherwise, set its parameters.
532 bool recreatedPrinter = false;
533 if (printer_.is_null()) {
534 printer_ = rcp (new OutputManager<ScalarType> (verbosity_, outputStream_));
535 recreatedPrinter = true;
536 } else {
537 // Set the output stream's verbosity level.
538 printer_->setVerbosity (verbosity_);
539 // Tell the output manager about the new output stream.
540 printer_->setOStream (outputStream_);
541 }
542
543 //
544 // Set up the convergence tests
545 //
548
549 // Do we need to allocate at least one of the implicit or explicit
550 // residual norm convergence tests?
551 const bool allocatedConvergenceTests =
552 impConvTest_.is_null() || expConvTest_.is_null();
553
554 // Allocate or set the tolerance of the implicit residual norm
555 // convergence test.
556 if (impConvTest_.is_null()) {
557 impConvTest_ = rcp (new res_norm_type (convtol_));
558 impConvTest_->defineResForm (res_norm_type::Implicit, TwoNorm);
559 // TODO (mfh 03 Nov 2011) Allow users to define the type of
560 // scaling (or a custom scaling factor).
561 impConvTest_->defineScaleForm (NormOfInitRes, TwoNorm);
562 } else {
563 impConvTest_->setTolerance (convtol_);
564 }
565
566 // Allocate or set the tolerance of the explicit residual norm
567 // convergence test.
568 if (expConvTest_.is_null()) {
569 expConvTest_ = rcp (new res_norm_type (convtol_));
570 expConvTest_->defineResForm (res_norm_type::Explicit, TwoNorm);
571 // TODO (mfh 03 Nov 2011) Allow users to define the type of
572 // scaling (or a custom scaling factor).
573 expConvTest_->defineScaleForm (NormOfInitRes, TwoNorm);
574 } else {
575 expConvTest_->setTolerance (convtol_);
576 }
577
578 // Whether we need to recreate the full status test. We only need
579 // to do that if at least one of convTest_ or maxIterTest_ had to
580 // be reallocated.
581 bool needToRecreateFullStatusTest = sTest_.is_null();
582
583 // Residual status test is a combo of the implicit and explicit
584 // convergence tests.
585 if (convTest_.is_null() || allocatedConvergenceTests) {
586 convTest_ = rcp (new combo_type (combo_type::SEQ, impConvTest_, expConvTest_));
588 }
589
590 // Maximum number of iterations status test. It tells the solver to
591 // stop iteration, if the maximum number of iterations has been
592 // exceeded. Initialize it if we haven't yet done so, otherwise
593 // tell it the new maximum number of iterations.
594 if (maxIterTest_.is_null()) {
595 maxIterTest_ = rcp (new StatusTestMaxIters<ScalarType,MV,OP,DM> (maxIters_));
597 } else {
598 maxIterTest_->setMaxIters (maxIters_);
599 }
600
601 // Create the full status test if we need to.
602 //
603 // The full status test: the maximum number of iterations have
604 // been reached, OR the residual has converged.
605 //
606 // "If we need to" means either that the status test was never
607 // created before, or that its two component tests had to be
608 // reallocated.
610 sTest_ = rcp (new combo_type (combo_type::OR, maxIterTest_, convTest_));
611 }
612
613 // If necessary, create the status test output class. This class
614 // manages and formats the output from the status test. We have
615 // to recreate the output test if we had to (re)allocate either
616 // printer_ or sTest_.
617 if (outputTest_.is_null() || needToRecreateFullStatusTest || recreatedPrinter) {
619 outputTest_ = stoFactory.create (printer_, sTest_, outputFreq_,
621 } else {
622 outputTest_->setOutputFrequency (outputFreq_);
623 }
624 // Set the solver string for the output test.
625 // StatusTestOutputFactory has no constructor argument for this.
626 outputTest_->setSolverDesc (std::string (" MINRES "));
627
628 // Inform the solver manager that the current parameters were set.
629 parametersSet_ = true;
630
631 if (verbosity_ & Debug) {
632 using std::endl;
633
634 std::ostream& dbg = printer_->stream (Debug);
635 dbg << "MINRES parameters:" << endl << params_ << endl;
636 }
637 }
638
639
640 template<class ScalarType, class MV, class OP, class DM>
642 {
643 using Teuchos::RCP;
644 using Teuchos::rcp;
645 using Teuchos::rcp_const_cast;
646 using std::endl;
647
649
650 if (! parametersSet_) {
651 setParameters (params_);
652 }
653 std::ostream& dbg = printer_->stream (Debug);
654
655#ifdef BELOS_TEUCHOS_TIME_MONITOR
656 Teuchos::TimeMonitor solveTimerMonitor (*timerSolve_);
657#endif // BELOS_TEUCHOS_TIME_MONITOR
658
659 // We need a problem to solve, else we can't solve it.
660 validateProblem (problem_);
661
662 // Reset the status test for this solve.
663 outputTest_->reset();
664
665 // The linear problem has this many right-hand sides to solve.
666 // MINRES can solve only one at a time, so we solve for each
667 // right-hand side in succession.
668 const int numRHS2Solve = MVT::GetNumberVecs (*(problem_->getRHS()));
669
670 // Create MINRES iteration object. Pass along the solver
671 // manager's parameters, which have already been validated.
674 rcp (new iter_type (problem_, printer_, outputTest_, *params_));
675
676 // The index/indices of the right-hand sides for which MINRES did
677 // _not_ converge. Hopefully this is empty after the for loop
678 // below! If it is not empty, at least one right-hand side did
679 // not converge.
680 std::vector<int> notConverged;
681 std::vector<int> currentIndices(1);
682
683 numIters_ = 0;
684
685 // Solve for each right-hand side in turn.
686 for (int currentRHS = 0; currentRHS < numRHS2Solve; ++currentRHS) {
687 // Inform the linear problem of the right-hand side(s) currently
688 // being solved. MINRES only knows how to solve linear problems
689 // with one right-hand side, so we only include one index, which
690 // is the index of the current right-hand side.
692 problem_->setLSIndex (currentIndices);
693
694 dbg << "-- Current right-hand side index being solved: "
695 << currentRHS << endl;
696
697 // Reset the number of iterations.
698 minres_iter->resetNumIters();
699 // Reset the number of calls that the status test output knows about.
700 outputTest_->resetNumCalls();
701 // Set the new state and initialize the solver.
703
704 // Get the residual vector for the current linear system
705 // (that is, for the current right-hand side).
706 newstate.Y = MVT::CloneViewNonConst (*(rcp_const_cast<MV> (problem_->getInitResVec())), currentIndices);
707 minres_iter->initializeMinres (newstate);
708
709 // Attempt to solve for the solution corresponding to the
710 // current right-hand side.
711 while (true) {
712 try {
713 minres_iter->iterate();
714
715 // First check for convergence
716 if (convTest_->getStatus() == Passed) {
717 dbg << "---- Converged after " << maxIterTest_->getNumIters()
718 << " iterations" << endl;
719 break;
720 }
721 // Now check for max # of iterations
722 else if (maxIterTest_->getStatus() == Passed) {
724 dbg << "---- Did not converge after " << maxIterTest_->getNumIters()
725 << " iterations" << endl;
726 // This right-hand side didn't converge!
727 notConverged.push_back (currentRHS);
728 break;
729 } else {
731 // If we get here, we returned from iterate(), but none of
732 // our status tests Passed. Something is wrong, and it is
733 // probably our fault.
734 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
735 "Belos::MinresSolMgr::solve(): iterations neither converged, "
736 "nor reached the maximum number of iterations " << maxIters_
737 << ". That means something went wrong.");
738 }
739 }
740 catch (const StatusTestNaNError& e) {
741 // A NaN was detected in the solver. Set the solution to zero and return unconverged.
743 achievedTol_ = MST::one();
744 Teuchos::RCP<MV> X = problem_->getLHS();
745 MVT::MvInit( *X, SCT::zero() );
746 printer_->stream(Warnings) << "Belos::MinresSolMgr::solve(): Warning! NaN has been detected!"
747 << std::endl;
748 return retType;
749 }
750 catch (const std::exception &e) {
752 printer_->stream (Errors)
753 << "Error! Caught std::exception in MinresIter::iterate() at "
754 << "iteration " << minres_iter->getNumIters() << endl
755 << e.what() << endl;
756 throw e;
757 }
758 }
759
760 // Inform the linear problem that we are finished with the
761 // current right-hand side. It may or may not have converged,
762 // but we don't try again if the first time didn't work.
763 problem_->setCurrLS();
764
765 // Get iteration information for this solve: total number of
766 // iterations for all right-hand sides.
767 numIters_ += maxIterTest_->getNumIters();
768 }
769
770 // Print final summary of the solution process
771 sTest_->print (printer_->stream (FinalSummary));
772
773 // Print timing information, if the corresponding compile-time and
774 // run-time options are enabled.
775#ifdef BELOS_TEUCHOS_TIME_MONITOR
776 // Calling summarize() can be expensive, so don't call unless the
777 // user wants to print out timing details. summarize() will do all
778 // the work even if it's passed a "black hole" output stream.
779 if (verbosity_ & TimingDetails) {
780 Teuchos::TimeMonitor::summarize (printer_->stream (TimingDetails));
781 }
782#endif // BELOS_TEUCHOS_TIME_MONITOR
783
784 // Save the convergence test value ("achieved tolerance") for this
785 // solve. This solver always has two residual norm status tests:
786 // an explicit and an implicit test. The master convergence test
787 // convTest_ is a SEQ combo of the implicit resp. explicit tests.
788 // If the implicit test never passes, then the explicit test won't
789 // ever be executed. This manifests as
790 // expConvTest_->getTestValue()->size() < 1. We deal with this
791 // case by using the values returned by
792 // impConvTest_->getTestValue().
793 {
794 const std::vector<MagnitudeType>* pTestValues = expConvTest_->getTestValue();
795 if (pTestValues == NULL || pTestValues->size() < 1) {
796 pTestValues = impConvTest_->getTestValue();
797 }
798 TEUCHOS_TEST_FOR_EXCEPTION(pTestValues == NULL, std::logic_error,
799 "Belos::MinresSolMgr::solve(): The implicit convergence test's getTestValue() "
800 "method returned NULL. Please report this bug to the Belos developers.");
801 TEUCHOS_TEST_FOR_EXCEPTION(pTestValues->size() < 1, std::logic_error,
802 "Belos::MinresSolMgr::solve(): The implicit convergence test's getTestValue() "
803 "method returned a vector of length zero. Please report this bug to the "
804 "Belos developers.");
805
806 // FIXME (mfh 12 Dec 2011) Does pTestValues really contain the
807 // achieved tolerances for all vectors in the current solve(), or
808 // just for the vectors from the last deflation?
809 achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
810 }
811
812 if (notConverged.size() > 0) {
813 return retType;
814 } else {
815 return Converged;
816 }
817 }
818
819 // This method requires the solver manager to return a std::string that describes itself.
820 template<class ScalarType, class MV, class OP, class DM>
822 {
823 std::ostringstream oss;
824 oss << "Belos::MinresSolMgr< "
825 << Teuchos::ScalarTraits<ScalarType>::name()
826 <<", MV, OP >";
827 // oss << "{";
828 // oss << "Block Size=" << blockSize_;
829 // oss << "}";
830 return oss.str();
831 }
832
833} // end Belos namespace
834
835#endif /* BELOS_MINRES_SOLMGR_HPP */
Belos header file which uses auto-configuration information to include necessary C++ headers.
Full specialization of Belos::DenseMatTraits for Kokkos::DualView with arbitrary scalarType....
Class which describes the linear problem to be solved by the iterative solver.
MINRES iteration implementation.
Class which manages the output and verbosity of the Belos solvers.
Pure virtual base class which describes the basic interface for a solver manager.
Belos::StatusTest for logically combining several status tests.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Belos::StatusTest class for specifying a maximum number of iterations.
A factory class for generating StatusTestOutput objects.
Full specialization of Belos::DenseMatTraits for Teuchos::SerialDenseMatrix with ordinal type int and...
Collection of types and exceptions used within the Belos solvers.
Parent class to all Belos exceptions.
MINRES linear solver solution manager.
static Teuchos::RCP< const Teuchos::ParameterList > defaultParameters()
List of valid MINRES parameters and their default values.
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
void reset(const ResetType type) override
Reset the solver manager.
bool isLOADetected() const override
Whether a loss of accuracy was detected in the solver.
virtual ~MinresSolMgr()
Destructor.
Teuchos::RCP< SolverManager< ScalarType, MV, OP, DM > > clone() const override
clone for Inverted Injection (DII)
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Return the list of current parameters for this object.
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return all timers for this object.
std::string description() const override
int getNumIters() const override
Get the iteration count for the most recent call to solve().
MinresSolMgr()
Default constructor.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Return the list of default parameters for this object.
ReturnType solve() override
Iterate until the status test tells us to stop.
const LinearProblem< ScalarType, MV, OP, DM > & getProblem() const override
Return the linear problem to be solved.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP, DM > > &problem) override
Set the linear problem that needs to be solved.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > &params) override
Set the parameters to use when solving the linear problem.
This subclass of std::exception may be thrown from the MinresSolMgr::solve() method.
MinresSolMgrLinearProblemFailure(const std::string &what_arg)
Alternative run-time polymorphic interface for operators.
Operator()
Default constructor (does nothing).
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
@ FinalSummary
@ TimingDetails
ReturnType
Whether the Belos solve converged for all linear systems.
@ NaNDetected
@ MaxItersReached
@ NonspecificException
@ InconsistentState
@ Undetermined
@ NormOfInitRes
ResetType
How to reset the solver.

Generated for Belos by doxygen 1.9.8