Ecuación de balance de materia: ejemplo 1, parte 1
Ejemplo de cálculo usando la ecuación de balance de materia con un modelo sin capa de gas ni acuífero. Método de Diagnóstico de Havlena-Odeh y Gráfico de Campbell
En el caso del gráfico de Campbell, el yacimiento es volumétrico, por lo que:
\[ W_e = 0 \]
El término independiente es el petróleo producido ( N_p ), mientras que el primer término es el petróleo original en sitio ( N ).
📌 Reorganización de la Ecuación de Havlena-Odeh
En los métodos de diagnóstico de Havlena-Odeh, la ecuación (1) se reorganiza de la siguiente forma:
\[
F - W_e = N E_t
\]
Por lo tanto, un gráfico de ( (F - W_e) ) contra ( E_t ) producirá una línea recta que pasa por el origen, cuya pendiente representa el petróleo original en sitio ( N ).
📌 Cálculo de ( F ) y ( E_t ) en Python
Ver código
import numpy as np# Si el archivo fue cargado correctamente# Extraer columnas relevantesNp = df["Np"] # Producción acumulada de petróleo (MMSTB)Bo = df["Bo"] # Factor de volumen de formación del petróleoBg = df["Bg"] # Factor de volumen de formación del gasRp = df["Rp"] # Razón gas-petróleo producidaRs = df["Rs"] # Razón gas disueltoPavg = df["Pavg"] # Razón gas disuelto#Parámetros inicialesSw =0.15cf =0.0000035cw =0.000007Boi = Bo.iloc[0] # Bo inicialRsi = Rs.iloc[0] # Rs inicialPi = Pavg.iloc[0] # Bg inicial# Cálculo de F y EtF = Np * (Bo + (Rp - Rs) * Bg)Et = Boi*(((Bo-Boi)+(Rsi-Rs)*Bg)/Boi+(Pi-Pavg)*(cw*Sw+cf)/(1-Sw))# Agregar los resultados al dataframedf["F"] = Fdf["Et"] = Etdf["F_Et"] = F/Et# Mostrar los resultados calculadosprint(df)
El gráfico de Campbell muestra una línea horizontal con una intersección en 250 MMSTB, lo que indica un volumen original de petróleo en sitio aproximado de 250 MMSTB OOIP.
Ver código
import matplotlib.pyplot as plt# Gráfico de Np vs F_ETplt.figure(figsize=(8,5))plt.scatter(df["Np"], df["F_Et"], color='blue', label="Datos")# Calcular la regresión lineal solo con datos limpiosdf_clean = df.dropna(subset=["F_Et"])coeficientes = np.polyfit(df_clean["Np"], df_clean["F_Et"], 1) # Ajuste lineal (grado 1)polinomio = np.poly1d(coeficientes) # Crear función polinómica# Evaluar la línea de ajuste en los valores de Np limpiosajuste_y = polinomio(df_clean["Np"])# Graficar la línea de ajusteplt.plot(df_clean["Np"], ajuste_y, 'r--', label=f"Ajuste lineal: y = {coeficientes[0]:.2f}x + {coeficientes[1]:.2f}")# Agregar línea horizontal en y=250 (similar a geom_hline)plt.axhline(y=250, color='black', linestyle='-', linewidth=1)# Agregar texto en (x=2, y=270) (similar a geom_text)plt.text(5, 270, "N = 250 MMSTB", fontsize=12, color="black")plt.xlabel("Np")plt.ylabel("F_Et")plt.ylim(-0, 400)
(0.0, 400.0)
Ver código
plt.title("Gráfico de Campbell ")plt.legend()plt.grid()plt.show()
📊 Gráfico de Havlena-Odeh
El gráfico de Havlena-Odeh muestra una línea recta con una pendiente de 255.67, lo que indica un volumen original de petróleo en sitio de aproximadamente 256 MMSTB OOIP.
Ver código
# Gráfico de Et vs Fplt.figure(figsize=(8,5))plt.scatter(df["Et"], df["F"], color='blue', label="Datos")# Calcular la regresión lineal coeficientes = np.polyfit(df["Et"], df["F"], 1) # Ajuste lineal (grado 1)polinomio = np.poly1d(coeficientes) # Crear función polinómica# Evaluar la línea de ajuste en los valores de Np limpiosajuste_y = polinomio(df["Et"])# Graficar la línea de ajusteplt.plot(df["Et"], ajuste_y, 'r--', label=f"Ajuste lineal: y = {coeficientes[0]:.2f}x + {coeficientes[1]:.2f}")plt.xlabel("Et")plt.ylabel("F")plt.ylim(-0, 70)
1️⃣ Si la relación F vs E_t es lineal, el yacimiento sigue un comportamiento volumétrico sin empuje de agua.
2️⃣ Si hay desviaciones, puede indicar presencia de empuje de agua o un comportamiento no volumétrico.
3️⃣ El valor de la pendiente de la recta es el volumen original de petróleo en sitio (( N )).
Este análisis es clave para estimar reservas y tomar decisiones de producción. 🚀