NGEN Model Guide#
Overview#
NGEN (NOAA Next Generation Water Resources Modeling Framework) is a modular, interoperable hydrological modeling framework developed by NOAA’s Office of Water Prediction. NGEN uses the Basic Model Interface (BMI) to couple multiple process modules, enabling flexible model configuration and community-driven model development.
Key Capabilities:
Modular BMI-compliant process models
Multiple formulation combinations (CFE, Noah-OWP-M, TOPMODEL, LSTM, etc.)
Catchment-based spatial structure (HY_Features)
T-Route routing integration
JSON-based configuration
Python and C++ module support
Flexible time stepping
National Water Model (NWM) compatibility
Typical Applications:
Operational flood forecasting (National Water Model)
Research model intercomparison
Process module testing and development
Continental-scale hydrology
Data assimilation experiments
Ensemble streamflow prediction
Spatial Scales: Catchment (1-100 km²) to continental
Temporal Resolution: Hourly (operational) to sub-hourly
NGEN Architecture#
Basic Model Interface (BMI)#
NGEN uses BMI to standardize model coupling:
BMI Functions:
initialize(): Set up modelupdate(): Advance one time stepget_value(): Retrieve state/fluxset_value(): Update state/fluxfinalize(): Clean up
This allows any BMI-compliant model to plug into NGEN.
Core Modules#
1. CFE (Conceptual Functional Equivalent)
Conceptual rainfall-runoff model
Inspired by NWM/Sacramento
Soil moisture accounting
Fast, simple, robust
2. Noah-OWP-M (Noah-MP for OWP)
Land surface model
Energy and water balance
Snow physics
Vegetation dynamics
More complex than CFE
3. PET Modules
pet_fao56: FAO-56 Penman-Monteithpet_priestley_taylor: Simplified PETpet_hargreaves: Temperature-based PET
4. TOPMODEL
Topographic index-based model
Variable source area concept
5. LSTM (Machine Learning)
Data-driven runoff prediction
Can replace physics-based modules
6. T-Route
Channel routing
Diffusive wave or Muskingum-Cunge
Formulation Combinations#
NGEN’s power is combining modules:
Example 1: CFE + PET
Forcing → PET Module → CFE Module → Runoff → T-Route
Example 2: Noah-OWP-M (standalone)
Forcing → Noah-OWP-M (includes internal PET) → Runoff → T-Route
Example 3: TOPMODEL + LSTM
Forcing → TOPMODEL → LSTM Correction → Runoff
Configuration in SYMFLUENCE#
Model Selection#
model:
hydrological_model: NGEN
routing_model: none
ngen:
modules_selected: "SLOTH,PET,CFE"
modules_to_calibrate: "CFE"
cfe_params_to_calibrate: "maxsmc,satdk,bb,slop"
SYMFLUENCE still accepts legacy flat keys such as HYDROLOGICAL_MODEL and
DOMAIN_NAME, but new examples use the nested YAML format. In nested
configs, domain must be a mapping with required fields such as
name, experiment_id, time_start, time_end,
definition_method, and discretization.
Key Configuration Parameters#
Installation and Execution#
Parameter |
Default |
Description |
|---|---|---|
NGEN_INSTALL_PATH |
default |
Path to NGEN installation |
NGEN_EXE |
ngen |
NGEN executable name |
NGEN_ACTIVE_CATCHMENT_ID |
null |
Specific catchment to simulate (or null for all) |
Module Selection#
Parameter |
Default |
Description |
|---|---|---|
NGEN_MODULES_TO_CALIBRATE |
null |
Which modules to calibrate (CFE, NOAH, PET) |
Calibration Parameters#
CFE Module:
Parameter |
Default |
Description |
|---|---|---|
NGEN_CFE_PARAMS_TO_CALIBRATE |
null |
CFE parameters (maxsmc, Ksat, b, etc.) |
Noah-OWP-M Module:
Parameter |
Default |
Description |
|---|---|---|
NGEN_NOAH_PARAMS_TO_CALIBRATE |
null |
Noah parameters (REFKDT, SMCMAX, etc.) |
PET Module:
Parameter |
Default |
Description |
|---|---|---|
NGEN_PET_PARAMS_TO_CALIBRATE |
null |
PET parameters (albedo, etc.) |
Input File Specifications#
NGEN uses JSON for configuration and NetCDF/CSV for data.
Realization Configuration (JSON)#
File: realization.json
Defines which modules to use and how they connect:
{
"global": {
"formulations": [
{
"name": "bmi_c",
"params": {
"model_type_name": "CFE",
"library_file": "./extern/cfe/cmake_build/libcfemodel.so",
"init_config": "./config/cfe_config.json",
"main_output_variable": "Q_OUT",
"variables_names_map": {
"QINSUR": "surface_runoff",
"QSUB": "subsurface_runoff"
},
"uses_forcing_file": false
}
},
{
"name": "bmi_c",
"params": {
"model_type_name": "PET",
"library_file": "./extern/evapotranspiration/cmake_build/libpetmodel.so",
"init_config": "./config/pet_config.json",
"main_output_variable": "water_potential_evaporation_flux"
}
}
]
},
"time": {
"start_time": "2015-01-01 00:00:00",
"end_time": "2020-12-31 23:00:00",
"output_interval": 3600
},
"catchments": {
"cat-123": {
"formulations": [
{
"name": "bmi_c",
"params": {"model_type_name": "CFE"}
}
]
}
}
}
CFE Configuration (JSON)#
File: cfe_config.json
{
"forcing_file": "cat_123_forcing.csv",
"soil_params": {
"depth": 2.0,
"b": 4.05,
"mult": 1000.0,
"satdk": 0.00000338,
"satpsi": 0.355,
"slop": 0.1,
"smcmax": 0.439,
"wltsmc": 0.066
},
"max_gw_storage": 0.01,
"Cgw": 0.01,
"expon": 6.0,
"gw_storage": 0.05,
"alpha_fc": 0.33,
"soil_storage": 0.05,
"K_nash": 0.03,
"K_lf": 0.01,
"nash_storage": [0.0, 0.0, 0.0],
"giuh_ordinates": [0.06, 0.51, 0.28, 0.12, 0.03]
}
Noah-OWP-M Configuration (JSON)#
File: noah_config.json
{
"forcing_file": "cat_123_forcing.csv",
"soil_params": {
"smcmax": [0.439, 0.421, 0.434, 0.476],
"smcwlt": [0.010, 0.028, 0.047, 0.084],
"smcref": [0.283, 0.249, 0.236, 0.219],
"bexp": [4.26, 4.74, 5.33, 5.33],
"satdk": [1.07e-5, 1.41e-5, 5.23e-6, 2.81e-6],
"satpsi": [0.355, 0.363, 0.355, 0.257]
},
"veg_params": {
"shdfac": 0.7,
"nroot": 4,
"refkdt": 3.0,
"z0": 0.5,
"czil": 0.1,
"lai": 4.5,
"csoil": 2.00e+06
}
}
Forcing Data (CSV)#
File: cat_<ID>_forcing.csv
time,APCP_surface,DLWRF_surface,DSWRF_surface,PRES_surface,SPFH_2maboveground,TMP_2maboveground,UGRD_10maboveground,VGRD_10maboveground
2015-01-01 00:00:00,0.0,250.3,0.0,101325,0.005,275.15,2.3,-1.1
2015-01-01 01:00:00,0.5,248.1,0.0,101320,0.0051,274.95,2.5,-1.0
...
Required variables:
APCP_surface: Precipitation [mm/hr]TMP_2maboveground: Air temperature [K]SPFH_2maboveground: Specific humidity [kg/kg]DSWRF_surface: Shortwave radiation [W/m²]DLWRF_surface: Longwave radiation [W/m²]UGRD_10maboveground: U-wind [m/s]VGRD_10maboveground: V-wind [m/s]PRES_surface: Pressure [Pa]
Output File Specifications#
NGEN outputs NetCDF or CSV files depending on configuration.
Catchment Output (CSV)#
File: cat_<ID>_output.csv
Time,Q_OUT,SOIL_STORAGE,GW_STORAGE,GIUH_RUNOFF,NASH_FLOW,DEEP_GW_FLOW
2015-01-01 00:00:00,0.45,0.234,0.012,0.10,0.25,0.05
2015-01-01 01:00:00,0.42,0.232,0.011,0.08,0.24,0.05
...
Variables (CFE example):
Q_OUT: Total outflow [m³/s or mm/hr]SOIL_STORAGE: Soil moisture storage [m or mm]GW_STORAGE: Groundwater storage [m or mm]GIUH_RUNOFF: GIUH routed runoffNASH_FLOW: Nash cascade flowDEEP_GW_FLOW: Deep groundwater loss
Aggregated Output (NetCDF)#
File: ngen_output.nc
Aggregated results across all catchments:
dimensions:
time = UNLIMITED
catchment = 5000
variables:
float streamflow(time, catchment)
float soil_moisture(time, catchment)
float snow_water_equiv(time, catchment)
Model-Specific Workflows#
Basic NGEN with CFE#
This is the smallest complete nested configuration for a Bow at Banff NGEN
setup using the same domain metadata as the paper calibration-ensemble configs.
Set system.data_dir to the directory that contains
domain_Bow_at_Banff_lumped_calibration_ensemble.
# config_bow_ngen_cfe_minimal.yaml
system:
data_dir: "/path/to/SYMFLUENCE_data"
code_dir: "/path/to/SYMFLUENCE"
num_processes: 1
domain:
name: Bow_at_Banff_lumped_calibration_ensemble
experiment_id: ngen_cfe_minimal
time_start: "2002-01-01 01:00"
time_end: "2009-12-31 23:00"
calibration_period: "2004-01-01, 2007-12-31"
evaluation_period: "2008-01-01, 2009-12-31"
spinup_period: "2002-01-01, 2003-12-31"
definition_method: lumped
discretization: GRUs
pour_point_coords: "51.1722/-115.5717"
bounding_box_coords: "51.76/-116.55/50.95/-115.5"
delineation:
routing: lumped
geofabric_type: TDX
stream_threshold: 10000
forcing:
dataset: RDRS
time_step_size: 3600
data:
streamflow_data_provider: WSC
model:
hydrological_model: NGEN
routing_model: none
ngen:
exe: ngen
install_path: default
modules_selected: "SLOTH,PET,CFE"
modules_to_calibrate: "CFE"
cfe_params_to_calibrate: "maxsmc,satdk,bb,slop"
evaluation:
streamflow:
station_id: "05BB001"
Run:
symfluence config validate --config config_bow_ngen_cfe_minimal.yaml
symfluence workflow step run_model --config config_bow_ngen_cfe_minimal.yaml
symfluence workflow run executes all workflow stages, including calibration
and post-run analyses. For this forward-only minimal config, use targeted
workflow steps through postprocess_results or add an optimization section
before running the full workflow.
For a forward-only run, leave optimization.methods unset as above. To run
calibration, add an optimization section with an algorithm and iteration
count, for example:
optimization:
methods:
- iteration
algorithm: DDS
iterations: 1000
metric: KGE
NGEN with Noah-OWP-M#
For detailed land surface modeling:
# config.yaml
HYDROLOGICAL_MODEL: NGEN
# Use Noah-OWP-M formulation
NGEN_MODULES_TO_CALIBRATE: NOAH
# Noah parameters
NGEN_NOAH_PARAMS_TO_CALIBRATE: "REFKDT,SMCMAX,BEXP"
# Noah requires all 8 forcing variables
FORCING_DATASET: ERA5 # Provides complete forcings
Multi-Catchment NGEN#
For river basin modeling:
# Delineate multiple catchments
DOMAIN_DEFINITION_METHOD: merit_basins
MERIT_BASIN_IDS: [500123, 500124, 500125, 500126] # 4 catchments
HYDROLOGICAL_MODEL: NGEN
# Enable T-Route routing
ROUTING_MODEL: troute # NGEN's routing module
# CFE + PET formulation
NGEN_MODULES_TO_CALIBRATE: "CFE,PET"
National Scale NGEN#
Following National Water Model approach:
# National-scale application
DOMAIN_DEFINITION_METHOD: nwm_hydrofabric
NWM_VERSION: "2.1"
NWM_DOMAIN: "CONUS" # Continental US
HYDROLOGICAL_MODEL: NGEN
# Standard NWM formulation
NGEN_MODULES_TO_CALIBRATE: CFE
# Parallel execution essential
NUM_PROCESSES: 256
Calibration Strategies#
CFE Parameters#
NGEN_CFE_PARAMS_TO_CALIBRATE: "maxsmc,Ksat,b,expon,Cgw,alpha_fc"
Parameter descriptions:
maxsmc: Maximum soil moisture content [-] (0.3-0.6)Ksat: Saturated hydraulic conductivity [m/s] (1e-7 to 1e-4)b: Pore size distribution index [-] (2-12)expon: GIUH exponent [-] (3-10)Cgw: Groundwater coefficient [1/hr] (0.001-0.1)alpha_fc: Field capacity fraction [-] (0.2-0.8)
Recommended bounds:
maxsmc: [0.3, 0.6] # Soil moisture at saturation
Ksat: [1e-7, 1e-4] # Hydraulic conductivity [m/s]
b: [2.0, 12.0] # Brooks-Corey exponent
expon: [3.0, 10.0] # GIUH shape parameter
Cgw: [0.001, 0.1] # Groundwater recession [1/hr]
alpha_fc: [0.2, 0.8] # Field capacity fraction
K_lf: [0.001, 0.1] # Lateral flow coefficient
K_nash: [0.01, 0.5] # Nash cascade coefficient
Noah-OWP-M Parameters#
NGEN_NOAH_PARAMS_TO_CALIBRATE: "REFKDT,SMCMAX,BEXP"
Common parameters:
REFKDT: [1.0, 6.0] # Infiltration parameter
SMCMAX: [0.3, 0.6] # Max soil moisture (layer-specific)
BEXP: [2.0, 12.0] # Clapp-Hornberger exponent
SATDK: [1e-7, 1e-4] # Saturated conductivity
CZIL: [0.01, 0.5] # Surface roughness parameter
PET Parameters#
NGEN_PET_PARAMS_TO_CALIBRATE: "alpha,beta"
alpha: [0.8, 1.2] # PET multiplier
beta: [-0.2, 0.2] # PET additive adjustment
Calibration Tips#
Start with CFE (simplest, 6-8 parameters)
Use DDS or PSO (efficient for 10-20 dimensional problems)
Hourly forcings recommended for NGEN
Consider multi-site calibration across catchment network
Validate routing if using multiple catchments
Known Limitations#
Complexity:
Steep learning curve
JSON configuration verbose
Multiple files per catchment
Module Dependencies:
Requires compiling BMI modules
Version compatibility issues
Platform-specific builds
Data Format:
NGEN expects specific forcing variable names
HY_Features catchment structure required
T-Route network topology needed
Computational Cost:
Hourly timestep slower than daily models
BMI overhead
Large national domains require HPC
Documentation:
Rapidly evolving framework
Limited examples outside NWM
Module-specific docs scattered
Troubleshooting#
Common Issues#
Error: “NGEN executable not found”
# Verify NGEN installation
NGEN_INSTALL_PATH: /absolute/path/to/ngen/bin
NGEN_EXE: ngen
Error: “BMI module library not found”
Solution: Ensure all BMI modules are compiled:
# Check for CFE library
ls $NGEN_INSTALL_PATH/extern/cfe/cmake_build/libcfemodel.so
# If missing, compile modules
cd $NGEN_INSTALL_PATH/extern/cfe
mkdir cmake_build && cd cmake_build
cmake ..
make
Error: “Realization configuration error”
Check JSON syntax:
# Validate JSON
python -m json.tool realization.json
Error: “Forcing variable not found”
NGEN expects specific variable names. Verify:
# Check forcing CSV headers
head -1 cat_123_forcing.csv
# Should match NGEN expectations:
# APCP_surface, TMP_2maboveground, etc.
Poor simulation results
Check forcings:
# Plot forcing time series python >>> import pandas as pd >>> df = pd.read_csv('cat_123_forcing.csv') >>> df.plot(subplots=True)
Verify catchment attributes (area, slope, soil properties)
Adjust calibration bounds
Check for missing data gaps
Routing not working
# Ensure T-Route is enabled
ROUTING_MODEL: troute
# Verify network topology file exists
# <project_dir>/domain/routing/troute_network.json
Performance Tips#
Speed up calibration:
Calibrate single catchment first
Transfer parameters to similar catchments
Use shorter calibration period (3-5 years)
Start with CFE (simpler than Noah-OWP-M)
Improve accuracy:
Use all 8 forcing variables (not simplified)
Calibrate with hourly data
Multi-objective optimization (flow + states)
Include snow observations if applicable
Additional Resources#
NGEN Documentation:
GitHub: NOAA-OWP/ngen
Wiki: NOAA-OWP/ngen
BMI documentation: https://bmi.readthedocs.io
Modules:
CFE: NOAA-OWP/cfe
Noah-OWP-M: NOAA-OWP/noah-owp-modular
T-Route: NOAA-OWP/t-route
HY_Features:
Hydrofabric: NOAA-OWP/hydrofabric
SYMFLUENCE-specific:
Configuration: NGEN parameter reference
Calibration and Optimization: Calibration workflows
SUMMA Model Guide: Comparison with physics-based models
LSTM Model Guide: Comparison with data-driven approaches
Troubleshooting: General troubleshooting
Publications:
Johnson et al. (2023): “Next Generation Water Resources Modeling Framework” (upcoming/draft publications)
National Water Model documentation: https://water.noaa.gov/about/nwm
Training:
NOAA-OWP workshops and webinars
Community forums: NOAA-OWP/ngen#discussions