From a79b0b7ddce31fb16754ec99b60b9b5a95151e8a Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <github@naumov.de> Date: Mon, 14 Jan 2019 01:09:27 +0100 Subject: [PATCH] [NL] Pass number of iterations to time step algo. --- .../TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp | 3 ++- NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h | 2 +- NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp | 3 ++- NumLib/TimeStepping/Algorithms/FixedTimeStepping.h | 2 +- .../Algorithms/IterationNumberBasedTimeStepping.cpp | 6 +++++- .../Algorithms/IterationNumberBasedTimeStepping.h | 2 +- NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h | 3 ++- ProcessLib/UncoupledProcessesTimeLoop.cpp | 3 ++- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp index ccbb5cf3792..85efd57217a 100644 --- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp +++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp @@ -20,7 +20,8 @@ namespace NumLib { -bool EvolutionaryPIDcontroller::next(const double solution_error) +bool EvolutionaryPIDcontroller::next(double const solution_error, + int const /*number_iterations*/) { const bool is_previous_step_accepted = _is_accepted; diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h index 2a5489bd0bb..2f5b0fc692c 100644 --- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h +++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h @@ -77,7 +77,7 @@ public: time steps. * @return true if the next step exists */ - bool next(const double solution_error) override; + bool next(double solution_error, int number_iterations) override; /// return if current time step is accepted bool accepted() const override { return _is_accepted; } diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp index 8c90eb9794f..f9fa3c94130 100644 --- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp +++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp @@ -30,7 +30,8 @@ FixedTimeStepping::FixedTimeStepping(double t0, double tn, double dt) { } -bool FixedTimeStepping::next(const double /*solution_error*/) +bool FixedTimeStepping::next(double const /*solution_error*/, + int const /*number_iterations*/) { // check if last time step if (_ts_current.steps() == _dt_vector.size() || diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h index 72e3d5bafac..302fe049e5c 100644 --- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h +++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h @@ -58,7 +58,7 @@ public: const std::vector<double>& vec_all_dt); /// move to the next time step - bool next(const double solution_error) override; + bool next(double solution_error, int number_iterations) override; /// return if current time step is accepted bool accepted() const override { return true; } diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp index 8b0d000bdba..d60a2184a4f 100644 --- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp +++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp @@ -36,8 +36,11 @@ IterationNumberBasedTimeStepping::IterationNumberBasedTimeStepping( assert(iter_times_vector.size() == multiplier_vector.size()); } -bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/) +bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/, + int const number_iterations) { + _iter_times = number_iterations; + // check current time step if (std::abs(_ts_current.current() - end()) < std::numeric_limits<double>::epsilon()) @@ -59,6 +62,7 @@ bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/) // prepare the next time step info _ts_current = _ts_prev; _ts_current += getNextTimeStepSize(); + _iter_times = 0; return true; } diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h index 73aee64bbdd..e863e72a0b5 100644 --- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h +++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h @@ -95,7 +95,7 @@ public: ~IterationNumberBasedTimeStepping() override = default; /// move to the next time step - bool next(double solution_error) override; + bool next(double solution_error, int number_iterations) override; /// return if the current step is accepted bool accepted() const override; diff --git a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h index 026cb7e1a6b..28f12e86571 100644 --- a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h +++ b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h @@ -90,8 +90,9 @@ public: /// move to the next time step /// \param solution_error Solution error between two successive time steps. + /// \param number_iterations Number of non-linear iterations used. /// \return true if the next step exists - virtual bool next(const double solution_error) = 0; + virtual bool next(const double solution_error, int number_iterations) = 0; /// return if current time step is accepted or not virtual bool accepted() const = 0; diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp index 7cab9ddaece..a44abfdbc8f 100644 --- a/ProcessLib/UncoupledProcessesTimeLoop.cpp +++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp @@ -356,7 +356,8 @@ double UncoupledProcessesTimeLoop::computeTimeStepping( timestepper->setAcceptedOrNot(false); } - if (!timestepper->next(solution_error) && + if (!timestepper->next(solution_error, + ppd.nonlinear_solver_status.number_iterations) && // In case of FixedTimeStepping, which makes timestepper->next(...) // return false when the ending time is reached. t + std::numeric_limits<double>::epsilon() < timestepper->end()) -- GitLab