diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp index ccbb5cf3792e3ea6c1442154610d937704c9f681..85efd57217a0ad0c50d0754fabaf0f66c4be9a95 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 2a5489bd0bb007e0dcfa78a772d2a6e532996b26..2f5b0fc692cde8bcced88e18b46bfbb9cd52fd4b 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 8c90eb9794fbd13508da83b8ffc70347729ef5e8..f9fa3c9413072d759942b7e0ae235b1575e365ca 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 72e3d5bafac5598402ab363324c84369f68fa5aa..302fe049e5c04027b18b9d41a4b76e2527614330 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 8b0d000bdbae84dd9bd36ba7ca904f893e63b567..d60a2184a4f34982df5260e9edf641d0812a07c0 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 73aee64bbdd7098e738a169fab5b22564963da8a..e863e72a0b535055665f36fb632ebe9eec40f9c4 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 026cb7e1a6b61e9cf172cd3dd32f5d127d1e46ae..28f12e865713b182f69d34c93e9097841c3d965b 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 7cab9ddaececa9a6de8f0bfc01c8132711560b06..a44abfdbc8fda5315453e6ff0314c316bf29a87a 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())