/*---------------------------------------------------------------------------*\ ========= | \\ / 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 . 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 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 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 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 surfacePtr_; // Protected Member Functions //- Initialise, e.g. face addressing void initialise(const dictionary& dict); //- Return true if the field name is valid template bool validField(const word& fieldName) const; //- Return field values by looking up field name template tmp> 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 Type processSameTypeValues ( const Field& values, const vectorField& Sf, const scalarField& weightField ) const; //- Apply the 'operation' to the values. Wrapper around // processSameTypeValues. See also template specialisation below. template Type processValues ( const Field& 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 bool writeValues ( const word& fieldName, const scalarField& weightField, const bool orient ); //- Filter a surface field according to faceIds template tmp> filterField ( const GeometricField& field, const bool applyOrientation ) const; //- Filter a volume field according to faceIds template tmp> filterField ( const GeometricField& 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& values, const vectorField& Sf, const scalarField& weightField ) const; //- Specialisation for vector template<> vector faceSource::processValues ( const Field& 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 // ************************************************************************* //