Skip to main content

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

Project description

Hydraulic Engine

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

import hydraulic_engine as he

# Create runner
runner = he.SwmmRunner(inp_path="drainage_model.inp")

# Run simulation
result = runner.run()

# Check results
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

import hydraulic_engine as he

# Create runner
runner = he.EpanetRunner(inp_path="water_network.inp")

# Run simulation
result = runner.run()

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

Reading SWMM INP Files

import hydraulic_engine as he

# Create handler
handler = he.SwmmInpHandler()

# Read INP file
if handler.read("model.inp"):
    # Get model summary
    summary = handler.get_summary()
    print(f"Junctions: {summary['counts']['junctions']}")
    print(f"Conduits: {summary['counts']['conduits']}")

    # Get specific sections
    junctions = handler.get_junctions()
    conduits = handler.get_conduits()

    # Modify and save
    handler.write("modified_model.inp")

Reading SWMM Results

import hydraulic_engine as he

# Create handler
handler = he.SwmmRptHandler()

# Read RPT file
if handler.load_result("results.rpt"):
    # Get results
    node_depths = handler.get_node_depth_summary()
    link_flows = handler.get_link_flow_summary()

Validating INP Files

import hydraulic_engine as he

# Validate without running
runner = he.SwmmRunner()
validation = runner.validate_inp("model.inp")

if validation["valid"]:
    print(f"Model info: {validation['info']}")
else:
    print(f"Validation errors: {validation['errors']}")

Progress Tracking

import hydraulic_engine as he

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

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

Database Connection

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

PostgreSQL Connection

import hydraulic_engine as he

# Create connection (becomes the default)
conn = he.create_pg_connection(
    host="localhost",
    port=5432,
    dbname="hydraulic_db",
    user="user",
    password="pass",
    schema="my_schema"
)

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

# Close when done
he.close_connection()

GeoPackage Connection

import hydraulic_engine as he

# Create connection
conn = he.create_gpkg_connection("project.gpkg")

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

# Close when done
he.close_connection()

Package Structure

hydraulic-engine/
├── src/
│   └── hydraulic_engine/
│       ├── __init__.py│
│       ├── config/
│       │   ├── config.py
│       ├── core/
│       │   ├── swmm/                    # SWMM-specific functionality
│       │   │   ├── 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
│       │   ├── epanet/                  # EPANET-specific functionality
│       │   │   ├── runner.py            # Run EPANET simulations
│       │   │   ├── inp_handler.py       # Parse/write EPANET INP files
│       │   │   └── bin_handler.py       # Parse EPANET BINARY files
│       │   └── utils/                   # Shared utilities
│       │       ├── tools_log.py
│       │       ├── tools_db.py
│       │       └── tools_api.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.60 (INP/RPT file parsing)
  • wntr >= 1.0.0 (EPANET simulations)
  • psycopg[binary] >= 3.1.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

Project details


Download files

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

Source Distribution

hydraulic_engine-0.1.0.tar.gz (70.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.1.0-py3-none-any.whl (76.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: hydraulic_engine-0.1.0.tar.gz
  • Upload date:
  • Size: 70.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for hydraulic_engine-0.1.0.tar.gz
Algorithm Hash digest
SHA256 544b6a8a243782f56e30f5b8c5d73d264e5165fc777921f236ffa9e1d11f67b4
MD5 715790cf1040ec46cb08d2636ac8bab4
BLAKE2b-256 fd80938e4a53440f1f86fa77fbeb4917b0a43174af42d4660ee96f68cf8558fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for hydraulic_engine-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c90d190f52bcfbf57b2954812c21831925beb4f3afbbb6006788e1a9c69669de
MD5 0dc129d0393b0ff8b55fd359ec3aafaa
BLAKE2b-256 768362f1b2123e0c15b11d7a929e04673b9f074fd5e81cc7ddb14b5353d7d90d

See more details on using hashes here.

Supported by

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