dune-pdelab 2.7-git
Loading...
Searching...
No Matches
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
6namespace 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