Cantera 2.6.0

Heptane.cpp
Go to the documentation of this file.
1/**
2 * @file Heptane.cpp representation of substance Heptane.
3 *
4 * Values and functions are from "Thermodynamic Properties in SI" by W.C.
5 * Reynolds. AUTHOR: jrh@stanford.edu: GCEP, Stanford University
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
11#include "Heptane.h"
12#include "cantera/base/stringUtils.h"
13
14 using namespace Cantera;
15
16 namespace tpx
17{
18
19// Heptane constants
20 static const double Tmn = 182.56; // [K] minimum temperature for which calculations are valid
21 static const double Tmx = 1000.0; // [K] maximum temperature for which calculations are valid
22 static const double Tc=537.68; // [K] critical temperature
23 static const double Roc=197.60; // [kg/m^3] critical density
24 static const double To=300; // [K] reference Temperature
25 static const double R=82.99504; // [J/(kg*K)] gas constant (for this substance)
26 static const double Gamma=9.611604E-6; // [??]
27 static const double u0=3.4058439E5; // [] internal energy at To
28 static const double s0=1.1080254E3; // [] entropy at To
29 static const double Tp=400; // [K] ??
30 static const double Pc=2.6199E6; // [Pa] critical pressure
31 static const double M=100.20; // [kg/kmol] molar density
32
33// array Ahept is used by the function Pp
34 static const double Ahept[]= {
35 2.246032E-3,
36 2.082990E2,
37 5.085746E7,
38 3.566396E9,
39 1.622168E9,
40 1.065237E-5,
41 5.987922E-1,
42 7.736602,
43 1.929386E5,
44 5.291379E-9
45};
46
47// array F is used by Psat
48 static const double F[]= {
49 -7.2298764,
50 3.8607475E-1,
51 -3.4216472,
52 4.6274432E-1,
53 -9.7926124,
54 -4.2058094E1,
55 7.5468678E1,
56 3.1758992E2
57};
58
59// array D is used by the function ldens
60 static const double D[]= {
61 1.9760405E2,
62 8.9451237E2,
63 -1.1462908E3,
64 1.7996947E3,
65 -1.7250843E3,
66 9.7088329E2
67};
68
69// array G is used by the function sp
70 static const double G[]= {
71 1.1925213E5,
72 -7.7231363E2,
73 7.4463527,
74 -3.0888167E-3,
75 0.0,
76 0.0
77};
78
79 double Heptane::C(int j,double Tinverse, double T2inverse, double T3inverse, double T4inverse)
80{
81 switch (j) {
82 case 0:
83 return Ahept[0] * R * T -
84 Ahept[1] -
85 Ahept[2] * T2inverse +
86 Ahept[3] * T3inverse -
87 Ahept[4] * T4inverse;
88 case 1:
89 return Ahept[5] * R * T -
90 Ahept[6] -
91 Ahept[7] * Tinverse;
92 case 2:
93 return Ahept[9] * (Ahept[6] + Ahept[7] * Tinverse);
94 case 3:
95 return Ahept[8] * T2inverse;
96 default:
97 return 0.0;
98 }
99}
100
101 double Heptane::Cprime(int j, double T2inverse, double T3inverse, double T4inverse)
102{
103 switch (j) {
104 case 0:
105 return Ahept[0] * R -
106 -2 * Ahept[2] * T3inverse +
107 -3 * Ahept[3] * T4inverse -
108 -4 * Ahept[4] * pow(T, -5.0);
109 case 1:
110 return Ahept[5] * R -
111 -1 * Ahept[7] * T2inverse;
112 case 2:
113 return Ahept[9] * (-1 * Ahept[7] * T2inverse);
114 case 3:
115 return -2 * Ahept[8] * T3inverse;
116 default:
117 return 0.0;
118 }
119}
120
121 double Heptane::I(int j, double ergho, double Gamma)
122{
123 switch (j) {
124 case 0:
125 return Rho;
126 case 1:
127 return Rho * Rho / 2;
128 case 2:
129 return pow(Rho, 5.0)/ 5;
130 case 3:
131 return 1 / Gamma - (Gamma * Rho * Rho + 2) * ergho / (2 * Gamma);
132 default:
133 return 0.0;
134 }
135}
136
137 double Heptane::H(int i, double egrho)
138{
139 if (i < 2) {
140 return pow(Rho,i+2);
141 } else if (i == 2) {
142 return pow(Rho,6.0);
143 } else if (i == 3) {
144 return pow(Rho,3) * (1 + Gamma * Rho * Rho) * egrho;
145 } else {
146 return 0;
147 }
148}
149
150 double Heptane::up()
151{
152 double Tinverse = 1.0/T;
153 double T2inverse = pow(T, -2);
154 double T3inverse = pow(T, -3);
155 double T4inverse = pow(T, -4);
156 double egrho = exp(-Gamma*Rho*Rho);
157
158 double sum = 0.0;
159 int i;
160 for (i=1; i<=5; i++) {
161 sum += G[i]*(pow(T,i) - pow(To,i))/double(i);
162 }
163 sum += G[0]*log(T/To);
164 for (i=0; i<=6; i++) {
165 sum += (C(i, Tinverse, T2inverse, T3inverse, T4inverse) - T*Cprime(i,T2inverse, T3inverse, T4inverse))*I(i,egrho, Gamma);
166 }
167 sum += u0;
168 return sum + m_energy_offset;
169}
170
171 double Heptane::sp()
172{
173 double T2inverse = pow(T, -2);
174 double T3inverse = pow(T, -3);
175 double T4inverse = pow(T, -4);
176 double egrho = exp(-Gamma*Rho*Rho);
177
178 double sum = 0.0;
179 for (int i=2; i<=5; i++) {
180 sum += G[i]*(pow(T,i-1) - pow(To,i-1))/double(i-1);
181 }
182 sum += G[1]*log(T/To);
183 sum -= G[0]*(1.0/T - 1.0/To);
184 for (int i=0; i<=6; i++) {
185 sum -= Cprime(i,T2inverse, T3inverse, T4inverse)*I(i,egrho, Gamma);
186 }
187 sum += s0 - R*log(Rho);
188 return sum + m_entropy_offset;
189}
190
191 double Heptane::Pp()
192{
193 double Tinverse = pow(T,-1);
194 double T2inverse = pow(T, -2);
195 double T3inverse = pow(T, -3);
196 double T4inverse = pow(T, -4);
197 double egrho = exp(-Gamma*Rho*Rho);
198
199 double P = Rho*R*T;
200 for (int i=0; i<=3; i++) {
201 P += C(i,Tinverse, T2inverse, T3inverse, T4inverse)*H(i,egrho);
202 }
203 return P;
204}
205
206 double Heptane::Psat()
207{
208 double log, sum=0;
209 if ((T < Tmn) || (T > Tc)) {
210 throw CanteraError("Heptane::Psat",
211 "Temperature out of range. T = {}", T);
212 }
213 for (int i=1; i<=8; i++) {
214 sum += F[i-1] * pow((T/Tp -1),double(i-1));
215 }
216
217 log = ((Tc/T)-1)*sum;
218 return exp(log)*Pc;
219}
220
221 double Heptane::ldens()
222{
223 double xx=1-(T/Tc), sum=0;
224 if ((T < Tmn) || (T > Tc)) {
225 throw CanteraError("Heptane::ldens",
226 "Temperature out of range. T = {}", T);
227 }
228 for (int i=1; i<=6; i++) {
229 sum+=D[i-1]*pow(xx,double(i-1)/3.0);
230 }
231
232 return sum;
233}
234
235// The following functions allow users to get the properties of Heptane that
236// are not dependent on the state
237
238 double Heptane::Tcrit()
239{
240 return Tc;
241}
242 double Heptane::Pcrit()
243{
244 return Pc;
245}
246 double Heptane::Vcrit()
247{
248 return 1.0/Roc;
249}
250 double Heptane::Tmin()
251{
252 return Tmn;
253}
254 double Heptane::Tmax()
255{
256 return Tmx;
257}
258 double Heptane::MolWt()
259{
260 return M;
261}
262}
Heptane.h
Cantera::CanteraError
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:61
tpx::Heptane::Vcrit
double Vcrit()
Critical specific volume [m^3/kg].
Definition: Heptane.cpp:246
tpx::Heptane::Tmax
double Tmax()
Maximum temperature for which the equation of state is valid.
Definition: Heptane.cpp:254
tpx::Heptane::Tmin
double Tmin()
Minimum temperature for which the equation of state is valid.
Definition: Heptane.cpp:250
tpx::Heptane::MolWt
double MolWt()
Molecular weight [kg/kmol].
Definition: Heptane.cpp:258
tpx::Heptane::I
double I(int i, double, double)
Definition: Heptane.cpp:121
tpx::Heptane::sp
double sp()
Entropy. See Reynolds eqn (16) section 2.
Definition: Heptane.cpp:171
tpx::Heptane::Tcrit
double Tcrit()
Critical temperature [K].
Definition: Heptane.cpp:238
tpx::Heptane::H
double H(int i, double egrho)
Definition: Heptane.cpp:137
tpx::Heptane::C
double C(int jm, double, double, double, double)
Definition: Heptane.cpp:79
tpx::Heptane::Pp
double Pp()
Pressure. Equation P-2 in Reynolds.
Definition: Heptane.cpp:191
tpx::Heptane::Pcrit
double Pcrit()
Critical pressure [Pa].
Definition: Heptane.cpp:242
tpx::Heptane::Psat
double Psat()
Pressure at Saturation. Equation S-2 in Reynolds.
Definition: Heptane.cpp:206
tpx::Heptane::ldens
double ldens()
liquid density. Equation D2 in Reynolds.
Definition: Heptane.cpp:221
tpx::Heptane::up
double up()
Definition: Heptane.cpp:150
tpx::Heptane::Cprime
double Cprime(int i, double, double, double)
derivative of C(i)
Definition: Heptane.cpp:101
tpx::Substance::P
double P()
Pressure [Pa].
Definition: Sub.cpp:48
Cantera
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:557
stringUtils.h
Contains declarations for string manipulation functions within Cantera.