From 5c21051349ff83b16f6790b308a96334f452be24 Mon Sep 17 00:00:00 2001 From: Henry <Henry> Date: Sat, 14 Mar 2015 20:33:51 +0000 Subject: [PATCH] Time: Increase the precision the value entry is written in uniform/time Add check for round-off error causing time reversal Resolves bug-report http://www.openfoam.org/mantisbt/view.php?id=815 --- src/OpenFOAM/db/Time/Time.C | 22 +++++++++++++++++++--- src/OpenFOAM/db/Time/Time.H | 7 ++++++- src/OpenFOAM/db/Time/TimeIO.C | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C index 3842ff1045e..420da6123da 100644 --- a/src/OpenFOAM/db/Time/Time.C +++ b/src/OpenFOAM/db/Time/Time.C @@ -732,11 +732,11 @@ void Foam::Time::setUnmodified(const label watchFd) const } -Foam::word Foam::Time::timeName(const scalar t) +Foam::word Foam::Time::timeName(const scalar t, const int precision) { std::ostringstream buf; buf.setf(ios_base::fmtflags(format_), ios_base::floatfield); - buf.precision(precision_); + buf.precision(precision); buf << t; return buf.str(); } @@ -1137,10 +1137,26 @@ Foam::Time& Foam::Time::operator++() WarningIn("Time::operator++()") << "Current time name " << dimensionedScalar::name() << " is the old as the previous one " << oldTimeName - << endl + << nl << " This might result in overwriting old results." << endl; } + + // Check if round-off error caused time-reversal + scalar oldTimeNameValue = -VGREAT; + if + ( + readScalar(oldTimeName.c_str(), oldTimeNameValue) + && (sign(timeNameValue - oldTimeNameValue) != sign(deltaT_)) + ) + { + WarningIn("Time::operator++()") + << "Current time name " << dimensionedScalar::name() + << " is set to an instance prior to the previous one " + << oldTimeName << nl + << " This might result in temporal discontinuities." + << endl; + } } } diff --git a/src/OpenFOAM/db/Time/Time.H b/src/OpenFOAM/db/Time/Time.H index f9e0afe1fba..c2d60b47077 100644 --- a/src/OpenFOAM/db/Time/Time.H +++ b/src/OpenFOAM/db/Time/Time.H @@ -406,7 +406,12 @@ public: // Access //- Return time name of given scalar time - static word timeName(const scalar); + // formatted with given precision + static word timeName + ( + const scalar, + const int precision = precision_ + ); //- Return current time name virtual word timeName() const; diff --git a/src/OpenFOAM/db/Time/TimeIO.C b/src/OpenFOAM/db/Time/TimeIO.C index c9134d6530e..79a1659a8d5 100644 --- a/src/OpenFOAM/db/Time/TimeIO.C +++ b/src/OpenFOAM/db/Time/TimeIO.C @@ -508,7 +508,7 @@ bool Foam::Time::writeObject ) ); - timeDict.add("value", timeToUserTime(value())); + timeDict.add("value", timeName(timeToUserTime(value()), maxPrecision_)); timeDict.add("name", string(tmName)); timeDict.add("index", timeIndex_); timeDict.add("deltaT", timeToUserTime(deltaT_)); -- GitLab