Build a Wflow Sediment model#
This notebook demonstrates how to prepare a Wflow Sediment model using the command line interace (CLI).
All lines in this notebook which start with !
are executed from the command line. Within the notebook environment the logging messages are shown after completion. You can also copy these lines and paste these in your shell to get more direct feedback.
HydroMT CLI build interface#
Lets first check if the Wflow sediment model is recognized by HydroMT
[1]:
# this should return "wflow, wflow_sediment"
# as well as hydromt generic models "grid_model, lumped_model, network_model (mesh_model)"
!hydromt --models
Model plugins:
- wflow (hydromt_wflow 1.0.0.dev0)
- wflow_sediment (hydromt_wflow 1.0.0.dev0)
- model (hydromt 1.2.0.dev0)
Using the HydroMT build API we can setup a complete model from scratch. Let’s get an overview of all the available options:
[2]:
!hydromt build --help
Usage: hydromt build [OPTIONS] MODEL MODEL_ROOT
Build models from scratch.
Example usage: --------------
To build a wflow model: hydromt build wflow /path/to/model_root -i
/path/to/wflow_config.yml -d deltares_data -d /path/to/data_catalog.yml -v
To build a sfincs model: hydromt build sfincs /path/to/model_root -i
/path/to/sfincs_config.yml -d /path/to/data_catalog.yml -v
Options:
-i, --config PATH Path to hydroMT configuration file, for the model
specific implementation. [required]
-d, --data TEXT Path to local yaml data catalog file OR name of
predefined data catalog.
--dd, --deltares-data Flag: Shortcut to add the "deltares_data" catalog
--fo, --force-overwrite Flag: If provided overwrite existing model files
--cache Flag: If provided cache tiled rasterdatasets
-v, --verbose Increase verbosity.
-q, --quiet Decrease verbosity.
--help Show this message and exit.
Model setup configuration#
The HydroMT configuration file (YAML) contains the model setup configuration and determines which methods are used to prepare the different components of a Wflow Sediment model and in which order and optionally sets non-default arguments for each method. This configuration is passed to HydroMT using -i <path_to_config_file>
. We have prepared several example files which are available in the model repository examples folder and
from the docs (building a model).
Each header (without indent) (e.g. setup_basemaps:
) corresponds to a model method. All model methods are explained in the docs (model methods).
We will load the default wflow sediment build configuration yaml file for inspection:
[3]:
fn_config = "wflow_sediment_build.yml"
with open(fn_config, "r") as f:
txt = f.read()
print(txt)
steps:
- setup_config: # options parsed to wflow toml file <section>.<option>
data:
time.starttime: "2010-02-02T00:00:00"
time.endtime: "2010-02-10T00:00:00"
time.timestepsecs: 86400
output.netcdf_grid.path: output.nc
output.netcdf_grid.compressionlevel: 1
output.netcdf_grid.variables.soil_erosion__mass_flow_rate: soil_loss
output.netcdf_grid.variables.river_water_sediment~suspended__mass_concentration: suspended_solids
- setup_basemaps:
hydrography_fn: merit_hydro # source hydrography data {merit_hydro, merit_hydro_1k}
basin_index_fn: merit_hydro_index # source of basin index corresponding to hydrography_fn
upscale_method: ihu # upscaling method for flow direction data, by default 'ihu'
res: 0.00833 # build the model at a 30 arc sec (~1km) resolution
region:
subbasin: [12.2051, 45.8331]
strord: 4
bounds: [11.70, 45.35, 12.95, 46.70]
- setup_rivers:
hydrography_fn: merit_hydro # source hydrography data, should correspond to hydrography_fn in setup_basemaps
river_geom_fn: hydro_rivers_lin # river source data with river width and bankfull discharge
river_upa: 30 # minimum upstream area threshold for the river map [km2]
min_rivwth: 30 # minimum river width [m]
slope_len: 2000 # length over which tp calculate river slope [m]
smooth_len: 5000 # length over which to smooth river depth and river width [m]
- setup_reservoirs:
reservoirs_fn: hydro_reservoirs # source for reservoirs shape and attributes
min_area: 1.0 # minimum lake area to consider [km2]
trapping_default: 1.0 # default trapping efficiency for reservoirs [0-1]
- setup_natural_reservoirs:
reservoirs_fn: hydro_lakes # source for lakes based on hydroLAKES: {hydro_lakes}
min_area: 1.0 # minimum reservoir area to consider [km2]
- setup_riverbedsed:
- setup_lulcmaps:
lulc_fn: globcover_2009 # source for lulc maps: {globcover, vito, corine}
lulc_mapping_fn: globcover_mapping_default # default mapping for lulc classes
- setup_canopymaps:
canopy_fn: simard # source for vegetation canopy height: {simard}
- setup_soilmaps:
soil_fn: soilgrids # source for soilmaps: {soilgrids}
usle_k_method: renard # method to compute the USLE K factor: {renard, epic}
add_aggregates: True # if True add small and large aggregates to soil composition
- setup_outlets:
river_only: True
- setup_gauges:
gauges_fn: grdc # If not None add gaugemap. Either a path or known gauges_fn: {grdc}
snap_to_river: True # If True snaps gauges from source to river
derive_subcatch: False # if True derive subcatch map based on gauges.
- setup_constant_pars: # constant parameters values
river_water_sediment__bagnold_transport_capacity_coefficient: 0.0000175
river_water_sediment__bagnold_transport_capacity_exponent: 1.4
soil_erosion__answers_overland_flow_factor: 0.9
soil_erosion__eurosem_exponent: 2.0
sediment__particle_density: 2650
clay__mean_diameter: 2
silt__mean_diameter: 10
"sediment_aggregates~small__mean_diameter": 30
sand__mean_diameter: 200
"sediment_aggregates~large__mean_diameter": 500
gravel__mean_diameter: 2000
Setup Wflow Sediment model from scratch#
[4]:
# NOTE: copy this line (without !) to your shell for more direct feedback
# NOTE: the region argument has been removed since hydromt v1.0.0 and can now only be configured from the configuration file under the setup_basemap header
!hydromt build wflow_sediment "./wflow_test_sediment" -i wflow_sediment_build.yml -d artifact_data --fo -v
2025-08-29 03:26:22,134 - hydromt - log - INFO - HydroMT version: 1.2.0.dev0
2025-08-29 03:26:22,134 - hydromt.cli.main - main - INFO - Building instance of wflow_sediment model at /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_sediment.
2025-08-29 03:26:22,134 - hydromt.cli.main - main - INFO - User settings:
2025-08-29 03:26:22,302 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Reading data catalog artifact_data latest
2025-08-29 03:26:22,302 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Parsing data catalog from /home/runner/.hydromt/artifact_data/v1.0.0/data_catalog.yml
2025-08-29 03:26:22,944 - hydromt.model.root - root - INFO - setting root to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_sediment
2025-08-29 03:26:22,945 - hydromt.model.model - model - INFO - Initializing wflow_sediment model from hydromt_wflow (v1.0.0.dev0).
2025-08-29 03:26:22,945 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Parsing data catalog from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/parameters_data.yml
2025-08-29 03:26:22,958 - hydromt.hydromt_wflow.wflow - wflow - INFO - Supported Wflow.jl version v1+
2025-08-29 03:26:22,958 - hydromt.hydromt_wflow.components.config - config - INFO - Reading default config file from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/wflow_sediment/wflow_sediment.toml.
2025-08-29 03:26:22,959 - hydromt.model.model - model - INFO - build: setup_config
2025-08-29 03:26:22,959 - hydromt.model.model - model - INFO - setup_config.data={'time.starttime': '2010-02-02T00:00:00', 'time.endtime': '2010-02-10T00:00:00', 'time.timestepsecs': 86400, 'output.netcdf_grid.path': 'output.nc', 'output.netcdf_grid.compressionlevel': 1, 'output.netcdf_grid.variables.soil_erosion__mass_flow_rate': 'soil_loss', 'output.netcdf_grid.variables.river_water_sediment~suspended__mass_concentration': 'suspended_solids'}
2025-08-29 03:26:22,959 - hydromt.model.model - model - INFO - build: setup_basemaps
2025-08-29 03:26:22,959 - hydromt.model.model - model - INFO - setup_basemaps.basin_index_fn=merit_hydro_index
2025-08-29 03:26:22,959 - hydromt.model.model - model - INFO - setup_basemaps.res=0.00833
2025-08-29 03:26:22,959 - hydromt.model.model - model - INFO - setup_basemaps.upscale_method=ihu
2025-08-29 03:26:22,959 - hydromt.model.model - model - INFO - setup_basemaps.output_names={'basin__local_drain_direction': 'local_drain_direction', 'subbasin_location__count': 'subcatchment', 'land_surface__slope': 'land_slope'}
2025-08-29 03:26:22,960 - hydromt.model.model - model - INFO - setup_basemaps.hydrography_fn=merit_hydro
2025-08-29 03:26:22,960 - hydromt.model.model - model - INFO - setup_basemaps.region={'subbasin': [12.2051, 45.8331], 'strord': 4, 'bounds': [11.7, 45.35, 12.95, 46.7]}
2025-08-29 03:26:22,960 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing base hydrography basemaps.
2025-08-29 03:26:23,065 - hydromt.data_catalog.drivers.geodataframe.pyogrio_driver - pyogrio_driver - WARNING - Overwriting crs of GeoDataFrame to EPSG:4326
2025-08-29 03:26:26,143 - hydromt.model.processes.basin_mask - basin_mask - INFO - subbasin bbox: [11.7750, 45.8042, 12.7450, 46.6900]
2025-08-29 03:26:26,204 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - (Sub)basin at original resolution has 664756 cells.
2025-08-29 03:26:26,339 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Upscale flow direction data: 10x, ihu method.
2025-08-29 03:26:39,772 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Derive stream order.
2025-08-29 03:26:39,940 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Map shape: (106, 116); active cells: 6637.
2025-08-29 03:26:39,940 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Outlet coordinates (1/1): (12.20750,45.83583).
2025-08-29 03:26:39,957 - hydromt.hydromt_wflow.wflow - wflow - INFO - Adding basin shape to staticgeoms.
2025-08-29 03:26:39,970 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Derive elevation and slope.
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - build: setup_rivers
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.river_geom_fn=hydro_rivers_lin
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.river_upa=30
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.slope_len=2000
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.min_rivlen_ratio=0.0
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.min_rivwth=30
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.smooth_len=5000
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.output_names={'river_location__mask': 'river_mask', 'river__length': 'river_length', 'river__width': 'river_width', 'river__slope': 'river_slope'}
2025-08-29 03:26:40,121 - hydromt.model.model - model - INFO - setup_rivers.hydrography_fn=merit_hydro
2025-08-29 03:26:40,121 - hydromt.hydromt_wflow.wflow_sediment - wflow_sediment - INFO - Preparing river maps.
2025-08-29 03:26:40,197 - hydromt.hydromt_wflow.workflows.river - river - INFO - Set river mask (min uparea: 30 km2) and prepare flow dirs.
2025-08-29 03:26:40,355 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive river length.
2025-08-29 03:26:43,493 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive river slope.
2025-08-29 03:26:44,310 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive ['rivwth', 'qbankfull'] from shapefile.
2025-08-29 03:26:44,357 - hydromt.hydromt_wflow.workflows.river - river - INFO - Valid for 381/655 river cells (max dist: 392 m).
2025-08-29 03:26:47,514 - hydromt.model.model - model - INFO - build: setup_reservoirs
2025-08-29 03:26:47,514 - hydromt.model.model - model - INFO - setup_reservoirs.overwrite_existing=False
2025-08-29 03:26:47,514 - hydromt.model.model - model - INFO - setup_reservoirs.duplicate_id=error
2025-08-29 03:26:47,515 - hydromt.model.model - model - INFO - setup_reservoirs.min_area=1.0
2025-08-29 03:26:47,515 - hydromt.model.model - model - INFO - setup_reservoirs.trapping_default=1.0
2025-08-29 03:26:47,515 - hydromt.model.model - model - INFO - setup_reservoirs.output_names={'reservoir_area__count': 'reservoir_area_id', 'reservoir_location__count': 'reservoir_outlet_id', 'reservoir_surface__area': 'reservoir_area', 'reservoir_water_sediment~bedload__trapping_efficiency': 'reservoir_trapping_efficiency'}
2025-08-29 03:26:47,515 - hydromt.model.model - model - INFO - setup_reservoirs.geom_name=meta_reservoirs
2025-08-29 03:26:47,515 - hydromt.model.model - model - INFO - setup_reservoirs.reservoirs_fn=hydro_reservoirs
2025-08-29 03:26:47,515 - hydromt.hydromt_wflow.wflow_sediment - wflow_sediment - INFO - Preparing reservoir maps.
2025-08-29 03:26:47,521 - hydromt.data_catalog.drivers.geodataframe.pyogrio_driver - pyogrio_driver - WARNING - Overwriting crs of GeoDataFrame to EPSG:4326
2025-08-29 03:26:47,530 - hydromt.hydromt_wflow.workflows.reservoirs - reservoirs - INFO - 0 reservoir(s) of sufficient size found within region.
2025-08-29 03:26:47,531 - hydromt.model.model - model - INFO - build: setup_natural_reservoirs
2025-08-29 03:26:47,531 - hydromt.model.model - model - INFO - setup_natural_reservoirs.overwrite_existing=False
2025-08-29 03:26:47,531 - hydromt.model.model - model - INFO - setup_natural_reservoirs.duplicate_id=error
2025-08-29 03:26:47,531 - hydromt.model.model - model - INFO - setup_natural_reservoirs.min_area=1.0
2025-08-29 03:26:47,531 - hydromt.model.model - model - INFO - setup_natural_reservoirs.output_names={'reservoir_area__count': 'reservoir_area_id', 'reservoir_location__count': 'reservoir_outlet_id', 'reservoir_surface__area': 'reservoir_area', 'reservoir_water_sediment~bedload__trapping_efficiency': 'reservoir_trapping_efficiency'}
2025-08-29 03:26:47,531 - hydromt.model.model - model - INFO - setup_natural_reservoirs.geom_name=meta_natural_reservoirs
2025-08-29 03:26:47,531 - hydromt.model.model - model - INFO - setup_natural_reservoirs.reservoirs_fn=hydro_lakes
2025-08-29 03:26:47,531 - hydromt.hydromt_wflow.wflow_sediment - wflow_sediment - INFO - Preparing reservoir maps.
2025-08-29 03:26:47,536 - hydromt.data_catalog.drivers.geodataframe.pyogrio_driver - pyogrio_driver - WARNING - Overwriting crs of GeoDataFrame to EPSG:4326
2025-08-29 03:26:47,539 - hydromt.hydromt_wflow.workflows.reservoirs - reservoirs - INFO - 1 reservoir(s) of sufficient size found within region.
2025-08-29 03:26:47,685 - hydromt.model.model - model - INFO - build: setup_riverbedsed
2025-08-29 03:26:47,685 - hydromt.model.model - model - INFO - setup_riverbedsed.bedsed_mapping_fn=None
2025-08-29 03:26:47,685 - hydromt.model.model - model - INFO - setup_riverbedsed.strord_name=meta_streamorder
2025-08-29 03:26:47,685 - hydromt.model.model - model - INFO - setup_riverbedsed.output_names={'river_bottom-and-bank_sediment__median_diameter': 'river_bed_sediment_d50', 'river_bottom-and-bank_clay__mass_fraction': 'river_bed_clay_fraction', 'river_bottom-and-bank_silt__mass_fraction': 'river_bed_silt_fraction', 'river_bottom-and-bank_sand__mass_fraction': 'river_bed_sand_fraction', 'river_bottom-and-bank_gravel__mass_fraction': 'river_bed_gravel_fraction', 'river_water_sediment__kodatie_transport_capacity_a-coefficient': 'river_kodatie_a', 'river_water_sediment__kodatie_transport_capacity_b-coefficient': 'river_kodatie_b', 'river_water_sediment__kodatie_transport_capacity_c-coefficient': 'river_kodatie_c', 'river_water_sediment__kodatie_transport_capacity_d-coefficient': 'river_kodatie_d'}
2025-08-29 03:26:47,686 - hydromt.hydromt_wflow.wflow_sediment - wflow_sediment - INFO - Preparing riverbedsed parameter maps.
2025-08-29 03:26:47,686 - hydromt.data_catalog.drivers.dataframe.pandas_driver - pandas_driver - INFO - Reading using pandas driver from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/wflow_sediment/riverbedsed_mapping.csv
2025-08-29 03:26:47,692 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_bed_sediment_d50 using average resampling (nodata=-999.0).
2025-08-29 03:26:47,696 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_bed_clay_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:47,701 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_bed_silt_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:47,706 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_bed_sand_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:47,710 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_bed_gravel_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:47,718 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_kodatie_a using average resampling (nodata=nan).
2025-08-29 03:26:47,723 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_kodatie_b using average resampling (nodata=nan).
2025-08-29 03:26:47,727 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_kodatie_c using average resampling (nodata=nan).
2025-08-29 03:26:47,732 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_kodatie_d using average resampling (nodata=nan).
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - build: setup_lulcmaps
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_mapping_fn=globcover_mapping_default
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.planted_forest_fn=None
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_vars={'landuse': None, 'soil_compacted_fraction': 'soil~compacted__area_fraction', 'erosion_usle_c': 'soil_erosion__usle_c_factor', 'land_water_fraction': 'land~water-covered__area_fraction'}
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.planted_forest_c=0.0881
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.orchard_name=Orchard
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.orchard_c=0.2188
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.output_names_suffix=None
2025-08-29 03:26:47,755 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_fn=globcover_2009
2025-08-29 03:26:47,755 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing LULC parameter maps.
2025-08-29 03:26:47,767 - hydromt.data_catalog.drivers.dataframe.pandas_driver - pandas_driver - INFO - Reading using pandas driver from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/lulc/globcover_mapping.csv
2025-08-29 03:26:47,774 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving landuse using nearest resampling (nodata=230).
2025-08-29 03:26:47,794 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving soil_compacted_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:47,813 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving erosion_usle_c using average resampling (nodata=-999.0).
2025-08-29 03:26:47,831 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving land_water_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:47,857 - hydromt.model.model - model - INFO - build: setup_canopymaps
2025-08-29 03:26:47,858 - hydromt.model.model - model - INFO - setup_canopymaps.output_name=vegetation_height
2025-08-29 03:26:47,858 - hydromt.model.model - model - INFO - setup_canopymaps.canopy_fn=simard
2025-08-29 03:26:47,858 - hydromt.hydromt_wflow.wflow_sediment - wflow_sediment - INFO - Preparing canopy height map.
2025-08-29 03:26:47,907 - hydromt.model.model - model - INFO - build: setup_soilmaps
2025-08-29 03:26:47,907 - hydromt.model.model - model - INFO - setup_soilmaps.soil_fn=soilgrids
2025-08-29 03:26:47,907 - hydromt.model.model - model - INFO - setup_soilmaps.usle_k_method=renard
2025-08-29 03:26:47,907 - hydromt.model.model - model - INFO - setup_soilmaps.add_aggregates=True
2025-08-29 03:26:47,907 - hydromt.model.model - model - INFO - setup_soilmaps.output_names={'soil_clay__mass_fraction': 'soil_clay_fraction', 'soil_silt__mass_fraction': 'soil_silt_fraction', 'soil_sand__mass_fraction': 'soil_sand_fraction', 'soil_aggregates~small__mass_fraction': 'soil_sagg_fraction', 'soil_aggregates~large__mass_fraction': 'soil_lagg_fraction', 'soil_erosion__rainfall_soil_detachability_factor': 'erosion_soil_detachability', 'soil_erosion__usle_k_factor': 'erosion_usle_k', 'land_surface_sediment__median_diameter': 'soil_sediment_d50', 'land_surface_water_sediment__govers_transport_capacity_coefficient': 'land_govers_c', 'land_surface_water_sediment__govers_transport_capacity_exponent': 'land_govers_n'}
2025-08-29 03:26:47,907 - hydromt.hydromt_wflow.wflow_sediment - wflow_sediment - INFO - Preparing soil parameter maps.
2025-08-29 03:26:48,772 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for erosion_soil_detachability
2025-08-29 03:26:48,795 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for usle_k
2025-08-29 03:26:48,828 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for soil_sediment_d50
2025-08-29 03:26:48,865 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for land_govers_c
2025-08-29 03:26:48,901 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for land_govers_n
2025-08-29 03:26:48,916 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for soil_clay_fraction
2025-08-29 03:26:48,931 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for soil_silt_fraction
2025-08-29 03:26:48,958 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for soil_sagg_fraction
2025-08-29 03:26:48,979 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for soil_sand_fraction
2025-08-29 03:26:49,017 - hydromt.gis.raster - raster - WARNING - No numerical nodata value found, skipping set_nodata
2025-08-29 03:26:49,019 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - Interpolate NAN values for soil_lagg_fraction
2025-08-29 03:26:49,041 - hydromt.model.model - model - INFO - build: setup_outlets
2025-08-29 03:26:49,041 - hydromt.model.model - model - INFO - setup_outlets.river_only=True
2025-08-29 03:26:49,041 - hydromt.model.model - model - INFO - setup_outlets.toml_output=csv
2025-08-29 03:26:49,041 - hydromt.model.model - model - INFO - setup_outlets.gauge_toml_header=['suspended_solids']
2025-08-29 03:26:49,041 - hydromt.model.model - model - INFO - setup_outlets.gauge_toml_param=['river_water_sediment~suspended__mass_concentration']
2025-08-29 03:26:49,041 - hydromt.hydromt_wflow.wflow - wflow - INFO - Gauges locations set based on river outlets.
2025-08-29 03:26:49,053 - hydromt.hydromt_wflow.wflow - wflow - INFO - Gauges map based on catchment river outlets added.
2025-08-29 03:26:49,053 - hydromt.hydromt_wflow.wflow - wflow - INFO - Adding ['river_water_sediment~suspended__mass_concentration'] to csv section of toml.
2025-08-29 03:26:49,053 - hydromt.model.model - model - INFO - build: setup_gauges
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.index_col=None
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.snap_to_river=True
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.mask=None
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.snap_uparea=False
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.max_dist=10000.0
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.wdw=3
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.rel_error=0.05
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.abs_error=50.0
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.fillna=False
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.derive_subcatch=False
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.basename=None
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.toml_output=csv
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.gauge_toml_header=['river_q', 'suspended_solids']
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.gauge_toml_param=['river_water__volume_flow_rate', 'river_water_sediment~suspended__mass_concentration']
2025-08-29 03:26:49,054 - hydromt.model.model - model - INFO - setup_gauges.gauges_fn=grdc
2025-08-29 03:26:49,057 - hydromt._utils.unused_kwargs - unused_kwargs - WARNING - object: GeoDataFrameTableDriver does not use kwarg mask with value geometry
value
1.0 POLYGON ((12.43667 46.69, 12.43667 46.67333, 1....
2025-08-29 03:26:49,058 - hydromt._utils.unused_kwargs - unused_kwargs - WARNING - object: GeoDataFrameTableDriver does not use kwarg predicate with value intersects.
2025-08-29 03:26:49,061 - hydromt.hydromt_wflow.wflow - wflow - INFO - 3 grdc gauge locations found within domain
2025-08-29 03:26:49,416 - hydromt.hydromt_wflow.wflow - wflow - INFO - Adding ['river_water__volume_flow_rate', 'river_water_sediment~suspended__mass_concentration'] to csv section of toml.
2025-08-29 03:26:49,416 - hydromt.model.model - model - INFO - build: setup_constant_pars
2025-08-29 03:26:49,416 - hydromt.model.model - model - INFO - setup_constant_pars.river_water_sediment__bagnold_transport_capacity_coefficient=1.75e-05
2025-08-29 03:26:49,416 - hydromt.model.model - model - INFO - setup_constant_pars.river_water_sediment__bagnold_transport_capacity_exponent=1.4
2025-08-29 03:26:49,416 - hydromt.model.model - model - INFO - setup_constant_pars.soil_erosion__answers_overland_flow_factor=0.9
2025-08-29 03:26:49,416 - hydromt.model.model - model - INFO - setup_constant_pars.soil_erosion__eurosem_exponent=2.0
2025-08-29 03:26:49,416 - hydromt.model.model - model - INFO - setup_constant_pars.sediment__particle_density=2650
2025-08-29 03:26:49,417 - hydromt.model.model - model - INFO - setup_constant_pars.clay__mean_diameter=2
2025-08-29 03:26:49,417 - hydromt.model.model - model - INFO - setup_constant_pars.silt__mean_diameter=10
2025-08-29 03:26:49,417 - hydromt.model.model - model - INFO - setup_constant_pars.sediment_aggregates~small__mean_diameter=30
2025-08-29 03:26:49,417 - hydromt.model.model - model - INFO - setup_constant_pars.sand__mean_diameter=200
2025-08-29 03:26:49,417 - hydromt.model.model - model - INFO - setup_constant_pars.sediment_aggregates~large__mean_diameter=500
2025-08-29 03:26:49,417 - hydromt.model.model - model - INFO - setup_constant_pars.gravel__mean_diameter=2000
2025-08-29 03:26:49,417 - hydromt.hydromt_wflow.wflow - wflow - INFO - Write model data to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_sediment
2025-08-29 03:26:49,429 - hydromt._io.writers - writers - INFO - writing region data to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_sediment/staticgeoms/region.geojson
2025-08-29 03:26:49,545 - hydromt.hydromt_wflow.components.forcing - forcing - WARNING - Write forcing skipped: dataset is empty (no variables or data).
2025-08-29 03:26:49,545 - hydromt._typing.error - error - WARNING - No grid data found, skip writing.
2025-08-29 03:26:49,545 - hydromt.hydromt_wflow.components.config - config - INFO - Writing model config to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_sediment/wflow_sediment.toml.
The example above means the following: run hydromt build with:
wflow_sediment
: i.e. build a wflow sediment model./wflow_test_sediment
: output model folder-i wflow_sediment_build.yml
: model setup configuration file-d artifact_data
: use pre-defined artifact_data catalog.-v
: give some extra verbosity (1 * v) to display feedback on screen. Now INFO messages are provided.
Next we check which files have been created. The model root should contain two netcdf (.nc) files, one for the staticmaps and one for the forcing data, a wflow run configuration (.toml) file. These files are sufficient to run the wflow sediment model. In addition several geometry (.geojson) files are saved in the staticgeoms folder. Finally, the setup process is logged in the hydromt.log file.
[5]:
import os
root = "wflow_test_sediment"
for path, _, files in os.walk(root):
print(path)
for name in files:
if name.endswith(".xml"):
continue
print(f" - {name}")
wflow_test_sediment
- hydromt.log
- staticmaps.nc
- hydromt_data.yml
- wflow_sediment.toml
wflow_test_sediment/staticgeoms
- basins.geojson
- reservoirs.geojson
- region.geojson
- meta_natural_reservoirs.geojson
- rivers.geojson
- gauges_grdc.geojson
- basins_highres.geojson
- outlets.geojson
Visualize and/or inspect model schematization#
You can (copy and) adapt the following example notebooks in order to visualize your Wflow Sediment model:
The wflow plot example notebook contains scripts to visualize your model
The wflow nc to raster files example notebook contains scripts to write the nc model files to a netcdf which can be used to inspect (and modify) the model layers in e.g. QGIS.
Add Wflow Sediment layers to an existing Wflow model#
If you already have a hydrological Wflow model and you want to extend it in order to include sediment as well, then you do not need to build the wflow_sediment from scratch. You can instead update the wflow model with the additional components needed by wflow_sediment.
These components are available in the template wflow_extend_sediment.yml:
[6]:
fn_config = "wflow_extend_sediment.yml"
with open(fn_config, "r") as f:
txt = f.read()
print(txt)
steps:
- read_config: # read a template config file for wflow sediment to be able to extend from a sbm model
config_filename: data/wflow_sediment.toml
- setup_config: # options parsed to wflow toml file <section>.<option>
data:
time.starttime: 2010-01-01T00:00:00
time.endtime: 2010-03-31T00:00:00
time.timestepsecs: 86400
output.netcdf_grid.path: output.nc
output.netcdf_grid.compressionlevel: 1
output.netcdf_grid.variables.soil_erosion__mass_flow_rate: soil_loss
output.netcdf_grid.variables.river_water_sediment~suspended__mass_concentration: suspended_solids
- setup_riverbedsed:
bedsed_mapping_fn: # path to a mapping csv file from streamorder to river bed particles characteristics if any, else default is used
# If you do have reservoirs, you can re-run setup_natural_reservoirs and setup_reservoirs to add it
- setup_reservoirs:
reservoirs_fn: hydro_reservoirs # source for reservoirs shape and attributes
min_area: 1.0 # minimum lake area to consider [km2]
trapping_default: 1.0 # default trapping efficiency for reservoirs [0-1]
- setup_natural_reservoirs:
reservoirs_fn: hydro_lakes # source for uncontrolled reservoirs (e.g. lakes) based on hydroLAKES: {hydro_lakes}
min_area: 10.0 # minimum reservoir area to consider [km2]
- setup_lulcmaps:
lulc_fn: globcover_2009 # source for lulc maps: {globcover, vito, corine}
lulc_mapping_fn: globcover_mapping_default # default mapping for lulc classes
- setup_canopymaps:
canopy_fn: simard # source for vegetation canopy height: {simard}
- setup_soilmaps:
soil_fn: soilgrids # source for soilmaps: {soilgrids}
usle_k_method: renard # method to compute the USLE K factor: {renard, epic}
add_aggregates: True # if True add small and large aggregates to soil composition
- setup_outlets:
river_only: True
- setup_gauges:
gauges_fn: grdc # If not None add gaugemap. Either a path or known gauges_fn: {grdc}
snap_to_river: True # If True snaps gauges from source to river
derive_subcatch: False # if True derive subcatch map based on gauges.
- setup_constant_pars: # constant parameters values
river_water_sediment__bagnold_transport_capacity_coefficient: 0.0000175
river_water_sediment__bagnold_transport_capacity_exponent: 1.4
soil_erosion__answers_overland_flow_factor: 0.9
soil_erosion__eurosem_exponent: 2.0
sediment__particle_density: 2650
clay__mean_diameter: 2
silt__mean_diameter: 10
"sediment_aggregates~small__mean_diameter": 30
sand__mean_diameter: 200
"sediment_aggregates~large__mean_diameter": 500
gravel__mean_diameter: 2000
"reservoir_water_sediment~bedload__trapping_efficiency": 1.0
Note that because we are starting from a sbm model, we start here with a read_config
step in order to get a default wflow_sediment.toml that contains the minimum config options of the sediment model including variables names of the already present maps (eg slope, river mask…). You may have to modify this template if the staticmaps name do not correspond to the names in your own wflow sbm model.
Let’s update the hydrological Wflow model available from our example for the Piave subbasin:
[7]:
# NOTE: copy this line (without !) to your shell for more direct feedback
!hydromt update wflow_sediment "wflow_piave_subbasin" -o "./wflow_test_extend_sediment" -i wflow_extend_sediment.yml -d artifact_data --fo -v
2025-08-29 03:26:53,345 - hydromt - log - INFO - HydroMT version: 1.2.0.dev0
2025-08-29 03:26:53,345 - hydromt.cli.main - main - INFO - Updating wflow_sediment model at /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_piave_subbasin (r).
2025-08-29 03:26:53,345 - hydromt.cli.main - main - INFO - Output dir: /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_extend_sediment
2025-08-29 03:26:53,345 - hydromt.cli.main - main - INFO - User settings:
2025-08-29 03:26:53,516 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Reading data catalog artifact_data latest
2025-08-29 03:26:53,516 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Parsing data catalog from /home/runner/.hydromt/artifact_data/v1.0.0/data_catalog.yml
2025-08-29 03:26:54,157 - hydromt.model.root - root - INFO - setting root to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_piave_subbasin
2025-08-29 03:26:54,157 - hydromt.model.model - model - INFO - Initializing wflow_sediment model from hydromt_wflow (v1.0.0.dev0).
2025-08-29 03:26:54,158 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Parsing data catalog from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/parameters_data.yml
2025-08-29 03:26:54,172 - hydromt.hydromt_wflow.wflow - wflow - INFO - Supported Wflow.jl version v1+
2025-08-29 03:26:54,172 - hydromt.hydromt_wflow.components.config - config - WARNING - No config was found at /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_piave_subbasin/wflow_sediment.toml. It wil be initialized as empty dict
2025-08-29 03:26:54,172 - hydromt.cli.main - main - ERROR - got an unexpected keyword argument 'config_filename'
Traceback (most recent call last):
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/hydromt/cli/main.py", line 345, in update
mod.update(model_out=model_out, steps=opt["steps"], forceful_overwrite=fo)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/hydromt/model/model.py", line 331, in update
_validate_steps(self, steps)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/hydromt/_utils/steps_validator.py", line 28, in _validate_steps
_ = sig.bind(**options)
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/inspect.py", line 3295, in bind
return self._bind(args, kwargs)
~~~~~~~~~~^^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/inspect.py", line 3284, in _bind
raise TypeError(
'got an unexpected keyword argument {arg!r}'.format(
arg=next(iter(kwargs))))
TypeError: got an unexpected keyword argument 'config_filename'
Traceback (most recent call last):
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/bin/hydromt", line 10, in <module>
sys.exit(main())
~~~~^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/click/core.py", line 1442, in __call__
return self.main(*args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/click/core.py", line 1363, in main
rv = self.invoke(ctx)
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/click/core.py", line 1830, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/click/core.py", line 1226, in invoke
return ctx.invoke(self.callback, **ctx.params)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/click/core.py", line 794, in invoke
return callback(*args, **kwargs)
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/click/decorators.py", line 34, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/hydromt/cli/main.py", line 345, in update
mod.update(model_out=model_out, steps=opt["steps"], forceful_overwrite=fo)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/hydromt/model/model.py", line 331, in update
_validate_steps(self, steps)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/site-packages/hydromt/_utils/steps_validator.py", line 28, in _validate_steps
_ = sig.bind(**options)
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/inspect.py", line 3295, in bind
return self._bind(args, kwargs)
~~~~~~~~~~^^^^^^^^^^^^^^
File "/home/runner/work/hydromt_wflow/hydromt_wflow/.pixi/envs/docs/lib/python3.13/inspect.py", line 3284, in _bind
raise TypeError(
'got an unexpected keyword argument {arg!r}'.format(
arg=next(iter(kwargs))))
TypeError: got an unexpected keyword argument 'config_filename'
The example above means the following: run hydromt update with:
wflow_sediment
: i.e. update a wflow_sediment model (in our case a wflow model but with wflow_sediment components)wflow_piave_subbasin
: hydrological wflow model folder-o "./wflow_test_extend_sediment"
: output combined wflow hydrology+sediment models-i wflow_extend_sediment.yml
: setup configuration file containing wflow sediment specific components-d artifact_data
: use the pre-defined artifact_data catalog-v
: give some extra verbosity (1 * v) to display feedback on screen. Now INFO messages are provided.