Skip to content

Instantly share code, notes, and snippets.

@MarkusPic
Last active March 9, 2023 15:07
Show Gist options
  • Save MarkusPic/31ea2885056213e03e7a180317da2bd0 to your computer and use it in GitHub Desktop.
Save MarkusPic/31ea2885056213e03e7a180317da2bd0 to your computer and use it in GitHub Desktop.
SWMM Surface Runoff and Storage difference in RPT and OUT file

I have two models, the first model has one subcatchment and second has two subcatchments. The sum of impervious, pervious and impervious areas are equal for both models. I add an 10 mm constant rainfall with a duration of 1 hour.
The infiltration rate is set to 10 mm/h.
The storage for impervious areas is 5 mm.
The evaporation rate is set to 0 mm/day.
The sum of subcatchment areas is 100 ha with 50% impervious and 50% impervious with no storage.
This should result in 10.000 m³ rainfall, 5000 m³ infiltration loss, 1250 m³ stored volume in the impervious areas and 3750 m³ runoff.

[TITLE]
;;Project Title/Notes
[OPTIONS]
;;Option Value
FLOW_UNITS LPS
INFILTRATION HORTON
FLOW_ROUTING DYNWAVE
LINK_OFFSETS DEPTH
MIN_SLOPE 0
ALLOW_PONDING NO
SKIP_STEADY_STATE NO
START_DATE 01/01/2023
START_TIME 00:00:00
REPORT_START_DATE 01/01/2023
REPORT_START_TIME 00:00:00
END_DATE 01/01/2023
END_TIME 00:00:00
SWEEP_START 01/01
SWEEP_END 12/31
DRY_DAYS 0
REPORT_STEP 00:00:01
WET_STEP 00:00:01
DRY_STEP 00:00:01
ROUTING_STEP 0:00:01
RULE_STEP 00:00:00
INERTIAL_DAMPING PARTIAL
NORMAL_FLOW_LIMITED BOTH
FORCE_MAIN_EQUATION H-W
VARIABLE_STEP 0.75
LENGTHENING_STEP 0
MIN_SURFAREA 12.566
MAX_TRIALS 8
HEAD_TOLERANCE 0.005
SYS_FLOW_TOL 5
LAT_FLOW_TOL 5
MINIMUM_STEP 0.5
THREADS 1
[EVAPORATION]
;;Data Source Parameters
;;-------------- ----------------
CONSTANT 0.0
DRY_ONLY NO
[RAINGAGES]
;;Name Format Interval SCF Source
;;-------------- --------- ------ ------ ----------
RG VOLUME 1:00 1.0 TIMESERIES TS
[SUBCATCHMENTS]
;;Name Rain Gage Outlet Area %Imperv Width %Slope CurbLen SnowPack
;;-------------- ---------------- ---------------- -------- -------- -------- -------- -------- ----------------
SC RG OL 100 50 200 0.5 0
[SUBAREAS]
;;Subcatchment N-Imperv N-Perv S-Imperv S-Perv PctZero RouteTo PctRouted
;;-------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
SC 0.01 0.1 5 5 50 OUTLET
[INFILTRATION]
;;Subcatchment Param1 Param2 Param3 Param4 Param5
;;-------------- ---------- ---------- ---------- ---------- ----------
SC 10 10 4 7 0
[OUTFALLS]
;;Name Elevation Type Stage Data Gated Route To
;;-------------- ---------- ---------- ---------------- -------- ----------------
OL 0 FREE NO
[TIMESERIES]
;;Name Date Time Value
;;-------------- ---------- ---------- ----------
TS 1:00 10
TS 2:00 0
[REPORT]
;;Reporting Options
SUBCATCHMENTS ALL
NODES ALL
LINKS ALL
[COORDINATES]
;;Node X-Coord Y-Coord
;;-------------- ------------------ ------------------
OL 11 14
[VERTICES]
;;Link X-Coord Y-Coord
;;-------------- ------------------ ------------------
[Polygons]
;;Subcatchment X-Coord Y-Coord
;;-------------- ------------------ ------------------
SC 10 12
SC 10 2
SC 0 2
SC 0 12
[SYMBOLS]
;;Gage X-Coord Y-Coord
;;-------------- ------------------ ------------------
RG 11 0
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"from pprint import pprint\n",
"import pandas as pd\n",
"\n",
"from swmm_api import SwmmOutput, SwmmInput, SwmmReport, CONFIG\n",
"from swmm_api.output_file import OBJECTS, VARIABLES\n",
"from swmm_api.run_swmm.run_epaswmm import swmm5_run_epa, get_swmm_version_epa"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"source": [
"setting default SWMM exe"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 2,
"outputs": [],
"source": [
"CONFIG['exe_path'] = r\"C:\\Program Files\\EPA SWMM 5.2.3 (64-bit)\\runswmm.exe\""
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"# SWMM and _swmm_api_ versions"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 3,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"swmm-api==0.4.7\n"
]
}
],
"source": [
"from swmm_api import __version__\n",
"\n",
"print(f'swmm-api=={__version__}')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 4,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SWMM Version: 5.2.3\n"
]
}
],
"source": [
"print(f'SWMM Version: {get_swmm_version_epa()}')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 5,
"outputs": [],
"source": [
"# from swmm_api.run_swmm import swmm5_run_owa\n",
"# from swmm.toolkit import __version__, solver\n",
"#\n",
"# print(f'swmm-toolkit=={__version__}')\n",
"#\n",
"# print(f'SWMM Version: {solver.swmm_version_info()}')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"# Analyzing model and single simulation run"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"inp = SwmmInput(\"one_sc.inp\")\n",
"inp.OPTIONS.set_ignore_routing(True)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"outputs": [
{
"data": {
"text/plain": "('.\\\\one_sc.rpt', '.\\\\one_sc.out')"
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"swmm5_run_epa('one_sc.inp')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 9,
"outputs": [],
"source": [
"rpt = SwmmReport(\"one_sc.rpt\")"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": "{ 'SC': SubCatchment(name='SC', rain_gage='RG', outlet='OL', area=100.0, imperviousness=50.0, width=200.0, slope=0.5, curb_length=0.0, snow_pack=nan)}"
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"inp.SUBCATCHMENTS"
]
},
{
"cell_type": "markdown",
"source": [
"## Surface Runoff based on the .out-file"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 11,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Surface Runoff based on the .out-file: mm = 3.4207 | ha_m = 0.3421\n"
]
}
],
"source": [
"with SwmmOutput(\"one_sc.out\") as out:\n",
" df = out.get_part(OBJECTS.SYSTEM, None, [VARIABLES.SYSTEM.RAINFALL, VARIABLES.SYSTEM.INFILTRATION, VARIABLES.SYSTEM.RUNOFF])\n",
"\n",
" ts = out.get_part(OBJECTS.SYSTEM, None, VARIABLES.SYSTEM.RUNOFF) # L/s\n",
" reporting_step = out.report_interval / pd.Timedelta(seconds=1) # s\n",
" liter = ts.sum() * reporting_step\n",
" area = sum(i['area'] for i in out.model_properties['subcatchment'].values())\n",
" mm = liter / area * 1e-4\n",
" ha_m = mm / 10 # [ha*m]\n",
"print(f'Surface Runoff based on the .out-file: {mm = :0.4f} | {ha_m = :0.4f}')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"## Surface Runoff based on the .rpt-file"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 12,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'Continuity Error (%)': -0.001,\n",
" 'Evaporation Loss': {'Depth_mm': 0.0, 'Volume_hectare-m': 0.0},\n",
" 'Final Storage': {'Depth_mm': 1.289, 'Volume_hectare-m': 0.129},\n",
" 'Infiltration Loss': {'Depth_mm': 5.0, 'Volume_hectare-m': 0.5},\n",
" 'Surface Runoff': {'Depth_mm': 3.711, 'Volume_hectare-m': 0.371},\n",
" 'Total Precipitation': {'Depth_mm': 10.0, 'Volume_hectare-m': 1.0}}\n"
]
}
],
"source": [
"pprint(rpt.runoff_quantity_continuity)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ************************** Volume Depth\n",
" Runoff Quantity Continuity hectare-m mm\n",
" ************************** --------- -------\n",
" Total Precipitation ...... 1.000 10.000\n",
" Evaporation Loss ......... 0.000 0.000\n",
" Infiltration Loss ........ 0.500 5.000\n",
" Surface Runoff ........... 0.371 3.711\n",
" Final Storage ............ 0.129 1.289\n",
" Continuity Error (%) ..... -0.001\n"
]
}
],
"source": [
"print(rpt._raw_parts['Runoff Quantity Continuity'])"
]
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Die Einheit von Rainfall und Infiltration ist mm/hr\n",
"mm = L/m²\n",
"\n",
"ha*m = 10^4 * m³\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"df[[VARIABLES.SUBCATCHMENT.RAINFALL, VARIABLES.SUBCATCHMENT.INFILTRATION]] *= area * 1e4 / 60 / 60 # mm/hr -> L/s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Summe von L/s Werte zu m³"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": "rainfall 10000.000000\ninfiltration 5000.000000\nrunoff 3420.677967\ndtype: float64"
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum_m3 = df.sum() * (out.report_interval / pd.Timedelta(seconds=1)) / 1000\n",
"sum_m3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Kontrolle: Niederschlagsmenge auf SC\n",
"\n",
"10 mm auf 100 ha = 10_000_000 L = 10_000 m³"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"cumsum_m3 = df.cumsum() * (out.report_interval / pd.Timedelta(seconds=1)) / 1000\n",
"surface_storage = cumsum_m3.eval('rainfall - infiltration - runoff')\n",
"\n",
"df_ = df.copy()\n",
"df_['storage'] = surface_storage"
]
},
{
"cell_type": "code",
"execution_count": 17,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"volume_full_impervious_storage = 1250.0 m³\n"
]
}
],
"source": [
"area = inp.SUBCATCHMENTS['SC'].area # ha\n",
"imperviousness = inp.SUBCATCHMENTS['SC'].imperviousness # %\n",
"\n",
"area_imperviousness = area * imperviousness/100 # ha\n",
"\n",
"pct_no_storage = inp.SUBAREAS['SC'].pct_zero # %\n",
"\n",
"storage_perv = inp.SUBAREAS['SC'].storage_perv # mm\n",
"storage_impervious = inp.SUBAREAS['SC'].storage_imperv # mm\n",
"\n",
"area_imperviousness_no_storage = area_imperviousness * pct_no_storage/100 # ha\n",
"area_imperviousness_with_storage = area_imperviousness - area_imperviousness_no_storage # ha\n",
"\n",
"volume_full_impervious_storage = area_imperviousness_with_storage * storage_impervious * 10\n",
"print(f'{volume_full_impervious_storage = } m³')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 18,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Precise Runoff volume 3750.0 m³\n"
]
}
],
"source": [
"runoff_volume_m3_ = sum_m3['rainfall'] - sum_m3['infiltration'] - volume_full_impervious_storage\n",
"print(f'Precise Runoff volume {runoff_volume_m3_:0.1f} m³')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"# Map plot"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 19,
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from swmm_api.input_file.macros import plot_map, add_node_labels\n",
"\n",
"fig, ax = plot_map(inp)\n",
"add_node_labels(ax, inp)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"The runoff after 17:07 turns to zero."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"# Timeseries + plot"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"pycharm": {
"name": "#%%timeit -r 1 -c -p 2\n"
}
},
"outputs": [
{
"data": {
"text/plain": " rainfall infiltration runoff storage\n2023-03-03 17:00:00 0.0 0.0 7.164213 1582.336530\n2023-03-03 17:00:10 0.0 0.0 7.161631 1582.264902\n2023-03-03 17:00:20 0.0 0.0 7.159050 1582.193300\n2023-03-03 17:00:30 0.0 0.0 7.156468 1582.121724\n2023-03-03 17:00:40 0.0 0.0 7.153886 1582.050174\n... ... ... ... ...\n2023-03-03 17:29:20 0.0 0.0 0.000000 1579.322033\n2023-03-03 17:29:30 0.0 0.0 0.000000 1579.322033\n2023-03-03 17:29:40 0.0 0.0 0.000000 1579.322033\n2023-03-03 17:29:50 0.0 0.0 0.000000 1579.322033\n2023-03-03 17:30:00 0.0 0.0 0.000000 1579.322033\n\n[181 rows x 4 columns]",
"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>rainfall</th>\n <th>infiltration</th>\n <th>runoff</th>\n <th>storage</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2023-03-03 17:00:00</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>7.164213</td>\n <td>1582.336530</td>\n </tr>\n <tr>\n <th>2023-03-03 17:00:10</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>7.161631</td>\n <td>1582.264902</td>\n </tr>\n <tr>\n <th>2023-03-03 17:00:20</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>7.159050</td>\n <td>1582.193300</td>\n </tr>\n <tr>\n <th>2023-03-03 17:00:30</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>7.156468</td>\n <td>1582.121724</td>\n </tr>\n <tr>\n <th>2023-03-03 17:00:40</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>7.153886</td>\n <td>1582.050174</td>\n </tr>\n <tr>\n <th>...</th>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n </tr>\n <tr>\n <th>2023-03-03 17:29:20</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.000000</td>\n <td>1579.322033</td>\n </tr>\n <tr>\n <th>2023-03-03 17:29:30</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.000000</td>\n <td>1579.322033</td>\n </tr>\n <tr>\n <th>2023-03-03 17:29:40</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.000000</td>\n <td>1579.322033</td>\n </tr>\n <tr>\n <th>2023-03-03 17:29:50</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.000000</td>\n <td>1579.322033</td>\n </tr>\n <tr>\n <th>2023-03-03 17:30:00</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.000000</td>\n <td>1579.322033</td>\n </tr>\n </tbody>\n</table>\n<p>181 rows × 4 columns</p>\n</div>"
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_.loc['2023-03-03 17:00:00':'2023-03-03 17:30:00':10]"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 4 Axes>",
"image/png": "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IAYMGIDk5GS8++67mDx5MpKSkuyOsWvXLgwbNgxJSUmIiYnByJEjUVJSUuMaGBaJiIiI7sCiRYvQo0ePCuv/+c9/4t5778WTTz4JAJDJZNi9e7dDx1apVOjYsSMWLlyIESNGoKioyLYtICAAOp0Oc+fOxT333INRo0ahS5cu2L9/v90xunbtiieffBKdO3fGkiVLcPnyZfzxxx81roFhkYiIiOgOJCQkYNu2bXbrvv/+e2zbtg0ffvhhlZ/bs2cP3Nzc7F579uyx28dgMODVV1/Fgw8+iO7du9v1CFosFrzxxhsICQmBWq2GWq1GUlISDAaD3TH8/f1t7wMCAvD++++jSZMmNf5+fDY0ERER0R1QKpXQarV267777jsMGzYMbdu2rfJz3bp1w6lTp+zWNW/e3G5ZEAQMGDAAAwYMsC1brVixAmvXrsWaNWsQGhoKAPjHP/5x23qnTp16231uxrBIREREVAtarRY5OTm2Zet7b29vCIKAb775BuvXr6/y856enoiOjq71+Y8fP47Y2Fj069fPts56mx1nYlgkIiIiqoX4+HgsXLgQbdu2RWhoKGbPno2wsDB06tQJ//73vyv04HXo0MGp5+/QoQPeeust/PDDD2jRogW++eYbZGdnO/UcAMMiERERUa1Mnz4dBoMBL730EvLy8tC9e3ds3boVSqUSoaGhtqHhujJ+/HgcO3YMY8aMgVwux8SJE9GxY0enn0cm3Dz4TURERER0E86GJiIiIqIqMSwSERERUZUYFomIiIioSgyLRERERFQlhkUiIiIiqhLDIhERERFViWGRiIiIiKrEsEhEREREVWJYJCIiIqIqMSwSERERUZUYFomIiIioSv8fFQZi778fht4AAAAASUVORK5CYII=\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"axes = df_.loc[:'2023-03-04 00:00:00'].plot(subplots=True)\n",
"_ = axes[2].annotate('?!?',\n",
" xy=('2023-03-03 17:07', 0.7),\n",
" xytext=('2023-03-03 17:07', 200), arrowprops=dict(arrowstyle=\"->\"))"
]
},
{
"cell_type": "markdown",
"source": [
"# Comparing changes with different options"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 36,
"outputs": [],
"source": [
"def get_runoff_out_file(fn):\n",
" with SwmmOutput(fn) as out:\n",
" ts = out.get_part(OBJECTS.SYSTEM, None, VARIABLES.SYSTEM.RUNOFF) # L/s\n",
" reporting_step = out.report_interval / pd.Timedelta(seconds=1)\n",
" liter = ts.rolling(2).mean().sum() * reporting_step\n",
" area = sum(i['area'] for i in out.model_properties['subcatchment'].values())\n",
" mm = liter / area * 1e-4\n",
" # ha_m = mm / 10 # [ha*m]\n",
" return mm"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 23,
"outputs": [],
"source": [
"def run_temp_print_results(inp, option, value):\n",
" inp.OPTIONS[option] = value\n",
" inp.write_file('temp.inp')\n",
" swmm5_run_epa('temp.inp')\n",
" # swmm5_run_owa('temp.inp')\n",
" rpt = SwmmReport('temp.rpt')\n",
" print(f'{value:^{len(option)}} | {rpt.runoff_quantity_continuity[\"Surface Runoff\"][\"Depth_mm\"]:^35} | {get_runoff_out_file(\"temp.out\"):^18.4f}')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 24,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"REPORT_STEP | rpt-file runoff_quantity_continuity | runoff in out-file\n",
" 1 | 3.711 | 3.6775 \n",
" 2 | 3.711 | 4.4733 \n",
" 3 | 3.711 | 3.3289 \n",
" 4 | 3.711 | 2.6201 \n"
]
}
],
"source": [
"option = 'REPORT_STEP'\n",
"print(f'{option} | rpt-file runoff_quantity_continuity | runoff in out-file')\n",
"for value in (1, 2, 3, 4):\n",
" run_temp_print_results(inp, option, value)\n",
"\n",
"inp.OPTIONS[option] = 1"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 25,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"constant evaporation of 1 mm/day\n",
"END_DATE | rpt-file runoff_quantity_continuity | runoff in out-file\n",
"03/03/2023 | 2.511 | 2.8505 \n",
"03/04/2023 | 3.242 | 3.3847 \n",
"03/05/2023 | 3.242 | 3.3847 \n",
"03/06/2023 | 3.242 | 3.3847 \n",
"03/07/2023 | 3.242 | 3.3847 \n"
]
}
],
"source": [
"from swmm_api.input_file.sections import EvaporationSection\n",
"\n",
"option = 'END_DATE'\n",
"print('constant evaporation of 1 mm/day')\n",
"print(f'{option} | rpt-file runoff_quantity_continuity | runoff in out-file')\n",
"inp.EVAPORATION[EvaporationSection.KEYS.CONSTANT] = 1\n",
"\n",
"\n",
"for value in ('03/03/2023', '03/04/2023', '03/05/2023', '03/06/2023', '03/07/2023',):\n",
" run_temp_print_results(inp, option, value)\n",
"\n",
"inp.OPTIONS[option] = '03/12/2023'\n",
"inp.EVAPORATION[EvaporationSection.KEYS.CONSTANT] = 0"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 26,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"END_DATE | rpt-file runoff_quantity_continuity | runoff in out-file\n",
"03/03/2023 | 2.567 | 2.9145 \n",
"03/04/2023 | 3.597 | 3.6775 \n",
"03/05/2023 | 3.684 | 3.6775 \n",
"03/06/2023 | 3.711 | 3.6775 \n",
"03/07/2023 | 3.724 | 3.6775 \n",
"03/13/2023 | 3.743 | 3.6775 \n",
"03/23/2023 | 3.747 | 3.6775 \n",
"04/03/2023 | 3.749 | 3.6775 \n"
]
}
],
"source": [
"option = 'END_DATE'\n",
"print(f'{option} | rpt-file runoff_quantity_continuity | runoff in out-file')\n",
"for value in ('01/02/2023', '01/04/2023', '01/05/2023', '01/06/2023', '01/07/2023','01/13/2023','01/23/2023','02/01/2023'):\n",
" run_temp_print_results(inp, option, value)\n",
"\n",
"inp.OPTIONS[option] = '03/12/2023'"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 27,
"outputs": [],
"source": [
"# option = 'ROUTING_STEP'\n",
"# print(f'{option} | rpt-file runoff_quantity_continuity | runoff in out-file')\n",
"# for value in (1, 5, 10, 20, 60):\n",
"# run_temp_print_results(inp, option, value)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 28,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WET_STEP | rpt-file runoff_quantity_continuity | runoff in out-file\n",
"00:00:01 | 3.74 | 3.6757 \n",
"00:01:00 | 3.742 | 3.6775 \n",
"01:00:00 | 3.987 | 3.6769 \n"
]
}
],
"source": [
"option = 'WET_STEP'\n",
"print(f'{option} | rpt-file runoff_quantity_continuity | runoff in out-file')\n",
"for value in ('00:00:01', '00:01:00', '01:00:00',):\n",
" run_temp_print_results(inp, option, value)\n",
"\n",
"inp.OPTIONS[option] = '00:01:00'"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 29,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DRY_STEP | rpt-file runoff_quantity_continuity | runoff in out-file\n",
"00:00:01 | 3.742 | 3.6775 \n",
"00:01:00 | 3.742 | 3.6775 \n",
"01:00:00 | 3.742 | 3.6775 \n"
]
}
],
"source": [
"option = 'DRY_STEP'\n",
"print(f'{option} | rpt-file runoff_quantity_continuity | runoff in out-file')\n",
"for value in ('00:00:01', '00:01:00', '01:00:00',):\n",
" run_temp_print_results(inp, option, value)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 30,
"outputs": [],
"source": [
"os.remove('temp.inp')\n",
"os.remove('temp.rpt')\n",
"os.remove('temp.out')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"# Comparing one SC with two SC in the .inp-file"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 41,
"outputs": [],
"source": [
"inp = SwmmInput(\"one_sc.inp\")\n",
"inp2 = SwmmInput(\"two_sc.inp\")\n",
"# inp2.OPTIONS['REPORT_STEP'] = 1\n",
"# inp2.OPTIONS['END_DATE'] = '03/12/2023'\n",
"# inp2.OPTIONS['WET_STEP'] = '00:00:01'\n",
"# inp2.OPTIONS.set_ignore_routing(True)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 43,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"____________\n",
"END_DATE = 01/02/2023\n",
"ONE SC | 3.542 | 3.4206\n",
"TWO SC | 3.667 | 3.5325\n",
"\n",
"____________\n",
"END_DATE = 01/05/2023\n",
"ONE SC | 3.721 | 3.4206\n",
"TWO SC | 3.739 | 3.5325\n",
"\n",
"____________\n",
"END_DATE = 01/10/2023\n",
"ONE SC | 3.741 | 3.4206\n",
"TWO SC | 3.747 | 3.5325\n",
"\n",
"____________\n",
"END_DATE = 01/20/2023\n",
"ONE SC | 3.747 | 3.4206\n",
"TWO SC | 3.749 | 3.5325\n",
"\n",
"____________\n",
"END_DATE = 02/01/2023\n",
"ONE SC | 3.749 | 3.4206\n",
"TWO SC | 3.75 | 3.5325\n"
]
}
],
"source": [
"option = 'END_DATE'\n",
"for value in ('01/02/2023', '01/05/2023', '01/10/2023', '01/20/2023', '02/01/2023'):\n",
" inp.OPTIONS[option] = value\n",
" inp.write_file('temp.inp')\n",
" swmm5_run_epa('temp.inp')\n",
" rpt = SwmmReport('temp.rpt')\n",
"\n",
" inp2.OPTIONS[option] = value\n",
" inp2.write_file('temp2.inp')\n",
" swmm5_run_epa('temp2.inp')\n",
" print(f'\\n____________\\n{option} = {value}')\n",
" rpt2 = SwmmReport('temp2.rpt')\n",
"\n",
" print(\n",
" f'ONE SC | {rpt.runoff_quantity_continuity[\"Surface Runoff\"][\"Depth_mm\"]} | {get_runoff_out_file(\"temp.out\"):0.4f}')\n",
" print(\n",
" f'TWO SC | {rpt2.runoff_quantity_continuity[\"Surface Runoff\"][\"Depth_mm\"]} | {get_runoff_out_file(\"temp2.out\"):0.4f}')\n",
"\n",
"os.remove('temp.inp')\n",
"os.remove('temp.rpt')\n",
"os.remove('temp.out')\n",
"\n",
"os.remove('temp2.inp')\n",
"os.remove('temp2.rpt')\n",
"os.remove('temp2.out')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.8"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
[TITLE]
;;Project Title/Notes
[OPTIONS]
;;Option Value
FLOW_UNITS LPS
INFILTRATION HORTON
FLOW_ROUTING DYNWAVE
LINK_OFFSETS DEPTH
MIN_SLOPE 0
ALLOW_PONDING NO
SKIP_STEADY_STATE NO
START_DATE 01/01/2023
START_TIME 00:00:00
REPORT_START_DATE 01/01/2023
REPORT_START_TIME 00:00:00
END_DATE 01/01/2023
END_TIME 00:00:00
SWEEP_START 01/01
SWEEP_END 12/31
DRY_DAYS 0
REPORT_STEP 00:00:01
WET_STEP 00:00:01
DRY_STEP 00:00:01
ROUTING_STEP 0:00:01
RULE_STEP 00:00:00
INERTIAL_DAMPING PARTIAL
NORMAL_FLOW_LIMITED BOTH
FORCE_MAIN_EQUATION H-W
VARIABLE_STEP 0.75
LENGTHENING_STEP 0
MIN_SURFAREA 12.566
MAX_TRIALS 8
HEAD_TOLERANCE 0.005
SYS_FLOW_TOL 5
LAT_FLOW_TOL 5
MINIMUM_STEP 0.5
THREADS 1
[EVAPORATION]
;;Data Source Parameters
;;-------------- ----------------
CONSTANT 0.0
DRY_ONLY NO
[RAINGAGES]
;;Name Format Interval SCF Source
;;-------------- --------- ------ ------ ----------
RG VOLUME 1:00 1.0 TIMESERIES TS
[SUBCATCHMENTS]
;;Name Rain Gage Outlet Area %Imperv Width %Slope CurbLen SnowPack
;;-------------- ---------------- ---------------- -------- -------- -------- -------- -------- ----------------
SC1 RG OL 50 50 200 0.5 0
SC2 RG OL 50 50 200 0.5 0
[SUBAREAS]
;;Subcatchment N-Imperv N-Perv S-Imperv S-Perv PctZero RouteTo PctRouted
;;-------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
SC1 0.01 0.1 5 5 50 OUTLET
SC2 0.01 0.1 5 5 50 OUTLET
[INFILTRATION]
;;Subcatchment Param1 Param2 Param3 Param4 Param5
;;-------------- ---------- ---------- ---------- ---------- ----------
SC1 10 10 4 7 0
SC2 10 10 4 7 0
[OUTFALLS]
;;Name Elevation Type Stage Data Gated Route To
;;-------------- ---------- ---------- ---------------- -------- ----------------
OL 0 FREE NO
[TIMESERIES]
;;Name Date Time Value
;;-------------- ---------- ---------- ----------
TS 1:00 10
TS 2:00 0
[REPORT]
;;Reporting Options
SUBCATCHMENTS ALL
NODES ALL
LINKS ALL
[COORDINATES]
;;Node X-Coord Y-Coord
;;-------------- ------------------ ------------------
OL 11 14
[VERTICES]
;;Link X-Coord Y-Coord
;;-------------- ------------------ ------------------
[Polygons]
;;Subcatchment X-Coord Y-Coord
;;-------------- ------------------ ------------------
SC1 10 12
SC1 10 2
SC1 0 2
SC1 0 12
SC2 22 12
SC2 22 2
SC2 12 2
SC2 12 12
[SYMBOLS]
;;Gage X-Coord Y-Coord
;;-------------- ------------------ ------------------
RG 11 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment