miércoles, 28 de julio de 2021

Factor de Volumen del Gas y del Aceite

 

Factor de volumen del gas y factor de volumen del aceite

En esta entrada hablo acerca de los factores volúmenes del gas y del aceite, dichos volúmenes son muy importantes, ya que son uno de los muchos indicadores del yacimiento.

El factor de volumen del aceite bo

Una definición rápida seria; la relación del volumen de aceite a condiciones de yacimiento entre el volumen de aceite a condiciones de superficie, el aceite a condiciones de yacimiento considera el gas disuelto que hay en él.

El factor de volumen puede tener incrementos de debido a la expansión del gas disuelto, la expansión térmica del aceite y el gas disuelto y la  compresión del aceite y el gas disuelto

Bo = voaceite + vgdisuelto @ condiciones de yacimiento/ volumen de aceite a condiciones de superficie

El factor de volumen del gas bg

Es la relación del volumen de gas a condiciones de yacimiento entre el volumen de gas a condiciones de superficie, otra definición puede ser, el volumen que ocupa en el yacimiento un metro cubico de gas medido en la superficie a condiciones de superficiales

Bg = volumen del gas a condiciones de yacimiento/ volumen de gas a condiciones de superficie

En ambas hay que tener en cuenta:

Volumen > 1 se crea aceite/gas

Volumen = 1 no cambia el volumen

Volumen < se pierde aceite/gas

Ejemplo

En esta ocasión aplicaremos todo lo que se ha visto en las entradas pasadas.  En este ejemplo obtendremos la masa aparente, densidad, temperatura y presión pseudocrítica y por último el factor de compresibilidad. Primero obtendremos la temperatura y presión pseudocrítica para un componente pesado por medio de Steward, continuando obtenemos la corrección de impurezas por medio del método de Carr-Kobayashi-Burrows y Sutton. Para terminar, se calcula el factor z con los resultados anteriores, observando así la variación de cada uno de los métodos.

 

import pandas as pd

import math as math

import numpy as np

 

i = ["N2","CH4","C2H6","C3H8","C4H10","C4H10","C5H12","C5H12","C6H14"

,"C7+"]

Yi = [0.0138,0.9302,0.0329,0.0136,0.0023,0.0037,0.0012,0.0010,0.0008,0.0005]

Mi = [28.0134,16.0430,30.0700,44.0970,58.1230,58.1230,72.1500,72.1500,86.1770,142.2850]

Tci = [227.1600, 343.0000,549.5900,665.7300,734.1300,765.2900,828.7700, 845.4700, 913.2700, 1005.2522]

Pci = [493.1000,666.4000,706.5000,616.0000,527.9000,550.6000,490.4000

,488.6000,436.9000, 375.6633]

 

T = 650

P = 750

 

Diccionario = {"Componente":i,"Composición":Yi,"Mi":Mi,"Tci":Tci,"Pci":Pci}

df = pd.DataFrame(Diccionario)

 

if df["Composición"].sum() == 1:

            pass

else:

            df["Composición"] = df["Composición"]/df["Composición"].sum()

 

df["Mi*Yi"] = df["Composición"]*df["Mi"]

df["Tpci"] = df["Composición"]*df["Tci"]

df["Ppci"] = df["Composición"]*df["Pci"]

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

YgM = Ma/28.96

 

# Tpc y Ppc para componentes pesados

 

df["Yi(Tc/Pc)"] = df["Composición"]*(df["Tci"]/df["Pci"])

df["Yi(Tc/sqrt(Pc))"] = df["Composición"]*(df["Tci"]/df["Pci"]**0.5)

df["Yi*sqrt(Tc/Pc)"] = df["Composición"]*(df["Tci"]/df["Pci"])**0.5

 

# Obtención de Ppc y Tpc

 

A = df["Yi(Tc/Pc)"].sum()

 

C = df["Yi*sqrt(Tc/Pc)"].sum()

K = df["Yi(Tc/sqrt(Pc))"].sum()

J = (1/3)*A+(2/3)*(C**2)

Tpc = (K**2)/J

Ppc = Tpc/J

 

Y7C = df.iloc[9:11,0:11]; YC7 = df.iloc[9:11,1:2]; Tc = df.iloc[9:11,3:4]; Pc = df.iloc[9:11,4:5];CF = df.iloc[9:11,8:9]; CF1 = df.iloc[9:11,10:11]

YC7 = np.array(YC7); Tc = np.array(Tc); Pc = np.array(Pc); CF = np.array(CF);CF1 = np.array(CF1)

 

FJ = (1/3)*CF+(2/3)*(CF**2)

EJ = 0.6081*FJ+1.1325*(FJ**2)-14.004*(FJ*YC7)+664.434*(FJ*YC7**2)

EK = (Tc/(Pc**0.5))*(0.3129*(YC7)-4.8156*(YC7**2)+27.3751*(YC7**3))

 

J = J-EJ

K = K-EK

 

Tpc_S = (K**2)/J

Ppc_S = Tpc_S/J

Tpc_S = float(Tpc_S); Ppc_S = float(Ppc_S)

 

# CARR-KOBATASHI-BURROWS

 

YCO2 = 0; YH2S = 0 ; YN2 = df.iloc[0:1,1:2]; YN2 = np.array(YN2); YH2O = 0

Tpc_C = Tpc_S-80*YCO2+130*YH2S-250*YN2

Ppc_C = Ppc_S+440*YCO2+600*YH2S-170*YN2

Tpc_C = float(Tpc_C); Ppc_C = float(Ppc_C)

 

# SUTTON

 

YgHC = (YgM-1.1767*YH2S-1.5196*YCO2-0.9672*YN2-0.622*YH2O)/(1-YH2S-YCO2-YN2-YH2O)

PpcHC = 756.8-131*YgHC-3.6*YgHC**2

TpcHC = 169.2+349.5*YgHC-74*YgHC**2

PpcM = (1-YN2-YCO2-YH2S)*PpcHC+493*YN2+1071*YCO2+1306*YH2S+3200.1*YH2O

TpcM = (1-YN2-YCO2-YH2S)*TpcHC+227*YN2+548*YCO2+672*YH2S+1164.9*YH2O

TpcM = float(TpcM); PpcM = float(PpcM)

 

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

print("Densidad........................................",round(YgM,4),"lbm/lbm-mol")

print("Temperatura Pseudocrítica.......................",round(Tpc,4),"°R")

print("Presión Pseudocrítica...........................",round(Ppc,4),"psi")

print("\nCorrección por el componente pesado método de Stewart\n")

print("Temperatura Pseudocrítica.......................",round(Tpc_S,4),"°R")

print("Presión Pseudocrítica...........................",round(Ppc_S,4),"psi")

print("\nCorrección de impurezas método de Carr-Kobayashi-Burrows\n")

print("Temperatura Pseudocrítica.......................",round(Tpc_C,4),"°R")

print("Presión Pseudocrítica...........................",round(Ppc_C,4),"psi")

print("\nCorrección de impurezas método de Sutton\n")

print("Temperatura Pseudocrítica.......................",round(TpcM,4),"°R")

print("Presión Pseudocrítica...........................",round(PpcM,4),"psi\n")

 

def Brill(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/(10**E))*(Ppr**6)

            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

 

def Papay(Tpr,Ppr):

 

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

 

            return z

 

def Hall(Tpr,Ppr):

 

            t = Tpc/(T+460)# Tpc/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

 

            return z

 

def Sarem(Tpr,Ppr):

            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]

 

            return z

 

def Dranchuck(Tpr,Ppr):

 

            Z = 0.6000

 

            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

                       

                       

            return Z

 

def DranchuckPM(Tpr,Ppr):

 

            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

                       

            return Z

 

Ppr = P/Ppc; Tpr = T/Tpc

 

print("\nFactor Z Temperatura y Presión Pseudocrítica\n")

 

print("Factor Z Brill..................................",round(Brill(Tpr,Ppr),4))

print("Factor Z Papay..................................",round(Papay(Tpr,Ppr),4))

print("Factor Z Hall...................................",round(Hall(Tpr,Ppr),4))

print("Factor Z Sarem..................................",round(float(Sarem(Tpr,Ppr)),4))

print("Factor Z Dranchuck..............................",round(Dranchuck(Tpr,Ppr),4))

print("Factor Z Dranchuk, P.M. y Abou-Kassem...........",round(DranchuckPM(Tpr,Ppr),4))

 

Ppr = P/Ppc_S; Tpr = T/Tpc_S

 

print("\nCorrección por el componente pesado método de Stewart\n")

 

print("Factor Z Brill..................................",round(Brill(Tpr,Ppr),4))

print("Factor Z Papay..................................",round(Papay(Tpr,Ppr),4))

print("Factor Z Hall...................................",round(Hall(Tpr,Ppr),4))

print("Factor Z Sarem..................................",round(float(Sarem(Tpr,Ppr)),4))

print("Factor Z Dranchuck..............................",round(Dranchuck(Tpr,Ppr),4))

print("Factor Z Dranchuk, P.M. y Abou-Kassem...........",round(DranchuckPM(Tpr,Ppr),4))

 

Ppr = P/Ppc_C; Tpr = T/Tpc_C

 

 

print("\nCorrección de impurezas método de Carr-Kobayashi-Burrows\n")

 

print("Factor Z Brill..................................",round(Brill(Tpr,Ppr),4))

print("Factor Z Papay..................................",round(Papay(Tpr,Ppr),4))

print("Factor Z Hall...................................",round(Hall(Tpr,Ppr),4))

print("Factor Z Sarem..................................",round(float(Sarem(Tpr,Ppr)),4))

print("Factor Z Dranchuck..............................",round(Dranchuck(Tpr,Ppr),4))

print("Factor Z Dranchuk, P.M. y Abou-Kassem...........",round(DranchuckPM(Tpr,Ppr),4))

 

Ppr = P/PpcM; Tpr = T/TpcM

 

print("\nCorrección de impurezas método de Sutton\n")

 

print("Factor Z Brill..................................",round(Brill(Tpr,Ppr),4))

print("Factor Z Papay..................................",round(Papay(Tpr,Ppr),4))

print("Factor Z Hall...................................",round(Hall(Tpr,Ppr),4))

print("Factor Z Sarem..................................",round(float(Sarem(Tpr,Ppr)),4))

print("Factor Z Dranchuck..............................",round(Dranchuck(Tpr,Ppr),4))

print("Factor Z Dranchuk, P.M. y Abou-Kassem...........",round(DranchuckPM(Tpr,Ppr),4))

 

print("\n",df)

 

AL CORRER EL PROGRAMA OBTENDREMOS LO SIGUIENTE:

 

Masa aparente................................... 17.5464 lbm/lbm-mol

Densidad........................................ 0.6059 lbm/lbm-mol

Temperatura Pseudocrítica....................... 358.8334 °R

Presión Pseudocrítica........................... 667.9696 psi

 

Corrección por el componente pesado método de Stewart

 

Temperatura Pseudocrítica....................... 358.5969 °R

Presión Pseudocrítica........................... 667.864 psi

 

Corrección de impurezas método de Carr-Kobayashi-Burrows

 

Temperatura Pseudocrítica....................... 355.1469 °R

Presión Pseudocrítica........................... 665.518 psi

 

Corrección de impurezas método de Sutton

 

Temperatura Pseudocrítica....................... 350.7439 °R

Presión Pseudocrítica........................... 674.2558 psi

 

Factor Z Temperatura y Presión Pseudocrítica

 

Factor Z Brill.................................. 0.9521

Factor Z Papay.................................. 0.9455

Factor Z Hall................................... 1.0035

Factor Z Sarem.................................. 0.9062

Factor Z Dranchuck.............................. 0.9461

Factor Z Dranchuk, P.M. y Abou-Kassem........... 0.9466

 

Factor Z por corrección por el componente pesado método de Stewart

 

Factor Z Brill.................................. 0.9522

Factor Z Papay.................................. 0.9457

Factor Z Hall................................... 1.0035

Factor Z Sarem.................................. 0.9063

Factor Z Dranchuck.............................. 0.9462

Factor Z Dranchuk, P.M. y Abou-Kassem........... 0.9467

 

Factor Z por corrección de impurezas método de Carr-Kobayashi-Burrows

 

Factor Z Brill.................................. 0.9542

Factor Z Papay.................................. 0.9477

Factor Z Hall................................... 1.0035

Factor Z Sarem.................................. 0.9084

Factor Z Dranchuck.............................. 0.948

Factor Z Dranchuk, P.M. y Abou-Kassem........... 0.9485

 

Factor Z por corrección de impurezas método de Sutton

 

Factor Z Brill.................................. 0.9573

Factor Z Papay.................................. 0.951

Factor Z Hall................................... 1.0034

Factor Z Sarem.................................. 0.9102

Factor Z Dranchuck.............................. 0.951

Factor Z Dranchuk, P.M. y Abou-Kassem........... 0.9515


Corrección por Componente Pesado

Corrección de la temperatura y presión pseudocrítica

 En la entrada pasada hablamos acerca de cómo obtener la temperatura y presión crítica de una mezcla con componentes pesados, en esta ocasión obtendremos la corrección de la mezcla debido a las impurezas que se encuentran en la mezcla.

 Wichert-aiziz

La primera correlación que abordaremos es la de wichert-aiziz, la cual contempla las impurezas del ácido sulfhídrico y el dióxido de carbono 

Carr-Kobayashi-Burrows     

Esta correlación contempla el ácido sulfhídrico, dióxido de carbono y nitrógeno.

Sutton

Esta correlación contempla el siguiente rango de densidades 0.571 < Yghc < 1.679, también considera las impurezas como el nitrógeno, dióxido de carbono, ácido sulfhídrico y agua. Esto funciona para gas natural.


Gas natural 

Gas condensado


Gas natural (Sutton)