Ignis
Loading...
Searching...
No Matches
streams.cc
Go to the documentation of this file.
1#include "streams.h"
2#include <cassert>
3#include <iostream>
4
5using namespace std;
6
12
13streams::streams(shared_ptr<Cantera::Solution> csol,
14 const double _P,
15 const double _h0,
16 const double _h1,
17 const vector<double> &_y0,
18 const vector<double> &_y1) :
19 P(_P),
20 h0(_h0),
21 h1(_h1),
22 y0(_y0),
23 y1(_y1) {
24
25 //----------
26
27 gas = csol->thermo();
28 nspc = gas->nSpecies();
29
30 gCHON.resize(4);
31 gCHON[0] = 2.0/gas->atomicWeight(gas->elementIndex("C"));
32 gCHON[1] = 0.5/gas->atomicWeight(gas->elementIndex("H"));
33 gCHON[2] = -1.0/gas->atomicWeight(gas->elementIndex("O"));
34 gCHON[3] = 0.0;
35
36 //----------------
37
38 setStoicMixf();
39
40 getMixtureFraction(&y0[0], true); // set beta0 and beta1
41}
42
52
53void streams::getMixingState(const double mixf, vector<double> &ymix,
54 double &hmix, double &Tmix) {
55
56 hmix = h1*mixf + h0*(1.0-mixf);
57 for(int k=0; k<nspc; k++)
58 ymix[k] = y1[k]*mixf + y0[k]*(1.0-mixf);
59
60 gas->setMassFractions( &ymix[0] );
61 gas->setState_HP(hmix, P, 1.E-10); // get temperature as Tadiabatic
62
63 Tmix = gas->temperature();
64}
65
75
76void streams::getEquilibrium_HP(const double mixf, vector<double> &yeq,
77 double &heq, double &Teq) {
78
79 //---------- Compute the mixing mass fractions and enthalpy
80
81 yeq.resize(nspc);
82 for(int k=0; k<nspc; k++)
83 yeq[k] = y1[k]*mixf + y0[k]*(1.0-mixf);
84 heq = h1*mixf + h0*(1.0-mixf);
85
86 gas->setMassFractions(&yeq[0]);
87 gas->setState_HP(heq, P, 1.E-10);
88
89 gas->equilibrate("HP");
90 gas->getMassFractions(&yeq[0]);
91
92 Teq = gas->temperature();
93
94}
95
105
106void streams::getEquilibrium_TP(const double mixf, double Teq,
107 vector<double> &yeq, double &heq ) {
108
109 //---------- Compute the mixing mass fractions and enthalpy
110
111 yeq.resize(nspc);
112 for(int k=0; k<nspc; k++)
113 yeq[k] = y1[k]*mixf + y0[k]*(1.0-mixf);
114
115 gas->setState_TPY(Teq, P, &yeq[0]);
116
117 gas->equilibrate("TP");
118 gas->getMassFractions(&yeq[0]);
119
120 heq = gas->enthalpy_mass();
121
122}
123
134
135void streams::getProdOfCompleteComb(const double mixf, vector<double> &ypcc,
136 double &hpcc, double &Tpcc) {
137
138 //---------- Compute the mixing mass fractions and enthalpy
139
140 ypcc.resize(nspc);
141 double d1 = 1.0-mixf;
142 for(int k=0; k<nspc; k++) {
143 ypcc[k] = y1[k]*mixf + y0[k]*d1;
144 }
145 hpcc = h1*mixf + h0*d1;
146
147 //--------- Set gas and element indicicies
148
149 int iC = gas->elementIndex("C");
150 int iH = gas->elementIndex("H");
151 int iN = gas->elementIndex("N");
152 int iCO2 = gas->speciesIndex("CO2");
153 int iH2O = gas->speciesIndex("H2O");
154 int iN2 = gas->speciesIndex("N2");
155 int iO2 = gas->speciesIndex("O2");
156
157 //---------- Set ypcc as the mixing mole fractions: Take a basis of one mole:
158 // now we are working in moles
159 // elemM are moles of each element
160 // when stoic:
161 // CxHyNz + (x+y/4)O2 ==> (z/2)N2 + (x)CO2 + (y/2)H2O
162 // otherwise:
163 // CxHyNz + (beta)O2 ==> (z/2)N2 + (x)CO2 + (y/2)H2O
164 // Note this allows fuels with nitrogen and oxygen
165
166 gas->setMassFractions( &ypcc[0] );
167 gas->getMoleFractions( &ypcc[0] );
168
169 double nOnotFromO2;
170 double nHnotFromH2O;
171 double nCnotFromCO2;
172 vector<double> elemM = getElementMoles( &ypcc[0], nOnotFromO2,
173 nHnotFromH2O, nCnotFromCO2 );
174
175 double x = elemM[iC];
176 double y = elemM[iH];
177 double z = elemM[iN];
178 double beta = elemM[gas->elementIndex("O")] * 0.5; // moles of O as O2
179
180 //--------------------------------------------------------------------------
181
182 if(mixf < mixfStoic) { // lean: burn all fuel, leftover O2
183
184 for(int k=0; k<nspc; k++)
185 ypcc[k] = 0.0;
186
187 if(iCO2 > 0) // CO2 is not in the H2 mechs
188 ypcc[iCO2] = x;
189 ypcc[iH2O] = y*0.5;
190 ypcc[iN2] = z*0.5;
191 ypcc[iO2] = beta - (x+y/4.0);
192
193 }
194 else{ // rich: burn all O2, leftover fuel
195
196 //double eta = beta/(x+y/4.0); // extent of reaction
197 double eta = (beta-nOnotFromO2/2)/(x+y/4-nOnotFromO2/2); // extent of reaction
198 if(eta > 1.0)
199 cout << endl << "eta > 1.0" << endl;
200 d1 = 1.0-eta; // fraction of fuel unburnt
201
202 for(int k=0; k<nspc; k++)
203 ypcc[k] *= d1; // initialize everything then correct
204 if(iCO2 > 0) // CO2 is not in the H2 mechs
205 ypcc[iCO2] = (x-nCnotFromCO2) + nCnotFromCO2*eta; // init + formed
206 ypcc[iH2O] = (y-nHnotFromH2O)*0.5 + nHnotFromH2O*0.5*eta; // init + formed
207 ypcc[iN2] = z*0.5;
208 ypcc[iO2] = 0.0;
209
210 }
211
212 //--------------------------------------------------------------------------
213
214 double sum = 0.0; // normalize moles
215 for(int k=0; k<nspc; k++)
216 sum += ypcc[k];
217 assert(sum != 0.0);
218 for(int k=0; k<nspc; k++)
219 ypcc[k] /= sum;
220 gas->setMoleFractions( &ypcc[0] ); // set mole fractions
221 gas->getMassFractions( &ypcc[0] ); // set ypcc as mass fractions
222
223
224 //--------------------------------------------------------------------------
225
226 gas->setState_HP(hpcc, P, 1.E-10); // get temperature as Tadiabatic
227 //gas->setState_HP(hpcc, P); // get temperature as Tadiabatic
228 Tpcc = gas->temperature();
229
230}
231
237
239
240 vector<double> x_c(nspc,0.0);
241
242 double mc0, mc1, mo0, mo1, mh0, mh1;
243
244 vector<double> elemMassFrac0 = getElementMassFracs(&y0[0]);
245 vector<double> elemMassFrac1 = getElementMassFracs(&y1[0]);
246
247 mc0 = elemMassFrac0[gas->elementIndex("C")]/
248 gas->atomicWeight(gas->elementIndex("C"));
249 mc1 = elemMassFrac1[gas->elementIndex("C")]/
250 gas->atomicWeight(gas->elementIndex("C"));
251 mh0 = elemMassFrac0[gas->elementIndex("H")]/
252 gas->atomicWeight(gas->elementIndex("H"));
253 mh1 = elemMassFrac1[gas->elementIndex("H")]/
254 gas->atomicWeight(gas->elementIndex("H"));
255 mo0 = elemMassFrac0[gas->elementIndex("O")]/
256 gas->atomicWeight(gas->elementIndex("O"));
257 mo1 = elemMassFrac1[gas->elementIndex("O")]/
258 gas->atomicWeight(gas->elementIndex("O"));
259
260 mixfStoic = (2.0*mc0 + 0.5*mh0 - mo0) /
261 (mo1-mo0 + 2.0*(mc0-mc1) + 0.5*(mh0-mh1));
262
263 cout << endl << "# mixfStoic = m_fuel/(m_fuel+m_air) = " << mixfStoic << endl;
264
265}
266
274
275vector<double> streams::getElementMassFracs(const double *y) {
276
277 vector<double> elemMassFrac(gas->nElements(), 0.0);
278 gas->setMassFractions( &y[0] );
279 for(int k=0; k<gas->nElements(); k++)
280 elemMassFrac[k] = gas->elementalMassFraction(k);
281 return elemMassFrac;
282}
283
294
295vector<double> streams::getElementMoles(const double *x,
296 double &nOnotFromO2,
297 double &nHnotFromH2O,
298 double &nCnotFromCO2) {
299
300 nOnotFromO2 = 0.0;
301 nHnotFromH2O = 0.0;
302 nCnotFromCO2 = 0.0;
303
304 //vector<double> atomArr(gas->nElements());
305 vector<double> elemM(gas->nElements(), 0.0);
306 int iO2 = gas->speciesIndex("O2");
307 int iO = gas->elementIndex("O");
308 int iCO2 = gas->speciesIndex("CO2");
309 int iC = gas->elementIndex("C");
310 int iH2O = gas->speciesIndex("H2O");
311 int iH = gas->elementIndex("H");
312
313 for(int k=0; k<nspc; k++) {
314 vector<double> xx(gas->nSpecies(), 0.0);
315 xx[k] = 1.0;
316 gas->setMoleFractions(&xx[0]);
317 for(int m=0; m<gas->nElements(); m++)
318 elemM[m] += x[k] * gas->elementalMoleFraction(m);
319 if(k != iO2) nOnotFromO2 += gas->elementalMoleFraction(iO) * x[k];
320 if(k != iCO2) nCnotFromCO2 += gas->elementalMoleFraction(iC) * x[k];
321 if(k != iH2O) nHnotFromH2O += gas->elementalMoleFraction(iH) * x[k];
322 }
323 return elemM;
324}
325
336
337double streams::getMixtureFraction(const double *y, const bool doBeta01) {
338
339 vector<double> elemMF;
340 double beta;
341
342 elemMF = getElementMassFracs(y);
343 beta = gCHON[0] * elemMF[gas->elementIndex("C")] +
344 gCHON[1] * elemMF[gas->elementIndex("H")] +
345 gCHON[2] * elemMF[gas->elementIndex("O")] +
346 gCHON[3] * elemMF[gas->elementIndex("N")];
347
348 if(doBeta01) {
349 elemMF = getElementMassFracs(&y0[0]);
350 beta0 = gCHON[0] * elemMF[gas->elementIndex("C")] +
351 gCHON[1] * elemMF[gas->elementIndex("H")] +
352 gCHON[2] * elemMF[gas->elementIndex("O")] +
353 gCHON[3] * elemMF[gas->elementIndex("N")];
354
355 elemMF = getElementMassFracs(&y1[0]);
356 beta1 = gCHON[0] * elemMF[gas->elementIndex("C")] +
357 gCHON[1] * elemMF[gas->elementIndex("H")] +
358 gCHON[2] * elemMF[gas->elementIndex("O")] +
359 gCHON[3] * elemMF[gas->elementIndex("N")];
360 }
361
362 if( beta1-beta0 == 0 )
363 return 0.0; // to avoid division by zero
364 else
365 return (beta - beta0)/(beta1 - beta0);
366}
std::vector< double > y1
stream mixf=1 composition vector
Definition streams.h:29
streams()
Definition streams.h:81
void setStoicMixf()
Definition streams.cc:238
double beta1
mixf = (beta-beta0) / (beta1-beta0)
Definition streams.h:38
std::vector< double > getElementMoles(const double *x, double &nOnotFromO2, double &nHnotFromH2O, double &nCnotFromCO2)
Definition streams.cc:295
double beta0
mixf = (beta-beta0) / (beta1-beta0)
Definition streams.h:37
double h1
stream mixf=1 enthalpy (J/kg)
Definition streams.h:27
std::vector< double > y0
stream mixf=0 composition vector
Definition streams.h:28
int nspc
number of species in gas mechanism
Definition streams.h:36
void getEquilibrium_HP(const double mixf, std::vector< double > &yeq, double &heq, double &Teq)
Definition streams.cc:76
double mixfStoic
stoichiometric mixture fraction
Definition streams.h:35
std::vector< double > gCHON
gammas, as in beta = sum_i (y_i*gamma_i)
Definition streams.h:40
std::vector< double > getElementMassFracs(const double *y)
Definition streams.cc:275
double h0
stream mixf=0 enthalpy (J/kg)
Definition streams.h:26
double P
Definition streams.h:31
double getMixtureFraction(const double *y, const bool doBeta01=false)
Definition streams.cc:337
void getProdOfCompleteComb(const double mixf, std::vector< double > &ypcc, double &hpcc, double &Tpcc)
Definition streams.cc:135
std::shared_ptr< Cantera::ThermoPhase > gas
Definition streams.h:33
void getMixingState(const double mixf, std::vector< double > &ymix, double &hmix, double &Tmix)
Definition streams.cc:53
void getEquilibrium_TP(const double mixf, double Teq, std::vector< double > &yeq, double &heq)
Definition streams.cc:106