Cantera  2.0
Oxygen.cpp
1 // Oxygen
2 
3 #include "Oxygen.h"
4 #include <math.h>
5 
6 namespace tpx
7 {
8 
9 static const double
10 M = 31.9994,
11 Tmn = 54.34,
12 Tmx = 2000.0,
13 Tc = 154.581,
14 Pc = 5.0429e6,
15 Roc = 436.15,
16 To = 54.34,
17 R = 2.59820853437877e2,
18 Gamma = 5.46895508389297e-6,
19 alpha = 1.91576,
20 beta = 2239.18105,
21 u0 = 198884.2435,
22 s0 = 668.542976;
23 
24 static const double Aoxy[] = {
25  -4.26396872798684e-1, 3.48334938784107e1, -5.77516910418738e2,
26  2.40961751553325e4, -1.23332307855543e6, 3.73585286319658e-4,
27  -1.70178244046465e-1 ,-3.33226903068473e-4, 8.61334799901291e3,
28  -6.80394661057309e-7, 7.09583347162704e-4, -5.73905688255053e-2,
29  -1.92123080811409e-7, 3.11764722329504e-8, -8.09463854745591e-6,
30  -2.22562296356501e-11, 9.18401045361994e-15, 5.75758417511114e-12,
31  -2.10752269644774e-15, 3.62884761272184e3, -1.23317754317110e6,
32  -5.03800414800672e-2, 3.30686173177055e2, -5.26259633964252e-8 ,
33  5.53075442383100e-6, -2.71042853363688e-13, -1.65732450675251e-9 ,
34  -5.82711196409204e-20, 4.42953322148281e-17 ,-2.95529679136244e-25,
35  -1.92361786708846e-23, 9.43758410350413e-23
36 };
37 
38 static const double Foxy[] = {
39  -5.581932039e2, -1.0966262185e2, -8.3456211630e-2,
40  2.6603644330e-3, 1.6875023830e-5, -2.1262477120e-7,
41  9.5741096780e-10, -1.6617640450e-12, 2.7545605710e1
42 };
43 
44 static const double Doxy[] =
45 { 4.3615175e2, 7.5897189e2, -4.2576866e2, 2.3487106e3, -3.0474660e3, 1.4850169e3 };
46 
47 static const double Goxy[] = {
48  -1.29442711174062e6, 5.98231747005341e4, -8.97850772730944e2,
49  6.55236176900400e2, -1.13131252131570e-2,
50  3.4981070244228e-6, 4.21065222886885e-9, 2.67997030050139e2
51 };
52 
53 //equation P4
54 
55 double oxygen::C(int i, double rt, double rt2)
56 {
57  switch (i) {
58  case 0 :
59  return Aoxy[0] * T + Aoxy[1] * sqrt(T) + Aoxy[2] + (Aoxy[3] + Aoxy[4] * rt) * rt;
60  case 1 :
61  return Aoxy[5] * T + Aoxy[6] + rt * (Aoxy[7] + Aoxy[8] * rt);
62  case 2 :
63  return Aoxy[9] * T + Aoxy[10] + Aoxy[11] * rt;
64  case 3 :
65  return Aoxy[12];
66  case 4 :
67  return rt*(Aoxy[13] + Aoxy[14]*rt);
68  case 5 :
69  return Aoxy[15]*rt;
70  case 6 :
71  return rt*(Aoxy[16] + Aoxy[17]*rt);
72  case 7 :
73  return Aoxy[18]*rt2;
74  case 8 :
75  return rt2*(Aoxy[19] + Aoxy[20]*rt);
76  case 9 :
77  return rt2*(Aoxy[21] + Aoxy[22]*rt2);
78  case 10 :
79  return rt2*(Aoxy[23] + Aoxy[24]*rt);
80  case 11 :
81  return rt2*(Aoxy[25] + Aoxy[26]*rt2);
82  case 12 :
83  return rt2*(Aoxy[27] + Aoxy[28]*rt);
84  case 13 :
85  return rt2*(Aoxy[29] + Aoxy[30]*rt + Aoxy[31]*rt2);
86  default :
87  return 0.0;
88  }
89 }
90 
91 double oxygen::Cprime(int i, double rt, double rt2, double rt3)
92 {
93  switch (i) {
94  case 0 :
95  return Aoxy[0] + 0.5*Aoxy[1]/sqrt(T) - (Aoxy[3] + 2.0*Aoxy[4]*rt)*rt2;
96  case 1 :
97  return Aoxy[5] - rt2*(Aoxy[7] + 2.0*Aoxy[8]*rt);
98  case 2 :
99  return Aoxy[9] - Aoxy[11]*rt2;
100  case 3 :
101  return 0.0;
102  case 4 :
103  return -rt2*(Aoxy[13] + 2.0*Aoxy[14]*rt);
104  case 5 :
105  return -Aoxy[15]*rt2;
106  case 6 :
107  return -rt2*(Aoxy[16] + 2.0*Aoxy[17]*rt);
108  case 7 :
109  return -2.0*Aoxy[18]*rt3;
110  case 8 :
111  return -rt3*(2.0*Aoxy[19] + 3.0*Aoxy[20]*rt);
112  case 9 :
113  return -rt3*(2.0*Aoxy[21] + 4.0*Aoxy[22]*rt2);
114  case 10 :
115  return -rt3*(2.0*Aoxy[23] + 3.0*Aoxy[24]*rt);
116  case 11 :
117  return -rt3*(2.0*Aoxy[25] + 4.0*Aoxy[26]*rt2);
118  case 12 :
119  return -rt3*(2.0*Aoxy[27] + 3.0*Aoxy[28]*rt);
120  case 13 :
121  return -rt3*(2.0*Aoxy[29] + 3.0*Aoxy[30]*rt + 4.0*Aoxy[31]*rt2);
122  default :
123  return 0.0;
124  }
125 }
126 
127 double oxygen::W(int n, double egrho)
128 {
129  return (n == 0 ? (1.0 - egrho)/(2.0*Gamma) :
130  (n*W(n-1, egrho) - 0.5*pow(Rho,2*n)*egrho)/Gamma);
131 }
132 
133 double oxygen::H(int i, double egrho)
134 {
135  return (i < 8 ? pow(Rho,i+2) : pow(Rho,2*i-13)*egrho);
136 }
137 
138 double oxygen::I(int i, double egrho)
139 {
140  return (i < 8 ? pow(Rho,i+1)/double(i+1) : W(i-8, egrho));
141 }
142 
143 double oxygen::up()
144 {
145  double rt = 1.0/T;
146  double rt2 = rt*rt;
147  double rt3 = rt*rt2;
148  double egrho = exp(-Gamma*Rho*Rho);
149 
150  double sum = 0.0;
151  for (int i=0; i<14; i++) {
152  sum += (C(i,rt,rt2) - T*Cprime(i,rt,rt2,rt3))*I(i,egrho);
153  }
154 
155  sum += (((0.25*Goxy[6]*T + Goxy[5]/3.0)*T + 0.5*Goxy[4])*T + Goxy[3])*T + Goxy[2]*log(T)
156  - (Goxy[1] + 0.5*Goxy[0]*rt)*rt + Goxy[7]*beta/(exp(beta*rt) - 1.0) + u0;
157 
158  return sum + m_energy_offset;
159 }
160 
161 double oxygen::sp()
162 {
163  double rt = 1.0/T;
164  double rt2 = rt*rt;
165  double rt3 = rt*rt2;
166  double egrho = exp(-Gamma*Rho*Rho);
167 
168  double sum = 0.0;
169  sum = s0 - R*log(Rho);
170  for (int i=0; i<14; i++) {
171  sum -= Cprime(i,rt,rt2,rt3)*I(i,egrho);
172  }
173 
174  sum += (((Goxy[6]/3.0)*T + 0.5*Goxy[5])*T + Goxy[4])*T + Goxy[3]*log(T)
175  -((Goxy[0]*rt/3.0 + 0.5*Goxy[1])*rt + Goxy[2])*rt
176  + Goxy[7]*(beta*rt + beta*rt/(exp(beta*rt) - 1.0)
177  - log(exp(beta*rt) - 1.0));
178  return sum + m_entropy_offset;
179 }
180 
181 double oxygen::Pp()
182 {
183  double rt = 1.0/T;
184  double rt2 = rt*rt;
185  //double rt3 = rt*rt2;
186  double egrho = exp(-Gamma*Rho*Rho);
187 
188  double P = Rho*R*T;
189  for (int i=0; i<14; i++) {
190  P += C(i,rt,rt2)*H(i,egrho);
191  }
192  return P;
193 }
194 
195 //equation s4
196 double oxygen::Psat()
197 {
198  double lnp;
199  int i;
200  if ((T < Tmn) || (T > Tc)) {
201  set_Err(TempError);
202  }
203  for (i=0, lnp=0; i<=7; i++) {
204  if (i==3) {
205  lnp+=Foxy[i]*pow(Tc-T, alpha);
206  } else {
207  lnp+=Foxy[i]*pow(T,i-1);
208  }
209  }
210  lnp+=Foxy[8]*log(T);
211  return exp(lnp);
212 }
213 
214 //equation D2
215 double oxygen::ldens()
216 {
217  double xx=1-T/Tc, sum=0;
218  if ((T < Tmn) || (T > Tc)) {
219  set_Err(TempError);
220  }
221  for (int i=0; i<=5; i++) {
222  sum+=Doxy[i]*pow(xx,double(i)/3.0);
223  }
224  return sum;
225 }
226 
227 double oxygen::Tcrit()
228 {
229  return Tc;
230 }
231 double oxygen::Pcrit()
232 {
233  return Pc;
234 }
235 double oxygen::Vcrit()
236 {
237  return 1.0/Roc;
238 }
239 double oxygen::Tmin()
240 {
241  return Tmn;
242 }
243 double oxygen::Tmax()
244 {
245  return Tmx;
246 }
247 char* oxygen::name()
248 {
249  return (char*) m_name.c_str();
250 }
251 char* oxygen::formula()
252 {
253  return (char*) m_formula.c_str();
254 }
255 double oxygen::MolWt()
256 {
257  return M;
258 }
259 
260 }