Tutorial de modelamiento de transporte de contaminantes con MODFLOW, MT3D-USGS y Flopy

appliedContaminantTransportModeling.png

El desarrollo de hidrogeológicos puede llevar mucho tiempo debido a todos los pasos involucrados como la construcción del modelo, la calibración y la visualización de salida. Es importante utilizar herramientas que puedan optimizar estas tareas y permitir que el tiempo ahorrado se utilice en el análisis del sistema de flujo y el estado de la calidad del agua subterránea.

Flopy es un conjunto versátil de scripts de Python que se pueden usar para ejecutar MODFLOW y MT3D, entre otros programas de agua subterránea relacionados con MODFLOW de una manera simple y eficiente. Este tutorial desarrollará un caso completo aplicado de modelamiento de flujo y transporte con MODFLOW, MT3D-USDS y Flopy. El caso de estudio describe un flujo de agua subterránea regional que tiene una fuente puntual con un esquema de remediación simulado en condiciones de estado estacionario para condiciones de flujo y transitorio para el modelamiento de transporte.


Contenido

El tutorial tiene el siguiente contenido:

Modelo de flujo:

  • Configuración de un modelo MODFLOW con Flopy

  • Establecimiento de discretización espacial y temporal.

  • Definición de parámetros hidráulicos.

  • Modelo de ejecución y representación de resultados

Modelo de transporte:

  • Configuración de un modelo MT3D-USGS con Flopy

  • Implementación de advección, dispersión y fuentes de masa.

  • Ejecución de transporte y simulación de salida

Tutorial



Código

Este es el código en Flopy para la simulación de transporte de contaminantes:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import flopy
import flopy.modflow as mf
import flopy.mt3d as mt
import flopy.utils as fu
flopy is installed in E:\Software\Anaconda3\lib\site-packages\flopy
#MODFLOW 2005
modelname = 'flowModel'
modPath= '../Model/'
mfModel = mf.Modflow(modelname = modelname, model_ws=modPath, exe_name="../Exe/MODFLOW-NWT_64.exe")
#DIS file
Lx = 610
Ly = 310
nrow = 31
ncol = 61
nlay = 1
delr = Lx / ncol
delc = Ly / nrow
top = np.ones((nrow, ncol))*20
botm = np.ones((nrow, ncol))*-40
nper = 1
perlen = 2700
nstp = 5

dis = mf.ModflowDis(mfModel, nlay, nrow, ncol, delr = delr, delc = delc, 
                    top = top, botm = botm, laycbd = 0, itmuni=4, 
                    nper = nper, perlen = perlen, nstp = nstp, tsmult=1.4)
# Output Control: Create a flopy output control object
oc = mf.ModflowOc(mfModel,stress_period_data={(nper-1, nstp-1): ['save head']},)
#BCF file
laycon=1 #confined
tran=1600.0 #transmissivity
bcf = flopy.modflow.mfbcf.ModflowBcf(mfModel,laycon=laycon, tran=tran)
#BAS file
strt=15 #starting head
ibound=np.ones((nrow, ncol))
bas = mf.ModflowBas(mfModel, ibound = ibound, strt = strt)
#PCG file
pcg = flopy.modflow.mfpcg.ModflowPcg(mfModel, mxiter=20, iter1=30, hclose=1e-03, rclose=1e-03, relax=1.0)
#CHD
chd_data = []
for c in range(mfModel.dis.nrow):
    lChd = np.array([0, c, 0, 20, 20])
    rChd = np.array([0, c, mfModel.dis.ncol-1, 12, 15])
    chd_data.append(lChd)
    chd_data.append(rChd)
stress_period_data = 

stress_period_data[0][:5]
[array([ 0,  0,  0, 20, 20]),
 array([ 0,  0, 60, 12, 15]),
 array([ 0,  1,  0, 20, 20]),
 array([ 0,  1, 60, 12, 15]),
 array([ 0,  2,  0, 20, 20])]
chd = mf.mfchd.ModflowChd(mfModel, stress_period_data=stress_period_data)
#WELL
inyectingWell = 200 #m3/d
pumpingWell = -400
wel_sp1 = []
wel_sp1.append([0, 15, 15, inyectingWell])
wel_sp1.append([0, 5, 45, pumpingWell])
stress_period_data = {0: wel_sp1}

wel = flopy.modflow.ModflowWel(mfModel, stress_period_data=stress_period_data)
#LMT Linkage with MT3DMS for multi-species mass transport modeling
lmt = flopy.modflow.ModflowLmt(mfModel, output_file_name='mt3d_link.ftl')
#Write input files
mfModel.write_input()

# run the model
mfModel.run_model()
FloPy is using the following  executable to run the model: ../Exe/MODFLOW-NWT_64.exe

                                  MODFLOW-NWT-SWR1 
    U.S. GEOLOGICAL SURVEY MODULAR FINITE-DIFFERENCE GROUNDWATER-FLOW MODEL
                             WITH NEWTON FORMULATION
                             Version 1.1.4 4/01/2018                         
                    BASED ON MODFLOW-2005 Version 1.12.0 02/03/2017                       

                    SWR1 Version 1.04.0 09/15/2016                       

 Using NAME file: flowModel.nam 
 Run start date and time (yyyy/mm/dd hh:mm:ss): 2019/11/14 16:17:46

 Solving:  Stress period:     1    Time step:     1    Groundwater-Flow Eqn.
 Solving:  Stress period:     1    Time step:     2    Groundwater-Flow Eqn.
 Solving:  Stress period:     1    Time step:     3    Groundwater-Flow Eqn.
 Solving:  Stress period:     1    Time step:     4    Groundwater-Flow Eqn.
 Solving:  Stress period:     1    Time step:     5    Groundwater-Flow Eqn.
 Run end date and time (yyyy/mm/dd hh:mm:ss): 2019/11/14 16:17:46
 Elapsed run time:  0.048 Seconds

  Normal termination of simulation





(True, [])
#Plot model results
import matplotlib.pyplot as plt
import flopy.utils.binaryfile as bf

# Create the headfile object
headobj = bf.HeadFile(modPath + modelname+'.hds')
times = headobj.get_times()
print(times)
head = headobj.get_data(totim=times[-1])


# Setup contour parameters
levels = np.arange(10, 20, 1)
extent = (delr/2., Lx - delr/2., delc/2., Ly - delc/2.)

# Make the plots
fig = plt.figure(figsize=(18,8))
plt.subplot(1, 1, 1, aspect='equal')
plt.title('Head distribution (m)')
plt.imshow(head[0, :, :], extent=extent, cmap='YlGnBu', vmin=15., vmax=20.)
plt.colorbar()

contours = plt.contour(np.flipud(head[0, :, :]), levels=levels, extent=extent, zorder=10)
plt.clabel(contours, inline=1, fontsize=10, fmt='%d')# zorder=11)

plt.show()
[2699.9998]
output_12_1.png
#MT3D-USGS
namemt3d='transModel'
mt_model = mt.Mt3dms(modelname=namemt3d,  model_ws=modPath,version='mt3d-usgs', 
                     exe_name='../Exe/mt3d-usgs_1.1.0_64.exe', modflowmodel=mfModel)
#BTN file
btn = flopy.mt3d.Mt3dBtn(mt_model, sconc=0.0, prsity=0.3, thkmin=0.01, munit='g')#, icbund=icbund)
#ADV file
mixelm = -1 #Third-order TVD scheme (ULTIMATE)
percel = 1 #Courant number PERCEL is also a stability constraint
adv = flopy.mt3d.Mt3dAdv(mt_model, mixelm=mixelm, percel=percel)
#GCG file
mxiter = 1 #Maximum number of outer iterations
iter1 = 200 #Maximum number of inner iterations
isolve = 3 #Preconditioner = Modified Incomplete Cholesky
gcg = flopy.mt3d.Mt3dGcg(mt_model, mxiter=mxiter, iter1=iter1, isolve=isolve)
#DSP file
al = 10 #longitudinal dispersivity
dmcoef = 0 #effective molecular diffusion coefficient
trpt = 0.1 #ratio of the horizontal transverse dispersivity to the longitudinal dispersivity
trpv = 0.01 #ratio of the vertical transverse dispersivity to the longitudinal dispersivity

dsp = mt.Mt3dDsp(mt_model, al=al, dmcoef=dmcoef, trpt=trpt, trpv=trpv)
#SSM file
itype = flopy.mt3d.Mt3dSsm.itype_dict()
itype
{'CHD': 1,
 'BAS6': 1,
 'PBC': 1,
 'WEL': 2,
 'DRN': 3,
 'RIV': 4,
 'GHB': 5,
 'MAS': 15,
 'CC': -1}
#[K,I,J,CSS,iSSType] = layer, row, column, source concentration, type of sink/source: well-constant concentration cell 
ssm_data = {}
ssm_data[0] = [(0, 15, 15, 65.0, 2)]

ssm = flopy.mt3d.Mt3dSsm(mt_model, stress_period_data=ssm_data)
#Write model input
mt_model.write_input()

#Run the model
mt_model.run_model(silent=True)
(False, [])
#Plot concentration results
conc = fu.UcnFile(modPath+'MT3D001.UCN')
conc.get_times()
[2699.9998]
fig = plt.figure(figsize=(18,8))
conc.plot(totim=times[-1], colorbar='Concentration (mg/l)', cmap='Blues')
plt.title('Concentration distribution (mg/l)')
plt.show()
output_22_0.png

Datos de entrada

Descargue los datos de entrada de este enlace.

 

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 November 14, 2019 and filed under TutorialModflow.