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 (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_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 "./wflow_test_full" -i wflow_build.yml -d artifact_data --fo -v
2025-08-29 03:25:31,230 - hydromt - log - INFO - HydroMT version: 1.2.0.dev0
2025-08-29 03:25:31,230 - hydromt.cli.main - main - INFO - Building instance of wflow model at /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full.
2025-08-29 03:25:31,230 - hydromt.cli.main - main - INFO - User settings:
Downloading file 'v1.0.0/data_catalog.yml' from 'https://raw.githubusercontent.com/Deltares/hydromt/main/data/catalogs/artifact_data/v1.0.0/data_catalog.yml' to '/home/runner/.hydromt/artifact_data'.
2025-08-29 03:25:31,713 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Reading data catalog artifact_data latest
2025-08-29 03:25:31,713 - hydromt.data_catalog.data_catalog - data_catalog - INFO - Parsing data catalog from /home/runner/.hydromt/artifact_data/v1.0.0/data_catalog.yml
Downloading data from 'https://github.com/DirkEilander/hydromt-artifacts/releases/download/v0.0.9/data.tar.gz' to file '/home/runner/.hydromt/artifact_data/latest/data.tar.gz'.
SHA256 hash of downloaded file: 32de5b95c171628547f303d7f65d53cbb1b9da9af4834717c8efff93fe55aad4
Use this value as the 'known_hash' argument of 'pooch.retrieve' to ensure that the file hasn't changed if it is downloaded again in the future.
Untarring contents of '/home/runner/.hydromt/artifact_data/latest/data.tar.gz' to '/home/runner/.hydromt/artifact_data/latest'
2025-08-29 03:25:34,395 - hydromt.model.root - root - INFO - setting root to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full
2025-08-29 03:25:34,395 - hydromt.model.model - model - INFO - Initializing wflow model from hydromt_wflow (v1.0.0.dev0).
2025-08-29 03:25:34,395 - 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:25:34,409 - hydromt.hydromt_wflow.wflow - wflow - INFO - Supported Wflow.jl version v1+
2025-08-29 03:25:34,409 - hydromt.hydromt_wflow.components.config - config - INFO - Reading default config file from /home/runner/work/hydromt_wflow/hydromt_wflow/hydromt_wflow/data/wflow/wflow_sbm.toml.
2025-08-29 03:25:34,410 - hydromt.model.model - model - INFO - build: setup_config
2025-08-29 03:25:34,410 - 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-08-29 03:25:34,410 - hydromt.model.model - model - INFO - build: setup_basemaps
2025-08-29 03:25:34,410 - hydromt.model.model - model - INFO - setup_basemaps.basin_index_fn=merit_hydro_index
2025-08-29 03:25:34,411 - hydromt.model.model - model - INFO - setup_basemaps.res=0.00833
2025-08-29 03:25:34,411 - hydromt.model.model - model - INFO - setup_basemaps.upscale_method=ihu
2025-08-29 03:25:34,411 - 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:25:34,411 - hydromt.model.model - model - INFO - setup_basemaps.hydrography_fn=merit_hydro
2025-08-29 03:25:34,411 - 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:25:34,411 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing base hydrography basemaps.
2025-08-29 03:25:34,515 - hydromt.data_catalog.drivers.geodataframe.pyogrio_driver - pyogrio_driver - WARNING - Overwriting crs of GeoDataFrame to EPSG:4326
2025-08-29 03:25:37,650 - hydromt.model.processes.basin_mask - basin_mask - INFO - subbasin bbox: [11.7750, 45.8042, 12.7450, 46.6900]
2025-08-29 03:25:37,710 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - (Sub)basin at original resolution has 664756 cells.
2025-08-29 03:25:37,844 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Upscale flow direction data: 10x, ihu method.
2025-08-29 03:25:51,321 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Derive stream order.
2025-08-29 03:25:51,489 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Map shape: (106, 116); active cells: 6637.
2025-08-29 03:25:51,489 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Outlet coordinates (1/1): (12.20750,45.83583).
2025-08-29 03:25:51,507 - hydromt.hydromt_wflow.wflow - wflow - INFO - Adding basin shape to staticgeoms.
2025-08-29 03:25:51,519 - hydromt.hydromt_wflow.workflows.basemaps - basemaps - INFO - Derive elevation and slope.
2025-08-29 03:25:51,687 - hydromt.model.model - model - INFO - build: setup_rivers
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.river_geom_fn=hydro_rivers_lin
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.river_upa=30
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.rivdph_method=powlaw
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.slope_len=2000
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.min_rivlen_ratio=0.0
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.min_rivdph=1
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.min_rivwth=30
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.smooth_len=5000
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.rivman_mapping_fn=roughness_river_mapping_default
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.elevtn_map=land_elevation
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.river_routing=kinematic-wave
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.connectivity=8
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.strord_name=meta_streamorder
2025-08-29 03:25:51,688 - 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_water_flow__manning_n_parameter': 'river_manning_n', 'river_bank_water__elevation': 'river_bank_elevation'}
2025-08-29 03:25:51,688 - hydromt.model.model - model - INFO - setup_rivers.hydrography_fn=merit_hydro
2025-08-29 03:25:51,688 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing river maps.
2025-08-29 03:25:51,765 - hydromt.hydromt_wflow.workflows.river - river - INFO - Set river mask (min uparea: 30 km2) and prepare flow dirs.
2025-08-29 03:25:51,917 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive river length.
2025-08-29 03:25:55,067 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive river slope.
2025-08-29 03:25:55,694 - 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/river_manning_mapping.csv
2025-08-29 03:25:55,699 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving river_manning_n using average resampling (nodata=-999.0).
2025-08-29 03:25:55,909 - hydromt.hydromt_wflow.workflows.river - river - INFO - Derive ['rivwth', 'qbankfull'] from shapefile.
2025-08-29 03:25:55,955 - hydromt.hydromt_wflow.workflows.river - river - INFO - Valid for 381/655 river cells (max dist: 392 m).
2025-08-29 03:25:58,497 - hydromt.hydromt_wflow.wflow - wflow - INFO - Adding rivers vector to geoms.
2025-08-29 03:25:59,110 - hydromt.hydromt_wflow.wflow - wflow - INFO - Update wflow config model.river_routing="kinematic-wave"
2025-08-29 03:25:59,111 - hydromt.model.model - model - INFO - build: setup_reservoirs_simple_control
2025-08-29 03:25:59,111 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.timeseries_fn=gww
2025-08-29 03:25:59,111 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.overwrite_existing=False
2025-08-29 03:25:59,111 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.duplicate_id=error
2025-08-29 03:25:59,111 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.min_area=1.0
2025-08-29 03:25:59,111 - 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-08-29 03:25:59,111 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.geom_name=meta_reservoirs_simple_control
2025-08-29 03:25:59,111 - hydromt.model.model - model - INFO - setup_reservoirs_simple_control.reservoirs_fn=hydro_reservoirs
2025-08-29 03:25:59,111 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing reservoir with simple control maps.
2025-08-29 03:25:59,117 - hydromt.data_catalog.drivers.geodataframe.pyogrio_driver - pyogrio_driver - WARNING - Overwriting crs of GeoDataFrame to EPSG:4326
2025-08-29 03:25:59,127 - hydromt.hydromt_wflow.workflows.reservoirs - reservoirs - INFO - 0 reservoir(s) of sufficient size found within region.
2025-08-29 03:25:59,127 - hydromt.model.model - model - INFO - build: setup_reservoirs_no_control
2025-08-29 03:25:59,127 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.rating_curve_fns=None
2025-08-29 03:25:59,127 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.overwrite_existing=False
2025-08-29 03:25:59,127 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.duplicate_id=error
2025-08-29 03:25:59,127 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.min_area=10.0
2025-08-29 03:25:59,127 - 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-08-29 03:25:59,127 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.geom_name=meta_reservoirs_no_control
2025-08-29 03:25:59,128 - hydromt.model.model - model - INFO - setup_reservoirs_no_control.reservoirs_fn=hydro_lakes
2025-08-29 03:25:59,128 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing reservoir maps.
2025-08-29 03:25:59,133 - hydromt.data_catalog.drivers.geodataframe.pyogrio_driver - pyogrio_driver - WARNING - Overwriting crs of GeoDataFrame to EPSG:4326
2025-08-29 03:25:59,136 - hydromt.hydromt_wflow.workflows.reservoirs - reservoirs - INFO - 0 reservoir(s) of sufficient size found within region.
2025-08-29 03:25:59,136 - hydromt.model.model - model - INFO - build: setup_glaciers
2025-08-29 03:25:59,136 - hydromt.model.model - model - INFO - setup_glaciers.min_area=0.0
2025-08-29 03:25:59,136 - 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-08-29 03:25:59,136 - hydromt.model.model - model - INFO - setup_glaciers.geom_name=glaciers
2025-08-29 03:25:59,136 - hydromt.model.model - model - INFO - setup_glaciers.glaciers_fn=rgi
2025-08-29 03:25:59,137 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing glacier maps.
2025-08-29 03:25:59,142 - hydromt.data_catalog.drivers.geodataframe.pyogrio_driver - pyogrio_driver - WARNING - Overwriting crs of GeoDataFrame to EPSG:4326
2025-08-29 03:25:59,145 - hydromt.hydromt_wflow.wflow - wflow - INFO - 38 glaciers of sufficient size found within region.
2025-08-29 03:26:00,168 - hydromt.model.model - model - INFO - build: setup_lulcmaps
2025-08-29 03:26:00,168 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_mapping_fn=globcover_mapping_default
2025-08-29 03:26:00,168 - 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-08-29 03:26:00,168 - hydromt.model.model - model - INFO - setup_lulcmaps.output_names_suffix=None
2025-08-29 03:26:00,169 - hydromt.model.model - model - INFO - setup_lulcmaps.lulc_fn=globcover_2009
2025-08-29 03:26:00,169 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing LULC parameter maps.
2025-08-29 03:26:00,180 - 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:00,188 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving landuse using nearest resampling (nodata=230).
2025-08-29 03:26:00,209 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_kext using average resampling (nodata=-999.0).
2025-08-29 03:26:00,227 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving land_manning_n using average resampling (nodata=-999.0).
2025-08-29 03:26:00,246 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving soil_compacted_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:00,264 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_root_depth using average resampling (nodata=-999.0).
2025-08-29 03:26:00,282 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_leaf_storage using average resampling (nodata=-999.0).
2025-08-29 03:26:00,301 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_wood_storage using average resampling (nodata=-999.0).
2025-08-29 03:26:00,320 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving land_water_fraction using average resampling (nodata=-999.0).
2025-08-29 03:26:00,338 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_crop_factor using average resampling (nodata=-999.0).
2025-08-29 03:26:00,358 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_alpha_h1 using mode resampling (nodata=-999).
2025-08-29 03:26:00,417 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h1 using average resampling (nodata=-999).
2025-08-29 03:26:00,438 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h2 using average resampling (nodata=-999).
2025-08-29 03:26:00,461 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h3_high using average resampling (nodata=-999).
2025-08-29 03:26:00,482 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h3_low using average resampling (nodata=-999).
2025-08-29 03:26:00,504 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving vegetation_feddes_h4 using average resampling (nodata=-999).
2025-08-29 03:26:00,555 - hydromt.model.model - model - INFO - build: setup_laimaps
2025-08-29 03:26:00,555 - hydromt.model.model - model - INFO - setup_laimaps.lulc_fn=None
2025-08-29 03:26:00,555 - hydromt.model.model - model - INFO - setup_laimaps.lulc_sampling_method=any
2025-08-29 03:26:00,555 - hydromt.model.model - model - INFO - setup_laimaps.lulc_zero_classes=[]
2025-08-29 03:26:00,555 - hydromt.model.model - model - INFO - setup_laimaps.buffer=2
2025-08-29 03:26:00,555 - hydromt.model.model - model - INFO - setup_laimaps.output_name=vegetation_leaf_area_index
2025-08-29 03:26:00,555 - hydromt.model.model - model - INFO - setup_laimaps.lai_fn=modis_lai
2025-08-29 03:26:00,555 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing LAI maps.
2025-08-29 03:26:03,112 - hydromt.hydromt_wflow.workflows.landuse - landuse - INFO - Deriving LAI using average resampling (nodata=nan).
2025-08-29 03:26:03,180 - hydromt.model.model - model - INFO - build: setup_soilmaps
2025-08-29 03:26:03,180 - hydromt.model.model - model - INFO - setup_soilmaps.soil_fn=soilgrids
2025-08-29 03:26:03,180 - hydromt.model.model - model - INFO - setup_soilmaps.ptf_ksatver=brakensiek
2025-08-29 03:26:03,180 - hydromt.model.model - model - INFO - setup_soilmaps.wflow_thicknesslayers=[100, 300, 800]
2025-08-29 03:26:03,181 - 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-08-29 03:26:03,181 - hydromt.hydromt_wflow.wflow - wflow - INFO - Preparing soil parameter maps.
2025-08-29 03:26:03,706 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample theta_s
2025-08-29 03:26:03,913 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample theta_r
2025-08-29 03:26:04,167 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample ksat_vertical
2025-08-29 03:26:04,226 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - calculate and resample pore size distribution index
2025-08-29 03:26:04,699 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - fit z - log(ksat_vertical ) with numpy linalg regression (y = b*x) -> M_
2025-08-29 03:26:05,113 - hydromt.hydromt_wflow.workflows.soilgrids - soilgrids - INFO - fit zi - Ksat with curve_fit (scipy.optimize) -> M
2025-08-29 03:26:07,875 - hydromt.gis.raster - raster - WARNING - No numerical nodata value found, skipping set_nodata
2025-08-29 03:26:08,604 - hydromt.gis.raster - raster - WARNING - No numerical nodata value found, skipping set_nodata
2025-08-29 03:26:08,734 - hydromt.gis.raster - raster - WARNING - No numerical nodata value found, skipping set_nodata
2025-08-29 03:26:08,841 - hydromt.model.model - model - INFO - build: setup_outlets
2025-08-29 03:26:08,841 - hydromt.model.model - model - INFO - setup_outlets.river_only=True
2025-08-29 03:26:08,841 - hydromt.model.model - model - INFO - setup_outlets.toml_output=csv
2025-08-29 03:26:08,841 - hydromt.model.model - model - INFO - setup_outlets.gauge_toml_header=['river_q']
2025-08-29 03:26:08,841 - hydromt.model.model - model - INFO - setup_outlets.gauge_toml_param=['river_water__volume_flow_rate']
2025-08-29 03:26:08,841 - hydromt.hydromt_wflow.wflow - wflow - INFO - Gauges locations set based on river outlets.
2025-08-29 03:26:08,854 - hydromt.hydromt_wflow.wflow - wflow - INFO - Gauges map based on catchment river outlets added.
2025-08-29 03:26:08,854 - hydromt.hydromt_wflow.wflow - wflow - INFO - Adding ['river_water__volume_flow_rate'] to csv section of toml.
2025-08-29 03:26:08,854 - hydromt.model.model - model - INFO - build: setup_gauges
2025-08-29 03:26:08,854 - hydromt.model.model - model - INFO - setup_gauges.index_col=None
2025-08-29 03:26:08,854 - hydromt.model.model - model - INFO - setup_gauges.snap_to_river=True
2025-08-29 03:26:08,854 - hydromt.model.model - model - INFO - setup_gauges.mask=None
2025-08-29 03:26:08,854 - hydromt.model.model - model - INFO - setup_gauges.snap_uparea=False
2025-08-29 03:26:08,854 - hydromt.model.model - model - INFO - setup_gauges.max_dist=10000.0
2025-08-29 03:26:08,854 - hydromt.model.model - model - INFO - setup_gauges.wdw=3
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.rel_error=0.05
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.abs_error=50.0
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.fillna=False
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.derive_subcatch=False
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.basename=None
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.toml_output=csv
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.gauge_toml_header=['river_q', 'precip']
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.gauge_toml_param=['river_water__volume_flow_rate', 'atmosphere_water__precipitation_volume_flux']
2025-08-29 03:26:08,855 - hydromt.model.model - model - INFO - setup_gauges.gauges_fn=grdc
2025-08-29 03:26:08,860 - 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:08,860 - hydromt._utils.unused_kwargs - unused_kwargs - WARNING - object: GeoDataFrameTableDriver does not use kwarg predicate with value intersects.
2025-08-29 03:26:08,864 - hydromt.hydromt_wflow.wflow - wflow - INFO - 3 grdc gauge locations found within domain
2025-08-29 03:26:09,227 - hydromt.hydromt_wflow.wflow - wflow - INFO - Adding ['river_water__volume_flow_rate', 'atmosphere_water__precipitation_volume_flux'] to csv section of toml.
2025-08-29 03:26:09,227 - hydromt.model.model - model - INFO - build: setup_precip_forcing
2025-08-29 03:26:09,227 - hydromt.model.model - model - INFO - setup_precip_forcing.precip_clim_fn=None
2025-08-29 03:26:09,227 - hydromt.model.model - model - INFO - setup_precip_forcing.chunksize=None
2025-08-29 03:26:09,227 - hydromt.model.model - model - INFO - setup_precip_forcing.precip_fn=era5
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - build: setup_temp_pet_forcing
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.pet_method=debruin
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.press_correction=True
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.temp_correction=True
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.wind_correction=True
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.wind_altitude=10
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.reproj_method=nearest_index
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.fillna_method=None
2025-08-29 03:26:09,299 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.dem_forcing_fn=era5_orography
2025-08-29 03:26:09,300 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.skip_pet=False
2025-08-29 03:26:09,300 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.chunksize=None
2025-08-29 03:26:09,300 - hydromt.model.model - model - INFO - setup_temp_pet_forcing.temp_pet_fn=era5
2025-08-29 03:26:09,555 - hydromt.model.model - model - INFO - build: setup_constant_pars
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.subsurface_water__horizontal-to-vertical_saturated_hydraulic_conductivity_ratio=100
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.snowpack__degree-day_coefficient=3.75653
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.soil_surface_water__infiltration_reduction_parameter=0.038
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.vegetation_canopy_water__mean_evaporation-to-mean_precipitation_ratio=0.11
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.soil~compacted_surface_water__infiltration_capacity=5
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.soil_water_sat-zone_bottom__max_leakage_volume_flux=0
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.soil_root~wet__sigmoid_function_shape_parameter=-500
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.atmosphere_air__snowfall_temperature_threshold=0
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.atmosphere_air__snowfall_temperature_interval=2
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.snowpack__melting_temperature_threshold=0
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.snowpack__liquid_water_holding_capacity=0.1
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.glacier_ice__degree-day_coefficient=5.3
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.glacier_firn_accumulation__snowpack~dry_leq-depth_fraction=0.002
2025-08-29 03:26:09,556 - hydromt.model.model - model - INFO - setup_constant_pars.glacier_ice__melting_temperature_threshold=1.3
2025-08-29 03:26:09,556 - hydromt.hydromt_wflow.wflow - wflow - INFO - Write model data to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full
2025-08-29 03:26:09,570 - hydromt._io.writers - writers - INFO - writing region data to /home/runner/work/hydromt_wflow/hydromt_wflow/docs/_examples/wflow_test_full/staticgeoms/region.geojson
2025-08-29 03:26:09,752 - hydromt.hydromt_wflow.components.forcing - forcing - INFO - Write forcing file
2025-08-29 03:26:09,753 - 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-08-29 03:26:09,753 - 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-08-29 03:26:09,755 - 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
[########################################] | 100% Completed | 101.28 ms
2025-08-29 03:26:09,878 - hydromt._typing.error - error - WARNING - No grid data found, skip writing.
2025-08-29 03:26:09,878 - 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.