Skip to main content

SWMM5 calls from python

Project description

SWMM5 Python calling interface (c) Assela Pathirana Released under GNU GPL v.3

Installation:

Windows:

Use the SWMM5-x.y.z.k.win32.exe file downloaded from the respository for click and install.

Alternatively SWMM5-x.y.z.k.zip can be used to install as

python setup.py install
Linux:

Download SWMM5-x.y.z.k.zip can be used to install as

python setup.py install

Usage:

New Interface:

One should always use the new interface. The old interface (below) is left only for backward compatibility. The key features of new interface are
  • More pythonic interface

  • A number of convienience functions

Import new interface and run SWMM

>>> from swmm5.swmm5tools import SWMM5Simulation
>>> st=SWMM5Simulation("swmm5/examples/simple/swmm5Example.inp")
Example 1:

Retrive simulation properties.

>>> st.SWMM5_Version()          # Version of underlying SWMM5 engine.
'5.0.021'
>>> st.SWMM5_VERSION            # same thing as an integer
50021
>>> st.Flow_Units()           # Flow units.
'LPS'
>>> st.SWMM_FlowUnits         # returns flow units as an index.  0 = CFS, 1 = GPM, 2 = MGD, 3 = CMS, 4 = LPS, and 5 = LPD
4
>>> st.SWMM_Nperiods          # number of reporting periods
360
>>> st.SWMM_Nsubcatch         # number of subcatchments
6
>>> st.SWMM_Nnodes            # number of drainage system nodes
12
>>> st.SWMM_Nlinks            # number of drainage system links
11
>>> st.SWMM_Npolluts          # number of pollutants tracked
0
>>> print ("%.2f"%st.SWMM_StartDate)  # start date of simulation
40844.00
>>> st.SWMM_ReportStep
60
>>>
Example 2:

Prints available entities

>>> st.entityList()
['SUBCATCH', 'NODE', 'LINK', 'SYS']
>>> st.Subcatch()
['A2', 'A1', 'A3', 'A4', 'A5', 'E1']
>>> st.Node()
['J1', 'J2', 'J3', 'J4', 'J5', 'J6', 'J7', 'J8', 'J9', 'J10', 'J11', 'J12']
>>> st.Link()
['T4-1', 'T4-2', 'T4-3', 'T1-1', 'T1-2', 'T2-1', 'T2-2', 'T2-3', 'T3-1', 'T3-2', 'T5']
>>> st.Sys()
['SYS']
>>> st.Pollutants() # no pollutants in this file.
[]
>>> wq=SWMM5Simulation("swmm5/examples/waterquality/Example5-EXP.inp")
>>> wq.SWMM_Npolluts
1
>>> wq.Pollutants() # no pollutants in this file.
['TSS']
>>> lst=st.varList("SUBCATCH")
>>> print ("\n".join( "%4i %s"% (i,v) for i,v in  enumerate(lst))) # print in a column with index.
   0 Rainfall (in/hr or mm/hr)
   1 Snow depth (in or mm)
   2 Evaporation + infiltration losses (in/hr or mm/hr)
   3 Runoff rate (flow units)
   4 Groundwater outflow rate (flow units)
   5 Groundwater water table elevation (ft or m)
>>> lst=wq.varList("SUBCATCH") # for the network that has pollutants.
>>> print ("\n".join( "%4i %s"% (i,v) for i,v in  enumerate(lst))) # print in a column with index.
   0 Rainfall (in/hr or mm/hr)
   1 Snow depth (in or mm)
   2 Evaporation + infiltration losses (in/hr or mm/hr)
   3 Runoff rate (flow units)
   4 Groundwater outflow rate (flow units)
   5 Groundwater water table elevation (ft or m)
   6 Runoff concentration of TSS (mg/l)

>>> lst=wq.varList("NODE")
>>> print ("\n".join( "%4i %s"% (i,v) for i,v in  enumerate(lst))) # print in a column with index.
   0 Depth of water above invert (ft or m)
   1 Hydraulic head (ft or m)
   2 Volume of stored + ponded water (ft3 or m3)
   3 Lateral inflow (flow units)
   4 Total inflow (lateral + upstream) (flow units)
   5 Flow lost to flooding (flow units)
   6 Concentration of TSS (mg/l)
>>> lst=wq.varList("LINK")
>>> print ("\n".join( "%4i %s"% (i,v) for i,v in  enumerate(lst))) # print in a column with index.
   0 Flow rate (flow units)
   1 Flow depth (ft or m)
   2 Flow velocity (ft/s or m/s)
   3 Froude number
   4 Capacity (fraction of conduit filled)
   5 Concentration of TSS (mg/l)
>>> lst=wq.varList("SYS")
>>> print ("\n".join( "%4i %s"% (i,v) for i,v in  enumerate(lst))) # print in a column with index.
   0 Air temperature (deg. F or deg. C)
   1 Rainfall (in/hr or mm/hr)
   2 Snow depth (in or mm)
   3 Evaporation + infiltration loss rate (in/hr or mm/hr)
   4 Runoff flow (flow units)
   5 Dry weather inflow (flow units)
   6 Groundwater inflow (flow units)
   7 RDII inflow (flow units)
   8 User supplied direct inflow (flow units)
   9 Total lateral inflow (sum of variables 4 to 8) (flow units)
  10 Flow lost to flooding (flow units)
  11 Flow leaving through outfalls (flow units)
  12 Volume of stored water (ft3 or m3)
  13 Evaporation rate (in/day or mm/day)
Example 3:

Results

>>> r=list(st.Results('NODE','J1', 4)) # total inflow into node "J1". The Results function returns a generator. We convert it to a list.
>>> print ("\n".join( "%5.2f"% (i) for i in  r[0:10])) # Lets print the first 10 items.
 0.00
 0.00
 0.00
 0.03
 3.32
13.71
28.17
45.93
64.62
83.10
>>> r=st.Results('SYS','SYS', 1)  #1 Rainfall (in/hr or mm/hr). This time we use the generator directly.
>>> print ("\n".join(["%5.2f"% (i) for i in  r]))  #doctest: +ELLIPSIS
 0.00
 0.00
 0.00
 7.20
 7.20
 7.20
 7.60
 7.60
 7.60
 8.00
 ...
 0.00
Example 4:

Pollutant Concentration

>>> wq.Subcatch()
['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7']
>>> r=list(wq.Results('SUBCATCH','S3', 6)) # total inflow into node "J1". The Results function returns a generator. We convert it to a list.
>>> print ("\n".join( "%5.2f"% (i) for i in  r[0:10])) # Lets print the first 10 items.
 0.00
 9.94
 9.99
10.00
10.00
10.00
13.45
14.11
14.71
15.24
Example 5:

Tracking output files

>>> simtemp=SWMM5Simulation("swmm5/examples/simple/swmm5Example.inp")
>>> f=simtemp.getFiles()
>>> f #doctest: +ELLIPSIS
['swmm5/examples/simple/swmm5Example.inp', '...swmm5Example....rpt', '...swmm5Example....dat']
>>> from os.path import isfile
>>> [isfile(x) for x in f] # do they exist in the operating system.
[True, True, True]
>>> simtemp.clean()
>>> [isfile(x) for x in f] # do they exist in the operating system.
[True, False, False]

Thread Safety

Calling SWMM5Simulation with input file as only argument (SWMM5Simulation will choose the report and binary output file names) and subsequent use of the object to retreive results is threadsafe to the degree I could verify.

There is a test test_multithreading.py in the test directory, which can be run to test this to some degree. It should be run as python test_multithreading.py.

Legacy interface

Note:

This is provided only for backward compatibility. Always use the new interface (above).

import swmm5 module

>>> from swmm5 import swmm5 as sw
>>>

run a sample network

>>> ret=sw.RunSwmmDll("./swmm5/examples/simple/swmm5Example.inp","swmm5Example.rpt","swmm5.dat")
>>>

should return 0 if everything is OK (according to to swmm convension)

>>> print (ret)
0
>>>

Now it is possible to retrive results. Open the swmm results file

>>> sw.OpenSwmmOutFile("swmm5.dat")
0
>>>

How many time steps are there?

>>> sw.cvar.SWMM_Nperiods
360
>>>

Let’s retrive rainfall in the system. Systems rainfall at fifth timestep

>>> ret,x=sw.GetSwmmResult(3,0,1,5)
>>> print ('%.2f' % x)
7.20
>>>

Acknowlegements

  • David Townshend

  • Tim Cera

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

SWMM5-1.0.0.0dev.zip (373.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

SWMM5-1.0.0.0dev.win-amd64-py3.3.exe (462.6 kB view details)

Uploaded Source

SWMM5-1.0.0.0dev.win-amd64-py2.7.exe (464.9 kB view details)

Uploaded Source

SWMM5-1.0.0.0dev.win32-py3.3.exe (387.3 kB view details)

Uploaded Source

SWMM5-1.0.0.0dev.win32-py2.7.exe (390.5 kB view details)

Uploaded Source

File details

Details for the file SWMM5-1.0.0.0dev.zip.

File metadata

  • Download URL: SWMM5-1.0.0.0dev.zip
  • Upload date:
  • Size: 373.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for SWMM5-1.0.0.0dev.zip
Algorithm Hash digest
SHA256 31ad00c9e19734a54a2846090fc7ae4ed78a9e5659642370e1ed57a465982ec3
MD5 180e0141854691c6d93dd1fc16213265
BLAKE2b-256 e3aa47a42b373720be5d646d4a230ba3024fedef73760441f8e33302f048b50a

See more details on using hashes here.

File details

Details for the file SWMM5-1.0.0.0dev.win-amd64-py3.3.exe.

File metadata

File hashes

Hashes for SWMM5-1.0.0.0dev.win-amd64-py3.3.exe
Algorithm Hash digest
SHA256 d6f295f66423693bd184327484c11a7f79a1eb8fc257988f952cbc6f66d51169
MD5 fa27bc272d355420bc7dfa1c6195a058
BLAKE2b-256 2f61f603ff738776035050ca5f5cc90bdbba6287346ca7e9d738d047033c01ab

See more details on using hashes here.

File details

Details for the file SWMM5-1.0.0.0dev.win-amd64-py2.7.exe.

File metadata

File hashes

Hashes for SWMM5-1.0.0.0dev.win-amd64-py2.7.exe
Algorithm Hash digest
SHA256 3c38cf1e49bb7133123db0d526bb1b1c0086bf28bdcad6a098dddf2cf9781015
MD5 912383c7d317e4282035a778b47db32c
BLAKE2b-256 8dbf3fd57e9fab10d25291ebf2fc12830c6d8cb86f5d69e2a2757c7b1e70dfa4

See more details on using hashes here.

File details

Details for the file SWMM5-1.0.0.0dev.win32-py3.3.exe.

File metadata

File hashes

Hashes for SWMM5-1.0.0.0dev.win32-py3.3.exe
Algorithm Hash digest
SHA256 a741979f27b82f91929cdd4c63ac37c434e83cfbb6ff27fca36ee78f02fb520c
MD5 d20ae6c59f5285fe0bcfab4edf90db84
BLAKE2b-256 6d95cd8fd9896450ffacb1ae4c3748c817e41b1a5769a5f9e2dd533d6e1af17a

See more details on using hashes here.

File details

Details for the file SWMM5-1.0.0.0dev.win32-py2.7.exe.

File metadata

File hashes

Hashes for SWMM5-1.0.0.0dev.win32-py2.7.exe
Algorithm Hash digest
SHA256 c8fbe2e790866ba64aec5e8d58fb19b6670caae3253cce7201627bb232f50b77
MD5 d90c6a2c0a851301e4c3bd8b6021a174
BLAKE2b-256 be2105d1ba7126b2d910f00f760a2ff1b099d5d2b5678a36c694243de72a88a4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page