dune-pdelab 2.9
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
7
8namespace Dune::PDELab
9{
10
12 {
13 public:
15 virtual ~TerminateInterface () {}
16
17 virtual bool terminate() = 0;
18
19 virtual void setParameters(const ParameterTree&) = 0;
20
21 virtual void printParameters() const
22 {
23 std::cout << "NewtonMethod::_terminate->printParameters() is not implemented." << std::endl;
24 }
25};
26
27
28 template <typename Solver>
30 {
31 public:
32 using Real = typename Solver::Real;
33
34 DefaultTerminate(Solver& solver) : _solver(solver) {}
35
36 virtual bool terminate() override
37 {
38 if (_force_iteration && _solver.result().iterations == 0)
39 return false;
40 auto converged = _solver.result().defect < _solver.getAbsoluteLimit() || _solver.result().defect < _solver.result().first_defect * _solver.getReduction();
41 _solver.result().converged = converged;
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
#define DUNE_THROW(E, m)
Definition adaptivity.hh:29
std::string get(const std::string &key, const std::string &defaultValue) const
Definition terminate.hh:12
virtual ~TerminateInterface()
Every abstract base class should have a virtual destructor.
Definition terminate.hh:15
virtual void setParameters(const ParameterTree &)=0
virtual void printParameters() const
Definition terminate.hh:21
Definition terminate.hh:30
virtual void printParameters() const override
Definition terminate.hh:54
virtual bool terminate() override
Definition terminate.hh:36
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:34
virtual void setParameters(const ParameterTree &parameterTree) override
Definition terminate.hh:48
typename Solver::Real Real
Definition terminate.hh:32
void setMaxIterations(const unsigned int maxIterations)
Set the maximum iterations allowed in the Newton solver.
Definition terminate.hh:61
T endl(T... args)