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