26 double Lprime_m = 0.0;
27 const double c1 = 1./16.04;
29 vector<double> molefracs(nsp);
31 vector<double> cp_0_R(nsp);
34 vector<double> L_i(nsp);
35 vector<double> f_i(nsp);
36 vector<double> h_i(nsp);
37 vector<double> V_k(nsp);
39 m_thermo -> getPartialMolarVolumes(&V_k[0]);
42 for (
size_t i = 0; i <
m_nsp; i++) {
43 double Tc_i = Tcrit_i(i);
44 double Vc_i = Vcrit_i(i);
46 double V_r = V_k[i]/Vc_i;
47 double T_p = std::min(T_r,2.0);
48 double V_p = std::max(0.5,std::min(V_r,2.0));
51 double theta_p = 1.0 + (
m_w_ac[i] - 0.011)*(0.56553
52 - 0.86276*log(T_p) - 0.69852/T_p);
53 double phi_p = (1.0 + (
m_w_ac[i] - 0.011)*(0.38560
54 - 1.1617*log(T_p)))*0.288/Zcrit_i(i);
55 double f_fac = Tc_i*theta_p/190.4;
56 double h_fac = 1000*Vc_i*phi_p/99.2;
58 double mu_0 = 1e-7*(2.90774e6/T_0 - 3.31287e6*pow(T_0,-2./3.)
59 + 1.60810e6*pow(T_0,-1./3.) - 4.33190e5 + 7.06248e4*pow(T_0,1./3.)
60 - 7.11662e3*pow(T_0,2./3.) + 4.32517e2*T_0 - 1.44591e1*pow(T_0,4./3.)
61 + 2.03712e-1*pow(T_0,5./3.));
62 double H = sqrt(f_fac*16.04/
m_mw[i])*pow(h_fac,-2./3.);
63 double mu_i = mu_0*H*
m_mw[i]*c1;
65 L_i_min = min(L_i_min,L_i[i]);
67 double theta_s = 1 + (
m_w_ac[i] - 0.011)*(0.09057 - 0.86276*log(T_p)
68 + (0.31664 - 0.46568/T_p)*(V_p - 0.5));
69 double phi_s = (1 + (
m_w_ac[i] - 0.011)*(0.39490*(V_p - 1.02355)
70 - 0.93281*(V_p - 0.75464)*log(T_p)))*0.288/Zcrit_i(i);
71 f_i[i] = Tc_i*theta_s/190.4;
72 h_i[i] = 1000*Vc_i*phi_s/99.2;
78 for (
size_t i = 0; i <
m_nsp; i++) {
79 for (
size_t j = 0; j <
m_nsp; j++) {
81 double L_ij = 2*L_i[i]*L_i[j]/(L_i[i] + L_i[j] +
Tiny);
82 Lprime_m += molefracs[i]*molefracs[j]*L_ij;
84 double f_ij = sqrt(f_i[i]*f_i[j]);
85 double h_ij = 0.125*pow(pow(h_i[i],1./3.) + pow(h_i[j],1./3.),3.);
87 f_m += molefracs[i]*molefracs[j]*f_ij*h_ij;
88 h_m += molefracs[i]*molefracs[j]*h_ij;
89 mw_m += molefracs[i]*molefracs[j]*sqrt(mw_ij_inv*f_ij)*pow(h_ij,-4./3.);
94 mw_m = pow(mw_m,-2.)*f_m*pow(h_m,-8./3.);
98 double mu_0 = 1e-7*(2.90774e6/T_0 - 3.31287e6*pow(T_0,-2./3.)
99 + 1.60810e6*pow(T_0,-1./3.) - 4.33190e5 + 7.06248e4
100 *pow(T_0,1./3.) - 7.11662e3*pow(T_0,2./3.) + 4.32517e2*T_0
101 - 1.44591e1*pow(T_0,4./3.) + 2.03712e-1*pow(T_0,5./3.));
102 double L_1m = 1944*mu_0;
103 double L_2m = (-2.5276e-4 + 3.3433e-4*pow(1.12 - log(T_0/1.680e2),2))*rho_0;
104 double L_3m = exp(-7.19771 + 85.67822/T_0)*(exp((12.47183
105 - 984.6252*pow(T_0,-1.5))*pow(rho_0,0.1) + (rho_0/0.1617 - 1)
106 *sqrt(rho_0)*(0.3594685 + 69.79841/T_0 - 872.8833*pow(T_0,-2))) - 1.)*1e-3;
107 double H_m = sqrt(f_m*16.04/mw_m)*pow(h_m,-2./3.);
108 double Lstar_m = H_m*(L_1m + L_2m + L_3m);
109 return Lprime_m + Lstar_m;
125 vector<double> PcP(5);
127 vector<double> molefracs(nsp);
138 throw CanteraError(
"HighPressureGasTransport::getBinaryDiffCoeffs",
142 for (
size_t i = 0; i < nsp; i++) {
143 for (
size_t j = 0; j < nsp; j++) {
146 double x_i = std::max(
Tiny, molefracs[i]);
147 double x_j = std::max(
Tiny, molefracs[j]);
150 x_i = x_i/(x_i + x_j);
151 x_j = x_j/(x_i + x_j);
154 double Tr_ij =
m_temp/(x_i*Tcrit_i(i) + x_j*Tcrit_i(j));
164 P_corr_ij = setPcorr(Pr_ij, Tr_ij);
175 d[ld*j + i] = P_corr_ij*rp *
m_bdiff(i,j);
198 vector<double> molefracs(nsp);
206 throw CanteraError(
"HighPressureGasTransport::getMultiDiffCoeffs",
209 for (
size_t i = 0; i <
m_nsp; i++) {
210 for (
size_t j = 0; j <
m_nsp; j++) {
213 double x_i = std::max(
Tiny, molefracs[i]);
214 double x_j = std::max(
Tiny, molefracs[j]);
217 double Tr_ij =
m_temp/(x_i*Tcrit_i(i) + x_j*Tcrit_i(j));
224 P_corr_ij = setPcorr(Pr_ij, Tr_ij);
247 m_lmatrix_soln_ok =
false;
249 double prefactor = 16.0 *
m_temp
252 for (
size_t i = 0; i <
m_nsp; i++) {
253 for (
size_t j = 0; j <
m_nsp; j++) {
254 double c = prefactor/
m_mw[j];
255 d[ld*j + i] = c*molefracs[i]*(m_Lmatrix(i,j) - m_Lmatrix(i,i));
264 double Pc_mix_n = 0.;
265 double Pc_mix_d = 0.;
267 double MW_H =
m_mw[0];
268 double MW_L =
m_mw[0];
274 vector<double> molefracs(nsp);
277 double x_H = molefracs[0];
278 for (
size_t i = 0; i <
m_nsp; i++) {
281 double Tc = Tcrit_i(i);
282 double Tr = tKelvin/Tc;
283 double Zc = Zcrit_i(i);
284 Tc_mix += Tc*molefracs[i];
285 Pc_mix_n += molefracs[i]*Zc;
286 Pc_mix_d += molefracs[i]*Vcrit_i(i);
289 if (
m_mw[i] > MW_H) {
292 }
else if (
m_mw[i] < MW_L) {
299 FP_mix_o += molefracs[i];
300 }
else if (mu_ri < 0.075) {
301 FP_mix_o += molefracs[i]*(1. + 30.55*pow(0.292 - Zc, 1.72));
302 }
else { FP_mix_o += molefracs[i]*(1. + 30.55*pow(0.292 - Zc, 1.72)
303 *fabs(0.96 + 0.1*(Tr - 0.7)));
312 if (spnames[i] ==
"He") {
313 FQ_mix_o += molefracs[i]*FQ_i(1.38,Tr,
m_mw[i]);
314 }
else if (spnames[i] ==
"H2") {
315 FQ_mix_o += molefracs[i]*(FQ_i(0.76,Tr,
m_mw[i]));
316 }
else if (spnames[i] ==
"D2") {
317 FQ_mix_o += molefracs[i]*(FQ_i(0.52,Tr,
m_mw[i]));
319 FQ_mix_o += molefracs[i];
323 double Tr_mix = tKelvin/Tc_mix;
324 double Pc_mix =
GasConstant*Tc_mix*Pc_mix_n/Pc_mix_d;
326 double ratio = MW_H/MW_L;
327 double ksi = pow(
GasConstant*Tc_mix*3.6277*pow(10.0,53.0)/(pow(MW_mix,3)
328 *pow(Pc_mix,4)),1.0/6.0);
330 if (ratio > 9 && x_H > 0.05 && x_H < 0.7) {
331 FQ_mix_o *= 1 - 0.01*pow(ratio,0.87);
335 double Z1m = (0.807*pow(Tr_mix,0.618) - 0.357*exp(-0.449*Tr_mix)
336 + 0.340*exp(-4.058*Tr_mix)+0.018)*FP_mix_o*FQ_mix_o;
341 if (Pr_mix < Pvp_mix/Pc_mix) {
342 double alpha = 3.262 + 14.98*pow(Pr_mix,5.508);
343 double beta = 1.390 + 5.746*Pr_mix;
344 Z2m = 0.600 + 0.760*pow(Pr_mix,alpha) + (0.6990*pow(Pr_mix,beta) -
347 throw CanteraError(
"HighPressureGasTransport::viscosity",
348 "State is outside the limits of the Lucas model, Tr <= 1");
350 }
else if ((Tr_mix > 1.0) && (Tr_mix < 40.0)) {
351 if ((Pr_mix > 0.0) && (Pr_mix <= 100.0)) {
352 double a_fac = 0.001245*exp(5.1726*pow(Tr_mix,-0.3286))/Tr_mix;
353 double b_fac = a_fac*(1.6553*Tr_mix - 1.2723);
354 double c_fac = 0.4489*exp(3.0578*pow(Tr_mix,-37.7332))/Tr_mix;
355 double d_fac = 1.7368*exp(2.2310*pow(Tr_mix,-7.6351))/Tr_mix;
356 double f_fac = 0.9425*exp(-0.1853*pow(Tr_mix,0.4489));
358 Z2m = Z1m*(1 + a_fac*pow(Pr_mix,1.3088)/(b_fac*pow(Pr_mix,f_fac)
359 + pow(1+c_fac*pow(Pr_mix,d_fac),-1)));
361 throw CanteraError(
"HighPressureGasTransport::viscosity",
362 "State is outside the limits of the Lucas model, 1.0 < Tr < 40");
365 throw CanteraError(
"HighPressureGasTransport::viscosity",
366 "State is outside the limits of the Lucas model, Tr > 40");
373 return Z2m*(1 + (FP_mix_o - 1)*pow(Y,-3))*(1 + (FQ_mix_o - 1)
374 *(1/Y - 0.007*pow(log(Y),4)))/(ksi*FP_mix_o*FQ_mix_o);
378double HighPressureGasTransport::Tcrit_i(
size_t i)
389double HighPressureGasTransport::Pcrit_i(
size_t i)
400double HighPressureGasTransport::Vcrit_i(
size_t i)
411double HighPressureGasTransport::Zcrit_i(
size_t i)
422vector<double> HighPressureGasTransport::store(
size_t i,
size_t nsp)
424 vector<double> molefracs(nsp);
426 vector<double> mf_temp(nsp, 0.0);
434double HighPressureGasTransport::FQ_i(
double Q,
double Tr,
double MW)
436 return 1.22*pow(Q,0.15)*(1 + 0.00385*pow(pow(Tr - 12.,2.),1./MW)
437 *fabs(Tr-12)/(Tr-12));
442double HighPressureGasTransport::setPcorr(
double Pr,
double Tr)
444 const static double Pr_lookup[17] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0,
445 1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 4.0, 5.0};
446 const static double DP_Rt_lookup[17] = {1.01, 1.01, 1.01, 1.01, 1.01, 1.01,
447 1.01, 1.02, 1.02, 1.02, 1.02, 1.03, 1.03, 1.04, 1.05, 1.06, 1.07};
448 const static double A_ij_lookup[17] = {0.038042, 0.067433, 0.098317,
449 0.137610, 0.175081, 0.216376, 0.314051, 0.385736, 0.514553, 0.599184,
450 0.557725, 0.593007, 0.696001, 0.790770, 0.502100, 0.837452, 0.890390};
451 const static double B_ij_lookup[17] = {1.52267, 2.16794, 2.42910, 2.77605,
452 2.98256, 3.11384, 3.50264, 3.07773, 3.54744, 3.61216, 3.41882, 3.18415,
453 3.37660, 3.27984, 3.39031, 3.23513, 3.13001};
454 const static double C_ij_lookup[17] = {0., 0., 0., 0., 0., 0., 0., 0.141211,
455 0.278407, 0.372683, 0.504894, 0.678469, 0.665702, 0., 0.602907, 0., 0.};
456 const static double E_ij_lookup[17] = {1., 1., 1., 1., 1., 1., 1., 13.45454,
457 14., 10.00900, 8.57519, 10.37483, 11.21674, 1., 6.19043, 1., 1.};
464 frac = (Pr - Pr_lookup[0])/(Pr_lookup[1] - Pr_lookup[0]);
466 for (
int j = 1; j < 17; j++) {
467 if (Pr_lookup[j] > Pr) {
468 frac = (Pr - Pr_lookup[j-1])/(Pr_lookup[j] - Pr_lookup[j-1]);
480 double P_corr_1 = DP_Rt_lookup[Pr_i]*(1.0 - A_ij_lookup[Pr_i]
481 *pow(Tr,-B_ij_lookup[Pr_i]))*(1-C_ij_lookup[Pr_i]
482 *pow(Tr,-E_ij_lookup[Pr_i]));
483 double P_corr_2 = DP_Rt_lookup[Pr_i+1]*(1.0 - A_ij_lookup[Pr_i+1]
484 *pow(Tr,-B_ij_lookup[Pr_i+1]))*(1-C_ij_lookup[Pr_i+1]
485 *pow(Tr,-E_ij_lookup[Pr_i+1]));
486 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< double > m_mw
Local copy of the species molecular weights.
double m_temp
Current value of the temperature at which the properties in this object are calculated (Kelvin).
virtual void updateDiff_T()
Update the binary diffusion coefficients.
bool m_bindiff_ok
Update boolean for the binary diffusivities at unit pressure.
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< double > m_w_ac
Pitzer acentric factor.
void getBinaryDiffCoeffs(const size_t ld, double *const d) override
Returns the matrix of binary diffusion coefficients.
double thermalConductivity() override
Returns the mixture thermal conductivity in W/m/K.
double viscosity() override
Viscosity of the mixture (kg /m /s)
void getThermalDiffCoeffs(double *const dt) override
Return the thermal diffusion coefficients (kg/m/s)
void getMultiDiffCoeffs(const size_t ld, double *const d) override
Return the Multicomponent diffusion coefficients. Units: [m^2/s].
bool m_l0000_ok
Boolean indicating viscosity is up to date.
void update_T() override
Update basic temperature-dependent quantities if the temperature has changed.
void eval_L0000(const double *const x)
Evaluate the L0000 matrices.
void updateThermal_T()
Update the temperature-dependent terms needed to compute the thermal conductivity and thermal diffusi...
void update_C() override
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.
double temperature() const
Temperature (K).
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
void getMoleFractions(double *const x) const
Get the species mole fraction vector.
const vector< string > & speciesNames() const
Return a const reference to the vector of species names.
virtual double molarVolume() const
Molar volume (m^3/kmol).
virtual double pressure() const
Return the thermodynamic pressure (Pa).
virtual double critTemperature() const
Critical temperature (K).
virtual void getCp_R_ref(double *cprt) const
Returns the vector of nondimensional constant pressure heat capacities of the reference state at the ...
virtual double critPressure() const
Critical pressure (Pa).
virtual double critVolume() const
Critical volume (m3/kmol).
virtual double satPressure(double t)
Return the saturation pressure given the temperature.
virtual double critCompressibility() const
Critical compressibility (unitless).
ThermoPhase * m_thermo
pointer to the object representing the phase
size_t m_nsp
Number of species.
const double GasConstant
Universal Gas Constant [J/kmol/K].
Namespace for the Cantera kernel.
const double Tiny
Small number to compare differences of mole fractions against.
int invert(DenseMatrix &A, size_t nn)
invert A. A is overwritten with A^-1.
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 and polynomial operations (see Templated Arr...