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;
Interface for class HighPressureGasTransport.
ThermoPhase object for the ideal gas equation of state - workhorse for Cantera (see Thermodynamic Pro...
Interface for class MultiTransport.
Header file defining class TransportFactory (see TransportFactory)
Class that holds the data that is read in from the input file, and which is used for processing of th...
Base class for exceptions thrown by Cantera classes.
vector_fp m_mw
Local copy of the species molecular weights.
virtual void updateDiff_T()
Update the binary diffusion coefficients.
bool m_bindiff_ok
Update boolean for the binary diffusivities at unit pressure.
doublereal m_temp
Current value of the temperature at which the properties in this object are calculated (Kelvin).
DenseMatrix m_bdiff
Matrix of binary diffusion coefficients at the reference pressure and the current temperature Size is...
DenseMatrix m_dipole
The effective dipole moment for (i,j) collisions.
vector_fp m_w_ac
Pitzer acentric factor.
virtual void getThermalDiffCoeffs(doublereal *const dt)
Return the thermal diffusion coefficients (kg/m/s)
virtual void getMultiDiffCoeffs(const size_t ld, doublereal *const d)
Return the Multicomponent diffusion coefficients. Units: [m^2/s].
virtual void getBinaryDiffCoeffs(const size_t ld, doublereal *const d)
virtual double thermalConductivity()
Returns the mixture thermal conductivity in W/m/K.
virtual doublereal viscosity()
Viscosity of the mixture (kg /m /s)
Class MultiTransport implements multicomponent transport properties for ideal gas mixtures.
void eval_L0000(const doublereal *const x)
Evaluate the L0000 matrices.
void update_T()
Update basic temperature-dependent quantities if the temperature has changed.
void updateThermal_T()
Update the temperature-dependent terms needed to compute the thermal conductivity and thermal diffusi...
void update_C()
Update basic concentration-dependent quantities if the concentrations have changed.
An error indicating that an unimplemented function has been called.
virtual void setMoleFractions(const double *const x)
Set the mole fractions to the specified values.
size_t nSpecies() const
Returns the number of species in the phase.
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
void getMoleFractions(double *const x) const
Get the species mole fraction vector.
doublereal temperature() const
Temperature (K).
const std::vector< std::string > & speciesNames() const
Return a const reference to the vector of species names.
double molarVolume() const
Molar volume (m^3/kmol).
virtual double pressure() const
Return the thermodynamic pressure (Pa).
Base class for a phase with thermodynamic properties.
virtual doublereal critPressure() const
Critical pressure (Pa).
virtual doublereal critTemperature() const
Critical temperature (K).
virtual doublereal satPressure(doublereal t)
Return the saturation pressure given the temperature.
virtual doublereal critVolume() const
Critical volume (m3/kmol).
virtual void getCp_R_ref(doublereal *cprt) const
Returns the vector of nondimensional constant pressure heat capacities of the reference state at the ...
virtual doublereal critCompressibility() const
Critical compressibility (unitless).
thermo_t * m_thermo
pointer to the object representing the phase
size_t m_nsp
Number of species.
const double Tiny
Small number to compare differences of mole fractions against.
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
const double GasConstant
Universal Gas Constant [J/kmol/K].
const double BigNumber
largest number to compare to inf.
Namespace for the Cantera kernel.
int invert(DenseMatrix &A, size_t nn)
invert A. A is overwritten with A^-1.
Contains declarations for string manipulation functions within Cantera.
Various templated functions that carry out common vector operations (see Templated Utility Functions)...