From 4c0491341cd1242e0295e1e3ac47e403c934719b Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 31 Jan 2024 12:45:45 +0000 Subject: [PATCH 1/5] Move `build_existing_heating_distribution` rule --- rules/build_sector.smk | 34 ++++++++++++++++++++++++++++++++++ rules/solve_myopic.smk | 34 ---------------------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 0586ec01..a8f419c3 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -730,6 +730,40 @@ rule build_district_heat_share: "../scripts/build_district_heat_share.py" +rule build_existing_heating_distribution: + params: + baseyear=config["scenario"]["planning_horizons"][0], + sector=config["sector"], + existing_capacities=config["existing_capacities"], + input: + existing_heating="data/existing_infrastructure/existing_heating_raw.csv", + clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + clustered_pop_energy_layout=RESOURCES + + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv", + district_heat_share=RESOURCES + + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + output: + existing_heating_distribution=RESOURCES + + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + wildcard_constraints: + planning_horizons=config["scenario"]["planning_horizons"][0], #only applies to baseyear + threads: 1 + resources: + mem_mb=2000, + log: + LOGS + + "build_existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.log", + benchmark: + ( + BENCHMARKS + + "build_existing_heating_distribution/elec_s{simpl}_{clusters}_{planning_horizons}" + ) + conda: + "../envs/environment.yaml" + script: + "../scripts/build_existing_heating_distribution.py" + + rule prepare_sector_network: params: co2_budget=config["co2_budget"], diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 75334073..94e75a5d 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -3,40 +3,6 @@ # SPDX-License-Identifier: MIT -rule build_existing_heating_distribution: - params: - baseyear=config["scenario"]["planning_horizons"][0], - sector=config["sector"], - existing_capacities=config["existing_capacities"], - input: - existing_heating="data/existing_infrastructure/existing_heating_raw.csv", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", - clustered_pop_energy_layout=RESOURCES - + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv", - district_heat_share=RESOURCES - + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", - output: - existing_heating_distribution=RESOURCES - + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv", - wildcard_constraints: - planning_horizons=config["scenario"]["planning_horizons"][0], #only applies to baseyear - threads: 1 - resources: - mem_mb=2000, - log: - LOGS - + "build_existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.log", - benchmark: - ( - BENCHMARKS - + "build_existing_heating_distribution/elec_s{simpl}_{clusters}_{planning_horizons}" - ) - conda: - "../envs/environment.yaml" - script: - "../scripts/build_existing_heating_distribution.py" - - rule add_existing_baseyear: params: baseyear=config["scenario"]["planning_horizons"][0], From 25a24f555225de2cef68dfb832e945fea06ca198 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Thu, 1 Feb 2024 14:18:27 +0000 Subject: [PATCH 2/5] Remove unnecessary `add_brownfield` rule from perfect foresight --- rules/solve_perfect.smk | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 76051976..9e164a16 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -45,38 +45,6 @@ rule add_existing_baseyear: "../scripts/add_existing_baseyear.py" -rule add_brownfield: - params: - H2_retrofit=config["sector"]["H2_retrofit"], - H2_retrofit_capacity_per_CH4=config["sector"]["H2_retrofit_capacity_per_CH4"], - threshold_capacity=config["existing_capacities"]["threshold_capacity"], - input: - network=RESULTS - + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - network_p=solved_previous_horizon, #solved network at previous time step - costs="data/costs_{planning_horizons}.csv", - cop_soil_total=RESOURCES + "cop_soil_total_elec_s{simpl}_{clusters}.nc", - cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", - output: - RESULTS - + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - threads: 4 - resources: - mem_mb=10000, - log: - LOGS - + "add_brownfield_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", - benchmark: - ( - BENCHMARKS - + "add_brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) - conda: - "../envs/environment.yaml" - script: - "../scripts/add_brownfield.py" - - rule prepare_perfect_foresight: input: **{ @@ -192,6 +160,3 @@ rule make_summary_perfect: "../envs/environment.yaml" script: "../scripts/make_summary_perfect.py" - - -ruleorder: add_existing_baseyear > add_brownfield From de384c7cf620c769df2ae91a588ac4e78ea77c3f Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Thu, 1 Feb 2024 14:46:13 +0000 Subject: [PATCH 3/5] Correctly carry over time-varying data between investment periods Previously, time-varying data in each "next" investment period was set to the default values, implying capacity factors of 1 for renewable generators for example. --- scripts/prepare_perfect_foresight.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index f5ae3919..8fd6bc1f 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -199,8 +199,13 @@ def concat_networks(years): pnl[k].loc[pnl_year.index, pnl_year.columns] = pnl_year else: - # this is to avoid adding multiple times assets with - # infinite lifetime as ror + # For components that aren't new, we just extend + # time-varying data from the previous investment + # period. + if i > 0: + pnl[k].loc[(year,)] = pnl[k].loc[(years[i - 1],)].values + + # Now, add time-varying data for new components. cols = pnl_year.columns.difference(pnl[k].columns) pnl[k] = pd.concat([pnl[k], pnl_year[cols]], axis=1) From b67e800da9c442079d20eb08cbf6eb242b9fa476 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Thu, 1 Feb 2024 14:52:16 +0000 Subject: [PATCH 4/5] Simplify concat of static components in `prepare_perfect_forsight` --- scripts/prepare_perfect_foresight.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index 8fd6bc1f..278472f6 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -162,15 +162,17 @@ def concat_networks(years): add_build_year_to_new_assets(network, year) # static ---------------------------------- - # (1) add buses and carriers - for component in network.iterate_components(["Bus", "Carrier"]): - df_year = component.df - # get missing assets - missing = get_missing(df_year, n, component.list_name) - import_components_from_dataframe(n, missing, component.name) - # (2) add generators, links, stores and loads for component in network.iterate_components( - ["Generator", "Link", "Store", "Load", "Line", "StorageUnit"] + [ + "Bus", + "Carrier", + "Generator", + "Link", + "Store", + "Load", + "Line", + "StorageUnit", + ] ): df_year = component.df.copy() missing = get_missing(df_year, n, component.list_name) From 7f77c3690abd8f9f7c6d1251c5b5be5c540d2982 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Fri, 2 Feb 2024 08:54:44 +0100 Subject: [PATCH 5/5] Add release note --- doc/release_notes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 6fa88738..1ffeb310 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -64,6 +64,8 @@ Upcoming Release * The ``highs`` solver was added to the default environment file. +* Various minor bugfixes to the perfect foresight workflow, though perfect foresight must still be considered experimental. + PyPSA-Eur 0.9.0 (5th January 2024)