From 5dc74e42a59697fde45828d1cb856d213f870889 Mon Sep 17 00:00:00 2001 From: Adam Erispaha Date: Fri, 3 Jan 2025 13:21:56 -0500 Subject: [PATCH] improvements to docs, bug fix in slr example --- docs/usage/getting_started.ipynb | 181 +++++++++++++++++---------- docs/usage/visualizing_models.ipynb | 2 +- docs/usage/working_with_pyswmm.ipynb | 73 ++++++----- swmmio/__init__.py | 2 +- 4 files changed, 156 insertions(+), 102 deletions(-) diff --git a/docs/usage/getting_started.ipynb b/docs/usage/getting_started.ipynb index cc99623..b39c492 100644 --- a/docs/usage/getting_started.ipynb +++ b/docs/usage/getting_started.ipynb @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -40,7 +40,17 @@ " \n", " InletNode\n", " OutletNode\n", + " Length\n", + " Roughness\n", + " InOffset\n", + " OutOffset\n", + " InitFlow\n", " ...\n", + " Shape\n", + " Geom1\n", + " Geom2\n", + " Geom3\n", + " Geom4\n", " Barrels\n", " coords\n", " \n", @@ -51,6 +61,16 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -58,7 +78,17 @@ " C1:C2\n", " J1\n", " J2\n", + " 244.63\n", + " 0.01\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", " ...\n", + " CIRCULAR\n", + " 1.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", " 1.0\n", " [(0.0, 0.0), (238.75, -53.332)]\n", " \n", @@ -66,7 +96,17 @@ " C3\n", " J3\n", " J4\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " ...\n", + " RECT_OPEN\n", + " 5.0\n", + " 1.0\n", + " 0.0\n", + " 0.0\n", " NaN\n", " [(459.058, -113.145), (671.391, -163.985)]\n", " \n", @@ -74,8 +114,18 @@ " C2\n", " J2\n", " J3\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " ...\n", " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " [(238.75, -53.332), (459.058, -113.145)]\n", " \n", " \n", @@ -84,11 +134,17 @@ "" ], "text/plain": [ - " InletNode OutletNode ... Barrels \\\n", - "Name ... \n", - "C1:C2 J1 J2 ... 1.0 \n", - "C3 J3 J4 ... NaN \n", - "C2 J2 J3 ... NaN \n", + " InletNode OutletNode Length Roughness InOffset OutOffset InitFlow \\\n", + "Name \n", + "C1:C2 J1 J2 244.63 0.01 0.0 0.0 0.0 \n", + "C3 J3 J4 NaN NaN NaN NaN NaN \n", + "C2 J2 J3 NaN NaN NaN NaN NaN \n", + "\n", + " ... Shape Geom1 Geom2 Geom3 Geom4 Barrels \\\n", + "Name ... \n", + "C1:C2 ... CIRCULAR 1.0 0.0 0.0 0.0 1.0 \n", + "C3 ... RECT_OPEN 5.0 1.0 0.0 0.0 NaN \n", + "C2 ... NaN NaN NaN NaN NaN NaN \n", "\n", " coords \n", "Name \n", @@ -99,7 +155,7 @@ "[3 rows x 26 columns]" ] }, - "execution_count": 3, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -130,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -182,7 +238,7 @@ "J4 0 FREE NO" ] }, - "execution_count": 2, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -194,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -246,7 +302,7 @@ "J4 0 FIXED 3.0" ] }, - "execution_count": 3, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -268,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -293,70 +349,55 @@ " \n", " \n", " InvertElev\n", - " MaxDepth\n", - " ...\n", - " EvapFrac\n", - " coords\n", + " OutfallType\n", + " StageOrTimeseries\n", " \n", " \n", " Name\n", " \n", " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", " J1\n", " 20.728\n", - " 15.0\n", - " ...\n", " NaN\n", - " [(0.0, 0.0)]\n", + " NaN\n", " \n", " \n", " J3\n", " 6.547\n", - " 15.0\n", - " ...\n", " NaN\n", - " [(459.058, -113.145)]\n", + " NaN\n", " \n", " \n", " J4\n", " 0.000\n", - " NaN\n", - " ...\n", - " NaN\n", - " [(671.391, -163.985)]\n", + " FIXED\n", + " 3.0\n", " \n", " \n", " J2\n", " 13.392\n", " NaN\n", - " ...\n", - " 0.0\n", - " [(238.75, -53.332)]\n", + " NaN\n", " \n", " \n", "\n", - "

4 rows × 14 columns

\n", "" ], "text/plain": [ - " InvertElev MaxDepth ... EvapFrac coords\n", - "Name ... \n", - "J1 20.728 15.0 ... NaN [(0.0, 0.0)]\n", - "J3 6.547 15.0 ... NaN [(459.058, -113.145)]\n", - "J4 0.000 NaN ... NaN [(671.391, -163.985)]\n", - "J2 13.392 NaN ... 0.0 [(238.75, -53.332)]\n", - "\n", - "[4 rows x 14 columns]" + " InvertElev OutfallType StageOrTimeseries\n", + "Name \n", + "J1 20.728 NaN NaN\n", + "J3 6.547 NaN NaN\n", + "J4 0.000 FIXED 3.0\n", + "J2 13.392 NaN NaN" ] }, - "execution_count": 4, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -368,7 +409,7 @@ "new_model = swmmio.Model('new_model.inp')\n", "\n", "# see the changes in the higher-level nodes DataFrame\n", - "new_model.nodes.dataframe " + "new_model.nodes.dataframe[['InvertElev','OutfallType', 'StageOrTimeseries']]" ] }, { @@ -383,7 +424,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -423,13 +464,13 @@ " KRO2005\n", " 574.32\n", " FIXED\n", - " 628.5\n", + " 581.0\n", " \n", " \n", " PSO\n", " 548.36\n", " FIXED\n", - " 628.5\n", + " 581.0\n", " \n", " \n", "\n", @@ -438,11 +479,11 @@ "text/plain": [ " InvertElev OutfallType StageOrTimeseries\n", "Name \n", - "KRO2005 574.32 FIXED 628.5\n", - "PSO 548.36 FIXED 628.5" + "KRO2005 574.32 FIXED 581.0\n", + "PSO 548.36 FIXED 581.0" ] }, - "execution_count": 5, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -453,37 +494,38 @@ "# path to a SWMM model from swmm-nrtestsuite\n", "model_path = 'https://raw.githubusercontent.com/USEPA/swmm-nrtestsuite/refs/heads/dev/public/examples/Example3.inp'\n", "\n", - "# initialize a baseline model object\n", - "baseline = swmmio.Model(model_path)\n", + "# initialize a model object\n", + "model = swmmio.Model(model_path)\n", "\n", - "rise = 0.0 # set the starting sea level rise condition\n", + "sea_level_rise = 0.0 # set the starting sea level rise condition\n", + "rise_increment = 0.25 # set the increment of sea level rise for each iteration\n", "\n", "# set the outfall type and initial outfall stage elevation\n", - "baseline.inp.outfalls.loc[:, 'OutfallType'] = 'FIXED'\n", - "baseline.inp.outfalls.loc[:, 'StageOrTimeseries'] = 576\n", + "model.inp.outfalls.loc[:, 'OutfallType'] = 'FIXED'\n", + "model.inp.outfalls.loc[:, 'StageOrTimeseries'] = 576\n", "\n", "# create models up to 5ft of sea level rise.\n", - "while rise <= 5:\n", + "while sea_level_rise < 5:\n", "\n", " # create a dataframe of the model's outfalls\n", - " outfalls = baseline.inp.outfalls\n", - "\n", + " outfalls = model.inp.outfalls\n", " # add the current rise to the outfalls' stage elevation\n", - " outfalls.loc[:, 'StageOrTimeseries'] = outfalls.loc[:, 'StageOrTimeseries'] + rise\n", - " baseline.inp.outfalls = outfalls\n", + " outfalls.loc[:, 'StageOrTimeseries'] = outfalls.loc[:, 'StageOrTimeseries'] + rise_increment\n", + " model.inp.outfalls = outfalls\n", " \n", " # create the filename for the new model\n", - " newfilepath = os.path.join(baseline.inp.dir, f'{baseline.inp.name}_{rise}_SLR.inp')\n", + " newfilepath = os.path.join(model.inp.dir, f'{model.inp.name}_{sea_level_rise}_SLR.inp')\n", " \n", " # Overwrite the OUTFALLS section of the new model with the adjusted data\n", - " baseline.inp.save(newfilepath)\n", + " model.inp.save(newfilepath)\n", "\n", " # increase sea level rise for the next loop\n", - " rise += 0.25\n", + " sea_level_rise += rise_increment\n", "\n", - "# check the outfalls of the last SLR scneario\n", - "model = swmmio.Model(newfilepath)\n", - "model.inp.outfalls" + "# check the outfalls of the last sea level rise \n", + "# scenario that includes 5 feet of sea level rise\n", + "model_slr_5 = swmmio.Model(newfilepath)\n", + "model_slr_5.inp.outfalls" ] }, { @@ -496,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -598,8 +640,9 @@ "KRO1002 POINT (1362361.78 429189.37) " ] }, + "execution_count": 14, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -628,7 +671,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -653,12 +696,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] diff --git a/docs/usage/visualizing_models.ipynb b/docs/usage/visualizing_models.ipynb index a6727a2..b9e594c 100644 --- a/docs/usage/visualizing_models.ipynb +++ b/docs/usage/visualizing_models.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Geospatial Visualization of SWMM Networks\n", + "# Spatial Visualization of SWMM Models\n", "Let's explore how we can quickly visualize SWMM models using swmmio and some other familiar tools. We'll start by instantiating a larger model hosted in the [NCIMM-White-Box-Testing](https://github.com/SWMMEnablement/NCIMM-White-Box-Testing) repository. Note that we can do the same with models stored locally on your system." ] }, diff --git a/docs/usage/working_with_pyswmm.ipynb b/docs/usage/working_with_pyswmm.ipynb index 206e6e9..0ae868d 100644 --- a/docs/usage/working_with_pyswmm.ipynb +++ b/docs/usage/working_with_pyswmm.ipynb @@ -6,14 +6,24 @@ "source": [ "# Working with PySWMM\n", "\n", - "If we _really_ want to supercharge our modeling workflow, we can tap into the excellent functionality provided by [pyswmm](https://www.pyswmm.org/). Here we'll walk through a simple example that runs a model with pyswmm and post-processes the results with `swmmio`.\n", + "If we _really_ want to supercharge our modeling workflow, we can tap into the excellent functionality provided by [pyswmm](https://www.pyswmm.org/). \n", "\n", + ":::{note}\n", + "## pyswmm and swmmio | what's the difference?\n", + "Generally speaking, we can use pyswmm to interact with the running simulation, implement control logic in Python, and edit of network and hydrologic parameters, all of which can be done without manipulating the *.inp file. \n", + "\n", + "In contrast, swmmio provides functionality to read the *.inp and *.rpt files and manipulate the *.inp files, which is useful for programmatically generating models, post-processing results, and extracting model data for use in other applications. \n", + ":::\n", + "\n", + "We won't get into the details of pyswmm here (see the official [pyswmm docs](https://pyswmm.github.io/pyswmm/) for that). Here we'll walk through a simple example that runs a model with pyswmm and post-processes the results with `swmmio`. \n", + "\n", + "## Instantiate a swmmio.Model\n", "We'll start by instantiating a `swmmio.Model` with a model hosted in the swmm-nrtestsuite repo." ] }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -30,7 +40,7 @@ " 'invert_range': np.int64(35)}" ] }, - "execution_count": 64, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -50,12 +60,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we'll opening a {py:obj}`pyswmm.simulation.Simulation` context to run the model. At each simulation step, we'll store the flows at each link. When the simulation is done, we'll plots things in a simple timeseries chart." + "## Extract links flows pyswmm.Simulation\n", + "Next, we'll open a {py:obj}`pyswmm.simulation.Simulation` context to run the model. At each simulation step, we'll store the flows at each link, using swmmio to refer to each link id. When the simulation is done, we'll plots things in a simple timeseries chart." ] }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -64,7 +75,7 @@ "" ] }, - "execution_count": 68, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, @@ -111,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -302,42 +313,42 @@ "\n", "\n", "
\n", - " \n", + " \n", "
\n", - " \n", + " oninput=\"anim40d97301220a480d89b94945f2657e6d.set_frame(parseInt(this.value));\">\n", "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", "
\n", - "
\n", - " \n", - " \n", - " Once\n", + " \n", - " \n", - " Loop\n", + " \n", - " \n", + " \n", "
\n", "
\n", "
\n", @@ -347,9 +358,9 @@ " /* Instantiate the Animation class. */\n", " /* The IDs given should match those used in the template above. */\n", " (function() {\n", - " var img_id = \"_anim_img3a8d7284799c4b41be696fd04b8f745d\";\n", - " var slider_id = \"_anim_slider3a8d7284799c4b41be696fd04b8f745d\";\n", - " var loop_select_id = \"_anim_loop_select3a8d7284799c4b41be696fd04b8f745d\";\n", + " var img_id = \"_anim_img40d97301220a480d89b94945f2657e6d\";\n", + " var slider_id = \"_anim_slider40d97301220a480d89b94945f2657e6d\";\n", + " var loop_select_id = \"_anim_loop_select40d97301220a480d89b94945f2657e6d\";\n", " var frames = new Array(74);\n", " \n", " frames[0] = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\\\n", @@ -16983,7 +16994,7 @@ " /* set a timeout to make sure all the above elements are created before\n", " the object is initialized. */\n", " setTimeout(function() {\n", - " anim3a8d7284799c4b41be696fd04b8f745d = new Animation(frames, img_id, slider_id, 33,\n", + " anim40d97301220a480d89b94945f2657e6d = new Animation(frames, img_id, slider_id, 33,\n", " loop_select_id);\n", " }, 0);\n", " })()\n", @@ -16993,7 +17004,7 @@ "" ] }, - "execution_count": 82, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } diff --git a/swmmio/__init__.py b/swmmio/__init__.py index ba51438..9fa9f31 100644 --- a/swmmio/__init__.py +++ b/swmmio/__init__.py @@ -14,5 +14,5 @@ VERSION_INFO = (0, 7, 4, 'dev0') __version__ = '.'.join(map(str, VERSION_INFO)) __author__ = 'Adam Erispaha' -__copyright__ = 'Copyright (c) 2024' +__copyright__ = 'Copyright (c) 2025' __licence__ = ''