Base Configuration#
This is the procurement configuration used in the WattTime Impact Metastudy. The complete explaination of each configuration can be found in PyPSA-Eur: Configuration.
Note
The PyPSA-Eur configuration files follow a pyramid-like structure, where the parameters in the highest configuration file add to and override those in the configuration file below it. The order is as follows:
config.meta.yaml (this section)
Thus, for example changes specified in scenario.meta.yaml will add to and override configurations in config.meta.yaml and so on.
run
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Run Documentation.
run:
prefix: ""
name:
- baseline-2025-1H
#- baseline-2030-1H
scenarios:
enable: true
file: config/scenarios.meta-1H.yaml
disable_progressbar: false
shared_resources:
policy: false
exclude: []
shared_cutouts: true
This is the only few section in the file that needs to be changed in order to run the scenario.
prefix: (optional) directory for output results
name: Scenario name from
config/scenarios.meta.yaml
foresight
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Foresight Documentation.
foresight: myopic
The scope of this work is based on myopic foresight.
scenario
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Scenario Documentation
For a comprehensive explanation, refer to the upstream PyPSA-Eur Wildcard Documentation
scenario:
clusters:
- 39
opts:
- ''
sector_opts:
- ''
planning_horizons:
# - 2025
- 2030
clusters: The model outputs are organized into 39 nodes, which is the default configuration in PyPSA-Eur. Models with higher spatial resolution are currently not supported.
planning_horizons: The model simulates either the year 2025 or 2035.
countries
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Countries Documentation.
countries: ['AL', 'AT', 'BA', 'BE', 'BG', 'CH', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'ME', 'MK', 'NL', 'NO', 'PL', 'PT', 'RO', 'RS', 'SE', 'SI', 'SK', 'XK']
The analysis includes all of the default countries in PyPSA-Eur.
snapshots
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Snapshots Documentation.
snapshots:
start: "2013-01-01"
end: "2014-01-01"
inclusive: 'left'
The baseline scenario is based on the climate year 2013.
enable
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Enable Documentation.
enable:
retrieve: auto
retrieve_databundle: false
retrieve_cost_data: true
build_cutout: false
retrieve_cutout: false
custom_busmap: false
drop_leap_day: true
procurement: true # [true, false ] If true, model the procurement strategies
ci_load: true
For the first run, it is recommended to set retrieve_databundle
, retrieve_cost_data
and retrieve_cutout
as true.
electricity
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Electricity Documentation.
electricity:
max_hours:
li-ion battery: [8]
vanadium: [10]
lair: [12]
pair: [24]
H2: [168]
iron-air battery: [100]
extendable_carriers:
StorageUnit: [] # li-ion battery, iron-air battery, H2, lfp, vanadium, lair, pair
Store: [li-ion battery, H2]
powerplants_filter: >
(DateOut >= 2024 or DateOut != DateOut) and not (Country == 'DE' and Fueltype == 'Nuclear')
and not (Country.isin(['AT', 'BE', 'DK', 'ES', 'FI', 'FR', 'GB', 'GR', 'HU', 'IE', 'IT', 'MK', 'NL', 'PT', 'RS', 'SE', 'SK'])
and Fueltype.isin(['Hard Coal', 'Lignite']))
transmission_limit: v1.0
ci_load:
load_path_1: data/CI-load.csv # path to Eurostat CI load input data (from https://ec.europa.eu/eurostat/databrowser/view/nrg_cb_e__custom_16270810/default/table?lang=en (CSV 2.0))
load_path_2: data/CI-load-missing.xlsx # path to IEA CI load input data (from https://www.iea.org/data-and-statistics/data-product/world-energy-balances-highlights)
load_year: 2023
profile: "baseload" # type of load profile (e.g., "baseload", "industry", "total_daily_avg", "total")
share: 50 # share of CI load to be moved to high voltage level (to avoid negative values when profile is not "total")
freeze_capacity: false
filter_TYNDP_build_year: true
Configuration changes made:
If the year 2030 is selected, the
powerplants_filter
excludes countries that have committed to phasing out coal power plants by 2030.By default, Germany is set to phase out its nuclear power plants by 2025 and beyond.
transmission_limit
is set tov1.0
, meaning no transmission line expansions are allowed beyond those specified intransmission_projects
.
New configuration options introduced in this repository:
ci_load
: Settings for generating non-procuring CI loads and buses.
Note
The CI load should be already modelled in the baseline scenarios so to have a fair comparison with the procurement scenarios. If enable/ci_load
is set to true
, the CI load is generated through the add_ci_load
function in the add_procurement.py
script. The CI load is modelled as follows:
The CI annual electricity consumption of the 34 countries involved in the analysis is pulled from dedicated files in the
data/
repository. In particular, for most of the countries data are taken from Eurostat (i.e.,load_path_1
). Instead, for Switzerland and United Kingdom, data are taken from IEA (i.e.,load_path_2
).The reference year for energy consumption data is set through
load_year
.The CI share over the annual electricity consumption is computed and applied to the PyPSA-Eur load time series:
profile
: Setting for a certain daily profile to move from energy to load time series. A flat profile (i.e,baseload
) is used by default, since it is considered among the most appropriate when dealing with CI loads.share
: Setting for a certain share of the CI load to be moved to high-voltage dedicated buses. This is used to avoid potential negative loads during some snapshots. For instance, consider the loadDE0 0
, which is connected to the low-voltage busDE0 0 low voltage
. The corresponding CI load would be a portion ofDE0 0
, that is calledDE0 0 CI load
and is connected to the dedicated high-voltage busDE0 0 CI
. Also, dedicated import and export links are modelled to connect theDE0 0 low voltage
andDE0 0 CI
buses.
freeze_capacity
: Option to prevent the expansion of renewable energy technologies (not in use).filter_TYNDP_build_year
: Option to exclude TYNDP network components scheduled for construction after 2025 or 2030.
transmission_projects
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Transmission Projects Documentation.
transmission_projects:
include:
nep: false
new_link_capacity: keep #keep or zero
Configuration changes made:
The Ten Year Network Development Plan (TYNDP) 2020 transmission plan has been included from the model.
The Netzentwicklungsplan (NEP) of Germany has been excluded in the model.
The capacities of the newly added transmission lines are based on the targets specified for their planned build year.
sector
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Sector Documentation.
sector:
transport: false
heating: false
biomass: false
ammonia: false
# methanol: false
industry: false
shipping: false
aviation: false
agriculture: false
dac: false
H2_network: false
co2_network: false
allam_cycle_gas: false
imports:
enable: false
gas_distribution_grid: false
cluster_heat_buses: false
All sector-related configurations are disabled to model an electricity-only system.
costs
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Costs Documentation.
costs:
year: 2030
version: v0.10.1
overwrites:
fuel:
OCGT: 31.98 # https://tradingeconomics.com/commodity/eu-natural-gas
CCGT: 31.98
gas: 31.98
coal: 10.08 # https://www.tradingview.com/symbols/ICEEUR-ATW1!/ 1 USD = 0.88 EUR
lignite: 22.11 # https://www.tradingview.com/symbols/ICEEUR-ATW1!/ 1 USD = 0.88 EUR, lignite ≈ 1/3 hard coal
efficiency:
Compressed-Air-Adiabatic-bicharger: 0.7745
investment:
iron-air battery: 21710 # in EUR/MWh (2020) from 23,500 EUR/MWh (2024)
Compressed-Air-Adiabatic-store: 28835 # in EUR/MWh (2020) from 30,000 EUR/MWh (2022)
Compressed-Air-Adiabatic-bicharger: 1658016 # in EUR/MW (2020) from 1,725,000 EUR/MW (2022)
lifetime:
Compressed-Air-Adiabatic-store: 40 # years
Compressed-Air-Adiabatic-bicharger: 40 # years
marginal_cost:
solar: 0.01
onwind: 0.015
offwind: 0.015
hydro: 0.
H2: 0.
electrolysis: 0.
fuel cell: 0.
li-ion battery: 0.
battery inverter: 0.
capital_cost:
geothermal: 10000
emission_prices:
enable: false
co2: 64.85
co2_monthly_prices: false
Configuration changes made:
The cost data from PyPSA technology cost database is based on the year 2035, instead of 2030.
Gas price is set at 31.98 EUR/MWh. EU Natural Gas TTF in April 2025
Coal price is set at 10.08 EUR/MWh API2 Rotterdam Coal Futures in April 2025
Lignite price is set at 22.11 EUR/MWh Source from Business Analytiq (2024 Lignite price)
This configuration is relevant if those storage technologies are included in the model:
Iron-air battery price is set at 23,500 EUR/MWh (2024).
Storage energy cost for CAES is set at 30,000 EUR/MWh (2022).
Storage power cost for CAES is set at 1,725,000 EUR/MW (2022).
The lifetime of CAES is reduced to 40 years.
clustering
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Clustering Documentation.
clustering:
temporal:
resolution_sector: 1H
The temporal resolution is clustered to a 3H resolution by default, will change depending on the scenarios.
adjustments
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Plotting Documentation.
adjustments:
sector:
absolute:
links:
DC:
marginal_cost: 0.5
electricity distribution grid:
marginal_cost: 0.5
procurement:
absolute:
storage_units:
li-ion battery 8h:
marginal_cost: 0.5
Configuration changes made:
The marginal costs are set to 0.5 EUR/MWh to avoid unintended storage cycling phenomena. For more details on such phenomena, refer to this paper.
solving
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Solving Documentation.
solving:
mem_mb: 300000 #50 GB is enough for vol-match 1 country, 150 GB is needed for multiple countries
runtime: 24h #runtime in humanfriendly style https://humanfriendly.readthedocs.io/en/latest/
Note
As noted in the Installation section, there are several solvers compatible with PyPSA. Please choose the ones that are available to you.
Each solver has a solver-specific parameter settings (options
) to chose from:
gurobi:
gurobi-default
,gurobi-numeric-focus
,gurobi-fallback
highs:
highs-default
cplex:
cplex-default
copt:
copt-default
,copt-gpu
cbc:
cbc-default
glpk:
glpk-default