5 using namespace Cantera;
20 Gamma = 1.008854772e-3,
28 static const double Ahydro[] = {
29 1.150470519352900e1, 1.055427998826072e3, -1.270685949968568e4,
30 7.287844527295619e4, -7.448780703363973e5, 2.328994151810363e-1,
31 -1.635308393739296e1, 3.730678064960389e3, 6.299667723184813e5,
32 1.210920358305697e-3, 1.753651095884817, -1.367022988058101e2,
33 -6.869936641299885e-3, 3.644494201750974e-2, -2.559784772600182,
34 -4.038855202905836e-4, 1.485396303520942e-6, 4.243613981060742e-4,
35 -2.307910113586888e-6, -6.082192173879582e5, -1.961080967486886e6,
36 -5.786932854076408e2, 2.799129504191752e4, -2.381566558300913e-1,
37 8.918796032452872e-1, -6.985739539036644e-5, -7.339554179182899e-3,
38 -5.597033440289980e-9, 8.842130160884514e-8, -2.655507264539047e-12,
39 -4.544474518140164e-12, 9.818775257001922e-11
41 static const double Dhydro[]= {
42 4.8645813003e1, -3.4779278180e1, 4.0776538192e2,
43 -1.1719787304e3, 1.6213924400e3, -1.1531096683e3, 3.3825492039e2
45 static const double Fhydro[]=
46 { 3.05300134164, 2.80810925813, -6.55461216567e-1, 1.59514439374 };
47 static const double Ghydro[]= {
48 6.1934792e3, 2.9490437e2, -1.5401979e3, -4.9176101e3,
49 6.8957165e4, -2.2282185e5, 3.7990059e5, -3.7094216e5, 2.1326792e5,
50 -7.1519411e4, 1.2971743e4, -9.8533014e2, 1.0434776e4,
51 -3.9144179e2, 5.8277696e2, 6.5409163e2, -1.8728847e2
54 double hydrogen::C(
int i,
double rt,
double rt2)
58 return Ahydro[0] * T + Ahydro[1] * sqrt(T) + Ahydro[2] + (Ahydro[3] + Ahydro[4] * rt) * rt;
60 return Ahydro[5] * T + Ahydro[6] + rt * (Ahydro[7] + Ahydro[8] * rt);
62 return Ahydro[9] * T + Ahydro[10] + Ahydro[11] * rt;
66 return rt*(Ahydro[13] + Ahydro[14]*rt);
70 return rt*(Ahydro[16] + Ahydro[17]*rt);
72 return Ahydro[18]*rt2;
74 return rt2*(Ahydro[19] + Ahydro[20]*rt);
76 return rt2*(Ahydro[21] + Ahydro[22]*rt2);
78 return rt2*(Ahydro[23] + Ahydro[24]*rt);
80 return rt2*(Ahydro[25] + Ahydro[26]*rt2);
82 return rt2*(Ahydro[27] + Ahydro[28]*rt);
84 return rt2*(Ahydro[29] + Ahydro[30]*rt + Ahydro[31]*rt2);
90 double hydrogen::Cprime(
int i,
double rt,
double rt2,
double rt3)
94 return Ahydro[0] + 0.5*Ahydro[1]/sqrt(T) - (Ahydro[3] + 2.0*Ahydro[4]*rt)*rt2;
96 return Ahydro[5] - rt2*(Ahydro[7] + 2.0*Ahydro[8]*rt);
98 return Ahydro[9] - Ahydro[11]*rt2;
102 return -rt2*(Ahydro[13] + 2.0*Ahydro[14]*rt);
104 return -Ahydro[15]*rt2;
106 return -rt2*(Ahydro[16] + 2.0*Ahydro[17]*rt);
108 return -2.0*Ahydro[18]*rt3;
110 return -rt3*(2.0*Ahydro[19] + 3.0*Ahydro[20]*rt);
112 return -rt3*(2.0*Ahydro[21] + 4.0*Ahydro[22]*rt2);
114 return -rt3*(2.0*Ahydro[23] + 3.0*Ahydro[24]*rt);
116 return -rt3*(2.0*Ahydro[25] + 4.0*Ahydro[26]*rt2);
118 return -rt3*(2.0*Ahydro[27] + 3.0*Ahydro[28]*rt);
120 return -rt3*(2.0*Ahydro[29] + 3.0*Ahydro[30]*rt + 4.0*Ahydro[31]*rt2);
126 double hydrogen::W(
int n,
double egrho)
128 return (n == 0 ? (1.0 - egrho)/(2.0*Gamma) :
129 (n*W(n-1, egrho) - 0.5*pow(Rho,2*n)*egrho)/Gamma);
132 double hydrogen::H(
int i,
double egrho)
134 return (i < 8 ? pow(Rho,i+2) : pow(Rho,2*i-13)*egrho);
137 double hydrogen::I(
int i,
double egrho)
139 return (i < 8 ? pow(Rho,i+1)/
double(i+1) : W(i-8, egrho));
142 double hydrogen::icv(
int i,
double x,
double xlg)
144 return (i == 0 ? x - 1 : x*pow(xlg,i) - i*icv(i-1,x,xlg));
147 double hydrogen::up()
152 double egrho = exp(-Gamma*Rho*Rho);
154 for (
int i=0; i<14; i++) {
155 sum += (C(i, rt, rt2) - T*Cprime(i, rt, rt2, rt3))*I(i, egrho);
159 sum += Ghydro[0] * (std::min(T, T1) - To);
161 double x = std::min(T, T2) / T1;
162 for (
int i = 0; i < 12; i++) {
163 sum += Ghydro[i] * T1 * icv(i, x, log(x));
168 for (
int i = 0; i < 5; i++) {
169 sum += Ghydro[i+12] * T2 * icv(i, x, log(x));
173 return sum + m_energy_offset;
176 double hydrogen::sp()
181 double egrho = exp(-Gamma*Rho*Rho);
182 double sum = s0 - R*log(Rho);
183 for (
int i=0; i<14; i++) {
184 sum -= Cprime(i, rt, rt2, rt3)*I(i, egrho);
188 sum += Ghydro[0] * log(std::min(T, T1)/ To);
190 double xlg = log(std::min(T, T2)/T1);
191 for (
int i = 0; i < 12; i++) {
192 sum += Ghydro[i] / (i + 1) * pow(xlg, i+1);
196 double xlg = log(T/T2);
197 for (
int i = 0; i < 5; i++) {
198 sum += Ghydro[i+12] / (i + 1) * pow(xlg, i+1);
202 return sum + m_entropy_offset;
205 double hydrogen::Pp()
209 double egrho = exp(-Gamma*Rho*Rho);
212 for (
int i=0; i<14; i++) {
213 P += C(i, rt, rt2)*H(i, egrho);
218 double hydrogen::ldens()
220 if ((T < Tmn) || (T > Tc)) {
221 throw TPX_Error(
"hydrogen::ldens",
222 "Temperature out of range. T = " +
fp2str(T));
227 for (i=1, sum=0; i<=6; i++) {
228 sum+=Dhydro[i]*pow(x, 1+
double(i-1)/3.0);
230 return sum+Roc+Dhydro[0]*pow(x,alpha1);
233 double hydrogen::Psat()
235 double x = (1.0 - Tt/T)/(1.0 - Tt/Tc);
237 if ((T < Tmn) || (T > Tc)) {
238 throw TPX_Error(
"hydrogen::Psat",
239 "Temperature out of range. T = " +
fp2str(T));
241 result = Fhydro[0]*x + Fhydro[1]*x*x + Fhydro[2]*x*x*x +
242 Fhydro[3]*x*pow(1-x, alpha);
243 return exp(result)*Pt;
246 double hydrogen::Tcrit()
250 double hydrogen::Pcrit()
254 double hydrogen::Vcrit()
258 double hydrogen::Tmin()
262 double hydrogen::Tmax()
266 double hydrogen::MolWt()
std::string fp2str(const double x, const std::string &fmt)
Convert a double into a c++ string.
Contains declarations for string manipulation functions within Cantera.