Un agente ajusta la función J
Un agente de terminal (Claude Code) maneja un simulador numérico abierto (OPM Flow) para encontrar la función J que reproduce la saturación de agua de los pozos del campo Volve perfilados antes de producir, con dos pozos posteriores como control: uno sin barrer y uno barrido.
Volve
Volve es un campo de petróleo del sector noruego del mar del Norte, cinco kilómetros al norte de Sleipner Øst, bajo 80 m de agua. Se descubrió en 1993 y produjo de 2008 a 2016 desde una plataforma autoelevable, con inyección de agua para sostener la presión. El reservorio es una arenisca del Jurásico Medio, la Formación Hugin, entre 2,700 y 3,100 m de profundidad.
En 2018 Equinor y sus socios liberaron el conjunto de datos del campo completo: unos 40,000 archivos, desde la sísmica hasta la producción diaria de cada pozo.
| Dato | Valor |
|---|---|
| Descubrimiento y plan de desarrollo | 1993 y 2005 |
| Producción | Del 12 de febrero de 2008 a septiembre de 2016 |
| Petróleo producido | 10.0 millones de Sm³ |
| Agua producida y agua inyectada | 15.3 y 30.3 millones de Sm³ |
| Pozos de desarrollo | 22, de los cuales 7 figuran en el archivo de producción |
Sm³ es metro cúbico en condiciones estándar. Las fechas y la descripción vienen de la ficha del campo de la Norwegian Offshore Directorate (Sodir); los volúmenes salen de sumar el archivo de producción del operador.
Dónde están los pozos
La estructura es un alto de unos 1.5 por 2.5 km, con el tope cerca de 2,800 m en la cresta. Los tres pozos 19 son de exploración, perforados entre 1993 y 1998; los F salen de la plataforma.
Cuatro pozos cruzan el Hugin con petróleo, cada uno a una profundidad distinta, y entre los cuatro cubren de 2,818 a 3,101 m. 15/9-19 BT2 lo cruza entero en agua, de 3,149 a 3,275 m. 15/9-F-5 baja por el flanco este hasta 3,144 m. 15/9-F-11 B corre cerca del tope, con un tramo horizontal, y entra y sale del Hugin por fallas.
Qué pozos muestran el estado inicial
El ajuste usa solo los pozos perfilados antes del primer petróleo, el 12 de febrero de 2008. Dos pozos posteriores quedan como control: el modelo nunca ve su perfil. No son equivalentes, y la diferencia está en cuánto había producido el campo cuando se perforaron.
| Pozo de control | Perfilado | Petróleo producido | Agua inyectada | Qué controla |
|---|---|---|---|---|
| 15/9-F-5 | Fines de julio de 2008 | 0.5 millones de Sm³, 5% del final | 0.5 millones de Sm³ | Estado inicial: el modelo tiene que predecirlo |
| 15/9-F-11 B | A mediados de 2013 | 7.75 millones de Sm³, 77% del final | 19 millones de Sm³ | Barrido: el modelo no puede poner más agua que la que tiene |
Cuando se perfiló F-5 el pozo todavía no inyectaba, y el único inyector hasta entonces, F-4, está a 830 m. Cuando se perforó F-11 B el campo tenía un corte de agua del 85%: su saturación de agua es igual o mayor que la inicial, así que sirve para detectar un modelo que pone agua de más, y no para confirmar uno bueno.
| Pozo | Perfilado | Hugin (m TVDSS) | Arena neta | Rol |
|---|---|---|---|---|
| 15/9-19 SR | 1993 | 2,861 a 2,880 | 23 m | Ajuste |
| 15/9-19 A | 1997 | 3,013 a 3,101 | 88 m | Ajuste |
| 15/9-19 BT2 | 1998 | 3,149 a 3,275 | 128 m | Ajuste, todo en agua |
| 15/9-F-12 | 2007 | 2,818 a 2,910 | 126 m | Ajuste |
| 15/9-F-4 | 7 y 11 de febrero de 2008 | 2,931 a 3,033 | 165 m | Ajuste |
| 15/9-F-5 | Fines de julio de 2008 | 3,000 a 3,144 | 215 m | Control inicial |
| 15/9-F-11 B | A mediados de 2013 | 2,829 a 3,171 | 431 m | Control barrido |
Lectura rápida de perfiles
Los pozos se perforaron con lodo base aceite, así que no hay potencial espontáneo: la arena se marca con rayos gamma y volumen de arcilla. BVW (bulk volume water) es porosidad por saturación, el agua por unidad de roca.
Con el Swirr del operador hay agua móvil en el 17% de la arena de 19 A, el 27% de F-12, el 37% de F-4 y el 99% de 19 BT2. El agua irreducible depende de la roca; la móvil, de la altura sobre el contacto, y eso es lo que describe una función J.
Un dato de procedencia cambió el ejercicio: la permeabilidad de F-12 en el archivo de 2007 es unas 40 veces menor que la que el operador revisó en 2009. El modelo usa la revisión donde existe.
PVT y presiones
| Dato | Valor | Fuente |
|---|---|---|
| Densidad del petróleo en reservorio | 720 kg/m³ | Ensayo de 19 A (1997) y laboratorio sobre el petróleo de F-4 (2008) |
| Densidad del agua de formación | 1,065 kg/m³ | Informe petrofísico del operador (2006) |
| Presión de burbuja | 213 a 236 bar | Laboratorio de F-4 y ensayo de 19 A |
| Presión inicial | 336.5 ± 0.5 bar | Ensayo de 19 A |
| Temperatura | 107 a 112 °C | Los dos |
El petróleo está subsaturado, unos 100 bar por encima de la burbuja, así que el modelo es de dos fases. La diferencia de densidades, 345 kg/m³, da 0.034 bar de presión capilar por metro sobre el nivel de agua libre.
| De dónde sale | Contacto |
|---|---|
| Perfiles | Petróleo hasta 3,101 m, agua desde 3,149 m |
| Informe del operador (2006), por modelado con función J | 3,120 ± 15 m |
| Cruce de las líneas de presión | 3,196 ± 14 m |
| Modelo de campo de Equinor (2016) | 12 regiones de equilibrio: 3,200 m la principal, otras en 3,025 y 2,910 m |
El punto de F-4 queda 6.7 bar por encima de la línea de petróleo de 19 A. O la presión del ensayo está referida a otra profundidad, o los dos pozos están en bloques distintos. El ajuste deja el nivel de agua libre (FWL, free water level) como parámetro, entre 3,100 y 3,220 m.
Qué trae el conjunto completo y qué usa la clase
| En el conjunto de Equinor | En la clase |
|---|---|
| Sísmica 3D y 4D | No se usa |
| Modelo estático y modelo dinámico de simulación | El deck de campo, solo para leer cómo inicializa |
| Perfiles de pozo, crudos e interpretados | El interpretado de 7 pozos y los crudos de 2 |
| Trayectorias y diseño de pozos | 4 trayectorias; los pozos de exploración se ubican con sus topes |
| Datos geológicos y estratigráficos, superficies y grillas | Los topes de formación y 3 horizontes |
| Producción diaria y mensual por pozo | La mensual, para el contexto |
| Presiones, ensayos e informes | El ensayo de presión de 19 BT2, el informe petrofísico y el de laboratorio |
El conjunto completo tiene unos 40,000 archivos y cerca de 5 TB. La clase usa 27 archivos, 53 MB, bajados de espejos públicos y fijados por su hash.
La función J
En equilibrio, la presión capilar crece con la altura sobre el nivel de agua libre. Leverett la normaliza por la calidad de roca, J = Pc · √(k/φ) / (σ · cosθ), y si la roca es de una misma familia J contra Sw es una sola curva.
El modelo es una fila de celdas, una por metro de pozo dentro del Hugin, cada una con su profundidad y su roca. Entre celdas no hay flujo: OPM Flow equilibra cada una con la función J y el contacto que le asigna el caso. Lo que se ajusta es lo mismo que después inicializa un modelo de campo.
El modelo de campo de Equinor resuelve esto de otra forma: 12 regiones de equilibrio y presión capilar cero, con el agua inicial cargada como un valor de agua connata por celda. Honra el volumen del geomodelo y no tiene zona de transición.
Dónde vive el ajuste en el deck
-- ===== AJUSTE_GRID.INC JFUNC WATER 2 1* 0.5 0.5 XY / -- tensión, exponentes de φ y de k -- ===== AJUSTE_PROPS.INC SWOF -- Sw krw kro J 0.064510 0.000000 1.000000 100000 ... 1.000000 1.000000 0.000000 0.298 / -- ===== AJUSTE_SOLUTION.INC EQUIL 3150.000 330 3150.000 0 1* 1* 1* 1* 0 / -- nivel de agua libre
El deck está partido para que el ajuste se vea. La grilla, la roca y los fluidos van en archivos que no cambian nunca; lo que decide un caso, en cinco archivos chicos. Pasar de un caso a otro es un diff que se lee.
Cómo se mide el ajuste
En cada celda de arena neta se resta la Sw del perfil a la que inicializa el simulador. El RMSE (root mean square error) es la raíz del promedio de esas diferencias al cuadrado, y queda en unidades de Sw. Cuanto más chico, mejor: cero sería calcar el perfil celda por celda, y 0.09 quiere decir que el modelo erra unos 9 puntos de saturación en una celda típica.
El cuadrado castiga los errores grandes: un tramo con agua donde hay petróleo pesa más que muchos desvíos chicos. El RMSE no llega a cero, porque el perfil cambia metro a metro por cosas que ninguna función de la roca explica.
Cada caso lleva tres números. El de ajuste usa los cinco pozos que el caso ve; el del control inicial, F-5, que no ve y está sin barrer; el del control barrido, F-11 B. Si el primero baja y el segundo sube, el modelo está aprendiendo los pozos y no la roca.
Tres casos y nada más
| Caso | RMSE de ajuste | F-4 | Control inicial | Control barrido | FWL | Parámetros |
|---|---|---|---|---|---|---|
| Base, sin ajustar | 0.142 | 0.201 | 0.295 | 0.205 | 3,120 m | 4 |
| J1: una función J y un contacto | 0.112 | 0.147 | 0.090 | 0.122 | 3,150 m | 4 |
| OP: el modelo del operador (2006), sin ajustar | 0.122 | 0.151 | 0.302 | 0.197 | 3,120 m | 0 |
| J2: la forma del operador, reajustada | 0.114 | 0.149 | 0.094 | 0.142 | 3,151 m | 5 |
Los casos J1 y J2 se ajustaron con un optimizador clásico, de 250 a 400 corridas cada uno. El control inicial es F-5 y el barrido F-11 B; ninguno entra al ajuste.
- El modelo del operador, escrito con dos pozos de Volve y los de un campo vecino, da 0.122 en pozos que no existían en 2006. Falla en los controles: su contacto en 3,120 m queda 24 m dentro de la columna de petróleo de F-5, y pone más agua inicial que la que F-11 B tiene después de cinco años de inyección.
- Una función J de cuatro parámetros predice a ciegas el pozo sin barrer con 0.090, mejor que el promedio de los pozos con que se ajustó.
- El quinto parámetro de J2 no compra nada: con cuatro se llega a 0.112 y los controles quedan mejor.
- Los dos ajustes llevan el contacto a 3,150 m, entre el petróleo de 19 A y el agua de 19 BT2. F-5 tiene petróleo hasta 3,144 m.
- F-4 es el pozo peor ajustado en todos los casos: el modelo no pone agua en su base. Tiene su sección más abajo.
El loop, con las hipótesis a la vista
En el último tramo el agente trabaja solo, hasta 12 experimentos o 20 minutos. Cada experimento es un commit cuyo mensaje lleva la hipótesis, el mecanismo físico y la predicción, escritos antes de correr. Si mejora y es simple, queda; si no, se deshace. La bitácora guarda también lo descartado.
En el ensayo del 5 de octubre de 2026 el agente hizo 12 experimentos en 9 minutos y conservó 3. Terminó con una función J de dos parámetros, Sw = J^−0.284 y el contacto en 3,150 m, con RMSE de ajuste 0.112, 0.103 en el control inicial y 0.121 en el barrido: casi lo mismo que el caso de cuatro parámetros ajustado con optimizador. Las nueve hipótesis descartadas no llegaron al umbral de 0.004 por parámetro o empeoraron el ajuste.
El ensayo se hizo cuando el único control era F-11 B; los números de F-5 se calcularon después, corriendo de nuevo el caso de cada commit. Muestran algo que el ajuste solo no ve: los experimentos con el contacto en 3,120 m dan cerca de 0.29 en el pozo sin barrer, y los que lo ponen en 3,150 m, cerca de 0.10. Con los cinco pozos de ajuste la diferencia entre los dos contactos es de 0.001.
Su informe señala que la base de F-4 concentra la mitad del error y deja planteado, como hipótesis, que F-4 y 19 A tienen contactos distintos.
Cada cuadro es un experimento: arriba la hipótesis, el mecanismo, la predicción y la lectura posterior; abajo los perfiles de los siete pozos y la nube de J con la curva del caso; a la derecha, el error de ajuste y el de los dos controles.
| N.º | Hipótesis | Predicción | Ajuste | Control inicial | Control barrido | Veredicto |
|---|---|---|---|---|---|---|
| 1 | base | 0.142 | 0.295 | 0.205 | Queda | |
| 2 | La curva J no tiene meseta de agua irreducible: Sw = a·J^-b (a = 0.68, b = 0.22), con el FWL del operador en 3,120 m | rmse_ajuste de 0.1424 a 0.113 con un parámetro menos (3); F-4 de 0.201 a 0.146, 19 SR de 0.082 a 0.046, 19 BT2 queda en 0.110 | 0.112 | 0.296 | 0.176 | Queda |
| 3 | El nivel de agua libre está en 3,150 m, donde empieza el agua de 19 BT2, y no en los 3,120 m del operador (a = 0.83, b = 0.25) | rmse_ajuste de 0.1125 a 0.1116, menos que el umbral de 0.002; 19 A de 0.082 a 0.075; si se cumple, los perfiles no distinguen un FWL entre 3,120 y 3,150 m | 0.112 | 0.093 | 0.120 | Se descarta |
| 4 | El agua irreducible depende de la roca, como en el modelo del operador: Swirr = 0.156 − 0.038·log10(k), y sobre ella Swn = 0.48·J^-0.215 | rmse_ajuste de 0.1125 a 0.1116 con dos parámetros más (5): no llega a 0.004 por parámetro; 19 A de 0.082 a 0.067. Si se cumple, la función J ya lleva la dependencia con k y el Swirr por celda sobra | 0.116 | 0.283 | 0.182 | Se descarta |
| 5 | La curva no necesita coeficiente: Sw = J^-b con b = 0.284, que llega a Sw = 1 en J = 1, y el FWL en 3,150 m, el tope del agua de 19 BT2 | rmse_ajuste de 0.1125 a 0.112 con un parámetro menos (2: b y FWL); 19 A de 0.082 a 0.087, F-4 de 0.145 a 0.143 | 0.112 | 0.103 | 0.121 | Queda |
| 6 | La saturación depende solo de la altura sobre el contacto: una curva de Pc en bar igual para toda la roca, sin JFUNC (Sw = (Pc/0.09)^-0.38) | rmse_ajuste de 0.1121 a 0.1235 con un parámetro más (3); F-4 de 0.142 a 0.167 y F-12 de 0.092 a 0.100. Si se cumple, el escalado de Leverett vale 0.011 de RMSE | 0.124 | 0.140 | 0.130 | Se descarta |
| 7 | Hay dos tipos de roca con curva J distinta: por debajo de 28 mD el exponente es 0.339 y por encima 0.275 (dos regiones SATNUM) | rmse_ajuste de 0.1121 a 0.110 con dos parámetros más (4): 0.001 por parámetro, no llega a 0.004; 19 A de 0.088 a 0.075 | 0.110 | 0.098 | 0.118 | Se descarta |
| 8 | El agua irreducible es agua ligada a la arcilla: Swirr = 0.20·VSH por celda (SWL), y sobre ella Swn = J^-0.316 | rmse_ajuste de 0.1121 a 0.1115 con un parámetro más (3): menos que 0.004; F-4 de 0.142 a 0.141 y F-12 empeora de 0.092 a 0.093. Si se cumple, el agua de la base de F-4 no es agua de arcilla | 0.113 | 0.086 | 0.128 | Se descarta |
| 9 | El nivel de agua libre es el del informe del operador, 3,120 m, con la misma curva Sw = J^-b (b = 0.30) | rmse_ajuste de 0.1121 a 0.115, peor por 0.003; 19 A de 0.088 a 0.113 y F-4 de 0.142 a 0.141. Si se cumple, con esta curva los perfiles prefieren el contacto profundo | 0.115 | 0.314 | 0.177 | Se descarta |
| 10 | La permeabilidad pesa menos que en Leverett: Pc = J·σ·φ^0.5/k^0.41 en JFUNC, con Sw = J^-0.309 | rmse_ajuste de 0.1121 a 0.1118 con un parámetro más (3): no llega a 0.002; F-12 de 0.092 a 0.090. Si se cumple, el 0.5 de Leverett alcanza y no hay que tocar JFUNC | 0.112 | 0.106 | 0.118 | Se descarta |
| 11 | La arena arcillosa (VSH mayor que 0.215) tiene su propia curva, con exponente 0.259 contra 0.303 de la arena limpia (dos regiones SATNUM) | rmse_ajuste de 0.1121 a 0.110 con dos parámetros más (4): 0.001 por parámetro, no llega a 0.004; F-4 de 0.142 a 0.134 y 19 A empeora de 0.088 a 0.093 | 0.110 | 0.108 | 0.129 | Se descarta |
| 12 | La curva tiene un umbral de entrada real y forma de hipérbola de Thomeer: Sw = 1 hasta J = 2.1 y después 1 − exp(−0.48/log10(J/2.1)) | rmse_ajuste de 0.1121 a 0.113, peor, con un parámetro más (3); 19 A de 0.088 a 0.075 y F-4 de 0.142 a 0.148. Si se cumple, la nube de J no muestra umbral de entrada y la ley de potencias queda | 0.113 | 0.092 | 0.125 | Se descarta |
El contacto de F-4: ¿inclinado, o agua colgada?
En F-4 hay agua móvil desde unos 3,015 m: Sw 0.34 a 3,020 m en roca de 3,000 mD, que a esa altura sobre el contacto regional debería estar en agua irreducible. En 19 A, a 960 m de distancia, hay petróleo con Sw 0.26 hasta 3,101 m. Con un solo contacto, F-4 es el pozo peor ajustado en todos los casos.
Hipótesis 1: un contacto inclinado
Con 90 m por kilómetro el RMSE de ajuste baja de 0.114 a 0.097. El control inicial pasa de 0.094 a 0.236 y el barrido de 0.142 a 0.193: el modelo pone agua donde F-5 tiene petróleo sin barrer y donde F-11 B todavía lo conserva. La respuesta de los controles es errática, porque depende de por dónde pasa el plano en cada pozo: con 120 m por kilómetro vuelven a 0.097 y 0.143. Sostener 90 m por kilómetro pediría unos 3 bar por kilómetro de gradiente en el acuífero.
Hipótesis 2: agua colgada en una cubeta
La otra lectura es que todo es una misma estructura y que un bajo local de la base del Hugin retuvo agua que el petróleo no pudo desplazar: un contacto local por encima del regional, como un lago en una montaña.
La base del Hugin inclina hacia una falla justo donde la cruza F-4. Si la falla sella, queda una cubeta de 0.07 km² con nivel de derrame en 3,016 m. Tomando como falla solo los escalones de más de 45 grados, el derrame queda en 3,024 m; con 56 grados la cubeta no cierra. En los otros cuatro pozos de ajuste no aparece ninguna con esos umbrales.
| Hipótesis | RMSE de ajuste | F-4 | Control inicial | Control barrido | Qué pide |
|---|---|---|---|---|---|
| Un contacto | 0.112 | 0.147 | 0.090 | 0.122 | Nada |
| Contacto inclinado 90 m por km | 0.097 | 0.108 | 0.236 | 0.193 | 3 bar por kilómetro en el acuífero |
| Agua colgada en F-4 | 0.090 | 0.090 | 0.075 | 0.131 | Una falla que selle y una base que no drene |
Con el agua colgada, el pozo sin barrer queda predicho con 0.075, mejor que con un solo contacto: la función J ya no tiene que estirarse para explicar el agua de la base de F-4.
El perfil pide el nivel local en 3,033 m, la base del Hugin en F-4. Queda entre 9 y 17 m por debajo del derrame de la cubeta y 8 m por debajo del contacto de 3,025 m que el modelo de campo de Equinor le pone a una región propia, rotulada "purged water". Son tres estimaciones independientes dentro de 17 m.
Un solo pozo no distingue una cubeta dentro de la misma estructura de un bloque separado con su propio contacto: en los dos casos F-4 tiene un nivel local. Lo decide la presión del petróleo, que en una cubeta es la misma que en el resto del campo.
La clase, bloque por bloque
| Bloque | Tiempo | Qué pasa |
|---|---|---|
| El campo y el dataset | 25 min | Mapa, superficies, secciones, producción y qué pozos sirven para ajustar |
| Lectura rápida de perfiles | 20 min | Arenas, porosidad, agua como BVW, agua irreducible y agua móvil |
| PVT y presiones | 15 min | Densidades, gradientes y los contactos que circulan |
| Instalación | 20 min | OPM Flow en un contenedor, el entorno de Python y Claude Code |
| Repaso de J y el deck | 25 min | Qué es la función J; el agente lee el deck y muestra dónde vive el ajuste |
| Ajuste de J | 40 min | Una J, el modelo del operador y su forma reajustada; el pozo de control |
| Loop con hipótesis a la vista | 30 min | El agente prueba variantes solo y escribe cada hipótesis antes de correr |
| El contacto de F-4 | 15 min | Contacto inclinado contra agua colgada en una cubeta de la base |
| Controles y cierre | 15 min | Qué revisa y firma el ingeniero |
Con dos pausas de 10 minutos. Todo corre en la máquina del docente; el repositorio queda para repetirlo.
Qué no se puede afirmar con esto
- Dónde está el contacto. Los datos lo dejan entre 3,100 y 3,220 m y el ajuste lo pone en 3,150 m; ningún pozo lo vio.
- Que el agua de la base de F-4 sea una cubeta y no otro bloque. La cubeta depende de qué escalones de la base se toman como falla sellante, y no hay presiones del mismo momento en F-4 y en 19 A.
- Que un pozo de control alcance. F-5 es uno solo y está en el flanco este; F-11 B, barrido, solo dice que el modelo no pone más agua que la que había en 2013.
- Que estos parámetros sirvan para un modelo de campo. Son 5 pozos, tres de exploración y dos de los 22 de desarrollo, sin facies ni geomodelo.
Para repetirlo
git clone https://github.com/mpodeley/clase-opm-agentes.git cd clase-opm-agentes instalacion/instalar.sh instalacion/verificar.sh uv run evaluar.py --fragmento
Hace falta Podman o Docker, uv, git y Claude Code. El detalle está en el README del repositorio.