Skip to content

Commit adf6ea2

Browse files
committed
set up workflow for LT EEG sweeps
1 parent b2c303c commit adf6ea2

File tree

6 files changed

+154
-25
lines changed

6 files changed

+154
-25
lines changed

Snakefile

Lines changed: 117 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,15 +1020,15 @@ rule prepare_st_low_res_network:
10201020
),
10211021
input:
10221022
network=RESULTS
1023-
+ "networks/base_s_{clusters}_{opts}_{sector_opts}_{st_years}.nc",
1023+
+ "networks/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}.nc",
10241024
output:
10251025
st_low_res_prenetwork=RESULTS
1026-
+ "st_low_res_prenetworks/base_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}.nc",
1026+
+ "st_low_res_prenetworks/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}.nc",
10271027
resources:
10281028
mem_mb=16000,
10291029
log:
10301030
RESULTS
1031-
+ "logs/st_low_res_prenetwork_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}.log",
1031+
+ "logs/st_low_res_prenetwork_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}.log",
10321032
script:
10331033
"scripts/pypsa-de/prepare_st_low_res_network.py"
10341034

@@ -1042,21 +1042,21 @@ rule solve_st_low_res_network:
10421042
custom_extra_functionality=input_custom_extra_functionality,
10431043
input:
10441044
st_low_res_prenetwork=RESULTS
1045-
+ "st_low_res_prenetworks/base_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}.nc",
1045+
+ "st_low_res_prenetworks/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}.nc",
10461046
co2_totals_name=resources("co2_totals.csv"),
10471047
energy_totals=resources("energy_totals.csv"),
10481048
output:
10491049
st_low_res_network=RESULTS
1050-
+ "st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}.nc",
1050+
+ "st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}.nc",
10511051
shadow:
10521052
shadow_config
10531053
log:
10541054
solver=RESULTS
1055-
+ "logs/st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}_solver.log",
1055+
+ "logs/st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}_solver.log",
10561056
memory=RESULTS
1057-
+ "logs/st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}_memory.log",
1057+
+ "logs/st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}_memory.log",
10581058
python=RESULTS
1059-
+ "logs/st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}_python.log",
1059+
+ "logs/st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}_python.log",
10601060
threads: solver_threads
10611061
resources:
10621062
mem_mb=config_provider("solving", "mem_mb"),
@@ -1102,9 +1102,11 @@ use rule export_ariadne_variables as export_st_variables with:
11021102
energy_totals=resources("energy_totals.csv"),
11031103
st_low_res_networks=expand(
11041104
RESULTS
1105-
+ "st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{st_years}_eeg_level_{eeg_level}.nc",
1105+
+ "st_low_res_networks/{sensitivity}/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_eeg_level_{eeg_level}.nc",
11061106
**config["scenario"],
1107-
st_years=config_provider("iiasa_database", "regret_run", "st_years"),
1107+
eeg_sweep_year=config_provider(
1108+
"iiasa_database", "regret_run", "eeg_sweep_year"
1109+
),
11081110
allow_missing=True,
11091111
),
11101112
output:
@@ -1128,6 +1130,111 @@ rule st_all:
11281130
),
11291131

11301132

1133+
rule solve_eeg_sweep_lt:
1134+
params:
1135+
solving=config_provider("solving"),
1136+
foresight=config_provider("foresight"),
1137+
co2_sequestration_potential=config_provider(
1138+
"sector", "co2_sequestration_potential", default=200
1139+
),
1140+
custom_extra_functionality=input_custom_extra_functionality,
1141+
energy_year=config_provider("energy", "energy_totals_year"),
1142+
input:
1143+
network=resources(
1144+
"networks/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_final.nc"
1145+
),
1146+
co2_totals_name=resources("co2_totals.csv"),
1147+
energy_totals=resources("energy_totals.csv"),
1148+
output:
1149+
network=RESULTS
1150+
+ "networks/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_EEG_{eeg_level}.nc",
1151+
config=RESULTS
1152+
+ "configs/config.base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_EEG_{eeg_level}.yaml",
1153+
shadow:
1154+
shadow_config
1155+
log:
1156+
solver=RESULTS
1157+
+ "logs/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_EEG_{eeg_level}_solver.log",
1158+
memory=RESULTS
1159+
+ "logs/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_EEG_{eeg_level}_memory.log",
1160+
python=RESULTS
1161+
+ "logs/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_EEG_{eeg_level}_python.log",
1162+
threads: solver_threads
1163+
resources:
1164+
mem_mb=config_provider("solving", "mem_mb"),
1165+
runtime=config_provider("solving", "runtime", default="6h"),
1166+
benchmark:
1167+
(
1168+
RESULTS
1169+
+ "benchmarks/solve_sector_network/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_EEG_{eeg_level}"
1170+
)
1171+
conda:
1172+
"envs/environment.yaml"
1173+
script:
1174+
"scripts/solve_network.py"
1175+
1176+
1177+
use rule export_ariadne_variables as export_eeg_sweep_lt_variables with:
1178+
input:
1179+
template="data/template_ariadne_database.xlsx",
1180+
industry_demands=expand(
1181+
resources(
1182+
"industrial_energy_demand_base_s_{clusters}_{planning_horizons}.csv"
1183+
),
1184+
**config["scenario"],
1185+
allow_missing=True,
1186+
),
1187+
networks=expand(
1188+
RESULTS
1189+
+ "networks/base_s_{clusters}_{opts}_{sector_opts}_{planning_horizons}.nc",
1190+
**config["scenario"],
1191+
allow_missing=True,
1192+
),
1193+
costs=expand(
1194+
resources("costs_{planning_horizons}.csv"),
1195+
**config["scenario"],
1196+
allow_missing=True,
1197+
),
1198+
industrial_production_per_country_tomorrow=expand(
1199+
resources(
1200+
"industrial_production_per_country_tomorrow_{planning_horizons}-modified.csv"
1201+
),
1202+
**config["scenario"],
1203+
allow_missing=True,
1204+
),
1205+
industry_sector_ratios=expand(
1206+
resources("industry_sector_ratios_{planning_horizons}.csv"),
1207+
**config["scenario"],
1208+
allow_missing=True,
1209+
),
1210+
industrial_production=resources("industrial_production_per_country.csv"),
1211+
energy_totals=resources("energy_totals.csv"),
1212+
eeg_sweep_networks=expand(
1213+
RESULTS
1214+
+ "networks/base_s_{clusters}_{opts}_{sector_opts}_{eeg_sweep_year}_EEG_{eeg_level}.nc",
1215+
**config["scenario"],
1216+
eeg_sweep_year=config_provider(
1217+
"iiasa_database", "regret_run", "eeg_sweep_year"
1218+
),
1219+
allow_missing=True,
1220+
),
1221+
output:
1222+
exported_variables=RESULTS + "ariadne/exported_variables_EEG_{eeg_level}.xlsx",
1223+
exported_variables_full=RESULTS
1224+
+ "ariadne/exported_variables_full_EEG_{eeg_level}.xlsx",
1225+
log:
1226+
RESULTS + "logs/export_ariadne_variables_EEG_{eeg_level}.log",
1227+
1228+
1229+
rule eeg_sweep:
1230+
input:
1231+
expand(
1232+
RESULTS + "ariadne/exported_variables_full_EEG_{eeg_level}.xlsx",
1233+
eeg_level=config_provider("iiasa_database", "regret_run", "EEG_levels"),
1234+
run=config_provider("run", "name"),
1235+
),
1236+
1237+
11311238
rule prepare_regret_network:
11321239
params:
11331240
solving=config_provider("solving"),

config/config.de.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ iiasa_database:
5656
#- no_flex
5757
#- gas_price_60
5858
#- gas_price_80
59-
st_years:
59+
eeg_sweep_year:
6060
- 2030
6161
EEG_levels:
6262
- 1.00
6363
# - 0.95
6464
# - 0.90
65-
- 0.85
65+
# - 0.85
6666
# - 0.80
6767
# - 0.75
6868
- 0.70
@@ -776,7 +776,7 @@ onshore_nep_force:
776776
offshore_nep_force:
777777
cutin_year: 2025
778778
cutout_year: 2030
779-
delay_years: 0
779+
delay_years: 2
780780

781781
scale_capacity:
782782
2020:

scripts/pypsa-de/additional_functionality.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -863,9 +863,27 @@ def additional_functionality(n, snapshots, snakemake):
863863
try:
864864
investment_year = int(snakemake.wildcards.planning_horizons[-4:])
865865
except AttributeError:
866-
investment_year = int(snakemake.wildcards.st_years[-4:])
866+
investment_year = int(snakemake.wildcards.eeg_sweep_year)
867867
constraints = snakemake.params.solving["constraints"]
868-
868+
if snakemake.wildcards.get("eeg_sweep_year"):
869+
eeg_sweep_year = int(snakemake.wildcards.eeg_sweep_year)
870+
assert eeg_sweep_year == 2030, "EEG sweep implemented only for 2030 "
871+
lvl = float(snakemake.wildcards.eeg_level)
872+
constraints["limits_capacity_min"]["Generator"]["onwind"]["DE"][
873+
eeg_sweep_year
874+
] = constraints["limits_capacity_max"]["Generator"]["onwind"]["DE"][
875+
eeg_sweep_year
876+
] = 115 * lvl
877+
constraints["limits_capacity_min"]["Generator"]["offwind"]["DE"][
878+
eeg_sweep_year
879+
] = constraints["limits_capacity_max"]["Generator"]["offwind"]["DE"][
880+
eeg_sweep_year
881+
] = 30 * lvl
882+
constraints["limits_capacity_min"]["Generator"]["solar"]["DE"][
883+
eeg_sweep_year
884+
] = constraints["limits_capacity_max"]["Generator"]["solar"]["DE"][
885+
eeg_sweep_year
886+
] = 215 * lvl
869887
if not snakemake.params.get("regret_run"):
870888
add_capacity_limits(
871889
n, investment_year, constraints["limits_capacity_min"], snakemake, "minimum"

scripts/pypsa-de/export_ariadne_variables.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5542,10 +5542,12 @@ def get_data(
55425542

55435543
# Load data
55445544
_networks = [pypsa.Network(fn) for fn in snakemake.input.networks]
5545-
if snakemake.input.st_low_res_networks:
5546-
_networks_st = [pypsa.Network(fn) for fn in snakemake.input.st_low_res_networks]
5547-
N_st = len(_networks_st)
5548-
_networks[-N_st:] = _networks_st
5545+
if snakemake.input.eeg_sweep_networks:
5546+
_sweep_networks = [
5547+
pypsa.Network(fn) for fn in snakemake.input.eeg_sweep_networks
5548+
]
5549+
N_st = len(_sweep_networks)
5550+
_networks[-N_st:] = _sweep_networks
55495551

55505552
nhours = _networks[0].snapshot_weightings.generators.sum()
55515553
nyears = nhours / 8760

scripts/pypsa-de/prepare_st_low_res_network.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def fix_capacities(n_lt, no_flex=False):
126126
clusters=27,
127127
opts="",
128128
sector_opts="none",
129-
st_years="2030",
129+
eeg_sweep_year="2030",
130130
run="HighDemand",
131131
eeg_level=0.7,
132132
)
@@ -138,7 +138,7 @@ def fix_capacities(n_lt, no_flex=False):
138138
update_config_from_wildcards(snakemake.config, snakemake.wildcards)
139139

140140
n_lt = pypsa.Network(snakemake.input.network)
141-
st_years = snakemake.wildcards.get("st_years", None)
141+
eeg_sweep_year = snakemake.wildcards.get("eeg_sweep_year", None)
142142
logging_frequency = snakemake.config.get("solving", {}).get(
143143
"mem_logging_frequency", 30
144144
)
@@ -155,7 +155,7 @@ def fix_capacities(n_lt, no_flex=False):
155155
n = fix_capacities(n_lt, snakemake.params.get("no_flex_lt_run", False))
156156

157157
scale_new_res_to_target(
158-
n, eeg_targets, int(st_years), ratio=float(snakemake.wildcards.eeg_level)
158+
n, eeg_targets, int(eeg_sweep_year), ratio=float(snakemake.wildcards.eeg_level)
159159
)
160160

161161
if h2_vent:
@@ -207,7 +207,7 @@ def fix_capacities(n_lt, no_flex=False):
207207
n,
208208
solve_opts=snakemake.params.solving["options"],
209209
foresight=snakemake.params.foresight,
210-
planning_horizons=st_years,
210+
planning_horizons=eeg_sweep_year,
211211
co2_sequestration_potential=snakemake.params["co2_sequestration_potential"],
212212
limit_max_growth=snakemake.params.get("sector", {}).get("limit_max_growth"),
213213
regret_run=True,
@@ -223,7 +223,7 @@ def fix_capacities(n_lt, no_flex=False):
223223
p_max_pu=0,
224224
p_nom_extendable=True,
225225
carrier="co2",
226-
marginal_cost=-co2_prices[int(st_years)],
226+
marginal_cost=-co2_prices[int(eeg_sweep_year)],
227227
)
228228
n.global_constraints.drop("CO2Limit", inplace=True)
229229
n.global_constraints.drop("co2_limit-DE", inplace=True)

scripts/solve_network.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1457,7 +1457,9 @@ def solve_network(
14571457
np.random.seed(solve_opts.get("seed", 123))
14581458

14591459
n = pypsa.Network(snakemake.input.network)
1460-
planning_horizons = snakemake.wildcards.get("planning_horizons", None)
1460+
planning_horizons = snakemake.wildcards.get(
1461+
"planning_horizons", snakemake.wildcards.get("eeg_sweep_year", None)
1462+
)
14611463

14621464
prepare_network(
14631465
n,

0 commit comments

Comments
 (0)