mizuRoute Routing Model Guide#
Overview#
mizuRoute (mizuRoute: Standalone Runoff Routing) is a multi-method river network routing model developed at the University of Washington and NCAR. It routes runoff generated by land surface or hydrological models through river networks, transforming catchment-scale runoff into streamflow at any point in the network.
Key Capabilities:
Multiple routing methods (IRF, KWT, KW, MC, DW)
Scalable from headwaters to continental basins
NetCDF-based input/output
Parallel execution support
Lake and reservoir representation
Flexible river network structures
Couples with multiple hydrological models
Configurable routing parameters
Typical Applications:
Distributed hydrological model routing (SUMMA, FUSE, GR, HYPE)
Continental-scale streamflow routing
Flood wave propagation
Reservoir operations
Water resources management
Multi-model ensembles
Climate change impact assessment
Spatial Scales: Sub-basin (1 km²) to continental (millions of km²)
Temporal Resolution: Sub-hourly to daily
Routing Methods#
mizuRoute supports five routing schemes with varying complexity and computational cost:
1. Impulse Response Function (IRF)#
Method: Unit hydrograph convolution
Characteristics:
Fastest method
Lumped river reach routing
Based on gamma distribution
No backwater effects
Good for large-scale applications
Parameters:
Shape parameter (unitShape)
Time scale (unitScale)
Best for: Continental/regional scale, operational forecasting
Equation:
Q(t) = Σ runoff(τ) × IRF(t-τ)
where IRF(t) = Gamma distribution(shape, scale)
2. Kinematic Wave Tracking (KWT)#
Method: Kinematic wave with particle tracking
Characteristics:
Moderate computational cost
Tracks water parcels through network
Accounts for variable wave speed
No diffusion
Good accuracy for most applications
Parameters:
Manning’s n
Channel geometry
Wave celerity
Best for: Regional applications, research studies
Advantages:
Mass conservative
Handles complex networks well
Reasonable computational cost
3. Kinematic Wave (KW)#
Method: Simplified kinematic wave
Characteristics:
Similar to KWT but simplified
Faster than KWT
Good for steep channels
No backwater effects
Parameters:
Manning’s n
Channel slope
Channel geometry
Best for: Mountainous regions, headwater routing
4. Muskingum-Cunge (MC)#
Method: Variable parameter Muskingum-Cunge
Characteristics:
Moderate complexity
Accounts for some diffusion
Better for lowland rivers
More physically-based than IRF
Parameters:
X: Weighting factor (0-0.5)
K: Storage coefficient
Best for: Lowland rivers, moderate slopes
5. Diffusive Wave (DW)#
Method: Diffusive wave approximation
Characteristics:
Most complex/accurate
Accounts for backwater effects
Computationally expensive
Good for flat terrain
Parameters:
Manning’s n
Channel geometry
Boundary conditions
Best for: Lowland/delta regions, backwater-dominated systems
Limitations: Slow for large networks
Method Comparison#
Method |
Speed |
Accuracy |
Backwater |
Best Use |
Complexity |
|---|---|---|---|---|---|
IRF |
Fastest |
Moderate |
No |
Continental |
Low |
KWT |
Fast |
Good |
No |
Regional |
Moderate |
KW |
Fast |
Good |
No |
Mountains |
Moderate |
MC |
Moderate |
Good |
Partial |
Lowlands |
Moderate |
DW |
Slow |
Best |
Yes |
Deltas |
High |
Configuration in SYMFLUENCE#
Enabling mizuRoute#
ROUTING_MODEL: mizuRoute
# Specify for model-specific integration
FUSE_ROUTING_INTEGRATION: mizuRoute
# or
GR_ROUTING_INTEGRATION: mizuRoute
Key Configuration Parameters#
Routing Method Selection#
Parameter |
Default |
Description |
|---|---|---|
MIZUROUTE_METHOD |
KWT |
Routing method (IRF, KWT, KW, MC, DW) |
MIZUROUTE_DT |
3600 |
Routing timestep (seconds) |
Network Configuration#
Parameter |
Default |
Description |
|---|---|---|
MIZUROUTE_NETWORK_FILE |
auto |
River network topology file |
MIZUROUTE_PARAM_FILE |
auto |
River reach parameters file |
Channel Parameters#
Parameter |
Default |
Description |
|---|---|---|
MIZUROUTE_MANNING_N |
0.03 |
Manning’s roughness coefficient |
MIZUROUTE_CHANNEL_WIDTH |
auto |
Channel width [m] (from network or default) |
MIZUROUTE_CHANNEL_SLOPE |
auto |
Channel slope [-] (from DEM) |
Output Configuration#
Parameter |
Default |
Description |
|---|---|---|
MIZUROUTE_OUTPUT_VARS |
all |
Variables to output |
MIZUROUTE_OUTPUT_FREQ |
daily |
Output frequency (hourly, daily, monthly) |
Input File Specifications#
River Network Topology#
File: network_topology.nc
NetCDF file defining river network structure:
dimensions:
seg = 5000 ! Number of river segments
upSegments = 10 ! Max upstream segments per segment
variables:
int segId(seg) ! Segment ID
int downSegId(seg) ! Downstream segment ID (-999 = outlet)
int upSegIds(seg, upSegments) ! Upstream segment IDs
int nUpstream(seg) ! Number of upstream segments
! Segment attributes
float length(seg) ! Segment length [m]
float slope(seg) ! Channel slope [-]
float width(seg) ! Channel width [m]
float mannings_n(seg) ! Manning's n [-]
Example values:
segId: [1, 2, 3, 4, 5, ...]
downSegId: [2, 3, 4, -999, 3, ...] ! Seg 4 is outlet
length: [5000, 8000, 12000, 15000, 6000, ...] ! meters
slope: [0.01, 0.008, 0.005, 0.002, 0.012, ...]
width: [15, 25, 40, 80, 12, ...] ! meters
Runoff Input#
File: runoff_input.nc
Catchment runoff time series:
dimensions:
time = UNLIMITED
seg = 5000
variables:
double time(time) ! Time coordinate
float runoff(time, seg) ! Runoff [mm/timestep or m³/s]
float runoffArea(seg) ! Catchment area [m²]
Units:
Runoff: Can be [mm/timestep], [mm/day], or [m³/s]
mizuRoute converts based on runoffArea
Example:
time: [0, 3600, 7200, 10800, ...] ! seconds since reference
runoff(seg=1): [2.5, 2.3, 3.8, ...] ! mm/hour
runoff(seg=2): [1.8, 1.6, 2.4, ...]
Parameter File#
File: mizuRoute_param.nc
Method-specific routing parameters:
dimensions:
seg = 5000
variables:
! IRF parameters
float IRFroutingParams_shape(seg) ! Gamma shape
float IRFroutingParams_scale(seg) ! Gamma scale [hours]
! KWT parameters
float KWTroutingParams_waveSpeed(seg) ! Wave celerity [m/s]
! MC parameters
float MCroutingParams_K(seg) ! Storage coefficient
float MCroutingParams_X(seg) ! Weighting factor
Lake/Reservoir Data#
File (optional): lake_data.nc
dimensions:
lake = 50
time = UNLIMITED
variables:
int lakeId(lake)
int lakeSegId(lake) ! Segment containing lake
float lakeArea(lake) ! Lake area [m²]
float lakeDepth(lake) ! Mean depth [m]
float lakeOutflow(time, lake) ! Prescribed outflow [m³/s]
Output File Specifications#
Routed Streamflow#
File: mizuRoute_output.nc
dimensions:
time = UNLIMITED
seg = 5000
variables:
double time(time)
! Streamflow by routing method
float dlayRunoff(time, seg) ! IRF routed flow [m³/s]
float KWTroutedRunoff(time, seg) ! KWT routed flow [m³/s]
float KWroutedRunoff(time, seg) ! KW routed flow [m³/s]
float MCroutedRunoff(time, seg) ! MC routed flow [m³/s]
float DWroutedRunoff(time, seg) ! DW routed flow [m³/s]
! Instantaneous (unrouted) runoff
float instRunoff(time, seg) ! Direct runoff [m³/s]
! States
float reachVolume(time, seg) ! Water volume in reach [m³]
float reachDepth(time, seg) ! Water depth [m]
State Files#
File: restart_state.nc
For continuing simulations:
dimensions:
seg = 5000
wave = 1000 ! Number of tracked waves (for KWT)
variables:
float reachVolume(seg)
float waveTime(seg, wave)
float waveVolume(seg, wave)
Model-Specific Workflows#
Basic mizuRoute Workflow#
Route distributed FUSE output:
# config.yaml
DOMAIN_NAME: my_basin
HYDROLOGICAL_MODEL: FUSE
# Distributed FUSE
FUSE_SPATIAL_MODE: distributed
DOMAIN_DEFINITION_METHOD: semidistributed
POUR_POINT_COORDS: [-120.0, 45.0]
# Enable mizuRoute
ROUTING_MODEL: mizuRoute
FUSE_ROUTING_INTEGRATION: mizuRoute
# Routing configuration
MIZUROUTE_METHOD: KWT # Kinematic wave tracking
MIZUROUTE_DT: 3600 # 1-hour timestep
Run:
symfluence workflow run --config config.yaml
# FUSE generates runoff per HRU
# mizuRoute routes through river network
# Output: Streamflow at basin outlet
Continental-Scale Routing#
For large domains (e.g., CONUS, Europe):
# config.yaml
DOMAIN_DEFINITION_METHOD: merit_basins
MERIT_BASIN_IDS: [...] # 10,000+ subcatchments
HYDROLOGICAL_MODEL: SUMMA
ROUTING_MODEL: mizuRoute
# Use fast IRF method for computational efficiency
MIZUROUTE_METHOD: IRF
# Parallel execution
NUM_PROCESSES: 256
# Daily output sufficient for large scale
MIZUROUTE_OUTPUT_FREQ: daily
Flood Forecasting Application#
Hourly routing for flood events:
# config.yaml
HYDROLOGICAL_MODEL: GR
GR_SPATIAL_MODE: distributed
ROUTING_MODEL: mizuRoute
# Use accurate method
MIZUROUTE_METHOD: MC # Muskingum-Cunge
# Sub-hourly timestep for flood peaks
MIZUROUTE_DT: 1800 # 30 minutes
# Hourly output
MIZUROUTE_OUTPUT_FREQ: hourly
Reservoir Operations#
Include reservoir routing:
# config.yaml
ROUTING_MODEL: mizuRoute
# Provide lake/reservoir data
MIZUROUTE_LAKE_FILE: ./reservoirs.nc
# Use method that handles storage well
MIZUROUTE_METHOD: KWT
# Reservoirs controlled by release rules in lake file
Calibration Strategies#
Routing Parameters#
For IRF method:
# Calibrate gamma distribution parameters
MIZUROUTE_PARAMS_TO_CALIBRATE: "IRF_shape,IRF_scale"
IRF_shape: [1.0, 5.0] # Gamma shape parameter
IRF_scale: [1.0, 100.0] # Time scale [hours]
For KWT/KW methods:
MIZUROUTE_PARAMS_TO_CALIBRATE: "mannings_n,channel_width"
mannings_n: [0.01, 0.15] # Roughness coefficient
channel_width: [5, 200] # Channel width [m]
For MC method:
MIZUROUTE_PARAMS_TO_CALIBRATE: "MC_K,MC_X"
MC_K: [0.5, 48.0] # Storage coefficient [hours]
MC_X: [0.0, 0.5] # Weighting factor [-]
Parameter Regionalization#
For large networks, use regional relationships:
# Manning's n by stream order
stream_order_1-2: n = 0.05-0.10 # Small streams
stream_order_3-4: n = 0.03-0.05 # Medium rivers
stream_order_5+: n = 0.02-0.04 # Large rivers
# Channel width by drainage area
width = a × Area^b
# Typical: a = 2-5, b = 0.4-0.5
Calibration Workflow#
Run hydrological model first (SUMMA, FUSE, etc.)
Generate runoff fields
Calibrate routing separately:
# Fix hydrology parameters # Calibrate only routing parameters CALIBRATION_PHASE: routing_only OPTIMIZATION_ALGORITHM: DDS OPTIMIZATION_MAX_ITERATIONS: 500 # Use streamflow gauge at outlet OPTIMIZATION_METRIC: KGE
Known Limitations#
Network Topology Required:
Accurate DEM and flow directions needed
Errors in network propagate
Manual corrections often necessary
Channel Geometry:
Width, depth often poorly constrained
Default relationships may not apply everywhere
Observations rare except for large rivers
Computational Cost:
DW method very slow for large networks
KWT faster but still expensive for 10,000+ reaches
IRF fastest but least accurate
Limitations of Methods:
IRF: No backwater, lumped routing
KW/KWT: No backwater, steep channels only
MC: Approximation, not full St. Venant
DW: Expensive, numerical instability possible
Parameter Identifiability:
Manning’s n correlated with channel width
Limited observations for calibration
Often need to fix some parameters
Lakes and Reservoirs:
Simplified representation
Operations rules often unknown
Natural lake rating curves uncertain
Troubleshooting#
Common Issues#
Error: “Network topology file not found”
# Ensure network file exists
MIZUROUTE_NETWORK_FILE: /path/to/network_topology.nc
# Or let SYMFLUENCE generate from domain delineation
# (automatic if using delineate or merit_basins)
Error: “Runoff input dimension mismatch”
Check that runoff file has same segments as network:
ncdump -h runoff_input.nc | grep "seg ="
ncdump -h network_topology.nc | grep "seg ="
# Should match!
Error: “Negative streamflow”
Check routing parameters (Manning’s n too high?)
Verify runoff inputs (no negative values)
Check timestep (too large?)
Inspect network topology (cycles? disconnected segments?)
Very slow execution
# Switch to faster method
MIZUROUTE_METHOD: IRF # From DW or KWT
# Increase timestep (if appropriate)
MIZUROUTE_DT: 86400 # Daily instead of hourly
# Reduce output frequency
MIZUROUTE_OUTPUT_FREQ: daily # From hourly
Unrealistic routing delays
# For IRF: Reduce time scale
IRF_scale: 5 # From 50 hours
# For KWT: Increase wave speed
# (or decrease Manning's n)
mannings_n: 0.025 # From 0.10
Flood peaks too attenuated
Use more accurate method (MC or DW instead of IRF)
Reduce timestep (hourly instead of daily)
Calibrate routing parameters (reduce storage/diffusion)
Missing segments in output
# Check for disconnected segments
python
>>> import netCDF4 as nc
>>> ds = nc.Dataset('network_topology.nc')
>>> down = ds.variables['downSegId'][:]
>>> # Segments with downSegId = -999 are outlets
>>> # All others should connect to an outlet
Performance Optimization#
Speed up routing:
Use IRF method for large-scale applications
Aggregate small headwater reaches
Use coarser timestep (daily vs hourly)
Parallel execution (if network allows decomposition)
Reduce output frequency and variables
Improve accuracy:
Use MC or DW for lowland rivers
Use KWT for moderate complexity
Finer timestep (hourly or sub-hourly)
Calibrate reach-specific parameters (if data supports)
Include lakes/reservoirs explicitly
Optimal method selection:
# Decision tree
if network_size > 10000 and slope > 0.001:
method = 'IRF' # Fast, adequate for steep
elif slope < 0.0001:
method = 'DW' # Backwater important
elif slope > 0.01:
method = 'KW' # Kinematic valid
else:
method = 'KWT' # Good balance
Additional Resources#
mizuRoute Documentation:
GitHub: NCAR/mizuRoute
Documentation: https://mizuroute.readthedocs.io
User guide: https://mizuroute.readthedocs.io/en/latest/
Publications:
Mizukami et al. (2016): “mizuRoute: A river network routing tool” https://doi.org/10.5194/gmd-9-2223-2016
Mizukami et al. (2021): “Towards seamless large-domain parameter estimation” https://doi.org/10.1029/2020WR027511
River Routing Theory:
Lohmann et al. (1996): “A large-scale horizontal routing model”
Chow et al. (1988): “Applied Hydrology” (Muskingum-Cunge method)
SYMFLUENCE-specific:
SUMMA Model Guide: SUMMA + mizuRoute integration
FUSE Model Guide: FUSE + mizuRoute integration
GR Model Guide: GR + mizuRoute integration
Configuration: mizuRoute parameter reference
Troubleshooting: General troubleshooting
River Network Data:
MERIT-Basins: Global river network
NHDPlus: US high-resolution network
HydroSHEDS: Global drainage network
GRDC: Global discharge data for calibration
Example Configurations:
# View mizuRoute examples
symfluence examples list | grep routing
Coupling with Other Models:
SUMMA + mizuRoute: Detailed physics + routing
FUSE + mizuRoute: Structural uncertainty + routing
GR + mizuRoute: Fast benchmarking + routing
HYPE: Has internal routing, mizuRoute optional
Best Practices:
Validate network topology before routing
Start with simple method (IRF) for testing
Use observations at multiple gauges for calibration
Check mass balance (inflow = outflow + storage change)
Visualize results along river network to spot issues