Skip to main content

Hydraulic Engine

Testing CI - Test
Package PyPI Latest Release PyPI Downloads
Meta License - GNU GPL3

A Python package for managing hydraulic calculation actions: EPANET/SWMM simulations, RPT file imports, and more.

Features

  • Run SWMM simulations: Execute Storm Water Management Model simulations
  • Run EPANET simulations: Execute water distribution network simulations
  • Parse INP files: Read and modify SWMM/EPANET input files
  • Parse RPT files: Read and analyze simulation results
  • Multiple database support: PostgreSQL (psycopg3), SQLite, and GeoPackage

Installation

From PyPI

pip install hydraulic-engine

From source

git clone https://github.com/bgeo-gis/hydraulic-engine.git
cd hydraulic-engine
pip install -e .

Development installation

pip install -e ".[dev]"

Quick Start

Running a SWMM Simulation

from hydraulic_engine.swmm import SwmmRunner

runner = SwmmRunner(
    inp_path="drainage_model.inp",
    rpt_path="results.rpt",
    out_path="results.out",
)
result = runner.run()

if result.status.value == "success":
    print(f"Simulation completed in {result.duration_seconds:.2f}s")
    print(f"RPT file: {result.rpt_path}")
else:
    print(f"Errors: {result.errors}")

Running an EPANET Simulation

from hydraulic_engine.epanet import EpanetRunner

runner = EpanetRunner(
    inp_path="water_network.inp",
    rpt_path="results.rpt",
    bin_path="results.bin",
)
result = runner.run()

if result.status.value == "success":
    print(f"Simulation completed in {result.duration_seconds:.2f}s")

Reading SWMM INP Files

from hydraulic_engine.swmm import SwmmInpHandler

handler = SwmmInpHandler()
handler.load_file("model.inp")

summary = handler.get_summary()
print(f"Junctions: {summary['counts']['junctions']}")
print(f"Conduits: {summary['counts']['conduits']}")

junctions = handler.get_junctions()
conduits = handler.get_conduits()

handler.write("modified_model.inp")

Reading SWMM Results

from hydraulic_engine.swmm import SwmmRptHandler

handler = SwmmRptHandler()
handler.load_file("results.rpt")

node_depths = handler.get_node_depth_summary()
link_flows = handler.get_link_flow_summary()

Progress Tracking

from hydraulic_engine.swmm import SwmmRunner

def on_progress(progress: int, message: str):
    print(f"[{progress}%] {message}")

runner = SwmmRunner(inp_path="model.inp", progress_callback=on_progress)
result = runner.run()

Database Connection

The package supports database connections for storing/retrieving model data.

PostgreSQL Connection

import hydraulic_engine as he

conn = he.create_pg_connection(
    host="localhost",
    port=5432,
    dbname="hydraulic_db",
    user="user",
    password="pass",
    schema="my_schema",
)

rows = conn.get_rows("SELECT * FROM nodes")

he.close_connection()

GeoPackage Connection

import hydraulic_engine as he

conn = he.create_gpkg_connection("project.gpkg")

rows = conn.get_rows("SELECT * FROM conduits")

he.close_connection()

Package Structure

hydraulic-engine/
├── src/
│   └── hydraulic_engine/
│       ├── __init__.py
│       ├── exceptions.py
│       ├── config/
│       │   └── config.py
│       ├── epanet/
│       │   ├── runner.py            # Run EPANET simulations
│       │   ├── inp_handler.py       # Parse/write EPANET INP files
│       │   ├── bin_handler.py       # Parse EPANET binary result files
│       │   ├── file_handler.py
│       │   └── models.py
│       ├── swmm/
│       │   ├── runner.py            # Run SWMM simulations
│       │   ├── inp_handler.py       # Parse/write SWMM INP files
│       │   ├── rpt_handler.py       # Parse SWMM RPT files
│       │   ├── out_handler.py       # Parse SWMM OUT files
│       │   ├── file_handler.py
│       │   └── models.py
│       └── utils/
│           ├── tools_log.py
│           ├── tools_db.py
│           ├── tools_api.py
│           ├── tools_os.py
│           ├── tools_config.py
│           └── tools_sensorthings.py
├── tests/
├── pyproject.toml
└── README.md

API Reference

SWMM Classes

Class Description
SwmmRunner Run SWMM simulations
SwmmInpHandler Read/write SWMM INP files
SwmmRptHandler Parse SWMM RPT result files
SwmmOutHandler Parse SWMM OUT result files

EPANET Classes

Class Description
EpanetRunner Run EPANET simulations
EpanetInpHandler Read/write EPANET INP files
EpanetBinHandler Parse EPANET BIN result files

Connection Functions

Function Description
create_pg_connection(...) Create PostgreSQL connection
create_gpkg_connection(gpkg_path) Create GeoPackage connection
create_sqlite_connection(db_path) Create SQLite connection
get_connection() Get current default connection
close_connection() Close default connection

Dependencies

  • Python >= 3.9
  • pyswmm >= 2.0.0 (SWMM simulation engine)
  • swmm-api >= 0.4.31 (INP/RPT file parsing)
  • wntr >= 1.2.0 (EPANET simulations)
  • psycopg[binary] >= 3.1.0
  • requests >= 2.28.0
  • pyproj >= 3.6.0

Development

Running tests

pytest tests/

Code formatting

black src/
ruff check src/

License

GNU General Public License v3.0 or later - see LICENSE.

Authors

BGEO - info@bgeo.es

Download files

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

Source Distribution

hydraulic_engine-0.6.0.tar.gz (76.6 kB view details)

Uploaded Source

Built Distribution

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

hydraulic_engine-0.6.0-py3-none-any.whl (84.9 kB view details)

Uploaded Python 3

File details

Details for the file hydraulic_engine-0.6.0.tar.gz.

File metadata

  • Download URL: hydraulic_engine-0.6.0.tar.gz
  • Upload date:
  • Size: 76.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for hydraulic_engine-0.6.0.tar.gz
Algorithm Hash digest
SHA256 9d7c1651fda6e0b7395399a23ea15105852485b37b21dbde1091cccaf9c4d3d6
MD5 fdbbd22ce1533c620388f6191e9743d9
BLAKE2b-256 e4948b256cfde95809f7a48b1225ba277c58620832d10cb4926e94ab53489a91

See more details on using hashes here.

Provenance

The following attestation bundles were made for hydraulic_engine-0.6.0.tar.gz:

Publisher: publish-to-pypi.yml on bgeo-gis/hydraulic-engine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file hydraulic_engine-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for hydraulic_engine-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 03d1703bb12579d7b69b8f7ec59e7ff2cb407190ea5ecbd3feff74ef7424d6e6
MD5 ac96075145ba79dacd523c79c15dc349
BLAKE2b-256 6e8e437550b8e46adb1cc493dd9ad7055b897e5e4c31c9820107e6f4c2ab68a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for hydraulic_engine-0.6.0-py3-none-any.whl:

Publisher: publish-to-pypi.yml on bgeo-gis/hydraulic-engine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.7.0

2 files

This release

0.6.0 This release

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

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