Este repositorio contiene un notebook de Jupyter que genera campos tridimensionales aleatorios de conductividad hidráulica para acuíferos heterogéneos. La conductividad hidráulica K controla qué tan fácilmente fluye el agua a través del subsuelo y varía espacialmente varios órdenes de magnitud en acuíferos naturales.
El notebook implementa el método espectral de incrustación circulante (Dietrich & Newsam, 1993), el algoritmo más eficiente para generar este tipo de campos en dominios 3D regulares. El método trabaja con el logaritmo natural de K (ln K), porque esta variable sigue una distribución aproximadamente normal (Gaussiana), lo que permite usar geoestadística clásica.
Los campos generados se usan como entrada para:
- Modelos de flujo subterráneo (MODFLOW, FEFLOW, OpenGeoSys)
- Simulaciones de transporte de contaminantes
- Análisis de incertidumbre y riesgo en acuíferos
- Optimización de redes de pozos de remediación
kfield-generator/
├── generacion_Kfield.ipynb ← Notebook principal (ejecutar este)
├── requirements.txt ← Dependencias Python
└── modules/
├── __init__.py
├── config_structs.py ← Estructuras de datos (Grid, Model)
└── generate_randomfield.py ← Generador espectral (algoritmo central)
Abre el Símbolo del sistema:
- Presiona la tecla
Windows, escribecmdy presionaEnter.
En la ventana negra que se abre, escribe lo siguiente y presiona Enter:
python --version
- Si ves algo como
Python 3.11.0→ Python ya está instalado. Pasa al Paso 3. - Si ves un error → sigue el Paso 2.
- Abre tu navegador y ve a: https://www.python.org/downloads/
- Haz clic en el botón amarillo "Download Python 3.x.x"
- Ejecuta el archivo
.exedescargado ⚠️ MUY IMPORTANTE: en la primera pantalla del instalador, marca la casilla "Add Python to PATH" antes de hacer clic en cualquier botón
┌────────────────────────────────────────────────────────┐
│ Install Python 3.x.x │
│ │
│ ☑ Add Python 3.x to PATH ← MARCAR ESTA CASILLA │
│ │
│ [ Install Now ] [ Customize installation ] │
└────────────────────────────────────────────────────────┘
- Haz clic en "Install Now"
- Espera a que termine y cierra el instalador
- Cierra y vuelve a abrir el Símbolo del sistema
- Verifica con
python --version— ahora debe mostrar la versión instalada
Opción A — Sin Git (recomendada para principiantes):
- Ve a: https://github.com/abelardo1685/kfield-generator
- Haz clic en el botón verde
< > Code - Selecciona "Download ZIP"
- Cuando termine la descarga, haz clic derecho en el archivo ZIP → "Extraer todo..."
- Elige una ubicación fácil de recordar, por ejemplo:
C:\Users\TuNombre\Documents\kfield-generator - Haz clic en "Extraer"
Opción B — Con Git (si ya lo tienes instalado):
En el Símbolo del sistema:
git clone https://github.com/abelardo1685/kfield-generator.git
- Abre el Explorador de archivos (tecla
Windows + E) - Navega hasta la carpeta donde extrajiste el proyecto (p.ej.
Documents\kfield-generator) - Haz clic en la barra de direcciones (donde dice la ruta, p.ej.
Este equipo > Documentos > kfield-generator) - Escribe
cmdy presionaEnter
Se abrirá el Símbolo del sistema ya posicionado en la carpeta correcta. El prompt debe mostrar algo como:
C:\Users\TuNombre\Documents\kfield-generator>
Un entorno virtual es una instalación de Python aislada, solo para este proyecto. Evita conflictos con otros programas que usen Python en tu computadora.
Escribe el siguiente comando y presiona Enter:
python -m venv venv
Espera 5–10 segundos. Se creará una carpeta llamada venv dentro del proyecto. No la borres.
Escribe:
venv\Scripts\activate
Sabrás que funcionó porque el prompt cambia y aparece (venv) al inicio:
(venv) C:\Users\TuNombre\Documents\kfield-generator>
⚠️ Importante: debes repetir este paso (venv\Scripts\activate) cada vez que abras una nueva ventana del Símbolo del sistema para trabajar con este proyecto.
Con el entorno activado (el prompt debe mostrar (venv)), escribe:
pip install -r requirements.txt
Este comando descarga e instala automáticamente todos los paquetes necesarios (NumPy, SciPy, Matplotlib, Jupyter). Puede tardar entre 2 y 10 minutos dependiendo de tu conexión a internet.
Verás mensajes de descarga en la pantalla — es completamente normal. Al finalizar correctamente verás una línea similar a:
Successfully installed jupyter-1.1.1 matplotlib-3.10.8 numpy-2.4.1 scipy-1.17.0 ...
Con el entorno activado, escribe:
jupyter lab
Ocurrirá lo siguiente:
- Verás varios mensajes en el Símbolo del sistema — déjalo abierto, no lo cierres
- Tu navegador web (Chrome, Edge, Firefox) se abrirá automáticamente con la interfaz de Jupyter Lab
Si el navegador no se abre automáticamente:
- Busca en el Símbolo del sistema una línea que diga algo como:
http://localhost:8888/lab?token=abc123... - Copia esa dirección completa y pégala en tu navegador
En el panel izquierdo de Jupyter Lab verás los archivos del proyecto. Haz doble clic en:
generacion_Kfield.ipynb
El notebook se abrirá en el panel central con todas las secciones documentadas.
Opción A — Ejecutar todo de una vez (recomendado la primera vez):
- En el menú superior, haz clic en "Run"
- Selecciona "Run All Cells"
- Espera mientras las celdas se ejecutan en orden (el símbolo
[*]indica que está corriendo; se convierte en un número cuando termina)
Opción B — Ejecutar celda por celda (para explorar):
- Haz clic sobre la primera celda de código
- Presiona
Shift + Enterpara ejecutarla y pasar a la siguiente - Repite para cada celda en orden de arriba hacia abajo
El tiempo total de ejecución es aproximadamente 15–30 segundos con los parámetros por defecto.
Al ejecutar el notebook completo aparecerán:
- Gráfica del variograma — covarianza y semivariograma teóricos en las direcciones x e y
- Mapa de una realización — cortes horizontales (tope, medio, base) y secciones verticales del acuífero
- Mosaico del ensemble — múltiples realizaciones comparadas con la misma escala de color
- Estadísticas — mapas de media y varianza + histograma de distribución de ln(K)
- Realizaciones guardadas — archivo
.npzen la carpetaKfields_output/
| Problema | Causa probable | Solución |
|---|---|---|
python no reconocido |
Python no está en PATH | Reinstala Python marcando "Add Python to PATH" |
venv\Scripts\activate da error |
PowerShell bloqueado | Usa cmd en lugar de PowerShell |
pip install falla |
Sin conexión a internet | Verifica tu conexión y vuelve a intentarlo |
| El navegador no abre | Puerto ocupado | Busca la URL con token en el Símbolo del sistema |
ModuleNotFoundError al ejecutar |
Entorno no activado | Cierra Jupyter, activa el entorno y ábrelo de nuevo |
Todos los parámetros están en la Sección 1 del notebook (Celda 4), bajo el encabezado:
# ╔══════════════════════════════════════════════════╗
# ║ PARÁMETROS DE ENTRADA — modifica aquí ║
# ╚══════════════════════════════════════════════════╝
Los más importantes son:
| Parámetro | Qué controla | Valor por defecto |
|---|---|---|
n_pts_y, n_pts_x, n_pts_z |
Número de nodos de la grilla 3D | 60 × 60 × 20 |
d_pts_y, d_pts_x, d_pts_z |
Tamaño de celda [m] | 5 × 5 × 2 m |
lnK_mean |
Media de ln(K) → conductividad promedio | -4.0 |
lnK_variance |
Varianza → grado de heterogeneidad | 1.0 |
lambda_y, lambda_x, lambda_z |
Longitudes de correlación [m] | 30, 60, 5 m |
kappa |
Suavidad del variograma (0.5 = exponencial) | 0.5 |
n_realizations |
Realizaciones a visualizar | 6 |
N_save |
Realizaciones a guardar en disco | 5 |
Después de modificar, vuelve a ejecutar todo: Run → Run All Cells.
El notebook crea la carpeta Kfields_output/ con archivos .npz (NumPy comprimido):
kfield-generator/
└── Kfields_output/
└── Kfield_3D_N5_20260516_140000.npz
Para cargar el archivo en otro script Python:
import numpy as np
data = np.load('Kfields_output/Kfield_3D_N5_20260516_140000.npz')
lnK_ens = data['lnK_ensemble'] # shape: (N, ny, nx, nz)
K_ens = data['K_ensemble'] # K en m/s
x_vec = data['x_vec'] # coordenadas x [m]
y_vec = data['y_vec'] # coordenadas y [m]
z_vec = data['z_vec'] # coordenadas z [m]
# Ejemplo: primera realización, capa superficial (z=0)
lnK_real1_superficie = lnK_ens[0, :, :, 0]- Dietrich, C.R. & Newsam, G.N. (1993). A fast and exact method for multidimensional Gaussian stochastic simulations. Water Resources Research, 29(8):2861–2869. https://doi.org/10.1029/93WR01070
- Dietrich, C.R. & Newsam, G.N. (1997). Fast and exact simulation of stationary Gaussian processes through circulant embedding of the covariance matrix. SIAM J. Sci. Comput., 18(4):1088–1107. https://doi.org/10.1137/S1064827592240555
- Nowak, W., Tenkleve, S. & Cirpka, O.A. (2003). Efficient computation of linearized cross-covariance and auto-covariance matrices of interdependent quantities. Mathematical Geology, 35(1):53–66. https://doi.org/10.1023/A:1022365112368
- Kitanidis, P.K. (1997). Introduction to Geostatistics: Applications in Hydrogeology. Cambridge University Press. ISBN: 978-0521587471
- Zinn, B. & Harvey, C.F. (2003). When good statistical models of aquifer heterogeneity go bad. Water Resources Research, 39(3):1051. https://doi.org/10.1029/2001WR001146
- Freeze, R.A. (1975). A stochastic-conceptual analysis of one-dimensional groundwater flow in nonuniform homogeneous media. Water Resources Research, 11(5):725–741. https://doi.org/10.1029/WR011i005p00725
This repository contains a Jupyter notebook that generates 3D random hydraulic conductivity fields for heterogeneous aquifers. Hydraulic conductivity K controls how easily water flows through the subsurface, and varies spatially by several orders of magnitude in natural aquifers.
The notebook implements the spectral circulant embedding method (Dietrich & Newsam, 1993), the most computationally efficient algorithm for generating such fields on regular 3D grids. The method works with the natural logarithm of K (ln K), because this variable follows an approximately Gaussian distribution, enabling the use of classical geostatistics.
- Groundwater flow models (MODFLOW, FEFLOW, OpenGeoSys)
- Contaminant transport simulations
- Aquifer uncertainty and risk analysis
- Remediation well network optimization
kfield-generator/
├── generacion_Kfield.ipynb ← Main notebook (run this)
├── requirements.txt ← Python dependencies
└── modules/
├── __init__.py
├── config_structs.py ← Data structures (Grid, Model)
└── generate_randomfield.py ← Spectral generator (core algorithm)
Open the Command Prompt (press Windows key, type cmd, press Enter):
python --version
- If you see
Python 3.x.x→ Python is installed. Skip to Step 3. - If you get an error → follow Step 2.
- Go to: https://www.python.org/downloads/
- Click the yellow "Download Python 3.x.x" button
- Run the downloaded
.exefile ⚠️ CRITICAL: on the first installer screen, check "Add Python to PATH" before clicking anything else- Click "Install Now" and wait
- Close and reopen Command Prompt, then verify with
python --version
Option A — Without Git (recommended for beginners):
- Go to: https://github.com/abelardo1685/kfield-generator
- Click the green
< > Codebutton → "Download ZIP" - Right-click the ZIP → "Extract All..." → choose a folder like
Documents\kfield-generator
Option B — With Git:
git clone https://github.com/abelardo1685/kfield-generator.git
- Open File Explorer and navigate to the project folder
- Click the address bar at the top, type
cmd, pressEnter
The prompt should show:
C:\Users\YourName\Documents\kfield-generator>
python -m venv venv
This creates an isolated Python installation for this project only. A venv folder will appear — do not delete it.
venv\Scripts\activate
The prompt will change to show (venv) at the start:
(venv) C:\Users\YourName\Documents\kfield-generator>
You must run this command every time you open a new Command Prompt window.
pip install -r requirements.txt
Downloads and installs NumPy, SciPy, Matplotlib, and Jupyter. Takes 2–10 minutes. When done you will see:
Successfully installed jupyter-... matplotlib-... numpy-... scipy-...
jupyter lab
Your browser will open automatically at http://localhost:8888/lab. If not, copy the URL with token shown in the Command Prompt and paste it into your browser.
In the left panel of Jupyter Lab, double-click:
generacion_Kfield.ipynb
Run all at once: menu Run → Run All Cells
Run cell by cell: click a cell → press Shift + Enter
Total execution time: ~15–30 seconds with default parameters.
- Theoretical variogram plots
- 3D ln(K) and K maps (horizontal slices + vertical cross-sections)
- Ensemble mosaic (multiple realizations)
- Ensemble mean, variance and histogram
- Saved
.npzfile inKfields_output/
| Problem | Likely cause | Solution |
|---|---|---|
python not recognized |
Not in PATH | Reinstall Python checking "Add to PATH" |
activate fails in PowerShell |
Execution policy | Use cmd instead of PowerShell |
pip install fails |
No internet | Check connection and retry |
| Browser does not open | Port busy | Copy the URL+token from the terminal |
ModuleNotFoundError |
Env not active | Re-activate: venv\Scripts\activate |
All parameters are in Section 1 of the notebook (Cell 4):
| Parameter | Controls | Default |
|---|---|---|
n_pts_y, n_pts_x, n_pts_z |
Grid size | 60 × 60 × 20 |
d_pts_y, d_pts_x, d_pts_z |
Cell size [m] | 5 × 5 × 2 m |
lnK_mean |
ln(K) mean → average conductivity | -4.0 |
lnK_variance |
Variance → heterogeneity degree | 1.0 |
lambda_y, lambda_x, lambda_z |
Correlation lengths [m] | 30, 60, 5 m |
kappa |
Variogram smoothness (0.5 = exponential) | 0.5 |
n_realizations |
Realizations to visualize | 6 |
N_save |
Realizations to save to disk | 5 |
import numpy as np
data = np.load('Kfields_output/Kfield_3D_N5_YYYYMMDD_HHMMSS.npz')
lnK_ens = data['lnK_ensemble'] # shape: (N, ny, nx, nz)
K_ens = data['K_ensemble'] # K in m/s
x_vec = data['x_vec']
y_vec = data['y_vec']
z_vec = data['z_vec']- Dietrich & Newsam (1993). Water Resour. Res., 29(8). https://doi.org/10.1029/93WR01070
- Dietrich & Newsam (1997). SIAM J. Sci. Comput., 18(4). https://doi.org/10.1137/S1064827592240555
- Nowak et al. (2003). Math. Geol., 35(1). https://doi.org/10.1023/A:1022365112368
- Kitanidis (1997). Introduction to Geostatistics. Cambridge University Press.
- Zinn & Harvey (2003). Water Resour. Res., 39(3). https://doi.org/10.1029/2001WR001146
- Freeze (1975). Water Resour. Res., 11(5). https://doi.org/10.1029/WR011i005p00725
Developed at UNAM — Posgrado en Ciencias de la Tierra
Author: Abelardo Rodriguez Pretelin — abelardo.rodriguez.pretelin@gmail.com