En esta sección se muestra la class Thermodynamic_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 para cada una de las 13 propiedades termofísicas soportadas:
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 presentar identificar las propiedades termodinámicas
property thermodynamics = name property, units, correlation, equation
The thermodynamic correlations are:
-Solid_Density = "Solid Density", "[kmol/m^3]", "A+BT+CT^2+DT^3+ET^4", 0
-Liquid_Density = "Liquid Density", "[kmol/m^3]", "A/B^(1+(1-T/C)^D)", 1
-Vapour_Pressure = "Vapour Pressure", "[Bar]", "exp(A+B/T+Cln(T)+DT^E) * 1e-5", 2
-Heat_of_Vaporization = "Heat of Vaporization", "[J/kmol]", "A(1-Tr)^(B+CTr+D*Tr^2)", 3
-Solid_Heat_Capacity = "Solid Heat Capacity", "[J/(kmolK)]", "A+BT+CT^2+DT^3+E*T^4", 4
-Liquid_Heat_Capacity = "Liquid Heat Capacity", "[J/(kmolK)]", "A^2/(1-Tr)+B-2AC(1-Tr)-AD(1-Tr)^2-C^2(1-Tr)^3/3-CD(1-Tr)^4/2-D^2(1-Tr)^5/5", 5
-Ideal_Gas_Heat_Capacity = "Ideal Gas Heat Capacity" "[J/(kmolK)]", "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^3+D/T^8+E/T^9", 7
-Liquid_Viscosity = "Liquid Viscosity", "[kg/(ms)]", "exp(A+B/T+Cln(T)+D*T^E)", 8
-Vapour_Viscosity = "Vapour Viscosity", "[kg/(ms)]", "AT^B/(1+C/T+D/T^2)", 9
-Liquid_Thermal_Conductivity = "Liquid Thermal Conductivity", "[J/(msK)]", "A+BT+CT^2+DT^3+ET^4", 10
-Vapour_Thermal_Conductivity = "Vapour Thermal Conductivity", "[J/(msK)]", "A*T^B/(1+C/T+D/T^2)", 11
-Surface_Tension = "Surface Tension", "[kg/s^2]", "A(1-Tr)^(B+CTr+D*Tr^2)", 12
Para empezar se importan las librerías que se van a utilizar, que en este caso son numpy, pandas, pyther y especificar que las figuras generadas se muesten dentro del jupyter notebook
In [2]:
import numpy as np
import pandas as pd
import pyther as pt
import matplotlib.pyplot as plt
#%matplotlib inline
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
In [2]:
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))
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.
In [3]:
temperature_vapour = thermodynamic_correlations.temperature
units = thermodynamic_correlations.units
print(units)
thermodynamic_correlations.graphical(temperature_vapour, Vapour_Pressure, property_thermodynamics, units)
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.
In [4]:
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]))
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.
In [5]:
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]))
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']
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.
In [6]:
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.
In [7]:
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.
In [8]:
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
In [9]:
thermodynamic_correlations.multi_graphical(components[2:5], temperature_vapour[2:5], Vapour_Pressure[2:5])
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.
In [10]:
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]))
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
In [11]:
thermodynamic_correlations.component_constans
Out[11]:
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.
In [12]:
import numpy as np
import pandas as pd
import pyther as pt
import matplotlib.pyplot as plt
%matplotlib inline
In [13]:
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))
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.
In [14]:
temp_enter = thermodynamic_correlations.temperature_enter
thermodynamic_correlations.data_temperature(components, temperature, Vapour_Pressure, temp_enter)
Out[14]: