Time: Allow the adjustDeltaT function to increase the time-step up to 1%

when adjusting the time-step to conform to the write time to avoid rapid
fluctuations in the time-step and round-off comparison issues.
This commit is contained in:
Henry Weller
2018-04-24 12:10:34 +01:00
parent f12cb590b2
commit 4e0081d231

View File

@ -83,33 +83,25 @@ Foam::word Foam::Time::controlDictName("controlDict");
void Foam::Time::adjustDeltaT() void Foam::Time::adjustDeltaT()
{ {
scalar timeToNextWrite = max const scalar timeToNextWrite = min
( (
0.0, max
(
0,
(writeTimeIndex_ + 1)*writeInterval_ - (value() - startTime_) (writeTimeIndex_ + 1)*writeInterval_ - (value() - startTime_)
),
functionObjects_.timeToNextWrite()
); );
timeToNextWrite = min(timeToNextWrite, functionObjects_.timeToNextWrite()); const scalar nSteps = timeToNextWrite/deltaT_;
scalar nSteps = timeToNextWrite/deltaT_; // Ensure nStepsToNextWrite does not overflow
// For tiny deltaT the label can overflow!
if (nSteps < labelMax) if (nSteps < labelMax)
{ {
label nStepsToNextWrite = label(nSteps + 0.5); // Allow the time-step to increase by up to 1%
// to accommodate the next write time before splitting
scalar newDeltaT = timeToNextWrite/nStepsToNextWrite; const label nStepsToNextWrite = label(max(nSteps, 1) + 0.99);
deltaT_ = timeToNextWrite/nStepsToNextWrite;
// Control the increase of the time step to within a factor of 2
// and the decrease within a factor of 5.
if (newDeltaT >= deltaT_)
{
deltaT_ = min(newDeltaT, 2.0*deltaT_);
}
else
{
deltaT_ = max(newDeltaT, 0.2*deltaT_);
}
} }
} }
@ -1024,7 +1016,7 @@ Foam::Time& Foam::Time::operator++()
// If the time is very close to zero reset to zero // If the time is very close to zero reset to zero
if (mag(value()) < 10*small*deltaT_) if (mag(value()) < 10*small*deltaT_)
{ {
setTime(0.0, timeIndex_); setTime(0, timeIndex_);
} }
if (sigStopAtWriteNow_.active() || sigWriteNow_.active()) if (sigStopAtWriteNow_.active() || sigWriteNow_.active())