Loading...
Searching...
No Matches
swirlFlowRateInletVelocityFvPatchVectorField.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2017 OpenFOAM Foundation
9 Copyright (C) 2018-2025 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
30#include "volFields.H"
32#include "fvPatchFieldMapper.H"
33#include "surfaceFields.H"
34#include "unitConversion.H"
35
36// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
37
40(
41 const fvPatch& p,
43)
44:
46 phiName_("phi"),
47 rhoName_("rho"),
48 origin_(Zero),
49 axis_(Zero),
50 flowRate_(),
51 rpm_()
52{}
53
54
57(
58 const fvPatch& p,
60 const dictionary& dict
61)
62:
64 phiName_(dict.getOrDefault<word>("phi", "phi")),
65 rhoName_(dict.getOrDefault<word>("rho", "rho")),
66 origin_
67 (
68 dict.getOrDefault
69 (
70 "origin",
71 returnReduceOr(patch().size())
72 ? gWeightedAverage(patch().magSf(), patch().Cf())
73 : Zero
74 )
75 ),
76 axis_
77 (
78 dict.getOrDefault
79 (
80 "axis",
81 returnReduceOr(patch().size())
82 ? -gSum(patch().Sf())/gSum(patch().magSf())
83 : Zero
84 )
85 ),
86 flowRate_(Function1<scalar>::New("flowRate", dict, &db())),
87 rpm_(Function1<scalar>::New("rpm", dict, &db()))
88{}
89
90
93(
95 const fvPatch& p,
97 const fvPatchFieldMapper& mapper
98)
99:
100 fixedValueFvPatchField<vector>(ptf, p, iF, mapper),
101 phiName_(ptf.phiName_),
102 rhoName_(ptf.rhoName_),
103 origin_(ptf.origin_),
104 axis_(ptf.axis_),
105 flowRate_(ptf.flowRate_.clone()),
106 rpm_(ptf.rpm_.clone())
107{}
108
109
112(
114)
115:
117 phiName_(ptf.phiName_),
118 rhoName_(ptf.rhoName_),
119 origin_(ptf.origin_),
120 axis_(ptf.axis_),
121 flowRate_(ptf.flowRate_.clone()),
122 rpm_(ptf.rpm_.clone())
123{}
124
125
128(
131)
132:
134 phiName_(ptf.phiName_),
135 rhoName_(ptf.rhoName_),
136 origin_(ptf.origin_),
137 axis_(ptf.axis_),
138 flowRate_(ptf.flowRate_.clone()),
139 rpm_(ptf.rpm_.clone())
140{}
141
142
143// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
144
146{
147 if (updated())
148 {
149 return;
150 }
151 const scalar totArea = gSum(patch().magSf());
152
153 if (totArea > ROOTVSMALL && axis_ != vector(Zero))
154 {
155 const scalar t = this->db().time().timeOutputValue();
156 const scalar flowRate = flowRate_->value(t);
157 const scalar omega = rpmToRads(rpm_->value(t));
158
159 const scalar avgU = -flowRate/totArea;
160
161 const vector axisHat = axis_/mag(axis_);
162
163 // Update angular velocity
164 tmp<vectorField> tangentialVelocity
165 (
166 axisHat ^ omega*(patch().Cf() - origin_)
167 );
168
169 tmp<vectorField> n = patch().nf();
170
171 const auto& phi = db().lookupObject<surfaceScalarField>(phiName_);
172
173 if (phi.dimensions() == dimVolume/dimTime)
174 {
175 // volumetric flow-rate
176 operator==(tangentialVelocity + n*avgU);
177 }
178 else if (phi.dimensions() == dimMass/dimTime)
179 {
180 const auto& rhop =
181 patch().lookupPatchField<volScalarField>(rhoName_);
182
183 // mass flow-rate
184 operator==(tangentialVelocity + n*avgU/rhop);
185 }
186 else
187 {
189 << "dimensions of " << phiName_ << " are incorrect" << nl
190 << " on patch " << this->patch().name()
191 << " of field " << this->internalField().name()
192 << " in file " << this->internalField().objectPath()
193 << nl << exit(FatalError);
208 os.writeEntryIfDifferent<word>("rho", "rho", rhoName_);
209 os.writeEntry("origin", origin_);
210 os.writeEntry("axis", axis_);
211 flowRate_->writeData(os);
212 rpm_->writeData(os);
215
216
217// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
218
219namespace Foam
220{
222 (
224 swirlFlowRateInletVelocityFvPatchVectorField
225 );
226}
227
228
229// ************************************************************************* //
label n
Macros for easy insertion into run-time selection tables.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Top level data entry class for use in dictionaries. Provides a mechanism to specify a variable as a c...
Definition Function1.H:92
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition Ostream.H:59
Ostream & writeEntry(const keyType &key, const T &value)
Write a keyword/value entry.
Definition Ostream.H:331
Ostream & writeEntryIfDifferent(const word &key, const T &value1, const T &value2)
Write a keyword/value entry only when the two values differ.
Definition Ostream.H:346
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition dictionary.H:133
This boundary condition supplies a fixed value constraint, and is the base class for a number of othe...
A FieldMapper for finite-volume patch fields.
virtual void write(Ostream &) const
Write.
void writeValueEntry(Ostream &os) const
Write *this field as a "value" entry.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition fvPatch.H:71
This boundary condition provides a volumetric- OR mass-flow normal vector boundary condition by its m...
virtual tmp< fvPatchField< vector > > clone() const
Return a clone.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
swirlFlowRateInletVelocityFvPatchVectorField(const fvPatch &, const DimensionedField< vector, volMesh > &)
Construct from patch and internal field.
A class for managing temporary objects.
Definition tmp.H:75
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
A class for handling words, derived from Foam::string.
Definition word.H:66
volScalarField & p
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition error.H:600
OBJstream os(runTime.globalPath()/outputName)
#define makePatchTypeField(PatchTypeField, typePatchTypeField)
Define a concrete fvPatchField type and add to run-time tables Example, (fvPatchScalarField,...
const std::string patch
OpenFOAM patch number as a std::string.
Namespace for OpenFOAM.
bool returnReduceOr(const bool value, const int communicator=UPstream::worldComm)
Perform logical (or) MPI Allreduce on a copy. Uses UPstream::reduceOr.
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh > > &tf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
Type gSum(const FieldField< Field, Type > &f)
Type gWeightedAverage(const UList< scalar > &weights, const UList< Type > &fld, const label comm)
The global weighted average of a field, using the mag() of the weights.
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
GeometricField< scalar, fvPatchField, volMesh > volScalarField
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
constexpr scalar rpmToRads() noexcept
Multiplication factor for revolutions/minute to radians/sec.
tmp< faMatrix< Type > > operator==(const faMatrix< Type > &, const faMatrix< Type > &)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
static constexpr const zero Zero
Global zero (0).
Definition zero.H:127
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
const dimensionSet dimVolume(pow3(dimLength))
Vector< scalar > vector
Definition vector.H:57
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition errorManip.H:125
fvPatchField< vector > fvPatchVectorField
const dimensionSet dimMass(1, 0, 0, 0, 0, 0, 0)
constexpr char nl
The newline '\n' character (0x0a).
Definition Ostream.H:50
dictionary dict
Foam::surfaceFields.
Unit conversion functions.