diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index 8255173c60..b6ed32a48a 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -147,6 +147,7 @@ $(derivedFvPatchFields)/fixedMean/fixedMeanFvPatchFields.C $(derivedFvPatchFields)/fixedNormalSlip/fixedNormalSlipFvPatchFields.C $(derivedFvPatchFields)/fixedPressureCompressibleDensity/fixedPressureCompressibleDensityFvPatchScalarField.C $(derivedFvPatchFields)/flowRateInletVelocity/flowRateInletVelocityFvPatchVectorField.C +$(derivedFvPatchFields)/flowRateOutletVelocity/flowRateOutletVelocityFvPatchVectorField.C $(derivedFvPatchFields)/fluxCorrectedVelocity/fluxCorrectedVelocityFvPatchVectorField.C $(derivedFvPatchFields)/freestream/freestreamFvPatchFields.C $(derivedFvPatchFields)/freestreamPressure/freestreamPressureFvPatchScalarField.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/flowRateInletVelocity/flowRateInletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/flowRateInletVelocity/flowRateInletVelocityFvPatchVectorField.H index 286004f97b..71e15694fb 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/flowRateInletVelocity/flowRateInletVelocityFvPatchVectorField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/flowRateInletVelocity/flowRateInletVelocityFvPatchVectorField.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -28,9 +28,9 @@ Group grpInletBoundaryConditions Description - This boundary condition provides a velocity boundary condition, derived - from the flux (volumetric or mass-based), whose direction is assumed - to be normal to the patch. + Velocity inlet boundary condition either correcting the extrapolated + velocity or creating a uniform velocity field normal to the patch adjusted + to match the specified flow rate For a mass-based flux: - the flow rate should be provided in kg/s @@ -87,6 +87,7 @@ Note See also Foam::fixedValueFvPatchField Foam::Function1Types + Foam::flowRateOutletVelocityFvPatchVectorField SourceFiles flowRateInletVelocityFvPatchVectorField.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/flowRateOutletVelocity/flowRateOutletVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/flowRateOutletVelocity/flowRateOutletVelocityFvPatchVectorField.C new file mode 100644 index 0000000000..df9dbaad81 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/flowRateOutletVelocity/flowRateOutletVelocityFvPatchVectorField.C @@ -0,0 +1,250 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 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 "flowRateOutletVelocityFvPatchVectorField.H" +#include "volFields.H" +#include "one.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::flowRateOutletVelocityFvPatchVectorField:: +flowRateOutletVelocityFvPatchVectorField +( + const fvPatch& p, + const DimensionedField& iF +) +: + fixedValueFvPatchField(p, iF), + flowRate_(), + volumetric_(false), + rhoName_("rho"), + rhoOutlet_(0.0) +{} + + +Foam::flowRateOutletVelocityFvPatchVectorField:: +flowRateOutletVelocityFvPatchVectorField +( + const fvPatch& p, + const DimensionedField& iF, + const dictionary& dict +) +: + fixedValueFvPatchField(p, iF, dict, false), + rhoOutlet_(dict.lookupOrDefault("rhoOutlet", -VGREAT)) +{ + if (dict.found("volumetricFlowRate")) + { + volumetric_ = true; + flowRate_ = Function1::New("volumetricFlowRate", dict); + rhoName_ = "rho"; + } + else if (dict.found("massFlowRate")) + { + volumetric_ = false; + flowRate_ = Function1::New("massFlowRate", dict); + rhoName_ = word(dict.lookupOrDefault("rho", "rho")); + } + else + { + FatalIOErrorInFunction + ( + dict + ) << "Please supply either 'volumetricFlowRate' or" + << " 'massFlowRate' and 'rho'" << exit(FatalIOError); + } + + // Value field require if mass based + if (dict.found("value")) + { + fvPatchField::operator= + ( + vectorField("value", dict, p.size()) + ); + } + else + { + evaluate(Pstream::commsTypes::blocking); + } +} + + +Foam::flowRateOutletVelocityFvPatchVectorField:: +flowRateOutletVelocityFvPatchVectorField +( + const flowRateOutletVelocityFvPatchVectorField& ptf, + const fvPatch& p, + const DimensionedField& iF, + const fvPatchFieldMapper& mapper +) +: + fixedValueFvPatchField(ptf, p, iF, mapper), + flowRate_(ptf.flowRate_, false), + volumetric_(ptf.volumetric_), + rhoName_(ptf.rhoName_), + rhoOutlet_(ptf.rhoOutlet_) +{} + + +Foam::flowRateOutletVelocityFvPatchVectorField:: +flowRateOutletVelocityFvPatchVectorField +( + const flowRateOutletVelocityFvPatchVectorField& ptf +) +: + fixedValueFvPatchField(ptf), + flowRate_(ptf.flowRate_, false), + volumetric_(ptf.volumetric_), + rhoName_(ptf.rhoName_), + rhoOutlet_(ptf.rhoOutlet_) +{} + + +Foam::flowRateOutletVelocityFvPatchVectorField:: +flowRateOutletVelocityFvPatchVectorField +( + const flowRateOutletVelocityFvPatchVectorField& ptf, + const DimensionedField& iF +) +: + fixedValueFvPatchField(ptf, iF), + flowRate_(ptf.flowRate_, false), + volumetric_(ptf.volumetric_), + rhoName_(ptf.rhoName_), + rhoOutlet_(ptf.rhoOutlet_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +void Foam::flowRateOutletVelocityFvPatchVectorField::updateValues +( + const RhoType& rho +) +{ + const scalar t = db().time().timeOutputValue(); + + const vectorField n = patch().nf(); + + // Extrapolate patch velocity + vectorField Up(this->patchInternalField()); + + // Patch normal extrapolated velocity + scalarField nUp(n & Up); + + // Remove the normal component of the extrapolate patch velocity + Up -= nUp*n; + + // Remove any reverse flow + nUp = min(nUp, 0.0); + + const scalar flowRate = flowRate_->value(t); + const scalar estimatedFlowRate = -gSum(rho*(this->patch().magSf()*nUp)); + + if (estimatedFlowRate/flowRate > 0.5) + { + nUp *= (mag(flowRate)/mag(estimatedFlowRate)); + } + else + { + nUp -= ((flowRate - estimatedFlowRate)/gSum(rho*patch().magSf())); + } + + // Add the corrected normal component of velocity to the patch velocity + Up += nUp*n; + + // Correct the patch velocity + this->operator==(Up); +} + + +void Foam::flowRateOutletVelocityFvPatchVectorField::updateCoeffs() +{ + if (updated()) + { + return; + } + + if (volumetric_ || rhoName_ == "none") + { + updateValues(one()); + } + else + { + // Mass flow-rate + if (db().foundObject(rhoName_)) + { + const fvPatchField& rhop = + patch().lookupPatchField(rhoName_); + + updateValues(rhop); + } + else + { + // Use constant density + if (rhoOutlet_ < 0) + { + FatalErrorInFunction + << "Did not find registered density field " << rhoName_ + << " and no constant density 'rhoOutlet' specified" + << exit(FatalError); + } + + updateValues(rhoOutlet_); + } + } + + fixedValueFvPatchVectorField::updateCoeffs(); +} + + +void Foam::flowRateOutletVelocityFvPatchVectorField::write(Ostream& os) const +{ + fvPatchField::write(os); + flowRate_->writeData(os); + if (!volumetric_) + { + writeEntryIfDifferent(os, "rho", "rho", rhoName_); + writeEntryIfDifferent(os, "rhoOutlet", -VGREAT, rhoOutlet_); + } + writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + makePatchTypeField + ( + fvPatchVectorField, + flowRateOutletVelocityFvPatchVectorField + ); +} + + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/flowRateOutletVelocity/flowRateOutletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/flowRateOutletVelocity/flowRateOutletVelocityFvPatchVectorField.H new file mode 100644 index 0000000000..be2f730d9b --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/flowRateOutletVelocity/flowRateOutletVelocityFvPatchVectorField.H @@ -0,0 +1,220 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 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::flowRateOutletVelocityFvPatchVectorField + +Group + grpOutletBoundaryConditions + +Description + Velocity outlet boundary condition which corrects the extrapolated velocity + to match the specified flow rate. + + For a mass-based flux: + - the flow rate should be provided in kg/s + - if \c rho is "none" the flow rate is in m^3/s + - otherwise \c rho should correspond to the name of the density field + - if the density field cannot be found in the database, the user must + specify the outlet density using the \c rhoOutlet entry + + For a volumetric-based flux: + - the flow rate is in m^3/s + +Usage + \table + Property | Description | Required | Default value + massFlowRate | mass flow rate [kg/s] | no | + volumetricFlowRate | volumetric flow rate [m^3/s]| no | + rhoOutlet | outlet density | no | + \endtable + + Example of the boundary condition specification for a volumetric flow rate: + \verbatim + + { + type flowRateOutletVelocity; + volumetricFlowRate 0.2; + value uniform (0 0 0); + } + \endverbatim + + Example of the boundary condition specification for a mass flow rate: + \verbatim + + { + type flowRateOutletVelocity; + massFlowRate 0.2; + rhoOutlet 1.0; + value uniform (0 0 0); + } + \endverbatim + + The \c flowRate entry is a \c Function1 of time, see Foam::Function1Types. + +Note + - \c rhoOutlet is required for the case of a mass flow rate, where the + density field is not available at start-up + - The value is positive out of the domain (as an outlet) + - May not work correctly for transonic outlets + - Strange behaviour with potentialFoam since the U equation is not solved + +See also + Foam::fixedValueFvPatchField + Foam::Function1Types + Foam::flowRateInletVelocityFvPatchVectorField + +SourceFiles + flowRateOutletVelocityFvPatchVectorField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef flowRateOutletVelocityFvPatchVectorField_H +#define flowRateOutletVelocityFvPatchVectorField_H + +#include "fixedValueFvPatchFields.H" +#include "Function1.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class flowRateOutletVelocityFvPatchVectorField Declaration +\*---------------------------------------------------------------------------*/ + +class flowRateOutletVelocityFvPatchVectorField +: + public fixedValueFvPatchVectorField +{ + // Private data + + //- Outlet integral flow rate + autoPtr> flowRate_; + + //- Is volumetric? + bool volumetric_; + + //- Name of the density field used to normalize the mass flux + word rhoName_; + + //- Rho initialisation value (for start; if value not supplied) + scalar rhoOutlet_; + + + // Private member functions + + //- Update the patch values given the appropriate density type and value + template + void updateValues(const RhoType& rho); + + +public: + + //- Runtime type information + TypeName("flowRateOutletVelocity"); + + + // Constructors + + //- Construct from patch and internal field + flowRateOutletVelocityFvPatchVectorField + ( + const fvPatch&, + const DimensionedField& + ); + + //- Construct from patch, internal field and dictionary + flowRateOutletVelocityFvPatchVectorField + ( + const fvPatch&, + const DimensionedField&, + const dictionary& + ); + + //- Construct by mapping given + // flowRateOutletVelocityFvPatchVectorField + // onto a new patch + flowRateOutletVelocityFvPatchVectorField + ( + const flowRateOutletVelocityFvPatchVectorField&, + const fvPatch&, + const DimensionedField&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + flowRateOutletVelocityFvPatchVectorField + ( + const flowRateOutletVelocityFvPatchVectorField& + ); + + //- Construct and return a clone + virtual tmp clone() const + { + return tmp + ( + new flowRateOutletVelocityFvPatchVectorField(*this) + ); + } + + //- Construct as copy setting internal field reference + flowRateOutletVelocityFvPatchVectorField + ( + const flowRateOutletVelocityFvPatchVectorField&, + const DimensionedField& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp clone + ( + const DimensionedField& iF + ) const + { + return tmp + ( + new flowRateOutletVelocityFvPatchVectorField(*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 + +// ************************************************************************* //