Tip

For an interactive online version click here: Binder badge

Build a Wflow model from scratch#

This notebook demonstrates how to prepare Wflow model from scratch 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 model is recognized by HydroMT

[1]:
# this should return "wflow, wflow_sediment"
# as well as the generic HydroMT model "model"
!hydromt --models
Model plugins:
        - wflow_sbm (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 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 components).

We will load the default wflow build configuration yaml file for inspection:

[3]:
fn_config = "wflow_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-01-01T00:00:00
        time.endtime: 2010-03-31T00:00:00
        time.timestepsecs: 86400
        input.path_forcing: inmaps-era5-2010.nc
        output.netcdf_grid.path: output.nc
        output.netcdf_grid.compressionlevel: 1
        output.netcdf_grid.variables.river_water__volume_flow_rate: river_q

  - 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: # model region
        subbasin: [12.2051, 45.8331] # derive a subbasin with its outlet at the given x,y coordinates
        strord: 4 # snapped to a river with minimum stream order (strord) of 4
        bounds: [11.70, 45.35, 12.95, 46.70] # within the given bounds [xmin, ymin, xmax, ymax] (WGS84)

  - 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]
      rivdph_method: powlaw           # method to estimate depth {'powlaw', 'manning', 'gvf'}
      min_rivdph: 1                # minimum river depth [m]
      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]
      river_routing: kinematic-wave   # {'kinematic-wave', 'local-inertial'}

  - setup_river_roughness:

  # - setup_floodplains: # if 2D floodplains are required
  #     hydrography_fn: merit_hydro      # source hydrography data, should correspond to hydrography_fn in setup_basemaps
  #     floodplain_type: 2d #  # If two-dimensional floodplains are required
  #     elevtn_map: land_elevation  # {'land_elevation', 'meta_subgrid_elevation'}

  # - setup_floodplains: # if 1D floodplains are required
  #     hydrography_fn: merit_hydro      # source hydrography data, should correspond to hydrography_fn in setup_basemaps
  #     floodplain_type: 1d    # If one-dimensional floodplains are required
  #     flood_depths: # flood depths at which a volume is derived
  #       - 0.5
  #       - 1.0
  #       - 1.5
  #       - 2.0
  #       - 2.5
  #       - 3.0
  #       - 4.0
  #       - 5.0

  - setup_reservoirs_simple_control:
      reservoirs_fn: hydro_reservoirs  # source for reservoirs shape and attributes
      timeseries_fn: gww           # additionnal source for reservoir are timeseries to compute reservoirs, Either 'gww' using gwwapi or 'jrc' using hydroengine.
      min_area: 1.0           # minimum lake area to consider [km2]

  - setup_reservoirs_no_control:
      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_glaciers:
      glaciers_fn: rgi           # source for glaciers based on Randolph Glacier Inventory {rgi}
      min_area: 0.0           # minimum glacier 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_laimaps:
      lai_fn: modis_lai     # source for Leaf Area Index: {modis_lai}

  - setup_soilmaps:
      soil_fn: soilgrids     # source for soilmaps: {soilgrids}
      ptf_ksatver: brakensiek    # pedotransfer function to calculate hydraulic conductivity: {brakensiek, cosby}

  - 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_precip_forcing:
      precip_fn: era5          # source for precipitation.
      precip_clim_fn:          # source for high resolution climatology to correct precipitation if any.

  - setup_temp_pet_forcing:
      temp_pet_fn: era5          # source for temperature and potential evapotranspiration.
      press_correction: True          # if True temperature is corrected with elevation lapse rate.
      temp_correction: True          # if True pressure is corrected with elevation lapse rate.
      dem_forcing_fn: era5_orography # source of elevation grid corresponding to temp_pet_fn. Used for lapse rate correction.
      pet_method: debruin       # method to compute PET: {debruin, makkink}
      skip_pet: False         # if True, only temperature is prepared.

  - setup_constant_pars:
      "subsurface_water__horizontal-to-vertical_saturated_hydraulic_conductivity_ratio": 100
      "snowpack__degree-day_coefficient": 3.75653
      "soil_surface_water__infiltration_reduction_parameter": 0.038
      "vegetation_canopy_water__mean_evaporation-to-mean_precipitation_ratio": 0.11
      "soil~compacted_surface_water__infiltration_capacity": 5
      "soil_water_sat-zone_bottom__max_leakage_volume_flux": 0
      "soil_root~wet__sigmoid_function_shape_parameter": -500
      "atmosphere_air__snowfall_temperature_threshold": 0
      "atmosphere_air__snowfall_temperature_interval": 2
      "snowpack__melting_temperature_threshold": 0
      "snowpack__liquid_water_holding_capacity": 0.1
      "glacier_ice__degree-day_coefficient": 5.3
      "glacier_firn_accumulation__snowpack~dry_leq-depth_fraction": 0.002
      "glacier_ice__melting_temperature_threshold": 1.3

Data for model setup#

The <...>_fn arguments correspond to a data source from the DataCatalog which is based on a yml-file with references to the data paths/urls and how the data should be read. This file can be provided to hydromt using -d <path_to_yml_file>.

By default, the pre-defined artifact_data catalog containing some example data for the Piave basin will be downloaded to ~/.hydromt_data/ which is also used for this example. An overview of the available example data is provided here This example data is a based on the data which is available from the Deltares p-drive. If you have acces to this drive, a pre-configured catalog file can be loaded using the -d deltares_data pre-defined catalog.

More background how to write a data catalog yml file can be found in the HydroMT core docs

Setup complete Wflow model#

Once we have prepared our data catalog and model build settings file, we are ready to ask HydroMT to build our Wflow model. Building the model can be done from the command line. Down below is an example for the Northern part of the Piave basin in Italy:

[4]:
# NOTE: copy this line (without !) to your shell for more direct feedback
!hydromt build wflow_sbm "./wflow_test_full" -i wflow_build.yml -d artifact_data --fo -v
2025-09-17 13:32:46,418 - hydromt - log - INFO - HydroMT version: 1.2.0.dev0
2025-09-17 13:32:46,419 - hydromt.cli.main - main - INFO - Building instance of wflow_sbm model at /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full.
2025-09-17 13:32:46,419 - hydromt.cli.main - main - INFO - User settings:
2025-09-17 13:32:46,535 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Reading data catalog artifact_data latest
2025-09-17 13:32:46,535 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Parsing data catalog from /home/runner/.hydromt/artifact_data/v1.0.0/data_catalog.yml
2025-09-17 13:32:47,171 - hydromt.model.root - root - INFO - setting root to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full
2025-09-17 13:32:47,172 - hydromt.model.model - model - INFO - Initializing wflow_sbm model from hydromt_wflow (v1.0.0.dev0).
2025-09-17 13:32:47,172 - 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-09-17 13:32:47,184 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Supported Wflow.jl version v1+
2025-09-17 13:32:47,184 - hydromt.hydromt_wflow.components.config - config - INFO - Reading default config file from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/wflow_sbm/wflow_sbm.toml.
2025-09-17 13:32:47,185 - hydromt.model.model - model - INFO - build: setup_config
2025-09-17 13:32:47,185 - hydromt.model.model - model - INFO - setup_config.data={'time.starttime': datetime.datetime(2010, 1, 1, 0, 0), 'time.endtime': datetime.datetime(2010, 3, 31, 0, 0), 'time.timestepsecs': 86400, 'input.path_forcing': 'inmaps-era5-2010.nc', 'output.netcdf_grid.path': 'output.nc', 'output.netcdf_grid.compressionlevel': 1, 'output.netcdf_grid.variables.river_water__volume_flow_rate': 'river_q'}
2025-09-17 13:32:47,186 - hydromt.model.model - model - INFO - build: setup_basemaps
2025-09-17 13:32:47,186 - hydromt.model.model - model - INFO - setup_basemaps.basin_index_fn=merit_hydro_index
2025-09-17 13:32:47,186 - hydromt.model.model - model - INFO - setup_basemaps.res=0.00833
2025-09-17 13:32:47,186 - hydromt.model.model - model - INFO - setup_basemaps.upscale_method=ihu
2025-09-17 13:32:47,186 - 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-09-17 13:32:47,186 - hydromt.model.model - model - INFO - setup_basemaps.hydrography_fn=merit_hydro
2025-09-17 13:32:47,186 - 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-09-17 13:32:47,186 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Preparing base hydrography basemaps.
2025-09-17 13:32:47,186 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading merit_hydro RasterDataset data from /home/runner/.hydromt/artifact_data/latest/merit_hydro/{variable}.tif
2025-09-17 13:32:47,276 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading merit_hydro_index GeoDataFrame data from /home/runner/.hydromt/artifact_data/latest/merit_hydro_index.gpkg
2025-09-17 13:32:50,239 - hydromt.model.processes.basin_mask - basin_mask - INFO - subbasin bbox: [11.7750, 45.8042, 12.7450, 46.6900]
2025-09-17 13:32:50,298 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - (Sub)basin at original resolution has 664756 cells.
2025-09-17 13:32:50,430 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Upscale flow direction data: 10x, ihu method.
2025-09-17 13:33:03,493 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Derive stream order.
2025-09-17 13:33:03,652 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Map shape: (106, 116); active cells: 6637.
2025-09-17 13:33:03,652 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Outlet coordinates (1/1): (12.20750,45.83583).
2025-09-17 13:33:03,669 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Adding basin shape to staticgeoms.
2025-09-17 13:33:03,681 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Derive elevation and slope.
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - build: setup_rivers
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.river_geom_fn=hydro_rivers_lin
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.river_upa=30
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.rivdph_method=powlaw
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.slope_len=2000
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.min_rivlen_ratio=0.0
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.min_rivdph=1
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.min_rivwth=30
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.smooth_len=5000
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.elevtn_map=land_elevation
2025-09-17 13:33:03,841 - hydromt.model.model - model - INFO - setup_rivers.river_routing=kinematic-wave
2025-09-17 13:33:03,842 - hydromt.model.model - model - INFO - setup_rivers.connectivity=8
2025-09-17 13:33:03,842 - hydromt.model.model - model - INFO - setup_rivers.output_names={'river_location__mask': 'river_mask', 'river__length': 'river_length', 'river__width': 'river_width', 'river_bank_water__depth': 'river_depth', 'river__slope': 'river_slope', 'river_bank_water__elevation': 'river_bank_elevation'}
2025-09-17 13:33:03,842 - hydromt.model.model - model - INFO - setup_rivers.hydrography_fn=merit_hydro
2025-09-17 13:33:03,842 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Preparing river maps.
2025-09-17 13:33:03,844 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading merit_hydro RasterDataset data from /home/runner/.hydromt/artifact_data/latest/merit_hydro/{variable}.tif
2025-09-17 13:33:03,920 - hydromt.hydromt_wflow.workflows.river - river - INFO - Set river mask (min uparea: 30 km2) and prepare flow dirs.
2025-09-17 13:33:04,076 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive river length.
2025-09-17 13:33:07,103 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive river slope.
2025-09-17 13:33:07,735 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading hydro_rivers_lin GeoDataFrame data from /home/runner/.hydromt/artifact_data/latest/rivers_lin2019_v1.gpkg
2025-09-17 13:33:07,931 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive ['rivwth', 'qbankfull'] from shapefile.
2025-09-17 13:33:07,975 - hydromt.hydromt_wflow.workflows.river - river - INFO - Valid for 381/655 river cells (max dist: 392 m).
2025-09-17 13:33:11,223 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - Update wflow config model.river_routing="kinematic-wave"
2025-09-17 13:33:11,223 - hydromt.model.model - model - INFO - build: setup_river_roughness
2025-09-17 13:33:11,223 - hydromt.model.model - model - INFO - setup_river_roughness.rivman_mapping_fn=None
2025-09-17 13:33:11,223 - hydromt.model.model - model - INFO - setup_river_roughness.strord_name=meta_streamorder
2025-09-17 13:33:11,223 - hydromt.model.model - model - INFO - setup_river_roughness.output_name=river_manning_n
2025-09-17 13:33:11,223 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - Preparing river Manning roughness.
2025-09-17 13:33:11,224 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading roughness_river_mapping_default DataFrame data from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/wflow_sbm/river_manning_mapping.csv
2025-09-17 13:33:11,230 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_manning_n using average resampling (nodata=-999.0).
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - build: setup_reservoirs_simple_control
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.timeseries_fn=gww
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.overwrite_existing=False
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.duplicate_id=error
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.min_area=1.0
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.output_names={'reservoir_area__count': 'reservoir_area_id', 'reservoir_location__count': 'reservoir_outlet_id', 'reservoir_surface__area': 'reservoir_area', 'reservoir_water_surface__initial_elevation': 'reservoir_initial_depth', 'reservoir_water__rating_curve_type_count': 'reservoir_rating_curve', 'reservoir_water__storage_curve_type_count': 'reservoir_storage_curve', 'reservoir_water__max_volume': 'reservoir_max_volume', 'reservoir_water~min-target__volume_fraction': 'reservoir_target_min_fraction', 'reservoir_water~full-target__volume_fraction': 'reservoir_target_full_fraction', 'reservoir_water_demand~required~downstream__volume_flow_rate': 'reservoir_demand', 'reservoir_water_release-below-spillway__max_volume_flow_rate': 'reservoir_max_release'}
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.geom_name=meta_reservoirs_simple_control
2025-09-17 13:33:11,237 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.reservoirs_fn=hydro_reservoirs
2025-09-17 13:33:11,237 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - Preparing reservoir with simple control maps.
2025-09-17 13:33:11,237 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading hydro_reservoirs GeoDataFrame data from /home/runner/.hydromt/artifact_data/latest/hydro_reservoirs.gpkg
2025-09-17 13:33:11,252 - hydromt.hydromt_wflow.workflows.reservoirs - reservoirs - INFO - 0 reservoir(s) of sufficient size found within region.
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - build: setup_reservoirs_no_control
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.rating_curve_fns=None
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.overwrite_existing=False
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.duplicate_id=error
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.min_area=10.0
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.output_names={'reservoir_area__count': 'reservoir_area_id', 'reservoir_location__count': 'reservoir_outlet_id', 'reservoir_surface__area': 'reservoir_area', 'reservoir_water_surface__initial_elevation': 'reservoir_initial_depth', 'reservoir_water_flow_threshold-level__elevation': 'reservoir_outflow_threshold', 'reservoir_water__rating_curve_coefficient': 'reservoir_b', 'reservoir_water__rating_curve_exponent': 'reservoir_e', 'reservoir_water__rating_curve_type_count': 'reservoir_rating_curve', 'reservoir_water__storage_curve_type_count': 'reservoir_storage_curve', 'reservoir~lower_location__count': 'reservoir_lower_id'}
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.geom_name=meta_reservoirs_no_control
2025-09-17 13:33:11,252 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.reservoirs_fn=hydro_lakes
2025-09-17 13:33:11,252 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - Preparing reservoir maps.
2025-09-17 13:33:11,252 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading hydro_lakes GeoDataFrame data from /home/runner/.hydromt/artifact_data/latest/hydro_lakes.gpkg
2025-09-17 13:33:11,260 - hydromt.hydromt_wflow.workflows.reservoirs - reservoirs - INFO - 0 reservoir(s) of sufficient size found within region.
2025-09-17 13:33:11,260 - hydromt.model.model - model - INFO - build: setup_glaciers
2025-09-17 13:33:11,260 - hydromt.model.model - model - INFO - setup_glaciers.min_area=0.0
2025-09-17 13:33:11,260 - hydromt.model.model - model - INFO - setup_glaciers.output_names={'glacier_surface__area_fraction': 'glacier_fraction', 'glacier_ice__initial_leq-depth': 'glacier_initial_leq_depth'}
2025-09-17 13:33:11,260 - hydromt.model.model - model - INFO - setup_glaciers.geom_name=glaciers
2025-09-17 13:33:11,260 - hydromt.model.model - model - INFO - setup_glaciers.glaciers_fn=rgi
2025-09-17 13:33:11,260 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - Preparing glacier maps.
2025-09-17 13:33:11,260 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading rgi GeoDataFrame data from /home/runner/.hydromt/artifact_data/latest/rgi.gpkg
2025-09-17 13:33:11,268 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - 38 glaciers of sufficient size found within region.
2025-09-17 13:33:12,002 - hydromt.model.model - model - INFO - build: setup_lulcmaps
2025-09-17 13:33:12,002 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_mapping_fn=globcover_mapping_default
2025-09-17 13:33:12,002 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_vars={'landuse': None, 'vegetation_kext': 'vegetation_canopy__light-extinction_coefficient', 'land_manning_n': 'land_surface_water_flow__manning_n_parameter', 'soil_compacted_fraction': 'soil~compacted__area_fraction', 'vegetation_root_depth': 'vegetation_root__depth', 'vegetation_leaf_storage': 'vegetation__specific-leaf_storage', 'vegetation_wood_storage': 'vegetation_wood_water__storage_capacity', 'land_water_fraction': 'land~water-covered__area_fraction', 'vegetation_crop_factor': 'vegetation__crop_factor', 'vegetation_feddes_alpha_h1': 'vegetation_root__feddes_critial_pressure_head_h~1_reduction_coefficient', 'vegetation_feddes_h1': 'vegetation_root__feddes_critial_pressure_head_h~1', 'vegetation_feddes_h2': 'vegetation_root__feddes_critial_pressure_head_h~2', 'vegetation_feddes_h3_high': 'vegetation_root__feddes_critial_pressure_head_h~3~high', 'vegetation_feddes_h3_low': 'vegetation_root__feddes_critial_pressure_head_h~3~low', 'vegetation_feddes_h4': 'vegetation_root__feddes_critial_pressure_head_h~4'}
2025-09-17 13:33:12,002 - hydromt.model.model - model - INFO - setup_lulcmaps.output_names_suffix=None
2025-09-17 13:33:12,002 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_fn=globcover_2009
2025-09-17 13:33:12,002 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Preparing LULC parameter maps.
2025-09-17 13:33:12,003 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading globcover_2009 RasterDataset data from /home/runner/.hydromt/artifact_data/latest/globcover.tif
2025-09-17 13:33:12,013 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading globcover_mapping_default DataFrame data from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/lulc/globcover_mapping.csv
2025-09-17 13:33:12,020 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving landuse using nearest resampling (nodata=230).
2025-09-17 13:33:12,040 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_kext using average resampling (nodata=-999.0).
2025-09-17 13:33:12,058 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving land_manning_n using average resampling (nodata=-999.0).
2025-09-17 13:33:12,076 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving soil_compacted_fraction using average resampling (nodata=-999.0).
2025-09-17 13:33:12,095 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_root_depth using average resampling (nodata=-999.0).
2025-09-17 13:33:12,113 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_leaf_storage using average resampling (nodata=-999.0).
2025-09-17 13:33:12,132 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_wood_storage using average resampling (nodata=-999.0).
2025-09-17 13:33:12,150 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving land_water_fraction using average resampling (nodata=-999.0).
2025-09-17 13:33:12,168 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_crop_factor using average resampling (nodata=-999.0).
2025-09-17 13:33:12,186 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_alpha_h1 using mode resampling (nodata=-999).
2025-09-17 13:33:12,244 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h1 using average resampling (nodata=-999).
2025-09-17 13:33:12,264 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h2 using average resampling (nodata=-999).
2025-09-17 13:33:12,286 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h3_high using average resampling (nodata=-999).
2025-09-17 13:33:12,307 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h3_low using average resampling (nodata=-999).
2025-09-17 13:33:12,328 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h4 using average resampling (nodata=-999).
2025-09-17 13:33:12,378 - hydromt.model.model - model - INFO - build: setup_laimaps
2025-09-17 13:33:12,378 - hydromt.model.model - model - INFO - setup_laimaps.lulc_fn=None
2025-09-17 13:33:12,378 - hydromt.model.model - model - INFO - setup_laimaps.lulc_sampling_method=any
2025-09-17 13:33:12,378 - hydromt.model.model - model - INFO - setup_laimaps.lulc_zero_classes=[]
2025-09-17 13:33:12,378 - hydromt.model.model - model - INFO - setup_laimaps.buffer=2
2025-09-17 13:33:12,378 - hydromt.model.model - model - INFO - setup_laimaps.output_name=vegetation_leaf_area_index
2025-09-17 13:33:12,378 - hydromt.model.model - model - INFO - setup_laimaps.lai_fn=modis_lai
2025-09-17 13:33:12,378 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - Preparing LAI maps.
2025-09-17 13:33:12,380 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading modis_lai RasterDataset data from /home/runner/.hydromt/artifact_data/latest/modis_lai.nc
2025-09-17 13:33:12,775 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving LAI using average resampling (nodata=nan).
2025-09-17 13:33:12,845 - hydromt.model.model - model - INFO - build: setup_soilmaps
2025-09-17 13:33:12,846 - hydromt.model.model - model - INFO - setup_soilmaps.soil_fn=soilgrids
2025-09-17 13:33:12,846 - hydromt.model.model - model - INFO - setup_soilmaps.ptf_ksatver=brakensiek
2025-09-17 13:33:12,846 - hydromt.model.model - model - INFO - setup_soilmaps.wflow_thicknesslayers=[100, 300, 800]
2025-09-17 13:33:12,846 - hydromt.model.model - model - INFO - setup_soilmaps.output_names={'soil_water__saturated_volume_fraction': 'soil_theta_s', 'soil_water__residual_volume_fraction': 'soil_theta_r', 'soil_surface_water__vertical_saturated_hydraulic_conductivity': 'soil_ksat_vertical', 'soil__thickness': 'soil_thickness', 'soil_water__vertical_saturated_hydraulic_conductivity_scale_parameter': 'soil_f', 'soil_layer_water__brooks-corey_exponent': 'soil_brooks_corey_c'}
2025-09-17 13:33:12,846 - hydromt.hydromt_wflow.wflow_sbm - wflow_sbm - INFO - Preparing soil parameter maps.
2025-09-17 13:33:12,848 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading soilgrids RasterDataset data from /home/runner/.hydromt/artifact_data/latest/soilgrids/{variable}.tif
2025-09-17 13:33:13,371 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample theta_s
2025-09-17 13:33:13,798 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample theta_r
2025-09-17 13:33:14,038 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample ksat_vertical
2025-09-17 13:33:14,095 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample pore size distribution index
2025-09-17 13:33:14,561 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - fit z - log(ksat_vertical ) with numpy linalg regression (y = b*x) -> M_
2025-09-17 13:33:14,966 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - fit zi - Ksat with curve_fit (scipy.optimize) -> M
2025-09-17 13:33:17,711 - hydromt.gis.raster - raster - WARNING - No numerical nodata value found, skipping set_nodata
2025-09-17 13:33:18,193 - hydromt.gis.raster - raster - WARNING - No numerical nodata value found, skipping set_nodata
2025-09-17 13:33:18,319 - hydromt.gis.raster - raster - WARNING - No numerical nodata value found, skipping set_nodata
2025-09-17 13:33:18,428 - hydromt.model.model - model - INFO - build: setup_outlets
2025-09-17 13:33:18,428 - hydromt.model.model - model - INFO - setup_outlets.river_only=True
2025-09-17 13:33:18,428 - hydromt.model.model - model - INFO - setup_outlets.toml_output=csv
2025-09-17 13:33:18,428 - hydromt.model.model - model - INFO - setup_outlets.gauge_toml_header=['river_q']
2025-09-17 13:33:18,428 - hydromt.model.model - model - INFO - setup_outlets.gauge_toml_param=['river_water__volume_flow_rate']
2025-09-17 13:33:18,428 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Gauges locations set based on river outlets.
2025-09-17 13:33:18,440 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Gauges map based on catchment river outlets added.
2025-09-17 13:33:18,440 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Adding ['river_water__volume_flow_rate'] to csv section of toml.
2025-09-17 13:33:18,440 - hydromt.model.model - model - INFO - build: setup_gauges
2025-09-17 13:33:18,440 - hydromt.model.model - model - INFO - setup_gauges.index_col=None
2025-09-17 13:33:18,440 - hydromt.model.model - model - INFO - setup_gauges.snap_to_river=True
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.mask=None
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.snap_uparea=False
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.max_dist=10000.0
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.wdw=3
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.rel_error=0.05
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.abs_error=50.0
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.fillna=False
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.derive_subcatch=False
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.basename=None
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.toml_output=csv
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.gauge_toml_header=['river_q', 'precip']
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.gauge_toml_param=['river_water__volume_flow_rate', 'atmosphere_water__precipitation_volume_flux']
2025-09-17 13:33:18,441 - hydromt.model.model - model - INFO - setup_gauges.gauges_fn=grdc
2025-09-17 13:33:18,441 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading grdc GeoDataFrame data from /home/runner/.hydromt/artifact_data/latest/grdc.csv
2025-09-17 13:33:18,445 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - 3 grdc gauge locations found within domain
2025-09-17 13:33:18,786 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Adding ['river_water__volume_flow_rate', 'atmosphere_water__precipitation_volume_flux'] to csv section of toml.
2025-09-17 13:33:18,786 - hydromt.model.model - model - INFO - build: setup_precip_forcing
2025-09-17 13:33:18,786 - hydromt.model.model - model - INFO - setup_precip_forcing.precip_clim_fn=None
2025-09-17 13:33:18,786 - hydromt.model.model - model - INFO - setup_precip_forcing.chunksize=None
2025-09-17 13:33:18,787 - hydromt.model.model - model - INFO - setup_precip_forcing.precip_fn=era5
2025-09-17 13:33:18,788 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading era5 RasterDataset data from /home/runner/.hydromt/artifact_data/latest/era5.nc
2025-09-17 13:33:18,856 - hydromt.model.model - model - INFO - build: setup_temp_pet_forcing
2025-09-17 13:33:18,856 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.pet_method=debruin
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.press_correction=True
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.temp_correction=True
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.wind_correction=True
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.wind_altitude=10
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.reproj_method=nearest_index
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.fillna_method=None
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.dem_forcing_fn=era5_orography
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.skip_pet=False
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.chunksize=None
2025-09-17 13:33:18,857 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.temp_pet_fn=era5
2025-09-17 13:33:18,858 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading era5 RasterDataset data from /home/runner/.hydromt/artifact_data/latest/era5.nc
2025-09-17 13:33:18,903 - hydromt.data_catalog.sources.data_source - data_source - INFO - Reading era5_orography RasterDataset data from /home/runner/.hydromt/artifact_data/latest/era5_orography.nc
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - build: setup_constant_pars
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.subsurface_water__horizontal-to-vertical_saturated_hydraulic_conductivity_ratio=100
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.snowpack__degree-day_coefficient=3.75653
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.soil_surface_water__infiltration_reduction_parameter=0.038
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.vegetation_canopy_water__mean_evaporation-to-mean_precipitation_ratio=0.11
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.soil~compacted_surface_water__infiltration_capacity=5
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.soil_water_sat-zone_bottom__max_leakage_volume_flux=0
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.soil_root~wet__sigmoid_function_shape_parameter=-500
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.atmosphere_air__snowfall_temperature_threshold=0
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.atmosphere_air__snowfall_temperature_interval=2
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.snowpack__melting_temperature_threshold=0
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.snowpack__liquid_water_holding_capacity=0.1
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.glacier_ice__degree-day_coefficient=5.3
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.glacier_firn_accumulation__snowpack~dry_leq-depth_fraction=0.002
2025-09-17 13:33:19,114 - hydromt.model.model - model - INFO - setup_constant_pars.glacier_ice__melting_temperature_threshold=1.3
2025-09-17 13:33:19,115 - hydromt.hydromt_wflow.wflow_base - wflow_base - INFO - Write model data to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full
2025-09-17 13:33:19,125 - hydromt.model.components.grid - grid - INFO - wflow_sbm.staticmaps: Writing grid data to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticmaps.nc.
2025-09-17 13:33:19,217 - hydromt.model.components.spatial - spatial - INFO - wflow_sbm.staticmaps: Writing region to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/region.geojson.
2025-09-17 13:33:19,244 - hydromt.model.components.geoms - geoms - INFO - wflow_sbm.geoms: Writing geoms to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/basins_highres.geojson.
2025-09-17 13:33:19,261 - hydromt.model.components.geoms - geoms - INFO - wflow_sbm.geoms: Writing geoms to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/basins.geojson.
2025-09-17 13:33:19,264 - hydromt.model.components.geoms - geoms - INFO - wflow_sbm.geoms: Writing geoms to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/rivers.geojson.
2025-09-17 13:33:19,269 - hydromt.model.components.geoms - geoms - INFO - wflow_sbm.geoms: Writing geoms to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/glaciers.geojson.
2025-09-17 13:33:19,303 - hydromt.model.components.geoms - geoms - INFO - wflow_sbm.geoms: Writing geoms to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/outlets.geojson.
2025-09-17 13:33:19,305 - hydromt.model.components.geoms - geoms - INFO - wflow_sbm.geoms: Writing geoms to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/gauges_grdc.geojson.
2025-09-17 13:33:19,307 - hydromt.hydromt_wflow.components.forcing - forcing - INFO - Write forcing file
2025-09-17 13:33:19,307 - hydromt.hydromt_wflow.components.forcing - forcing - WARNING - Start time 2010-01-01T00:00:00.000000 does not match the beginning of the data. Changing to start of the data: 2010-02-02T00:00:00.000000000.
2025-09-17 13:33:19,308 - hydromt.hydromt_wflow.components.forcing - forcing - WARNING - End time 2010-03-31T00:00:00.000000 does not match the end of the data. Changing to end of the data: 2010-02-15T00:00:00.000000000.
2025-09-17 13:33:19,310 - hydromt.hydromt_wflow.components.forcing - forcing - INFO - Writing file /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/inmaps-era5-2010.nc
2025-09-17 13:33:19,331 - hydromt.model.components.tables - tables - INFO - wflow_sbm.tables: No tables found, skip writing.
2025-09-17 13:33:19,331 - hydromt.model.components.grid - grid - INFO - wflow_sbm.states: No grid data found, skip writing.
2025-09-17 13:33:19,331 - hydromt.hydromt_wflow.components.config - config - INFO - Writing model config to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/wflow_sbm.toml.

With this example we build a complete Wflow model including forcing. The example means the following: run hydromt build with:

  • wflow : i.e. build a Wflow model

  • ./wflow_test_full : output model folder

  • -i wflow_build.yml : setup configuration file including all components to build and their arguments

  • -d artifact_data: data catalog to use. Here artifact_data which contains a global data extract for Northern Italy for demo purposes.

  • -v : give some extra verbosity (1 * v) to display additional 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 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_full"
for path, _, files in os.walk(root):
    print(path)
    for name in files:
        if name.endswith(".xml"):
            continue
        print(f" - {name}")
wflow_test_full
 - hydromt.log
 - staticmaps.nc
 - wflow_sbm.toml
 - hydromt_data.yml
 - inmaps-era5-2010.nc
wflow_test_full/staticgeoms
 - basins.geojson
 - region.geojson
 - glaciers.geojson
 - rivers.geojson
 - gauges_grdc.geojson
 - basins_highres.geojson
 - outlets.geojson

Visualize and/or inspect model schematization#

  • 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.