Cantera  3.1.0
Loading...
Searching...
No Matches
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
15namespace 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
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
107void 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
120void SingleSpeciesTP::getPureGibbs(double* gpure) const
121{
122 getGibbs_RT(gpure);
123 gpure[0] *= RT();
124}
125
127{
128 vbar[0] = molecularWeight(0) / density();
129}
130
131// ---- Thermodynamic Values for the Species Reference States -------
132
134{
136 hrt[0] = m_h0_RT;
137}
138
139void SingleSpeciesTP::getGibbs_RT_ref(double* grt) const
140{
142 grt[0] = m_h0_RT - m_s0_R;
143}
144
145void SingleSpeciesTP::getGibbs_ref(double* g) const
146{
148 g[0] *= RT();
149}
150
152{
154 er[0] = m_s0_R;
155}
156
157void SingleSpeciesTP::getCp_R_ref(double* cpr) const
158{
160 cpr[0] = m_cp0_R;
161}
162
163// ------------------ Setting the State ------------------------
164
165void 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
180void 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);
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
199void 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
214void 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);
225 if (fabs(dt / temperature()) < tol) {
226 return;
227 }
228 }
229 throw CanteraError("SingleSpeciesTP::setState_SV",
230 "no convergence. dt = {}", dt);
231}
232
233bool 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) {
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.
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:854
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...
virtual double thermalExpansionCoeff() const
Return the volumetric thermal expansion coefficient. Units: 1/K.
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.
double m_tlast
last value of the temperature processed by reference state
virtual void getIntEnergy_RT(double *urt) const
Returns the vector of nondimensional Internal Energies of the standard state species at the current T...
virtual void getCp_R(double *cpr) const
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
virtual double isothermalCompressibility() const
Returns the isothermal compressibility. Units: 1/Pa.
virtual void getGibbs_RT(double *grt) const
Get the nondimensional Gibbs functions for the species in their standard states at the current T and ...
double cv_mass() const
Specific heat at constant volume. Units: J/kg/K.
double entropy_mass() const
Specific entropy. Units: J/kg/K.
virtual void getStandardChemPotentials(double *mu) const
Get the array of chemical potentials at unit activity for the species at their standard states at the...
virtual void getEnthalpy_RT(double *hrt) const
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
double cp_mass() const
Specific heat at constant pressure. Units: J/kg/K.
double intEnergy_mass() const
Specific internal energy. Units: J/kg.
MultiSpeciesThermo m_spthermo
Pointer to the calculation manager for species reference-state thermodynamic properties.
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
double enthalpy_mass() const
Specific enthalpy. Units: J/kg.
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:325
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition ct_defs.h:120
Namespace for the Cantera kernel.
Definition AnyMap.cpp:595
Contains declarations for string manipulation functions within Cantera.