PilchErdman.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 Copyright (C) 2021 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
29#include "PilchErdman.H"
30
31// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
32
33template<class CloudType>
35(
36 const dictionary& dict,
37 CloudType& owner
38)
39:
40 BreakupModel<CloudType>(dict, owner, typeName),
41 B1_(0.375),
42 B2_(0.2274)
43{
44 if (!this->defaultCoeffs(true))
45 {
46 this->coeffDict().readEntry("B1", B1_);
47 this->coeffDict().readEntry("B2", B2_);
48 }
49}
50
51
52template<class CloudType>
54:
56 B1_(bum.B1_),
57 B2_(bum.B2_)
58{}
59
60
61// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
62
63template<class CloudType>
65(
66 const scalar dt,
67 const vector& g,
68 scalar& d,
69 scalar& tc,
70 scalar& ms,
71 scalar& nParticle,
72 scalar& KHindex,
73 scalar& y,
74 scalar& yDot,
75 const scalar d0,
76 const scalar rho,
77 const scalar mu,
78 const scalar sigma,
79 const vector& U,
80 const scalar rhoc,
81 const scalar muc,
82 const vector& Urel,
83 const scalar Urmag,
84 const scalar tMom,
85 scalar& dChild,
86 scalar& massChild
87)
88{
89 // Weber number - eq (1)
90 const scalar We = rhoc*sqr(Urmag)*d/sigma;
91
92 // Ohnesorge number - eq (2)
93 const scalar Oh = mu/sqrt(rho*d*sigma);
94
95 // Critical Weber number - eq (5)
96 const scalar Wec = 12.0*(1.0 + 1.077*pow(Oh, 1.6));
97
98 if (We > Wec)
99 {
100 // We > 2670, wave crest stripping - eq (12)
101 scalar taubBar = 5.5;
102
103 if (We < 2670)
104 {
105 if (We > 351)
106 {
107 // sheet stripping - eq (11)
108 taubBar = 0.766*pow(We - 12.0, 0.25);
109 }
110 else if (We > 45)
111 {
112 // bag-and-stamen breakup - eq (10)
113 taubBar = 14.1*pow(We - 12.0, -0.25);
114 }
115 else if (We > 18)
116 {
117 // bag breakup - eq (9)
118 taubBar = 2.45*pow(We - 12.0, 0.25);
119 }
120 else if (We > 12)
121 {
122 // vibrational breakup - eq (8)
123 taubBar = 6.0*pow(We - 12.0, -0.25);
124 }
125 else
126 {
127 // no break-up
128 taubBar = GREAT;
129 }
130 }
131
132 const scalar rho12 = sqrt(rhoc/rho);
133
134 // velocity of fragmenting drop - eq (20)
135 const scalar Vd = Urmag*rho12*(B1_*taubBar + B2_*sqr(taubBar));
136
137 // maximum stable diameter - eq (33)
138 const scalar Vd1 = max(sqr(1.0 - Vd/Urmag), SMALL);
139 const scalar dStable = Wec*sigma/(Vd1*rhoc*sqr(Urmag));
140
141 if (d < dStable)
142 {
143 // droplet diameter already stable = no break-up
144 // - do not update d and nParticle
145 return false;
146 }
147 else
148 {
149 const scalar semiMass = nParticle*pow3(d);
150
151 // invert eq (3) to create a dimensional break-up time
152 const scalar taub = taubBar*d/(Urmag*rho12);
153
154 // update droplet diameter according to the rate eq (implicitly)
155 const scalar frac = dt/taub;
156 d = (d + frac*dStable)/(1.0 + frac);
157
158 // correct the number of particles to conserve mass
159 nParticle = semiMass/pow3(d);
160 }
161 }
162
163 return false;
164}
165
166
167// ************************************************************************* //
scalar y
const uniformDimensionedVectorField & g
Templated break-up model class.
Definition: BreakupModel.H:61
Templated base class for dsmc cloud.
Definition: DSMCCloud.H:75
Particle secondary breakup model based on Pilch-Erdman total droplet breakup model.
Definition: PilchErdman.H:114
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
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:47
dimensionedSymmTensor sqr(const dimensionedVector &dv)
dimensionedScalar pow3(const dimensionedScalar &ds)
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
dimensionedScalar sqrt(const dimensionedScalar &ds)
dictionary dict