flopy/examples/Notebooks/flopy3_ZoneBudget_example.i...

1391 lines
97 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# FloPy\n",
"\n",
"### ZoneBudget Example\n",
"\n",
"This notebook demonstrates how to use the `ZoneBudget` class to extract budget information from the cell by cell budget file using an array of zones.\n",
"\n",
"First set the path and import the required packages. The flopy path doesn't have to be set if you install flopy from a binary installer. If you want to run this notebook, you have to set the path to your own flopy path."
]
},
{
"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",
"pandas version: 1.0.5\n",
"flopy version: 3.3.3\n"
]
}
],
"source": [
"import os\n",
"import sys\n",
"import platform\n",
"import numpy as np\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
"# run installed version of flopy or add local path\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('pandas version: {}'.format(pd.__version__))\n",
"print('flopy version: {}'.format(flopy.__version__))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Set path to example datafiles\n",
"loadpth = os.path.join('..', 'data', 'zonbud_examples')\n",
"cbc_f = os.path.join(loadpth, 'freyberg.gitcbc')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Read File Containing Zones\n",
"Using the `read_zbarray` utility, we can import zonebudget-style array files."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x288 with 6 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from flopy.utils import read_zbarray\n",
"\n",
"zone_file = os.path.join(loadpth, 'zonef_mlt.zbr')\n",
"zon = read_zbarray(zone_file)\n",
"nlay, nrow, ncol = zon.shape\n",
"\n",
"fig = plt.figure(figsize=(10, 4))\n",
"\n",
"for lay in range(nlay):\n",
" ax = fig.add_subplot(1, nlay, lay+1)\n",
" im = ax.pcolormesh(zon[lay, ::-1, :])\n",
" cbar = plt.colorbar(im)\n",
" plt.gca().set_aspect('equal')\n",
" \n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extract Budget Information from ZoneBudget Object\n",
"\n",
"At the core of the `ZoneBudget` object is a numpy structured array. The class provides some wrapper functions to help us interogate the array and save it to disk."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([(1097., 0, 1096, 'FROM_STORAGE', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_CONSTANT_HEAD', 0., 0.0000000e+00, 2.3156659e+02, 8.6217201e+01),\n",
" (1097., 0, 1096, 'FROM_WELLS', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_DRAINS', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_RECHARGE', 0., 5.1455815e+03, 1.4936376e+01, 2.9872751e+01),\n",
" (1097., 0, 1096, 'FROM_ZONE_0', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_ZONE_1', 0., 0.0000000e+00, 3.4751235e+03, 1.3860045e+02),\n",
" (1097., 0, 1096, 'FROM_ZONE_2', 0., 3.2693188e+03, 0.0000000e+00, 1.7646553e+03),\n",
" (1097., 0, 1096, 'FROM_ZONE_3', 0., 1.9218604e+02, 1.5280482e+03, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TOTAL_IN', 0., 8.6070859e+03, 5.2496748e+03, 2.0193457e+03),\n",
" (1097., 0, 1096, 'TO_STORAGE', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_CONSTANT_HEAD', 0., 2.3054836e+02, 2.1570151e+02, 2.9911380e+02),\n",
" (1097., 0, 1096, 'TO_WELLS', 0., 4.7627998e+03, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_DRAINS', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_RECHARGE', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_ZONE_0', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_ZONE_1', 0., 0.0000000e+00, 3.2693188e+03, 1.9218604e+02),\n",
" (1097., 0, 1096, 'TO_ZONE_2', 0., 3.4751235e+03, 0.0000000e+00, 1.5280482e+03),\n",
" (1097., 0, 1096, 'TO_ZONE_3', 0., 1.3860045e+02, 1.7646553e+03, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TOTAL_OUT', 0., 8.6070723e+03, 5.2496758e+03, 2.0193480e+03),\n",
" (1097., 0, 1096, 'IN-OUT', 0., 1.3671875e-02, 9.7656250e-04, 2.3193359e-03),\n",
" (1097., 0, 1096, 'PERCENT_DISCREPANCY', nan, 1.5884454e-04, 1.8602341e-05, 1.1485574e-04)],\n",
" dtype=[('totim', '<f4'), ('time_step', '<i4'), ('stress_period', '<i4'), ('name', '<U50'), ('ZONE_0', '<f4'), ('ZONE_1', '<f4'), ('ZONE_2', '<f4'), ('ZONE_3', '<f4')])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create a ZoneBudget object and get the budget record array\n",
"zb = flopy.utils.ZoneBudget(cbc_f, zon, kstpkper=(0, 1096))\n",
"zb.get_budget()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['FROM_CONSTANT_HEAD', 'FROM_DRAINS', 'FROM_RECHARGE',\n",
" 'FROM_STORAGE', 'FROM_WELLS', 'FROM_ZONE_0', 'FROM_ZONE_1',\n",
" 'FROM_ZONE_2', 'FROM_ZONE_3', 'IN-OUT', 'PERCENT_DISCREPANCY',\n",
" 'TOTAL_IN', 'TOTAL_OUT', 'TO_CONSTANT_HEAD', 'TO_DRAINS',\n",
" 'TO_RECHARGE', 'TO_STORAGE', 'TO_WELLS', 'TO_ZONE_0', 'TO_ZONE_1',\n",
" 'TO_ZONE_2', 'TO_ZONE_3'], dtype='<U50')"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get a list of the unique budget record names\n",
"zb.get_record_names()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([(1097., 0, 1096, 'FROM_RECHARGE', 0., 5145.5815 , 14.936376, 29.872751),\n",
" (1097., 0, 1096, 'FROM_ZONE_1', 0., 0. , 3475.1235 , 138.60045 ),\n",
" (1097., 0, 1096, 'FROM_ZONE_3', 0., 192.18604, 1528.0482 , 0. )],\n",
" dtype=[('totim', '<f4'), ('time_step', '<i4'), ('stress_period', '<i4'), ('name', '<U50'), ('ZONE_0', '<f4'), ('ZONE_1', '<f4'), ('ZONE_2', '<f4'), ('ZONE_3', '<f4')])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Look at a subset of fluxes\n",
"names = ['FROM_RECHARGE', 'FROM_ZONE_1', 'FROM_ZONE_3']\n",
"zb.get_budget(names=names)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([(1097., 0, 1096, 'FROM_RECHARGE', 14.936376),\n",
" (1097., 0, 1096, 'FROM_ZONE_1', 3475.1235 ),\n",
" (1097., 0, 1096, 'FROM_ZONE_3', 1528.0482 )],\n",
" dtype={'names':['totim','time_step','stress_period','name','ZONE_2'], 'formats':['<f4','<i4','<i4','<U50','<f4'], 'offsets':[0,4,8,12,220], 'itemsize':228})"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Look at fluxes in from zone 2\n",
"names = ['FROM_RECHARGE', 'FROM_ZONE_1', 'FROM_ZONE_3']\n",
"zones = ['ZONE_2']\n",
"zb.get_budget(names=names, zones=zones)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([(1097., 0, 1096, 'TOTAL_IN', 0., 8.6070859e+03, 5.249675e+03, 2.0193457e+03),\n",
" (1097., 0, 1096, 'TOTAL_OUT', 0., 8.6070723e+03, 5.249676e+03, 2.0193480e+03),\n",
" (1097., 0, 1096, 'IN-OUT', 0., 1.3671875e-02, 9.765625e-04, 2.3193359e-03),\n",
" (1097., 0, 1096, 'PERCENT_DISCREPANCY', nan, 1.5884454e-04, 1.860234e-05, 1.1485574e-04)],\n",
" dtype=[('totim', '<f4'), ('time_step', '<i4'), ('stress_period', '<i4'), ('name', '<U50'), ('ZONE_0', '<f4'), ('ZONE_1', '<f4'), ('ZONE_2', '<f4'), ('ZONE_3', '<f4')])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Look at all of the mass-balance records\n",
"names = ['TOTAL_IN', 'TOTAL_OUT', 'IN-OUT', 'PERCENT_DISCREPANCY']\n",
"zb.get_budget(names=names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Convert Units\n",
"The `ZoneBudget` class supports the use of mathematical operators and returns a new copy of the object."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6,222.7 cubic meters/day\n",
"176.2 cubic feet/day\n",
"12.3 inches/year\n"
]
}
],
"source": [
"cmd = flopy.utils.ZoneBudget(cbc_f, zon, kstpkper=(0, 0))\n",
"cfd = cmd / 35.3147\n",
"inyr = (cfd / (250 * 250)) * 365 * 12\n",
"\n",
"cmdbud = cmd.get_budget()\n",
"cfdbud = cfd.get_budget()\n",
"inyrbud = inyr.get_budget()\n",
"\n",
"names = ['FROM_RECHARGE']\n",
"rowidx = np.in1d(cmdbud['name'], names)\n",
"colidx = 'ZONE_1'\n",
"\n",
"print('{:,.1f} cubic meters/day'.format(cmdbud[rowidx][colidx][0]))\n",
"print('{:,.1f} cubic feet/day'.format(cfdbud[rowidx][colidx][0]))\n",
"print('{:,.1f} inches/year'.format(inyrbud[rowidx][colidx][0]))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cmd is cfd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Alias Names\n",
"A dictionary of {zone: \"alias\"} pairs can be passed to replace the typical \"ZONE_X\" fieldnames of the `ZoneBudget` structured array with more descriptive names."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([(1097., 0, 1096, 'FROM_STORAGE', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_CONSTANT_HEAD', 0., 0.0000000e+00, 2.3156659e+02, 8.6217201e+01),\n",
" (1097., 0, 1096, 'FROM_WELLS', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_DRAINS', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_RECHARGE', 0., 5.1455815e+03, 1.4936376e+01, 2.9872751e+01),\n",
" (1097., 0, 1096, 'FROM_ZONE_0', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'FROM_SURF', 0., 0.0000000e+00, 3.4751235e+03, 1.3860045e+02),\n",
" (1097., 0, 1096, 'FROM_CONF', 0., 3.2693188e+03, 0.0000000e+00, 1.7646553e+03),\n",
" (1097., 0, 1096, 'FROM_UFA', 0., 1.9218604e+02, 1.5280482e+03, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TOTAL_IN', 0., 8.6070859e+03, 5.2496748e+03, 2.0193457e+03),\n",
" (1097., 0, 1096, 'TO_STORAGE', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_CONSTANT_HEAD', 0., 2.3054836e+02, 2.1570151e+02, 2.9911380e+02),\n",
" (1097., 0, 1096, 'TO_WELLS', 0., 4.7627998e+03, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_DRAINS', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_RECHARGE', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_ZONE_0', 0., 0.0000000e+00, 0.0000000e+00, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TO_SURF', 0., 0.0000000e+00, 3.2693188e+03, 1.9218604e+02),\n",
" (1097., 0, 1096, 'TO_CONF', 0., 3.4751235e+03, 0.0000000e+00, 1.5280482e+03),\n",
" (1097., 0, 1096, 'TO_UFA', 0., 1.3860045e+02, 1.7646553e+03, 0.0000000e+00),\n",
" (1097., 0, 1096, 'TOTAL_OUT', 0., 8.6070723e+03, 5.2496758e+03, 2.0193480e+03),\n",
" (1097., 0, 1096, 'IN-OUT', 0., 1.3671875e-02, 9.7656250e-04, 2.3193359e-03),\n",
" (1097., 0, 1096, 'PERCENT_DISCREPANCY', nan, 1.5884454e-04, 1.8602341e-05, 1.1485574e-04)],\n",
" dtype=[('totim', '<f4'), ('time_step', '<i4'), ('stress_period', '<i4'), ('name', '<U50'), ('ZONE_0', '<f4'), ('SURF', '<f4'), ('CONF', '<f4'), ('UFA', '<f4')])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"aliases = {1: 'SURF', 2:'CONF', 3: 'UFA'}\n",
"zb = flopy.utils.ZoneBudget(cbc_f, zon, totim=[1097.], aliases=aliases)\n",
"zb.get_budget()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Return the Budgets as a Pandas DataFrame\n",
"Set `kstpkper` and `totim` keyword args to `None` (or omit) to return all times.\n",
"The `get_dataframes()` method will return a DataFrame multi-indexed on `totim` and `name`."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>ZONE_0</th>\n",
" <th>SURF</th>\n",
" <th>CONF</th>\n",
" <th>UFA</th>\n",
" </tr>\n",
" <tr>\n",
" <th>totim</th>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">1092.0</th>\n",
" <th>FROM_STORAGE</th>\n",
" <td>0.0</td>\n",
" <td>393.480286</td>\n",
" <td>230.476242</td>\n",
" <td>228.273621</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_CONSTANT_HEAD</th>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>13.225761</td>\n",
" <td>5.042325</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_WELLS</th>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_DRAINS</th>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_RECHARGE</th>\n",
" <td>0.0</td>\n",
" <td>6018.483887</td>\n",
" <td>17.470200</td>\n",
" <td>34.940399</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">1097.0</th>\n",
" <th>TO_CONF</th>\n",
" <td>0.0</td>\n",
" <td>3475.123535</td>\n",
" <td>0.000000</td>\n",
" <td>1528.048218</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_UFA</th>\n",
" <td>0.0</td>\n",
" <td>138.600449</td>\n",
" <td>1764.655273</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TOTAL_OUT</th>\n",
" <td>0.0</td>\n",
" <td>8607.072266</td>\n",
" <td>5249.675781</td>\n",
" <td>2019.348022</td>\n",
" </tr>\n",
" <tr>\n",
" <th>IN-OUT</th>\n",
" <td>0.0</td>\n",
" <td>0.013672</td>\n",
" <td>0.000977</td>\n",
" <td>0.002319</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PERCENT_DISCREPANCY</th>\n",
" <td>NaN</td>\n",
" <td>0.000159</td>\n",
" <td>0.000019</td>\n",
" <td>0.000115</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>132 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" ZONE_0 SURF CONF UFA\n",
"totim name \n",
"1092.0 FROM_STORAGE 0.0 393.480286 230.476242 228.273621\n",
" FROM_CONSTANT_HEAD 0.0 0.000000 13.225761 5.042325\n",
" FROM_WELLS 0.0 0.000000 0.000000 0.000000\n",
" FROM_DRAINS 0.0 0.000000 0.000000 0.000000\n",
" FROM_RECHARGE 0.0 6018.483887 17.470200 34.940399\n",
"... ... ... ... ...\n",
"1097.0 TO_CONF 0.0 3475.123535 0.000000 1528.048218\n",
" TO_UFA 0.0 138.600449 1764.655273 0.000000\n",
" TOTAL_OUT 0.0 8607.072266 5249.675781 2019.348022\n",
" IN-OUT 0.0 0.013672 0.000977 0.002319\n",
" PERCENT_DISCREPANCY NaN 0.000159 0.000019 0.000115\n",
"\n",
"[132 rows x 4 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"aliases = {1: 'SURF', 2:'CONF', 3: 'UFA'}\n",
"times = list(range(1092, 1097+1))\n",
"zb = flopy.utils.ZoneBudget(cbc_f, zon, totim=times, aliases=aliases)\n",
"zb.get_dataframes()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Slice the multi-index dataframe to retrieve a subset of the budget.\n",
"NOTE: We can pass \"names\" directly to the `get_dataframes()` method to return a subset of reocrds. By omitting the `\"FROM_\"` or `\"TO_\"` prefix we get both."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>SURF</th>\n",
" <th>CONF</th>\n",
" </tr>\n",
" <tr>\n",
" <th>totim</th>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">1095.0</th>\n",
" <th>FROM_CONSTANT_HEAD</th>\n",
" <td>0.000000</td>\n",
" <td>14.531923</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_RECHARGE</th>\n",
" <td>5010.149414</td>\n",
" <td>14.543249</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_CONSTANT_HEAD</th>\n",
" <td>664.912598</td>\n",
" <td>493.175781</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_WELLS</th>\n",
" <td>794.582886</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">1096.0</th>\n",
" <th>FROM_CONSTANT_HEAD</th>\n",
" <td>0.000000</td>\n",
" <td>6.501888</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_RECHARGE</th>\n",
" <td>6115.663086</td>\n",
" <td>17.752289</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_CONSTANT_HEAD</th>\n",
" <td>690.230591</td>\n",
" <td>511.618652</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_WELLS</th>\n",
" <td>1373.782715</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">1097.0</th>\n",
" <th>FROM_CONSTANT_HEAD</th>\n",
" <td>0.000000</td>\n",
" <td>231.566589</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_RECHARGE</th>\n",
" <td>5145.581543</td>\n",
" <td>14.936376</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_CONSTANT_HEAD</th>\n",
" <td>230.548355</td>\n",
" <td>215.701508</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_WELLS</th>\n",
" <td>4762.799805</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" SURF CONF\n",
"totim name \n",
"1095.0 FROM_CONSTANT_HEAD 0.000000 14.531923\n",
" FROM_RECHARGE 5010.149414 14.543249\n",
" TO_CONSTANT_HEAD 664.912598 493.175781\n",
" TO_WELLS 794.582886 0.000000\n",
"1096.0 FROM_CONSTANT_HEAD 0.000000 6.501888\n",
" FROM_RECHARGE 6115.663086 17.752289\n",
" TO_CONSTANT_HEAD 690.230591 511.618652\n",
" TO_WELLS 1373.782715 0.000000\n",
"1097.0 FROM_CONSTANT_HEAD 0.000000 231.566589\n",
" FROM_RECHARGE 5145.581543 14.936376\n",
" TO_CONSTANT_HEAD 230.548355 215.701508\n",
" TO_WELLS 4762.799805 0.000000"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dateidx1 = 1095.\n",
"dateidx2 = 1097.\n",
"names = ['FROM_RECHARGE', 'TO_WELLS', 'CONSTANT_HEAD']\n",
"zones = ['SURF', 'CONF']\n",
"df = zb.get_dataframes(names=names)\n",
"df.loc[(slice(dateidx1, dateidx2), slice(None)), :][zones]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Look at pumpage (`TO_WELLS`) as a percentage of recharge (`FROM_RECHARGE`)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>SURF</th>\n",
" </tr>\n",
" <tr>\n",
" <th>totim</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1095.0</th>\n",
" <td>-15.859466</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1096.0</th>\n",
" <td>-22.463348</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1097.0</th>\n",
" <td>-92.560966</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" SURF\n",
"totim \n",
"1095.0 -15.859466\n",
"1096.0 -22.463348\n",
"1097.0 -92.560966"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dateidx1 = 1095.\n",
"dateidx2 = 1097.\n",
"zones = ['SURF']\n",
"\n",
"# Pull out the individual records of interest\n",
"rech = df.loc[(slice(dateidx1, dateidx2), ['FROM_RECHARGE']), :][zones]\n",
"pump = df.loc[(slice(dateidx1, dateidx2), ['TO_WELLS']), :][zones]\n",
"\n",
"# Remove the \"record\" field from the index so we can \n",
"# take the difference of the two DataFrames\n",
"rech = rech.reset_index()\n",
"rech = rech.set_index(['totim'])\n",
"rech = rech[zones]\n",
"pump = pump.reset_index()\n",
"pump = pump.set_index(['totim'])\n",
"pump = pump[zones] * -1\n",
"\n",
"# Compute pumping as a percentage of recharge\n",
"(pump / rech) * 100."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pass `start_datetime` and `timeunit` keyword arguments to return a dataframe with a datetime multi-index"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>SURF</th>\n",
" <th>CONF</th>\n",
" </tr>\n",
" <tr>\n",
" <th>datetime</th>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">1972-12-29</th>\n",
" <th>FROM_CONSTANT_HEAD</th>\n",
" <td>0.000000</td>\n",
" <td>16.905813</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_RECHARGE</th>\n",
" <td>4203.679199</td>\n",
" <td>12.202263</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_CONSTANT_HEAD</th>\n",
" <td>655.814514</td>\n",
" <td>487.094849</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_WELLS</th>\n",
" <td>1930.483154</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">1972-12-30</th>\n",
" <th>FROM_CONSTANT_HEAD</th>\n",
" <td>0.000000</td>\n",
" <td>18.877954</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_RECHARGE</th>\n",
" <td>4047.502441</td>\n",
" <td>11.748919</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_CONSTANT_HEAD</th>\n",
" <td>650.441589</td>\n",
" <td>482.853638</td>\n",
" </tr>\n",
" <tr>\n",
" <th>TO_WELLS</th>\n",
" <td>1279.166382</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" SURF CONF\n",
"datetime name \n",
"1972-12-29 FROM_CONSTANT_HEAD 0.000000 16.905813\n",
" FROM_RECHARGE 4203.679199 12.202263\n",
" TO_CONSTANT_HEAD 655.814514 487.094849\n",
" TO_WELLS 1930.483154 0.000000\n",
"1972-12-30 FROM_CONSTANT_HEAD 0.000000 18.877954\n",
" FROM_RECHARGE 4047.502441 11.748919\n",
" TO_CONSTANT_HEAD 650.441589 482.853638\n",
" TO_WELLS 1279.166382 0.000000"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dateidx1 = pd.Timestamp('1972-12-29')\n",
"dateidx2 = pd.Timestamp('1972-12-30')\n",
"names = ['FROM_RECHARGE', 'TO_WELLS', 'CONSTANT_HEAD']\n",
"zones = ['SURF', 'CONF']\n",
"df = zb.get_dataframes(start_datetime='1970-01-01', timeunit='D', names=names)\n",
"df.loc[(slice(dateidx1, dateidx2), slice(None)), :][zones]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pass `index_key` to indicate which fields to use in the multi-index (default is \"totim\"; valid keys are \"totim\" and \"kstpkper\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>ZONE_0</th>\n",
" <th>SURF</th>\n",
" <th>CONF</th>\n",
" <th>UFA</th>\n",
" </tr>\n",
" <tr>\n",
" <th>time_step</th>\n",
" <th>stress_period</th>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">0</th>\n",
" <th rowspan=\"5\" valign=\"top\">1091</th>\n",
" <th>FROM_STORAGE</th>\n",
" <td>0.0</td>\n",
" <td>393.480286</td>\n",
" <td>230.476242</td>\n",
" <td>228.273621</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_CONSTANT_HEAD</th>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>13.225761</td>\n",
" <td>5.042325</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_WELLS</th>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_DRAINS</th>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FROM_RECHARGE</th>\n",
" <td>0.0</td>\n",
" <td>6018.483887</td>\n",
" <td>17.470200</td>\n",
" <td>34.940399</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ZONE_0 SURF CONF \\\n",
"time_step stress_period name \n",
"0 1091 FROM_STORAGE 0.0 393.480286 230.476242 \n",
" FROM_CONSTANT_HEAD 0.0 0.000000 13.225761 \n",
" FROM_WELLS 0.0 0.000000 0.000000 \n",
" FROM_DRAINS 0.0 0.000000 0.000000 \n",
" FROM_RECHARGE 0.0 6018.483887 17.470200 \n",
"\n",
" UFA \n",
"time_step stress_period name \n",
"0 1091 FROM_STORAGE 228.273621 \n",
" FROM_CONSTANT_HEAD 5.042325 \n",
" FROM_WELLS 0.000000 \n",
" FROM_DRAINS 0.000000 \n",
" FROM_RECHARGE 34.940399 "
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = zb.get_dataframes(index_key='kstpkper')\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Write Budget Output to CSV\n",
"\n",
"We can write the resulting recarray to a csv file with the `.to_csv()` method of the `ZoneBudget` object."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" totim time_step stress_period name ZONE_0 ZONE_1 ZONE_2 ZONE_3\n",
" 1.0 0 0 FROM_STORAGE 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 FROM_CONSTANT_HEAD 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 FROM_WELLS 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 FROM_DRAINS 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 FROM_RECHARGE 0.0 6222.673300 18.062912 36.125824\n",
" 1.0 0 0 FROM_ZONE_0 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 FROM_ZONE_1 0.0 0.000000 4275.257300 491.945070\n",
" 1.0 0 0 FROM_ZONE_2 0.0 2744.821800 0.000000 2115.654000\n",
" 1.0 0 0 FROM_ZONE_3 0.0 451.545720 1215.952300 0.000000\n",
" 1.0 0 0 TOTAL_IN 0.0 9419.041000 5509.272500 2643.725000\n",
" 1.0 0 0 TO_STORAGE 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 TO_CONSTANT_HEAD 0.0 821.283200 648.806100 976.233600\n",
" 1.0 0 0 TO_WELLS 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 TO_DRAINS 0.0 3832.150000 0.000000 0.000000\n",
" 1.0 0 0 TO_RECHARGE 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 TO_ZONE_0 0.0 0.000000 0.000000 0.000000\n",
" 1.0 0 0 TO_ZONE_1 0.0 0.000000 2744.821800 451.545720\n",
" 1.0 0 0 TO_ZONE_2 0.0 4275.257300 0.000000 1215.952300\n",
" 1.0 0 0 TO_ZONE_3 0.0 491.945070 2115.654000 0.000000\n",
" 1.0 0 0 TOTAL_OUT 0.0 9420.636000 5509.282000 2643.731400\n",
" 1.0 0 0 IN-OUT 0.0 1.594727 0.009766 0.006348\n",
" 1.0 0 0 PERCENT_DISCREPANCY NaN 0.016929 0.000177 0.000240\n",
" 1097.0 0 1096 FROM_STORAGE 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 FROM_CONSTANT_HEAD 0.0 0.000000 231.566590 86.217200\n",
" 1097.0 0 1096 FROM_WELLS 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 FROM_DRAINS 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 FROM_RECHARGE 0.0 5145.581500 14.936376 29.872751\n",
" 1097.0 0 1096 FROM_ZONE_0 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 FROM_ZONE_1 0.0 0.000000 3475.123500 138.600450\n",
" 1097.0 0 1096 FROM_ZONE_2 0.0 3269.318800 0.000000 1764.655300\n",
" 1097.0 0 1096 FROM_ZONE_3 0.0 192.186040 1528.048200 0.000000\n",
" 1097.0 0 1096 TOTAL_IN 0.0 8607.086000 5249.675000 2019.345700\n",
" 1097.0 0 1096 TO_STORAGE 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 TO_CONSTANT_HEAD 0.0 230.548360 215.701500 299.113800\n",
" 1097.0 0 1096 TO_WELLS 0.0 4762.800000 0.000000 0.000000\n",
" 1097.0 0 1096 TO_DRAINS 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 TO_RECHARGE 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 TO_ZONE_0 0.0 0.000000 0.000000 0.000000\n",
" 1097.0 0 1096 TO_ZONE_1 0.0 0.000000 3269.318800 192.186040\n",
" 1097.0 0 1096 TO_ZONE_2 0.0 3475.123500 0.000000 1528.048200\n",
" 1097.0 0 1096 TO_ZONE_3 0.0 138.600450 1764.655300 0.000000\n",
" 1097.0 0 1096 TOTAL_OUT 0.0 8607.072000 5249.676000 2019.348000\n",
" 1097.0 0 1096 IN-OUT 0.0 0.013672 0.000977 0.002319\n",
" 1097.0 0 1096 PERCENT_DISCREPANCY NaN 0.000159 0.000019 0.000115\n"
]
}
],
"source": [
"zb = flopy.utils.ZoneBudget(cbc_f, zon, kstpkper=[(0, 0), (0, 1096)])\n",
"f_out = os.path.join('data', 'Example_output.csv')\n",
"zb.to_csv(f_out)\n",
"\n",
"# Read the file in to see the contents\n",
"try:\n",
" import pandas as pd\n",
" print(pd.read_csv(f_out).to_string(index=False))\n",
"except:\n",
" with open(fname, 'r') as f:\n",
" for line in f.readlines():\n",
" print('\\t'.join(line.split(',')))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Net Budget\n",
"Using the \"net\" keyword argument, we can request a net budget for each zone/record name or for a subset of zones and record names. Note that we can identify the record names we want without the added `\"_IN\"` or `\"_OUT\"` string suffix."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([(1092., 0, 1091, 'STORAGE', -386.15085, -425.65155),\n",
" (1092., 0, 1091, 'WELLS', -2829.812 , 0. ),\n",
" (1093., 0, 1092, 'STORAGE', -12.50354, -151.3594 ),\n",
" (1093., 0, 1092, 'WELLS', -1930.4832 , 0. ),\n",
" (1094., 0, 1093, 'STORAGE', -198.92935, -270.8744 ),\n",
" (1094., 0, 1093, 'WELLS', -1279.1664 , 0. ),\n",
" (1095., 0, 1094, 'STORAGE', -718.4885 , -604.8537 ),\n",
" (1095., 0, 1094, 'WELLS', -794.5829 , 0. ),\n",
" (1096., 0, 1095, 'STORAGE', -855.1075 , -622.88477),\n",
" (1096., 0, 1095, 'WELLS', -1373.7827 , 0. ),\n",
" (1097., 0, 1096, 'STORAGE', 0. , 0. ),\n",
" (1097., 0, 1096, 'WELLS', -4762.8 , 0. )],\n",
" dtype={'names':['totim','time_step','stress_period','name','SURF','UFA'], 'formats':['<f4','<i4','<i4','<U50','<f4','<f4'], 'offsets':[0,4,8,12,212,220], 'itemsize':224})"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"zon = np.ones((nlay, nrow, ncol), int)\n",
"zon[1, :, :] = 2\n",
"zon[2, :, :] = 3\n",
"\n",
"aliases = {1: 'SURF', 2:'CONF', 3: 'UFA'}\n",
"times = list(range(1092, 1097+1))\n",
"zb = flopy.utils.ZoneBudget(cbc_f, zon, totim=times, aliases=aliases)\n",
"zb.get_budget(names=['STORAGE', 'WELLS'], zones=['SURF', 'UFA'], net=True)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>SURF</th>\n",
" <th>UFA</th>\n",
" </tr>\n",
" <tr>\n",
" <th>totim</th>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1092.0</th>\n",
" <th>STORAGE</th>\n",
" <td>-386.150848</td>\n",
" <td>-425.651550</td>\n",
" </tr>\n",
" <tr>\n",
" <th>WELLS</th>\n",
" <td>-2829.812012</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1093.0</th>\n",
" <th>STORAGE</th>\n",
" <td>-12.503540</td>\n",
" <td>-151.359406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>WELLS</th>\n",
" <td>-1930.483154</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1094.0</th>\n",
" <th>STORAGE</th>\n",
" <td>-198.929352</td>\n",
" <td>-270.874390</td>\n",
" </tr>\n",
" <tr>\n",
" <th>WELLS</th>\n",
" <td>-1279.166382</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" SURF UFA\n",
"totim name \n",
"1092.0 STORAGE -386.150848 -425.651550\n",
" WELLS -2829.812012 0.000000\n",
"1093.0 STORAGE -12.503540 -151.359406\n",
" WELLS -1930.483154 0.000000\n",
"1094.0 STORAGE -198.929352 -270.874390\n",
" WELLS -1279.166382 0.000000"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = zb.get_dataframes(names=['STORAGE', 'WELLS'], zones=['SURF', 'UFA'], net=True)\n",
"df.head(6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot Budget Components\n",
"The following is a function that can be used to better visualize the budget components using matplotlib."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"def tick_label_formatter_comma_sep(x, pos):\n",
" return '{:,.0f}'.format(x)\n",
"\n",
"\n",
"def volumetric_budget_bar_plot(values_in, values_out, labels, **kwargs):\n",
" if 'ax' in kwargs:\n",
" ax = kwargs.pop('ax')\n",
" else:\n",
" ax = plt.gca()\n",
"\n",
" x_pos = np.arange(len(values_in))\n",
" rects_in = ax.bar(x_pos, values_in, align='center', alpha=0.5)\n",
"\n",
" x_pos = np.arange(len(values_out))\n",
" rects_out = ax.bar(x_pos, values_out, align='center', alpha=0.5)\n",
"\n",
" plt.xticks(list(x_pos), labels)\n",
" ax.set_xticklabels(ax.xaxis.get_majorticklabels(), rotation=90)\n",
" ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(tick_label_formatter_comma_sep))\n",
"\n",
" ymin, ymax = ax.get_ylim()\n",
" if ymax != 0:\n",
" if abs(ymin) / ymax < .33:\n",
" ymin = -(ymax * .5)\n",
" else:\n",
" ymin *= 1.35\n",
" else:\n",
" ymin *= 1.35\n",
" plt.ylim([ymin, ymax * 1.25])\n",
"\n",
" for i, rect in enumerate(rects_in):\n",
" label = '{:,.0f}'.format(values_in[i])\n",
" height = values_in[i]\n",
" x = rect.get_x() + rect.get_width() / 2\n",
" y = height + (.02 * ymax)\n",
" vertical_alignment = 'bottom'\n",
" horizontal_alignment = 'center'\n",
" ax.text(x, y, label, ha=horizontal_alignment, va=vertical_alignment, rotation=90)\n",
"\n",
" for i, rect in enumerate(rects_out):\n",
" label = '{:,.0f}'.format(values_out[i])\n",
" height = values_out[i]\n",
" x = rect.get_x() + rect.get_width() / 2\n",
" y = height + (.02 * ymin)\n",
" vertical_alignment = 'top'\n",
" horizontal_alignment = 'center'\n",
" ax.text(x, y, label, ha=horizontal_alignment, va=vertical_alignment, rotation=90)\n",
"\n",
" # horizontal line indicating zero\n",
" ax.plot([rects_in[0].get_x() - rects_in[0].get_width() / 2,\n",
" rects_in[-1].get_x() + rects_in[-1].get_width()], [0, 0], \"k\")\n",
"\n",
" return rects_in, rects_out"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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tAD6Dv9VhduuGvXbGCNJxvjx4/dOEX/ppZcyd+5cJk2axIknnsiQIUOSDi9S55133n5tGzZs4Oijj+aOO+5IICIRkdpPBR4RERGRCLj7G6QfVwegVwXHjAHGRBaUZJUGDRpwxRVX7F0/++yzc+LRNIBNmzbts+7udOvWjb/97W+4O82bN08oMpHctH37dpYsWcJxxx1H06ZNkw4ncqtWreLII4+kadOmrFixgnnz5nHSSSfRuXPnpEOrlGbREhERERGphdavX89Pf/pThgwZwmeffcadd95Jly5duPzyy1m3bl3S4UWqRYsWfOMb39i7FBYWsnbtWk4//XQKC/d/ZE/2ZWbtzOx1M1tsZgvN7OawvbmZvWpmH4WvzVKOGWVmS83sQzP7bnLRS20wePDgve/feOMNOnbsyPDhwznllFN46aWXEowsetk8g6EKPCIiIiIitdCAAQPo2LEj7dq1o2fPnjRu3JgXX3yRb3/729xwww1JhxepsWPHcuKJJzJ16lSWL1/O8uXLyc/PZ/ny5Sxbtizp8LLBbmC4u58MnAUMMbOOwEhgprt3AGaG64Tb+gKdgN7AQ2ZWP5HIpVZ455139r7/93//d55//nlef/11Zs+ezc9//vMEI4te2QyGb775JkOHDuV//ud/ePTRR5k7dy6PPfZY0uFVSgUeEREREZFaqKSkhJtuuomRI0eyZcsWRowYQfv27bnppptYuXJl0uFF6tZbb2X8+PHcddddDBs2jG3btml69Bpw93Xu/l74fhuwGGgL9AEmhLtNAC4O3/cBnnL3L919ObAU6BZv1FJbbd26ldNPPx2A4447jtLSuj08XNkMhk2bNs26GQw1Bk+WydZnAUVERESkZvbs2bP3/dVXX73Ptrr+CxYEs2Y9/fTTvPDCCxQVFbFz586kQ8pKZlYAnAbMAVq6+zoIikBmdnS4W1vgnZTD1oRt5c81CBgE0L59++iClsR98MEHdOnSBXdnxYoVbN68mWbNmrFnzx527dqVdHiRyuYZDFXgySLFxcU8/PDDHHLIIdx666385je/oXv37owePZqBAwcybNiwpEMUERERkQzp06cP27dvp0mTJtx9991725cuXcqJJ56YYGTx+v73v895553Hxx9/DMDjjz/ONddck3BU2cHMmgDPAre4+9ZKekGl2+D7NbiPA8YBFBYW7rdd6o7F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uskigl3TtO03kGBtnkkil9336pKkQ8iYoUUn1PiYunL/B3LvIiIiIiIiEr96cV7MzBoSFHeedPfnwuYSM2sdbm8NbAjbq5xFAoKZJNy90N0L8/LyogteRERy2q5du/Zr+/TTTxOIJH65fO8iIiIi2SK2Ao8FXXUeBRa7+70pm6YC/cP3/YEpKe19zeyQcCaJDsDcuOIVEREBeP3118nPz6dNmzacf/75rFixYu+2888/P7nAYpDL9y4iIiKSbeLswdMduAo418wWhMv3gGKgyMw+AorCdcIZIyYDi4CXgSGaQUtEROJ22223MX36dDZu3MigQYMoKirinXeCIeLc93tyuE7J5XsXERERyTZxzqL1BunH1QHoVcExY4AxkQUlIiJSha+++opOnToBcOmll3LyySdzySWXUFxcTCXjyNUJuXzvIiIiItkmkVm0REREskXDhg1Zv349rVq1AqBTp07MnDmTiy66iI8//jjh6KKVy/cuIiIikm1iHWRZREQk2xQXF1NSUrJPW35+PrNmzWLkyJEJRRWPXL53ERERkWxTYQ8eM7uksgNTZsESEcko5R+pTc4777y07U2bNuWOO+6IOZp45eK9K/+ISKYpr4hIXCp7ROv74evRwNnAa+F6T2AWoEQkIlFR/pFa4+WXX6Z3794AfP755wwbNox3332Xzp07c99999GyZcuEI4xOjt678o+IZJryiojEosJHtNz9Gne/BnCgo7v/yN1/BHSKLToRyUnKP1Kb3H777XvfDx8+nNatW/PCCy9wxhlncP311ycYWfRy8d6Vf0Qk05RXRCQu1RlkucDd16WslwAnRBSPiEgq5R+pVebNm8eCBQsAGDp0KBMmTEg4ovjk4L0r/4hIpimviEikqlPgmWVm04H/JKg69wVejzQqEZGA8o8kbsOGDdx77724O1u3bsXd904RvmfPnoSji1Yu3zvKPyKSecorIhKpKgs87n5jODDYt8Omce7+X9GGJSKi/CO1w09+8hO2bdsGQP/+/fn000/Jy8tj/fr1dO3aNeHoopXL9678IyKZprwiIlGrbBat6cDLwLRwZHcN/iUisVD+kdpk9OjR+7VdffXVTJw4kYkTJyYQUXxy8d6Vf0Qk05RXRCQulfXg6Q/0Bu40sxOAOQSJaaa7b48jOBHJWco/Umv84Ac/2K/ttddeY8uWLQBMnTo1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TJnCokWLKCgoYNWqVfTr149Vq1YxcuRI3D10PBERERERIUsLPO6+EdhoZj8od6gLsMLdVwKY2SygD7As+twtet10YAFa4BERybrdu3dTUFAAwHHHHceCBQvo168f77//vhZ4RERERERyROg9eI4GPkx7vjoaA2jm7usAos9NK/oCZjbUzErMrGTTpk0ZDSsikkRFRUUsWbJk7/OCggKeeOIJNm/ezNKlSwMmExERERGRMqEXeKyCsUP6c7C7P+Dundy9U5MmTWooloiIlJkxYwZFRUX7jdWpU4cZM2bwwgsvBEolIiIiIiLpMrbAY2bDzWxJ9NGikpetBlqlPW8JrI0ebzCz5tHXag5szFRWERGpXMuWLQ9Y4Cnz7W9/O8tpRERERESkIhlb4HH3ye5eHH2sreRlC4GTzOx4M6sHDATmRsfmAoOix4OAxyp4v4iIZNjSpUvp2rUrrVq1YujQoXz00Ud7j3Xp0iVgMhERERERKZOt26QXmdlq4Cbgl2a22syOdPddwPXA08BbwGx3fzN62zigh5ktJ3WXrXHZyCoiIvu77rrruO2221i6dCknn3wy3/nOd3j33XcB2LlzZ+B0IiIiIiIC2buL1npSl19VdGweMK+C8S3AuRmOJiIiB1FaWkrPnj0BGDVqFB07dqRnz548/PDDmFW0lZqIiIiIiGRbVhZ4REQkvtydbdu20aBBAwC6d+/OnDlz6Nu3L1u3bg2cTkREREREIPxdtEREJMeNHj2at956a7+xpk2bMn/+fC655JJAqUREREREJJ3O4BERkSpdfvnlB4z16tWLxYsXM2XKlACJRERERESkPJ3BIyIih8zdQ0cQEREREZE0WuAREZFDNmTIkNARREREREQkjRZ4RETkkA0bNix0BBERERERSaMFHhERERERERGRmNMCj4iIiIiIiIhIzGmBR0REREREREQk5rTAIyIiIiIiIiISc1rgERERERERERGJOXP30BlqjJltAt4PnSPLCoHNoUMEkuS5Q+7N/1h3bxI6RCjqn8RJ8twht+av7lH3JE2S559rc1f/qH+SJMlzh9ybf4X9k1cLPElkZiXu3il0jhCSPHfQ/CW8JP8bTPLcQfOXsJL+7y/J80/y3CU3JPnfYJLnDvGZvy7REhERERERERGJOS3wiIiIiIiIiIjEnBZ44u+B0AECSvLcQfOX8JL8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\n",
"text/plain": [
"<Figure size 1152x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(16, 5))\n",
"\n",
"times = [2., 500., 1000., 1095.]\n",
"\n",
"for idx, t in enumerate(times):\n",
"\n",
" ax = fig.add_subplot(1, len(times), idx + 1)\n",
"\n",
" zb = flopy.utils.ZoneBudget(cbc_f, zon, kstpkper=None, totim=t, aliases=aliases)\n",
"\n",
" recname = 'STORAGE'\n",
" values_in = zb.get_dataframes(names='FROM_{}'.format(recname)).T.squeeze()\n",
" values_out = zb.get_dataframes(names='TO_{}'.format(recname)).T.squeeze() * -1\n",
" labels = values_in.index.tolist()\n",
"\n",
" rects_in, rects_out = volumetric_budget_bar_plot(values_in, values_out, labels, ax=ax)\n",
"\n",
" plt.ylabel('Volumetric rate, in Mgal/d')\n",
" plt.title('{} @ totim = {}'.format(recname, t))\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"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": 2
}