4. Thermodynamics correlations for pure components¶
En esta sección se muestra la clase Thermodynamics_correlations(), la cual permite realizar el cálculo de propiedades termodinámicas de sustancias puras como una función de la temperatura. En este caso se pueden tener 6 situaciones:
- Especificar una sustancia pura sin especificar una temperatura. En este caso por defecto la propiedad termodinámica se calcula entre el intervalo mínimo y máximo de validez experimental para cada correlación.
- Especificar una sustancia pura y especificar una temperatura.
- Especificar una sustancia pura y especificar varias temperaturas.
- Especificar varias sustancias puras sin especificar una temperatura.
- Especificar varias sustancias puras y especificar una temperatura.
- Especificar varias sustancias puras y especificar varias temperaturas
la clase Thermodynamics_correlations() es usada para calcular 13 propiedades termodinámicas de sustancias puras en función de la temperatura y se sigue la siguente convención para identificar las propiedades termodinámicas:
property thermodynamics = name property, units, correlation, equation
Las correlaciones termodinámicas implementadas son:
-Solid_Density = «Solid Density», «[kmol/m^3]», «A+B*T+C*T2+D*T^3+E*T4», 0
-Liquid_Density = «Liquid Density», «[kmol/m^3]», «A/B:sup:(1+(1-T/C)D)», 1
-Vapour_Pressure = «Vapour Pressure», «[Bar]», «exp(A+B/T+C*ln(T)+D*T^E) * 1e-5», 2
-Heat_of_Vaporization = «Heat of Vaporization», «[J/kmol]», «A*(1-Tr):sup:(B+C*Tr+D*Tr2)», 3
-Solid_Heat_Capacity = «Solid Heat Capacity», «[J/(kmol*K)]», «A+B*T+C*T2+D*T^3+E*T4», 4
-Liquid_Heat_Capacity = «Liquid Heat Capacity», «[J/(kmol*K)]», «A:sup:2/(1-Tr)+B-2*A*C*(1-Tr)-A*D*(1-Tr):sup:`2-C2*(1-Tr)`3/3-CD(1-Tr):sup:4/2-D2*(1-Tr)^5/5», 5
-Ideal_Gas_Heat_Capacity = «Ideal Gas Heat Capacity» «[J/(kmol*K)]», «A+B*(C/T/sinh(C/T))^2+D*(E/T/cosh(E/T))^2», 6
-Second_Virial_Coefficient = «Second Virial Coefficient», «[m^3/kmol]», «A+B/T+C/T:sup:3+D/T8+E/T^9», 7
-Liquid_Viscosity = «Liquid Viscosity», «[kg/(m*s)]», «exp(A+B/T+C*ln(T)+D*T^E)», 8
-Vapour_Viscosity = «Vapour Viscosity», «[kg/(m*s)]», «A*T:sup:B/(1+C/T+D/T2)», 9
-Liquid_Thermal_Conductivity = «Liquid Thermal Conductivity», «[J/(m*s*K)]», «A+B*T+C*T2+D*T^3+E*T4», 10
-Vapour_Thermal_Conductivity = «Vapour Thermal Conductivity», «[J/(m*s*K)]», «A*T:sup:B/(1+C/T+D/T2)», 11
-Surface_Tension = «Surface Tension», «[kg/s^2]», «A*(1-Tr):sup:(B+C*Tr+D*Tr2)», 12
Para empezar se importan las librerías que se van a utilizar, que en este caso son numpy, pandas, pyther ademas de especificar que las figuras generadas se muestren dentro de las celdas de Jupyter Notebook
import numpy as np
import pandas as pd
import pyther as pt
import matplotlib.pyplot as plt
%matplotlib inline
16.1 Especificar una sustancia pura sin especificar una temperatura.¶
Luego se carga el archivo que contine las constantes de las correlaciones de las propiedades termodinamicas, que se llama en este caso «PureFull_mod_properties.xls» y se asigna a la variable dppr_file.
Creamos un objeto llamado thermodynamic_correlations y se pasan como parametros las variables component y property_thermodynamics que en el ejemplo se especifica para el componente METHANE la Vapour_Pressure
dppr_file = "PureFull_mod_properties.xls"
thermodynamic_correlations = pt.Thermodynamic_correlations(dppr_file)
component = ['METHANE']
property_thermodynamics = "Vapour_Pressure"
Vapour_Pressure = thermodynamic_correlations.property_cal(component, property_thermodynamics)
print("Vapour Pressure = {0}". format(Vapour_Pressure))
----------------------------------------------------------------------
Pure substance without temperature especific: ['METHANE']
----------------------------------------------------------------------
Vapour Pressure = [ 0.11687017 0.13272851 0.15029231 0.1696935 0.19106965
0.21456383 0.24032459 0.26850587 0.29926689 0.33277204
0.36919081 0.40869762 0.45147173 0.49769708 0.54756216
0.60125987 0.65898737 0.72094595 0.78734085 0.85838113
0.93427952 1.01525227 1.101519 1.19330257 1.29082892
1.39432695 1.50402838 1.62016765 1.74298174 1.87271013
2.00959463 2.1538793 2.30581038 2.46563616 2.63360692
2.80997486 2.99499402 3.18892023 3.39201109 3.60452587
3.82672552 4.05887261 4.30123136 4.55406758 4.8176487
5.09224376 5.37812343 5.67556002 5.98482753 6.30620166
6.63995987 6.98638141 7.34574742 7.71834093 8.10444699
8.5043527 8.91834734 9.34672242 9.78977179 10.24779173
10.7210811 11.20994139 11.71467689 12.23559478 12.7730053
13.32722183 13.89856107 14.48734319 15.09389194 15.71853484
16.36160334 17.02343294 17.70436342 18.40473898 19.1249084
19.86522527 20.62604814 21.40774072 22.21067207 23.03521683
23.88175537 24.75067404 25.64236538 26.55722832 27.4956684
28.45809802 29.44493665 30.45661106 31.49355559 32.55621234
33.64503148 34.76047146 35.90299928 37.07309076 38.2712308
39.49791367 40.75364324 42.03893333 43.35430794 44.7003016 ]
para realizar un gráfico simple de la propiedad termodinámica se utiliza el método graphical(temperature, property_thermodynamics, label_property_thermodynamics, units).
En donde se pasan como argumentos la temperatura a la cual se claculó la propiedad termodinamica, los valores calculados de la propiedad termodinamica, el label de la propiedad termodinámica y las unidades correspondientes de temperatura y la propiedad termodinámica en cada caso.
temperature_vapour = thermodynamic_correlations.temperature
units = thermodynamic_correlations.units
print(units)
thermodynamic_correlations.graphical(temperature_vapour, Vapour_Pressure, property_thermodynamics, units)
('K', '[Pa]')
16.2 Especificar una sustancia pura y una temperatura.¶
Siguiendo con la sustacia pura METHANE se tiene el segundo caso en el cual ademas de especificiar el componente se especifica también solo un valor de temperatura, tal como se muestra en la variable temperature.
Dado que cada correlación de propiedad termodinámica tiene un rango mínimo y máximo de temperatura en la cual es valida, al especificar un valor de temperatura se hace una verificación para determinar si la temperatura ingresada se encuentra entre el intervalo aceptado para cada componente y cada propiedad termodinámica. En caso contrario la temperatura se clasifica como invalida y no se obtiene valor para la propiedad termodinámica seleccionada.
component = ['METHANE']
property_thermodynamics = "Vapour_Pressure"
temperature = [180.4]
Vapour_Pressure = thermodynamic_correlations.property_cal(component, property_thermodynamics, temperature)
print("Vapour Pressure = {0} {1}". format(Vapour_Pressure, units[1]))
----------------------------------------------------------------------
Pure substance with a temperature especific: ['METHANE']
----------------------------------------------------------------------
Temperature_enter = [180.4]
Temperature_invalid = []
Temperature_valid = [180.4]
----------------------------------------------------------------------
Vapour Pressure = [ 33.32655377] [Pa]
16.3 Especificar una sustancia pura y especificar varias temperaturas.¶
Ahora se tiene la situación de contar con un solo componente «METHANE» sin embargo, esta vez se especifica varios valores para la temperatura en las cuales se quiere determinar el correspondiente valor de una proiedad termodinámica, que como en los casos anteriores es la Vapour_Pressure.
component = ['METHANE']
property_thermodynamics = "Vapour_Pressure"
temperature = [180.4, 181.4, 185.3, 210, 85]
Vapour_Pressure = thermodynamic_correlations.property_cal(component, "Vapour_Pressure", temperature)
print("Vapour Pressure = {0} {1}". format(Vapour_Pressure, units[1]))
----------------------------------------------------------------------
Pure substance with a temperature especific: ['METHANE']
----------------------------------------------------------------------
Temperature_enter = [180.4, 181.4, 185.3, '210 K is a temperature not valid', '85 K is a temperature not valid']
Temperature_invalid = ['210 K is a temperature not valid', '85 K is a temperature not valid']
Temperature_valid = [180.4, 181.4, 185.3]
----------------------------------------------------------------------
Vapour Pressure = [ 33.32655377 34.43422601 39.01608023] [Pa]
Se debe notar que al ingresar una serie de valores de temperatura, en este caso 5 valores, se obtienen solo 3 valores de la propiedad termodinámica. Esto se debe a que para este caso 2 valores de temperatura no se encuentran en el valor mínimo y máximo en donde es valida la correlación termodinámica. Por tanto, esto se avisa por medio del mensaje: Temperature_invalid = [“210 K is a temperature not valid”, “85 K is a temperature not valid”]
16.4 Especificar varias sustancias puras sin especificar una temperatura.¶
Otra de las posibilidades que se puede tener es la opción de especificar varios componentes para una misma propiedad termodinámica sin que se especifique una o más valores de temperatura. En esta opción se pueden ingresar multiples componentes sin un limite, siempre y cuando estén en la base de datos con la que se trabaja o en dado caso sean agregados a la base de datos nuevas correlaciones para sustancias puras Ver sección base de datos. Para este ejemplo se utiliza una list components con 3 sustancias puras por cuestiones de visibilidad de las gráficas de Vapour_Pressure.
components = ["METHANE", "n-TETRACOSANE", "ISOBUTANE"]
property_thermodynamics = "Vapour_Pressure"
Vapour_Pressure = thermodynamic_correlations.property_cal(components, property_thermodynamics)
temperature_vapour = thermodynamic_correlations.temperature
por medio del método multi_graphical(components, temperature, property_thermodynamics) al cual se pasan los parámetros correspondiente a las sustancias puras, la temperatura a la cual se realiza el calculo de la propiedad termodinámica y los valores de la propiedad termodinámica de cada sustancia pura, para obtener la siguiente figura.
thermodynamic_correlations.multi_graphical(components, temperature_vapour, Vapour_Pressure)
sin embargo como se menciono anteriormente, es posible calcular una propiedad termodinámica para un gran número de sustancias puras y luego realizar las gráficas correspondientes dependiendo de las necesidades de visualización entre otros criterios. Para ejemplificar esto, ahora se tienen 7 sustancias puras y se quiere gŕaficar la propiedad termodinámica de solo: n-PENTACOSANE, ETHANE y el ISOBUTANE.
components = ["METHANE", "n-TETRACOSANE", "n-PENTACOSANE", "ETHANE", "ISOBUTANE", "PROPANE", "3-METHYLHEPTANE"]
property_thermodynamics = "Vapour_Pressure"
Vapour_Pressure = thermodynamic_correlations.property_cal(components, property_thermodynamics)
temperature_vapour = thermodynamic_correlations.temperature
thermodynamic_correlations.multi_graphical(components[2:5], temperature_vapour[2:5], Vapour_Pressure[2:5])
16.5 Especificar varias sustancias puras y una temperatura.¶
Como en el caso anterios, en este ejemplo se espcifican 3 sustancias puras pero con la especificación de un solo valor de temperatura. Esta temperatura será común para las sustancias puras con las que se trabaje por tanto puede darse el caso de que sea una temperatura valida para algunas sustancias puras mientras que para otras no dependiendo del intervalo de valides de cada correlación termodinámica.
dppr_file = "PureFull_mod_properties.xls"
thermodynamic_correlations = pt.Thermodynamic_correlations(dppr_file)
components = ["METHANE", "n-TETRACOSANE", "ISOBUTANE"]
property_thermodynamics = "Vapour_Pressure"
temperature = [180.4]
Vapour_Pressure = thermodynamic_correlations.property_cal(components, property_thermodynamics, temperature)
print("Vapour Pressure = {0} {1}". format(Vapour_Pressure, units[1]))
----------------------------------------------------------------------
Pure substances with a temperature especific: ['METHANE', 'n-TETRACOSANE', 'ISOBUTANE']
----------------------------------------------------------------------
[180.4]
Temperature_enter = [[180.4], ['180.4 K is a temperature not valid'], [180.4]]
Temperature_invalid = [[], ['180.4 K is a temperature not valid'], []]
Temperature_valid = [array([ 180.4]), array([], dtype=float64), array([ 180.4])]
vapour_Pressure = [array([ 33.32655377]) array([], dtype=float64) array([ 0.0074373])] (3,)
3
Vapour Pressure = [array([ 33.32655377]) array([], dtype=float64) array([ 0.0074373])] [Pa]
en este caso se tiene como resultado un con 2 valores de presión de vapor, uno para METHANE y otro para ISOBUTANE, mientras que se obtiene un array vacio en el caso «de n-TETRACOSANE, puesto que la temperatura de 180 K especificada no se encuentra como valida.
para verificar tanto los valores de las constantes como los valores mínimos y máximos de cada correlación termodinámica para cada una de las sustancias puras que se especifique se utiliza el atributo component_constans tal como se muestra a continuación
thermodynamic_correlations.component_constans
A | B | C | D | E | T Min [K] | T Max [K] | |
---|---|---|---|---|---|---|---|
METHANE | 39.205 | -1324.4 | -3.4366 | 3.1019e-05 | 2 | 90.69 | 190.56 |
n-TETRACOSANE | 211.42 | -21711 | -26.255 | 7.7485e-06 | 2 | 323.75 | 804 |
ISOBUTANE | 100.18 | -4841.9 | -13.541 | 0.020063 | 1 | 113.54 | 408.14 |
16.6 Especificar varias sustancias puras y especificar varias temperaturas¶
En esta opción se puede manipular varias sustancias puras de forma simultanea con la especificación de varios valores de temperaturas, en donde cada valor de temperatura especificado será común para cada sustancia pura, de tal forma que se obtendra valores adecuados para aquellos valores de temperatura que sean validos para cada caso considerado.
import numpy as np
import pandas as pd
import pyther as pt
import matplotlib.pyplot as plt
%matplotlib inline
dppr_file = "PureFull_mod_properties.xls"
thermodynamic_correlations = pt.Thermodynamic_correlations(dppr_file)
#components = ["METHANE", "n-TETRACOSANE", "ISOBUTANE"]
components = ["METHANE", "n-TETRACOSANE", "n-PENTACOSANE", "ETHANE", "ISOBUTANE", "PROPANE", "3-METHYLHEPTANE"]
property_thermodynamics = "Vapour_Pressure"
temperature = [180.4, 181.4, 185.3, 210, 800]
Vapour_Pressure = thermodynamic_correlations.property_cal(components, property_thermodynamics, temperature)
print("Vapour Pressure = {0}". format(Vapour_Pressure))
----------------------------------------------------------------------
Pure substances with a temperature especific: ['METHANE', 'n-TETRACOSANE', 'n-PENTACOSANE', 'ETHANE', 'ISOBUTANE', 'PROPANE', '3-METHYLHEPTANE']
----------------------------------------------------------------------
[180.4, 181.4, 185.3, 210, 800]
Temperature_enter = [[180.4, 181.4, 185.3, '210 K is a temperature not valid', '800 K is a temperature not valid'], ['180.4 K is a temperature not valid', '181.4 K is a temperature not valid', '185.3 K is a temperature not valid', '210 K is a temperature not valid', 800], ['180.4 K is a temperature not valid', '181.4 K is a temperature not valid', '185.3 K is a temperature not valid', '210 K is a temperature not valid', 800], [180.4, 181.4, 185.3, 210, '800 K is a temperature not valid'], [180.4, 181.4, 185.3, 210, '800 K is a temperature not valid'], [180.4, 181.4, 185.3, 210, '800 K is a temperature not valid'], [180.4, 181.4, 185.3, 210, '800 K is a temperature not valid']]
Temperature_invalid = [['210 K is a temperature not valid', '800 K is a temperature not valid'], ['180.4 K is a temperature not valid', '181.4 K is a temperature not valid', '185.3 K is a temperature not valid', '210 K is a temperature not valid'], ['180.4 K is a temperature not valid', '181.4 K is a temperature not valid', '185.3 K is a temperature not valid', '210 K is a temperature not valid'], ['800 K is a temperature not valid'], ['800 K is a temperature not valid'], ['800 K is a temperature not valid'], ['800 K is a temperature not valid']]
Temperature_valid = [array([ 180.4, 181.4, 185.3]), array([800]), array([800]), array([ 180.4, 181.4, 185.3, 210. ]), array([ 180.4, 181.4, 185.3, 210. ]), array([ 180.4, 181.4, 185.3, 210. ]), array([ 180.4, 181.4, 185.3, 210. ])]
7
Vapour Pressure = [array([ 33.32655377, 34.43422601, 39.01608023]) array([ 9.23391967])
array([ 7.9130031])
array([ 0.80394112, 0.85063572, 1.05335836, 3.33810867])
array([ 0.0074373 , 0.00816353, 0.01160766, 0.07565701])
array([ 0.05189654, 0.05605831, 0.07505225, 0.35872729])
array([ 2.09878094e-07, 2.50494222e-07, 4.89039104e-07,
1.75089920e-05])]
como se muestra en los resultados anteriores, se comienza a complicar la manipulación de los datos conforme incrementa el número de sustancias puras y temperaturas involucradas en el analisis, por tal motivo conviene utilizar las bondades de librerías especializadas para el procesamiento de datos como Pandas para obtener resultados más eficientes.
El método data_temperature(components, temperature, Vapour_Pressure, temp_enter) presenta un DataFrame con los resultados obtenidos luego de calcular la propiedad termodinámica indicada, señalan que para las temperaturas invalidas en el intervalo de aplicación de la correlación termodinámica, el resultado será NaN, tal como se muestra con el ejemplo a continuación.
temp_enter = thermodynamic_correlations.temperature_enter
thermodynamic_correlations.data_temperature(components, temperature, Vapour_Pressure, temp_enter)
180.4 K | 181.4 K | 185.3 K | 210 K | 800 K | |
---|---|---|---|---|---|
METHANE | 3.332655e+01 | 3.443423e+01 | 3.901608e+01 | NaN | NaN |
n-TETRACOSANE | NaN | NaN | NaN | NaN | 9.233920 |
n-PENTACOSANE | NaN | NaN | NaN | NaN | 7.913003 |
ETHANE | 8.039411e-01 | 8.506357e-01 | 1.053358e+00 | 3.338109 | NaN |
ISOBUTANE | 7.437302e-03 | 8.163530e-03 | 1.160766e-02 | 0.075657 | NaN |
PROPANE | 5.189654e-02 | 5.605831e-02 | 7.505225e-02 | 0.358727 | NaN |
3-METHYLHEPTANE | 2.098781e-07 | 2.504942e-07 | 4.890391e-07 | 0.000018 | NaN |
16.7 Trabajo futuro¶
- Actualmente PyTher se encuentra implementando la opción de multiples propiedades termodinámicas de forma simultanea para el caso de multiples sustancias puras con multiples opciones de temepratura.
- Dar soporte a la manipulación de bases de datos por parte de usuarios para agregar, modificar, eliminar, renombrar sustancias puras y/o correlaciones termodinámicas.
16.8 Referencias¶
Numpy