Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
8e20213
focus_weight FR = IT = 2
lindnemi Feb 12, 2026
9bfbd68
smoother path for electricity import limits
lindnemi Feb 13, 2026
e925b40
start optimization in 2025
lindnemi Feb 13, 2026
770c731
keep 2050 out of interest
lindnemi Feb 13, 2026
06cb632
fix focus_weight error
lindnemi Feb 13, 2026
01af22f
add possibility to add H2 turbines in all of EU
lindnemi Feb 13, 2026
8e0461b
fix index
lindnemi Feb 13, 2026
b0a17ef
update RES bounds in line with new ARIADNE modeling protocol
lindnemi Feb 13, 2026
1e83a79
force later retrofit of H2 plants
lindnemi Feb 13, 2026
00b8470
disable plot_ariadne_variables for now
lindnemi Feb 13, 2026
f89b7f0
ai: improve syntax to avoid indexing warnings
lindnemi Feb 13, 2026
6bb3d22
define scenario with h2 plants in all of EU
lindnemi Feb 13, 2026
53bf21c
use uba data for 2030
lindnemi Feb 13, 2026
764d0bc
switch to administrative clustering with NUTS regions
lindnemi Feb 13, 2026
eb29789
remove constraint for DE sequestration potential to avoid strange C f…
lindnemi Feb 16, 2026
c5d95f0
Fh-ISE costs for solar-utility and solar-hsat
lindnemi Feb 16, 2026
76af7e2
homogenize decentral heating discount rate assumptions
lindnemi Feb 16, 2026
add63cd
fix naming of solar-hsat in custom_costs; define different discount s…
lindnemi Feb 16, 2026
e4eaf46
add separate variables for home and utility scale batteries
lindnemi Feb 17, 2026
15cf9c4
Heuristically split existing solar capacities 50:50 between rootop an…
lindnemi Feb 19, 2026
9bfe497
Make mixed decentral discount rates the new default
lindnemi Feb 19, 2026
15c9c8e
allow H2 turbines in all of EU by default
lindnemi Feb 19, 2026
a4a63d8
change to weatheryear 2013
lindnemi Feb 20, 2026
419c2cf
edit changelog
lindnemi Feb 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
# Changelog
- Switched to weather year 2013
- in 2030 use UBA data for industry and mobility
- start myopic optimization in 2025
- remove national CO2 sequestration limit for DE, because it was causing strange E-Fuel exports
- enable H2 gas turbines in all countries
- force H2 retrofit (for DE) only in 2045, instead of in 2035
- split existing solar 50:50 between rooftop and utility (previously 0:100)
- increase decentral discount rates to account for mix of residential and commercial sector
- use ISE cost data for solar (DC costs instead of AC)
- Minor fix for cluster weights
- added 2 delay years to the offshore NEP, s.t. capacity in 2030 is ~20GW
- improved script name `modify_industry_demand` -> `modify_industry_production`
- excluded international shipping from DE-specific CO2 emisisons
Expand Down
10 changes: 5 additions & 5 deletions Snakefile
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ rule modify_prenetwork:
transmission_costs=config_provider("costs", "transmission"),
must_run=config_provider("must_run"),
clustering=config_provider("clustering", "temporal", "resolution_sector"),
H2_plants=config_provider("electricity", "H2_plants_DE"),
H2_plants=config_provider("electricity", "H2_plants"),
onshore_nep_force=config_provider("onshore_nep_force"),
offshore_nep_force=config_provider("offshore_nep_force"),
shipping_methanol_efficiency=config_provider(
Expand Down Expand Up @@ -921,10 +921,10 @@ rule plot_ariadne_variables:
rule ariadne_all:
input:
expand(RESULTS + "graphs/costs.svg", run=config_provider("run", "name")),
expand(
RESULTS + "ariadne/capacity_detailed.png",
run=config_provider("run", "name"),
),
# expand(
# RESULTS + "ariadne/capacity_detailed.png",
# run=config_provider("run", "name"),
# ),
expand(
RESULTS
+ "maps/base_s_{clusters}_{opts}_{sector_opts}-h2_network_incl_kernnetz_{planning_horizons}.pdf",
Expand Down
97 changes: 46 additions & 51 deletions config/config.de.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors
# SPDX-FileCopyrightText: : 2017-2026 The PyPSA-Eur Authors
#
# SPDX-License-Identifier: CC0-1.0

# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#run
run:
prefix: 20260114_limit_cross_border_flows
prefix: 20260219_wy2013
name:
# - ExPol
- KN2045_Mix
# - KN2045_Mix_LowDecentralDiscount
# - KN2045_Mix_HighDecentralDiscount
# - KN2045_Mix_H2plantsEU
# - KN2045_Elek
# - KN2045_H2
# - KN2045_NFniedrig
Expand Down Expand Up @@ -38,10 +41,12 @@ pypsa-de:
ageb_for_mobility: true # In 2020 use AGEB data for final energy demand and KBA for vehicles
uba_for_mobility: # Available for 2025–2035; uses MWMS scenario from UBA Projektionsbericht 2025
- 2025
- 2030
uba_for_industry: # Available for 2025–2035; uses MWMS scenario from UBA Projektionsbericht 2025
scale_non_energy: false # Scale non-energy demand directly proportional to energy demand
enable: # Allowed values are "false" or a subset of [2025, 2030, 2035]
- 2025
- 2030
limit_cross_border_flows_ac: # relevant if only one node per country is used
2020: 0.4
2025: 0.4
Expand All @@ -66,7 +71,6 @@ scenario:
sector_opts:
- none
planning_horizons:
- 2020
- 2025
- 2030
- 2035
Expand All @@ -75,8 +79,8 @@ scenario:
- 2050

existing_capacities:
grouping_years_power: [1920, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020]
grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # heat grouping years >= baseyear will be ignored
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, 2020, 2024] # heat grouping years >= baseyear will be ignored
fill_value_gas_chp_lifetime: 40 # if no explicit lifetime is given use 40 years. The number was chosen s.t. the existing capacities in 2020 match with statistics.


Expand All @@ -86,26 +90,26 @@ countries: ['AT', 'BE', 'CH', 'CZ', 'DE', 'DK', 'FR', 'GB', 'LU', 'NL', 'NO', 'P

# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#snapshots
snapshots:
start: "2019-01-01"
end: "2020-01-01"
start: "2013-01-01"
end: "2014-01-01"
inclusive: 'left'

atlite:
default_cutout: europe-2019-sarah3-era5
default_cutout: europe-2013-sarah3-era5
cutouts:
europe-2019-sarah3-era5:
europe-2013-sarah3-era5:
module: [sarah, era5] # in priority order
x: [-12., 42.]
y: [33., 72]
dx: 0.3
dy: 0.3
time: ['2019', '2019']
time: ['2013', '2013']


renewable:
onwind:
capacity_per_sqkm: 1.4
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5
correction_factor: 0.95
resource:
smooth: false #this is false until correction to onshore wind speeds from GWA implemented
Expand All @@ -129,7 +133,7 @@ renewable:
offwind-ac:
capacity_per_sqkm: 6
landfall_length: 30
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5
correction_factor: 0.95
resource:
smooth: true
Expand All @@ -153,7 +157,7 @@ renewable:
offwind-dc:
capacity_per_sqkm: 6
landfall_length: 30
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5
correction_factor: 0.95
resource:
smooth: true
Expand All @@ -177,46 +181,48 @@ renewable:
offwind-float: # disabled at the moment
landfall_length: 30
capacity_per_sqkm: 6
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5
correction_factor: 0.95
solar:
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5
correction_factor: 0.9 # scaling to Abbildung 36 of https://www.ise.fraunhofer.de/de/veroeffentlichungen/studien/aktuelle-fakten-zur-photovoltaik-in-deutschland.html
solar-hsat:
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5
correction_factor: 0.9 # scaling to Abbildung 36 of https://www.ise.fraunhofer.de/de/veroeffentlichungen/studien/aktuelle-fakten-zur-photovoltaik-in-deutschland.html
hydro:
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5

lines:
dynamic_line_rating:
cutout: europe-2019-sarah3-era5
cutout: europe-2013-sarah3-era5

clustering:
# simplify_network:
# to_substations: true
# mode: administrative
# administrative:
# level: 0
# DE: 2
# Code snippet for editing focus_weights
# fw = pd.Series(snakemake.config["clustering"]["focus_weights"])
# fw = fw.div(fw.min()).round()
# fw["ES"] = 1
# print(fw.div(fw.sum()).subtract(5e-5).round(4).to_dict().__repr__().replace(",","\n"))
focus_weights:
# 27 nodes: 8 for Germany, 3 for Italy, 2 each for Denmark, UK and Spain, 1 per each of other 10 "Stromnachbarn"
'DE': 0.2966
'DE': 0.2965
'AT': 0.0370
'BE': 0.0370
'CH': 0.0370
'CZ': 0.0370
'DK': 0.0741
'FR': 0.0370
'FR': 0.0741
'GB': 0.0741
'LU': 0.0370
'NL': 0.0370
'NO': 0.0370
'PL': 0.0370
'SE': 0.0370
'ES': 0.0741
'IT': 0.1111
'IT': 0.0741
# high spatial resolution: change clusters to 49
# 49 nodes: 30 for Germany, 3 for Italy, 2 each for Denmark, UK and Spain, 1 per each of other 10 "Stromnachbarn"
# 'DE': 0.6124
Expand All @@ -225,15 +231,15 @@ clustering:
# 'CH': 0.0204
# 'CZ': 0.0204
# 'DK': 0.0408
# 'FR': 0.0204
# 'FR': 0.0408
# 'GB': 0.0408
# 'LU': 0.0204
# 'NL': 0.0204
# 'NO': 0.0204
# 'PL': 0.0204
# 'SE': 0.0204
# 'ES': 0.0408
# 'IT': 0.0612
# 'IT': 0.0408
temporal:
resolution_sector: 365H

Expand Down Expand Up @@ -465,8 +471,8 @@ solving:
offwind:
DE:
2020: 7.8
2025: 11.3
2030: 24 # very optimistic upper ceiling to "Mittelfristprognose zur deutschlandweiten Stromerzeugung"
2025: 12
2030: 22 # optimistic upper ceiling to "Mittelfristprognose zur deutschlandweiten Stromerzeugung"
2035: 50 # Planned projects until 2035 (offshore_connection_points.csv) -1.3 GW for potential delays
2040: 65 # Planned projects until 2040 -1.5 GW for potential retirments
2045: 70
Expand All @@ -475,21 +481,11 @@ solving:
DE:
2020: 53.7
2025: 119 # Abb. 4_9 https://www.agora-energiewende.de/fileadmin/Projekte/2025/2025-28_DE_JAW25/A-EW_391_Die_Energiewende_in_Deutschland_Stand_der_Dinge_2025_WEB.pdf
2030: 235 # PV Ziel 2030 + 20 GW
2030: 215 # PV Ziel 2030
2035: 400
2040: 800
2045: 1000
2050: 1000
Store:
co2 sequestered:
DE:
2020: 0
2025: 0
2030: 10000
2035: 20000
2040: 50000
2045: 80000
2050: 80000
urban central water tanks:
DE:
2025: 120 # GWh, https://www.hamburg-institut.com/wp-content/uploads/2023/12/Referenzblatt_SysGF-1.pdf
Expand Down Expand Up @@ -522,7 +518,7 @@ solving:
onwind:
DE:
2025: 67 # Abb. 4_9 https://www.agora-energiewende.de/fileadmin/Projekte/2025/2025-28_DE_JAW25/A-EW_391_Die_Energiewende_in_Deutschland_Stand_der_Dinge_2025_WEB.pdf
2030: 99 # Wind-an-Land Law 2028
2030: 105 # Wind-an-Land Law 2028
2035: 115 # Wind-an-Land Law 2030
2040: 157 # target 2035
2045: 160 # target 2040
Expand All @@ -535,10 +531,11 @@ solving:
solar:
DE:
2025: 118 # Abb. 4_9 https://www.agora-energiewende.de/fileadmin/Projekte/2025/2025-28_DE_JAW25/A-EW_391_Die_Energiewende_in_Deutschland_Stand_der_Dinge_2025_WEB.pdf
2030: 200
Link:
H2 Electrolysis:
DE:
2030: 5
2030: 3
# For reference, this are the values specified in the laws
# limits_capacity_min:
# Generator:
Expand Down Expand Up @@ -571,10 +568,10 @@ solving:
electricity_import:
DE:
2020: -20
2025: 0
2030: 0
2035: 40
2040: 80
2025: 25
2030: 50
2035: 75
2040: 100
2045: 125
2050: 125
electrolysis:
Expand Down Expand Up @@ -659,19 +656,17 @@ plotting:
carrier_groups:
electricity: [AC, low_voltage]

# overwrite in config.default.yaml
#powerplants_filter: (DateOut >= 2019 or DateOut != DateOut)
electricity:
renewable_carriers: [solar, solar-hsat, onwind, offwind-ac, offwind-dc, hydro] # removed offwind-float
powerplants_filter: (DateOut >= 2019 or DateOut != DateOut) and not (Country == "DE" and Set == "CHP")
powerplants_filter: (DateOut >= 2024 or DateOut != DateOut) and not (Country == "DE" and Set == "CHP")
custom_powerplants: true
custom_file: resources/german_chp.csv
estimate_renewable_capacities:
year: 2019
H2_plants_DE:
enable: true
year: 2024
H2_plants:
enable: EU # allowed values: false, DE, EU
start: 2030 # should be < force
force: 2035
force: 2045
cost_factor: 0.15 # repurposing cost of OCGT gas to H2 in % investment cost in EUR/MW source: Christidis et al (2023) - H2-Ready-Gaskraftwerke, Table 3 https://reiner-lemoine-institut.de/wp-content/uploads/2023/11/RLI-Studie-H2-ready_DE.pdf
efficiency_loss: 0.05

Expand Down
1 change: 1 addition & 0 deletions config/config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ existing_capacities:
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
solar_rooftop_ratio: 0.5
conventional_carriers:
- lignite
- coal
Expand Down
13 changes: 13 additions & 0 deletions config/scenarios.manual.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,19 @@ KN2045_Mix:
# dient als Referenzszenario in der Familie der Ariadne-Szenarien


KN2045_Mix_LowDecentralDiscount:
costs:
custom_cost_fn: data/pypsa-de/custom_costs_nep_2023_low_decentral_discount.csv

KN2045_Mix_HighDecentralDiscount:
costs:
custom_cost_fn: data/pypsa-de/custom_costs_nep_2023_high_decentral_discount.csv

KN2045_Mix_H2plantsEU:
electricity:
H2_plants:
enable: EU

KN2045_Elek:
# Fokus auf dem Hochlauf von Technologien zur direkten Elektrifizierung der Sektoren
# Strom als präferierter Energieträger in der Endenergie, andere Energieträger ergänzend, wo nötig (Wasserstoff, synthetische Kraftstoffe)
Expand Down
Loading
Loading