From b1a13fd1deaa819e1c6f0bf3c5007c2a484bf2a2 Mon Sep 17 00:00:00 2001 From: bathmann <jasper.bathmann@ufz.de> Date: Thu, 16 May 2019 17:38:22 +0200 Subject: [PATCH] [NumLib/TimeStepping] Small fix on IterationNumberBasedTimeStepping Introduced information flow whether the timestep was accepted or not. This prevents the times in the timestepper and the external loop to diverge which causes two issues otherwise: 1.) Endless loop at t --> t_end, if max_iter > largest multiplier 2.) Endless loop at t --> t_end, if nonlinear solver fails during execution --- .../Algorithms/IterationNumberBasedTimeStepping.cpp | 2 +- .../Algorithms/IterationNumberBasedTimeStepping.h | 3 +++ ProcessLib/UncoupledProcessesTimeLoop.cpp | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp index 4be4bb63d8b..252476d1225 100644 --- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp +++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp @@ -124,6 +124,6 @@ double IterationNumberBasedTimeStepping::getNextTimeStepSize() const bool IterationNumberBasedTimeStepping::accepted() const { - return _iter_times <= _max_iter; + return _accepted; } } // namespace NumLib diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h index ac73d8839a7..f9ba5be2e82 100644 --- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h +++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h @@ -95,6 +95,7 @@ public: bool next(double solution_error, int number_iterations) override; bool accepted() const override; + void setAcceptedOrNot(bool accepted) override { _accepted = accepted; }; bool isSolutionErrorComputationNeeded() override { return true; } @@ -125,6 +126,8 @@ private: int _iter_times = 0; /// The number of rejected steps. int _n_rejected_steps = 0; + /// True, if the timestep is accepted. + bool _accepted = true; }; } // namespace NumLib diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp index b1163296cfb..4e1a9d3199a 100644 --- a/ProcessLib/UncoupledProcessesTimeLoop.cpp +++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp @@ -349,6 +349,10 @@ double UncoupledProcessesTimeLoop::computeTimeStepping( { timestepper->setAcceptedOrNot(false); } + else + { + timestepper->setAcceptedOrNot(true); + } if (!timestepper->next(solution_error, ppd.nonlinear_solver_status.number_iterations) && -- GitLab