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
+
+// ************************************************************************* //