def Vetere(Tb, Tc, Pc, F=1): r'''Calculates enthalpy of vaporization at the boiling point, using the Vetere [1]_ CSP method. Required information are critical temperature and pressure, and boiling point. Equation taken from [2]_. The enthalpy of vaporization is given by: .. math:: \frac {\Delta H_{vap}}{RT_b} = \frac{\tau_b^{0.38} \left[ \ln P_c - 0.513 + \frac{0.5066}{P_cT_{br}^2}\right]} {\tau_b + F(1-\tau_b^{0.38})\ln T_{br}} Parameters ---------- Tb : float Boiling temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] F : float, optional Constant for a fluid, [-] Returns ------- Hvap : float Enthalpy of vaporization at the boiling point, [J/mol] Notes ----- The equation cannot be found in the original source. It is believed that a second article is its source, or that DIPPR staff have altered the formulation. Internal units of pressure are bar. Examples -------- Example as in [2]_, p2-487; exp: 25.73 >>> Vetere(294.0, 466.0, 5.55E6) 26363.430021286465 References ---------- .. [1] Vetere, Alessandro. "Methods to Predict the Vaporization Enthalpies at the Normal Boiling Temperature of Pure Compounds Revisited." Fluid Phase Equilibria 106, no. 1-2 (May 1, 1995): 1–10. doi:10.1016/0378-3812(94)02627-D. .. [2] Green, Don, and Robert Perry. Perry's Chemical Engineers' Handbook, Eighth Edition. McGraw-Hill Professional, 2007. ''' Tbr = Tb/Tc taub = 1-Tb/Tc Pc = Pc/1E5 term = taub**0.38*(log(Pc)-0.513 + 0.5066/Pc/Tbr**2) / (taub + F*(1-taub**0.38)*log(Tbr)) Hvap = R*Tb*term return Hvap
def Liu(Tb, Tc, Pc): r'''Calculates enthalpy of vaporization at the normal boiling point using the Liu [1]_ correlation, and a chemical's critical temperature, pressure and boiling point. The enthalpy of vaporization is given by: .. math:: \Delta H_{vap} = RT_b \left[ \frac{T_b}{220}\right]^{0.0627} \frac{ (1-T_{br})^{0.38} \ln(P_c/P_A)}{1-T_{br} + 0.38 T_{br} \ln T_{br}} Parameters ---------- Tb : float Boiling temperature of the fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- This formulation can be adjusted for lower boiling points, due to the use of a rationalized pressure relationship. The formulation is taken from the original article. A correction for alcohols and organic acids based on carbon number, which only modifies the boiling point, is available but not implemented. No sample calculations are available in the article. Internal units: Pa and K Examples -------- Same problem as in Perry's examples >>> Liu(294.0, 466.0, 5.55E6) 26378.566319606754 References ---------- .. [1] LIU, ZHI-YONG. "Estimation of Heat of Vaporization of Pure Liquid at Its Normal Boiling Temperature." Chemical Engineering Communications 184, no. 1 (February 1, 2001): 221-28. doi:10.1080/00986440108912849. ''' Tbr = Tb/Tc _Hvap = R*Tb*(Tb/220.)**0.0627*(1 - Tbr)**0.38*log(Pc/101325.) \ / (1 - Tbr + 0.38*Tbr*log(Tbr)) return _Hvap
def Lee_Kesler(T, Tc, Pc, omega): r'''Calculates vapor pressure of a fluid at arbitrary temperatures using a CSP relationship by [1]_; requires a chemical's critical temperature and acentric factor. The vapor pressure is given by: .. math:: \ln P^{sat}_r = f^{(0)} + \omega f^{(1)} f^{(0)} = 5.92714-\frac{6.09648}{T_r}-1.28862\ln T_r + 0.169347T_r^6 f^{(1)} = 15.2518-\frac{15.6875}{T_r} - 13.4721 \ln T_r + 0.43577T_r^6 Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] omega : float Acentric factor [-] Returns ------- Psat : float Vapor pressure at T [Pa] Notes ----- This equation appears in [1]_ in expanded form. The reduced pressure form of the equation ensures predicted vapor pressure cannot surpass the critical pressure. Examples -------- Example from [2]_; ethylbenzene at 347.2 K. >>> Lee_Kesler(347.2, 617.1, 36E5, 0.299) 13078.694162949312 References ---------- .. [1] Lee, Byung Ik, and Michael G. Kesler. "A Generalized Thermodynamic Correlation Based on Three-Parameter Corresponding States." AIChE Journal 21, no. 3 (1975): 510-527. doi:10.1002/aic.690210313. .. [2] Reid, Robert C..; Prausnitz, John M.;; Poling, Bruce E. The Properties of Gases and Liquids. McGraw-Hill Companies, 1987. ''' Tr = T/Tc f0 = 5.92714 - 6.09648/Tr - 1.28862*log(Tr) + 0.169347*Tr**6 f1 = 15.2518 - 15.6875/Tr - 13.4721*log(Tr) + 0.43577*Tr**6 return exp(f0 + omega*f1)*Pc
def Lee_Kesler(T, Tc, Pc, omega): r'''Calculates vapor pressure of a fluid at arbitrary temperatures using a CSP relationship by [1]_; requires a chemical's critical temperature and acentric factor. The vapor pressure is given by: .. math:: \ln P^{sat}_r = f^{(0)} + \omega f^{(1)} f^{(0)} = 5.92714-\frac{6.09648}{T_r}-1.28862\ln T_r + 0.169347T_r^6 f^{(1)} = 15.2518-\frac{15.6875}{T_r} - 13.4721 \ln T_r + 0.43577T_r^6 Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] omega : float Acentric factor [-] Returns ------- Psat : float Vapor pressure, [Pa] Notes ----- This equation appears in [1]_ in expanded form. It has been verified. The reduced pressure form of the equation ensures Examples -------- Example as in [2]_; Tr rounding source of tiny deviation >>> Lee_Kesler(347.2, 617.1, 36E5, 0.299) 13078.694162949312 References ---------- .. [1] Lee, Byung Ik, and Michael G. Kesler. "A Generalized Thermodynamic Correlation Based on Three-Parameter Corresponding States." AIChE Journal 21, no. 3 (1975): 510-527. doi:10.1002/aic.690210313. .. [2] Reid, Robert C..; Prausnitz, John M.;; Poling, Bruce E. The Properties of Gases and Liquids. McGraw-Hill Companies, 1987. ''' Tr = T / Tc f0 = 5.92714 - 6.09648 / Tr - 1.28862 * log(Tr) + 0.169347 * Tr**6 f1 = 15.2518 - 15.6875 / Tr - 13.4721 * log(Tr) + 0.43577 * Tr**6 P = exp(f0 + omega * f1) * Pc return P
def EQ115(T, A, B, C=0, D=0, E=0): r'''DIPPR Equation #115. No major uses; has been used as an alternate liquid viscosity expression, and as a model for vapor pressure. Only parameters A and B are required. .. math:: Y = \exp\left(A + \frac{B}{T} + C\log T + D T^2 + \frac{E}{T^2}\right) Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] Returns ------- Y : float Property [constant-specific] Examples -------- No coefficients found for this expression. References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' return exp(A+B/T+C*log(T)+D*T**2 + E/T**2)
def EQ115(T, A, B, C=0, D=0, E=0): r'''DIPPR Equation #115. No major uses; has been used as an alternate liquid viscosity expression, and as a model for vapor pressure. Only parameters A and B are required. .. math:: Y = \exp\left(A + \frac{B}{T} + C\log T + D T^2 + \frac{E}{T^2}\right) Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] Returns ------- Y : float Property [constant-specific] Examples -------- No coefficients found for this expression. References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' return exp(A + B / T + C * log(T) + D * T**2 + E / T**2)
def Brock_Bird(T, Tb, Tc, Pc): r'''Calculates air-water surface tension using the [1]_ emperical method. Old and tested. .. math:: \sigma = P_c^{2/3}T_c^{1/3}Q(1-T_r)^{11/9} Q = 0.1196 \left[ 1 + \frac{T_{br}\ln (P_c/1.01325)}{1-T_{br}}\right]-0.279 Parameters ---------- T : float Temperature of fluid [K] Tb : float Boiling temperature of the fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- sigma : float Liquid surface tension, N/m Notes ----- Numerous arrangements of this equation are available. This is DIPPR Procedure 7A: Method for the Surface Tension of Pure, Nonpolar, Nonhydrocarbon Liquids The exact equation is not in the original paper. If the equation yields a negative result, return None. Examples -------- p-dichloribenzene at 412.15 K, from DIPPR; value differs due to a slight difference in method. >>> Brock_Bird(412.15, 447.3, 685, 3.952E6) 0.02208448325192495 Chlorobenzene from Poling, as compared with a % error value at 293 K. >>> Brock_Bird(293.15, 404.75, 633.0, 4530000.0) 0.032985686413713036 References ---------- .. [1] Brock, James R., and R. Byron Bird. "Surface Tension and the Principle of Corresponding States." AIChE Journal 1, no. 2 (June 1, 1955): 174-77. doi:10.1002/aic.690010208 ''' Tbr = Tb / Tc Tr = T / Tc Pc = Pc / 1E5 # Convert to bar Q = 0.1196 * (1 + Tbr * log(Pc / 1.01325) / (1 - Tbr)) - 0.279 sigma = (Pc)**(2 / 3.) * Tc**(1 / 3.) * Q * (1 - Tr)**(11 / 9.) sigma = sigma / 1000 # convert to N/m return sigma
def LK_omega(Tb, Tc, Pc): r'''Estimates the acentric factor of a fluid using a correlation in [1]_. .. math:: \omega = \frac{\ln P_{br}^{sat} - 5.92714 + 6.09648/T_{br} + 1.28862 \ln T_{br} -0.169347T_{br}^6} {15.2518 - 15.6875/T_{br} - 13.4721 \ln T_{br} + 0.43577 T_{br}^6} Parameters ---------- Tb : float Boiling temperature of the fluid [K] Tc : float Critical temperature of the fluid [K] Pc : float Critical pressure of the fluid [Pa] Returns ------- omega : float Acentric factor of the fluid [-] Notes ----- Internal units are atmosphere and Kelvin. Example value from Reid (1987). Using ASPEN V8.4, LK method gives 0.325595. Examples -------- Isopropylbenzene >>> LK_omega(425.6, 631.1, 32.1E5) 0.32544249926397856 References ---------- .. [1] Lee, Byung Ik, and Michael G. Kesler. "A Generalized Thermodynamic Correlation Based on Three-Parameter Corresponding States." AIChE Journal 21, no. 3 (1975): 510-527. doi:10.1002/aic.690210313. ''' T_br = Tb / Tc omega = (log(101325.0 / Pc) - 5.92714 + 6.09648 / T_br + 1.28862 * log(T_br) - 0.169347 * T_br**6) / (15.2518 - 15.6875 / T_br - 13.4721 * log(T_br) + 0.43577 * T_br**6) return omega
def LK_omega(Tb, Tc, Pc): r'''Estimates the acentric factor of a fluid using a correlation in [1]_. .. math:: \omega = \frac{\ln P_{br}^{sat} - 5.92714 + 6.09648/T_{br} + 1.28862 \ln T_{br} -0.169347T_{br}^6} {15.2518 - 15.6875/T_{br} - 13.4721 \ln T_{br} + 0.43577 T_{br}^6} Parameters ---------- Tb : float Boiling temperature of the fluid [K] Tc : float Critical temperature of the fluid [K] Pc : float Critical pressure of the fluid [Pa] Returns ------- omega : float Acentric factor of the fluid [-] Notes ----- Internal units are atmosphere and Kelvin. Example value from Reid (1987). Using ASPEN V8.4, LK method gives 0.325595. Examples -------- Isopropylbenzene >>> LK_omega(425.6, 631.1, 32.1E5) 0.32544249926397856 References ---------- .. [1] Lee, Byung Ik, and Michael G. Kesler. "A Generalized Thermodynamic Correlation Based on Three-Parameter Corresponding States." AIChE Journal 21, no. 3 (1975): 510-527. doi:10.1002/aic.690210313. ''' T_br = Tb/Tc omega = (log(101325.0/Pc) - 5.92714 + 6.09648/T_br + 1.28862*log(T_br) - 0.169347*T_br**6)/(15.2518 - 15.6875/T_br - 13.4721*log(T_br) + 0.43577*T_br**6) return omega
def Riedel(Tb, Tc, Pc): r'''Calculates enthalpy of vaporization at the boiling point, using the Ridel [1]_ CSP method. Required information are critical temperature and pressure, and boiling point. Equation taken from [2]_ and [3]_. The enthalpy of vaporization is given by: .. math:: \Delta_{vap} H=1.093 T_b R\frac{\ln P_c-1.013}{0.930-T_{br}} Parameters ---------- Tb : float Boiling temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Hvap : float Enthalpy of vaporization at the normal boiling point, [J/mol] Notes ----- This equation has no example calculation in any source. The source has not been verified. It is equation 4-144 in Perry's. Perry's also claims that errors seldom surpass 5%. [2]_ is the source of example work here, showing a calculation at 0.0% error. Internal units of pressure are bar. Examples -------- Pyridine, 0.0% err vs. exp: 35090 J/mol; from Poling [2]_. >>> Riedel(388.4, 620.0, 56.3E5) 35089.78989646058 References ---------- .. [1] Riedel, L. "Eine Neue Universelle Dampfdruckformel Untersuchungen Uber Eine Erweiterung Des Theorems Der Ubereinstimmenden Zustande. Teil I." Chemie Ingenieur Technik 26, no. 2 (February 1, 1954): 83-89. doi:10.1002/cite.330260206. .. [2] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. .. [3] Green, Don, and Robert Perry. Perry's Chemical Engineers' Handbook, Eighth Edition. McGraw-Hill Professional, 2007. ''' Pc = Pc/1E5 # Pa to bar Tbr = Tb/Tc _Hvap = 1.093*Tb*R*(log(Pc)-1.013)/(0.93-Tbr) return _Hvap
def collision_integral_Kim_Monroe(Tstar, l=1, s=1): r'''Calculates Lennard-Jones collision integral for any of 16 values of (l,j) for the wide range of 0.3 < Tstar < 400. Values are accurate to 0.007 % of actual values, but the calculation of actual values is computationally intensive and so these simplifications are used, developed in [1]_. .. math:: \Omega^{(l,s)*} = A^{(l,s)} + \sum_{k=1}^6 \left[ \frac{B_k^{(l,s)}} {(T^*)^k} + C_k^{(l,s)} (\ln T^*)^k \right] Parameters ---------- Tstar : float Reduced temperature of the fluid [-] l : int term s : int term Returns ------- Omega : float Collision integral of A and B Notes ----- Acceptable pairs of (l,s) are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), and (4, 4). .. math:: T^* = \frac{k_b T}{\epsilon} Examples -------- >>> collision_integral_Kim_Monroe(400, 1, 1) 0.4141818082392228 References ---------- .. [1] Kim, Sun Ung, and Charles W. Monroe. "High-Accuracy Calculations of Sixteen Collision Integrals for Lennard-Jones (12-6) Gases and Their Interpolation to Parameterize Neon, Argon, and Krypton." Journal of Computational Physics 273 (September 15, 2014): 358-73. doi:10.1016/j.jcp.2014.05.018. ''' if (l, s) not in As_collision: raise Exception('Input values of l and s are not supported') omega = As_collision[(l, s)] for ki in range(6): Bs = Bs_collision[(l, s)] Cs = Cs_collision[(l, s)] omega += Bs[ki] / Tstar**(ki + 1) + Cs[ki] * log(Tstar)**(ki + 1) return omega
def collision_integral_Kim_Monroe(Tstar, l=1, s=1): r'''Calculates Lennard-Jones collision integral for any of 16 values of (l,j) for the wide range of 0.3 < Tstar < 400. Values are accurate to 0.007 % of actual values, but the calculation of actual values is computationally intensive and so these simplifications are used, developed in [1]_. .. math:: \Omega^{(l,s)*} = A^{(l,s)} + \sum_{k=1}^6 \left[ \frac{B_k^{(l,s)}} {(T^*)^k} + C_k^{(l,s)} (\ln T^*)^k \right] Parameters ---------- Tstar : float Reduced temperature of the fluid [-] l : int term s : int term Returns ------- Omega : float Collision integral of A and B Notes ----- Acceptable pairs of (l,s) are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), and (4, 4). .. math:: T^* = \frac{k_b T}{\epsilon} Examples -------- >>> collision_integral_Kim_Monroe(400, 1, 1) 0.4141818082392228 References ---------- .. [1] Kim, Sun Ung, and Charles W. Monroe. "High-Accuracy Calculations of Sixteen Collision Integrals for Lennard-Jones (12-6) Gases and Their Interpolation to Parameterize Neon, Argon, and Krypton." Journal of Computational Physics 273 (September 15, 2014): 358-73. doi:10.1016/j.jcp.2014.05.018. ''' if (l, s) not in As_collision: raise Exception('Input values of l and s are not supported') omega = As_collision[(l, s)] for ki in range(6): Bs = Bs_collision[(l, s)] Cs = Cs_collision[(l, s)] omega += Bs[ki]/Tstar**(ki+1) + Cs[ki]*log(Tstar)**(ki+1) return omega
def Clapeyron(T, Tc, Pc, dZ=1, Psat=101325): r'''Calculates enthalpy of vaporization at arbitrary temperatures using the Clapeyron equation. The enthalpy of vaporization is given by: .. math:: \Delta H_{vap} = RT \Delta Z \frac{\ln (P_c/Psat)}{(1-T_{r})} Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] dZ : float Change in compressibility factor between liquid and gas, [] Psat : float Saturation pressure of fluid [Pa], optional Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- No original source is available for this equation. [1]_ claims this equation overpredicts enthalpy by several percent. Under Tr = 0.8, dZ = 1 is a reasonable assumption. This equation is most accurate at the normal boiling point. Internal units are bar. WARNING: I believe it possible that the adjustment for pressure may be incorrect Examples -------- Problem from Perry's examples. >>> Clapeyron(T=294.0, Tc=466.0, Pc=5.55E6) 26512.354585061985 References ---------- .. [1] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. ''' Tr = T/Tc Hvap = R*T*dZ*log(Pc/Psat)/(1-Tr) return Hvap
def Chen(Tb, Tc, Pc): r'''Calculates enthalpy of vaporization using the Chen [1]_ correlation and a chemical's critical temperature, pressure and boiling point. The enthalpy of vaporization is given by: .. math:: \Delta H_{vb} = RT_b \frac{3.978 T_r - 3.958 + 1.555 \ln P_c}{1.07 - T_r} Parameters ---------- Tb : float Boiling temperature of the fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- The formulation presented in the original article is similar, but uses units of atm and calorie instead. The form in [2]_ has adjusted for this. A method for estimating enthalpy of vaporization at other conditions has also been developed, but the article is unclear on its implementation. Based on the Pitzer correlation. Internal units: bar and K Examples -------- Same problem as in Perry's examples. >>> Chen(294.0, 466.0, 5.55E6) 26705.893506174052 References ---------- .. [1] Chen, N. H. "Generalized Correlation for Latent Heat of Vaporization." Journal of Chemical & Engineering Data 10, no. 2 (April 1, 1965): 207-10. doi:10.1021/je60025a047 .. [2] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. ''' Tbr = Tb/Tc Pc = Pc/1E5 # Pa to bar _Hvap = R*Tb*(3.978*Tbr - 3.958 + 1.555*log(Pc))/(1.07-Tbr) return _Hvap
def boiling_critical_relation(T, Tb, Tc, Pc): r'''Calculates vapor pressure of a fluid at arbitrary temperatures using a CSP relationship as in [1]_; requires a chemical's critical temperature and pressure as well as boiling point. The vapor pressure is given by: .. math:: \ln P^{sat}_r = h\left( 1 - \frac{1}{T_r}\right) h = T_{br} \frac{\ln(P_c/101325)}{1-T_{br}} Parameters ---------- T : float Temperature of fluid [K] Tb : float Boiling temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Psat : float Vapor pressure, [Pa] Notes ----- Units are Pa. Formulation makes intuitive sense; a logarithmic form of interpolation. Examples -------- Example as in [1]_ for ethylbenzene >>> boiling_critical_relation(347.2, 409.3, 617.1, 36E5) 15209.467273093938 References ---------- .. [1] Reid, Robert C..; Prausnitz, John M.;; Poling, Bruce E. The Properties of Gases and Liquids. McGraw-Hill Companies, 1987. ''' Tbr = Tb / Tc Tr = T / Tc h = Tbr * log(Pc / 101325.) / (1 - Tbr) P = exp(h * (1 - 1 / Tr)) * Pc return P
def solubility_eutectic(T, Tm, Hm, Cpl=0, Cps=0, gamma=1): r'''Returns the maximum solubility of a solute in a solvent. .. math:: \ln x_i^L \gamma_i^L = \frac{\Delta H_{m,i}}{RT}\left( 1 - \frac{T}{T_{m,i}}\right) - \frac{\Delta C_{p,i}(T_{m,i}-T)}{RT} + \frac{\Delta C_{p,i}}{R}\ln\frac{T_m}{T} \Delta C_{p,i} = C_{p,i}^L - C_{p,i}^S Parameters ---------- T : float Temperature of the system [K] Tm : float Melting temperature of the solute [K] Hm : float Heat of melting at the melting temperature of the solute [J/mol] Cpl : float, optional Molar heat capacity of the solute as a liquid [J/mol/K] Cpls: float, optional Molar heat capacity of the solute as a solid [J/mol/K] gamma : float, optional Activity coefficient of the solute as a liquid [-] Returns ------- x : float Mole fraction of solute at maximum solubility [-] Notes ----- gamma is of the solute in liquid phase Examples -------- From [1]_, matching example >>> solubility_eutectic(T=260., Tm=278.68, Hm=9952., Cpl=0, Cps=0, gamma=3.0176) 0.24340068761677464 References ---------- .. [1] Gmehling, Jurgen. Chemical Thermodynamics: For Process Simulation. Weinheim, Germany: Wiley-VCH, 2012. ''' dCp = Cpl - Cps x = exp(-Hm / R / T * (1 - T / Tm) + dCp * (Tm - T) / R / T - dCp / R * log(Tm / T)) / gamma return x
def solubility_eutectic(T, Tm, Hm, Cpl=0, Cps=0, gamma=1): r'''Returns the maximum solubility of a solute in a solvent. .. math:: \ln x_i^L \gamma_i^L = \frac{\Delta H_{m,i}}{RT}\left( 1 - \frac{T}{T_{m,i}}\right) - \frac{\Delta C_{p,i}(T_{m,i}-T)}{RT} + \frac{\Delta C_{p,i}}{R}\ln\frac{T_m}{T} \Delta C_{p,i} = C_{p,i}^L - C_{p,i}^S Parameters ---------- T : float Temperature of the system [K] Tm : float Melting temperature of the solute [K] Hm : float Heat of melting at the melting temperature of the solute [J/mol] Cpl : float, optional Molar heat capacity of the solute as a liquid [J/mol/K] Cpls: float, optional Molar heat capacity of the solute as a solid [J/mol/K] gamma : float, optional Activity coefficient of the solute as a liquid [-] Returns ------- x : float Mole fraction of solute at maximum solubility [-] Notes ----- gamma is of the solute in liquid phase Examples -------- From [1]_, matching example >>> solubility_eutectic(T=260., Tm=278.68, Hm=9952., Cpl=0, Cps=0, gamma=3.0176) 0.24340068761677464 References ---------- .. [1] Gmehling, Jurgen. Chemical Thermodynamics: For Process Simulation. Weinheim, Germany: Wiley-VCH, 2012. ''' dCp = Cpl-Cps x = exp(- Hm/R/T*(1-T/Tm) + dCp*(Tm-T)/R/T - dCp/R*log(Tm/T))/gamma return x
def boiling_critical_relation(T, Tb, Tc, Pc): r'''Calculates vapor pressure of a fluid at arbitrary temperatures using a CSP relationship as in [1]_; requires a chemical's critical temperature and pressure as well as boiling point. The vapor pressure is given by: .. math:: \ln P^{sat}_r = h\left( 1 - \frac{1}{T_r}\right) h = T_{br} \frac{\ln(P_c/101325)}{1-T_{br}} Parameters ---------- T : float Temperature of fluid [K] Tb : float Boiling temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Psat : float Vapor pressure at T [Pa] Notes ----- Units are Pa. Formulation makes intuitive sense; a logarithmic form of interpolation. Examples -------- Example as in [1]_ for ethylbenzene >>> boiling_critical_relation(347.2, 409.3, 617.1, 36E5) 15209.467273093938 References ---------- .. [1] Reid, Robert C..; Prausnitz, John M.;; Poling, Bruce E. The Properties of Gases and Liquids. McGraw-Hill Companies, 1987. ''' Tbr = Tb/Tc Tr = T/Tc h = Tbr*log(Pc/101325.)/(1 - Tbr) return exp(h*(1-1/Tr))*Pc
def EQ101(T, A, B, C, D, E): r'''DIPPR Equation # 101. Used in calculating vapor pressure, sublimation pressure, and liquid viscosity. All 5 parameters are required. E is often an integer. As the model is exponential, a sufficiently high temperature will cause an OverflowError. A negative temperature (or just low, if fit poorly) may cause a math domain error. .. math:: Y = \exp\left(A + \frac{B}{T} + C\cdot \ln T + D \cdot T^E\right) Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] Returns ------- Y : float Property [constant-specific] Notes ----- This function is not integrable for either dT or Y/T dT. Examples -------- Water vapor pressure; DIPPR coefficients normally listed in Pa. >>> EQ101(300, 73.649, -7258.2, -7.3037, 4.1653E-6, 2) 3537.44834545549 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' return exp(A + B / T + C * log(T) + D * T**E)
def EQ101(T, A, B, C, D, E): r'''DIPPR Equation # 101. Used in calculating vapor pressure, sublimation pressure, and liquid viscosity. All 5 parameters are required. E is often an integer. As the model is exponential, a sufficiently high temperature will cause an OverflowError. A negative temperature (or just low, if fit poorly) may cause a math domain error. .. math:: Y = \exp\left(A + \frac{B}{T} + C\cdot \ln T + D \cdot T^E\right) Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] Returns ------- Y : float Property [constant-specific] Notes ----- This function is not integrable for either dT or Y/T dT. Examples -------- Water vapor pressure; DIPPR coefficients normally listed in Pa. >>> EQ101(300, 73.649, -7258.2, -7.3037, 4.1653E-6, 2) 3537.44834545549 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' return exp(A + B/T + C*log(T) + D*T**E)
def BVirial_Pitzer_Curl(T, Tc, Pc, omega, order=0): r'''Calculates the second virial coefficient using the model in [1]_. Designed for simple calculations. .. math:: B_r=B^{(0)}+\omega B^{(1)} B^{(0)}=0.1445-0.33/T_r-0.1385/T_r^2-0.0121/T_r^3 B^{(1)} = 0.073+0.46/T_r-0.5/T_r^2 -0.097/T_r^3 - 0.0073/T_r^8 Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of the fluid [Pa] omega : float Acentric factor for fluid, [-] order : int, optional Order of the calculation. 0 for the calculation of B itself; for 1/2/3, the first/second/third derivative of B with respect to temperature; and for -1/-2, the first/second indefinite integral of B with respect to temperature. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- B : float Second virial coefficient in density form or its integral/derivative if specified, [m^3/mol or m^3/mol/K^order] Notes ----- Analytical models for derivatives and integrals are available for orders -2, -1, 1, 2, and 3, all obtained with SymPy. For first temperature derivative of B: .. math:: \frac{d B^{(0)}}{dT} = \frac{33 Tc}{100 T^{2}} + \frac{277 Tc^{2}}{1000 T^{3}} + \frac{363 Tc^{3}}{10000 T^{4}} \frac{d B^{(1)}}{dT} = - \frac{23 Tc}{50 T^{2}} + \frac{Tc^{2}}{T^{3}} + \frac{291 Tc^{3}}{1000 T^{4}} + \frac{73 Tc^{8}}{1250 T^{9}} For the second temperature derivative of B: .. math:: \frac{d^2 B^{(0)}}{dT^2} = - \frac{3 Tc}{5000 T^{3}} \left(1100 + \frac{1385 Tc}{T} + \frac{242 Tc^{2}}{T^{2}}\right) \frac{d^2 B^{(1)}}{dT^2} = \frac{Tc}{T^{3}} \left(\frac{23}{25} - \frac{3 Tc}{T} - \frac{291 Tc^{2}}{250 T^{2}} - \frac{657 Tc^{7}}{1250 T^{7}}\right) For the third temperature derivative of B: .. math:: \frac{d^3 B^{(0)}}{dT^3} = \frac{3 Tc}{500 T^{4}} \left(330 + \frac{554 Tc}{T} + \frac{121 Tc^{2}}{T^{2}}\right) \frac{d^3 B^{(1)}}{dT^3} = \frac{3 Tc}{T^{4}} \left(- \frac{23}{25} + \frac{4 Tc}{T} + \frac{97 Tc^{2}}{50 T^{2}} + \frac{219 Tc^{7}}{125 T^{7}}\right) For the first indefinite integral of B: .. math:: \int{B^{(0)}} dT = \frac{289 T}{2000} - \frac{33 Tc}{100} \log{\left (T \right )} + \frac{1}{20000 T^{2}} \left(2770 T Tc^{2} + 121 Tc^{3}\right) \int{B^{(1)}} dT = \frac{73 T}{1000} + \frac{23 Tc}{50} \log{\left (T \right )} + \frac{1}{70000 T^{7}} \left(35000 T^{6} Tc^{2} + 3395 T^{5} Tc^{3} + 73 Tc^{8}\right) For the second indefinite integral of B: .. math:: \int\int B^{(0)} dT dT = \frac{289 T^{2}}{4000} - \frac{33 T}{100} Tc \log{\left (T \right )} + \frac{33 T}{100} Tc + \frac{277 Tc^{2}}{2000} \log{\left (T \right )} - \frac{121 Tc^{3}}{20000 T} \int\int B^{(1)} dT dT = \frac{73 T^{2}}{2000} + \frac{23 T}{50} Tc \log{\left (T \right )} - \frac{23 T}{50} Tc + \frac{Tc^{2}}{2} \log{\left (T \right )} - \frac{1}{420000 T^{6}} \left(20370 T^{5} Tc^{3} + 73 Tc^{8}\right) Examples -------- Example matching that in BVirial_Abbott, for isobutane. >>> BVirial_Pitzer_Curl(510., 425.2, 38E5, 0.193) -0.0002084535541385102 References ---------- .. [1] Pitzer, Kenneth S., and R. F. Curl. "The Volumetric and Thermodynamic Properties of Fluids. III. Empirical Equation for the Second Virial Coefficient1." Journal of the American Chemical Society 79, no. 10 (May 1, 1957): 2369-70. doi:10.1021/ja01567a007. ''' Tr = T/Tc if order == 0: B0 = 0.1445 - 0.33/Tr - 0.1385/Tr**2 - 0.0121/Tr**3 B1 = 0.073 + 0.46/Tr - 0.5/Tr**2 - 0.097/Tr**3 - 0.0073/Tr**8 elif order == 1: B0 = Tc*(3300*T**2 + 2770*T*Tc + 363*Tc**2)/(10000*T**4) B1 = Tc*(-2300*T**7 + 5000*T**6*Tc + 1455*T**5*Tc**2 + 292*Tc**7)/(5000*T**9) elif order == 2: B0 = -3*Tc*(1100*T**2 + 1385*T*Tc + 242*Tc**2)/(5000*T**5) B1 = Tc*(1150*T**7 - 3750*T**6*Tc - 1455*T**5*Tc**2 - 657*Tc**7)/(1250*T**10) elif order == 3: B0 = 3*Tc*(330*T**2 + 554*T*Tc + 121*Tc**2)/(500*T**6) B1 = 3*Tc*(-230*T**7 + 1000*T**6*Tc + 485*T**5*Tc**2 + 438*Tc**7)/(250*T**11) elif order == -1: B0 = 289*T/2000 - 33*Tc*log(T)/100 + (2770*T*Tc**2 + 121*Tc**3)/(20000*T**2) B1 = 73*T/1000 + 23*Tc*log(T)/50 + (35000*T**6*Tc**2 + 3395*T**5*Tc**3 + 73*Tc**8)/(70000*T**7) elif order == -2: B0 = 289*T**2/4000 - 33*T*Tc*log(T)/100 + 33*T*Tc/100 + 277*Tc**2*log(T)/2000 - 121*Tc**3/(20000*T) B1 = 73*T**2/2000 + 23*T*Tc*log(T)/50 - 23*T*Tc/50 + Tc**2*log(T)/2 - (20370*T**5*Tc**3 + 73*Tc**8)/(420000*T**6) else: raise Exception('Only orders -2, -1, 0, 1, 2 and 3 are supported.') Br = B0 + omega*B1 return Br*R*Tc/Pc
def UNIQUAC(xs, rs, qs, taus): r'''Calculates the activity coefficients of each species in a mixture using the Universal quasi-chemical (UNIQUAC) equation, given their mole fractions, `rs`, `qs`, and dimensionless interaction parameters. The interaction parameters are normally correlated with temperature, and need to be calculated separately. .. math:: \ln \gamma_i = \ln \frac{\Phi_i}{x_i} + \frac{z}{2} q_i \ln \frac{\theta_i}{\Phi_i}+ l_i - \frac{\Phi_i}{x_i}\sum_j^N x_j l_j - q_i \ln\left( \sum_j^N \theta_j \tau_{ji}\right)+ q_i - q_i\sum_j^N \frac{\theta_j \tau_{ij}}{\sum_k^N \theta_k \tau_{kj}} \theta_i = \frac{x_i q_i}{\displaystyle\sum_{j=1}^{n} x_j q_j} \Phi_i = \frac{x_i r_i}{\displaystyle\sum_{j=1}^{n} x_j r_j} l_i = \frac{z}{2}(r_i - q_i) - (r_i - 1) Parameters ---------- xs : list[float] Liquid mole fractions of each species, [-] rs : list[float] Van der Waals volume parameters for each species, [-] qs : list[float] Surface area parameters for each species, [-] taus : list[list[float]] Dimensionless interaction parameters of each compound with each other, [-] Returns ------- gammas : list[float] Activity coefficient for each species in the liquid mixture, [-] Notes ----- This model needs N^2 parameters. The original expression for the interaction parameters is as follows: .. math:: \tau_{ji} = \exp\left(\frac{-\Delta u_{ij}}{RT}\right) However, it is seldom used. Most correlations for the interaction parameters include some of the terms shown in the following form: .. math:: \ln \tau{ij} =a_{ij}+\frac{b_{ij}}{T}+c_{ij}\ln T + d_{ij}T + \frac{e_{ij}}{T^2} This model is recast in a slightly more computationally efficient way in [2]_, as shown below: .. math:: \ln \gamma_i = \ln \gamma_i^{res} + \ln \gamma_i^{comb} \ln \gamma_i^{res} = q_i \left(1 - \ln\frac{\sum_j^N q_j x_j \tau_{ji}} {\sum_j^N q_j x_j}- \sum_j \frac{q_k x_j \tau_{ij}}{\sum_k q_k x_k \tau_{kj}}\right) \ln \gamma_i^{comb} = (1 - V_i + \ln V_i) - \frac{z}{2}q_i\left(1 - \frac{V_i}{F_i} + \ln \frac{V_i}{F_i}\right) V_i = \frac{r_i}{\sum_j^N r_j x_j} F_i = \frac{q_i}{\sum_j q_j x_j} Examples -------- Ethanol-water example, at 343.15 K and 1 MPa: >>> UNIQUAC(xs=[0.252, 0.748], rs=[2.1055, 0.9200], qs=[1.972, 1.400], ... taus=[[1.0, 1.0919744384510301], [0.37452902779205477, 1.0]]) [2.35875137797083, 1.2442093415968987] References ---------- .. [1] Abrams, Denis S., and John M. Prausnitz. "Statistical Thermodynamics of Liquid Mixtures: A New Expression for the Excess Gibbs Energy of Partly or Completely Miscible Systems." AIChE Journal 21, no. 1 (January 1, 1975): 116-28. doi:10.1002/aic.690210115. .. [2] Gmehling, Jurgen, Barbel Kolbe, Michael Kleiber, and Jurgen Rarey. Chemical Thermodynamics for Process Simulation. 1st edition. Weinheim: Wiley-VCH, 2012. .. [3] Maurer, G., and J. M. Prausnitz. "On the Derivation and Extension of the Uniquac Equation." Fluid Phase Equilibria 2, no. 2 (January 1, 1978): 91-99. doi:10.1016/0378-3812(78)85002-X. ''' cmps = range(len(xs)) rsxs = sum([rs[i] * xs[i] for i in cmps]) phis = [rs[i] * xs[i] / rsxs for i in cmps] qsxs = sum([qs[i] * xs[i] for i in cmps]) vs = [qs[i] * xs[i] / qsxs for i in cmps] Ss = [sum([vs[j] * taus[j][i] for j in cmps]) for i in cmps] loggammacs = [ log(phis[i] / xs[i]) + 1 - phis[i] / xs[i] - 5 * qs[i] * (log(phis[i] / vs[i]) + 1 - phis[i] / vs[i]) for i in cmps ] loggammars = [ qs[i] * (1 - log(Ss[i]) - sum([taus[i][j] * vs[j] / Ss[j] for j in cmps])) for i in cmps ] return [exp(loggammacs[i] + loggammars[i]) for i in cmps]
def BVirial_Tsonopoulos(T, Tc, Pc, omega, order=0): r'''Calculates the second virial coefficient using the model in [1]_. .. math:: B_r=B^{(0)}+\omega B^{(1)} B^{(0)}= 0.1445-0.330/T_r - 0.1385/T_r^2 - 0.0121/T_r^3 - 0.000607/T_r^8 B^{(1)} = 0.0637+0.331/T_r^2-0.423/T_r^3 -0.423/T_r^3 - 0.008/T_r^8 Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of the fluid [Pa] omega : float Acentric factor for fluid, [-] order : int, optional Order of the calculation. 0 for the calculation of B itself; for 1/2/3, the first/second/third derivative of B with respect to temperature; and for -1/-2, the first/second indefinite integral of B with respect to temperature. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- B : float Second virial coefficient in density form or its integral/derivative if specified, [m^3/mol or m^3/mol/K^order] Notes ----- A more complete expression is also available, in BVirial_Tsonopoulos_extended. Analytical models for derivatives and integrals are available for orders -2, -1, 1, 2, and 3, all obtained with SymPy. For first temperature derivative of B: .. math:: \frac{d B^{(0)}}{dT} = \frac{33 Tc}{100 T^{2}} + \frac{277 Tc^{2}}{1000 T^{3}} + \frac{363 Tc^{3}}{10000 T^{4}} + \frac{607 Tc^{8}}{125000 T^{9}} \frac{d B^{(1)}}{dT} = - \frac{331 Tc^{2}}{500 T^{3}} + \frac{1269 Tc^{3}}{1000 T^{4}} + \frac{8 Tc^{8}}{125 T^{9}} For the second temperature derivative of B: .. math:: \frac{d^2 B^{(0)}}{dT^2} = - \frac{3 Tc}{125000 T^{3}} \left(27500 + \frac{34625 Tc}{T} + \frac{6050 Tc^{2}}{T^{2}} + \frac{1821 Tc^{7}}{T^{7}}\right) \frac{d^2 B^{(1)}}{dT^2} = \frac{3 Tc^{2}}{500 T^{4}} \left(331 - \frac{846 Tc}{T} - \frac{96 Tc^{6}}{T^{6}}\right) For the third temperature derivative of B: .. math:: \frac{d^3 B^{(0)}}{dT^3} = \frac{3 Tc}{12500 T^{4}} \left(8250 + \frac{13850 Tc}{T} + \frac{3025 Tc^{2}}{T^{2}} + \frac{1821 Tc^{7}}{T^{7}}\right) \frac{d^3 B^{(1)}}{dT^3} = \frac{3 Tc^{2}}{250 T^{5}} \left(-662 + \frac{2115 Tc}{T} + \frac{480 Tc^{6}}{T^{6}}\right) For the first indefinite integral of B: .. math:: \int{B^{(0)}} dT = \frac{289 T}{2000} - \frac{33 Tc}{100} \log{\left (T \right )} + \frac{1}{7000000 T^{7}} \left(969500 T^{6} Tc^{2} + 42350 T^{5} Tc^{3} + 607 Tc^{8}\right) \int{B^{(1)}} dT = \frac{637 T}{10000} - \frac{1}{70000 T^{7}} \left(23170 T^{6} Tc^{2} - 14805 T^{5} Tc^{3} - 80 Tc^{8}\right) For the second indefinite integral of B: .. math:: \int\int B^{(0)} dT dT = \frac{289 T^{2}}{4000} - \frac{33 T}{100} Tc \log{\left (T \right )} + \frac{33 T}{100} Tc + \frac{277 Tc^{2}}{2000} \log{\left (T \right )} - \frac{1}{42000000 T^{6}} \left(254100 T^{5} Tc^{3} + 607 Tc^{8}\right) \int\int B^{(1)} dT dT = \frac{637 T^{2}}{20000} - \frac{331 Tc^{2}}{1000} \log{\left (T \right )} - \frac{1}{210000 T^{6}} \left(44415 T^{5} Tc^{3} + 40 Tc^{8}\right) Examples -------- Example matching that in BVirial_Abbott, for isobutane. >>> BVirial_Tsonopoulos(510., 425.2, 38E5, 0.193) -0.00020935288308483694 References ---------- .. [1] Tsonopoulos, Constantine. "An Empirical Correlation of Second Virial Coefficients." AIChE Journal 20, no. 2 (March 1, 1974): 263-72. doi:10.1002/aic.690200209. ''' Tr = T/Tc if order == 0: B0 = 0.1445 - 0.33/Tr - 0.1385/Tr**2 - 0.0121/Tr**3 - 0.000607/Tr**8 B1 = 0.0637 + 0.331/Tr**2 - 0.423/Tr**3 - 0.008/Tr**8 elif order == 1: B0 = 33*Tc/(100*T**2) + 277*Tc**2/(1000*T**3) + 363*Tc**3/(10000*T**4) + 607*Tc**8/(125000*T**9) B1 = -331*Tc**2/(500*T**3) + 1269*Tc**3/(1000*T**4) + 8*Tc**8/(125*T**9) elif order == 2: B0 = -3*Tc*(27500 + 34625*Tc/T + 6050*Tc**2/T**2 + 1821*Tc**7/T**7)/(125000*T**3) B1 = 3*Tc**2*(331 - 846*Tc/T - 96*Tc**6/T**6)/(500*T**4) elif order == 3: B0 = 3*Tc*(8250 + 13850*Tc/T + 3025*Tc**2/T**2 + 1821*Tc**7/T**7)/(12500*T**4) B1 = 3*Tc**2*(-662 + 2115*Tc/T + 480*Tc**6/T**6)/(250*T**5) elif order == -1: B0 = 289*T/2000. - 33*Tc*log(T)/100. + (969500*T**6*Tc**2 + 42350*T**5*Tc**3 + 607*Tc**8)/(7000000.*T**7) B1 = 637*T/10000. - (23170*T**6*Tc**2 - 14805*T**5*Tc**3 - 80*Tc**8)/(70000.*T**7) elif order == -2: B0 = 289*T**2/4000. - 33*T*Tc*log(T)/100. + 33*T*Tc/100. + 277*Tc**2*log(T)/2000. - (254100*T**5*Tc**3 + 607*Tc**8)/(42000000.*T**6) B1 = 637*T**2/20000. - 331*Tc**2*log(T)/1000. - (44415*T**5*Tc**3 + 40*Tc**8)/(210000.*T**6) else: raise Exception('Only orders -2, -1, 0, 1, 2 and 3 are supported.') Br = (B0+omega*B1) return Br*R*Tc/Pc
def EQ127(T, A, B, C, D, E, F, G, order=0): r'''DIPPR Equation #127. Rarely used, and then only in calculating ideal-gas heat capacity. All 7 parameters are required. .. math:: Y = A+B\left[\frac{\left(\frac{C}{T}\right)^2\exp\left(\frac{C}{T} \right)}{\left(\exp\frac{C}{T}-1 \right)^2}\right] +D\left[\frac{\left(\frac{E}{T}\right)^2\exp\left(\frac{E}{T}\right)} {\left(\exp\frac{E}{T}-1 \right)^2}\right] +F\left[\frac{\left(\frac{G}{T}\right)^2\exp\left(\frac{G}{T}\right)} {\left(\exp\frac{G}{T}-1 \right)^2}\right] Parameters ---------- T : float Temperature, [K] A-G : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. All expressions can be obtained with SymPy readily. .. math:: \frac{d Y}{dT} = - \frac{B C^{3} e^{\frac{C}{T}}}{T^{4} \left(e^{\frac{C}{T}} - 1\right)^{2}} + \frac{2 B C^{3} e^{\frac{2 C}{T}}}{T^{4} \left(e^{\frac{C}{T}} - 1\right)^{3}} - \frac{2 B C^{2} e^{\frac{C}{T}}}{T^{3} \left(e^{\frac{C}{T}} - 1\right)^{2}} - \frac{D E^{3} e^{\frac{E}{T}}}{T^{4} \left(e^{\frac{E}{T}} - 1\right)^{2}} + \frac{2 D E^{3} e^{\frac{2 E}{T}}}{T^{4} \left(e^{\frac{E}{T}} - 1\right)^{3}} - \frac{2 D E^{2} e^{\frac{E}{T}}}{T^{3} \left(e^{\frac{E}{T}} - 1\right)^{2}} - \frac{F G^{3} e^{\frac{G}{T}}}{T^{4} \left(e^{\frac{G}{T}} - 1\right)^{2}} + \frac{2 F G^{3} e^{\frac{2 G}{T}}}{T^{4} \left(e^{\frac{G}{T}} - 1\right)^{3}} - \frac{2 F G^{2} e^{\frac{G}{T}}}{T^{3} \left(e^{\frac{G}{T}} - 1\right)^{2}} .. math:: \int Y dT = A T + \frac{B C^{2}}{C e^{\frac{C}{T}} - C} + \frac{D E^{2}}{E e^{\frac{E}{T}} - E} + \frac{F G^{2}}{G e^{\frac{G}{T}} - G} .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} + B C^{2} \left( \frac{1}{C T e^{\frac{C}{T}} - C T} + \frac{1}{C T} - \frac{1}{C^{2}} \log{\left (e^{\frac{C}{T}} - 1 \right )}\right) + D E^{2} \left( \frac{1}{E T e^{\frac{E}{T}} - E T} + \frac{1}{E T} - \frac{1}{E^{2}} \log{\left (e^{\frac{E}{T}} - 1 \right )}\right) + F G^{2} \left( \frac{1}{G T e^{\frac{G}{T}} - G T} + \frac{1}{G T} - \frac{1}{G^{2}} \log{\left (e^{\frac{G}{T}} - 1 \right )}\right) Examples -------- Ideal gas heat capacity of methanol; DIPPR coefficients normally in J/kmol/K >>> EQ127(20., 3.3258E4, 3.6199E4, 1.2057E3, 1.5373E7, 3.2122E3, -1.5318E7, 3.2122E3) 33258.0 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: return (A+B*((C/T)**2*exp(C/T)/(exp(C/T) - 1)**2) + D*((E/T)**2*exp(E/T)/(exp(E/T)-1)**2) + F*((G/T)**2*exp(G/T)/(exp(G/T)-1)**2)) elif order == 1: return (-B*C**3*exp(C/T)/(T**4*(exp(C/T) - 1)**2) + 2*B*C**3*exp(2*C/T)/(T**4*(exp(C/T) - 1)**3) - 2*B*C**2*exp(C/T)/(T**3*(exp(C/T) - 1)**2) - D*E**3*exp(E/T)/(T**4*(exp(E/T) - 1)**2) + 2*D*E**3*exp(2*E/T)/(T**4*(exp(E/T) - 1)**3) - 2*D*E**2*exp(E/T)/(T**3*(exp(E/T) - 1)**2) - F*G**3*exp(G/T)/(T**4*(exp(G/T) - 1)**2) + 2*F*G**3*exp(2*G/T)/(T**4*(exp(G/T) - 1)**3) - 2*F*G**2*exp(G/T)/(T**3*(exp(G/T) - 1)**2)) elif order == -1: return (A*T + B*C**2/(C*exp(C/T) - C) + D*E**2/(E*exp(E/T) - E) + F*G**2/(G*exp(G/T) - G)) elif order == -1j: return (A*log(T) + B*C**2*(1/(C*T*exp(C/T) - C*T) + 1/(C*T) - log(exp(C/T) - 1)/C**2) + D*E**2*(1/(E*T*exp(E/T) - E*T) + 1/(E*T) - log(exp(E/T) - 1)/E**2) + F*G**2*(1/(G*T*exp(G/T) - G*T) + 1/(G*T) - log(exp(G/T) - 1)/G**2)) else: raise Exception(order_not_found_msg)
def Sanjari(T, Tc, Pc, omega): r'''Calculates vapor pressure of a fluid at arbitrary temperatures using a CSP relationship by [1]_. Requires a chemical's critical temperature, pressure, and acentric factor. Although developed for refrigerants, should have some generality. The vapor pressure is given by: .. math:: P^{sat} = P_c\exp(f^{(0)} + \omega f^{(1)} + \omega^2 f^{(2)}) f^{(0)} = a_1 + \frac{a_2}{T_r} + a_3\ln T_r + a_4 T_r^{1.9} f^{(1)} = a_5 + \frac{a_6}{T_r} + a_7\ln T_r + a_8 T_r^{1.9} f^{(2)} = a_9 + \frac{a_{10}}{T_r} + a_{11}\ln T_r + a_{12} T_r^{1.9} Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] omega : float Acentric factor [-] Returns ------- Psat : float Vapor pressure, [Pa] Notes ----- a 1-12 are as follows: 6.83377, -5.76051, 0.90654, -1.16906, 5.32034, -28.1460, -58.0352, 23.57466, 18.19967, 16.33839, 65.6995, -35.9739. For a claimed fluid not included in the regression, R128, the claimed AARD was 0.428%. A re-calculation using 200 data points from 125.45 K to 343.90225 K evenly spaced by 1.09775 K as generated by NIST Webbook April 2016 produced an AARD of 0.644%. It is likely that the author's regression used more precision in its coefficients than was shown here. Nevertheless, the function is reproduced as shown in [1]_. For Tc=808 K, Pc=1100000 Pa, omega=1.1571, this function actually declines after 770 K. Examples -------- >>> Sanjari(347.2, 617.1, 36E5, 0.299) 13651.916109552498 References ---------- .. [1] Sanjari, Ehsan, Mehrdad Honarmand, Hamidreza Badihi, and Ali Ghaheri. "An Accurate Generalized Model for Predict Vapor Pressure of Refrigerants." International Journal of Refrigeration 36, no. 4 (June 2013): 1327-32. doi:10.1016/j.ijrefrig.2013.01.007. ''' Tr = T / Tc f0 = 6.83377 + -5.76051 / Tr + 0.90654 * log(Tr) + -1.16906 * Tr**1.9 f1 = 5.32034 + -28.1460 / Tr + -58.0352 * log(Tr) + 23.57466 * Tr**1.9 f2 = 18.19967 + 16.33839 / Tr + 65.6995 * log(Tr) + -35.9739 * Tr**1.9 P = Pc * exp(f0 + omega * f1 + omega**2 * f2) return P
def EQ100(T, A=0, B=0, C=0, D=0, E=0, F=0, G=0, order=0): r'''DIPPR Equation # 100. Used in calculating the molar heat capacities of liquids and solids, liquid thermal conductivity, and solid density. All parameters default to zero. As this is a straightforward polynomial, no restrictions on parameters apply. Note that high-order polynomials like this may need large numbers of decimal places to avoid unnecessary error. .. math:: Y = A + BT + CT^2 + DT^3 + ET^4 + FT^5 + GT^6 Parameters ---------- T : float Temperature, [K] A-G : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. All derivatives and integrals are easily computed with SymPy. .. math:: \frac{d Y}{dT} = B + 2 C T + 3 D T^{2} + 4 E T^{3} + 5 F T^{4} + 6 G T^{5} .. math:: \int Y dT = A T + \frac{B T^{2}}{2} + \frac{C T^{3}}{3} + \frac{D T^{4}}{4} + \frac{E T^{5}}{5} + \frac{F T^{6}}{6} + \frac{G T^{7}}{7} .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} + B T + \frac{C T^{2}} {2} + \frac{D T^{3}}{3} + \frac{E T^{4}}{4} + \frac{F T^{5}}{5} + \frac{G T^{6}}{6} Examples -------- Water liquid heat capacity; DIPPR coefficients normally listed in J/kmol/K. >>> EQ100(300, 276370., -2090.1, 8.125, -0.014116, 0.0000093701) 75355.81000000003 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: return A + T*(B + T*(C + T*(D + T*(E + T*(F + G*T))))) elif order == 1: return B + T*(2*C + T*(3*D + T*(4*E + T*(5*F + 6*G*T)))) elif order == -1: return T*(A + T*(B/2 + T*(C/3 + T*(D/4 + T*(E/5 + T*(F/6 + G*T/7)))))) elif order == -1j: return A*log(T) + T*(B + T*(C/2 + T*(D/3 + T*(E/4 + T*(F/5 + G*T/6))))) else: raise Exception(order_not_found_msg)
def Sanjari(T, Tc, Pc, omega): r'''Calculates vapor pressure of a fluid at arbitrary temperatures using a CSP relationship by [1]_. Requires a chemical's critical temperature, pressure, and acentric factor. Although developed for refrigerants, this model should have some general predictive ability. The vapor pressure of a chemical at `T` is given by: .. math:: P^{sat} = P_c\exp(f^{(0)} + \omega f^{(1)} + \omega^2 f^{(2)}) f^{(0)} = a_1 + \frac{a_2}{T_r} + a_3\ln T_r + a_4 T_r^{1.9} f^{(1)} = a_5 + \frac{a_6}{T_r} + a_7\ln T_r + a_8 T_r^{1.9} f^{(2)} = a_9 + \frac{a_{10}}{T_r} + a_{11}\ln T_r + a_{12} T_r^{1.9} Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] omega : float Acentric factor [-] Returns ------- Psat : float Vapor pressure, [Pa] Notes ----- a[1-12] are as follows: 6.83377, -5.76051, 0.90654, -1.16906, 5.32034, -28.1460, -58.0352, 23.57466, 18.19967, 16.33839, 65.6995, -35.9739. For a claimed fluid not included in the regression, R128, the claimed AARD was 0.428%. A re-calculation using 200 data points from 125.45 K to 343.90225 K evenly spaced by 1.09775 K as generated by NIST Webbook April 2016 produced an AARD of 0.644%. It is likely that the author's regression used more precision in its coefficients than was shown here. Nevertheless, the function is reproduced as shown in [1]_. For Tc=808 K, Pc=1100000 Pa, omega=1.1571, this function actually declines after 770 K. Examples -------- >>> Sanjari(347.2, 617.1, 36E5, 0.299) 13651.916109552498 References ---------- .. [1] Sanjari, Ehsan, Mehrdad Honarmand, Hamidreza Badihi, and Ali Ghaheri. "An Accurate Generalized Model for Predict Vapor Pressure of Refrigerants." International Journal of Refrigeration 36, no. 4 (June 2013): 1327-32. doi:10.1016/j.ijrefrig.2013.01.007. ''' Tr = T/Tc f0 = 6.83377 + -5.76051/Tr + 0.90654*log(Tr) + -1.16906*Tr**1.9 f1 = 5.32034 + -28.1460/Tr + -58.0352*log(Tr) + 23.57466*Tr**1.9 f2 = 18.19967 + 16.33839/Tr + 65.6995*log(Tr) + -35.9739*Tr**1.9 return Pc*exp(f0 + omega*f1 + omega**2*f2)
def EQ100(T, A=0, B=0, C=0, D=0, E=0, F=0, G=0, order=0): r'''DIPPR Equation # 100. Used in calculating the molar heat capacities of liquids and solids, liquid thermal conductivity, and solid density. All parameters default to zero. As this is a straightforward polynomial, no restrictions on parameters apply. Note that high-order polynomials like this may need large numbers of decimal places to avoid unnecessary error. .. math:: Y = A + BT + CT^2 + DT^3 + ET^4 + FT^5 + GT^6 Parameters ---------- T : float Temperature, [K] A-G : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. All derivatives and integrals are easily computed with SymPy. .. math:: \frac{d Y}{dT} = B + 2 C T + 3 D T^{2} + 4 E T^{3} + 5 F T^{4} + 6 G T^{5} .. math:: \int Y dT = A T + \frac{B T^{2}}{2} + \frac{C T^{3}}{3} + \frac{D T^{4}}{4} + \frac{E T^{5}}{5} + \frac{F T^{6}}{6} + \frac{G T^{7}}{7} .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} + B T + \frac{C T^{2}} {2} + \frac{D T^{3}}{3} + \frac{E T^{4}}{4} + \frac{F T^{5}}{5} + \frac{G T^{6}}{6} Examples -------- Water liquid heat capacity; DIPPR coefficients normally listed in J/kmol/K. >>> EQ100(300, 276370., -2090.1, 8.125, -0.014116, 0.0000093701) 75355.81000000003 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: return A + T * (B + T * (C + T * (D + T * (E + T * (F + G * T))))) elif order == 1: return B + T * (2 * C + T * (3 * D + T * (4 * E + T * (5 * F + 6 * G * T)))) elif order == -1: return T * (A + T * (B / 2 + T * (C / 3 + T * (D / 4 + T * (E / 5 + T * (F / 6 + G * T / 7)))))) elif order == -1j: return A * log(T) + T * (B + T * (C / 2 + T * (D / 3 + T * (E / 4 + T * (F / 5 + G * T / 6))))) else: raise Exception(order_not_found_msg)
def EQ104(T, A, B, C, D, E, order=0): r'''DIPPR Equation #104. Often used in calculating second virial coefficients of gases. All 5 parameters are required. C, D, and E are normally large values. .. math:: Y = A + \frac{B}{T} + \frac{C}{T^3} + \frac{D}{T^8} + \frac{E}{T^9} Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. All expressions can be obtained with SymPy readily. .. math:: \frac{d Y}{dT} = - \frac{B}{T^{2}} - \frac{3 C}{T^{4}} - \frac{8 D}{T^{9}} - \frac{9 E}{T^{10}} .. math:: \int Y dT = A T + B \log{\left (T \right )} - \frac{1}{56 T^{8}} \left(28 C T^{6} + 8 D T + 7 E\right) .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} - \frac{1}{72 T^{9}} \left(72 B T^{8} + 24 C T^{6} + 9 D T + 8 E\right) Examples -------- Water second virial coefficient; DIPPR coefficients normally dimensionless. >>> EQ104(300, 0.02222, -26.38, -16750000, -3.894E19, 3.133E21) -1.1204179007265156 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: T2 = T * T return A + (B + (C + (D + E / T) / (T2 * T2 * T)) / T2) / T elif order == 1: T2 = T * T T4 = T2 * T2 return (-B + (-3 * C + (-8 * D - 9 * E / T) / (T4 * T)) / T2) / T2 elif order == -1: return A * T + B * log(T) - (28 * C * T**6 + 8 * D * T + 7 * E) / (56 * T**8) elif order == -1j: return A * log(T) - (72 * B * T**8 + 24 * C * T**6 + 9 * D * T + 8 * E) / (72 * T**9) else: raise Exception(order_not_found_msg)
def EQ107(T, A=0, B=0, C=0, D=0, E=0, order=0): r'''DIPPR Equation #107. Often used in calculating ideal-gas heat capacity. All 5 parameters are required. Also called the Aly-Lee equation. .. math:: Y = A + B\left[\frac{C/T}{\sinh(C/T)}\right]^2 + D\left[\frac{E/T}{ \cosh(E/T)}\right]^2 Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. The derivative is obtained via SymPy; the integrals from Wolfram Alpha. .. math:: \frac{d Y}{dT} = \frac{2 B C^{3} \cosh{\left (\frac{C}{T} \right )}} {T^{4} \sinh^{3}{\left (\frac{C}{T} \right )}} - \frac{2 B C^{2}}{T^{3} \sinh^{2}{\left (\frac{C}{T} \right )}} + \frac{2 D E^{3} \sinh{\left (\frac{E}{T} \right )}}{T^{4} \cosh^{3}{\left (\frac{E}{T} \right )}} - \frac{2 D E^{2}}{T^{3} \cosh^{2}{\left (\frac{E}{T} \right )}} .. math:: \int Y dT = A T + \frac{B C}{\tanh{\left (\frac{C}{T} \right )}} - D E \tanh{\left (\frac{E}{T} \right )} .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} + \frac{B C}{T \tanh{ \left (\frac{C}{T} \right )}} - B \log{\left (\sinh{\left (\frac{C}{T} \right )} \right )} - \frac{D E}{T} \tanh{\left (\frac{E}{T} \right )} + D \log{\left (\cosh{\left (\frac{E}{T} \right )} \right )} Examples -------- Water ideal gas molar heat capacity; DIPPR coefficients normally in J/kmol/K >>> EQ107(300., 33363., 26790., 2610.5, 8896., 1169.) 33585.90452768923 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE .. [2] Aly, Fouad A., and Lloyd L. Lee. "Self-Consistent Equations for Calculating the Ideal Gas Heat Capacity, Enthalpy, and Entropy." Fluid Phase Equilibria 6, no. 3 (January 1, 1981): 169-79. doi:10.1016/0378-3812(81)85002-9. ''' if order == 0: return A + B * ((C / T) / sinh(C / T))**2 + D * ( (E / T) / cosh(E / T))**2 elif order == 1: return (2 * B * C**3 * cosh(C / T) / (T**4 * sinh(C / T)**3) - 2 * B * C**2 / (T**3 * sinh(C / T)**2) + 2 * D * E**3 * sinh(E / T) / (T**4 * cosh(E / T)**3) - 2 * D * E**2 / (T**3 * cosh(E / T)**2)) elif order == -1: return A * T + B * C / tanh(C / T) - D * E * tanh(E / T) elif order == -1j: return (A * log(T) + B * C / tanh(C / T) / T - B * log(sinh(C / T)) - D * E * tanh(E / T) / T + D * log(cosh(E / T))) else: raise Exception(order_not_found_msg)
def UNIQUAC(xs, rs, qs, taus): r'''Calculates the activity coefficients of each species in a mixture using the Universal quasi-chemical (UNIQUAC) equation, given their mole fractions, `rs`, `qs`, and dimensionless interaction parameters. The interaction parameters are normally correlated with temperature, and need to be calculated separately. .. math:: \ln \gamma_i = \ln \frac{\Phi_i}{x_i} + \frac{z}{2} q_i \ln \frac{\theta_i}{\Phi_i}+ l_i - \frac{\Phi_i}{x_i}\sum_j^N x_j l_j - q_i \ln\left( \sum_j^N \theta_j \tau_{ji}\right)+ q_i - q_i\sum_j^N \frac{\theta_j \tau_{ij}}{\sum_k^N \theta_k \tau_{kj}} \theta_i = \frac{x_i q_i}{\displaystyle\sum_{j=1}^{n} x_j q_j} \Phi_i = \frac{x_i r_i}{\displaystyle\sum_{j=1}^{n} x_j r_j} l_i = \frac{z}{2}(r_i - q_i) - (r_i - 1) Parameters ---------- xs : list[float] Liquid mole fractions of each species, [-] rs : list[float] Van der Waals volume parameters for each species, [-] qs : list[float] Surface area parameters for each species, [-] taus : list[list[float]] Dimensionless interaction parameters of each compound with each other, [-] Returns ------- gammas : list[float] Activity coefficient for each species in the liquid mixture, [-] Notes ----- This model needs N^2 parameters. The original expression for the interaction parameters is as follows: .. math:: \tau_{ji} = \exp\left(\frac{-\Delta u_{ij}}{RT}\right) However, it is seldom used. Most correlations for the interaction parameters include some of the terms shown in the following form: .. math:: \ln \tau{ij} =a_{ij}+\frac{b_{ij}}{T}+c_{ij}\ln T + d_{ij}T + \frac{e_{ij}}{T^2} This model is recast in a slightly more computationally efficient way in [2]_, as shown below: .. math:: \ln \gamma_i = \ln \gamma_i^{res} + \ln \gamma_i^{comb} \ln \gamma_i^{res} = q_i \left(1 - \ln\frac{\sum_j^N q_j x_j \tau_{ji}} {\sum_j^N q_j x_j}- \sum_j \frac{q_k x_j \tau_{ij}}{\sum_k q_k x_k \tau_{kj}}\right) \ln \gamma_i^{comb} = (1 - V_i + \ln V_i) - \frac{z}{2}q_i\left(1 - \frac{V_i}{F_i} + \ln \frac{V_i}{F_i}\right) V_i = \frac{r_i}{\sum_j^N r_j x_j} F_i = \frac{q_i}{\sum_j q_j x_j} Examples -------- Ethanol-water example, at 343.15 K and 1 MPa: >>> UNIQUAC(xs=[0.252, 0.748], rs=[2.1055, 0.9200], qs=[1.972, 1.400], ... taus=[[1.0, 1.0919744384510301], [0.37452902779205477, 1.0]]) [2.35875137797083, 1.2442093415968987] References ---------- .. [1] Abrams, Denis S., and John M. Prausnitz. "Statistical Thermodynamics of Liquid Mixtures: A New Expression for the Excess Gibbs Energy of Partly or Completely Miscible Systems." AIChE Journal 21, no. 1 (January 1, 1975): 116-28. doi:10.1002/aic.690210115. .. [2] Gmehling, Jurgen, Barbel Kolbe, Michael Kleiber, and Jurgen Rarey. Chemical Thermodynamics for Process Simulation. 1st edition. Weinheim: Wiley-VCH, 2012. .. [3] Maurer, G., and J. M. Prausnitz. "On the Derivation and Extension of the Uniquac Equation." Fluid Phase Equilibria 2, no. 2 (January 1, 1978): 91-99. doi:10.1016/0378-3812(78)85002-X. ''' cmps = range(len(xs)) rsxs = sum([rs[i]*xs[i] for i in cmps]) phis = [rs[i]*xs[i]/rsxs for i in cmps] qsxs = sum([qs[i]*xs[i] for i in cmps]) vs = [qs[i]*xs[i]/qsxs for i in cmps] Ss = [sum([vs[j]*taus[j][i] for j in cmps]) for i in cmps] loggammacs = [log(phis[i]/xs[i]) + 1 - phis[i]/xs[i] - 5*qs[i]*(log(phis[i]/vs[i]) + 1 - phis[i]/vs[i]) for i in cmps] loggammars = [qs[i]*(1 - log(Ss[i]) - sum([taus[i][j]*vs[j]/Ss[j] for j in cmps])) for i in cmps] return [exp(loggammacs[i] + loggammars[i]) for i in cmps]
def EQ116(T, Tc, A, B, C, D, E, order=0): r'''DIPPR Equation #116. Used to describe the molar density of water fairly precisely; no other uses listed. All 5 parameters are needed, as well as the critical temperature. .. math:: Y = A + B\tau^{0.35} + C\tau^{2/3} + D\tau + E\tau^{4/3} \tau = 1 - \frac{T}{T_c} Parameters ---------- T : float Temperature, [K] Tc : float Critical temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T and integral with respect to T are computed as follows. The integral divided by T with respect to T has an extremely complicated (but still elementary) integral which can be read from the source. It was computed with Rubi; the other expressions can readily be obtained with SymPy. .. math:: \frac{d Y}{dT} = - \frac{7 B}{20 T_c \left(- \frac{T}{T_c} + 1\right)^{ \frac{13}{20}}} - \frac{2 C}{3 T_c \sqrt[3]{- \frac{T}{T_c} + 1}} - \frac{D}{T_c} - \frac{4 E}{3 T_c} \sqrt[3]{- \frac{T}{T_c} + 1} .. math:: \int Y dT = A T - \frac{20 B}{27} T_c \left(- \frac{T}{T_c} + 1\right)^{ \frac{27}{20}} - \frac{3 C}{5} T_c \left(- \frac{T}{T_c} + 1\right)^{ \frac{5}{3}} + D \left(- \frac{T^{2}}{2 T_c} + T\right) - \frac{3 E}{7} T_c \left(- \frac{T}{T_c} + 1\right)^{\frac{7}{3}} Examples -------- Water liquid molar density; DIPPR coefficients normally in kmol/m^3. >>> EQ116(300., 647.096, 17.863, 58.606, -95.396, 213.89, -141.26) 55.17615446406527 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: tau = 1-T/Tc return A + B*tau**0.35 + C*tau**(2/3.) + D*tau + E*tau**(4/3.) elif order == 1: return (-7*B/(20*Tc*(-T/Tc + 1)**(13/20)) - 2*C/(3*Tc*(-T/Tc + 1)**(1/3)) - D/Tc - 4*E*(-T/Tc + 1)**(1/3)/(3*Tc)) elif order == -1: return (A*T - 20*B*Tc*(-T/Tc + 1)**(27/20)/27 - 3*C*Tc*(-T/Tc + 1)**(5/3)/5 + D*(-T**2/(2*Tc) + T) - 3*E*Tc*(-T/Tc + 1)**(7/3)/7) elif order == -1j: # 3x increase in speed - cse via sympy x0 = log(T) x1 = 0.5*x0 x2 = 1/Tc x3 = T*x2 x4 = -x3 + 1 x5 = 1.5*C x6 = x4**0.333333333333333 x7 = 2*B x8 = x4**0.05 x9 = log(-x6 + 1) x10 = sqrt(3) x11 = x10*atan(x10*(2*x6 + 1)/3) x12 = sqrt(5) x13 = 0.5*x12 x14 = x13 + 0.5 x15 = B*x14 x16 = sqrt(x13 + 2.5) x17 = 2*x8 x18 = -x17 x19 = -x13 x20 = x19 + 0.5 x21 = B*x20 x22 = sqrt(x19 + 2.5) x23 = B*x16 x24 = 0.5*sqrt(0.1*x12 + 0.5) x25 = x12 + 1 x26 = 4*x8 x27 = -x26 x28 = sqrt(10)*B/sqrt(x12 + 5) x29 = 2*x12 x30 = sqrt(x29 + 10) x31 = 1/x30 x32 = -x12 + 1 x33 = 0.5*B*x22 x34 = -x2*(T - Tc) x35 = 2*x34**0.1 x36 = x35 + 2 x37 = x34**0.05 x38 = x30*x37 x39 = 0.5*B*x16 x40 = x37*sqrt(-x29 + 10) x41 = 0.25*x12 x42 = B*(-x41 + 0.25) x43 = x12*x37 x44 = x35 + x37 + 2 x45 = B*(x41 + 0.25) x46 = -x43 x47 = x35 - x37 + 2 return A*x0 + 2.85714285714286*B*x4**0.35 - C*x1 + C*x11 + D*x0 - D*x3 - E*x1 - E*x11 + 0.75*E*x4**1.33333333333333 + 3*E*x6 + 1.5*E*x9 - x15*atan(x14*(x16 + x17)) + x15*atan(x14*(x16 + x18)) - x21*atan(x20*(x17 + x22)) + x21*atan(x20*(x18 + x22)) + x23*atan(x24*(x25 + x26)) - x23*atan(x24*(x25 + x27)) - x28*atan(x31*(x26 + x32)) + x28*atan(x31*(x27 + x32)) - x33*log(x36 - x38) + x33*log(x36 + x38) + x39*log(x36 - x40) - x39*log(x36 + x40) + x4**0.666666666666667*x5 - x42*log(x43 + x44) + x42*log(x46 + x47) + x45*log(x43 + x47) - x45*log(x44 + x46) + x5*x9 + x7*atan(x8) - x7*atanh(x8) else: raise Exception(order_not_found_msg)
def EQ116(T, Tc, A, B, C, D, E, order=0): r'''DIPPR Equation #116. Used to describe the molar density of water fairly precisely; no other uses listed. All 5 parameters are needed, as well as the critical temperature. .. math:: Y = A + B\tau^{0.35} + C\tau^{2/3} + D\tau + E\tau^{4/3} \tau = 1 - \frac{T}{T_c} Parameters ---------- T : float Temperature, [K] Tc : float Critical temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T and integral with respect to T are computed as follows. The integral divided by T with respect to T has an extremely complicated (but still elementary) integral which can be read from the source. It was computed with Rubi; the other expressions can readily be obtained with SymPy. .. math:: \frac{d Y}{dT} = - \frac{7 B}{20 T_c \left(- \frac{T}{T_c} + 1\right)^{ \frac{13}{20}}} - \frac{2 C}{3 T_c \sqrt[3]{- \frac{T}{T_c} + 1}} - \frac{D}{T_c} - \frac{4 E}{3 T_c} \sqrt[3]{- \frac{T}{T_c} + 1} .. math:: \int Y dT = A T - \frac{20 B}{27} T_c \left(- \frac{T}{T_c} + 1\right)^{ \frac{27}{20}} - \frac{3 C}{5} T_c \left(- \frac{T}{T_c} + 1\right)^{ \frac{5}{3}} + D \left(- \frac{T^{2}}{2 T_c} + T\right) - \frac{3 E}{7} T_c \left(- \frac{T}{T_c} + 1\right)^{\frac{7}{3}} Examples -------- Water liquid molar density; DIPPR coefficients normally in kmol/m^3. >>> EQ116(300., 647.096, 17.863, 58.606, -95.396, 213.89, -141.26) 55.17615446406527 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: tau = 1 - T / Tc return A + B * tau**0.35 + C * tau**(2 / 3.) + D * tau + E * tau**(4 / 3.) elif order == 1: return (-7 * B / (20 * Tc * (-T / Tc + 1)**(13 / 20)) - 2 * C / (3 * Tc * (-T / Tc + 1)**(1 / 3)) - D / Tc - 4 * E * (-T / Tc + 1)**(1 / 3) / (3 * Tc)) elif order == -1: return (A * T - 20 * B * Tc * (-T / Tc + 1)**(27 / 20) / 27 - 3 * C * Tc * (-T / Tc + 1)**(5 / 3) / 5 + D * (-T**2 / (2 * Tc) + T) - 3 * E * Tc * (-T / Tc + 1)**(7 / 3) / 7) elif order == -1j: # 3x increase in speed - cse via sympy x0 = log(T) x1 = 0.5 * x0 x2 = 1 / Tc x3 = T * x2 x4 = -x3 + 1 x5 = 1.5 * C x6 = x4**0.333333333333333 x7 = 2 * B x8 = x4**0.05 x9 = log(-x6 + 1) x10 = sqrt(3) x11 = x10 * atan(x10 * (2 * x6 + 1) / 3) x12 = sqrt(5) x13 = 0.5 * x12 x14 = x13 + 0.5 x15 = B * x14 x16 = sqrt(x13 + 2.5) x17 = 2 * x8 x18 = -x17 x19 = -x13 x20 = x19 + 0.5 x21 = B * x20 x22 = sqrt(x19 + 2.5) x23 = B * x16 x24 = 0.5 * sqrt(0.1 * x12 + 0.5) x25 = x12 + 1 x26 = 4 * x8 x27 = -x26 x28 = sqrt(10) * B / sqrt(x12 + 5) x29 = 2 * x12 x30 = sqrt(x29 + 10) x31 = 1 / x30 x32 = -x12 + 1 x33 = 0.5 * B * x22 x34 = -x2 * (T - Tc) x35 = 2 * x34**0.1 x36 = x35 + 2 x37 = x34**0.05 x38 = x30 * x37 x39 = 0.5 * B * x16 x40 = x37 * sqrt(-x29 + 10) x41 = 0.25 * x12 x42 = B * (-x41 + 0.25) x43 = x12 * x37 x44 = x35 + x37 + 2 x45 = B * (x41 + 0.25) x46 = -x43 x47 = x35 - x37 + 2 return A * x0 + 2.85714285714286 * B * x4**0.35 - C * x1 + C * x11 + D * x0 - D * x3 - E * x1 - E * x11 + 0.75 * E * x4**1.33333333333333 + 3 * E * x6 + 1.5 * E * x9 - x15 * atan( x14 * (x16 + x17)) + x15 * atan(x14 * (x16 + x18)) - x21 * atan( x20 * (x17 + x22)) + x21 * atan(x20 * (x18 + x22)) + x23 * atan( x24 * (x25 + x26)) - x23 * atan(x24 * (x25 + x27)) - x28 * atan( x31 * (x26 + x32)) + x28 * atan( x31 * (x27 + x32) ) - x33 * log(x36 - x38) + x33 * log( x36 + x38) + x39 * log(x36 - x40) - x39 * log( x36 + x40 ) + x4**0.666666666666667 * x5 - x42 * log( x43 + x44) + x42 * log(x46 + x47) + x45 * log( x43 + x47) - x45 * log( x44 + x46) + x5 * x9 + x7 * atan( x8) - x7 * atanh(x8) else: raise Exception(order_not_found_msg)
def EQ127(T, A, B, C, D, E, F, G, order=0): r'''DIPPR Equation #127. Rarely used, and then only in calculating ideal-gas heat capacity. All 7 parameters are required. .. math:: Y = A+B\left[\frac{\left(\frac{C}{T}\right)^2\exp\left(\frac{C}{T} \right)}{\left(\exp\frac{C}{T}-1 \right)^2}\right] +D\left[\frac{\left(\frac{E}{T}\right)^2\exp\left(\frac{E}{T}\right)} {\left(\exp\frac{E}{T}-1 \right)^2}\right] +F\left[\frac{\left(\frac{G}{T}\right)^2\exp\left(\frac{G}{T}\right)} {\left(\exp\frac{G}{T}-1 \right)^2}\right] Parameters ---------- T : float Temperature, [K] A-G : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. All expressions can be obtained with SymPy readily. .. math:: \frac{d Y}{dT} = - \frac{B C^{3} e^{\frac{C}{T}}}{T^{4} \left(e^{\frac{C}{T}} - 1\right)^{2}} + \frac{2 B C^{3} e^{\frac{2 C}{T}}}{T^{4} \left(e^{\frac{C}{T}} - 1\right)^{3}} - \frac{2 B C^{2} e^{\frac{C}{T}}}{T^{3} \left(e^{\frac{C}{T}} - 1\right)^{2}} - \frac{D E^{3} e^{\frac{E}{T}}}{T^{4} \left(e^{\frac{E}{T}} - 1\right)^{2}} + \frac{2 D E^{3} e^{\frac{2 E}{T}}}{T^{4} \left(e^{\frac{E}{T}} - 1\right)^{3}} - \frac{2 D E^{2} e^{\frac{E}{T}}}{T^{3} \left(e^{\frac{E}{T}} - 1\right)^{2}} - \frac{F G^{3} e^{\frac{G}{T}}}{T^{4} \left(e^{\frac{G}{T}} - 1\right)^{2}} + \frac{2 F G^{3} e^{\frac{2 G}{T}}}{T^{4} \left(e^{\frac{G}{T}} - 1\right)^{3}} - \frac{2 F G^{2} e^{\frac{G}{T}}}{T^{3} \left(e^{\frac{G}{T}} - 1\right)^{2}} .. math:: \int Y dT = A T + \frac{B C^{2}}{C e^{\frac{C}{T}} - C} + \frac{D E^{2}}{E e^{\frac{E}{T}} - E} + \frac{F G^{2}}{G e^{\frac{G}{T}} - G} .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} + B C^{2} \left( \frac{1}{C T e^{\frac{C}{T}} - C T} + \frac{1}{C T} - \frac{1}{C^{2}} \log{\left (e^{\frac{C}{T}} - 1 \right )}\right) + D E^{2} \left( \frac{1}{E T e^{\frac{E}{T}} - E T} + \frac{1}{E T} - \frac{1}{E^{2}} \log{\left (e^{\frac{E}{T}} - 1 \right )}\right) + F G^{2} \left( \frac{1}{G T e^{\frac{G}{T}} - G T} + \frac{1}{G T} - \frac{1}{G^{2}} \log{\left (e^{\frac{G}{T}} - 1 \right )}\right) Examples -------- Ideal gas heat capacity of methanol; DIPPR coefficients normally in J/kmol/K >>> EQ127(20., 3.3258E4, 3.6199E4, 1.2057E3, 1.5373E7, 3.2122E3, -1.5318E7, 3.2122E3) 33258.0 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: return (A + B * ((C / T)**2 * exp(C / T) / (exp(C / T) - 1)**2) + D * ((E / T)**2 * exp(E / T) / (exp(E / T) - 1)**2) + F * ((G / T)**2 * exp(G / T) / (exp(G / T) - 1)**2)) elif order == 1: return (-B * C**3 * exp(C / T) / (T**4 * (exp(C / T) - 1)**2) + 2 * B * C**3 * exp(2 * C / T) / (T**4 * (exp(C / T) - 1)**3) - 2 * B * C**2 * exp(C / T) / (T**3 * (exp(C / T) - 1)**2) - D * E**3 * exp(E / T) / (T**4 * (exp(E / T) - 1)**2) + 2 * D * E**3 * exp(2 * E / T) / (T**4 * (exp(E / T) - 1)**3) - 2 * D * E**2 * exp(E / T) / (T**3 * (exp(E / T) - 1)**2) - F * G**3 * exp(G / T) / (T**4 * (exp(G / T) - 1)**2) + 2 * F * G**3 * exp(2 * G / T) / (T**4 * (exp(G / T) - 1)**3) - 2 * F * G**2 * exp(G / T) / (T**3 * (exp(G / T) - 1)**2)) elif order == -1: return (A * T + B * C**2 / (C * exp(C / T) - C) + D * E**2 / (E * exp(E / T) - E) + F * G**2 / (G * exp(G / T) - G)) elif order == -1j: return (A * log(T) + B * C**2 * (1 / (C * T * exp(C / T) - C * T) + 1 / (C * T) - log(exp(C / T) - 1) / C**2) + D * E**2 * (1 / (E * T * exp(E / T) - E * T) + 1 / (E * T) - log(exp(E / T) - 1) / E**2) + F * G**2 * (1 / (G * T * exp(G / T) - G * T) + 1 / (G * T) - log(exp(G / T) - 1) / G**2)) else: raise Exception(order_not_found_msg)
def BVirial_Tsonopoulos_extended(T, Tc, Pc, omega, a=0, b=0, species_type='', dipole=0, order=0): r'''Calculates the second virial coefficient using the comprehensive model in [1]_. See the notes for the calculation of `a` and `b`. .. math:: \frac{BP_c}{RT_c} = B^{(0)} + \omega B^{(1)} + a B^{(2)} + b B^{(3)} B^{(0)}=0.1445-0.33/T_r-0.1385/T_r^2-0.0121/T_r^3 B^{(1)} = 0.0637+0.331/T_r^2-0.423/T_r^3 -0.423/T_r^3 - 0.008/T_r^8 B^{(2)} = 1/T_r^6 B^{(3)} = -1/T_r^8 Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of the fluid [Pa] omega : float Acentric factor for fluid, [-] a : float, optional Fit parameter, calculated based on species_type if a is not given and species_type matches on of the supported chemical classes. b : float, optional Fit parameter, calculated based on species_type if a is not given and species_type matches on of the supported chemical classes. species_type : str, optional One of . dipole : float dipole moment, optional, [Debye] order : int, optional Order of the calculation. 0 for the calculation of B itself; for 1/2/3, the first/second/third derivative of B with respect to temperature; and for -1/-2, the first/second indefinite integral of B with respect to temperature. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- B : float Second virial coefficient in density form or its integral/derivative if specified, [m^3/mol or m^3/mol/K^order] Notes ----- Analytical models for derivatives and integrals are available for orders -2, -1, 1, 2, and 3, all obtained with SymPy. To calculate `a` or `b`, the following rules are used: For 'simple' or 'normal' fluids: .. math:: a = 0 b = 0 For 'ketone', 'aldehyde', 'alkyl nitrile', 'ether', 'carboxylic acid', or 'ester' types of chemicals: .. math:: a = -2.14\times 10^{-4} \mu_r - 4.308 \times 10^{-21} (\mu_r)^8 b = 0 For 'alkyl halide', 'mercaptan', 'sulfide', or 'disulfide' types of chemicals: .. math:: a = -2.188\times 10^{-4} (\mu_r)^4 - 7.831 \times 10^{-21} (\mu_r)^8 b = 0 For 'alkanol' types of chemicals (except methanol): .. math:: a = 0.0878 b = 0.00908 + 0.0006957 \mu_r For methanol: .. math:: a = 0.0878 b = 0.0525 For water: .. math:: a = -0.0109 b = 0 If required, the form of dipole moment used in the calculation of some types of `a` and `b` values is as follows: .. math:: \mu_r = 100000\frac{\mu^2(Pc/101325.0)}{Tc^2} For first temperature derivative of B: .. math:: \frac{d B^{(0)}}{dT} = \frac{33 Tc}{100 T^{2}} + \frac{277 Tc^{2}}{1000 T^{3}} + \frac{363 Tc^{3}}{10000 T^{4}} + \frac{607 Tc^{8}}{125000 T^{9}} \frac{d B^{(1)}}{dT} = - \frac{331 Tc^{2}}{500 T^{3}} + \frac{1269 Tc^{3}}{1000 T^{4}} + \frac{8 Tc^{8}}{125 T^{9}} \frac{d B^{(2)}}{dT} = - \frac{6 Tc^{6}}{T^{7}} \frac{d B^{(3)}}{dT} = \frac{8 Tc^{8}}{T^{9}} For the second temperature derivative of B: .. math:: \frac{d^2 B^{(0)}}{dT^2} = - \frac{3 Tc}{125000 T^{3}} \left(27500 + \frac{34625 Tc}{T} + \frac{6050 Tc^{2}}{T^{2}} + \frac{1821 Tc^{7}}{T^{7}}\right) \frac{d^2 B^{(1)}}{dT^2} = \frac{3 Tc^{2}}{500 T^{4}} \left(331 - \frac{846 Tc}{T} - \frac{96 Tc^{6}}{T^{6}}\right) \frac{d^2 B^{(2)}}{dT^2} = \frac{42 Tc^{6}}{T^{8}} \frac{d^2 B^{(3)}}{dT^2} = - \frac{72 Tc^{8}}{T^{10}} For the third temperature derivative of B: .. math:: \frac{d^3 B^{(0)}}{dT^3} = \frac{3 Tc}{12500 T^{4}} \left(8250 + \frac{13850 Tc}{T} + \frac{3025 Tc^{2}}{T^{2}} + \frac{1821 Tc^{7}}{T^{7}}\right) \frac{d^3 B^{(1)}}{dT^3} = \frac{3 Tc^{2}}{250 T^{5}} \left(-662 + \frac{2115 Tc}{T} + \frac{480 Tc^{6}}{T^{6}}\right) \frac{d^3 B^{(2)}}{dT^3} = - \frac{336 Tc^{6}}{T^{9}} \frac{d^3 B^{(3)}}{dT^3} = \frac{720 Tc^{8}}{T^{11}} For the first indefinite integral of B: .. math:: \int{B^{(0)}} dT = \frac{289 T}{2000} - \frac{33 Tc}{100} \log{\left (T \right )} + \frac{1}{7000000 T^{7}} \left(969500 T^{6} Tc^{2} + 42350 T^{5} Tc^{3} + 607 Tc^{8}\right) \int{B^{(1)}} dT = \frac{637 T}{10000} - \frac{1}{70000 T^{7}} \left(23170 T^{6} Tc^{2} - 14805 T^{5} Tc^{3} - 80 Tc^{8}\right) \int{B^{(2)}} dT = - \frac{Tc^{6}}{5 T^{5}} \int{B^{(3)}} dT = \frac{Tc^{8}}{7 T^{7}} For the second indefinite integral of B: .. math:: \int\int B^{(0)} dT dT = \frac{289 T^{2}}{4000} - \frac{33 T}{100} Tc \log{\left (T \right )} + \frac{33 T}{100} Tc + \frac{277 Tc^{2}}{2000} \log{\left (T \right )} - \frac{1}{42000000 T^{6}} \left(254100 T^{5} Tc^{3} + 607 Tc^{8}\right) \int\int B^{(1)} dT dT = \frac{637 T^{2}}{20000} - \frac{331 Tc^{2}}{1000} \log{\left (T \right )} - \frac{1}{210000 T^{6}} \left(44415 T^{5} Tc^{3} + 40 Tc^{8}\right) \int\int B^{(2)} dT dT = \frac{Tc^{6}}{20 T^{4}} \int\int B^{(3)} dT dT = - \frac{Tc^{8}}{42 T^{6}} Examples -------- Example from Perry's Handbook, 8E, p2-499. Matches to a decimal place. >>> BVirial_Tsonopoulos_extended(430., 405.65, 11.28E6, 0.252608, a=0, b=0, species_type='ketone', dipole=1.469) -9.679715056695323e-05 References ---------- .. [1] Tsonopoulos, C., and J. L. Heidman. "From the Virial to the Cubic Equation of State." Fluid Phase Equilibria 57, no. 3 (1990): 261-76. doi:10.1016/0378-3812(90)85126-U .. [2] Tsonopoulos, Constantine, and John H. Dymond. "Second Virial Coefficients of Normal Alkanes, Linear 1-Alkanols (and Water), Alkyl Ethers, and Their Mixtures." Fluid Phase Equilibria, International Workshop on Vapour-Liquid Equilibria and Related Properties in Binary and Ternary Mixtures of Ethers, Alkanes and Alkanols, 133, no. 1-2 (June 1997): 11-34. doi:10.1016/S0378-3812(97)00058-7. ''' Tr = T/Tc if order == 0: B0 = 0.1445 - 0.33/Tr - 0.1385/Tr**2 - 0.0121/Tr**3 - 0.000607/Tr**8 B1 = 0.0637 + 0.331/Tr**2 - 0.423/Tr**3 - 0.008/Tr**8 B2 = 1./Tr**6 B3 = -1./Tr**8 elif order == 1: B0 = 33*Tc/(100*T**2) + 277*Tc**2/(1000*T**3) + 363*Tc**3/(10000*T**4) + 607*Tc**8/(125000*T**9) B1 = -331*Tc**2/(500*T**3) + 1269*Tc**3/(1000*T**4) + 8*Tc**8/(125*T**9) B2 = -6.0*Tc**6/T**7 B3 = 8.0*Tc**8/T**9 elif order == 2: B0 = -3*Tc*(27500 + 34625*Tc/T + 6050*Tc**2/T**2 + 1821*Tc**7/T**7)/(125000*T**3) B1 = 3*Tc**2*(331 - 846*Tc/T - 96*Tc**6/T**6)/(500*T**4) B2 = 42.0*Tc**6/T**8 B3 = -72.0*Tc**8/T**10 elif order == 3: B0 = 3*Tc*(8250 + 13850*Tc/T + 3025*Tc**2/T**2 + 1821*Tc**7/T**7)/(12500*T**4) B1 = 3*Tc**2*(-662 + 2115*Tc/T + 480*Tc**6/T**6)/(250*T**5) B2 = -336.0*Tc**6/T**9 B3 = 720.0*Tc**8/T**11 elif order == -1: B0 = 289*T/2000. - 33*Tc*log(T)/100. + (969500*T**6*Tc**2 + 42350*T**5*Tc**3 + 607*Tc**8)/(7000000.*T**7) B1 = 637*T/10000. - (23170*T**6*Tc**2 - 14805*T**5*Tc**3 - 80*Tc**8)/(70000.*T**7) B2 = -Tc**6/(5*T**5) B3 = Tc**8/(7*T**7) elif order == -2: B0 = 289*T**2/4000. - 33*T*Tc*log(T)/100. + 33*T*Tc/100. + 277*Tc**2*log(T)/2000. - (254100*T**5*Tc**3 + 607*Tc**8)/(42000000.*T**6) B1 = 637*T**2/20000. - 331*Tc**2*log(T)/1000. - (44415*T**5*Tc**3 + 40*Tc**8)/(210000.*T**6) B2 = Tc**6/(20*T**4) B3 = -Tc**8/(42*T**6) else: raise Exception('Only orders -2, -1, 0, 1, 2 and 3 are supported.') if a == 0 and b == 0 and species_type != '': if species_type == 'simple' or species_type == 'normal': a, b = 0, 0 elif species_type == 'methyl alcohol': a, b = 0.0878, 0.0525 elif species_type == 'water': a, b = -0.0109, 0 elif dipole != 0 and Tc != 0 and Pc != 0: dipole_r = 1E5*dipole**2*(Pc/101325.0)/Tc**2 if (species_type == 'ketone' or species_type == 'aldehyde' or species_type == 'alkyl nitrile' or species_type == 'ether' or species_type == 'carboxylic acid' or species_type == 'ester'): a, b = -2.14E-4*dipole_r-4.308E-21*dipole_r**8, 0 elif (species_type == 'alkyl halide' or species_type == 'mercaptan' or species_type == 'sulfide' or species_type == 'disulfide'): a, b = -2.188E-4*dipole_r**4-7.831E-21*dipole_r**8, 0 elif species_type == 'alkanol': a, b = 0.0878, 0.00908+0.0006957*dipole_r Br = B0 + omega*B1 + a*B2 + b*B3 return Br*R*Tc/Pc
def EQ104(T, A, B, C, D, E, order=0): r'''DIPPR Equation #104. Often used in calculating second virial coefficients of gases. All 5 parameters are required. C, D, and E are normally large values. .. math:: Y = A + \frac{B}{T} + \frac{C}{T^3} + \frac{D}{T^8} + \frac{E}{T^9} Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. All expressions can be obtained with SymPy readily. .. math:: \frac{d Y}{dT} = - \frac{B}{T^{2}} - \frac{3 C}{T^{4}} - \frac{8 D}{T^{9}} - \frac{9 E}{T^{10}} .. math:: \int Y dT = A T + B \log{\left (T \right )} - \frac{1}{56 T^{8}} \left(28 C T^{6} + 8 D T + 7 E\right) .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} - \frac{1}{72 T^{9}} \left(72 B T^{8} + 24 C T^{6} + 9 D T + 8 E\right) Examples -------- Water second virial coefficient; DIPPR coefficients normally dimensionless. >>> EQ104(300, 0.02222, -26.38, -16750000, -3.894E19, 3.133E21) -1.1204179007265156 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE ''' if order == 0: T2 = T*T return A + (B + (C + (D + E/T)/(T2*T2*T))/T2)/T elif order == 1: T2 = T*T T4 = T2*T2 return (-B + (-3*C + (-8*D - 9*E/T)/(T4*T))/T2)/T2 elif order == -1: return A*T + B*log(T) - (28*C*T**6 + 8*D*T + 7*E)/(56*T**8) elif order == -1j: return A*log(T) - (72*B*T**8 + 24*C*T**6 + 9*D*T + 8*E)/(72*T**9) else: raise Exception(order_not_found_msg)
def ST_r(ST, Tc, Pc): return log(1 + ST / (Tc**(1 / 3.0) * Pc**(2 / 3.0)))
def Wilson(xs, params): r'''Calculates the activity coefficients of each species in a mixture using the Wilson method, given their mole fractions, and dimensionless interaction parameters. Those are normally correlated with temperature, and need to be calculated separately. .. math:: \ln \gamma_i = 1 - \ln \left(\sum_j^N \Lambda_{ij} x_j\right) -\sum_j^N \frac{\Lambda_{ji}x_j}{\displaystyle\sum_k^N \Lambda_{jk}x_k} Parameters ---------- xs : list[float] Liquid mole fractions of each species, [-] params : list[list[float]] Dimensionless interaction parameters of each compound with each other, [-] Returns ------- gammas : list[float] Activity coefficient for each species in the liquid mixture, [-] Notes ----- This model needs N^2 parameters. The original model correlated the interaction parameters using the standard pure-component molar volumes of each species at 25°C, in the following form: .. math:: \Lambda_{ij} = \frac{V_j}{V_i} \exp\left(\frac{-\lambda_{i,j}}{RT}\right) However, that form has less flexibility and offered no advantage over using only regressed parameters. Most correlations for the interaction parameters include some of the terms shown in the following form: .. math:: \ln \Lambda_{ij} =a_{ij}+\frac{b_{ij}}{T}+c_{ij}\ln T + d_{ij}T + \frac{e_{ij}}{T^2} + h_{ij}{T^2} The Wilson model is not applicable to liquid-liquid systems. Examples -------- Ethanol-water example, at 343.15 K and 1 MPa: >>> Wilson([0.252, 0.748], [[1, 0.154], [0.888, 1]]) [1.8814926087178843, 1.1655774931125487] References ---------- .. [1] Wilson, Grant M. "Vapor-Liquid Equilibrium. XI. A New Expression for the Excess Free Energy of Mixing." Journal of the American Chemical Society 86, no. 2 (January 1, 1964): 127-130. doi:10.1021/ja01056a002. .. [2] Gmehling, Jurgen, Barbel Kolbe, Michael Kleiber, and Jurgen Rarey. Chemical Thermodynamics for Process Simulation. 1st edition. Weinheim: Wiley-VCH, 2012. ''' gammas = [] cmps = range(len(xs)) for i in cmps: tot1 = log(sum([params[i][j]*xs[j] for j in cmps])) tot2 = 0. for j in cmps: tot2 += params[j][i]*xs[j]/sum([params[j][k]*xs[k] for k in cmps]) gamma = exp(1. - tot1 - tot2) gammas.append(gamma) return gammas
def entropy_Cpg_Hvap(self): r'''Method to calculate the entropy of an ideal mixture. This routine is based on "route A", where only the gas heat capacity and enthalpy of vaporization are used. The reference temperature and pressure are properties of the class; it defaults to 298.15 K and 101325 Pa. There is a contribution due to mixing: .. math:: \Delta S_{mixing} = -R\sum_i z_i \log(z_i) The ideal gas pressure contribution is: .. math:: \Delta S_{P} = -R\log\left(\frac{P}{P_{ref}}\right) For a liquid mixture or a partially liquid mixture, the entropy contribution is not so strong - all such pressure effects find that expression capped at the vapor pressure, as shown in [1]_. .. math:: \Delta S_{P} = - \sum_i x_i\left(1 - \frac{V}{F}\right) R\log\left(\frac{P_{sat, i}}{P_{ref}}\right) - \sum_i y_i\left( \frac{V}{F}\right) R\log\left(\frac{P}{P_{ref}}\right) These expressions are combined with the standard heat capacity and enthalpy of vaporization expressions to calculate the total entropy: For a pure gas mixture: .. math:: S = \Delta S_{mixing} + \Delta S_{P} + \sum_i z_i \cdot \int_{T_{ref}}^T \frac{C_{p}^{ig}(T)}{T} dT For a pure liquid mixture: .. math:: S = \Delta S_{mixing} + \Delta S_{P} + \sum_i z_i \left( \int_{T_{ref}}^T \frac{C_{p}^{ig}(T)}{T} dT + \frac{H_{vap, i} (T)}{T} \right) For a vapor-liquid mixture: .. math:: S = \Delta S_{mixing} + \Delta S_{P} + \sum_i z_i \cdot \int_{T_{ref}}^T \frac{C_{p}^{ig}(T)}{T} dT + \sum_i x_i\left(1 - \frac{V}{F}\right)\frac{H_{vap, i}(T)}{T} Returns ------- S : float Entropy of the mixture with respect to the reference temperature, [J/mol/K] Notes ----- The object must be flashed before this routine can be used. It depends on the properties T, P, zs, V_over_F, HeatCapacityGases, EnthalpyVaporizations, VaporPressures, and xs. References ---------- .. [1] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. ''' S = 0 T = self.T P = self.P S -= R*sum([zi*log(zi) for zi in self.zs if zi > 0]) # ideal composition entropy composition; chemsep checked # Both of the mixing and vapor pressure terms have negative signs # Equation 6-4.4b in Poling for the vapor pressure component # For liquids above their critical temperatures, Psat is equal to the system P (COCO). if self.phase == 'g': S -= R*log(P/101325.) # Gas-phase ideal pressure contribution (checked repeatedly) for i in self.cmps: S += self.HeatCapacityGases[i].T_dependent_property_integral_over_T(298.15, T) elif self.phase == 'l': Psats = self._Psats(T) for i in self.cmps: Sg298_to_T = self.HeatCapacityGases[i].T_dependent_property_integral_over_T(298.15, T) Hvap = self.EnthalpyVaporizations[i](T) if Hvap is None: Hvap = 0 # Handle the case of a package predicting a transition past the Tc Svap = -Hvap/T # Do the transition at the temperature of the liquid S_P = -R*log(Psats[i]/101325.) S += self.zs[i]*(Sg298_to_T + Svap + S_P) elif self.phase == 'l/g': Psats = self._Psats(T) S_P_vapor = -R*log(P/101325.) # Gas-phase ideal pressure contribution (checked repeatedly) for i in self.cmps: Sg298_to_T_zi = self.zs[i]*self.HeatCapacityGases[i].T_dependent_property_integral_over_T(298.15, T) Hvap = self.EnthalpyVaporizations[i](T) if Hvap is None: Hvap = 0 # Handle the case of a package predicting a transition past the Tc Svap_contrib = -self.xs[i]*(1-self.V_over_F)*Hvap/T # Pressure contributions from both phases S_P_vapor_i = self.V_over_F*self.ys[i]*S_P_vapor S_P_liquid_i = -R*log(Psats[i]/101325.)*(1-self.V_over_F)*self.xs[i] S += (Sg298_to_T_zi + Svap_contrib + S_P_vapor_i + S_P_liquid_i) return S
class VaporPressure(TDependentProperty): '''Class for dealing with vapor pressure as a function of temperature. Consists of four coefficient-based methods and four data sources, one source of tabular information, four corresponding-states estimators, and the external library CoolProp. Parameters ---------- Tb : float, optional Boiling point, [K] Tc : float, optional Critical temperature, [K] Pc : float, optional Critical pressure, [Pa] omega : float, optional Acentric factor, [-] CASRN : str, optional The CAS number of the chemical eos : object, optional Equation of State object after :obj:`thermo.eos.GCEOS` Notes ----- To iterate over all methods, use the list stored in :obj:`vapor_pressure_methods`. **WAGNER_MCGARRY**: The Wagner 3,6 original model equation documented in :obj:`Wagner_original`, with data for 245 chemicals, from [1]_, **WAGNER_POLING**: The Wagner 2.5, 5 model equation documented in :obj:`Wagner` in [2]_, with data for 104 chemicals. **ANTOINE_EXTENDED_POLING**: The TRC extended Antoine model equation documented in :obj:`TRC_Antoine_extended` with data for 97 chemicals in [2]_. **ANTOINE_POLING**: Standard Antoine equation, as documented in the function :obj:`Antoine` and with data for 325 fluids from [2]_. Coefficients were altered to be in units of Pa and Celcius. **COOLPROP**: CoolProp external library; with select fluids from its library. Range is limited to that of the equations of state it uses, as described in [3]_. Very slow. **BOILING_CRITICAL**: Fundamental relationship in thermodynamics making several approximations; see :obj:`boiling_critical_relation` for details. Least accurate method in most circumstances. **LEE_KESLER_PSAT**: CSP method documented in :obj:`Lee_Kesler`. Widely used. **AMBROSE_WALTON**: CSP method documented in :obj:`Ambrose_Walton`. **SANJARI**: CSP method documented in :obj:`Sanjari`. **VDI_TABULAR**: Tabular data in [4]_ along the saturation curve; interpolation is as set by the user or the default. **EOS**: Equation of state provided by user. See Also -------- Wagner_original Wagner TRC_Antoine_extended Antoine boiling_critical_relation Lee_Kesler Ambrose_Walton Sanjari References ---------- .. [1] McGarry, Jack. "Correlation and Prediction of the Vapor Pressures of Pure Liquids over Large Pressure Ranges." Industrial & Engineering Chemistry Process Design and Development 22, no. 2 (April 1, 1983): 313-22. doi:10.1021/i200021a023. .. [2] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. .. [3] Bell, Ian H., Jorrit Wronski, Sylvain Quoilin, and Vincent Lemort. "Pure and Pseudo-Pure Fluid Thermophysical Property Evaluation and the Open-Source Thermophysical Property Library CoolProp." Industrial & Engineering Chemistry Research 53, no. 6 (February 12, 2014): 2498-2508. doi:10.1021/ie4033999. http://www.coolprop.org/ .. [4] Gesellschaft, V. D. I., ed. VDI Heat Atlas. 2nd edition. Berlin; New York:: Springer, 2010. ''' name = 'Vapor pressure' units = 'Pa' interpolation_T = lambda self, T: 1. / T '''1/T interpolation transformation by default.''' interpolation_property = lambda self, P: log(P) '''log(P) interpolation transformation by default.''' interpolation_property_inv = lambda self, P: exp(P) '''exp(P) interpolation transformation by default; reverses :obj:`interpolation_property_inv`.''' tabular_extrapolation_permitted = False '''Disallow tabular extrapolation by default; CSP methods prefered normally.''' property_min = 0 '''Mimimum valid value of vapor pressure.''' property_max = 1E10 '''Maximum valid value of vapor pressure. Set slightly above the critical point estimated for Iridium; Mercury's 160 MPa critical point is the highest known.''' ranked_methods = [ WAGNER_MCGARRY, WAGNER_POLING, ANTOINE_EXTENDED_POLING, COOLPROP, ANTOINE_POLING, VDI_TABULAR, AMBROSE_WALTON, LEE_KESLER_PSAT, BOILING_CRITICAL, EOS, SANJARI ] '''Default rankings of the available methods.''' def __init__(self, Tb=None, Tc=None, Pc=None, omega=None, CASRN='', eos=None): self.CASRN = CASRN self.Tb = Tb self.Tc = Tc self.Pc = Pc self.omega = omega self.eos = eos self.Tmin = None '''Minimum temperature at which no method can calculate vapor pressure under.''' self.Tmax = None '''Maximum temperature at which no method can calculate vapor pressure above; by definition the critical point.''' self.method = None '''The method was which was last used successfully to calculate a property; set only after the first property calculation.''' self.tabular_data = {} '''tabular_data, dict: Stored (Ts, properties) for any tabular data; indexed by provided or autogenerated name.''' self.tabular_data_interpolators = {} '''tabular_data_interpolators, dict: Stored (extrapolator, spline) tuples which are interp1d instances for each set of tabular data; indexed by tuple of (name, interpolation_T, interpolation_property, interpolation_property_inv) to ensure that if an interpolation transform is altered, the old interpolator which had been created is no longer used.''' self.sorted_valid_methods = [] '''sorted_valid_methods, list: Stored methods which were found valid at a specific temperature; set by `T_dependent_property`.''' self.user_methods = [] '''user_methods, list: Stored methods which were specified by the user in a ranked order of preference; set by `T_dependent_property`.''' self.all_methods = set() '''Set of all methods available for a given CASRN and properties; filled by :obj:`load_all_methods`.''' self.load_all_methods() def load_all_methods(self): r'''Method which picks out coefficients for the specified chemical from the various dictionaries and DataFrames storing it. All data is stored as attributes. This method also sets :obj:`Tmin`, :obj:`Tmax`, and :obj:`all_methods` as a set of methods for which the data exists for. Called on initialization only. See the source code for the variables at which the coefficients are stored. The coefficients can safely be altered once the class is initialized. This method can be called again to reset the parameters. ''' methods = [] Tmins, Tmaxs = [], [] if self.CASRN in WagnerMcGarry.index: methods.append(WAGNER_MCGARRY) _, A, B, C, D, self.WAGNER_MCGARRY_Pc, self.WAGNER_MCGARRY_Tc, self.WAGNER_MCGARRY_Tmin = _WagnerMcGarry_values[ WagnerMcGarry.index.get_loc(self.CASRN)].tolist() self.WAGNER_MCGARRY_coefs = [A, B, C, D] Tmins.append(self.WAGNER_MCGARRY_Tmin) Tmaxs.append(self.WAGNER_MCGARRY_Tc) if self.CASRN in WagnerPoling.index: methods.append(WAGNER_POLING) _, A, B, C, D, self.WAGNER_POLING_Tc, self.WAGNER_POLING_Pc, Tmin, self.WAGNER_POLING_Tmax = _WagnerPoling_values[ WagnerPoling.index.get_loc(self.CASRN)].tolist() # Some Tmin values are missing; Arbitrary choice of 0.1 lower limit self.WAGNER_POLING_Tmin = Tmin if not np.isnan( Tmin) else self.WAGNER_POLING_Tmax * 0.1 self.WAGNER_POLING_coefs = [A, B, C, D] Tmins.append(Tmin) Tmaxs.append(self.WAGNER_POLING_Tmax) if self.CASRN in AntoineExtended.index: methods.append(ANTOINE_EXTENDED_POLING) _, A, B, C, Tc, to, n, E, F, self.ANTOINE_EXTENDED_POLING_Tmin, self.ANTOINE_EXTENDED_POLING_Tmax = _AntoineExtended_values[ AntoineExtended.index.get_loc(self.CASRN)].tolist() self.ANTOINE_EXTENDED_POLING_coefs = [Tc, to, A, B, C, n, E, F] Tmins.append(self.ANTOINE_EXTENDED_POLING_Tmin) Tmaxs.append(self.ANTOINE_EXTENDED_POLING_Tmax) if self.CASRN in AntoinePoling.index: methods.append(ANTOINE_POLING) _, A, B, C, self.ANTOINE_POLING_Tmin, self.ANTOINE_POLING_Tmax = _AntoinePoling_values[ AntoinePoling.index.get_loc(self.CASRN)].tolist() self.ANTOINE_POLING_coefs = [A, B, C] Tmins.append(self.ANTOINE_POLING_Tmin) Tmaxs.append(self.ANTOINE_POLING_Tmax) if has_CoolProp and self.CASRN in coolprop_dict: methods.append(COOLPROP) self.CP_f = coolprop_fluids[self.CASRN] Tmins.append(self.CP_f.Tmin) Tmaxs.append(self.CP_f.Tc) if self.CASRN in _VDISaturationDict: methods.append(VDI_TABULAR) Ts, props = VDI_tabular_data(self.CASRN, 'P') self.VDI_Tmin = Ts[0] self.VDI_Tmax = Ts[-1] self.tabular_data[VDI_TABULAR] = (Ts, props) Tmins.append(self.VDI_Tmin) Tmaxs.append(self.VDI_Tmax) if all((self.Tb, self.Tc, self.Pc)): methods.append(BOILING_CRITICAL) Tmins.append(0.01) Tmaxs.append(self.Tc) if all((self.Tc, self.Pc, self.omega)): methods.append(LEE_KESLER_PSAT) methods.append(AMBROSE_WALTON) methods.append(SANJARI) if self.eos: methods.append(EOS) Tmins.append(0.01) Tmaxs.append(self.Tc) self.all_methods = set(methods) if Tmins and Tmaxs: self.Tmin = min(Tmins) self.Tmax = max(Tmaxs) def calculate(self, T, method): r'''Method to calculate vapor pressure of a fluid at temperature `T` with a given method. This method has no exception handling; see `T_dependent_property` for that. Parameters ---------- T : float Temperature at calculate vapor pressure, [K] method : str Name of the method to use Returns ------- Psat : float Vapor pressure at T, [pa] ''' if method == WAGNER_MCGARRY: A, B, C, D = self.WAGNER_MCGARRY_coefs Psat = Wagner_original(T, self.WAGNER_MCGARRY_Tc, self.WAGNER_MCGARRY_Pc, A, B, C, D) elif method == WAGNER_POLING: A, B, C, D = self.WAGNER_POLING_coefs Psat = Wagner(T, self.WAGNER_POLING_Tc, self.WAGNER_POLING_Pc, A, B, C, D) elif method == ANTOINE_EXTENDED_POLING: Tc, to, A, B, C, n, E, F = self.ANTOINE_EXTENDED_POLING_coefs Psat = TRC_Antoine_extended(T, Tc, to, A, B, C, n, E, F) elif method == ANTOINE_POLING: A, B, C = self.ANTOINE_POLING_coefs Psat = Antoine(T, A, B, C, Base=10.0) elif method == COOLPROP: Psat = PropsSI('P', 'T', T, 'Q', 0, self.CASRN) elif method == BOILING_CRITICAL: Psat = boiling_critical_relation(T, self.Tb, self.Tc, self.Pc) elif method == LEE_KESLER_PSAT: Psat = Lee_Kesler(T, self.Tc, self.Pc, self.omega) elif method == AMBROSE_WALTON: Psat = Ambrose_Walton(T, self.Tc, self.Pc, self.omega) elif method == SANJARI: Psat = Sanjari(T, self.Tc, self.Pc, self.omega) elif method == EOS: Psat = self.eos[0].Psat(T) elif method in self.tabular_data: Psat = self.interpolate(T, method) return Psat def test_method_validity(self, T, method): r'''Method to check the validity of a method. Follows the given ranges for all coefficient-based methods. For CSP methods, the models are considered valid from 0 K to the critical point. For tabular data, extrapolation outside of the range is used if :obj:`tabular_extrapolation_permitted` is set; if it is, the extrapolation is considered valid for all temperatures. It is not guaranteed that a method will work or give an accurate prediction simply because this method considers the method valid. Parameters ---------- T : float Temperature at which to test the method, [K] method : str Name of the method to test Returns ------- validity : bool Whether or not a method is valid ''' if method == WAGNER_MCGARRY: if T < self.WAGNER_MCGARRY_Tmin or T > self.WAGNER_MCGARRY_Tc: return False elif method == WAGNER_POLING: if T < self.WAGNER_POLING_Tmin or T > self.WAGNER_POLING_Tmax: return False elif method == ANTOINE_EXTENDED_POLING: if T < self.ANTOINE_EXTENDED_POLING_Tmin or T > self.ANTOINE_EXTENDED_POLING_Tmax: return False elif method == ANTOINE_POLING: if T < self.ANTOINE_POLING_Tmin or T > self.ANTOINE_POLING_Tmax: return False elif method == COOLPROP: if T < self.CP_f.Tmin or T < self.CP_f.Tt or T > self.CP_f.Tmax or T > self.CP_f.Tc: return False elif method in [ BOILING_CRITICAL, LEE_KESLER_PSAT, AMBROSE_WALTON, SANJARI, EOS ]: if T > self.Tc or T < 0: return False # No lower limit elif method in self.tabular_data: # if tabular_extrapolation_permitted, good to go without checking if not self.tabular_extrapolation_permitted: Ts, properties = self.tabular_data[method] if T < Ts[0] or T > Ts[-1]: return False else: raise Exception('Method not valid') return True
def Wilson(xs, params): r'''Calculates the activity coefficients of each species in a mixture using the Wilson method, given their mole fractions, and dimensionless interaction parameters. Those are normally correlated with temperature, and need to be calculated separately. .. math:: \ln \gamma_i = 1 - \ln \left(\sum_j^N \Lambda_{ij} x_j\right) -\sum_j^N \frac{\Lambda_{ji}x_j}{\displaystyle\sum_k^N \Lambda_{jk}x_k} Parameters ---------- xs : list[float] Liquid mole fractions of each species, [-] params : list[list[float]] Dimensionless interaction parameters of each compound with each other, [-] Returns ------- gammas : list[float] Activity coefficient for each species in the liquid mixture, [-] Notes ----- This model needs N^2 parameters. The original model correlated the interaction parameters using the standard pure-component molar volumes of each species at 25°C, in the following form: .. math:: \Lambda_{ij} = \frac{V_j}{V_i} \exp\left(\frac{-\lambda_{i,j}}{RT} \right) However, that form has less flexibility and offered no advantage over using only regressed parameters. Most correlations for the interaction parameters include some of the terms shown in the following form: .. math:: \ln \Lambda_{ij} =a_{ij}+\frac{b_{ij}}{T}+c_{ij}\ln T + d_{ij}T + \frac{e_{ij}}{T^2} + h_{ij}{T^2} The Wilson model is not applicable to liquid-liquid systems. Examples -------- Ethanol-water example, at 343.15 K and 1 MPa: >>> Wilson([0.252, 0.748], [[1, 0.154], [0.888, 1]]) [1.8814926087178843, 1.1655774931125487] References ---------- .. [1] Wilson, Grant M. "Vapor-Liquid Equilibrium. XI. A New Expression for the Excess Free Energy of Mixing." Journal of the American Chemical Society 86, no. 2 (January 1, 1964): 127-130. doi:10.1021/ja01056a002. .. [2] Gmehling, Jurgen, Barbel Kolbe, Michael Kleiber, and Jurgen Rarey. Chemical Thermodynamics for Process Simulation. 1st edition. Weinheim: Wiley-VCH, 2012. ''' gammas = [] cmps = range(len(xs)) for i in cmps: tot1 = log(sum([params[i][j] * xs[j] for j in cmps])) tot2 = 0. for j in cmps: tot2 += params[j][i] * xs[j] / sum( [params[j][k] * xs[k] for k in cmps]) gamma = exp(1. - tot1 - tot2) gammas.append(gamma) return gammas
def EQ107(T, A=0, B=0, C=0, D=0, E=0, order=0): r'''DIPPR Equation #107. Often used in calculating ideal-gas heat capacity. All 5 parameters are required. Also called the Aly-Lee equation. .. math:: Y = A + B\left[\frac{C/T}{\sinh(C/T)}\right]^2 + D\left[\frac{E/T}{ \cosh(E/T)}\right]^2 Parameters ---------- T : float Temperature, [K] A-E : float Parameter for the equation; chemical and property specific [-] order : int, optional Order of the calculation. 0 for the calculation of the result itself; for 1, the first derivative of the property is returned, for -1, the indefinite integral of the property with respect to temperature is returned; and for -1j, the indefinite integral of the property divided by temperature with respect to temperature is returned. No other integrals or derivatives are implemented, and an exception will be raised if any other order is given. Returns ------- Y : float Property [constant-specific; if order == 1, property/K; if order == -1, property*K; if order == -1j, unchanged from default] Notes ----- The derivative with respect to T, integral with respect to T, and integral over T with respect to T are computed as follows. The derivative is obtained via SymPy; the integrals from Wolfram Alpha. .. math:: \frac{d Y}{dT} = \frac{2 B C^{3} \cosh{\left (\frac{C}{T} \right )}} {T^{4} \sinh^{3}{\left (\frac{C}{T} \right )}} - \frac{2 B C^{2}}{T^{3} \sinh^{2}{\left (\frac{C}{T} \right )}} + \frac{2 D E^{3} \sinh{\left (\frac{E}{T} \right )}}{T^{4} \cosh^{3}{\left (\frac{E}{T} \right )}} - \frac{2 D E^{2}}{T^{3} \cosh^{2}{\left (\frac{E}{T} \right )}} .. math:: \int Y dT = A T + \frac{B C}{\tanh{\left (\frac{C}{T} \right )}} - D E \tanh{\left (\frac{E}{T} \right )} .. math:: \int \frac{Y}{T} dT = A \log{\left (T \right )} + \frac{B C}{T \tanh{ \left (\frac{C}{T} \right )}} - B \log{\left (\sinh{\left (\frac{C}{T} \right )} \right )} - \frac{D E}{T} \tanh{\left (\frac{E}{T} \right )} + D \log{\left (\cosh{\left (\frac{E}{T} \right )} \right )} Examples -------- Water ideal gas molar heat capacity; DIPPR coefficients normally in J/kmol/K >>> EQ107(300., 33363., 26790., 2610.5, 8896., 1169.) 33585.90452768923 References ---------- .. [1] Design Institute for Physical Properties, 1996. DIPPR Project 801 DIPPR/AIChE .. [2] Aly, Fouad A., and Lloyd L. Lee. "Self-Consistent Equations for Calculating the Ideal Gas Heat Capacity, Enthalpy, and Entropy." Fluid Phase Equilibria 6, no. 3 (January 1, 1981): 169-79. doi:10.1016/0378-3812(81)85002-9. ''' if order == 0: return A + B*((C/T)/sinh(C/T))**2 + D*((E/T)/cosh(E/T))**2 elif order == 1: return (2*B*C**3*cosh(C/T)/(T**4*sinh(C/T)**3) - 2*B*C**2/(T**3*sinh(C/T)**2) + 2*D*E**3*sinh(E/T)/(T**4*cosh(E/T)**3) - 2*D*E**2/(T**3*cosh(E/T)**2)) elif order == -1: return A*T + B*C/tanh(C/T) - D*E*tanh(E/T) elif order == -1j: return (A*log(T) + B*C/tanh(C/T)/T - B*log(sinh(C/T)) - D*E*tanh(E/T)/T + D*log(cosh(E/T))) else: raise Exception(order_not_found_msg)
def entropy_Cpg_Hvap(self): r'''Method to calculate the entropy of an ideal mixture. This routine is based on "route A", where only the gas heat capacity and enthalpy of vaporization are used. The reference temperature and pressure are properties of the class; it defaults to 298.15 K and 101325 Pa. There is a contribution due to mixing: .. math:: \Delta S_{mixing} = -R\sum_i z_i \log(z_i) The ideal gas pressure contribution is: .. math:: \Delta S_{P} = -R\log\left(\frac{P}{P_{ref}}\right) For a liquid mixture or a partially liquid mixture, the entropy contribution is not so strong - all such pressure effects find that expression capped at the vapor pressure, as shown in [1]_. .. math:: \Delta S_{P} = - \sum_i x_i\left(1 - \frac{V}{F}\right) R\log\left(\frac{P_{sat, i}}{P_{ref}}\right) - \sum_i y_i\left( \frac{V}{F}\right) R\log\left(\frac{P}{P_{ref}}\right) These expressions are combined with the standard heat capacity and enthalpy of vaporization expressions to calculate the total entropy: For a pure gas mixture: .. math:: S = \Delta S_{mixing} + \Delta S_{P} + \sum_i z_i \cdot \int_{T_{ref}}^T \frac{C_{p}^{ig}(T)}{T} dT For a pure liquid mixture: .. math:: S = \Delta S_{mixing} + \Delta S_{P} + \sum_i z_i \left( \int_{T_{ref}}^T \frac{C_{p}^{ig}(T)}{T} dT + \frac{H_{vap, i} (T)}{T} \right) For a vapor-liquid mixture: .. math:: S = \Delta S_{mixing} + \Delta S_{P} + \sum_i z_i \cdot \int_{T_{ref}}^T \frac{C_{p}^{ig}(T)}{T} dT + \sum_i x_i\left(1 - \frac{V}{F}\right)\frac{H_{vap, i}(T)}{T} Returns ------- S : float Entropy of the mixture with respect to the reference temperature, [J/mol/K] Notes ----- The object must be flashed before this routine can be used. It depends on the properties T, P, zs, V_over_F, HeatCapacityGases, EnthalpyVaporizations, VaporPressures, and xs. References ---------- .. [1] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. ''' S = 0 T = self.T P = self.P S -= R * sum([ zi * log(zi) for zi in self.zs if zi > 0 ]) # ideal composition entropy composition; chemsep checked # Both of the mixing and vapor pressure terms have negative signs # Equation 6-4.4b in Poling for the vapor pressure component # For liquids above their critical temperatures, Psat is equal to the system P (COCO). if self.phase == 'g': S -= R * log( P / 101325. ) # Gas-phase ideal pressure contribution (checked repeatedly) for i in self.cmps: S += self.HeatCapacityGases[ i].T_dependent_property_integral_over_T(298.15, T) elif self.phase == 'l': Psats = self._Psats(T) for i in self.cmps: Sg298_to_T = self.HeatCapacityGases[ i].T_dependent_property_integral_over_T(298.15, T) Hvap = self.EnthalpyVaporizations[i](T) if Hvap is None: Hvap = 0 # Handle the case of a package predicting a transition past the Tc Svap = -Hvap / T # Do the transition at the temperature of the liquid S_P = -R * log(Psats[i] / 101325.) S += self.zs[i] * (Sg298_to_T + Svap + S_P) elif self.phase == 'l/g': Psats = self._Psats(T) S_P_vapor = -R * log( P / 101325. ) # Gas-phase ideal pressure contribution (checked repeatedly) for i in self.cmps: Sg298_to_T_zi = self.zs[i] * self.HeatCapacityGases[ i].T_dependent_property_integral_over_T(298.15, T) Hvap = self.EnthalpyVaporizations[i](T) if Hvap is None: Hvap = 0 # Handle the case of a package predicting a transition past the Tc Svap_contrib = -self.xs[i] * (1 - self.V_over_F) * Hvap / T # Pressure contributions from both phases S_P_vapor_i = self.V_over_F * self.ys[i] * S_P_vapor S_P_liquid_i = -R * log( Psats[i] / 101325.) * (1 - self.V_over_F) * self.xs[i] S += (Sg298_to_T_zi + Svap_contrib + S_P_vapor_i + S_P_liquid_i) return S