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