ReynoldsStress.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) 2015-2018 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 "ReynoldsStress.H"
27 #include "fvc.H"
28 #include "fvm.H"
29 #include "wallFvPatch.H"
30 
31 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
32 
33 template<class BasicTurbulenceModel>
35 (
37 ) const
38 {
39  scalar kMin = this->kMin_.value();
40 
41  R.max
42  (
44  (
45  "zero",
46  R.dimensions(),
48  (
49  kMin, -great, -great,
50  kMin, -great,
51  kMin
52  )
53  )
54  );
55 }
56 
57 
58 template<class BasicTurbulenceModel>
60 (
62 ) const
63 {
64  const fvPatchList& patches = this->mesh_.boundary();
65 
66  volSymmTensorField::Boundary& RBf = R.boundaryFieldRef();
67 
68  forAll(patches, patchi)
69  {
70  const fvPatch& curPatch = patches[patchi];
71 
72  if (isA<wallFvPatch>(curPatch))
73  {
74  symmTensorField& Rw = RBf[patchi];
75 
76  const scalarField& nutw = this->nut_.boundaryField()[patchi];
77 
78  const vectorField snGradU
79  (
80  this->U_.boundaryField()[patchi].snGrad()
81  );
82 
83  const vectorField& faceAreas
84  = this->mesh_.Sf().boundaryField()[patchi];
85 
86  const scalarField& magFaceAreas
87  = this->mesh_.magSf().boundaryField()[patchi];
88 
89  forAll(curPatch, facei)
90  {
91  // Calculate near-wall velocity gradient
92  const tensor gradUw
93  = (faceAreas[facei]/magFaceAreas[facei])*snGradU[facei];
94 
95  // Set the wall Reynolds-stress to the near-wall shear-stress
96  // Note: the spherical part of the normal stress is included in
97  // the pressure
98  Rw[facei] = -nutw[facei]*2*dev(symm(gradUw));
99  }
100  }
101  }
102 }
103 
104 
105 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
106 
107 template<class BasicTurbulenceModel>
109 (
110  const word& modelName,
111  const alphaField& alpha,
112  const rhoField& rho,
113  const volVectorField& U,
114  const surfaceScalarField& alphaRhoPhi,
115  const surfaceScalarField& phi,
116  const transportModel& transport,
117  const word& propertiesName
118 )
119 :
120  BasicTurbulenceModel
121  (
122  modelName,
123  alpha,
124  rho,
125  U,
126  alphaRhoPhi,
127  phi,
128  transport,
129  propertiesName
130  ),
131 
132  couplingFactor_
133  (
135  (
136  "couplingFactor",
137  this->coeffDict_,
138  0.0
139  )
140  ),
141 
142  R_
143  (
144  IOobject
145  (
146  IOobject::groupName("R", alphaRhoPhi.group()),
147  this->runTime_.timeName(),
148  this->mesh_,
149  IOobject::MUST_READ,
150  IOobject::AUTO_WRITE
151  ),
152  this->mesh_
153  ),
154 
155  nut_
156  (
157  IOobject
158  (
159  IOobject::groupName("nut", alphaRhoPhi.group()),
160  this->runTime_.timeName(),
161  this->mesh_,
162  IOobject::MUST_READ,
163  IOobject::AUTO_WRITE
164  ),
165  this->mesh_
166  )
167 {
168  if (couplingFactor_.value() < 0.0 || couplingFactor_.value() > 1.0)
169  {
171  << "couplingFactor = " << couplingFactor_
172  << " is not in range 0 - 1" << nl
173  << exit(FatalError);
174  }
175 }
176 
177 
178 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
179 
180 template<class BasicTurbulenceModel>
182 {
184 }
185 
186 
187 template<class BasicTurbulenceModel>
190 {
191  return R_;
192 }
193 
194 
195 template<class BasicTurbulenceModel>
198 {
199  tmp<Foam::volScalarField> tk(0.5*tr(R_));
200  tk.ref().rename("k");
201  return tk;
202 }
203 
204 
205 template<class BasicTurbulenceModel>
208 {
210  (
212  (
213  IOobject
214  (
215  IOobject::groupName("devRhoReff", this->alphaRhoPhi_.group()),
216  this->runTime_.timeName(),
217  this->mesh_,
218  IOobject::NO_READ,
219  IOobject::NO_WRITE
220  ),
221  this->alpha_*this->rho_*R_
222  - (this->alpha_*this->rho_*this->nu())
223  *dev(twoSymm(fvc::grad(this->U_)))
224  )
225  );
226 }
227 
228 
229 template<class BasicTurbulenceModel>
230 template<class RhoFieldType>
233 (
234  const RhoFieldType& rho,
235  volVectorField& U
236 ) const
237 {
238  if (couplingFactor_.value() > 0.0)
239  {
240  return
241  (
243  (
244  (1.0 - couplingFactor_)*this->alpha_*rho*this->nut(),
245  U,
246  "laplacian(nuEff,U)"
247  )
248  + fvc::div
249  (
250  this->alpha_*rho*R_
251  + couplingFactor_
252  *this->alpha_*rho*this->nut()*fvc::grad(U),
253  "div(devRhoReff)"
254  )
255  - fvc::div(this->alpha_*rho*this->nu()*dev2(T(fvc::grad(U))))
256  - fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
257  );
258  }
259  else
260  {
261  return
262  (
264  (
265  this->alpha_*rho*this->nut(),
266  U,
267  "laplacian(nuEff,U)"
268  )
269  + fvc::div(this->alpha_*rho*R_)
270  - fvc::div(this->alpha_*rho*this->nu()*dev2(T(fvc::grad(U))))
271  - fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
272  );
273  }
274 }
275 
276 
277 template<class BasicTurbulenceModel>
280 (
281  volVectorField& U
282 ) const
283 {
284  return DivDevRhoReff(this->rho_, U);
285 }
286 
287 
288 template<class BasicTurbulenceModel>
291 (
292  const volScalarField& rho,
293  volVectorField& U
294 ) const
295 {
296  return DivDevRhoReff(rho, U);
297 }
298 
299 
300 template<class BasicTurbulenceModel>
302 {
303  correctNut();
304 }
305 
306 
307 template<class BasicTurbulenceModel>
309 {
311 }
312 
313 
314 // ************************************************************************* //
void correctWallShearStress(volSymmTensorField &R) const
static word group(const word &name)
Return group (extension part of name)
Definition: IOobject.C:176
GeometricField< symmTensor, fvPatchField, volMesh > volSymmTensorField
Definition: volFieldsFwd.H:58
tmp< GeometricField< typename outerProduct< vector, Type >::type, fvPatchField, volMesh >> grad(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
Definition: fvcGrad.C:52
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:428
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
error FatalError
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:319
tmp< fvVectorMatrix > DivDevRhoReff(const RhoFieldType &rho, volVectorField &U) const
Return the source term for the momentum equation.
T & ref() const
Return non-const reference or generate a fatal error.
Definition: tmpI.H:174
tmp< GeometricField< Type, fvPatchField, volMesh > > div(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
Definition: fvcDiv.C:47
BasicTurbulenceModel::rhoField rhoField
Definition: RASModel.H:100
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition: fvPatch.H:61
virtual void correct()=0
Solve the turbulence equations and correct the turbulence viscosity.
virtual tmp< volSymmTensorField > R() const
Return the Reynolds stress tensor.
virtual tmp< fvVectorMatrix > divDevRhoReff(volVectorField &U) const
Return the source term for the momentum equation.
Generic dimensioned Type class.
patches[0]
void read(Istream &, label &, const dictionary &)
In-place read with dictionary lookup.
tmp< GeometricField< Type, fvPatchField, volMesh > > laplacian(const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvcLaplacian.C:45
BasicTurbulenceModel::transportModel transportModel
Definition: RASModel.H:101
dimensionedSymmTensor twoSymm(const dimensionedSymmTensor &dt)
const dimensionSet & dimensions() const
Return dimensions.
virtual bool read()=0
Re-read model coefficients if they have changed.
dimensionedSymmTensor dev(const dimensionedSymmTensor &dt)
SymmTensor< scalar > symmTensor
SymmTensor of scalars.
Definition: symmTensor.H:48
A class for handling words, derived from string.
Definition: word.H:59
virtual tmp< volSymmTensorField > devRhoReff() const
Return the effective stress tensor.
dimensionedScalar tr(const dimensionedSphericalTensor &dt)
virtual void validate()
Validate the turbulence fields after construction.
void boundNormalStress(volSymmTensorField &R) const
static const char nl
Definition: Ostream.H:265
Info<< "Predicted p max-min : "<< max(p).value()<< " "<< min(p).value()<< endl;rho==max(psi *p+alphal *rhol0+((alphav *psiv+alphal *psil) - psi) *pSat, rhoMin);# 1 "/home/ubuntu/OpenFOAM-6/applications/solvers/multiphase/cavitatingFoam/alphavPsi.H" 1{ alphav=max(min((rho - rholSat)/(rhovSat - rholSat), scalar(1)), scalar(0));alphal=1.0 - alphav;Info<< "max-min alphav: "<< max(alphav).value()<< " "<< min(alphav).value()<< endl;psiModel-> correct()
Definition: pEqn.H:72
virtual void rename(const word &newName)
Rename.
Definition: regIOobject.C:409
const volScalarField & T
ReynoldsStress(const word &modelName, const alphaField &alpha, const rhoField &rho, const volVectorField &U, const surfaceScalarField &alphaRhoPhi, const surfaceScalarField &phi, const transportModel &transport, const word &propertiesName)
Construct from components.
label patchi
dimensionedSymmTensor dev2(const dimensionedSymmTensor &dt)
Boundary & boundaryFieldRef()
Return a reference to the boundary field.
dimensionedSymmTensor symm(const dimensionedSymmTensor &dt)
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: List.H:63
void max(const dimensioned< Type > &)
virtual tmp< volScalarField > k() const
Return the turbulence kinetic energy.
A class for managing temporary objects.
Definition: PtrList.H:53
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:92
volScalarField & nu
scalar nut
BasicTurbulenceModel::alphaField alphaField
Definition: RASModel.H:99