Belos  Version of the Day
BelosBiCGStabSolMgr.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_BICGSTAB_SOLMGR_HPP
43 #define BELOS_BICGSTAB_SOLMGR_HPP
44 
49 #include "BelosConfigDefs.hpp"
50 #include "BelosTypes.hpp"
51 
52 #include "BelosLinearProblem.hpp"
53 #include "BelosSolverManager.hpp"
54 
55 #include "BelosBiCGStabIter.hpp"
58 #include "BelosStatusTestCombo.hpp"
60 #include "BelosOutputManager.hpp"
61 #include "Teuchos_BLAS.hpp"
62 #include "Teuchos_LAPACK.hpp"
63 #ifdef BELOS_TEUCHOS_TIME_MONITOR
64 #include "Teuchos_TimeMonitor.hpp"
65 #endif
66 
83 namespace Belos {
84 
86 
87 
95  BiCGStabSolMgrLinearProblemFailure(const std::string& what_arg) : BelosError(what_arg)
96  {}};
97 
104  class BiCGStabSolMgrOrthoFailure : public BelosError {public:
105  BiCGStabSolMgrOrthoFailure(const std::string& what_arg) : BelosError(what_arg)
106  {}};
107 
108  template<class ScalarType, class MV, class OP>
109  class BiCGStabSolMgr : public SolverManager<ScalarType,MV,OP> {
110 
111  private:
114  typedef Teuchos::ScalarTraits<ScalarType> SCT;
115  typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
116  typedef Teuchos::ScalarTraits<MagnitudeType> MT;
117 
118  public:
119 
121 
122 
128  BiCGStabSolMgr();
129 
139  BiCGStabSolMgr( const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > &problem,
140  const Teuchos::RCP<Teuchos::ParameterList> &pl );
141 
143  virtual ~BiCGStabSolMgr() {};
145 
147 
148 
150  return *problem_;
151  }
152 
155  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
156 
159  Teuchos::RCP<const Teuchos::ParameterList> getCurrentParameters() const { return params_; }
160 
166  Teuchos::Array<Teuchos::RCP<Teuchos::Time> > getTimers() const {
167  return Teuchos::tuple(timerSolve_);
168  }
169 
170 
181  MagnitudeType achievedTol() const {
182  return achievedTol_;
183  }
184 
186  int getNumIters() const {
187  return numIters_;
188  }
189 
193  bool isLOADetected() const { return false; }
194 
196 
198 
199 
201  void setProblem( const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > &problem ) { problem_ = problem; }
202 
204  void setParameters( const Teuchos::RCP<Teuchos::ParameterList> &params );
205 
207 
209 
210 
214  void reset( const ResetType type ) { if ((type & Belos::Problem) && !Teuchos::is_null(problem_)) problem_->setProblem(); }
216 
218 
219 
237  ReturnType solve();
238 
240 
243 
245  std::string description() const;
246 
248  private:
249 
250  // Linear problem.
251  Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > problem_;
252 
253  // Output manager.
254  Teuchos::RCP<OutputManager<ScalarType> > printer_;
255  Teuchos::RCP<std::ostream> outputStream_;
256 
257  // Status test.
258  Teuchos::RCP<StatusTest<ScalarType,MV,OP> > sTest_;
259  Teuchos::RCP<StatusTestMaxIters<ScalarType,MV,OP> > maxIterTest_;
260  Teuchos::RCP<StatusTestGenResNorm<ScalarType,MV,OP> > convTest_;
261  Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP> > outputTest_;
262 
263  // Current parameter list.
264  Teuchos::RCP<Teuchos::ParameterList> params_;
265 
271  mutable Teuchos::RCP<const Teuchos::ParameterList> validParams_;
272 
273  // Default solver values.
274  static const MagnitudeType convtol_default_;
275  static const int maxIters_default_;
276  static const bool showMaxResNormOnly_default_;
277  static const int verbosity_default_;
278  static const int outputStyle_default_;
279  static const int outputFreq_default_;
280  static const int defQuorum_default_;
281  static const std::string resScale_default_;
282  static const std::string label_default_;
283  static const Teuchos::RCP<std::ostream> outputStream_default_;
284 
285  // Current solver values.
286  MagnitudeType convtol_,achievedTol_;
287  int maxIters_, numIters_;
288  int verbosity_, outputStyle_, outputFreq_, defQuorum_;
289  bool showMaxResNormOnly_;
290  std::string resScale_;
291 
292  // Timers.
293  std::string label_;
294  Teuchos::RCP<Teuchos::Time> timerSolve_;
295 
296  // Internal state variables.
297  bool isSet_;
298  };
299 
300 
301 // Default solver values.
302 template<class ScalarType, class MV, class OP>
303 const typename BiCGStabSolMgr<ScalarType,MV,OP>::MagnitudeType BiCGStabSolMgr<ScalarType,MV,OP>::convtol_default_ = 1e-8;
304 
305 template<class ScalarType, class MV, class OP>
307 
308 template<class ScalarType, class MV, class OP>
310 
311 template<class ScalarType, class MV, class OP>
313 
314 template<class ScalarType, class MV, class OP>
316 
317 template<class ScalarType, class MV, class OP>
319 
320 template<class ScalarType, class MV, class OP>
322 
323 template<class ScalarType, class MV, class OP>
324 const std::string BiCGStabSolMgr<ScalarType,MV,OP>::resScale_default_ = "Norm of Initial Residual";
325 
326 template<class ScalarType, class MV, class OP>
327 const std::string BiCGStabSolMgr<ScalarType,MV,OP>::label_default_ = "Belos";
328 
329 template<class ScalarType, class MV, class OP>
330 const Teuchos::RCP<std::ostream> BiCGStabSolMgr<ScalarType,MV,OP>::outputStream_default_ = Teuchos::rcp(&std::cout,false);
331 
332 // Empty Constructor
333 template<class ScalarType, class MV, class OP>
335  outputStream_(outputStream_default_),
336  convtol_(convtol_default_),
337  maxIters_(maxIters_default_),
338  numIters_(0),
339  verbosity_(verbosity_default_),
340  outputStyle_(outputStyle_default_),
341  outputFreq_(outputFreq_default_),
342  defQuorum_(defQuorum_default_),
343  showMaxResNormOnly_(showMaxResNormOnly_default_),
344  resScale_(resScale_default_),
345  label_(label_default_),
346  isSet_(false)
347 {}
348 
349 // Basic Constructor
350 template<class ScalarType, class MV, class OP>
352 BiCGStabSolMgr (const Teuchos::RCP<LinearProblem<ScalarType,MV,OP> > &problem,
353  const Teuchos::RCP<Teuchos::ParameterList> &pl ) :
354  problem_(problem),
355  outputStream_(outputStream_default_),
356  convtol_(convtol_default_),
357  maxIters_(maxIters_default_),
358  numIters_(0),
359  verbosity_(verbosity_default_),
360  outputStyle_(outputStyle_default_),
361  outputFreq_(outputFreq_default_),
362  defQuorum_(defQuorum_default_),
363  showMaxResNormOnly_(showMaxResNormOnly_default_),
364  resScale_(resScale_default_),
365  label_(label_default_),
366  isSet_(false)
367 {
368  TEUCHOS_TEST_FOR_EXCEPTION(
369  problem_.is_null (), std::invalid_argument,
370  "Belos::BiCGStabSolMgr two-argument constructor: "
371  "'problem' is null. You must supply a non-null Belos::LinearProblem "
372  "instance when calling this constructor.");
373 
374  if (! pl.is_null ()) {
375  // Set the parameters using the list that was passed in.
376  setParameters (pl);
377  }
378 }
379 
380 template<class ScalarType, class MV, class OP>
381 void BiCGStabSolMgr<ScalarType,MV,OP>::setParameters( const Teuchos::RCP<Teuchos::ParameterList> &params )
382 {
383  using Teuchos::ParameterList;
384  using Teuchos::parameterList;
385  using Teuchos::RCP;
386 
387  RCP<const ParameterList> defaultParams = getValidParameters();
388 
389  // Create the internal parameter list if one doesn't already exist.
390  if (params_.is_null()) {
391  params_ = parameterList (*defaultParams);
392  } else {
393  params->validateParameters (*defaultParams);
394  }
395 
396  // Check for maximum number of iterations
397  if (params->isParameter("Maximum Iterations")) {
398  maxIters_ = params->get("Maximum Iterations",maxIters_default_);
399 
400  // Update parameter in our list and in status test.
401  params_->set("Maximum Iterations", maxIters_);
402  if (maxIterTest_!=Teuchos::null)
403  maxIterTest_->setMaxIters( maxIters_ );
404  }
405 
406  // Check to see if the timer label changed.
407  if (params->isParameter("Timer Label")) {
408  std::string tempLabel = params->get("Timer Label", label_default_);
409 
410  // Update parameter in our list and solver timer
411  if (tempLabel != label_) {
412  label_ = tempLabel;
413  params_->set("Timer Label", label_);
414  std::string solveLabel = label_ + ": BiCGStabSolMgr total solve time";
415 #ifdef BELOS_TEUCHOS_TIME_MONITOR
416  timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
417 #endif
418  }
419  }
420 
421  // Check for a change in verbosity level
422  if (params->isParameter("Verbosity")) {
423  if (Teuchos::isParameterType<int>(*params,"Verbosity")) {
424  verbosity_ = params->get("Verbosity", verbosity_default_);
425  } else {
426  verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params,"Verbosity");
427  }
428 
429  // Update parameter in our list.
430  params_->set("Verbosity", verbosity_);
431  if (printer_ != Teuchos::null)
432  printer_->setVerbosity(verbosity_);
433  }
434 
435  // Check for a change in output style
436  if (params->isParameter("Output Style")) {
437  if (Teuchos::isParameterType<int>(*params,"Output Style")) {
438  outputStyle_ = params->get("Output Style", outputStyle_default_);
439  } else {
440  outputStyle_ = (int)Teuchos::getParameter<Belos::OutputType>(*params,"Output Style");
441  }
442 
443  // Reconstruct the convergence test if the explicit residual test is not being used.
444  params_->set("Output Style", outputStyle_);
445  outputTest_ = Teuchos::null;
446  }
447 
448  // output stream
449  if (params->isParameter("Output Stream")) {
450  outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params,"Output Stream");
451 
452  // Update parameter in our list.
453  params_->set("Output Stream", outputStream_);
454  if (printer_ != Teuchos::null)
455  printer_->setOStream( outputStream_ );
456  }
457 
458  // frequency level
459  if (verbosity_ & Belos::StatusTestDetails) {
460  if (params->isParameter("Output Frequency")) {
461  outputFreq_ = params->get("Output Frequency", outputFreq_default_);
462  }
463 
464  // Update parameter in out list and output status test.
465  params_->set("Output Frequency", outputFreq_);
466  if (outputTest_ != Teuchos::null)
467  outputTest_->setOutputFrequency( outputFreq_ );
468  }
469 
470  // Create output manager if we need to.
471  if (printer_ == Teuchos::null) {
472  printer_ = Teuchos::rcp( new OutputManager<ScalarType>(verbosity_, outputStream_) );
473  }
474 
475  // Convergence
476  typedef Belos::StatusTestCombo<ScalarType,MV,OP> StatusTestCombo_t;
477  typedef Belos::StatusTestGenResNorm<ScalarType,MV,OP> StatusTestResNorm_t;
478 
479  // Check for convergence tolerance
480  if (params->isParameter("Convergence Tolerance")) {
481  convtol_ = params->get("Convergence Tolerance",convtol_default_);
482 
483  // Update parameter in our list and residual tests.
484  params_->set("Convergence Tolerance", convtol_);
485  if (convTest_ != Teuchos::null)
486  convTest_->setTolerance( convtol_ );
487  }
488 
489  if (params->isParameter("Show Maximum Residual Norm Only")) {
490  showMaxResNormOnly_ = Teuchos::getParameter<bool>(*params,"Show Maximum Residual Norm Only");
491 
492  // Update parameter in our list and residual tests
493  params_->set("Show Maximum Residual Norm Only", showMaxResNormOnly_);
494  if (convTest_ != Teuchos::null)
495  convTest_->setShowMaxResNormOnly( showMaxResNormOnly_ );
496  }
497 
498  // Check for a change in scaling, if so we need to build new residual tests.
499  bool newResTest = false;
500  {
501  // "Residual Scaling" is the old parameter name; "Implicit
502  // Residual Scaling" is the new name. We support both options for
503  // backwards compatibility.
504  std::string tempResScale = resScale_;
505  bool implicitResidualScalingName = false;
506  if (params->isParameter ("Residual Scaling")) {
507  tempResScale = params->get<std::string> ("Residual Scaling");
508  }
509  else if (params->isParameter ("Implicit Residual Scaling")) {
510  tempResScale = params->get<std::string> ("Implicit Residual Scaling");
511  implicitResidualScalingName = true;
512  }
513 
514  // Only update the scaling if it's different.
515  if (resScale_ != tempResScale) {
516  Belos::ScaleType resScaleType = convertStringToScaleType( tempResScale );
517  resScale_ = tempResScale;
518 
519  // Update parameter in our list and residual tests, using the
520  // given parameter name.
521  if (implicitResidualScalingName) {
522  params_->set ("Implicit Residual Scaling", resScale_);
523  }
524  else {
525  params_->set ("Residual Scaling", resScale_);
526  }
527 
528  if (! convTest_.is_null()) {
529  try {
530  convTest_->defineScaleForm( resScaleType, Belos::TwoNorm );
531  }
532  catch (std::exception& e) {
533  // Make sure the convergence test gets constructed again.
534  newResTest = true;
535  }
536  }
537  }
538  }
539 
540  // Get the deflation quorum, or number of converged systems before deflation is allowed
541  if (params->isParameter("Deflation Quorum")) {
542  defQuorum_ = params->get("Deflation Quorum", defQuorum_);
543  params_->set("Deflation Quorum", defQuorum_);
544  if (convTest_ != Teuchos::null)
545  convTest_->setQuorum( defQuorum_ );
546  }
547 
548  // Create status tests if we need to.
549 
550  // Basic test checks maximum iterations and native residual.
551  if (maxIterTest_ == Teuchos::null)
552  maxIterTest_ = Teuchos::rcp( new StatusTestMaxIters<ScalarType,MV,OP>( maxIters_ ) );
553 
554  // Implicit residual test, using the native residual to determine if convergence was achieved.
555  if (convTest_ == Teuchos::null || newResTest) {
556  convTest_ = Teuchos::rcp( new StatusTestResNorm_t( convtol_, defQuorum_, showMaxResNormOnly_ ) );
557  convTest_->defineScaleForm( convertStringToScaleType( resScale_ ), Belos::TwoNorm );
558  }
559 
560  if (sTest_ == Teuchos::null || newResTest)
561  sTest_ = Teuchos::rcp( new StatusTestCombo_t( StatusTestCombo_t::OR, maxIterTest_, convTest_ ) );
562 
563  if (outputTest_ == Teuchos::null || newResTest) {
564 
565  // Create the status test output class.
566  // This class manages and formats the output from the status test.
567  StatusTestOutputFactory<ScalarType,MV,OP> stoFactory( outputStyle_ );
568  outputTest_ = stoFactory.create( printer_, sTest_, outputFreq_, Passed+Failed+Undefined );
569 
570  // Set the solver string for the output test
571  std::string solverDesc = " Pseudo Block BiCGStab ";
572  outputTest_->setSolverDesc( solverDesc );
573 
574  }
575 
576  // Create the timer if we need to.
577  if (timerSolve_ == Teuchos::null) {
578  std::string solveLabel = label_ + ": BiCGStabSolMgr total solve time";
579 #ifdef BELOS_TEUCHOS_TIME_MONITOR
580  timerSolve_ = Teuchos::TimeMonitor::getNewCounter(solveLabel);
581 #endif
582  }
583 
584  // Inform the solver manager that the current parameters were set.
585  isSet_ = true;
586 }
587 
588 
589 template<class ScalarType, class MV, class OP>
590 Teuchos::RCP<const Teuchos::ParameterList>
592 {
593  using Teuchos::ParameterList;
594  using Teuchos::parameterList;
595  using Teuchos::RCP;
596 
597  if (validParams_.is_null()) {
598  // Set all the valid parameters and their default values.
599  RCP<ParameterList> pl = parameterList ();
600  pl->set("Convergence Tolerance", convtol_default_,
601  "The relative residual tolerance that needs to be achieved by the\n"
602  "iterative solver in order for the linera system to be declared converged.");
603  pl->set("Maximum Iterations", maxIters_default_,
604  "The maximum number of block iterations allowed for each\n"
605  "set of RHS solved.");
606  pl->set("Verbosity", verbosity_default_,
607  "What type(s) of solver information should be outputted\n"
608  "to the output stream.");
609  pl->set("Output Style", outputStyle_default_,
610  "What style is used for the solver information outputted\n"
611  "to the output stream.");
612  pl->set("Output Frequency", outputFreq_default_,
613  "How often convergence information should be outputted\n"
614  "to the output stream.");
615  pl->set("Deflation Quorum", defQuorum_default_,
616  "The number of linear systems that need to converge before\n"
617  "they are deflated. This number should be <= block size.");
618  pl->set("Output Stream", outputStream_default_,
619  "A reference-counted pointer to the output stream where all\n"
620  "solver output is sent.");
621  pl->set("Show Maximum Residual Norm Only", showMaxResNormOnly_default_,
622  "When convergence information is printed, only show the maximum\n"
623  "relative residual norm when the block size is greater than one.");
624  pl->set("Implicit Residual Scaling", resScale_default_,
625  "The type of scaling used in the residual convergence test.");
626  // We leave the old name as a valid parameter for backwards
627  // compatibility (so that validateParametersAndSetDefaults()
628  // doesn't raise an exception if it encounters "Residual
629  // Scaling"). The new name was added for compatibility with other
630  // solvers, none of which use "Residual Scaling".
631  pl->set("Residual Scaling", resScale_default_,
632  "The type of scaling used in the residual convergence test. This "
633  "name is deprecated; the new name is \"Implicit Residual Scaling\".");
634  pl->set("Timer Label", label_default_,
635  "The string to use as a prefix for the timer labels.");
636  validParams_ = pl;
637  }
638  return validParams_;
639 }
640 
641 
642 template<class ScalarType, class MV, class OP>
644 {
645  // Set the current parameters if they were not set before.
646  // NOTE: This may occur if the user generated the solver manager with the default constructor and
647  // then didn't set any parameters using setParameters().
648  if (! isSet_) {
649  setParameters (params_);
650  }
651 
652  Teuchos::BLAS<int,ScalarType> blas;
653 
654  TEUCHOS_TEST_FOR_EXCEPTION
655  (! problem_->isProblemSet (), BiCGStabSolMgrLinearProblemFailure,
656  "Belos::BiCGStabSolMgr::solve: Linear problem is not ready. "
657  "You must call setProblem() on the LinearProblem before you may solve it.");
658  TEUCHOS_TEST_FOR_EXCEPTION
659  (problem_->isLeftPrec (), std::logic_error, "Belos::BiCGStabSolMgr::solve: "
660  "The left-preconditioned case has not yet been implemented. Please use "
661  "right preconditioning for now. If you need to use left preconditioning, "
662  "please contact the Belos developers. Left preconditioning is more "
663  "interesting in BiCGStab because whether it works depends on the initial "
664  "guess (e.g., an initial guess of all zeros might NOT work).");
665 
666  // Create indices for the linear systems to be solved.
667  int startPtr = 0;
668  int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
669  int numCurrRHS = numRHS2Solve;
670 
671  std::vector<int> currIdx( numRHS2Solve ), currIdx2( numRHS2Solve );
672  for (int i=0; i<numRHS2Solve; ++i) {
673  currIdx[i] = startPtr+i;
674  currIdx2[i]=i;
675  }
676 
677  // Inform the linear problem of the current linear system to solve.
678  problem_->setLSIndex( currIdx );
679 
681  // Parameter list (iteration)
682  Teuchos::ParameterList plist;
683 
684  // Reset the status test.
685  outputTest_->reset();
686 
687  // Assume convergence is achieved, then let any failed convergence set this to false.
688  bool isConverged = true;
689 
691  // Pseudo-Block BiCGStab solver
692 
693  Teuchos::RCP<BiCGStabIter<ScalarType,MV,OP> > block_cg_iter
694  = Teuchos::rcp( new BiCGStabIter<ScalarType,MV,OP>(problem_,printer_,outputTest_,plist) );
695 
696  // Enter solve() iterations
697  {
698 #ifdef BELOS_TEUCHOS_TIME_MONITOR
699  Teuchos::TimeMonitor slvtimer(*timerSolve_);
700 #endif
701 
702  //bool first_time=true;
703  while ( numRHS2Solve > 0 ) {
704  // Reset the active / converged vectors from this block
705  std::vector<int> convRHSIdx;
706  std::vector<int> currRHSIdx( currIdx );
707  currRHSIdx.resize(numCurrRHS);
708 
709  // Reset the number of iterations.
710  block_cg_iter->resetNumIters();
711 
712  // Reset the number of calls that the status test output knows about.
713  outputTest_->resetNumCalls();
714 
715  // Get the current residual for this block of linear systems.
716  Teuchos::RCP<MV> R_0 = MVT::CloneViewNonConst( *(Teuchos::rcp_const_cast<MV>(problem_->getInitResVec())), currIdx );
717 
718  // Get a new state struct and initialize the solver.
720  newState.R = R_0;
721  block_cg_iter->initializeBiCGStab(newState);
722 
723  while(1) {
724 
725  // tell block_gmres_iter to iterate
726  try {
727 
728  block_cg_iter->iterate();
729 
731  //
732  // check convergence first
733  //
735  if ( convTest_->getStatus() == Passed ) {
736 
737  // Figure out which linear systems converged.
738  std::vector<int> convIdx = Teuchos::rcp_dynamic_cast<StatusTestGenResNorm<ScalarType,MV,OP> >(convTest_)->convIndices();
739 
740  // If the number of converged linear systems is equal to the
741  // number of current linear systems, then we are done with this block.
742  if (convIdx.size() == currRHSIdx.size())
743  break; // break from while(1){block_cg_iter->iterate()}
744 
745  // Inform the linear problem that we are finished with this current linear system.
746  problem_->setCurrLS();
747 
748  // Reset currRHSIdx to have the right-hand sides that are left to converge for this block.
749  int have = 0;
750  std::vector<int> unconvIdx(currRHSIdx.size());
751  for (unsigned int i=0; i<currRHSIdx.size(); ++i) {
752  bool found = false;
753  for (unsigned int j=0; j<convIdx.size(); ++j) {
754  if (currRHSIdx[i] == convIdx[j]) {
755  found = true;
756  break;
757  }
758  }
759  if (!found) {
760  currIdx2[have] = currIdx2[i];
761  currRHSIdx[have++] = currRHSIdx[i];
762  }
763  }
764  currRHSIdx.resize(have);
765  currIdx2.resize(have);
766 
767  // Set the remaining indices after deflation.
768  problem_->setLSIndex( currRHSIdx );
769 
770  // Get the current residual vector.
771  std::vector<MagnitudeType> norms;
772  R_0 = MVT::CloneCopy( *(block_cg_iter->getNativeResiduals(&norms)),currIdx2 );
773  for (int i=0; i<have; ++i) { currIdx2[i] = i; }
774 
775  // Set the new state and initialize the solver.
777  defstate.R = R_0;
778  block_cg_iter->initializeBiCGStab(defstate);
779  }
780 
782  //
783  // check for maximum iterations
784  //
786  else if ( maxIterTest_->getStatus() == Passed ) {
787  // we don't have convergence
788  isConverged = false;
789  break; // break from while(1){block_cg_iter->iterate()}
790  }
791 
793  //
794  // we returned from iterate(), but none of our status tests Passed.
795  // something is wrong, and it is probably our fault.
796  //
798 
799  else {
800  TEUCHOS_TEST_FOR_EXCEPTION(true,std::logic_error,
801  "Belos::BiCGStabSolMgr::solve(): Invalid return from BiCGStabIter::iterate().");
802  }
803  }
804  catch (const std::exception &e) {
805  printer_->stream(Errors) << "Error! Caught std::exception in BiCGStabIter::iterate() at iteration "
806  << block_cg_iter->getNumIters() << std::endl
807  << e.what() << std::endl;
808  throw;
809  }
810  }
811 
812  // Inform the linear problem that we are finished with this block linear system.
813  problem_->setCurrLS();
814 
815  // Update indices for the linear systems to be solved.
816  startPtr += numCurrRHS;
817  numRHS2Solve -= numCurrRHS;
818 
819  if ( numRHS2Solve > 0 ) {
820 
821  numCurrRHS = numRHS2Solve;
822  currIdx.resize( numCurrRHS );
823  currIdx2.resize( numCurrRHS );
824  for (int i=0; i<numCurrRHS; ++i)
825  { currIdx[i] = startPtr+i; currIdx2[i] = i; }
826 
827  // Set the next indices.
828  problem_->setLSIndex( currIdx );
829  }
830  else {
831  currIdx.resize( numRHS2Solve );
832  }
833 
834  //first_time=false;
835  }// while ( numRHS2Solve > 0 )
836 
837  }
838 
839  // print final summary
840  sTest_->print( printer_->stream(FinalSummary) );
841 
842  // print timing information
843 #ifdef BELOS_TEUCHOS_TIME_MONITOR
844  // Calling summarize() can be expensive, so don't call unless the
845  // user wants to print out timing details. summarize() will do all
846  // the work even if it's passed a "black hole" output stream.
847  if (verbosity_ & TimingDetails)
848  Teuchos::TimeMonitor::summarize( printer_->stream(TimingDetails) );
849 #endif
850 
851  // get iteration information for this solve
852  numIters_ = maxIterTest_->getNumIters();
853 
854 
855  // Save the convergence test value ("achieved tolerance") for this
856  // solve.
857  const std::vector<MagnitudeType>* pTestValues = convTest_->getTestValue();
858  achievedTol_ = *std::max_element (pTestValues->begin(), pTestValues->end());
859 
860 
861  if (!isConverged ) {
862  return Unconverged; // return from BiCGStabSolMgr::solve()
863  }
864  return Converged; // return from BiCGStabSolMgr::solve()
865 }
866 
867 // This method requires the solver manager to return a std::string that describes itself.
868 template<class ScalarType, class MV, class OP>
870 {
871  std::ostringstream oss;
872  oss << "Belos::BiCGStabSolMgr<...,"<<Teuchos::ScalarTraits<ScalarType>::name()<<">";
873  oss << "{";
874  oss << "}";
875  return oss.str();
876 }
877 
878 
879 
880 } // end Belos namespace
881 
882 #endif /* BELOS_BICGSTAB_SOLMGR_HPP */
ScaleType convertStringToScaleType(const std::string &scaleType)
Convert the given string to its ScaleType enum value.
Definition: BelosTypes.cpp:87
Collection of types and exceptions used within the Belos solvers.
BiCGStabSolMgrOrthoFailure is thrown when the orthogonalization manager is unable to generate orthono...
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...
Class which manages the output and verbosity of the Belos solvers.
Teuchos::RCP< const MV > R
The current residual.
ScaleType
The type of scaling to use on the residual norm value.
Definition: BelosTypes.hpp:119
A factory class for generating StatusTestOutput objects.
Structure to contain pointers to BiCGStabIteration state variables.
An implementation of StatusTestResNorm using a family of residual norms.
MagnitudeType achievedTol() const
Tolerance achieved by the last solve() invocation.
std::string description() const
Method to return description of the block BiCGStab solver manager.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Get a parameter list containing the valid parameters for this object.
Belos::StatusTest class for specifying a maximum number of iterations.
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > &params)
Set the parameters the solver manager should use to solve the linear problem.
void setProblem(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem)
Set the linear problem that needs to be solved.
static int GetNumberVecs(const MV &mv)
Obtain the number of vectors in mv.
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 isLOADetected() const
Return whether a loss of accuracy was detected by this solver during the most current solve...
A Belos::StatusTest class for specifying a maximum number of iterations.
static Teuchos::RCP< MV > CloneViewNonConst(MV &mv, const std::vector< int > &index)
Creates a new MV that shares the selected contents of mv (shallow copy).
ResetType
How to reset the solver.
Definition: BelosTypes.hpp:205
Pure virtual base class which describes the basic interface for a solver manager. ...
BiCGStabSolMgr()
Empty constructor for BiCGStabSolMgr. This constructor takes no arguments and sets the default values...
virtual ~BiCGStabSolMgr()
Destructor.
A linear system to solve, and its associated information.
int getNumIters() const
Get the iteration count for the most recent call to solve().
Class which describes the linear problem to be solved by the iterative solver.
BiCGStabSolMgrLinearProblemFailure is thrown when the linear problem is not setup (i...
ReturnType solve()
This method performs possibly repeated calls to the underlying linear solver&#39;s iterate() routine unti...
static Teuchos::RCP< MV > CloneCopy(const MV &mv)
Creates a new MV and copies contents of mv into the new vector (deep copy).
ReturnType
Whether the Belos solve converged for all linear systems.
Definition: BelosTypes.hpp:154
Teuchos::RCP< const Teuchos::ParameterList > getCurrentParameters() const
Get a parameter list containing the current parameters for this object.
The Belos::SolverManager is a templated virtual base class that defines the basic interface that any ...
void reset(const ResetType type)
Performs a reset of the solver manager specified by the ResetType. This informs the solver manager th...
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.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
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:60
Belos header file which uses auto-configuration information to include necessary C++ headers...
const LinearProblem< ScalarType, MV, OP > & getProblem() const
Return a reference to the linear problem being solved by this solver manager.
BiCGStabSolMgrOrthoFailure(const std::string &what_arg)
Belos concrete class for performing the pseudo-block BiCGStab iteration.

Generated on Mon Feb 5 2018 15:01:51 for Belos by doxygen 1.8.13