mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
functionObjects/field/histogram: New functionObject to write the volume-weighted histogram of a volScalarField
e.g.
pressureHistogram
{
type histogram;
functionObjectLibs ("libfieldFunctionObjects.so");
field p;
nBins 100;
min -5;
max 5;
setFormat gnuplot;
}
This commit is contained in:
@ -46,4 +46,7 @@ surfaceInterpolateFields/surfaceInterpolateFieldsFunctionObject.C
|
|||||||
regionSizeDistribution/regionSizeDistribution.C
|
regionSizeDistribution/regionSizeDistribution.C
|
||||||
regionSizeDistribution/regionSizeDistributionFunctionObject.C
|
regionSizeDistribution/regionSizeDistributionFunctionObject.C
|
||||||
|
|
||||||
|
histogram/histogram.C
|
||||||
|
histogram/histogramFunctionObject.C
|
||||||
|
|
||||||
LIB = $(FOAM_LIBBIN)/libfieldFunctionObjects
|
LIB = $(FOAM_LIBBIN)/libfieldFunctionObjects
|
||||||
|
|||||||
221
src/postProcessing/functionObjects/field/histogram/histogram.C
Normal file
221
src/postProcessing/functionObjects/field/histogram/histogram.C
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#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<const scalarField*> 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<fvMesh>(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<scalar>::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<const fvMesh>(obr_);
|
||||||
|
|
||||||
|
autoPtr<volScalarField> fieldPtr;
|
||||||
|
if (obr_.foundObject<volScalarField>(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<volScalarField>(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<scalar>());
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
204
src/postProcessing/functionObjects/field/histogram/histogram.H
Normal file
204
src/postProcessing/functionObjects/field/histogram/histogram.H
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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<writer<scalar>> 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
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "histogramFunctionObject.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineNamedTemplateTypeNameAndDebug
|
||||||
|
(
|
||||||
|
histogramFunctionObject,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
functionObject,
|
||||||
|
histogramFunctionObject,
|
||||||
|
dictionary
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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<functionObjects::histogram>
|
||||||
|
histogramFunctionObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user