Base Configuration#
This is the base configuration outline used in the analysis “The Role of Energy Storage in Germany”. 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.form.yaml (this section)
Thus, for example changes specified in scenario.form.yaml will add to and override configurations in config.form.yaml and so on.
run
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Run Documentation.
run:
prefix: "scenarios"
name: "baseline-mds"
scenarios:
enable: true
file: config/scenarios.form.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.form.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:
ll:
- v1.11 # v1.x with x according to additional NEP links (existing_capacities=zero)
clusters:
- 52
planning_horizons:
- 2035
ll: v1.11 indicates that the existing transmission network capacity can be increased by 11%.
clusters: The model results are grouped into 52 nodes; see the clustering section for the disaggregation list.
planning_horizons: The model is simulating the year 2035.
countries
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Countries Documentation.
countries: ['AT', 'BE', 'CH', 'CZ', 'DE', 'DK', 'FR', 'IT', 'LU', 'NL', 'PL', 'SE']
The analysis includes Germany and its grid neighboring countries, along with Italy. The complete list:
AT: Austria
BE: Belgium
CH: Switzerland
CZ: Czech Republic
DE: Germany
DK: Denmark
FR: France
IT: Italy
LU: Luxembourg
NL: Netherlands
PL: Poland
SE: Sweden
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, with the snapshots adjusted in each scenarios accordingly.
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
final_adjustment: true
For the first run, it is recommended to set retrieve_databundle
, retrieve_cost_data
and retrieve_cutout
as true.
co2 budget
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur CO2 Budget Documentation.
co2_budget:
2035: 0.107 # derived from individual countries carbon emission targets for included sectors excluding domestic transport emissions from scope
The CO2 budget is derived from individual countries carbon emission targets for included sectors excluding fossil fuel domestic transport emissions from scope This means that the total budget is 315.4 MtCO2, equivalent to 10.7% of 1990 emissions for this scope. The complete calculation can be seen in the Carbon Emission Calculation section.
electricity
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Electricity Documentation.
electricity:
max_hours:
li-ion battery: [1, 2, 4, 8]
vanadium: [10]
lair: [12]
pair: [24]
H2: [168]
iron-air battery: [100]
extendable_carriers:
Generator: [solar, solar-hsat, onwind, offwind-ac, offwind-dc, offwind-float]
powerplants_filter: DateOut >= 2024 and not Fueltype.isin(['Nuclear', 'Hard Coal', 'Lignite'])
custom_powerplants: DateIn <= 2024 and DateOut >= 2024
Configuration changes made:
Lithium-ion are disaggregated into 1h, 2h, 4h and 8h for a more detail analysis.
Iron-air batteries have a maximum storage duration (
max hours
) of 100 hoursNuclear, Hard Coal, and Lignite power plants are excluded from the powerplantmatching database.
Instead, we use a validated dataset of power plants from
data/custom_powerplants.csv
where German nuclear, coal and lignite power plants are phased out for 2035.
atlite
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Atlite Documentation.
Define and specify the atlite.Cutout
used for calculating renewable potentials and time-series. All options except for features
are directly used as cutout parameters.
atlite:
# TODO: weather year - input from FORM
default_cutout: europe-2013-sarah3-era5
nprocesses: 4
show_progress: false
cutouts:
# use 'base' to determine geographical bounds and time span from config
# base:
# module: era5
europe-2013-sarah3-era5:
module: [sarah, era5] # in priority order
x: [-12., 42.]
y: [33., 72.]
dx: 0.3
dy: 0.3
time: ['2013', '2013']
The default_cutout
is derived for 2013 from SARAH-3 weather data, with missing values filled in using ERA-5 weather data.
renewable
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Renewable Documentation.
renewable:
hydro:
PHS_max_hours: 10
The maximum storage duration for pumped hydro storages are set to 10h, instead of the default 6h.
conventional
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Conventional Documentation.
conventional:
unit_commitment: false
dynamic_fuel_price: false
nuclear:
p_max_pu: "data/nuclear_p_max_pu.csv" # float of file name
p_min_pu: 0.5
The minimum energy dispatch for nuclear power plants is set to 50%.
lines
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Lines Documentation.
lines:
s_max_pu: 0.5
dynamic_line_rating:
activate: false
cutout: europe-2013-sarah3-era5
correction_factor: 0.95
max_voltage_difference: 30 # Glaum & Hofmann, 2022 https://arxiv.org/abs/2208.04716
max_line_rating: 1.5 # based on https://www.energysystem2050.net/content/TransnetBW-Study_EnergySystem2050.pdf?v2, p.81
The maximum line capacity is set to 50% of its total capacity, rather than 70%, to better approximate security and reserve capacity for reactive power flows given the clustered spatial resolution of the model.
transmission_projects
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Transmission Projects Documentation.
transmission_projects:
enable: true
include:
tyndp2020: false
nep: true
manual: false
skip:
- upgraded_lines
- upgraded_links
status:
- under_construction
- in_permitting
- confirmed
#- planned_not_yet_permitted
#- under_consideration
new_link_capacity: zero #keep or zero
Configuration changes made:
The Ten Year Network Development Plan (TYNDP) 2020 transmission plan has been excluded from the model.
The Netzentwicklungsplan (NEP) of Germany has been included in the model.
Only transmission projects that are under construction, in permitting, or confirmed are included.
Since the focus is on Germany, a conservative assumption is made regarding transmission projects, specifically by selecting only those that are most likely to be realized. This is why the NEP is preferred over the TYNDP.
existing_capacities
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Existing Capacities Documentation.
existing_capacities:
grouping_years_power: [1920, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025]
grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # heat grouping years >= baseyear will be ignored
threshold_capacity: 10
default_heating_lifetime: 20
conventional_carriers:
- lignite
- coal
- oil
- uranium
The content is kept identical to the default configuration file.
sector
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Sector Documentation.
sector:
transport: true
heating: true
biomass: false
industry: false
agriculture: false
fossil_fuels: true
district_heating:
potential: 0.3
progress:
2035: 0.45
bev_dsm: true
bev_dsm_availability: 0.2 # FE input
bev_charge_rate: 0.007 # FE input
v2g: true
land_transport_fuel_cell_share:
2035: 0
land_transport_electric_share:
2035: 0.30 # FE input
land_transport_ice_share:
2035: 0 # only include electric transport
include_transport_emissions: false
reduce_space_heat_exogenously: true
reduce_space_heat_exogenously_factor:
2035: 0.21
tes: false
dac: true
dac_limit:
enable: true
2035: 12.4 # limit in MtCO2
methanation: false
co2_sequestration_potential:
2035: 22.3
marginal_cost_storage: 0. #1e-4
stores: ["H2"]
storage_units: ["li-ion battery", "vanadium", "lair", "pair", "iron-air battery"]
residential_heat_dsm: true
residential_heat_restriction_value: 0.27
residential_heat_restriction_time: [ 10, 22 ] # 9am and 9pm
hydrogen_fuel_cell: true
hydrogen_turbine: false
hydrogen_underground_storage: true
hydrogen_underground_storage_locations:
# - onshore # more than 50 km from sea
- nearshore # within 50 km of sea
# - offshore
H2_network: false
gas_network: false
H2_retrofit: false
chp_extendable_DE: true # in final adjustment
Configuration changes made:
This analysis includes the power, heating and electric transport sector.
This analysis excludes the biomass, agriculture, industry, and fossil transport sector.
The availability of battery electric vehicles (BEV) for demand-side management is reduced from 50% to 20%.
The charging rate for BEVs is reduced from 11 kW to 7 kW.
The predicted share of land electric vehicles is reduced from 45% to 30% by 2035.
Land transport emissions are excluded from the model, as they are determined exogenously.
The reduction in space heating demand is increased from 11% to 21% by 2035 to adjust for the geographical scope of the model.
Li-ion batteries, vanadium, liquid air, CAES, and Iron-air batteries are defined as storage unit components rather than stores.
The hydrogen network is excluded from the model as to the limited scope of H2 in the rest of the model and as a trade-off with model complexity, particularly in terms of computational time.
load
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Load Documentation.
load:
scaling_factor: 1.26 # electricity load increase PyPSA 2013 to 2035 (https://www.agora-energiewende.de/fileadmin/Projekte/2021/2021_11_DE_KNStrom2035/2022-06-23_Praesentation_Klimaneutrales_Stromsystem_2035.pdf)
The model’s electricity load is based on data from 2013. By 2035, electricity demand is projected to increase by 26% compared to 2013 (Source from Agora Energiewende).
costs
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Costs Documentation.
costs:
year: 2035
version: 67a5830
social_discountrate: 0.02
fill_values:
FOM: 0
VOM: 0
efficiency: 1
fuel: 0
investment: 0
lifetime: 25
"CO2 intensity": 0
"discount rate": 0.07
# Marginal and capital costs can be overwritten
# capital_cost:
# onwind: 500
fuel:
OCGT: 38.84 # https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:52022SC0230 (Annex)
CCGT: 38.84
gas: 38.84
coal: 24.57 # https://businessanalytiq.com/procurementanalytics/index/subbituminous-coal-price-index/
lignite: 22.11 # https://businessanalytiq.com/procurementanalytics/index/lignite-coal-price-index/
nuclear: 1.75 # https://markets.businessinsider.com/commodities/uranium-price
uranium: 1.75
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.
emission_prices:
enable: false
co2: 0.
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 38.84 EUR/MWh. Source from the EU Comission (Annex)
Coal price is set at 24.57 EUR/MWh Source from Business Analytiq (2024 Coal price)
Lignite price is set at 22.11 EUR/MWh Source from Business Analytiq (2024 Lignite price)
Uranium price is set at 1.75 EUR/MWh Source from Business Insider (2024 price)
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:
focus_weights:
DE: 0.6
temporal:
resolution_sector: 4380SEG
Germany has a focus weight of 0.6, which means that out of 52 nodes, the distribution is as follows:
Germany: 31 nodes
France: 6 nodes
Italy: 5 nodes
Denmark: 2 nodes
The following countries each have 1 node, contributing to a total of 9 nodes:
Austria
Belgium
Switzerland
Czech Republic
Luxembourg
Netherlands
Poland
Sweden
The temporal resolution is segmented into 4380 snapshots, equivalent to an average temporal clustering of 2 hourly resolution.
Note
High segmentation temporal resolution such as 4380SEG has shown to yield similar results to 1 hourly temporal resolution, while providing a good compromise in terms of computational cost. See Segmentation Temporal Clustering for more details
solving
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Solving Documentation.
solving:
mem_mb: 150000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2
runtime: 24h #runtime in humanfriendly style https://humanfriendly.readthedocs.io/en/latest/
solver:
name: gurobi
options: gurobi-default
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
plotting
#
For a comprehensive explanation, refer to the upstream PyPSA-Eur Plotting Documentation.
plotting:
time_series:
start_date: '2013-05-01'
end_date: '2013-06-01'
costs_max: 40
costs_threshold: 0.01
tech_colors:
# all battery variation:
lfp: '#ace37f'
vanadium: '#9B111E'
Vanadium Redox Flow battery storage: '#9B111E'
Vanadium-Redox Battery Storage: '#9B111E'
lair: '#87CEEB'
Liquid Air energy storage: '#87CEEB'
Liquid Air Energy Storage: '#87CEEB'
pair: '#003366'
Adiabatic CAES: '#edba1c'
iron-air battery: '#1c404c'
Iron-Air battery storage: '#1c404c'
Iron-Air Battery Storage: '#1c404c'
Li-Ion battery storage: '#ace37f'
li-ion battery 1h: '#445A32'
li-ion battery 2h: '#67884C'
li-ion battery 4h: '#89B565'
li-ion battery 8h: '#ace37f'
Li-Ion Battery Storage 1h: '#445A32'
Li-Ion Battery Storage 2h: '#67884C'
Li-Ion Battery Storage 4h: '#89B565'
Li-Ion Battery Storage 8h: '#ace37f'
Li-Ion Battery Storage: '#ace37f'
other battery storage: '#80c944'
storage_map_cmaps:
iron-air battery: "Greys"
li-ion battery: "Greens"
lair: "Oranges"
pair: "YlOrBr"
vanadium: "Reds"
H2: "Purples"
PHS: "Blues"
Compared to the default configuration, the coloring scheme has been customized to the scope of this study.