aquaswmm
Storm sewer hydrology and hydraulics for Python: Rational method, Manning, standard-step HGL/EGL backwater, and HEC-22 inlets. The same Rust engine that powers the StormSewer desktop app, exposed as a native extension — no Python dependencies, no server.
pip install aquaswmm
SWMM models: edit, run, read results
The same readers the AquaSWMM desktop app uses, so a script and the app agree on column names, run validity, and every number read back.
import aquaswmm as aq
import pandas as pd
m = aq.Model.open("site.inp")
pd.DataFrame(m.table("CONDUITS")) # every row, by column name
m.get("CONDUITS", "C1", "Roughness") # '0.013'
m.set("CONDUITS", "C1", "Roughness", 0.015)
m.set_option("ROUTING_STEP", "0:00:05")
m.rename("node", "J1", "MH-101") # and every reference to it
m.validate() # the app's model checks
run = m.run("site_n015.inp") # saves, then runs EPA SWMM
if not run.ok:
print(run.problem) # failed, or blew up (NOT VALID)
run.continuity # {'Flow Routing Continuity': 0.015, ...}
res = run.results() # or aq.Results("site.out")
pd.DataFrame(res.node_peaks()) # max depth, inflow, flooding
res.link_series("C1", "flow") # {'time_s': [...], 'value': [...]}
pd.DataFrame(res.froude()) # Froude at peak flow and max
rep = run.report() # or aq.Report("site.rpt")
pd.DataFrame(rep.table("Node Depth Summary"))
Model values are strings, exactly as written in the file: a model keeps
every line you did not edit byte for byte, comments and spacing included.
aq.engines() lists the EPA SWMM engines found on the machine (set
AQUASWMM_SWMM_ENGINE_DIR to add one); run(..., engine=<id>) picks
one by the id it lists. A run that fails is returned, not raised — check run.ok.
Inside the desktop app, Tools → Python Terminal binds the current run as
m, res and report when this package is installed in that Python.
Storm sewer primitives
Float in, float out. Useful for replacing a spreadsheet column.
import aquaswmm as ss
ss.intensity(60, 10, 0.8, 12) # IDF: i = a/(t+b)^c -> 5.0607 in/hr
ss.rational_q(0.70, 5.0607, 1.0) # Q = C i A -> 3.5425 cfs
ss.manning_capacity(1.25, 0.013, 0.005) # just-full capacity -> 4.5801 cfs
ss.normal_depth(3.5425, 1.25, 0.013, 0.005) # -> 0.8254 ft (None if it won't fit)
ss.critical_depth(3.5425, 1.25)
ss.circular_geometry(1.25, 0.8254)
# {'area': 0.8597, 'wetted_perimeter': ..., 'hydraulic_radius': ..., 'top_width': ...}
Pass si=True for metric: the Manning factor becomes 1.0 and g becomes 9.81.
ss.manning_capacity(0.4, 0.013, 0.005, si=True) # m3/s
Whole networks
import aquaswmm as ss
import pandas as pd
result = ss.analyze_project(ss.demo_project_json())
pipes = pd.DataFrame(result["pipes"])
print(pipes[["id", "design_q", "capacity", "pct_full", "velocity", "hgl_up"]])
nodes = pd.DataFrame(result["nodes"])
print(nodes[nodes.floods]) # anything surcharging to the surface
analyze_file("project.ssproj") reads a file saved by the desktop app, and
analyze_ssn(text) takes the plain-text network format:
ss.analyze_ssn("""
IDF 60 10 0.8
TAILWATER 100.5
MINTC 10
NODE N1 inlet 0 0 104.0 110.0 1.0 0.70 12
NODE OUT outfall 300 0 102.5 108.5
PIPE P1 N1 OUT 300 1.25 0.013
""")
Each pipe dict carries id, from, to, slope, total_ca, tc,
travel_time, intensity, design_q, capacity, pct_full, velocity,
normal_depth, critical_depth, hgl_up, hgl_dn, and surcharged. Each
node dict carries id, tc, rim, hgl, freeboard, and floods.
Constants
K_MANNING_US (1.486), K_MANNING_SI (1.0), G_US (32.2), G_SI (9.81).
StormSewer uses K = 1.486, the exact unit conversion, matching Autodesk Hydraflow and HEC-22 rather than the 1.486 some spreadsheets use — a 0.27% difference in capacity. See VALIDATION.md, which works every number on a reference network by hand.
What this is not
It computes the published equations; it does not decide whether the Rational method suits your site, what C to use, or which storm to design for. Those stay with the engineer sealing the drawing.
License
GPL-3.0-or-later, like the AquaSWMM engine.
Metadata
Release files for aquaswmm 0.12.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| aquaswmm-0.12.0.tar.gz | 2.3 MB | With provenance | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aquaswmm-0.12.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| aquaswmm-0.12.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| aquaswmm-0.12.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.9 | abi3 | macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64, macOS 10.12+ x86-64 | Details |
Total release size: 6.2 MB
Release files / aquaswmm-0.12.0.tar.gz
| Download URL | aquaswmm-0.12.0.tar.gz |
|---|---|
| Size | 2.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
39105381fd5252d09af956703f84f9fb19b8776de878bd333ec3c5688a583040
|
|
BLAKE2b-256 checksum How to use checksums |
de9af70a1d6635cc49911fbb6cbdbe6dcc0476963e43cc5bb7008bf8fdf335a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / aquaswmm-0.12.0-cp39-abi3-win_amd64.whl
| Download URL | aquaswmm-0.12.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c7a7db6e43b6e20f6108457e49f56059373c954b85a79d7036b4f02272885085
|
|
BLAKE2b-256 checksum How to use checksums |
70e822eee0153ebfc9a9443c8184eeb7118740f950921f93928686109e9a9e3d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / aquaswmm-0.12.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | aquaswmm-0.12.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 890.4 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
bd0ce1b9f9b2ef8d4f830cdfb57c94598fd92ccac34e42c7ee128697f4eb31de
|
|
BLAKE2b-256 checksum How to use checksums |
12b8a04201d87e6fadd22f88746c36e4452adee6932a0a3ac1b8e2655ddc1854
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / aquaswmm-0.12.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | aquaswmm-0.12.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
29491befb2c123bd44bb10e1e8486815f4dc8f921d827385fc08faf8c7522a8e
|
|
BLAKE2b-256 checksum How to use checksums |
d52df997ef03fa9610541fbf95538e1e77661e2f88a30bf5dc4781a131076a31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logSecurity for aquaswmm 0.12.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 4 files in this release have been uploaded with provenance metadata.
Attestation for aquaswmm-0.12.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.