mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Time: Handle precision changes on start-up and running more robustly
Changes based on patches from and discussions with Bruno Santos Resolves bug-report http://www.openfoam.org/mantisbt/view.php?id=815
This commit is contained in:
@ -70,8 +70,11 @@ const Foam::NamedEnum<Foam::Time::writeControls, 5>
|
||||
Foam::Time::writeControlNames_;
|
||||
|
||||
Foam::Time::fmtflags Foam::Time::format_(Foam::Time::general);
|
||||
|
||||
int Foam::Time::precision_(6);
|
||||
|
||||
const int Foam::Time::maxPrecision_(3 - log10(SMALL));
|
||||
|
||||
Foam::word Foam::Time::controlDictName("controlDict");
|
||||
|
||||
|
||||
@ -188,6 +191,56 @@ void Foam::Time::setControls()
|
||||
deltaTSave_ = deltaT_;
|
||||
deltaT0_ = deltaT_;
|
||||
|
||||
// Check if time directory exists
|
||||
// If not increase time precision to see if it is formatted differently.
|
||||
if (!exists(timePath(), false))
|
||||
{
|
||||
int oldPrecision = precision_;
|
||||
int requiredPrecision = -1;
|
||||
bool found = false;
|
||||
for
|
||||
(
|
||||
precision_ = maxPrecision_;
|
||||
precision_ > oldPrecision;
|
||||
precision_--
|
||||
)
|
||||
{
|
||||
// Update the time formatting
|
||||
setTime(startTime_, 0);
|
||||
|
||||
// Check the existence of the time directory with the new format
|
||||
found = exists(timePath(), false);
|
||||
|
||||
if (found)
|
||||
{
|
||||
requiredPrecision = precision_;
|
||||
}
|
||||
}
|
||||
|
||||
if (requiredPrecision > 0)
|
||||
{
|
||||
// Update the time precision
|
||||
precision_ = requiredPrecision;
|
||||
|
||||
// Update the time formatting
|
||||
setTime(startTime_, 0);
|
||||
|
||||
WarningIn("Time::setControls()")
|
||||
<< "Increasing the timePrecision from " << oldPrecision
|
||||
<< " to " << precision_
|
||||
<< " to support the formatting of the current time directory "
|
||||
<< timeName() << nl << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Could not find time directory so assume it is not present
|
||||
precision_ = oldPrecision;
|
||||
|
||||
// Revert the time formatting
|
||||
setTime(startTime_, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (Pstream::parRun())
|
||||
{
|
||||
scalar sumStartTime = startTime_;
|
||||
@ -754,13 +807,13 @@ Foam::instant Foam::Time::findClosestTime(const scalar t) const
|
||||
label nearestIndex = -1;
|
||||
scalar deltaT = GREAT;
|
||||
|
||||
for (label timeI=1; timeI < timeDirs.size(); ++timeI)
|
||||
for (label timei=1; timei < timeDirs.size(); ++timei)
|
||||
{
|
||||
scalar diff = mag(timeDirs[timeI].value() - t);
|
||||
scalar diff = mag(timeDirs[timei].value() - t);
|
||||
if (diff < deltaT)
|
||||
{
|
||||
deltaT = diff;
|
||||
nearestIndex = timeI;
|
||||
nearestIndex = timei;
|
||||
}
|
||||
}
|
||||
|
||||
@ -788,15 +841,15 @@ Foam::label Foam::Time::findClosestTimeIndex
|
||||
label nearestIndex = -1;
|
||||
scalar deltaT = GREAT;
|
||||
|
||||
forAll(timeDirs, timeI)
|
||||
forAll(timeDirs, timei)
|
||||
{
|
||||
if (timeDirs[timeI].name() == constantName) continue;
|
||||
if (timeDirs[timei].name() == constantName) continue;
|
||||
|
||||
scalar diff = mag(timeDirs[timeI].value() - t);
|
||||
scalar diff = mag(timeDirs[timei].value() - t);
|
||||
if (diff < deltaT)
|
||||
{
|
||||
deltaT = diff;
|
||||
nearestIndex = timeI;
|
||||
nearestIndex = timei;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1026,9 +1079,11 @@ Foam::Time& Foam::Time::operator++()
|
||||
deltaT0_ = deltaTSave_;
|
||||
deltaTSave_ = deltaT_;
|
||||
|
||||
// Save old time name
|
||||
// Save old time value and name
|
||||
const scalar oldTimeValue = value();
|
||||
const word oldTimeName = dimensionedScalar::name();
|
||||
|
||||
// Increment time
|
||||
setTime(value() + deltaT_, timeIndex_ + 1);
|
||||
|
||||
if (!subCycling_)
|
||||
@ -1041,8 +1096,16 @@ Foam::Time& Foam::Time::operator++()
|
||||
}
|
||||
|
||||
|
||||
// Time value obtained by reading timeName
|
||||
scalar timeNameValue;
|
||||
|
||||
// Check that new time representation differs from old one
|
||||
if (dimensionedScalar::name() == oldTimeName)
|
||||
// reinterpretation of the word
|
||||
if
|
||||
(
|
||||
readScalar(dimensionedScalar::name().c_str(), timeNameValue)
|
||||
&& (mag(timeNameValue - oldTimeValue - deltaT_) > 100*SMALL)
|
||||
)
|
||||
{
|
||||
int oldPrecision = precision_;
|
||||
do
|
||||
@ -1050,17 +1113,23 @@ Foam::Time& Foam::Time::operator++()
|
||||
precision_++;
|
||||
setTime(value(), timeIndex());
|
||||
}
|
||||
while (precision_ < 100 && dimensionedScalar::name() == oldTimeName);
|
||||
while
|
||||
(
|
||||
precision_ < maxPrecision_
|
||||
&& readScalar(dimensionedScalar::name().c_str(), timeNameValue)
|
||||
&& (mag(timeNameValue - oldTimeValue - deltaT_) > 100*SMALL)
|
||||
);
|
||||
|
||||
WarningIn("Time::operator++()")
|
||||
<< "Increased the timePrecision from " << oldPrecision
|
||||
<< " to " << precision_
|
||||
<< " to distinguish between timeNames at time " << value()
|
||||
<< " to distinguish between timeNames at time "
|
||||
<< dimensionedScalar::name()
|
||||
<< endl;
|
||||
|
||||
if (precision_ == 100 && precision_ != oldPrecision)
|
||||
if (precision_ == maxPrecision_ && precision_ != oldPrecision)
|
||||
{
|
||||
// Reached limit.
|
||||
// Reached maxPrecision limit
|
||||
WarningIn("Time::operator++()")
|
||||
<< "Current time name " << dimensionedScalar::name()
|
||||
<< " is the old as the previous one " << oldTimeName
|
||||
|
||||
@ -172,6 +172,9 @@ protected:
|
||||
//- Time directory name precision
|
||||
static int precision_;
|
||||
|
||||
//- Maximum time directory name precision
|
||||
static const int maxPrecision_;
|
||||
|
||||
//- Adjust the time step so that writing occurs at the specified time
|
||||
void adjustDeltaT();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user