From c554dc7b7d29c6c3979b8e09227ca7bc75f9aefc Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@Germany>
Date: Mon, 21 Nov 2016 12:36:04 +0100
Subject: [PATCH] ENH: ensure written and evaluated values correspond (issue
 #311)

- Avoids possible discrepancy when the user selects non-coincidental
  values for executeInterval and writeInterval.

- zeroGradient and ddt2 function objects
---
 src/functionObjects/field/ddt2/ddt2.C                 | 9 +++++++++
 src/functionObjects/field/ddt2/ddt2.H                 | 3 +++
 src/functionObjects/field/zeroGradient/zeroGradient.C | 9 +++++++++
 src/functionObjects/field/zeroGradient/zeroGradient.H | 3 +++
 4 files changed, 24 insertions(+)

diff --git a/src/functionObjects/field/ddt2/ddt2.C b/src/functionObjects/field/ddt2/ddt2.C
index a3876716585..7aeecd01e90 100644
--- a/src/functionObjects/field/ddt2/ddt2.C
+++ b/src/functionObjects/field/ddt2/ddt2.C
@@ -112,6 +112,7 @@ Foam::functionObjects::ddt2::ddt2
 )
 :
     fvMeshFunctionObject(name, runTime, dict),
+    prevTimeIndex_(-1),
     selectFields_(),
     resultName_(word::null),
     blacklist_(),
@@ -217,12 +218,20 @@ bool Foam::functionObjects::ddt2::execute()
             << "Unprocessed field " << ignored << endl;
     }
 
+    // Update time index
+    prevTimeIndex_ = obr_.time().timeIndex();
+
     return true;
 }
 
 
 bool Foam::functionObjects::ddt2::write()
 {
+    if (prevTimeIndex_ < obr_.time().timeIndex())
+    {
+        // Ensure written results reflect the current state
+        execute();
+    }
     if (results_.size())
     {
         Log << type() << ' ' << name() << " write:" << endl;
diff --git a/src/functionObjects/field/ddt2/ddt2.H b/src/functionObjects/field/ddt2/ddt2.H
index 21607ce2a34..bba1492e3e4 100644
--- a/src/functionObjects/field/ddt2/ddt2.H
+++ b/src/functionObjects/field/ddt2/ddt2.H
@@ -101,6 +101,9 @@ class ddt2
 {
     // Private data
 
+        //- Time at last execute, ensures write uses up-to-date values
+        label prevTimeIndex_;
+
         //- Name of fields to process
         wordReList selectFields_;
 
diff --git a/src/functionObjects/field/zeroGradient/zeroGradient.C b/src/functionObjects/field/zeroGradient/zeroGradient.C
index ff07607652b..53d41c23f89 100644
--- a/src/functionObjects/field/zeroGradient/zeroGradient.C
+++ b/src/functionObjects/field/zeroGradient/zeroGradient.C
@@ -100,6 +100,7 @@ Foam::functionObjects::zeroGradient::zeroGradient
 )
 :
     fvMeshFunctionObject(name, runTime, dict),
+    prevTimeIndex_(-1),
     selectFields_(),
     resultName_(string::null),
     results_()
@@ -174,12 +175,20 @@ bool Foam::functionObjects::zeroGradient::execute()
             << "Unprocessed field " << ignored << endl;
     }
 
+    // Update time index
+    prevTimeIndex_ = obr_.time().timeIndex();
+
     return true;
 }
 
 
 bool Foam::functionObjects::zeroGradient::write()
 {
+    if (prevTimeIndex_ < obr_.time().timeIndex())
+    {
+        // Ensure written results reflect the current state
+        execute();
+    }
     if (results_.size())
     {
         Log << type() << ' ' << name() << " write:" << endl;
diff --git a/src/functionObjects/field/zeroGradient/zeroGradient.H b/src/functionObjects/field/zeroGradient/zeroGradient.H
index 84243608243..e4eb1c75b3d 100644
--- a/src/functionObjects/field/zeroGradient/zeroGradient.H
+++ b/src/functionObjects/field/zeroGradient/zeroGradient.H
@@ -95,6 +95,9 @@ class zeroGradient
 {
     // Private data
 
+        //- Time at last execute, ensures write uses up-to-date values
+        label prevTimeIndex_;
+
         //- Name of fields to process
         wordReList selectFields_;
 
-- 
GitLab