diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index 783518dfe5b2270c070740679422a93f3c8c4779..360ecc6b0725713a59f2992301b63e074f183fec 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -122,6 +122,7 @@ $(derivedFvPatchFields)/directMappedFixedValue/directMappedFixedValueFvPatchFiel $(derivedFvPatchFields)/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C $(derivedFvPatchFields)/directMappedFlowRate/directMappedFlowRateFvPatchVectorField.C $(derivedFvPatchFields)/fan/fanFvPatchFields.C +$(derivedFvPatchFields)/fanPressure/fanPressureFvPatchScalarField.C $(derivedFvPatchFields)/buoyantPressure/buoyantPressureFvPatchScalarField.C $(derivedFvPatchFields)/fixedFluxPressure/fixedFluxPressureFvPatchScalarField.C $(derivedFvPatchFields)/fixedInternalValueFvPatchField/fixedInternalValueFvPatchFields.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.C new file mode 100644 index 0000000000000000000000000000000000000000..db585345f17f85c048ae0468cd21073a11ee0a33 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.C @@ -0,0 +1,237 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ 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 "fanPressureFvPatchScalarField.H" +#include "addToRunTimeSelectionTable.H" +#include "volFields.H" +#include "surfaceFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + template<> + const char* Foam::NamedEnum + < + Foam::fanPressureFvPatchScalarField::fanFlowDirection, + 2 + >::names[] = + { + "in", + "out" + }; +} + +const Foam::NamedEnum +< + Foam::fanPressureFvPatchScalarField::fanFlowDirection, + 2 +> Foam::fanPressureFvPatchScalarField::fanFlowDirectionNames_; + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + fixedValueFvPatchScalarField(p, iF), + phiName_("phi"), + rhoName_("rho"), + p0_(p.size(), 0.0), + fanCurve_(), + direction_(ffdOut) +{} + + +Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField +( + const fanPressureFvPatchScalarField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + fixedValueFvPatchScalarField(ptf, p, iF, mapper), + phiName_(ptf.phiName_), + rhoName_(ptf.rhoName_), + p0_(ptf.p0_, mapper), + fanCurve_(ptf.fanCurve_), + direction_(ptf.direction_) +{} + + +Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + fixedValueFvPatchScalarField(p, iF), + phiName_(dict.lookupOrDefault<word>("phi", "phi")), + rhoName_(dict.lookupOrDefault<word>("rho", "rho")), + p0_("p0", dict, p.size()), + fanCurve_(dict), + direction_(fanFlowDirectionNames_.read(dict.lookup("direction"))) +{ + // Assign initial pressure by "value" + fvPatchField<scalar>::operator==(scalarField("value", dict, p.size())); +} + + +Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField +( + const fanPressureFvPatchScalarField& pfopsf +) +: + fixedValueFvPatchScalarField(pfopsf), + phiName_(pfopsf.phiName_), + rhoName_(pfopsf.rhoName_), + p0_(pfopsf.p0_), + fanCurve_(pfopsf.fanCurve_), + direction_(pfopsf.direction_) +{} + + +Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField +( + const fanPressureFvPatchScalarField& pfopsf, + const DimensionedField<scalar, volMesh>& iF +) +: + fixedValueFvPatchScalarField(pfopsf, iF), + phiName_(pfopsf.phiName_), + rhoName_(pfopsf.rhoName_), + p0_(pfopsf.p0_), + fanCurve_(pfopsf.fanCurve_), + direction_(pfopsf.direction_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::fanPressureFvPatchScalarField::updateCoeffs() +{ + if (updated()) + { + return; + } + + // Retrieve flux field + const surfaceScalarField& phi = + db().lookupObject<surfaceScalarField>(phiName_); + + const fvsPatchField<scalar>& phip = + patch().patchField<surfaceScalarField, scalar>(phi); + + int dir = 2*direction_ - 1; + + // Average volumetric flow rate + scalar aveFlowRate = 0; + + if (phi.dimensions() == dimVelocity*dimArea) + { + aveFlowRate = dir*gSum(phip)/gSum(patch().magSf()); + } + else if (phi.dimensions() == dimVelocity*dimArea*dimDensity) + { + const scalarField& rhop = + patch().lookupPatchField<volScalarField, scalar>(rhoName_); + aveFlowRate = dir*gSum(phip/rhop)/gSum(patch().magSf()); + } + else + { + FatalErrorIn("fanPressureFvPatchScalarField::updateCoeffs()") + << "dimensions of phi are not correct" + << "\n on patch " << patch().name() + << " of field " << dimensionedInternalField().name() + << " in file " << dimensionedInternalField().objectPath() << nl + << exit(FatalError); + } + + // Normal flow through fan + if (aveFlowRate >= 0.0) + { + // Pressure drop for this flow rate + const scalar pdFan = fanCurve_(aveFlowRate); + + operator==(p0_ - dir*pdFan); + } + // Reverse flow + else + { + // Assume that fan has stalled if flow reversed + // i.e. apply dp for zero flow rate + const scalar pdFan = fanCurve_(0); + + // Flow speed across patch + scalarField Up = phip/(patch().magSf()); + + // Pressure drop associated withback flow = dynamic pressure + scalarField pdBackFlow = 0.5*magSqr(Up); + + if (phi.dimensions() == dimVelocity*dimArea*dimDensity) + { + const scalarField& rhop = + patch().lookupPatchField<volScalarField, scalar>(rhoName_); + pdBackFlow /= rhop; + } + + operator==(p0_ - dir*(pdBackFlow + pdFan)); + } + + fixedValueFvPatchScalarField::updateCoeffs(); +} + + +void Foam::fanPressureFvPatchScalarField::write(Ostream& os) const +{ + fvPatchScalarField::write(os); + os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl; + os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl; + fanCurve_.write(os); + os.writeKeyword("direction") + << fanFlowDirectionNames_[direction_] << token::END_STATEMENT << nl; + p0_.writeEntry("p0", os); + writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + makePatchTypeField + ( + fvPatchScalarField, + fanPressureFvPatchScalarField + ); +}; + + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H new file mode 100644 index 0000000000000000000000000000000000000000..7c3d9ff4116cf48f9fe98017a9ea6e0737e334b2 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H @@ -0,0 +1,205 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ 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::fanPressureFvPatchScalarField + +Description + Assigns pressure inlet or outlet condition for a fan. + + User specifies: + - pressure drop vs volumetric flow rate table (fan curve) file name; + - direction of normal flow through the fan, in or out; + - total pressure of the environment. + + Example of the boundary condition specification: + \verbatim + inlet + { + type fanPressure; + fileName "fanCurve"; // Fan curve file name + outOfBounds clamp; // (error|warn|clamp|repeat) + direction in; // Direction of flow through fan + p0 uniform 0; // Environmental total pressure + value uniform 0; // Initial pressure + } + + outlet + { + type fanPressure; + fileName "fanCurve"; // Fan curve file name + outOfBounds clamp; // (error|warn|clamp|repeat) + direction out; // Direction of flow through fan + p0 uniform 0; // Environmental total pressure + value uniform 0; // Initial pressure + } + \endverbatim + +See Also + Foam::interpolationTable and + Foam::timeVaryingFlowRateInletVelocityFvPatchVectorField + +SourceFiles + fanPressureFvPatchScalarField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fanPressureFvPatchScalarField_H +#define fanPressureFvPatchScalarField_H + +#include "fvPatchFields.H" +#include "fixedValueFvPatchFields.H" +#include "interpolationTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class fanPressureFvPatchScalarField Declaration +\*---------------------------------------------------------------------------*/ + +class fanPressureFvPatchScalarField +: + public fixedValueFvPatchScalarField +{ + // Private data + + //- Name of the flux transporting the field + word phiName_; + + //- Name of the density field + word rhoName_; + + //- Total pressure + scalarField p0_; + + //- Tabulated fan curve + interpolationTable<scalar> fanCurve_; + + //- Fan flow direction + enum fanFlowDirection + { + ffdIn, + ffdOut + }; + + static const NamedEnum<fanFlowDirection, 2> fanFlowDirectionNames_; + + //- Direction of flow through the fan relative to patch + fanFlowDirection direction_; + + +public: + + //- Runtime type information + TypeName("fanPressure"); + + + // Constructors + + //- Construct from patch and internal field + fanPressureFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + fanPressureFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given + // fanPressureFvPatchScalarField + // onto a new patch + fanPressureFvPatchScalarField + ( + const fanPressureFvPatchScalarField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + fanPressureFvPatchScalarField + ( + const fanPressureFvPatchScalarField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new fanPressureFvPatchScalarField(*this) + ); + } + + //- Construct as copy setting internal field reference + fanPressureFvPatchScalarField + ( + const fanPressureFvPatchScalarField&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchScalarField> clone + ( + const DimensionedField<scalar, volMesh>& iF + ) const + { + return tmp<fvPatchScalarField> + ( + new fanPressureFvPatchScalarField + ( + *this, + iF + ) + ); + } + + + // Member functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //