From 84907675f84fc0c8d443665a41dc9a86e81c262b Mon Sep 17 00:00:00 2001
From: andy <andy>
Date: Tue, 16 Aug 2011 18:05:27 +0100
Subject: [PATCH] ENH: Added window option to fieldAverage function object

---
 .../field/fieldAverage/controlDict            |  2 +
 .../fieldAverage/fieldAverage/fieldAverage.C  |  3 +-
 .../fieldAverage/fieldAverageTemplates.C      | 50 ++++++++++++-------
 .../fieldAverageItem/fieldAverageItem.C       |  7 ++-
 .../fieldAverageItem/fieldAverageItem.H       | 17 ++++++-
 .../fieldAverageItem/fieldAverageItemIO.C     | 16 +++++-
 6 files changed, 69 insertions(+), 26 deletions(-)

diff --git a/src/postProcessing/functionObjects/field/fieldAverage/controlDict b/src/postProcessing/functionObjects/field/fieldAverage/controlDict
index 2c8d3cac79a..7d59d161f4f 100644
--- a/src/postProcessing/functionObjects/field/fieldAverage/controlDict
+++ b/src/postProcessing/functionObjects/field/fieldAverage/controlDict
@@ -68,6 +68,7 @@ functions
                 mean        on;
                 prime2Mean  on;
                 base        time;
+                window      0.01; // optional averaging window
             }
 
             p
@@ -75,6 +76,7 @@ functions
                 mean        on;
                 prime2Mean  on;
                 base        time;
+                window      0.01; // optional averaging window
             }
         );
     }
diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C
index 46e64afc3ec..be8b03a5b51 100644
--- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C
+++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C
@@ -377,8 +377,7 @@ void Foam::fieldAverage::execute()
 
 
 void Foam::fieldAverage::end()
-{
-}
+{}
 
 
 void Foam::fieldAverage::write()
diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C
index e067eb20797..0fdf344531d 100644
--- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C
@@ -149,7 +149,7 @@ const
 {
     typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
 
-    const scalar dt = obr_.time().deltaTValue();
+    scalar dt = obr_.time().deltaTValue();
 
     forAll(faItems_, i)
     {
@@ -163,17 +163,24 @@ const
                 obr_.lookupObject<fieldType>(meanFieldList[i])
             );
 
-            scalar alpha = 0.0;
-            scalar beta = 0.0;
-            if (faItems_[i].timeBase())
+            scalar Dt = totalTime_[i];
+            if (faItems_[i].iterBase())
             {
-                 alpha = (totalTime_[i] - dt)/totalTime_[i];
-                 beta = dt/totalTime_[i];
+                dt = 1.0;
+                Dt = scalar(totalIter_[i]);
             }
-            else
+
+            scalar alpha = (Dt - dt)/Dt;
+            scalar beta = dt/Dt;
+            if (faItems_[i].window() > 0)
             {
-                alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]);
-                beta = 1.0/scalar(totalIter_[i]);
+                const scalar w = faItems_[i].window();
+
+                if (Dt - dt >= w)
+                {
+                    alpha = (w - dt)/w;
+                    beta = dt/w;
+                }
             }
 
             meanField = alpha*meanField + beta*baseField;
@@ -192,7 +199,7 @@ void Foam::fieldAverage::calculatePrime2MeanFields
     typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
     typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
 
-    const scalar dt = obr_.time().deltaTValue();
+    scalar dt = obr_.time().deltaTValue();
 
     forAll(faItems_, i)
     {
@@ -213,17 +220,24 @@ void Foam::fieldAverage::calculatePrime2MeanFields
                 obr_.lookupObject<fieldType2>(prime2MeanFieldList[i])
             );
 
-            scalar alpha = 0.0;
-            scalar beta = 0.0;
-            if (faItems_[i].timeBase())
+            scalar Dt = totalTime_[i];
+            if (faItems_[i].iterBase())
             {
-                alpha = (totalTime_[i] - dt)/totalTime_[i];
-                beta = dt/totalTime_[i];
+                dt = 1.0;
+                Dt = scalar(totalIter_[i]);
             }
-            else
+
+            scalar alpha = (Dt - dt)/Dt;
+            scalar beta = dt/Dt;
+            if (faItems_[i].window() > 0)
             {
-                alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]);
-                beta = 1.0/scalar(totalIter_[i]);
+                const scalar w = faItems_[i].window();
+
+                if (Dt - dt >= w)
+                {
+                    alpha = (w - dt)/w;
+                    beta = dt/w;
+                }
             }
 
             prime2MeanField =
diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C
index 3c04fc64d4c..39bbfb4fa98 100644
--- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C
+++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C
@@ -53,7 +53,8 @@ Foam::fieldAverageItem::fieldAverageItem()
     fieldName_("unknown"),
     mean_(0),
     prime2Mean_(0),
-    base_(ITER)
+    base_(ITER),
+    window_(-1.0)
 {}
 
 
@@ -62,7 +63,8 @@ Foam::fieldAverageItem::fieldAverageItem(const fieldAverageItem& faItem)
     fieldName_(faItem.fieldName_),
     mean_(faItem.mean_),
     prime2Mean_(faItem.prime2Mean_),
-    base_(faItem.base_)
+    base_(faItem.base_),
+    window_(faItem.window_)
 {}
 
 
@@ -91,6 +93,7 @@ void Foam::fieldAverageItem::operator=(const fieldAverageItem& rhs)
     mean_ = rhs.mean_;
     prime2Mean_ = rhs.prime2Mean_;
     base_ = rhs.base_;
+    window_ = rhs.window_;
 }
 
 
diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H
index f08328b3d76..10d1e08ad3b 100644
--- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H
+++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H
@@ -33,9 +33,13 @@ Description
             mean            on;
             prime2Mean      on;
             base            time; // iteration
+            window          200;  // optional averaging window
         }
     \endverbatim
 
+    The averaging window corresponds to the averaging interval (iters or time)
+    If not specified, the averaging is over 'all iters/time'
+
 SourceFiles
     fieldAverageItem.C
     fieldAverageItemIO.C
@@ -100,6 +104,9 @@ private:
         //- Averaging base type
         baseType base_;
 
+        //- Averaging window - defaults to -1 for 'all iters/time'
+        scalar window_;
+
 
 public:
 
@@ -148,7 +155,7 @@ public:
             }
 
             //- Return true if base is ITER
-            Switch ITERBase() const
+            Switch iterBase() const
             {
                 return base_ == ITER;
             }
@@ -159,6 +166,11 @@ public:
                 return base_ == TIME;
             }
 
+            scalar window() const
+            {
+                return window_;
+            }
+
 
     // Member Operators
 
@@ -177,7 +189,8 @@ public:
                 a.fieldName_ == b.fieldName_
              && a.mean_ == b.mean_
              && a.prime2Mean_ == b.prime2Mean_
-             && a.base_ == b.base_;
+             && a.base_ == b.base_
+             && a.window_ == b.window_;
         }
 
         friend bool operator!=
diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C
index 945e4388671..4ebad485a7d 100644
--- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C
+++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C
@@ -33,7 +33,9 @@ Foam::fieldAverageItem::fieldAverageItem(Istream& is)
 :
     fieldName_("unknown"),
     mean_(0),
-    prime2Mean_(0)
+    prime2Mean_(0),
+    base_(ITER),
+    window_(-1.0)
 {
     is.check("Foam::fieldAverageItem::fieldAverageItem(Foam::Istream&)");
 
@@ -43,6 +45,7 @@ Foam::fieldAverageItem::fieldAverageItem(Istream& is)
     entry.lookup("mean") >> mean_;
     entry.lookup("prime2Mean") >> prime2Mean_;
     base_ = baseTypeNames_[entry.lookup("base")];
+    window_ = entry.lookupOrDefault<scalar>("window", -1.0);
 }
 
 
@@ -62,6 +65,7 @@ Foam::Istream& Foam::operator>>(Istream& is, fieldAverageItem& faItem)
     entry.lookup("mean") >> faItem.mean_;
     entry.lookup("prime2Mean") >> faItem.prime2Mean_;
     faItem.base_ = faItem.baseTypeNames_[entry.lookup("base")];
+    faItem.window_ = entry.lookupOrDefault<scalar>("window", -1.0);
 
     return is;
 }
@@ -80,7 +84,15 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const fieldAverageItem& faItem)
     os.writeKeyword("prime2Mean") << faItem.mean_
         << token::END_STATEMENT << nl;
     os.writeKeyword("base") << faItem.baseTypeNames_[faItem.base_]
-        << token::END_STATEMENT << nl << token::END_BLOCK << nl;
+        << token::END_STATEMENT << nl;
+
+    if (faItem.window_ > 0)
+    {
+        os.writeKeyword("window") << faItem.window_
+            << token::END_STATEMENT << nl;
+    }
+
+    os  << token::END_BLOCK << nl;
 
     os.check
     (
-- 
GitLab