Cantera  2.1.2
NasaThermo.cpp
Go to the documentation of this file.
1 /*!
2  * @file NasaThermo.cpp Implementation of class Cantera::NasaThermo
3  */
4 #include "NasaThermo.h"
5 
9 
10 namespace Cantera
11 {
12 
13 NasaThermo::NasaThermo() :
14  ID(NASA),
15  m_tlow_max(0.0),
16  m_thigh_min(1.e30),
17  m_p0(-1.0),
18  m_ngroups(0) {
19  m_t.resize(6);
20  }
21 
22 NasaThermo::NasaThermo(const NasaThermo& right) :
23  ID(NASA),
24  m_tlow_max(0.0),
25  m_thigh_min(1.e30),
26  m_p0(-1.0),
27  m_ngroups(0) {
28  *this = operator=(right);
29 }
30 
31 NasaThermo& NasaThermo::operator=(const NasaThermo& right)
32 {
33  /*
34  * Check for self assignment.
35  */
36  if (this == &right) {
37  return *this;
38  }
39 
40  m_high = right.m_high;
41  m_low = right.m_low;
42  m_index = right.m_index;
43  m_tmid = right.m_tmid;
44  m_tlow_max = right.m_tlow_max;
45  m_thigh_min = right.m_thigh_min;
46  m_tlow = right.m_tlow;
47  m_thigh = right.m_thigh;
48  m_p0 = right.m_p0;
49  m_ngroups = right.m_ngroups;
50  m_t = right.m_t;
51  m_group_map = right.m_group_map;
52  m_posInGroup_map = right.m_posInGroup_map;
53  m_name = right.m_name;
54 
55  return *this;
56 }
57 
58 void NasaThermo::install(const std::string& name, size_t index, int type,
59  const doublereal* c,
60  doublereal min_temp, doublereal max_temp,
61  doublereal ref_pressure)
62 {
63  m_name[index] = name;
64  int imid = int(c[0]); // midpoint temp converted to integer
65  int igrp = m_index[imid]; // has this value been seen before?
66  if (igrp == 0) { // if not, prepare new group
67  std::vector<NasaPoly1> v;
68  m_high.push_back(v);
69  m_low.push_back(v);
70  m_tmid.push_back(c[0]);
71  m_index[imid] = igrp = static_cast<int>(m_high.size());
72  m_ngroups++;
73  }
74 
75  m_group_map[index] = igrp;
76  m_posInGroup_map[index] = (int) m_low[igrp-1].size();
77 
78  doublereal tlow = min_temp;
79  doublereal tmid = c[0];
80  doublereal thigh = max_temp;
81 
82  vector_fp chigh(c+8, c+15);
83  vector_fp clow(c+1, c+8);
84 
85  if (!m_allow_discontinuities) {
86  doublereal maxError = checkContinuity(name, tmid, &clow[0], &chigh[0]);
87  if (maxError > 1e-6) {
88  fixDiscontinuities(tlow, tmid, thigh, &clow[0], &chigh[0]);
89  AssertThrowMsg(checkContinuity(name, tmid, &clow[0], &chigh[0]) < 1e-12,
90  "NasaThermo::install", "Polynomials still not continuous");
91  }
92  }
93 
94  m_high[igrp-1].push_back(NasaPoly1(index, tmid, thigh,
95  ref_pressure, &chigh[0]));
96  m_low[igrp-1].push_back(NasaPoly1(index, tlow, tmid,
97  ref_pressure, &clow[0]));
98 
99  if (tlow > m_tlow_max) {
100  m_tlow_max = tlow;
101  }
102  if (thigh < m_thigh_min) {
103  m_thigh_min = thigh;
104  }
105  if (m_tlow.size() < index + 1) {
106  m_tlow.resize(index + 1, tlow);
107  m_thigh.resize(index + 1, thigh);
108  }
109  m_tlow[index] = tlow;
110  m_thigh[index] = thigh;
111  if (m_p0 < 0.0) {
112  m_p0 = ref_pressure;
113  } else if (fabs(m_p0 - ref_pressure) > 0.1) {
114  std::string logmsg = " ERROR NasaThermo: New Species, " + name + ", has a different reference pressure, "
115  + fp2str(ref_pressure) + ", than existing reference pressure, " + fp2str(m_p0) + "\n";
116  writelog(logmsg);
117  logmsg = " This is now a fatal error\n";
118  writelog(logmsg);
119  throw CanteraError("install()", "species have different reference pressures");
120  }
121  m_p0 = ref_pressure;
122 }
123 
124 void NasaThermo::update_one(size_t k, doublereal t, doublereal* cp_R,
125  doublereal* h_RT, doublereal* s_R) const
126 {
127  m_t[0] = t;
128  m_t[1] = t*t;
129  m_t[2] = m_t[1]*t;
130  m_t[3] = m_t[2]*t;
131  m_t[4] = 1.0/t;
132  m_t[5] = log(t);
133 
134  size_t grp = m_group_map[k];
135  size_t pos = m_posInGroup_map[k];
136  const std::vector<NasaPoly1> &mlg = m_low[grp-1];
137  const NasaPoly1* nlow = &(mlg[pos]);
138 
139  doublereal tmid = nlow->maxTemp();
140  if (t < tmid) {
141  nlow->updateProperties(&m_t[0], cp_R, h_RT, s_R);
142  } else {
143  const std::vector<NasaPoly1> &mhg = m_high[grp-1];
144  const NasaPoly1* nhigh = &(mhg[pos]);
145  nhigh->updateProperties(&m_t[0], cp_R, h_RT, s_R);
146  }
147 }
148 
149 void NasaThermo::update(doublereal t, doublereal* cp_R,
150  doublereal* h_RT, doublereal* s_R) const
151 {
152  int i;
153 
154  // load functions of temperature into m_t vector
155  m_t[0] = t;
156  m_t[1] = t*t;
157  m_t[2] = m_t[1]*t;
158  m_t[3] = m_t[2]*t;
159  m_t[4] = 1.0/t;
160  m_t[5] = log(t);
161 
162  // iterate over the groups
163  std::vector<NasaPoly1>::const_iterator _begin, _end;
164  for (i = 0; i != m_ngroups; i++) {
165  if (t > m_tmid[i]) {
166  _begin = m_high[i].begin();
167  _end = m_high[i].end();
168  } else {
169  _begin = m_low[i].begin();
170  _end = m_low[i].end();
171  }
172  for (; _begin != _end; ++_begin) {
173  _begin->updateProperties(&m_t[0], cp_R, h_RT, s_R);
174  }
175  }
176 }
177 
178 void NasaThermo::reportParams(size_t index, int& type,
179  doublereal* const c,
180  doublereal& minTemp,
181  doublereal& maxTemp,
182  doublereal& refPressure) const
183 {
184  warn_deprecated("NasaThermo::reportParams");
185  type = reportType(index);
186  if (type == NASA) {
187  size_t grp = m_group_map[index];
188  size_t pos = m_posInGroup_map[index];
189  const std::vector<NasaPoly1> &mlg = m_low[grp-1];
190  const std::vector<NasaPoly1> &mhg = m_high[grp-1];
191  const NasaPoly1* lowPoly = &(mlg[pos]);
192  const NasaPoly1* highPoly = &(mhg[pos]);
193  int itype = NASA;
194  doublereal tmid = lowPoly->maxTemp();
195  c[0] = tmid;
196  size_t n;
197  double ttemp;
198  lowPoly->reportParameters(n, itype, minTemp, ttemp, refPressure,
199  c + 1);
200  if (n != index) {
201  throw CanteraError(" ", "confused");
202  }
203  if (itype != NASA1) {
204  throw CanteraError(" ", "confused");
205  }
206  highPoly->reportParameters(n, itype, ttemp, maxTemp, refPressure,
207  c + 8);
208  if (n != index) {
209  throw CanteraError(" ", "confused");
210  }
211  if (itype != NASA1) {
212  throw CanteraError(" ", "confused");
213  }
214  } else {
215  throw CanteraError(" ", "confused");
216  }
217 }
218 
219 #ifdef H298MODIFY_CAPABILITY
220 doublereal NasaThermo::reportOneHf298(const int k) const
221 {
222  int grp = m_group_map[k];
223  int pos = m_posInGroup_map[k];
224  const std::vector<NasaPoly1> &mlg = m_low[grp-1];
225  const NasaPoly1* nlow = &(mlg[pos]);
226  doublereal tmid = nlow->maxTemp();
227  double h;
228  if (298.15 <= tmid) {
229  h = nlow->reportHf298(0);
230  } else {
231  const std::vector<NasaPoly1> &mhg = m_high[grp-1];
232  const NasaPoly1* nhigh = &(mhg[pos]);
233  h = nhigh->reportHf298(0);
234  }
235  return h;
236 }
237 
238 void NasaThermo::modifyOneHf298(const int k, const doublereal Hf298New)
239 {
240  int grp = m_group_map[k];
241  int pos = m_posInGroup_map[k];
242  std::vector<NasaPoly1> &mlg = m_low[grp-1];
243  NasaPoly1* nlow = &(mlg[pos]);
244  std::vector<NasaPoly1> &mhg = m_high[grp-1];
245  NasaPoly1* nhigh = &(mhg[pos]);
246  doublereal tmid = nlow->maxTemp();
247 
248  double hnow = reportOneHf298(k);
249  double delH = Hf298New - hnow;
250  if (298.15 <= tmid) {
251  nlow->modifyOneHf298(k, Hf298New);
252  double h = nhigh->reportHf298(0);
253  double hnew = h + delH;
254  nhigh->modifyOneHf298(k, hnew);
255  } else {
256  nhigh->modifyOneHf298(k, Hf298New);
257  double h = nlow->reportHf298(0);
258  double hnew = h + delH;
259  nlow->modifyOneHf298(k, hnew);
260  }
261 }
262 #endif
263 
264 doublereal NasaThermo::cp_R(double t, const doublereal* c)
265 {
266  return poly4(t, c+2);
267 }
268 
269 doublereal NasaThermo::enthalpy_RT(double t, const doublereal* c) {
270  return c[2] + 0.5*c[3]*t + OneThird*c[4]*t*t
271  + 0.25*c[5]*t*t*t + 0.2*c[6]*t*t*t*t
272  + c[0]/t;
273 }
274 
275 doublereal NasaThermo::entropy_R(double t, const doublereal* c) {
276  return c[2]*log(t) + c[3]*t + 0.5*c[4]*t*t
277  + OneThird*c[5]*t*t*t + 0.25*c[6]*t*t*t*t
278  + c[1];
279 }
280 
281 doublereal NasaThermo::checkContinuity(const std::string& name, double tmid,
282  doublereal* clow, doublereal* chigh)
283 {
284  // heat capacity
285  doublereal cplow = cp_R(tmid, clow);
286  doublereal cphigh = cp_R(tmid, chigh);
287  doublereal delta = cplow - cphigh;
288  doublereal maxError = abs(delta);
289  if (fabs(delta/(fabs(cplow)+1.0E-4)) > 0.001) {
290  writelog("\n\n**** WARNING ****\nFor species "+name+
291  ", discontinuity in cp/R detected at Tmid = "
292  +fp2str(tmid)+"\n");
293  writelog("\tValue computed using low-temperature polynomial: "
294  +fp2str(cplow)+".\n");
295  writelog("\tValue computed using high-temperature polynomial: "
296  +fp2str(cphigh)+".\n");
297  }
298 
299  // enthalpy
300  doublereal hrtlow = enthalpy_RT(tmid, clow);
301  doublereal hrthigh = enthalpy_RT(tmid, chigh);
302  delta = hrtlow - hrthigh;
303  maxError = std::max(std::abs(delta), maxError);
304  if (fabs(delta/(fabs(hrtlow)+cplow*tmid)) > 0.001) {
305  writelog("\n\n**** WARNING ****\nFor species "+name+
306  ", discontinuity in h/RT detected at Tmid = "
307  +fp2str(tmid)+"\n");
308  writelog("\tValue computed using low-temperature polynomial: "
309  +fp2str(hrtlow)+".\n");
310  writelog("\tValue computed using high-temperature polynomial: "
311  +fp2str(hrthigh)+".\n");
312  }
313 
314  // entropy
315  doublereal srlow = entropy_R(tmid, clow);
316  doublereal srhigh = entropy_R(tmid, chigh);
317  delta = srlow - srhigh;
318  maxError = std::max(std::abs(delta), maxError);
319  if (fabs(delta/(fabs(srlow)+cplow)) > 0.001) {
320  writelog("\n\n**** WARNING ****\nFor species "+name+
321  ", discontinuity in s/R detected at Tmid = "
322  +fp2str(tmid)+"\n");
323  writelog("\tValue computed using low-temperature polynomial: "
324  +fp2str(srlow)+".\n");
325  writelog("\tValue computed using high-temperature polynomial: "
326  +fp2str(srhigh)+".\n");
327  }
328 
329  return maxError;
330 }
331 
332 void NasaThermo::fixDiscontinuities(doublereal Tlow, doublereal Tmid,
333  doublereal Thigh, doublereal* clow,
334  doublereal* chigh)
335 {
336  // The thermodynamic parameters can be written in terms nondimensionalized
337  // coefficients A[i] and the nondimensional temperature t = T/Tmid as:
338  //
339  // C_low(t) = A[0] + A[i] * t**i
340  // H_low(t) = A[0] + A[i] / (i+1) * t**i + A[5] / t
341  // S_low(t) = A[0]*ln(t) + A[i] / i * t**i + A[6]
342  //
343  // where the implicit sum is over the range 1 <= i <= 4 and the
344  // nondimensional coefficients are related to the dimensional coefficients
345  // a[i] by:
346  //
347  // A[0] = a[0]
348  // A[i] = Tmid**i * a[i], 1 <= i <= 4
349  // A[5] = a[5] / Tmid
350  // A[6] = a[6] + a[0] * ln(Tmid)
351  //
352  // and corresponding relationships hold for the high-temperature
353  // polynomial coefficients B[i]. This nondimensionalization is necessary
354  // in order for the resulting matrix to be well-conditioned.
355  //
356  // The requirement that C_low(1) = C_high(1) is satisfied by:
357  //
358  // B[0] = A[0] + (A[i] - B[i])
359  // C_high(t) = A[0] + (A[i] + B[i] * t**i - 1)
360  //
361  // The requirement that H_low(1) = H_high(1) is satisfied by:
362  //
363  // B[5] = A[5] + (i / (i+1) * (B[i] - A[i]))
364  // H_high(t) = A[0] + A[5] / t + (1 - i / (i+1) / t) * A[i] +
365  // (t**i / (i+1) - 1 + i / (i+1) / t) * B[i]
366  //
367  // The requirement that S_low(1) = S_high(1) is satisfied by:
368  //
369  // B[6] = A[6] + (A[i] - B[i]) / i
370  // S_high(t) = A[0] * ln(t) + A[6] + (ln(t) + 1 / i) * A[i] +
371  // (-ln(t) + t**i / i - 1 / i) * B[i]
372 
373  // Formulate a linear least squares problem for the nondimensionalized
374  // coefficients. In the system of equations M*x = b:
375  // - each row of M consists of the factors in one of the above equations
376  // for C_low, H_high, etc. evaluated at some temperature between Tlow
377  // and Thigh
378  // - x is a vector of the 11 independent coefficients (A[0] through A[6]
379  // and B[1] through B[4])
380  // - B is a vector of the corresponding value of C, H, or S computed using
381  // the original polynomial.
382 
383  const size_t nTemps = 12;
384  const size_t nCols = 11; // number of independent coefficients
385  const size_t nRows = 3*nTemps; // Evaluate C, H, and S at each temperature
386  DenseMatrix M(nRows, nCols, 0.0);
387  vector_fp b(nRows);
388  doublereal sqrtDeltaT = sqrt(Thigh) - sqrt(Tlow);
389  vector_fp tpow(5);
390  for (size_t j = 0; j < nTemps; j++) {
391  double T = pow(sqrt(Tlow) + sqrtDeltaT * j / (nTemps - 1.0), 2);
392  double t = T / Tmid; // non-dimensionalized temperature
393  double logt = std::log(t);
394  size_t n = 3 * j; // row index
395  for (int i = 1; i <= 4; i++) {
396  tpow[i] = pow(t, i);
397  }
398 
399  // row n: Cp/R
400  // row n+1: H/RT
401  // row n+2: S/R
402  // columns 0 through 6 are for the low-T coefficients
403  // columns 7 through 10 are for the independent high-T coefficients
404  M(n, 0) = 1.0;
405  M(n+1,0) = 1.0;
406  M(n+2,0) = logt;
407  M(n+1,5) = 1.0 / t;
408  M(n+2,6) = 1.0;
409  if (t <= 1.0) {
410  for (int i = 1; i <= 4; i++) {
411  M(n,i) = tpow[i];
412  M(n+1,i) = tpow[i] / (i+1);
413  M(n+2,i) = tpow[i] / i;
414  }
415  b[n] = cp_R(T, clow);
416  b[n+1] = enthalpy_RT(T, clow);
417  b[n+2] = entropy_R(T, clow);
418  } else {
419  for (int i = 1; i <= 4; i++) {
420  M(n,i) = 1.0;
421  M(n,i+6) = tpow[i] - 1.0;
422  M(n+1,i) = 1 - i / ((i + 1.0) * t);
423  M(n+1,i+6) = -1 + tpow[i] / (i+1) + i / ((i+1) * t);
424  M(n+2,i) = logt + 1.0 / i;
425  M(n+2,i+6) = -logt + (tpow[i] - 1.0) / i;
426  }
427  b[n] = cp_R(T, chigh);
428  b[n+1] = enthalpy_RT(T, chigh);
429  b[n+2] = entropy_R(T, chigh);
430  }
431  }
432 
433  // Solve the least squares problem
434  vector_fp sigma(nRows);
435  size_t rank;
436  int info;
437  vector_fp work(1);
438  int lwork = -1;
439  // First get the desired size of the work array
440  ct_dgelss(nRows, nCols, 1, &M(0,0), nRows, &b[0], nRows,
441  &sigma[0], -1, rank, &work[0], lwork, info);
442  work.resize(work[0]);
443  lwork = work[0];
444  ct_dgelss(nRows, nCols, 1, &M(0,0), nRows, &b[0], nRows,
445  &sigma[0], -1, rank, &work[0], lwork, info);
446 
447  AssertTrace(info == 0);
448  AssertTrace(rank == nCols);
449  AssertTrace(sigma[0] / sigma[10] < 1e20); // condition number
450 
451  // Compute the full set of nondimensionalized coefficients
452  // (dgelss returns the solution of M*x = b in b).
453 
454  // Note that clow and chigh store the coefficients in the order:
455  // clow = [a[5], a[6], a[0], a[1], a[2], a[3], a[4]]
456  clow[2] = chigh[2] = b[0];
457  clow[0] = chigh[0] = b[5];
458  clow[1] = chigh[1] = b[6];
459  for (int i = 1; i <= 4; i++) {
460  clow[2+i] = b[i];
461  chigh[2+i] = b[6+i];
462  chigh[2] += clow[2+i] - chigh[2+i];
463  chigh[0] += i / (i + 1.0) * (chigh[2+i] - clow[2+i]);
464  chigh[1] += (clow[2+i] - chigh[2+i]) / i;
465  }
466 
467  // redimensionalize
468  for (int i = 1; i <= 4; i++) {
469  clow[2+i] /= pow(Tmid, i);
470  chigh[2+i] /= pow(Tmid, i);
471  }
472  clow[0] *= Tmid;
473  chigh[0] *= Tmid;
474  clow[1] -= clow[2] * std::log(Tmid);
475  chigh[1] -= chigh[2] * std::log(Tmid);
476 }
477 
478 }
doublereal m_thigh_min
Minimum value of the high temperature limit.
Definition: NasaThermo.h:195
#define NASA
Two regions of 7 coefficient NASA Polynomials This is implemented in the class NasaPoly2 in NasaPoly2...
std::vector< std::vector< NasaPoly1 > > m_high
Vector of vector of NasaPoly1's for the high temp region.
Definition: NasaThermo.h:168
Various templated functions that carry out common vector operations (see Templated Utility Functions)...
virtual void update(doublereal t, doublereal *cp_R, doublereal *h_RT, doublereal *s_R) const
Compute the reference-state properties for all species.
Definition: NasaThermo.cpp:149
virtual int reportType(size_t index) const
This utility function reports the type of parameterization used for the species with index number ind...
Definition: NasaThermo.h:124
void warn_deprecated(const std::string &method, const std::string &extra)
Print a warning indicating that method is deprecated.
Definition: global.cpp:76
virtual void reportParams(size_t index, int &type, doublereal *const c, doublereal &minTemp, doublereal &maxTemp, doublereal &refPressure) const
Definition: NasaThermo.cpp:178
doublereal m_tlow_max
Maximum value of the low temperature limit.
Definition: NasaThermo.h:192
doublereal entropy_R(double t, const doublereal *c)
Compute the nondimensional entropy using the given NASA polynomial.
Definition: NasaThermo.cpp:275
#define AssertThrowMsg(expr, procedure, message)
Assertion must be true or an error is thrown.
Definition: ctexceptions.h:247
R poly4(D x, R *c)
Evaluates a polynomial of order 4.
Definition: utilities.h:638
#define NASA1
7 coefficient NASA Polynomials This is implemented in the class NasaPoly1 in NasaPoly1.h
virtual doublereal maxTemp() const
Returns the maximum temperature that the thermo parameterization is valid.
double checkContinuity(const std::string &name, double tmid, doublereal *clow, doublereal *chigh)
Adjust polynomials to be continuous at the midpoint temperature.
Definition: NasaThermo.cpp:281
const doublereal OneThird
1/3
Definition: ct_defs.h:128
doublereal m_p0
Reference pressure (Pa)
Definition: NasaThermo.h:213
std::string fp2str(const double x, const std::string &fmt)
Convert a double into a c++ string.
Definition: stringUtils.cpp:29
doublereal cp_R(double t, const doublereal *c)
Compute the nondimensional heat capacity using the given NASA polynomial.
Definition: NasaThermo.cpp:264
std::map< int, int > m_index
Map between the midpoint temperature, as an int, to the group number.
Definition: NasaThermo.h:183
virtual void install(const std::string &name, size_t index, int type, const doublereal *c, doublereal min_temp, doublereal max_temp, doublereal ref_pressure)
install a new species thermodynamic property parameterization for one species.
Definition: NasaThermo.cpp:58
Header for the 2 regime 7 coefficient Nasa thermodynamic polynomials for multiple species in a phase...
vector_fp m_tmid
Vector of log temperature limits.
Definition: NasaThermo.h:189
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:68
int m_ngroups
number of groups
Definition: NasaThermo.h:216
vector_fp m_t
Vector of temperature polynomials.
Definition: NasaThermo.h:219
#define AssertTrace(expr)
Assertion must be true or an error is thrown.
Definition: ctexceptions.h:216
doublereal enthalpy_RT(double t, const doublereal *c)
Compute the nondimensional enthalpy using the given NASA polynomial.
Definition: NasaThermo.cpp:269
std::map< size_t, size_t > m_posInGroup_map
Definition: NasaThermo.h:234
std::map< size_t, std::string > m_name
Species name as a function of the species index.
Definition: NasaThermo.h:237
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:165
Headers for the DenseMatrix object, which deals with dense rectangular matrices and description of th...
NasaPoly2 & operator=(const NasaPoly2 &b)
Assignment operator.
Definition: NasaPoly2.h:92
std::map< size_t, size_t > m_group_map
Definition: NasaThermo.h:227
void fixDiscontinuities(doublereal Tlow, doublereal Tmid, doublereal Thigh, doublereal *clow, doublereal *chigh)
Adjust polynomials to be continuous at the midpoint temperature.
Definition: NasaThermo.cpp:332
virtual void reportParameters(size_t &n, int &type, doublereal &tlow, doublereal &thigh, doublereal &pref, doublereal *const coeffs) const
Definition: NasaPoly1.h:166
void writelog(const std::string &msg)
Write a message to the screen.
Definition: global.cpp:43
vector_fp m_thigh
Vector of low temperature limits (species index)
Definition: NasaThermo.h:207
The NASA polynomial parameterization for one temperature range.
Definition: NasaPoly1.h:48
vector_fp m_tlow
Vector of low temperature limits (species index)
Definition: NasaThermo.h:201
virtual void updateProperties(const doublereal *tt, doublereal *cp_R, doublereal *h_RT, doublereal *s_R) const
Update the properties for this species, given a temperature polynomial.
Definition: NasaPoly1.h:128
virtual void update_one(size_t k, doublereal t, doublereal *cp_R, doublereal *h_RT, doublereal *s_R) const
Like update(), but only updates the single species k.
Definition: NasaThermo.cpp:124
std::vector< std::vector< NasaPoly1 > > m_low
Vector of vector of NasaPoly1's for the low temp region.
Definition: NasaThermo.h:177
A class for full (non-sparse) matrices with Fortran-compatible data storage, which adds matrix operat...
Definition: DenseMatrix.h:70