ReitzKHRT.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-2013 OpenFOAM Foundation
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 #include "ReitzKHRT.H"
29 
30 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
31 
32 template<class CloudType>
34 (
35  const dictionary& dict,
36  CloudType& owner
37 )
38 :
39  BreakupModel<CloudType>(dict, owner, typeName),
40  b0_(0.61),
41  b1_(40.0),
42  cTau_(1.0),
43  cRT_(0.1),
44  msLimit_(0.03),
45  weberLimit_(6.0)
46 {
47  if (!this->defaultCoeffs(true))
48  {
49  this->coeffDict().readEntry("B0", b0_);
50  this->coeffDict().readEntry("B1", b1_);
51  this->coeffDict().readEntry("Ctau", cTau_);
52  this->coeffDict().readEntry("CRT", cRT_);
53  this->coeffDict().readEntry("msLimit", msLimit_);
54  this->coeffDict().readEntry("WeberLimit", weberLimit_);
55  }
56 }
57 
58 
59 template<class CloudType>
61 :
62  BreakupModel<CloudType>(bum),
63  b0_(bum.b0_),
64  b1_(bum.b1_),
65  cTau_(bum.cTau_),
66  cRT_(bum.cRT_),
67  msLimit_(bum.msLimit_),
68  weberLimit_(bum.weberLimit_)
69 {}
70 
71 
72 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
73 
74 template<class CloudType>
76 {}
77 
78 
79 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
80 
81 template<class CloudType>
83 (
84  const scalar dt,
85  const vector& g,
86  scalar& d,
87  scalar& tc,
88  scalar& ms,
89  scalar& nParticle,
90  scalar& KHindex,
91  scalar& y,
92  scalar& yDot,
93  const scalar d0,
94  const scalar rho,
95  const scalar mu,
96  const scalar sigma,
97  const vector& U,
98  const scalar rhoc,
99  const scalar muc,
100  const vector& Urel,
101  const scalar Urmag,
102  const scalar tMom,
103  scalar& dChild,
104  scalar& massChild
105 )
106 {
107  bool addParcel = false;
108 
109  const scalar averageParcelMass = this->owner().averageParcelMass();
110 
111  scalar r = 0.5*d;
112  scalar d3 = pow3(d);
113  scalar d03 = pow3(d0);
114 
115  scalar rhopi6 = rho*constant::mathematical::pi/6.0;
116  scalar mass = nParticle*d3*rhopi6;
117  scalar mass0 = nParticle*d03*rhopi6;
118 
119  scalar weGas = 0.5*rhoc*sqr(Urmag)*d/sigma;
120  scalar weLiquid = 0.5*rho*sqr(Urmag)*d/sigma;
121 
122  // Note: Reitz is using radius instead of diameter for Re-number
123  scalar reLiquid = rho*Urmag*r/mu;
124  scalar ohnesorge = sqrt(weLiquid)/(reLiquid + VSMALL);
125  scalar taylor = ohnesorge*sqrt(weGas);
126 
127  vector acceleration = Urel/tMom;
128  vector trajectory = U/mag(U);
129  scalar gt = (g + acceleration) & trajectory;
130 
131  // frequency of the fastest growing KH-wave
132  scalar omegaKH =
133  (0.34 + 0.38*pow(weGas, 1.5))
134  /((1.0 + ohnesorge)*(1.0 + 1.4*pow(taylor, 0.6)))
135  *sqrt(sigma/(rho*pow3(r)));
136 
137  // corresponding KH wave-length.
138  scalar lambdaKH =
139  9.02
140  *r
141  *(1.0 + 0.45*sqrt(ohnesorge))
142  *(1.0 + 0.4*pow(taylor, 0.7))
143  /pow(1.0 + 0.865*pow(weGas, 1.67), 0.6);
144 
145  // characteristic Kelvin-Helmholtz breakup time
146  scalar tauKH = 3.726*b1_*r/(omegaKH*lambdaKH);
147 
148  // stable KH diameter
149  scalar dc = 2.0*b0_*lambdaKH;
150 
151  // the frequency of the fastest growing RT wavelength.
152  scalar helpVariable = mag(gt*(rho - rhoc));
153  scalar omegaRT = sqrt
154  (
155  2.0*pow(helpVariable, 1.5)
156  /(3.0*sqrt(3.0*sigma)*(rhoc + rho))
157  );
158 
159  // RT wave number
160  scalar KRT = sqrt(helpVariable/(3.0*sigma + VSMALL));
161 
162  // wavelength of the fastest growing RT frequency
163  scalar lambdaRT = constant::mathematical::twoPi*cRT_/(KRT + VSMALL);
164 
165  // if lambdaRT < diameter, then RT waves are growing on the surface
166  // and we start to keep track of how long they have been growing
167  if ((tc > 0) || (lambdaRT < d) )
168  {
169  tc += dt;
170  }
171 
172  // characteristic RT breakup time
173  scalar tauRT = cTau_/(omegaRT + VSMALL);
174 
175  // check if we have RT breakup
176  if ((tc > tauRT) && (lambdaRT < d))
177  {
178  // the RT breakup creates diameter/lambdaRT new droplets
179  tc = -GREAT;
180  scalar nDrops = d/lambdaRT;
181  d = cbrt(d3/nDrops);
182  }
183  // otherwise check for KH breakup
184  else if (dc < d)
185  {
186  // no breakup below Weber = 12
187  if (weGas > weberLimit_)
188  {
189  scalar fraction = dt/tauKH;
190 
191  // reduce the diameter according to the rate-equation
192  d = (fraction*dc + d)/(1.0 + fraction);
193 
194  //scalar ms0 = rho*pow3(dc)*mathematicalConstant::pi/6.0;
195  scalar ms0 = mass0*(1.0 - pow3(d/d0));
196  ms += ms0;
197 
198  if (ms/averageParcelMass > msLimit_)
199  {
200  // Correct evaluation of the number of child droplets and the
201  // diameter of parcel droplets after breakup
202  // Solution of cubic equation for the diameter of the parent
203  // drops after breakup, see Eq. 18 in
204  // Patterson & Reitz, SAE 980131
205  bool br3 = true;
206  scalar ae3 = 1.0;
207  scalar be3 = -dc;
208  scalar ce3 = 0.0;
209  scalar de3 = d*d*(dc - d);
210  scalar qe3 =
211  pow3(be3/(3.0*ae3)) - be3*ce3/(6.0*ae3*ae3) + de3/(2.0*ae3);
212  scalar pe3 = (3.0*ae3*ce3 - be3*be3)/(9.0*ae3*ae3);
213  scalar D3 = qe3*qe3 + pe3*pe3*pe3;
214 
215  if (D3 < 0) br3 = false;
216 
217  if (br3)
218  {
219  D3 = sqrt(D3);
220  scalar ue3 = cbrt(-qe3 + D3);
221  scalar ve3 = cbrt(-qe3 - D3);
222  scalar dParenDrops = ue3 + ve3 - be3/3.;
223  scalar mc = nParticle*(pow3(d) - pow3(dParenDrops));
224  scalar nChildDrops = mc/pow3(dc);
225 
226  if (nChildDrops >= nParticle)
227  {
228  addParcel = true;
229  d = dParenDrops;
230  ms = 0.0;
231  dChild = dc;
232  massChild = mc*rhopi6;
233 
234  // reduce the parent mass by reducing nParticle
235  mass -= massChild;
236  }
237  }
238  }
239  }
240  }
241  else if (KHindex < 0.5)
242  {
243  // Case of larger drops after breakup (Reitz, Atomization & Spray
244  // Technology 3 (1987) 309-337, p.322) pIndKH() should be introduced
245 
246  scalar lengthScale =
247  min(lambdaKH, constant::mathematical::twoPi*Urmag/omegaKH);
248  scalar diameterLargerDrop = cbrt(1.5*d*d*lengthScale);
249  d = diameterLargerDrop;
250  ms = 0.0;
251  KHindex = 1.0;
252  }
253 
254  // correct the number of parcels in parent
255  scalar massDrop = pow3(d)*rhopi6;
256  nParticle = mass/massDrop;
257 
258  return addParcel;
259 }
260 
261 
262 // ************************************************************************* //
Foam::constant::physicoChemical::mu
const dimensionedScalar mu
Atomic mass unit.
Definition: createFieldRefs.H:4
Urel
Urel
Definition: pEqn.H:56
rho
rho
Definition: readInitialConditions.H:88
Foam::min
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:33
Foam::pow3
dimensionedScalar pow3(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:89
Foam::pow
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
Definition: dimensionedScalar.C:75
Foam::DSMCCloud
Templated base class for dsmc cloud.
Definition: DSMCCloud.H:71
Foam::constant::mathematical::twoPi
constexpr scalar twoPi(2 *M_PI)
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::dictionary
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:123
g
const uniformDimensionedVectorField & g
Definition: createFluidFields.H:26
Foam::ReitzKHRT
Secondary breakup model which uses the Kelvin-Helmholtz instability theory to predict the 'stripped' ...
Definition: ReitzKHRT.H:52
Foam::BreakupModel
Templated break-up model class.
Definition: SprayCloud.H:50
Foam::ReitzKHRT::~ReitzKHRT
virtual ~ReitzKHRT()
Destructor.
Definition: ReitzKHRT.C:75
U
U
Definition: pEqn.H:72
Foam::sqr
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Definition: dimensionedSymmTensor.C:51
Foam::constant::mathematical::pi
constexpr scalar pi(M_PI)
Foam::Vector< scalar >
Foam::sqrt
dimensionedScalar sqrt(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:144
Foam::mag
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
ReitzKHRT.H
sigma
dimensionedScalar sigma("sigma", dimMass/sqr(dimTime), transportProperties)
Foam::ReitzKHRT::update
virtual bool update(const scalar dt, const vector &g, scalar &d, scalar &tc, scalar &ms, scalar &nParticle, scalar &KHindex, scalar &y, scalar &yDot, const scalar d0, const scalar rho, const scalar mu, const scalar sigma, const vector &U, const scalar rhoc, const scalar muc, const vector &Urel, const scalar Urmag, const scalar tMom, scalar &dChild, scalar &massChild)
Update the parcel diameter.
Definition: ReitzKHRT.C:83
Foam::cbrt
dimensionedScalar cbrt(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:155
y
scalar y
Definition: LISASMDCalcMethod1.H:14
Foam::ReitzKHRT::ReitzKHRT
ReitzKHRT(const dictionary &, CloudType &)
Construct from dictionary.
Definition: ReitzKHRT.C:34