diff --git a/src/postProcessing/functionObjects/field/Make/files b/src/postProcessing/functionObjects/field/Make/files index 8b1788a4e6..56e02fe21d 100644 --- a/src/postProcessing/functionObjects/field/Make/files +++ b/src/postProcessing/functionObjects/field/Make/files @@ -42,5 +42,6 @@ Lambda2/Lambda2.C CourantNo/CourantNo.C PecletNo/PecletNo.C blendingFactor/blendingFactor.C +pressure/pressure.C LIB = $(FOAM_LIBBIN)/libfieldFunctionObjects diff --git a/src/postProcessing/functionObjects/field/pressure/pressure.C b/src/postProcessing/functionObjects/field/pressure/pressure.C new file mode 100644 index 0000000000..ebc6d8a327 --- /dev/null +++ b/src/postProcessing/functionObjects/field/pressure/pressure.C @@ -0,0 +1,260 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-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 "pressure.H" +#include "volFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace functionObjects +{ + defineTypeNameAndDebug(pressure, 0); + addToRunTimeSelectionTable(functionObject, pressure, dictionary); +} +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::word Foam::functionObjects::pressure::resultName() const +{ + word rName; + + if (calcTotal_) + { + rName = "total(" + fieldName_ + ")"; + } + else + { + rName = "static(" + fieldName_ + ")"; + } + + if (calcCoeff_) + { + rName += "_coeff"; + } + + return rName; +} + + +Foam::tmp Foam::functionObjects::pressure::rhoScale +( + const volScalarField& p +) const +{ + if (p.dimensions() == dimPressure) + { + return p; + } + else + { + return dimensionedScalar("rhoInf", dimDensity, rhoInf_)*p; + } +} + + +Foam::tmp Foam::functionObjects::pressure::rhoScale +( + const volScalarField& p, + const tmp& tsf +) const +{ + if (p.dimensions() == dimPressure) + { + return lookupField(rhoName_)*tsf; + } + else + { + return dimensionedScalar("rhoInf", dimDensity, rhoInf_)*tsf; + } +} + + +Foam::tmp Foam::functionObjects::pressure::pRef +( + const tmp& tp +) const +{ + if (calcTotal_) + { + return tp + dimensionedScalar("pRef", dimPressure, pRef_); + } + else + { + return tmp(tp.ptr()); + } +} + + +Foam::tmp Foam::functionObjects::pressure::pDyn +( + const volScalarField& p, + const tmp& tp +) const +{ + if (calcTotal_) + { + return + tp + + rhoScale(p, 0.5*magSqr(lookupField(UName_))); + } + else + { + return tmp(tp.ptr()); + } +} + + +Foam::tmp +Foam::functionObjects::pressure::coeff +( + const tmp& tp +) const +{ + if (calcCoeff_) + { + tmp tpCoeff(tp.ptr()); + volScalarField& pCoeff = tpCoeff.ref(); + + pCoeff -= dimensionedScalar("pInf", dimPressure, pInf_); + + const dimensionedScalar pSmall("pSmall", dimPressure, SMALL); + const dimensionedVector U("U", dimVelocity, UInf_); + const dimensionedScalar rho("rho", dimDensity, rhoInf_); + + pCoeff /= 0.5*rho*magSqr(U) + pSmall; + + return tpCoeff; + } + else + { + return tmp(tp.ptr()); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::functionObjects::pressure::pressure +( + const word& name, + const Time& runTime, + const dictionary& dict +) +: + fieldExpression(name, runTime, dict, "p"), + UName_("U"), + rhoName_("rho"), + calcTotal_(false), + pRef_(0), + calcCoeff_(false), + pInf_(0), + UInf_(Zero), + rhoInf_(1) +{ + read(dict); + + dimensionSet pDims(dimPressure); + + if (calcCoeff_) + { + pDims /= dimPressure; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::functionObjects::pressure::~pressure() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::functionObjects::pressure::read(const dictionary& dict) +{ + dict.readIfPresent("U", UName_); + dict.readIfPresent("rho", rhoName_); + + if (rhoName_ == "rhoInf") + { + dict.lookup("rhoInf") >> rhoInf_; + } + + dict.lookup("calcTotal") >> calcTotal_; + if (calcTotal_) + { + dict.lookup("pRef") >> pRef_; + } + + dict.lookup("calcCoeff") >> calcCoeff_; + if (calcCoeff_) + { + dict.lookup("pInf") >> pInf_; + dict.lookup("UInf") >> UInf_; + dict.lookup("rhoInf") >> rhoInf_; + + scalar zeroCheck = 0.5*rhoInf_*magSqr(UInf_) + pInf_; + + if (mag(zeroCheck) < ROOTVSMALL) + { + WarningInFunction + << type() << " " << name() << ": " + << "Coefficient calculation requested, but reference " + << "pressure level is zero. Please check the supplied " + << "values of pInf, UInf and rhoInf" << endl; + } + } + + resultName_ = dict.lookupOrDefault("result", resultName()); + + return true; +} + + +bool Foam::functionObjects::pressure::execute(const bool postProcess) +{ + if (foundField(fieldName_)) + { + const volScalarField& p = lookupField(fieldName_); + + return store + ( + resultName_, + coeff(pRef(pDyn(p, rhoScale(p)))) + ); + } + else + { + return false; + } +} + + +// ************************************************************************* // diff --git a/src/postProcessing/functionObjects/forces/pressureTools/pressureTools.H b/src/postProcessing/functionObjects/field/pressure/pressure.H similarity index 62% rename from src/postProcessing/functionObjects/forces/pressureTools/pressureTools.H rename to src/postProcessing/functionObjects/field/pressure/pressure.H index a14a88dffc..bd92001723 100644 --- a/src/postProcessing/functionObjects/forces/pressureTools/pressureTools.H +++ b/src/postProcessing/functionObjects/field/pressure/pressure.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Class - Foam::functionObjects::pressureTools + Foam::functionObjects::pressure Group grpForcesFunctionObjects @@ -33,54 +33,54 @@ Description - static pressure \f[ - p_s = \rho p_k + p = \rho p_k \f] - total pressure \f[ - p_T = p_{ref} + p_s + 0.5 \rho |U|^2 + p_0 = p_{ref} + p + 0.5 \rho |U|^2 \f] - static pressure coefficient \f[ - Cp_s = \frac{p_s - p_{\inf}}{0.5 \rho_{\inf} |U_{\inf}|^2} + Cp = \frac{p - p_{\inf}}{0.5 \rho_{\inf} |U_{\inf}|^2} \f] - total pressure coefficient \f[ - Cp_T = \frac{p_T - p_{\inf}}{0.5 \rho_{\inf} |U_{\inf}|^2} + Cp_0 = \frac{p_0 - p_{\inf}}{0.5 \rho_{\inf} |U_{\inf}|^2} \f] where \vartable - \rho | density [kg/m3] - U | velocity [m/s] - \rho_{\inf} | freestream density [kg/m3] - p_{\inf} | freestream pressure [Pa] - U_{\inf} | freestream velocity [m/s] - p_k | kinematic pressure (p/rho)[m2/s2] - p_s | pressure [Pa] - p_T | total pressure [Pa] - p_{ref} | reference pressure level [Pa] - Cp_{s} | pressure coefficient - Cp_{T} | total pressure coefficient + \rho | Density [kg/m3] + U | Velocity [m/s] + \rho_{\inf} | Freestream density [kg/m3] + p_{\inf} | Freestream pressure [Pa] + U_{\inf} | Freestream velocity [m/s] + p_k | Kinematic pressure (p/rho)[m2/s2] + p | Pressure [Pa] + p_0 | Total pressure [Pa] + p_{ref} | Reference pressure level [Pa] + Cp | Pressure coefficient + Cp_0 | Total pressure coefficient \endvartable The function object will operate on both kinematic (\f$ p_k \f$) and static - pressure (\f$ p_s \f$) fields, and the result is written as a + pressure (\f$ p \f$) fields, and the result is written as a volScalarField. The modes of operation are: \table Mode | calcTotal | calcCoeff - static pressure | no | no - total pressure | yes | no - pressure coefficient | no | yes - total pressure coefficient | yes | yes + Static pressure | no | no + Total pressure | yes | no + Pressure coefficient | no | yes + Total pressure coefficient | yes | yes \endtable Example of function object specification to calculate pressure coefficient: \verbatim - pressureTools1 + pressure1 { - type pressureTools; + type pressure; libs ("libutilityFunctionObjects.so"); ... calcTotal no; @@ -90,28 +90,33 @@ Description \heading Function object usage \table - Property | Description | Required | Default value - type | type name: pressureTools| yes | - calcTotal | Calculate total coefficient | yes | - pRef | Reference pressure for total pressure | no | 0.0 + Property | Description | Required | Default value + type | type name: pressure | yes | + field | Name of the pressure field | no | p + U | Name of the velocity field | no | U + rho | Name of the density field | no | rho + result | Name of the resulting field | no | derived from p + calcTotal | Calculate total coefficient | yes | + pRef | Reference pressure for total pressure | no | 0 calcCoeff | Calculate pressure coefficient | yes | pInf | Freestream pressure for coefficient calculation | no | UInf | Freestream velocity for coefficient calculation | no | - rhoInf | Freestream density for coefficient calculation | no | + rhoInf | Freestream density for coefficient calculation | no | \endtable SeeAlso + Foam::functionObjects::fieldExpression Foam::functionObjects::fvMeshFunctionObject SourceFiles - pressureTools.C + pressure.C \*---------------------------------------------------------------------------*/ -#ifndef functionObjects_pressureTools_H -#define functionObjects_pressureTools_H +#ifndef functionObjects_pressure_H +#define functionObjects_pressure_H -#include "fvMeshFunctionObject.H" +#include "fieldExpression.H" #include "volFieldsFwd.H" #include "dimensionedScalar.H" @@ -123,18 +128,15 @@ namespace functionObjects { /*---------------------------------------------------------------------------*\ - Class pressureTools Declaration + Class pressure Declaration \*---------------------------------------------------------------------------*/ -class pressureTools +class pressure : - public fvMeshFunctionObject + public fieldExpression { // Private data - //- Name of pressure field, default is "p" - word pName_; - //- Name of velocity field, default is "U" word UName_; @@ -169,40 +171,42 @@ class pressureTools // Private Member Functions //- Return the name of the derived pressure field - word pName() const; + word resultName() const; - //- Return the density scaling if supplied with kinematic pressure - dimensionedScalar rhoScale(const volScalarField& p) const; + //- Multiply the static pressure p by rhoInf if necessary and return + tmp rhoScale(const volScalarField& p) const; - //- Return the density field - tmp rho(const volScalarField& p) const; + //- Multiply the given field by rho or rhoInf as appropriate and return + tmp rhoScale + ( + const volScalarField& p, + const tmp& tsf + ) const; //- Return the reference pressure - dimensionedScalar pRef() const; + tmp pRef(const tmp& tp) const; //- Calculate and return the dynamic pressure - tmp pDyn(const volScalarField& p) const; + tmp pDyn + ( + const volScalarField& p, + const tmp& tp + ) const; //- Convert to coeff by applying the freestream dynamic pressure scaling - tmp convertToCoeff(const volScalarField& p) const; - - //- Disallow default bitwise copy construct - pressureTools(const pressureTools&); - - //- Disallow default bitwise assignment - void operator=(const pressureTools&); + tmp coeff(const tmp& tp) const; public: //- Runtime type information - TypeName("pressureTools"); + TypeName("pressure"); // Constructors //- Construct from Time and dictionary - pressureTools + pressure ( const word& name, const Time& runTime, @@ -211,19 +215,16 @@ public: //- Destructor - virtual ~pressureTools(); + virtual ~pressure(); // Member Functions - //- Read the pressureTools data + //- Read the pressure data virtual bool read(const dictionary&); - //- Execute, currently does nothing + //- Calculate the selected pressure form virtual bool execute(const bool postProcess = false); - - //- Calculate the pressureTools and write - virtual bool write(const bool postProcess = false); }; diff --git a/src/postProcessing/functionObjects/forces/Make/files b/src/postProcessing/functionObjects/forces/Make/files index 1e8ec75d09..f4bde58606 100644 --- a/src/postProcessing/functionObjects/forces/Make/files +++ b/src/postProcessing/functionObjects/forces/Make/files @@ -1,4 +1,3 @@ -pressureTools/pressureTools.C wallShearStress/wallShearStress.C forces/forces.C forceCoeffs/forceCoeffs.C diff --git a/src/postProcessing/functionObjects/forces/pressureTools/pressureTools.C b/src/postProcessing/functionObjects/forces/pressureTools/pressureTools.C deleted file mode 100644 index 41e17303c6..0000000000 --- a/src/postProcessing/functionObjects/forces/pressureTools/pressureTools.C +++ /dev/null @@ -1,311 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 2012-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 "pressureTools.H" -#include "volFields.H" -#include "addToRunTimeSelectionTable.H" - -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ -namespace functionObjects -{ - defineTypeNameAndDebug(pressureTools, 0); - addToRunTimeSelectionTable(functionObject, pressureTools, dictionary); -} -} - - -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // - -Foam::word Foam::functionObjects::pressureTools::pName() const -{ - word fieldName = pName_; - - if (calcTotal_) - { - fieldName = "total(" + fieldName + ")"; - } - else - { - fieldName = "static(" + fieldName + ")"; - } - - if (calcCoeff_) - { - fieldName = fieldName + "_coeff"; - } - - return fieldName; -} - - -Foam::dimensionedScalar Foam::functionObjects::pressureTools::rhoScale -( - const volScalarField& p -) const -{ - if (p.dimensions() == dimPressure) - { - return dimensionedScalar("1", dimless, 1.0); - } - else - { - return dimensionedScalar("rhoRef", dimDensity, rhoInf_); - } -} - - -Foam::tmp Foam::functionObjects::pressureTools::rho -( - const volScalarField& p -) const -{ - if (p.dimensions() == dimPressure) - { - return p.mesh().lookupObject(rhoName_); - } - else - { - return - tmp - ( - new volScalarField - ( - IOobject - ( - "rho", - p.mesh().time().timeName(), - p.mesh(), - IOobject::NO_READ, - IOobject::NO_WRITE - ), - p.mesh(), - dimensionedScalar("zero", dimDensity, rhoInf_) - ) - ); - } -} - - -Foam::dimensionedScalar Foam::functionObjects::pressureTools::pRef() const -{ - dimensionedScalar value("pRef", dimPressure, 0.0); - - if (calcTotal_) - { - value.value() += pRef_; - } - - return value; -} - - -Foam::tmp Foam::functionObjects::pressureTools::pDyn -( - const volScalarField& p -) const -{ - tmp tpDyn - ( - new volScalarField - ( - IOobject - ( - "pDyn", - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("zero", dimPressure, 0.0) - ) - ); - - if (calcTotal_) - { - const volVectorField& U = obr_.lookupObject(UName_); - - tpDyn.ref() == rho(p)*0.5*magSqr(U); - } - - return tpDyn; -} - - -Foam::tmp -Foam::functionObjects::pressureTools::convertToCoeff -( - const volScalarField& p -) const -{ - tmp tCoeff(p); - - if (calcCoeff_) - { - tCoeff.ref() -= dimensionedScalar("pInf", dimPressure, pInf_); - - const dimensionedScalar p0("p0", dimPressure, SMALL); - const dimensionedVector U("U", dimVelocity, UInf_); - const dimensionedScalar rho("rho", dimDensity, rhoInf_); - - tCoeff.ref() /= 0.5*rho*magSqr(U) + p0; - } - - return tCoeff; -} - - -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -Foam::functionObjects::pressureTools::pressureTools -( - const word& name, - const Time& runTime, - const dictionary& dict -) -: - fvMeshFunctionObject(name, runTime, dict), - pName_("p"), - UName_("U"), - rhoName_("rho"), - calcTotal_(false), - pRef_(0.0), - calcCoeff_(false), - pInf_(0.0), - UInf_(Zero), - rhoInf_(0.0) -{ - read(dict); - - dimensionSet pDims(dimPressure); - - if (calcCoeff_) - { - pDims /= dimPressure; - } - - volScalarField* pPtr - ( - new volScalarField - ( - IOobject - ( - pName(), - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("0", pDims, 0.0) - ) - ); - - mesh_.objectRegistry::store(pPtr); -} - - -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -Foam::functionObjects::pressureTools::~pressureTools() -{} - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -bool Foam::functionObjects::pressureTools::read(const dictionary& dict) -{ - dict.readIfPresent("p", pName_); - dict.readIfPresent("U", UName_); - dict.readIfPresent("rho", rhoName_); - - if (rhoName_ == "rhoInf") - { - dict.lookup("rhoInf") >> rhoInf_; - } - - dict.lookup("calcTotal") >> calcTotal_; - if (calcTotal_) - { - dict.lookup("pRef") >> pRef_; - } - - dict.lookup("calcCoeff") >> calcCoeff_; - if (calcCoeff_) - { - dict.lookup("pInf") >> pInf_; - dict.lookup("UInf") >> UInf_; - dict.lookup("rhoInf") >> rhoInf_; - - scalar zeroCheck = 0.5*rhoInf_*magSqr(UInf_) + pInf_; - - if (mag(zeroCheck) < ROOTVSMALL) - { - WarningInFunction - << type() << " " << name() << ": " - << "Coefficient calculation requested, but reference " - << "pressure level is zero. Please check the supplied " - << "values of pInf, UInf and rhoInf" << endl; - } - } - - return true; -} - - -bool Foam::functionObjects::pressureTools::execute(const bool postProcess) -{ - const volScalarField& p = obr_.lookupObject(pName_); - - volScalarField& pResult = const_cast - ( - obr_.lookupObject(pName()) - ); - - pResult == convertToCoeff(rhoScale(p)*p + pDyn(p) + pRef()); - - return true; -} - - -bool Foam::functionObjects::pressureTools::write(const bool postProcess) -{ - const volScalarField& pResult = - obr_.lookupObject(pName()); - - Info<< type() << " " << name() << " output:" << nl - << " writing field " << pResult.name() << nl - << endl; - - pResult.write(); - - return true; -} - - -// ************************************************************************* //