miércoles, 30 de junio de 2021

Factor Z 2

 En esta ocasión continuaré con las correlaciones del factor Z.

Comenzaré por la correlación de Hall, K.R. y Yarborough, L., la cual tiene los siguientes rangos 0.1 <= Ppr <= 24 y 1.2 <= Tpr <= 3

t = 485.9/(194+460) # Tpc (Temperatura Pseudocritica )/T

def DDF(Y,t):

            A = 0.06125*t*np.exp(-1.2*(1-t)**2)

            B = (14.76*t-9.76*t**2+4.58*t**3)

            C = (90.7*t-242.2*t**2+42.4*t**3)

            D = 2.18+2.82*t

            Y = -A*Ppr+((Y+(Y**2)+(Y**3)-(Y**4))/((1-Y)**3))-B*(Y**2)+C*(Y**D)

            return Y

Y = 0.01

conteo = 0

error = 1

while error > 0.0000001:

            dy = ((DDF(Y,t)+0.0001)-DDF(Y,t))/0.0001

            yn = Y-DDF(Y,t)/dy

            conteo = conteo + 1

            error = (yn-Y)/yn

            Y = yn

z =(0.06125*Ppr*t*np.exp(-1.2*(1-t)**2))/Y

print("Hall","------",round(z,4))

La siguiente correlación es la de Dranchuk, P.M., Purvis, R.A. y Robinson, D.B. la cual tiene los siguientes rangos 0.2 <= Ppr <= 30 y 1.05 <= Tpr <= 3

Z = 0.6000 # Z propuesta

A1 = 0.31506237

A2 = -1.0467099

A3 = -0.57832729

A4 = 0.53530771

A5 = -0.61232032

A6 = -0.10488813

A7 = 0.68157001

A8 = 0.68446549

error = 1

while error > 0.000000001:

            Pr = 0.27*(Ppr/(Z*Tpr))

            F = Z-(1+((A1+(A2/Tpr)+(A3/(Tpr**3)))*Pr)+((A4+(A5/Tpr))*(Pr**2))+((A5*A6*Pr**5)/Tpr)+A7*(1+A8*(Pr**2))*((Pr**2)/(Tpr**3))*(np.exp(-A8*Pr**2)))

            G = 1+((A1+(A2/Tpr)+(A3/(Tpr**3)))*(Pr/Z))+(2*(A4+(A5/Tpr))*((Pr**2)/Z))+((5*A5*A6*Pr**5)/(Tpr*Z))+((2*A7*(Pr**2))/(Z*(Tpr**3)))*(1+(A8*(Pr**2))-((A8*(Pr**2))**2))*(np.exp(-A8*(Pr**2)))

            Z2 = Z-(F/G)

            error = (Z2-Z)/Z2

            Z = Z2

print("Dranchuck","-",round(Z,4))

Pr último, está la correlación de Dranchuk, P.M. y Abou-Kassem, J.H., la cual tiene los siguientes rangos 0.2 <= Ppr <= 30 y 1 <= Tpr <= 3.

A1 = 0.3265

A2 = -1.07

A3 = -0.5339

A4 = 0.01569

A5 = -0.05165

A6 = 0.5475

A7 = -0.7361

A8 = 0.1844

A9 = 0.1056

A10 = 0.6134

A11 = 0.721

error = 1

Z = 0.6000

while error > 0.00000001:

            Pr = (0.27*Ppr)/(Z*Tpr)

            F = Z-(1+(A1+(A2/Tpr)+(A3/(Tpr**3))+(A4/(Tpr**4))+(A5/(Tpr**5)))*Pr+(A6+(A7/Tpr)+(A8/(Tpr**2)))*(Pr**2)-A9*((A7/Tpr)+(A8/(Tpr**2)))*(Pr**5)+A10*(1+A11*(Pr**2))*((Pr**2)/(Tpr**3))*np.exp(-A11*Pr**2))

            G = 1+(A1+(A2/Tpr)+(A3/(Tpr**3))+(A4/(Tpr**4))+(A5/(Tpr**5)))*(Pr/Z)+2*(A6+(A7/Tpr)+(A8/(Tpr**2)))*((Pr**2)/Z)-5*A9*((A7/Tpr)+(A8/(Tpr**2)))*((Pr**5)/Z)+((2*A10*(Pr**2))/(Z*(Tpr**3)))*(1+(A11*(Pr**2))-((A11**2)*(Pr**2)**2))*np.exp(-A11*Pr**2)

            Z2 = Z-(F/G)

            error = (Z2-Z)/Z2

            Z = Z2

print("Dranchuck","-",round(Z,4))

miércoles, 23 de junio de 2021

Factor Z

 

La entrada pasada utilizamos el factor Z o factor de compresibilidad el cual nos indica que tanto se comprime un gas. Se basa en el teorema de los estados correspondientes y los primeros en crear una correlación gráfica fueron Standing y Katz, esta correlación utiliza la presión y la temperatura pseudorreducidas, además de las siguientes consideraciones:


1.    El gas debe de ser rico en metano (C1>90%)

2.    El gas no debe de contener hidrocarburos aromáticos

3.    El gas no debe de contener impurezas.

4.    No presenta buenos resultados a presiones y temperaturas cercanas a la crítica

5.    No se recomienda con presiones mayores a 10,000 psi

La correlación se muestra a continuación


La forma utilizar esta correlación es ingresar con los valores conocidos, supongamos que tenemos la presión y temperaturas pseudoreducidas (1.54,1.30), lo que se hace es ingresar con la presión psedoreducida hasta alcanzar la temperatura pseureducida y se manda una recta al eje del factor Z, teniendo como resultado 0.75 como se observa en la siguiente imagen.





Otra correlación es la de Sarem, A.M. la cual se basa en polinomios Legendre de grado 0 a 5. Esta considera un rango de 0.1<= Ppr <=14.9 y 1.05<=Tpr<=2.95.

 

x = (2*Ppr-15)/14.8

y = (2*Tpr-4)/1.9

P0X = np.array([[0.7071068],[1.224745*x],[0.7905695*(3*(x**2)-1)],[0.9354145*(5*(x**3)-3*x)],[0.265165*(35*(x**4)-30*(x**2)+3)],[0.293151*(63*(x**5)-70*(x**3)+15*x)]])

P0Y = np.array([[0.7071068],[1.224745*y],[0.7905695*(3*(y**2)-1)],[0.9354145*(5*(y**3)-3*y)],[0.265165*(35*(y**4)-30*(y**2)+3)],[0.293151*(63*(y**5)-70*(y**3)+15*y)]])

MM = np.array([[2.1434,0.0832,-0.0215,-0.0009,0.0043,-0.0017],[0.3313,-0.1340,0.0669,-0.0272,0.0089,-0.0022],[0.1057,-0.0504,0.0051,0.0106,-0.0073,0.0027],[0.0522,0.0443,-0.0193,0.0059,0.0015,-0.0028],[0.0197,-0.0264,0.0193,-0.0115,0.0043,-0.0081],[0.0053,0.0089,-0.0109,0.0096,-0.0060,0.0031]])

z = 0

for i in np.arange(0,6):

for j in np.arange(0,6):

z = z+MM[i][j]*P0X[i]*P0Y[j]

print(z)

 

Otra correlación es la de Papay, J. la cual tiene un rango de 0.1<= Ppr <=15 y 1.2<=Tpr<=3.0

z = 1- ((3.52*Ppr)/(10**(0.9813*Tpr)))+((0.274*(Ppr**2))/(10**0.8157*Tpr))

print(z)

 

La ultima correlación que se verá el día de hoy es la de Brill, J.P. y Beggs, H.D. la cual considera los siguientes rangos 0.0<= Ppr <=5.0 y 1.3<=Tpr<=3.0 y 0.0<= Ppr <=13 y 1.2<=Tpr<=2.4

 

F = 0.3106 - (0.49*(Tpr)) + (0.1824*(Tpr)**2)

E = 9*(Tpr-1)

D = 10**F

C = 0.132-0.32*np.log10(Tpr)

B = (0.62-(0.23*Tpr))*Ppr + ((0.066/(Tpr-0.86))-0.037)*(Ppr**2) + (0.32*(Ppr**6))/(10**E)

A = (1.39*(Tpr-0.92)*0.5)-(0.36*(Tpr))-0.10

z = A + ((1-A)/np.exp(B)) + (C*(Ppr**D))

print(z)

 

miércoles, 16 de junio de 2021

Comportamiento de Fluidos Petroleros 3

 

En esta ocasión traigo otro ejercicio, el cual considera que la mezcla de gases tiene un comportamiento real, esto es de gran importancia debido a que aparece algo llamado el factor de compresibilidad o mejor conocido como factor Z, este nos indica cómo se comporta el gas en cuestión y se define como la razón del volumen molar de un gas con relación al volumen molar de un gas ideal a la misma temperatura y presión.

En los ejercicios anteriores se trabajó con comportamientos ideales por lo que Z = 1, en esta ocasión es real por lo que Z es diferente a 1, otra cuestión es que de relevancia es al incrementar la presión ejercida en el gas el factor Z se incrementa y disminuye con la temperatura.

El enunciado dice: Se considera un comportamiento real de la mezcla de los gases, a una presión de 1000 psi abs con una temperatura de 100 °F. Calcular la densidad de la mezcla de los gases de la siguiente tabla.

Componente            Composición

Metano                      0.75

Etano                         0.05

Propano                    0.05

i-Butano                    0.05

n-Butano                  0.1

 

Comenzamos por introducir todas las variables proporcionadas y los datos necesarios

Presion = 1000 #psi abs

Temperatura = 100 # °F

Datos_Entrada = [0.75,0.05,0.05,0.05,0.10]                                                                 # Datos de la tabla

Datos_Peso = [16.0430,30.0700,44.0970,58.1230,58.1230]             # Datos de la masa molar

Datos_temperatura = [-116.6700,89.9920,206.0600,274.4600,305.6200]# Datos de la temperatura critica [°F]

Datos_presion = [666.4000,706.5000,616.0000,527.9000,550.6000]         # Datos de la presión critica [°psi abs]

Diccionario = {"Composicion":Datos_Entrada,"M":Datos_Peso,"Tc":Datos_temperatura,"Pc":Datos_presion}

df = pd.DataFrame(Diccionario)

# Las unidades de temperatura son °F hay que convertirlas a °R

df["Tc"] = df["Tc"]+460

# Se debe de corroborar que los datos estén normalizados

Normal = df["Composicion"].sum()

if Normal == 1:

            pass

else :

            df["Composicion"] = df["Composicion"]/Normal

#Obtenemos lo siguiente

df["Mi"] = df["Composicion"]*df["M"]

Ma = df["Mi"].sum()

#Obtenemos las condiciones pseudocriticas de la temperatura y presión

df["Tci"] = df["Composicion"]*df["Tc"]; df["Pci"] = df["Composicion"]*df["Pc"]

Tpc = df["Tci"].sum(); Ppc = df["Pci"].sum()

#Obtenemos las condiciones pseudoreducidas de la temperatura y la presión

Ppr = Presion/Ppc; Tpr = (Temperatura+460)/Tpc

# Se considera un comportamiento real por lo que tenemos que obtener el factor Z se utiliza la correlación de Brill y Beggs para obtener Z

def Z_Brill_Beggs(Tpr,Ppr):

            F = 0.3106 - (0.49*(Tpr)) + (0.1824*(Tpr)**2)

            E = 9*(Tpr-1)

            D = 10**F

            C = 0.132-0.32*np.log10(Tpr)

            B = (0.62-(0.23*Tpr))*Ppr + ((0.066/(Tpr-0.86))-0.037)*(Ppr**2) + (0.32*(Ppr**6))/(10**E)

            A = (1.39*(Tpr-0.92)*0.5)-(0.36*(Tpr))-0.10

            Z = A + ((1-A)/np.exp(B)) + (C*(Ppr**D))

            return Z

Z = Z_Brill_Beggs(1.27,1.54)

Pg = (Presion*Ma)/(Z*10.732*Temperatura+460)

 

print(Pg)  

miércoles, 9 de junio de 2021

Comportamiento de Fluidos Petroleros 2

 En la entrada pasada hablé del comportamiento de los fluidos petroleros, en la cual resolví un ejemplo que nos pedía obtener la composición en fracción mol, el peso molecular aparente, la densidad del gas, la densidad relativa y el volumen específico. En esta ocasión traigo otro ejemplo que nos pide obtener la densidad relativa, con la presión parcial, el enunciado dice lo siguiente:

¿Cuál es la densidad relativa de la mezcla de gases con presiones parciales que se presentan en la siguiente tabla?

Componente  Presión Parcial

Metano                   15.8

Etano                        2.2

Propano                    0.9

i-Butano                    0.5

n-Butano                  0.2

Para resolver este ejemplo primero tenemos que calcular la presión parcial, lo cual es la suma de todas las presiones parciales.

Donde p es la suma de la presión parcial y pi es la presión parcial.

La presión parcial es necesaria para obtener la fracción mol.

Donde yi es la fracción molar.

Una vez obtenida la fracción mol la multiplicamos por el peso molecular y lo sumamos para obtener de esta manera el peso molecular aparente.

Donde Ma es el peso molecular aparente, Mi el peso molecular.

Por último, dividimos el peso molecular aparente entre el peso del aire (28.96) y obtenemos la densidad relativa del gas con el que trabajamos

 

A continuación, se muestra el código de cómo se resuelve este ejemplo.

import pandas as pd

#¿Cuál es la densidad relativa de la mezcla de gas con presiones parciales que se presentan en la siguiente tabla?

#Componente          Presión Parcial

#Metano                               15.8   

#Etano                                  2.2

#Propano                  0.9

#i-Butano                  0.5

#n-Butano                0.2

Datos_Entrada =  [15.8,2.2,0.9,0.5,0.2]                                                  # Datos de la tabla

Datos_Peso = [16.0430,30.0700,44.0970,58.1230,58.1230]             # Datos de la masa molar

Diccionario = {"Presión Parcial":Datos_Entrada,"Mi":Datos_Peso}

df = pd.DataFrame(Diccionario)

# La presión parcial es la suma de cada una de las presiones por lo que tenemos

Presion_Parcial = df["Presión Parcial"].sum()

# Para obtener la fracción mol se calcula con la siguiente ecuación yi = pi/p

df["Yi"] = df["Presión Parcial"]/Presion_Parcial

df["Mi*Yi"] = df["Mi"]*df["Yi"]

Ma = df["Mi*Yi"].sum()

Densidad_relativa = Ma/28.96

print(df,Presion_Parcial,Densidad_relativa)

jueves, 3 de junio de 2021

Comportamiento de Fluidos Petroleros 1

 

En esta ocasión abordare un tema de gran importancia para nosotros los petroleros, el comportamiento de los fluidos petroleros y en específico la mezcla de gases, esto es de vital importancia ya que sabremos el tipo de tuberías, el tipo de lodos, equipos superficiales de almacenamiento y de proceso, que ocuparemos al momento de obtener el hidrocarburo. Para ello traigo un problema el cual ayudara a comprender mejor el tema.

Calcular la composición en fracción mol de la mezcla que se presenta en la siguiente tabla, considerando un comportamiento ideal. Además, calcular el peso molecular aparente, densidad del gas, densidad relativa y volumen específico.

 

Componente Composición

Metano           0.8100

Etano             0.1010

Propano         0.0510

n-Butano        0.0380

El problema pide

  •   la composición en fracción mol,
  •  peso molecular aparente,
  •  densidad del gas,
  •  densidad relativa y
  •  volumen específico.

 

a) para obtener la composición en fracción mol utilizamos


Donde mi es la composición de la mezcla, Mi es el peso del componente, ni es el número de moles del componente i.

Donde yi es la fracción mol del componente i y n es el total de moles en la mezcla.

 

b) para obtener el peso molecular aparente utilizamos


Donde Ma es el peso molecular aparente

c) para la densidad del gas utilizamos


Como estamos trabajando con un gas ideal M cambia por Ma y se utiliza p=14.696 psi T= 60 °F y R=10.732.

 

d) para la densidad relativa utilizamos


Donde yg es la densidad relativa del gas, pg es la densidad del gas, paire es la densidad del aire y Maire es la masa del aire

e) para el volumen específico se utiliza


Donde v es el volumen específico, V es el volumen, M es la masa, R es la constante universal de los gases, T es la temperatura, p es la presión. Como se considera un gas ideal se tiene que utilizar  p=14.696 psi T= 60 °F y R=10.732 

import pandas as pd

# Composición de la mezcla de Hidrocarburos

#Calcular la composición en fracción mol de la mezcla que se presenta en la siguiente tabla, considerando un comportamiento ideal

# Además calcular el peso molecular aparente, densidad del gas, densidad relativa y volumen especifico

"""Componente      

Metano                      0.8100

Etano             0.1010

Propano         0.0510

n-Butano        0.0380 """

Datos_Entrada =  [0.8100, 0.1010, 0.0510, 0.0380]                            # Datos de la tabla

Datos_Peso = [16.0430,30.0700,44.0970,58.1230]                                        # Datos de la masa molar

Diccionario = {"Composicion":Datos_Entrada,"Mi":Datos_Peso} # Hacemos un diccinoario, el cual tendra la llave y los datos que nesecitamos

df =  pd.DataFrame(Diccionario)                                                                                    # El diccionairo lo convertimos en una dataframe con la finalidad de facilitar la operación de los datos

if df["Composicion"].sum() == 1:                                                                         # Está condicional tiene como finalidad confirmar que la suma de todos los componentesde la mezcla sea 100% o en su defecto 1

                                                                                                                                                                                # Si la composición no cumple con la condición entonces se normaliza

            pass

else:

            df["Composicion"] = df["Composicion"]/df["Composicion"].sum()

df["ni"] = df["Composicion"]/df["Mi"]                                                                   # ni = wi/Mi  

df["yi"] = df["ni"]/df["ni"].sum()                                                                             # yi=ni/n | n es la suma de ni

# Masa aparente en este caso las unidades son lbm/lbm-mol

Ma = (df["yi"]*df["Mi"]).sum()

# Densidad del gas, considerando que es un gas ideal las unidades son lbm/ft3

Pg = (14.696*Ma)/(10.732*520)                                                                                      # Condiciones Ideales presión = p = 14.696 psi , temperatura = t = 60 °F + 460 = 520 °R

# Densidad relativa

Y = Ma/28.96                                                                                                                                             # La masa del aire es de 28.96, el resultado es adimensional

# Volumen especifico

u = (10.732*520)/(14.696*Ma)                                                                                         #El volumen especifico  tiene por unidades es ft3/lbm

print(df,"\n")

print("Masa aparente",round(Ma,4),"lbm/lbm-mol")

print("Densidad del gas",round(Pg,4),"lbm/ft3")

print("Densidad relativa",round(Y,4))

print("Volumen específico”, round(u,4),"ft3/lbm")