La representación y el análisis de los resultados de flujo y transporte es un desafío para los modeladores de aguas subterráneas. Aspectos como la velocidad, la compatibilidad, el formato de datos y las opciones de visualización son clave en la representación 2D / 3D de la carga hidráulica y la concentración en las celdas del modelo. En Jupyterlab se han desarrollado nuevas herramientas que pueden ser útiles para representar los resultados del modelo de una manera fácil de usar.
En esta ocasión hemos realizado un tutorial para la representación interactiva de una pluma contaminante en Jupyterlab; el modelo se realizó con Modflow Nwt y Mt3d, la representación se realizó con Matplolib, Ipywidgets y Voila.
Tienes dos formas de ejecutar este código:
De la imagen de Hakuchik para Docker: docker run -it -p 8888: 8888 hatarilabs / hakuchik: 74a2c9c18727
Usando Anaconda con todas las bibliotecas instaladas
Los archivos y datos del modelo pueden ser descargado con:
git clone https://github.com/SaulMontoya/interactiveModflowTransportVisualization.git
Animación
Tutorial
Código
Este es el código utilizado:
import flopy, os
import numpy as np
import ipywidgets as widgets
from IPython.display import display
import matplotlib.pyplot as plt
#get nam list
namList = [x[:-4] for x in os.listdir('../model') if x[-4:]=='.nam']
#get ucn list
ucnList = [x[:-4] for x in os.listdir('../model') if x[-4:]=='.ucn']
#nam dropdown widget
namDrop = widgets.Dropdown(
options=namList,
value=namList[0],
description='Nam file:',
disabled=False,
layout=widgets.Layout(width='20%')
)
#nam dropdown widget
ucnDrop = widgets.Dropdown(
options=ucnList,
value=ucnList[0],
description='Conc file:',
disabled=False,
layout=widgets.Layout(width='20%')
)
#times dropdown widget
timeBot = widgets.Button(
description='Show times:',
disabled=False,
button_style='success', # 'success', 'info', 'warning', 'danger' or ''
tooltip='Show available times',
)
#times dropdown widget
timeDrop = widgets.Dropdown(
options=[0],
value=0, #ucnList[0],
description='Times:',
disabled=False,
layout=widgets.Layout(width='20%')
)
#plot widget
plotBot = widgets.Button(
description='Plot conc.',
disabled=True,
button_style='success', # 'success', 'info', 'warning', 'danger' or ''
tooltip='Plot concentrations at specified layer',
)
#plot function
def showLayConc(namFile,ucnFile,timeDrop):
with out:
out.clear_output()
m = flopy.modflow.mf.Modflow.load('../model/'+namFile+'.nam',version='mfnwt')
fig, ax = plt.subplots(figsize=(12,8))
#modelmap = m.modelgrid.plot(ax=ax)
modelmap = flopy.plot.PlotMapView(m,ax=ax)
ucnFile = flopy.utils.binaryfile.UcnFile('../model/'+ucnFile+'.ucn')
concArray = ucnFile.get_data(totim=timeDrop)
concArray[concArray == -1.e+30] = np.nan
modelmap.plot_array(concArray)
plt.show()
def listTimes(ucnFile):
ucnFile = flopy.utils.binaryfile.UcnFile('../model/'+ucnFile+'.ucn')
return ucnFile.get_times()
#on click function
def plotButtonClicked(b):
showLayConc(namDrop.value,ucnDrop.value,timeDrop.value)
#plotBot.disabled = True
#on click function
def timesButtonClicked(b):
timeDrop.options = listTimes(ucnDrop.value)
plotBot.disabled = False
timeBot.disabled = True
timeBot.button_style = ''
plotBot.on_click(plotButtonClicked)
timeBot.on_click(timesButtonClicked)
display(widgets.HBox([namDrop, ucnDrop, timeBot, timeDrop, plotBot]))
out = widgets.Output()
display(out)