Cantera  3.1.0a1
SingleSpeciesTP.cpp
Go to the documentation of this file.
1 /**
2  * @file SingleSpeciesTP.cpp
3  * Definitions for the SingleSpeciesTP class, which is a filter class for ThermoPhase,
4  * that eases the construction of single species phases
5  * ( see @ref thermoprops and class @link Cantera::SingleSpeciesTP SingleSpeciesTP@endlink).
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/base/global.h"
14 
15 namespace Cantera
16 {
17 
18 // ------------ Molar Thermodynamic Properties --------------------
19 
21 {
22  double hbar;
24  return hbar;
25 }
26 
28 {
29  double ubar;
31  return ubar;
32 }
33 
35 {
36  double sbar;
38  return sbar;
39 }
40 
42 {
43  double gbar;
44 
45  // Get the chemical potential of the first species. This is the same as the
46  // partial molar Gibbs free energy.
47  getChemPotentials(&gbar);
48  return gbar;
49 }
50 
52 {
53  double cpbar;
54 
55  // Really should have a partial molar heat capacity function in ThermoPhase.
56  // However, the standard state heat capacity will do fine here for now.
57  getCp_R(&cpbar);
58  cpbar *= GasConstant;
59  return cpbar;
60 }
61 
63 {
64  // For single species, we go directory to the general Cp - Cv relation
65  //
66  // Cp = Cv + alpha**2 * V * T / beta
67  //
68  // where
69  // alpha = volume thermal expansion coefficient
70  // beta = isothermal compressibility
71  double cvbar = cp_mole();
72  double alpha = thermalExpansionCoeff();
73  double beta = isothermalCompressibility();
74  double V = molecularWeight(0)/density();
75  double T = temperature();
76  if (beta != 0.0) {
77  cvbar -= alpha * alpha * V * T / beta;
78  }
79  return cvbar;
80 }
81 
82 // ----------- Partial Molar Properties of the Solution -----------------
83 
84 void SingleSpeciesTP::getChemPotentials(double* mu) const
85 {
87 }
88 
90 {
91  getEnthalpy_RT(hbar);
92  hbar[0] *= RT();
93 }
94 
96 {
97  getIntEnergy_RT(ubar);
98  ubar[0] *= RT();
99 }
100 
102 {
103  getEntropy_R(sbar);
104  sbar[0] *= GasConstant;
105 }
106 
107 void SingleSpeciesTP::getPartialMolarCp(double* cpbar) const
108 {
109  getCp_R(cpbar);
110  cpbar[0] *= GasConstant;
111 }
112 
114 {
115  vbar[0] = molecularWeight(0) / density();
116 }
117 
118 // Properties of the Standard State of the Species in the Solution
119 
120 void SingleSpeciesTP::getPureGibbs(double* gpure) const
121 {
122  getGibbs_RT(gpure);
123  gpure[0] *= RT();
124 }
125 
126 void SingleSpeciesTP::getStandardVolumes(double* vbar) const
127 {
128  vbar[0] = molecularWeight(0) / density();
129 }
130 
131 // ---- Thermodynamic Values for the Species Reference States -------
132 
133 void SingleSpeciesTP::getEnthalpy_RT_ref(double* hrt) const
134 {
135  _updateThermo();
136  hrt[0] = m_h0_RT;
137 }
138 
139 void SingleSpeciesTP::getGibbs_RT_ref(double* grt) const
140 {
141  _updateThermo();
142  grt[0] = m_h0_RT - m_s0_R;
143 }
144 
145 void SingleSpeciesTP::getGibbs_ref(double* g) const
146 {
147  getGibbs_RT_ref(g);
148  g[0] *= RT();
149 }
150 
151 void SingleSpeciesTP::getEntropy_R_ref(double* er) const
152 {
153  _updateThermo();
154  er[0] = m_s0_R;
155 }
156 
157 void SingleSpeciesTP::getCp_R_ref(double* cpr) const
158 {
159  _updateThermo();
160  cpr[0] = m_cp0_R;
161 }
162 
163 // ------------------ Setting the State ------------------------
164 
165 void SingleSpeciesTP::setState_HP(double h, double p, double tol)
166 {
167  double dt;
168  setPressure(p);
169  for (int n = 0; n < 50; n++) {
170  dt = clip((h - enthalpy_mass())/cp_mass(), -100.0, 100.0);
171  setState_TP(temperature() + dt, p);
172  if (fabs(dt / temperature()) < tol) {
173  return;
174  }
175  }
176  throw CanteraError("SingleSpeciesTP::setState_HP",
177  "no convergence. dt = {}", dt);
178 }
179 
180 void SingleSpeciesTP::setState_UV(double u, double v, double tol)
181 {
182  double dt;
183  if (v == 0.0) {
184  setDensity(1.0E100);
185  } else {
186  setDensity(1.0/v);
187  }
188  for (int n = 0; n < 50; n++) {
189  dt = clip((u - intEnergy_mass())/cv_mass(), -100.0, 100.0);
190  setTemperature(temperature() + dt);
191  if (fabs(dt / temperature()) < tol) {
192  return;
193  }
194  }
195  throw CanteraError("SingleSpeciesTP::setState_UV",
196  "no convergence. dt = {}\nu = {} v = {}", dt, u, v);
197 }
198 
199 void SingleSpeciesTP::setState_SP(double s, double p, double tol)
200 {
201  double dt;
202  setPressure(p);
203  for (int n = 0; n < 50; n++) {
204  dt = clip((s - entropy_mass())*temperature()/cp_mass(), -100.0, 100.0);
205  setState_TP(temperature() + dt, p);
206  if (fabs(dt / temperature()) < tol) {
207  return;
208  }
209  }
210  throw CanteraError("SingleSpeciesTP::setState_SP",
211  "no convergence. dt = {}", dt);
212 }
213 
214 void SingleSpeciesTP::setState_SV(double s, double v, double tol)
215 {
216  double dt;
217  if (v == 0.0) {
218  setDensity(1.0E100);
219  } else {
220  setDensity(1.0/v);
221  }
222  for (int n = 0; n < 50; n++) {
223  dt = clip((s - entropy_mass())*temperature()/cv_mass(), -100.0, 100.0);
224  setTemperature(temperature() + dt);
225  if (fabs(dt / temperature()) < tol) {
226  return;
227  }
228  }
229  throw CanteraError("SingleSpeciesTP::setState_SV",
230  "no convergence. dt = {}", dt);
231 }
232 
233 bool SingleSpeciesTP::addSpecies(shared_ptr<Species> spec)
234 {
235  if (m_kk != 0) {
236  throw CanteraError("SingleSpeciesTP::addSpecies",
237  "Stoichiometric substances may only contain one species.");
238  }
239  return ThermoPhase::addSpecies(spec);
240 }
241 
243 {
244  double tnow = temperature();
245  if (m_tlast != tnow) {
246  m_spthermo.update(tnow, &m_cp0_R, &m_h0_RT, &m_s0_R);
247  m_tlast = tnow;
248  }
249 }
250 
251 }
Header for the SingleSpeciesTP class, which is a filter class for ThermoPhase, that eases the constru...
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:66
virtual void update(double T, double *cp_R, double *h_RT, double *s_R) const
Compute the reference-state properties for all species.
size_t m_kk
Number of species in the phase.
Definition: Phase.h:842
double temperature() const
Temperature (K).
Definition: Phase.h:562
virtual void setPressure(double p)
Set the internally stored pressure (Pa) at constant temperature and composition.
Definition: Phase.h:616
virtual void setDensity(const double density_)
Set the internally stored density (kg/m^3) of the phase.
Definition: Phase.cpp:586
virtual double density() const
Density (kg/m^3).
Definition: Phase.h:587
virtual void setTemperature(double temp)
Set the internally stored temperature of the phase (K).
Definition: Phase.h:623
double molecularWeight(size_t k) const
Molecular weight of species k.
Definition: Phase.cpp:383
double enthalpy_mole() const override
Molar enthalpy. Units: J/kmol.
void getPartialMolarEnthalpies(double *hbar) const override
Get the species partial molar enthalpies. Units: J/kmol.
void getChemPotentials(double *mu) const override
Get the array of chemical potentials.
void getGibbs_ref(double *g) const override
Returns the vector of the Gibbs function of the reference state at the current temperature of the sol...
void setState_HP(double h, double p, double tol=1e-9) override
Set the internally stored specific enthalpy (J/kg) and pressure (Pa) of the phase.
void getPartialMolarVolumes(double *vbar) const override
Get the species partial molar volumes. Units: m^3/kmol.
double cv_mole() const override
Molar heat capacity at constant volume. Units: J/kmol/K.
double m_h0_RT
Dimensionless enthalpy at the (mtlast, m_p0)
void getPureGibbs(double *gpure) const override
Get the Gibbs functions for the standard state of the species at the current T and P of the solution.
double m_s0_R
Dimensionless entropy at the (mtlast, m_p0)
void getEntropy_R_ref(double *er) const override
Returns the vector of nondimensional entropies of the reference state at the current temperature of t...
double intEnergy_mole() const override
Molar internal energy. Units: J/kmol.
double entropy_mole() const override
Molar entropy. Units: J/kmol/K.
void getCp_R_ref(double *cprt) const override
Returns the vector of nondimensional constant pressure heat capacities of the reference state at the ...
void getPartialMolarIntEnergies(double *ubar) const override
Get the species partial molar internal energies. Units: J/kmol.
double m_cp0_R
Dimensionless heat capacity at the (mtlast, m_p0)
double cp_mole() const override
Molar heat capacity at constant pressure. Units: J/kmol/K.
void setState_SV(double s, double v, double tol=1e-9) override
Set the specific entropy (J/kg/K) and specific volume (m^3/kg).
void getPartialMolarCp(double *cpbar) const override
Get the species partial molar Heat Capacities. Units: J/ kmol /K.
double gibbs_mole() const override
Molar Gibbs function. Units: J/kmol.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
void getStandardVolumes(double *vbar) const override
Get the molar volumes of each species in their standard states at the current T and P of the solution...
void _updateThermo() const
This internal routine calculates new species Cp0, H0, and S0 whenever the temperature has changed.
void setState_UV(double u, double v, double tol=1e-9) override
Set the specific internal energy (J/kg) and specific volume (m^3/kg).
void getGibbs_RT_ref(double *grt) const override
Returns the vector of nondimensional Gibbs Free Energies of the reference state at the current temper...
void setState_SP(double s, double p, double tol=1e-9) override
Set the specific entropy (J/kg/K) and pressure (Pa).
void getPartialMolarEntropies(double *sbar) const override
Get the species partial molar entropy. Units: J/kmol K.
void getEnthalpy_RT_ref(double *hrt) const override
Returns the vector of nondimensional enthalpies of the reference state at the current temperature of ...
virtual void getEntropy_R(double *sr) const
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
Definition: ThermoPhase.h:880
virtual double thermalExpansionCoeff() const
Return the volumetric thermal expansion coefficient. Units: 1/K.
Definition: ThermoPhase.h:580
virtual void setState_TP(double t, double p)
Set the temperature (K) and pressure (Pa)
double RT() const
Return the Gas Constant multiplied by the current temperature.
Definition: ThermoPhase.h:1062
double m_tlast
last value of the temperature processed by reference state
Definition: ThermoPhase.h:1985
virtual void getIntEnergy_RT(double *urt) const
Returns the vector of nondimensional Internal Energies of the standard state species at the current T...
Definition: ThermoPhase.h:911
virtual void getCp_R(double *cpr) const
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
Definition: ThermoPhase.h:922
virtual double isothermalCompressibility() const
Returns the isothermal compressibility. Units: 1/Pa.
Definition: ThermoPhase.h:569
virtual void getGibbs_RT(double *grt) const
Get the nondimensional Gibbs functions for the species in their standard states at the current T and ...
Definition: ThermoPhase.h:890
double cv_mass() const
Specific heat at constant volume. Units: J/kg/K.
Definition: ThermoPhase.h:1053
double entropy_mass() const
Specific entropy. Units: J/kg/K.
Definition: ThermoPhase.h:1038
virtual void getStandardChemPotentials(double *mu) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
Definition: ThermoPhase.h:860
virtual void getEnthalpy_RT(double *hrt) const
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
Definition: ThermoPhase.h:870
double cp_mass() const
Specific heat at constant pressure. Units: J/kg/K.
Definition: ThermoPhase.h:1048
double intEnergy_mass() const
Specific internal energy. Units: J/kg.
Definition: ThermoPhase.h:1033
MultiSpeciesThermo m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
Definition: ThermoPhase.h:1962
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
double enthalpy_mass() const
Specific enthalpy. Units: J/kg.
Definition: ThermoPhase.h:1028
This file contains definitions for utility functions and text for modules, inputfiles and logging,...
T clip(const T &value, const T &lower, const T &upper)
Clip value such that lower <= value <= upper.
Definition: global.h:329
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition: ct_defs.h:120
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564
Contains declarations for string manipulation functions within Cantera.