3#ifndef DUNE_PDELAB_SOLVER_TERMINATE_HH
4#define DUNE_PDELAB_SOLVER_TERMINATE_HH
9 class TerminateError :
public Exception {};
12 class TerminateInterface
16 virtual ~TerminateInterface () {}
18 virtual bool terminate() = 0;
20 virtual void setParameters(
const ParameterTree&) = 0;
24 template <
typename Solver>
25 class DefaultTerminate :
public TerminateInterface
28 using Real =
typename Solver::Real;
30 DefaultTerminate(Solver& solver) : _solver(solver) {}
32 virtual bool terminate()
override
34 if (_force_iteration && _solver.result().iterations == 0)
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)
39 "Terminate::terminate(): Maximum iteration count reached");
43 virtual void setParameters(
const ParameterTree& parameterTree)
override
45 _maxIterations = parameterTree.get<
unsigned int>(
"MaxIterations", _maxIterations);
46 _force_iteration = parameterTree.get<
bool>(
"ForceIteration", _force_iteration);
50 void setMaxIterations(
const unsigned int maxIterations)
52 _maxIterations = maxIterations;
56 void setForceIteration(
const bool forceIteration)
58 _force_iteration = forceIteration;
63 unsigned int _maxIterations = 40;
64 bool _force_iteration =
false;
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216