¡Hola, lector!
Esperamos que tu día esté lleno de descubrimientos, ya sea por la mañana, tarde o noche. Este viernes, como cada semana, te traemos un tema que no puede faltar en la caja de herramientas de quienes exploramos el subsuelo. Hoy tocara hablar del gráfico de Pickett y su influencia en el cálculo de Rw todo usando programación en Python. Acompáñanos mientras exploramos cómo estas técnicas nos ayudan a entender mejor las formaciones y maximizar el potencial de cada pozo.
El Gráfico de Pickett: Una Técnica Esencial para la Petrofísica
El gráfico de Pickett es una herramienta gráfica fundamental en la petrofísica que permite estimar parámetros clave como la saturación de agua ($S_w$)
¿Qué es el gráfico de Pickett?
Es un diagrama log-log (escala logarítmica en ambos ejes) en el que:
- El eje X representa la porosidad (ϕ)
- El eje Y representa la resistividad profunda (Rt).
Se utiliza principalmente para interpretar formaciones que siguen la ecuación de Archie, comúnmente en reservorios con poca arcilla.
¿Qué necesitas para construirlo?
- Datos necesarios:
- Rt: Resistividad profunda o verdadera del registro.
- ϕ: Porosidad efectiva (ya que necesitamos ver las arenas que contengan agua).
- Rw: Resistividad del agua de formación (debe estar calibrada previamente).
- Valores de m (cementación) n (saturación), que se obtienen de análisis previos o se asumen estándar (m=2, n=2).
- Ecuación básica
- La ecuación de Archie es el corazón del gráfico de Pickett:
La clave es reorganizar esta fórmula para graficarla.
Paso a paso: Cómo construirlo
1. Preparar el eje log-log
- Configura un gráfico log-log en cualquier software (Excel, MATLAB, Python, etc.).
2. Graficar líneas base
- Línea de Rt a 100% de saturación de agua ($S_w = 1$):
- Usa la ecuación Rt=fracRwϕm.
- Para diferentes valores de ϕ, calcula Rt y traza la curva.
3. Añadir líneas de saturación de agua ($S_w$)
- Cada línea corresponde a un valor fijo de $S_w$ (10 etc.). Estas se derivan ajustando $S_w$ en la ecuación de Archie:
Rt=fracRwϕmSwn
4. Identificar zonas en el gráfico
- Regiones con hidrocarburos: Alta $\phi$, alta Rt, bajo $S_w$.
- Regiones con agua: Baja Rt, alto $S_w$.
5. Superponer los datos del pozo
- Coloca los puntos de Rt y $\phiobtenidosdelregistro.IdentificasuposiciónrelativaalascurvasdeS_w$.
Explicación del código paso a paso
1. Estructura básica del documento HTML
El código comienza con la estructura estándar de un documento HTML:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Gráfico de Pickett Interactivo</title>
<!-- Incluir la librería de Plotly -->
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<style>
/* Estilos CSS */
</style>
</head>
<body>
<!-- Contenido de la página -->
</body>
</html>
- <!DOCTYPE html>: Indica que el documento está escrito en HTML5.
- <html lang="es">: Especifica que el idioma del documento es español.
- <head>: Contiene metadatos, el título de la página y enlaces a scripts y estilos.
- <body>: Contiene el contenido visible de la página.
2. Inclusión de la librería Plotly.js
Para crear gráficos interactivos, incluimos la librería Plotly.js:
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
Esta librería nos permite generar gráficos complejos y altamente interactivos utilizando JavaScript.
3. Estilos CSS
Definimos estilos básicos para mejorar la apariencia de nuestra aplicación:
body {
font-family: Arial, sans-serif;
margin: 20px;
}
/* Más estilos... */
- Estilos para el cuerpo: Establecemos la fuente y los márgenes.
- Estilos para los controles y el gráfico: Mejoramos la presentación de los elementos de entrada y el contenedor del gráfico.
4. Controles de entrada
En el <body>, creamos una sección para los controles de entrada que el usuario utilizará para interactuar con el gráfico:
<div id="controles">
<!-- Control para cargar el archivo CSV -->
<div class="input-group">
<label for="archivo">Cargar archivo CSV: </label>
<input type="file" id="archivo" accept=".csv">
</div>
<!-- Control para ajustar el valor de Rw -->
<div class="input-group">
<label for="rw">Valor de Rw: </label>
<input type="range" id="rw" name="rw" min="-3" max="1" step="0.01" value="-1">
<span id="rw-display" class="value-display">1.0e-1</span>
</div>
<!-- Controles para ajustar m y n -->
<!-- ... -->
</div>
- Carga de archivo CSV: Permite al usuario seleccionar el archivo de datos.
- Deslizadores para Rw, m y n: Permiten ajustar estos parámetros y ver los cambios en tiempo real en el gráfico.
5. Contenedor del gráfico
Creamos un <div> donde se renderizará el gráfico:
<div id="grafico"></div>
Este contenedor será utilizado por Plotly.js para mostrar el gráfico de Pickett.
6. Variables y elementos del DOM
En el script, inicializamos variables y seleccionamos elementos del DOM que utilizaremos:
let datos = [];
// Elementos de entrada y visualización
const rwInput = document.getElementById('rw');
const mInput = document.getElementById('m');
const nInput = document.getElementById('n');
const rwDisplayElement = document.getElementById('rw-display');
const mDisplayElement = document.getElementById('m-display');
const nDisplayElement = document.getElementById('n-display');
- datos: Arreglo donde almacenaremos los datos procesados del archivo CSV.
- Elementos de entrada: Referencias a los deslizadores de Rw, m y n.
- Elementos de visualización: Etiquetas donde mostraremos los valores actuales de Rw, m y n.
7. Manejadores de eventos
Agregamos eventos para responder a las acciones del usuario:
// Evento para cargar el archivo CSV
document.getElementById('archivo').addEventListener('change', function(e) {
// Código para leer y procesar el archivo
});
// Eventos para actualizar los valores de Rw, m y n
rwInput.addEventListener('input', function() {
// Actualizar valor de Rw y el gráfico
});
mInput.addEventListener('input', function() {
// Actualizar valor de m y el gráfico
});
nInput.addEventListener('input', function() {
// Actualizar valor de n y el gráfico
});
Estos eventos permiten que el gráfico se actualice dinámicamente cuando el usuario interactúa con los controles.
8. Función para procesar los datos del CSV
La función procesarDatos(csv)
se encarga de leer y procesar el archivo CSV cargado:
function procesarDatos(csv) {
const lineas = csv.split('\n');
const encabezados = lineas[0].trim().split(',');
// Identificar columnas de interés
// ...
if (indiceResistividad === -1 || indicePorosidadNeutron === -1) {
alert('No se encontraron las columnas de resistividad y/o porosidad neutrón en el archivo.');
return;
}
datos = [];
for (let i = 1; i < lineas.length; i++) {
// Leer y filtrar los datos
// ...
}
}
- Lectura del archivo: Divide el contenido en líneas y separa los encabezados.
- Identificación de columnas: Busca los mnemonics de resistividad y porosidad neutrón.
- Procesamiento de datos: Lee cada línea, convierte los valores a números y filtra los datos fuera de rango.
9. Función para actualizar el gráfico
La función actualizarGrafico()
genera y actualiza el gráfico utilizando Plotly.js:
function actualizarGrafico() {
if (datos.length === 0) {
return;
}
// Obtener valores actuales de Rw, m y n
// ...
// Preparar datos para el gráfico
// ...
// Generar la línea de tendencia
// ...
// Configurar el layout del gráfico
// ...
// Renderizar el gráfico
Plotly.newPlot('grafico', [traceDatos, traceLinea], layout);
}
- Verificación de datos: Comprueba que hay datos para graficar.
- Preparación de trazas: Crea las trazas para los datos y la línea de tendencia.
- Configuración del layout: Establece los límites y las etiquetas de los ejes.
- Renderización: Llama a Plotly.newPlot()
para mostrar el gráfico.
10. Generación de la línea de tendencia
Calculamos la línea de tendencia basada en los parámetros actuales:
// Definir límites fijos para phi y Rt
const phiInicio = 0.01;
const phiFin = 0.5;
const rtMin = 0.1;
const rtMax = 10000;
// Generar phi en escala logarítmica
const numPuntos = 100;
for (let i = 0; i <= numPuntos; i++) {
const phi = phiInicio * Math.pow(phiFin / phiInicio, i / numPuntos);
const rt = rw / Math.pow(phi, m);
if (rt >= rtMin && rt <= rtMax) {
xLinea.push(phi);
yLinea.push(rt);
}
}
- Cálculo de phi y Rt: Genera puntos para la línea de tendencia dentro de los límites especificados.
- Filtrado de Rt: Solo se incluyen los valores de Rt que están dentro del rango definido.
11. Configuración de los ejes del gráfico
Personalizamos los ejes para que se ajusten a los límites deseados:
const layout = {
xaxis: {
title: 'Porosidad Neutrón (φn)',
type: 'log',
autorange: false,
range: [Math.log10(phiInicio), Math.log10(phiFin)],
dtick: 0.1,
tickvals: [0.01, 0.02, 0.05, 0.1, 0.2, 0.5],
ticktext: ['0.01', '0.02', '0.05', '0.1', '0.2', '0.5']
},
yaxis: {
title: 'Resistividad (Rt)',
type: 'log',
autorange: false,
range: [Math.log10(rtMin), Math.log10(rtMax)],
dtick: 1
},
title: 'Gráfico de Pickett',
showlegend: true
};
- Eje X: Configurado en escala logarítmica, con límites de 0.01 a 0.5.
- Eje Y: Configurado en escala logarítmica, con límites de 0.1 a 10000.
- Marcas de los ejes: Personalizamos las marcas para mejorar la legibilidad.
12. Inicialización de valores de visualización
Al cargar la página, mostramos los valores iniciales de Rw, m y n:
rwDisplayElement.textContent = Math.pow(10, parseFloat(rwInput.value)).toExponential(2);
mDisplayElement.textContent = parseFloat(mInput.value).toFixed(2);
nDisplayElement.textContent = parseFloat(nInput.value).toFixed(2);
Esto asegura que los valores mostrados junto a los deslizadores reflejen el estado actual de los controles.
Conclusión
Este código permite crear un gráfico interactivo de Pickett donde puedes:
- Cargar tus propios datos en formato CSV.
- Ajustar parámetros clave como Rw, m y n utilizando deslizadores interactivos.
- Visualizar en tiempo real cómo estos cambios afectan al gráfico y a la línea de tendencia.
Con este enfoque, puedes analizar y estimar el valor de Rw de manera dinámica y personalizada según los datos de tu pozo.
Bibliografía
[1] Asquith, G., & Krygowski, D. (2004). Basic Well Log Analysis. AAPG Methods in Exploration Series.
[2] Ellis, D. V., & Singer, J. M. (2007). Well Logging for Earth Scientists. Springer Science & Business Media.
[3] Doveton, J. H. (1994). Geologic Log Interpretation. SEPM Society for Sedimentary Geology.
[4] Tiab, D., & Donaldson, E. C. (2015). Petrophysics: Theory and Practice of Measuring Reservoir Rock and Fluid Transport Properties. Gulf Professional Publishing.
[5] Rider, M., & Kennedy, M. (2011). The Geological Interpretation of Well Logs. Rider-French Consulting Ltd.
Publicación realizada por Hiram Arias y Emiliano Flores
Información de contacto:
LinkedIn: Hiram Arias y Emiliano Flores
Correo: hiram0809@gmail.com y jemilianofl@gmail.com
No hay comentarios.:
Publicar un comentario