openswmm 6.0.0.dev0__tar.gz → 6.0.0.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/CMakeLists.txt +43 -0
- openswmm-6.0.0.dev2/PKG-INFO +261 -0
- openswmm-6.0.0.dev2/README.md +215 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/cmake/CythonHelpers.cmake +11 -7
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.buildinfo +1 -1
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/__intersphinx_cache__/python_objects.inv +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/api.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/environment.pickle +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/concepts.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/controls.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/editing.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/error_handling.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/forcing.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/gages.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/hotstart.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/inflows.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/infrastructure.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/install.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/links.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/massbalance.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/model_builder.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/nodes.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/output_reader.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/pollutants.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/quality.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/quickstart.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/solver.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/guide/spatial.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/statistics.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/subcatchments.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/tables.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/.doctrees/index.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/license.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/migration/swmm5_to_swmm6.doctree +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/_modules/index.html +624 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_modules/openswmm/legacy/engine/_forcing_log.html +245 -231
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_modules/openswmm/legacy/engine/_links.html +245 -231
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_modules/openswmm/legacy/engine/_nodes.html +245 -231
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_modules/openswmm/legacy/engine/_raingages.html +245 -231
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_modules/openswmm/legacy/engine/_subcatchments.html +245 -231
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_modules/openswmm/legacy/engine/_system.html +245 -231
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/concepts.rst.txt +42 -22
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/controls.rst.txt +10 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/editing.rst.txt +29 -8
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/error_handling.rst.txt +22 -15
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/forcing.rst.txt +7 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/gages.rst.txt +13 -6
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/hotstart.rst.txt +57 -11
- openswmm-6.0.0.dev2/docs/_build/html/_sources/guide/inflows.rst.txt +305 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/infrastructure.rst.txt +66 -61
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/install.rst.txt +12 -2
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/links.rst.txt +21 -10
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/massbalance.rst.txt +4 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/model_builder.rst.txt +4 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/nodes.rst.txt +19 -8
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/output_reader.rst.txt +70 -42
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/pollutants.rst.txt +8 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/quality.rst.txt +29 -21
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/quickstart.rst.txt +29 -14
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/solver.rst.txt +87 -19
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/spatial.rst.txt +42 -31
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/statistics.rst.txt +4 -2
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/subcatchments.rst.txt +16 -8
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/tables.rst.txt +4 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/migration/swmm5_to_swmm6.rst.txt +22 -11
- openswmm-6.0.0.dev0/docs/_build/html/_static/sphinx-design.min.css → openswmm-6.0.0.dev2/docs/_build/html/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css +1 -1
- openswmm-6.0.0.dev2/docs/_build/html/_sphinx_design_static/design-tabs.js +27 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/basic.css +1 -1
- openswmm-6.0.0.dev0/docs/_build/html/_sphinx_design_static/sphinx-design.min.css → openswmm-6.0.0.dev2/docs/_build/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css +1 -1
- openswmm-6.0.0.dev2/docs/_build/html/_static/design-tabs.js +27 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/scripts/bootstrap.js +3 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/scripts/bootstrap.js.LICENSE.txt +2 -2
- openswmm-6.0.0.dev2/docs/_build/html/_static/scripts/bootstrap.js.map +1 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/scripts/pydata-sphinx-theme.js +2 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/scripts/pydata-sphinx-theme.js.map +1 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/styles/bootstrap.css +6 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/styles/bootstrap.css.map +1 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/styles/pydata-sphinx-theme.css +2 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/styles/pydata-sphinx-theme.css.map +1 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/LICENSE.txt +165 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/css/all.min.css +5 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/js/all.min.js +2 -0
- openswmm-6.0.0.dev0/docs/_build/html/_static/scripts/fontawesome.js.LICENSE.txt → openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/js/all.min.js.LICENSE.txt +2 -2
- {openswmm-6.0.0.dev0/docs/_build/html/_static/vendor/fontawesome → openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1}/webfonts/fa-brands-400.ttf +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2 +0 -0
- {openswmm-6.0.0.dev0/docs/_build/html/_static/vendor/fontawesome → openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1}/webfonts/fa-regular-400.ttf +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2 +0 -0
- {openswmm-6.0.0.dev0/docs/_build/html/_static/vendor/fontawesome → openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1}/webfonts/fa-solid-900.ttf +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2 +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-v4compatibility.ttf +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-v4compatibility.woff2 +0 -0
- openswmm-6.0.0.dev2/docs/_build/html/_static/webpack-macros.html +31 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/api.html +2291 -383
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/genindex.html +528 -251
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/concepts.html +297 -274
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/controls.html +263 -256
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/editing.html +295 -265
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/error_handling.html +278 -269
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/forcing.html +261 -257
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/gages.html +268 -262
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/hotstart.html +324 -267
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/index.html +248 -244
- openswmm-6.0.0.dev2/docs/_build/html/guide/inflows.html +1044 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/infrastructure.html +333 -326
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/install.html +272 -260
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/links.html +280 -274
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/massbalance.html +258 -257
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/model_builder.html +259 -259
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/nodes.html +278 -272
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/output_reader.html +337 -300
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/pollutants.html +262 -258
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/quality.html +284 -277
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/quickstart.html +277 -258
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/solver.html +381 -284
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/spatial.html +298 -288
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/statistics.html +260 -260
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/subcatchments.html +275 -272
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/guide/tables.html +258 -257
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/index.html +252 -244
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/legacy/index.html +249 -246
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/legacy/output.html +254 -254
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/legacy/solver.html +253 -252
- openswmm-6.0.0.dev2/docs/_build/html/license.html +641 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/migration/swmm5_to_swmm6.html +287 -273
- openswmm-6.0.0.dev2/docs/_build/html/objects.inv +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/py-modindex.html +241 -229
- openswmm-6.0.0.dev2/docs/_build/html/search.html +597 -0
- openswmm-6.0.0.dev2/docs/_build/html/searchindex.js +1 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/concepts.rst +57 -22
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/controls.rst +10 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/editing.rst +29 -8
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/error_handling.rst +22 -15
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/forcing.rst +7 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/gages.rst +13 -6
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/hotstart.rst +57 -11
- openswmm-6.0.0.dev2/docs/guide/inflows.rst +305 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/infrastructure.rst +66 -61
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/install.rst +12 -2
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/links.rst +100 -13
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/massbalance.rst +4 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/model_builder.rst +4 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/nodes.rst +70 -10
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/output_reader.rst +70 -42
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/pollutants.rst +8 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/quality.rst +29 -21
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/quickstart.rst +29 -14
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/solver.rst +150 -19
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/spatial.rst +42 -31
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/statistics.rst +70 -8
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/subcatchments.rst +60 -19
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/tables.rst +4 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/migration/swmm5_to_swmm6.rst +22 -11
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_2d.pxd +9 -5
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_2d.pyi +47 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_2d.pyx +102 -7
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/__init__.py +20 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_common.pxd +196 -37
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_controls.pyi +21 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_controls.pyx +25 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_enums.py +5 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_gages.pyi +29 -1
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_gages.pyx +43 -2
- openswmm-6.0.0.dev2/openswmm/engine/_geometry.py +129 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_geopackage.pyi +6 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_geopackage.pyx +101 -51
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_hotstart.pyi +90 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_hotstart.pyx +167 -8
- openswmm-6.0.0.dev2/openswmm/engine/_inflows.pyi +339 -0
- openswmm-6.0.0.dev2/openswmm/engine/_inflows.pyx +412 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_infrastructure.pyi +34 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_infrastructure.pyx +57 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_links.pyi +302 -5
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_links.pyx +572 -8
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_model.pyi +192 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_model.pyx +115 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_nodes.pyi +128 -6
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_nodes.pyx +250 -13
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_output_reader.pyi +61 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_output_reader.pyx +128 -12
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_pollutants.pyi +13 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_pollutants.pyx +19 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_quality.pyi +8 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_quality.pyx +13 -0
- openswmm-6.0.0.dev2/openswmm/engine/_report.py +461 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_solver.pxd +1 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_solver.pyi +245 -1
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_solver.pyx +231 -2
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_statistics.pyi +111 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_statistics.pyx +206 -6
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_subcatchments.pyi +93 -1
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_subcatchments.pyx +172 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_tables.pyi +43 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_tables.pyx +64 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/output/CMakeLists.txt +8 -10
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/solver/CMakeLists.txt +11 -10
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/pyproject.toml +72 -10
- openswmm-6.0.0.dev2/scripts/cibw_repair_windows.py +98 -0
- openswmm-6.0.0.dev2/tests/data/__pycache__/__init__.cpython-312.pyc +0 -0
- openswmm-6.0.0.dev2/tests/data/output/__pycache__/__init__.cpython-312.pyc +0 -0
- openswmm-6.0.0.dev2/tests/data/solver/__pycache__/__init__.cpython-312.pyc +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/non_existent_input_file.rpt +3 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example.rpt +3 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_link.rpt +3 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_node.rpt +3 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_outfall.rpt +4 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_routing.rpt +3 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_runoff.rpt +3 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_subcatch.rpt +4 -4
- openswmm-6.0.0.dev2/tests/engine/test_callbacks_and_xsect.py +97 -0
- openswmm-6.0.0.dev2/tests/engine/test_concurrent_simulation.py +294 -0
- openswmm-6.0.0.dev2/tests/engine/test_controls_advancement.py +98 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_gages_expanded.py +30 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_geopackage.py +65 -4
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_hotstart.py +61 -0
- openswmm-6.0.0.dev2/tests/engine/test_infrastructure.py +86 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_integration.py +5 -3
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_links_expanded.py +55 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_model_builder.py +83 -0
- openswmm-6.0.0.dev2/tests/engine/test_new_api.py +724 -0
- openswmm-6.0.0.dev2/tests/engine/test_new_api.py.tmp +724 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_nodes_expanded.py +54 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_output_reader.py +90 -0
- openswmm-6.0.0.dev2/tests/engine/test_quality_pollutants.py +46 -0
- openswmm-6.0.0.dev2/tests/engine/test_rdii_advancement.py +324 -0
- openswmm-6.0.0.dev2/tests/engine/test_runoff_interface.py +170 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_subcatchments_expanded.py +32 -0
- openswmm-6.0.0.dev2/tests/engine/test_tables.py +93 -0
- openswmm-6.0.0.dev2/tests/engine/verify_geopackage_c_api.cpp +495 -0
- openswmm-6.0.0.dev2/tests/engine/verify_geopackage_c_api.sh +90 -0
- openswmm-6.0.0.dev2/tests/test_api_coverage.py +304 -0
- openswmm-6.0.0.dev0/PKG-INFO +0 -760
- openswmm-6.0.0.dev0/README.md +0 -714
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/api.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/environment.pickle +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/concepts.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/editing.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/error_handling.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/inflows.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/infrastructure.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/output_reader.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/solver.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/guide/spatial.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/.doctrees/index.doctree +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/_modules/index.html +0 -610
- openswmm-6.0.0.dev0/docs/_build/html/_sources/guide/inflows.rst.txt +0 -223
- openswmm-6.0.0.dev0/docs/_build/html/_sphinx_design_static/design-tabs.js +0 -101
- openswmm-6.0.0.dev0/docs/_build/html/_static/design-tabs.js +0 -101
- openswmm-6.0.0.dev0/docs/_build/html/_static/scripts/bootstrap.js +0 -3
- openswmm-6.0.0.dev0/docs/_build/html/_static/scripts/bootstrap.js.map +0 -1
- openswmm-6.0.0.dev0/docs/_build/html/_static/scripts/fontawesome.js +0 -3
- openswmm-6.0.0.dev0/docs/_build/html/_static/scripts/fontawesome.js.map +0 -1
- openswmm-6.0.0.dev0/docs/_build/html/_static/scripts/pydata-sphinx-theme.js +0 -2
- openswmm-6.0.0.dev0/docs/_build/html/_static/scripts/pydata-sphinx-theme.js.map +0 -1
- openswmm-6.0.0.dev0/docs/_build/html/_static/styles/pydata-sphinx-theme.css +0 -32
- openswmm-6.0.0.dev0/docs/_build/html/_static/styles/pydata-sphinx-theme.css.map +0 -1
- openswmm-6.0.0.dev0/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/_static/webpack-macros.html +0 -24
- openswmm-6.0.0.dev0/docs/_build/html/guide/inflows.html +0 -942
- openswmm-6.0.0.dev0/docs/_build/html/license.html +0 -637
- openswmm-6.0.0.dev0/docs/_build/html/objects.inv +0 -0
- openswmm-6.0.0.dev0/docs/_build/html/search.html +0 -581
- openswmm-6.0.0.dev0/docs/_build/html/searchindex.js +0 -1
- openswmm-6.0.0.dev0/docs/guide/inflows.rst +0 -223
- openswmm-6.0.0.dev0/openswmm/engine/_inflows.pyi +0 -167
- openswmm-6.0.0.dev0/openswmm/engine/_inflows.pyx +0 -170
- openswmm-6.0.0.dev0/openswmm/gym/__init__.py +0 -0
- openswmm-6.0.0.dev0/openswmm/legacy/output/_output.c +0 -45709
- openswmm-6.0.0.dev0/scratch_rewrite_step_loop.py +0 -56
- openswmm-6.0.0.dev0/scratch_rewrite_step_loop_report.txt +0 -24
- openswmm-6.0.0.dev0/scratch_test_dates.py +0 -94
- openswmm-6.0.0.dev0/scripts/repair_wheel_windows.py +0 -76
- openswmm-6.0.0.dev0/tests/engine/test_infrastructure.py +0 -35
- openswmm-6.0.0.dev0/tests/engine/test_new_api.py +0 -239
- openswmm-6.0.0.dev0/tests/engine/test_quality_pollutants.py +0 -25
- openswmm-6.0.0.dev0/tests/engine/test_tables.py +0 -43
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/.claude/settings.local.json +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/CMakePresets.json +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/LICENSE +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/cmake/PatchNumpyPxd.cmake +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/create_schema_review_db.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/LEGACY_API_EXPANSION_PLAN.md +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/Makefile +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/__intersphinx_cache__/numpy_objects.inv +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/index.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/legacy/index.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/legacy/output.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/legacy/solver.doctree +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_images/hydrocouple_logo.png +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/api.rst.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/guide/index.rst.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/index.rst.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/legacy/index.rst.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/legacy/output.rst.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/legacy/solver.rst.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_sources/license.rst.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/base-stemmer.js +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/doctools.js +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/documentation_options.js +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/english-stemmer.js +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/file.png +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/hydrocouple_logo.png +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/language_data.js +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/minus.png +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/openswmm.css +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/plus.png +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/pygments.css +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/searchtools.js +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/sphinx_highlight.js +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/_static/styles/theme.css +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_static/openswmm.css +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/api.rst +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/conf.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/environment.yml +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/guide/index.rst +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/images/hydrocouple_logo.png +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/index.rst +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/legacy/index.rst +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/legacy/output.rst +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/legacy/solver.rst +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/license.rst +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/make.bat +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/requirements.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/generate_geopackage_erd.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/CMakeLists.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/data/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/CMakeLists.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/__init__.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/__init__.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_dates.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_dates.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_edit.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_edit.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_enums.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_forcing.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_forcing.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_massbalance.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_massbalance.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_spatial.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/engine/_spatial.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/CMakeLists.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/CMakeLists.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/__init__.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_forcing_log.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_links.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_nodes.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_raingages.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_solver.c +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_solver.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_solver.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_subcatchments.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/_system.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/engine/solver.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/output/CMakeLists.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/output/__init__.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/output/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/output/_output.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/output/_output.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/legacy/output/output.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/output/__init__.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/output/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/output/_output.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/output/_output.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/output/output.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/solver/__init__.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/solver/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/solver/_solver.pyi +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/solver/_solver.pyx +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/openswmm/solver/solver.pxd +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/requirements.txt +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/scripts/clean.sh +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/smoke_test.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/conftest.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/__pycache__/__init__.cpython-313.pyc +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/output/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/output/__pycache__/__init__.cpython-313.pyc +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/output/example_output_1.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/output/json_time_series.pickle +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/__pycache__/__init__.cpython-313.pyc +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example.inp +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_link.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_node.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_outfall.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_routing.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_runoff.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/data/solver/site_drainage_example_subcatch.out +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/conftest.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_controls_inflows.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_edit.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_enums.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_gages.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_links.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_massbalance.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_massbalance_expanded.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_new_modules.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_nodes.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_opened_state_editing.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_solver.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_spatial.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_subcatchments.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/engine/test_workflow.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/legacy/__init__.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/legacy/test_output.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/legacy/test_phase1_enum_coverage.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/legacy/test_phase2_statistics.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/legacy/test_phase3_oop_wrappers.py +0 -0
- {openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/tests/legacy/test_solver.py +0 -0
|
@@ -11,6 +11,40 @@
|
|
|
11
11
|
|
|
12
12
|
cmake_minimum_required(VERSION 3.24)
|
|
13
13
|
|
|
14
|
+
# ============================================================================
|
|
15
|
+
# Source-distribution guard: the sdist on PyPI is metadata-only and does NOT
|
|
16
|
+
# carry the OpenSWMM C/C++ engine source tree. Detect that we have neither a
|
|
17
|
+
# pre-built engine prefix nor the parent project's CMakeLists.txt reachable
|
|
18
|
+
# via add_subdirectory(..) and fail with a clear, actionable error rather
|
|
19
|
+
# than letting vcpkg or the C compiler emit a confusing one. Without this
|
|
20
|
+
# guard, a stray VCPKG_ROOT in the user's environment causes the auto-load
|
|
21
|
+
# block below to fire and vcpkg then tries to read a vcpkg.json next to the
|
|
22
|
+
# unpacked sdist that does not exist.
|
|
23
|
+
# ============================================================================
|
|
24
|
+
if(NOT DEFINED OPENSWMM_ENGINE_INSTALL_PREFIX
|
|
25
|
+
AND NOT DEFINED ENV{OPENSWMM_ENGINE_INSTALL_PREFIX}
|
|
26
|
+
AND NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt")
|
|
27
|
+
message(FATAL_ERROR
|
|
28
|
+
"openswmm cannot be built from this source distribution: the sdist "
|
|
29
|
+
"does not bundle the OpenSWMM C/C++ engine sources, and no pre-built "
|
|
30
|
+
"engine was supplied via -DOPENSWMM_ENGINE_INSTALL_PREFIX=<path>.\n"
|
|
31
|
+
"\n"
|
|
32
|
+
"Install a pre-built wheel instead:\n"
|
|
33
|
+
" python -m pip install openswmm\n"
|
|
34
|
+
"\n"
|
|
35
|
+
"Wheels are published for Python 3.9-3.13 on Linux x86_64, macOS "
|
|
36
|
+
"(arm64 and x86_64), and Windows x64. If pip fell back to this "
|
|
37
|
+
"sdist, no wheel matched your platform/interpreter -- check the "
|
|
38
|
+
"available files at https://pypi.org/project/openswmm/#files and, "
|
|
39
|
+
"if needed, switch to a supported Python version.\n"
|
|
40
|
+
"\n"
|
|
41
|
+
"Source builds are supported only from a full git checkout of the "
|
|
42
|
+
"openswmm.engine repository:\n"
|
|
43
|
+
" git clone https://github.com/hydrocouple/openswmm.engine\n"
|
|
44
|
+
" cd openswmm.engine/python\n"
|
|
45
|
+
" pip install . --no-build-isolation")
|
|
46
|
+
endif()
|
|
47
|
+
|
|
14
48
|
# ============================================================================
|
|
15
49
|
# vcpkg manifest directory: the vcpkg.json lives one directory above python/.
|
|
16
50
|
# Set VCPKG_MANIFEST_DIR before project() so vcpkg's toolchain file sees it.
|
|
@@ -93,6 +127,15 @@ endif()
|
|
|
93
127
|
# ============================================================================
|
|
94
128
|
set(CMAKE_MACOSX_RPATH ON)
|
|
95
129
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
130
|
+
# Append the linked engine dylib directory to each extension's install rpath
|
|
131
|
+
# automatically. For a pre-built engine install (OPENSWMM_ENGINE_INSTALL_PREFIX)
|
|
132
|
+
# this adds prefix/lib; for an editable build it adds the build-tree dir.
|
|
133
|
+
# delocate/auditwheel rewrite all rpaths for wheel distribution anyway.
|
|
134
|
+
if(NOT WIN32)
|
|
135
|
+
set(CMAKE_SKIP_BUILD_RPATH FALSE)
|
|
136
|
+
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
|
137
|
+
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
138
|
+
endif()
|
|
96
139
|
set(CMAKE_INSTALL_OPENMP_LIBRARIES TRUE)
|
|
97
140
|
include(InstallRequiredSystemLibraries)
|
|
98
141
|
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: openswmm
|
|
3
|
+
Version: 6.0.0.dev2
|
|
4
|
+
Summary: Python bindings for the OpenSWMM stormwater modelling engine.
|
|
5
|
+
Keywords: SWMM,stormwater,hydrology,hydraulics,water resources,environmental engineering
|
|
6
|
+
Author-Email: Caleb Buahin <caleb.buahin@gmail.com>
|
|
7
|
+
Maintainer-Email: Caleb Buahin <caleb.buahin@gmail.com>
|
|
8
|
+
License: MIT License
|
|
9
|
+
|
|
10
|
+
Copyright 2026 Caleb Buahin
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
17
|
+
|
|
18
|
+
Classifier: Development Status :: 3 - Alpha
|
|
19
|
+
Classifier: Intended Audience :: Developers
|
|
20
|
+
Classifier: Intended Audience :: Science/Research
|
|
21
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
22
|
+
Classifier: Operating System :: Unix
|
|
23
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
24
|
+
Classifier: Operating System :: MacOS
|
|
25
|
+
Classifier: Programming Language :: Python :: 3
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
30
|
+
Classifier: Programming Language :: Cython
|
|
31
|
+
Classifier: Programming Language :: C
|
|
32
|
+
Classifier: Programming Language :: C++
|
|
33
|
+
Classifier: Topic :: Scientific/Engineering
|
|
34
|
+
Classifier: Topic :: Scientific/Engineering :: Hydrology
|
|
35
|
+
Project-URL: Homepage, https://github.com/hydrocouple/openswmm.engine/python
|
|
36
|
+
Project-URL: Repository, https://github.com/hydrocouple/openswmm.engine
|
|
37
|
+
Project-URL: Bug Tracker, https://github.com/hydrocouple/openswmm.engine/issues
|
|
38
|
+
Project-URL: Changelog, https://github.com/hydrocouple/openswmm.engine/blob/main/CHANGELOG.md
|
|
39
|
+
Requires-Python: >=3.10
|
|
40
|
+
Requires-Dist: numpy>=1.21.0
|
|
41
|
+
Provides-Extra: dev
|
|
42
|
+
Requires-Dist: pytest>=8.3; extra == "dev"
|
|
43
|
+
Requires-Dist: cython>=3.0.12; extra == "dev"
|
|
44
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
45
|
+
Description-Content-Type: text/markdown
|
|
46
|
+
|
|
47
|
+
# OpenSWMM Engine
|
|
48
|
+
|
|
49
|
+
<p align="center">
|
|
50
|
+
<img src="https://raw.githubusercontent.com/HydroCouple/openswmm.engine/develop/docs/images/hydrocouple_logo.png" alt="OpenSWMM" width="120">
|
|
51
|
+
</p>
|
|
52
|
+
|
|
53
|
+
**Open Storm Water Management Model — Next-Generation Computational Engine**
|
|
54
|
+
|
|
55
|
+
[](https://github.com/HydroCouple/openswmm.engine/actions/workflows/unit_testing.yml)
|
|
56
|
+
[](https://github.com/HydroCouple/openswmm.engine/actions/workflows/unit_testing_python.yml)
|
|
57
|
+
[](https://github.com/HydroCouple/openswmm.engine/actions/workflows/documentation.yml)
|
|
58
|
+
[](https://github.com/HydroCouple/openswmm.engine/issues)
|
|
59
|
+
[](LICENSE)
|
|
60
|
+
[](https://pypi.org/project/openswmm)
|
|
61
|
+
[](https://pepy.tech/project/openswmm)
|
|
62
|
+
[](https://pypi.org/project/openswmm)
|
|
63
|
+
[](https://pypi.org/project/openswmm)
|
|
64
|
+
|
|
65
|
+
## Documentation
|
|
66
|
+
|
|
67
|
+
| | Site | Contents |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| **C / C++ Engine** | **[hydrocouple.org/openswmm.engine](https://hydrocouple.org/openswmm.engine)** | Full C API reference, hydrology / hydraulics / water-quality reference manuals, user manual, architecture notes. |
|
|
70
|
+
| **Python Bindings** | **[hydrocouple.org/openswmm.engine/python](https://hydrocouple.org/openswmm.engine/python)** | Quickstart, per-domain user guide, Cython API reference, SWMM 5 → v6 migration. |
|
|
71
|
+
|
|
72
|
+
Both sites cross-link from their top navigation.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Overview
|
|
77
|
+
|
|
78
|
+
OpenSWMM Engine is a community-driven, open-source continuation of the EPA Storm Water Management Model — a dynamic hydrology, hydraulic, and water-quality simulator for urban runoff. The project preserves the SWMM legacy under QA/QC and builds the community needed for long-term maintenance, working with ASCE/EWRI and the Water Environment Federation.
|
|
79
|
+
|
|
80
|
+
## What's New in v6.0.0
|
|
81
|
+
|
|
82
|
+
### Architecture & Performance
|
|
83
|
+
|
|
84
|
+
- **Data-Oriented Design** — Core state refactored to Structure-of-Arrays for cache efficiency and SIMD-friendly batches.
|
|
85
|
+
- **Reentrant Engine** — All simulation state lives behind an opaque `SWMM_Engine` handle; multiple independent simulations can run in the same process.
|
|
86
|
+
- **Plugin-Based I/O** — Output and report writing dispatch through plugin interfaces on a dedicated I/O thread.
|
|
87
|
+
- **C++20 Codebase** — Modern C++20 implementation; the legacy EPA SWMM 5.x solver is preserved unmodified in `src/legacy/`.
|
|
88
|
+
|
|
89
|
+
### Process Formulation Enhancements
|
|
90
|
+
|
|
91
|
+
#### Implemented
|
|
92
|
+
|
|
93
|
+
- **Semi-Implicit Node Continuity** — Single-equation free-surface/surcharge formulation that removes the legacy two-branch discontinuity. Enabled via `NODE_CONTINUITY SEMI_IMPLICIT` (default). [Reference »](https://hydrocouple.org/openswmm.engine)
|
|
94
|
+
- **Anderson Acceleration for Picard Iteration** — Depth-2 mixing of residual history cuts iteration counts 25–50% on stiff surcharge transitions with safe fall-back to standard Picard. Enabled via `ANDERSON_ACCEL YES`.
|
|
95
|
+
- **Spatially Explicit Overland Flow & Groundwater (2D)** — 2D overland-flow grid coupled to the 1D pipe network. Surcharge re-routes over terrain to downstream nodes, lateral groundwater exchanges are tracked explicitly, and green-infrastructure placement is spatially resolved.
|
|
96
|
+
- **Dynamic Preissmann Slot** — Geometry-dependent slot width replaces the fixed-width slot at the free-surface / pressurized transition, improving stability for rapidly filling or draining conduits.
|
|
97
|
+
- **Physics-Based Initial Abstraction Recovery** — RDII initial abstraction now evolves as an exponential depletion/recovery process with additive base + thermal recovery rates and frozen-ground suppression. Seasonal RDII variation emerges from temperature dynamics on a single RTK set per sewershed — no monthly parameter tables required. Configured via the new `[RDII_DECAY]` input section.
|
|
98
|
+
|
|
99
|
+
$$IA_{avail}(t+\Delta t) = IA_{max} - \bigl(IA_{max} - IA_{avail}(t)\bigr) \cdot e^{-k_{rec}(T)\,\Delta t}, \quad k_{rec}(T) = k_0 + k_T \cdot e^{\,\theta(T - T_{ref})}$$
|
|
100
|
+
|
|
101
|
+
#### In Development
|
|
102
|
+
|
|
103
|
+
- **Spatially Explicit Inlets** — Promotes inlets to mode-switching junction nodes that capture street flow when gutter spread exceeds a threshold and revert to passive junctions otherwise.
|
|
104
|
+
- **LID as Storage Nodes** — Maps LID layers (surface, media, gravel) onto extended storage nodes using a reduced-physics kinematic Richards ODE for two-way hydraulic feedback.
|
|
105
|
+
|
|
106
|
+
### New C API
|
|
107
|
+
|
|
108
|
+
A domain-split C API replaces the monolithic legacy interface. Full reference at the [C engine documentation site](https://hydrocouple.org/openswmm.engine).
|
|
109
|
+
|
|
110
|
+
| Header | Domain |
|
|
111
|
+
|---|---|
|
|
112
|
+
| `openswmm_engine.h` | Engine lifecycle, error codes, state machine |
|
|
113
|
+
| `openswmm_model.h` | Model building, validation, serialization, options |
|
|
114
|
+
| `openswmm_nodes.h` | Junctions, outfalls, storage, dividers |
|
|
115
|
+
| `openswmm_links.h` | Conduits, pumps, orifices, weirs, outlets |
|
|
116
|
+
| `openswmm_subcatchments.h` | Subcatchments, infiltration, coverage |
|
|
117
|
+
| `openswmm_gages.h` | Rain gages |
|
|
118
|
+
| `openswmm_pollutants.h` | Pollutant definitions and runtime injection |
|
|
119
|
+
| `openswmm_tables.h` | Time series, curves, patterns |
|
|
120
|
+
| `openswmm_inflows.h` | External inflows, DWF, RDII (incl. `[RDII_DECAY]`) |
|
|
121
|
+
| `openswmm_controls.h` | Control rules and direct link actions |
|
|
122
|
+
| `openswmm_infrastructure.h` | Transects, streets, inlets, LID controls |
|
|
123
|
+
| `openswmm_spatial.h` | CRS, coordinates, polylines, polygons |
|
|
124
|
+
| `openswmm_quality.h` | Landuse, buildup, washoff, treatment |
|
|
125
|
+
| `openswmm_massbalance.h` | Continuity errors and cumulative flux totals |
|
|
126
|
+
| `openswmm_callbacks.h` | Progress, warning, and step callbacks |
|
|
127
|
+
| `openswmm_hotstart.h` | Hot start file save / load / modify |
|
|
128
|
+
| `openswmm_statistics.h` | Node, link, and subcatchment statistics |
|
|
129
|
+
| `openswmm_geopackage.h` | Optional GeoPackage I/O |
|
|
130
|
+
|
|
131
|
+
### Additional Features
|
|
132
|
+
|
|
133
|
+
- **Hot Start API** — Save, load, modify, and query hot-start files through a stable C ABI.
|
|
134
|
+
- **CRS Support** — Coordinate reference systems specified in `[OPTIONS]`.
|
|
135
|
+
- **User Flags** — Typed `[USER_FLAGS]` / `[USER_FLAG_VALUES]` sections attach custom metadata (boolean, integer, real, string) to nodes, links, subcatchments, or gages.
|
|
136
|
+
- **Extension Options** — Unrecognized `[OPTIONS]` keys are preserved and exposed to plugins at runtime.
|
|
137
|
+
- **Plugin SDK** — Header-only SDK in `include/openswmm/plugin_sdk/` for input, output, and report plugins; the `IPluginComponentInfo` entry point advertises capabilities and supports custom `.inp` section handlers via `SectionRegistry`.
|
|
138
|
+
- **GeoPackage I/O** — Optional SQLite + spatial backing store for inputs, results, observed series, and topology in a single `.gpkg` file (`-DOPENSWMM_WITH_GEOPACKAGE=ON`).
|
|
139
|
+
- **HEC-22 Inlet Analysis** — Street inlet capture with grate and curb inlets (SWMM 5.2).
|
|
140
|
+
- **Variable Speed Pumps** — Type 5 pump curves with speed scaling.
|
|
141
|
+
- **New Storage Shapes** — Conical and pyramidal shapes with elliptical and rectangular bases.
|
|
142
|
+
|
|
143
|
+
## Quick Start
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# C / C++ engine
|
|
147
|
+
git clone https://github.com/HydroCouple/openswmm.engine.git
|
|
148
|
+
cd openswmm.engine
|
|
149
|
+
git clone https://github.com/microsoft/vcpkg.git && ./vcpkg/bootstrap-vcpkg.sh
|
|
150
|
+
export VCPKG_ROOT=$(pwd)/vcpkg
|
|
151
|
+
|
|
152
|
+
cmake --preset=<platform> -B build -DOPENSWMM_WITH_GEOPACKAGE=ON
|
|
153
|
+
cmake --build build --config Release
|
|
154
|
+
ctest --test-dir build -C Release --output-on-failure
|
|
155
|
+
|
|
156
|
+
# Python bindings (PyPI)
|
|
157
|
+
pip install openswmm
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Presets: `Windows`, `Windows-debug`, `Linux`, `Linux-debug`, `Darwin`, `Darwin-debug`. Full build, test, and packaging instructions are in the [C engine docs](https://hydrocouple.org/openswmm.engine).
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
from openswmm.engine import Solver, Nodes, Links
|
|
164
|
+
|
|
165
|
+
with Solver("model.inp", "model.rpt", "model.out") as s:
|
|
166
|
+
nodes, links = Nodes(s), Links(s)
|
|
167
|
+
while s.step():
|
|
168
|
+
depth = nodes.get_depth("J1")
|
|
169
|
+
flow = links.get_flow("C1")
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Forcing, model building, hot-start, bulk NumPy access, mass balance, and statistics are covered in the [Python docs](https://hydrocouple.org/openswmm.engine/python).
|
|
173
|
+
|
|
174
|
+
## Glossary
|
|
175
|
+
|
|
176
|
+
Brief definitions of the domain terms used throughout this README. Full treatment lives in the [reference manuals](https://hydrocouple.org/openswmm.engine).
|
|
177
|
+
|
|
178
|
+
- **RDII** — Rainfall-Dependent Inflow & Infiltration. Stormwater that enters sanitary or combined sewers through cracks, joints, defective laterals, and roof / foundation drains during and after rainfall.
|
|
179
|
+
- **RTK** — The triplet `(R, T, K)` that parameterises a SWMM synthetic unit hydrograph for RDII: `R` is the long-term fraction of rainfall that becomes RDII, `T` is the time to peak (hours), and `K` is the ratio of base time to peak time.
|
|
180
|
+
- **IA (Initial Abstraction)** — Rainfall depth absorbed by the catchment before any RDII response begins (interception, surface storage, soil wetting). Recovers between events.
|
|
181
|
+
- **DWF** — Dry-Weather Flow. Base sanitary flow plus infiltration unrelated to rainfall, typically specified as an average value with diurnal / day-of-week / monthly patterns.
|
|
182
|
+
- **LID** — Low-Impact Development. Distributed green-infrastructure controls (bio-retention cells, permeable pavement, green roofs, infiltration trenches, rain gardens) that intercept, store, and infiltrate runoff at the source.
|
|
183
|
+
- **CRS** — Coordinate Reference System. The geodetic / projected coordinate frame (e.g. `EPSG:4326`) the model's spatial data is expressed in.
|
|
184
|
+
- **CFS / CMS** — Cubic feet per second / cubic metres per second. The two flow-unit conventions exposed via `FLOW_UNITS`.
|
|
185
|
+
- **Dynamic Wave Routing** — Full Saint-Venant momentum solver for link flow, used for backwater, surcharge, and pressurized conditions.
|
|
186
|
+
- **Preissmann Slot** — A narrow virtual slot added to a closed conduit's cross-section so that pressurized flow can be solved with the same free-surface equations. The dynamic slot adjusts width with geometry to smooth the surface ↔ pressure transition.
|
|
187
|
+
- **Surcharge** — A pipe flowing full and under pressure (HGL above the crown), typically caused by downstream backwater or capacity exceedance.
|
|
188
|
+
- **Picard Iteration** — Fixed-point iteration used inside the dynamic-wave timestep to converge implicit node depths. Anderson Acceleration is a residual-history accelerator on top of Picard.
|
|
189
|
+
- **Hot Start** — A saved end-of-run state (depths, volumes, IA, snow, GW) that initialises a subsequent simulation, letting long runs be split into checkpoints or warm runs into operational forecasts.
|
|
190
|
+
- **HEC-22** — FHWA Hydraulic Engineering Circular No. 22, the design reference whose grate and curb-opening capture equations are used by the inlet-analysis module.
|
|
191
|
+
- **GeoPackage** — OGC standard for a SQLite-based, single-file container holding spatial features and tabular data with full CRS metadata.
|
|
192
|
+
|
|
193
|
+
## Prerequisites
|
|
194
|
+
|
|
195
|
+
| Requirement | Version |
|
|
196
|
+
|---|---|
|
|
197
|
+
| CMake | 3.21+ |
|
|
198
|
+
| C compiler | C17 (GCC 10+, Clang 12+, MSVC 19.29+) |
|
|
199
|
+
| C++ compiler | C++20 (GCC 10+, Clang 14+, MSVC 19.29+) |
|
|
200
|
+
| vcpkg | 2025.02.14 |
|
|
201
|
+
| Python | 3.9 – 3.13 (optional) |
|
|
202
|
+
| Ninja | recommended on Linux/macOS |
|
|
203
|
+
|
|
204
|
+
## Project Structure
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
openswmm.engine/
|
|
208
|
+
├── include/openswmm/
|
|
209
|
+
│ ├── engine/ # New engine public C API headers
|
|
210
|
+
│ └── legacy/ # Legacy SWMM 5.x public headers
|
|
211
|
+
├── src/
|
|
212
|
+
│ ├── engine/ # New C++20 engine implementation
|
|
213
|
+
│ │ ├── input/geopackage/ # Optional GeoPackage I/O
|
|
214
|
+
│ │ └── 2d/ # 2D overland-flow & groundwater coupling
|
|
215
|
+
│ ├── legacy/ # Original EPA SWMM 5.x solver and output reader
|
|
216
|
+
│ ├── plugin_sdk/ # Header-only plugin SDK
|
|
217
|
+
│ └── cli/ # Command-line interface
|
|
218
|
+
├── tests/
|
|
219
|
+
│ ├── unit/legacy/ # Legacy solver & output tests
|
|
220
|
+
│ ├── unit/engine/ # New engine unit tests
|
|
221
|
+
│ ├── regression/ # New-vs-legacy regression tests
|
|
222
|
+
│ └── benchmarks/ # Performance benchmarks
|
|
223
|
+
├── python/ # Cython bindings (scikit-build)
|
|
224
|
+
├── docs/ # Doxygen config and technical manuals
|
|
225
|
+
└── .github/workflows/ # CI/CD pipelines
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Libraries Built
|
|
229
|
+
|
|
230
|
+
| Target | Description |
|
|
231
|
+
|---|---|
|
|
232
|
+
| `openswmm_legacy_engine` | Original EPA SWMM 5.x solver (shared) |
|
|
233
|
+
| `openswmm_legacy_output` | Original SWMM binary output reader (shared) |
|
|
234
|
+
| `openswmm_engine` | New refactored C++20 engine (shared) |
|
|
235
|
+
| `openswmm_geopackage` | GeoPackage I/O (static, optional — requires SQLite3) |
|
|
236
|
+
| `openswmm_plugin_sdk` | Header-only plugin SDK (INTERFACE) |
|
|
237
|
+
| `openswmm_cli` | Command-line executable |
|
|
238
|
+
|
|
239
|
+
## Contributing
|
|
240
|
+
|
|
241
|
+
Contributions are welcome — bug reports, fixes, new features, docs, tests, and benchmarks.
|
|
242
|
+
|
|
243
|
+
1. Read [CONTRIBUTING.md](CONTRIBUTING.md) for the development workflow and the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
244
|
+
2. Fork the repo and create a feature branch.
|
|
245
|
+
3. Ensure C++ (`ctest`) and Python (`pytest`) tests pass.
|
|
246
|
+
4. Follow existing style and naming.
|
|
247
|
+
5. Open a PR against `develop`.
|
|
248
|
+
|
|
249
|
+
### Contributor License Agreement
|
|
250
|
+
|
|
251
|
+
First-time contributors must sign the project [CLA](CLA.md) before a pull request can be merged. The CLA grants the project a perpetual, royalty-free copyright and patent license to your contributions and preserves the project's ability to relicense in the future; **you retain full copyright ownership** of your work.
|
|
252
|
+
|
|
253
|
+
Signing is automated through [CLA Assistant](https://cla-assistant.io) — when you open your first PR, a bot comments with a one-click sign-in link. The CLA covers all subsequent contributions, so you only sign once. Corporate contributors should additionally submit a CCLA per [CLA §6](CLA.md#6-corporate-contributors).
|
|
254
|
+
|
|
255
|
+
## License
|
|
256
|
+
|
|
257
|
+
MIT — see [LICENSE](LICENSE). Original EPA SWMM material is in the public domain under 17 USC § 105.
|
|
258
|
+
|
|
259
|
+
## Acknowledgements
|
|
260
|
+
|
|
261
|
+
OpenSWMM builds on the EPA Storm Water Management Model. See [docs/authors.md](docs/authors.md) for the full contributor list.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# OpenSWMM Engine
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/HydroCouple/openswmm.engine/develop/docs/images/hydrocouple_logo.png" alt="OpenSWMM" width="120">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
**Open Storm Water Management Model — Next-Generation Computational Engine**
|
|
8
|
+
|
|
9
|
+
[](https://github.com/HydroCouple/openswmm.engine/actions/workflows/unit_testing.yml)
|
|
10
|
+
[](https://github.com/HydroCouple/openswmm.engine/actions/workflows/unit_testing_python.yml)
|
|
11
|
+
[](https://github.com/HydroCouple/openswmm.engine/actions/workflows/documentation.yml)
|
|
12
|
+
[](https://github.com/HydroCouple/openswmm.engine/issues)
|
|
13
|
+
[](LICENSE)
|
|
14
|
+
[](https://pypi.org/project/openswmm)
|
|
15
|
+
[](https://pepy.tech/project/openswmm)
|
|
16
|
+
[](https://pypi.org/project/openswmm)
|
|
17
|
+
[](https://pypi.org/project/openswmm)
|
|
18
|
+
|
|
19
|
+
## Documentation
|
|
20
|
+
|
|
21
|
+
| | Site | Contents |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| **C / C++ Engine** | **[hydrocouple.org/openswmm.engine](https://hydrocouple.org/openswmm.engine)** | Full C API reference, hydrology / hydraulics / water-quality reference manuals, user manual, architecture notes. |
|
|
24
|
+
| **Python Bindings** | **[hydrocouple.org/openswmm.engine/python](https://hydrocouple.org/openswmm.engine/python)** | Quickstart, per-domain user guide, Cython API reference, SWMM 5 → v6 migration. |
|
|
25
|
+
|
|
26
|
+
Both sites cross-link from their top navigation.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Overview
|
|
31
|
+
|
|
32
|
+
OpenSWMM Engine is a community-driven, open-source continuation of the EPA Storm Water Management Model — a dynamic hydrology, hydraulic, and water-quality simulator for urban runoff. The project preserves the SWMM legacy under QA/QC and builds the community needed for long-term maintenance, working with ASCE/EWRI and the Water Environment Federation.
|
|
33
|
+
|
|
34
|
+
## What's New in v6.0.0
|
|
35
|
+
|
|
36
|
+
### Architecture & Performance
|
|
37
|
+
|
|
38
|
+
- **Data-Oriented Design** — Core state refactored to Structure-of-Arrays for cache efficiency and SIMD-friendly batches.
|
|
39
|
+
- **Reentrant Engine** — All simulation state lives behind an opaque `SWMM_Engine` handle; multiple independent simulations can run in the same process.
|
|
40
|
+
- **Plugin-Based I/O** — Output and report writing dispatch through plugin interfaces on a dedicated I/O thread.
|
|
41
|
+
- **C++20 Codebase** — Modern C++20 implementation; the legacy EPA SWMM 5.x solver is preserved unmodified in `src/legacy/`.
|
|
42
|
+
|
|
43
|
+
### Process Formulation Enhancements
|
|
44
|
+
|
|
45
|
+
#### Implemented
|
|
46
|
+
|
|
47
|
+
- **Semi-Implicit Node Continuity** — Single-equation free-surface/surcharge formulation that removes the legacy two-branch discontinuity. Enabled via `NODE_CONTINUITY SEMI_IMPLICIT` (default). [Reference »](https://hydrocouple.org/openswmm.engine)
|
|
48
|
+
- **Anderson Acceleration for Picard Iteration** — Depth-2 mixing of residual history cuts iteration counts 25–50% on stiff surcharge transitions with safe fall-back to standard Picard. Enabled via `ANDERSON_ACCEL YES`.
|
|
49
|
+
- **Spatially Explicit Overland Flow & Groundwater (2D)** — 2D overland-flow grid coupled to the 1D pipe network. Surcharge re-routes over terrain to downstream nodes, lateral groundwater exchanges are tracked explicitly, and green-infrastructure placement is spatially resolved.
|
|
50
|
+
- **Dynamic Preissmann Slot** — Geometry-dependent slot width replaces the fixed-width slot at the free-surface / pressurized transition, improving stability for rapidly filling or draining conduits.
|
|
51
|
+
- **Physics-Based Initial Abstraction Recovery** — RDII initial abstraction now evolves as an exponential depletion/recovery process with additive base + thermal recovery rates and frozen-ground suppression. Seasonal RDII variation emerges from temperature dynamics on a single RTK set per sewershed — no monthly parameter tables required. Configured via the new `[RDII_DECAY]` input section.
|
|
52
|
+
|
|
53
|
+
$$IA_{avail}(t+\Delta t) = IA_{max} - \bigl(IA_{max} - IA_{avail}(t)\bigr) \cdot e^{-k_{rec}(T)\,\Delta t}, \quad k_{rec}(T) = k_0 + k_T \cdot e^{\,\theta(T - T_{ref})}$$
|
|
54
|
+
|
|
55
|
+
#### In Development
|
|
56
|
+
|
|
57
|
+
- **Spatially Explicit Inlets** — Promotes inlets to mode-switching junction nodes that capture street flow when gutter spread exceeds a threshold and revert to passive junctions otherwise.
|
|
58
|
+
- **LID as Storage Nodes** — Maps LID layers (surface, media, gravel) onto extended storage nodes using a reduced-physics kinematic Richards ODE for two-way hydraulic feedback.
|
|
59
|
+
|
|
60
|
+
### New C API
|
|
61
|
+
|
|
62
|
+
A domain-split C API replaces the monolithic legacy interface. Full reference at the [C engine documentation site](https://hydrocouple.org/openswmm.engine).
|
|
63
|
+
|
|
64
|
+
| Header | Domain |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `openswmm_engine.h` | Engine lifecycle, error codes, state machine |
|
|
67
|
+
| `openswmm_model.h` | Model building, validation, serialization, options |
|
|
68
|
+
| `openswmm_nodes.h` | Junctions, outfalls, storage, dividers |
|
|
69
|
+
| `openswmm_links.h` | Conduits, pumps, orifices, weirs, outlets |
|
|
70
|
+
| `openswmm_subcatchments.h` | Subcatchments, infiltration, coverage |
|
|
71
|
+
| `openswmm_gages.h` | Rain gages |
|
|
72
|
+
| `openswmm_pollutants.h` | Pollutant definitions and runtime injection |
|
|
73
|
+
| `openswmm_tables.h` | Time series, curves, patterns |
|
|
74
|
+
| `openswmm_inflows.h` | External inflows, DWF, RDII (incl. `[RDII_DECAY]`) |
|
|
75
|
+
| `openswmm_controls.h` | Control rules and direct link actions |
|
|
76
|
+
| `openswmm_infrastructure.h` | Transects, streets, inlets, LID controls |
|
|
77
|
+
| `openswmm_spatial.h` | CRS, coordinates, polylines, polygons |
|
|
78
|
+
| `openswmm_quality.h` | Landuse, buildup, washoff, treatment |
|
|
79
|
+
| `openswmm_massbalance.h` | Continuity errors and cumulative flux totals |
|
|
80
|
+
| `openswmm_callbacks.h` | Progress, warning, and step callbacks |
|
|
81
|
+
| `openswmm_hotstart.h` | Hot start file save / load / modify |
|
|
82
|
+
| `openswmm_statistics.h` | Node, link, and subcatchment statistics |
|
|
83
|
+
| `openswmm_geopackage.h` | Optional GeoPackage I/O |
|
|
84
|
+
|
|
85
|
+
### Additional Features
|
|
86
|
+
|
|
87
|
+
- **Hot Start API** — Save, load, modify, and query hot-start files through a stable C ABI.
|
|
88
|
+
- **CRS Support** — Coordinate reference systems specified in `[OPTIONS]`.
|
|
89
|
+
- **User Flags** — Typed `[USER_FLAGS]` / `[USER_FLAG_VALUES]` sections attach custom metadata (boolean, integer, real, string) to nodes, links, subcatchments, or gages.
|
|
90
|
+
- **Extension Options** — Unrecognized `[OPTIONS]` keys are preserved and exposed to plugins at runtime.
|
|
91
|
+
- **Plugin SDK** — Header-only SDK in `include/openswmm/plugin_sdk/` for input, output, and report plugins; the `IPluginComponentInfo` entry point advertises capabilities and supports custom `.inp` section handlers via `SectionRegistry`.
|
|
92
|
+
- **GeoPackage I/O** — Optional SQLite + spatial backing store for inputs, results, observed series, and topology in a single `.gpkg` file (`-DOPENSWMM_WITH_GEOPACKAGE=ON`).
|
|
93
|
+
- **HEC-22 Inlet Analysis** — Street inlet capture with grate and curb inlets (SWMM 5.2).
|
|
94
|
+
- **Variable Speed Pumps** — Type 5 pump curves with speed scaling.
|
|
95
|
+
- **New Storage Shapes** — Conical and pyramidal shapes with elliptical and rectangular bases.
|
|
96
|
+
|
|
97
|
+
## Quick Start
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# C / C++ engine
|
|
101
|
+
git clone https://github.com/HydroCouple/openswmm.engine.git
|
|
102
|
+
cd openswmm.engine
|
|
103
|
+
git clone https://github.com/microsoft/vcpkg.git && ./vcpkg/bootstrap-vcpkg.sh
|
|
104
|
+
export VCPKG_ROOT=$(pwd)/vcpkg
|
|
105
|
+
|
|
106
|
+
cmake --preset=<platform> -B build -DOPENSWMM_WITH_GEOPACKAGE=ON
|
|
107
|
+
cmake --build build --config Release
|
|
108
|
+
ctest --test-dir build -C Release --output-on-failure
|
|
109
|
+
|
|
110
|
+
# Python bindings (PyPI)
|
|
111
|
+
pip install openswmm
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Presets: `Windows`, `Windows-debug`, `Linux`, `Linux-debug`, `Darwin`, `Darwin-debug`. Full build, test, and packaging instructions are in the [C engine docs](https://hydrocouple.org/openswmm.engine).
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
from openswmm.engine import Solver, Nodes, Links
|
|
118
|
+
|
|
119
|
+
with Solver("model.inp", "model.rpt", "model.out") as s:
|
|
120
|
+
nodes, links = Nodes(s), Links(s)
|
|
121
|
+
while s.step():
|
|
122
|
+
depth = nodes.get_depth("J1")
|
|
123
|
+
flow = links.get_flow("C1")
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Forcing, model building, hot-start, bulk NumPy access, mass balance, and statistics are covered in the [Python docs](https://hydrocouple.org/openswmm.engine/python).
|
|
127
|
+
|
|
128
|
+
## Glossary
|
|
129
|
+
|
|
130
|
+
Brief definitions of the domain terms used throughout this README. Full treatment lives in the [reference manuals](https://hydrocouple.org/openswmm.engine).
|
|
131
|
+
|
|
132
|
+
- **RDII** — Rainfall-Dependent Inflow & Infiltration. Stormwater that enters sanitary or combined sewers through cracks, joints, defective laterals, and roof / foundation drains during and after rainfall.
|
|
133
|
+
- **RTK** — The triplet `(R, T, K)` that parameterises a SWMM synthetic unit hydrograph for RDII: `R` is the long-term fraction of rainfall that becomes RDII, `T` is the time to peak (hours), and `K` is the ratio of base time to peak time.
|
|
134
|
+
- **IA (Initial Abstraction)** — Rainfall depth absorbed by the catchment before any RDII response begins (interception, surface storage, soil wetting). Recovers between events.
|
|
135
|
+
- **DWF** — Dry-Weather Flow. Base sanitary flow plus infiltration unrelated to rainfall, typically specified as an average value with diurnal / day-of-week / monthly patterns.
|
|
136
|
+
- **LID** — Low-Impact Development. Distributed green-infrastructure controls (bio-retention cells, permeable pavement, green roofs, infiltration trenches, rain gardens) that intercept, store, and infiltrate runoff at the source.
|
|
137
|
+
- **CRS** — Coordinate Reference System. The geodetic / projected coordinate frame (e.g. `EPSG:4326`) the model's spatial data is expressed in.
|
|
138
|
+
- **CFS / CMS** — Cubic feet per second / cubic metres per second. The two flow-unit conventions exposed via `FLOW_UNITS`.
|
|
139
|
+
- **Dynamic Wave Routing** — Full Saint-Venant momentum solver for link flow, used for backwater, surcharge, and pressurized conditions.
|
|
140
|
+
- **Preissmann Slot** — A narrow virtual slot added to a closed conduit's cross-section so that pressurized flow can be solved with the same free-surface equations. The dynamic slot adjusts width with geometry to smooth the surface ↔ pressure transition.
|
|
141
|
+
- **Surcharge** — A pipe flowing full and under pressure (HGL above the crown), typically caused by downstream backwater or capacity exceedance.
|
|
142
|
+
- **Picard Iteration** — Fixed-point iteration used inside the dynamic-wave timestep to converge implicit node depths. Anderson Acceleration is a residual-history accelerator on top of Picard.
|
|
143
|
+
- **Hot Start** — A saved end-of-run state (depths, volumes, IA, snow, GW) that initialises a subsequent simulation, letting long runs be split into checkpoints or warm runs into operational forecasts.
|
|
144
|
+
- **HEC-22** — FHWA Hydraulic Engineering Circular No. 22, the design reference whose grate and curb-opening capture equations are used by the inlet-analysis module.
|
|
145
|
+
- **GeoPackage** — OGC standard for a SQLite-based, single-file container holding spatial features and tabular data with full CRS metadata.
|
|
146
|
+
|
|
147
|
+
## Prerequisites
|
|
148
|
+
|
|
149
|
+
| Requirement | Version |
|
|
150
|
+
|---|---|
|
|
151
|
+
| CMake | 3.21+ |
|
|
152
|
+
| C compiler | C17 (GCC 10+, Clang 12+, MSVC 19.29+) |
|
|
153
|
+
| C++ compiler | C++20 (GCC 10+, Clang 14+, MSVC 19.29+) |
|
|
154
|
+
| vcpkg | 2025.02.14 |
|
|
155
|
+
| Python | 3.9 – 3.13 (optional) |
|
|
156
|
+
| Ninja | recommended on Linux/macOS |
|
|
157
|
+
|
|
158
|
+
## Project Structure
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
openswmm.engine/
|
|
162
|
+
├── include/openswmm/
|
|
163
|
+
│ ├── engine/ # New engine public C API headers
|
|
164
|
+
│ └── legacy/ # Legacy SWMM 5.x public headers
|
|
165
|
+
├── src/
|
|
166
|
+
│ ├── engine/ # New C++20 engine implementation
|
|
167
|
+
│ │ ├── input/geopackage/ # Optional GeoPackage I/O
|
|
168
|
+
│ │ └── 2d/ # 2D overland-flow & groundwater coupling
|
|
169
|
+
│ ├── legacy/ # Original EPA SWMM 5.x solver and output reader
|
|
170
|
+
│ ├── plugin_sdk/ # Header-only plugin SDK
|
|
171
|
+
│ └── cli/ # Command-line interface
|
|
172
|
+
├── tests/
|
|
173
|
+
│ ├── unit/legacy/ # Legacy solver & output tests
|
|
174
|
+
│ ├── unit/engine/ # New engine unit tests
|
|
175
|
+
│ ├── regression/ # New-vs-legacy regression tests
|
|
176
|
+
│ └── benchmarks/ # Performance benchmarks
|
|
177
|
+
├── python/ # Cython bindings (scikit-build)
|
|
178
|
+
├── docs/ # Doxygen config and technical manuals
|
|
179
|
+
└── .github/workflows/ # CI/CD pipelines
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Libraries Built
|
|
183
|
+
|
|
184
|
+
| Target | Description |
|
|
185
|
+
|---|---|
|
|
186
|
+
| `openswmm_legacy_engine` | Original EPA SWMM 5.x solver (shared) |
|
|
187
|
+
| `openswmm_legacy_output` | Original SWMM binary output reader (shared) |
|
|
188
|
+
| `openswmm_engine` | New refactored C++20 engine (shared) |
|
|
189
|
+
| `openswmm_geopackage` | GeoPackage I/O (static, optional — requires SQLite3) |
|
|
190
|
+
| `openswmm_plugin_sdk` | Header-only plugin SDK (INTERFACE) |
|
|
191
|
+
| `openswmm_cli` | Command-line executable |
|
|
192
|
+
|
|
193
|
+
## Contributing
|
|
194
|
+
|
|
195
|
+
Contributions are welcome — bug reports, fixes, new features, docs, tests, and benchmarks.
|
|
196
|
+
|
|
197
|
+
1. Read [CONTRIBUTING.md](CONTRIBUTING.md) for the development workflow and the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
198
|
+
2. Fork the repo and create a feature branch.
|
|
199
|
+
3. Ensure C++ (`ctest`) and Python (`pytest`) tests pass.
|
|
200
|
+
4. Follow existing style and naming.
|
|
201
|
+
5. Open a PR against `develop`.
|
|
202
|
+
|
|
203
|
+
### Contributor License Agreement
|
|
204
|
+
|
|
205
|
+
First-time contributors must sign the project [CLA](CLA.md) before a pull request can be merged. The CLA grants the project a perpetual, royalty-free copyright and patent license to your contributions and preserves the project's ability to relicense in the future; **you retain full copyright ownership** of your work.
|
|
206
|
+
|
|
207
|
+
Signing is automated through [CLA Assistant](https://cla-assistant.io) — when you open your first PR, a bot comments with a one-click sign-in link. The CLA covers all subsequent contributions, so you only sign once. Corporate contributors should additionally submit a CCLA per [CLA §6](CLA.md#6-corporate-contributors).
|
|
208
|
+
|
|
209
|
+
## License
|
|
210
|
+
|
|
211
|
+
MIT — see [LICENSE](LICENSE). Original EPA SWMM material is in the public domain under 17 USC § 105.
|
|
212
|
+
|
|
213
|
+
## Acknowledgements
|
|
214
|
+
|
|
215
|
+
OpenSWMM builds on the EPA Storm Water Management Model. See [docs/authors.md](docs/authors.md) for the full contributor list.
|
|
@@ -172,12 +172,18 @@ function(add_cython_extension)
|
|
|
172
172
|
)
|
|
173
173
|
|
|
174
174
|
# ── RPATH + symbol export, per platform ───────────────────────────────
|
|
175
|
+
# INSTALL_RPATH covers three deployment layouts:
|
|
176
|
+
# @loader_path / $ORIGIN — wheel: dylib bundled next to .so
|
|
177
|
+
# ../../../lib (3 levels up) — conda/venv env lib from
|
|
178
|
+
# site-packages/openswmm/engine/
|
|
179
|
+
# CMAKE_INSTALL_RPATH_USE_LINK_PATH (set in python/CMakeLists.txt) appends
|
|
180
|
+
# the engine dylib's install-time directory automatically, covering both
|
|
181
|
+
# pre-built prefix installs and editable builds.
|
|
182
|
+
# BUILD_WITH_INSTALL_RPATH is left FALSE; the build-tree rpath is computed
|
|
183
|
+
# from link directories by CMake automatically.
|
|
175
184
|
if(APPLE)
|
|
176
|
-
# Bundled dylibs sit next to the .so; @loader_path is enough.
|
|
177
185
|
set_target_properties("${ACE_TARGET}" PROPERTIES
|
|
178
|
-
|
|
179
|
-
INSTALL_RPATH "@loader_path"
|
|
180
|
-
BUILD_WITH_INSTALL_RPATH TRUE
|
|
186
|
+
INSTALL_RPATH "@loader_path;@loader_path/../../../lib"
|
|
181
187
|
)
|
|
182
188
|
elseif(UNIX)
|
|
183
189
|
# Hidden visibility + version script keeps PyInit_<name> exported
|
|
@@ -186,9 +192,7 @@ function(add_cython_extension)
|
|
|
186
192
|
file(WRITE "${_map}" "{ global: PyInit_${ACE_NAME}; local: *; };\n")
|
|
187
193
|
target_link_options("${ACE_TARGET}" PRIVATE "-Wl,--version-script=${_map}")
|
|
188
194
|
set_target_properties("${ACE_TARGET}" PROPERTIES
|
|
189
|
-
|
|
190
|
-
INSTALL_RPATH "$ORIGIN"
|
|
191
|
-
BUILD_WITH_INSTALL_RPATH TRUE
|
|
195
|
+
INSTALL_RPATH "$ORIGIN;$ORIGIN/../../../lib"
|
|
192
196
|
)
|
|
193
197
|
elseif(WIN32)
|
|
194
198
|
# MSVC: explicit /EXPORT for the PyInit symbol. delvewheel (in CI)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
# Sphinx build info version 1
|
|
2
2
|
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
|
|
3
|
-
config:
|
|
3
|
+
config: e61651466b00a074a1b3e8b19483bf9d
|
|
4
4
|
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/controls.doctree
RENAMED
|
Binary file
|
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/forcing.doctree
RENAMED
|
Binary file
|
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/hotstart.doctree
RENAMED
|
Binary file
|
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/install.doctree
RENAMED
|
Binary file
|
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/massbalance.doctree
RENAMED
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/model_builder.doctree
RENAMED
|
Binary file
|
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/pollutants.doctree
RENAMED
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/quality.doctree
RENAMED
|
Binary file
|
{openswmm-6.0.0.dev0 → openswmm-6.0.0.dev2}/docs/_build/html/.doctrees/guide/quickstart.doctree
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|