with the more general and flexible 'postProcess' utility and '-postProcess' solver option
Rationale
---------
Both the 'postProcess' utility and '-postProcess' solver option use the
same extensive set of functionObjects available for data-processing
during the run avoiding the substantial code duplication necessary for
the 'foamCalc' and 'postCalc' utilities and simplifying maintenance.
Additionally consistency is guaranteed between solver data processing
and post-processing.
The functionObjects have been substantially re-written and generalized
to simplify development and encourage contribution.
Configuration
-------------
An extensive set of simple functionObject configuration files are
provided in
OpenFOAM-dev/etc/caseDicts/postProcessing
and more will be added in the future. These can either be copied into
'<case>/system' directory and included into the 'controlDict.functions'
sub-dictionary or included directly from 'etc/caseDicts/postProcessing'
using the '#includeEtc' directive or the new and more convenient
'#includeFunc' directive which searches the
'<etc>/caseDicts/postProcessing' directories for the selected
functionObject, e.g.
functions
{
#includeFunc Q
#includeFunc Lambda2
}
'#includeFunc' first searches the '<case>/system' directory in case
there is a local configuration.
Description of #includeFunc
---------------------------
Specify a functionObject dictionary file to include, expects the
functionObject name to follow (without quotes).
Search for functionObject dictionary file in
user/group/shipped directories.
The search scheme allows for version-specific and
version-independent files using the following hierarchy:
- \b user settings:
- ~/.OpenFOAM/\<VERSION\>/caseDicts/postProcessing
- ~/.OpenFOAM/caseDicts/postProcessing
- \b group (site) settings (when $WM_PROJECT_SITE is set):
- $WM_PROJECT_SITE/\<VERSION\>/caseDicts/postProcessing
- $WM_PROJECT_SITE/caseDicts/postProcessing
- \b group (site) settings (when $WM_PROJECT_SITE is not set):
- $WM_PROJECT_INST_DIR/site/\<VERSION\>/caseDicts/postProcessing
- $WM_PROJECT_INST_DIR/site/caseDicts/postProcessing
- \b other (shipped) settings:
- $WM_PROJECT_DIR/etc/caseDicts/postProcessing
An example of the \c \#includeFunc directive:
\verbatim
#includeFunc <funcName>
\endverbatim
postProcess
-----------
The 'postProcess' utility and '-postProcess' solver option provide the
same set of controls to execute functionObjects after the run either by
reading a specified set of fields to process in the case of
'postProcess' or by reading all fields and models required to start the
run in the case of '-postProcess' for each selected time:
postProcess -help
Usage: postProcess [OPTIONS]
options:
-case <dir> specify alternate case directory, default is the cwd
-constant include the 'constant/' dir in the times list
-dict <file> read control dictionary from specified location
-field <name> specify the name of the field to be processed, e.g. U
-fields <list> specify a list of fields to be processed, e.g. '(U T p)' -
regular expressions not currently supported
-func <name> specify the name of the functionObject to execute, e.g. Q
-funcs <list> specify the names of the functionObjects to execute, e.g.
'(Q div(U))'
-latestTime select the latest time
-newTimes select the new times
-noFunctionObjects
do not execute functionObjects
-noZero exclude the '0/' dir from the times list, has precedence
over the -withZero option
-parallel run in parallel
-region <name> specify alternative mesh region
-roots <(dir1 .. dirN)>
slave root directories for distributed running
-time <ranges> comma-separated time ranges - eg, ':10,20,40:70,1000:'
-srcDoc display source code in browser
-doc display application documentation in browser
-help print the usage
pimpleFoam -postProcess -help
Usage: pimpleFoam [OPTIONS]
options:
-case <dir> specify alternate case directory, default is the cwd
-constant include the 'constant/' dir in the times list
-dict <file> read control dictionary from specified location
-field <name> specify the name of the field to be processed, e.g. U
-fields <list> specify a list of fields to be processed, e.g. '(U T p)' -
regular expressions not currently supported
-func <name> specify the name of the functionObject to execute, e.g. Q
-funcs <list> specify the names of the functionObjects to execute, e.g.
'(Q div(U))'
-latestTime select the latest time
-newTimes select the new times
-noFunctionObjects
do not execute functionObjects
-noZero exclude the '0/' dir from the times list, has precedence
over the -withZero option
-parallel run in parallel
-postProcess Execute functionObjects only
-region <name> specify alternative mesh region
-roots <(dir1 .. dirN)>
slave root directories for distributed running
-time <ranges> comma-separated time ranges - eg, ':10,20,40:70,1000:'
-srcDoc display source code in browser
-doc display application documentation in browser
-help print the usage
The functionObjects to execute may be specified on the command-line
using the '-func' option for a single functionObject or '-funcs' for a
list, e.g.
postProcess -func Q
postProcess -funcs '(div(U) div(phi))'
In the case of 'Q' the default field to process is 'U' which is
specified in and read from the configuration file but this may be
overridden thus:
postProcess -func 'Q(Ua)'
as is done in the example above to calculate the two forms of the divergence of
the velocity field. Additional fields which the functionObjects may depend on
can be specified using the '-field' or '-fields' options.
The 'postProcess' utility can only be used to execute functionObjects which
process fields present in the time directories. However, functionObjects which
depend on fields obtained from models, e.g. properties derived from turbulence
models can be executed using the '-postProcess' of the appropriate solver, e.g.
pisoFoam -postProcess -func PecletNo
or
sonicFoam -postProcess -func MachNo
In this case all required fields will have already been read so the '-field' or
'-fields' options are not be needed.
Henry G. Weller
CFD Direct Ltd.
450 lines
13 KiB
C++
450 lines
13 KiB
C++
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2011-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::fieldValues::faceSource
|
|
|
|
Group
|
|
grpFieldFunctionObjects
|
|
|
|
Description
|
|
This function object provides a 'face source' variant of the fieldValues
|
|
function object. Given a list of user-specified fields and a selection
|
|
of mesh (or general surface) faces, a number of operations can be
|
|
performed, such as sums, averages and integrations.
|
|
|
|
\linebreak
|
|
For example, to calculate the volumetric or mass flux across a patch,
|
|
apply the 'sum' operator to the flux field (typically \c phi)
|
|
|
|
Example of function object specification:
|
|
\verbatim
|
|
faceSource1
|
|
{
|
|
type faceSource;
|
|
libs ("libfieldFunctionObjects.so");
|
|
...
|
|
log yes;
|
|
valueOutput true;
|
|
surfaceFormat none;
|
|
source faceZone;
|
|
sourceName f0;
|
|
operation sum;
|
|
weightField alpha1;
|
|
fields
|
|
(
|
|
p
|
|
phi
|
|
U
|
|
);
|
|
}
|
|
\endverbatim
|
|
|
|
\heading Function object usage
|
|
\table
|
|
Property | Description | Required | Default value
|
|
type | type name: faceSource | yes |
|
|
log | write data to standard output | no | no
|
|
valueOutput | write the output values | yes |
|
|
writeArea | Write the area of the faceSource | no |
|
|
surfaceFormat | output value format | no |
|
|
source | face source: see below | yes |
|
|
sourceName | name of face source if required | no |
|
|
operation | operation to perform | yes |
|
|
weightField | name of field to apply weighting | no |
|
|
orientedWeightField | name of oriented field to apply weighting | no |
|
|
scaleFactor | scale factor | no | 1
|
|
fields | list of fields to operate on | yes |
|
|
orientedFields | list of oriented fields to operate on | no |
|
|
\endtable
|
|
|
|
\linebreak
|
|
Where \c source is defined by
|
|
\plaintable
|
|
faceZone | requires a 'sourceName' entry to specify the faceZone
|
|
patch | requires a 'sourceName' entry to specify the patch
|
|
sampledSurface | requires a 'sampledSurfaceDict' sub-dictionary
|
|
\endplaintable
|
|
|
|
\linebreak
|
|
The \c operation is one of:
|
|
\plaintable
|
|
none | no operation
|
|
sum | sum
|
|
sumMag | sum of component magnitudes
|
|
sumDirection | sum values which are positive in given direction
|
|
sumDirectionBalance | sum of balance of values in given direction
|
|
average | ensemble average
|
|
weightedAverage | weighted average
|
|
areaAverage | area weighted average
|
|
weightedAreaAverage | weighted area average
|
|
areaIntegrate | area integral
|
|
min | minimum
|
|
max | maximum
|
|
CoV | coefficient of variation: standard deviation/mean
|
|
areaNormalAverage| area weighted average in face normal direction
|
|
areaNormalIntegrate | area weighted integral in face normal directon
|
|
\endplaintable
|
|
|
|
Note
|
|
- The values reported by the areaNormalAverage and areaNormalIntegrate
|
|
operations are written as the first component of a field with the same
|
|
rank as the input field.
|
|
- faces on empty patches get ignored
|
|
- if the field is a volField the \c faceZone can only consist of boundary
|
|
faces
|
|
- the `oriented' entries relate to mesh-oriented fields, such as the
|
|
flux, phi. These fields will be oriented according to the face normals.
|
|
- using \c sampledSurfaces:
|
|
- not available for surface fields
|
|
- if interpolate=true they use \c interpolationCellPoint
|
|
otherwise they use cell values
|
|
- each triangle in \c sampledSurface is logically only in one cell
|
|
so interpolation will be wrong when triangles are larger than
|
|
cells. This can only happen for sampling on a \c triSurfaceMesh
|
|
- take care when using isoSurfaces - these might have duplicate
|
|
triangles and so integration might be wrong
|
|
|
|
SeeAlso
|
|
Foam::fieldValues
|
|
Foam::functionObject
|
|
|
|
SourceFiles
|
|
faceSource.C
|
|
faceSourceTemplates.C
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef functionObjects_faceSource_H
|
|
#define functionObjects_faceSource_H
|
|
|
|
#include "fieldValue.H"
|
|
#include "NamedEnum.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
|
|
class sampledSurface;
|
|
class surfaceWriter;
|
|
|
|
namespace functionObjects
|
|
{
|
|
namespace fieldValues
|
|
{
|
|
|
|
/*---------------------------------------------------------------------------*\
|
|
Class faceSource Declaration
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
class faceSource
|
|
:
|
|
public fieldValue
|
|
{
|
|
|
|
public:
|
|
|
|
// Public data types
|
|
|
|
//- Source type enumeration
|
|
enum sourceType
|
|
{
|
|
stFaceZone,
|
|
stPatch,
|
|
stSampledSurface
|
|
};
|
|
|
|
//- Source type names
|
|
static const NamedEnum<sourceType, 3> sourceTypeNames_;
|
|
|
|
|
|
//- Operation type enumeration
|
|
enum operationType
|
|
{
|
|
opNone,
|
|
opSum,
|
|
opSumMag,
|
|
opSumDirection,
|
|
opSumDirectionBalance,
|
|
opAverage,
|
|
opWeightedAverage,
|
|
opAreaAverage,
|
|
opWeightedAreaAverage,
|
|
opAreaIntegrate,
|
|
opMin,
|
|
opMax,
|
|
opCoV,
|
|
opAreaNormalAverage,
|
|
opAreaNormalIntegrate
|
|
};
|
|
|
|
//- Operation type names
|
|
static const NamedEnum<operationType, 15> operationTypeNames_;
|
|
|
|
|
|
private:
|
|
|
|
// Private Member Functions
|
|
|
|
//- Set faces to evaluate based on a face zone
|
|
void setFaceZoneFaces();
|
|
|
|
//- Set faces to evaluate based on a patch
|
|
void setPatchFaces();
|
|
|
|
//- Set faces according to sampledSurface
|
|
void sampledSurfaceFaces(const dictionary&);
|
|
|
|
//- Combine mesh faces and points from multiple processors
|
|
void combineMeshGeometry
|
|
(
|
|
faceList& faces,
|
|
pointField& points
|
|
) const;
|
|
|
|
//- Combine surface faces and points from multiple processors
|
|
void combineSurfaceGeometry
|
|
(
|
|
faceList& faces,
|
|
pointField& points
|
|
) const;
|
|
|
|
//- Calculate and return total area of the faceSource: sum(magSf)
|
|
scalar totalArea() const;
|
|
|
|
|
|
protected:
|
|
|
|
// Protected data
|
|
|
|
//- Surface writer
|
|
autoPtr<surfaceWriter> surfaceWriterPtr_;
|
|
|
|
//- Source type
|
|
sourceType source_;
|
|
|
|
//- Operation to apply to values
|
|
operationType operation_;
|
|
|
|
//- Weight field name - optional
|
|
word weightFieldName_;
|
|
|
|
//- Flag to indicate if flipMap should be applied to the weight field
|
|
bool orientWeightField_;
|
|
|
|
//- Start index of fields that require application of flipMap
|
|
label orientedFieldsStart_;
|
|
|
|
//- Scale factor - optional
|
|
scalar scaleFactor_;
|
|
|
|
//- Total area of the faceSource
|
|
scalar totalArea_;
|
|
|
|
//- Optionally write the area of the faceSource
|
|
bool writeArea_;
|
|
|
|
//- Global number of faces
|
|
label nFaces_;
|
|
|
|
|
|
// If operating on mesh faces (faceZone, patch)
|
|
|
|
//- Local list of face IDs
|
|
labelList faceId_;
|
|
|
|
//- Local list of patch ID per face
|
|
labelList facePatchId_;
|
|
|
|
//- List of +1/-1 representing face flip map
|
|
// (1 use as is, -1 negate)
|
|
labelList faceSign_;
|
|
|
|
|
|
// If operating on sampledSurface
|
|
|
|
//- Underlying sampledSurface
|
|
autoPtr<sampledSurface> surfacePtr_;
|
|
|
|
|
|
// Protected Member Functions
|
|
|
|
//- Initialise, e.g. face addressing
|
|
void initialise(const dictionary& dict);
|
|
|
|
//- Return true if the field name is valid
|
|
template<class Type>
|
|
bool validField(const word& fieldName) const;
|
|
|
|
//- Return field values by looking up field name
|
|
template<class Type>
|
|
tmp<Field<Type>> getFieldValues
|
|
(
|
|
const word& fieldName,
|
|
const bool mustGet = false,
|
|
const bool applyOrientation = false
|
|
) const;
|
|
|
|
//- Apply the 'operation' to the values. Operation has to
|
|
// preserve Type.
|
|
template<class Type>
|
|
Type processSameTypeValues
|
|
(
|
|
const Field<Type>& values,
|
|
const vectorField& Sf,
|
|
const scalarField& weightField
|
|
) const;
|
|
|
|
//- Apply the 'operation' to the values. Wrapper around
|
|
// processSameTypeValues. See also template specialisation below.
|
|
template<class Type>
|
|
Type processValues
|
|
(
|
|
const Field<Type>& values,
|
|
const vectorField& Sf,
|
|
const scalarField& weightField
|
|
) const;
|
|
|
|
//- Output file header information
|
|
virtual void writeFileHeader(const label i);
|
|
|
|
|
|
public:
|
|
|
|
//- Run-time type information
|
|
TypeName("faceSource");
|
|
|
|
|
|
// Constructors
|
|
|
|
//- Construct from name, Time and dictionary
|
|
faceSource
|
|
(
|
|
const word& name,
|
|
const Time& runTime,
|
|
const dictionary& dict
|
|
);
|
|
|
|
//- Construct from name, objectRegistry and dictionary
|
|
faceSource
|
|
(
|
|
const word& name,
|
|
const objectRegistry& obr,
|
|
const dictionary& dict
|
|
);
|
|
|
|
|
|
//- Destructor
|
|
virtual ~faceSource();
|
|
|
|
|
|
// Public Member Functions
|
|
|
|
//- Return the source type
|
|
inline const sourceType& source() const;
|
|
|
|
//- Return the local list of face IDs
|
|
inline const labelList& faceId() const;
|
|
|
|
//- Return the local list of patch ID per face
|
|
inline const labelList& facePatch() const;
|
|
|
|
//- Return the list of +1/-1 representing face flip map
|
|
inline const labelList& faceSign() const;
|
|
|
|
//- Templated helper function to output field values
|
|
template<class Type>
|
|
bool writeValues
|
|
(
|
|
const word& fieldName,
|
|
const scalarField& weightField,
|
|
const bool orient
|
|
);
|
|
|
|
//- Filter a surface field according to faceIds
|
|
template<class Type>
|
|
tmp<Field<Type>> filterField
|
|
(
|
|
const GeometricField<Type, fvsPatchField, surfaceMesh>& field,
|
|
const bool applyOrientation
|
|
) const;
|
|
|
|
//- Filter a volume field according to faceIds
|
|
template<class Type>
|
|
tmp<Field<Type>> filterField
|
|
(
|
|
const GeometricField<Type, fvPatchField, volMesh>& field,
|
|
const bool applyOrientation
|
|
) const;
|
|
|
|
//- Read from dictionary
|
|
virtual bool read(const dictionary&);
|
|
|
|
//- Calculate and write
|
|
virtual bool write(const bool postProcess = false);
|
|
};
|
|
|
|
|
|
//- Specialisation for scalar
|
|
template<>
|
|
scalar faceSource::processValues
|
|
(
|
|
const Field<scalar>& values,
|
|
const vectorField& Sf,
|
|
const scalarField& weightField
|
|
) const;
|
|
|
|
|
|
//- Specialisation for vector
|
|
template<>
|
|
vector faceSource::processValues
|
|
(
|
|
const Field<vector>& values,
|
|
const vectorField& Sf,
|
|
const scalarField& weightField
|
|
) const;
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
} // End namespace fieldValues
|
|
} // End namespace functionObjects
|
|
} // End namespace Foam
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#include "faceSourceI.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#ifdef NoRepository
|
|
#include "faceSourceTemplates.C"
|
|
#endif
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#endif
|
|
|
|
// ************************************************************************* //
|