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-------------------------------------------------------------------------------
10License
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
32template<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
59template<class CloudType>
61:
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
74template<class CloudType>
76{}
77
78
79// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
80
81template<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// ************************************************************************* //
scalar y
const uniformDimensionedVectorField & g
Templated break-up model class.
Definition: BreakupModel.H:61
Templated base class for dsmc cloud.
Definition: DSMCCloud.H:75
Secondary breakup model which uses the Kelvin-Helmholtz instability theory to predict the 'stripped' ...
Definition: ReitzKHRT.H:55
virtual ~ReitzKHRT()
Destructor.
Definition: ReitzKHRT.C:75
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:126
bool readEntry(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX, bool mandatory=true) const
virtual bool update()
Update the mesh for both mesh motion and topology change.
const dictionary & coeffDict() const
Return const access to the coefficients dictionary.
Definition: subModelBase.C:131
virtual bool defaultCoeffs(const bool printMsg) const
Returns true if defaultCoeffs is true and outputs on printMsg.
Definition: subModelBase.C:143
U
Definition: pEqn.H:72
const volScalarField & mu
Urel
Definition: pEqn.H:56
constexpr scalar pi(M_PI)
constexpr scalar twoPi(2 *M_PI)
dimensionedSymmTensor sqr(const dimensionedVector &dv)
dimensionedScalar pow3(const dimensionedScalar &ds)
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
dimensionedScalar sqrt(const dimensionedScalar &ds)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:33
dimensionedScalar cbrt(const dimensionedScalar &ds)
dictionary dict