30 HighPressureGasTransport::HighPressureGasTransport(
thermo_t* thermo)
39 doublereal Lprime_m = 0.0;
40 const doublereal c1 = 1./16.04;
52 m_thermo -> getPartialMolarVolumes(&V_k[0]);
55 for (
size_t i = 0; i <
m_nsp; i++) {
56 doublereal Tc_i = Tcrit_i(i);
57 doublereal Vc_i = Vcrit_i(i);
59 doublereal V_r = V_k[i]/Vc_i;
60 doublereal T_p = std::min(T_r,2.0);
61 doublereal V_p = std::max(0.5,std::min(V_r,2.0));
64 doublereal theta_p = 1.0 + (
m_w_ac[i] - 0.011)*(0.56553
65 - 0.86276*log(T_p) - 0.69852/T_p);
66 doublereal phi_p = (1.0 + (
m_w_ac[i] - 0.011)*(0.38560
67 - 1.1617*log(T_p)))*0.288/Zcrit_i(i);
68 doublereal f_fac = Tc_i*theta_p/190.4;
69 doublereal h_fac = 1000*Vc_i*phi_p/99.2;
70 doublereal T_0 =
m_temp/f_fac;
71 doublereal mu_0 = 1e-7*(2.90774e6/T_0 - 3.31287e6*pow(T_0,-2./3.)
72 + 1.60810e6*pow(T_0,-1./3.) - 4.33190e5 + 7.06248e4*pow(T_0,1./3.)
73 - 7.11662e3*pow(T_0,2./3.) + 4.32517e2*T_0 - 1.44591e1*pow(T_0,4./3.)
74 + 2.03712e-1*pow(T_0,5./3.));
75 doublereal H = sqrt(f_fac*16.04/
m_mw[i])*pow(h_fac,-2./3.);
76 doublereal mu_i = mu_0*H*
m_mw[i]*c1;
78 L_i_min = min(L_i_min,L_i[i]);
80 doublereal theta_s = 1 + (
m_w_ac[i] - 0.011)*(0.09057 - 0.86276*log(T_p)
81 + (0.31664 - 0.46568/T_p)*(V_p - 0.5));
82 doublereal phi_s = (1 + (
m_w_ac[i] - 0.011)*(0.39490*(V_p - 1.02355)
83 - 0.93281*(V_p - 0.75464)*log(T_p)))*0.288/Zcrit_i(i);
84 f_i[i] = Tc_i*theta_s/190.4;
85 h_i[i] = 1000*Vc_i*phi_s/99.2;
91 for (
size_t i = 0; i <
m_nsp; i++) {
92 for (
size_t j = 0; j <
m_nsp; j++) {
94 doublereal L_ij = 2*L_i[i]*L_i[j]/(L_i[i] + L_i[j] +
Tiny);
95 Lprime_m += molefracs[i]*molefracs[j]*L_ij;
97 doublereal f_ij = sqrt(f_i[i]*f_i[j]);
98 doublereal h_ij = 0.125*pow(pow(h_i[i],1./3.) + pow(h_i[j],1./3.),3.);
100 f_m += molefracs[i]*molefracs[j]*f_ij*h_ij;
101 h_m += molefracs[i]*molefracs[j]*h_ij;
102 mw_m += molefracs[i]*molefracs[j]*sqrt(mw_ij_inv*f_ij)*pow(h_ij,-4./3.);
107 mw_m = pow(mw_m,-2.)*f_m*pow(h_m,-8./3.);
110 doublereal T_0 =
m_temp/f_m;
111 doublereal mu_0 = 1e-7*(2.90774e6/T_0 - 3.31287e6*pow(T_0,-2./3.)
112 + 1.60810e6*pow(T_0,-1./3.) - 4.33190e5 + 7.06248e4
113 *pow(T_0,1./3.) - 7.11662e3*pow(T_0,2./3.) + 4.32517e2*T_0
114 - 1.44591e1*pow(T_0,4./3.) + 2.03712e-1*pow(T_0,5./3.));
115 doublereal L_1m = 1944*mu_0;
116 doublereal L_2m = (-2.5276e-4 + 3.3433e-4*pow(1.12 - log(T_0/1.680e2),2))*rho_0;
117 doublereal L_3m = exp(-7.19771 + 85.67822/T_0)*(exp((12.47183
118 - 984.6252*pow(T_0,-1.5))*pow(rho_0,0.1) + (rho_0/0.1617 - 1)
119 *sqrt(rho_0)*(0.3594685 + 69.79841/T_0 - 872.8833*pow(T_0,-2))) - 1.)*1e-3;
120 doublereal H_m = sqrt(f_m*16.04/mw_m)*pow(h_m,-2./3.);
121 doublereal Lstar_m = H_m*(L_1m + L_2m + L_3m);
122 return Lprime_m + Lstar_m;
151 throw CanteraError(
"HighPressureGasTransport::getBinaryDiffCoeffs",
155 for (
size_t i = 0; i < nsp; i++) {
156 for (
size_t j = 0; j < nsp; j++) {
159 doublereal x_i = std::max(
Tiny, molefracs[i]);
160 doublereal x_j = std::max(
Tiny, molefracs[j]);
163 x_i = x_i/(x_i + x_j);
164 x_j = x_j/(x_i + x_j);
167 double Tr_ij =
m_temp/(x_i*Tcrit_i(i) + x_j*Tcrit_i(j));
177 P_corr_ij = setPcorr(Pr_ij, Tr_ij);
188 d[ld*j + i] = P_corr_ij*rp *
m_bdiff(i,j);
219 throw CanteraError(
"HighPressureGasTransport::getMultiDiffCoeffs",
222 for (
size_t i = 0; i <
m_nsp; i++) {
223 for (
size_t j = 0; j <
m_nsp; j++) {
226 doublereal x_i = std::max(
Tiny, molefracs[i]);
227 doublereal x_j = std::max(
Tiny, molefracs[j]);
230 double Tr_ij =
m_temp/(x_i*Tcrit_i(i) + x_j*Tcrit_i(j));
237 P_corr_ij = setPcorr(Pr_ij, Tr_ij);
260 throw CanteraError(
"HighPressureGasTransport::getMultiDiffCoeffs",
261 "invert returned ierr = {}", ierr);
264 m_lmatrix_soln_ok =
false;
266 doublereal prefactor = 16.0 *
m_temp
269 for (
size_t i = 0; i <
m_nsp; i++) {
270 for (
size_t j = 0; j <
m_nsp; j++) {
271 double c = prefactor/
m_mw[j];
272 d[ld*j + i] = c*molefracs[i]*(m_Lmatrix(i,j) - m_Lmatrix(i,i));
281 double Pc_mix_n = 0.;
282 double Pc_mix_d = 0.;
284 double MW_H =
m_mw[0];
285 double MW_L =
m_mw[0];
286 doublereal FP_mix_o = 0;
287 doublereal FQ_mix_o = 0;
294 double x_H = molefracs[0];
295 for (
size_t i = 0; i <
m_nsp; i++) {
298 double Tc = Tcrit_i(i);
299 double Tr = tKelvin/Tc;
300 double Zc = Zcrit_i(i);
301 Tc_mix += Tc*molefracs[i];
302 Pc_mix_n += molefracs[i]*Zc;
303 Pc_mix_d += molefracs[i]*Vcrit_i(i);
306 if (
m_mw[i] > MW_H) {
309 }
else if (
m_mw[i] < MW_L) {
316 FP_mix_o += molefracs[i];
317 }
else if (mu_ri < 0.075) {
318 FP_mix_o += molefracs[i]*(1. + 30.55*pow(0.292 - Zc, 1.72));
319 }
else { FP_mix_o += molefracs[i]*(1. + 30.55*pow(0.292 - Zc, 1.72)
320 *fabs(0.96 + 0.1*(Tr - 0.7)));
329 if (spnames[i] ==
"He") {
330 FQ_mix_o += molefracs[i]*FQ_i(1.38,Tr,
m_mw[i]);
331 }
else if (spnames[i] ==
"H2") {
332 FQ_mix_o += molefracs[i]*(FQ_i(0.76,Tr,
m_mw[i]));
333 }
else if (spnames[i] ==
"D2") {
334 FQ_mix_o += molefracs[i]*(FQ_i(0.52,Tr,
m_mw[i]));
336 FQ_mix_o += molefracs[i];
340 double Tr_mix = tKelvin/Tc_mix;
341 double Pc_mix =
GasConstant*Tc_mix*Pc_mix_n/Pc_mix_d;
343 double ratio = MW_H/MW_L;
344 double ksi = pow(
GasConstant*Tc_mix*3.6277*pow(10.0,53.0)/(pow(MW_mix,3)
345 *pow(Pc_mix,4)),1.0/6.0);
347 if (ratio > 9 && x_H > 0.05 && x_H < 0.7) {
348 FQ_mix_o *= 1 - 0.01*pow(ratio,0.87);
352 double Z1m = (0.807*pow(Tr_mix,0.618) - 0.357*exp(-0.449*Tr_mix)
353 + 0.340*exp(-4.058*Tr_mix)+0.018)*FP_mix_o*FQ_mix_o;
358 if (Pr_mix < Pvp_mix/Pc_mix) {
359 doublereal alpha = 3.262 + 14.98*pow(Pr_mix,5.508);
360 doublereal beta = 1.390 + 5.746*Pr_mix;
361 Z2m = 0.600 + 0.760*pow(Pr_mix,alpha) + (0.6990*pow(Pr_mix,beta) -
364 throw CanteraError(
"HighPressureGasTransport::viscosity",
365 "State is outside the limits of the Lucas model, Tr <= 1");
367 }
else if ((Tr_mix > 1.0) && (Tr_mix < 40.0)) {
368 if ((Pr_mix > 0.0) && (Pr_mix <= 100.0)) {
369 doublereal a_fac = 0.001245*exp(5.1726*pow(Tr_mix,-0.3286))/Tr_mix;
370 doublereal b_fac = a_fac*(1.6553*Tr_mix - 1.2723);
371 doublereal c_fac = 0.4489*exp(3.0578*pow(Tr_mix,-37.7332))/Tr_mix;
372 doublereal d_fac = 1.7368*exp(2.2310*pow(Tr_mix,-7.6351))/Tr_mix;
373 doublereal f_fac = 0.9425*exp(-0.1853*pow(Tr_mix,0.4489));
375 Z2m = Z1m*(1 + a_fac*pow(Pr_mix,1.3088)/(b_fac*pow(Pr_mix,f_fac)
376 + pow(1+c_fac*pow(Pr_mix,d_fac),-1)));
378 throw CanteraError(
"HighPressureGasTransport::viscosity",
379 "State is outside the limits of the Lucas model, 1.0 < Tr < 40");
382 throw CanteraError(
"HighPressureGasTransport::viscosity",
383 "State is outside the limits of the Lucas model, Tr > 40");
387 doublereal Y = Z2m/Z1m;
390 return Z2m*(1 + (FP_mix_o - 1)*pow(Y,-3))*(1 + (FQ_mix_o - 1)
391 *(1/Y - 0.007*pow(log(Y),4)))/(ksi*FP_mix_o*FQ_mix_o);
395 doublereal HighPressureGasTransport::Tcrit_i(
size_t i)
406 doublereal HighPressureGasTransport::Pcrit_i(
size_t i)
417 doublereal HighPressureGasTransport::Vcrit_i(
size_t i)
428 doublereal HighPressureGasTransport::Zcrit_i(
size_t i)
439 vector_fp HighPressureGasTransport::store(
size_t i,
size_t nsp)
451 doublereal HighPressureGasTransport::FQ_i(doublereal Q, doublereal Tr, doublereal MW)
453 return 1.22*pow(Q,0.15)*(1 + 0.00385*pow(pow(Tr - 12.,2.),1./MW)
454 *fabs(Tr-12)/(Tr-12));
459 doublereal HighPressureGasTransport::setPcorr(doublereal Pr, doublereal Tr)
461 const static double Pr_lookup[17] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0,
462 1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 4.0, 5.0};
463 const static double DP_Rt_lookup[17] = {1.01, 1.01, 1.01, 1.01, 1.01, 1.01,
464 1.01, 1.02, 1.02, 1.02, 1.02, 1.03, 1.03, 1.04, 1.05, 1.06, 1.07};
465 const static double A_ij_lookup[17] = {0.038042, 0.067433, 0.098317,
466 0.137610, 0.175081, 0.216376, 0.314051, 0.385736, 0.514553, 0.599184,
467 0.557725, 0.593007, 0.696001, 0.790770, 0.502100, 0.837452, 0.890390};
468 const static double B_ij_lookup[17] = {1.52267, 2.16794, 2.42910, 2.77605,
469 2.98256, 3.11384, 3.50264, 3.07773, 3.54744, 3.61216, 3.41882, 3.18415,
470 3.37660, 3.27984, 3.39031, 3.23513, 3.13001};
471 const static double C_ij_lookup[17] = {0., 0., 0., 0., 0., 0., 0., 0.141211,
472 0.278407, 0.372683, 0.504894, 0.678469, 0.665702, 0., 0.602907, 0., 0.};
473 const static double E_ij_lookup[17] = {1., 1., 1., 1., 1., 1., 1., 13.45454,
474 14., 10.00900, 8.57519, 10.37483, 11.21674, 1., 6.19043, 1., 1.};
481 frac = (Pr - Pr_lookup[0])/(Pr_lookup[1] - Pr_lookup[0]);
483 for (
int j = 1; j < 17; j++) {
484 if (Pr_lookup[j] > Pr) {
485 frac = (Pr - Pr_lookup[j-1])/(Pr_lookup[j] - Pr_lookup[j-1]);
497 doublereal P_corr_1 = DP_Rt_lookup[Pr_i]*(1.0 - A_ij_lookup[Pr_i]
498 *pow(Tr,-B_ij_lookup[Pr_i]))*(1-C_ij_lookup[Pr_i]
499 *pow(Tr,-E_ij_lookup[Pr_i]));
500 doublereal P_corr_2 = DP_Rt_lookup[Pr_i+1]*(1.0 - A_ij_lookup[Pr_i+1]
501 *pow(Tr,-B_ij_lookup[Pr_i+1]))*(1-C_ij_lookup[Pr_i+1]
502 *pow(Tr,-E_ij_lookup[Pr_i+1]));
503 return P_corr_1*(1.0-frac) + P_corr_2*frac;