Cantera  3.1.0a1
Nasa9Poly1.cpp
Go to the documentation of this file.
1 /**
2  * @file Nasa9Poly1.cpp Definitions for a single-species standard state object
3  * derived from
4  * @link Cantera::SpeciesThermoInterpType SpeciesThermoInterpType@endlink based
5  * on the NASA 9 coefficient temperature polynomial form applied to one
6  * temperature region (see @ref spthermo and class @link Cantera::Nasa9Poly1
7  * Nasa9Poly1@endlink).
8  *
9  * This parameterization has one NASA temperature region.
10  */
11 
12 // This file is part of Cantera. See License.txt in the top-level directory or
13 // at https://cantera.org/license.txt for license and copyright information.
14 
16 #include "cantera/base/AnyMap.h"
17 
18 namespace Cantera
19 {
20 
21 Nasa9Poly1::Nasa9Poly1()
22  : m_coeff(9)
23 {
24 }
25 
26 Nasa9Poly1::Nasa9Poly1(double tlow, double thigh, double pref,
27  const double* coeffs) :
28  SpeciesThermoInterpType(tlow, thigh, pref),
29  m_coeff(coeffs, coeffs + 9)
30 {
31 }
32 
33 void Nasa9Poly1::setParameters(const vector<double> &coeffs)
34 {
35  if (coeffs.size() != 9) {
36  throw CanteraError("Nasa9Poly1::setParameters", "Array must contain "
37  "9 coefficients, but {} were given.", coeffs.size());
38  }
39  m_coeff = coeffs;
40 }
41 
43 {
44  return NASA9;
45 }
46 
47 void Nasa9Poly1::updateTemperaturePoly(double T, double* T_poly) const
48 {
49  T_poly[0] = T;
50  T_poly[1] = T * T;
51  T_poly[2] = T_poly[1] * T;
52  T_poly[3] = T_poly[2] * T;
53  T_poly[4] = 1.0 / T;
54  T_poly[5] = T_poly[4] / T;
55  T_poly[6] = std::log(T);
56 }
57 
58 void Nasa9Poly1::updateProperties(const double* tt, double* cp_R, double* h_RT,
59  double* s_R) const
60 {
61 
62  double ct0 = m_coeff[0] * tt[5]; // a0 / (T^2)
63  double ct1 = m_coeff[1] * tt[4]; // a1 / T
64  double ct2 = m_coeff[2]; // a2
65  double ct3 = m_coeff[3] * tt[0]; // a3 * T
66  double ct4 = m_coeff[4] * tt[1]; // a4 * T^2
67  double ct5 = m_coeff[5] * tt[2]; // a5 * T^3
68  double ct6 = m_coeff[6] * tt[3]; // a6 * T^4
69 
70  double cpdivR = ct0 + ct1 + ct2 + ct3 + ct4 + ct5 + ct6;
71  double hdivRT = -ct0 + tt[6]*ct1 + ct2 + 0.5*ct3 + 1.0/3.0*ct4
72  + 0.25*ct5 + 0.2*ct6 + m_coeff[7] * tt[4];
73  double sdivR = -0.5*ct0 - ct1 + tt[6]*ct2 + ct3 + 0.5*ct4
74  + 1.0/3.0*ct5 + 0.25*ct6 + m_coeff[8];
75 
76  // return the computed properties for this species
77  *cp_R = cpdivR;
78  *h_RT = hdivRT;
79  *s_R = sdivR;
80 }
81 
82 void Nasa9Poly1::updatePropertiesTemp(const double temp, double* cp_R, double* h_RT,
83  double* s_R) const
84 {
85  double tPoly[7];
86  updateTemperaturePoly(temp, tPoly);
87  updateProperties(tPoly, cp_R, h_RT, s_R);
88 }
89 
90 void Nasa9Poly1::reportParameters(size_t& n, int& type, double& tlow, double& thigh,
91  double& pref, double* const coeffs) const
92 {
93  n = 0;
94  type = NASA9;
95  tlow = m_lowT;
96  thigh = m_highT;
97  pref = m_Pref;
98  coeffs[0] = 1;
99  coeffs[1] = m_lowT;
100  coeffs[2] = m_highT;
101  for (int i = 0; i < 9; i++) {
102  coeffs[i+3] = m_coeff[i];
103  }
104 }
105 
106 void Nasa9Poly1::getParameters(AnyMap& thermo) const {
107  // Nasa9Poly1 is only used as an embedded model within
108  // Nasa9PolyMultiTempRegion, so all that needs to be added here are the
109  // polynomial coefficients
110  thermo["data"].asVector<vector<double>>().push_back(m_coeff);
111 }
112 
113 }
Header for a single-species standard state object derived from SpeciesThermoInterpType based on the N...
A map of string keys to values whose type can vary at runtime.
Definition: AnyMap.h:427
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:66
vector< double > m_coeff
array of polynomial coefficients
Definition: Nasa9Poly1.h:125
int reportType() const override
Returns an integer representing the type of parameterization.
Definition: Nasa9Poly1.cpp:42
void setParameters(const vector< double > &coeffs)
Set the array of 9 polynomial coefficients.
Definition: Nasa9Poly1.cpp:33
void getParameters(AnyMap &thermo) const override
Store the parameters of the species thermo object such that an identical species thermo object could ...
Definition: Nasa9Poly1.cpp:106
void updateTemperaturePoly(double T, double *T_poly) const override
Given the temperature T, compute the terms of the temperature polynomial T_poly.
Definition: Nasa9Poly1.cpp:47
void reportParameters(size_t &n, int &type, double &tlow, double &thigh, double &pref, double *const coeffs) const override
This utility function reports back the type of parameterization and all of the parameters for the spe...
Definition: Nasa9Poly1.cpp:90
void updateProperties(const double *tt, double *cp_R, double *h_RT, double *s_R) const override
Update the properties for this species, given a temperature polynomial.
Definition: Nasa9Poly1.cpp:58
void updatePropertiesTemp(const double temp, double *cp_R, double *h_RT, double *s_R) const override
Compute the reference-state property of one species.
Definition: Nasa9Poly1.cpp:82
Abstract Base class for the thermodynamic manager for an individual species' reference state.
double m_Pref
Reference state pressure.
double m_lowT
lowest valid temperature
double m_highT
Highest valid temperature.
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564
#define NASA9
9 coefficient NASA Polynomials This is implemented in the class Nasa9Poly1 in Nasa9Poly1....