Cantera  2.1.2
Methane.cpp
Go to the documentation of this file.
1 //! @file Methane.cpp
2 #include "Methane.h"
4 
5 using namespace std;
6 using namespace Cantera;
7 
8 namespace tpx
9 {
10 static const double
11 M = 16.04996,
12 Tmn = 90.68,
13 Tmx = 1700.0,
14 Tc = 190.555,
15 Pc = 4.5988e6,
16 Roc= 160.43,
17 To = 90.68,
18 Tt = 90.68,
19 Pt=11743.5675,
20 R = 5.18253475866e2,
21 Gamma=3.72992471469e-5,
22 alpha = 1.5, //Used with Psat
23 alpha1 = .36, //used with ldens;
24 Rot=451.562,
25 beta=2009.152,
26 u0 = 357696.0858,
27 s0 = -1918.035071;
28 
29 static const double Ameth[] = {
30  -7.25929210183, 4.13766054566e2, -6.32167316855e3,
31  3.34015577724e5, -1.68253379982e7, 1.87884851902e-2, -1.18673201223e1,
32  2.09062618015e3, -4.07532656958e5, -5.73917603241e-5,4.37711441593e-2,
33  -4.38766500673, 1.13524630779e-5, -5.07028240949e-5, 2.28002199522e-2,
34  9.25611329590e-9, 1.33865662546e-10, -1.65439044196e-7, 1.81030980110e-10,
35  5.45753645958e5, -3.63192281933e7, 4.81463473761, 1.56633022620e5,
36  7.89977010972e-5, 1.39993881210e-2, -1.70656092212e-11, -4.55256623445e-5,
37  -2.29314170748e-14,8.31548197665e-12, 6.84673626259e-20,
38  -4.70845544152e-17, 5.21465091383e-16
39 };
40 
41 static const double Dmeth[]=
42 { -1.78860165e-1, 4.83847500e-2, -1.84898700e-2 };
43 
44 static const double Fmeth[]=
45 { 4.77748580, 1.76065363, -5.67888940e-1, 1.32786231 };
46 
47 static const double Gmeth[]=
48 { 1.34740610e3, 1.35512060e2, -2.93910458e1, 2.12774600, 2.44656600e3 };
49 
50 double methane::C(int i, double rt, double rt2)
51 {
52  switch (i) {
53  case 0 :
54  return Ameth[0] * T + Ameth[1] * sqrt(T) + Ameth[2] + (Ameth[3] + Ameth[4] * rt) * rt;
55  case 1 :
56  return Ameth[5] * T + Ameth[6] + rt * (Ameth[7] + Ameth[8] * rt);
57  case 2 :
58  return Ameth[9] * T + Ameth[10] + Ameth[11] * rt;
59  case 3 :
60  return Ameth[12];
61  case 4 :
62  return rt*(Ameth[13] + Ameth[14]*rt);
63  case 5 :
64  return Ameth[15]*rt;
65  case 6 :
66  return rt*(Ameth[16] + Ameth[17]*rt);
67  case 7 :
68  return Ameth[18]*rt2;
69  case 8 :
70  return rt2*(Ameth[19] + Ameth[20]*rt);
71  case 9 :
72  return rt2*(Ameth[21] + Ameth[22]*rt2);
73  case 10 :
74  return rt2*(Ameth[23] + Ameth[24]*rt);
75  case 11 :
76  return rt2*(Ameth[25] + Ameth[26]*rt2);
77  case 12 :
78  return rt2*(Ameth[27] + Ameth[28]*rt);
79  case 13 :
80  return rt2*(Ameth[29] + Ameth[30]*rt + Ameth[31]*rt2);
81  default :
82  return 0.0;
83  }
84 }
85 
86 double methane::Cprime(int i, double rt, double rt2, double rt3)
87 {
88  switch (i) {
89  case 0 :
90  return Ameth[0] + 0.5*Ameth[1]/sqrt(T) - (Ameth[3] + 2.0*Ameth[4]*rt)*rt2;
91  case 1 :
92  return Ameth[5] - rt2*(Ameth[7] + 2.0*Ameth[8]*rt);
93  case 2 :
94  return Ameth[9] - Ameth[11]*rt2;
95  case 3 :
96  return 0.0;
97  case 4 :
98  return -rt2*(Ameth[13] + 2.0*Ameth[14]*rt);
99  case 5 :
100  return -Ameth[15]*rt2;
101  case 6 :
102  return -rt2*(Ameth[16] + 2.0*Ameth[17]*rt);
103  case 7 :
104  return -2.0*Ameth[18]*rt3;
105  case 8 :
106  return -rt3*(2.0*Ameth[19] + 3.0*Ameth[20]*rt);
107  case 9 :
108  return -rt3*(2.0*Ameth[21] + 4.0*Ameth[22]*rt2);
109  case 10 :
110  return -rt3*(2.0*Ameth[23] + 3.0*Ameth[24]*rt);
111  case 11 :
112  return -rt3*(2.0*Ameth[25] + 4.0*Ameth[26]*rt2);
113  case 12 :
114  return -rt3*(2.0*Ameth[27] + 3.0*Ameth[28]*rt);
115  case 13 :
116  return -rt3*(2.0*Ameth[29] + 3.0*Ameth[30]*rt + 4.0*Ameth[31]*rt2);
117  default :
118  return 0.0;
119  }
120 }
121 
122 double methane::W(int n, double egrho)
123 {
124  return (n == 0 ? (1.0 - egrho)/(2.0*Gamma) :
125  (n*W(n-1, egrho) - 0.5*pow(Rho,2*n)*egrho)/Gamma);
126 }
127 
128 double methane::H(int i, double egrho)
129 {
130  return (i < 8 ? pow(Rho,i+2) : pow(Rho,2*i-13)*egrho);
131 }
132 
133 double methane::I(int i, double egrho)
134 {
135  return (i < 8 ? pow(Rho,i+1)/double(i+1) : W(i-8, egrho));
136 }
137 
138 double methane::up()
139 {
140  double rt = 1.0/T;
141  double rt2 = rt*rt;
142  double rt3 = rt*rt2;
143  double egrho = exp(-Gamma*Rho*Rho);
144  double t3 = pow(T,1.0/3.0);
145 
146  double sum = 0.0;
147  for (int i=0; i<14; i++) {
148  sum += (C(i, rt, rt2) - T*Cprime(i, rt, rt2, rt3))*I(i, egrho);
149  }
150 
151  sum += T*(Gmeth[0] + 0.75*Gmeth[1]*t3 + 0.6*Gmeth[2]*t3*t3 + 0.5*Gmeth[3]*T)
152  + Gmeth[4]*beta/(exp(beta*rt) - 1.0) + u0;
153  return sum + m_energy_offset;
154 }
155 
156 double methane::sp()
157 {
158  double rt = 1.0/T;
159  double rt2 = rt*rt;
160  double rt3 = rt*rt2;
161  double egrho = exp(-Gamma*Rho*Rho);
162  double t3 = pow(T,1.0/3.0);
163  double sum = 0.0;
164  sum = s0 - R*log(Rho);
165  for (int i=0; i<14; i++) {
166  sum -= Cprime(i, rt, rt2, rt3)*I(i, egrho);
167  }
168  sum += Gmeth[0]*log(T) + 3.0*Gmeth[1]*t3 + 1.5*Gmeth[2]*t3*t3 + Gmeth[3]*T
169  + Gmeth[4]*(beta*rt + beta*rt/(exp(beta*rt) - 1.0)
170  - log(exp(beta*rt) - 1.0));
171  return sum + m_entropy_offset;
172 }
173 
174 double methane::Pp()
175 {
176  double rt = 1.0/T;
177  double rt2 = rt*rt;
178  double egrho = exp(-Gamma*Rho*Rho);
179 
180  double P = Rho*R*T;
181  for (int i=0; i<14; i++) {
182  P += C(i, rt, rt2)*H(i, egrho);
183  }
184  return P;
185 }
186 
187 double methane::Psat()
188 {
189  double x = (1.0 - Tt/T)/(1.0 - Tt/Tc);
190  double result;
191  if ((T < Tmn) || (T > Tc)) {
192  throw TPX_Error("methane::Psat",
193  "Temperature out of range. T = " + fp2str(T));
194  }
195  result = Fmeth[0]*x + Fmeth[1]*x*x + Fmeth[2]*x*x*x +
196  Fmeth[3]*x*pow(1-x, alpha);
197  return exp(result)*Pt;
198 }
199 
200 double methane::ldens()
201 {
202  double result;
203  double sum;
204  double w;
205  if ((T < Tmn) || (T > Tc)) {
206  throw TPX_Error("methane::ldens",
207  "Temperature out of range. T = " + fp2str(T));
208  }
209  w = (Tc - T)/(Tc - Tt);
210  sum = Dmeth[0]*(1.0 - pow(w, 2.0/3.0)) + Dmeth[1]*(1.0 - pow(w, 4.0/3.0))
211  + Dmeth[2]*(1.0 - pow(w, 2));
212  result = pow(w,alpha1)*exp(sum);
213  result *= (Rot-Roc);
214  result += Roc;
215  return result;
216 }
217 
218 double methane::Tcrit()
219 {
220  return Tc;
221 }
222 double methane::Pcrit()
223 {
224  return Pc;
225 }
226 double methane::Vcrit()
227 {
228  return 1.0/Roc;
229 }
230 double methane::Tmin()
231 {
232  return Tmn;
233 }
234 double methane::Tmax()
235 {
236  return Tmx;
237 }
238 char* methane::name()
239 {
240  return (char*) m_name.c_str();
241 }
242 char* methane::formula()
243 {
244  return (char*) m_formula.c_str();
245 }
246 double methane::MolWt()
247 {
248  return M;
249 }
250 
251 }
std::string fp2str(const double x, const std::string &fmt)
Convert a double into a c++ string.
Definition: stringUtils.cpp:29
Contains declarations for string manipulation functions within Cantera.