diff --git a/src/postProcessing/functionObjects/field/Make/files b/src/postProcessing/functionObjects/field/Make/files
index 75464c4013..24a3e5b599 100644
--- a/src/postProcessing/functionObjects/field/Make/files
+++ b/src/postProcessing/functionObjects/field/Make/files
@@ -46,4 +46,7 @@ surfaceInterpolateFields/surfaceInterpolateFieldsFunctionObject.C
regionSizeDistribution/regionSizeDistribution.C
regionSizeDistribution/regionSizeDistributionFunctionObject.C
+histogram/histogram.C
+histogram/histogramFunctionObject.C
+
LIB = $(FOAM_LIBBIN)/libfieldFunctionObjects
diff --git a/src/postProcessing/functionObjects/field/histogram/histogram.C b/src/postProcessing/functionObjects/field/histogram/histogram.C
new file mode 100644
index 0000000000..3f4e46eaab
--- /dev/null
+++ b/src/postProcessing/functionObjects/field/histogram/histogram.C
@@ -0,0 +1,221 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
+ \\/ 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 3 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, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "histogram.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(histogram, 0);
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+void Foam::functionObjects::histogram::writeGraph
+(
+ const coordSet& coords,
+ const word& fieldName,
+ const scalarField& values
+) const
+{
+ const wordList fieldNames(1, fieldName);
+
+ fileName outputPath = baseTimeDir();
+ mkDir(outputPath);
+ OFstream graphFile
+ (
+ outputPath/formatterPtr_().getFileName(coords, fieldNames)
+ );
+
+ Info<< "Writing histogram of " << fieldName
+ << " to " << graphFile.name() << endl;
+
+ List yPtrs(1);
+ yPtrs[0] = &values;
+ formatterPtr_().write(coords, fieldNames, yPtrs, graphFile);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::histogram::histogram
+(
+ const word& name,
+ const objectRegistry& obr,
+ const dictionary& dict,
+ const bool loadFromFiles
+)
+:
+ functionObjectFile(obr, name, typeName),
+ name_(name),
+ obr_(obr),
+ active_(true)
+{
+ // Check if the available mesh is an fvMesh, otherwise deactivate
+ if (isA(obr_))
+ {
+ read(dict);
+ }
+ else
+ {
+ active_ = false;
+ WarningInFunction
+ << "No fvMesh available, deactivating " << name_ << nl
+ << endl;
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::histogram::~histogram()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::functionObjects::histogram::read(const dictionary& dict)
+{
+ if (active_)
+ {
+ dict.lookup("field") >> fieldName_;
+ dict.lookup("max") >> max_;
+ min_ = 0.0;
+ dict.readIfPresent("min", min_);
+ dict.lookup("nBins") >> nBins_;
+
+ word format(dict.lookup("setFormat"));
+ formatterPtr_ = writer::New(format);
+ }
+}
+
+
+void Foam::functionObjects::histogram::execute()
+{}
+
+
+void Foam::functionObjects::histogram::end()
+{}
+
+
+void Foam::functionObjects::histogram::timeSet()
+{}
+
+
+void Foam::functionObjects::histogram::write()
+{
+ if (active_)
+ {
+ Info<< type() << " " << name_ << " output:" << nl;
+
+ const fvMesh& mesh = refCast(obr_);
+
+ autoPtr fieldPtr;
+ if (obr_.foundObject(fieldName_))
+ {
+ Info<< " Looking up field " << fieldName_ << endl;
+ }
+ else
+ {
+ Info<< " Reading field " << fieldName_ << endl;
+ fieldPtr.reset
+ (
+ new volScalarField
+ (
+ IOobject
+ (
+ fieldName_,
+ mesh.time().timeName(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::NO_WRITE
+ ),
+ mesh
+ )
+ );
+ }
+
+ const volScalarField& field =
+ (
+ fieldPtr.valid()
+ ? fieldPtr()
+ : obr_.lookupObject(fieldName_)
+ );
+
+ // Calculate the mid-points of bins for the graph axis
+ pointField xBin(nBins_);
+ const scalar delta = (max_- min_)/nBins_;
+
+ scalar x = min_ + 0.5*delta;
+ forAll(xBin, i)
+ {
+ xBin[i] = point(x, 0, 0);
+ x += delta;
+ }
+
+ scalarField volFrac(nBins_, 0);
+ const scalarField& V = mesh.V();
+
+ forAll(field, celli)
+ {
+ const label bini = (field[celli] - min_)/delta;
+ if (bini >= 0 && bini < nBins_)
+ {
+ volFrac[bini] += V[celli];
+ }
+ }
+
+ Pstream::listCombineGather(volFrac, plusEqOp());
+
+ if (Pstream::master())
+ {
+ const scalar sumVol = sum(volFrac);
+
+ if (sumVol > SMALL)
+ {
+ volFrac /= sumVol;
+
+ const coordSet coords
+ (
+ "Volume_Fraction",
+ "x",
+ xBin,
+ mag(xBin)
+ );
+
+ writeGraph(coords, field.name(), volFrac);
+ }
+ }
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/field/histogram/histogram.H b/src/postProcessing/functionObjects/field/histogram/histogram.H
new file mode 100644
index 0000000000..8d0c367f84
--- /dev/null
+++ b/src/postProcessing/functionObjects/field/histogram/histogram.H
@@ -0,0 +1,204 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
+ \\/ 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 3 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, see .
+
+Class
+ Foam::functionObjects::histogram
+
+Group
+ grpFieldFunctionObjects
+
+Description
+ Write the volume-weighted histogram of a volScalarField.
+
+ Example of function object specification:
+ \verbatim
+ histogram1
+ {
+ type histogram;
+
+ functionObjectLibs ("libfieldFunctionObjects.so");
+
+ field p;
+ nBins 100;
+ min -5;
+ max 5;
+ setFormat gnuplot;
+ }
+ \endverbatim
+
+ \heading Function object usage
+ \table
+ Property | Description | Required | Default value
+ type | type name: histogram | yes |
+ field | Field to analyse | yes |
+ nBins | Number of bins for the histogram | yes|
+ max | Maximum value sampled | yes |
+ min | minimum value sampled | no | 0
+ setFormat | Output format | yes |
+ \endtable
+
+SeeAlso
+ Foam::functionObject
+ Foam::OutputFilterFunctionObject
+
+SourceFiles
+ histogram.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_histogram_H
+#define functionObjects_histogram_H
+
+#include "functionObjectFile.H"
+#include "writer.H"
+#include "volFieldsFwd.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class mapPolyMesh;
+class polyMesh;
+
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class histogram Declaration
+\*---------------------------------------------------------------------------*/
+
+class histogram
+:
+ public functionObjectFile
+{
+ // Private data
+
+ //- Name of this set of histogram objects
+ word name_;
+
+ const objectRegistry& obr_;
+
+ //- on/off switch
+ bool active_;
+
+ //- Name of field
+ word fieldName_;
+
+ //- Maximum value
+ scalar max_;
+
+ //- Minimum value
+ scalar min_;
+
+ //- Mumber of bins
+ label nBins_;
+
+ //- Output formatter to write
+ autoPtr> formatterPtr_;
+
+
+ // Private Member Functions
+
+ void writeGraph
+ (
+ const coordSet& coords,
+ const word& valueName,
+ const scalarField& values
+ ) const;
+
+ //- Disallow default bitwise copy construct
+ histogram(const histogram&);
+
+ //- Disallow default bitwise assignment
+ void operator=(const histogram&);
+
+
+public:
+
+ //- Runtime type information
+ TypeName("histogram");
+
+
+ // Constructors
+
+ //- Construct for given objectRegistry and dictionary.
+ // Allow the possibility to load fields from files
+ histogram
+ (
+ const word& name,
+ const objectRegistry&,
+ const dictionary&,
+ const bool loadFromFiles = false
+ );
+
+
+ // Destructor
+
+ virtual ~histogram();
+
+
+ // Member Functions
+
+ //- Return name of the set of histogram
+ virtual const word& name() const
+ {
+ return name_;
+ }
+
+ //- Read the histogram data
+ virtual void read(const dictionary&);
+
+ //- Execute, currently does nothing
+ virtual void execute();
+
+ //- Execute at the final time-loop, currently does nothing
+ virtual void end();
+
+ //- Called when time was set at the end of the Time::operator++
+ virtual void timeSet();
+
+ //- Calculate the histogram and write
+ virtual void write();
+
+ //- Update for changes of mesh
+ virtual void updateMesh(const mapPolyMesh&)
+ {}
+
+ //- Update for changes of mesh
+ virtual void movePoints(const polyMesh&)
+ {}
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/field/histogram/histogramFunctionObject.C b/src/postProcessing/functionObjects/field/histogram/histogramFunctionObject.C
new file mode 100644
index 0000000000..fbbcf34e48
--- /dev/null
+++ b/src/postProcessing/functionObjects/field/histogram/histogramFunctionObject.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
+ \\/ 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 3 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, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "histogramFunctionObject.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineNamedTemplateTypeNameAndDebug
+ (
+ histogramFunctionObject,
+ 0
+ );
+
+ addToRunTimeSelectionTable
+ (
+ functionObject,
+ histogramFunctionObject,
+ dictionary
+ );
+}
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/field/histogram/histogramFunctionObject.H b/src/postProcessing/functionObjects/field/histogram/histogramFunctionObject.H
new file mode 100644
index 0000000000..c246af837e
--- /dev/null
+++ b/src/postProcessing/functionObjects/field/histogram/histogramFunctionObject.H
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
+ \\/ 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 3 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, see .
+
+Typedef
+ Foam::histogramFunctionObject
+
+Description
+ FunctionObject wrapper around histogram to allow it to be
+ created via the functions list within controlDict.
+
+SourceFiles
+ histogramFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef histogramFunctionObject_H
+#define histogramFunctionObject_H
+
+#include "histogram.H"
+#include "OutputFilterFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ typedef OutputFilterFunctionObject
+ histogramFunctionObject;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //