Códigos MATLAB de Buckley–Leverett: Apéndices A–D del libro de Wu (2016)
Introducción
En este post (y en el video que lo acompaña) revisamos los códigos en MATLAB que aparecen en los apéndices A, B, C y D del libro:
Wu, Y.S. (2016). Multiphase Fluid Flow in Porous and Fractured Reservoirs. Elsevier / Gulf Professional Publishing.
Estos apéndices resuelven, con distintas variantes, la clásica ecuación de Buckley–Leverett de desplazamiento inmiscible en medios porosos, usando el método gráfico de Welge para encontrar la saturación de frente y el balance de fluidos desplazados.
{{< https://youtu.be/J2gG8doLKNo?si=hwXyY7SzBMVEmT_w >}}Todo el código fuente, junto con el PDF del apéndice teórico, está disponible en mi repositorio de GitHub:
🔗 Codigos - Multiphase fluid flow in porous and fractured reservoirs
Resumen de los cuatro apéndices
| Apéndice | Tema | Sistema / Física | Curvas kr |
|---|---|---|---|
| A | Método gráfico de Welge | Sistema lineal, desplazamiento agua–aceite | Brooks–Corey |
| B | Método gráfico de Welge | Sistema radial (pozo inyector), agua desplazando aceite | Brooks–Corey |
| C | Buckley–Leverett con fluido no-Newtoniano | Fluido Power-law desplazando a un fluido Newtoniano | Brooks–Corey |
| D | Buckley–Leverett con flujo no-Darciano | Ecuación de Forchheimer (flujo no-Darciano) | Brooks–Corey |

Apéndice A – Método gráfico de Welge (sistema lineal)
Resuelve la solución analítica de Buckley–Leverett en un sistema lineal 1D, calculando:
- Permeabilidades relativas de agua y aceite (
kr_w,kr_o) con exponentes tipo Corey. - La función de flujo fraccional
f_w(S)y su derivadadf_w(S), incluyendo el término gravitacional (theta,dlt_rho,g). - La saturación de frente de avance
Swfmediante la condición de tangencia de Welge. - El perfil de saturación de agua a distintos tiempos de inyección.
Parámetros clave: L, A, phi, k, muo, muw, Sor, Swc, no, nw, qt.
Apéndice B – Método gráfico de Welge (sistema radial)
Misma filosofía que el Apéndice A, pero adaptada a un sistema radial alrededor de un pozo inyector:
- Se define el radio del pozo
ry el radio del yacimientoR, además del espesorh. - La función de flujo fraccional aquí es más simple (
f_w = 1/(1+mob)) porque no incluye el término gravitacional explícito del caso lineal. - Se resuelve la posición del frente
bfen coordenadas radiales, útil para estimar el avance del banco de agua alrededor de un pozo inyector.
Apéndice C – Buckley–Leverett con fluido no-Newtoniano (Power-law)
Extiende el problema clásico a un caso donde el fluido desplazante es no-Newtoniano tipo ley de potencia (power-law):
- Se define una viscosidad efectiva
mu_ef(S)y una viscosidad aparentemu_nn(S, p_x)en función del índice de comportamientony el coeficienteH. - El gradiente de presión
pxse obtiene resolviendo, saturación por saturación, la ecuación no lineal de balance de velocidades (fzero) entre la fase Newtoniana y la no-Newtoniana. - Es un buen ejemplo de cómo MATLAB resuelve ecuaciones implícitas dentro de un lazo
for, algo muy común en simulación de yacimientos “casera”.
Apéndice D – Buckley–Leverett con flujo no-Darciano (Forchheimer)
Aquí el desplazamiento ya no sigue la ley de Darcy, sino la ecuación de Forchheimer, que agrega un término de velocidad al cuadrado para capturar efectos inerciales (flujo no-Darciano):
- Se definen coeficientes beta (
b_w,b_n) que dependen de la permeabilidad relativa y la porosidad efectiva de cada fase. - Las velocidades
v_wyv_nse obtienen resolviendo la forma cuadrática de Forchheimer. - Igual que en el Apéndice C, el gradiente de presión se resuelve por saturación con
fzero.
¿Por qué revisar estos códigos?
Aunque el libro de Wu (2016) está pensado como texto de posgrado, estos apéndices son un excelente punto de partida si quieres:
- Programar tus propias soluciones analíticas de Buckley–Leverett en Python o R (como hacemos normalmente en este blog).
- Entender cómo se implementa el método de Welge paso a paso, sin depender de un simulador comercial.
- Ver ejemplos reales de cómo MATLAB resuelve ecuaciones no lineales dentro de bucles, algo trasladable a Python (
scipy.optimize.brentq) o R (uniroot).
Descarga
Los cuatro scripts (Apendice A.m a Apendice D.m) están en el repositorio de GitHub enlazado arriba. Si te gustaría verlos migrados a Python/R con gráficos interactivos en Plotly/ggplot2, dímelo en los comentarios del video — puede ser el siguiente post de esta serie.