Cantera  3.1.0a1
Mu0Poly.cpp
Go to the documentation of this file.
1 /**
2  * @file Mu0Poly.cpp
3  * Definitions for a single-species standard state object derived
4  * from @link Cantera::SpeciesThermoInterpType SpeciesThermoInterpType@endlink based
5  * on a piecewise constant mu0 interpolation
6  * (see @ref spthermo and class @link Cantera::Mu0Poly Mu0Poly@endlink).
7  */
8 
9 // This file is part of Cantera. See License.txt in the top-level directory or
10 // at https://cantera.org/license.txt for license and copyright information.
11 
12 #include "cantera/thermo/Mu0Poly.h"
14 #include "cantera/base/AnyMap.h"
15 
16 namespace Cantera
17 {
18 Mu0Poly::Mu0Poly()
19  : SpeciesThermoInterpType(0.0, std::numeric_limits<double>::infinity(), 0.0)
20 {
21 }
22 
23 Mu0Poly::Mu0Poly(double tlow, double thigh, double pref, const double* coeffs) :
24  SpeciesThermoInterpType(tlow, thigh, pref),
25  m_numIntervals(0),
26  m_H298(0.0)
27 {
28  map<double, double> T_mu;
29  size_t nPoints = (size_t) coeffs[0];
30  for (size_t i = 0; i < nPoints; i++) {
31  T_mu[coeffs[2*i+2]] = coeffs[2*i+3];
32  }
33  setParameters(coeffs[1], T_mu);
34 }
35 
36 void Mu0Poly::setParameters(double h0, const map<double, double>& T_mu)
37 {
38  size_t nPoints = T_mu.size();
39  if (nPoints < 2) {
40  throw CanteraError("Mu0Poly::setParameters", "nPoints must be >= 2");
41  }
42  m_numIntervals = nPoints - 1;
43  m_H298 = h0 / GasConstant;
44 
45  // Distribute the data into the internal arrays, and find the index of the
46  // point at 298.15 K.
47  size_t iT298 = npos;
48  for (const auto& [T1, mu] : T_mu) {
49  if (T1 == 298.15) {
50  iT298 = m_t0_int.size();
51  }
52  m_t0_int.push_back(T1);
53  m_mu0_R_int.push_back(mu / GasConstant);
54  }
55  if (iT298 == npos) {
56  throw CanteraError("Mu0Poly::setParameters",
57  "One temperature has to be 298.15");
58  }
59 
60  // Resize according to the number of points
61  m_h0_R_int.resize(nPoints);
62  m_s0_R_int.resize(nPoints);
63  m_cp0_R_int.resize(nPoints);
64 
65  // Starting from the interval with T298, we go up
66  m_h0_R_int[iT298] = m_H298;
67  m_s0_R_int[iT298] = - (m_mu0_R_int[iT298] - m_h0_R_int[iT298]) / m_t0_int[iT298];
68  for (size_t i = iT298; i < m_numIntervals; i++) {
69  double T1 = m_t0_int[i];
70  double s1 = m_s0_R_int[i];
71  double T2 = m_t0_int[i+1];
72  double deltaMu = m_mu0_R_int[i+1] - m_mu0_R_int[i];
73  double deltaT = T2 - T1;
74  double cpi = (deltaMu - T1 * s1 + T2 * s1) / (deltaT - T2 * log(T2/T1));
75  m_cp0_R_int[i] = cpi;
76  m_h0_R_int[i+1] = m_h0_R_int[i] + cpi * deltaT;
77  m_s0_R_int[i+1] = s1 + cpi * log(T2/T1);
78  m_cp0_R_int[i+1] = cpi;
79  }
80 
81  // Starting from the interval with T298, we go down
82  if (iT298 != 0) {
83  m_h0_R_int[iT298] = m_H298;
84  m_s0_R_int[iT298] = - (m_mu0_R_int[iT298] - m_h0_R_int[iT298]) / m_t0_int[iT298];
85  for (size_t i = iT298 - 1; i != npos; i--) {
86  double T1 = m_t0_int[i];
87  double T2 = m_t0_int[i+1];
88  double s2 = m_s0_R_int[i+1];
89  double deltaMu = m_mu0_R_int[i+1] - m_mu0_R_int[i];
90  double deltaT = T2 - T1;
91  double cpi = (deltaMu - T1 * s2 + T2 * s2) / (deltaT - T1 * log(T2/T1));
92  m_cp0_R_int[i] = cpi;
93  m_h0_R_int[i] = m_h0_R_int[i+1] - cpi * deltaT;
94  m_s0_R_int[i] = s2 - cpi * log(T2/T1);
95  if (i == (m_numIntervals-1)) {
96  m_cp0_R_int[i+1] = cpi;
97  }
98  }
99  }
100 }
101 
102 void Mu0Poly::updateProperties(const double* tt, double* cp_R,
103  double* h_RT, double* s_R) const
104 {
105  size_t j = m_numIntervals;
106  double T = *tt;
107  for (size_t i = 0; i < m_numIntervals; i++) {
108  double T2 = m_t0_int[i+1];
109  if (T <=T2) {
110  j = i;
111  break;
112  }
113  }
114  double T1 = m_t0_int[j];
115  double cp_Rj = m_cp0_R_int[j];
116  *cp_R = cp_Rj;
117  *h_RT = (m_h0_R_int[j] + (T - T1) * cp_Rj)/T;
118  *s_R = m_s0_R_int[j] + cp_Rj * (log(T/T1));
119 }
120 
121 void Mu0Poly::updatePropertiesTemp(const double T,
122  double* cp_R,
123  double* h_RT,
124  double* s_R) const
125 {
126  updateProperties(&T, cp_R, h_RT, s_R);
127 }
128 
129 size_t Mu0Poly::nCoeffs() const
130 {
131  return 2*m_numIntervals + 4;
132 }
133 
134 void Mu0Poly::reportParameters(size_t& n, int& type, double& tlow, double& thigh,
135  double& pref, double* const coeffs) const
136 {
137  n = 0;
138  type = MU0_INTERP;
139  tlow = m_lowT;
140  thigh = m_highT;
141  pref = m_Pref;
142  coeffs[0] = int(m_numIntervals)+1;
143  coeffs[1] = m_H298 * GasConstant;
144  int j = 2;
145  for (size_t i = 0; i < m_numIntervals+1; i++) {
146  coeffs[j] = m_t0_int[i];
147  coeffs[j+1] = m_mu0_R_int[i] * GasConstant;
148  j += 2;
149  }
150 }
151 
152 void Mu0Poly::getParameters(AnyMap& thermo) const
153 {
155  thermo["model"] = "piecewise-Gibbs";
156  thermo["h0"].setQuantity(m_H298 * GasConstant, "J/kmol");
157  AnyMap data;
158  bool dimensionless = m_input.getBool("dimensionless", false);
159  if (dimensionless) {
160  thermo["dimensionless"] = true;
161  }
162  for (size_t i = 0; i < m_numIntervals+1; i++) {
163  if (dimensionless) {
164  data[fmt::format("{}", m_t0_int[i])] = m_mu0_R_int[i] / m_t0_int[i];
165  } else {
166  data[fmt::format("{}", m_t0_int[i])].setQuantity(
167  m_mu0_R_int[i] * GasConstant, "J/kmol");
168  }
169  }
170  thermo["data"] = std::move(data);
171 }
172 
173 }
Header for a single-species standard state object derived from SpeciesThermoInterpType based on a pie...
A map of string keys to values whose type can vary at runtime.
Definition: AnyMap.h:427
bool getBool(const string &key, bool default_) const
If key exists, return it as a bool, otherwise return default_.
Definition: AnyMap.cpp:1515
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:66
vector< double > m_t0_int
Points at which the standard state chemical potential are given.
Definition: Mu0Poly.h:144
double m_H298
Value of the enthalpy at T = 298.15.
Definition: Mu0Poly.h:141
void getParameters(AnyMap &thermo) const override
Store the parameters of the species thermo object such that an identical species thermo object could ...
Definition: Mu0Poly.cpp:152
vector< double > m_h0_R_int
Dimensionless Enthalpies at the temperature points.
Definition: Mu0Poly.h:151
size_t nCoeffs() const override
This utility function returns the number of coefficients for a given type of species parameterization...
Definition: Mu0Poly.cpp:129
void reportParameters(size_t &n, int &type, double &tlow, double &thigh, double &pref, double *const coeffs) const override
This utility function returns the type of parameterization and all of the parameters for the species.
Definition: Mu0Poly.cpp:134
vector< double > m_cp0_R_int
Heat capacity at the points.
Definition: Mu0Poly.h:157
size_t m_numIntervals
Number of intervals in the interpolating linear approximation.
Definition: Mu0Poly.h:137
vector< double > m_s0_R_int
Entropy at the points.
Definition: Mu0Poly.h:154
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: Mu0Poly.cpp:102
void setParameters(double h0, const map< double, double > &T_mu)
Set parameters for .
Definition: Mu0Poly.cpp:36
vector< double > m_mu0_R_int
Mu0's are primary input data.
Definition: Mu0Poly.h:148
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: Mu0Poly.cpp:121
Abstract Base class for the thermodynamic manager for an individual species' reference state.
double m_Pref
Reference state pressure.
virtual void getParameters(AnyMap &thermo) const
Store the parameters of the species thermo object such that an identical species thermo object could ...
double m_lowT
lowest valid temperature
double m_highT
Highest valid temperature.
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition: ct_defs.h:120
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564
const size_t npos
index returned by functions to indicate "no position"
Definition: ct_defs.h:180
#define MU0_INTERP
piecewise interpolation of mu0.
Contains declarations for string manipulation functions within Cantera.