Skip to content

Commit ad82590

Browse files
author
Henry Weller
committed
combustionModels::EDC: New Eddy Dissipation Concept (EDC) turbulent combustion model
including support for TDAC and ISAT for efficient chemistry calculation. Description Eddy Dissipation Concept (EDC) turbulent combustion model. This model considers that the reaction occurs in the regions of the flow where the dissipation of turbulence kinetic energy takes place (fine structures). The mass fraction of the fine structures and the mean residence time are provided by an energy cascade model. There are many versions and developments of the EDC model, 4 of which are currently supported in this implementation: v1981, v1996, v2005 and v2016. The model variant is selected using the optional \c version entry in the \c EDCCoeffs dictionary, \eg \verbatim EDCCoeffs { version v2016; } \endverbatim The default version is \c v2015 if the \c version entry is not specified. Model versions and references: \verbatim Version v2005: Cgamma = 2.1377 Ctau = 0.4083 kappa = gammaL^exp1 / (1 - gammaL^exp2), where exp1 = 2, and exp2 = 2. Magnussen, B. F. (2005, June). The Eddy Dissipation Concept - A Bridge Between Science and Technology. In ECCOMAS thematic conference on computational combustion (pp. 21-24). Version v1981: Changes coefficients exp1 = 3 and exp2 = 3 Magnussen, B. (1981, January). On the structure of turbulence and a generalized eddy dissipation concept for chemical reaction in turbulent flow. In 19th Aerospace Sciences Meeting (p. 42). Version v1996: Changes coefficients exp1 = 2 and exp2 = 3 Gran, I. R., & Magnussen, B. F. (1996). A numerical study of a bluff-body stabilized diffusion flame. Part 2. Influence of combustion modeling and finite-rate chemistry. Combustion Science and Technology, 119(1-6), 191-217. Version v2016: Use local constants computed from the turbulent Da and Re numbers. Parente, A., Malik, M. R., Contino, F., Cuoci, A., & Dally, B. B. (2016). Extension of the Eddy Dissipation Concept for turbulence/chemistry interactions to MILD combustion. Fuel, 163, 98-111. \endverbatim Tutorials cases provided: reactingFoam/RAS/DLR_A_LTS, reactingFoam/RAS/SandiaD_LTS. This codes was developed and contributed by Zhiyi Li Alessandro Parente Francesco Contino from BURN Research Group and updated and tested for release by Henry G. Weller CFD Direct Ltd.
1 parent e41fdb7 commit ad82590

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+15950
-0
lines changed

src/combustionModels/EDC/EDC.C

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
/*---------------------------------------------------------------------------*\
2+
========= |
3+
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4+
\\ / O peration |
5+
\\ / A nd | Copyright (C) 2017 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 "EDC.H"
27+
28+
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
29+
30+
template<class Type>
31+
Foam::combustionModels::EDC<Type>::EDC
32+
(
33+
const word& modelType,
34+
const fvMesh& mesh,
35+
const word& combustionProperties,
36+
const word& phaseName
37+
)
38+
:
39+
laminar<Type>(modelType, mesh, combustionProperties, phaseName),
40+
version_
41+
(
42+
EDCversionNames
43+
[
44+
this->coeffs().lookupOrDefault
45+
(
46+
"version",
47+
word(EDCversionNames[EDCdefaultVersion])
48+
)
49+
]
50+
),
51+
C1_(this->coeffs().lookupOrDefault("C1", 0.05774)),
52+
C2_(this->coeffs().lookupOrDefault("C2", 0.5)),
53+
Cgamma_(this->coeffs().lookupOrDefault("Cgamma", 2.1377)),
54+
Ctau_(this->coeffs().lookupOrDefault("Ctau", 0.4083)),
55+
exp1_(this->coeffs().lookupOrDefault("exp1", EDCexp1[int(version_)])),
56+
exp2_(this->coeffs().lookupOrDefault("exp2", EDCexp2[int(version_)])),
57+
kappa_
58+
(
59+
IOobject
60+
(
61+
IOobject::groupName(typeName + ":kappa", phaseName),
62+
mesh.time().timeName(),
63+
mesh,
64+
IOobject::NO_READ,
65+
IOobject::AUTO_WRITE
66+
),
67+
mesh,
68+
dimensionedScalar("kappa", dimless, 0)
69+
)
70+
{}
71+
72+
73+
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
74+
75+
template<class Type>
76+
Foam::combustionModels::EDC<Type>::~EDC()
77+
{}
78+
79+
80+
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
81+
82+
template<class Type>
83+
void Foam::combustionModels::EDC<Type>::correct()
84+
{
85+
if (this->active())
86+
{
87+
tmp<volScalarField> tepsilon(this->turbulence().epsilon());
88+
const volScalarField& epsilon = tepsilon();
89+
90+
tmp<volScalarField> tmu(this->turbulence().mu());
91+
const volScalarField& mu = tmu();
92+
93+
tmp<volScalarField> tk(this->turbulence().k());
94+
const volScalarField& k = tk();
95+
96+
tmp<volScalarField> trho(this->rho());
97+
const volScalarField& rho = trho();
98+
99+
scalarField tauStar(epsilon.size(), 0);
100+
101+
if (version_ == EDCversions::v2016)
102+
{
103+
tmp<volScalarField> ttc(this->chemistryPtr_->tc());
104+
const volScalarField& tc = ttc();
105+
106+
forAll(tauStar, i)
107+
{
108+
const scalar nu = mu[i]/(rho[i] + SMALL);
109+
110+
const scalar Da =
111+
max(min(sqrt(nu/(epsilon[i] + SMALL))/tc[i], 10), 1e-10);
112+
113+
const scalar ReT = sqr(k[i])/(nu*epsilon[i] + SMALL);
114+
const scalar CtauI = min(C1_/(Da*sqrt(ReT + 1)), 2.1377);
115+
116+
const scalar CgammaI =
117+
max(min(C2_*sqrt(Da*(ReT + 1)), 5), 0.4082);
118+
119+
const scalar gammaL =
120+
CgammaI*pow025(nu*epsilon[i]/(sqr(k[i]) + SMALL));
121+
122+
tauStar[i] = CtauI*sqrt(nu/(epsilon[i] + SMALL));
123+
124+
if (gammaL >= 1)
125+
{
126+
kappa_[i] = 1;
127+
}
128+
else
129+
{
130+
kappa_[i] =
131+
max
132+
(
133+
min
134+
(
135+
pow(gammaL, exp1_)/(1 - pow(gammaL, exp2_)),
136+
1
137+
),
138+
0
139+
);
140+
}
141+
}
142+
}
143+
else
144+
{
145+
forAll(tauStar, i)
146+
{
147+
const scalar nu = mu[i]/(rho[i] + SMALL);
148+
const scalar gammaL =
149+
Cgamma_*pow025(nu*epsilon[i]/(sqr(k[i]) + SMALL));
150+
151+
tauStar[i] = Ctau_*sqrt(nu/(epsilon[i] + SMALL));
152+
if (gammaL >= 1)
153+
{
154+
kappa_[i] = 1;
155+
}
156+
else
157+
{
158+
kappa_[i] =
159+
max
160+
(
161+
min
162+
(
163+
pow(gammaL, exp1_)/(1 - pow(gammaL, exp2_)),
164+
1
165+
),
166+
0
167+
);
168+
}
169+
}
170+
}
171+
172+
this->chemistryPtr_->solve(tauStar);
173+
}
174+
}
175+
176+
177+
template<class Type>
178+
Foam::tmp<Foam::fvScalarMatrix>
179+
Foam::combustionModels::EDC<Type>::R(volScalarField& Y) const
180+
{
181+
return kappa_*laminar<Type>::R(Y);
182+
}
183+
184+
185+
template<class Type>
186+
Foam::tmp<Foam::volScalarField>
187+
Foam::combustionModels::EDC<Type>::Qdot() const
188+
{
189+
tmp<volScalarField> tQdot
190+
(
191+
new volScalarField
192+
(
193+
IOobject
194+
(
195+
IOobject::groupName(typeName + ":Qdot", this->phaseName_),
196+
this->mesh().time().timeName(),
197+
this->mesh(),
198+
IOobject::NO_READ,
199+
IOobject::NO_WRITE,
200+
false
201+
),
202+
this->mesh(),
203+
dimensionedScalar("Qdot", dimEnergy/dimVolume/dimTime, 0)
204+
)
205+
);
206+
207+
if (this->active())
208+
{
209+
tQdot.ref() = kappa_*this->chemistryPtr_->Qdot();
210+
}
211+
212+
return tQdot;
213+
}
214+
215+
216+
template<class Type>
217+
bool Foam::combustionModels::EDC<Type>::read()
218+
{
219+
if (Type::read())
220+
{
221+
version_ =
222+
(
223+
EDCversionNames
224+
[
225+
this->coeffs().lookupOrDefault
226+
(
227+
"version",
228+
word(EDCversionNames[EDCdefaultVersion])
229+
)
230+
]
231+
);
232+
C1_ = this->coeffs().lookupOrDefault("C1", 0.05774);
233+
C2_ = this->coeffs().lookupOrDefault("C2", 0.5);
234+
Cgamma_ = this->coeffs().lookupOrDefault("Cgamma", 2.1377);
235+
Ctau_ = this->coeffs().lookupOrDefault("Ctau", 0.4083);
236+
exp1_ = this->coeffs().lookupOrDefault("exp1", EDCexp1[int(version_)]);
237+
exp2_ = this->coeffs().lookupOrDefault("exp2", EDCexp2[int(version_)]);
238+
239+
return true;
240+
}
241+
else
242+
{
243+
return false;
244+
}
245+
}
246+
247+
248+
// ************************************************************************* //

0 commit comments

Comments
 (0)