rs_route 0.3.1

A cli tool for muskingum-cunge routing in ngiab
# rs-route

A Rust implementation of Muskingum-Cunge channel routing for [NextGen](https://github.com/NOAA-OWP/ngen) hydrological modeling frameworks, inspired by [t-route](https://github.com/NOAA-OWP/t-route).

## Features

- **Multiple routing kernels**: Pure Rust, modernized Fortran (t-route), legacy Fortran (t-route), and C implementations
- **Parallel wave-front routing**: Processes independent network branches concurrently using topological ordering
- **NetCDF and CSV output**: Produces t-route-compatible NetCDF output files
- **GeoPackage input**: Reads network topology and channel parameters from NextGen hydrofabric GeoPackage databases

## Project Structure

```
src/
├── main.rs            # Entry point and simulation orchestration
├── cli.rs             # Command-line interface (clap)
├── config.rs          # Configuration structures
├── network.rs         # Network topology and database operations
├── state.rs           # Node status tracking
├── routing.rs         # Parallel wave-front routing engine
├── io/
│   ├── csv.rs         # CSV reading/writing
│   ├── netcdf.rs      # NetCDF output
│   └── results.rs     # Simulation results storage
└── kernel/
    └── muskingum/
        ├── mod.rs           # Kernel dispatcher
        ├── rs_route/
        │   └── mc_kernel.rs # Pure Rust Muskingum-Cunge implementation
        ├── t_route.rs       # Fortran t-route FFI bindings
        ├── t-route/         # Fortran source (modernized + legacy)
        ├── c_mc.rs          # C Muskingum-Cunge FFI bindings
        └── c_mc/            # C source
```

## Dependencies

### System libraries

- `libhdf5-dev`
- `libnetcdf-dev`
- `libsqlite3-dev`
- `gfortran`
- `gcc`

On Ubuntu/Debian:
```bash
sudo apt install -y libhdf5-dev libnetcdf-dev libsqlite3-dev gfortran gcc
```

### Rust

Requires Rust 1.85+ (edition 2024). Install via [rustup](https://rustup.rs/).

## Building and Running

```bash
# Build in release mode
cargo build --release

# Run routing on a NextGen output directory
cargo run --release -- <path/to/ngen-run-directory>
```

### CLI Options

```
Usage: rs-route [OPTIONS] <ROUTE_DIR>

Arguments:
  <ROUTE_DIR>  Path to NextGen run directory

Options:
  -i, --internal-timestep-seconds <N>  Internal routing timestep in seconds [default: 300]
  -k, --kernel <KERNEL>                Routing kernel to use [default: t-route-modernized]
                                       [possible values: route-rs, t-route-modernized,
                                       t-route-legacy, c-muskingum-cunge]
```

### Expected directory structure

The target directory should follow the NextGen output convention:
```
<route_dir>/
├── config/
│   └── *.gpkg          # Hydrofabric GeoPackage
└── outputs/
    ├── ngen/            # NextGen model output CSVs (cat-*.csv)
    └── troute/          # Routing output directory
```

## Testing

```bash
cargo test
```

A small test dataset is included in `tests/one_cat/` for integration testing.

## License

[MIT](LICENSE)