Commit 7f3fb82b authored by Henry's avatar Henry
Browse files

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
parent 72f55980
......@@ -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();
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment