dRoute: Differentiable River Routing Library
A differentiable river routing library for hydrological modeling. dRoute implements multiple routing methods with automatic differentiation support, enabling gradient-based parameter optimization and integration with machine learning workflows.
Note dRoute is in active development - expect experimental code
Features
- 6 Routing Methods: From simple lag routing to Saint-Venant equations
- Dual AD Backends: CoDiPack (tape-based) and Enzyme (source-to-source)
- Network Topology: Full support for river networks with tributaries and confluences
- PyTorch Integration: Use dRoute gradients in ML training loops
Routing Methods
| Method | Class | Physics | Speed | Use Case |
|---|---|---|---|---|
| Muskingum-Cunge | MuskingumCungeRouter |
Kinematic + diffusion approx | ~4,500/s | Production routing |
| Lag | LagRouter |
Time delay buffer | ~20,000/s | Baseline comparison |
| IRF | IRFRouter |
Gamma unit hydrograph | ~1,000/s | Fast calibration |
| KWT-Soft | SoftGatedKWT |
Kinematic wave tracking | ~4,000/s | Differentiable Lagrangian |
| Diffusive Wave | DiffusiveWaveIFT |
Diffusion wave PDE | ~3,000/s | Flood wave attenuation |
| Saint-Venant | SaintVenantRouter |
Full shallow water eqs | ~100/s | High-fidelity benchmark |
Quick Start
Build requirements: CMake 3.15+, a C++17 compiler, and Python development headers. Optional features (NetCDF, Enzyme, SUNDIALS) require those libraries installed.
Build Options
CMake Options
| Option | Default | Description |
|---|---|---|
DMC_BUILD_PYTHON |
OFF | Build Python bindings |
DMC_USE_CODIPACK |
ON | Enable CoDiPack AD |
DMC_ENABLE_ENZYME |
OFF | Enable Enzyme AD backend |
DMC_ENABLE_SUNDIALS |
OFF | Enable SUNDIALS for SVE solver |
DMC_ENABLE_NETCDF |
OFF | Enable NetCDF topology I/O |
DMC_ENABLE_OPENMP |
OFF | Enable OpenMP parallelization |
DMC_BUILD_TESTS |
ON | Build C++ test suite |
Build with All Features
cmake -S . -B build \
-DDMC_BUILD_PYTHON=ON \
-DDMC_ENABLE_ENZYME=ON \
-DDMC_ENABLE_SUNDIALS=ON \
-DSUNDIALS_ROOT=/path/to/sundials/install \
-DDMC_ENABLE_NETCDF=ON
-DMC_ENABLE_OPENMP=ON
cmake --build build -j4
macOS (Apple Silicon)
brew install cmake netcdf sundials
cmake -S . -B build -DDMC_BUILD_PYTHON=ON -DDMC_ENABLE_SUNDIALS=ON
cmake --build build -j$(sysctl -n hw.ncpu)
Python installation
git clone https://github.com/DarriEy/dRoute.git
cd dRoute
pip install -e .
# Or use PyPi
pip install droute
Data
Download Sample Data
The example dataset is hosted as a GitHub release asset (v0.5.0).
python scripts/download_data.py
Run with Sample Data
# Forward pass comparison (all methods)
python python/test_routing_with_data.py --data-dir data
# Fast optimization with Enzyme kernels (30 epochs in ~30s)
python python/test_routing_with_data.py --data-dir data --optimize --fast
# Include Saint-Venant high-fidelity benchmark
python python/test_routing_with_data.py --data-dir data --sve
Architecture
dRoute/
├── include/dmc/
│ ├── router.hpp # MuskingumCungeRouter with CoDiPack AD
│ ├── advanced_routing.hpp # IRF, KWT, Diffusive routers
│ ├── kernels_enzyme.hpp # Enzyme-compatible kernels (all 5 methods)
│ ├── unified_router.hpp # EnzymeRouter wrapper
│ ├── saint_venant_router.hpp # Full SVE with SUNDIALS CVODES
│ ├── network.hpp # Network topology
│ └── types.hpp # AD type definitions
├── python/
│ ├── bindings.cpp # pybind11 bindings
│ └── test_routing_with_data.py
├── tests/ # C++ test suite
└── CMakeLists.txt
Requirements
- C++17 compiler (GCC 7+, Clang 5+, MSVC 2019+)
- CMake 3.15+
- pybind11 (auto-downloaded if not found)
- CoDiPack (auto-downloaded)
- Optional: Enzyme, SUNDIALS, NetCDF-C, OpenMP
Citation
@software{dRoute2025,
title={dRoute: Differentiable River Routing Library},
author={Eythorsson, Darri},
year={2024},
url={https://github.com/DarriEy/dRoute}
}
License
MIT License - see LICENSE for details.
Acknowledgments
Metadata
Release files for droute 0.6.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| droute-0.6.1.tar.gz | 197.9 kB | Without provenance | Details for droute-0.6.1.tar.gz |
Release files / droute-0.6.1.tar.gz
| Download URL | droute-0.6.1.tar.gz |
|---|---|
| Size | 197.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1c1bb3bf7461f7370f9f617a584aca366b935258f064a0aaaddb09d04488c860
|
|
BLAKE2b-256 checksum How to use checksums |
bb5a5bf7c9e82f2af1b3f65d73a30af99b544223e26202390690004d94bdae8c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Security for droute 0.6.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.