DUNE PDELab (2.7)

terminate.hh
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
12 class TerminateInterface
13 {
14 public:
16 virtual ~TerminateInterface () {}
17
18 virtual bool terminate() = 0;
19
20 virtual void setParameters(const ParameterTree&) = 0;
21 };
22
23
24 template <typename Solver>
25 class DefaultTerminate : public TerminateInterface
26 {
27 public:
28 using Real = typename Solver::Real;
29
30 DefaultTerminate(Solver& solver) : _solver(solver) {}
31
32 virtual bool terminate() override
33 {
34 if (_force_iteration && _solver.result().iterations == 0)
35 return false;
36 auto converged = _solver.result().defect < _solver.getAbsoluteLimit() || _solver.result().defect < _solver.result().first_defect * _solver.getReduction();
37 if (_solver.result().iterations >= _maxIterations && not _solver.result().converged)
38 DUNE_THROW(TerminateError,
39 "Terminate::terminate(): Maximum iteration count reached");
40 return converged;
41 }
42
43 virtual void setParameters(const ParameterTree& parameterTree) override
44 {
45 _maxIterations = parameterTree.get<unsigned int>("MaxIterations", _maxIterations);
46 _force_iteration = parameterTree.get<bool>("ForceIteration", _force_iteration);
47 }
48
50 void setMaxIterations(const unsigned int maxIterations)
51 {
52 _maxIterations = maxIterations;
53 }
54
56 void setForceIteration(const bool forceIteration)
57 {
58 _force_iteration = forceIteration;
59 }
60
61 private:
62 Solver& _solver;
63 unsigned int _maxIterations = 40;
64 bool _force_iteration = false;
65 };
66}
67
68#endif
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Sep 5, 22:35, 2025)