Cantera  2.5.1
SpeciesThermoFactory.cpp
Go to the documentation of this file.
1 /**
2  * @file SpeciesThermoFactory.cpp
3  * Definitions for factory functions to build instances of classes that
4  * manage the standard-state thermodynamic properties of a set of species
5  * (see \ref spthermo);
6  */
7 
8 // This file is part of Cantera. See License.txt in the top-level directory or
9 // at https://cantera.org/license.txt for license and copyright information.
10 
13 #include "cantera/thermo/Mu0Poly.h"
21 #include "cantera/base/ctml.h"
23 #include "cantera/base/Units.h"
24 
25 using namespace std;
26 
27 namespace Cantera
28 {
29 
31  double thigh, double pref, const double* coeffs)
32 {
33  switch (type) {
34  case NASA1:
35  return new NasaPoly1(tlow, thigh, pref, coeffs);
36  case SHOMATE1:
37  return new ShomatePoly(tlow, thigh, pref, coeffs);
38  case CONSTANT_CP:
39  case SIMPLE:
40  return new ConstCpPoly(tlow, thigh, pref, coeffs);
41  case MU0_INTERP:
42  return new Mu0Poly(tlow, thigh, pref, coeffs);
43  case SHOMATE2:
44  return new ShomatePoly2(tlow, thigh, pref, coeffs);
45  case NASA2:
46  return new NasaPoly2(tlow, thigh, pref, coeffs);
47  case NASA9MULTITEMP:
48  return new Nasa9PolyMultiTempRegion(tlow, thigh, pref, coeffs);
49  default:
50  throw CanteraError("newSpeciesThermoInterpType",
51  "Unknown species thermo type: {}.", type);
52  }
53 }
54 
56  double tlow, double thigh, double pref, const double* coeffs)
57 {
58  int itype = -1;
59  std::string type = toLowerCopy(stype);
60  if (type == "nasa2" || type == "nasa") {
61  itype = NASA2; // two-region 7-coefficient NASA polynomials
62  } else if (type == "const_cp" || type == "simple") {
63  itype = CONSTANT_CP;
64  } else if (type == "shomate" || type == "shomate1") {
65  itype = SHOMATE1; // single-region Shomate polynomial
66  } else if (type == "shomate2") {
67  itype = SHOMATE2; // two-region Shomate polynomials
68  } else if (type == "nasa1") {
69  itype = NASA1; // single-region, 7-coefficient NASA polynomial
70  } else if (type == "nasa9") {
71  itype = NASA9; // single-region, 9-coefficient NASA polynomial
72  } else if (type == "nasa9multi") {
73  itype = NASA9MULTITEMP; // multi-region, 9-coefficient NASA polynomials
74  } else if (type == "mu0") {
75  itype = MU0_INTERP;
76  } else {
77  throw CanteraError("newSpeciesThermoInterpType",
78  "Unknown species thermo type: '" + stype + "'.");
79  }
80  return newSpeciesThermoInterpType(itype, tlow, thigh, pref, coeffs);
81 }
82 
83 //! Create a NASA polynomial thermodynamic property parameterization for a
84 //! species from a set ! of XML nodes
85 /*!
86  * This is called if a 'NASA' node is found in the XML input.
87  *
88  * @param nodes vector of 1 or 2 'NASA' XML_Nodes, each defining the
89  * coefficients for a temperature range
90  */
91 static SpeciesThermoInterpType* newNasaThermoFromXML(vector<XML_Node*> nodes)
92 {
93  const XML_Node& f0 = *nodes[0];
94  bool dualRange = (nodes.size() > 1);
95  double tmin0 = fpValue(f0["Tmin"]);
96  double tmax0 = fpValue(f0["Tmax"]);
97 
98  doublereal p0 = OneAtm;
99  if (f0.hasAttrib("P0")) {
100  p0 = fpValue(f0["P0"]);
101  }
102  if (f0.hasAttrib("Pref")) {
103  p0 = fpValue(f0["Pref"]);
104  }
105  p0 = OneAtm;
106 
107  double tmin1 = tmax0;
108  double tmax1 = tmin1 + 0.0001;
109  if (dualRange) {
110  tmin1 = fpValue(nodes[1]->attrib("Tmin"));
111  tmax1 = fpValue(nodes[1]->attrib("Tmax"));
112  }
113 
114  vector_fp c0, c1;
115  doublereal tmin, tmid, tmax;
116  if (fabs(tmax0 - tmin1) < 0.01) {
117  // f0 has the lower T data, and f1 the higher T data
118  tmin = tmin0;
119  tmid = tmax0;
120  tmax = tmax1;
121  getFloatArray(f0.child("floatArray"), c0, false);
122  if (dualRange) {
123  getFloatArray(nodes[1]->child("floatArray"), c1, false);
124  } else {
125  // if there is no higher range data, then copy c0 to c1.
126  c1 = c0;
127  }
128  } else if (fabs(tmax1 - tmin0) < 0.01) {
129  // f1 has the lower T data, and f0 the higher T data
130  tmin = tmin1;
131  tmid = tmax1;
132  tmax = tmax0;
133  getFloatArray(nodes[1]->child("floatArray"), c0, false);
134  getFloatArray(f0.child("floatArray"), c1, false);
135  } else {
136  throw CanteraError("newNasaThermoFromXML",
137  "non-continuous temperature ranges.");
138  }
139 
140  vector_fp c(15);
141  c[0] = tmid;
142  copy(c1.begin(), c1.begin()+7, c.begin() + 1); // high-T coefficients
143  copy(c0.begin(), c0.begin()+7, c.begin() + 8); // low-T coefficients
144  return newSpeciesThermoInterpType(NASA, tmin, tmax, p0, &c[0]);
145 }
146 
147 void setupSpeciesThermo(SpeciesThermoInterpType& thermo,
148  const AnyMap& node)
149 {
150  double Pref = node.convert("reference-pressure", "Pa", OneAtm);
151  thermo.setRefPressure(Pref);
152 }
153 
154 void setupNasaPoly(NasaPoly2& thermo, const AnyMap& node)
155 {
156  setupSpeciesThermo(thermo, node);
157  vector_fp Tranges = node.convertVector("temperature-ranges", "K", 2, 3);
158  const auto& data = node["data"].asVector<vector_fp>(Tranges.size()-1);
159  for (const auto& poly : data) {
160  if (poly.size() != 7) {
161  throw CanteraError("setupNasaPoly", "Wrong number of coefficients "
162  "for NASA polynomial. Expected 7, but got {}", poly.size());
163  }
164  }
165  thermo.setMinTemp(Tranges.front());
166  thermo.setMaxTemp(Tranges.back());
167  if (Tranges.size() == 3) { // standard 2 temperature range polynomial
168  thermo.setParameters(Tranges[1], data[0], data[1]);
169  } else { // Repeat data for single temperature range for both ranges
170  thermo.setParameters(Tranges[1], data[0], data[0]);
171  }
172 }
173 
174 
175 //! Create a Shomate polynomial thermodynamic property parameterization for a
176 //! species
177 /*!
178  * This is called if a 'Shomate' node is found in the XML input.
179  *
180  * @param nodes vector of 1 or 2 'Shomate' XML_Nodes, each defining the
181  * coefficients for a temperature range
182  */
184  vector<XML_Node*>& nodes)
185 {
186  bool dualRange = false;
187  if (nodes.size() == 2) {
188  dualRange = true;
189  }
190  double tmin0 = fpValue(nodes[0]->attrib("Tmin"));
191  double tmax0 = fpValue(nodes[0]->attrib("Tmax"));
192 
193  doublereal p0 = OneAtm;
194  if (nodes[0]->hasAttrib("P0")) {
195  p0 = fpValue(nodes[0]->attrib("P0"));
196  }
197  if (nodes[0]->hasAttrib("Pref")) {
198  p0 = fpValue(nodes[0]->attrib("Pref"));
199  }
200  p0 = OneAtm;
201 
202  double tmin1 = tmax0;
203  double tmax1 = tmin1 + 0.0001;
204  if (dualRange) {
205  tmin1 = fpValue(nodes[1]->attrib("Tmin"));
206  tmax1 = fpValue(nodes[1]->attrib("Tmax"));
207  }
208 
209  vector_fp c0, c1;
210  doublereal tmin, tmid, tmax;
211  if (fabs(tmax0 - tmin1) < 0.01) {
212  tmin = tmin0;
213  tmid = tmax0;
214  tmax = tmax1;
215  getFloatArray(nodes[0]->child("floatArray"), c0, false);
216  if (dualRange) {
217  getFloatArray(nodes[1]->child("floatArray"), c1, false);
218  } else {
219  if(c0.size() != 7)
220  {
221  throw CanteraError("newShomateThermoFromXML",
222  "Shomate thermo requires 7 coefficients in float array.");
223  }
224  c1.resize(7,0.0);
225  copy(c0.begin(), c0.begin()+7, c1.begin());
226  }
227  } else if (fabs(tmax1 - tmin0) < 0.01) {
228  tmin = tmin1;
229  tmid = tmax1;
230  tmax = tmax0;
231  getFloatArray(nodes[1]->child("floatArray"), c0, false);
232  getFloatArray(nodes[0]->child("floatArray"), c1, false);
233  } else {
234  throw CanteraError("newShomateThermoFromXML",
235  "non-continuous temperature ranges.");
236  }
237  if(c0.size() != 7 || c1.size() != 7)
238  {
239  throw CanteraError("newShomateThermoFromXML",
240  "Shomate thermo requires 7 coefficients in float array.");
241  }
242  vector_fp c(15);
243  c[0] = tmid;
244  copy(c0.begin(), c0.begin()+7, c.begin() + 1);
245  copy(c1.begin(), c1.begin()+7, c.begin() + 8);
246  return newSpeciesThermoInterpType(SHOMATE, tmin, tmax, p0, &c[0]);
247 }
248 
249 
250 void setupShomatePoly(ShomatePoly2& thermo, const AnyMap& node)
251 {
252  setupSpeciesThermo(thermo, node);
253  vector_fp Tranges = node.convertVector("temperature-ranges", "K", 2, 3);
254  const auto& data = node["data"].asVector<vector_fp>(Tranges.size()-1);
255  for (const auto& poly : data) {
256  if (poly.size() != 7) {
257  throw CanteraError("setupShomatePoly", "Wrong number of coefficients "
258  "for Shomate polynomial. Expected 7, but got {}", poly.size());
259  }
260  }
261  thermo.setMinTemp(Tranges.front());
262  thermo.setMaxTemp(Tranges.back());
263  if (Tranges.size() == 3) { // standard 2 temperature range polynomial
264  thermo.setParameters(Tranges[1], data[0], data[1]);
265  } else { // Repeat data for single temperature range for both ranges
266  thermo.setParameters(Tranges[1], data[0], data[0]);
267  }
268 }
269 
270 
271 //! Create a "simple" constant heat capacity thermodynamic property
272 //! parameterization for a ! species
273 /*!
274  * This is called if a 'const_cp' XML node is found
275  *
276  * @param f 'const_cp' XML node
277  */
279 {
280  double tmin = fpValue(f["Tmin"]);
281  double tmax = fpValue(f["Tmax"]);
282  if (tmax == 0.0) {
283  tmax = 1.0e30;
284  }
285 
286  vector_fp c(4);
287  c[0] = getFloat(f, "t0", "toSI");
288  c[1] = getFloat(f, "h0", "toSI");
289  c[2] = getFloat(f, "s0", "toSI");
290  c[3] = getFloat(f, "cp0", "toSI");
291  doublereal p0 = OneAtm;
292  return newSpeciesThermoInterpType(CONSTANT_CP, tmin, tmax, p0, &c[0]);
293 }
294 
295 void setupConstCp(ConstCpPoly& thermo, const AnyMap& node)
296 {
297  setupSpeciesThermo(thermo, node);
298  if (node.hasKey("T-min")) {
299  thermo.setMinTemp(node.convert("T-min", "K"));
300  }
301  if (node.hasKey("T-max")) {
302  thermo.setMaxTemp(node.convert("T-max", "K"));
303  }
304  double T0 = node.convert("T0", "K", 298.15);
305  double h0 = node.convert("h0", "J/kmol", 0.0);
306  double s0 = node.convert("s0", "J/kmol/K", 0.0);
307  double cp0 = node.convert("cp0", "J/kmol/K", 0.0);
308  thermo.setParameters(T0, h0, s0, cp0);
309 }
310 
311 //! Create a NASA9 polynomial thermodynamic property parameterization for a
312 //! species
313 /*!
314  * This is called if a 'NASA9' Node is found in the XML input.
315  *
316  * @param tp Vector of XML Nodes that make up the parameterization
317  */
319  const std::vector<XML_Node*>& tp)
320 {
321  int nRegions = 0;
322  vector_fp cPoly;
323  std::vector<Nasa9Poly1*> regionPtrs;
324  doublereal pref = OneAtm;
325  // Loop over all of the possible temperature regions
326  for (size_t i = 0; i < tp.size(); i++) {
327  const XML_Node& fptr = *tp[i];
328  if (fptr.name() == "NASA9" && fptr.hasChild("floatArray")) {
329  double tmin = fpValue(fptr["Tmin"]);
330  double tmax = fpValue(fptr["Tmax"]);
331  if (fptr.hasAttrib("P0")) {
332  pref = fpValue(fptr["P0"]);
333  }
334  if (fptr.hasAttrib("Pref")) {
335  pref = fpValue(fptr["Pref"]);
336  }
337 
338  getFloatArray(fptr.child("floatArray"), cPoly, false);
339  if (cPoly.size() != 9) {
340  throw CanteraError("newNasa9ThermoFromXML",
341  "Expected 9 coeff polynomial");
342  }
343  regionPtrs.push_back(new Nasa9Poly1(tmin, tmax, pref, &cPoly[0]));
344  nRegions++;
345  }
346  }
347  if (nRegions == 0) {
348  throw CanteraError("newNasa9ThermoFromXML", "zero regions found");
349  } else if (nRegions == 1) {
350  return regionPtrs[0];
351  } else {
352  return new Nasa9PolyMultiTempRegion(regionPtrs);
353  }
354 }
355 
356 
357 void setupNasa9Poly(Nasa9PolyMultiTempRegion& thermo, const AnyMap& node)
358 {
359  setupSpeciesThermo(thermo, node);
360  vector_fp Tranges = node.convertVector("temperature-ranges", "K", 2, 999);
361  const auto& data = node["data"].asVector<vector_fp>(Tranges.size()-1);
362  map<double, vector_fp> regions;
363  for (size_t i = 0; i < data.size(); i++) {
364  if (data[i].size() != 9) {
365  throw CanteraError("setupNasa9Poly", "Wrong number of coefficients "
366  "for NASA9 polynomial. Expected 9, but got {}", data[i].size());
367  }
368  regions[Tranges[i]] = data[i];
369  }
370  thermo.setMinTemp(Tranges.front());
371  thermo.setMaxTemp(Tranges.back());
372  thermo.setParameters(regions);
373 }
374 
375 
376 void setupMu0(Mu0Poly& thermo, const AnyMap& node)
377 {
378  setupSpeciesThermo(thermo, node);
379  if (node.hasKey("T-min")) {
380  thermo.setMinTemp(node.convert("T-min", "K"));
381  }
382  if (node.hasKey("T-max")) {
383  thermo.setMaxTemp(node.convert("T-max", "K"));
384  }
385  bool dimensionless = node.getBool("dimensionless", false);
386  double h0 = node.convert("h0", "J/kmol", 0.0);
387  map<double, double> T_mu;
388  for (const auto& item : node["data"]) {
389  double T = node.units().convert(fpValueCheck(item.first), "K");
390  if (dimensionless) {
391  T_mu[T] = item.second.asDouble() * GasConstant * T;
392  } else {
393  T_mu[T] = node.units().convert(item.second, "J/kmol");
394  }
395  }
396  thermo.setParameters(h0, T_mu);
397 }
398 
400 {
401  std::string model = toLowerCopy(thermo["model"]);
402  if (model == "hkft" || model == "ionfromneutral") {
403  // Some PDSS species use the 'thermo' node, but don't specify a
404  // SpeciesThermoInterpType parameterization. This function needs to
405  // just ignore this data.
406  return 0;
407  }
408 
409  // Get the children of the thermo XML node. In the next bit of code we take
410  // out the comments that may have been children of the thermo XML node by
411  // doing a selective copy. These shouldn't interfere with the algorithm at
412  // any point.
413  const std::vector<XML_Node*>& tpWC = thermo.children();
414  std::vector<XML_Node*> tp;
415  for (size_t i = 0; i < tpWC.size(); i++) {
416  if (!tpWC[i]->isComment()) {
417  tp.push_back(tpWC[i]);
418  }
419  }
420 
421  std::string thermoType = toLowerCopy(tp[0]->name());
422 
423  for (size_t i = 1; i < tp.size(); i++) {
424  if (!caseInsensitiveEquals(tp[i]->name(), thermoType)) {
425  throw CanteraError("newSpeciesThermoInterpType",
426  "Encountered unsupported mixed species thermo "
427  "parameterizations, '{}' and '{}'", tp[i]->name(), thermoType);
428  }
429  }
430  if ((tp.size() > 2 && thermoType != "nasa9") ||
431  (tp.size() > 1 && (thermoType == "const_cp" ||
432  thermoType == "mu0"))) {
433  throw CanteraError("newSpeciesThermoInterpType",
434  "Too many regions in thermo parameterization.");
435  }
436 
437  if (thermoType == "shomate") {
438  return newShomateThermoFromXML(tp);
439  } else if (thermoType == "const_cp") {
440  return newConstCpThermoFromXML(*tp[0]);
441  } else if (thermoType == "nasa") {
442  return newNasaThermoFromXML(tp);
443  } else if (thermoType == "mu0") {
444  return newMu0ThermoFromXML(*tp[0]);
445  } else if (thermoType == "nasa9") {
446  return newNasa9ThermoFromXML(tp);
447  } else {
448  throw CanteraError("newSpeciesThermoInterpType",
449  "Unknown species thermo model '" + thermoType + "'.");
450  }
451 }
452 
453 
454 unique_ptr<SpeciesThermoInterpType> newSpeciesThermo(const AnyMap& node)
455 {
456  std::string model = node["model"].asString();
457  if (model == "NASA7") {
458  unique_ptr<NasaPoly2> thermo(new NasaPoly2());
459  setupNasaPoly(*thermo, node);
460  return unique_ptr<SpeciesThermoInterpType>(move(thermo));
461  } else if (model == "Shomate") {
462  unique_ptr<ShomatePoly2> thermo(new ShomatePoly2());
463  setupShomatePoly(*thermo, node);
464  return unique_ptr<SpeciesThermoInterpType>(move(thermo));
465  } else if (model == "NASA9") {
466  unique_ptr<Nasa9PolyMultiTempRegion> thermo(new Nasa9PolyMultiTempRegion());
467  setupNasa9Poly(*thermo, node);
468  return unique_ptr<SpeciesThermoInterpType>(move(thermo));
469  } else if (model == "constant-cp") {
470  unique_ptr<ConstCpPoly> thermo(new ConstCpPoly());
471  setupConstCp(*thermo, node);
472  return unique_ptr<SpeciesThermoInterpType>(move(thermo));
473  } else if (model == "piecewise-Gibbs") {
474  unique_ptr<Mu0Poly> thermo(new Mu0Poly());
475  setupMu0(*thermo, node);
476  return unique_ptr<SpeciesThermoInterpType>(move(thermo));
477  } else {
478  throw CanteraError("newSpeciesThermo",
479  "Unknown thermo model '{}'", model);
480  }
481 }
482 
483 }
Headers for the SpeciesThermoInterpType object that employs a constant heat capacity assumption (see ...
Header for a single-species standard state object derived from SpeciesThermoInterpType based on a pie...
Header for a general species thermodynamic property manager for a phase (see MultiSpeciesThermo).
Header for a single-species standard state object derived from SpeciesThermoInterpType based on the N...
Header for a single-species standard state object derived from SpeciesThermoInterpType based on the N...
Header for a single-species standard state object derived from SpeciesThermoInterpType based on the N...
Header for a single-species standard state object derived from SpeciesThermoInterpType based on the S...
Header for factory functions to build instances of classes that manage the standard-state thermodynam...
Header for unit conversion utilities, which are used to translate user input from input files (See In...
Header file for a derived class of ThermoPhase that handles variable pressure standard state methods ...
A map of string keys to values whose type can vary at runtime.
Definition: AnyMap.h:360
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:61
A constant-heat capacity species thermodynamic property manager class.
Definition: ConstCpPoly.h:44
The Mu0Poly class implements an interpolation of the Gibbs free energy based on a piecewise constant ...
Definition: Mu0Poly.h:74
The NASA 9 polynomial parameterization for one temperature range.
Definition: Nasa9Poly1.h:62
The NASA 9 polynomial parameterization for a single species encompassing multiple temperature regions...
The NASA polynomial parameterization for one temperature range.
Definition: NasaPoly1.h:46
The NASA polynomial parameterization for two temperature ranges.
Definition: NasaPoly2.h:49
The Shomate polynomial parameterization for two temperature ranges for one species.
Definition: ShomatePoly.h:226
The Shomate polynomial parameterization for one temperature range for one species.
Definition: ShomatePoly.h:58
Abstract Base class for the thermodynamic manager for an individual species' reference state.
Class XML_Node is a tree-based representation of the contents of an XML file.
Definition: xml.h:104
std::string name() const
Returns the name of the XML node.
Definition: xml.h:372
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
Definition: xml.cpp:528
const std::vector< XML_Node * > & children() const
Return an unchangeable reference to the vector of children of the current node.
Definition: xml.cpp:551
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
Definition: xml.cpp:546
bool hasAttrib(const std::string &a) const
Tests whether the current node has an attribute with a particular name.
Definition: xml.cpp:533
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data.
const double OneAtm
One atmosphere [Pa].
Definition: ct_defs.h:78
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
Definition: ct_defs.h:180
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition: ct_defs.h:109
Mu0Poly * newMu0ThermoFromXML(const XML_Node &Mu0Node)
Install a Mu0 polynomial thermodynamic reference state.
Definition: Mu0Poly.cpp:159
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:264
static SpeciesThermoInterpType * newNasaThermoFromXML(vector< XML_Node * > nodes)
Create a NASA polynomial thermodynamic property parameterization for a species from a set !...
doublereal getFloat(const XML_Node &parent, const std::string &name, const std::string &type)
Get a floating-point value from a child element.
Definition: ctml.cpp:164
doublereal fpValue(const std::string &val)
Translate a string into one doublereal value.
bool caseInsensitiveEquals(const std::string &input, const std::string &test)
Case insensitive equality predicate.
unique_ptr< SpeciesThermoInterpType > newSpeciesThermo(const AnyMap &node)
Create a new SpeciesThermoInterpType object using the specified parameters.
static SpeciesThermoInterpType * newConstCpThermoFromXML(XML_Node &f)
Create a "simple" constant heat capacity thermodynamic property parameterization for a !...
static SpeciesThermoInterpType * newNasa9ThermoFromXML(const std::vector< XML_Node * > &tp)
Create a NASA9 polynomial thermodynamic property parameterization for a species.
SpeciesThermoInterpType * newSpeciesThermoInterpType(const XML_Node &thermo)
Create a new SpeciesThermoInterpType object from XML_Node.
std::string toLowerCopy(const std::string &input)
Convert to lower case.
size_t getFloatArray(const XML_Node &node, vector_fp &v, const bool convert, const std::string &unitsString, const std::string &nodeName)
This function reads the current node or a child node of the current node with the default name,...
Definition: ctml.cpp:256
doublereal fpValueCheck(const std::string &val)
Translate a string into one doublereal value, with error checking.
static SpeciesThermoInterpType * newShomateThermoFromXML(vector< XML_Node * > &nodes)
Create a Shomate polynomial thermodynamic property parameterization for a species.
Contains const definitions for types of species reference-state thermodynamics managers (see Species ...
#define NASA1
7 coefficient NASA Polynomials This is implemented in the class NasaPoly1 in NasaPoly1....
#define CONSTANT_CP
Constant Cp.
#define MU0_INTERP
piecewise interpolation of mu0.
#define SHOMATE1
one region of Shomate Polynomials used in NIST database This is implemented in the NIST database.
#define NASA9MULTITEMP
9 coefficient NASA Polynomials in multiple temperature regions This is implemented in the class Nasa9...
#define SHOMATE
Two regions of Shomate Polynomials.
#define NASA9
9 coefficient NASA Polynomials This is implemented in the class Nasa9Poly1 in Nasa9Poly1....
#define SHOMATE2
Two regions of Shomate Polynomials.
#define NASA
Two regions of 7 coefficient NASA Polynomials This is implemented in the class NasaPoly2 in NasaPoly2...
#define SIMPLE
Constant Cp thermo.
#define NASA2
Two regions of 7 coefficient NASA Polynomials This is implemented in the class NasaPoly2 in NasaPoly2...
Contains declarations for string manipulation functions within Cantera.