kOmega2006.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2021-2026 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "kOmega2006.H"
27 #include "fvModels.H"
28 #include "fvConstraints.H"
29 #include "bound.H"
30 
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
32 
33 namespace Foam
34 {
35 namespace RASModels
36 {
37 
38 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
39 
40 template<class BasicMomentumTransportModel>
42 {
43  omega_ = max(omega_, k_/(this->nutMaxCoeff_*this->nu()));
44 }
45 
46 
47 template<class BasicMomentumTransportModel>
49 (
50  const volTensorField& gradU
51 )
52 {
53  this->nut_ = k_/max(omega_, Clim_*sqrt(2/betaStar_)*mag(dev(symm(gradU))));
54  this->nut_.correctBoundaryConditions();
55  fvConstraints::New(this->mesh_).constrain(this->nut_);
56 }
57 
58 
59 template<class BasicMomentumTransportModel>
60 tmp<volScalarField::Internal> kOmega2006<BasicMomentumTransportModel>::beta
61 (
62  const volTensorField& gradU
63 ) const
64 {
65  const volSymmTensorField::Internal S(symm(gradU()));
66  const volSymmTensorField::Internal Shat(S - 0.5*tr(S)*I);
67  const volTensorField::Internal Omega(skew(gradU.v()));
68 
69  const volScalarField::Internal ChiOmega
70  (
71  typedName("ChiOmega"),
72  mag((Omega & Omega) && Shat)/pow3(betaStar_*omega_.v())
73  );
74 
75  const volScalarField::Internal fBeta
76  (
77  typedName("fBeta"),
78  (1 + 85*ChiOmega)/(1 + 100*ChiOmega)
79  );
80 
81  return beta0_*fBeta;
82 }
83 
84 
85 template<class BasicMomentumTransportModel>
86 tmp<volScalarField::Internal>
87 kOmega2006<BasicMomentumTransportModel>::CDkOmega() const
88 {
89  return max
90  (
91  sigmaDo_*(fvc::grad(k_)().v() & fvc::grad(omega_)().v())/omega_(),
93  );
94 }
95 
96 
97 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
98 
99 template<class BasicMomentumTransportModel>
101 {
102  correctNut(fvc::grad(this->U_));
103 }
104 
105 
106 template<class BasicMomentumTransportModel>
108 {
109  return tmp<fvScalarMatrix>
110  (
111  new fvScalarMatrix
112  (
113  k_,
114  dimVolume*this->rho_.dimensions()*k_.dimensions()
115  /dimTime
116  )
117  );
118 }
119 
120 
121 template<class BasicMomentumTransportModel>
123 {
124  return tmp<fvScalarMatrix>
125  (
126  new fvScalarMatrix
127  (
128  omega_,
129  dimVolume*this->rho_.dimensions()*omega_.dimensions()/dimTime
130  )
131  );
132 }
133 
134 
135 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
136 
137 template<class BasicMomentumTransportModel>
139 (
140  const alphaField& alpha,
141  const rhoField& rho,
142  const volVectorField& U,
143  const surfaceScalarField& alphaRhoPhi,
144  const surfaceScalarField& phi,
145  const viscosity& viscosity,
146  const word& type
147 )
148 :
149  eddyViscosity<RASModel<BasicMomentumTransportModel>>
150  (
151  type,
152  alpha,
153  rho,
154  U,
155  alphaRhoPhi,
156  phi,
157  viscosity
158  ),
159 
160  betaStar_("betaStar", this->typeDict(type), 0.09),
161  beta0_("beta0", this->typeDict(type), 0.0708),
162  gamma_("gamma", this->typeDict(type), 0.52),
163  Clim_("Clim", this->typeDict(type), 0.875),
164  sigmaDo_("sigmaDo", this->typeDict(type), 0.125),
165  alphaK_("alphaK", this->typeDict(type), 0.6),
166  alphaOmega_("alphaOmega", this->typeDict(type), 0.5),
167 
168  k_
169  (
170  IOobject
171  (
172  this->groupName("k"),
173  this->runTime_.name(),
174  this->mesh_,
175  IOobject::MUST_READ,
176  IOobject::AUTO_WRITE
177  ),
178  this->mesh_,
179  dimensions::turbulentKineticEnergy
180  ),
181  omega_
182  (
183  IOobject
184  (
185  this->groupName("omega"),
186  this->runTime_.name(),
187  this->mesh_,
188  IOobject::MUST_READ,
189  IOobject::AUTO_WRITE
190  ),
191  this->mesh_,
192  dimensions::turbulentOmega
193  )
194 {
195  bound(k_, this->kMin_);
196  boundOmega();
197 }
198 
199 
200 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
201 
202 template<class BasicMomentumTransportModel>
204 {
206  {
207  betaStar_.readIfPresent(this->typeDict());
208  beta0_.readIfPresent(this->typeDict());
209  gamma_.readIfPresent(this->typeDict());
210  sigmaDo_.readIfPresent(this->typeDict());
211  alphaK_.readIfPresent(this->typeDict());
212  alphaOmega_.readIfPresent(this->typeDict());
213 
214  return true;
215  }
216  else
217  {
218  return false;
219  }
220 }
221 
222 
223 template<class BasicMomentumTransportModel>
225 {
226  if (!this->turbulence_)
227  {
228  return;
229  }
230 
231  // Local references
232  const alphaField& alpha = this->alpha_;
233  const rhoField& rho = this->rho_;
234  const surfaceScalarField& alphaRhoPhi = this->alphaRhoPhi_;
235  const volVectorField& U = this->U_;
236  volScalarField& nut = this->nut_;
237  const Foam::fvModels& fvModels(Foam::fvModels::New(this->mesh_));
239  (
240  Foam::fvConstraints::New(this->mesh_)
241  );
242 
244 
246  (
247  typedName("divU"),
248  fvc::div(fvc::absolute(this->phi(), U))().v()
249  );
250 
251  const volTensorField gradU(fvc::grad(U));
253  (
254  this->GName(),
255  nut.v()*(dev(twoSymm(gradU.v())) && gradU.v())
256  );
257 
258  // Update omega and G at the wall
259  omega_.boundaryFieldRef().updateCoeffs();
260 
261  // Turbulence specific dissipation rate equation
262  tmp<fvScalarMatrix> omegaEqn
263  (
264  fvm::ddt(alpha, rho, omega_)
265  + fvm::div(alphaRhoPhi, omega_)
266  - fvm::laplacian(alpha*rho*DomegaEff(), omega_)
267  ==
268  gamma_*alpha()*rho()*G*omega_()/k_()
269  - fvm::SuSp(((2.0/3.0)*gamma_)*alpha()*rho()*divU, omega_)
270  - fvm::Sp(beta(gradU)*alpha()*rho()*omega_(), omega_)
271  + alpha()*rho()*CDkOmega()
272  + omegaSource()
273  + fvModels.source(alpha, rho, omega_)
274  );
275 
276  omegaEqn.ref().relax();
277  fvConstraints.constrain(omegaEqn.ref());
278  omegaEqn.ref().boundaryManipulate(omega_.boundaryFieldRef());
279  solve(omegaEqn);
280  fvConstraints.constrain(omega_);
281  boundOmega();
282 
283 
284  // Turbulent kinetic energy equation
286  (
287  fvm::ddt(alpha, rho, k_)
288  + fvm::div(alphaRhoPhi, k_)
289  - fvm::laplacian(alpha*rho*DkEff(), k_)
290  ==
291  alpha()*rho()*G
292  - fvm::SuSp((2.0/3.0)*alpha()*rho()*divU, k_)
293  - fvm::Sp(betaStar_*alpha()*rho()*omega_(), k_)
294  + kSource()
295  + fvModels.source(alpha, rho, k_)
296  );
297 
298  kEqn.ref().relax();
299  fvConstraints.constrain(kEqn.ref());
300  solve(kEqn);
302  bound(k_, this->kMin_);
303  boundOmega();
304 
305  correctNut(gradU);
306 }
307 
308 
309 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
310 
311 } // End namespace RASModels
312 } // End namespace Foam
313 
314 // ************************************************************************* //
Bound the given scalar field where it is below the specified minimum.
static fvConstraints & New(const word &name, const fvMesh &mesh)
Construct and return the named DemandDrivenMeshObject.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Generic GeometricField class.
const Internal & v() const
Return a const-reference to the dimensioned internal field.
Definition: volFieldsI.H:29
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:99
Templated abstract base class for RAS turbulence models.
Definition: RASModel.H:56
void boundOmega()
Bound omega.
Definition: kOmega2006.C:41
virtual void correct()
Solve the turbulence equations and correct the turbulence viscosity.
Definition: kOmega2006.C:224
virtual tmp< fvScalarMatrix > omegaSource() const
Source term for the omega equation.
Definition: kOmega2006.C:122
virtual void correctNut()
Correct the eddy-viscosity nut.
Definition: kOmega2006.C:100
virtual tmp< fvScalarMatrix > kSource() const
Source term for the k equation.
Definition: kOmega2006.C:107
kOmega2006(const alphaField &alpha, const rhoField &rho, const volVectorField &U, const surfaceScalarField &alphaRhoPhi, const surfaceScalarField &phi, const viscosity &viscosity, const word &type=typeName)
Construct from components.
Definition: kOmega2006.C:139
virtual bool read()
Read RASProperties dictionary.
Definition: kOmega2006.C:203
Eddy viscosity turbulence model base class.
Definition: eddyViscosity.H:52
Finite volume constraints.
Definition: fvConstraints.H:68
bool constrain(fvMatrix< Type > &eqn) const
Apply constraints to an equation.
A special matrix type and solver, designed for finite volume solutions of scalar equations....
Definition: fvMatrix.H:118
Finite volume models.
Definition: fvModels.H:69
tmp< fvMatrix< Type > > source(const VolField< Type > &field) const
Return source for an equation.
BasicMomentumTransportModel::alphaField alphaField
BasicMomentumTransportModel::rhoField rhoField
A class for managing temporary objects.
Definition: tmp.H:55
T & ref() const
Return non-const reference or generate a fatal error.
Definition: tmpI.H:197
Abstract base class for all fluid physical properties.
Definition: viscosity.H:50
A class for handling words, derived from string.
Definition: word.H:63
Foam::fvConstraints & fvConstraints(Foam::fvConstraints::New(mesh))
Foam::fvModels & fvModels(Foam::fvModels::New(mesh))
const scalar nut
U
Definition: pEqn.H:72
rho
Definition: pEqn.H:1
volScalarField alpha(IOobject("alpha", runTime.name(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE), lambda *max(Ua &U, zeroSensitivity))
void correct(const RdeltaTType &rDeltaT, const RhoType &rho, volScalarField &psi, const surfaceScalarField &phiCorr, const SpType &Sp)
const dimensionedScalar G
Newtonian constant of gravitation.
const dimensionSet turbulentKineticEnergy
const dimensionSet dimless
const dimensionSet turbulentOmega
tmp< VolField< typename outerProduct< vector, Type >::type > > grad(const SurfaceField< Type > &ssf)
Definition: fvcGrad.C:46
tmp< VolField< Type > > div(const SurfaceField< Type > &ssf)
Definition: fvcDiv.C:47
tmp< surfaceScalarField > absolute(const tmp< surfaceScalarField > &tphi, const volVectorField &U)
Return the given relative flux in absolute form.
Definition: fvcMeshPhi.C:202
tmp< fvMatrix< Type > > S(const Pair< tmp< volScalarField::Internal >> &, const VolField< Type > &)
tmp< fvMatrix< Type > > laplacian(const VolField< Type > &vf, const word &name)
Definition: fvmLaplacian.C:47
tmp< fvMatrix< Type > > div(const surfaceScalarField &flux, const VolField< Type > &vf, const word &name)
Definition: fvmDiv.C:48
tmp< fvMatrix< Type > > Sp(const volScalarField::Internal &, const VolField< Type > &)
tmp< fvMatrix< Type > > SuSp(const volScalarField::Internal &, const VolField< Type > &)
tmp< fvMatrix< Type > > ddt(const VolField< Type > &vf)
Definition: fvmDdt.C:46
Namespace for OpenFOAM.
void skew(pointPatchField< tensor > &, const pointPatchField< tensor > &)
bool read(const char *, int32_t &)
Definition: int32IO.C:85
const dimensionSet & dimVolume
Definition: dimensions.C:282
static const Identity< scalar > I
Definition: Identity.H:93
void tr(pointPatchField< scalar > &, const pointPatchField< tensor > &)
tmp< DimensionedField< typename outerProduct< Type, Type >::type, GeoMesh, Field >> sqr(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
const dimensionSet & dimTime
Definition: dimensions.C:277
void dev(pointPatchField< tensor > &, const pointPatchField< tensor > &)
word typedName(Name name)
Return the name of the object within the given type.
Definition: typeInfo.H:188
void symm(pointPatchField< tensor > &, const pointPatchField< tensor > &)
bool bound(volScalarField &, const dimensionedScalar &min)
Bound the given scalar field where it is below the specified min value.
Definition: bound.C:31
void pow3(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
tmp< DimensionedField< scalar, GeoMesh, Field > > mag(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
void twoSymm(pointPatchField< tensor > &, const pointPatchField< tensor > &)
void sqrt(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
dimensioned< Type > max(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
fileType type(const fileName &, const bool checkVariants=true, const bool followLink=true)
Return the file type: directory or file.
Definition: POSIX.C:488
SolverPerformance< Type > solve(fvMatrix< Type > &, const word &)
Solve returning the solution statistics given convergence tolerance.