15 : m_lowT(0.1), m_highT(1.0),
16 m_Pref(1.0E5), m_index(0) {}
18 StatMech::StatMech(
int n, doublereal tlow, doublereal thigh,
20 const doublereal* coeffs,
21 const std::string& my_name) :
30 throw CanteraError(
"Error in StatMech.cpp",
31 " Cannot take 0 tmin as input. \n\n");
36 StatMech::StatMech(
const StatMech& b) :
45 StatMech& StatMech::operator=(
const StatMech& b)
60 SpeciesThermoInterpType*
61 StatMech::duplMyselfAsSpeciesThermoInterpType()
const
63 return new StatMech(*
this);
66 doublereal StatMech::minTemp()
const
71 doublereal StatMech::maxTemp()
const
76 doublereal StatMech::refPressure()
const
81 int StatMech::reportType()
const
86 size_t StatMech::speciesIndex()
const
91 int StatMech::buildmap()
95 std::vector<std::string> SS;
101 SS.push_back(
"CPAir");
108 SS.push_back(
"C2H2");
139 SS.push_back(
"CPN2");
161 for (ii=0; ii < SS.size(); ii++) {
162 name_map[SS[ii]]=(
new species);
165 name_map[SS[ii]]->nvib = -1;
166 name_map[SS[ii]]->cfs = -1;
167 name_map[SS[ii]]->mol_weight = -1;
169 name_map[SS[ii]]->theta[0] =0.0;
170 name_map[SS[ii]]->theta[1] =0.0;
171 name_map[SS[ii]]->theta[2] =0.0;
172 name_map[SS[ii]]->theta[3] =0.0;
173 name_map[SS[ii]]->theta[4] =0.0;
179 name_map[
"Air"]->cfs = 2.5;
180 name_map[
"Air"]->mol_weight=28.96;
181 name_map[
"Air"]->nvib=0;
184 name_map[
"CPAir"]->cfs = 2.5;
185 name_map[
"CPAir"]->mol_weight=28.96;
186 name_map[
"CPAir"]->nvib=0;
189 name_map[
"Ar"]->cfs = 1.5;
190 name_map[
"Ar"]->mol_weight=39.944;
191 name_map[
"Ar"]->nvib=0;
194 name_map[
"Ar+"]->cfs = 1.5;
195 name_map[
"Ar+"]->mol_weight=39.94345;
196 name_map[
"Ar+"]->nvib=0;
199 name_map[
"C"]->cfs = 1.5;
200 name_map[
"C"]->mol_weight=12.011;
201 name_map[
"C"]->nvib=0;
204 name_map[
"C+"]->cfs = 1.5;
205 name_map[
"C+"]->mol_weight=12.01045;
206 name_map[
"C+"]->nvib=0;
209 name_map[
"C2"]->cfs=2.5;
210 name_map[
"C2"]->mol_weight=24.022;
211 name_map[
"C2"]->nvib=1;
212 name_map[
"C2"]->theta[0]=2.6687e3;
215 name_map[
"C2H"]->cfs=2.5;
216 name_map[
"C2H"]->mol_weight=25.03;
217 name_map[
"C2H"]->nvib=3;
218 name_map[
"C2H"]->theta[0]=5.20100e+03;
219 name_map[
"C2H"]->theta[1]=7.20000e+03;
220 name_map[
"C2H"]->theta[2]=2.66100e+03;
223 name_map[
"C2H2"]->cfs=2.5;
224 name_map[
"C2H2"]->mol_weight=26.038;
225 name_map[
"C2H2"]->nvib=5;
226 name_map[
"C2H2"]->theta[0]=4.85290e+03;
227 name_map[
"C2H2"]->theta[1]=2.84000e+03;
228 name_map[
"C2H2"]->theta[2]=4.72490e+03;
229 name_map[
"C2H2"]->theta[3]=8.81830e+02;
230 name_map[
"C2H2"]->theta[4]=1.05080e+03;
233 name_map[
"C3"]->cfs=2.5;
234 name_map[
"C3"]->mol_weight=36.033;
235 name_map[
"C3"]->nvib=3;
236 name_map[
"C3"]->theta[0]=1.84500e+03;
237 name_map[
"C3"]->theta[1]=7.78700e+02;
238 name_map[
"C3"]->theta[2]=3.11760e+03;
241 name_map[
"CF"]->cfs=2.5;
242 name_map[
"CF"]->mol_weight=31.00940;
243 name_map[
"CF"]->nvib=1;
244 name_map[
"CF"]->theta[0]=1.88214e+03;
247 name_map[
"CF2"]->cfs=3;
248 name_map[
"CF2"]->mol_weight=50.00780;
249 name_map[
"CF2"]->nvib=3;
250 name_map[
"CF2"]->theta[0]=1.76120e+03;
251 name_map[
"CF2"]->theta[1]=9.56820e+02;
252 name_map[
"CF2"]->theta[2]=1.60000e+03;
255 name_map[
"CF3"]->cfs=3;
256 name_map[
"CF3"]->mol_weight=69.00620;
257 name_map[
"CF3"]->nvib=4;
258 name_map[
"CF3"]->theta[0]=1.56800e+03;
259 name_map[
"CF3"]->theta[1]=1.00900e+03;
260 name_map[
"CF3"]->theta[2]=1.81150e+03;
261 name_map[
"CF3"]->theta[3]=7.36680e+02;
264 name_map[
"CF4"]->cfs=3;
265 name_map[
"CF4"]->mol_weight=88.00460;
266 name_map[
"CF4"]->nvib=4;
267 name_map[
"CF4"]->theta[0]=1.30720e+03;
268 name_map[
"CF4"]->theta[1]=6.25892e+02;
269 name_map[
"CF4"]->theta[2]=1.84540e+03;
270 name_map[
"CF4"]->theta[3]=9.08950e+02;
273 name_map[
"CH"]->cfs=2.5;
274 name_map[
"CH"]->mol_weight=13.01900;
275 name_map[
"CH"]->nvib=1;
276 name_map[
"CH"]->theta[0]=4.11290e+03;
279 name_map[
"CH2"]->cfs=3;
280 name_map[
"CH2"]->mol_weight=14.02700;
281 name_map[
"CH2"]->nvib=3;
282 name_map[
"CH2"]->theta[0]=4.31650e+03;
283 name_map[
"CH2"]->theta[1]=1.95972e+03;
284 name_map[
"CH2"]->theta[2]=4.60432e+03;
287 name_map[
"CH3"]->cfs=3;
288 name_map[
"CH3"]->mol_weight=15.03500;
289 name_map[
"CH3"]->nvib=4;
290 name_map[
"CH3"]->theta[0]=4.31650e+03;
291 name_map[
"CH3"]->theta[1]=8.73370e+02;
292 name_map[
"CH3"]->theta[2]=4.54960e+03;
293 name_map[
"CH3"]->theta[3]=2.01150e+03;
296 name_map[
"CH4"]->cfs=3;
297 name_map[
"CH4"]->mol_weight=16.04300;
298 name_map[
"CH4"]->nvib=4;
299 name_map[
"CH4"]->theta[0]=4.19660e+03;
300 name_map[
"CH4"]->theta[1]=2.20620e+03;
301 name_map[
"CH4"]->theta[2]=4.34450e+03;
302 name_map[
"CH4"]->theta[3]=1.88600e+03;
305 name_map[
"Cl"]->cfs=1.5;
306 name_map[
"Cl"]->mol_weight=35.45300;
307 name_map[
"Cl"]->nvib=0;
310 name_map[
"Cl2"]->cfs=2.5;
311 name_map[
"Cl2"]->mol_weight=70.96;
312 name_map[
"Cl2"]->nvib=1;
313 name_map[
"Cl2"]->theta[0]=8.05355e+02;
316 name_map[
"CN"]->cfs=2.5;
317 name_map[
"CN"]->mol_weight=26.01900;
318 name_map[
"CN"]->nvib=1;
319 name_map[
"CN"]->theta[0]=2.97610e+03;
322 name_map[
"CN+"]->cfs=2.5;
323 name_map[
"CN+"]->mol_weight=26.01845;
324 name_map[
"CN+"]->nvib=1;
325 name_map[
"CN+"]->theta[0]=2.92520e+03;
328 name_map[
"CO"]->cfs=2.5;
329 name_map[
"CO"]->mol_weight=28.01100;
330 name_map[
"CO"]->nvib=1;
331 name_map[
"CO"]->theta[0]=3.12200e+03;
334 name_map[
"CO+"]->cfs=2.5;
335 name_map[
"CO+"]->mol_weight=28.01045;
336 name_map[
"CO+"]->nvib=1;
337 name_map[
"CO+"]->theta[0]=3.18800e+03;
340 name_map[
"CO2"]->cfs=2.5;
341 name_map[
"CO2"]->mol_weight=44.01100;
342 name_map[
"CO2"]->nvib=3;
343 name_map[
"CO2"]->theta[0]=1.91870e+03;
344 name_map[
"CO2"]->theta[1]=9.59660e+02;
345 name_map[
"CO2"]->theta[2]=3.38210e+03;
348 name_map[
"F"]->cfs=1.5;
349 name_map[
"F"]->mol_weight=18.99840;
350 name_map[
"F"]->nvib=0;
353 name_map[
"F2"]->cfs=2.5;
354 name_map[
"F2"]->mol_weight=37.99680;
355 name_map[
"F2"]->nvib=1;
356 name_map[
"F2"]->theta[0]=1.32020e+03;
359 name_map[
"H"]->cfs=1.5;
360 name_map[
"H"]->mol_weight=1;
361 name_map[
"H"]->nvib=0;
364 name_map[
"H+"]->cfs=1.5;
365 name_map[
"H+"]->mol_weight=1.00745;
366 name_map[
"H+"]->nvib=0;
369 name_map[
"H2"]->cfs=2.5;
370 name_map[
"H2"]->mol_weight=2.01600;
371 name_map[
"H2"]->nvib=1;
372 name_map[
"H2"]->theta[0]=6.33140e+03;
375 name_map[
"H2+"]->cfs=2.5;
376 name_map[
"H2+"]->mol_weight=2.01545;
377 name_map[
"H2+"]->nvib=1;
378 name_map[
"H2+"]->theta[0]=3.34280e+03;
381 name_map[
"H2O"]->cfs=3.0;
382 name_map[
"H2O"]->mol_weight=18.01600;
383 name_map[
"H2O"]->nvib=3;
384 name_map[
"H2O"]->theta[0]=5.26130e+03;
385 name_map[
"H2O"]->theta[1]=2.29460e+03;
386 name_map[
"H2O"]->theta[2]=5.40395e+03;
389 name_map[
"HCl"]->cfs=2.5;
390 name_map[
"HCl"]->mol_weight=36.46100;
391 name_map[
"HCl"]->nvib=1;
392 name_map[
"HCl"]->theta[0]=4.30330e+03;
395 name_map[
"HCN"]->cfs=2.5;
396 name_map[
"HCN"]->mol_weight=27.02700;
397 name_map[
"HCN"]->nvib=3;
398 name_map[
"HCN"]->theta[0]=3.01620e+03;
399 name_map[
"HCN"]->theta[1]=1.02660e+03;
400 name_map[
"HCN"]->theta[2]=4.76450e+03;
403 name_map[
"He"]->cfs=1.5;
404 name_map[
"He"]->mol_weight=4.00300;
405 name_map[
"He"]->nvib=0;
408 name_map[
"He+"]->cfs=1.5;
409 name_map[
"He+"]->mol_weight=4.00245;
410 name_map[
"He+"]->nvib=0;
413 name_map[
"N"]->cfs=1.5;
414 name_map[
"N"]->mol_weight=14.008;
415 name_map[
"N"]->nvib=0;
418 name_map[
"Ne"]->cfs=1.5;
419 name_map[
"Ne"]->mol_weight=20.17900;
420 name_map[
"Ne"]->nvib=0;
423 name_map[
"N+"]->cfs=1.5;
424 name_map[
"N+"]->mol_weight=14.00745;
425 name_map[
"N+"]->nvib=0;
428 name_map[
"N2"]->cfs=2.5;
429 name_map[
"N2"]->mol_weight=28.01600;
430 name_map[
"N2"]->nvib=1;
431 name_map[
"N2"]->theta[0]=3.39500e+03;
434 name_map[
"N2+"]->cfs=2.5;
435 name_map[
"N2+"]->mol_weight=28.01545;
436 name_map[
"N2+"]->nvib=1;
437 name_map[
"N2+"]->theta[0]=3.17580e+03;
440 name_map[
"CPN2"]->cfs=2.5;
441 name_map[
"CPN2"]->mol_weight=28.01600;
442 name_map[
"CPN2"]->nvib=0;
445 name_map[
"NCO"]->cfs=2.5;
446 name_map[
"NCO"]->mol_weight=42.01900;
447 name_map[
"NCO"]->nvib=3;
448 name_map[
"NCO"]->theta[0]=1.83600e+03;
449 name_map[
"NCO"]->theta[1]=7.67100e+02;
450 name_map[
"NCO"]->theta[2]=2.76800e+03;
453 name_map[
"NH"]->cfs=2.5;
454 name_map[
"NH"]->mol_weight=15.01600;
455 name_map[
"NH"]->nvib=1;
456 name_map[
"NH"]->theta[0]=4.72240e+03;
459 name_map[
"NH+"]->cfs=2.5;
460 name_map[
"NH+"]->mol_weight=15.01545;
461 name_map[
"NH+"]->nvib=0;
464 name_map[
"NH2"]->cfs=2.5;
465 name_map[
"NH2"]->mol_weight=16.02400;
466 name_map[
"NH2"]->nvib=0;
469 name_map[
"NH3"]->cfs=2.5;
470 name_map[
"NH3"]->mol_weight=17.03200;
471 name_map[
"NH3"]->nvib=4;
472 name_map[
"NH3"]->theta[0]=4.78100e+03;
473 name_map[
"NH3"]->theta[1]=1.47040e+03;
474 name_map[
"NH3"]->theta[2]=4.95440e+03;
475 name_map[
"NH3"]->theta[3]=2.34070e+03;
478 name_map[
"NO"]->cfs=2.5;
479 name_map[
"NO"]->mol_weight=30.00800;
480 name_map[
"NO"]->nvib=1;
481 name_map[
"NO"]->theta[0]=2.81700e+03;
484 name_map[
"NO+"]->cfs=2.5;
485 name_map[
"NO+"]->mol_weight=30.00745;
486 name_map[
"NO+"]->nvib=1;
487 name_map[
"NO+"]->theta[0]=3.42100e+03;
490 name_map[
"NO2"]->cfs=3;
491 name_map[
"NO2"]->mol_weight=46.00800;
492 name_map[
"NO2"]->nvib=3;
493 name_map[
"NO2"]->theta[0]=1.07900e+03;
494 name_map[
"NO2"]->theta[1]=1.90000e+03;
495 name_map[
"NO2"]->theta[2]=2.32700e+03;
498 name_map[
"O"]->cfs=1.5;
499 name_map[
"O"]->mol_weight=16.000;
500 name_map[
"O"]->nvib=0;
503 name_map[
"O+"]->cfs=1.5;
504 name_map[
"O+"]->mol_weight=15.99945;
505 name_map[
"O+"]->nvib=0;
508 name_map[
"O2"]->cfs=2.5;
509 name_map[
"O2"]->mol_weight=32.00000;
510 name_map[
"O2"]->nvib=1;
511 name_map[
"O2"]->theta[0]=2.23900e+03;
514 name_map[
"O2+"]->cfs=2.5;
515 name_map[
"O2+"]->mol_weight=31.99945;
516 name_map[
"O2+"]->nvib=1;
517 name_map[
"O2+"]->theta[0]=2.74120e+03;
520 name_map[
"OH"]->cfs=2.5;
521 name_map[
"OH"]->mol_weight=17.00800;
522 name_map[
"OH"]->nvib=1;
523 name_map[
"OH"]->theta[0]=5.37820e+03;
526 name_map[
"Si"]->cfs=1.5;
527 name_map[
"Si"]->mol_weight=28.08550;
528 name_map[
"Si"]->nvib=0;
531 name_map[
"SiO"]->cfs=2.5;
532 name_map[
"SiO"]->mol_weight=44.08550;
533 name_map[
"SiO"]->nvib=1;
534 name_map[
"SiO"]->theta[0]=1.78640e+03;
537 name_map[
"e"]->cfs=1.5;
538 name_map[
"e"]->mol_weight=0.00055;
539 name_map[
"e"]->nvib=0;
541 for (ii=0; ii < SS.size(); ii++) {
543 if (name_map[SS[ii]]->nvib == -1) {
544 std::cout << name_map[SS[ii]]->nvib << std::endl;
545 throw CanteraError(
"Error in StatMech.cpp",
546 "nvib not initialized!. \n\n");
550 for (
int i=0; i<name_map[SS[ii]]->nvib; i++) {
551 if (name_map[SS[ii]]->theta[i] <= 0.0) {
552 throw CanteraError(
"Error in StatMech.cpp",
553 "theta not initalized!. \n\n");
559 for (
int i=name_map[SS[ii]]->nvib; i<5; i++) {
560 if (name_map[SS[ii]]->theta[i] != 0.0) {
561 std::string err =
"bad theta value for "+SS[ii]+
"\n";
562 throw CanteraError(
"StatMech.cpp",err);
568 if (name_map[SS[ii]]->mol_weight == -1) {
569 std::cout << name_map[SS[ii]]->mol_weight << std::endl;
570 throw CanteraError(
"Error in StatMech.cpp",
571 "mol_weight not initialized!. \n\n");
576 if (name_map[SS[ii]]->cfs == -1) {
577 std::cout << name_map[SS[ii]]->cfs << std::endl;
578 throw CanteraError(
"Error in StatMech.cpp",
579 "cfs not initialized!. \n\n");
589 void StatMech::updateProperties(
const doublereal* tt,
590 doublereal* cp_R, doublereal* h_RT,
591 doublereal* s_R)
const
594 std::map<std::string,species*>::iterator it;
600 if (name_map.find(sp_name) != name_map.end()) {
601 s = name_map.find(sp_name)->second;
604 throw CanteraError(
"StatMech.cpp",
605 "species properties not found!. \n\n");
609 doublereal ctr = 0.0;
616 for (
int i=0; i< s->nvib; i++) {
618 ctr +=
GasConstant * theta * (theta* exp(theta/tt[0])/(tt[0]*tt[0]))/((exp(theta/tt[0])-1) * (exp(theta/tt[0])-1));
625 doublereal hdivRT = 0.0;
626 doublereal sdivR = 0.0;
630 cp_R[m_index] = cpdivR;
631 h_RT[m_index] = hdivRT;
632 s_R [m_index] = sdivR;
635 void StatMech::updatePropertiesTemp(
const doublereal temp,
636 doublereal* cp_R, doublereal* h_RT,
637 doublereal* s_R)
const
641 updateProperties(tPoly, cp_R, h_RT, s_R);
644 void StatMech::reportParameters(
size_t& n,
int& type,
645 doublereal& tlow, doublereal& thigh,
647 doublereal*
const coeffs)
const
656 for (
int i = 0; i < 9; i++) {
659 doublereal temp = coeffs[0];
665 if (name_map.find(sp_name) != name_map.end()) {
666 s = name_map.find(sp_name)->second;
669 throw CanteraError(
"StatMech.cpp",
670 "species properties not found!. \n\n");
677 for (
int i=0; i< s->nvib; i++) {
679 cvib +=
GasConstant * theta * (theta* exp(theta/temp)/(temp*temp))/((exp(theta/temp)-1) * (exp(theta/temp)-1));
688 void StatMech::modifyParameters(doublereal* coeffs)