Visualización interactiva de un modelo de transporte MODFLOW MT3D con Flopy, Ipywidgets y Voila

contaminantVisualization.jpg

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:

  1. De la imagen de Hakuchik para Docker: docker run -it -p 8888: 8888 hatarilabs / hakuchik: 74a2c9c18727

  2. 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

contaminantVisualization.gif

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)

 

Suscríbete a nuestro boletín electrónico

Suscríbase a nuestro boletín gratuito para recibir noticias, datos interesantes y fechas de nuestros cursos en recursos hídricos.

 

Posted on February 1, 2021 and filed under TutorialModflow, TutorialPython.