flopy/examples/Notebooks/flopy3_mf6_tutorial.ipynb

1241 lines
84 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Flopy MODFLOW 6 (MF6) Support"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Flopy library contains classes for creating, saving, running, loading, and modifying MF6 simulations. The MF6 portion of the flopy library is located in:\n",
"\n",
"*flopy.mf6*\n",
"\n",
"While there are a number of classes in flopy.mf6, to get started you only need to use the main classes summarized below:\n",
"\n",
"flopy.mf6.MFSimulation \n",
"* MODFLOW Simulation Class. Entry point into any MODFLOW simulation.\n",
"\n",
"flopy.mf6.ModflowGwf\n",
"* MODFLOW Groundwater Flow Model Class. Represents a single model in a simulation.\n",
"\n",
"flopy.mf6.Modflow[pc]\n",
" * MODFLOW package classes where [pc] is the abbreviation of the package name. Each package is a separate class. \n",
"\n",
"For packages that are part of a groundwater flow model, the abbreviation begins with \"Gwf\". For example, \"flopy.mf6.ModflowGwfdis\" is the Discretization package.\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.8.6 | packaged by conda-forge | (default, Oct 7 2020, 18:42:56) \n",
"[Clang 10.0.1 ]\n",
"numpy version: 1.18.5\n",
"matplotlib version: 3.2.2\n",
"flopy version: 3.3.3\n"
]
}
],
"source": [
"import os\n",
"import sys\n",
"from shutil import copyfile\n",
"\n",
"import numpy as np\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"try:\n",
" import flopy\n",
"except:\n",
" fpth = os.path.abspath(os.path.join('..', '..'))\n",
" sys.path.append(fpth)\n",
" import flopy\n",
" \n",
"print(sys.version)\n",
"print('numpy version: {}'.format(np.__version__))\n",
"print('matplotlib version: {}'.format(mpl.__version__))\n",
"print('flopy version: {}'.format(flopy.__version__))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Creating a MF6 Simulation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A MF6 simulation is created by first creating a simulation object \"MFSimulation\". When you create the simulation object you can define the simulation's name, version, executable name, workspace path, and the name of the tdis file. All of these are optional parameters, and if not defined each one will default to the following:\n",
"\n",
"sim_name='modflowtest'\n",
"\n",
"version='mf6'\n",
"\n",
"exe_name='mf6.exe'\n",
"\n",
"sim_ws='.'\n",
"\n",
"sim_tdis_file='modflow6.tdis'"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import sys\n",
"from shutil import copyfile\n",
"try:\n",
" import flopy\n",
"except:\n",
" fpth = os.path.abspath(os.path.join('..', '..'))\n",
" sys.path.append(fpth)\n",
" import flopy\n",
"\n",
"sim_name = 'example_sim'\n",
"sim_path = os.path.join('data', 'example_project')\n",
"sim = flopy.mf6.MFSimulation(sim_name=sim_name, version='mf6', exe_name='mf6', \n",
" sim_ws=sim_path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next step is to create a tdis package object \"ModflowTdis\". The first parameter of the ModflowTdis class is a simulation object, which ties a ModflowTdis object to a specific simulation. The other parameters and their definitions can be found in the docstrings."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"tdis = flopy.mf6.ModflowTdis(sim, pname='tdis', time_units='DAYS', nper=2, \n",
" perioddata=[(1.0, 1, 1.0), (10.0, 5, 1.0)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next one or more models are created using the ModflowGwf class. The first parameter of the ModflowGwf class is the simulation object that the model will be a part of."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"model_name = 'example_model'\n",
"model = flopy.mf6.ModflowGwf(sim, modelname=model_name,\n",
" model_nam_file='{}.nam'.format(model_name))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next create one or more Iterative Model Solution (IMS) files."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"ims_package = flopy.mf6.ModflowIms(sim, pname='ims', print_option='ALL',\n",
" complexity='SIMPLE', outer_hclose=0.00001,\n",
" outer_maximum=50, under_relaxation='NONE',\n",
" inner_maximum=30, inner_hclose=0.00001,\n",
" linear_acceleration='CG',\n",
" preconditioner_levels=7,\n",
" preconditioner_drop_tolerance=0.01,\n",
" number_orthogonalizations=2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Each ModflowGwf object needs to be associated with an ModflowIms object. This is done by calling the MFSimulation object's \"register_ims_package\" method. The first parameter in this method is the ModflowIms object and the second parameter is a list of model names (strings) for the models to be associated with the ModflowIms object."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"sim.register_ims_package(ims_package, [model_name])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next add packages to each model. The first package added needs to be a spatial discretization package since flopy uses information from the spatial discretization package to help you build other packages. There are three spatial discretization packages to choose from:\n",
"\n",
"DIS (ModflowGwfDis) - Structured discretization\n",
"DISV (ModflowGwfdisv) - Discretization with vertices\n",
"DISU (ModflowGwfdisu) - Unstructured discretization"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"dis_package = flopy.mf6.ModflowGwfdis(model, pname='dis', length_units='FEET', nlay=2,\n",
" nrow=2, ncol=5, delr=500.0,\n",
" delc=500.0,\n",
" top=100.0, botm=[50.0, 20.0],\n",
" filename='{}.dis'.format(model_name))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Accessing Namefiles\n",
"\n",
"Namefiles are automatically built for you by flopy. However, there are some options contained in the namefiles that you may want to set. To get the namefile object access the name_file attribute in either a simulation or model object to get the simulation or model namefile."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# set the nocheck property in the simulation namefile\n",
"sim.name_file.nocheck = True\n",
"# set the print_input option in the model namefile\n",
"model.name_file.print_input = True"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Specifying Options\n",
"\n",
"Option that appear alone are assigned a boolean value, like the print_input option above. Options that have additional optional parameters are assigned using a tuple, with the entries containing the names of the optional parameters to turn on. Use a tuple with an empty string to indicate no optional parameters and use a tuple with None to turn the option off. "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# Turn Newton option on with under relaxation \n",
"model.name_file.newtonoptions = ('UNDER_RELAXATION')\n",
"# Turn Newton option on without under relaxation\n",
"model.name_file.newtonoptions = ('')\n",
"# Turn off Newton option \n",
"model.name_file.newtonoptions = (None)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## MFArray Templates\n",
"\n",
"Lastly define all other packages needed. \n",
"\n",
"Note that flopy supports a number of ways to specify data for a package. A template, which defines the data array shape for you, can be used to specify the data. Templates are built by calling the empty of the data type you are building. For example, to build a template for k in the npf package you would call:\n",
"\n",
"ModflowGwfnpf.k.empty()\n",
"\n",
"The empty method for \"MFArray\" data templates (data templates whose size is based on the structure of the model grid) take up to four parameters:\n",
"\n",
"* model - The model object that the data is a part of. A valid model object with a discretization package is required in order to build the proper array dimensions. This parameter is required.\n",
"\n",
"* layered - True or false whether the data is layered or not.\n",
"\n",
"* data_storage_type_list - List of data storage types, one for each model layer. If the template is not layered, only one data storage type needs to be specified. There are three data storage types supported, internal_array, internal_constant, and external_file. \n",
"\n",
"* default_value - The initial value for the array."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{'factor': 1.5, 'iprn': 1, 'data': [65.0, 60.0, 55.0, 50.0, 45.0, 40.0, 35.0, 30.0, 25.0, 20.0]}, 100.0]\n"
]
}
],
"source": [
"# build a data template for k that stores the first layer as an internal array and the second\n",
"# layer as a constant with the default value of k for all layers set to 100.0 \n",
"layer_storage_types = [flopy.mf6.data.mfdatastorage.DataStorageType.internal_array, \n",
" flopy.mf6.data.mfdatastorage.DataStorageType.internal_constant]\n",
"k_template = flopy.mf6.ModflowGwfnpf.k.empty(model, True, layer_storage_types, 100.0)\n",
"# change the value of the second layer to 50.0\n",
"k_template[0]['data'] = [65.0, 60.0, 55.0, 50.0, 45.0, 40.0, 35.0, 30.0, 25.0, 20.0]\n",
"k_template[0]['factor'] = 1.5\n",
"print(k_template)\n",
"# create npf package using the k template to define k\n",
"npf_package = flopy.mf6.ModflowGwfnpf(model, pname='npf', save_flows=True, icelltype=1, k=k_template)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Specifying MFArray Data\n",
"\n",
"MFArray data can also be specified as a numpy array, a list of values, or a single value. Below strt (starting heads) are defined as a single value, 100.0, which is interpreted as an internal constant storage type of value 100.0. Strt could also be defined as a list defining a value for every model cell:\n",
"\n",
"strt=[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, \n",
" 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0]\n",
" \n",
"Or as a list defining a value or values for each model layer:\n",
"\n",
"strt=[100.0, 90.0]\n",
"\n",
"or:\n",
"\n",
"strt=[[100.0], [90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0]]\n",
"\n",
"MFArray data can also be stored in an external file by using a dictionary using the keys 'filename' to specify the file name relative to the model folder and 'data' to specific the data. The optional 'factor', 'iprn', and 'binary' keys may also be used.\n",
"\n",
"strt={'filename': 'strt.txt', 'factor':1.0, 'data':[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, \n",
" 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0], 'binary': 'True'}\n",
" \n",
"If the 'data' key is omitted from the dictionary flopy will try to read the data from an existing file 'filename'. Any relative paths for loading data from a file should specified relative to the MF6 simulation folder."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"strt={'filename': 'strt.txt', 'factor':1.0, 'data':[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, \n",
" 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0, 90.0], 'binary': 'True'}\n",
"ic_package = flopy.mf6.ModflowGwfic(model, pname='ic', strt=strt,\n",
" filename='{}.ic'.format(model_name))\n",
"# move external file data into model folder\n",
"icv_data_path = os.path.join('..', 'data', 'mf6', 'notebooks', 'iconvert.txt')\n",
"copyfile(icv_data_path, os.path.join(sim_path, 'iconvert.txt'))\n",
"# create storage package\n",
"sto_package = flopy.mf6.ModflowGwfsto(model, pname='sto', save_flows=True, iconvert={'filename':'iconvert.txt'},\n",
" ss=[0.000001, 0.000002], \n",
" sy=[0.15, 0.14, 0.13, 0.12, 0.11, 0.11, 0.12, 0.13, 0.14, 0.15,\n",
" 0.15, 0.14, 0.13, 0.12, 0.11, 0.11, 0.12, 0.13, 0.14, 0.15])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## MFList Templates\n",
"\n",
"Flopy supports specifying record and recarray \"MFList\" data in a number of ways. Templates can be created that define the shape of the data. The empty method for \"MFList\" data templates take up to 7 parameters.\n",
"\n",
"* model - The model object that the data is a part of. A valid model object with a discretization package is required in order to build the proper array dimensions. This parameter is required.\n",
"\n",
"* maxbound - The number of rows in the recarray. If not specified one row is returned.\n",
"\n",
"* aux_vars - List of auxiliary variable names. If not specified auxiliary variables are not used.\n",
"\n",
"* boundnames - True/False if boundnames is to be used.\n",
"\n",
"* nseg - Number of segments (only relevant for a few data types)\n",
"\n",
"* timeseries - True/False indicates that time series data will be used.\n",
"\n",
"* stress_periods - List of integer stress periods to be used (transient MFList data only). If not specified for transient data, template will only be defined for stress period 1. \n",
"\n",
"MFList transient data templates are numpy recarrays stored in a dictionary with the dictionary key an integer zero based stress period value (stress period - 1).\n",
"\n",
"In the code below the well package is set up using a transient MFList template to help build the well's stress_periods. "
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"maxbound = 2\n",
"# build a stress_period_data template with 2 wells over stress periods 1 and 2 with boundnames \n",
"# and three aux variables\n",
"wel_periodrec = flopy.mf6.ModflowGwfwel.stress_period_data.empty(model, maxbound=maxbound, boundnames=True, \n",
" aux_vars=['var1', 'var2', 'var3'],\n",
" stress_periods=[0,1])\n",
"# define the two wells for stress period one\n",
"wel_periodrec[0][0] = ((0,1,2), -50.0, -1, -2, -3, 'First Well')\n",
"wel_periodrec[0][1] = ((1,1,4), -25.0, 2, 3, 4, 'Second Well')\n",
"# define the two wells for stress period two\n",
"wel_periodrec[1][0] = ((0,1,2), -200.0, -1, -2, -3, 'First Well')\n",
"wel_periodrec[1][1] = ((1,1,4), -4000.0, 2, 3, 4, 'Second Well')\n",
"# build the well package\n",
"wel_package = flopy.mf6.ModflowGwfwel(model, pname='wel', print_input=True, print_flows=True,\n",
" auxiliary=['var1', 'var2', 'var3'], maxbound=maxbound,\n",
" stress_period_data=wel_periodrec, boundnames=True, save_flows=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cell IDs\n",
"\n",
"Cell IDs always appear as tuples in an MFList. For a structured grid cell IDs appear as:\n",
"\n",
"(<layer>, <row>, <column>)\n",
"\n",
"For vertice based grid cells IDs appear as:\n",
"\n",
"(<layer>, <intralayer_cell_id>)\n",
"\n",
"Unstructured grid cell IDs appear as:\n",
"\n",
"(<cell_id>)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Specifying MFList Data\n",
"\n",
"MFList data can also be defined as a list of tuples, with each tuple being a row of the recarray. For transient data the list of tuples can be stored in a dictionary with the dictionary key an integer zero based stress period value. If only a list of tuples is specified for transient data, the data is assumed to apply to stress period 1. Additional stress periods can be added with the add_transient_key method. The code below defines saverecord and printrecord as a list of tuples."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# printrecord data as a list of tuples. since no stress\n",
"# period is specified it will default to stress period 1\n",
"printrec_tuple_list = [('HEAD', 'ALL'), ('BUDGET', 'ALL')]\n",
"# saverecord data as a dictionary of lists of tuples for \n",
"# stress periods 1 and 2. \n",
"saverec_dict = {0:[('HEAD', 'ALL'), ('BUDGET', 'ALL')],1:[('HEAD', 'ALL'), ('BUDGET', 'ALL')]}\n",
"# create oc package\n",
"oc_package = flopy.mf6.ModflowGwfoc(model, pname='oc', \n",
" budget_filerecord=[('{}.cbc'.format(model_name),)],\n",
" head_filerecord=[('{}.hds'.format(model_name),)],\n",
" saverecord=saverec_dict,\n",
" printrecord=printrec_tuple_list)\n",
"# add stress period two to the print record\n",
"oc_package.printrecord.add_transient_key(1)\n",
"# set the data for stress period two in the print record\n",
"oc_package.printrecord.set_data([('HEAD', 'ALL'), ('BUDGET', 'ALL')], 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Specifying MFList Data in an External File \n",
"\n",
"MFList data can be specified in an external file using a dictionary with the 'filename' key. If the 'data' key is also included in the dictionary and is not None, flopy will create the file with the data contained in the 'data' key. The 'binary' key can be used to save data to a binary file ('binary': True). The code below creates a chd package which creates and references an external file containing data for stress period 1 and stores the data internally in the chd package file for stress period 2. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"stress_period_data = {0: {'filename': 'chd_sp1.dat', 'data': [[(0, 0, 0), 70.]]},\n",
" 1: [[(0, 0, 0), 60.]]}\n",
"chd = flopy.mf6.ModflowGwfchd(model, maxbound=1, stress_period_data=stress_period_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Packages that Support both List-based and Array-based Data\n",
"\n",
"The recharge and evapotranspiration packages can be specified using list-based or array-based input. The array packages have an \"a\" on the end of their name:\n",
"\n",
"ModflowGwfrch - list based recharge package\n",
"ModflowGwfrcha - array based recharge package\n",
"ModflowGwfevt - list based evapotranspiration package\n",
"ModflowGwfevta - array based evapotranspiration package"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"rch_recarray = {0:[((0,0,0), 'rch_1'), ((1,1,1), 'rch_2')],\n",
" 1:[((0,0,0), 'rch_1'), ((1,1,1), 'rch_2')]}\n",
"rch_package = flopy.mf6.ModflowGwfrch(model, pname='rch', fixed_cell=True, print_input=True, \n",
" maxbound=2, stress_period_data=rch_recarray)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Utility Files (TS, TAS, OBS, TAB)\n",
"\n",
"Utility files, MF6 formatted files that reference by packages, include time series, time array series, observation, and tab files. The file names for utility files are specified using the package that references them. The utility files can be created in several ways. A simple case is demonstrated below. More detail is given in the flopy3_mf6_obs_ts_tas notebook. "
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"# build a time series array for the recharge package\n",
"ts_data = [(0.0, 0.015, 0.0017), (1.0, 0.016, 0.0019), (2.0, 0.012, 0.0015),\n",
" (3.0, 0.020, 0.0014), (4.0, 0.015, 0.0021), (5.0, 0.013, 0.0012),\n",
" (6.0, 0.022, 0.0012), (7.0, 0.016, 0.0014), (8.0, 0.013, 0.0011),\n",
" (9.0, 0.021, 0.0011), (10.0, 0.017, 0.0016), (11.0, 0.012, 0.0015)]\n",
"rch_package.ts.initialize(time_series_namerecord=['rch_1', 'rch_2'], \n",
" timeseries=ts_data, filename='recharge_rates.ts',\n",
" interpolation_methodrecord=['stepwise', 'stepwise'])\n",
"\n",
"# build an recharge observation package that outputs the western recharge to a binary file and the eastern\n",
"# recharge to a text file\n",
"obs_data = {('rch_west.csv', 'binary'): [('rch_1_1_1', 'RCH', (0, 0, 0)),\n",
" ('rch_1_2_1', 'RCH', (0, 1, 0))],\n",
" 'rch_east.csv': [('rch_1_1_5', 'RCH', (0, 0, 4)),\n",
" ('rch_1_2_5', 'RCH', (0, 1, 4))]}\n",
"rch_package.obs.initialize(filename='example_model.rch.obs', digits=10, \n",
" print_input=True, continuous=obs_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Saving and Running a MF6 Simulation"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Saving and running a simulation are done with the MFSimulation class's write_simulation and run_simulation methods."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"writing simulation...\n",
" writing simulation name file...\n",
" writing simulation tdis package...\n",
" writing ims package ims...\n",
" writing model example_model...\n",
" writing model name file...\n",
" writing package dis...\n",
" writing package npf...\n",
" writing package ic...\n",
" writing package sto...\n",
" writing package wel...\n",
" writing package oc...\n",
" writing package chd_0...\n",
" writing package rch...\n",
" writing package ts_0...\n",
" writing package obs_0...\n",
"FloPy is using the following executable to run the model: /Users/jdhughes/.local/bin/mf6\n",
" MODFLOW 6\n",
" U.S. GEOLOGICAL SURVEY MODULAR HYDROLOGIC MODEL\n",
" VERSION 6.2.0 10/22/2020\n",
"\n",
" MODFLOW 6 compiled Oct 29 2020 12:19:52 with IFORT compiler (ver. 19.10.3)\n",
"\n",
"This software has been approved for release by the U.S. Geological \n",
"Survey (USGS). Although the software has been subjected to rigorous \n",
"review, the USGS reserves the right to update the software as needed \n",
"pursuant to further analysis and review. No warranty, expressed or \n",
"implied, is made by the USGS or the U.S. Government as to the \n",
"functionality of the software and related material nor shall the \n",
"fact of release constitute any such warranty. Furthermore, the \n",
"software is released on condition that neither the USGS nor the U.S. \n",
"Government shall be held liable for any damages resulting from its \n",
"authorized or unauthorized use. Also refer to the USGS Water \n",
"Resources Software User Rights Notice for complete use, copyright, \n",
"and distribution information.\n",
"\n",
" \n",
" Run start date and time (yyyy/mm/dd hh:mm:ss): 2021/02/18 11:33:02\n",
" \n",
" Writing simulation list file: mfsim.lst\n",
" Using Simulation name file: mfsim.nam\n",
" \n",
" Solving: Stress period: 1 Time step: 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Solving: Stress period: 2 Time step: 1\n",
" Solving: Stress period: 2 Time step: 2\n",
" Solving: Stress period: 2 Time step: 3\n",
" Solving: Stress period: 2 Time step: 4\n",
" Solving: Stress period: 2 Time step: 5\n",
" \n",
" Run end date and time (yyyy/mm/dd hh:mm:ss): 2021/02/18 11:33:02\n",
" Elapsed run time: 0.068 Seconds\n",
" \n",
"\n",
"WARNING REPORT:\n",
"\n",
" 1. NONLINEAR BLOCK VARIABLE 'OUTER_HCLOSE' IN FILE 'example_sim.ims' WAS\n",
" DEPRECATED IN VERSION 6.1.1. SETTING OUTER_DVCLOSE TO OUTER_HCLOSE VALUE.\n",
" 2. LINEAR BLOCK VARIABLE 'INNER_HCLOSE' IN FILE 'example_sim.ims' WAS\n",
" DEPRECATED IN VERSION 6.1.1. SETTING INNER_DVCLOSE TO INNER_HCLOSE VALUE.\n",
" Normal termination of simulation.\n"
]
},
{
"data": {
"text/plain": [
"(True, [])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# write simulation to new location\n",
"sim.write_simulation()\n",
"\n",
"# run simulation\n",
"sim.run_simulation()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exporting a MF6 Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exporting a MF6 model to a shapefile or netcdf is the same as exporting a MF2005 model."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"initialize_geometry::proj4_str = epsg:4326\n",
"initialize_geometry::self.grid_crs = epsg:4326\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"initialize_geometry::nc_crs = epsg:4326\n",
"transforming coordinates using = proj=noop ellps=GRS80\n",
"wrote data/netCDF_export/botm.shp\n"
]
}
],
"source": [
"# make directory\n",
"pth = os.path.join('data', 'netCDF_export')\n",
"if not os.path.exists(pth):\n",
" os.makedirs(pth)\n",
" \n",
"# export the dis package to a netcdf file\n",
"model.dis.export(os.path.join(pth, 'dis.nc'))\n",
"\n",
"# export the botm array to a shapefile\n",
"model.dis.botm.export(os.path.join(pth, 'botm.shp'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Loading an Existing MF6 Simulation"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Loading a simulation can be done with the flopy.mf6.MFSimulation.load static method."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loading simulation...\n",
" loading simulation name file...\n",
" loading tdis package...\n",
" loading model gwf6...\n",
" loading package dis...\n",
" loading package npf...\n",
" loading package ic...\n",
" loading package sto...\n",
" loading package wel...\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" loading package oc...\n",
" loading package chd...\n",
" loading package rch...\n",
" loading ims package example_model...\n"
]
}
],
"source": [
"# load the simulation\n",
"loaded_sim = flopy.mf6.MFSimulation.load(sim_name, 'mf6', 'mf6', sim_path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Retrieving Data and Modifying an Existing MF6 Simulation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Data can be easily retrieved from a simulation. Data can be retrieved using two methods. One method is to retrieve the data object from a master simulation dictionary that keeps track of all the data. The master simulation dictionary is accessed by accessing a simulation's \"simulation_data\" property and then the \"mfdata\" property:\n",
"\n",
"sim.simulation_data.mfdata[<data path>]\n",
"\n",
"The data path is the path to the data stored as a tuple containing the model name, package name, block name, and data name.\n",
"\n",
"The second method is to get the data from the package object. If you do not already have the package object, you can work your way down the simulation structure, from the simulation to the correct model, to the correct package, and finally to the data object.\n",
"\n",
"These methods are demonstrated in the code below. "
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"# get hydraulic conductivity data object from the data dictionary\n",
"hk = sim.simulation_data.mfdata[(model_name, 'npf', 'griddata', 'k')]\n",
"\n",
"# get specific yield data object from the storage package\n",
"sy = sto_package.sy\n",
"\n",
"# get the model object from the simulation object using the get_model method, \n",
"# which takes a string with the model's name and returns the model object\n",
"mdl = sim.get_model(model_name)\n",
"# get the package object from the model mobject using the get_package method,\n",
"# which takes a string with the package's name or type\n",
"ic = mdl.get_package('ic')\n",
"# get the data object from the initial condition package object\n",
"strt = ic.strt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once you have the appropriate data object there are a number methods to retrieve data from that object. Data retrieved can either be the data as it appears in the model file or the data with any factor specified in the model file applied to it. To get the raw data without applying a factor use the get_data method. To get the data with the factor already applied use .array.\n",
"\n",
"Note that MFArray data is always a copy of the data stored by flopy. Modifying the copy of the flopy data will have no affect on the data stored in flopy. Non-constant internal MFList data is returned as a reference to a numpy recarray. Modifying this recarray will modify the data stored in flopy. "
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data without factor:\n",
"[[[ 65. 60. 55. 50. 45.]\n",
" [ 40. 35. 30. 25. 20.]]\n",
"\n",
" [[100. 100. 100. 100. 100.]\n",
" [100. 100. 100. 100. 100.]]]\n",
"\n",
"Data with factor:\n",
"[[[ 97.5 90. 82.5 75. 67.5]\n",
" [ 60. 52.5 45. 37.5 30. ]]\n",
"\n",
" [[100. 100. 100. 100. 100. ]\n",
" [100. 100. 100. 100. 100. ]]]\n",
"\n"
]
}
],
"source": [
"# get the data without applying any factor\n",
"hk_data_no_factor = hk.get_data()\n",
"print('Data without factor:\\n{}\\n'.format(hk_data_no_factor))\n",
"\n",
"# get data with factor applied\n",
"hk_data_factor = hk.array\n",
"print('Data with factor:\\n{}\\n'.format(hk_data_factor))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Data can also be retrieved from the data object using []. For unlayered data the [] can be used to slice the data."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SY slice of layer on row two\n",
"[0.13 0.13]\n",
"\n"
]
}
],
"source": [
"# slice layer one row two\n",
"print('SY slice of layer on row two\\n{}\\n'.format(sy[0,:,2]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For layered data specify the layer number within the brackets. This will return a \"LayerStorage\" object which let's you change attributes of an individual layer."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Layer one data without factor:\n",
"[[65. 60. 55. 50. 45.]\n",
" [40. 35. 30. 25. 20.]]\n",
"\n",
"Data with new factor:\n",
"[[[ 71.5 66. 60.5 55. 49.5]\n",
" [ 44. 38.5 33. 27.5 22. ]]\n",
"\n",
" [[100. 100. 100. 100. 100. ]\n",
" [100. 100. 100. 100. 100. ]]]\n",
"\n"
]
}
],
"source": [
"# get layer one LayerStorage object\n",
"hk_layer_one = hk[0]\n",
"# change the print code and factor for layer one\n",
"hk_layer_one.iprn = '2'\n",
"hk_layer_one.factor = 1.1\n",
"print('Layer one data without factor:\\n{}\\n'.format(hk_layer_one.get_data()))\n",
"print('Data with new factor:\\n{}\\n'.format(hk.array))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Modifying Data\n",
"\n",
"Data can be modified in several ways. One way is to set data for a given layer within a LayerStorage object, like the one accessed in the code above. Another way is to set the data attribute to the new data. Yet another way is to call the data object's set_data method."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"New HK data no factor:\n",
"[[[120. 100. 80. 70. 60.]\n",
" [ 50. 40. 30. 25. 20.]]\n",
"\n",
" [[100. 100. 100. 100. 100.]\n",
" [100. 100. 100. 100. 100.]]]\n",
"\n",
"New strt values:\n",
"[[[150. 150. 150. 150. 150.]\n",
" [150. 150. 150. 150. 150.]]\n",
"\n",
" [[150. 150. 150. 150. 150.]\n",
" [150. 150. 150. 150. 150.]]]\n",
"\n",
"New ss values:\n",
"[[[3.e-06 3.e-06 3.e-06 3.e-06 3.e-06]\n",
" [3.e-06 3.e-06 3.e-06 3.e-06 3.e-06]]\n",
"\n",
" [[4.e-06 4.e-06 4.e-06 4.e-06 4.e-06]\n",
" [4.e-06 4.e-06 4.e-06 4.e-06 4.e-06]]]\n",
"\n"
]
}
],
"source": [
"# set data within a LayerStorage object\n",
"hk_layer_one.set_data([120.0, 100.0, 80.0, 70.0, 60.0, 50.0, 40.0, 30.0, 25.0, 20.0])\n",
"print('New HK data no factor:\\n{}\\n'.format(hk.get_data()))\n",
"# set data attribute to new data\n",
"ic_package.strt = 150.0\n",
"print('New strt values:\\n{}\\n'.format(ic_package.strt.array))\n",
"# call set_data\n",
"sto_package.ss.set_data([0.000003, 0.000004])\n",
"print('New ss values:\\n{}\\n'.format(sto_package.ss.array))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Modifying the Simulation Path\n",
"\n",
"The simulation path folder can be changed by using the set_sim_path method in the MFFileMgmt object. The MFFileMgmt object can be obtained from the simulation object through properties:\n",
"\n",
"sim.simulation_data.mfpath"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# create new path\n",
"save_folder = os.path.join(sim_path, 'sim_modified')\n",
"# change simulation path\n",
"sim.simulation_data.mfpath.set_sim_path(save_folder)\n",
"# create folder\n",
"if not os.path.isdir(save_folder):\n",
" os.makedirs(save_folder)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Adding a Model Relative Path\n",
"\n",
"A model relative path lets you put all of the files associated with a model in a folder relative to the simulation folder. Warning, this will override all of your file paths to model package files and will also override any relative file paths to external model data files. "
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"writing simulation...\n",
" writing simulation name file...\n",
" writing simulation tdis package...\n",
" writing ims package ims...\n",
" writing model example_model...\n",
" writing model name file...\n",
" writing package dis...\n",
" writing package npf...\n",
" writing package ic...\n",
" writing package sto...\n",
" writing package wel...\n",
" writing package oc...\n",
" writing package chd_0...\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" writing package rch...\n",
" writing package ts_0...\n",
" writing package obs_0...\n",
"FloPy is using the following executable to run the model: /Users/jdhughes/.local/bin/mf6\n",
" MODFLOW 6\n",
" U.S. GEOLOGICAL SURVEY MODULAR HYDROLOGIC MODEL\n",
" VERSION 6.2.0 10/22/2020\n",
"\n",
" MODFLOW 6 compiled Oct 29 2020 12:19:52 with IFORT compiler (ver. 19.10.3)\n",
"\n",
"This software has been approved for release by the U.S. Geological \n",
"Survey (USGS). Although the software has been subjected to rigorous \n",
"review, the USGS reserves the right to update the software as needed \n",
"pursuant to further analysis and review. No warranty, expressed or \n",
"implied, is made by the USGS or the U.S. Government as to the \n",
"functionality of the software and related material nor shall the \n",
"fact of release constitute any such warranty. Furthermore, the \n",
"software is released on condition that neither the USGS nor the U.S. \n",
"Government shall be held liable for any damages resulting from its \n",
"authorized or unauthorized use. Also refer to the USGS Water \n",
"Resources Software User Rights Notice for complete use, copyright, \n",
"and distribution information.\n",
"\n",
" \n",
" Run start date and time (yyyy/mm/dd hh:mm:ss): 2021/02/18 11:33:03\n",
" \n",
" Writing simulation list file: mfsim.lst\n",
" Using Simulation name file: mfsim.nam\n",
" \n",
" Solving: Stress period: 1 Time step: 1\n",
" Solving: Stress period: 2 Time step: 1\n",
" Solving: Stress period: 2 Time step: 2\n",
" Solving: Stress period: 2 Time step: 3\n",
" Solving: Stress period: 2 Time step: 4\n",
" Solving: Stress period: 2 Time step: 5\n",
" \n",
" Run end date and time (yyyy/mm/dd hh:mm:ss): 2021/02/18 11:33:03\n",
" Elapsed run time: 0.071 Seconds\n",
" \n",
"\n",
"WARNING REPORT:\n",
"\n",
" 1. NONLINEAR BLOCK VARIABLE 'OUTER_HCLOSE' IN FILE 'example_sim.ims' WAS\n",
" DEPRECATED IN VERSION 6.1.1. SETTING OUTER_DVCLOSE TO OUTER_HCLOSE VALUE.\n",
" 2. LINEAR BLOCK VARIABLE 'INNER_HCLOSE' IN FILE 'example_sim.ims' WAS\n",
" DEPRECATED IN VERSION 6.1.1. SETTING INNER_DVCLOSE TO INNER_HCLOSE VALUE.\n",
" Normal termination of simulation.\n"
]
},
{
"data": {
"text/plain": [
"(True, [])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Change path of model files relative to the simulation folder\n",
"model.set_model_relative_path('model_folder')\n",
"\n",
"# create folder\n",
"if not os.path.isdir(save_folder):\n",
" os.makedirs(os.path.join(save_folder,'model_folder'))\n",
"\n",
"# write simulation to new folder\n",
"sim.write_simulation()\n",
"\n",
"# run simulation from new folder\n",
"sim.run_simulation() "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Post-Processing the Results\n",
"\n",
"Results can be retrieved from the master simulation dictionary. Results are retrieved from the master simulation dictionary with using a tuple key that identifies the data to be retrieved. For head data use the key\n",
"\n",
"('&lt;model name&gt;', 'HDS', 'HEAD')\n",
"\n",
"where &lt;model name&gt; is the name of your model. For cell by cell budget data use the key\n",
"\n",
"('&lt;model name&gt;', 'CBC', '&lt;flow data name&gt;')\n",
"\n",
"where &lt;flow data name&gt; is the name of the flow data to be retrieved (ex. 'FLOW-JA-FACE'). All available output keys can be retrieved using the output_keys method."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"('example_model', 'CBC', 'STO-SS')\n",
"('example_model', 'CBC', 'STO-SY')\n",
"('example_model', 'CBC', 'FLOW-JA-FACE')\n",
"('example_model', 'CBC', 'WEL')\n",
"('example_model', 'HDS', 'HEAD')\n"
]
}
],
"source": [
"keys = sim.simulation_data.mfdata.output_keys()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The entries in the list above are keys for data in the head file \"HDS\" and data in cell by cell flow file \"CBC\". Keys in this list are not guaranteed to be in any particular order. The code below uses the head file key to retrieve head data and then plots head data using matplotlib."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# get all head data\n",
"head = sim.simulation_data.mfdata['example_model', 'HDS', 'HEAD']\n",
"# get the head data from the end of the model run\n",
"head_end = head[-1]\n",
"# plot the head data from the end of the model run\n",
"levels = np.arange(160,162,1)\n",
"extent = (0.0, 1000.0, 2500.0, 0.0)\n",
"plt.contour(head_end[0, :, :],extent=extent)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Results can also be retrieved using the existing binaryfile method."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# get head data using old flopy method\n",
"hds_path = os.path.join(sim_path, model_name + '.hds')\n",
"hds = flopy.utils.HeadFile(hds_path)\n",
"# get heads after 1.0 days\n",
"head = hds.get_data(totim=1.0)\n",
"# plot head data\n",
"plt.contour(head[0, :, :],extent=extent)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 1
}