Belos  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
BelosFixedPointSolMgr.hpp
Go to the documentation of this file.
1 //@HEADER
2 // ************************************************************************
3 //
4 // Belos: Block Linear Solvers Package
5 // Copyright 2004 Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ************************************************************************
40 //@HEADER
41 
42 #ifndef BELOS_FIXEDPOINT_SOLMGR_HPP
43 #define BELOS_FIXEDPOINT_SOLMGR_HPP
44 
49 #include "BelosConfigDefs.hpp"
50 #include "BelosTypes.hpp"
51 
52 #include "BelosLinearProblem.hpp"
53 #include "BelosSolverManager.hpp"
54 
55 #include "BelosCGIter.hpp"
56 #include "BelosFixedPointIter.hpp"
59 #include "BelosStatusTestCombo.hpp"
61 #include "BelosOutputManager.hpp"
62 #ifdef BELOS_TEUCHOS_TIME_MONITOR
63 # include "Teuchos_TimeMonitor.hpp"
64 #endif
65 #include <algorithm>
66 
75 namespace Belos {
76 
78 
79 
87  FixedPointSolMgrLinearProblemFailure(const std::string& what_arg) : BelosError(what_arg)
88  {}};
89 
90  template<class ScalarType, class MV, class OP>
91  class FixedPointSolMgr : public SolverManager<ScalarType,MV,OP> {
92 
93  private:
97  typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
99 
100  public:
101 
103 
104 
111 
131 
133  virtual ~FixedPointSolMgr() {};
134 
138  }
140 
142 
143 
144  const LinearProblem<ScalarType,MV,OP>& getProblem() const override {
145  return *problem_;
146  }
147 
151 
155 
162  return Teuchos::tuple(timerSolve_);
163  }
164 
170  MagnitudeType achievedTol() const override {
171  return achievedTol_;
172  }
173 
175  int getNumIters() const override {
176  return numIters_;
177  }
178 
181  bool isLOADetected() const override { return false; }
183 
185 
186 
188  void setProblem( const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > &problem ) override { problem_ = problem; }
189 
191  void setParameters( const Teuchos::RCP<Teuchos::ParameterList> &params ) override;
192 
195  {
196 
197  convTest_ = userConvStatusTest;
198 
199  typedef Belos::StatusTestCombo<ScalarType,MV,OP> StatusTestCombo_t;
200  sTest_ = Teuchos::rcp( new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
201 
202  StatusTestOutputFactory<ScalarType,MV,OP> stoFactory( outputStyle_ );
203  outputTest_ = stoFactory.create( printer_, sTest_, outputFreq_, Passed+Failed+Undefined );
204 
205  std::string solverDesc = " Fixed Point ";
206  outputTest_->setSolverDesc( solverDesc );
207  }
208 
210 
212 
213 
217  void reset( const ResetType type ) override { if ((type & Belos::Problem) && !Teuchos::is_null(problem_)) problem_->setProblem(); }
219 
221 
222 
240  ReturnType solve() override;
242 
245 
247  std::string description() const override;
249 
250  private:
251 
254 
258  Teuchos::RCP<std::ostream> outputStream_;
259 
265 
268 
271 
274 
277 
278  //
279  // Default solver parameters.
280  //
281  static constexpr int maxIters_default_ = 1000;
282  static constexpr bool showMaxResNormOnly_default_ = false;
283  static constexpr int blockSize_default_ = 1;
284  static constexpr int verbosity_default_ = Belos::Errors;
285  static constexpr int outputStyle_default_ = Belos::General;
286  static constexpr int outputFreq_default_ = -1;
287  static constexpr const char * label_default_ = "Belos";
288 
289  //
290  // Current solver parameters and other values.
291  //
292 
294  MagnitudeType convtol_;
295 
301  MagnitudeType achievedTol_;
302 
304  int maxIters_;
305 
307  int numIters_;
308 
309  int blockSize_, verbosity_, outputStyle_, outputFreq_;
310  bool showMaxResNormOnly_;
311 
313  std::string label_;
314 
316  Teuchos::RCP<Teuchos::Time> timerSolve_;
317 
319  bool isSet_;
320  };
321 
322 
323 // Empty Constructor
324 template<class ScalarType, class MV, class OP>
326  outputStream_(Teuchos::rcpFromRef(std::cout)),
327  convtol_(DefaultSolverParameters::convTol),
328  achievedTol_(Teuchos::ScalarTraits<MagnitudeType>::zero()),
329  maxIters_(maxIters_default_),
330  numIters_(0),
331  blockSize_(blockSize_default_),
332  verbosity_(verbosity_default_),
333  outputStyle_(outputStyle_default_),
334  outputFreq_(outputFreq_default_),
335  showMaxResNormOnly_(showMaxResNormOnly_default_),
336  label_(label_default_),
337  isSet_(false)
338 {}
339 
340 
341 // Basic Constructor
342 template<class ScalarType, class MV, class OP>
346  problem_(problem),
347  outputStream_(Teuchos::rcpFromRef(std::cout)),
348  convtol_(DefaultSolverParameters::convTol),
349  achievedTol_(Teuchos::ScalarTraits<MagnitudeType>::zero()),
350  maxIters_(maxIters_default_),
351  numIters_(0),
352  blockSize_(blockSize_default_),
353  verbosity_(verbosity_default_),
354  outputStyle_(outputStyle_default_),
355  outputFreq_(outputFreq_default_),
356  showMaxResNormOnly_(showMaxResNormOnly_default_),
357  label_(label_default_),
358  isSet_(false)
359 {
360  TEUCHOS_TEST_FOR_EXCEPTION(problem_.is_null(), std::invalid_argument,
361  "FixedPointSolMgr's constructor requires a nonnull LinearProblem instance.");
362 
363  // If the user passed in a nonnull parameter list, set parameters.
364  // Otherwise, the next solve() call will use default parameters,
365  // unless the user calls setParameters() first.
366  if (! pl.is_null()) {
367  setParameters (pl);
368  }
369 }
370 
371 template<class ScalarType, class MV, class OP>
372 void
375 {
376  // Create the internal parameter list if one doesn't already exist.
377  if (params_ == Teuchos::null) {
378  params_ = Teuchos::rcp( new Teuchos::ParameterList(*getValidParameters()) );
379  }
380  else {
381  params->validateParameters(*getValidParameters());
382  }
383 
384  // Check for maximum number of iterations
385  if (params->isParameter("Maximum Iterations")) {
386  maxIters_ = params->get("Maximum Iterations",maxIters_default_);
387 
388  // Update parameter in our list and in status test.
389  params_->set("Maximum Iterations", maxIters_);
390  if (maxIterTest_!=Teuchos::null)
391  maxIterTest_->setMaxIters( maxIters_ );
392  }
393 
394  // Check for blocksize
395  if (params->isParameter("Block Size")) {
396  blockSize_ = params->get("Block Size",blockSize_default_);
397  TEUCHOS_TEST_FOR_EXCEPTION(blockSize_ <= 0, std::invalid_argument,
398  "Belos::FixedPointSolMgr: \"Block Size\" must be strictly positive.");
399 
400  // Update parameter in our list.
401  params_->set("Block Size", blockSize_);
402  }
403 
404  // Check to see if the timer label changed.
405  if (params->isParameter("Timer Label")) {
406  std::string tempLabel = params->get("Timer Label", label_default_);
407 
408  // Update parameter in our list and solver timer
409  if (tempLabel != label_) {
410  label_ = tempLabel;
411  params_->set("Timer Label", label_);
412  std::string solveLabel = label_ + ": FixedPointSolMgr total solve time";
413 #ifdef BELOS_TEUCHOS_TIME_MONITOR
414  timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
415 #endif
416  }
417  }
418 
419  // Check for a change in verbosity level
420  if (params->isParameter("Verbosity")) {
421  if (Teuchos::isParameterType<int>(*params,"Verbosity")) {
422  verbosity_ = params->get("Verbosity", verbosity_default_);
423  } else {
424  verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,"Verbosity");
425  }
426 
427  // Update parameter in our list.
428  params_->set("Verbosity", verbosity_);
429  if (printer_ != Teuchos::null)
430  printer_->setVerbosity(verbosity_);
431  }
432 
433  // Check for a change in output style
434  if (params->isParameter("Output Style")) {
435  if (Teuchos::isParameterType<int>(*params,"Output Style")) {
436  outputStyle_ = params->get("Output Style", outputStyle_default_);
437  } else {
438  outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,"Output Style");
439  }
440 
441  // Update parameter in our list.
442  params_->set("Output Style", outputStyle_);
443  outputTest_ = Teuchos::null;
444  }
445 
446  // output stream
447  if (params->isParameter("Output Stream")) {
448  outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,"Output Stream");
449 
450  // Update parameter in our list.
451  params_->set("Output Stream", outputStream_);
452  if (printer_ != Teuchos::null)
453  printer_->setOStream( outputStream_ );
454  }
455 
456  // frequency level
457  if (verbosity_ & Belos::StatusTestDetails) {
458  if (params->isParameter("Output Frequency")) {
459  outputFreq_ = params->get("Output Frequency", outputFreq_default_);
460  }
461 
462  // Update parameter in out list and output status test.
463  params_->set("Output Frequency", outputFreq_);
464  if (outputTest_ != Teuchos::null)
465  outputTest_->setOutputFrequency( outputFreq_ );
466  }
467 
468  // Create output manager if we need to.
469  if (printer_ == Teuchos::null) {
470  printer_ = Teuchos::rcp( new OutputManager<ScalarType>(verbosity_, outputStream_) );
471  }
472 
473  // Convergence
474  typedef Belos::StatusTestCombo<ScalarType,MV,OP> StatusTestCombo_t;
475  typedef Belos::StatusTestGenResNorm<ScalarType,MV,OP> StatusTestResNorm_t;
476 
477  // Check for convergence tolerance
478  if (params->isParameter("Convergence Tolerance")) {
479  if (params->isType<MagnitudeType> ("Convergence Tolerance")) {
480  convtol_ = params->get ("Convergence Tolerance",
481  static_cast<MagnitudeType> (DefaultSolverParameters::convTol));
482  }
483  else {
484  convtol_ = params->get ("Convergence Tolerance", DefaultSolverParameters::convTol);
485  }
486 
487  // Update parameter in our list and residual tests.
488  params_->set("Convergence Tolerance", convtol_);
489  if (convTest_ != Teuchos::null)
490  convTest_->setTolerance( convtol_ );
491  }
492 
493  if (params->isParameter("Show Maximum Residual Norm Only")) {
494  showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,"Show Maximum Residual Norm Only");
495 
496  // Update parameter in our list and residual tests
497  params_->set("Show Maximum Residual Norm Only", showMaxResNormOnly_);
498  if (convTest_ != Teuchos::null)
499  convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
500  }
501 
502  // Create status tests if we need to.
503 
504  // Basic test checks maximum iterations and native residual.
505  if (maxIterTest_ == Teuchos::null)
506  maxIterTest_ = Teuchos::rcp( new StatusTestMaxIters<ScalarType,MV,OP>( maxIters_ ) );
507 
508  // Implicit residual test, using the native residual to determine if convergence was achieved.
509  if (convTest_ == Teuchos::null)
510  convTest_ = Teuchos::rcp( new StatusTestResNorm_t( convtol_, 1 ) );
511 
512  if (sTest_ == Teuchos::null)
513  sTest_ = Teuchos::rcp( new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
514 
515  if (outputTest_ == Teuchos::null) {
516 
517  // Create the status test output class.
518  // This class manages and formats the output from the status test.
519  StatusTestOutputFactory<ScalarType,MV,OP> stoFactory( outputStyle_ );
520  outputTest_ = stoFactory.create( printer_, sTest_, outputFreq_, Passed+Failed+Undefined );
521 
522  // Set the solver string for the output test
523  std::string solverDesc = " Fixed Point ";
524  outputTest_->setSolverDesc( solverDesc );
525 
526  }
527 
528  // Create the timer if we need to.
529  if (timerSolve_ == Teuchos::null) {
530  std::string solveLabel = label_ + ": FixedPointSolMgr total solve time";
531 #ifdef BELOS_TEUCHOS_TIME_MONITOR
532  timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
533 #endif
534  }
535 
536  // Inform the solver manager that the current parameters were set.
537  isSet_ = true;
538 }
539 
540 
541 template<class ScalarType, class MV, class OP>
544 {
546 
547  // Set all the valid parameters and their default values.
548  if(is_null(validPL)) {
549  Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
550 
551  // The static_cast is to resolve an issue with older clang versions which
552  // would cause the constexpr to link fail. With c++17 the problem is resolved.
553  pl->set("Convergence Tolerance", static_cast<MagnitudeType>(DefaultSolverParameters::convTol),
554  "The relative residual tolerance that needs to be achieved by the\n"
555  "iterative solver in order for the linear system to be declared converged.");
556  pl->set("Maximum Iterations", static_cast<int>(maxIters_default_),
557  "The maximum number of block iterations allowed for each\n"
558  "set of RHS solved.");
559  pl->set("Block Size", static_cast<int>(blockSize_default_),
560  "The number of vectors in each block.");
561  pl->set("Verbosity", static_cast<int>(verbosity_default_),
562  "What type(s) of solver information should be outputted\n"
563  "to the output stream.");
564  pl->set("Output Style", static_cast<int>(outputStyle_default_),
565  "What style is used for the solver information outputted\n"
566  "to the output stream.");
567  pl->set("Output Frequency", static_cast<int>(outputFreq_default_),
568  "How often convergence information should be outputted\n"
569  "to the output stream.");
570  pl->set("Output Stream", Teuchos::rcpFromRef(std::cout),
571  "A reference-counted pointer to the output stream where all\n"
572  "solver output is sent.");
573  pl->set("Show Maximum Residual Norm Only", static_cast<bool>(showMaxResNormOnly_default_),
574  "When convergence information is printed, only show the maximum\n"
575  "relative residual norm when the block size is greater than one.");
576  pl->set("Timer Label", static_cast<const char *>(label_default_),
577  "The string to use as a prefix for the timer labels.");
578  validPL = pl;
579  }
580  return validPL;
581 }
582 
583 
584 // solve()
585 template<class ScalarType, class MV, class OP>
587  using Teuchos::RCP;
588  using Teuchos::rcp;
589  using Teuchos::rcp_const_cast;
590  using Teuchos::rcp_dynamic_cast;
591 
592  // Set the current parameters if they were not set before. NOTE:
593  // This may occur if the user generated the solver manager with the
594  // default constructor and then didn't set any parameters using
595  // setParameters().
596  if (!isSet_) {
597  setParameters(Teuchos::parameterList(*getValidParameters()));
598  }
599 
600  TEUCHOS_TEST_FOR_EXCEPTION( !problem_->isProblemSet(),
602  "Belos::FixedPointSolMgr::solve(): Linear problem is not ready, setProblem() "
603  "has not been called.");
604 
605  // Create indices for the linear systems to be solved.
606  int startPtr = 0;
607  int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
608  int numCurrRHS = ( numRHS2Solve < blockSize_) ? numRHS2Solve : blockSize_;
609 
610  std::vector<int> currIdx, currIdx2;
611  currIdx.resize( blockSize_ );
612  currIdx2.resize( blockSize_ );
613  for (int i=0; i<numCurrRHS; ++i)
614  { currIdx[i] = startPtr+i; currIdx2[i]=i; }
615  for (int i=numCurrRHS; i<blockSize_; ++i)
616  { currIdx[i] = -1; currIdx2[i] = i; }
617 
618  // Inform the linear problem of the current linear system to solve.
619  problem_->setLSIndex( currIdx );
620 
622  // Set up the parameter list for the Iteration subclass.
624  plist.set("Block Size",blockSize_);
625 
626  // Reset the output status test (controls all the other status tests).
627  outputTest_->reset();
628 
629  // Assume convergence is achieved, then let any failed convergence
630  // set this to false. "Innocent until proven guilty."
631  bool isConverged = true;
632 
634  // Set up the FixedPoint Iteration subclass.
635 
636  RCP<FixedPointIteration<ScalarType,MV,OP> > block_fp_iter;
637  block_fp_iter = rcp (new FixedPointIter<ScalarType,MV,OP> (problem_, printer_, outputTest_, plist));
638 
639  // Enter solve() iterations
640  {
641 #ifdef BELOS_TEUCHOS_TIME_MONITOR
642  Teuchos::TimeMonitor slvtimer(*timerSolve_);
643 #endif
644 
645  while ( numRHS2Solve > 0 ) {
646  //
647  // Reset the active / converged vectors from this block
648  std::vector<int> convRHSIdx;
649  std::vector<int> currRHSIdx( currIdx );
650  currRHSIdx.resize(numCurrRHS);
651 
652  // Reset the number of iterations.
653  block_fp_iter->resetNumIters();
654 
655  // Reset the number of calls that the status test output knows about.
656  outputTest_->resetNumCalls();
657 
658  // Get the current residual for this block of linear systems.
659  RCP<MV> R_0 = MVT::CloneViewNonConst( *(rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
660 
661  // Set the new state and initialize the solver.
663  newstate.R = R_0;
664  block_fp_iter->initializeFixedPoint(newstate);
665 
666  while(1) {
667 
668  // tell block_fp_iter to iterate
669  try {
670  block_fp_iter->iterate();
671  //
672  // Check whether any of the linear systems converged.
673  //
674  if (convTest_->getStatus() == Passed) {
675  // At least one of the linear system(s) converged.
676  //
677  // Get the column indices of the linear systems that converged.
678  std::vector<int> convIdx = convTest_->convIndices();
679 
680  // If the number of converged linear systems equals the
681  // number of linear systems currently being solved, then
682  // we are done with this block.
683  if (convIdx.size() == currRHSIdx.size())
684  break; // break from while(1){block_fp_iter->iterate()}
685 
686  // Inform the linear problem that we are finished with
687  // this current linear system.
688  problem_->setCurrLS();
689 
690  // Reset currRHSIdx to contain the right-hand sides that
691  // are left to converge for this block.
692  int have = 0;
693  std::vector<int> unconvIdx(currRHSIdx.size());
694  for (unsigned int i=0; i<currRHSIdx.size(); ++i) {
695  bool found = false;
696  for (unsigned int j=0; j<convIdx.size(); ++j) {
697  if (currRHSIdx[i] == convIdx[j]) {
698  found = true;
699  break;
700  }
701  }
702  if (!found) {
703  currIdx2[have] = currIdx2[i];
704  currRHSIdx[have++] = currRHSIdx[i];
705  }
706  else {
707  }
708  }
709  currRHSIdx.resize(have);
710  currIdx2.resize(have);
711 
712  // Set the remaining indices after deflation.
713  problem_->setLSIndex( currRHSIdx );
714 
715  // Get the current residual vector.
716  std::vector<MagnitudeType> norms;
717  R_0 = MVT::CloneCopy( *(block_fp_iter->getNativeResiduals(&norms)),currIdx2 );
718  for (int i=0; i<have; ++i) { currIdx2[i] = i; }
719 
720  // Set the new blocksize for the solver.
721  block_fp_iter->setBlockSize( have );
722 
723  // Set the new state and initialize the solver.
725  defstate.R = R_0;
726  block_fp_iter->initializeFixedPoint(defstate);
727  }
728  //
729  // None of the linear systems converged. Check whether the
730  // maximum iteration count was reached.
731  //
732  else if (maxIterTest_->getStatus() == Passed) {
733  isConverged = false; // None of the linear systems converged.
734  break; // break from while(1){block_fp_iter->iterate()}
735  }
736  //
737  // iterate() returned, but none of our status tests Passed.
738  // This indicates a bug.
739  //
740  else {
741  TEUCHOS_TEST_FOR_EXCEPTION(true,std::logic_error,
742  "Belos::FixedPointSolMgr::solve(): Neither the convergence test nor "
743  "the maximum iteration count test passed. Please report this bug "
744  "to the Belos developers.");
745  }
746  }
747  catch (const StatusTestNaNError& e) {
748  // A NaN was detected in the solver. Set the solution to zero and return unconverged.
749  achievedTol_ = MT::one();
750  Teuchos::RCP<MV> X = problem_->getLHS();
751  MVT::MvInit( *X, SCT::zero() );
752  printer_->stream(Warnings) << "Belos::FixedPointSolMgr::solve(): Warning! NaN has been detected!"
753  << std::endl;
754  return Unconverged;
755  }
756  catch (const std::exception &e) {
757  std::ostream& err = printer_->stream (Errors);
758  err << "Error! Caught std::exception in FixedPointIteration::iterate() at "
759  << "iteration " << block_fp_iter->getNumIters() << std::endl
760  << e.what() << std::endl;
761  throw;
762  }
763  }
764 
765  // Inform the linear problem that we are finished with this
766  // block linear system.
767  problem_->setCurrLS();
768 
769  // Update indices for the linear systems to be solved.
770  startPtr += numCurrRHS;
771  numRHS2Solve -= numCurrRHS;
772  if ( numRHS2Solve > 0 ) {
773  numCurrRHS = ( numRHS2Solve < blockSize_) ? numRHS2Solve : blockSize_;
774 
775 
776  currIdx.resize( blockSize_ );
777  currIdx2.resize( blockSize_ );
778  for (int i=0; i<numCurrRHS; ++i)
779  { currIdx[i] = startPtr+i; currIdx2[i] = i; }
780  for (int i=numCurrRHS; i<blockSize_; ++i)
781  { currIdx[i] = -1; currIdx2[i] = i; }
782 
783  // Set the next indices.
784  problem_->setLSIndex( currIdx );
785 
786  // Set the new blocksize for the solver.
787  block_fp_iter->setBlockSize( blockSize_ );
788  }
789  else {
790  currIdx.resize( numRHS2Solve );
791  }
792 
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() requires communication in general, so don't
803  // call it unless the user wants to print out timing details.
804  // summarize() will do all the work even if it's passed a "black
805  // hole" output stream.
806  if (verbosity_ & TimingDetails) {
807  Teuchos::TimeMonitor::summarize( printer_->stream(TimingDetails) );
808  }
809 #endif
810 
811  // Save the iteration count for this solve.
812  numIters_ = maxIterTest_->getNumIters();
813 
814  // Save the convergence test value ("achieved tolerance") for this solve.
815  {
816  // testValues is nonnull and not persistent.
817  const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
818 
819  TEUCHOS_TEST_FOR_EXCEPTION(pTestValues == NULL, std::logic_error,
820  "Belos::FixedPointSolMgr::solve(): The convergence test's getTestValue() "
821  "method returned NULL. Please report this bug to the Belos developers.");
822 
823  TEUCHOS_TEST_FOR_EXCEPTION(pTestValues->size() < 1, std::logic_error,
824  "Belos::FixedPointSolMgr::solve(): The convergence test's getTestValue() "
825  "method returned a vector of length zero. Please report this bug to the "
826  "Belos developers.");
827 
828  // FIXME (mfh 12 Dec 2011) Does pTestValues really contain the
829  // achieved tolerances for all vectors in the current solve(), or
830  // just for the vectors from the last deflation?
831  achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
832  }
833 
834  if (!isConverged) {
835  return Unconverged; // return from FixedPointSolMgr::solve()
836  }
837  return Converged; // return from FixedPointSolMgr::solve()
838 }
839 
840 // This method requires the solver manager to return a std::string that describes itself.
841 template<class ScalarType, class MV, class OP>
843 {
844  std::ostringstream oss;
845  oss << "Belos::FixedPointSolMgr<...,"<<Teuchos::ScalarTraits<ScalarType>::name()<<">";
846  return oss.str();
847 }
848 
849 } // end Belos namespace
850 
851 #endif /* BELOS_FIXEDPOINT_SOLMGR_HPP */
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...
The Belos::FixedPointSolMgr provides a powerful and fully-featured solver manager over the FixedPoint...
Class which manages the output and verbosity of the Belos solvers.
bool is_null(const boost::shared_ptr< T > &p)
Belos concrete class for performing fixed point iteration iteration.
FixedPointSolMgr()
Empty constructor for FixedPointSolMgr. This constructor takes no arguments and sets the default valu...
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)
static RCP< Time > getNewCounter(const std::string &name)
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.
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const override
Get a parameter list containing the current parameters for this object.
An abstract class of StatusTest for stopping criteria using residual norms.
An implementation of StatusTestResNorm using a family of residual norms.
static const double convTol
Default convergence tolerance.
Definition: BelosTypes.hpp:293
Belos::StatusTest class for specifying a maximum number of iterations.
static std::string name()
A factory class for generating StatusTestOutput objects.
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > &params) override
Set the parameters the solver manager should use to solve the linear problem.
bool isParameter(const std::string &name) const
Teuchos::RCP< SolverManager< ScalarType, MV, OP > > clone() const override
clone for Inverted Injection (DII)
A Belos::StatusTest class for specifying a maximum number of iterations.
ResetType
How to reset the solver.
Definition: BelosTypes.hpp:206
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 isLOADetected() const override
Return whether a loss of accuracy was detected by this solver during the most current solve...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Get a parameter list containing the valid parameters for this object.
virtual ~FixedPointSolMgr()
Destructor.
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
std::string description() const override
Method to return description of the block CG solver manager.
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:155
void replaceUserConvStatusTest(const Teuchos::RCP< StatusTestResNorm< ScalarType, MV, OP > > &userConvStatusTest)
Set user-defined convergence status test.
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
Teuchos::RCP< const MV > R
The current residual.
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem) override
Set the linear problem that needs to be solved.
FixedPointSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i...
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
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.
Structure to contain pointers to FixedPointIteration state variables.
FixedPointSolMgrLinearProblemFailure(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.
int getNumIters() const override
Get the iteration count for the most recent call to solve().
Class which defines basic traits for the operator type.
Parent class to all Belos exceptions.
Definition: BelosTypes.hpp:60
Default parameters common to most Belos solvers.
Definition: BelosTypes.hpp:283
MagnitudeType achievedTol() const override
Tolerance achieved by the last solve() invocation.
Belos header file which uses auto-configuration information to include necessary C++ headers...
This class implements the preconditioned fixed point iteration.
const LinearProblem< ScalarType, MV, OP > & getProblem() const override
Return a reference to the linear problem being solved by this solver manager.
bool is_null() const

Generated on Thu Apr 25 2024 09:24:16 for Belos by doxygen 1.8.5