38 doublereal Lprime_m = 0.0;
39 const doublereal c1 = 1./16.04;
51 m_thermo -> getPartialMolarVolumes(&V_k[0]);
54 for (
size_t i = 0; i <
m_nsp; i++) {
55 doublereal Tc_i = Tcrit_i(i);
56 doublereal Vc_i = Vcrit_i(i);
58 doublereal V_r = V_k[i]/Vc_i;
59 doublereal T_p = std::min(T_r,2.0);
60 doublereal V_p = std::max(0.5,std::min(V_r,2.0));
63 doublereal theta_p = 1.0 + (
m_w_ac[i] - 0.011)*(0.56553
64 - 0.86276*log(T_p) - 0.69852/T_p);
65 doublereal phi_p = (1.0 + (
m_w_ac[i] - 0.011)*(0.38560
66 - 1.1617*log(T_p)))*0.288/Zcrit_i(i);
67 doublereal f_fac = Tc_i*theta_p/190.4;
68 doublereal h_fac = 1000*Vc_i*phi_p/99.2;
69 doublereal T_0 =
m_temp/f_fac;
70 doublereal mu_0 = 1e-7*(2.90774e6/T_0 - 3.31287e6*pow(T_0,-2./3.)
71 + 1.60810e6*pow(T_0,-1./3.) - 4.33190e5 + 7.06248e4*pow(T_0,1./3.)
72 - 7.11662e3*pow(T_0,2./3.) + 4.32517e2*T_0 - 1.44591e1*pow(T_0,4./3.)
73 + 2.03712e-1*pow(T_0,5./3.));
74 doublereal H = sqrt(f_fac*16.04/
m_mw[i])*pow(h_fac,-2./3.);
75 doublereal mu_i = mu_0*H*
m_mw[i]*c1;
77 L_i_min = min(L_i_min,L_i[i]);
79 doublereal theta_s = 1 + (
m_w_ac[i] - 0.011)*(0.09057 - 0.86276*log(T_p)
80 + (0.31664 - 0.46568/T_p)*(V_p - 0.5));
81 doublereal phi_s = (1 + (
m_w_ac[i] - 0.011)*(0.39490*(V_p - 1.02355)
82 - 0.93281*(V_p - 0.75464)*log(T_p)))*0.288/Zcrit_i(i);
83 f_i[i] = Tc_i*theta_s/190.4;
84 h_i[i] = 1000*Vc_i*phi_s/99.2;
90 for (
size_t i = 0; i <
m_nsp; i++) {
91 for (
size_t j = 0; j <
m_nsp; j++) {
93 doublereal L_ij = 2*L_i[i]*L_i[j]/(L_i[i] + L_i[j] +
Tiny);
94 Lprime_m += molefracs[i]*molefracs[j]*L_ij;
96 doublereal f_ij = sqrt(f_i[i]*f_i[j]);
97 doublereal h_ij = 0.125*pow(pow(h_i[i],1./3.) + pow(h_i[j],1./3.),3.);
99 f_m += molefracs[i]*molefracs[j]*f_ij*h_ij;
100 h_m += molefracs[i]*molefracs[j]*h_ij;
101 mw_m += molefracs[i]*molefracs[j]*sqrt(mw_ij_inv*f_ij)*pow(h_ij,-4./3.);
106 mw_m = pow(mw_m,-2.)*f_m*pow(h_m,-8./3.);
109 doublereal T_0 =
m_temp/f_m;
110 doublereal mu_0 = 1e-7*(2.90774e6/T_0 - 3.31287e6*pow(T_0,-2./3.)
111 + 1.60810e6*pow(T_0,-1./3.) - 4.33190e5 + 7.06248e4
112 *pow(T_0,1./3.) - 7.11662e3*pow(T_0,2./3.) + 4.32517e2*T_0
113 - 1.44591e1*pow(T_0,4./3.) + 2.03712e-1*pow(T_0,5./3.));
114 doublereal L_1m = 1944*mu_0;
115 doublereal L_2m = (-2.5276e-4 + 3.3433e-4*pow(1.12 - log(T_0/1.680e2),2))*rho_0;
116 doublereal L_3m = exp(-7.19771 + 85.67822/T_0)*(exp((12.47183
117 - 984.6252*pow(T_0,-1.5))*pow(rho_0,0.1) + (rho_0/0.1617 - 1)
118 *sqrt(rho_0)*(0.3594685 + 69.79841/T_0 - 872.8833*pow(T_0,-2))) - 1.)*1e-3;
119 doublereal H_m = sqrt(f_m*16.04/mw_m)*pow(h_m,-2./3.);
120 doublereal Lstar_m = H_m*(L_1m + L_2m + L_3m);
121 return Lprime_m + Lstar_m;
150 throw CanteraError(
"HighPressureGasTransport::getBinaryDiffCoeffs",
154 for (
size_t i = 0; i < nsp; i++) {
155 for (
size_t j = 0; j < nsp; j++) {
158 doublereal x_i = std::max(
Tiny, molefracs[i]);
159 doublereal x_j = std::max(
Tiny, molefracs[j]);
162 x_i = x_i/(x_i + x_j);
163 x_j = x_j/(x_i + x_j);
166 double Tr_ij =
m_temp/(x_i*Tcrit_i(i) + x_j*Tcrit_i(j));
176 P_corr_ij = setPcorr(Pr_ij, Tr_ij);
187 d[ld*j + i] = P_corr_ij*rp *
m_bdiff(i,j);
218 throw CanteraError(
"HighPressureGasTransport::getMultiDiffCoeffs",
221 for (
size_t i = 0; i <
m_nsp; i++) {
222 for (
size_t j = 0; j <
m_nsp; j++) {
225 doublereal x_i = std::max(
Tiny, molefracs[i]);
226 doublereal x_j = std::max(
Tiny, molefracs[j]);
229 double Tr_ij =
m_temp/(x_i*Tcrit_i(i) + x_j*Tcrit_i(j));
236 P_corr_ij = setPcorr(Pr_ij, Tr_ij);
259 throw CanteraError(
"HighPressureGasTransport::getMultiDiffCoeffs",
260 "invert returned ierr = {}", ierr);
263 m_lmatrix_soln_ok =
false;
265 doublereal prefactor = 16.0 *
m_temp
268 for (
size_t i = 0; i <
m_nsp; i++) {
269 for (
size_t j = 0; j <
m_nsp; j++) {
270 double c = prefactor/
m_mw[j];
271 d[ld*j + i] = c*molefracs[i]*(m_Lmatrix(i,j) - m_Lmatrix(i,i));
280 double Pc_mix_n = 0.;
281 double Pc_mix_d = 0.;
283 double MW_H =
m_mw[0];
284 double MW_L =
m_mw[0];
285 doublereal FP_mix_o = 0;
286 doublereal FQ_mix_o = 0;
293 double x_H = molefracs[0];
294 for (
size_t i = 0; i <
m_nsp; i++) {
297 double Tc = Tcrit_i(i);
298 double Tr = tKelvin/Tc;
299 double Zc = Zcrit_i(i);
300 Tc_mix += Tc*molefracs[i];
301 Pc_mix_n += molefracs[i]*Zc;
302 Pc_mix_d += molefracs[i]*Vcrit_i(i);
305 if (
m_mw[i] > MW_H) {
308 }
else if (
m_mw[i] < MW_L) {
315 FP_mix_o += molefracs[i];
316 }
else if (mu_ri < 0.075) {
317 FP_mix_o += molefracs[i]*(1. + 30.55*pow(0.292 - Zc, 1.72));
318 }
else { FP_mix_o += molefracs[i]*(1. + 30.55*pow(0.292 - Zc, 1.72)
319 *fabs(0.96 + 0.1*(Tr - 0.7)));
328 if (spnames[i] ==
"He") {
329 FQ_mix_o += molefracs[i]*FQ_i(1.38,Tr,
m_mw[i]);
330 }
else if (spnames[i] ==
"H2") {
331 FQ_mix_o += molefracs[i]*(FQ_i(0.76,Tr,
m_mw[i]));
332 }
else if (spnames[i] ==
"D2") {
333 FQ_mix_o += molefracs[i]*(FQ_i(0.52,Tr,
m_mw[i]));
335 FQ_mix_o += molefracs[i];
339 double Tr_mix = tKelvin/Tc_mix;
340 double Pc_mix =
GasConstant*Tc_mix*Pc_mix_n/Pc_mix_d;
342 double ratio = MW_H/MW_L;
343 double ksi = pow(
GasConstant*Tc_mix*3.6277*pow(10.0,53.0)/(pow(MW_mix,3)
344 *pow(Pc_mix,4)),1.0/6.0);
346 if (ratio > 9 && x_H > 0.05 && x_H < 0.7) {
347 FQ_mix_o *= 1 - 0.01*pow(ratio,0.87);
351 double Z1m = (0.807*pow(Tr_mix,0.618) - 0.357*exp(-0.449*Tr_mix)
352 + 0.340*exp(-4.058*Tr_mix)+0.018)*FP_mix_o*FQ_mix_o;
357 if (Pr_mix < Pvp_mix/Pc_mix) {
358 doublereal alpha = 3.262 + 14.98*pow(Pr_mix,5.508);
359 doublereal beta = 1.390 + 5.746*Pr_mix;
360 Z2m = 0.600 + 0.760*pow(Pr_mix,alpha) + (0.6990*pow(Pr_mix,beta) -
363 throw CanteraError(
"HighPressureGasTransport::viscosity",
364 "State is outside the limits of the Lucas model, Tr <= 1");
366 }
else if ((Tr_mix > 1.0) && (Tr_mix < 40.0)) {
367 if ((Pr_mix > 0.0) && (Pr_mix <= 100.0)) {
368 doublereal a_fac = 0.001245*exp(5.1726*pow(Tr_mix,-0.3286))/Tr_mix;
369 doublereal b_fac = a_fac*(1.6553*Tr_mix - 1.2723);
370 doublereal c_fac = 0.4489*exp(3.0578*pow(Tr_mix,-37.7332))/Tr_mix;
371 doublereal d_fac = 1.7368*exp(2.2310*pow(Tr_mix,-7.6351))/Tr_mix;
372 doublereal f_fac = 0.9425*exp(-0.1853*pow(Tr_mix,0.4489));
374 Z2m = Z1m*(1 + a_fac*pow(Pr_mix,1.3088)/(b_fac*pow(Pr_mix,f_fac)
375 + pow(1+c_fac*pow(Pr_mix,d_fac),-1)));
377 throw CanteraError(
"HighPressureGasTransport::viscosity",
378 "State is outside the limits of the Lucas model, 1.0 < Tr < 40");
381 throw CanteraError(
"HighPressureGasTransport::viscosity",
382 "State is outside the limits of the Lucas model, Tr > 40");
386 doublereal Y = Z2m/Z1m;
389 return Z2m*(1 + (FP_mix_o - 1)*pow(Y,-3))*(1 + (FQ_mix_o - 1)
390 *(1/Y - 0.007*pow(log(Y),4)))/(ksi*FP_mix_o*FQ_mix_o);
394doublereal HighPressureGasTransport::Tcrit_i(
size_t i)
405doublereal HighPressureGasTransport::Pcrit_i(
size_t i)
416doublereal HighPressureGasTransport::Vcrit_i(
size_t i)
427doublereal HighPressureGasTransport::Zcrit_i(
size_t i)
438vector_fp HighPressureGasTransport::store(
size_t i,
size_t nsp)
450doublereal HighPressureGasTransport::FQ_i(doublereal Q, doublereal Tr, doublereal MW)
452 return 1.22*pow(Q,0.15)*(1 + 0.00385*pow(pow(Tr - 12.,2.),1./MW)
453 *fabs(Tr-12)/(Tr-12));
458doublereal HighPressureGasTransport::setPcorr(doublereal Pr, doublereal Tr)
460 const static double Pr_lookup[17] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0,
461 1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 4.0, 5.0};
462 const static double DP_Rt_lookup[17] = {1.01, 1.01, 1.01, 1.01, 1.01, 1.01,
463 1.01, 1.02, 1.02, 1.02, 1.02, 1.03, 1.03, 1.04, 1.05, 1.06, 1.07};
464 const static double A_ij_lookup[17] = {0.038042, 0.067433, 0.098317,
465 0.137610, 0.175081, 0.216376, 0.314051, 0.385736, 0.514553, 0.599184,
466 0.557725, 0.593007, 0.696001, 0.790770, 0.502100, 0.837452, 0.890390};
467 const static double B_ij_lookup[17] = {1.52267, 2.16794, 2.42910, 2.77605,
468 2.98256, 3.11384, 3.50264, 3.07773, 3.54744, 3.61216, 3.41882, 3.18415,
469 3.37660, 3.27984, 3.39031, 3.23513, 3.13001};
470 const static double C_ij_lookup[17] = {0., 0., 0., 0., 0., 0., 0., 0.141211,
471 0.278407, 0.372683, 0.504894, 0.678469, 0.665702, 0., 0.602907, 0., 0.};
472 const static double E_ij_lookup[17] = {1., 1., 1., 1., 1., 1., 1., 13.45454,
473 14., 10.00900, 8.57519, 10.37483, 11.21674, 1., 6.19043, 1., 1.};
480 frac = (Pr - Pr_lookup[0])/(Pr_lookup[1] - Pr_lookup[0]);
482 for (
int j = 1; j < 17; j++) {
483 if (Pr_lookup[j] > Pr) {
484 frac = (Pr - Pr_lookup[j-1])/(Pr_lookup[j] - Pr_lookup[j-1]);
496 doublereal P_corr_1 = DP_Rt_lookup[Pr_i]*(1.0 - A_ij_lookup[Pr_i]
497 *pow(Tr,-B_ij_lookup[Pr_i]))*(1-C_ij_lookup[Pr_i]
498 *pow(Tr,-E_ij_lookup[Pr_i]));
499 doublereal P_corr_2 = DP_Rt_lookup[Pr_i+1]*(1.0 - A_ij_lookup[Pr_i+1]
500 *pow(Tr,-B_ij_lookup[Pr_i+1]))*(1-C_ij_lookup[Pr_i+1]
501 *pow(Tr,-E_ij_lookup[Pr_i+1]));
502 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)
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)
HighPressureGasTransport(ThermoPhase *thermo=0)
default constructor
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).
ThermoPhase * m_thermo
pointer to the object representing the phase
size_t m_nsp
Number of species.
Namespace for the Cantera kernel.
const double Tiny
Small number to compare differences of mole fractions against.
int invert(DenseMatrix &A, size_t nn=npos)
invert A. A is overwritten with A^-1.
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.
Contains declarations for string manipulation functions within Cantera.
Various templated functions that carry out common vector operations (see Templated Utility Functions)...