diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp index adb4611a55e9c23bb72a490fa79c7a0489c16837..d8b1a56341a37957e3d82eae01d8e7bbf96f8361 100644 --- a/ProcessLib/TimeLoop.cpp +++ b/ProcessLib/TimeLoop.cpp @@ -303,13 +303,14 @@ void TimeLoop::setCoupledSolutions() } } -double TimeLoop::computeTimeStepping(const double prev_dt, double& t, - std::size_t& accepted_steps, - std::size_t& rejected_steps) +std::pair<double, bool> TimeLoop::computeTimeStepping( + const double prev_dt, double& t, std::size_t& accepted_steps, + std::size_t& rejected_steps) { bool all_process_steps_accepted = true; // Get minimum time step size among step sizes of all processes. double dt = std::numeric_limits<double>::max(); + bool last_step_rejected = false; constexpr double eps = std::numeric_limits<double>::epsilon(); bool const is_initial_step = std::any_of( @@ -399,7 +400,7 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t, if (all_process_steps_accepted) { accepted_steps++; - _last_step_rejected = false; + last_step_rejected = false; } else { @@ -407,7 +408,7 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t, { t -= prev_dt; rejected_steps++; - _last_step_rejected = true; + last_step_rejected = true; } } } @@ -423,7 +424,7 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t, // Check whether the time stepping is stabilized if (std::abs(dt - prev_dt) < eps) { - if (_last_step_rejected) + if (last_step_rejected) { OGS_FATAL( "The new step size of {:g} is the same as that of the previous " @@ -474,7 +475,7 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t, } } - return dt; + return {dt, last_step_rejected}; } /// initialize output, convergence criterion, etc. @@ -516,8 +517,9 @@ void TimeLoop::initialize() &Output::doOutput); } - _dt = computeTimeStepping(0.0, _current_time, _accepted_steps, - _rejected_steps); + std::tie(_dt, _last_step_rejected) = computeTimeStepping( + 0.0, _current_time, _accepted_steps, _rejected_steps); + updateDeactivatedSubdomains(_per_process_data, _start_time); calculateNonEquilibriumInitialResiduum( @@ -546,8 +548,8 @@ bool TimeLoop::executeTimeStep() double const current_time = _current_time; // _last_step_rejected is also checked in computeTimeStepping. - _dt = computeTimeStepping(prev_dt, _current_time, _accepted_steps, - _rejected_steps); + std::tie(_dt, _last_step_rejected) = computeTimeStepping( + prev_dt, _current_time, _accepted_steps, _rejected_steps); if (!_last_step_rejected) { diff --git a/ProcessLib/TimeLoop.h b/ProcessLib/TimeLoop.h index a5d19b8cc29b5318a9230a22a77f763f541253d4..d97f5a61aa0dce817a6da55cec37feda70f02caa 100644 --- a/ProcessLib/TimeLoop.h +++ b/ProcessLib/TimeLoop.h @@ -104,10 +104,12 @@ private: * function. * @param rejected_steps Rejected time steps that are counted in this * function. + * @return the time step size and the information if the last time step was + * rejected */ - double computeTimeStepping(const double prev_dt, double& t, - std::size_t& accepted_steps, - std::size_t& rejected_steps); + std::pair<double, bool> computeTimeStepping(const double prev_dt, double& t, + std::size_t& accepted_steps, + std::size_t& rejected_steps); template <typename OutputClass, typename OutputClassMember> void outputSolutions(bool const output_initial_condition, unsigned timestep,