#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''Pychemqt, Chemical Engineering Process simulator
Copyright (C) 2009-2025, Juan José Gómez Romera <jjgomera@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.'''
from numpy import roots
from scipy.constants import R
from lib.EoS.cubic import Cubic
# Table I in [1]_ and Table III, IV in [3]_
dat = {
98: (0.328, 0.450751),
46: (0.329, 0.516798),
47: (0.327, 0.487035),
2: (0.324, 0.455336),
3: (0.317, 0.561567),
22: (0.313, 0.554369),
4: (0.317, 0.648049),
23: (0.324, 0.661305),
65: (0.310, 0.664179),
6: (0.309, 0.678389),
5: (0.315, 0.683133),
24: (0.315, 0.696423),
8: (0.308, 0.746470),
7: (0.314, 0.741095),
10: (0.305, 0.801605),
11: (0.305, 0.868856),
12: (0.301, 0.918544),
13: (0.301, 0.982750),
14: (0.297, 1.021919),
15: (0.297, 1.080416),
16: (0.294, 1.115585),
17: (0.295, 1.179982),
18: (0.291, 1.188785),
21: (0.283, 1.297054),
90: (0.276, 1.276058),
92: (0.277, 1.409671),
49: (0.309, 0.707727),
48: (0.328, 0.535060),
51: (0.310, 0.797391),
50: (0.320, 0.583165),
62: (0.269, 0.689803),
38: (0.303, 0.665434),
842: (0.310, 0.859036),
346: (0.300, 1.000087),
406: (0.305, 1.082667),
191: (0.297, 0.827417),
63: (0.283, 0.642740),
40: (0.311, 0.698911),
41: (0.306, 0.753893),
42: (0.305, 0.812845),
43: (0.301, 0.816962),
44: (0.300, 0.807023),
117: (0.274, 0.965347),
134: (0.292, 1.171714),
146: (0.302, 1.211304),
160: (0.305, 1.221182),
313: (0.308, 1.240459),
335: (0.330, 1.433586),
357: (0.301, 1.215380),
360: (0.308, 1.270267),
130: (0.258, 0.762043),
143: (0.295, 1.146553),
154: (0.329, 1.395151),
306: (0.292, 1.174746),
510: (0.291, 1.272986),
540: (0.292, 1.393678),
545: (0.290, 1.496554),
140: (0.283, 0.701112),
162: (0.308, 0.787322),
100: (0.314, 0.694866),
155: (0.296, 0.842965),
166: (0.295, 0.882502),
165: (0.294, 0.826046)}
# Table I in [2]_
PT2 = {
135: [-1.11765, -1.81779, 0.47892, 3],
129: [0.82082, -2.80514, 0, 0],
62: [0.60462, -2.56713, 0, 0],
22: [1.94572, -3.59956, -0.37410, 2],
49: [0.63199, -2.69935, 0, 0],
50: [0.66433, -2.39792, -0.00669, 10],
2: [0.32274, -1.47606, -0.02025, 6],
140: [0.19454, -1.45357, 0.32485, -0.5],
46: [0.09339, -1.26573, 0, 0],
1: [-0.72258, 1.08363, -1.4928e-6, -8]}
[docs]
class PT(Cubic):
r"""Patel-Teja cubic equation of state implementation
.. math::
\begin{array}[t]{l}
P = \frac{RT}{V-b}-\frac{a}{V\left(V+b\right)+c\left(V-b\right)}\\
a = \Omega_a\frac{R^2T_c^2}{P_c}\alpha\\
b = \Omega_b\frac{RT_c}{P_c}\\
c = \Omega_c\frac{RT_c}{P_c}\\
\Omega_c = 1 - 3\zeta_c\\
\Omega_a = 3\zeta_c^2 + 3\left(1-2\zeta_c\right)\Omega_b + \Omega_b^2
+ 1 - 3\zeta_c\\
\end{array}
:math:`\Omega_b` is the smallest positive root or the equation:
.. math::
\Omega_b^3 + \left(2-3\zeta_c\right)\Omega_b^2 + 3\zeta_c^2\Omega_b -
\zeta_c^3 = 0
The paper give generation correlation for F and ζc, valid only for nonpolar
compounds.
.. math::
\begin{array}[t]{l}
F = 0.452413 + 1.30982\omega - 0.295937\omega^2\\
\zeta_c = 0.329032 - 0.076799\omega + 0.0211947\omega^2\\
\end{array}
In [1]_ and [3]_ there are values for these parameters for several
compounds.
The temperature dependence of alpha is defined in [2]_
.. math::
\alpha = 1 + c_1\left(T_r-1\right) + c_2\left(\sqrt{T_r}-1\right) +
c_3\left(T_r^N-1\right)
where c₁, c₂, c₃ and N are compound specific parameters available for
several compounds from [2]_. In compound with no parameters available use
the SRK original temperature dependence:
.. math::
\alpha^{0.5} = 1 + F\left(1-Tr^{0.5}\right)\\
Examples
--------
Example 4.3 from [4]_, Propane saturated at 300K
>>> from lib.mezcla import Mezcla
>>> mix = Mezcla(5, ids=[4], caudalMolar=1, fraccionMolar=[1])
>>> eq = PT(300, 9.9742e5, mix)
>>> '%0.1f' % (eq.Vl.ccmol)
'90.9'
>>> eq = PT(300, 42.477e5, mix)
>>> '%0.1f' % (eq.Vg.ccmol)
'88.1'
"""
__title__ = "Patel-Teja (1982)"
__status__ = "PT"
__doi__ = (
{
"autor": "Patel, N.C., Teja, A.S.",
"title": "A New Cubic Equation of State for Fluids and Fluid Mixtures",
"ref": "Chem. Eng. Sci. 37(3) (1982) 463-473",
"doi": "10.1016/0009-2509(82)80099-7"},
{
"autor": "Patel, N.C.",
"title": "Improvements of the Patel-Teja Equation of State",
"ref": "Int. J. Thermophysics 17(3) (1996) 673-682",
"doi": "10.1007/bf01441513"},
{
"autor": "Georgeton, G.K., Smith, R.L.Jr., Teja, A.S",
"title": "Application of Cubic Equations of State to Polar Fluids "
"and Fluid Mixtures",
"ref": "in Chao, K.C., Robinson, R.L. Equations of State. Theories "
"and Applications, 1985, ACS Svmposium 300, pp. 434-451",
"doi": ""},
{
"autor": "Poling, B.E, Prausnitz, J.M, O'Connell, J.P",
"title": "The Properties of Gases and Liquids 5th Edition",
"ref": "McGraw-Hill, New York, 2001",
"doi": ""})
[docs]
def _cubicDefinition(self, T):
"""Definition of individual components coefficients"""
ai = []
bi = []
ci = []
for cmp in self.componente:
a, b, c = self._lib(cmp, T)
ai.append(a)
bi.append(b)
ci.append(c)
self.ai = ai
self.bi = bi
self.ci = ci
[docs]
def _GEOS(self, xi):
am, bm, cm = self._mixture(None, xi, [self.ai, self.bi, self.ci])
delta = bm+cm
epsilon = -bm*cm
return am, bm, delta, epsilon
[docs]
def _lib(self, cmp, T):
if cmp.id in dat:
# Use the compound specific parameters values
xic, f = dat[cmp.id]
else:
# Use the generalization correlations, Eq 20-21
f = 0.452413 + 1.30982*cmp.f_acent - 0.295937*cmp.f_acent**2
xic = 0.329032 - 0.076799*cmp.f_acent + 0.0211947*cmp.f_acent**2
# Eq 8
c = (1-3*xic)*R*cmp.Tc/cmp.Pc
# Eq 10
b = roots([1, 2-3*xic, 3*xic**2, -xic**3])
Bpositivos = []
for i in b:
if i > 0:
Bpositivos.append(i)
Omegab = min(Bpositivos)
b = Omegab*R*cmp.Tc/cmp.Pc
# Eq 9
Omegaa = 3*xic**2 + 3*(1-2*xic)*Omegab + Omegab**2 + 1 - 3*xic
if cmp.id in PT2:
# Using improved alpha correlation from [2]_
c1, c2, c3, n = PT2[cmp.id]
alfa = 1 + c1*(T/cmp.Tc-1) + c2*((T/cmp.Tc)**0.5-1) + \
c3*((T/cmp.Tc)**n-1)
else:
alfa = (1+f*(1-(T/cmp.Tc)**0.5))**2
a = Omegaa*alfa*R**2*cmp.Tc**2/cmp.Pc
return a, b, c