dune-pdelab  2.7-git
terminate.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_PDELAB_SOLVER_TERMINATE_HH
4 #define DUNE_PDELAB_SOLVER_TERMINATE_HH
5 
6 namespace Dune::PDELab
7 {
8 
9  class TerminateError : public Exception {};
10 
11 
13  {
14  public:
16  virtual ~TerminateInterface () {}
17 
18  virtual bool terminate() = 0;
19 
20  virtual void setParameters(const ParameterTree&) = 0;
21 
22  virtual void printParameters() const
23  {
24  std::cout << "NewtonMethod::_terminate->printParameters() is not implemented." << std::endl;
25  }
26 };
27 
28 
29  template <typename Solver>
31  {
32  public:
33  using Real = typename Solver::Real;
34 
35  DefaultTerminate(Solver& solver) : _solver(solver) {}
36 
37  virtual bool terminate() override
38  {
39  if (_force_iteration && _solver.result().iterations == 0)
40  return false;
41  auto converged = _solver.result().defect < _solver.getAbsoluteLimit() || _solver.result().defect < _solver.result().first_defect * _solver.getReduction();
42  if (_solver.result().iterations >= _maxIterations && not _solver.result().converged)
43  DUNE_THROW(TerminateError,
44  "Terminate::terminate(): Maximum iteration count reached");
45  return converged;
46  }
47 
48  virtual void setParameters(const ParameterTree& parameterTree) override
49  {
50  _maxIterations = parameterTree.get<unsigned int>("MaxIterations", _maxIterations);
51  _force_iteration = parameterTree.get<bool>("ForceIteration", _force_iteration);
52  }
53 
54  virtual void printParameters() const override
55  {
56  std::cout << "Terminate.MaxIterations. " << _maxIterations << std::endl;
57  std::cout << "Terminate.ForceIteration " << _force_iteration << std::endl;
58  }
59 
61  void setMaxIterations(const unsigned int maxIterations)
62  {
63  _maxIterations = maxIterations;
64  }
65 
67  void setForceIteration(const bool forceIteration)
68  {
69  _force_iteration = forceIteration;
70  }
71 
72  private:
73  Solver& _solver;
74  unsigned int _maxIterations = 40;
75  bool _force_iteration = false;
76  };
77 }
78 
79 #endif
Definition: adaptivity.hh:29
Base class for all PDELab exceptions.
Definition: exceptions.hh:19
Definition: terminate.hh:9
Definition: terminate.hh:13
virtual ~TerminateInterface()
Every abstract base class should have a virtual destructor.
Definition: terminate.hh:16
virtual void setParameters(const ParameterTree &)=0
virtual void printParameters() const
Definition: terminate.hh:22
Definition: terminate.hh:31
virtual void printParameters() const override
Definition: terminate.hh:54
virtual bool terminate() override
Definition: terminate.hh:37
void setForceIteration(const bool forceIteration)
Set if the Newton solver should always perform an iteration.
Definition: terminate.hh:67
DefaultTerminate(Solver &solver)
Definition: terminate.hh:35
virtual void setParameters(const ParameterTree &parameterTree) override
Definition: terminate.hh:48
typename Solver::Real Real
Definition: terminate.hh:33
void setMaxIterations(const unsigned int maxIterations)
Set the maximum iterations allowed in the Newton solver.
Definition: terminate.hh:61