Running the Model with Snakemake#
This guide walks through how to configure and run GreenBubble using the Snakemake workflow, explains the default/override config pattern, and shows a concrete example of creating a scenario run.
—
How the config system works#
GreenBubble uses three configuration files, each with a *.default.yaml
version committed to the repository:
File |
Purpose |
|---|---|
|
Run settings: demands or price targets, technology flags, economics, solver |
|
Per-technology capacity bounds, ramp limits, operational options |
|
Which components to plot and export after optimisation |
The *.default.yaml files are the committed base — they define a working
scenario out of the box and should not be edited for individual runs.
To customise a run, you create a plain config/config.yaml (and optionally
config/n_config.yaml) containing only the keys you want to change.
Snakemake merges the default and override files at startup: every key in
config.yaml replaces the corresponding key in config.default.yaml;
everything else keeps its default value.
Note
config/config.yaml and config/n_config.yaml are listed in
.gitignore — they are your local workspace and are not committed by default.
Loading order (inside Snakefile):
configfile: "config/config.default.yaml" # always loaded
if Path("config/config.yaml").exists():
configfile: "config/config.yaml" # merged on top if present
—
Quick start: run with defaults#
If no config/config.yaml exists, the model runs with the committed defaults.
1. Dry-run — preview what Snakemake would execute without running anything:
snakemake -n
2. Full run with 4 parallel jobs:
snakemake -j4
3. Run with a single job (useful for debugging):
snakemake -j1
Outputs land in outputs/single_analysis/{run_name}/
(e.g. my_scenario/). Files inside carry the full configuration detail in
their names — see Wildcards for the format. The full configuration is
also preserved in networks/config_run.yaml inside that folder.
—
Example: creating a custom scenario#
Suppose you want to run a demand-driven scenario for a site in southern Denmark with a higher CO₂ cost, keeping everything else at the defaults.
Step 1 — create your override file
Create config/config.yaml with only the keys that differ:
# config/config.yaml — only keys that differ from config.default.yaml
run_name: high_co2_demand
CO2_cost: 150 # €/t (default: 100)
latitude: 55.2 # Vejle
longitude: 9.5
targets:
driver: 'demand'
demand_CH4: 400000 # MWh_CH4/y
demand_H2: 50000 # MWh_H2/y
demand_meoh: 0
You do not need to repeat n_flags, tariffs_dict, optimization,
or any other key — those are inherited from config.default.yaml.
Step 2 — dry-run to verify the scenario name:
snakemake -n
Snakemake prints the planned jobs and the output path.
Step 3 — run the scenario:
snakemake -j4
Results are written to:
outputs/single_analysis/high_co2_demand/
The file-name prefix inside (e.g. for the solved network) encodes all configuration detail:
networks/B_H_RE_H2_MEOH_METH_SN_ST_CO2_150_tD_H2_50_MeOH_0_CH4_400_2024_El_0.1_DET_1h_high_co2_demand_OPT.nc
The full configuration is also saved to networks/config_run.yaml
for reproducibility.
—
Switching between scenarios#
Each scenario is just a different config/config.yaml. A simple way to
manage multiple scenarios is to keep named copies and swap them in:
# save the current scenario
cp config/config.yaml config/config.high_co2.yaml
# switch to a different scenario
cp config/config.price_mode.yaml config/config.yaml
snakemake -j4
Because outputs are keyed to the scenario parameters in the folder name, results from different scenarios never overwrite each other.
—
Overriding network component settings#
If you also need to change a technology setting — for example, to allow
the heat pump to expand or to increase the biogas storage cap — create
config/n_config.yaml with only those entries:
# config/n_config.yaml — only keys that differ from n_config.default.yaml
heat pump:
expansion: true
biogas storage:
max capacity: 500 # MWh (default: 200)
The options: block (district heating, biomass markets, biochar credits)
lives at the bottom of n_config.default.yaml and can be overridden the
same way:
options:
DH:
enable: true
price: 35 # €/MWh (default: 30)
—
Useful Snakemake flags#
Flag |
Effect |
|---|---|
|
Show planned jobs without executing |
|
Use N parallel jobs (set to number of CPU cores) |
|
Force re-execution of a specific rule |
|
Stop after a specific rule completes |
|
Override a single top-level config key on the command line |
|
Re-run jobs whose output files are incomplete |
Example — override a single key without editing any file:
snakemake -j4 --config CO2_cost=200
This is convenient for quick parameter sweeps but does not affect keys nested
under a parent (e.g. targets.driver); use config/config.yaml for those.
—
See also#
Configuration — full reference for every config key
Rules Overview — description of each Snakemake rule
Wildcards — how output paths are constructed from config values
Rolling Horizon Dispatch Optimisation — dispatch-only runs on a fixed network