Ver código
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
pozos = pd.read_csv("presiones_pozos.csv")
pozos| Pozo | KB_ft_MSL | TVD_KB_ft | p_psia | |
|---|---|---|---|---|
| 0 | Pozo 1 | 7134 | 5652 | 2453 |
| 1 | Pozo 2 | 7028 | 5426 | 2306 |
Comparar dos pozos después de eliminar el efecto de la elevación
3 de octubre de 2026
Dos pozos pueden registrar presiones diferentes simplemente porque las mediciones corresponden a distintas elevaciones. Antes de comparar sus presiones, debemos llevarlas a un mismo plano de referencia o datum, utilizando el gradiente del fluido.
Desarrollaremos el ejemplo 3.2 de Fundamental Principles of Reservoir Engineering, de Brian F. Towler: dos pozos con el mismo aceite y distintas elevaciones de KB. El procedimiento será cargar los datos, calcular la densidad del aceite, convertir la profundidad a una referencia común y corregir la presión.
La comparación es válida para presiones representativas del yacimiento, medidas bajo condiciones estáticas comparables y en fechas compatibles. No debemos mezclar directamente presiones fluyentes, de cabeza y de fondo.
Descargar el dataset de los dos pozos. Guarda el CSV junto al notebook. Utilizaremos pandas, NumPy y Matplotlib: pip install pandas numpy matplotlib.
| Pozo | KB_ft_MSL | TVD_KB_ft | p_psia | |
|---|---|---|---|---|
| 0 | Pozo 1 | 7134 | 5652 | 2453 |
| 1 | Pozo 2 | 7028 | 5426 | 2306 |
| Columna | Significado |
|---|---|
| KB_ft_MSL | Elevación del kelly bushing sobre el nivel medio del mar, en ft. |
| TVD_KB_ft | Distancia vertical desde KB hasta el punto de medición, positiva hacia abajo, en ft. |
| p_psia | Presión absoluta en el punto de medición, en psia. |
El libro proporciona profundidad desde KB; para la corrección hidrostática la interpretamos como profundidad vertical. Si nuestros datos son profundidad medida a lo largo del pozo (MD), primero debemos obtener la TVD usando la trayectoria. MD y TVD no son intercambiables en un pozo desviado.
Usaremos la elevación \(z\) respecto al nivel del mar, positiva hacia arriba:
\[z=\mathrm{KB}_{MSL}-\mathrm{TVD}_{KB}\]
| Pozo | z_ft_MSL | p_psia | |
|---|---|---|---|
| 0 | Pozo 1 | 1482 | 2453 |
| 1 | Pozo 2 | 1602 | 2306 |
Los puntos de medición quedan en 1482 y 1602 ft sobre el nivel del mar. El pozo 2 está 120 ft más alto, aunque las profundidades desde sus respectivos KB difieren 226 ft. Esa diferencia de 226 ft no es la separación vertical entre las mediciones.
Que ambos puntos estén sobre el nivel del mar no significa que estén cerca de la superficie: las elevaciones de KB son superiores a 7000 ft.
Los datos del fluido del ejemplo son:
| Propiedad | Valor |
|---|---|
| Gravedad API del aceite de tanque | 32 °API |
| Gravedad específica del gas, aire = 1 | 0.72 |
| Rs | 500 scf/STB |
| Bo | 1.30 bbl/STB |
| Temperatura de yacimiento | 200 °F |
La densidad del aceite vivo incluye la masa de aceite de tanque y la del gas disuelto. Siguiendo la formulación del capítulo 3:
\[\rho_{o,sc}=\frac{141.5}{131.5+API}\rho_{w,sc}\]
\[\rho_{g,sc}=\frac{\gamma_g M_{aire}p_{sc}}{R T_{sc}}\]
\[\rho_{o,R}=\frac{\rho_{o,sc}+\rho_{g,sc}R_s/5.61458}{B_o}\]
El factor 5.61458 ft³/bbl permite combinar las unidades de Rs con las densidades en lbm/ft³. La densidad del gas en esta ecuación se calcula a condiciones estándar, no a los 200 °F del yacimiento. El efecto de las condiciones de yacimiento ya está representado en los datos PVT de Bo y Rs suministrados.
API = 32
sg_gas = 0.72
Rs = 500
Bo = 1.30
rho_aceite_sc = 141.5 / (131.5 + API) * 62.366
rho_gas_sc = sg_gas * 28.97 * 14.73 / (10.73 * 519.6)
rho_aceite = (rho_aceite_sc + rho_gas_sc * Rs / 5.61458) / Bo
gradiente = rho_aceite / 144
print(f"Densidad del aceite: {rho_aceite:.2f} lbm/ft³")
print(f"Gradiente: {gradiente:.4f} psi/ft")Densidad del aceite: 45.29 lbm/ft³
Gradiente: 0.3145 psi/ft
Obtenemos aproximadamente 45.29 lbm/ft³ y 0.3145 psi/ft. La relación \(G=\rho/144\) corresponde a unidades de campo y gravedad estándar, incluyendo la conversión entre masa y fuerza. No debemos aplicar esa división a una densidad expresada en kg/m³.
Aquí tratamos el gradiente como constante en los 120 ft que separan las mediciones. Para columnas de gas o variaciones importantes de densidad, hay que integrar la relación hidrostática con las propiedades apropiadas.
Con elevación positiva hacia arriba, la ecuación es:
\[p_d=p_m+G(z_m-z_d)\]
Donde \(p_m\) es la presión medida, \(z_m\) su elevación y \(z_d\) la elevación del datum. Elegimos 1482 ft MSL, el nivel del punto de medición del pozo 1.
| Pozo | z_ft_MSL | delta_z_ft | p_psia | correccion_psi | p_datum_psia | |
|---|---|---|---|---|---|---|
| 0 | Pozo 1 | 1482 | 0 | 2453 | 0.00 | 2453.00 |
| 1 | Pozo 2 | 1602 | 120 | 2306 | 37.74 | 2343.74 |
El pozo 1 conserva 2453 psia. Para el pozo 2, sumamos aproximadamente 37.74 psi, por lo que su presión al datum es 2343.74 psia. La diferencia entre pozos pasa de 147 psi medidos a aproximadamente 109.26 psi al mismo nivel.
Si prefieres trabajar con profundidad respecto al nivel del mar, positiva hacia abajo, define \(d=-z\) y utiliza \(p_d=p_m+G(d_d-d_m)\). Ambas formas son equivalentes; lo importante es mantener una sola convención de signos.
La corrección reduce la diferencia, pero no la elimina. Comparar las presiones originales habría atribuido a los pozos una separación mayor de la que corresponde al llevarlos al mismo plano.
En este gráfico, cada segmento lleva una medición hasta el datum siguiendo el gradiente del aceite. La elevación aumenta hacia arriba, igual que nuestra convención matemática.
El pozo 1 aparece como un punto porque su corrección es cero. El segmento del pozo 2 se desplaza hacia una presión mayor al bajar desde 1602 hasta 1482 ft MSL.
Podemos repetir la corrección para un rango de gradientes. Usaremos 0.28 a 0.35 psi/ft como sensibilidad ilustrativa, no como un intervalo de incertidumbre medido ni como un rango universal para aceites.
gradientes = np.linspace(0.28, 0.35, 50)
p1, p2 = pozos.p_psia
z1, z2 = pozos.z_ft_MSL
diferencia = (p1 + gradientes*(z1-z_datum)) - (
p2 + gradientes*(z2-z_datum)
)
plt.plot(gradientes, diferencia)
plt.axvline(gradiente, color="gray", linestyle="--", label="Gradiente PVT")
plt.xlabel("Gradiente del aceite (psi/ft)")
plt.ylabel("Diferencia P1 − P2 al datum (psi)")
plt.legend()
plt.show()En ese intervalo la diferencia corregida varía entre 113.4 y 105 psi. Por tanto, estas variaciones del gradiente no eliminan la separación entre las presiones. Para anularla solo con una corrección común se requeriría \(147/120=1.225\) psi/ft, muy alejado del gradiente del aceite calculado.
Dos verificaciones sencillas son regresar del datum a la presión medida y repetir la comparación usando otro datum. Si ambos pozos comparten el mismo gradiente constante, la diferencia corregida no depende del datum elegido.
p_reconstruida = pozos.p_datum_psia - gradiente*pozos.delta_z_ft
assert np.allclose(p_reconstruida, pozos.p_psia)
p_otro_datum = pozos.p_psia + gradiente*(pozos.z_ft_MSL - 1500)
diferencia_actual = pozos.p_datum_psia.iloc[0] - pozos.p_datum_psia.iloc[1]
diferencia_otro = p_otro_datum.iloc[0] - p_otro_datum.iloc[1]
assert np.isclose(diferencia_actual, diferencia_otro)
print(f"Diferencia al datum: {diferencia_actual:.2f} psi")Diferencia al datum: 109.26 psi
Las presiones corregidas no coinciden bajo el modelo de un mismo aceite en equilibrio hidrostático. Esto merece investigar comunicación entre zonas, diferencias de agotamiento, fechas de medición, estabilización de las pruebas y calidad de las presiones.
La diferencia de presión por sí sola no demuestra una barrera ni permite asignar compartimentos de manera definitiva. Pozos comunicados también pueden presentar diferencias si existe flujo o si no han alcanzado equilibrio. La interpretación debe apoyarse en la incertidumbre de las mediciones, la historia operativa y evidencia geológica o de pruebas de presión.
Para aplicar el procedimiento a otros pozos debemos conservar una referencia vertical común, usar TVD hasta el punto donde corresponde la presión y elegir el gradiente del fluido correcto. Si la trayectoria vertical de corrección cruza un contacto entre fluidos, la contribución hidrostática se calcula por tramos.
Towler, B. F. (2002). Fundamental Principles of Reservoir Engineering. SPE Textbook Series, volumen 8. Capítulo 3, Reservoir Statics, secciones 3.2–3.5, páginas impresas 33–35; ecuaciones 3.1 y 3.4, tabla 3.1 y ejemplo 3.2. La sensibilidad al gradiente y las gráficas son extensiones didácticas del ejemplo.