From a6bab68565fac014ab52147ded059a9d4b12e1af Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Mon, 12 May 2008 15:33:53 +0100
Subject: [PATCH] adding new fieldAverage function object

---
 .../sampling/fieldAverage/Make/files          |   6 +
 .../sampling/fieldAverage/Make/options        |   9 +
 .../sampling/fieldAverage/controlDict         |  84 +++++
 .../fieldAverage/IOFieldAverage.H             |  50 +++
 .../fieldAverage/fieldAverage/fieldAverage.C  | 339 ++++++++++++++++++
 .../fieldAverage/fieldAverage/fieldAverage.H  | 293 +++++++++++++++
 .../fieldAverage/fieldAverageTemplates.C      | 243 +++++++++++++
 .../fieldAverageFunctionObject.C              |  43 +++
 .../fieldAverageFunctionObject.H              |  55 +++
 .../fieldAverageItem/fieldAverageItem.C       |  90 +++++
 .../fieldAverageItem/fieldAverageItem.H       | 194 ++++++++++
 .../fieldAverageItem/fieldAverageItemIO.C     |  98 +++++
 src/OpenFOAM/db/dictionary/dictionary.C       |  50 +++
 src/OpenFOAM/db/dictionary/dictionary.H       |  14 +-
 14 files changed, 1565 insertions(+), 3 deletions(-)
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/Make/files
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/Make/options
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/controlDict
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/IOFieldAverage.H
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.C
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.H
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverageTemplates.C
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.C
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.H
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.C
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.H
 create mode 100644 applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItemIO.C

diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/Make/files b/applications/utilities/postProcessing/sampling/fieldAverage/Make/files
new file mode 100644
index 00000000000..fa6148a012a
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/Make/files
@@ -0,0 +1,6 @@
+fieldAverage/fieldAverage.C
+fieldAverageItem/fieldAverageItem.C
+fieldAverageItem/fieldAverageItemIO.C
+fieldAverageFunctionObject/fieldAverageFunctionObject.C
+
+LIB = $(FOAM_LIBBIN)/libfieldAverage
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/Make/options b/applications/utilities/postProcessing/sampling/fieldAverage/Make/options
new file mode 100644
index 00000000000..3ec0599e216
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/Make/options
@@ -0,0 +1,9 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/OpenFOAM/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude
+
+LIB_LIBS = \
+    -lfiniteVolume \
+    -lOpenFOAM \
+    -lsampling
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/controlDict b/applications/utilities/postProcessing/sampling/fieldAverage/controlDict
new file mode 100644
index 00000000000..b20a0d1fdb7
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/controlDict
@@ -0,0 +1,84 @@
+/*---------------------------------------------------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  1.4                                   |
+|   \\  /    A nd           | Web:      http://www.openfoam.org               |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+
+FoamFile
+{
+    version         2.0;
+    format          ascii;
+
+    root            "";
+    case            "";
+    instance        "";
+    local           "";
+
+    class           dictionary;
+    object          controlDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     oodles;
+
+startFrom       latestTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.1;
+
+deltaT          1e-05;
+
+writeControl    timeStep;
+
+writeInterval   10;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression uncompressed;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable yes;
+
+functions
+(
+    fieldAverage1
+    {
+        // Type of functionObject
+        type fieldAverage;
+
+        // Where to load it from (if not already in solver)
+        functionObjectLibs ("libfieldAverage.so");
+
+        // Fields to be probed. runTime modifiable!
+        fields
+        (
+            U
+            {
+                mean            on;
+                prime2Mean      on;
+                base            time;
+            }
+            p
+            {
+                mean            on;
+                prime2Mean      on;
+                base            time;
+            }
+        );
+    }
+);
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/IOFieldAverage.H b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/IOFieldAverage.H
new file mode 100644
index 00000000000..32fdcb2b5eb
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/IOFieldAverage.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Typedef
+    IOfieldAverage
+
+Description
+    Instance of the generic IOOutputFilter for fieldAverage.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef IOfieldAverage_H
+#define IOfieldAverage_H
+
+#include "fieldAverage.H"
+#include "IOOutputFilter.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef IOOutputFilter<fieldAverage> IOFieldAverage;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.C b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.C
new file mode 100644
index 00000000000..72dfc002018
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.C
@@ -0,0 +1,339 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "fieldAverage.H"
+#include "volFields.H"
+#include "dictionary.H"
+#include "Time.H"
+#include "IFstream.H"
+#include "OFstream.H"
+
+#include "fieldAverageItem.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(fieldAverage, 0);
+}
+
+const Foam::word Foam::fieldAverage::EXT_MEAN = "Mean";
+const Foam::word Foam::fieldAverage::EXT_PRIME2MEAN = "Prime2Mean";
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::fieldAverage::resetLists(const label nItems)
+{
+    meanScalarFields_.clear();
+    meanScalarFields_.setSize(nItems);
+
+    meanVectorFields_.clear();
+    meanVectorFields_.setSize(nItems);
+
+    meanSymmTensorFields_.clear();
+    meanSymmTensorFields_.setSize(nItems);
+
+    meanSphericalTensorFields_.clear();
+    meanSphericalTensorFields_.setSize(nItems);
+
+    prime2MeanScalarFields_.clear();
+    prime2MeanScalarFields_.setSize(nItems);
+
+    prime2MeanSymmTensorFields_.clear();
+    prime2MeanSymmTensorFields_.setSize(nItems);
+
+    nSteps_.clear();
+    nSteps_.setSize(nItems, 1);
+
+    totalTime_.clear();
+    totalTime_.setSize(nItems, obr_.time().deltaT().value());
+}
+
+
+void Foam::fieldAverage::initialise()
+{
+    // Add mean fields to the field lists
+    forAll(faItems_, i)
+    {
+        const word fieldName = faItems_[i].fieldName();
+        if (obr_.foundObject<volScalarField>(fieldName))
+        {
+            addMeanFields<scalar>(i, meanScalarFields_);
+        }
+        else if (obr_.foundObject<volVectorField>(fieldName))
+        {
+            addMeanFields<vector>(i, meanVectorFields_);
+        }
+        else if (obr_.foundObject<volSymmTensorField>(fieldName))
+        {
+            addMeanFields<symmTensor>(i, meanSymmTensorFields_);
+        }
+        else if (obr_.foundObject<volSphericalTensorField>(fieldName))
+        {
+            addMeanFields<sphericalTensor>(i, meanSphericalTensorFields_);
+        }
+        else
+        {
+            FatalErrorIn("Foam::fieldAverage::initialise()")
+                << "Requested field " << faItems_[i].fieldName()
+                << " does not exist in the database" << nl
+                << exit(FatalError);
+        }
+    }
+
+    // Add prime-squared mean fields to the field lists
+    forAll(faItems_, i)
+    {
+        if (faItems_[i].prime2Mean())
+        {
+            const word fieldName = faItems_[i].fieldName();
+            if (obr_.foundObject<volScalarField>(fieldName))
+            {
+                if (!faItems_[i].mean())
+                {
+                    FatalErrorIn("Foam::fieldAverage::initialise()")
+                        << "To calculate the prime-squared average, the "
+                        << "mean average must also be selected for field "
+                        << fieldName << nl << exit(FatalError);
+                }
+                addPrime2MeanFields<scalar>(i, prime2MeanScalarFields_);
+            }
+            else if (obr_.foundObject<volVectorField>(fieldName))
+            {
+                if (!faItems_[i].mean())
+                {
+                    FatalErrorIn("Foam::fieldAverage::initialise()")
+                        << "To calculate the prime-squared average, the "
+                        << "mean average must also be selected for field "
+                        << fieldName << nl << exit(FatalError);
+                }
+                addPrime2MeanFields<vector>
+                (
+                    i,
+                    prime2MeanSymmTensorFields_
+                );
+            }
+            else
+            {
+                FatalErrorIn("Foam::fieldAverage::initialise()")
+                    << "prime2Mean average can only be applied to "
+                    << "volScalarFields and volVectorFields"
+                    << nl << "    Field: " << fieldName << nl
+                    << exit(FatalError);
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fieldAverage::fieldAverage
+(
+    const word& name,
+    const objectRegistry& obr,
+    const dictionary& dict,
+    const bool loadFromFiles
+)
+:
+    name_(name),
+    obr_(obr),
+    active_(true),
+    faItems_(dict.lookup("fields")),
+    meanScalarFields_(faItems_.size()),
+    meanVectorFields_(faItems_.size()),
+    meanSymmTensorFields_(faItems_.size()),
+    meanSphericalTensorFields_(faItems_.size()),
+    prime2MeanScalarFields_(faItems_.size()),
+    prime2MeanSymmTensorFields_(faItems_.size()),
+    nSteps_(faItems_.size(), 1),
+    totalTime_(faItems_.size(), obr_.time().deltaT().value())
+{
+    // Check if the available mesh is an fvMesh otherise deactivate
+    if (!isA<fvMesh>(obr_))
+    {
+        active_ = false;
+        WarningIn
+        (
+            "fieldAverage::fieldAverage"
+            "("
+                "const word&,"
+                "const objectRegistry&,"
+                "const dictionary&,"
+                "const bool"
+            ")"
+        )   << "No fvMesh available, deactivating."
+            << nl << endl;
+    }
+
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::fieldAverage::~fieldAverage()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::fieldAverage::read(const dictionary& dict)
+{
+    if (active_)
+    {
+        faItems_.clear();
+        faItems_ = List<fieldAverageItem>(dict.lookup("fields"));
+
+        resetLists(faItems_.size());
+
+        initialise();
+
+        readAveragingProperties();
+    }
+}
+
+
+void Foam::fieldAverage::write()
+{
+    if (active_)
+    {
+        calcAverages();
+
+        if (obr_.time().outputTime())
+        {
+            writeAverages();
+
+            writeAveragingProperties();
+        }
+    }
+}
+
+
+void Foam::fieldAverage::calcAverages()
+{
+    Info<< "Calculating averages" << nl << endl;
+    forAll(faItems_, i)
+    {
+        nSteps_[i]++;
+        totalTime_[i] += obr_.time().deltaT().value();
+    }
+
+    addMeanSqrToPrime2Mean<scalar>(prime2MeanScalarFields_);
+    addMeanSqrToPrime2Mean<vector>(prime2MeanSymmTensorFields_);
+
+    calculateMeanFields<scalar>(meanScalarFields_);
+    calculateMeanFields<vector>(meanVectorFields_);
+    calculateMeanFields<symmTensor>(meanSymmTensorFields_);
+    calculateMeanFields<sphericalTensor>(meanSphericalTensorFields_);
+
+    calculatePrime2MeanFields<scalar>(prime2MeanScalarFields_);
+    calculatePrime2MeanFields<vector>(prime2MeanSymmTensorFields_);
+}
+
+
+void Foam::fieldAverage::writeAverages() const
+{
+    writeFieldList<scalar>(meanScalarFields_);
+    writeFieldList<vector>(meanVectorFields_);
+    writeFieldList<symmTensor>(meanSymmTensorFields_);
+    writeFieldList<sphericalTensor>(meanSphericalTensorFields_);
+
+    writeFieldList<scalar>(prime2MeanScalarFields_);
+    writeFieldList<symmTensor>(prime2MeanSymmTensorFields_);
+}
+
+
+void Foam::fieldAverage::writeAveragingProperties() const
+{
+    IOdictionary propsDict
+    (
+        IOobject
+        (
+            "fieldAveragingProperties",
+            obr_.time().timeName(),
+            "uniform",
+            obr_,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        )
+    );
+
+    forAll(faItems_, i)
+    {
+        const word fieldName = faItems_[i].fieldName();
+        propsDict.add(fieldName, dictionary());
+        propsDict.subDict(fieldName).add("nSteps", nSteps_[i]);
+        propsDict.subDict(fieldName).add("totalTime", totalTime_[i]);
+    }
+
+    propsDict.regIOobject::write();
+}
+
+
+void Foam::fieldAverage::readAveragingProperties()
+{
+    IFstream propsFile
+    (
+        obr_.time().path()/obr_.time().timeName()
+       /"uniform"/"fieldAveragingProperties"
+    );
+
+    if (!propsFile.good())
+    {
+        return;
+    }
+
+    dictionary propsDict(dictionary::null, propsFile);
+
+    forAll(faItems_, i)
+    {
+        const word& fieldName = faItems_[i].fieldName();
+        if (propsDict.found(fieldName))
+        {
+            dictionary fieldDict(propsDict.subDict(fieldName));
+
+            nSteps_[i] = readLabel(fieldDict.lookup("nSteps"));
+            totalTime_[i] = readScalar(fieldDict.lookup("totalTime"));
+        }
+    }
+}
+
+
+void Foam::fieldAverage::updateMesh(const mapPolyMesh&)
+{
+    // Do nothing
+}
+
+
+void Foam::fieldAverage::movePoints(const pointField&)
+{
+    // Do nothing
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.H b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.H
new file mode 100644
index 00000000000..8fbad3dea65
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverage.H
@@ -0,0 +1,293 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::fieldAverage
+
+Description
+    Calculates the field averages given list of fieldAverageItems, e.g.
+
+    @verbatim
+        fields
+        (
+            U
+            {
+                mean            on;
+                prime2Mean      on;
+                base            time; // ensemble
+            }
+            p
+            {
+                mean            on;
+                prime2Mean      on;
+                base            time; // ensemble
+            }
+        );
+    @endverbatim
+
+    Member function calcAverages() calculates the averages.
+
+    Member function fieldAverage::write() calls calcAverages(). Average
+    field names are constructed by concatenating the base field with the
+    averaging type, e.g.
+    - base field, U
+    - arithmetic mean field, UMean
+    - prime-squared field, UPrime2Mean
+
+    Information regarding the number of averaging steps, and total averaging
+    time are written on a (base) per-field basis to the
+    fieldAveragingProperties dictionary, located in <time>/uniform
+
+SourceFiles
+    fieldAverage.C
+    fieldAverageTemplates.C
+    IOfieldAverage.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fieldAverage_H
+#define fieldAverage_H
+
+#include "volFieldsFwd.H"
+#include "pointFieldFwd.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class objectRegistry;
+class dictionary;
+class fieldAverageItem;
+class OFstream;
+template<class Type>
+class List;
+class mapPolyMesh;
+
+/*---------------------------------------------------------------------------*\
+                         Class fieldAverage Declaration
+\*---------------------------------------------------------------------------*/
+
+class fieldAverage
+{
+protected:
+
+    // Private data
+
+        //- Name of this set of field averages.
+        word name_;
+
+        //- Database this class is registered to
+        const objectRegistry& obr_;
+
+        //- On/off switch
+        bool active_;
+
+        //- List of field average items, describing waht averages to be
+        //  calculated and output
+        List<fieldAverageItem> faItems_;
+
+        // File and field name extensions
+
+            //- Mean average
+            static const word EXT_MEAN;
+
+            //- Prime-squared average
+            static const word EXT_PRIME2MEAN;
+
+
+        // Lists of averages
+
+            // Arithmetic mean fields
+            PtrList<volScalarField> meanScalarFields_;
+            PtrList<volVectorField> meanVectorFields_;
+            PtrList<volSymmTensorField> meanSymmTensorFields_;
+            PtrList<volSphericalTensorField> meanSphericalTensorFields_;
+
+            // Prime-squared fields - applicable to volVectorFields only
+            PtrList<volScalarField> prime2MeanScalarFields_;
+            PtrList<volSymmTensorField> prime2MeanSymmTensorFields_;
+
+
+        // Counters
+
+            //- Integration steps counter
+            List<label> nSteps_;
+
+            //- Total time counter
+            List<scalar> totalTime_;
+
+
+    // Private Member Functions
+
+        // Initialisation routines
+
+            //- Reset size of lists (clear existing values)
+            void resetLists(const label nItems);
+
+            //- Intitialise averaging. Check requested field averages are
+            //  valid, and populate field lists
+            void initialise();
+
+            //- Add mean average fields to PtrLists
+            template<class Type>
+            void addMeanFields
+            (
+                const label fieldi,
+                PtrList<GeometricField<Type, fvPatchField, volMesh> >&
+                    fieldList
+            );
+
+            //- Add prime-squared average fields to PtrLists
+            template<class Type1, class Type2>
+            void addPrime2MeanFields
+            (
+                const label fieldi,
+                PtrList<GeometricField<Type2, fvPatchField, volMesh> >&
+                    fieldList
+            );
+
+
+        // Calculation functions
+
+            //- Main calculation routine
+            virtual void calcAverages();
+
+            //- Calculate mean average fields
+            template<class Type>
+            void calculateMeanFields
+            (
+                PtrList<GeometricField<Type, fvPatchField, volMesh> >&
+                    fieldList
+            );
+
+            //- Add mean-squared field value to prime-squared mean field
+            template<class Type1, class Type2>
+            void addMeanSqrToPrime2Mean
+            (
+                PtrList<GeometricField<Type2, fvPatchField, volMesh> >&
+                    fieldList
+            );
+
+            //- Calculate prime-squared average fields
+            template<class Type1, class Type2>
+            void calculatePrime2MeanFields
+            (
+                PtrList<GeometricField<Type2, fvPatchField, volMesh> >&
+                    fieldList
+            );
+
+
+        // I-O
+
+            //- Write averages
+            virtual void writeAverages() const;
+
+            //- Write fields
+            template<class Type>
+            void writeFieldList
+            (
+                const PtrList<GeometricField<Type, fvPatchField, volMesh> >&
+                    fieldList
+            ) const;
+
+            //- Write averaging properties - steps and time
+            void writeAveragingProperties() const;
+
+            //- Read averaging properties - steps and time
+            void readAveragingProperties();
+
+
+        // Functions to be over-ridden from IOoutputFilter class
+
+            //- Update mesh
+            virtual void updateMesh(const mapPolyMesh&);
+
+            //- Move points
+            virtual void movePoints(const Field<point>&);
+
+
+        //- Disallow default bitwise copy construct
+        fieldAverage(const fieldAverage&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const fieldAverage&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("fieldAverage");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        fieldAverage
+        (
+            const word& name,
+            const objectRegistry&,
+            const dictionary&,
+            const bool loadFromFiles = false
+        );
+
+
+    //- Destructor
+
+        virtual ~fieldAverage();
+
+
+    // Member Functions
+
+        //- Return name of the set of field averages
+        virtual const word& name() const
+        {
+            return name_;
+        }
+
+        //- Read the field average data
+        virtual void read(const dictionary&);
+
+        //- Calculate the field average data and write
+        virtual void write();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "fieldAverageTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverageTemplates.C b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverageTemplates.C
new file mode 100644
index 00000000000..db65f3f9aaf
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverage/fieldAverageTemplates.C
@@ -0,0 +1,243 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2005 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "fieldAverageItem.H"
+#include "volFields.H"
+#include "OFstream.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template<class Type>
+void Foam::fieldAverage::addMeanFields
+(
+    const label fieldi,
+    PtrList<GeometricField<Type, fvPatchField, volMesh> >& fieldList
+)
+{
+    if (faItems_[fieldi].mean())
+    {
+        typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
+
+        const fvMesh& mesh = refCast<const fvMesh>(obr_);
+        const word& fieldName = faItems_[fieldi].fieldName();
+        const fieldType& baseField = mesh.lookupObject<fieldType>(fieldName);
+        const word meanFieldName = fieldName + EXT_MEAN;
+
+        Info<< "Reading/calculating field " << meanFieldName << nl << endl;
+        fieldList.set
+        (
+            fieldi,
+            new fieldType
+            (
+                IOobject
+                (
+                    meanFieldName,
+                    mesh.time().timeName(),
+                    mesh,
+                    IOobject::READ_IF_PRESENT,
+                    IOobject::NO_WRITE
+                ),
+                baseField
+            )
+        );
+    }
+}
+
+
+template<class Type1, class Type2>
+void Foam::fieldAverage::addPrime2MeanFields
+(
+    const label fieldi,
+    PtrList<GeometricField<Type2, fvPatchField, volMesh> >& fieldList
+)
+{
+    if (faItems_[fieldi].mean())
+    {
+        typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
+        typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
+
+        const fvMesh& mesh = refCast<const fvMesh>(obr_);
+        const word& fieldName = faItems_[fieldi].fieldName();
+        const fieldType1& baseField = mesh.lookupObject<fieldType1>(fieldName);
+        const fieldType1& meanField =
+            mesh.lookupObject<fieldType1>(fieldName + EXT_MEAN);
+        const word meanFieldName = fieldName + EXT_PRIME2MEAN;
+
+        Info<< "Reading/calculating field " << meanFieldName << nl << endl;
+        fieldList.set
+        (
+            fieldi,
+            new fieldType2
+            (
+                IOobject
+                (
+                    meanFieldName,
+                    mesh.time().timeName(),
+                    mesh,
+                    IOobject::READ_IF_PRESENT,
+                    IOobject::NO_WRITE
+                ),
+                sqr(baseField) - sqr(meanField)
+            )
+        );
+    }
+}
+
+
+template<class Type>
+void Foam::fieldAverage::calculateMeanFields
+(
+    PtrList<GeometricField<Type, fvPatchField, volMesh> >& fieldList
+)
+{
+    typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
+
+    const scalar dt = obr_.time().deltaT().value();
+
+    forAll(faItems_, i)
+    {
+        if (fieldList.set(i))
+        {
+            if (faItems_[i].mean())
+            {
+                const fvMesh& mesh = refCast<const fvMesh>(obr_);
+                const word& fieldName = faItems_[i].fieldName();
+                const fieldType& baseField =
+                    mesh.lookupObject<fieldType>(fieldName);
+                fieldType& meanField = fieldList[i];
+
+                scalar alpha = 0.0;
+                scalar beta = 0.0;
+                if (faItems_[i].timeBase())
+                {
+                    alpha = (totalTime_[i] - dt)/totalTime_[i];
+                    beta = dt/totalTime_[i];
+                }
+                else
+                {
+                    alpha = scalar(nSteps_[i] - 1)/scalar(nSteps_[i]);
+                    beta = 1.0/scalar(nSteps_[i]);
+                }
+
+                meanField = alpha*meanField + beta*baseField;
+            }
+        }
+    }
+}
+
+
+template<class Type1, class Type2>
+void Foam::fieldAverage::calculatePrime2MeanFields
+(
+    PtrList<GeometricField<Type2, fvPatchField, volMesh> >& fieldList
+)
+{
+    typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
+    typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
+
+    const scalar dt = obr_.time().deltaT().value();
+
+    forAll(faItems_, i)
+    {
+        if (fieldList.set(i))
+        {
+            if (faItems_[i].prime2Mean())
+            {
+                const fvMesh& mesh = refCast<const fvMesh>(obr_);
+                const word& fieldName = faItems_[i].fieldName();
+                const fieldType1& baseField =
+                    mesh.lookupObject<fieldType1>(fieldName);
+                const fieldType1& meanField =
+                    mesh.lookupObject<fieldType1>(fieldName + EXT_MEAN);
+                fieldType2& prime2MeanField = fieldList[i];
+
+                scalar alpha = 0.0;
+                scalar beta = 0.0;
+                if (faItems_[i].timeBase())
+                {
+                    alpha = (totalTime_[i] - dt)/totalTime_[i];
+                    beta = dt/totalTime_[i];
+                }
+                else
+                {
+                    alpha = scalar(nSteps_[i] - 1)/scalar(nSteps_[i]);
+                    beta = 1.0/scalar(nSteps_[i]);
+                }
+
+                prime2MeanField =
+                    alpha*prime2MeanField
+                  + beta*sqr(baseField)
+                  - sqr(meanField);
+            }
+        }
+    }
+}
+
+template<class Type1, class Type2>
+void Foam::fieldAverage::addMeanSqrToPrime2Mean
+(
+    PtrList<GeometricField<Type2, fvPatchField, volMesh> >& fieldList
+)
+{
+    typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
+    typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
+
+    forAll(faItems_, i)
+    {
+        if (fieldList.set(i))
+        {
+            if (faItems_[i].prime2Mean())
+            {
+                const fvMesh& mesh = refCast<const fvMesh>(obr_);
+                const word& fieldName = faItems_[i].fieldName();
+                const fieldType1& meanField =
+                    mesh.lookupObject<fieldType1>(fieldName + EXT_MEAN);
+                fieldType2& prime2MeanField = fieldList[i];
+
+                prime2MeanField += sqr(meanField);
+            }
+        }
+    }
+}
+
+
+template<class Type>
+void Foam::fieldAverage::writeFieldList
+(
+    const PtrList<GeometricField<Type, fvPatchField, volMesh> >& fieldList
+) const
+{
+    forAll(fieldList, i)
+    {
+        if (fieldList.set(i))
+        {
+            fieldList[i].write();
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.C b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.C
new file mode 100644
index 00000000000..98000a74693
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.C
@@ -0,0 +1,43 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "fieldAverageFunctionObject.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineNamedTemplateTypeNameAndDebug(fieldAverageFunctionObject, 0);
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        fieldAverageFunctionObject,
+        dictionary
+    );
+}
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.H b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.H
new file mode 100644
index 00000000000..570d5aef2e1
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageFunctionObject/fieldAverageFunctionObject.H
@@ -0,0 +1,55 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Typedef
+    fieldAverageFunctionObject
+
+Description
+    FunctionObject wrapper around fieldAverage to allow them to be created
+    via the functions list within controlDict.
+
+SourceFiles
+    fieldAverageFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fieldAverageFunctionObject_H
+#define fieldAverageFunctionObject_H
+
+#include "fieldAverage.H"
+#include "OutputFilterFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef OutputFilterFunctionObject<fieldAverage>
+        fieldAverageFunctionObject;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.C b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.C
new file mode 100644
index 00000000000..f14767db523
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.C
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "fieldAverageItem.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<>
+const char* Foam::NamedEnum<Foam::fieldAverageItem::baseType, 2>::names[] =
+{
+    "ensemble",
+    "time"
+};
+
+const Foam::NamedEnum<Foam::fieldAverageItem::baseType, 2>
+    Foam::fieldAverageItem::baseTypeNames_;
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fieldAverageItem::fieldAverageItem()
+:
+    fieldName_("unknown"),
+    mean_(0),
+    prime2Mean_(0),
+    base_(ENSEMBLE)
+{}
+
+
+Foam::fieldAverageItem::fieldAverageItem(const fieldAverageItem& faItem)
+:
+    fieldName_(faItem.fieldName_),
+    mean_(faItem.mean_),
+    prime2Mean_(faItem.prime2Mean_),
+    base_(faItem.base_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::fieldAverageItem::~fieldAverageItem()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+void Foam::fieldAverageItem::operator=(const fieldAverageItem& rhs)
+{
+    // Check for assignment to self
+    if (this == &rhs)
+    {
+        FatalErrorIn
+        (
+            "Foam::fieldAverageItem::operator=(const Foam::fieldAverageItem&)"
+        )   << "Attempted assignment to self" << nl
+            << abort(FatalError);
+    }
+
+    // Set updated values
+    fieldName_ = rhs.fieldName_;
+    mean_ = rhs.mean_;
+    prime2Mean_ = rhs.prime2Mean_;
+    base_ = rhs.base_;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.H b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.H
new file mode 100644
index 00000000000..18b0fabdfe1
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItem.H
@@ -0,0 +1,194 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::fieldAverageItem
+
+Description
+    Helper class to describe what form of averaging to apply. A set will be
+    applied to each base field in Foam::fieldAverage, of the form:
+
+    @verbatim
+        {
+            mean            on;
+            prime2Mean      on;
+            base            time; // ensemble
+        }
+    @endverbatim
+
+SourceFiles
+    fieldAverageItem.C
+    fieldAverageItemIO.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fieldAverageItem_H
+#define fieldAverageItem_H
+
+#include "NamedEnum.H"
+#include "Switch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class Istream;
+class Ostream;
+
+// Forward declaration of friend functions and operators
+class fieldAverageItem;
+Istream& operator>>(Istream&, fieldAverageItem&);
+Ostream& operator<<(Ostream&, const fieldAverageItem&);
+
+
+/*---------------------------------------------------------------------------*\
+                      Class fieldAverageItem Declaration
+\*---------------------------------------------------------------------------*/
+
+class fieldAverageItem
+{
+public:
+
+    // Public data
+
+        //- Enumeration defining the averaging base type
+        enum baseType
+        {
+            ENSEMBLE,
+            TIME
+        };
+
+
+private:
+
+    // Private data
+
+        //- Field name
+        word fieldName_;
+
+        //- Compute mean flag
+        Switch mean_;
+
+        //- Compute prime-squared mean flag
+        Switch prime2Mean_;
+
+        //- Averaging base type names
+        static const NamedEnum<baseType, 2> baseTypeNames_;
+
+        //- Averaging base type
+        baseType base_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+//        fieldAverageItem(const fieldAverageItem&);
+
+        //- Disallow default bitwise assignment
+//        void operator=(const fieldAverageItem&);
+
+
+public:
+
+    // Constructors
+
+        //- Construct null
+        fieldAverageItem();
+
+        //- Construct from Istream
+        fieldAverageItem(Istream&);
+
+        //- Construct as copy
+        fieldAverageItem(const fieldAverageItem&);
+
+
+    // Destructor
+
+        ~fieldAverageItem();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return const access to the field name
+            const word& fieldName() const
+            {
+                return fieldName_;
+            }
+
+            //- Return const access to the mean flag
+            const Switch& mean() const
+            {
+                return mean_;
+            }
+
+            //- Return const access to the prime-squared mean flag
+            const Switch& prime2Mean() const
+            {
+                return prime2Mean_;
+            }
+
+            //- Return averaging base type name
+            const word base() const
+            {
+                return baseTypeNames_[base_];
+            }
+
+            //- Return true if base is ensemble
+            Switch ensembleBase() const
+            {
+                return base_ == ENSEMBLE;
+            }
+
+            //- Return true if base is time
+            Switch timeBase() const
+            {
+                return base_ == TIME;
+            }
+
+
+    // Member Operators
+
+        void operator=(const fieldAverageItem&);
+
+
+    // IOstream Operators
+
+        friend Istream& operator>>(Istream&, fieldAverageItem&);
+        friend Ostream& operator<<(Ostream&, const fieldAverageItem&);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItemIO.C b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItemIO.C
new file mode 100644
index 00000000000..0e17b47a8ee
--- /dev/null
+++ b/applications/utilities/postProcessing/sampling/fieldAverage/fieldAverageItem/fieldAverageItemIO.C
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "fieldAverageItem.H"
+#include "IOstreams.H"
+#include "dictionaryEntry.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fieldAverageItem::fieldAverageItem(Istream& is)
+:
+    fieldName_("unknown"),
+    mean_(0),
+    prime2Mean_(0)
+{
+    is.check("Foam::fieldAverageItem::fieldAverageItem(Foam::Istream&)");
+
+    const dictionaryEntry entry(dictionary::null, is);
+
+    fieldName_ = entry.keyword();
+    entry.lookup("mean") >> mean_;
+    entry.lookup("prime2Mean") >> prime2Mean_;
+    base_ = baseTypeNames_[entry.lookup("base")];
+}
+
+
+// * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
+
+Foam::Istream& Foam::operator>>(Istream& is, fieldAverageItem& faItem)
+{
+    is.check
+    (
+        "Foam::Istream& Foam::operator>>"
+        "(Foam::Istream&, Foam::fieldAverageItem&)"
+    );
+
+    const dictionaryEntry entry(dictionary::null, is);
+
+    faItem.fieldName_ = entry.keyword();
+    entry.lookup("mean") >> faItem.mean_;
+    entry.lookup("prime2Mean") >> faItem.prime2Mean_;
+    faItem.base_ = faItem.baseTypeNames_[entry.lookup("base")];
+
+    return is;
+}
+
+
+Foam::Ostream& Foam::operator<<(Ostream& os, const fieldAverageItem& faItem)
+{
+    os.check
+    (
+        "Foam::Ostream& Foam::operator<<"
+        "(Foam::Ostream&, const Foam::fieldAverageItem&)"
+    );
+
+    os<< faItem.fieldName_ << nl;
+    os<< token::BEGIN_BLOCK << nl;
+    os.writeKeyword("mean") << faItem.mean_ << token::END_STATEMENT << nl;
+    os.writeKeyword("prime2Mean") << faItem.mean_
+        << token::END_STATEMENT << nl;
+    os.writeKeyword("base") << faItem.baseTypeNames_[faItem.base_]
+        << token::END_STATEMENT << nl;
+    os<< token::END_BLOCK << nl;
+
+    os.check
+    (
+        "Foam::Ostream& Foam::operator<<"
+        "(Foam::Ostream&, const Foam::fieldAverageItem&)"
+    );
+
+    return os;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/db/dictionary/dictionary.C b/src/OpenFOAM/db/dictionary/dictionary.C
index 2982ad32d4b..aea31e72c77 100644
--- a/src/OpenFOAM/db/dictionary/dictionary.C
+++ b/src/OpenFOAM/db/dictionary/dictionary.C
@@ -211,6 +211,34 @@ const Foam::entry* Foam::dictionary::lookupEntryPtr
 }
 
 
+Foam::entry* Foam::dictionary::lookupEntryPtr
+(
+    const word& keyword,
+    bool recusive
+)
+{
+    HashTable<entry*>::iterator iter = hashedEntries_.find(keyword);
+
+    if (iter == hashedEntries_.end())
+    {
+        if (recusive && &parent_ != &dictionary::null)
+        {
+            return const_cast<dictionary&>(parent_).lookupEntryPtr
+            (
+                keyword,
+                recusive
+            );
+        }
+        else
+        {
+            return NULL;
+        }
+    }
+
+    return iter();
+}
+
+
 const Foam::entry& Foam::dictionary::lookupEntry
 (
     const word& keyword,
@@ -293,6 +321,28 @@ const Foam::dictionary& Foam::dictionary::subDict(const word& keyword) const
 }
 
 
+Foam::dictionary& Foam::dictionary::subDict(const word& keyword)
+{
+    if (entry* entryPtr = lookupEntryPtr(keyword))
+    {
+        return entryPtr->dict();
+    }
+    else
+    {
+        // If keyword not found print error message ...
+        FatalIOErrorIn
+        (
+            "dictionary::subDict(const word& keyword) const",
+            *this
+        )   << " keyword " << keyword << " is undefined in dictionary "
+            << name()
+            << exit(FatalIOError);
+
+        return entryPtr->dict();
+    }
+}
+
+
 Foam::wordList Foam::dictionary::toc() const
 {
     wordList keywords(size());
diff --git a/src/OpenFOAM/db/dictionary/dictionary.H b/src/OpenFOAM/db/dictionary/dictionary.H
index 5b2a5390e54..93fc495d59b 100644
--- a/src/OpenFOAM/db/dictionary/dictionary.H
+++ b/src/OpenFOAM/db/dictionary/dictionary.H
@@ -87,7 +87,7 @@ public:
         //- Read dictionary from Istream
         bool read(Istream&);
 
-        //- Substitute the given keyword prepended by '$' with the 
+        //- Substitute the given keyword prepended by '$' with the
         //  corresponding sub-dictionary entries
         bool substituteKeyword(const word& keyword);
 
@@ -179,6 +179,11 @@ public:
             //  If recusive search parent dictionaries
             const entry* lookupEntryPtr(const word&, bool recusive=false) const;
 
+            //- Find and return an entry data stream pointer for manipulation
+            //  if present otherwise return NULL.
+            //  If recusive search parent dictionaries
+            entry* lookupEntryPtr(const word&, bool recusive=false);
+
             //- Find and return an entry data stream if present otherwise error.
             //  If recusive search parent dictionaries
             const entry& lookupEntry(const word&, bool recusive=false) const;
@@ -202,6 +207,9 @@ public:
             //- Find and return a sub-dictionary
             const dictionary& subDict(const word&) const;
 
+            //- Find and return a sub-dictionary for manipulation
+            dictionary& subDict(const word&);
+
             //- Return the table of contents
             wordList toc() const;
 
@@ -262,7 +270,7 @@ public:
             void clear();
 
 
-        // Write 
+        // Write
 
             void write(Ostream& os, bool subDict = true) const;
 
@@ -303,7 +311,7 @@ public:
 // those from dict2.
 // Warn, but do not overwrite the entries from dict1.
 dictionary operator+(const dictionary& dict1, const dictionary& dict2);
-   
+
 // Combine dictionaries starting from the entries in dict one and then including
 // those from dict2.
 // Do not overwrite the entries from dict1.
-- 
GitLab