Cantera 2.6.0

Sub.h
Go to the documentation of this file.
1//! @file Sub.h
2
3// This file is part of Cantera. See License.txt in the top-level directory or
4// at https://cantera.org/license.txt for license and copyright information.
5
6#ifndef TPX_SUB_H
7#define TPX_SUB_H
8
9#include "cantera/base/ctexceptions.h"
10#include <algorithm>
11
12 namespace tpx
13{
14
15 namespace PropertyPair
16{
17 enum type {
18 TV = 12, HP = 34, SP = 54, PV = 42, TP = 14, UV = 62, ST = 51,
19 SV = 52, UP = 64, VH = 23, TH = 13, SH = 53, PX = 47, TX = 17,
20 VT = -12, PH = -34, PS = -54, VP = -42, PT = -14, VU = -62, TS = -51,
21 VS = -52, PU = -64, HV = -23, HT = -13, HS = -53, XP = -47, XT = -17
22};
23}
24
25 const int Pgiven = 0, Tgiven = 1;
26
27 namespace propertyFlag
28{
29 enum type { H, S, U, V, P, T };
30}
31
32 const double Undef = 999.1234;
33
34/*!
35 * Base class from which all pure substances are derived
36 */
37 class Substance
38{
39 public:
40 Substance();
41
42 virtual ~Substance() {}
43
44 void setStdState(double h0 = 0.0, double s0 = 0.0,
45 double t0 = 298.15, double p0 = 1.01325e5);
46
47 //! @name Information about a substance
48 //! @{
49
50 //! Molecular weight [kg/kmol]
51 virtual double MolWt()=0;
52
53 //! Critical temperature [K]
54 virtual double Tcrit()=0;
55
56 //! Critical pressure [Pa]
57 virtual double Pcrit()=0;
58
59 //! Critical specific volume [m^3/kg]
60 virtual double Vcrit()=0;
61
62 //! Minimum temperature for which the equation of state is valid
63 virtual double Tmin()=0;
64
65 //! Maximum temperature for which the equation of state is valid
66 virtual double Tmax()=0;
67
68 //! Name of the substance
69 const char* name() {
70 return m_name.c_str();
71 }
72
73 //! Chemical formula for the substance
74 const char* formula() {
75 return m_formula.c_str();
76 }
77
78 //! @}
79
80 //! @name Properties
81 //! @{
82
83 //! Pressure [Pa]. If two phases are present, return the saturation
84 //! pressure; otherwise return the pressure computed directly from the
85 //! underlying eos.
86 double P();
87
88 //! Temperature [K]
89 double Temp() {
90 return T;
91 }
92
93 //! Specific volume [m^3/kg]
94 double v() {
95 return prop(propertyFlag::V);
96 }
97
98 //! Internal energy [J/kg]
99 double u() {
100 return prop(propertyFlag::U);
101 }
102
103 //! Enthalpy [J/kg]
104 double h() {
105 return prop(propertyFlag::H);
106 }
107
108 //! Entropy [J/kg/K]
109 double s() {
110 return prop(propertyFlag::S);
111 }
112
113 //! Helmholtz function [J/kg]
114 double f() {
115 return u() - T*s();
116 }
117
118 //! Gibbs function [J/kg]
119 double g() {
120 return h() - T*s();
121 }
122
123 //! Specific heat at constant volume [J/kg/K]
124 virtual double cv();
125
126 //! Specific heat at constant pressure [J/kg/K]
127 virtual double cp();
128
129 virtual double thermalExpansionCoeff();
130
131 virtual double isothermalCompressibility();
132
133 //! @}
134 //! @name Saturation Properties
135 //! @{
136
137 double Ps();
138
139 //! The derivative of the saturation pressure with respect to temperature.
140 virtual double dPsdT();
141
142 //! Saturation temperature at pressure *p*.
143 double Tsat(double p);
144
145 //! Vapor mass fraction. If T >= Tcrit, 0 is returned for v < Vcrit, and 1
146 //! is returned if v > Vcrit.
147 double x();
148
149 //! Returns 1 if the current state is a liquid/vapor mixture, 0 otherwise.
150 //! By default, saturated vapor and saturated liquid are included; setting
151 //! the flag *strict* to true will exclude the boundaries.
152 int TwoPhase(bool strict=false);
153 //! @}
154
155 virtual double Pp()=0;
156
157 //! Enthaply of a single-phase state
158 double hp() {
159 return up() + Pp()/Rho;
160 }
161
162 //! Gibbs function of a single-phase state
163 double gp() {
164 return hp() - T*sp();
165 }
166
167 double prop(propertyFlag::type ijob);
168
169 //! set T and P
170 void set_TPp(double t0, double p0);
171
172 //! Function to set or change the state for a property pair *XY* where
173 //! *x0* is the value of first property and *y0* is the value of the
174 //! second property.
175 void Set(PropertyPair::type XY, double x0, double y0);
176
177 protected:
178 double T, Rho;
179 double Tslast, Rhf, Rhv;
180 double Pst;
181 double m_energy_offset;
182 double m_entropy_offset;
183 std::string m_name;
184 std::string m_formula;
185
186 virtual double ldens()=0;
187
188 //! Saturation pressure, Pa
189 virtual double Psat()=0;
190
191 //! Internal energy of a single-phase state
192 virtual double up()=0;
193
194 //! Entropy of a single-phase state
195 virtual double sp()=0;
196
197 virtual int ideal() {
198 return 0;
199 }
200
201 double vp() {
202 return 1.0/Rho;
203 }
204
205 //! Uses the lever rule to set state in the dome. Returns 1 if in dome,
206 //! 0 if not, in which case state not set.
207 int Lever(int itp, double sat, double val, propertyFlag::type ifunc);
208
209 //! Update saturated liquid and vapor densities and saturation pressure
210 void update_sat();
211
212 private:
213 void set_Rho(double r0);
214 void set_T(double t0);
215 void set_v(double v0);
216 void BracketSlope(double p);
217 double vprop(propertyFlag::type ijob);
218 void set_xy(propertyFlag::type if1, propertyFlag::type if2,
219 double X, double Y,
220 double atx, double aty, double rtx, double rty);
221
222 int kbr;
223 double Vmin, Vmax;
224 double Pmin, Pmax;
225 double dvbf, dv;
226 double v_here, P_here;
227};
228
229}
230
231#endif
tpx::Substance
Definition: Sub.h:38
tpx::Substance::up
virtual double up()=0
Internal energy of a single-phase state.
tpx::Substance::formula
const char * formula()
Chemical formula for the substance.
Definition: Sub.h:74
tpx::Substance::Vcrit
virtual double Vcrit()=0
Critical specific volume [m^3/kg].
tpx::Substance::hp
double hp()
Enthaply of a single-phase state.
Definition: Sub.h:158
tpx::Substance::TwoPhase
int TwoPhase(bool strict=false)
Returns 1 if the current state is a liquid/vapor mixture, 0 otherwise.
Definition: Sub.cpp:263
tpx::Substance::cp
virtual double cp()
Specific heat at constant pressure [J/kg/K].
Definition: Sub.cpp:93
tpx::Substance::gp
double gp()
Gibbs function of a single-phase state.
Definition: Sub.h:163
tpx::Substance::x
double x()
Vapor mass fraction.
Definition: Sub.cpp:275
tpx::Substance::Tmax
virtual double Tmax()=0
Maximum temperature for which the equation of state is valid.
tpx::Substance::u
double u()
Internal energy [J/kg].
Definition: Sub.h:99
tpx::Substance::MolWt
virtual double MolWt()=0
Molecular weight [kg/kmol].
tpx::Substance::h
double h()
Enthalpy [J/kg].
Definition: Sub.h:104
tpx::Substance::cv
virtual double cv()
Specific heat at constant volume [J/kg/K].
Definition: Sub.cpp:55
tpx::Substance::Temp
double Temp()
Temperature [K].
Definition: Sub.h:89
tpx::Substance::Tmin
virtual double Tmin()=0
Minimum temperature for which the equation of state is valid.
tpx::Substance::Lever
int Lever(int itp, double sat, double val, propertyFlag::type ifunc)
Uses the lever rule to set state in the dome.
Definition: Sub.cpp:590
tpx::Substance::g
double g()
Gibbs function [J/kg].
Definition: Sub.h:119
tpx::Substance::P
double P()
Pressure [Pa].
Definition: Sub.cpp:48
tpx::Substance::name
const char * name()
Name of the substance.
Definition: Sub.h:69
tpx::Substance::sp
virtual double sp()=0
Entropy of a single-phase state.
tpx::Substance::Psat
virtual double Psat()=0
Saturation pressure, Pa.
tpx::Substance::f
double f()
Helmholtz function [J/kg].
Definition: Sub.h:114
tpx::Substance::v
double v()
Specific volume [m^3/kg].
Definition: Sub.h:94
tpx::Substance::Tcrit
virtual double Tcrit()=0
Critical temperature [K].
tpx::Substance::Set
void Set(PropertyPair::type XY, double x0, double y0)
Function to set or change the state for a property pair XY where x0 is the value of first property an...
Definition: Sub.cpp:346
tpx::Substance::Pcrit
virtual double Pcrit()=0
Critical pressure [Pa].
tpx::Substance::dPsdT
virtual double dPsdT()
The derivative of the saturation pressure with respect to temperature.
Definition: Sub.cpp:246
tpx::Substance::Tsat
double Tsat(double p)
Saturation temperature at pressure p.
Definition: Sub.cpp:293
tpx::Substance::update_sat
void update_sat()
Update saturated liquid and vapor densities and saturation pressure.
Definition: Sub.cpp:508
tpx::Substance::set_TPp
void set_TPp(double t0, double p0)
set T and P
Definition: Sub.cpp:781
tpx::Substance::s
double s()
Entropy [J/kg/K].
Definition: Sub.h:109
ctexceptions.h
Definitions for the classes that are thrown when Cantera experiences an error condition (also contain...
Cantera::Undef
const double Undef
Fairly random number to be used to initialize variables against to see if they are subsequently defin...
Definition: ct_defs.h:161