1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | foam-extend: Open Source CFD
4 \\ / O peration | Version: 3.2
5 \\ / A nd | Web: http://www.foam-extend.org
6 \\/ M anipulation | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
9 This file is part of foam-extend.
11 foam-extend is free software: you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation, either version 3 of the License, or (at your
14 option) any later version.
16 foam-extend is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "reitzKHRT.H"
27 #include "addToRunTimeSelectionTable.H"
28 #include "mathematicalConstants.H"
30 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
35 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
37 defineTypeNameAndDebug(reitzKHRT, 0);
39 addToRunTimeSelectionTable
47 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
49 // Construct from components
52 const dictionary& dict,
56 breakupModel(dict, sm),
57 coeffsDict_(dict.subDict(typeName + "Coeffs")),
59 b0_(readScalar(coeffsDict_.lookup("B0"))),
60 b1_(readScalar(coeffsDict_.lookup("B1"))),
61 cTau_(readScalar(coeffsDict_.lookup("Ctau"))),
62 cRT_(readScalar(coeffsDict_.lookup("CRT"))),
63 msLimit_(readScalar(coeffsDict_.lookup("msLimit"))),
64 weberLimit_(readScalar(coeffsDict_.lookup("WeberLimit")))
68 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
70 reitzKHRT::~reitzKHRT()
74 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
76 void reitzKHRT::breakupParcel
81 const liquidMixture& fuels
85 label celli = p.cell();
88 scalar pc = spray_.p()[celli];
90 scalar sigma = fuels.sigma(pc, T, p.X());
91 scalar rhoLiquid = fuels.rho(pc, T, p.X());
92 scalar muLiquid = fuels.mu(pc, T, p.X());
93 scalar rhoGas = spray_.rho()[celli];
94 scalar Np = p.N(rhoLiquid);
95 scalar semiMass = Np*pow(p.d(), 3.0);
97 scalar weGas = p.We(vel, rhoGas, sigma);
98 scalar weLiquid = p.We(vel, rhoLiquid, sigma);
99 // correct the Reynolds number. Reitz is using radius instead of diameter
100 scalar reLiquid = 0.5*p.Re(rhoLiquid, vel, muLiquid);
101 scalar ohnesorge = sqrt(weLiquid)/(reLiquid + VSMALL);
102 scalar taylor = ohnesorge*sqrt(weGas);
104 vector acceleration = p.Urel(vel)/p.tMom();
105 vector trajectory = p.U()/mag(p.U());
106 scalar gt = (g_ + acceleration) & trajectory;
108 // frequency of the fastest growing KH-wave
111 0.34 + 0.38*pow(weGas, 1.5)
114 (1 + ohnesorge)*(1 + 1.4*pow(taylor, 0.6))
115 )*sqrt(sigma/(rhoLiquid*pow(r, 3)) );
117 // corresponding KH wave-length.
121 1.0 + 0.45*sqrt(ohnesorge)
124 1.0 + 0.4*pow(taylor, 0.7)
129 1.0 + 0.865*pow(weGas, 1.67)
134 // characteristic Kelvin-Helmholtz breakup time
135 scalar tauKH = 3.726*b1_*r/(omegaKH*lambdaKH);
137 // stable KH diameter
138 scalar dc = 2.0*b0_*lambdaKH;
140 // the frequency of the fastest growing RT wavelength.
141 scalar helpVariable = mag(gt*(rhoLiquid - rhoGas));
142 scalar omegaRT = sqrt
144 2.0*pow(helpVariable, 1.5)
145 /(3.0*sqrt(3.0*sigma)*(rhoGas + rhoLiquid))
149 scalar KRT = sqrt(helpVariable/(3.0*sigma + VSMALL));
151 // Wavelength of the fastest growing Raleigh-Taylor frequency
152 scalar lambdaRT = 2.0*mathematicalConstant::pi*cRT_/(KRT + VSMALL);
154 // if lambdaRT < diameter, then RT waves are growing on the surface
155 // and we start to keep track of how long they have been growing
156 if ((p.ct() > 0) || (lambdaRT < p.d()))
161 // characteristic RT breakup time
162 scalar tauRT = cTau_/(omegaRT + VSMALL);
164 // check if we have RT breakup
165 if ((p.ct() > tauRT) && (lambdaRT < p.d()))
167 // the RT breakup creates diameter/lambdaRT new droplets
169 scalar multiplier = p.d()/lambdaRT;
170 scalar nDrops = multiplier*Np;
171 p.d() = cbrt(semiMass/nDrops);
173 // otherwise check for KH breakup
176 // no breakup below Weber = 12
177 if (weGas > weberLimit_)
180 label injector = label(p.injector());
181 scalar fraction = deltaT/tauKH;
183 // reduce the diameter according to the rate-equation
184 p.d() = (fraction*dc + p.d())/(1.0 + fraction);
186 scalar dc3 = pow(dc, 3.0);
187 scalar ms = rhoLiquid*Np*dc3*mathematicalConstant::pi/6.0;
190 label nParcels = spray_.injectors()[injector].properties()->nParcelsToInject
192 spray_.injectors()[injector].properties()->tsoi(),
193 spray_.injectors()[injector].properties()->teoi()
196 scalar averageParcelMass = spray_.injectors()[injector].properties()->mass()/nParcels;
200 (p.ms()/averageParcelMass > msLimit_)
203 // set the initial ms value to -GREAT. This prevents
204 // new droplets from being formed from the child droplet
205 // from the KH instability
207 // mass of stripped child parcel
209 // Prevent child parcel from taking too much mass
248 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
250 } // End namespace Foam
252 // ************************************************************************* //