SootLib
Loading...
Searching...
No Matches
sootModel_MOMIC.cc
Go to the documentation of this file.
1#include "sootModel_MOMIC.h"
2#include "binomial.h"
3#include <cmath> //isfinite (not nan or inf)
4
5using namespace std;
6using namespace soot;
7
20
22 nucleationModel *nucl_,
23 growthModel *grow_,
24 oxidationModel *oxid_,
25 coagulationModel *coag_) :
26 sootModel(nsoot_, nucl_, grow_, oxid_, coag_) {
27
28 if (nsoot_ < 3 || nsoot_ > 8)
29 throw runtime_error("MOMIC requires 3-8 moments");
30
34 throw runtime_error("MOMIC coagulation requires FM or CONTINUUM or HM");
35
37
38 diffTable.resize(nsoot);
39 for (size_t k=0; k<nsoot; k++)
40 diffTable[k] = vector<double>(nsoot-k, 0.0);
41
42 Nmom = nsoot;
43
44 Mp6 = vector<double>(22, 0.0);
45 Mq6 = vector<double>(30, 0.0);
46 np = {4,4,7,10,13,16,19,22};
47 nq = {12,12,15,18,21,24,27,30};
48}
49
63
65 nucleationMech Nmech,
66 growthMech Gmech,
67 oxidationMech Omech,
68 coagulationMech Cmech) :
69 sootModel(nsoot_, Nmech, Gmech, Omech, Cmech) {
70
71 if (nsoot_ < 3 || nsoot_ > 8)
72 throw runtime_error("MOMIC requires 3-8 moments");
73
77 throw runtime_error("MOMIC coagulation requires FM or CONTINUUM or HM");
78
80
81 diffTable.resize(nsoot);
82 for (size_t k=0; k<nsoot; k++)
83 diffTable[k] = vector<double>(nsoot-k, 0.0);
84
85 Nmom = nsoot;
86
87 Mp6 = vector<double>(22, 0.0);
88 Mq6 = vector<double>(30, 0.0);
89 np = {4,4,7,10,13,16,19,22};
90 nq = {12,12,15,18,21,24,27,30};
91}
92
106
108
109
110 for (size_t k=0; k<nsoot; k++)
111 sources.sootSources[k] = 0.0; // reset to zero, in case downselectIfNeeded reduces Nmom
112
113 //----------
114
115 vector<double> Mtemp = state.sootVar;
116
117 //doldb downselectIfNeeded(Mtemp);
118
119 set_diffTable(Mtemp);
120
121 set_fractional_moments_Mp6_Mq6(); // set fractional_moment_arrays
122
123 //---------- get chemical rates
124
125 double Jnuc = nucl->getNucleationSootRate(state);
126 double Kgrw = grow->getGrowthSootRate(state);
127 double Koxi = oxid->getOxidationSootRate(state);
128
129 //---------- nucleation terms
130
131 vector<double> Mnuc(Nmom, 0);
132
134 double m_nuc = state.cMin*gasSpMW[(int)gasSp::C]/Na;
135 for (size_t i=0; i<Nmom; i++)
136 Mnuc[i] = pow(m_nuc, i)*Jnuc;
137 }
138
139 //---------- PAH condensation terms
140
141 vector<double> Mcnd(Nmom, 0);
142
144
145 //set_mDimerPowers(); // not needed here (called in pahSootCollisionRatePerDimer in nucl PAH)
146
147 vector<double> Mcnd_C(Nmom, 0);
148 vector<double> Mcnd_FM(Nmom, 0);
149
150 //------ continuum
151
152 const double Kc = coag->getKc(state);
153 const double Kcp = coag->getKcp(state);
154
155 double mDimer = nucl->DIMER.mDimer;
156 double nDimer = nucl->DIMER.nDimer;
157
158 for (size_t k=1, kk=(k-1)*3; k<Nmom; k++) // skip moment 0 (no growth term)
159 Mcnd_C[k] = double(k)*Kc*nDimer*mDimer* (
160 mD26*Mp6[kk+1] + // mD26*M_{k-1-2/6}
161 2.*Mp6[kk+2] + // 2.*M_{k-1+0/6}
162 mDn26*Mp6[kk+3] + // mDn26*M_{k-1+2/6}
163 Kcp*( mD26*Mp6[kk+0] + // mD26*M_{k-1-4/6}
164 Mp6[kk+1] + // M_{k-1-2/6}
165 mDn26*Mp6[kk+2] + // mDn26*M_{k-1+0/6}
166 mDn46*Mp6[kk+3] ) ); // mDn46*M_{k-1+2/6}
167
168 //------ free molecular
169
170 const double Kfm = coag->getKfm(state);
171
172 for (size_t k=1; k<Nmom; k++) // skip moment 0 (no growth term)
173 Mcnd_FM[k] = double(k)*Kfm*nDimer*mDimer*g_grid(k);
174
175 //------ harmonic mean
176
177 for (size_t k=1; k<Nmom; k++) // skip moment 0 (no growth term)
178 Mcnd[k] = Mcnd_FM[k]*Mcnd_C[k] / (Mcnd_FM[k]+Mcnd_C[k]);
179 }
180
181 //---------- growth terms
182
183 vector<double> Mgrw(Nmom, 0);
184 const double Acoef = M_PI * pow(6./(M_PI*rhoSoot), twothird);
185
187 for (size_t k=1; k<Nmom; k++)
188 Mgrw[k] = Kgrw*Acoef*k*Mr(k-onethird);
189
190 //---------- oxidation terms
191
192 vector<double> Moxi(Nmom, 0);
193
195 for (size_t k=1; k<Nmom; k++)
196 Moxi[k] = -Koxi*Acoef*k*Mr(k-onethird);
197
198 //---------- coagulation terms
199
200 vector<double> Mcoa(Nmom, 0);
201
203 Mcoa = MOMICCoagulationRates(state, Mtemp);
204
205 //---------- combine to make soot source terms
206
207 for (size_t i=0; i<Nmom; i++)
208 sources.sootSources[i] = Mnuc[i] + Mcnd[i] + Mgrw[i] + Moxi[i] + Mcoa[i];
209
210 //---------- set gas source terms
211
212 vector<double> nucl_gasSources((size_t)gasSp::size, 0.0);
213 vector<double> grow_gasSources((size_t)gasSp::size, 0.0);
214 vector<double> oxid_gasSources((size_t)gasSp::size, 0.0);
215
216 nucl->getNucleationGasRates(Mnuc[1], nucl_gasSources);
217 grow->getGrowthGasRates( Mgrw[1], grow_gasSources);
218 oxid->getOxidationGasRates( Moxi[1], oxid_gasSources);
219
220 for (size_t sp=0; sp<(size_t)gasSp::size; sp++)
221 sources.gasSources[sp] = nucl_gasSources[sp] + grow_gasSources[sp] + oxid_gasSources[sp];
222
223 //---------- set PAH source terms
224
227
228}
229
237
238void sootModel_MOMIC::downselectIfNeeded(vector<double> &M) {
239
240 //----------- lognormal distribution constants
241
242 const double sigL = 3.0;
243 const double mavg = 1.0E-21;
244
245 if (M[0] <= 0)
246 return;
247
248 if (M[1] <= 0.0)
249 M[1] = M[0] * mavg * exp(0.5 * pow(sigL,2.0)); // estimate an M1 value based on M0 and lognormal distribution
250
251 if (M[2] <= 0.0)
252 M[2] = M[0] * pow(mavg,2) * exp(0.5 * 4 * pow(sigL,2.0)); // estimate an M2 value based on M0 and lognormal distribution
253
254 // CHECK: all remaining moments <= 0.0
255
256 Nmom = M.size();
257 bool zeros = false;
258
259 do {
260 zeros = false; // reset flag
261 for (size_t i=0; i<Nmom; i++)
262 if (M[i] <= 0.0) { // if value <= 0.0 found, throw flag and downselect by one
263 zeros = true;
264 Nmom = Nmom - 1;
265 }
266
267 } while (Nmom>3 && zeros); // will not downselect below 3 moments
268
269 M.resize(Nmom);
270
271 return;
272}
273
293
294double sootModel_MOMIC::f_grid(int x, int y) {
295
296 int xi = x*3; // add this index
297 int yi = y*3; // add this index
298
299 double f0, f1, f2, f3;
300
301 //-----------
302
303 if (x==y) { // exploit the symmetry
304 f0 = 2.*( Mq6[xi+0] * Mq6[yi+2] +
305 Mq6[xi+1] * Mq6[yi+1] );
306
307 f1 = 2.*( Mq6[xi+0] * Mq6[yi+5] +
308 2.*Mq6[xi+1] * Mq6[yi+4] +
309 Mq6[xi+2] * Mq6[yi+3] );
310
311 if (y<=3)
312 f2 = 2.*( Mq6[xi+0] * Mq6[yi+8] +
313 2.*Mq6[xi+1] * Mq6[yi+7] +
314 Mq6[xi+2] * Mq6[yi+6] +
315 2.*Mq6[xi+3] * Mq6[yi+5] +
316 2.*Mq6[xi+4] * Mq6[yi+4] );
317
318 if (y<=2)
319 f3 = 2.*( Mq6[xi+0] * Mq6[yi+11] +
320 2.*Mq6[xi+1] * Mq6[yi+10] +
321 Mq6[xi+2] * Mq6[yi+9] +
322 3.*Mq6[xi+3] * Mq6[yi+8] +
323 6.*Mq6[xi+4] * Mq6[yi+7] +
324 3.*Mq6[xi+5] * Mq6[yi+6] );
325 }
326 else {
327
328 f0 = Mq6[xi+0] * Mq6[yi+2] + // note the pattern (0, 1, 2; 2, 1, 0)
329 2.*Mq6[xi+1] * Mq6[yi+1] +
330 Mq6[xi+2] * Mq6[yi+0];
331
332 f1 = Mq6[xi+0] * Mq6[yi+5] +
333 2.*Mq6[xi+1] * Mq6[yi+4] +
334 Mq6[xi+2] * Mq6[yi+3] +
335 Mq6[xi+3] * Mq6[yi+2] +
336 2.*Mq6[xi+4] * Mq6[yi+1] +
337 Mq6[xi+5] * Mq6[yi+0] ;
338
339 if (y<=3)
340 f2 = Mq6[xi+0] * Mq6[yi+8] +
341 2.*Mq6[xi+1] * Mq6[yi+7] +
342 Mq6[xi+2] * Mq6[yi+6] +
343 2.*Mq6[xi+3] * Mq6[yi+5] +
344 4.*Mq6[xi+4] * Mq6[yi+4] +
345 2.*Mq6[xi+5] * Mq6[yi+3] +
346 Mq6[xi+6] * Mq6[yi+2] +
347 2.*Mq6[xi+7] * Mq6[yi+1] +
348 Mq6[xi+8] * Mq6[yi+0] ;
349
350 if (y<=2)
351 f3 = Mq6[xi+0] * Mq6[yi+11] +
352 2.*Mq6[xi+1] * Mq6[yi+10] +
353 Mq6[xi+2] * Mq6[yi+9] +
354 3.*Mq6[xi+3] * Mq6[yi+8] +
355 6.*Mq6[xi+4] * Mq6[yi+7] +
356 3.*Mq6[xi+5] * Mq6[yi+6] +
357 3.*Mq6[xi+6] * Mq6[yi+5] +
358 6.*Mq6[xi+7] * Mq6[yi+4] +
359 3.*Mq6[xi+8] * Mq6[yi+3] +
360 Mq6[xi+9] * Mq6[yi+2] +
361 2.*Mq6[xi+10] * Mq6[yi+1] +
362 Mq6[xi+11] * Mq6[yi+0] ;
363 }
364
365 //----------- Lagrange interpolation to point 1/2 using some or all of points 0, 1, 2, 3
366
367 double fhalf;
368 if (y<=2) // 4 point interpolant
369 fhalf = pow(f0,5./16.) * pow(f1,15./16.) * pow(f2, -5./16.) * pow(f3, 1./16.);
370 else if (y<=3) // 3 point interpolant
371 fhalf = pow(f0, 3./8.) * pow(f1, 3./4.) * pow(f2, -1./8.);
372 else // h point interpolant
373 fhalf = pow(f0, 1./2.) * pow(f1, 1./2.);
374
375 return fhalf;
376}
377
398
399double sootModel_MOMIC::g_grid(int y) {
400
401 int yi = (y-1)*3; // add this index
402
403 double g0, g1, g2, g3;
404
405 //-----------
406
407 g0 = mD16 * Mq6[yi+0] +
408 2.*mDn16 * Mq6[yi+1] +
409 mDn36 * Mq6[yi+2];
410
411 g1 = mD76 * Mq6[yi+0] +
412 2.*mD56 * Mq6[yi+1] +
413 mD36 * Mq6[yi+2] +
414 mD16 * Mq6[yi+3] +
415 2.*mDn16 * Mq6[yi+4] +
416 mDn36 * Mq6[yi+5] ;
417
418 if (y<=3)
419 g2 = mD136 * Mq6[yi+0] +
420 2.*mD116 * Mq6[yi+1] +
421 mD96 * Mq6[yi+2] +
422 2.*mD76 * Mq6[yi+3] +
423 4.*mD56 * Mq6[yi+4] +
424 2.*mD36 * Mq6[yi+5] +
425 mD16 * Mq6[yi+6] +
426 2.*mDn16 * Mq6[yi+7] +
427 mDn36 * Mq6[yi+8] ;
428
429 if (y<=2)
430 g3 = mD196 * Mq6[yi+0] +
431 2.*mD176 * Mq6[yi+1] +
432 mD156 * Mq6[yi+2] +
433 3.*mD136 * Mq6[yi+3] +
434 6.*mD116 * Mq6[yi+4] +
435 3.*mD96 * Mq6[yi+5] +
436 3.*mD76 * Mq6[yi+6] +
437 6.*mD56 * Mq6[yi+7] +
438 3.*mD36 * Mq6[yi+8] +
439 mD16 * Mq6[yi+9] +
440 2.*mDn16 * Mq6[yi+10] +
441 mDn36 * Mq6[yi+11] ;
442
443 //----------- Lagrange interpolation to point 1/2 using some or all of points 0, 1, 2, 3
444
445 double ghalf;
446 if (y<=2) // 4 point interpolant
447 ghalf = pow(g0,5./16.) * pow(g1,15./16.) * pow(g2, -5./16.) * pow(g3, 1./16.);
448 else if (y<=3) // 3 point interpolant
449 ghalf = pow(g0, 3./8.) * pow(g1, 3./4.) * pow(g2, -1./8.);
450 else // h point interpolant
451 ghalf = pow(g0, 1./2.) * pow(g1, 1./2.);
452
453 return ghalf;
454}
455
465
466vector<double> sootModel_MOMIC::MOMICCoagulationRates(const state& state, vector<double>& M){
467
468 if (M[0] <= 0.0) return vector<double>(Nmom, 0.0);
469
470 vector<double> Rates_C(Nmom, 0.0);
471 vector<double> Rates_FM(Nmom, 0.0);
472 vector<double> Rates(Nmom, 0.0);
473
474 //----------- free-molecular regime
475
478
479 const double Kfm = coag->getKfm(state);
480
481 for (size_t r=0; r<Nmom; r++) {
482 if (r==1) continue;
483 if (r==0)
484 Rates_FM[r] = -0.5*Kfm*f_grid(0,0);
485 else {
486 for (size_t k=1; k<=r-1; k++)
487 Rates_FM[r] += binomial_coefficient(r,k) * f_grid(k, r-k);
488 Rates_FM[r] *= 0.5*Kfm;
489 }
490 }
491 }
492
493 //----------- continuum regime
494
497
498 const double Kc = coag->getKc( state);
499 const double Kcp = coag->getKcp(state);
500
501
502 for (size_t r=0; r<Nmom; r++) {
503 if (r==1) continue;
504 if (r==0)
505 Rates_C[r] = -Kc*( Mp6[2]*Mp6[2] + Mp6[1]*Mp6[3] + // M_0*M_0 + M_{-2/6}*M_{2/6}
506 Kcp*( Mp6[1]*Mp6[2] + Mp6[0]*Mp6[3] ) ); // M_{-2/6}*M_0 + M_{-4/6}*M_{2/6}
507 else {
508 size_t kk, rk; // index shifters
509 for (size_t k=1; k<=r-1; k++) {
510 kk = k*3;
511 rk = (r-k)*3;
512 Rates_C[r] = binomial_coefficient(r,k) * (
513 Mp6[kk+1]*Mp6[rk+3] + // M_{k-2/6}*M_{r-k+2/6}
514 2.0* Mp6[kk+2]*Mp6[rk+2] + // M_{k+0/6}*M_{r-k+0/6}
515 Mp6[kk+3]*Mp6[rk+1] + // M_{k+2/6}*M_{r-k-2/6}
516 Kcp*( Mp6[kk+0]*Mp6[rk+3] + // M_{k-4/6}*M_{r-k+2/6}
517 Mp6[kk+1]*Mp6[rk+2] + // M_{k-2/6}*M_{r-k+0/6}
518 Mp6[kk+2]*Mp6[rk+1] + // M_{k+0/6}*M_{r-k-2/6}
519 Mp6[kk+3]*Mp6[rk+0] ) ); // M_{k+2/6}*M_{r-k-4/6}
520 }
521 Rates_C[r] *= 0.5*Kc;
522 }
523 }
524 }
525
526 //----------- finalize and return
527
528 for (size_t r=0; r<Nmom; r++) {
529 if (r==1) continue;
531 Rates[r] = Rates_FM[r];
533 Rates[r] = Rates_C[r];
534 else // harmonic mean
535 Rates[r] = Rates_FM[r]*Rates_C[r] / (Rates_FM[r]+Rates_C[r]);
536 }
537
538 return Rates;
539}
540
555
556double sootModel_MOMIC::pahSootCollisionRatePerDimer(const state &state, const double mDimer) {
557
559 return 0.0;
560
562
563 //------ continuum
564
565 const double Kc = coag->getKc( state);
566 const double Kcp = coag->getKcp(state);
567
568 double Ic1 = Kc * (
569 mD26*Mp6[1] + // mD26*M_{-2/6}
570 2.*Mp6[2] + // 2.*M_{ 0/6}
571 mDn26*Mp6[3] + // mDn26*M_{ 2/6}
572 Kcp*( mD26*Mp6[0] + // mD26*M_{-4/6}
573 Mp6[1] + // M_{-2/6}
574 mDn26*Mp6[2] + // mDn26*M_{ 0/6}
575 mDn46*Mp6[3] ) ); // mDn46*M_{ 2/6}
576
577 //------ free molecular
578
579 const double Kfm = coag->getKfm(state);
580
581 double Ifm1 = Kfm*g_grid(1);
582
583 //------ harmonic mean
584
585 return Ifm1*Ic1/(Ifm1 + Ic1);
586}
587
610
611void sootModel_MOMIC::set_diffTable(const vector<double> &M) {
612
613 //----------- set first column
614
615 for (int k=0; k<Nmom; k++)
616 diffTable[k][0] = log10(M[k]);
617
618 //----------- set other columns (differences) using previous column
619
620 for (int j=1; j<Nmom; j++) // each column
621 for (int i=0; i<Nmom-j; i++) // elements in column (row values)
622 diffTable[i][j] = diffTable[i+1][j-1] - diffTable[i][j-1];
623}
624
644
645double sootModel_MOMIC::Mr(const double r) {
646
647 double l10Mr = diffTable[0][0];
648 double coef = r;
649 int kend = (r >= 0) ? Nmom : 3;
650 for(int k=1; k<kend; k++) {
651 l10Mr += coef*diffTable[0][k];
652 coef *= (r-k)/double(k+1);
653 }
654
655 double value = pow(10., l10Mr);
656 return isfinite(value) ? value : 0.0;
657}
658
675
677
678 double p;
679 for(size_t i=0, p=-4; i<np[Nmom]; i++, p+=2)
680 Mp6[i] = Mr(p/6.0);
681
682 double q;
683 for(size_t i=0, q=-3; i<nq[Nmom]; i++, q+=2)
684 Mq6[i] = Mr(q/6.0);
685
686}
687
693
695
696 double mDimer = nucl->DIMER.mDimer;
697
698 mD26 = pow(mDimer, 2./6.);
699 mDn26 = pow(mDimer, -2./6.);
700 mDn46 = pow(mDimer, -4./6.);
701
702 mDn36 = pow(mDimer, -3./6.);
703 mDn16 = pow(mDimer, -1./6.);
704 mD16 = pow(mDimer, 1./6.);
705 mD36 = pow(mDimer, 3./6.);
706 mD56 = pow(mDimer, 5./6.);
707 mD76 = pow(mDimer, 7./6.);
708 mD96 = pow(mDimer, 9./6.);
709 mD116 = pow(mDimer, 11./6.);
710 mD136 = pow(mDimer, 13./6.);
711 mD156 = pow(mDimer, 15./6.);
712 mD176 = pow(mDimer, 17./6.);
713 mD196 = pow(mDimer, 19./6.);
714}
715
double binomial_coefficient(unsigned r, unsigned k)
Definition: binomial.h:24
virtual double getKcp(const state &state) const
coagulationMech mechType
identity of the type of coagulation (child)
virtual double getKfm(const state &state) const
virtual double getKc(const state &state) const
void getGrowthGasRates(const double &msootDotGrow, std::vector< double > &gasSourcesGrow) const
Definition: growthModel.cc:16
virtual double getGrowthSootRate(const state &state) const =0
growthMech mechType
identity of the type of growth (child)
Definition: growthModel.h:24
std::vector< double > nucleationPahRxnRates
mole ratios for PAH gas species rate coupling
void getNucleationGasRates(const double &msootDotNucl, std::vector< double > &gasSourcesNucl) const
dimerStruct DIMER
used for PAH nucleation only
nucleationMech mechType
identity of the type of nucleation (child)
virtual double getNucleationSootRate(state &state)=0
void getOxidationGasRates(const double &msootDotOxid, std::vector< double > &gasSourcesOxid) const
oxidationMech mechType
identity of the type of oxidation (child)
virtual double getOxidationSootRate(const state &state) const =0
size_t Nmom
number of soot moments (may decrese from downselectIfNeeded)
std::vector< double > Mq6
arrays holding fractional moments M_{q/6} where q is negative (FM)
double Mr(const double r)
double mDn36
mDimer^{-3/6}, etc.; for free molecular
std::vector< double > MOMICCoagulationRates(const state &state, std::vector< double > &M)
void set_diffTable(const std::vector< double > &M)
virtual double pahSootCollisionRatePerDimer(const state &state, const double mDimer)
std::vector< double > Mp6
arrays holding fractional moments M_{p/6} where p is posiitive (Continuum)
std::vector< size_t > np
# of Mp6 entries needed based on Nmom; if Nmom=3, then np[3] is # Mp6 entries to fill
double g_grid(int y)
std::vector< std::vector< double > > diffTable
set in set_diffTable, used in Mr
void downselectIfNeeded(std::vector< double > &M)
virtual void setSourceTerms(state &state)
double f_grid(int x, int y)
double mDn46
mDimer^{-4/6}, etc.; for continuum
std::vector< size_t > nq
# of Mq6 entries needed based on Nmom; if Nmom=3, then nq[3] is # Mq6 entries to fill
sootModel_MOMIC(size_t nsoot_, nucleationModel *nucl_, growthModel *grow_, oxidationModel *oxid_, coagulationModel *coag_)
coagulationModel * coag
pointer to coagulation mechanism
Definition: sootModel.h:33
psdMech psdMechType
one of MONO, LOGN, QMOM, MOMIC, SECT, etc.
Definition: sootModel.h:37
sourceTerms sources
struct containing soot, gas, and pah source terms vectors
Definition: sootModel.h:42
nucleationModel * nucl
pointer to nucleation mechanism
Definition: sootModel.h:30
growthModel * grow
pointer to growth mechanism
Definition: sootModel.h:31
size_t nsoot
# of soot variables: moments or sections
Definition: sootModel.h:28
oxidationModel * oxid
pointer to oxidation mechanism
Definition: sootModel.h:32
std::vector< double > sootVar
soot variables (moments or # in sections>
Definition: state.h:32
double cMin
soot min num carbon atoms (dynamic for PAH nucleation)
Definition: state.h:36
Definition: sootDefs.h:11
oxidationMech
Definition: sootDefs.h:33
const double rhoSoot
soot particle density
Definition: sootDefs.h:21
const double onethird
Definition: sootDefs.h:24
coagulationMech
Definition: sootDefs.h:34
growthMech
Definition: sootDefs.h:32
nucleationMech
Definition: sootDefs.h:31
const double twothird
Definition: sootDefs.h:25
const double Na
Avogadro's constant: #/kmol.
Definition: sootDefs.h:15
const std::vector< double > gasSpMW
(kg/kmol); make sure the order corresponds to the gasSp enum
Definition: sootDefs.h:74
std::vector< double > pahSources
kg/m3*s
Definition: sootDefs.h:143
std::vector< double > gasSources
kg/m3*s
Definition: sootDefs.h:142
std::vector< double > sootSources
kg^r/m3*s (moments), or #/m3*s (sections)
Definition: sootDefs.h:141