From 527c77824c8eba0695327fb60b9cff23df0d3744 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 5 Jan 2023 16:41:49 +0100 Subject: [PATCH 001/497] allow carbon capture in biogas upgrading (closes #49) --- scripts/prepare_sector_network.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b6c052be..540b3f23 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1874,10 +1874,12 @@ def add_biomass(n, costs): bus0=spatial.gas.biogas, bus1=spatial.gas.nodes, bus2="co2 atmosphere", + bus3="co2 stored", carrier="biogas to gas", capital_cost=costs.loc["biogas upgrading", "fixed"], marginal_cost=costs.loc["biogas upgrading", "VOM"], efficiency2=-costs.at['gas', 'CO2 intensity'], + efficiency3=costs.at["biogas", "CO2 stored"], p_nom_extendable=True ) From 54346b071e07fd7e4f9eed00698a5d3bfc62a678 Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Sat, 22 Apr 2023 20:33:38 +0200 Subject: [PATCH 002/497] Address pandas deprecation of date_parser for pandas.read_csv --- doc/release_notes.rst | 2 ++ envs/environment.yaml | 2 +- scripts/build_electricity_demand.py | 5 +---- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index f859646b..7f4dac1c 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -17,6 +17,8 @@ Upcoming Release * Renamed script file from PyPSA-EUR ``build_load_data`` to ``build_electricity_demand``. +* Adressed deprecation warnings for ``pandas=2.0``. ``pandas=2.0`` is now minimum requirement. + PyPSA-Eur 0.8.0 (18th March 2023) ================================= diff --git a/envs/environment.yaml b/envs/environment.yaml index 0a9891a5..baa84f69 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -26,7 +26,7 @@ dependencies: - lxml - powerplantmatching>=0.5.5 - numpy<1.24 -- pandas>=1.4 +- pandas>=2.0 - geopandas>=0.11.0 - xarray - rioxarray diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index b86b4a5f..790a958f 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -80,11 +80,8 @@ def load_timeseries(fn, years, countries, powerstatistics=True): def rename(s): return s[: -len(pattern)] - def date_parser(x): - return dateutil.parser.parse(x, ignoretz=True) - return ( - pd.read_csv(fn, index_col=0, parse_dates=[0], date_parser=date_parser) + pd.read_csv(fn, index_col=0, parse_dates=[0], date_format="%Y-%m-%dT%H:%M:%SZ") .filter(like=pattern) .rename(columns=rename) .dropna(how="all", axis=0) From f4ff3dffc2567dd6cef17f4459bb9a5ef3818d64 Mon Sep 17 00:00:00 2001 From: Fabian Hofmann Date: Mon, 24 Apr 2023 13:09:04 +0200 Subject: [PATCH 003/497] Update doc/release_notes.rst --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 7f4dac1c..120e8fbd 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -17,7 +17,7 @@ Upcoming Release * Renamed script file from PyPSA-EUR ``build_load_data`` to ``build_electricity_demand``. -* Adressed deprecation warnings for ``pandas=2.0``. ``pandas=2.0`` is now minimum requirement. +* Addressed deprecation warnings for ``pandas=2.0``. ``pandas=2.0`` is now minimum requirement. PyPSA-Eur 0.8.0 (18th March 2023) ================================= From e7836246ceb6e5ded89dfcf1404bc5466786b9be Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 26 Apr 2023 12:02:59 +0200 Subject: [PATCH 004/497] scenario management: draft scenario yaml creator --- config/create_scenarios.py | 31 +++++++++++++++++++++++++++++++ config/scenarios.yaml | 0 2 files changed, 31 insertions(+) create mode 100644 config/create_scenarios.py create mode 100644 config/scenarios.yaml diff --git a/config/create_scenarios.py b/config/create_scenarios.py new file mode 100644 index 00000000..9a5f9a98 --- /dev/null +++ b/config/create_scenarios.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +import itertools + +# Insert your config values that should be altered in the template. +template = """ +scenario{scenario_number}: + sector: + carbon_: {config_value} + + config_section2: + config_key2: {config_value2} +""" + +# Define all possible combinations of config values. +# This must define all config values that are used in the template. +config_values = dict(config_values=["true", "false"], config_values2=[1, 2, 3, 4, 5]) + +combinations = [ + dict(zip(config_values.keys(), values)) + for values in itertools.product(*config_values.values()) +] + +# write the scenarios to a file +filename = "scenarios.yaml" +with open(filename, "w") as f: + for i, config in enumerate(combinations): + f.write(template.format(scenario_number=i, **config)) diff --git a/config/scenarios.yaml b/config/scenarios.yaml new file mode 100644 index 00000000..e69de29b From e28ae59375e9561304905bec34460f8aa87a4568 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 15:02:41 +0200 Subject: [PATCH 005/497] introduce scenario-management --- .github/workflows/ci.yaml | 1 + .gitignore | 17 +-- Snakefile | 19 ++- config/config.default.yaml | 2 + config/create_scenarios.py | 31 ----- config/scenarios.yaml | 12 ++ config/test/config.scenarios.electricity.yaml | 89 ++++++++++++++ config/test/scenarios.electricity.yaml | 14 +++ doc/configtables/run.csv | 3 +- doc/configtables/toplevel.csv | 1 + rules/build_electricity.smk | 110 +++++++++--------- rules/build_sector.smk | 78 +++++++------ rules/collect.smk | 29 +++-- rules/common.smk | 51 ++++++++ rules/postprocess.smk | 28 ++--- rules/retrieve.smk | 16 +-- scripts/_helpers.py | 8 ++ scripts/add_electricity.py | 3 +- scripts/add_extra_components.py | 3 +- scripts/base_network.py | 3 +- scripts/build_bus_regions.py | 3 +- scripts/build_cross_border_flows.py | 3 +- scripts/build_cutout.py | 3 +- scripts/build_electricity_demand.py | 3 +- scripts/build_electricity_prices.py | 3 +- scripts/build_electricity_production.py | 3 +- scripts/build_hydro_profile.py | 3 +- scripts/build_line_rating.py | 3 +- scripts/build_monthly_prices.py | 3 +- scripts/build_natura_raster.py | 3 +- scripts/build_powerplants.py | 3 +- scripts/build_renewable_profiles.py | 3 +- scripts/build_shapes.py | 3 +- scripts/build_ship_raster.py | 20 ++-- scripts/cluster_network.py | 3 +- scripts/plot_statistics.py | 3 +- scripts/plot_validation_cross_border_flows.py | 3 +- scripts/plot_validation_electricity_prices.py | 3 +- .../plot_validation_electricity_production.py | 3 +- scripts/prepare_links_p_nom.py | 3 +- scripts/prepare_network.py | 3 +- scripts/retrieve_databundle.py | 2 +- scripts/retrieve_monthly_fuel_prices.py | 3 +- scripts/retrieve_sector_databundle.py | 3 +- scripts/simplify_network.py | 3 +- scripts/solve_network.py | 7 +- scripts/solve_operations_network.py | 7 +- 47 files changed, 419 insertions(+), 204 deletions(-) delete mode 100644 config/create_scenarios.py create mode 100644 config/test/config.scenarios.electricity.yaml create mode 100644 config/test/scenarios.electricity.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c2be3909..ff481b46 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,6 +83,7 @@ jobs: snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime + snakemake -call all --configfile config/test/config.electricity.scenario.yaml - name: Upload artifacts uses: actions/upload-artifact@v3 diff --git a/.gitignore b/.gitignore index 0adf0ae6..67cab0c9 100644 --- a/.gitignore +++ b/.gitignore @@ -19,10 +19,15 @@ gurobi.log /notebooks /data /cutouts - +/tmp doc/_build +/scripts/old +/scripts/create_scenarios.py + config.yaml +config/scenario.yaml + dconf /data/links_p_nom.csv @@ -51,25 +56,15 @@ publications.jrc.ec.europa.eu/ *.nc *~ -/scripts/old *.pyc -/cutouts -/tmp -/pypsa *.xlsx -config.yaml - -doc/_build - *.xls *.geojson *.ipynb -data/costs_* - merger-todos.md diff --git a/Snakefile b/Snakefile index 0e783beb..e495e7d3 100644 --- a/Snakefile +++ b/Snakefile @@ -4,14 +4,13 @@ from os.path import normpath, exists from shutil import copyfile, move, rmtree - +from pathlib import Path +import yaml from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider - -HTTP = HTTPRemoteProvider() - from snakemake.utils import min_version min_version("7.7") +HTTP = HTTPRemoteProvider() if not exists("config/config.yaml"): @@ -24,8 +23,16 @@ configfile: "config/config.yaml" COSTS = f"data/costs_{config['costs']['year']}.csv" ATLITE_NPROCESSES = config["atlite"].get("nprocesses", 4) -run = config.get("run", {}) -RDIR = run["name"] + "/" if run.get("name") else "" +run = config["run"] +if run.get("scenarios", False): + if run["shared_resources"]: + raise ValueError("Cannot use shared resources with scenarios") + scenarios = yaml.safe_load(Path(config["scenariofile"]).read_text()) + RDIR = "{run}/" +elif run["name"]: + RDIR = run["name"] + "/" +else: + RDIR = "" CDIR = RDIR if not run.get("shared_cutouts") else "" LOGS = "logs/" + RDIR diff --git a/config/config.default.yaml b/config/config.default.yaml index b162b75d..5357db8d 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -5,6 +5,7 @@ # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#top-level-configuration version: 0.8.1 tutorial: false +scenariofile: config/scenarios.yaml logging: level: INFO @@ -21,6 +22,7 @@ remote: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#run run: name: "" + scenarios: false disable_progressbar: false shared_resources: false shared_cutouts: true diff --git a/config/create_scenarios.py b/config/create_scenarios.py deleted file mode 100644 index 9a5f9a98..00000000 --- a/config/create_scenarios.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: MIT - -import itertools - -# Insert your config values that should be altered in the template. -template = """ -scenario{scenario_number}: - sector: - carbon_: {config_value} - - config_section2: - config_key2: {config_value2} -""" - -# Define all possible combinations of config values. -# This must define all config values that are used in the template. -config_values = dict(config_values=["true", "false"], config_values2=[1, 2, 3, 4, 5]) - -combinations = [ - dict(zip(config_values.keys(), values)) - for values in itertools.product(*config_values.values()) -] - -# write the scenarios to a file -filename = "scenarios.yaml" -with open(filename, "w") as f: - for i, config in enumerate(combinations): - f.write(template.format(scenario_number=i, **config)) diff --git a/config/scenarios.yaml b/config/scenarios.yaml index e69de29b..37d32243 100644 --- a/config/scenarios.yaml +++ b/config/scenarios.yaml @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +# This file is used to define the scenarios that are run by snakemake. Each entry on the first level is a scenario. Each scenario can contain configuration overrides with respect to the config/config.yaml settings. +# +# Example +# +# custom-scenario: # name of the scenario +# electricity: +# renewable_carriers: [wind, solar] # override the list of renewable carriers diff --git a/config/test/config.scenarios.electricity.yaml b/config/test/config.scenarios.electricity.yaml new file mode 100644 index 00000000..0e4ced04 --- /dev/null +++ b/config/test/config.scenarios.electricity.yaml @@ -0,0 +1,89 @@ +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +tutorial: true +scenariofile: "config/test/scenarios.electricity.yaml" + +run: + name: + - test-elec-no-offshore-wind + - test-elec-no-onshore-wind + scenarios: true + disable_progressbar: true + shared_resources: false # cannot be true if scenarios is true + shared_cutouts: true + +scenario: + clusters: + - 5 + opts: + - Co2L-24H + +countries: ['BE'] + +snapshots: + start: "2013-03-01" + end: "2013-03-08" + +electricity: + co2limit: 100.e+6 + + extendable_carriers: + Generator: [OCGT] + StorageUnit: [battery] + Store: [H2] + Link: [H2 pipeline] + + renewable_carriers: [solar, onwind, offwind-ac, offwind-dc] + + +atlite: + default_cutout: be-03-2013-era5 + cutouts: + be-03-2013-era5: + module: era5 + x: [4., 15.] + y: [46., 56.] + time: ["2013-03-01", "2013-03-08"] + +renewable: + onwind: + cutout: be-03-2013-era5 + offwind-ac: + cutout: be-03-2013-era5 + max_depth: false + offwind-dc: + cutout: be-03-2013-era5 + max_depth: false + solar: + cutout: be-03-2013-era5 + + +clustering: + exclude_carriers: ["OCGT", "offwind-ac", "coal"] + +lines: + dynamic_line_rating: + activate: true + cutout: be-03-2013-era5 + max_line_rating: 1.3 + + +solving: + solver: + name: glpk + options: "glpk-default" + + +plotting: + map: + boundaries: + eu_node_location: + x: -5.5 + y: 46. + costs_max: 1000 + costs_threshold: 0.0000001 + energy_max: + energy_min: + energy_threshold: 0.000001 diff --git a/config/test/scenarios.electricity.yaml b/config/test/scenarios.electricity.yaml new file mode 100644 index 00000000..e9893479 --- /dev/null +++ b/config/test/scenarios.electricity.yaml @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +test-elec-no-offshore-wind: + electricity: + renewable_carriers: [solar, onwind] + + +test-elec-no-onshore-wind: + electricity: + extendable_carriers: + Generator: [OCGT] + renewable_carriers: [solar, offwind-ac, offwind-dc] diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index 90cf65ad..2d5cf5d9 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -1,5 +1,6 @@ ,Unit,Values,Description -name,--,"any string","Specify a name for your run. Results will be stored under this name." +name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenarios`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenariofile``." +scenarios,--,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``scenariofile``." disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." shared_resources,bool,"{true, false}","Switch to select whether resources should be shared across runs." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." diff --git a/doc/configtables/toplevel.csv b/doc/configtables/toplevel.csv index 67954389..8cbb3e56 100644 --- a/doc/configtables/toplevel.csv +++ b/doc/configtables/toplevel.csv @@ -1,6 +1,7 @@ ,Unit,Values,Description version,--,0.x.x,Version of PyPSA-Eur. Descriptive only. tutorial,bool,"{true, false}",Switch to retrieve the tutorial data set instead of the full data set. +scenariofile,str,,Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``create_scenarios.py`` script in ``scripts``. logging,,, -- level,--,"Any of {'INFO', 'WARNING', 'ERROR'}","Restrict console outputs to all infos, warning or errors only" -- format,--,,Custom format for log messages. See `LogRecord `_ attributes. diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 383951bd..4d59c058 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -20,9 +20,9 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: - snapshots=config["snapshots"], - countries=config["countries"], - load=config["load"], + snapshots=config_provider("snapshots"), + countries=config_provider("countries"), + load=config_provider("load"), input: ancient("data/load_raw.csv"), output: @@ -39,9 +39,9 @@ rule build_electricity_demand: rule build_powerplants: params: - powerplants_filter=config["electricity"]["powerplants_filter"], - custom_powerplants=config["electricity"]["custom_powerplants"], - countries=config["countries"], + powerplants_filter=config_provider("electricity", "powerplants_filter"), + custom_powerplants=config_provider("electricity", "custom_powerplants"), + countries=config_provider("countries"), input: base_network=RESOURCES + "networks/base.nc", custom_powerplants="data/custom_powerplants.csv", @@ -60,11 +60,11 @@ rule build_powerplants: rule base_network: params: - countries=config["countries"], - snapshots=config["snapshots"], - lines=config["lines"], - links=config["links"], - transformers=config["transformers"], + countries=config_provider("countries"), + snapshots=config_provider("snapshots"), + lines=config_provider("lines"), + links=config_provider("links"), + transformers=config_provider("transformers"), input: eg_buses="data/entsoegridkit/buses.csv", eg_lines="data/entsoegridkit/lines.csv", @@ -94,7 +94,7 @@ rule base_network: rule build_shapes: params: - countries=config["countries"], + countries=config_provider("countries"), input: naturalearth=ancient("data/bundle/naturalearth/ne_10m_admin_0_countries.shp"), eez=ancient("data/bundle/eez/World_EEZ_v8_2014.shp"), @@ -121,7 +121,7 @@ rule build_shapes: rule build_bus_regions: params: - countries=config["countries"], + countries=config_provider("countries"), input: country_shapes=RESOURCES + "country_shapes.geojson", offshore_shapes=RESOURCES + "offshore_shapes.geojson", @@ -144,8 +144,8 @@ if config["enable"].get("build_cutout", False): rule build_cutout: params: - snapshots=config["snapshots"], - cutouts=config["atlite"]["cutouts"], + snapshots=config_provider("snapshots"), + cutouts=config_provider("atlite", "cutouts"), input: regions_onshore=RESOURCES + "regions_onshore.geojson", regions_offshore=RESOURCES + "regions_offshore.geojson", @@ -208,7 +208,7 @@ rule build_ship_raster: rule build_renewable_profiles: params: - renewable=config["renewable"], + renewable=config_provider("renewable"), input: base_network=RESOURCES + "networks/base.nc", corine=ancient("data/bundle/corine/g250_clc06_V18_5.tif"), @@ -277,8 +277,8 @@ rule build_monthly_prices: rule build_hydro_profile: params: - hydro=config["renewable"]["hydro"], - countries=config["countries"], + hydro=config_provider("renewable", "hydro"), + countries=config_provider("countries"), input: country_shapes=RESOURCES + "country_shapes.geojson", eia_hydro_generation="data/eia_hydro_annual_generation.csv", @@ -321,13 +321,13 @@ if config["lines"]["dynamic_line_rating"]["activate"]: rule add_electricity: params: - length_factor=config["lines"]["length_factor"], - scaling_factor=config["load"]["scaling_factor"], - countries=config["countries"], - renewable=config["renewable"], - electricity=config["electricity"], - conventional=config["conventional"], - costs=config["costs"], + length_factor=config_provider("lines", "length_factor"), + scaling_factor=config_provider("load", "scaling_factor"), + countries=config_provider("countries"), + renewable=config_provider("renewable"), + electricity=config_provider("electricity"), + conventional=config_provider("conventional"), + costs=config_provider("costs"), input: **{ f"profile_{tech}": RESOURCES + f"profile_{tech}.nc" @@ -370,14 +370,16 @@ rule add_electricity: rule simplify_network: params: - simplify_network=config["clustering"]["simplify_network"], - aggregation_strategies=config["clustering"].get("aggregation_strategies", {}), - focus_weights=config.get("focus_weights", None), - renewable_carriers=config["electricity"]["renewable_carriers"], - max_hours=config["electricity"]["max_hours"], - length_factor=config["lines"]["length_factor"], - p_max_pu=config["links"].get("p_max_pu", 1.0), - costs=config["costs"], + simplify_network=config_provider("clustering", "simplify_network"), + aggregation_strategies=config_provider( + "clustering", "aggregation_strategies", default={} + ), + focus_weights=config_provider("focus_weights", default=None), + renewable_carriers=config_provider("electricity", "renewable_carriers"), + max_hours=config_provider("electricity", "max_hours"), + length_factor=config_provider("lines", "length_factor"), + p_max_pu=config_provider("links", "p_max_pu", default=1.0), + costs=config_provider("costs"), input: network=RESOURCES + "networks/elec.nc", tech_costs=COSTS, @@ -404,15 +406,19 @@ rule simplify_network: rule cluster_network: params: - cluster_network=config["clustering"]["cluster_network"], - aggregation_strategies=config["clustering"].get("aggregation_strategies", {}), - custom_busmap=config["enable"].get("custom_busmap", False), - focus_weights=config.get("focus_weights", None), - renewable_carriers=config["electricity"]["renewable_carriers"], - conventional_carriers=config["electricity"].get("conventional_carriers", []), - max_hours=config["electricity"]["max_hours"], - length_factor=config["lines"]["length_factor"], - costs=config["costs"], + cluster_network=config_provider("clustering", "cluster_network"), + aggregation_strategies=config_provider( + "clustering", "aggregation_strategies", default={} + ), + custom_busmap=config_provider("enable", "custom_busmap", default=False), + focus_weights=config_provider("focus_weights", default=None), + renewable_carriers=config_provider("electricity", "renewable_carriers"), + conventional_carriers=config_provider( + "electricity", "conventional_carriers", default=[] + ), + max_hours=config_provider("electricity", "max_hours"), + length_factor=config_provider("lines", "length_factor"), + costs=config_provider("costs"), input: network=RESOURCES + "networks/elec_s{simpl}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}.geojson", @@ -445,9 +451,9 @@ rule cluster_network: rule add_extra_components: params: - extendable_carriers=config["electricity"]["extendable_carriers"], - max_hours=config["electricity"]["max_hours"], - costs=config["costs"], + extendable_carriers=config_provider("electricity", "extendable_carriers"), + max_hours=config_provider("electricity", "max_hours"), + costs=config_provider("costs"), input: network=RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", tech_costs=COSTS, @@ -468,13 +474,13 @@ rule add_extra_components: rule prepare_network: params: - links=config["links"], - lines=config["lines"], - co2base=config["electricity"]["co2base"], - co2limit=config["electricity"]["co2limit"], - gaslimit=config["electricity"].get("gaslimit"), - max_hours=config["electricity"]["max_hours"], - costs=config["costs"], + links=config_provider("links"), + lines=config_provider("lines"), + co2base=config_provider("electricity", "co2base"), + co2limit=config_provider("electricity", "co2limit"), + gaslimit=config_provider("electricity", "gaslimit"), + max_hours=config_provider("electricity", "max_hours"), + costs=config_provider("costs"), input: RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", tech_costs=COSTS, diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 356abdc5..cc80ab64 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -141,7 +141,7 @@ if not (config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]): rule build_heat_demands: params: - snapshots=config["snapshots"], + snapshots=config_provider("snapshots"), input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", @@ -163,7 +163,7 @@ rule build_heat_demands: rule build_temperature_profiles: params: - snapshots=config["snapshots"], + snapshots=config_provider("snapshots"), input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", @@ -186,7 +186,7 @@ rule build_temperature_profiles: rule build_cop_profiles: params: - heat_pump_sink_T=config["sector"]["heat_pump_sink_T"], + heat_pump_sink_T=config_provider("sector", "heat_pump_sink_T"), input: temp_soil_total=RESOURCES + "temp_soil_total_elec_s{simpl}_{clusters}.nc", temp_soil_rural=RESOURCES + "temp_soil_rural_elec_s{simpl}_{clusters}.nc", @@ -215,8 +215,8 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: - snapshots=config["snapshots"], - solar_thermal=config["solar_thermal"], + snapshots=config_provider("snapshots"), + solar_thermal=config_provider("solar_thermal"), input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", @@ -238,8 +238,8 @@ rule build_solar_thermal_profiles: rule build_energy_totals: params: - countries=config["countries"], - energy=config["energy"], + countries=config_provider("countries"), + energy=config_provider("energy"), input: nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", co2="data/eea/UNFCCC_v23.csv", @@ -266,7 +266,7 @@ rule build_energy_totals: rule build_biomass_potentials: params: - biomass=config["biomass"], + biomass=config_provider("biomass"), input: enspreso_biomass=HTTP.remote( "https://cidportal.jrc.ec.europa.eu/ftp/jrc-opendata/ENSPRESO/ENSPRESO_BIOMASS.xlsx", @@ -329,9 +329,9 @@ if config["sector"]["regional_co2_sequestration_potential"]["enable"]: rule build_sequestration_potentials: params: - sequestration_potential=config["sector"][ - "regional_co2_sequestration_potential" - ], + sequestration_potential=config_provider( + "sector", "regional_co2_sequestration_potential" + ), input: sequestration_potential=HTTP.remote( "https://raw.githubusercontent.com/ericzhou571/Co2Storage/main/resources/complete_map_2020_unit_Mt.geojson", @@ -386,7 +386,7 @@ rule build_salt_cavern_potentials: rule build_ammonia_production: params: - countries=config["countries"], + countries=config_provider("countries"), input: usgs="data/myb1-2017-nitro.xls", output: @@ -406,8 +406,8 @@ rule build_ammonia_production: rule build_industry_sector_ratios: params: - industry=config["industry"], - ammonia=config["sector"].get("ammonia", False), + industry=config_provider("industry"), + ammonia=config_provider("sector", "ammonia", default=False), input: ammonia_production=RESOURCES + "ammonia_production.csv", idees="data/jrc-idees-2015", @@ -428,8 +428,8 @@ rule build_industry_sector_ratios: rule build_industrial_production_per_country: params: - industry=config["industry"], - countries=config["countries"], + industry=config_provider("industry"), + countries=config_provider("countries"), input: ammonia_production=RESOURCES + "ammonia_production.csv", jrc="data/jrc-idees-2015", @@ -452,7 +452,7 @@ rule build_industrial_production_per_country: rule build_industrial_production_per_country_tomorrow: params: - industry=config["industry"], + industry=config_provider("industry"), input: industrial_production_per_country=RESOURCES + "industrial_production_per_country.csv", @@ -478,8 +478,10 @@ rule build_industrial_production_per_country_tomorrow: rule build_industrial_distribution_key: params: - hotmaps_locate_missing=config["industry"].get("hotmaps_locate_missing", False), - countries=config["countries"], + hotmaps_locate_missing=config_provider( + "industry", "hotmaps_locate_missing", default=False + ), + countries=config_provider("countries"), input: regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", @@ -555,8 +557,8 @@ rule build_industrial_energy_demand_per_node: rule build_industrial_energy_demand_per_country_today: params: - countries=config["countries"], - industry=config["industry"], + countries=config_provider("countries"), + industry=config_provider("industry"), input: jrc="data/jrc-idees-2015", ammonia_production=RESOURCES + "ammonia_production.csv", @@ -604,8 +606,8 @@ if config["sector"]["retrofitting"]["retro_endogen"]: rule build_retro_cost: params: - retrofitting=config["sector"]["retrofitting"], - countries=config["countries"], + retrofitting=config_provider("sector", "retrofitting"), + countries=config_provider("countries"), input: building_stock="data/retro/data_building_stock.csv", data_tabula="data/retro/tabula-calculator-calcsetbuilding.csv", @@ -677,8 +679,8 @@ rule build_shipping_demand: rule build_transport_demand: params: - snapshots=config["snapshots"], - sector=config["sector"], + snapshots=config_provider("snapshots"), + sector=config_provider("sector"), input: clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", pop_weighted_energy_totals=RESOURCES @@ -705,18 +707,20 @@ rule build_transport_demand: rule prepare_sector_network: params: - co2_budget=config["co2_budget"], - conventional_carriers=config["existing_capacities"]["conventional_carriers"], - foresight=config["foresight"], - costs=config["costs"], - sector=config["sector"], - industry=config["industry"], - pypsa_eur=config["pypsa_eur"], - length_factor=config["lines"]["length_factor"], - planning_horizons=config["scenario"]["planning_horizons"], - countries=config["countries"], - emissions_scope=config["energy"]["emissions"], - eurostat_report_year=config["energy"]["eurostat_report_year"], + co2_budget=config_provider("co2_budget"), + conventional_carriers=config_provider( + "existing_capacities", "conventional_carriers" + ), + foresight=config_provider("foresight"), + costs=config_provider("costs"), + sector=config_provider("sector"), + industry=config_provider("industry"), + pypsa_eur=config_provider("pypsa_eur"), + length_factor=config_provider("lines", "length_factor"), + planning_horizons=config_provider("scenario", "planning_horizons"), + countries=config_provider("countries"), + emissions_scope=config_provider("energy", "emissions"), + eurostat_report_year=config_provider("energy", "eurostat_report_year"), RDIR=RDIR, input: **build_retro_cost_output, diff --git a/rules/collect.smk b/rules/collect.smk index 74f26ccb..a29aa715 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -22,13 +22,19 @@ rule all: rule cluster_networks: input: - expand(RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", **config["scenario"]), + expand( + RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", + **config["scenario"], + run=config["run"]["name"] + ), rule extra_components_networks: input: expand( - RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", **config["scenario"] + RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", + **config["scenario"], + run=config["run"]["name"] ), @@ -36,7 +42,8 @@ rule prepare_elec_networks: input: expand( RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), @@ -45,7 +52,8 @@ rule prepare_sector_networks: expand( RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), @@ -53,7 +61,8 @@ rule solve_elec_networks: input: expand( RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), @@ -62,7 +71,8 @@ rule solve_sector_networks: expand( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), @@ -71,7 +81,8 @@ rule plot_networks: expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), @@ -80,11 +91,13 @@ rule validate_elec_networks: expand( RESULTS + "figures/.statistics_plots_elec_s{simpl}_{clusters}_ec_l{ll}_{opts}", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), expand( RESULTS + "figures/.validation_{kind}_plots_elec_s{simpl}_{clusters}_ec_l{ll}_{opts}", **config["scenario"], + run=config["run"]["name"], kind=["production", "prices", "cross_border"] ), diff --git a/rules/common.smk b/rules/common.smk index ec5be355..5677f577 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -2,6 +2,57 @@ # # SPDX-License-Identifier: MIT +import copy + + +def get_config(keys, config, default=None): + """Retrieve a nested value from a dictionary using a tuple of keys.""" + value = config + for key in keys: + value = value.get(key, default) + if value == default: + return default + return value + + +def merge_configs(base_config, scenario_config): + """Merge base config with a specific scenario without modifying the original.""" + merged = copy.deepcopy(base_config) + for key, value in scenario_config.items(): + if key in merged and isinstance(merged[key], dict): + merged[key] = merge_configs(merged[key], value) + else: + merged[key] = value + return merged + + +def config_provider(*keys, default=None): + """Dynamically provide config values based on 'run' -> 'name'. + + Usage in Snakemake rules would look something like: + params: + my_param=config_provider("key1", "key2", default="some_default_value") + """ + + def static_getter(wildcards): + """Getter function for static config values.""" + return get_config(keys, config, default) + + def dynamic_getter(wildcards): + """Getter function for dynamic config values based on scenario.""" + scenario_name = wildcards.run + if scenario_name not in scenarios: + raise ValueError( + f"Scenario {scenario_name} not found in file {config['scenariofile']}." + ) + merged_config = merge_configs(config, scenarios[scenario_name]) + return get_config(keys, merged_config, default) + + if config["run"].get("scenarios", False): + return dynamic_getter + else: + return static_getter + def memory(w): factor = 3.0 diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 2618680e..fccda6e4 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -10,8 +10,8 @@ localrules: rule plot_network: params: - foresight=config["foresight"], - plotting=config["plotting"], + foresight=config_provider("foresight"), + plotting=config_provider("plotting"), input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -53,16 +53,17 @@ rule copy_config: rule make_summary: params: - foresight=config["foresight"], - costs=config["costs"], - snapshots=config["snapshots"], - scenario=config["scenario"], + foresight=config_provider("foresight"), + costs=config_provider("costs"), + snapshots=config_provider("snapshots"), + scenario=config_provider("scenario"), RDIR=RDIR, input: networks=expand( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" @@ -70,7 +71,8 @@ rule make_summary: plots=expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - **config["scenario"] + **config["scenario"], + run=config["run"]["name"] ), output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", @@ -103,10 +105,10 @@ rule make_summary: rule plot_summary: params: - countries=config["countries"], - planning_horizons=config["scenario"]["planning_horizons"], - sector_opts=config["scenario"]["sector_opts"], - plotting=config["plotting"], + countries=config_provider("countries"), + planning_horizons=config_provider("scenario", "planning_horizons"), + sector_opts=config_provider("scenario", "sector_opts"), + plotting=config_provider("plotting"), RDIR=RDIR, input: costs=RESULTS + "csvs/costs.csv", @@ -145,7 +147,7 @@ STATISTICS_BARPLOTS = [ rule plot_elec_statistics: params: - plotting=config["plotting"], + plotting=config_provider("plotting"), barplots=STATISTICS_BARPLOTS, input: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 0b60ee2e..4b9e9542 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -29,7 +29,7 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_databundle", output: expand("data/bundle/{file}", file=datafiles), log: - LOGS + "retrieve_databundle.log", + "logs/retrieve_databundle.log", resources: mem_mb=1000, retries: 2 @@ -72,7 +72,7 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_cost_data", T output: "data/costs_{year}.csv", log: - LOGS + "retrieve_cost_data_{year}.log", + "logs/retrieve_cost_data_{year}.log", resources: mem_mb=1000, retries: 2 @@ -123,7 +123,7 @@ if config["enable"]["retrieve"] and config["enable"].get( output: *datafiles, log: - LOGS + "retrieve_sector_databundle.log", + "logs/retrieve_sector_databundle.log", retries: 2 conda: "../envs/environment.yaml" @@ -145,7 +145,7 @@ if config["enable"]["retrieve"] and ( output: expand("data/gas_network/scigrid-gas/data/{files}", files=datafiles), log: - LOGS + "retrieve_gas_infrastructure_data.log", + "logs/retrieve_gas_infrastructure_data.log", retries: 2 conda: "../envs/environment.yaml" @@ -169,7 +169,7 @@ if config["enable"]["retrieve"]: output: "data/load_raw.csv", log: - LOGS + "retrieve_electricity_demand.log", + "logs/retrieve_electricity_demand.log", resources: mem_mb=5000, retries: 2 @@ -189,7 +189,7 @@ if config["enable"]["retrieve"]: output: "data/shipdensity_global.zip", log: - LOGS + "retrieve_ship_raster.log", + "logs/retrieve_ship_raster.log", resources: mem_mb=5000, retries: 2 @@ -209,7 +209,7 @@ if config["enable"]["retrieve"]: output: "data/validation/emission-spot-primary-market-auction-report-2019-data.xls", log: - LOGS + "retrieve_monthly_co2_prices.log", + "logs/retrieve_monthly_co2_prices.log", resources: mem_mb=5000, retries: 2 @@ -223,7 +223,7 @@ if config["enable"]["retrieve"]: output: "data/validation/energy-price-trends-xlsx-5619002.xlsx", log: - LOGS + "retrieve_monthly_fuel_prices.log", + "logs/retrieve_monthly_fuel_prices.log", resources: mem_mb=5000, retries: 2 diff --git a/scripts/_helpers.py b/scripts/_helpers.py index fc7bc9e0..c66d708e 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -14,6 +14,7 @@ import pytz import yaml from pypsa.components import component_attrs, components from pypsa.descriptors import Dict +from snakemake.utils import update_config from tqdm import tqdm logger = logging.getLogger(__name__) @@ -29,6 +30,13 @@ def mute_print(): yield +def set_scenario_config(snakemake): + if "scenario_config" in snakemake.input: + with open(snakemake.input.scenario_config, "r") as f: + scenario_config = yaml.safe_load(f) + update_config(snakemake.config, scenario_config) + + def configure_logging(snakemake, skip_handlers=False): """ Configure the basic behaviour for the logging module. diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 56375800..ff5e950e 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -92,7 +92,7 @@ import powerplantmatching as pm import pypsa import scipy.sparse as sparse import xarray as xr -from _helpers import configure_logging, update_p_nom_max +from _helpers import configure_logging, set_scenario_config, update_p_nom_max from powerplantmatching.export import map_country_bus from shapely.prepared import prep @@ -809,6 +809,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("add_electricity") configure_logging(snakemake) + set_scenario_config(snakemake) params = snakemake.params diff --git a/scripts/add_extra_components.py b/scripts/add_extra_components.py index e00e1e5f..9fe20066 100644 --- a/scripts/add_extra_components.py +++ b/scripts/add_extra_components.py @@ -55,7 +55,7 @@ import logging import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from add_electricity import load_costs, sanitize_carriers idx = pd.IndexSlice @@ -231,6 +231,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("add_extra_components", simpl="", clusters=5) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) extendable_carriers = snakemake.params.extendable_carriers diff --git a/scripts/base_network.py b/scripts/base_network.py index b4ac1d8c..b5304109 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -77,7 +77,7 @@ import shapely import shapely.prepared import shapely.wkt import yaml -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from scipy import spatial from scipy.sparse import csgraph from shapely.geometry import LineString, Point @@ -745,6 +745,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("base_network") configure_logging(snakemake) + set_scenario_config(snakemake) n = base_network( snakemake.input.eg_buses, diff --git a/scripts/build_bus_regions.py b/scripts/build_bus_regions.py index a6500bb0..76a57f5e 100644 --- a/scripts/build_bus_regions.py +++ b/scripts/build_bus_regions.py @@ -47,7 +47,7 @@ import geopandas as gpd import numpy as np import pandas as pd import pypsa -from _helpers import REGION_COLS, configure_logging +from _helpers import REGION_COLS, configure_logging, set_scenario_config from scipy.spatial import Voronoi from shapely.geometry import Polygon @@ -115,6 +115,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_bus_regions") configure_logging(snakemake) + set_scenario_config(snakemake) countries = snakemake.params.countries diff --git a/scripts/build_cross_border_flows.py b/scripts/build_cross_border_flows.py index b9fc3fe8..743f1742 100644 --- a/scripts/build_cross_border_flows.py +++ b/scripts/build_cross_border_flows.py @@ -8,7 +8,7 @@ import logging import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from entsoe import EntsoePandasClient from entsoe.exceptions import InvalidBusinessParameterError, NoMatchingDataError from requests import HTTPError @@ -21,6 +21,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_cross_border_flows") configure_logging(snakemake) + set_scenario_config(snakemake) api_key = snakemake.config["private"]["keys"]["entsoe_api"] client = EntsoePandasClient(api_key=api_key) diff --git a/scripts/build_cutout.py b/scripts/build_cutout.py index 9a7f9e00..f9f951b5 100644 --- a/scripts/build_cutout.py +++ b/scripts/build_cutout.py @@ -95,7 +95,7 @@ import logging import atlite import geopandas as gpd import pandas as pd -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) @@ -105,6 +105,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_cutout", cutout="europe-2013-era5") configure_logging(snakemake) + set_scenario_config(snakemake) cutout_params = snakemake.params.cutouts[snakemake.wildcards.cutout] diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index 38c75544..60d40e1e 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -45,7 +45,7 @@ logger = logging.getLogger(__name__) import dateutil import numpy as np import pandas as pd -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from pandas import Timedelta as Delta @@ -288,6 +288,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_electricity_demand") configure_logging(snakemake) + set_scenario_config(snakemake) powerstatistics = snakemake.params.load["power_statistics"] interpolate_limit = snakemake.params.load["interpolate_limit"] diff --git a/scripts/build_electricity_prices.py b/scripts/build_electricity_prices.py index 353ea7e3..48361afe 100644 --- a/scripts/build_electricity_prices.py +++ b/scripts/build_electricity_prices.py @@ -7,7 +7,7 @@ import logging import pandas as pd -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from entsoe import EntsoePandasClient from entsoe.exceptions import NoMatchingDataError @@ -19,6 +19,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_cross_border_flows") configure_logging(snakemake) + set_scenario_config(snakemake) api_key = snakemake.config["private"]["keys"]["entsoe_api"] client = EntsoePandasClient(api_key=api_key) diff --git a/scripts/build_electricity_production.py b/scripts/build_electricity_production.py index beb859bd..38be2ba0 100644 --- a/scripts/build_electricity_production.py +++ b/scripts/build_electricity_production.py @@ -7,7 +7,7 @@ import logging import pandas as pd -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from entsoe import EntsoePandasClient from entsoe.exceptions import NoMatchingDataError @@ -39,6 +39,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_electricity_production") configure_logging(snakemake) + set_scenario_config(snakemake) api_key = snakemake.config["private"]["keys"]["entsoe_api"] client = EntsoePandasClient(api_key=api_key) diff --git a/scripts/build_hydro_profile.py b/scripts/build_hydro_profile.py index bed666f2..883f33d2 100644 --- a/scripts/build_hydro_profile.py +++ b/scripts/build_hydro_profile.py @@ -65,7 +65,7 @@ import atlite import country_converter as coco import geopandas as gpd import pandas as pd -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config cc = coco.CountryConverter() @@ -129,6 +129,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_hydro_profile") configure_logging(snakemake) + set_scenario_config(snakemake) params_hydro = snakemake.params.hydro cutout = atlite.Cutout(snakemake.input.cutout) diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index 7f842d43..abc6b286 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -59,7 +59,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from shapely.geometry import LineString as Line from shapely.geometry import Point @@ -147,6 +147,7 @@ if __name__ == "__main__": opts="Co2L-4H", ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.base_network) time = pd.date_range(freq="h", **snakemake.config["snapshots"]) diff --git a/scripts/build_monthly_prices.py b/scripts/build_monthly_prices.py index c2e88972..89edde79 100644 --- a/scripts/build_monthly_prices.py +++ b/scripts/build_monthly_prices.py @@ -46,7 +46,7 @@ Data was accessed at 16.5.2023 import logging import pandas as pd -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) @@ -114,6 +114,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_monthly_prices") configure_logging(snakemake) + set_scenario_config(snakemake) fuel_price = get_fuel_price() fuel_price.to_csv(snakemake.output.fuel_price) diff --git a/scripts/build_natura_raster.py b/scripts/build_natura_raster.py index 8fdb4ea3..79418d5c 100644 --- a/scripts/build_natura_raster.py +++ b/scripts/build_natura_raster.py @@ -46,7 +46,7 @@ import logging import atlite import geopandas as gpd import rasterio as rio -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from rasterio.features import geometry_mask from rasterio.warp import transform_bounds @@ -92,6 +92,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_natura_raster") configure_logging(snakemake) + set_scenario_config(snakemake) cutouts = snakemake.input.cutouts xs, Xs, ys, Ys = zip(*(determine_cutout_xXyY(cutout) for cutout in cutouts)) diff --git a/scripts/build_powerplants.py b/scripts/build_powerplants.py index cbe94505..2ad1e010 100755 --- a/scripts/build_powerplants.py +++ b/scripts/build_powerplants.py @@ -80,7 +80,7 @@ import logging import pandas as pd import powerplantmatching as pm import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from powerplantmatching.export import map_country_bus logger = logging.getLogger(__name__) @@ -115,6 +115,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_powerplants") configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.base_network) countries = snakemake.params.countries diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 7b08325b..40b3151d 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -188,7 +188,7 @@ import geopandas as gpd import numpy as np import pandas as pd import xarray as xr -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from dask.distributed import Client from pypsa.geo import haversine from shapely.geometry import LineString @@ -202,6 +202,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_renewable_profiles", technology="solar") configure_logging(snakemake) + set_scenario_config(snakemake) nprocesses = int(snakemake.threads) noprogress = snakemake.config["run"].get("disable_progressbar", True) diff --git a/scripts/build_shapes.py b/scripts/build_shapes.py index eb837409..571a7282 100644 --- a/scripts/build_shapes.py +++ b/scripts/build_shapes.py @@ -77,7 +77,7 @@ import geopandas as gpd import numpy as np import pandas as pd import pycountry as pyc -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from shapely.geometry import MultiPolygon, Polygon logger = logging.getLogger(__name__) @@ -254,6 +254,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_shapes") configure_logging(snakemake) + set_scenario_config(snakemake) country_shapes = countries(snakemake.input.naturalearth, snakemake.params.countries) country_shapes.reset_index().to_file(snakemake.output.country_shapes) diff --git a/scripts/build_ship_raster.py b/scripts/build_ship_raster.py index 90e006b0..25bebcca 100644 --- a/scripts/build_ship_raster.py +++ b/scripts/build_ship_raster.py @@ -44,9 +44,10 @@ Description import logging import os import zipfile +from pathlib import Path import rioxarray -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from build_natura_raster import determine_cutout_xXyY logger = logging.getLogger(__name__) @@ -57,16 +58,19 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_ship_raster") configure_logging(snakemake) + set_scenario_config(snakemake) cutouts = snakemake.input.cutouts xs, Xs, ys, Ys = zip(*(determine_cutout_xXyY(cutout) for cutout in cutouts)) with zipfile.ZipFile(snakemake.input.ship_density) as zip_f: - zip_f.extract("shipdensity_global.tif") - with rioxarray.open_rasterio("shipdensity_global.tif") as ship_density: - ship_density = ship_density.drop(["band"]).sel( - x=slice(min(xs), max(Xs)), y=slice(max(Ys), min(ys)) - ) - ship_density.rio.to_raster(snakemake.output[0]) + resources = Path(snakemake.output[0]).parent + fn = "shipdensity_global.tif" + zip_f.extract(fn, resources) + with rioxarray.open_rasterio(resources / fn) as ship_density: + ship_density = ship_density.drop(["band"]).sel( + x=slice(min(xs), max(Xs)), y=slice(max(Ys), min(ys)) + ) + ship_density.rio.to_raster(snakemake.output[0]) - os.remove("shipdensity_global.tif") + (resources / fn).unlink() diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 884b6a2b..b0ce4796 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -133,7 +133,7 @@ import pandas as pd import pyomo.environ as po import pypsa import seaborn as sns -from _helpers import configure_logging, update_p_nom_max +from _helpers import configure_logging, set_scenario_config, update_p_nom_max from pypsa.clustering.spatial import ( busmap_by_greedy_modularity, busmap_by_hac, @@ -463,6 +463,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("cluster_network", simpl="", clusters="37") configure_logging(snakemake) + set_scenario_config(snakemake) params = snakemake.params solver_name = snakemake.config["solving"]["solver"]["name"] diff --git a/scripts/plot_statistics.py b/scripts/plot_statistics.py index 1e75203f..a0a3e71d 100644 --- a/scripts/plot_statistics.py +++ b/scripts/plot_statistics.py @@ -7,7 +7,7 @@ import matplotlib.pyplot as plt import pypsa import seaborn as sns -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config sns.set_theme("paper", style="whitegrid") @@ -24,6 +24,7 @@ if __name__ == "__main__": ll="v1.0", ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) diff --git a/scripts/plot_validation_cross_border_flows.py b/scripts/plot_validation_cross_border_flows.py index 43ed45e9..8b063d8c 100644 --- a/scripts/plot_validation_cross_border_flows.py +++ b/scripts/plot_validation_cross_border_flows.py @@ -9,7 +9,7 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa import seaborn as sns -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config sns.set_theme("paper", style="whitegrid") @@ -195,6 +195,7 @@ if __name__ == "__main__": ll="v1.0", ) configure_logging(snakemake) + set_scenario_config(snakemake) countries = snakemake.params.countries diff --git a/scripts/plot_validation_electricity_prices.py b/scripts/plot_validation_electricity_prices.py index 2a187b9f..c229e382 100644 --- a/scripts/plot_validation_electricity_prices.py +++ b/scripts/plot_validation_electricity_prices.py @@ -8,7 +8,7 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa import seaborn as sns -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from pypsa.statistics import get_bus_and_carrier sns.set_theme("paper", style="whitegrid") @@ -25,6 +25,7 @@ if __name__ == "__main__": ll="v1.0", ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) n.loads.carrier = "load" diff --git a/scripts/plot_validation_electricity_production.py b/scripts/plot_validation_electricity_production.py index 5c5569d0..3e81faff 100644 --- a/scripts/plot_validation_electricity_production.py +++ b/scripts/plot_validation_electricity_production.py @@ -8,7 +8,7 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa import seaborn as sns -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from pypsa.statistics import get_bus_and_carrier sns.set_theme("paper", style="whitegrid") @@ -35,6 +35,7 @@ if __name__ == "__main__": ll="v1.0", ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) n.loads.carrier = "load" diff --git a/scripts/prepare_links_p_nom.py b/scripts/prepare_links_p_nom.py index 4b915d22..450f3227 100644 --- a/scripts/prepare_links_p_nom.py +++ b/scripts/prepare_links_p_nom.py @@ -40,7 +40,7 @@ Description import logging import pandas as pd -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) @@ -69,6 +69,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("prepare_links_p_nom", simpl="") configure_logging(snakemake) + set_scenario_config(snakemake) links_p_nom = pd.read_html( "https://en.wikipedia.org/wiki/List_of_HVDC_projects", header=0, match="SwePol" diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index a5a00a3c..a7f1ddf3 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -63,7 +63,7 @@ import re import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from add_electricity import load_costs, update_transmission_costs from pypsa.descriptors import expand_series @@ -283,6 +283,7 @@ if __name__ == "__main__": "prepare_network", simpl="", clusters="37", ll="v1.0", opts="Ept" ) configure_logging(snakemake) + set_scenario_config(snakemake) opts = snakemake.wildcards.opts.split("-") diff --git a/scripts/retrieve_databundle.py b/scripts/retrieve_databundle.py index 75d8519e..cb3bdc11 100644 --- a/scripts/retrieve_databundle.py +++ b/scripts/retrieve_databundle.py @@ -36,7 +36,7 @@ import logging import tarfile from pathlib import Path -from _helpers import configure_logging, progress_retrieve +from _helpers import configure_logging, progress_retrieve, set_scenario_config logger = logging.getLogger(__name__) diff --git a/scripts/retrieve_monthly_fuel_prices.py b/scripts/retrieve_monthly_fuel_prices.py index 11e351ce..887014cc 100644 --- a/scripts/retrieve_monthly_fuel_prices.py +++ b/scripts/retrieve_monthly_fuel_prices.py @@ -12,7 +12,7 @@ logger = logging.getLogger(__name__) from pathlib import Path -from _helpers import configure_logging, progress_retrieve +from _helpers import configure_logging, progress_retrieve, set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -23,6 +23,7 @@ if __name__ == "__main__": else: rootpath = "." configure_logging(snakemake) + set_scenario_config(snakemake) url = "https://www.destatis.de/EN/Themes/Economy/Prices/Publications/Downloads-Energy-Price-Trends/energy-price-trends-xlsx-5619002.xlsx?__blob=publicationFile" diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index 0d172c8d..1beed478 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -13,7 +13,7 @@ logger = logging.getLogger(__name__) import tarfile from pathlib import Path -from _helpers import configure_logging, progress_retrieve +from _helpers import configure_logging, progress_retrieve, set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -24,6 +24,7 @@ if __name__ == "__main__": else: rootpath = "." configure_logging(snakemake) + set_scenario_config(snakemake) url = "https://zenodo.org/record/5824485/files/pypsa-eur-sec-data-bundle.tar.gz" diff --git a/scripts/simplify_network.py b/scripts/simplify_network.py index cac25647..440145ff 100644 --- a/scripts/simplify_network.py +++ b/scripts/simplify_network.py @@ -92,7 +92,7 @@ import numpy as np import pandas as pd import pypsa import scipy as sp -from _helpers import configure_logging, update_p_nom_max +from _helpers import configure_logging, set_scenario_config, update_p_nom_max from add_electricity import load_costs from cluster_network import cluster_regions, clustering_for_n_clusters from pypsa.clustering.spatial import ( @@ -531,6 +531,7 @@ if __name__ == "__main__": snakemake = mock_snakemake("simplify_network", simpl="") configure_logging(snakemake) + set_scenario_config(snakemake) params = snakemake.params solver_name = snakemake.config["solving"]["solver"]["name"] diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 8eccef19..37b05286 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -33,7 +33,11 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import configure_logging, update_config_with_sector_opts +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_with_sector_opts, +) logger = logging.getLogger(__name__) pypsa.pf.logger.setLevel(logging.WARNING) @@ -657,6 +661,7 @@ if __name__ == "__main__": planning_horizons="2020", ) configure_logging(snakemake) + set_scenario_config(snakemake) if "sector_opts" in snakemake.wildcards.keys(): update_config_with_sector_opts( snakemake.config, snakemake.wildcards.sector_opts diff --git a/scripts/solve_operations_network.py b/scripts/solve_operations_network.py index 1a3855a9..064d735a 100644 --- a/scripts/solve_operations_network.py +++ b/scripts/solve_operations_network.py @@ -11,7 +11,11 @@ import logging import numpy as np import pypsa -from _helpers import configure_logging, update_config_with_sector_opts +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_with_sector_opts, +) from solve_network import prepare_network, solve_network logger = logging.getLogger(__name__) @@ -33,6 +37,7 @@ if __name__ == "__main__": ) configure_logging(snakemake) + set_scenario_config(snakemake) update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) opts = (snakemake.wildcards.opts + "-" + snakemake.wildcards.sector_opts).split("-") From 1f38c69b7634e6facbfe6dcb3d0dcd19caca3ee0 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 15:07:34 +0200 Subject: [PATCH 006/497] untrack scenarios.yaml --- config/scenarios.yaml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 config/scenarios.yaml diff --git a/config/scenarios.yaml b/config/scenarios.yaml deleted file mode 100644 index 37d32243..00000000 --- a/config/scenarios.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: MIT - -# This file is used to define the scenarios that are run by snakemake. Each entry on the first level is a scenario. Each scenario can contain configuration overrides with respect to the config/config.yaml settings. -# -# Example -# -# custom-scenario: # name of the scenario -# electricity: -# renewable_carriers: [wind, solar] # override the list of renewable carriers From 56fe245eb4ae03839f3fd61b33a7319237a596b0 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 15:08:22 +0200 Subject: [PATCH 007/497] gitignore: fix typo --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 67cab0c9..e79d129d 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,7 @@ doc/_build /scripts/create_scenarios.py config.yaml -config/scenario.yaml +config/scenarios.yaml dconf From 6df2742cb996fb62a97851dd671ec00861e88fc2 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 15:14:55 +0200 Subject: [PATCH 008/497] update release notes --- doc/release_notes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 70a73e2f..918bb6dd 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -11,6 +11,8 @@ Upcoming Release ================ * Updated Global Energy Monitor LNG terminal data to March 2023 version. +* PyPSA-EUR now supports the simultaneous execution of multiple scenarios. For this purpose, a scenarios.yaml file has been introduced which contains customizable scenario names with corresponding configuration overrides. To enable it, set the ``run: scenarios:`` key to ``True`` and define the scenario names to run under ``run: name:`` in the configuration file. The latter must be a subset of toplevel keys in the scenario file. + PyPSA-Eur 0.8.1 (27th July 2023) ================================ From 16d08ec100ee334daf729dcd5dc1bdb93feba1d1 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 15:29:43 +0200 Subject: [PATCH 009/497] CI: fix config scenarios file spec --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ff481b46..c09d05c2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,7 +83,7 @@ jobs: snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.electricity.scenario.yaml + snakemake -call all --configfile config/test/config.scenarios.electricity.yaml - name: Upload artifacts uses: actions/upload-artifact@v3 From 3462080b896ba71b04653b73453024b750de7721 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 15:44:54 +0200 Subject: [PATCH 010/497] ci: adjust scenario test run --- .github/workflows/ci.yaml | 2 +- rules/collect.smk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c09d05c2..6cbee85c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,7 +83,7 @@ jobs: snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.scenarios.electricity.yaml + snakemake -call solve_elec_networks --configfile config/test/config.scenarios.electricity.yaml - name: Upload artifacts uses: actions/upload-artifact@v3 diff --git a/rules/collect.smk b/rules/collect.smk index a29aa715..8a64b577 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -16,7 +16,7 @@ localrules: rule all: input: - RESULTS + "graphs/costs.pdf", + expand(RESULTS + "graphs/costs.pdf", run=config["run"]["name"]), default_target: True From 5036964dbea41eaabf3695bdad1fad089ca8ef62 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 15:49:57 +0200 Subject: [PATCH 011/497] copy_config: ensure to store updated config --- scripts/copy_config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/copy_config.py b/scripts/copy_config.py index a549d893..40025342 100644 --- a/scripts/copy_config.py +++ b/scripts/copy_config.py @@ -13,10 +13,12 @@ import yaml if __name__ == "__main__": if "snakemake" not in globals(): - from _helpers import mock_snakemake + from _helpers import mock_snakemake, set_scenario_config snakemake = mock_snakemake("copy_config") + set_scenario_config(snakemake) + with open(snakemake.output[0], "w") as yaml_file: yaml.dump( snakemake.config, From b40a8926ff06fbcd501d2fdef8cd33407d8cba50 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 16:51:35 +0200 Subject: [PATCH 012/497] copy_config: fix import --- scripts/copy_config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/copy_config.py b/scripts/copy_config.py index 40025342..d6908a62 100644 --- a/scripts/copy_config.py +++ b/scripts/copy_config.py @@ -10,10 +10,11 @@ from pathlib import Path from shutil import copy import yaml +from _helpers import set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): - from _helpers import mock_snakemake, set_scenario_config + from _helpers import mock_snakemake snakemake = mock_snakemake("copy_config") From b9f3df385611d8f7c1f22575b8222cda1951c7b3 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 15 Aug 2023 17:28:12 +0200 Subject: [PATCH 013/497] ci: only dry-run scenarios --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6cbee85c..68bffc4c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,7 +83,7 @@ jobs: snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime - snakemake -call solve_elec_networks --configfile config/test/config.scenarios.electricity.yaml + snakemake -call solve_elec_networks --configfile config/test/config.scenarios.electricity.yaml -n - name: Upload artifacts uses: actions/upload-artifact@v3 From b3a6e2c2816087b2b22eb05877ac2ec82d93084f Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 10:50:09 +0200 Subject: [PATCH 014/497] common: make cache config_getter, use partial functions --- rules/common.smk | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 5677f577..f24301c8 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -3,9 +3,10 @@ # SPDX-License-Identifier: MIT import copy +from functools import partial, lru_cache -def get_config(keys, config, default=None): +def get_config(config, keys, default=None): """Retrieve a nested value from a dictionary using a tuple of keys.""" value = config for key in keys: @@ -26,6 +27,27 @@ def merge_configs(base_config, scenario_config): return merged +@lru_cache +def scenario_config(scenario_name): + """Retrieve a scenario config based on the overrides from the scenario file.""" + return merge_configs(config, scenarios[scenario_name]) + + +def static_getter(wildcards, keys, default): + """Getter function for static config values.""" + return get_config(config, keys, default) + + +def dynamic_getter(wildcards, keys, default): + """Getter function for dynamic config values based on scenario.""" + scenario_name = wildcards.run + if scenario_name not in scenarios: + raise ValueError( + f"Scenario {scenario_name} not found in file {config['scenariofile']}." + ) + return get_config(scenario_config(scenario_name), keys, default) + + def config_provider(*keys, default=None): """Dynamically provide config values based on 'run' -> 'name'. @@ -33,25 +55,11 @@ def config_provider(*keys, default=None): params: my_param=config_provider("key1", "key2", default="some_default_value") """ - - def static_getter(wildcards): - """Getter function for static config values.""" - return get_config(keys, config, default) - - def dynamic_getter(wildcards): - """Getter function for dynamic config values based on scenario.""" - scenario_name = wildcards.run - if scenario_name not in scenarios: - raise ValueError( - f"Scenario {scenario_name} not found in file {config['scenariofile']}." - ) - merged_config = merge_configs(config, scenarios[scenario_name]) - return get_config(keys, merged_config, default) - + # Using functools.partial to freeze certain arguments in our getter functions. if config["run"].get("scenarios", False): - return dynamic_getter + return partial(dynamic_getter, keys=keys, default=default) else: - return static_getter + return partial(static_getter, keys=keys, default=default) def memory(w): From 750b74db46bc6ac656145df2802b62cfa8fb801d Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 10:51:03 +0200 Subject: [PATCH 015/497] build_electricity: optionally download dynamic fuel prices --- rules/build_electricity.smk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 4d59c058..b359868f 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -350,7 +350,9 @@ rule add_electricity: hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), geth_hydro_capacities="data/geth2015_hydro_capacities.csv", unit_commitment="data/unit_commitment.csv", - fuel_price=RESOURCES + "monthly_fuel_price.csv", + fuel_price=RESOURCES + "monthly_fuel_price.csv" + if config["conventional"]["dynamic_fuel_price"] + else [], load=RESOURCES + "load.csv", nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", output: From 9cd449cf3c24bc935b43c0bb1dcb3ff80015822e Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 11:41:48 +0200 Subject: [PATCH 016/497] retrieve electricity demand: use script in order to concat time-series --- rules/postprocess.smk | 1 - rules/retrieve.smk | 14 ++-------- scripts/retrieve_electricity_demand.py | 37 ++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 scripts/retrieve_electricity_demand.py diff --git a/rules/postprocess.smk b/rules/postprocess.smk index fccda6e4..4c833b4f 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -5,7 +5,6 @@ localrules: copy_config, - copy_conda_env, rule plot_network: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 4b9e9542..d7e22e71 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -156,16 +156,6 @@ if config["enable"]["retrieve"] and ( if config["enable"]["retrieve"]: rule retrieve_electricity_demand: - input: - HTTP.remote( - "data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv".format( - version="2019-06-05" - if config["snapshots"]["end"] < "2019" - else "2020-10-06" - ), - keep_local=True, - static=True, - ), output: "data/load_raw.csv", log: @@ -173,8 +163,8 @@ if config["enable"]["retrieve"]: resources: mem_mb=5000, retries: 2 - run: - move(input[0], output[0]) + script: + "../scripts/retrieve_electricity_demand.py" if config["enable"]["retrieve"]: diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py new file mode 100644 index 00000000..58615755 --- /dev/null +++ b/scripts/retrieve_electricity_demand.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Retrieve monthly fuel prices from Destatis. +""" + +import logging + +import pandas as pd + +logger = logging.getLogger(__name__) + +from pathlib import Path + +from _helpers import configure_logging, set_scenario_config + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("retrieve_eletricity_demand") + rootpath = ".." + else: + rootpath = "." + configure_logging(snakemake) + set_scenario_config(snakemake) + + versions = ["2019-06-05", "2020-10-06"] + url = "https://data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv" + + df1, df2 = [ + pd.read_csv(url.format(version=version), index_col=0) for version in versions + ] + res = pd.concat([df1, df2[df2.index > df1.index[-1]]], join="inner") + res.to_csv(snakemake.output[0]) From 32eb114b613d8e0c88c3c992d0b1ddb4ecf71b4c Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 11:47:27 +0200 Subject: [PATCH 017/497] retrieve electricity demand: make online version snakemake params --- rules/retrieve.smk | 2 ++ scripts/build_industrial_distribution_key.py | 4 ++-- scripts/retrieve_electricity_demand.py | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index d7e22e71..5af0ffb5 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -156,6 +156,8 @@ if config["enable"]["retrieve"] and ( if config["enable"]["retrieve"]: rule retrieve_electricity_demand: + params: + versions=["2019-06-05", "2020-10-06"], output: "data/load_raw.csv", log: diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index 979a1493..24cb6fa0 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -116,7 +116,7 @@ def build_nodal_distribution_key(hotmaps, regions, countries): if not facilities.empty: emissions = facilities["Emissions_ETS_2014"].fillna( - hotmaps["Emissions_EPRTR_2014"] + hotmaps["Emissions_EPRTR_2014"].dropna() ) if emissions.sum() == 0: key = pd.Series(1 / len(facilities), facilities.index) @@ -140,7 +140,7 @@ if __name__ == "__main__": snakemake = mock_snakemake( "build_industrial_distribution_key", simpl="", - clusters=48, + clusters=128, ) logging.basicConfig(level=snakemake.config["logging"]["level"]) diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py index 58615755..58511857 100644 --- a/scripts/retrieve_electricity_demand.py +++ b/scripts/retrieve_electricity_demand.py @@ -27,11 +27,11 @@ if __name__ == "__main__": configure_logging(snakemake) set_scenario_config(snakemake) - versions = ["2019-06-05", "2020-10-06"] url = "https://data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv" df1, df2 = [ - pd.read_csv(url.format(version=version), index_col=0) for version in versions + pd.read_csv(url.format(version=version), index_col=0) + for version in snakemake.params.versions ] res = pd.concat([df1, df2[df2.index > df1.index[-1]]], join="inner") res.to_csv(snakemake.output[0]) From 59fe66561651ff64730b27cf0647c78caea9030d Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 13:25:52 +0200 Subject: [PATCH 018/497] add exemplary scenarios.yaml add create_scenarios.py --- config/scenarios.yaml | 12 ++++++++++++ scripts/create_scenarios.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 config/scenarios.yaml create mode 100644 scripts/create_scenarios.py diff --git a/config/scenarios.yaml b/config/scenarios.yaml new file mode 100644 index 00000000..37d32243 --- /dev/null +++ b/config/scenarios.yaml @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +# This file is used to define the scenarios that are run by snakemake. Each entry on the first level is a scenario. Each scenario can contain configuration overrides with respect to the config/config.yaml settings. +# +# Example +# +# custom-scenario: # name of the scenario +# electricity: +# renewable_carriers: [wind, solar] # override the list of renewable carriers diff --git a/scripts/create_scenarios.py b/scripts/create_scenarios.py new file mode 100644 index 00000000..40a3c331 --- /dev/null +++ b/scripts/create_scenarios.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +# This script helps to generate a scenarios.yaml file for PyPSA-Eur. +# You can modify the template to your needs and define all possible combinations of config values that should be considered. + + +import itertools + +# Insert your config values that should be altered in the template. +# Change `config_section` and `config_section2` to the actual config sections. +template = """ +scenario{scenario_number}: + config_section: + config_value: {config_value} + + config_section2: + config_key2: {config_value2} +""" + +# Define all possible combinations of config values. +# This must define all config values that are used in the template. +config_values = dict(config_values=["true", "false"], config_values2=[1, 2, 3, 4, 5]) + +combinations = [ + dict(zip(config_values.keys(), values)) + for values in itertools.product(*config_values.values()) +] + +# write the scenarios to a file +filename = "../config/scenarios.yaml" +with open(filename, "w") as f: + for i, config in enumerate(combinations): + f.write(template.format(scenario_number=i, **config)) From af2fb1a82e728c7d0de2a73c1222ba5479fb6540 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 13:37:10 +0200 Subject: [PATCH 019/497] uptrack changes in scenarios.yaml/create_scenarios.py --- config/scenarios.yaml | 12 ------------ scripts/create_scenarios.py | 36 ------------------------------------ 2 files changed, 48 deletions(-) delete mode 100644 config/scenarios.yaml delete mode 100644 scripts/create_scenarios.py diff --git a/config/scenarios.yaml b/config/scenarios.yaml deleted file mode 100644 index 37d32243..00000000 --- a/config/scenarios.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: MIT - -# This file is used to define the scenarios that are run by snakemake. Each entry on the first level is a scenario. Each scenario can contain configuration overrides with respect to the config/config.yaml settings. -# -# Example -# -# custom-scenario: # name of the scenario -# electricity: -# renewable_carriers: [wind, solar] # override the list of renewable carriers diff --git a/scripts/create_scenarios.py b/scripts/create_scenarios.py deleted file mode 100644 index 40a3c331..00000000 --- a/scripts/create_scenarios.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: MIT - -# This script helps to generate a scenarios.yaml file for PyPSA-Eur. -# You can modify the template to your needs and define all possible combinations of config values that should be considered. - - -import itertools - -# Insert your config values that should be altered in the template. -# Change `config_section` and `config_section2` to the actual config sections. -template = """ -scenario{scenario_number}: - config_section: - config_value: {config_value} - - config_section2: - config_key2: {config_value2} -""" - -# Define all possible combinations of config values. -# This must define all config values that are used in the template. -config_values = dict(config_values=["true", "false"], config_values2=[1, 2, 3, 4, 5]) - -combinations = [ - dict(zip(config_values.keys(), values)) - for values in itertools.product(*config_values.values()) -] - -# write the scenarios to a file -filename = "../config/scenarios.yaml" -with open(filename, "w") as f: - for i, config in enumerate(combinations): - f.write(template.format(scenario_number=i, **config)) From 672d7b9538ed9c1ad811a43dd056ff7cb60d202a Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 13:45:59 +0200 Subject: [PATCH 020/497] force add scenarios.yaml / create_scenarios --- config/scenarios.yaml | 12 ++++++++++++ scripts/create_scenarios.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 config/scenarios.yaml create mode 100644 scripts/create_scenarios.py diff --git a/config/scenarios.yaml b/config/scenarios.yaml new file mode 100644 index 00000000..37d32243 --- /dev/null +++ b/config/scenarios.yaml @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +# This file is used to define the scenarios that are run by snakemake. Each entry on the first level is a scenario. Each scenario can contain configuration overrides with respect to the config/config.yaml settings. +# +# Example +# +# custom-scenario: # name of the scenario +# electricity: +# renewable_carriers: [wind, solar] # override the list of renewable carriers diff --git a/scripts/create_scenarios.py b/scripts/create_scenarios.py new file mode 100644 index 00000000..40a3c331 --- /dev/null +++ b/scripts/create_scenarios.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +# This script helps to generate a scenarios.yaml file for PyPSA-Eur. +# You can modify the template to your needs and define all possible combinations of config values that should be considered. + + +import itertools + +# Insert your config values that should be altered in the template. +# Change `config_section` and `config_section2` to the actual config sections. +template = """ +scenario{scenario_number}: + config_section: + config_value: {config_value} + + config_section2: + config_key2: {config_value2} +""" + +# Define all possible combinations of config values. +# This must define all config values that are used in the template. +config_values = dict(config_values=["true", "false"], config_values2=[1, 2, 3, 4, 5]) + +combinations = [ + dict(zip(config_values.keys(), values)) + for values in itertools.product(*config_values.values()) +] + +# write the scenarios to a file +filename = "../config/scenarios.yaml" +with open(filename, "w") as f: + for i, config in enumerate(combinations): + f.write(template.format(scenario_number=i, **config)) From 9d4ce430cc6abc73941ab9acebb35d9b0db919c4 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 17 Aug 2023 10:17:12 +0200 Subject: [PATCH 021/497] electricity demand: remove powerstastics flag, merge sources in retrieve_electricity_demand --- doc/configtables/load.csv | 1 - doc/retrieve.rst | 2 +- rules/build_electricity.smk | 2 +- rules/retrieve.smk | 2 +- scripts/build_electricity_demand.py | 172 ++++++++++--------------- scripts/retrieve_electricity_demand.py | 16 ++- 6 files changed, 85 insertions(+), 110 deletions(-) diff --git a/doc/configtables/load.csv b/doc/configtables/load.csv index 6e98f881..ac666947 100644 --- a/doc/configtables/load.csv +++ b/doc/configtables/load.csv @@ -1,5 +1,4 @@ ,Unit,Values,Description -power_statistics,bool,"{true, false}",Whether to load the electricity consumption data of the ENTSOE power statistics (only for files from 2019 and before) or from the ENTSOE transparency data (only has load data from 2015 onwards). interpolate_limit,hours,integer,"Maximum gap size (consecutive nans) which interpolated linearly." time_shift_for_large_gaps,string,string,"Periods which are used for copying time-slices in order to fill large gaps of nans. Have to be valid ``pandas`` period strings." manual_adjustments,bool,"{true, false}","Whether to adjust the load data manually according to the function in :func:`manual_adjustment`." diff --git a/doc/retrieve.rst b/doc/retrieve.rst index 4786581e..66c996f5 100644 --- a/doc/retrieve.rst +++ b/doc/retrieve.rst @@ -91,7 +91,7 @@ None. **Outputs** -- ``data/load_raw.csv`` +- ``data/electricity_demand.csv`` Rule ``retrieve_cost_data`` diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index b359868f..2e7a0c30 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -24,7 +24,7 @@ rule build_electricity_demand: countries=config_provider("countries"), load=config_provider("load"), input: - ancient("data/load_raw.csv"), + ancient("data/electricity_demand.csv"), output: RESOURCES + "load.csv", log: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 5af0ffb5..34e2eb7c 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -159,7 +159,7 @@ if config["enable"]["retrieve"]: params: versions=["2019-06-05", "2020-10-06"], output: - "data/load_raw.csv", + "data/electricity_demand.csv", log: "logs/retrieve_electricity_demand.log", resources: diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index 60d40e1e..3fd9d605 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -31,7 +31,7 @@ Relevant Settings Inputs ------ -- ``data/load_raw.csv``: +- ``data/electricity_demand.csv``: Outputs ------- @@ -49,7 +49,7 @@ from _helpers import configure_logging, set_scenario_config from pandas import Timedelta as Delta -def load_timeseries(fn, years, countries, powerstatistics=True): +def load_timeseries(fn, years, countries): """ Read load data from OPSD time-series package version 2020-10-06. @@ -62,10 +62,6 @@ def load_timeseries(fn, years, countries, powerstatistics=True): File name or url location (file format .csv) countries : listlike Countries for which to read load data. - powerstatistics: bool - Whether the electricity consumption data of the ENTSOE power - statistics (if true) or of the ENTSOE transparency map (if false) - should be parsed. Returns ------- @@ -74,17 +70,9 @@ def load_timeseries(fn, years, countries, powerstatistics=True): """ logger.info(f"Retrieving load data from '{fn}'.") - pattern = "power_statistics" if powerstatistics else "transparency" - pattern = f"_load_actual_entsoe_{pattern}" - - def rename(s): - return s[: -len(pattern)] - return ( pd.read_csv(fn, index_col=0, parse_dates=[0]) .tz_localize(None) - .filter(like=pattern) - .rename(columns=rename) .dropna(how="all", axis=0) .rename(columns={"GB_UKM": "GB"}) .filter(items=countries) @@ -149,17 +137,18 @@ def copy_timeslice(load, cntry, start, stop, delta, fn_load=None): ].values elif fn_load is not None: duration = pd.date_range(freq="h", start=start - delta, end=stop - delta) - load_raw = load_timeseries(fn_load, duration, [cntry], powerstatistics) + load_raw = load_timeseries(fn_load, duration, [cntry]) load.loc[start:stop, cntry] = load_raw.loc[ start - delta : stop - delta, cntry ].values -def manual_adjustment(load, fn_load, powerstatistics): +def manual_adjustment(load, fn_load): """ Adjust gaps manual for load data from OPSD time-series package. - 1. For the ENTSOE power statistics load data (if powerstatistics is True) + 1. For years later than 2015 for which the load data is mainly taken from the + ENTSOE power statistics Kosovo (KV) and Albania (AL) do not exist in the data set. Kosovo gets the same load curve as Serbia and Albania the same as Macdedonia, both scaled @@ -167,7 +156,8 @@ def manual_adjustment(load, fn_load, powerstatistics): IEA Data browser [0] for the year 2013. - 2. For the ENTSOE transparency load data (if powerstatistics is False) + 2. For years earlier than 2015 for which the load data is mainly taken from the + ENTSOE transparency platforms Albania (AL) and Macedonia (MK) do not exist in the data set. Both get the same load curve as Montenegro, scaled by the corresponding ratio of total energy @@ -183,9 +173,6 @@ def manual_adjustment(load, fn_load, powerstatistics): ---------- load : pd.DataFrame Load time-series with UTC timestamps x ISO-2 countries - powerstatistics: bool - Whether argument load comprises the electricity consumption data of - the ENTSOE power statistics or of the ENTSOE transparency map load_fn: str File name or url location (file format .csv) @@ -195,88 +182,66 @@ def manual_adjustment(load, fn_load, powerstatistics): Manual adjusted and interpolated load time-series with UTC timestamps x ISO-2 countries """ - if powerstatistics: - if "MK" in load.columns: - if "AL" not in load.columns or load.AL.isnull().values.all(): - load["AL"] = load["MK"] * (4.1 / 7.4) - if "RS" in load.columns: - if "KV" not in load.columns or load.KV.isnull().values.all(): - load["KV"] = load["RS"] * (4.8 / 27.0) + if "MK" in load: + if "AL" not in load or load.AL.isnull().values.all(): + load["AL"] = load["MK"] * (4.1 / 7.4) + if "RS" in load: + if "KV" not in load or load.KV.isnull().values.all(): + load["KV"] = load["RS"] * (4.8 / 27.0) + if "ME" in load: + if "AL" not in load and "AL" in countries: + load["AL"] = load.ME * (5.7 / 2.9) + if "MK" not in load and "MK" in countries: + load["MK"] = load.ME * (6.7 / 2.9) + if "BA" not in load and "BA" in countries: + load["BA"] = load.HR * (11.0 / 16.2) - copy_timeslice( - load, "GR", "2015-08-11 21:00", "2015-08-15 20:00", Delta(weeks=1) - ) - copy_timeslice( - load, "AT", "2018-12-31 22:00", "2019-01-01 22:00", Delta(days=2) - ) - copy_timeslice( - load, "CH", "2010-01-19 07:00", "2010-01-19 22:00", Delta(days=1) - ) - copy_timeslice( - load, "CH", "2010-03-28 00:00", "2010-03-28 21:00", Delta(days=1) - ) - # is a WE, so take WE before - copy_timeslice( - load, "CH", "2010-10-08 13:00", "2010-10-10 21:00", Delta(weeks=1) - ) - copy_timeslice( - load, "CH", "2010-11-04 04:00", "2010-11-04 22:00", Delta(days=1) - ) - copy_timeslice( - load, "NO", "2010-12-09 11:00", "2010-12-09 18:00", Delta(days=1) - ) - # whole january missing - copy_timeslice( - load, - "GB", - "2010-01-01 00:00", - "2010-01-31 23:00", - Delta(days=-365), - fn_load, - ) - # 1.1. at midnight gets special treatment - copy_timeslice( - load, - "IE", - "2016-01-01 00:00", - "2016-01-01 01:00", - Delta(days=-366), - fn_load, - ) - copy_timeslice( - load, - "PT", - "2016-01-01 00:00", - "2016-01-01 01:00", - Delta(days=-366), - fn_load, - ) - copy_timeslice( - load, - "GB", - "2016-01-01 00:00", - "2016-01-01 01:00", - Delta(days=-366), - fn_load, - ) + copy_timeslice(load, "GR", "2015-08-11 21:00", "2015-08-15 20:00", Delta(weeks=1)) + copy_timeslice(load, "AT", "2018-12-31 22:00", "2019-01-01 22:00", Delta(days=2)) + copy_timeslice(load, "CH", "2010-01-19 07:00", "2010-01-19 22:00", Delta(days=1)) + copy_timeslice(load, "CH", "2010-03-28 00:00", "2010-03-28 21:00", Delta(days=1)) + # is a WE, so take WE before + copy_timeslice(load, "CH", "2010-10-08 13:00", "2010-10-10 21:00", Delta(weeks=1)) + copy_timeslice(load, "CH", "2010-11-04 04:00", "2010-11-04 22:00", Delta(days=1)) + copy_timeslice(load, "NO", "2010-12-09 11:00", "2010-12-09 18:00", Delta(days=1)) + # whole january missing + copy_timeslice( + load, + "GB", + "2010-01-01 00:00", + "2010-01-31 23:00", + Delta(days=-365), + fn_load, + ) + # 1.1. at midnight gets special treatment + copy_timeslice( + load, + "IE", + "2016-01-01 00:00", + "2016-01-01 01:00", + Delta(days=-366), + fn_load, + ) + copy_timeslice( + load, + "PT", + "2016-01-01 00:00", + "2016-01-01 01:00", + Delta(days=-366), + fn_load, + ) + copy_timeslice( + load, + "GB", + "2016-01-01 00:00", + "2016-01-01 01:00", + Delta(days=-366), + fn_load, + ) - else: - if "ME" in load: - if "AL" not in load and "AL" in countries: - load["AL"] = load.ME * (5.7 / 2.9) - if "MK" not in load and "MK" in countries: - load["MK"] = load.ME * (6.7 / 2.9) - if "BA" not in load and "BA" in countries: - load["BA"] = load.HR * (11.0 / 16.2) - copy_timeslice( - load, "BG", "2018-10-27 21:00", "2018-10-28 22:00", Delta(weeks=1) - ) - copy_timeslice( - load, "LU", "2019-01-02 11:00", "2019-01-05 05:00", Delta(weeks=-1) - ) - copy_timeslice( - load, "LU", "2019-02-05 20:00", "2019-02-06 19:00", Delta(weeks=-1) - ) + copy_timeslice(load, "BG", "2018-10-27 21:00", "2018-10-28 22:00", Delta(weeks=1)) + copy_timeslice(load, "LU", "2019-01-02 11:00", "2019-01-05 05:00", Delta(weeks=-1)) + copy_timeslice(load, "LU", "2019-02-05 20:00", "2019-02-06 19:00", Delta(weeks=-1)) return load @@ -290,17 +255,16 @@ if __name__ == "__main__": configure_logging(snakemake) set_scenario_config(snakemake) - powerstatistics = snakemake.params.load["power_statistics"] interpolate_limit = snakemake.params.load["interpolate_limit"] countries = snakemake.params.countries snapshots = pd.date_range(freq="h", **snakemake.params.snapshots) years = slice(snapshots[0], snapshots[-1]) time_shift = snakemake.params.load["time_shift_for_large_gaps"] - load = load_timeseries(snakemake.input[0], years, countries, powerstatistics) + load = load_timeseries(snakemake.input[0], years, countries) if snakemake.params.load["manual_adjustments"]: - load = manual_adjustment(load, snakemake.input[0], powerstatistics) + load = manual_adjustment(load, snakemake.input[0]) if load.empty: logger.warning("Build electricity demand time series is empty.") diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py index 58511857..01dc4aa8 100644 --- a/scripts/retrieve_electricity_demand.py +++ b/scripts/retrieve_electricity_demand.py @@ -20,7 +20,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("retrieve_eletricity_demand") + snakemake = mock_snakemake("retrieve_electricity_demand") rootpath = ".." else: rootpath = "." @@ -33,5 +33,17 @@ if __name__ == "__main__": pd.read_csv(url.format(version=version), index_col=0) for version in snakemake.params.versions ] - res = pd.concat([df1, df2[df2.index > df1.index[-1]]], join="inner") + combined = pd.concat([df1, df2[df2.index > df1.index[-1]]]) + + pattern = "_load_actual_entsoe_transparency" + transparency = combined.filter(like=pattern).rename( + columns=lambda x: x.replace(pattern, "") + ) + pattern = "_load_actual_entsoe_power_statistics" + powerstatistics = combined.filter(like=pattern).rename( + columns=lambda x: x.replace(pattern, "") + ) + + res = transparency.fillna(powerstatistics) + res.to_csv(snakemake.output[0]) From 91eff472a7748dc617d19cd9ad788bf81144c356 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 17 Aug 2023 12:31:07 +0200 Subject: [PATCH 022/497] scenario-management: fix set_scenario_config function; apply config_provider to some direct inputs --- rules/build_electricity.smk | 8 ++++---- scripts/_helpers.py | 8 +++++--- scripts/base_network.py | 2 +- scripts/build_electricity_demand.py | 32 ++++++++++++++++------------- scripts/build_renewable_profiles.py | 4 +++- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 2e7a0c30..5f44d2ef 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -214,19 +214,19 @@ rule build_renewable_profiles: corine=ancient("data/bundle/corine/g250_clc06_V18_5.tif"), natura=lambda w: ( RESOURCES + "natura.tiff" - if config["renewable"][w.technology]["natura"] + if config_provider("renewable", w.technology, "natura")(w) else [] ), gebco=ancient( lambda w: ( "data/bundle/GEBCO_2014_2D.nc" - if config["renewable"][w.technology].get("max_depth") + if config_provider("renewable", w.technology)(w).get("max_depth") else [] ) ), ship_density=lambda w: ( RESOURCES + "shipdensity_raster.tif" - if "ship_threshold" in config["renewable"][w.technology].keys() + if "ship_threshold" in config_provider("renewable", w.technology)(w).keys() else [] ), country_shapes=RESOURCES + "country_shapes.geojson", @@ -238,7 +238,7 @@ rule build_renewable_profiles: ), cutout=lambda w: "cutouts/" + CDIR - + config["renewable"][w.technology]["cutout"] + + config_provider("renewable", w.technology, "cutout")(w) + ".nc", output: profile=RESOURCES + "profile_{technology}.nc", diff --git a/scripts/_helpers.py b/scripts/_helpers.py index c66d708e..7a356a44 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -31,10 +31,12 @@ def mute_print(): def set_scenario_config(snakemake): - if "scenario_config" in snakemake.input: - with open(snakemake.input.scenario_config, "r") as f: + if snakemake.config["run"]["scenarios"]: + script_dir = Path(__file__).parent.resolve() + root_dir = script_dir.parent + with open(root_dir / snakemake.config["scenariofile"], "r") as f: scenario_config = yaml.safe_load(f) - update_config(snakemake.config, scenario_config) + update_config(snakemake.config, scenario_config[snakemake.wildcards.run]) def configure_logging(snakemake, skip_handlers=False): diff --git a/scripts/base_network.py b/scripts/base_network.py index b5304109..32b54d28 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -743,7 +743,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("base_network") + snakemake = mock_snakemake("base_network", run="network2019") configure_logging(snakemake) set_scenario_config(snakemake) diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index 3fd9d605..376af247 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -68,8 +68,6 @@ def load_timeseries(fn, years, countries): load : pd.DataFrame Load time-series with UTC timestamps x ISO-2 countries """ - logger.info(f"Retrieving load data from '{fn}'.") - return ( pd.read_csv(fn, index_col=0, parse_dates=[0]) .tz_localize(None) @@ -182,20 +180,26 @@ def manual_adjustment(load, fn_load): Manual adjusted and interpolated load time-series with UTC timestamps x ISO-2 countries """ - if "MK" in load: - if "AL" not in load or load.AL.isnull().values.all(): - load["AL"] = load["MK"] * (4.1 / 7.4) - if "RS" in load: - if "KV" not in load or load.KV.isnull().values.all(): - load["KV"] = load["RS"] * (4.8 / 27.0) - if "ME" in load: - if "AL" not in load and "AL" in countries: + + if "AL" not in load and "AL" in countries: + if "ME" in load: load["AL"] = load.ME * (5.7 / 2.9) - if "MK" not in load and "MK" in countries: - load["MK"] = load.ME * (6.7 / 2.9) - if "BA" not in load and "BA" in countries: + elif "MK" in load: + load["AL"] = load["MK"] * (4.1 / 7.4) + + if "MK" in countries: + if "MK" not in load or load.MK.isnull().sum() > len(load) / 2: + if "ME" in load: + load["MK"] = load.ME * (6.7 / 2.9) + + if "BA" not in load and "BA" in countries: + if "ME" in load: load["BA"] = load.HR * (11.0 / 16.2) + if "KV" not in load or load.KV.isnull().values.all(): + if "RS" in load: + load["KV"] = load["RS"] * (4.8 / 27.0) + copy_timeslice(load, "GR", "2015-08-11 21:00", "2015-08-15 20:00", Delta(weeks=1)) copy_timeslice(load, "AT", "2018-12-31 22:00", "2019-01-01 22:00", Delta(days=2)) copy_timeslice(load, "CH", "2010-01-19 07:00", "2010-01-19 22:00", Delta(days=1)) @@ -250,7 +254,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_electricity_demand") + snakemake = mock_snakemake("build_electricity_demand", run="network2019") configure_logging(snakemake) set_scenario_config(snakemake) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 40b3151d..c6d42e6b 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -200,7 +200,9 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_renewable_profiles", technology="solar") + snakemake = mock_snakemake( + "build_renewable_profiles", technology="solar", run="network2019" + ) configure_logging(snakemake) set_scenario_config(snakemake) From ebb5da655ef8627d534e1995df18fdeac93b54b2 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 17 Aug 2023 12:56:34 +0200 Subject: [PATCH 023/497] scenarios: add collect function plot_elec_networks --- rules/collect.smk | 10 ++++++++++ scripts/plot_statistics.py | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rules/collect.smk b/rules/collect.smk index 8a64b577..70dc4641 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -76,6 +76,16 @@ rule solve_sector_networks: ), +rule plot_elec_networks: + input: + expand( + RESULTS + + "figures/.statistics_plots_elec_s{simpl}_{clusters}_ec_l{ll}_{opts}", + **config["scenario"], + run=config["run"]["name"] + ), + + rule plot_networks: input: expand( diff --git a/scripts/plot_statistics.py b/scripts/plot_statistics.py index a0a3e71d..11293c08 100644 --- a/scripts/plot_statistics.py +++ b/scripts/plot_statistics.py @@ -61,7 +61,7 @@ if __name__ == "__main__": fig, ax = plt.subplots() ds = n.statistics.installed_capacity().dropna() ds = ds.drop("Line") - ds = ds.drop(("Generator", "Load")) + ds = ds.drop(("Generator", "Load"), errors="ignore") ds = ds / 1e3 ds.attrs["unit"] = "GW" plot_static_per_carrier(ds, ax) @@ -70,7 +70,7 @@ if __name__ == "__main__": fig, ax = plt.subplots() ds = n.statistics.optimal_capacity() ds = ds.drop("Line") - ds = ds.drop(("Generator", "Load")) + ds = ds.drop(("Generator", "Load"), errors="ignore") ds = ds / 1e3 ds.attrs["unit"] = "GW" plot_static_per_carrier(ds, ax) From 1810bbd4b3243ffbf516ccaa58fe5b92adf463d1 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 21 Aug 2023 12:24:27 +0200 Subject: [PATCH 024/497] make set_scenario_config robust against mock_snakemake and subworkflow --- scripts/_helpers.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 7a356a44..b41ed60d 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -31,11 +31,16 @@ def mute_print(): def set_scenario_config(snakemake): - if snakemake.config["run"]["scenarios"]: - script_dir = Path(__file__).parent.resolve() - root_dir = script_dir.parent - with open(root_dir / snakemake.config["scenariofile"], "r") as f: - scenario_config = yaml.safe_load(f) + if snakemake.config["run"]["scenarios"] and "run" in snakemake.wildcards: + try: + with open(snakemake.config["scenariofile"], "r") as f: + scenario_config = yaml.safe_load(f) + except FileNotFoundError: + # fallback for mock_snakemake + script_dir = Path(__file__).parent.resolve() + root_dir = script_dir.parent + with open(root_dir / snakemake.config["scenariofile"], "r") as f: + scenario_config = yaml.safe_load(f) update_config(snakemake.config, scenario_config[snakemake.wildcards.run]) From 7b9ab155f47f156f2900b711e9a6ebd893a512c0 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 22 Aug 2023 18:15:50 +0200 Subject: [PATCH 025/497] helpers: fix condition in set_scenario_config prepare_sector: insert set_scenario_config --- scripts/_helpers.py | 2 +- scripts/prepare_sector_network.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index b41ed60d..3951be18 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -31,7 +31,7 @@ def mute_print(): def set_scenario_config(snakemake): - if snakemake.config["run"]["scenarios"] and "run" in snakemake.wildcards: + if snakemake.config["run"]["scenarios"] and "run" in snakemake.wildcards.keys(): try: with open(snakemake.config["scenariofile"], "r") as f: scenario_config = yaml.safe_load(f) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 0c1faacc..1ee42a72 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -17,7 +17,12 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import generate_periodic_profiles, update_config_with_sector_opts +from _helpers import ( + configure_logging, + generate_periodic_profiles, + set_scenario_config, + update_config_with_sector_opts, +) from add_electricity import calculate_annuity, sanitize_carriers from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement @@ -3286,6 +3291,7 @@ if __name__ == "__main__": ) logging.basicConfig(level=snakemake.config["logging"]["level"]) + set_scenario_config(snakemake) update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) From 62c61438636494a9dc2a917e1706ae0df25e2d8c Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 23 Aug 2023 17:14:57 +0200 Subject: [PATCH 026/497] scenario-management: reenable shared resources, make shared resources wildcards dependent --- .github/workflows/ci.yaml | 2 +- Snakefile | 26 +- config/config.default.yaml | 5 +- config/scenarios.yaml | 26 + config/test/config.scenarios.electricity.yaml | 7 +- doc/configtables/run.csv | 8 +- doc/configtables/toplevel.csv | 1 - rules/build_electricity.smk | 184 +++---- rules/build_sector.smk | 483 ++++++++++-------- rules/collect.smk | 6 +- rules/common.smk | 4 +- rules/postprocess.smk | 2 +- rules/retrieve.smk | 4 +- rules/solve_electricity.smk | 2 +- rules/solve_myopic.smk | 16 +- rules/solve_overnight.smk | 3 +- rules/validate.smk | 20 +- scripts/__init__.py | 4 + scripts/_helpers.py | 47 +- 19 files changed, 479 insertions(+), 371 deletions(-) create mode 100644 scripts/__init__.py diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 68bffc4c..6cbee85c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,7 +83,7 @@ jobs: snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime - snakemake -call solve_elec_networks --configfile config/test/config.scenarios.electricity.yaml -n + snakemake -call solve_elec_networks --configfile config/test/config.scenarios.electricity.yaml - name: Upload artifacts uses: actions/upload-artifact@v3 diff --git a/Snakefile b/Snakefile index e495e7d3..55b90d5d 100644 --- a/Snakefile +++ b/Snakefile @@ -8,6 +8,7 @@ from pathlib import Path import yaml from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider from snakemake.utils import min_version +from scripts._helpers import path_provider min_version("7.7") HTTP = HTTPRemoteProvider() @@ -24,20 +25,23 @@ COSTS = f"data/costs_{config['costs']['year']}.csv" ATLITE_NPROCESSES = config["atlite"].get("nprocesses", 4) run = config["run"] -if run.get("scenarios", False): - if run["shared_resources"]: - raise ValueError("Cannot use shared resources with scenarios") - scenarios = yaml.safe_load(Path(config["scenariofile"]).read_text()) +scenario = run.get("scenario", {}) +if run["name"]: + if scenario.get("enable"): + fn = Path(scenario["file"]) + scenarios = yaml.safe_load(fn.read_text()) RDIR = "{run}/" -elif run["name"]: - RDIR = run["name"] + "/" else: RDIR = "" -CDIR = RDIR if not run.get("shared_cutouts") else "" +# for possibly shared resources +logs = path_provider("logs/", RDIR, run["shared_resources"]) +benchmarks = path_provider("benchmarks/", RDIR, run["shared_resources"]) +resources = path_provider("resources/", RDIR, run["shared_resources"]) + +CDIR = "" if run["shared_cutouts"] else RDIR LOGS = "logs/" + RDIR BENCHMARKS = "benchmarks/" + RDIR -RESOURCES = "resources/" + RDIR if not run.get("shared_resources") else "resources/" RESULTS = "results/" + RDIR @@ -86,9 +90,9 @@ rule dag: message: "Creating DAG of workflow." output: - dot=RESOURCES + "dag.dot", - pdf=RESOURCES + "dag.pdf", - png=RESOURCES + "dag.png", + dot=resources("dag.dot"), + pdf=resources("dag.pdf"), + png=resources("dag.png"), conda: "envs/environment.yaml" shell: diff --git a/config/config.default.yaml b/config/config.default.yaml index 5357db8d..238c3d41 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -5,7 +5,6 @@ # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#top-level-configuration version: 0.8.1 tutorial: false -scenariofile: config/scenarios.yaml logging: level: INFO @@ -22,7 +21,9 @@ remote: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#run run: name: "" - scenarios: false + scenarios: + enable: false + file: config/scenarios.yaml disable_progressbar: false shared_resources: false shared_cutouts: true diff --git a/config/scenarios.yaml b/config/scenarios.yaml index 37d32243..c493311f 100644 --- a/config/scenarios.yaml +++ b/config/scenarios.yaml @@ -10,3 +10,29 @@ # custom-scenario: # name of the scenario # electricity: # renewable_carriers: [wind, solar] # override the list of renewable carriers + + +network2013: + snapshots: + start: "2013-01-01" + end: "2014-01-01" + inclusive: 'left' + + +network2019: + snapshots: + start: "2019-01-01" + end: "2020-01-01" + inclusive: 'left' + + renewable: + onwind: + cutout: europe-2019-era5 + offwind-ac: + cutout: europe-2019-era5 + offwind-dc: + cutout: europe-2019-era5 + solar: + cutout: europe-2019-era5 + hydro: + cutout: europe-2019-era5 diff --git a/config/test/config.scenarios.electricity.yaml b/config/test/config.scenarios.electricity.yaml index 0e4ced04..63b1892b 100644 --- a/config/test/config.scenarios.electricity.yaml +++ b/config/test/config.scenarios.electricity.yaml @@ -3,15 +3,16 @@ # SPDX-License-Identifier: CC0-1.0 tutorial: true -scenariofile: "config/test/scenarios.electricity.yaml" run: name: - test-elec-no-offshore-wind - test-elec-no-onshore-wind - scenarios: true + scenario: + enable: true + file: "config/test/scenarios.electricity.yaml" disable_progressbar: true - shared_resources: false # cannot be true if scenarios is true + shared_resources: base shared_cutouts: true scenario: diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index 2d5cf5d9..3d8e4e8c 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -1,6 +1,8 @@ ,Unit,Values,Description -name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenarios`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenariofile``." -scenarios,--,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``scenariofile``." +name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenario: enable`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenario: file``." +scenario,,, +-- enable,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``file``." +-- file,str,,Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``create_scenarios.py`` script in ``scripts``. disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." -shared_resources,bool,"{true, false}","Switch to select whether resources should be shared across runs." +shared_resources,bool/str,,"Switch to select whether resources should be shared across runs. If a string is passed, it is assumed to be a wildcard or 'base' that indicates the cutoff after which resources are no longer shared. If 'base' is passed, resources before creating the elec.nc file are shared." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." diff --git a/doc/configtables/toplevel.csv b/doc/configtables/toplevel.csv index 8cbb3e56..67954389 100644 --- a/doc/configtables/toplevel.csv +++ b/doc/configtables/toplevel.csv @@ -1,7 +1,6 @@ ,Unit,Values,Description version,--,0.x.x,Version of PyPSA-Eur. Descriptive only. tutorial,bool,"{true, false}",Switch to retrieve the tutorial data set instead of the full data set. -scenariofile,str,,Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``create_scenarios.py`` script in ``scripts``. logging,,, -- level,--,"Any of {'INFO', 'WARNING', 'ERROR'}","Restrict console outputs to all infos, warning or errors only" -- format,--,,Custom format for log messages. See `LogRecord `_ attributes. diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 5f44d2ef..be72be6d 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -8,7 +8,7 @@ if config["enable"].get("prepare_links_p_nom", False): output: "data/links_p_nom.csv", log: - LOGS + "prepare_links_p_nom.log", + logs("prepare_links_p_nom.log"), threads: 1 resources: mem_mb=1500, @@ -26,9 +26,9 @@ rule build_electricity_demand: input: ancient("data/electricity_demand.csv"), output: - RESOURCES + "load.csv", + resources("load.csv"), log: - LOGS + "build_electricity_demand.log", + logs("build_electricity_demand.log"), resources: mem_mb=5000, conda: @@ -43,12 +43,12 @@ rule build_powerplants: custom_powerplants=config_provider("electricity", "custom_powerplants"), countries=config_provider("countries"), input: - base_network=RESOURCES + "networks/base.nc", + base_network=resources("networks/base.nc"), custom_powerplants="data/custom_powerplants.csv", output: - RESOURCES + "powerplants.csv", + resources("powerplants.csv"), log: - LOGS + "build_powerplants.log", + logs("build_powerplants.log"), threads: 1 resources: mem_mb=5000, @@ -74,15 +74,15 @@ rule base_network: parameter_corrections="data/parameter_corrections.yaml", links_p_nom="data/links_p_nom.csv", links_tyndp="data/links_tyndp.csv", - country_shapes=RESOURCES + "country_shapes.geojson", - offshore_shapes=RESOURCES + "offshore_shapes.geojson", - europe_shape=RESOURCES + "europe_shape.geojson", + country_shapes=resources("country_shapes.geojson"), + offshore_shapes=resources("offshore_shapes.geojson"), + europe_shape=resources("europe_shape.geojson"), output: - RESOURCES + "networks/base.nc", + resources("networks/base.nc"), log: - LOGS + "base_network.log", + logs("base_network.log"), benchmark: - BENCHMARKS + "base_network" + benchmarks("base_network") threads: 1 resources: mem_mb=1500, @@ -104,12 +104,12 @@ rule build_shapes: ch_cantons=ancient("data/bundle/ch_cantons.csv"), ch_popgdp=ancient("data/bundle/je-e-21.03.02.xls"), output: - country_shapes=RESOURCES + "country_shapes.geojson", - offshore_shapes=RESOURCES + "offshore_shapes.geojson", - europe_shape=RESOURCES + "europe_shape.geojson", - nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", + country_shapes=resources("country_shapes.geojson"), + offshore_shapes=resources("offshore_shapes.geojson"), + europe_shape=resources("europe_shape.geojson"), + nuts3_shapes=resources("nuts3_shapes.geojson"), log: - LOGS + "build_shapes.log", + logs("build_shapes.log"), threads: 1 resources: mem_mb=1500, @@ -123,14 +123,14 @@ rule build_bus_regions: params: countries=config_provider("countries"), input: - country_shapes=RESOURCES + "country_shapes.geojson", - offshore_shapes=RESOURCES + "offshore_shapes.geojson", - base_network=RESOURCES + "networks/base.nc", + country_shapes=resources("country_shapes.geojson"), + offshore_shapes=resources("offshore_shapes.geojson"), + base_network=resources("networks/base.nc"), output: - regions_onshore=RESOURCES + "regions_onshore.geojson", - regions_offshore=RESOURCES + "regions_offshore.geojson", + regions_onshore=resources("regions_onshore.geojson"), + regions_offshore=resources("regions_offshore.geojson"), log: - LOGS + "build_bus_regions.log", + logs("build_bus_regions.log"), threads: 1 resources: mem_mb=1000, @@ -147,8 +147,8 @@ if config["enable"].get("build_cutout", False): snapshots=config_provider("snapshots"), cutouts=config_provider("atlite", "cutouts"), input: - regions_onshore=RESOURCES + "regions_onshore.geojson", - regions_offshore=RESOURCES + "regions_offshore.geojson", + regions_onshore=resources("regions_onshore.geojson"), + regions_offshore=resources("regions_offshore.geojson"), output: protected("cutouts/" + CDIR + "{cutout}.nc"), log: @@ -171,11 +171,11 @@ if config["enable"].get("build_natura_raster", False): natura=ancient("data/bundle/natura/Natura2000_end2015.shp"), cutouts=expand("cutouts/" + CDIR + "{cutouts}.nc", **config["atlite"]), output: - RESOURCES + "natura.tiff", + resources("natura.tiff"), resources: mem_mb=5000, log: - LOGS + "build_natura_raster.log", + logs("build_natura_raster.log"), conda: "../envs/environment.yaml" script: @@ -193,13 +193,13 @@ rule build_ship_raster: ], ), output: - RESOURCES + "shipdensity_raster.tif", + resources("shipdensity_raster.tif"), log: - LOGS + "build_ship_raster.log", + logs("build_ship_raster.log"), resources: mem_mb=5000, benchmark: - BENCHMARKS + "build_ship_raster" + benchmarks("build_ship_raster") conda: "../envs/environment.yaml" script: @@ -210,10 +210,10 @@ rule build_renewable_profiles: params: renewable=config_provider("renewable"), input: - base_network=RESOURCES + "networks/base.nc", + base_network=resources("networks/base.nc"), corine=ancient("data/bundle/corine/g250_clc06_V18_5.tif"), natura=lambda w: ( - RESOURCES + "natura.tiff" + resources("natura.tiff") if config_provider("renewable", w.technology, "natura")(w) else [] ), @@ -225,27 +225,27 @@ rule build_renewable_profiles: ) ), ship_density=lambda w: ( - RESOURCES + "shipdensity_raster.tif" + resources("shipdensity_raster.tif") if "ship_threshold" in config_provider("renewable", w.technology)(w).keys() else [] ), - country_shapes=RESOURCES + "country_shapes.geojson", - offshore_shapes=RESOURCES + "offshore_shapes.geojson", + country_shapes=resources("country_shapes.geojson"), + offshore_shapes=resources("offshore_shapes.geojson"), regions=lambda w: ( - RESOURCES + "regions_onshore.geojson" + resources("regions_onshore.geojson") if w.technology in ("onwind", "solar") - else RESOURCES + "regions_offshore.geojson" + else resources("regions_offshore.geojson") ), cutout=lambda w: "cutouts/" + CDIR + config_provider("renewable", w.technology, "cutout")(w) + ".nc", output: - profile=RESOURCES + "profile_{technology}.nc", + profile=resources("profile_{technology}.nc"), log: - LOGS + "build_renewable_profile_{technology}.log", + logs("build_renewable_profile_{technology}.log"), benchmark: - BENCHMARKS + "build_renewable_profiles_{technology}" + benchmarks("build_renewable_profiles_{technology}") threads: ATLITE_NPROCESSES resources: mem_mb=ATLITE_NPROCESSES * 5000, @@ -262,10 +262,10 @@ rule build_monthly_prices: co2_price_raw="data/validation/emission-spot-primary-market-auction-report-2019-data.xls", fuel_price_raw="data/validation/energy-price-trends-xlsx-5619002.xlsx", output: - co2_price=RESOURCES + "co2_price.csv", - fuel_price=RESOURCES + "monthly_fuel_price.csv", + co2_price=resources("co2_price.csv"), + fuel_price=resources("monthly_fuel_price.csv"), log: - LOGS + "build_monthly_prices.log", + logs("build_monthly_prices.log"), threads: 1 resources: mem_mb=5000, @@ -280,13 +280,13 @@ rule build_hydro_profile: hydro=config_provider("renewable", "hydro"), countries=config_provider("countries"), input: - country_shapes=RESOURCES + "country_shapes.geojson", + country_shapes=resources("country_shapes.geojson"), eia_hydro_generation="data/eia_hydro_annual_generation.csv", cutout=f"cutouts/" + CDIR + config["renewable"]["hydro"]["cutout"] + ".nc", output: - RESOURCES + "profile_hydro.nc", + resources("profile_hydro.nc"), log: - LOGS + "build_hydro_profile.log", + logs("build_hydro_profile.log"), resources: mem_mb=5000, conda: @@ -299,17 +299,17 @@ if config["lines"]["dynamic_line_rating"]["activate"]: rule build_line_rating: input: - base_network=RESOURCES + "networks/base.nc", + base_network=resources("networks/base.nc"), cutout="cutouts/" + CDIR + config["lines"]["dynamic_line_rating"]["cutout"] + ".nc", output: - output=RESOURCES + "networks/line_rating.nc", + output=resources("networks/line_rating.nc"), log: - LOGS + "build_line_rating.log", + logs("build_line_rating.log"), benchmark: - BENCHMARKS + "build_line_rating" + benchmarks("build_line_rating") threads: ATLITE_NPROCESSES resources: mem_mb=ATLITE_NPROCESSES * 1000, @@ -330,7 +330,7 @@ rule add_electricity: costs=config_provider("costs"), input: **{ - f"profile_{tech}": RESOURCES + f"profile_{tech}.nc" + f"profile_{tech}": resources(f"profile_{tech}.nc") for tech in config["electricity"]["renewable_carriers"] }, **{ @@ -340,27 +340,27 @@ rule add_electricity: for attr, fn in d.items() if str(fn).startswith("data/") }, - base_network=RESOURCES + "networks/base.nc", - line_rating=RESOURCES + "networks/line_rating.nc" + base_network=resources("networks/base.nc"), + line_rating=resources("networks/line_rating.nc") if config["lines"]["dynamic_line_rating"]["activate"] - else RESOURCES + "networks/base.nc", + else resources("networks/base.nc"), tech_costs=COSTS, - regions=RESOURCES + "regions_onshore.geojson", - powerplants=RESOURCES + "powerplants.csv", + regions=resources("regions_onshore.geojson"), + powerplants=resources("powerplants.csv"), hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), geth_hydro_capacities="data/geth2015_hydro_capacities.csv", unit_commitment="data/unit_commitment.csv", - fuel_price=RESOURCES + "monthly_fuel_price.csv" + fuel_price=resources("monthly_fuel_price.csv") if config["conventional"]["dynamic_fuel_price"] else [], - load=RESOURCES + "load.csv", - nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", + load=resources("load.csv"), + nuts3_shapes=resources("nuts3_shapes.geojson"), output: - RESOURCES + "networks/elec.nc", + resources("networks/elec.nc"), log: - LOGS + "add_electricity.log", + logs("add_electricity.log"), benchmark: - BENCHMARKS + "add_electricity" + benchmarks("add_electricity") threads: 1 resources: mem_mb=10000, @@ -383,20 +383,20 @@ rule simplify_network: p_max_pu=config_provider("links", "p_max_pu", default=1.0), costs=config_provider("costs"), input: - network=RESOURCES + "networks/elec.nc", + network=resources("networks/elec.nc"), tech_costs=COSTS, - regions_onshore=RESOURCES + "regions_onshore.geojson", - regions_offshore=RESOURCES + "regions_offshore.geojson", + regions_onshore=resources("regions_onshore.geojson"), + regions_offshore=resources("regions_offshore.geojson"), output: - network=RESOURCES + "networks/elec_s{simpl}.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}.geojson", - regions_offshore=RESOURCES + "regions_offshore_elec_s{simpl}.geojson", - busmap=RESOURCES + "busmap_elec_s{simpl}.csv", - connection_costs=RESOURCES + "connection_costs_s{simpl}.csv", + network=resources("networks/elec_s{simpl}.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"), + regions_offshore=resources("regions_offshore_elec_s{simpl}.geojson"), + busmap=resources("busmap_elec_s{simpl}.csv"), + connection_costs=resources("connection_costs_s{simpl}.csv"), log: - LOGS + "simplify_network/elec_s{simpl}.log", + logs("simplify_network/elec_s{simpl}.log"), benchmark: - BENCHMARKS + "simplify_network/elec_s{simpl}" + benchmarks("simplify_network/elec_s{simpl}") threads: 1 resources: mem_mb=12000, @@ -422,10 +422,10 @@ rule cluster_network: length_factor=config_provider("lines", "length_factor"), costs=config_provider("costs"), input: - network=RESOURCES + "networks/elec_s{simpl}.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}.geojson", - regions_offshore=RESOURCES + "regions_offshore_elec_s{simpl}.geojson", - busmap=ancient(RESOURCES + "busmap_elec_s{simpl}.csv"), + network=resources("networks/elec_s{simpl}.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"), + regions_offshore=resources("regions_offshore_elec_s{simpl}.geojson"), + busmap=ancient(resources("busmap_elec_s{simpl}.csv")), custom_busmap=( "data/custom_busmap_elec_s{simpl}_{clusters}.csv" if config["enable"].get("custom_busmap", False) @@ -433,15 +433,15 @@ rule cluster_network: ), tech_costs=COSTS, output: - network=RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES + "regions_offshore_elec_s{simpl}_{clusters}.geojson", - busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", - linemap=RESOURCES + "linemap_elec_s{simpl}_{clusters}.csv", + network=resources("networks/elec_s{simpl}_{clusters}.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), + regions_offshore=resources("regions_offshore_elec_s{simpl}_{clusters}.geojson"), + busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), + linemap=resources("linemap_elec_s{simpl}_{clusters}.csv"), log: - LOGS + "cluster_network/elec_s{simpl}_{clusters}.log", + logs("cluster_network/elec_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "cluster_network/elec_s{simpl}_{clusters}" + benchmarks("cluster_network/elec_s{simpl}_{clusters}") threads: 1 resources: mem_mb=10000, @@ -457,14 +457,14 @@ rule add_extra_components: max_hours=config_provider("electricity", "max_hours"), costs=config_provider("costs"), input: - network=RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", + network=resources("networks/elec_s{simpl}_{clusters}.nc"), tech_costs=COSTS, output: - RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", + resources("networks/elec_s{simpl}_{clusters}_ec.nc"), log: - LOGS + "add_extra_components/elec_s{simpl}_{clusters}.log", + logs("add_extra_components/elec_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "add_extra_components/elec_s{simpl}_{clusters}_ec" + benchmarks("add_extra_components/elec_s{simpl}_{clusters}_ec") threads: 1 resources: mem_mb=4000, @@ -484,15 +484,15 @@ rule prepare_network: max_hours=config_provider("electricity", "max_hours"), costs=config_provider("costs"), input: - RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", + resources("networks/elec_s{simpl}_{clusters}_ec.nc"), tech_costs=COSTS, - co2_price=RESOURCES + "co2_price.csv", + co2_price=resources("co2_price.csv"), output: - RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", + resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), log: - LOGS + "prepare_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.log", + logs("prepare_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.log"), benchmark: - (BENCHMARKS + "prepare_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}") + (benchmarks("prepare_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}")) threads: 1 resources: mem_mb=4000, diff --git a/rules/build_sector.smk b/rules/build_sector.smk index cc80ab64..483dcdb7 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -5,19 +5,19 @@ rule build_population_layouts: input: - nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", + nuts3_shapes=resources("nuts3_shapes.geojson"), urban_percent="data/urban_percent.csv", cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", output: - pop_layout_total=RESOURCES + "pop_layout_total.nc", - pop_layout_urban=RESOURCES + "pop_layout_urban.nc", - pop_layout_rural=RESOURCES + "pop_layout_rural.nc", + pop_layout_total=resources("pop_layout_total.nc"), + pop_layout_urban=resources("pop_layout_urban.nc"), + pop_layout_rural=resources("pop_layout_rural.nc"), log: - LOGS + "build_population_layouts.log", + logs("build_population_layouts.log"), resources: mem_mb=20000, benchmark: - BENCHMARKS + "build_population_layouts" + benchmarks("build_population_layouts") threads: 8 conda: "../envs/environment.yaml" @@ -27,19 +27,19 @@ rule build_population_layouts: rule build_clustered_population_layouts: input: - pop_layout_total=RESOURCES + "pop_layout_total.nc", - pop_layout_urban=RESOURCES + "pop_layout_urban.nc", - pop_layout_rural=RESOURCES + "pop_layout_rural.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + pop_layout_total=resources("pop_layout_total.nc"), + pop_layout_urban=resources("pop_layout_urban.nc"), + pop_layout_rural=resources("pop_layout_rural.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", output: - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), log: - LOGS + "build_clustered_population_layouts_{simpl}_{clusters}.log", + logs("build_clustered_population_layouts_{simpl}_{clusters}.log"), resources: mem_mb=10000, benchmark: - BENCHMARKS + "build_clustered_population_layouts/s{simpl}_{clusters}" + benchmarks("build_clustered_population_layouts/s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -48,19 +48,19 @@ rule build_clustered_population_layouts: rule build_simplified_population_layouts: input: - pop_layout_total=RESOURCES + "pop_layout_total.nc", - pop_layout_urban=RESOURCES + "pop_layout_urban.nc", - pop_layout_rural=RESOURCES + "pop_layout_rural.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}.geojson", + pop_layout_total=resources("pop_layout_total.nc"), + pop_layout_urban=resources("pop_layout_urban.nc"), + pop_layout_rural=resources("pop_layout_rural.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"), cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", output: - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}.csv", + clustered_pop_layout=resources("pop_layout_elec_s{simpl}.csv"), resources: mem_mb=10000, log: - LOGS + "build_simplified_population_layouts_{simpl}", + logs("build_simplified_population_layouts_{simpl}"), benchmark: - BENCHMARKS + "build_simplified_population_layouts/s{simpl}" + benchmarks("build_simplified_population_layouts/s{simpl}") conda: "../envs/environment.yaml" script: @@ -73,11 +73,11 @@ if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: input: gas_network="data/gas_network/scigrid-gas/data/IGGIELGN_PipeSegments.geojson", output: - cleaned_gas_network=RESOURCES + "gas_network.csv", + cleaned_gas_network=resources("gas_network.csv"), resources: mem_mb=4000, log: - LOGS + "build_gas_network.log", + logs("build_gas_network.log"), conda: "../envs/environment.yaml" script: @@ -91,19 +91,21 @@ if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: ), entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson", production="data/gas_network/scigrid-gas/data/IGGIELGN_Productions.geojson", - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES - + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + regions_onshore=resources( + "regions_onshore_elec_s{simpl}_{clusters}.geojson" + ), + regions_offshore=resources( + "regions_offshore_elec_s{simpl}_{clusters}.geojson" + ), output: - gas_input_nodes=RESOURCES - + "gas_input_locations_s{simpl}_{clusters}.geojson", - gas_input_nodes_simplified=RESOURCES - + "gas_input_locations_s{simpl}_{clusters}_simplified.csv", + gas_input_nodes=resources("gas_input_locations_s{simpl}_{clusters}.geojson"), + gas_input_nodes_simplified=resources( + "gas_input_locations_s{simpl}_{clusters}_simplified.csv" + ), resources: mem_mb=2000, log: - LOGS + "build_gas_input_locations_s{simpl}_{clusters}.log", + logs("build_gas_input_locations_s{simpl}_{clusters}.log"), conda: "../envs/environment.yaml" script: @@ -111,17 +113,19 @@ if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: rule cluster_gas_network: input: - cleaned_gas_network=RESOURCES + "gas_network.csv", - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES - + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + cleaned_gas_network=resources("gas_network.csv"), + regions_onshore=resources( + "regions_onshore_elec_s{simpl}_{clusters}.geojson" + ), + regions_offshore=resources( + "regions_offshore_elec_s{simpl}_{clusters}.geojson" + ), output: - clustered_gas_network=RESOURCES + "gas_network_elec_s{simpl}_{clusters}.csv", + clustered_gas_network=resources("gas_network_elec_s{simpl}_{clusters}.csv"), resources: mem_mb=4000, log: - LOGS + "cluster_gas_network_s{simpl}_{clusters}.log", + logs("cluster_gas_network_s{simpl}_{clusters}.log"), conda: "../envs/environment.yaml" script: @@ -143,18 +147,18 @@ rule build_heat_demands: params: snapshots=config_provider("snapshots"), input: - pop_layout=RESOURCES + "pop_layout_{scope}.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + pop_layout=resources("pop_layout_{scope}.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", output: - heat_demand=RESOURCES + "heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", + heat_demand=resources("heat_demand_{scope}_elec_s{simpl}_{clusters}.nc"), resources: mem_mb=20000, threads: 8 log: - LOGS + "build_heat_demands_{scope}_{simpl}_{clusters}.loc", + logs("build_heat_demands_{scope}_{simpl}_{clusters}.loc"), benchmark: - BENCHMARKS + "build_heat_demands/{scope}_s{simpl}_{clusters}" + benchmarks("build_heat_demands/{scope}_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -165,19 +169,19 @@ rule build_temperature_profiles: params: snapshots=config_provider("snapshots"), input: - pop_layout=RESOURCES + "pop_layout_{scope}.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + pop_layout=resources("pop_layout_{scope}.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", output: - temp_soil=RESOURCES + "temp_soil_{scope}_elec_s{simpl}_{clusters}.nc", - temp_air=RESOURCES + "temp_air_{scope}_elec_s{simpl}_{clusters}.nc", + temp_soil=resources("temp_soil_{scope}_elec_s{simpl}_{clusters}.nc"), + temp_air=resources("temp_air_{scope}_elec_s{simpl}_{clusters}.nc"), resources: mem_mb=20000, threads: 8 log: - LOGS + "build_temperature_profiles_{scope}_{simpl}_{clusters}.log", + logs("build_temperature_profiles_{scope}_{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_temperature_profiles/{scope}_s{simpl}_{clusters}" + benchmarks("build_temperature_profiles/{scope}_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -188,25 +192,25 @@ rule build_cop_profiles: params: heat_pump_sink_T=config_provider("sector", "heat_pump_sink_T"), input: - temp_soil_total=RESOURCES + "temp_soil_total_elec_s{simpl}_{clusters}.nc", - temp_soil_rural=RESOURCES + "temp_soil_rural_elec_s{simpl}_{clusters}.nc", - temp_soil_urban=RESOURCES + "temp_soil_urban_elec_s{simpl}_{clusters}.nc", - temp_air_total=RESOURCES + "temp_air_total_elec_s{simpl}_{clusters}.nc", - temp_air_rural=RESOURCES + "temp_air_rural_elec_s{simpl}_{clusters}.nc", - temp_air_urban=RESOURCES + "temp_air_urban_elec_s{simpl}_{clusters}.nc", + temp_soil_total=resources("temp_soil_total_elec_s{simpl}_{clusters}.nc"), + temp_soil_rural=resources("temp_soil_rural_elec_s{simpl}_{clusters}.nc"), + temp_soil_urban=resources("temp_soil_urban_elec_s{simpl}_{clusters}.nc"), + temp_air_total=resources("temp_air_total_elec_s{simpl}_{clusters}.nc"), + temp_air_rural=resources("temp_air_rural_elec_s{simpl}_{clusters}.nc"), + temp_air_urban=resources("temp_air_urban_elec_s{simpl}_{clusters}.nc"), output: - cop_soil_total=RESOURCES + "cop_soil_total_elec_s{simpl}_{clusters}.nc", - cop_soil_rural=RESOURCES + "cop_soil_rural_elec_s{simpl}_{clusters}.nc", - cop_soil_urban=RESOURCES + "cop_soil_urban_elec_s{simpl}_{clusters}.nc", - cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", - cop_air_rural=RESOURCES + "cop_air_rural_elec_s{simpl}_{clusters}.nc", - cop_air_urban=RESOURCES + "cop_air_urban_elec_s{simpl}_{clusters}.nc", + cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), + cop_soil_rural=resources("cop_soil_rural_elec_s{simpl}_{clusters}.nc"), + cop_soil_urban=resources("cop_soil_urban_elec_s{simpl}_{clusters}.nc"), + cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), + cop_air_rural=resources("cop_air_rural_elec_s{simpl}_{clusters}.nc"), + cop_air_urban=resources("cop_air_urban_elec_s{simpl}_{clusters}.nc"), resources: mem_mb=20000, log: - LOGS + "build_cop_profiles_s{simpl}_{clusters}.log", + logs("build_cop_profiles_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_cop_profiles/s{simpl}_{clusters}" + benchmarks("build_cop_profiles/s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -218,18 +222,18 @@ rule build_solar_thermal_profiles: snapshots=config_provider("snapshots"), solar_thermal=config_provider("solar_thermal"), input: - pop_layout=RESOURCES + "pop_layout_{scope}.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + pop_layout=resources("pop_layout_{scope}.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", output: - solar_thermal=RESOURCES + "solar_thermal_{scope}_elec_s{simpl}_{clusters}.nc", + solar_thermal=resources("solar_thermal_{scope}_elec_s{simpl}_{clusters}.nc"), resources: mem_mb=20000, threads: 16 log: - LOGS + "build_solar_thermal_profiles_{scope}_s{simpl}_{clusters}.log", + logs("build_solar_thermal_profiles_{scope}_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_solar_thermal_profiles/{scope}_s{simpl}_{clusters}" + benchmarks("build_solar_thermal_profiles/{scope}_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -241,23 +245,23 @@ rule build_energy_totals: countries=config_provider("countries"), energy=config_provider("energy"), input: - nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", + nuts3_shapes=resources("nuts3_shapes.geojson"), co2="data/eea/UNFCCC_v23.csv", swiss="data/switzerland-sfoe/switzerland-new_format.csv", idees="data/jrc-idees-2015", district_heat_share="data/district_heat_share.csv", eurostat=input_eurostat, output: - energy_name=RESOURCES + "energy_totals.csv", - co2_name=RESOURCES + "co2_totals.csv", - transport_name=RESOURCES + "transport_data.csv", + energy_name=resources("energy_totals.csv"), + co2_name=resources("co2_totals.csv"), + transport_name=resources("transport_data.csv"), threads: 16 resources: mem_mb=10000, log: - LOGS + "build_energy_totals.log", + logs("build_energy_totals.log"), benchmark: - BENCHMARKS + "build_energy_totals" + benchmarks("build_energy_totals") conda: "../envs/environment.yaml" script: @@ -273,22 +277,23 @@ rule build_biomass_potentials: keep_local=True, ), nuts2="data/nuts/NUTS_RG_10M_2013_4326_LEVL_2.geojson", # https://gisco-services.ec.europa.eu/distribution/v2/nuts/download/#nuts21 - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), nuts3_population=ancient("data/bundle/nama_10r_3popgdp.tsv.gz"), swiss_cantons=ancient("data/bundle/ch_cantons.csv"), swiss_population=ancient("data/bundle/je-e-21.03.02.xls"), - country_shapes=RESOURCES + "country_shapes.geojson", + country_shapes=resources("country_shapes.geojson"), output: - biomass_potentials_all=RESOURCES - + "biomass_potentials_all_s{simpl}_{clusters}.csv", - biomass_potentials=RESOURCES + "biomass_potentials_s{simpl}_{clusters}.csv", + biomass_potentials_all=resources( + "biomass_potentials_all_s{simpl}_{clusters}.csv" + ), + biomass_potentials=resources("biomass_potentials_s{simpl}_{clusters}.csv"), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_biomass_potentials_s{simpl}_{clusters}.log", + logs("build_biomass_potentials_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_biomass_potentials_s{simpl}_{clusters}" + benchmarks("build_biomass_potentials_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -304,14 +309,14 @@ if config["sector"]["biomass_transport"] or config["sector"]["biomass_spatial"]: keep_local=True, ), output: - biomass_transport_costs=RESOURCES + "biomass_transport_costs.csv", + biomass_transport_costs=resources("biomass_transport_costs.csv"), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_biomass_transport_costs.log", + logs("build_biomass_transport_costs.log"), benchmark: - BENCHMARKS + "build_biomass_transport_costs" + benchmarks("build_biomass_transport_costs") conda: "../envs/environment.yaml" script: @@ -337,20 +342,23 @@ if config["sector"]["regional_co2_sequestration_potential"]["enable"]: "https://raw.githubusercontent.com/ericzhou571/Co2Storage/main/resources/complete_map_2020_unit_Mt.geojson", keep_local=True, ), - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES - + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + regions_onshore=resources( + "regions_onshore_elec_s{simpl}_{clusters}.geojson" + ), + regions_offshore=resources( + "regions_offshore_elec_s{simpl}_{clusters}.geojson" + ), output: - sequestration_potential=RESOURCES - + "co2_sequestration_potential_elec_s{simpl}_{clusters}.csv", + sequestration_potential=resources( + "co2_sequestration_potential_elec_s{simpl}_{clusters}.csv" + ), threads: 1 resources: mem_mb=4000, log: - LOGS + "build_sequestration_potentials_s{simpl}_{clusters}.log", + logs("build_sequestration_potentials_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_sequestration_potentials_s{simpl}_{clusters}" + benchmarks("build_sequestration_potentials_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -367,17 +375,17 @@ if not config["sector"]["regional_co2_sequestration_potential"]["enable"]: rule build_salt_cavern_potentials: input: salt_caverns="data/h2_salt_caverns_GWh_per_sqkm.geojson", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), + regions_offshore=resources("regions_offshore_elec_s{simpl}_{clusters}.geojson"), output: - h2_cavern_potential=RESOURCES + "salt_cavern_potentials_s{simpl}_{clusters}.csv", + h2_cavern_potential=resources("salt_cavern_potentials_s{simpl}_{clusters}.csv"), threads: 1 resources: mem_mb=2000, log: - LOGS + "build_salt_cavern_potentials_s{simpl}_{clusters}.log", + logs("build_salt_cavern_potentials_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_salt_cavern_potentials_s{simpl}_{clusters}" + benchmarks("build_salt_cavern_potentials_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -390,14 +398,14 @@ rule build_ammonia_production: input: usgs="data/myb1-2017-nitro.xls", output: - ammonia_production=RESOURCES + "ammonia_production.csv", + ammonia_production=resources("ammonia_production.csv"), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_ammonia_production.log", + logs("build_ammonia_production.log"), benchmark: - BENCHMARKS + "build_ammonia_production" + benchmarks("build_ammonia_production") conda: "../envs/environment.yaml" script: @@ -409,17 +417,17 @@ rule build_industry_sector_ratios: industry=config_provider("industry"), ammonia=config_provider("sector", "ammonia", default=False), input: - ammonia_production=RESOURCES + "ammonia_production.csv", + ammonia_production=resources("ammonia_production.csv"), idees="data/jrc-idees-2015", output: - industry_sector_ratios=RESOURCES + "industry_sector_ratios.csv", + industry_sector_ratios=resources("industry_sector_ratios.csv"), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_industry_sector_ratios.log", + logs("build_industry_sector_ratios.log"), benchmark: - BENCHMARKS + "build_industry_sector_ratios" + benchmarks("build_industry_sector_ratios") conda: "../envs/environment.yaml" script: @@ -431,19 +439,20 @@ rule build_industrial_production_per_country: industry=config_provider("industry"), countries=config_provider("countries"), input: - ammonia_production=RESOURCES + "ammonia_production.csv", + ammonia_production=resources("ammonia_production.csv"), jrc="data/jrc-idees-2015", eurostat="data/eurostat-energy_balances-may_2018_edition", output: - industrial_production_per_country=RESOURCES - + "industrial_production_per_country.csv", + industrial_production_per_country=resources( + "industrial_production_per_country.csv" + ), threads: 8 resources: mem_mb=1000, log: - LOGS + "build_industrial_production_per_country.log", + logs("build_industrial_production_per_country.log"), benchmark: - BENCHMARKS + "build_industrial_production_per_country" + benchmarks("build_industrial_production_per_country") conda: "../envs/environment.yaml" script: @@ -454,21 +463,23 @@ rule build_industrial_production_per_country_tomorrow: params: industry=config_provider("industry"), input: - industrial_production_per_country=RESOURCES - + "industrial_production_per_country.csv", + industrial_production_per_country=resources( + "industrial_production_per_country.csv" + ), output: - industrial_production_per_country_tomorrow=RESOURCES - + "industrial_production_per_country_tomorrow_{planning_horizons}.csv", + industrial_production_per_country_tomorrow=resources( + "industrial_production_per_country_tomorrow_{planning_horizons}.csv" + ), threads: 1 resources: mem_mb=1000, log: - LOGS - + "build_industrial_production_per_country_tomorrow_{planning_horizons}.log", + logs("build_industrial_production_per_country_tomorrow_{planning_horizons}.log"), benchmark: ( - BENCHMARKS - + "build_industrial_production_per_country_tomorrow_{planning_horizons}" + benchmarks( + "build_industrial_production_per_country_tomorrow_{planning_horizons}" + ) ) conda: "../envs/environment.yaml" @@ -483,19 +494,20 @@ rule build_industrial_distribution_key: ), countries=config_provider("countries"), input: - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), hotmaps_industrial_database="data/Industrial_Database.csv", output: - industrial_distribution_key=RESOURCES - + "industrial_distribution_key_elec_s{simpl}_{clusters}.csv", + industrial_distribution_key=resources( + "industrial_distribution_key_elec_s{simpl}_{clusters}.csv" + ), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_industrial_distribution_key_s{simpl}_{clusters}.log", + logs("build_industrial_distribution_key_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_industrial_distribution_key/s{simpl}_{clusters}" + benchmarks("build_industrial_distribution_key/s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -504,23 +516,28 @@ rule build_industrial_distribution_key: rule build_industrial_production_per_node: input: - industrial_distribution_key=RESOURCES - + "industrial_distribution_key_elec_s{simpl}_{clusters}.csv", - industrial_production_per_country_tomorrow=RESOURCES - + "industrial_production_per_country_tomorrow_{planning_horizons}.csv", + industrial_distribution_key=resources( + "industrial_distribution_key_elec_s{simpl}_{clusters}.csv" + ), + industrial_production_per_country_tomorrow=resources( + "industrial_production_per_country_tomorrow_{planning_horizons}.csv" + ), output: - industrial_production_per_node=RESOURCES - + "industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + industrial_production_per_node=resources( + "industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), threads: 1 resources: mem_mb=1000, log: - LOGS - + "build_industrial_production_per_node_s{simpl}_{clusters}_{planning_horizons}.log", + logs( + "build_industrial_production_per_node_s{simpl}_{clusters}_{planning_horizons}.log" + ), benchmark: ( - BENCHMARKS - + "build_industrial_production_per_node/s{simpl}_{clusters}_{planning_horizons}" + benchmarks( + "build_industrial_production_per_node/s{simpl}_{clusters}_{planning_horizons}" + ) ) conda: "../envs/environment.yaml" @@ -530,24 +547,29 @@ rule build_industrial_production_per_node: rule build_industrial_energy_demand_per_node: input: - industry_sector_ratios=RESOURCES + "industry_sector_ratios.csv", - industrial_production_per_node=RESOURCES - + "industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv", - industrial_energy_demand_per_node_today=RESOURCES - + "industrial_energy_demand_today_elec_s{simpl}_{clusters}.csv", + industry_sector_ratios=resources("industry_sector_ratios.csv"), + industrial_production_per_node=resources( + "industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), + industrial_energy_demand_per_node_today=resources( + "industrial_energy_demand_today_elec_s{simpl}_{clusters}.csv" + ), output: - industrial_energy_demand_per_node=RESOURCES - + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + industrial_energy_demand_per_node=resources( + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), threads: 1 resources: mem_mb=1000, log: - LOGS - + "build_industrial_energy_demand_per_node_s{simpl}_{clusters}_{planning_horizons}.log", + logs( + "build_industrial_energy_demand_per_node_s{simpl}_{clusters}_{planning_horizons}.log" + ), benchmark: ( - BENCHMARKS - + "build_industrial_energy_demand_per_node/s{simpl}_{clusters}_{planning_horizons}" + benchmarks( + "build_industrial_energy_demand_per_node/s{simpl}_{clusters}_{planning_horizons}" + ) ) conda: "../envs/environment.yaml" @@ -561,19 +583,21 @@ rule build_industrial_energy_demand_per_country_today: industry=config_provider("industry"), input: jrc="data/jrc-idees-2015", - ammonia_production=RESOURCES + "ammonia_production.csv", - industrial_production_per_country=RESOURCES - + "industrial_production_per_country.csv", + ammonia_production=resources("ammonia_production.csv"), + industrial_production_per_country=resources( + "industrial_production_per_country.csv" + ), output: - industrial_energy_demand_per_country_today=RESOURCES - + "industrial_energy_demand_per_country_today.csv", + industrial_energy_demand_per_country_today=resources( + "industrial_energy_demand_per_country_today.csv" + ), threads: 8 resources: mem_mb=1000, log: - LOGS + "build_industrial_energy_demand_per_country_today.log", + logs("build_industrial_energy_demand_per_country_today.log"), benchmark: - BENCHMARKS + "build_industrial_energy_demand_per_country_today" + benchmarks("build_industrial_energy_demand_per_country_today") conda: "../envs/environment.yaml" script: @@ -582,20 +606,23 @@ rule build_industrial_energy_demand_per_country_today: rule build_industrial_energy_demand_per_node_today: input: - industrial_distribution_key=RESOURCES - + "industrial_distribution_key_elec_s{simpl}_{clusters}.csv", - industrial_energy_demand_per_country_today=RESOURCES - + "industrial_energy_demand_per_country_today.csv", + industrial_distribution_key=resources( + "industrial_distribution_key_elec_s{simpl}_{clusters}.csv" + ), + industrial_energy_demand_per_country_today=resources( + "industrial_energy_demand_per_country_today.csv" + ), output: - industrial_energy_demand_per_node_today=RESOURCES - + "industrial_energy_demand_today_elec_s{simpl}_{clusters}.csv", + industrial_energy_demand_per_node_today=resources( + "industrial_energy_demand_today_elec_s{simpl}_{clusters}.csv" + ), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_industrial_energy_demand_per_node_today_s{simpl}_{clusters}.log", + logs("build_industrial_energy_demand_per_node_today_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_industrial_energy_demand_per_node_today/s{simpl}_{clusters}" + benchmarks("build_industrial_energy_demand_per_node_today/s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -611,23 +638,23 @@ if config["sector"]["retrofitting"]["retro_endogen"]: input: building_stock="data/retro/data_building_stock.csv", data_tabula="data/retro/tabula-calculator-calcsetbuilding.csv", - air_temperature=RESOURCES + "temp_air_total_elec_s{simpl}_{clusters}.nc", + air_temperature=resources("temp_air_total_elec_s{simpl}_{clusters}.nc"), u_values_PL="data/retro/u_values_poland.csv", tax_w="data/retro/electricity_taxes_eu.csv", construction_index="data/retro/comparative_level_investment.csv", floor_area_missing="data/retro/floor_area_missing.csv", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), cost_germany="data/retro/retro_cost_germany.csv", window_assumptions="data/retro/window_assumptions.csv", output: - retro_cost=RESOURCES + "retro_cost_elec_s{simpl}_{clusters}.csv", - floor_area=RESOURCES + "floor_area_elec_s{simpl}_{clusters}.csv", + retro_cost=resources("retro_cost_elec_s{simpl}_{clusters}.csv"), + floor_area=resources("floor_area_elec_s{simpl}_{clusters}.csv"), resources: mem_mb=1000, log: - LOGS + "build_retro_cost_s{simpl}_{clusters}.log", + logs("build_retro_cost_s{simpl}_{clusters}.log"), benchmark: - BENCHMARKS + "build_retro_cost/s{simpl}_{clusters}" + benchmarks("build_retro_cost/s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -643,15 +670,15 @@ if not config["sector"]["retrofitting"]["retro_endogen"]: rule build_population_weighted_energy_totals: input: - energy_totals=RESOURCES + "energy_totals.csv", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + energy_totals=resources("energy_totals.csv"), + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), output: - RESOURCES + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv", + resources("pop_weighted_energy_totals_s{simpl}_{clusters}.csv"), threads: 1 resources: mem_mb=2000, log: - LOGS + "build_population_weighted_energy_totals_s{simpl}_{clusters}.log", + logs("build_population_weighted_energy_totals_s{simpl}_{clusters}.log"), conda: "../envs/environment.yaml" script: @@ -661,16 +688,16 @@ rule build_population_weighted_energy_totals: rule build_shipping_demand: input: ports="data/attributed_ports.json", - scope=RESOURCES + "europe_shape.geojson", - regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - demand=RESOURCES + "energy_totals.csv", + scope=resources("europe_shape.geojson"), + regions=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), + demand=resources("energy_totals.csv"), output: - RESOURCES + "shipping_demand_s{simpl}_{clusters}.csv", + resources("shipping_demand_s{simpl}_{clusters}.csv"), threads: 1 resources: mem_mb=2000, log: - LOGS + "build_shipping_demand_s{simpl}_{clusters}.log", + logs("build_shipping_demand_s{simpl}_{clusters}.log"), conda: "../envs/environment.yaml" script: @@ -682,23 +709,24 @@ rule build_transport_demand: snapshots=config_provider("snapshots"), sector=config_provider("sector"), input: - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", - pop_weighted_energy_totals=RESOURCES - + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv", - transport_data=RESOURCES + "transport_data.csv", + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), + pop_weighted_energy_totals=resources( + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv" + ), + transport_data=resources("transport_data.csv"), traffic_data_KFZ="data/emobility/KFZ__count", traffic_data_Pkw="data/emobility/Pkw__count", - temp_air_total=RESOURCES + "temp_air_total_elec_s{simpl}_{clusters}.nc", + temp_air_total=resources("temp_air_total_elec_s{simpl}_{clusters}.nc"), output: - transport_demand=RESOURCES + "transport_demand_s{simpl}_{clusters}.csv", - transport_data=RESOURCES + "transport_data_s{simpl}_{clusters}.csv", - avail_profile=RESOURCES + "avail_profile_s{simpl}_{clusters}.csv", - dsm_profile=RESOURCES + "dsm_profile_s{simpl}_{clusters}.csv", + transport_demand=resources("transport_demand_s{simpl}_{clusters}.csv"), + transport_data=resources("transport_data_s{simpl}_{clusters}.csv"), + avail_profile=resources("avail_profile_s{simpl}_{clusters}.csv"), + dsm_profile=resources("dsm_profile_s{simpl}_{clusters}.csv"), threads: 1 resources: mem_mb=2000, log: - LOGS + "build_transport_demand_s{simpl}_{clusters}.log", + logs("build_transport_demand_s{simpl}_{clusters}.log"), conda: "../envs/environment.yaml" script: @@ -727,57 +755,62 @@ rule prepare_sector_network: **build_biomass_transport_costs_output, **gas_infrastructure, **build_sequestration_potentials_output, - network=RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - energy_totals_name=RESOURCES + "energy_totals.csv", + network=resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), + energy_totals_name=resources("energy_totals.csv"), eurostat=input_eurostat, - pop_weighted_energy_totals=RESOURCES - + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv", - shipping_demand=RESOURCES + "shipping_demand_s{simpl}_{clusters}.csv", - transport_demand=RESOURCES + "transport_demand_s{simpl}_{clusters}.csv", - transport_data=RESOURCES + "transport_data_s{simpl}_{clusters}.csv", - avail_profile=RESOURCES + "avail_profile_s{simpl}_{clusters}.csv", - dsm_profile=RESOURCES + "dsm_profile_s{simpl}_{clusters}.csv", - co2_totals_name=RESOURCES + "co2_totals.csv", + pop_weighted_energy_totals=resources( + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv" + ), + shipping_demand=resources("shipping_demand_s{simpl}_{clusters}.csv"), + transport_demand=resources("transport_demand_s{simpl}_{clusters}.csv"), + transport_data=resources("transport_data_s{simpl}_{clusters}.csv"), + avail_profile=resources("avail_profile_s{simpl}_{clusters}.csv"), + dsm_profile=resources("dsm_profile_s{simpl}_{clusters}.csv"), + co2_totals_name=resources("co2_totals.csv"), co2="data/eea/UNFCCC_v23.csv", - biomass_potentials=RESOURCES + "biomass_potentials_s{simpl}_{clusters}.csv", + biomass_potentials=resources("biomass_potentials_s{simpl}_{clusters}.csv"), heat_profile="data/heat_load_profile_BDEW.csv", costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" else "data/costs_{planning_horizons}.csv", - profile_offwind_ac=RESOURCES + "profile_offwind-ac.nc", - profile_offwind_dc=RESOURCES + "profile_offwind-dc.nc", - h2_cavern=RESOURCES + "salt_cavern_potentials_s{simpl}_{clusters}.csv", - busmap_s=RESOURCES + "busmap_elec_s{simpl}.csv", - busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", - simplified_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}.csv", - industrial_demand=RESOURCES - + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv", - heat_demand_urban=RESOURCES + "heat_demand_urban_elec_s{simpl}_{clusters}.nc", - heat_demand_rural=RESOURCES + "heat_demand_rural_elec_s{simpl}_{clusters}.nc", - heat_demand_total=RESOURCES + "heat_demand_total_elec_s{simpl}_{clusters}.nc", - temp_soil_total=RESOURCES + "temp_soil_total_elec_s{simpl}_{clusters}.nc", - temp_soil_rural=RESOURCES + "temp_soil_rural_elec_s{simpl}_{clusters}.nc", - temp_soil_urban=RESOURCES + "temp_soil_urban_elec_s{simpl}_{clusters}.nc", - temp_air_total=RESOURCES + "temp_air_total_elec_s{simpl}_{clusters}.nc", - temp_air_rural=RESOURCES + "temp_air_rural_elec_s{simpl}_{clusters}.nc", - temp_air_urban=RESOURCES + "temp_air_urban_elec_s{simpl}_{clusters}.nc", - cop_soil_total=RESOURCES + "cop_soil_total_elec_s{simpl}_{clusters}.nc", - cop_soil_rural=RESOURCES + "cop_soil_rural_elec_s{simpl}_{clusters}.nc", - cop_soil_urban=RESOURCES + "cop_soil_urban_elec_s{simpl}_{clusters}.nc", - cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", - cop_air_rural=RESOURCES + "cop_air_rural_elec_s{simpl}_{clusters}.nc", - cop_air_urban=RESOURCES + "cop_air_urban_elec_s{simpl}_{clusters}.nc", - solar_thermal_total=RESOURCES - + "solar_thermal_total_elec_s{simpl}_{clusters}.nc" + profile_offwind_ac=resources("profile_offwind-ac.nc"), + profile_offwind_dc=resources("profile_offwind-dc.nc"), + h2_cavern=resources("salt_cavern_potentials_s{simpl}_{clusters}.csv"), + busmap_s=resources("busmap_elec_s{simpl}.csv"), + busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), + simplified_pop_layout=resources("pop_layout_elec_s{simpl}.csv"), + industrial_demand=resources( + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), + heat_demand_urban=resources("heat_demand_urban_elec_s{simpl}_{clusters}.nc"), + heat_demand_rural=resources("heat_demand_rural_elec_s{simpl}_{clusters}.nc"), + heat_demand_total=resources("heat_demand_total_elec_s{simpl}_{clusters}.nc"), + temp_soil_total=resources("temp_soil_total_elec_s{simpl}_{clusters}.nc"), + temp_soil_rural=resources("temp_soil_rural_elec_s{simpl}_{clusters}.nc"), + temp_soil_urban=resources("temp_soil_urban_elec_s{simpl}_{clusters}.nc"), + temp_air_total=resources("temp_air_total_elec_s{simpl}_{clusters}.nc"), + temp_air_rural=resources("temp_air_rural_elec_s{simpl}_{clusters}.nc"), + temp_air_urban=resources("temp_air_urban_elec_s{simpl}_{clusters}.nc"), + cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), + cop_soil_rural=resources("cop_soil_rural_elec_s{simpl}_{clusters}.nc"), + cop_soil_urban=resources("cop_soil_urban_elec_s{simpl}_{clusters}.nc"), + cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), + cop_air_rural=resources("cop_air_rural_elec_s{simpl}_{clusters}.nc"), + cop_air_urban=resources("cop_air_urban_elec_s{simpl}_{clusters}.nc"), + solar_thermal_total=resources( + "solar_thermal_total_elec_s{simpl}_{clusters}.nc" + ) if config["sector"]["solar_thermal"] else [], - solar_thermal_urban=RESOURCES - + "solar_thermal_urban_elec_s{simpl}_{clusters}.nc" + solar_thermal_urban=resources( + "solar_thermal_urban_elec_s{simpl}_{clusters}.nc" + ) if config["sector"]["solar_thermal"] else [], - solar_thermal_rural=RESOURCES - + "solar_thermal_rural_elec_s{simpl}_{clusters}.nc" + solar_thermal_rural=resources( + "solar_thermal_rural_elec_s{simpl}_{clusters}.nc" + ) if config["sector"]["solar_thermal"] else [], output: diff --git a/rules/collect.smk b/rules/collect.smk index 70dc4641..e0f19a4c 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -23,7 +23,7 @@ rule all: rule cluster_networks: input: expand( - RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", + resources("networks/elec_s{simpl}_{clusters}.nc"), **config["scenario"], run=config["run"]["name"] ), @@ -32,7 +32,7 @@ rule cluster_networks: rule extra_components_networks: input: expand( - RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", + resources("networks/elec_s{simpl}_{clusters}_ec.nc"), **config["scenario"], run=config["run"]["name"] ), @@ -41,7 +41,7 @@ rule extra_components_networks: rule prepare_elec_networks: input: expand( - RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", + resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), **config["scenario"], run=config["run"]["name"] ), diff --git a/rules/common.smk b/rules/common.smk index f24301c8..0467d560 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -40,10 +40,12 @@ def static_getter(wildcards, keys, default): def dynamic_getter(wildcards, keys, default): """Getter function for dynamic config values based on scenario.""" + if "run" not in wildcards: + return get_config(config, keys, default) scenario_name = wildcards.run if scenario_name not in scenarios: raise ValueError( - f"Scenario {scenario_name} not found in file {config['scenariofile']}." + f"Scenario {scenario_name} not found in file {config['run']['scenario']['file']}." ) return get_config(scenario_config(scenario_name), keys, default) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 4c833b4f..e09103cc 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -14,7 +14,7 @@ rule plot_network: input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), output: map=RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 34e2eb7c..1c454633 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -92,9 +92,9 @@ if config["enable"]["retrieve"] and config["enable"].get( static=True, ), output: - RESOURCES + "natura.tiff", + resources("natura.tiff"), log: - LOGS + "retrieve_natura_raster.log", + logs("retrieve_natura_raster.log"), resources: mem_mb=5000, retries: 2 diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index c396ebd5..cfdb1da0 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -12,7 +12,7 @@ rule solve_network: "co2_sequestration_potential", 200 ), input: - network=RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", + network=resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), config=RESULTS + "config.yaml", output: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 8a93d24a..214733b7 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -12,13 +12,13 @@ rule add_existing_baseyear: input: network=RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - powerplants=RESOURCES + "powerplants.csv", - busmap_s=RESOURCES + "busmap_elec_s{simpl}.csv", - busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + powerplants=resources("powerplants.csv"), + busmap_s=resources("busmap_elec_s{simpl}.csv"), + busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), costs="data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), - cop_soil_total=RESOURCES + "cop_soil_total_elec_s{simpl}_{clusters}.nc", - cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", + cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), + cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), existing_heating="data/existing_infrastructure/existing_heating_raw.csv", existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv", existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv", @@ -55,8 +55,8 @@ rule add_brownfield: + "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", + 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", diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index c7700760..d8476868 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -31,8 +31,7 @@ rule solve_sector_network: walltime=config["solving"].get("walltime", "12:00:00"), benchmark: ( - RESULTS - + BENCHMARKS + BENCHMARKS + "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: diff --git a/rules/validate.smk b/rules/validate.smk index cfb8c959..09344673 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -20,9 +20,9 @@ rule build_electricity_production: snapshots=config["snapshots"], countries=config["countries"], output: - RESOURCES + "historical_electricity_production.csv", + resources("historical_electricity_production.csv"), log: - LOGS + "build_electricity_production.log", + logs("build_electricity_production.log"), resources: mem_mb=5000, script: @@ -38,11 +38,11 @@ rule build_cross_border_flows: snapshots=config["snapshots"], countries=config["countries"], input: - network=RESOURCES + "networks/base.nc", + network=resources("networks/base.nc"), output: - RESOURCES + "historical_cross_border_flows.csv", + resources("historical_cross_border_flows.csv"), log: - LOGS + "build_cross_border_flows.log", + logs("build_cross_border_flows.log"), resources: mem_mb=5000, script: @@ -58,9 +58,9 @@ rule build_electricity_prices: snapshots=config["snapshots"], countries=config["countries"], output: - RESOURCES + "historical_electricity_prices.csv", + resources("historical_electricity_prices.csv"), log: - LOGS + "build_electricity_prices.log", + logs("build_electricity_prices.log"), resources: mem_mb=5000, script: @@ -70,7 +70,7 @@ rule build_electricity_prices: rule plot_validation_electricity_production: input: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - electricity_production=RESOURCES + "historical_electricity_production.csv", + electricity_production=resources("historical_electricity_production.csv"), output: **{ plot: RESULTS @@ -88,7 +88,7 @@ rule plot_validation_cross_border_flows: countries=config["countries"], input: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - cross_border_flows=RESOURCES + "historical_cross_border_flows.csv", + cross_border_flows=resources("historical_cross_border_flows.csv"), output: **{ plot: RESULTS @@ -104,7 +104,7 @@ rule plot_validation_cross_border_flows: rule plot_validation_electricity_prices: input: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - electricity_prices=RESOURCES + "historical_electricity_prices.csv", + electricity_prices=resources("historical_electricity_prices.csv"), output: **{ plot: RESULTS diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 00000000..fc781c2f --- /dev/null +++ b/scripts/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 3951be18..c166c61c 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -6,14 +6,13 @@ import contextlib import logging import os +import re import urllib from pathlib import Path import pandas as pd import pytz import yaml -from pypsa.components import component_attrs, components -from pypsa.descriptors import Dict from snakemake.utils import update_config from tqdm import tqdm @@ -22,6 +21,43 @@ logger = logging.getLogger(__name__) REGION_COLS = ["geometry", "name", "x", "y", "country"] +def path_provider(dir, rdir, shared_resources): + """ + Dynamically provide paths based on shared resources. + + Use this function whenever there is an input or output to a + snakemake rule that should, optionally, be either shared across runs + or created individually for each run. If shared_resources is a + string, it is assumed to be the wildcard that indicates the cutoff + after which resources are no longer shared. The function returns a + function which takes a filename and returns a path that is either + shared or individual to each run. + """ + + def path(fn): + pattern = r"\{([^{}]+)\}" + existing_wildcards = list(re.findall(pattern, fn)) + if shared_resources == "base": + # special case for shared "base" resources + no_relevant_wildcards = not len(set(existing_wildcards) - {"technology"}) + no_elec_rule = not fn.startswith("networks/elec") and not fn.startswith( + "add_electricity" + ) + is_shared = no_relevant_wildcards and no_elec_rule + elif isinstance(shared_resources, str): + final_wildcard = shared_resources + is_shared = final_wildcard not in existing_wildcards[:-1] + else: + is_shared = shared_resources + + if is_shared: + return f"{dir}{fn}" + else: + return f"{dir}{rdir}{fn}" + + return path + + # Define a context manager to temporarily mute print statements @contextlib.contextmanager def mute_print(): @@ -31,15 +67,16 @@ def mute_print(): def set_scenario_config(snakemake): - if snakemake.config["run"]["scenarios"] and "run" in snakemake.wildcards.keys(): + scenario = snakemake.config["run"].get("scenario", {}) + if scenario.get("enable") and "run" in snakemake.wildcards.keys(): try: - with open(snakemake.config["scenariofile"], "r") as f: + with open(scenario["file"], "r") as f: scenario_config = yaml.safe_load(f) except FileNotFoundError: # fallback for mock_snakemake script_dir = Path(__file__).parent.resolve() root_dir = script_dir.parent - with open(root_dir / snakemake.config["scenariofile"], "r") as f: + with open(root_dir / scenario["file"], "r") as f: scenario_config = yaml.safe_load(f) update_config(snakemake.config, scenario_config[snakemake.wildcards.run]) From b91a7b9c514f6a380f7cea758325156f095cf8c7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 24 Aug 2023 08:19:38 +0000 Subject: [PATCH 027/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/add_existing_baseyear.py | 7 +++++-- scripts/build_industrial_distribution_key.py | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 269705a7..08810470 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -447,8 +447,11 @@ def add_heating_capacities_installed_before_baseyear( ) # if rural heating demand for one of the nodes doesn't exist, # then columns were dropped before and heating demand share should be 0.0 - if all(f"{node} {service} rural heat" in p_set_sum.index for service in ["residential", "services"]) - else 0. + if all( + f"{node} {service} rural heat" in p_set_sum.index + for service in ["residential", "services"] + ) + else 0.0 for node in nodal_df.index ], index=nodal_df.index, diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index c5cbd19c..e6d515b0 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -13,13 +13,14 @@ logger = logging.getLogger(__name__) import uuid from itertools import product +import country_converter as coco import geopandas as gpd import pandas as pd from packaging.version import Version, parse -import country_converter as coco cc = coco.CountryConverter() + def locate_missing_industrial_sites(df): """ Locate industrial sites without valid locations based on city and From 04a2bea176475c64efc15a85923996311c9af437 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 24 Aug 2023 13:17:44 +0200 Subject: [PATCH 028/497] scenario-management: use list for including wildcards with shared resource --- Snakefile | 6 +- config/test/config.scenarios.electricity.yaml | 2 +- doc/configtables/run.csv | 4 +- rules/common.smk | 2 +- scripts/_helpers.py | 96 ++++++++++++------- 5 files changed, 71 insertions(+), 39 deletions(-) diff --git a/Snakefile b/Snakefile index 55b90d5d..c9fdbb34 100644 --- a/Snakefile +++ b/Snakefile @@ -25,10 +25,10 @@ COSTS = f"data/costs_{config['costs']['year']}.csv" ATLITE_NPROCESSES = config["atlite"].get("nprocesses", 4) run = config["run"] -scenario = run.get("scenario", {}) +scenarios = run.get("scenarios", {}) if run["name"]: - if scenario.get("enable"): - fn = Path(scenario["file"]) + if scenarios.get("enable"): + fn = Path(scenarios["file"]) scenarios = yaml.safe_load(fn.read_text()) RDIR = "{run}/" else: diff --git a/config/test/config.scenarios.electricity.yaml b/config/test/config.scenarios.electricity.yaml index 63b1892b..185dcda4 100644 --- a/config/test/config.scenarios.electricity.yaml +++ b/config/test/config.scenarios.electricity.yaml @@ -8,7 +8,7 @@ run: name: - test-elec-no-offshore-wind - test-elec-no-onshore-wind - scenario: + scenarios: enable: true file: "config/test/scenarios.electricity.yaml" disable_progressbar: true diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index 3d8e4e8c..718867a6 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -1,8 +1,8 @@ ,Unit,Values,Description name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenario: enable`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenario: file``." -scenario,,, +scenarios,,, -- enable,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``file``." -- file,str,,Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``create_scenarios.py`` script in ``scripts``. disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." -shared_resources,bool/str,,"Switch to select whether resources should be shared across runs. If a string is passed, it is assumed to be a wildcard or 'base' that indicates the cutoff after which resources are no longer shared. If 'base' is passed, resources before creating the elec.nc file are shared." +shared_resources,bool/str/list,,"Switch to select whether resources should be shared across runs. If a string or list is passed, it is assumed to be wildcard(s) which indicates up to which set of wildcards the resource folder should be shared. If set to 'base', only resources before creating the elec.nc file are shared." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." diff --git a/rules/common.smk b/rules/common.smk index 0467d560..dab15c0d 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -58,7 +58,7 @@ def config_provider(*keys, default=None): my_param=config_provider("key1", "key2", default="some_default_value") """ # Using functools.partial to freeze certain arguments in our getter functions. - if config["run"].get("scenarios", False): + if config["run"].get("scenarios", {}).get("enable", False): return partial(dynamic_getter, keys=keys, default=default) else: return partial(static_getter, keys=keys, default=default) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index c166c61c..ed46db77 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -8,6 +8,7 @@ import logging import os import re import urllib +from functools import partial from pathlib import Path import pandas as pd @@ -21,41 +22,72 @@ logger = logging.getLogger(__name__) REGION_COLS = ["geometry", "name", "x", "y", "country"] +def get_run_path(fn, dir, rdir, shared_resources): + """ + Dynamically provide paths based on shared resources and filename. + + Use this function for snakemake rule inputs or outputs that should be + optionally shared across runs or created individually for each run. + + Parameters + ---------- + fn : str + The filename for the path to be generated. + dir : str + The base directory. + rdir : str + Relative directory for non-shared resources. + shared_resources : str, list, or bool + Specifies which resources should be shared. + - If string or list, assumed to be superset of wildcards for sharing. + - If "base", special handling for shared "base" resources. + - If boolean, directly specifies if the resource is shared. + + Returns + ------- + str + Full path where the resource should be stored. + + Notes + ----- + Special case for "base" allows no wildcards other than + "technology" and excludes filenames starting with "networks/elec" or + "add_electricity". + """ + pattern = r"\{([^{}]+)\}" + existing_wildcards = list(re.findall(pattern, fn)) + if shared_resources == "base": + # special case for shared "base" resources + no_relevant_wildcards = not len(set(existing_wildcards) - {"technology"}) + no_elec_rule = not fn.startswith("networks/elec") and not fn.startswith( + "add_electricity" + ) + is_shared = no_relevant_wildcards and no_elec_rule + elif isinstance(shared_resources, (str, list)): + if isinstance(shared_resources, str): + shared_resources = [shared_resources] + is_shared = set(existing_wildcards).issubset(shared_resources) + else: + is_shared = shared_resources + + if is_shared: + return f"{dir}{fn}" + else: + return f"{dir}{rdir}{fn}" + + def path_provider(dir, rdir, shared_resources): """ - Dynamically provide paths based on shared resources. + Returns a partial function that dynamically provides paths based on shared + resources and the filename. - Use this function whenever there is an input or output to a - snakemake rule that should, optionally, be either shared across runs - or created individually for each run. If shared_resources is a - string, it is assumed to be the wildcard that indicates the cutoff - after which resources are no longer shared. The function returns a - function which takes a filename and returns a path that is either - shared or individual to each run. + Returns + ------- + partial function + A partial function that takes a filename as input and + returns the path to the file based on the shared_resources parameter. """ - - def path(fn): - pattern = r"\{([^{}]+)\}" - existing_wildcards = list(re.findall(pattern, fn)) - if shared_resources == "base": - # special case for shared "base" resources - no_relevant_wildcards = not len(set(existing_wildcards) - {"technology"}) - no_elec_rule = not fn.startswith("networks/elec") and not fn.startswith( - "add_electricity" - ) - is_shared = no_relevant_wildcards and no_elec_rule - elif isinstance(shared_resources, str): - final_wildcard = shared_resources - is_shared = final_wildcard not in existing_wildcards[:-1] - else: - is_shared = shared_resources - - if is_shared: - return f"{dir}{fn}" - else: - return f"{dir}{rdir}{fn}" - - return path + return partial(get_run_path, dir=dir, rdir=rdir, shared_resources=shared_resources) # Define a context manager to temporarily mute print statements @@ -67,7 +99,7 @@ def mute_print(): def set_scenario_config(snakemake): - scenario = snakemake.config["run"].get("scenario", {}) + scenario = snakemake.config["run"].get("scenarios", {}) if scenario.get("enable") and "run" in snakemake.wildcards.keys(): try: with open(scenario["file"], "r") as f: From c7e6d36014ef7e16aafadb0b3eaa8a69900e3240 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 24 Aug 2023 13:33:26 +0200 Subject: [PATCH 029/497] fix separators in run.csv --- doc/configtables/run.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index 718867a6..925c2dea 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -2,7 +2,7 @@ name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenario: enable`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenario: file``." scenarios,,, -- enable,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``file``." --- file,str,,Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``create_scenarios.py`` script in ``scripts``. +-- file,str,,"Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``create_scenarios.py`` script in ``scripts``." disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." shared_resources,bool/str/list,,"Switch to select whether resources should be shared across runs. If a string or list is passed, it is assumed to be wildcard(s) which indicates up to which set of wildcards the resource folder should be shared. If set to 'base', only resources before creating the elec.nc file are shared." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." From 823df52309d1a1a44bb449802c2fdbaee8cb0d95 Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Mon, 11 Sep 2023 22:51:31 +0200 Subject: [PATCH 030/497] add backward compatible config in wildcards --- config/config.default.yaml | 52 +++++++++++++ rules/build_electricity.smk | 4 + rules/build_sector.smk | 2 + scripts/_helpers.py | 14 ++++ scripts/prepare_network.py | 119 ++++++++++++++++++------------ scripts/prepare_sector_network.py | 103 ++++++++++++++++---------- 6 files changed, 204 insertions(+), 90 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index b162b75d..fcc74981 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -60,6 +60,14 @@ snapshots: end: "2014-01-01" inclusive: 'left' +snapshot_opts: + average_every_nhours: + enable: false + hour: 2 + time_segmentation: + enable: false + hour: 4380 + # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#enable enable: retrieve: auto @@ -73,6 +81,22 @@ enable: retrieve_natura_raster: true custom_busmap: false +enable_sector: + no_heat_district: false + land_transport: false + heating: false + waste_heat: false + biomass: false + biomass_transport: false + agriculture_machinery: false + industry: false + decentral: false + #wave_energy: false + #wave_energy_factor: + noH2network: false + carbon_budget: false + co2limit_sector: false + # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#co2-budget co2_budget: 2020: 0.701 @@ -83,10 +107,22 @@ co2_budget: 2045: 0.032 2050: 0.000 +co2_budget_opts: + from_descrete_value: + enable: true + from_beta_decay: + enable: false # TODO: move to own rule with sector-opts wildcard? + value: 1 + from_exp_decay: + enable: false + value: 1 + # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#electricity electricity: voltages: [220., 300., 380.] + gaslimit_enable: false gaslimit: false + co2limit_enable: false co2limit: 7.75e+7 co2base: 1.487e+9 agg_p_nom_limits: data/agg_p_nom_minmax.csv @@ -123,6 +159,17 @@ electricity: Onshore: [onwind] PV: [solar] + adjust_carrier: # This is the solar+c0.5 thing + enable: false + #solar: + # p_nom_max: + # capital_cost: + # marginal_cost: + + autarky: + enable: false + by_country: false + # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#atlite atlite: default_cutout: europe-2013-era5 @@ -573,6 +620,11 @@ costs: emission_prices: co2: 0. + enable: + emission_prices: false + monthly_prices: false + + # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#clustering clustering: simplify_network: diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index f9fdc3ac..6b9cde24 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -473,10 +473,14 @@ rule prepare_network: links=config["links"], lines=config["lines"], co2base=config["electricity"]["co2base"], + co2limit_enable=config["electricity"].get("co2limit_enable", False), co2limit=config["electricity"]["co2limit"], + gaslimit_enable=config["electricity"].get("gaslimit_enable", False), gaslimit=config["electricity"].get("gaslimit"), max_hours=config["electricity"]["max_hours"], costs=config["costs"], + snapshot_opts=config.get("snapshot_opts",{}), + autarky=config["electricity"].get("autarky",{}), input: RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", tech_costs=COSTS, diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 10a5f821..9845ac13 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -705,6 +705,7 @@ rule build_transport_demand: rule prepare_sector_network: params: + enable_sector=config.get("enable_sector", {}), co2_budget=config["co2_budget"], conventional_carriers=config["existing_capacities"]["conventional_carriers"], foresight=config["foresight"], @@ -717,6 +718,7 @@ rule prepare_sector_network: countries=config["countries"], emissions_scope=config["energy"]["emissions"], eurostat_report_year=config["energy"]["eurostat_report_year"], + snapshot_opts=config.get("snapshot_opts",{}), RDIR=RDIR, input: **build_retro_cost_output, diff --git a/scripts/_helpers.py b/scripts/_helpers.py index fc7bc9e0..714bf33f 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -7,6 +7,7 @@ import contextlib import logging import os import urllib +import re from pathlib import Path import pandas as pd @@ -21,6 +22,19 @@ logger = logging.getLogger(__name__) REGION_COLS = ["geometry", "name", "x", "y", "country"] +def get_opt(opts, expr, flags=None): + """ + Return the first option matching the regular expression. + The regular expression is case-insensitive by default. + """ + if flags is None: + flags = re.IGNORECASE + for o in opts: + match = re.match(expr, o, flags=flags) + if match: + return match.group(0) + return None + # Define a context manager to temporarily mute print statements @contextlib.contextmanager def mute_print(): diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index a5a00a3c..c3fe74b1 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -63,7 +63,7 @@ import re import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, get_opt from add_electricity import load_costs, update_transmission_costs from pypsa.descriptors import expand_series @@ -71,6 +71,18 @@ idx = pd.IndexSlice logger = logging.getLogger(__name__) +def find_opt(opts, expr): + """ + Return if available the float after the expression. + """ + for o in opts: + if expr in o: + m = re.findall("[0-9]*\.?[0-9]+$", o) + if len(m) > 0: + return True, float(m[0]) + else: + return True, None + return False, None def add_co2limit(n, co2limit, Nyears=1.0): n.add( @@ -296,43 +308,47 @@ if __name__ == "__main__": ) set_line_s_max_pu(n, snakemake.params.lines["s_max_pu"]) + + # temporal averaging + nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours",{}) + nhours_enable_config = nhours_opts_config.get("enable",None) + nhours_config = str(nhours_opts_config.get("hour",None)) + "h" + nhours_wildcard = get_opt(opts, r"^\d+h$") + if nhours_wildcard is not None or (nhours_enable_config and nhours_config is not None): + nhours = nhours_wildcard or nhours_config + n = average_every_nhours(n, nhours) - for o in opts: - m = re.match(r"^\d+h$", o, re.IGNORECASE) - if m is not None: - n = average_every_nhours(n, m.group(0)) - break + # segments with package tsam + time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation",{}) + time_seg_enable_config = nhours_opts_config.get("enable",None) + time_seg_config = str(nhours_opts_config.get("hour",None)) + "seg" + time_seg_wildcard = get_opt(opts, r"^\d+seg$") + if time_seg_wildcard is not None or (time_seg_enable_config and time_seg_config is not None): + time_seg = time_seg_wildcard or time_seg_config + solver_name = snakemake.config["solving"]["solver"]["name"] + n = apply_time_segmentation(n, time_seg, solver_name) - for o in opts: - m = re.match(r"^\d+seg$", o, re.IGNORECASE) - if m is not None: - solver_name = snakemake.config["solving"]["solver"]["name"] - n = apply_time_segmentation(n, m.group(0)[:-3], solver_name) - break + Co2L_config = snakemake.params.co2limit_enable and isinstance(snakemake.params.co2limit,float) + Co2L_wildcard, co2limit_wildcard = find_opt(opts, "Co2L") + if Co2L_wildcard or Co2L_config: + if co2limit_wildcard is not None: # TODO: what if you wat to determine the factor through the wildcard? + co2limit = co2limit_wildcard * snakemake.params.co2base + add_co2limit(n, co2limit, Nyears) + logger.info("Setting CO2 limit according to wildcard value.") + else: + add_co2limit(n, snakemake.params.co2limit, Nyears) + logger.info("Setting CO2 limit according to config value.") - for o in opts: - if "Co2L" in o: - m = re.findall("[0-9]*\.?[0-9]+$", o) - if len(m) > 0: - co2limit = float(m[0]) * snakemake.params.co2base - add_co2limit(n, co2limit, Nyears) - logger.info("Setting CO2 limit according to wildcard value.") - else: - add_co2limit(n, snakemake.params.co2limit, Nyears) - logger.info("Setting CO2 limit according to config value.") - break - - for o in opts: - if "CH4L" in o: - m = re.findall("[0-9]*\.?[0-9]+$", o) - if len(m) > 0: - limit = float(m[0]) * 1e6 - add_gaslimit(n, limit, Nyears) - logger.info("Setting gas usage limit according to wildcard value.") - else: - add_gaslimit(n, snakemake.params.gaslimit, Nyears) - logger.info("Setting gas usage limit according to config value.") - break + CH4L_config = snakemake.params.gaslimit_enable and isinstance(snakemake.params.gaslimit,float) + CH4L_wildcard, gaslimit_wildcard = find_opt(opts, "CH4L") + if CH4L_wildcard or CH4L_config: + if gaslimit_wildcard is not None: # TODO: what if you wat to determine the factor through the wildcard? + gaslimit = gaslimit_wildcard * 1e6 + add_gaslimit(n, gaslimit, Nyears) + logger.info("Setting gas usage limit according to wildcard value.") + else: + add_gaslimit(n, snakemake.params.gaslimit, Nyears) + logger.info("Setting gas usage limit according to config value.") for o in opts: if "+" not in o: @@ -353,21 +369,24 @@ if __name__ == "__main__": sel = c.df.carrier.str.contains(carrier) c.df.loc[sel, attr] *= factor + Ept_config = snakemake.params.costs.get("enable",{}).get("monthly_prices", False) for o in opts: - if "Ept" in o: + if "Ept" in o or Ept_config: logger.info( "Setting time dependent emission prices according spot market price" ) add_dynamic_emission_prices(n) - elif "Ep" in o: - m = re.findall("[0-9]*\.?[0-9]+$", o) - if len(m) > 0: - logger.info("Setting emission prices according to wildcard value.") - add_emission_prices(n, dict(co2=float(m[0]))) - else: - logger.info("Setting emission prices according to config value.") - add_emission_prices(n, snakemake.params.costs["emission_prices"]) - break + Ept_config = True + + Ep_config = snakemake.params.costs.get("enable",{}).get("emission_prices", False) + Ep_wildcard, co2_wildcard = find_opt(opts, "Ep") + if (Ep_wildcard or Ep_config) and not Ept_config: + if co2_wildcard is not None: + logger.info("Setting emission prices according to wildcard value.") + add_emission_prices(n, dict(co2=co2_wildcard)) + else: + logger.info("Setting emission prices according to config value.") + add_emission_prices(n, snakemake.params.costs["emission_prices"]) ll_type, factor = snakemake.wildcards.ll[0], snakemake.wildcards.ll[1:] set_transmission_limit(n, ll_type, factor, costs, Nyears) @@ -380,10 +399,12 @@ if __name__ == "__main__": p_nom_max_ext=snakemake.params.links.get("max_extension", np.inf), ) - if "ATK" in opts: - enforce_autarky(n) - elif "ATKc" in opts: - enforce_autarky(n, only_crossborder=True) + autarky_config = snakemake.params.autarky + if "ATK" in opts or autarky_config.get("enable", False): + only_crossborder = False + if "ATKc" in opts or autarky_config.get("by_country", False): + only_crossborder = True + enforce_autarky(n, only_crossborder=only_crossborder) n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) n.export_to_netcdf(snakemake.output[0]) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 11406bff..af666f5d 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -17,7 +17,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import generate_periodic_profiles, update_config_with_sector_opts +from _helpers import generate_periodic_profiles, update_config_with_sector_opts, get_opt from add_electricity import calculate_annuity, sanitize_carriers from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement @@ -161,11 +161,11 @@ spatial = SimpleNamespace() def emission_sectors_from_opts(opts): sectors = ["electricity"] - if "T" in opts: + if "T" in opts or opts_config.get("land_transport",False): sectors += ["rail non-elec", "road non-elec"] - if "H" in opts: + if "H" in opts or opts_config.get("heating",False): sectors += ["residential non-elec", "services non-elec"] - if "I" in opts: + if "I" in opts or opts_config.get("industry",False): sectors += [ "industrial non-elec", "industrial processes", @@ -174,7 +174,10 @@ def emission_sectors_from_opts(opts): "domestic navigation", "international navigation", ] - if "A" in opts: + + heat_and_industry = opts_config.get("industry",False) and opts_config.get("heating",False) + + if ("I" in opts and "H" in opts and"A" in opts) or (heat_and_industry and opts_config.get("agriculture_machinery",False)): sectors += ["agriculture"] return sectors @@ -3256,27 +3259,39 @@ def set_temporal_aggregation(n, opts, solver_name): """ Aggregate network temporally. """ - for o in opts: - # temporal averaging - m = re.match(r"^\d+h$", o, re.IGNORECASE) - if m is not None: - n = average_every_nhours(n, m.group(0)) - break - # representative snapshots - m = re.match(r"(^\d+)sn$", o, re.IGNORECASE) - if m is not None: - sn = int(m[1]) - logger.info(f"Use every {sn} snapshot as representative") - n.set_snapshots(n.snapshots[::sn]) - n.snapshot_weightings *= sn - break - # segments with package tsam - m = re.match(r"^(\d+)seg$", o, re.IGNORECASE) - if m is not None: - segments = int(m[1]) - logger.info(f"Use temporal segmentation with {segments} segments") - n = apply_time_segmentation(n, segments, solver_name=solver_name) - break + # temporal averaging + nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours",{}) + nhours_enable_config = nhours_opts_config.get("enable",None) + nhours_config = str(nhours_opts_config.get("hour",None)) + "H" + nhours_wildcard = get_opt(opts, r"^\d+h$") + if nhours_wildcard is not None or (nhours_enable_config and nhours_config is not None): + nhours = nhours_wildcard or nhours_config + n = average_every_nhours(n, nhours) + return n + + # representative snapshots + snapshots_opts_config = snakemake.params.snapshot_opts.get("set_snapshots",{}) + snapshots_enable_config = snapshots_opts_config.get("enable",None) + snapshots_config = snapshots_opts_config.get("hour",None) + snapshots_wildcard = get_opt(opts, r"(^\d+)sn$") + if snapshots_wildcard is not None or (snapshots_enable_config and snapshots_config is not None): + sn = int(snapshots_wildcard[:-2]) or snapshots_config + logger.info(f"Use every {sn} snapshot as representative") + n.set_snapshots(n.snapshots[::sn]) + n.snapshot_weightings *= sn + return n + + # segments with package tsam + time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation",{}) + time_seg_enable_config = nhours_opts_config.get("enable",None) + time_seg_config = nhours_opts_config.get("hour",None) + time_seg_wildcard = get_opt(opts, r"^(\d+)seg$") + if time_seg_wildcard is not None or (time_seg_enable_config and time_seg_config is not None): + segments = int(time_seg_wildcard[:-3]) or time_seg_config + logger.info(f"Use temporal segmentation with {segments} segments") + n = apply_time_segmentation(n, segments, solver_name=solver_name) + return n + return n @@ -3303,6 +3318,10 @@ if __name__ == "__main__": opts = snakemake.wildcards.sector_opts.split("-") + opts_config = snakemake.params.enable_sector + + heat_and_industry = opts_config.get("industry",False) and opts_config.get("heating",False) + investment_year = int(snakemake.wildcards.planning_horizons[-4:]) n = pypsa.Network(snakemake.input.network) @@ -3340,51 +3359,53 @@ if __name__ == "__main__": # TODO merge with opts cost adjustment below for o in opts: - if o[:4] == "wave": + if o[:4] == "wave": # TODO: add config wildcard options or depreciated? wave_cost_factor = float(o[4:].replace("p", ".").replace("m", "-")) logger.info( f"Including wave generators with cost factor of {wave_cost_factor}" ) add_wave(n, wave_cost_factor) - if o[:4] == "dist": + if o[:4] == "dist": # TODO: add config wildcard options options["electricity_distribution_grid"] = True options["electricity_distribution_grid_cost_factor"] = float( o[4:].replace("p", ".").replace("m", "-") ) - if o == "biomasstransport": + for o in opts: + if o == "biomasstransport" or opts_config.get("biomass_transport",False): options["biomass_transport"] = True + break - if "nodistrict" in opts: + if "nodistrict" in opts or opts_config.get("no_heat_district",False): options["district_heating"]["progress"] = 0.0 - if "T" in opts: + if "T" in opts or opts_config.get("land_transport",False): add_land_transport(n, costs) - if "H" in opts: + if "H" in opts or opts_config.get("heating",False): add_heat(n, costs) - if "B" in opts: + if "B" in opts or opts_config.get("biomass",False): add_biomass(n, costs) if options["ammonia"]: add_ammonia(n, costs) - if "I" in opts: + if "I" in opts or opts_config.get("industry",False): add_industry(n, costs) - if "I" in opts and "H" in opts: + if ("I" in opts and "H" in opts) or (heat_and_industry and opts_config.get("waste_heat",False)): add_waste_heat(n) - if "A" in opts: # requires H and I + if ("I" in opts and "H" in opts and"A" in opts) or (heat_and_industry and opts_config.get("agriculture_machinery",False)): # requires H and I add_agriculture(n, costs) if options["dac"]: add_dac(n, costs) - if "decentral" in opts: + if "decentral" in opts or opts_config.get("decentral",False): decentral(n) - if "noH2network" in opts: + if "noH2network" in opts or opts_config.get("noH2network",False): remove_h2_network(n) if options["co2network"]: @@ -3399,7 +3420,7 @@ if __name__ == "__main__": limit_type = "config" limit = get(snakemake.params.co2_budget, investment_year) for o in opts: - if "cb" not in o: + if "cb" not in o or opts_config.get("carbon_budget",False) is False: continue limit_type = "carbon budget" fn = "results/" + snakemake.params.RDIR + "csvs/carbon_budget_distribution.csv" @@ -3419,7 +3440,7 @@ if __name__ == "__main__": limit = co2_cap.loc[investment_year] break for o in opts: - if "Co2L" not in o: + if "Co2L" not in o or opts_config.get("co2limit_sector",False) is False: continue limit_type = "wildcard" limit = o[o.find("Co2L") + 4 :] @@ -3428,7 +3449,7 @@ if __name__ == "__main__": logger.info(f"Add CO2 limit from {limit_type}") add_co2limit(n, nyears, limit) - for o in opts: + for o in opts: # TODO: add config wildcard options or depreciated? if not o[:10] == "linemaxext": continue maxext = float(o[10:]) * 1e3 From 3eed3410448c93426af03e2fce23aaa7db986e73 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 21:03:58 +0000 Subject: [PATCH 031/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_electricity.smk | 4 +- rules/build_sector.smk | 2 +- scripts/_helpers.py | 4 +- scripts/prepare_network.py | 50 +++++++++++------- scripts/prepare_sector_network.py | 84 ++++++++++++++++++------------- 5 files changed, 88 insertions(+), 56 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 6b9cde24..b15796c9 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -479,8 +479,8 @@ rule prepare_network: gaslimit=config["electricity"].get("gaslimit"), max_hours=config["electricity"]["max_hours"], costs=config["costs"], - snapshot_opts=config.get("snapshot_opts",{}), - autarky=config["electricity"].get("autarky",{}), + snapshot_opts=config.get("snapshot_opts", {}), + autarky=config["electricity"].get("autarky", {}), input: RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", tech_costs=COSTS, diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 9845ac13..1bee1ed0 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -718,7 +718,7 @@ rule prepare_sector_network: countries=config["countries"], emissions_scope=config["energy"]["emissions"], eurostat_report_year=config["energy"]["eurostat_report_year"], - snapshot_opts=config.get("snapshot_opts",{}), + snapshot_opts=config.get("snapshot_opts", {}), RDIR=RDIR, input: **build_retro_cost_output, diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 714bf33f..01349e08 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -6,8 +6,8 @@ import contextlib import logging import os -import urllib import re +import urllib from pathlib import Path import pandas as pd @@ -25,6 +25,7 @@ REGION_COLS = ["geometry", "name", "x", "y", "country"] def get_opt(opts, expr, flags=None): """ Return the first option matching the regular expression. + The regular expression is case-insensitive by default. """ if flags is None: @@ -35,6 +36,7 @@ def get_opt(opts, expr, flags=None): return match.group(0) return None + # Define a context manager to temporarily mute print statements @contextlib.contextmanager def mute_print(): diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index c3fe74b1..2a2d73f8 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -71,6 +71,7 @@ idx = pd.IndexSlice logger = logging.getLogger(__name__) + def find_opt(opts, expr): """ Return if available the float after the expression. @@ -84,6 +85,7 @@ def find_opt(opts, expr): return True, None return False, None + def add_co2limit(n, co2limit, Nyears=1.0): n.add( "GlobalConstraint", @@ -308,45 +310,57 @@ if __name__ == "__main__": ) set_line_s_max_pu(n, snakemake.params.lines["s_max_pu"]) - + # temporal averaging - nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours",{}) - nhours_enable_config = nhours_opts_config.get("enable",None) - nhours_config = str(nhours_opts_config.get("hour",None)) + "h" + nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours", {}) + nhours_enable_config = nhours_opts_config.get("enable", None) + nhours_config = str(nhours_opts_config.get("hour", None)) + "h" nhours_wildcard = get_opt(opts, r"^\d+h$") - if nhours_wildcard is not None or (nhours_enable_config and nhours_config is not None): + if nhours_wildcard is not None or ( + nhours_enable_config and nhours_config is not None + ): nhours = nhours_wildcard or nhours_config n = average_every_nhours(n, nhours) # segments with package tsam - time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation",{}) - time_seg_enable_config = nhours_opts_config.get("enable",None) - time_seg_config = str(nhours_opts_config.get("hour",None)) + "seg" + time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation", {}) + time_seg_enable_config = nhours_opts_config.get("enable", None) + time_seg_config = str(nhours_opts_config.get("hour", None)) + "seg" time_seg_wildcard = get_opt(opts, r"^\d+seg$") - if time_seg_wildcard is not None or (time_seg_enable_config and time_seg_config is not None): + if time_seg_wildcard is not None or ( + time_seg_enable_config and time_seg_config is not None + ): time_seg = time_seg_wildcard or time_seg_config solver_name = snakemake.config["solving"]["solver"]["name"] n = apply_time_segmentation(n, time_seg, solver_name) - Co2L_config = snakemake.params.co2limit_enable and isinstance(snakemake.params.co2limit,float) + Co2L_config = snakemake.params.co2limit_enable and isinstance( + snakemake.params.co2limit, float + ) Co2L_wildcard, co2limit_wildcard = find_opt(opts, "Co2L") if Co2L_wildcard or Co2L_config: - if co2limit_wildcard is not None: # TODO: what if you wat to determine the factor through the wildcard? + if ( + co2limit_wildcard is not None + ): # TODO: what if you wat to determine the factor through the wildcard? co2limit = co2limit_wildcard * snakemake.params.co2base add_co2limit(n, co2limit, Nyears) logger.info("Setting CO2 limit according to wildcard value.") - else: + else: add_co2limit(n, snakemake.params.co2limit, Nyears) logger.info("Setting CO2 limit according to config value.") - CH4L_config = snakemake.params.gaslimit_enable and isinstance(snakemake.params.gaslimit,float) + CH4L_config = snakemake.params.gaslimit_enable and isinstance( + snakemake.params.gaslimit, float + ) CH4L_wildcard, gaslimit_wildcard = find_opt(opts, "CH4L") if CH4L_wildcard or CH4L_config: - if gaslimit_wildcard is not None: # TODO: what if you wat to determine the factor through the wildcard? + if ( + gaslimit_wildcard is not None + ): # TODO: what if you wat to determine the factor through the wildcard? gaslimit = gaslimit_wildcard * 1e6 add_gaslimit(n, gaslimit, Nyears) logger.info("Setting gas usage limit according to wildcard value.") - else: + else: add_gaslimit(n, snakemake.params.gaslimit, Nyears) logger.info("Setting gas usage limit according to config value.") @@ -369,7 +383,7 @@ if __name__ == "__main__": sel = c.df.carrier.str.contains(carrier) c.df.loc[sel, attr] *= factor - Ept_config = snakemake.params.costs.get("enable",{}).get("monthly_prices", False) + Ept_config = snakemake.params.costs.get("enable", {}).get("monthly_prices", False) for o in opts: if "Ept" in o or Ept_config: logger.info( @@ -378,13 +392,13 @@ if __name__ == "__main__": add_dynamic_emission_prices(n) Ept_config = True - Ep_config = snakemake.params.costs.get("enable",{}).get("emission_prices", False) + Ep_config = snakemake.params.costs.get("enable", {}).get("emission_prices", False) Ep_wildcard, co2_wildcard = find_opt(opts, "Ep") if (Ep_wildcard or Ep_config) and not Ept_config: if co2_wildcard is not None: logger.info("Setting emission prices according to wildcard value.") add_emission_prices(n, dict(co2=co2_wildcard)) - else: + else: logger.info("Setting emission prices according to config value.") add_emission_prices(n, snakemake.params.costs["emission_prices"]) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index af666f5d..a2ffc3da 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -17,7 +17,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import generate_periodic_profiles, update_config_with_sector_opts, get_opt +from _helpers import generate_periodic_profiles, get_opt, update_config_with_sector_opts from add_electricity import calculate_annuity, sanitize_carriers from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement @@ -161,11 +161,11 @@ spatial = SimpleNamespace() def emission_sectors_from_opts(opts): sectors = ["electricity"] - if "T" in opts or opts_config.get("land_transport",False): + if "T" in opts or opts_config.get("land_transport", False): sectors += ["rail non-elec", "road non-elec"] - if "H" in opts or opts_config.get("heating",False): + if "H" in opts or opts_config.get("heating", False): sectors += ["residential non-elec", "services non-elec"] - if "I" in opts or opts_config.get("industry",False): + if "I" in opts or opts_config.get("industry", False): sectors += [ "industrial non-elec", "industrial processes", @@ -175,9 +175,13 @@ def emission_sectors_from_opts(opts): "international navigation", ] - heat_and_industry = opts_config.get("industry",False) and opts_config.get("heating",False) + heat_and_industry = opts_config.get("industry", False) and opts_config.get( + "heating", False + ) - if ("I" in opts and "H" in opts and"A" in opts) or (heat_and_industry and opts_config.get("agriculture_machinery",False)): + if ("I" in opts and "H" in opts and "A" in opts) or ( + heat_and_industry and opts_config.get("agriculture_machinery", False) + ): sectors += ["agriculture"] return sectors @@ -3260,21 +3264,25 @@ def set_temporal_aggregation(n, opts, solver_name): Aggregate network temporally. """ # temporal averaging - nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours",{}) - nhours_enable_config = nhours_opts_config.get("enable",None) - nhours_config = str(nhours_opts_config.get("hour",None)) + "H" + nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours", {}) + nhours_enable_config = nhours_opts_config.get("enable", None) + nhours_config = str(nhours_opts_config.get("hour", None)) + "H" nhours_wildcard = get_opt(opts, r"^\d+h$") - if nhours_wildcard is not None or (nhours_enable_config and nhours_config is not None): + if nhours_wildcard is not None or ( + nhours_enable_config and nhours_config is not None + ): nhours = nhours_wildcard or nhours_config n = average_every_nhours(n, nhours) return n # representative snapshots - snapshots_opts_config = snakemake.params.snapshot_opts.get("set_snapshots",{}) - snapshots_enable_config = snapshots_opts_config.get("enable",None) - snapshots_config = snapshots_opts_config.get("hour",None) + snapshots_opts_config = snakemake.params.snapshot_opts.get("set_snapshots", {}) + snapshots_enable_config = snapshots_opts_config.get("enable", None) + snapshots_config = snapshots_opts_config.get("hour", None) snapshots_wildcard = get_opt(opts, r"(^\d+)sn$") - if snapshots_wildcard is not None or (snapshots_enable_config and snapshots_config is not None): + if snapshots_wildcard is not None or ( + snapshots_enable_config and snapshots_config is not None + ): sn = int(snapshots_wildcard[:-2]) or snapshots_config logger.info(f"Use every {sn} snapshot as representative") n.set_snapshots(n.snapshots[::sn]) @@ -3282,11 +3290,13 @@ def set_temporal_aggregation(n, opts, solver_name): return n # segments with package tsam - time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation",{}) - time_seg_enable_config = nhours_opts_config.get("enable",None) - time_seg_config = nhours_opts_config.get("hour",None) + time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation", {}) + time_seg_enable_config = nhours_opts_config.get("enable", None) + time_seg_config = nhours_opts_config.get("hour", None) time_seg_wildcard = get_opt(opts, r"^(\d+)seg$") - if time_seg_wildcard is not None or (time_seg_enable_config and time_seg_config is not None): + if time_seg_wildcard is not None or ( + time_seg_enable_config and time_seg_config is not None + ): segments = int(time_seg_wildcard[:-3]) or time_seg_config logger.info(f"Use temporal segmentation with {segments} segments") n = apply_time_segmentation(n, segments, solver_name=solver_name) @@ -3320,7 +3330,9 @@ if __name__ == "__main__": opts_config = snakemake.params.enable_sector - heat_and_industry = opts_config.get("industry",False) and opts_config.get("heating",False) + heat_and_industry = opts_config.get("industry", False) and opts_config.get( + "heating", False + ) investment_year = int(snakemake.wildcards.planning_horizons[-4:]) @@ -3359,53 +3371,57 @@ if __name__ == "__main__": # TODO merge with opts cost adjustment below for o in opts: - if o[:4] == "wave": # TODO: add config wildcard options or depreciated? + if o[:4] == "wave": # TODO: add config wildcard options or depreciated? wave_cost_factor = float(o[4:].replace("p", ".").replace("m", "-")) logger.info( f"Including wave generators with cost factor of {wave_cost_factor}" ) add_wave(n, wave_cost_factor) - if o[:4] == "dist": # TODO: add config wildcard options + if o[:4] == "dist": # TODO: add config wildcard options options["electricity_distribution_grid"] = True options["electricity_distribution_grid_cost_factor"] = float( o[4:].replace("p", ".").replace("m", "-") ) for o in opts: - if o == "biomasstransport" or opts_config.get("biomass_transport",False): + if o == "biomasstransport" or opts_config.get("biomass_transport", False): options["biomass_transport"] = True break - if "nodistrict" in opts or opts_config.get("no_heat_district",False): + if "nodistrict" in opts or opts_config.get("no_heat_district", False): options["district_heating"]["progress"] = 0.0 - if "T" in opts or opts_config.get("land_transport",False): + if "T" in opts or opts_config.get("land_transport", False): add_land_transport(n, costs) - if "H" in opts or opts_config.get("heating",False): + if "H" in opts or opts_config.get("heating", False): add_heat(n, costs) - if "B" in opts or opts_config.get("biomass",False): + if "B" in opts or opts_config.get("biomass", False): add_biomass(n, costs) if options["ammonia"]: add_ammonia(n, costs) - if "I" in opts or opts_config.get("industry",False): + if "I" in opts or opts_config.get("industry", False): add_industry(n, costs) - if ("I" in opts and "H" in opts) or (heat_and_industry and opts_config.get("waste_heat",False)): + if ("I" in opts and "H" in opts) or ( + heat_and_industry and opts_config.get("waste_heat", False) + ): add_waste_heat(n) - if ("I" in opts and "H" in opts and"A" in opts) or (heat_and_industry and opts_config.get("agriculture_machinery",False)): # requires H and I + if ("I" in opts and "H" in opts and "A" in opts) or ( + heat_and_industry and opts_config.get("agriculture_machinery", False) + ): # requires H and I add_agriculture(n, costs) if options["dac"]: add_dac(n, costs) - if "decentral" in opts or opts_config.get("decentral",False): + if "decentral" in opts or opts_config.get("decentral", False): decentral(n) - if "noH2network" in opts or opts_config.get("noH2network",False): + if "noH2network" in opts or opts_config.get("noH2network", False): remove_h2_network(n) if options["co2network"]: @@ -3420,7 +3436,7 @@ if __name__ == "__main__": limit_type = "config" limit = get(snakemake.params.co2_budget, investment_year) for o in opts: - if "cb" not in o or opts_config.get("carbon_budget",False) is False: + if "cb" not in o or opts_config.get("carbon_budget", False) is False: continue limit_type = "carbon budget" fn = "results/" + snakemake.params.RDIR + "csvs/carbon_budget_distribution.csv" @@ -3440,7 +3456,7 @@ if __name__ == "__main__": limit = co2_cap.loc[investment_year] break for o in opts: - if "Co2L" not in o or opts_config.get("co2limit_sector",False) is False: + if "Co2L" not in o or opts_config.get("co2limit_sector", False) is False: continue limit_type = "wildcard" limit = o[o.find("Co2L") + 4 :] @@ -3449,7 +3465,7 @@ if __name__ == "__main__": logger.info(f"Add CO2 limit from {limit_type}") add_co2limit(n, nyears, limit) - for o in opts: # TODO: add config wildcard options or depreciated? + for o in opts: # TODO: add config wildcard options or depreciated? if not o[:10] == "linemaxext": continue maxext = float(o[10:]) * 1e3 From cc162a9e028fb7a2bac5289e27b90ab57e46f10b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 31 Jul 2023 17:09:59 +0200 Subject: [PATCH 032/497] option for losses on bidirectional links via link splitting --- config/config.default.yaml | 5 ++++ scripts/prepare_sector_network.py | 40 +++++++++++++++++++++++++++++++ scripts/solve_network.py | 22 +++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index b162b75d..4413b8f5 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -478,6 +478,11 @@ sector: electricity_distribution_grid: true electricity_distribution_grid_cost_factor: 1.0 electricity_grid_connection: true + transmission_losses: + # per 1000 km + DC: 0 + H2 pipeline: 0 + gas pipeline: 0 H2_network: true gas_network: false H2_retrofit: false diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 11406bff..8719c281 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3280,6 +3280,34 @@ def set_temporal_aggregation(n, opts, solver_name): return n +def lossy_bidirectional_links(n, carrier, losses_per_thousand_km=0.0): + "Split bidirectional links into two unidirectional links to include transmission losses." + + carrier_i = n.links.query("carrier == @carrier").index + + if not losses_per_thousand_km or carrier_i.empty: + return + + logger.info( + f"Specified losses for {carrier} transmission. Splitting bidirectional links." + ) + + carrier_i = n.links.query("carrier == @carrier").index + n.links.loc[carrier_i, "p_min_pu"] = 0 + n.links["reversed"] = False + n.links.loc[carrier_i, "efficiency"] = ( + 1 - n.links.loc[carrier_i, "length"] * losses_per_thousand_km / 1e3 + ) + rev_links = ( + n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) + ) + rev_links.capital_cost = 0 + rev_links.reversed = True + rev_links.index = rev_links.index.map(lambda x: x + "-reversed") + + n.links = pd.concat([n.links, rev_links], sort=False) + + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -3446,6 +3474,18 @@ if __name__ == "__main__": if options["electricity_grid_connection"]: add_electricity_grid_connection(n, costs) + for k, v in options["transmission_losses"].items(): + lossy_bidirectional_links(n, k, v) + + # Workaround: Remove lines with conflicting (and unrealistic) properties + # cf. https://github.com/PyPSA/pypsa-eur/issues/444 + if snakemake.config["solving"]["options"]["transmission_losses"]: + idx = n.lines.query("num_parallel == 0").index + logger.info( + f"Removing {len(idx)} line(s) with properties conflicting with transmission losses functionality." + ) + n.mremove("Line", idx) + first_year_myopic = (snakemake.params.foresight == "myopic") and ( snakemake.params.planning_horizons[0] == investment_year ) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 836544b4..a68ca074 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -494,6 +494,27 @@ def add_battery_constraints(n): n.model.add_constraints(lhs == 0, name="Link-charger_ratio") +def add_lossy_bidirectional_link_constraints(n): + if not n.links.p_nom_extendable.any() or not "reversed" in n.links.columns: + return + + carriers = n.links.loc[n.links.reversed, "carrier"].unique() + + backward_i = n.links.query( + "carrier in @carriers and reversed and p_nom_extendable" + ).index + forward_i = n.links.query( + "carrier in @carriers and ~reversed and p_nom_extendable" + ).index + + assert len(forward_i) == len(backward_i) + + lhs = n.model["Link-p_nom"].loc[backward_i] + rhs = n.model["Link-p_nom"].loc[forward_i] + + n.model.add_constraints(lhs == rhs, name="Link-bidirectional_sync") + + def add_chp_constraints(n): electric = ( n.links.index.str.contains("urban central") @@ -593,6 +614,7 @@ def extra_functionality(n, snapshots): if "EQ" in o: add_EQ_constraints(n, o) add_battery_constraints(n) + add_lossy_bidirectional_link_constraints(n) add_pipe_retrofit_constraint(n) From e4eff27e508406055284ba77f4727df7e2dcbc6c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 3 Aug 2023 13:09:12 +0200 Subject: [PATCH 033/497] fix capacity synchronisation between forward and backward lossy links --- scripts/prepare_sector_network.py | 4 ++-- scripts/solve_network.py | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8719c281..b8eb8bc1 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3294,7 +3294,6 @@ def lossy_bidirectional_links(n, carrier, losses_per_thousand_km=0.0): carrier_i = n.links.query("carrier == @carrier").index n.links.loc[carrier_i, "p_min_pu"] = 0 - n.links["reversed"] = False n.links.loc[carrier_i, "efficiency"] = ( 1 - n.links.loc[carrier_i, "length"] * losses_per_thousand_km / 1e3 ) @@ -3302,10 +3301,11 @@ def lossy_bidirectional_links(n, carrier, losses_per_thousand_km=0.0): n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) ) rev_links.capital_cost = 0 - rev_links.reversed = True + rev_links["reversed"] = True rev_links.index = rev_links.index.map(lambda x: x + "-reversed") n.links = pd.concat([n.links, rev_links], sort=False) + n.links["reversed"] = n.links["reversed"].fillna(False) if __name__ == "__main__": diff --git a/scripts/solve_network.py b/scripts/solve_network.py index a68ca074..5e8c0356 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -500,14 +500,10 @@ def add_lossy_bidirectional_link_constraints(n): carriers = n.links.loc[n.links.reversed, "carrier"].unique() - backward_i = n.links.query( - "carrier in @carriers and reversed and p_nom_extendable" - ).index forward_i = n.links.query( "carrier in @carriers and ~reversed and p_nom_extendable" ).index - - assert len(forward_i) == len(backward_i) + backward_i = forward_i + "-reversed" lhs = n.model["Link-p_nom"].loc[backward_i] rhs = n.model["Link-p_nom"].loc[forward_i] From d7cb13246b807e7907c49ad1214559be92d2f363 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 7 Aug 2023 14:31:19 +0200 Subject: [PATCH 034/497] link losses: exponential rather than linear model --- config/config.default.yaml | 13 ++++++++----- scripts/prepare_sector_network.py | 15 ++++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 4413b8f5..1b0a2260 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -478,11 +478,14 @@ sector: electricity_distribution_grid: true electricity_distribution_grid_cost_factor: 1.0 electricity_grid_connection: true - transmission_losses: - # per 1000 km - DC: 0 - H2 pipeline: 0 - gas pipeline: 0 + transmission_efficiency: + DC: + efficiency_static: 0.98 + efficiency_per_1000km: 0.977 + H2 pipeline: + efficiency_per_1000km: 0.979 + gas pipeline: + efficiency_per_1000km: 0.977 H2_network: true gas_network: false H2_retrofit: false diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b8eb8bc1..48f5f41f 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3280,22 +3280,27 @@ def set_temporal_aggregation(n, opts, solver_name): return n -def lossy_bidirectional_links(n, carrier, losses_per_thousand_km=0.0): +def lossy_bidirectional_links(n, carrier, efficiencies={}): "Split bidirectional links into two unidirectional links to include transmission losses." carrier_i = n.links.query("carrier == @carrier").index - if not losses_per_thousand_km or carrier_i.empty: + if not any(v != 1. for v in efficiencies.values()) or carrier_i.empty: return + efficiency_static = efficiencies.get("efficiency_static", 1) + efficiency_per_1000km = efficiencies.get("efficiency_per_1000km", 1) + logger.info( - f"Specified losses for {carrier} transmission. Splitting bidirectional links." + f"Specified losses for {carrier} transmission" + f"(static: {efficiency_static}, per 1000km: {efficiency_per_1000km})." + "Splitting bidirectional links." ) carrier_i = n.links.query("carrier == @carrier").index n.links.loc[carrier_i, "p_min_pu"] = 0 n.links.loc[carrier_i, "efficiency"] = ( - 1 - n.links.loc[carrier_i, "length"] * losses_per_thousand_km / 1e3 + efficiency_static * efficiency_per_1000km ** (n.links.loc[carrier_i, "length"] / 1e3) ) rev_links = ( n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) @@ -3474,7 +3479,7 @@ if __name__ == "__main__": if options["electricity_grid_connection"]: add_electricity_grid_connection(n, costs) - for k, v in options["transmission_losses"].items(): + for k, v in options["transmission_efficiency"].items(): lossy_bidirectional_links(n, k, v) # Workaround: Remove lines with conflicting (and unrealistic) properties From 118cabe8a60b238ef11aafc980a406011ea9f0fb Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 8 Aug 2023 17:56:22 +0200 Subject: [PATCH 035/497] add option to consider compression losses in pipelines as electricity demand --- config/config.default.yaml | 6 ++++-- scripts/prepare_sector_network.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 1b0a2260..81a26a0b 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -483,9 +483,11 @@ sector: efficiency_static: 0.98 efficiency_per_1000km: 0.977 H2 pipeline: - efficiency_per_1000km: 0.979 + efficiency_per_1000km: 1 # 0.979 + compression_per_1000km: 0.019 gas pipeline: - efficiency_per_1000km: 0.977 + efficiency_per_1000km: 1 #0.977 + compression_per_1000km: 0.01 H2_network: true gas_network: false H2_retrofit: false diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 48f5f41f..7b58329c 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3285,11 +3285,16 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): carrier_i = n.links.query("carrier == @carrier").index +<<<<<<< HEAD if not any(v != 1. for v in efficiencies.values()) or carrier_i.empty: +======= + if not any((v != 1.0) or (v >= 0) for v in efficiencies.values()) or carrier_i.empty: +>>>>>>> 5822adb0 (add option to consider compression losses in pipelines as electricity demand) return efficiency_static = efficiencies.get("efficiency_static", 1) efficiency_per_1000km = efficiencies.get("efficiency_per_1000km", 1) + compression_per_1000km = efficiencies.get("compression_per_1000km", 0) logger.info( f"Specified losses for {carrier} transmission" @@ -3297,7 +3302,6 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): "Splitting bidirectional links." ) - carrier_i = n.links.query("carrier == @carrier").index n.links.loc[carrier_i, "p_min_pu"] = 0 n.links.loc[carrier_i, "efficiency"] = ( efficiency_static * efficiency_per_1000km ** (n.links.loc[carrier_i, "length"] / 1e3) @@ -3312,6 +3316,11 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): n.links = pd.concat([n.links, rev_links], sort=False) n.links["reversed"] = n.links["reversed"].fillna(False) + # do compression losses after concatenation to take electricity consumption at bus0 in either direction + carrier_i = n.links.query("carrier == @carrier").index + if compression_per_1000km > 0: + n.links.loc[carrier_i, "bus2"] = n.links.loc[carrier_i, "bus0"].map(n.buses.location) # electricity + n.links.loc[carrier_i, "efficiency2"] = - compression_per_1000km * n.links.loc[carrier_i, "length"] / 1e3 if __name__ == "__main__": if "snakemake" not in globals(): From 592bc4eee7f57ef93e104f266595cb6d8ded754d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 12 Sep 2023 17:28:42 +0200 Subject: [PATCH 036/497] cherry-pick --- scripts/prepare_sector_network.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 7b58329c..de02095d 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3285,11 +3285,10 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): carrier_i = n.links.query("carrier == @carrier").index -<<<<<<< HEAD - if not any(v != 1. for v in efficiencies.values()) or carrier_i.empty: -======= - if not any((v != 1.0) or (v >= 0) for v in efficiencies.values()) or carrier_i.empty: ->>>>>>> 5822adb0 (add option to consider compression losses in pipelines as electricity demand) + if ( + not any((v != 1.0) or (v >= 0) for v in efficiencies.values()) + or carrier_i.empty + ): return efficiency_static = efficiencies.get("efficiency_static", 1) @@ -3303,8 +3302,10 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): ) n.links.loc[carrier_i, "p_min_pu"] = 0 - n.links.loc[carrier_i, "efficiency"] = ( - efficiency_static * efficiency_per_1000km ** (n.links.loc[carrier_i, "length"] / 1e3) + n.links.loc[ + carrier_i, "efficiency" + ] = efficiency_static * efficiency_per_1000km ** ( + n.links.loc[carrier_i, "length"] / 1e3 ) rev_links = ( n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) @@ -3319,8 +3320,13 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): # do compression losses after concatenation to take electricity consumption at bus0 in either direction carrier_i = n.links.query("carrier == @carrier").index if compression_per_1000km > 0: - n.links.loc[carrier_i, "bus2"] = n.links.loc[carrier_i, "bus0"].map(n.buses.location) # electricity - n.links.loc[carrier_i, "efficiency2"] = - compression_per_1000km * n.links.loc[carrier_i, "length"] / 1e3 + n.links.loc[carrier_i, "bus2"] = n.links.loc[carrier_i, "bus0"].map( + n.buses.location + ) # electricity + n.links.loc[carrier_i, "efficiency2"] = ( + -compression_per_1000km * n.links.loc[carrier_i, "length"] / 1e3 + ) + if __name__ == "__main__": if "snakemake" not in globals(): From 666e79e2fdb7b86348a81e097a0c6e200872b661 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 10 Aug 2023 17:13:19 +0200 Subject: [PATCH 037/497] improve logging for lossy bidirectional links --- scripts/prepare_sector_network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index de02095d..6355f603 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3296,8 +3296,8 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): compression_per_1000km = efficiencies.get("compression_per_1000km", 0) logger.info( - f"Specified losses for {carrier} transmission" - f"(static: {efficiency_static}, per 1000km: {efficiency_per_1000km})." + f"Specified losses for {carrier} transmission " + f"(static: {efficiency_static}, per 1000km: {efficiency_per_1000km}, compression per 1000km: {compression_per_1000km}). " "Splitting bidirectional links." ) From bde04eeac9dad86b9d05ce6d23f48d98a728ba7f Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 29 Aug 2023 16:32:01 +0200 Subject: [PATCH 038/497] lossy_bidirectional_links: set length of reversed lines to 0 to avoid double counting in line volume limit --- scripts/prepare_sector_network.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 6355f603..cd5d9570 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3311,6 +3311,7 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) ) rev_links.capital_cost = 0 + rev_links.length = 0 rev_links["reversed"] = True rev_links.index = rev_links.index.map(lambda x: x + "-reversed") From 7be8cc0773380915dccc06c227574528611a2ff9 Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Fri, 15 Sep 2023 11:55:52 +0200 Subject: [PATCH 039/497] undo changes in sector networks and simplify config --- config/config.default.yaml | 50 ++----------- rules/build_electricity.smk | 23 +++++- rules/build_sector.smk | 26 +++++-- rules/postprocess.smk | 6 +- rules/validate.smk | 18 ++++- scripts/prepare_network.py | 26 +++---- scripts/prepare_sector_network.py | 119 ++++++++++-------------------- 7 files changed, 114 insertions(+), 154 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index fcc74981..75de9437 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -59,14 +59,9 @@ snapshots: start: "2013-01-01" end: "2014-01-01" inclusive: 'left' - -snapshot_opts: - average_every_nhours: - enable: false - hour: 2 - time_segmentation: - enable: false - hour: 4380 + resolution: false + segmentation: false + #representative: false # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#enable enable: @@ -81,21 +76,6 @@ enable: retrieve_natura_raster: true custom_busmap: false -enable_sector: - no_heat_district: false - land_transport: false - heating: false - waste_heat: false - biomass: false - biomass_transport: false - agriculture_machinery: false - industry: false - decentral: false - #wave_energy: false - #wave_energy_factor: - noH2network: false - carbon_budget: false - co2limit_sector: false # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#co2-budget co2_budget: @@ -107,16 +87,6 @@ co2_budget: 2045: 0.032 2050: 0.000 -co2_budget_opts: - from_descrete_value: - enable: true - from_beta_decay: - enable: false # TODO: move to own rule with sector-opts wildcard? - value: 1 - from_exp_decay: - enable: false - value: 1 - # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#electricity electricity: voltages: [220., 300., 380.] @@ -159,13 +129,6 @@ electricity: Onshore: [onwind] PV: [solar] - adjust_carrier: # This is the solar+c0.5 thing - enable: false - #solar: - # p_nom_max: - # capital_cost: - # marginal_cost: - autarky: enable: false by_country: false @@ -618,12 +581,9 @@ costs: battery: 0. battery inverter: 0. emission_prices: + enable: false co2: 0. - - enable: - emission_prices: false - monthly_prices: false - + co2_monthly_prices: false # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#clustering clustering: diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index b15796c9..bfbc1bd2 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -20,7 +20,11 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, countries=config["countries"], load=config["load"], input: @@ -61,7 +65,11 @@ rule build_powerplants: rule base_network: params: countries=config["countries"], - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, lines=config["lines"], links=config["links"], transformers=config["transformers"], @@ -144,7 +152,11 @@ if config["enable"].get("build_cutout", False): rule build_cutout: params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, cutouts=config["atlite"]["cutouts"], input: regions_onshore=RESOURCES + "regions_onshore.geojson", @@ -470,6 +482,10 @@ rule add_extra_components: rule prepare_network: params: + snapshots={ + "resolution":config["snapshots"].get("resolution", False), + "segmentation":config["snapshots"].get("segmentation", False), + }, links=config["links"], lines=config["lines"], co2base=config["electricity"]["co2base"], @@ -479,7 +495,6 @@ rule prepare_network: gaslimit=config["electricity"].get("gaslimit"), max_hours=config["electricity"]["max_hours"], costs=config["costs"], - snapshot_opts=config.get("snapshot_opts", {}), autarky=config["electricity"].get("autarky", {}), input: RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 1bee1ed0..56a6b532 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -141,7 +141,11 @@ if not (config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]): rule build_heat_demands: params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", @@ -163,7 +167,11 @@ rule build_heat_demands: rule build_temperature_profiles: params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", @@ -215,7 +223,11 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, solar_thermal=config["solar_thermal"], input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", @@ -677,7 +689,11 @@ rule build_shipping_demand: rule build_transport_demand: params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, sector=config["sector"], input: clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", @@ -705,7 +721,6 @@ rule build_transport_demand: rule prepare_sector_network: params: - enable_sector=config.get("enable_sector", {}), co2_budget=config["co2_budget"], conventional_carriers=config["existing_capacities"]["conventional_carriers"], foresight=config["foresight"], @@ -718,7 +733,6 @@ rule prepare_sector_network: countries=config["countries"], emissions_scope=config["energy"]["emissions"], eurostat_report_year=config["energy"]["eurostat_report_year"], - snapshot_opts=config.get("snapshot_opts", {}), RDIR=RDIR, input: **build_retro_cost_output, diff --git a/rules/postprocess.smk b/rules/postprocess.smk index cf0038a3..42f0722e 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -55,7 +55,11 @@ rule make_summary: params: foresight=config["foresight"], costs=config["costs"], - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, scenario=config["scenario"], RDIR=RDIR, input: diff --git a/rules/validate.smk b/rules/validate.smk index cfb8c959..ece9bebd 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -17,7 +17,11 @@ rule build_electricity_production: The data is used for validation of the optimization results. """ params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, countries=config["countries"], output: RESOURCES + "historical_electricity_production.csv", @@ -35,7 +39,11 @@ rule build_cross_border_flows: The data is used for validation of the optimization results. """ params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, countries=config["countries"], input: network=RESOURCES + "networks/base.nc", @@ -55,7 +63,11 @@ rule build_electricity_prices: The data is used for validation of the optimization results. """ params: - snapshots=config["snapshots"], + snapshots={ + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + }, countries=config["countries"], output: RESOURCES + "historical_electricity_prices.csv", diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 2a2d73f8..f89db024 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -312,24 +312,16 @@ if __name__ == "__main__": set_line_s_max_pu(n, snakemake.params.lines["s_max_pu"]) # temporal averaging - nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours", {}) - nhours_enable_config = nhours_opts_config.get("enable", None) - nhours_config = str(nhours_opts_config.get("hour", None)) + "h" + nhours_config = snakemake.params.snapshots.get("resolution",False) nhours_wildcard = get_opt(opts, r"^\d+h$") - if nhours_wildcard is not None or ( - nhours_enable_config and nhours_config is not None - ): + if nhours_wildcard is not None or isinstance(nhours_config, str): nhours = nhours_wildcard or nhours_config n = average_every_nhours(n, nhours) # segments with package tsam - time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation", {}) - time_seg_enable_config = nhours_opts_config.get("enable", None) - time_seg_config = str(nhours_opts_config.get("hour", None)) + "seg" + time_seg_config = snakemake.params.snapshots.get("segmentation",False) time_seg_wildcard = get_opt(opts, r"^\d+seg$") - if time_seg_wildcard is not None or ( - time_seg_enable_config and time_seg_config is not None - ): + if time_seg_wildcard is not None or isinstance(time_seg_config, str): time_seg = time_seg_wildcard or time_seg_config solver_name = snakemake.config["solving"]["solver"]["name"] n = apply_time_segmentation(n, time_seg, solver_name) @@ -383,7 +375,7 @@ if __name__ == "__main__": sel = c.df.carrier.str.contains(carrier) c.df.loc[sel, attr] *= factor - Ept_config = snakemake.params.costs.get("enable", {}).get("monthly_prices", False) + Ept_config = snakemake.params.costs["emission_prices"].get("co2_monthly_prices", False) for o in opts: if "Ept" in o or Ept_config: logger.info( @@ -392,15 +384,15 @@ if __name__ == "__main__": add_dynamic_emission_prices(n) Ept_config = True - Ep_config = snakemake.params.costs.get("enable", {}).get("emission_prices", False) + Ep_config = snakemake.params.costs["emission_prices"].get("enable", False) Ep_wildcard, co2_wildcard = find_opt(opts, "Ep") if (Ep_wildcard or Ep_config) and not Ept_config: if co2_wildcard is not None: - logger.info("Setting emission prices according to wildcard value.") + logger.info("Setting CO2 prices according to wildcard value.") add_emission_prices(n, dict(co2=co2_wildcard)) else: - logger.info("Setting emission prices according to config value.") - add_emission_prices(n, snakemake.params.costs["emission_prices"]) + logger.info("Setting CO2 prices according to config value.") + add_emission_prices(n, dict(co2=snakemake.params.costs["emission_prices"]["co2"])) ll_type, factor = snakemake.wildcards.ll[0], snakemake.wildcards.ll[1:] set_transmission_limit(n, ll_type, factor, costs, Nyears) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index a2ffc3da..11406bff 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -17,7 +17,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import generate_periodic_profiles, get_opt, update_config_with_sector_opts +from _helpers import generate_periodic_profiles, update_config_with_sector_opts from add_electricity import calculate_annuity, sanitize_carriers from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement @@ -161,11 +161,11 @@ spatial = SimpleNamespace() def emission_sectors_from_opts(opts): sectors = ["electricity"] - if "T" in opts or opts_config.get("land_transport", False): + if "T" in opts: sectors += ["rail non-elec", "road non-elec"] - if "H" in opts or opts_config.get("heating", False): + if "H" in opts: sectors += ["residential non-elec", "services non-elec"] - if "I" in opts or opts_config.get("industry", False): + if "I" in opts: sectors += [ "industrial non-elec", "industrial processes", @@ -174,14 +174,7 @@ def emission_sectors_from_opts(opts): "domestic navigation", "international navigation", ] - - heat_and_industry = opts_config.get("industry", False) and opts_config.get( - "heating", False - ) - - if ("I" in opts and "H" in opts and "A" in opts) or ( - heat_and_industry and opts_config.get("agriculture_machinery", False) - ): + if "A" in opts: sectors += ["agriculture"] return sectors @@ -3263,45 +3256,27 @@ def set_temporal_aggregation(n, opts, solver_name): """ Aggregate network temporally. """ - # temporal averaging - nhours_opts_config = snakemake.params.snapshot_opts.get("average_every_nhours", {}) - nhours_enable_config = nhours_opts_config.get("enable", None) - nhours_config = str(nhours_opts_config.get("hour", None)) + "H" - nhours_wildcard = get_opt(opts, r"^\d+h$") - if nhours_wildcard is not None or ( - nhours_enable_config and nhours_config is not None - ): - nhours = nhours_wildcard or nhours_config - n = average_every_nhours(n, nhours) - return n - - # representative snapshots - snapshots_opts_config = snakemake.params.snapshot_opts.get("set_snapshots", {}) - snapshots_enable_config = snapshots_opts_config.get("enable", None) - snapshots_config = snapshots_opts_config.get("hour", None) - snapshots_wildcard = get_opt(opts, r"(^\d+)sn$") - if snapshots_wildcard is not None or ( - snapshots_enable_config and snapshots_config is not None - ): - sn = int(snapshots_wildcard[:-2]) or snapshots_config - logger.info(f"Use every {sn} snapshot as representative") - n.set_snapshots(n.snapshots[::sn]) - n.snapshot_weightings *= sn - return n - - # segments with package tsam - time_seg_opts_config = snakemake.params.snapshot_opts.get("time_segmentation", {}) - time_seg_enable_config = nhours_opts_config.get("enable", None) - time_seg_config = nhours_opts_config.get("hour", None) - time_seg_wildcard = get_opt(opts, r"^(\d+)seg$") - if time_seg_wildcard is not None or ( - time_seg_enable_config and time_seg_config is not None - ): - segments = int(time_seg_wildcard[:-3]) or time_seg_config - logger.info(f"Use temporal segmentation with {segments} segments") - n = apply_time_segmentation(n, segments, solver_name=solver_name) - return n - + for o in opts: + # temporal averaging + m = re.match(r"^\d+h$", o, re.IGNORECASE) + if m is not None: + n = average_every_nhours(n, m.group(0)) + break + # representative snapshots + m = re.match(r"(^\d+)sn$", o, re.IGNORECASE) + if m is not None: + sn = int(m[1]) + logger.info(f"Use every {sn} snapshot as representative") + n.set_snapshots(n.snapshots[::sn]) + n.snapshot_weightings *= sn + break + # segments with package tsam + m = re.match(r"^(\d+)seg$", o, re.IGNORECASE) + if m is not None: + segments = int(m[1]) + logger.info(f"Use temporal segmentation with {segments} segments") + n = apply_time_segmentation(n, segments, solver_name=solver_name) + break return n @@ -3328,12 +3303,6 @@ if __name__ == "__main__": opts = snakemake.wildcards.sector_opts.split("-") - opts_config = snakemake.params.enable_sector - - heat_and_industry = opts_config.get("industry", False) and opts_config.get( - "heating", False - ) - investment_year = int(snakemake.wildcards.planning_horizons[-4:]) n = pypsa.Network(snakemake.input.network) @@ -3371,57 +3340,51 @@ if __name__ == "__main__": # TODO merge with opts cost adjustment below for o in opts: - if o[:4] == "wave": # TODO: add config wildcard options or depreciated? + if o[:4] == "wave": wave_cost_factor = float(o[4:].replace("p", ".").replace("m", "-")) logger.info( f"Including wave generators with cost factor of {wave_cost_factor}" ) add_wave(n, wave_cost_factor) - if o[:4] == "dist": # TODO: add config wildcard options + if o[:4] == "dist": options["electricity_distribution_grid"] = True options["electricity_distribution_grid_cost_factor"] = float( o[4:].replace("p", ".").replace("m", "-") ) - for o in opts: - if o == "biomasstransport" or opts_config.get("biomass_transport", False): + if o == "biomasstransport": options["biomass_transport"] = True - break - if "nodistrict" in opts or opts_config.get("no_heat_district", False): + if "nodistrict" in opts: options["district_heating"]["progress"] = 0.0 - if "T" in opts or opts_config.get("land_transport", False): + if "T" in opts: add_land_transport(n, costs) - if "H" in opts or opts_config.get("heating", False): + if "H" in opts: add_heat(n, costs) - if "B" in opts or opts_config.get("biomass", False): + if "B" in opts: add_biomass(n, costs) if options["ammonia"]: add_ammonia(n, costs) - if "I" in opts or opts_config.get("industry", False): + if "I" in opts: add_industry(n, costs) - if ("I" in opts and "H" in opts) or ( - heat_and_industry and opts_config.get("waste_heat", False) - ): + if "I" in opts and "H" in opts: add_waste_heat(n) - if ("I" in opts and "H" in opts and "A" in opts) or ( - heat_and_industry and opts_config.get("agriculture_machinery", False) - ): # requires H and I + if "A" in opts: # requires H and I add_agriculture(n, costs) if options["dac"]: add_dac(n, costs) - if "decentral" in opts or opts_config.get("decentral", False): + if "decentral" in opts: decentral(n) - if "noH2network" in opts or opts_config.get("noH2network", False): + if "noH2network" in opts: remove_h2_network(n) if options["co2network"]: @@ -3436,7 +3399,7 @@ if __name__ == "__main__": limit_type = "config" limit = get(snakemake.params.co2_budget, investment_year) for o in opts: - if "cb" not in o or opts_config.get("carbon_budget", False) is False: + if "cb" not in o: continue limit_type = "carbon budget" fn = "results/" + snakemake.params.RDIR + "csvs/carbon_budget_distribution.csv" @@ -3456,7 +3419,7 @@ if __name__ == "__main__": limit = co2_cap.loc[investment_year] break for o in opts: - if "Co2L" not in o or opts_config.get("co2limit_sector", False) is False: + if "Co2L" not in o: continue limit_type = "wildcard" limit = o[o.find("Co2L") + 4 :] @@ -3465,7 +3428,7 @@ if __name__ == "__main__": logger.info(f"Add CO2 limit from {limit_type}") add_co2limit(n, nyears, limit) - for o in opts: # TODO: add config wildcard options or depreciated? + for o in opts: if not o[:10] == "linemaxext": continue maxext = float(o[10:]) * 1e3 From 668ec9efad33af2897484f9bba8dc0c1352603aa Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 09:56:15 +0000 Subject: [PATCH 040/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_electricity.smk | 22 +++++++++++----------- rules/build_sector.smk | 24 ++++++++++++------------ rules/postprocess.smk | 6 +++--- rules/validate.smk | 18 +++++++++--------- scripts/prepare_network.py | 12 ++++++++---- 5 files changed, 43 insertions(+), 39 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index bfbc1bd2..c52404bf 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -21,9 +21,9 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, countries=config["countries"], load=config["load"], @@ -66,9 +66,9 @@ rule base_network: params: countries=config["countries"], snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, lines=config["lines"], links=config["links"], @@ -153,9 +153,9 @@ if config["enable"].get("build_cutout", False): rule build_cutout: params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, cutouts=config["atlite"]["cutouts"], input: @@ -483,8 +483,8 @@ rule add_extra_components: rule prepare_network: params: snapshots={ - "resolution":config["snapshots"].get("resolution", False), - "segmentation":config["snapshots"].get("segmentation", False), + "resolution": config["snapshots"].get("resolution", False), + "segmentation": config["snapshots"].get("segmentation", False), }, links=config["links"], lines=config["lines"], diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 56a6b532..53a19852 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -142,9 +142,9 @@ if not (config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]): rule build_heat_demands: params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", @@ -168,9 +168,9 @@ rule build_heat_demands: rule build_temperature_profiles: params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", @@ -224,9 +224,9 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, solar_thermal=config["solar_thermal"], input: @@ -690,9 +690,9 @@ rule build_shipping_demand: rule build_transport_demand: params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, sector=config["sector"], input: diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 42f0722e..02ac219a 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -56,9 +56,9 @@ rule make_summary: foresight=config["foresight"], costs=config["costs"], snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, scenario=config["scenario"], RDIR=RDIR, diff --git a/rules/validate.smk b/rules/validate.smk index ece9bebd..1c0fe10a 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -18,9 +18,9 @@ rule build_electricity_production: """ params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, countries=config["countries"], output: @@ -40,9 +40,9 @@ rule build_cross_border_flows: """ params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, countries=config["countries"], input: @@ -64,9 +64,9 @@ rule build_electricity_prices: """ params: snapshots={ - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], }, countries=config["countries"], output: diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index f89db024..30ac41bf 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -312,14 +312,14 @@ if __name__ == "__main__": set_line_s_max_pu(n, snakemake.params.lines["s_max_pu"]) # temporal averaging - nhours_config = snakemake.params.snapshots.get("resolution",False) + nhours_config = snakemake.params.snapshots.get("resolution", False) nhours_wildcard = get_opt(opts, r"^\d+h$") if nhours_wildcard is not None or isinstance(nhours_config, str): nhours = nhours_wildcard or nhours_config n = average_every_nhours(n, nhours) # segments with package tsam - time_seg_config = snakemake.params.snapshots.get("segmentation",False) + time_seg_config = snakemake.params.snapshots.get("segmentation", False) time_seg_wildcard = get_opt(opts, r"^\d+seg$") if time_seg_wildcard is not None or isinstance(time_seg_config, str): time_seg = time_seg_wildcard or time_seg_config @@ -375,7 +375,9 @@ if __name__ == "__main__": sel = c.df.carrier.str.contains(carrier) c.df.loc[sel, attr] *= factor - Ept_config = snakemake.params.costs["emission_prices"].get("co2_monthly_prices", False) + Ept_config = snakemake.params.costs["emission_prices"].get( + "co2_monthly_prices", False + ) for o in opts: if "Ept" in o or Ept_config: logger.info( @@ -392,7 +394,9 @@ if __name__ == "__main__": add_emission_prices(n, dict(co2=co2_wildcard)) else: logger.info("Setting CO2 prices according to config value.") - add_emission_prices(n, dict(co2=snakemake.params.costs["emission_prices"]["co2"])) + add_emission_prices( + n, dict(co2=snakemake.params.costs["emission_prices"]["co2"]) + ) ll_type, factor = snakemake.wildcards.ll[0], snakemake.wildcards.ll[1:] set_transmission_limit(n, ll_type, factor, costs, Nyears) From a14e751ed86afc669456cde779c2f82a88cf1230 Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Fri, 15 Sep 2023 12:16:53 +0200 Subject: [PATCH 041/497] fix snapshot bugs --- scripts/base_network.py | 7 ++++++- scripts/build_line_rating.py | 8 +++++++- scripts/build_renewable_profiles.py | 7 ++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/scripts/base_network.py b/scripts/base_network.py index b4ac1d8c..f40b0395 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -709,11 +709,16 @@ def base_network( transformers = _set_electrical_parameters_transformers(transformers, config) links = _set_electrical_parameters_links(links, config, links_p_nom) converters = _set_electrical_parameters_converters(converters, config) + snapshots = { + "start":config["snapshots"]["start"], + "end":config["snapshots"]["end"], + "inclusive":config["snapshots"]["inclusive"], + } n = pypsa.Network() n.name = "PyPSA-Eur" - n.set_snapshots(pd.date_range(freq="h", **config["snapshots"])) + n.set_snapshots(pd.date_range(freq="h", **snapshots)) n.madd("Carrier", ["AC", "DC"]) n.import_components_from_dataframe(buses, "Bus") diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index 7f842d43..cf6b56c4 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -148,8 +148,14 @@ if __name__ == "__main__": ) configure_logging(snakemake) + snapshots = { + "start":snakemake.config["snapshots"]["start"], + "end":snakemake.config["snapshots"]["end"], + "inclusive":snakemake.config["snapshots"]["inclusive"], + } + n = pypsa.Network(snakemake.input.base_network) - time = pd.date_range(freq="h", **snakemake.config["snapshots"]) + time = pd.date_range(freq="h", **snapshots) cutout = atlite.Cutout(snakemake.input.cutout).sel(time=time) da = calculate_line_rating(n, cutout) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 7b08325b..863ba4e4 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -211,6 +211,11 @@ if __name__ == "__main__": correction_factor = params.get("correction_factor", 1.0) capacity_per_sqkm = params["capacity_per_sqkm"] p_nom_max_meth = params.get("potential", "conservative") + snapshots = { + "start":snakemake.config["snapshots"]["start"], + "end":snakemake.config["snapshots"]["end"], + "inclusive":snakemake.config["snapshots"]["inclusive"], + } if isinstance(params.get("corine", {}), list): params["corine"] = {"grid_codes": params["corine"]} @@ -223,7 +228,7 @@ if __name__ == "__main__": else: client = None - sns = pd.date_range(freq="h", **snakemake.config["snapshots"]) + sns = pd.date_range(freq="h", **snapshots) cutout = atlite.Cutout(snakemake.input.cutout).sel(time=sns) regions = gpd.read_file(snakemake.input.regions) assert not regions.empty, ( From b2c19eda40e6409257e616ccc9995ed3063733bd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 10:18:01 +0000 Subject: [PATCH 042/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/base_network.py | 8 ++++---- scripts/build_line_rating.py | 8 ++++---- scripts/build_renewable_profiles.py | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts/base_network.py b/scripts/base_network.py index f40b0395..a176028f 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -710,10 +710,10 @@ def base_network( links = _set_electrical_parameters_links(links, config, links_p_nom) converters = _set_electrical_parameters_converters(converters, config) snapshots = { - "start":config["snapshots"]["start"], - "end":config["snapshots"]["end"], - "inclusive":config["snapshots"]["inclusive"], - } + "start": config["snapshots"]["start"], + "end": config["snapshots"]["end"], + "inclusive": config["snapshots"]["inclusive"], + } n = pypsa.Network() n.name = "PyPSA-Eur" diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index cf6b56c4..51c779e5 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -149,10 +149,10 @@ if __name__ == "__main__": configure_logging(snakemake) snapshots = { - "start":snakemake.config["snapshots"]["start"], - "end":snakemake.config["snapshots"]["end"], - "inclusive":snakemake.config["snapshots"]["inclusive"], - } + "start": snakemake.config["snapshots"]["start"], + "end": snakemake.config["snapshots"]["end"], + "inclusive": snakemake.config["snapshots"]["inclusive"], + } n = pypsa.Network(snakemake.input.base_network) time = pd.date_range(freq="h", **snapshots) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 863ba4e4..1d3b9956 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -212,10 +212,10 @@ if __name__ == "__main__": capacity_per_sqkm = params["capacity_per_sqkm"] p_nom_max_meth = params.get("potential", "conservative") snapshots = { - "start":snakemake.config["snapshots"]["start"], - "end":snakemake.config["snapshots"]["end"], - "inclusive":snakemake.config["snapshots"]["inclusive"], - } + "start": snakemake.config["snapshots"]["start"], + "end": snakemake.config["snapshots"]["end"], + "inclusive": snakemake.config["snapshots"]["inclusive"], + } if isinstance(params.get("corine", {}), list): params["corine"] = {"grid_codes": params["corine"]} From f96c2d05899bb8d51087223f54a384410e4579df Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 22 Sep 2023 13:58:08 +0200 Subject: [PATCH 043/497] update solve smk files to properly consider scenanrios --- rules/common.smk | 7 +++++-- rules/solve_electricity.smk | 16 ++++++++-------- rules/solve_myopic.smk | 36 ++++++++++++++++++++---------------- rules/solve_overnight.smk | 14 +++++++------- scripts/solve_network.py | 8 ++++---- 5 files changed, 44 insertions(+), 37 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index dab15c0d..c4b8e6d2 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -10,7 +10,10 @@ def get_config(config, keys, default=None): """Retrieve a nested value from a dictionary using a tuple of keys.""" value = config for key in keys: - value = value.get(key, default) + if isinstance(value, list): + value = value[key] + else: + value = value.get(key, default) if value == default: return default return value @@ -40,7 +43,7 @@ def static_getter(wildcards, keys, default): def dynamic_getter(wildcards, keys, default): """Getter function for dynamic config values based on scenario.""" - if "run" not in wildcards: + if "run" not in wildcards.keys(): return get_config(config, keys, default) scenario_name = wildcards.run if scenario_name not in scenarios: diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index cfdb1da0..424748e2 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -5,11 +5,11 @@ rule solve_network: params: - solving=config["solving"], - foresight=config["foresight"], - planning_horizons=config["scenario"]["planning_horizons"], - co2_sequestration_potential=config["sector"].get( - "co2_sequestration_potential", 200 + solving=config_provider("solving"), + foresight=config_provider("foresight"), + planning_horizons=config_provider("scenario", "planning_horizons"), + co2_sequestration_potential=config_provider( + "sector", "co2_sequestration_potential", default=200 ), input: network=resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), @@ -27,7 +27,7 @@ rule solve_network: threads: 4 resources: mem_mb=memory, - walltime=config["solving"].get("walltime", "12:00:00"), + walltime=config_provider("solving", "walltime", default="12:00:00"), shadow: "minimal" conda: @@ -38,7 +38,7 @@ rule solve_network: rule solve_operations_network: params: - options=config["solving"]["options"], + options=config_provider("solving", "options"), input: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", output: @@ -58,7 +58,7 @@ rule solve_operations_network: threads: 4 resources: mem_mb=(lambda w: 10000 + 372 * int(w.clusters)), - walltime=config["solving"].get("walltime", "12:00:00"), + walltime=config_provider("solving", "walltime", default="12:00:00"), shadow: "minimal" conda: diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 214733b7..7f851326 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -5,10 +5,10 @@ rule add_existing_baseyear: params: - baseyear=config["scenario"]["planning_horizons"][0], - sector=config["sector"], - existing_capacities=config["existing_capacities"], - costs=config["costs"], + baseyear=config_provider("scenario", "planning_horizons", 0), + sector=config_provider("sector"), + existing_capacities=config_provider("existing_capacities"), + costs=config_provider("costs"), input: network=RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -16,7 +16,9 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs="data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), + costs=lambda w: "data/costs_{}.csv".format( + config_provider("scenario", "planning_horizons", 0)(w) + ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), existing_heating="data/existing_infrastructure/existing_heating_raw.csv", @@ -27,7 +29,7 @@ rule add_existing_baseyear: RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", wildcard_constraints: - planning_horizons=config["scenario"]["planning_horizons"][0], #only applies to baseyear + planning_horizons=config_provider("scenario", "planning_horizons", 0), #only applies to baseyear threads: 1 resources: mem_mb=2000, @@ -47,9 +49,11 @@ rule add_existing_baseyear: 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"], + H2_retrofit=config_provider("sector", "H2_retrofit"), + H2_retrofit_capacity_per_CH4=config_provider( + "sector", "H2_retrofit_capacity_per_CH4" + ), + threshold_capacity=config_provider("existing_capacities", " threshold_capacity"), input: network=RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -82,11 +86,11 @@ ruleorder: add_existing_baseyear > add_brownfield rule solve_sector_network_myopic: params: - solving=config["solving"], - foresight=config["foresight"], - planning_horizons=config["scenario"]["planning_horizons"], - co2_sequestration_potential=config["sector"].get( - "co2_sequestration_potential", 200 + solving=config_provider("solving"), + foresight=config_provider("foresight"), + planning_horizons=config_provider("scenario", "planning_horizons"), + co2_sequestration_potential=config_provider( + "sector", "co2_sequestration_potential", default=200 ), input: network=RESULTS @@ -105,8 +109,8 @@ rule solve_sector_network_myopic: + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", threads: 4 resources: - mem_mb=config["solving"]["mem"], - walltime=config["solving"].get("walltime", "12:00:00"), + mem_mb=config_provider("solving", "mem"), + walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: ( BENCHMARKS diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index d8476868..8f2ff139 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -5,11 +5,11 @@ rule solve_sector_network: params: - solving=config["solving"], - foresight=config["foresight"], - planning_horizons=config["scenario"]["planning_horizons"], - co2_sequestration_potential=config["sector"].get( - "co2_sequestration_potential", 200 + solving=config_provider("solving"), + foresight=config_provider("foresight"), + planning_horizons=config_provider("scenario", "planning_horizons"), + co2_sequestration_potential=config_provider( + "sector", "co2_sequestration_potential", default=200 ), input: network=RESULTS @@ -27,8 +27,8 @@ rule solve_sector_network: + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", threads: config["solving"]["solver"].get("threads", 4) resources: - mem_mb=config["solving"]["mem"], - walltime=config["solving"].get("walltime", "12:00:00"), + mem_mb=config_provider("solving", "mem"), + walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: ( BENCHMARKS diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 1e1e738b..bf860054 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -137,10 +137,10 @@ def add_co2_sequestration_limit(n, limit=200): n.add( "GlobalConstraint", "co2_sequestration_limit", - sense="<=", - constant=limit, - type="primary_energy", - carrier_attribute="co2_absorptions", + sense=">=", + constant=-limit, + type="operational_limit", + carrier_attribute="co2 sequestered", ) From 01cd1bbb74a5af95b89f9b492ffd0c6190f3d1dd Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Sat, 23 Sep 2023 18:39:11 +0200 Subject: [PATCH 044/497] add Fabians suggestion --- rules/build_electricity.smk | 21 ++++--------- rules/build_sector.smk | 24 +++------------ rules/postprocess.smk | 6 +--- rules/validate.smk | 18 ++--------- scripts/base_network.py | 6 +--- scripts/build_line_rating.py | 6 +--- scripts/build_renewable_profiles.py | 6 +--- scripts/prepare_network.py | 48 ++++++++++++----------------- 8 files changed, 36 insertions(+), 99 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index c52404bf..dc5ce1c6 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -20,11 +20,7 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, countries=config["countries"], load=config["load"], input: @@ -65,11 +61,7 @@ rule build_powerplants: rule base_network: params: countries=config["countries"], - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, lines=config["lines"], links=config["links"], transformers=config["transformers"], @@ -152,11 +144,7 @@ if config["enable"].get("build_cutout", False): rule build_cutout: params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, cutouts=config["atlite"]["cutouts"], input: regions_onshore=RESOURCES + "regions_onshore.geojson", @@ -220,6 +208,7 @@ rule build_ship_raster: rule build_renewable_profiles: params: + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, renewable=config["renewable"], input: base_network=RESOURCES + "networks/base.nc", @@ -310,6 +299,8 @@ rule build_hydro_profile: if config["lines"]["dynamic_line_rating"]["activate"]: rule build_line_rating: + params: + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, input: base_network=RESOURCES + "networks/base.nc", cutout="cutouts/" diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 53a19852..c148bc9f 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -141,11 +141,7 @@ if not (config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]): rule build_heat_demands: params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", @@ -167,11 +163,7 @@ rule build_heat_demands: rule build_temperature_profiles: params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", @@ -223,11 +215,7 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, solar_thermal=config["solar_thermal"], input: pop_layout=RESOURCES + "pop_layout_{scope}.nc", @@ -689,11 +677,7 @@ rule build_shipping_demand: rule build_transport_demand: params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, sector=config["sector"], input: clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 02ac219a..795ea1b1 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -55,11 +55,7 @@ rule make_summary: params: foresight=config["foresight"], costs=config["costs"], - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, scenario=config["scenario"], RDIR=RDIR, input: diff --git a/rules/validate.smk b/rules/validate.smk index 1c0fe10a..0fa1f607 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -17,11 +17,7 @@ rule build_electricity_production: The data is used for validation of the optimization results. """ params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, countries=config["countries"], output: RESOURCES + "historical_electricity_production.csv", @@ -39,11 +35,7 @@ rule build_cross_border_flows: The data is used for validation of the optimization results. """ params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, countries=config["countries"], input: network=RESOURCES + "networks/base.nc", @@ -63,11 +55,7 @@ rule build_electricity_prices: The data is used for validation of the optimization results. """ params: - snapshots={ - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - }, + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, countries=config["countries"], output: RESOURCES + "historical_electricity_prices.csv", diff --git a/scripts/base_network.py b/scripts/base_network.py index a176028f..372f9a20 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -709,11 +709,7 @@ def base_network( transformers = _set_electrical_parameters_transformers(transformers, config) links = _set_electrical_parameters_links(links, config, links_p_nom) converters = _set_electrical_parameters_converters(converters, config) - snapshots = { - "start": config["snapshots"]["start"], - "end": config["snapshots"]["end"], - "inclusive": config["snapshots"]["inclusive"], - } + snapshots = snakemake.params.snapshots n = pypsa.Network() n.name = "PyPSA-Eur" diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index 51c779e5..1767ebc8 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -148,11 +148,7 @@ if __name__ == "__main__": ) configure_logging(snakemake) - snapshots = { - "start": snakemake.config["snapshots"]["start"], - "end": snakemake.config["snapshots"]["end"], - "inclusive": snakemake.config["snapshots"]["inclusive"], - } + snapshots = snakemake.params.snapshots n = pypsa.Network(snakemake.input.base_network) time = pd.date_range(freq="h", **snapshots) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 1d3b9956..a8432219 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -211,11 +211,7 @@ if __name__ == "__main__": correction_factor = params.get("correction_factor", 1.0) capacity_per_sqkm = params["capacity_per_sqkm"] p_nom_max_meth = params.get("potential", "conservative") - snapshots = { - "start": snakemake.config["snapshots"]["start"], - "end": snakemake.config["snapshots"]["end"], - "inclusive": snakemake.config["snapshots"]["inclusive"], - } + snapshots = snakemake.params.snapshots if isinstance(params.get("corine", {}), list): params["corine"] = {"grid_codes": params["corine"]} diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 30ac41bf..2a15cb0c 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -314,26 +314,22 @@ if __name__ == "__main__": # temporal averaging nhours_config = snakemake.params.snapshots.get("resolution", False) nhours_wildcard = get_opt(opts, r"^\d+h$") - if nhours_wildcard is not None or isinstance(nhours_config, str): - nhours = nhours_wildcard or nhours_config + nhours = nhours_wildcard or nhours_config + if nhours: n = average_every_nhours(n, nhours) # segments with package tsam time_seg_config = snakemake.params.snapshots.get("segmentation", False) time_seg_wildcard = get_opt(opts, r"^\d+seg$") - if time_seg_wildcard is not None or isinstance(time_seg_config, str): - time_seg = time_seg_wildcard or time_seg_config + time_seg = time_seg_wildcard or time_seg_config + if time_seg: solver_name = snakemake.config["solving"]["solver"]["name"] n = apply_time_segmentation(n, time_seg, solver_name) - Co2L_config = snakemake.params.co2limit_enable and isinstance( - snakemake.params.co2limit, float - ) + Co2L_config = snakemake.params.co2limit_enable Co2L_wildcard, co2limit_wildcard = find_opt(opts, "Co2L") if Co2L_wildcard or Co2L_config: - if ( - co2limit_wildcard is not None - ): # TODO: what if you wat to determine the factor through the wildcard? + if co2limit_wildcard is not None: co2limit = co2limit_wildcard * snakemake.params.co2base add_co2limit(n, co2limit, Nyears) logger.info("Setting CO2 limit according to wildcard value.") @@ -341,14 +337,10 @@ if __name__ == "__main__": add_co2limit(n, snakemake.params.co2limit, Nyears) logger.info("Setting CO2 limit according to config value.") - CH4L_config = snakemake.params.gaslimit_enable and isinstance( - snakemake.params.gaslimit, float - ) + CH4L_config = snakemake.params.gaslimit_enable CH4L_wildcard, gaslimit_wildcard = find_opt(opts, "CH4L") if CH4L_wildcard or CH4L_config: - if ( - gaslimit_wildcard is not None - ): # TODO: what if you wat to determine the factor through the wildcard? + if gaslimit_wildcard is not None: gaslimit = gaslimit_wildcard * 1e6 add_gaslimit(n, gaslimit, Nyears) logger.info("Setting gas usage limit according to wildcard value.") @@ -375,20 +367,18 @@ if __name__ == "__main__": sel = c.df.carrier.str.contains(carrier) c.df.loc[sel, attr] *= factor - Ept_config = snakemake.params.costs["emission_prices"].get( - "co2_monthly_prices", False - ) - for o in opts: - if "Ept" in o or Ept_config: - logger.info( - "Setting time dependent emission prices according spot market price" - ) - add_dynamic_emission_prices(n) - Ept_config = True - - Ep_config = snakemake.params.costs["emission_prices"].get("enable", False) + emission_prices = snakemake.params.costs["emission_prices"] + Ept_config = emission_prices.get("co2_monthly_prices", False) + Ept_wildcard = "Ept" in opts + Ep_config = emission_prices.get("enable", False) Ep_wildcard, co2_wildcard = find_opt(opts, "Ep") - if (Ep_wildcard or Ep_config) and not Ept_config: + + if Ept_wildcard or Ept_config: + logger.info( + "Setting time dependent emission prices according spot market price" + ) + add_dynamic_emission_prices(n) + elif Ep_wildcard or Ep_config: if co2_wildcard is not None: logger.info("Setting CO2 prices according to wildcard value.") add_emission_prices(n, dict(co2=co2_wildcard)) From 05535590348118ef14a17652b5f7f7f8635bfa3b Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Sat, 23 Sep 2023 19:00:01 +0200 Subject: [PATCH 045/497] add documentations --- doc/configtables/costs.csv | 20 +++++++++++--------- doc/configtables/electricity.csv | 5 +++++ doc/configtables/snapshots.csv | 10 ++++++---- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/doc/configtables/costs.csv b/doc/configtables/costs.csv index 9797d77e..e307985d 100644 --- a/doc/configtables/costs.csv +++ b/doc/configtables/costs.csv @@ -1,9 +1,11 @@ -,Unit,Values,Description -year,--,"YYYY; e.g. '2030'","Year for which to retrieve cost assumptions of ``resources/costs.csv``." -version,--,"vX.X.X; e.g. 'v0.5.0'","Version of ``technology-data`` repository to use." -rooftop_share,--,float,"Share of rooftop PV when calculating capital cost of solar (joint rooftop and utility-scale PV)." -fill_values,--,float,"Default values if not specified for a technology in ``resources/costs.csv``." -capital_cost,EUR/MW,"Keys should be in the 'technology' column of ``resources/costs.csv``. Values can be any float.","For the given technologies, assumptions about their capital investment costs are set to the corresponding value. Optional; overwrites cost assumptions from ``resources/costs.csv``." -marginal_cost,EUR/MWh,"Keys should be in the 'technology' column of ``resources/costs.csv``. Values can be any float.","For the given technologies, assumptions about their marginal operating costs are set to the corresponding value. Optional; overwrites cost assumptions from ``resources/costs.csv``." -emission_prices,,,"Specify exogenous prices for emission types listed in ``network.carriers`` to marginal costs." --- co2,EUR/t,float,"Exogenous price of carbon-dioxide added to the marginal costs of fossil-fuelled generators according to their carbon intensity. Added through the keyword ``Ep`` in the ``{opts}`` wildcard only in the rule :mod:`prepare_network``." +,Unit,Values,Description +year,--,YYYY; e.g. '2030',Year for which to retrieve cost assumptions of ``resources/costs.csv``. +version,--,vX.X.X; e.g. 'v0.5.0',Version of ``technology-data`` repository to use. +rooftop_share,--,float,Share of rooftop PV when calculating capital cost of solar (joint rooftop and utility-scale PV). +fill_values,--,float,Default values if not specified for a technology in ``resources/costs.csv``. +capital_cost,EUR/MW,Keys should be in the 'technology' column of ``resources/costs.csv``. Values can be any float.,"For the given technologies, assumptions about their capital investment costs are set to the corresponding value. Optional; overwrites cost assumptions from ``resources/costs.csv``." +marginal_cost,EUR/MWh,Keys should be in the 'technology' column of ``resources/costs.csv``. Values can be any float.,"For the given technologies, assumptions about their marginal operating costs are set to the corresponding value. Optional; overwrites cost assumptions from ``resources/costs.csv``." +emission_prices,,,Specify exogenous prices for emission types listed in ``network.carriers`` to marginal costs. +-- enable,bool,true or false,Add cost for a carbon-dioxide price configured in ``costs: emission_prices: co2`` to ``marginal_cost`` of generators (other emission types listed in ``network.carriers`` possible as well) +-- co2,EUR/t,float,Exogenous price of carbon-dioxide added to the marginal costs of fossil-fuelled generators according to their carbon intensity. Added through the keyword ``Ep`` in the ``{opts}`` wildcard only in the rule :mod:`prepare_network``. +-- co2_monthly_price,bool,true or false,Add monthly cost for a carbon-dioxide price based on historical values built by the rule ``build_monthly_prices`` diff --git a/doc/configtables/electricity.csv b/doc/configtables/electricity.csv index 4c04fee6..00eec0c4 100644 --- a/doc/configtables/electricity.csv +++ b/doc/configtables/electricity.csv @@ -1,6 +1,8 @@ ,Unit,Values,Description voltages,kV,"Any subset of {220., 300., 380.}",Voltage levels to consider +gaslimit_enable,bool,true or false,Add an overall absolute gas limit configured in ``electricity: gaslimit``. gaslimit,MWhth,float or false,Global gas usage limit +co2limit_enable,bool,true or false,Add an overall absolute carbon-dioxide emissions limit configured in ``electricity: co2limit``. co2limit,:math:`t_{CO_2-eq}/a`,float,Cap on total annual system carbon dioxide emissions co2base,:math:`t_{CO_2-eq}/a`,float,Reference value of total annual system carbon dioxide emissions if relative emission reduction target is specified in ``{opts}`` wildcard. agg_p_nom_limits,file,path,Reference to ``.csv`` file specifying per carrier generator nominal capacity constraints for individual countries if ``'CCL'`` is in ``{opts}`` wildcard. Defaults to ``data/agg_p_nom_minmax.csv``. @@ -34,3 +36,6 @@ estimate_renewable_capacities,,, -- -- Offshore,--,"Any subset of {offwind-ac, offwind-dc}","List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) onshore technology." -- -- Offshore,--,{onwind},"List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) offshore technology." -- -- PV,--,{solar},"List of PyPSA-Eur carriers that is considered as (IRENA, OPSD) PV technology." +autarky,,, +-- enable,bool,true or false,Require each node to be autarkic by removing all lines and links. +-- by_country,bool,true or false,Require each country to be autarkic by removing all cross-border lines and links. ``electricity: autarky`` must be enabled. diff --git a/doc/configtables/snapshots.csv b/doc/configtables/snapshots.csv index d60c78dc..769e6cb0 100644 --- a/doc/configtables/snapshots.csv +++ b/doc/configtables/snapshots.csv @@ -1,4 +1,6 @@ -,Unit,Values,Description -start,--,"str or datetime-like; e.g. YYYY-MM-DD","Left bound of date range" -end,--,"str or datetime-like; e.g. YYYY-MM-DD","Right bound of date range" -inclusive,--,"One of {'neither', 'both', ‘left’, ‘right’}","Make the time interval closed to the ``left``, ``right``, or both sides ``both`` or neither side ``None``." +,Unit,Values,Description +start,--,str or datetime-like; e.g. YYYY-MM-DD,Left bound of date range +end,--,str or datetime-like; e.g. YYYY-MM-DD,Right bound of date range +inclusive,--,"One of {'neither', 'both', ‘left’, ‘right’}","Make the time interval closed to the ``left``, ``right``, or both sides ``both`` or neither side ``None``." +resolution ,--,"{false,``nH``; i.e. ``2H``-``6H``}",Resample the time-resolution by averaging over every ``n`` snapshots +segmentation,--,"{false,``nSEG``; e.g. ``4380SEG``}","Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load." From 0d1339b1d3fabebf22cc1f5e3bfe5fcda6677d70 Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Wed, 27 Sep 2023 08:22:28 +0200 Subject: [PATCH 046/497] add wildcard options in config for solve network --- config/config.default.yaml | 6 ++++++ doc/configtables/opts.csv | 26 +++++++++++++------------- doc/configtables/solving.csv | 5 +++++ scripts/solve_network.py | 21 ++++++++++++++------- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 75de9437..620c04af 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -622,6 +622,12 @@ solving: transmission_losses: 0 linearized_unit_commitment: true horizon: 365 + + constraints: + CCL: false + EQ: false + BAU: false + SAFE: false solver: name: gurobi diff --git a/doc/configtables/opts.csv b/doc/configtables/opts.csv index 8c8a706f..b133c718 100644 --- a/doc/configtables/opts.csv +++ b/doc/configtables/opts.csv @@ -1,13 +1,13 @@ -Trigger, Description, Definition, Status -``nH``; i.e. ``2H``-``6H``, Resample the time-resolution by averaging over every ``n`` snapshots, ``prepare_network``: `average_every_nhours() `_ and its `caller `__), In active use -``nSEG``; e.g. ``4380SEG``, "Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load.", ``prepare_network``: apply_time_segmentation(), In active use -``Co2L``, Add an overall absolute carbon-dioxide emissions limit configured in ``electricity: co2limit``. If a float is appended an overall emission limit relative to the emission level given in ``electricity: co2base`` is added (e.g. ``Co2L0.05`` limits emissisions to 5% of what is given in ``electricity: co2base``), ``prepare_network``: `add_co2limit() `_ and its `caller `__, In active use -``Ep``, Add cost for a carbon-dioxide price configured in ``costs: emission_prices: co2`` to ``marginal_cost`` of generators (other emission types listed in ``network.carriers`` possible as well), ``prepare_network``: `add_emission_prices() `_ and its `caller `__, In active use -``Ept``, Add monthly cost for a carbon-dioxide price based on historical values built by the rule ``build_monthly_prices``, In active use -``CCL``, Add minimum and maximum levels of generator nominal capacity per carrier for individual countries. These can be specified in the file linked at ``electricity: agg_p_nom_limits`` in the configuration. File defaults to ``data/agg_p_nom_minmax.csv``., ``solve_network``, In active use -``EQ``, "Require each country or node to on average produce a minimal share of its total consumption itself. Example: ``EQ0.5c`` demands each country to produce on average at least 50% of its consumption; ``EQ0.5`` demands each node to produce on average at least 50% of its consumption.", ``solve_network``, In active use -``ATK``, "Require each node to be autarkic. Example: ``ATK`` removes all lines and links. ``ATKc`` removes all cross-border lines and links.", ``prepare_network``, In active use -``BAU``, Add a per-``carrier`` minimal overall capacity; i.e. at least ``40GW`` of ``OCGT`` in Europe; configured in ``electricity: BAU_mincapacities``, ``solve_network``: `add_opts_constraints() `__, Untested -``SAFE``, Add a capacity reserve margin of a certain fraction above the peak demand to which renewable generators and storage do *not* contribute. Ignores network., ``solve_network`` `add_opts_constraints() `__, Untested -``carrier+{c|p|m}factor``,"Alter the capital cost (``c``), installable potential (``p``) or marginal costs (``m``) of a carrier by a factor. Example: ``solar+c0.5`` reduces the capital cost of solar to 50\% of original values.", ``prepare_network``, In active use -``CH4L``,"Add an overall absolute gas limit. If configured in ``electricity: gaslimit`` it is given in MWh thermal, if a float is appended, the overall gaslimit is assumed to be given in TWh thermal (e.g. ``CH4L200`` limits gas dispatch to 200 TWh termal)", ``prepare_network``: ``add_gaslimit()``, In active use +Trigger, Description, Definition, Status +``nH``; i.e. ``2H``-``6H``, Resample the time-resolution by averaging over every ``n`` snapshots, ``prepare_network``: `average_every_nhours() `_ and its `caller `__), In active use +``nSEG``; e.g. ``4380SEG``,"Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load.", ``prepare_network``: apply_time_segmentation(), In active use +``Co2L``,Add an overall absolute carbon-dioxide emissions limit configured in ``electricity: co2limit``. If a float is appended an overall emission limit relative to the emission level given in ``electricity: co2base`` is added (e.g. ``Co2L0.05`` limits emissisions to 5% of what is given in ``electricity: co2base``), ``prepare_network``: `add_co2limit() `_ and its `caller `__, In active use +``Ep``,Add cost for a carbon-dioxide price configured in ``costs: emission_prices: co2`` to ``marginal_cost`` of generators (other emission types listed in ``network.carriers`` possible as well), ``prepare_network``: `add_emission_prices() `_ and its `caller `__, In active use +``Ept``,Add monthly cost for a carbon-dioxide price based on historical values built by the rule ``build_monthly_prices``, In active use, +``CCL``,Add minimum and maximum levels of generator nominal capacity per carrier for individual countries. These can be specified in the file linked at ``electricity: agg_p_nom_limits`` in the configuration. File defaults to ``data/agg_p_nom_minmax.csv``., ``solve_network``, In active use +``EQ``,Require each country or node to on average produce a minimal share of its total consumption itself. Example: ``EQ0.5c`` demands each country to produce on average at least 50% of its consumption; ``EQ0.5`` demands each node to produce on average at least 50% of its consumption., ``solve_network``, In active use +``ATK``,Require each node to be autarkic. Example: ``ATK`` removes all lines and links. ``ATKc`` removes all cross-border lines and links., ``prepare_network``, In active use +``BAU``,Add a per-``carrier`` minimal overall capacity; i.e. at least ``40GW`` of ``OCGT`` in Europe; configured in ``electricity: BAU_mincapacities``, ``solve_network``: `add_opts_constraints() `__, Untested +``SAFE``,Add a capacity reserve margin of a certain fraction above the peak demand to which renewable generators and storage do *not* contribute. Ignores network., ``solve_network`` `add_opts_constraints() `__, Untested +``carrier+{c|p|m}factor``,"Alter the capital cost (``c``), installable potential (``p``) or marginal costs (``m``) of a carrier by a factor. Example: ``solar+c0.5`` reduces the capital cost of solar to 50\% of original values.", ``prepare_network``, In active use +``CH4L``,"Add an overall absolute gas limit. If configured in ``electricity: gaslimit`` it is given in MWh thermal, if a float is appended, the overall gaslimit is assumed to be given in TWh thermal (e.g. ``CH4L200`` limits gas dispatch to 200 TWh termal)", ``prepare_network``: ``add_gaslimit()``, In active use diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 45d50d84..344bf73f 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -12,6 +12,11 @@ options,,, -- transmission_losses,int,[0-9],"Add piecewise linear approximation of transmission losses based on n tangents. Defaults to 0, which means losses are ignored." -- linearized_unit_commitment,bool,"{'true','false'}",Whether to optimise using the linearized unit commitment formulation. -- horizon,--,int,Number of snapshots to consider in each iteration. Defaults to 100. +constraints ,,, +-- CCL,bool,"{'true','false'}",Add minimum and maximum levels of generator nominal capacity per carrier for individual countries. These can be specified in the file linked at ``electricity: agg_p_nom_limits`` in the configuration. File defaults to ``data/agg_p_nom_minmax.csv``. +-- EQ,bool/string,"{'false',`EQn(c| )``; i.e. ``EQ0.5``-``EQ0.7c``}",Require each country or node to on average produce a minimal share of its total consumption itself. Example: ``EQ0.5c`` demands each country to produce on average at least 50% of its consumption; ``EQ0.5`` demands each node to produce on average at least 50% of its consumption. +-- BAU,bool,"{'true','false'}",Add a per-``carrier`` minimal overall capacity; i.e. at least ``40GW`` of ``OCGT`` in Europe; configured in ``electricity: BAU_mincapacities`` +-- SAFE,bool,"{'true','false'}",Add a capacity reserve margin of a certain fraction above the peak demand to which renewable generators and storage do *not* contribute. Ignores network. solver,,, -- name,--,"One of {'gurobi', 'cplex', 'cbc', 'glpk', 'ipopt'}; potentially more possible",Solver to use for optimisation problems in the workflow; e.g. clustering and linear optimal power flow. -- options,--,Key listed under ``solver_options``.,Link to specific parameter settings. diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 836544b4..c1c170ce 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -33,7 +33,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import configure_logging, update_config_with_sector_opts +from _helpers import configure_logging, update_config_with_sector_opts, get_opt logger = logging.getLogger(__name__) pypsa.pf.logger.setLevel(logging.WARNING) @@ -542,6 +542,7 @@ def add_chp_constraints(n): # back-pressure if not electric.empty: lhs = ( + p.loc[:, heat] * (n.links.efficiency[heat] * n.links.c_b[electric].values) - p.loc[:, electric] * n.links.efficiency[electric] ) @@ -580,18 +581,24 @@ def extra_functionality(n, snapshots): """ opts = n.opts config = n.config - if "BAU" in opts and n.generators.p_nom_extendable.any(): + constraints = config["solving"].get("constraints", {}) + if ("BAU" in opts or constraints.get("BAU",False)) and n.generators.p_nom_extendable.any(): add_BAU_constraints(n, config) - if "SAFE" in opts and n.generators.p_nom_extendable.any(): + if ("SAFE" in opts or constraints.get("SAFE",False)) and n.generators.p_nom_extendable.any(): add_SAFE_constraints(n, config) - if "CCL" in opts and n.generators.p_nom_extendable.any(): + if ("CCL" in opts or constraints.get("CCL",False)) and n.generators.p_nom_extendable.any(): add_CCL_constraints(n, config) + reserve = config["electricity"].get("operational_reserve", {}) if reserve.get("activate"): add_operational_reserve_margin(n, snapshots, config) - for o in opts: - if "EQ" in o: - add_EQ_constraints(n, o) + + EQ_config = constraints.get("EQ",False) + EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)") + EQ_o = EQ_wildcard or EQ_config + if EQ_o: + add_EQ_constraints(n, EQ_o) + add_battery_constraints(n) add_pipe_retrofit_constraint(n) From 1e87cf0eebd447d98676f361829bd05b898013dc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 06:22:55 +0000 Subject: [PATCH 047/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- config/config.default.yaml | 2 +- scripts/solve_network.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 620c04af..76490e6b 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -622,7 +622,7 @@ solving: transmission_losses: 0 linearized_unit_commitment: true horizon: 365 - + constraints: CCL: false EQ: false diff --git a/scripts/solve_network.py b/scripts/solve_network.py index c1c170ce..ca542bba 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -33,7 +33,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import configure_logging, update_config_with_sector_opts, get_opt +from _helpers import configure_logging, get_opt, update_config_with_sector_opts logger = logging.getLogger(__name__) pypsa.pf.logger.setLevel(logging.WARNING) @@ -542,7 +542,6 @@ def add_chp_constraints(n): # back-pressure if not electric.empty: lhs = ( - p.loc[:, heat] * (n.links.efficiency[heat] * n.links.c_b[electric].values) - p.loc[:, electric] * n.links.efficiency[electric] ) @@ -582,18 +581,24 @@ def extra_functionality(n, snapshots): opts = n.opts config = n.config constraints = config["solving"].get("constraints", {}) - if ("BAU" in opts or constraints.get("BAU",False)) and n.generators.p_nom_extendable.any(): + if ( + "BAU" in opts or constraints.get("BAU", False) + ) and n.generators.p_nom_extendable.any(): add_BAU_constraints(n, config) - if ("SAFE" in opts or constraints.get("SAFE",False)) and n.generators.p_nom_extendable.any(): + if ( + "SAFE" in opts or constraints.get("SAFE", False) + ) and n.generators.p_nom_extendable.any(): add_SAFE_constraints(n, config) - if ("CCL" in opts or constraints.get("CCL",False)) and n.generators.p_nom_extendable.any(): + if ( + "CCL" in opts or constraints.get("CCL", False) + ) and n.generators.p_nom_extendable.any(): add_CCL_constraints(n, config) reserve = config["electricity"].get("operational_reserve", {}) if reserve.get("activate"): add_operational_reserve_margin(n, snapshots, config) - EQ_config = constraints.get("EQ",False) + EQ_config = constraints.get("EQ", False) EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)") EQ_o = EQ_wildcard or EQ_config if EQ_o: From a3a7e19b07a51ca2c0a9a8f8de4f9573a6194647 Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Thu, 28 Sep 2023 21:11:22 +0200 Subject: [PATCH 048/497] add finishing touches --- doc/configtables/snapshots.csv | 2 +- doc/configtables/solving.csv | 2 +- scripts/_helpers.py | 12 ++++++++++++ scripts/prepare_network.py | 18 ++---------------- scripts/solve_network.py | 4 ++-- 5 files changed, 18 insertions(+), 20 deletions(-) diff --git a/doc/configtables/snapshots.csv b/doc/configtables/snapshots.csv index 769e6cb0..4a3e1212 100644 --- a/doc/configtables/snapshots.csv +++ b/doc/configtables/snapshots.csv @@ -3,4 +3,4 @@ start,--,str or datetime-like; e.g. YYYY-MM-DD,Left bound of date range end,--,str or datetime-like; e.g. YYYY-MM-DD,Right bound of date range inclusive,--,"One of {'neither', 'both', ‘left’, ‘right’}","Make the time interval closed to the ``left``, ``right``, or both sides ``both`` or neither side ``None``." resolution ,--,"{false,``nH``; i.e. ``2H``-``6H``}",Resample the time-resolution by averaging over every ``n`` snapshots -segmentation,--,"{false,``nSEG``; e.g. ``4380SEG``}","Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load." +segmentation,--,"{false,``n``; e.g. ``4380``}","Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load." diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 344bf73f..940deba9 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -14,7 +14,7 @@ options,,, -- horizon,--,int,Number of snapshots to consider in each iteration. Defaults to 100. constraints ,,, -- CCL,bool,"{'true','false'}",Add minimum and maximum levels of generator nominal capacity per carrier for individual countries. These can be specified in the file linked at ``electricity: agg_p_nom_limits`` in the configuration. File defaults to ``data/agg_p_nom_minmax.csv``. --- EQ,bool/string,"{'false',`EQn(c| )``; i.e. ``EQ0.5``-``EQ0.7c``}",Require each country or node to on average produce a minimal share of its total consumption itself. Example: ``EQ0.5c`` demands each country to produce on average at least 50% of its consumption; ``EQ0.5`` demands each node to produce on average at least 50% of its consumption. +-- EQ,bool/string,"{'false',`n(c| )``; i.e. ``0.5``-``0.7c``}",Require each country or node to on average produce a minimal share of its total consumption itself. Example: ``EQ0.5c`` demands each country to produce on average at least 50% of its consumption; ``EQ0.5`` demands each node to produce on average at least 50% of its consumption. -- BAU,bool,"{'true','false'}",Add a per-``carrier`` minimal overall capacity; i.e. at least ``40GW`` of ``OCGT`` in Europe; configured in ``electricity: BAU_mincapacities`` -- SAFE,bool,"{'true','false'}",Add a capacity reserve margin of a certain fraction above the peak demand to which renewable generators and storage do *not* contribute. Ignores network. solver,,, diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 01349e08..559997ad 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -36,6 +36,18 @@ def get_opt(opts, expr, flags=None): return match.group(0) return None +def find_opt(opts, expr): + """ + Return if available the float after the expression. + """ + for o in opts: + if expr in o: + m = re.findall("[0-9]*\.?[0-9]+$", o) + if len(m) > 0: + return True, float(m[0]) + else: + return True, None + return False, None # Define a context manager to temporarily mute print statements @contextlib.contextmanager diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 2a15cb0c..c91097ba 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -63,7 +63,7 @@ import re import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging, get_opt +from _helpers import configure_logging, get_opt, find_opt from add_electricity import load_costs, update_transmission_costs from pypsa.descriptors import expand_series @@ -72,20 +72,6 @@ idx = pd.IndexSlice logger = logging.getLogger(__name__) -def find_opt(opts, expr): - """ - Return if available the float after the expression. - """ - for o in opts: - if expr in o: - m = re.findall("[0-9]*\.?[0-9]+$", o) - if len(m) > 0: - return True, float(m[0]) - else: - return True, None - return False, None - - def add_co2limit(n, co2limit, Nyears=1.0): n.add( "GlobalConstraint", @@ -320,7 +306,7 @@ if __name__ == "__main__": # segments with package tsam time_seg_config = snakemake.params.snapshots.get("segmentation", False) - time_seg_wildcard = get_opt(opts, r"^\d+seg$") + time_seg_wildcard = get_opt(opts, r"^\d+seg$")[:-3] time_seg = time_seg_wildcard or time_seg_config if time_seg: solver_name = snakemake.config["solving"]["solver"]["name"] diff --git a/scripts/solve_network.py b/scripts/solve_network.py index ca542bba..2335c86d 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -598,8 +598,8 @@ def extra_functionality(n, snapshots): if reserve.get("activate"): add_operational_reserve_margin(n, snapshots, config) - EQ_config = constraints.get("EQ", False) - EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)") + EQ_config = constraints.get("EQ",False) + EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)")[2:] EQ_o = EQ_wildcard or EQ_config if EQ_o: add_EQ_constraints(n, EQ_o) From d75b0ae8abfea19c1da69085af58003a653ac547 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 19:11:51 +0000 Subject: [PATCH 049/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/_helpers.py | 2 ++ scripts/prepare_network.py | 2 +- scripts/solve_network.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 559997ad..a32e8f05 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -36,6 +36,7 @@ def get_opt(opts, expr, flags=None): return match.group(0) return None + def find_opt(opts, expr): """ Return if available the float after the expression. @@ -49,6 +50,7 @@ def find_opt(opts, expr): return True, None return False, None + # Define a context manager to temporarily mute print statements @contextlib.contextmanager def mute_print(): diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index c91097ba..7ddf805b 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -63,7 +63,7 @@ import re import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging, get_opt, find_opt +from _helpers import configure_logging, find_opt, get_opt from add_electricity import load_costs, update_transmission_costs from pypsa.descriptors import expand_series diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 2335c86d..08bb51d5 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -598,7 +598,7 @@ def extra_functionality(n, snapshots): if reserve.get("activate"): add_operational_reserve_margin(n, snapshots, config) - EQ_config = constraints.get("EQ",False) + EQ_config = constraints.get("EQ", False) EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)")[2:] EQ_o = EQ_wildcard or EQ_config if EQ_o: From 4ac664b8718d36c87d655d523d8f6263d8c7e358 Mon Sep 17 00:00:00 2001 From: virio-andreyana Date: Fri, 29 Sep 2023 21:24:29 +0200 Subject: [PATCH 050/497] use .replace to fix type error --- scripts/prepare_network.py | 4 ++-- scripts/solve_network.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 7ddf805b..59668453 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -306,11 +306,11 @@ if __name__ == "__main__": # segments with package tsam time_seg_config = snakemake.params.snapshots.get("segmentation", False) - time_seg_wildcard = get_opt(opts, r"^\d+seg$")[:-3] + time_seg_wildcard = get_opt(opts, r"^\d+seg$") time_seg = time_seg_wildcard or time_seg_config if time_seg: solver_name = snakemake.config["solving"]["solver"]["name"] - n = apply_time_segmentation(n, time_seg, solver_name) + n = apply_time_segmentation(n, time_seg.replace("seg",""), solver_name) Co2L_config = snakemake.params.co2limit_enable Co2L_wildcard, co2limit_wildcard = find_opt(opts, "Co2L") diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 08bb51d5..963a85a9 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -599,10 +599,10 @@ def extra_functionality(n, snapshots): add_operational_reserve_margin(n, snapshots, config) EQ_config = constraints.get("EQ", False) - EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)")[2:] + EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)") EQ_o = EQ_wildcard or EQ_config if EQ_o: - add_EQ_constraints(n, EQ_o) + add_EQ_constraints(n, EQ_o.replace("EQ","")) add_battery_constraints(n) add_pipe_retrofit_constraint(n) From d2f8dc25fd3fa7497d3c3c8b6a7d820f593fc09b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 29 Sep 2023 19:24:53 +0000 Subject: [PATCH 051/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_network.py | 2 +- scripts/solve_network.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 59668453..f2c6556e 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -310,7 +310,7 @@ if __name__ == "__main__": time_seg = time_seg_wildcard or time_seg_config if time_seg: solver_name = snakemake.config["solving"]["solver"]["name"] - n = apply_time_segmentation(n, time_seg.replace("seg",""), solver_name) + n = apply_time_segmentation(n, time_seg.replace("seg", ""), solver_name) Co2L_config = snakemake.params.co2limit_enable Co2L_wildcard, co2limit_wildcard = find_opt(opts, "Co2L") diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 963a85a9..012e440b 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -602,7 +602,7 @@ def extra_functionality(n, snapshots): EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)") EQ_o = EQ_wildcard or EQ_config if EQ_o: - add_EQ_constraints(n, EQ_o.replace("EQ","")) + add_EQ_constraints(n, EQ_o.replace("EQ", "")) add_battery_constraints(n) add_pipe_retrofit_constraint(n) From 9b9090c76cb1fbd601626342ce569d87e490d9d0 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Wed, 18 Oct 2023 16:59:49 +0200 Subject: [PATCH 052/497] add option for additional national carbon budget constraints --- config/config.default.yaml | 17 +++++++ rules/solve_myopic.smk | 2 + scripts/solve_network.py | 99 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index 7dc0cf76..325bbbaa 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -84,6 +84,22 @@ co2_budget: 2045: 0.032 2050: 0.000 +co2_budget_national: + 2030: + 'DE': 0.350 + 'AT': 0.450 + 'BE': 0.450 + 'CH': 0.450 + 'CZ': 0.450 + 'DK': 0.450 + 'FR': 0.450 + 'GB': 0.450 + 'LU': 0.450 + 'NL': 0.450 + 'NO': 0.450 + 'PL': 0.450 + 'SE': 0.450 + # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#electricity electricity: voltages: [220., 300., 380.] @@ -454,6 +470,7 @@ sector: hydrogen_turbine: false SMR: true SMR_cc: true + co2_budget_national: false regional_co2_sequestration_potential: enable: false attribute: 'conservative estimate Mt' diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 8a93d24a..06fd9b79 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -88,11 +88,13 @@ rule solve_sector_network_myopic: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), + countries=config["countries"], input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", costs="data/costs_{planning_horizons}.csv", config=RESULTS + "config.yaml", + co2_totals_name=RESOURCES + "co2_totals.csv", output: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 224d4714..f5dd79e0 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -41,6 +41,8 @@ logger = logging.getLogger(__name__) pypsa.pf.logger.setLevel(logging.WARNING) from pypsa.descriptors import get_switchable_as_dense as get_as_dense +from prepare_sector_network import emission_sectors_from_opts + def add_land_use_constraint(n, planning_horizons, config): if "m" in snakemake.wildcards.clusters: @@ -762,6 +764,92 @@ def add_pipe_retrofit_constraint(n): n.model.add_constraints(lhs == rhs, name="Link-pipe_retrofit") +def add_co2limit_country(n, config, limit_countries, nyears=1.0): + """ + Add a set of emissions limit constraints for specified countries. + + The countries and emissions limits are specified in the config file entry 'co2_budget_country_{investment_year}'. + + Parameters + ---------- + n : pypsa.Network + config : dict + limit_countries : dict + nyears: float, optional + Used to scale the emissions constraint to the number of snapshots of the base network. + """ + logger.info(f"Adding CO2 budget limit for each country as per unit of 1990 levels") + + # TODO: n.config (submodule) vs snakemake.config (main module, overwrite/overwritten config)? + # countries = config.countries + # print(config) + countries = ['AT', 'BE', 'CH', 'CZ', 'DE', 'DK', 'FR', 'GB', 'LU', 'NL', 'NO', 'PL', 'SE'] + + # TODO: import function from prepare_sector_network? Move to common place? + sectors = emission_sectors_from_opts(opts) + + # convert Mt to tCO2 + co2_totals = 1e6 * pd.read_csv(snakemake.input.co2_totals_name, index_col=0) + + co2_limit_countries = co2_totals.loc[countries, sectors].sum(axis=1) + co2_limit_countries = co2_limit_countries.loc[co2_limit_countries.index.isin(limit_countries.keys())] + + co2_limit_countries *= co2_limit_countries.index.map(limit_countries) * nyears + + p = n.model["Link-p"] # dimension: (time, component) + + # NB: Most country-specific links retain their locational information in bus1 (except for DAC, where it is in bus2) + country = n.links.bus1.map(n.buses.location).map(n.buses.country) + country_DAC = ( + n.links[n.links.carrier == "DAC"] + .bus2.map(n.buses.location) + .map(n.buses.country) + ) + country[country_DAC.index] = country_DAC + + lhs = [] + for port in [col[3:] for col in n.links if col.startswith("bus")]: + if port == str(0): + efficiency = ( + n.links["efficiency"].apply(lambda x: 1.0).rename("efficiency0") + ) + elif port == str(1): + efficiency = n.links["efficiency"].rename("efficiency1") + else: + efficiency = n.links[f"efficiency{port}"] + mask = n.links[f"bus{port}"].map(n.buses.carrier).eq("co2") + + idx = n.links[mask].index + + grouping = country.loc[idx] + + if not grouping.isnull().all(): + expr = ( + (p.loc[:, idx] * efficiency[idx]) + .groupby(grouping, axis=1) + .sum() + .sum(dims="snapshot") + ) + lhs.append(expr) + + lhs = sum(lhs) # dimension: (country) + lhs = lhs.rename({list(lhs.dims.keys())[0]: "country"}) + rhs = pd.Series(co2_limit_countries) # dimension: (country) + + for ct in lhs.indexes["country"]: + n.model.add_constraints( + lhs.loc[ct] <= rhs[ct], + name=f"GlobalConstraint-co2_limit_per_country{ct}", + ) + n.add( + "GlobalConstraint", + f"co2_limit_per_country{ct}", + constant=rhs[ct], + sense="<=", + type="", + ) + + def extra_functionality(n, snapshots): """ Collects supplementary constraints which will be passed to @@ -792,6 +880,17 @@ def extra_functionality(n, snapshots): add_carbon_budget_constraint(n, snapshots) add_retrofit_gas_boiler_constraint(n, snapshots) + if n.config["sector"]["co2_budget_national"]: + # prepare co2 constraint + nhours = n.snapshot_weightings.generators.sum() + nyears = nhours / 8760 + investment_year = int(snakemake.wildcards.planning_horizons[-4:]) + limit_countries = snakemake.config["co2_budget_national"][investment_year] + + # add co2 constraint for each country + logger.info(f"Add CO2 limit for each country") + add_co2limit_country(n, config, limit_countries, nyears) + def solve_network(n, config, solving, opts="", **kwargs): set_of_options = solving["solver"]["options"] From a35f5479aedd933773634a931e407d0535a6da64 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Tue, 24 Oct 2023 14:06:17 +0200 Subject: [PATCH 053/497] add links instead of equal-and-opposite fuel/emissions load pairs for land transport oil (ICEs), naphtha for industry and kerosene for aviation (before summed as 'oil'), shipping oil, shipping methanol, agriculture machinery oil --- scripts/prepare_sector_network.py | 256 +++++++++++++++++++----------- 1 file changed, 165 insertions(+), 91 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index ee2f0e3c..989bdb78 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -135,6 +135,7 @@ def define_spatial(nodes, options): spatial.oil = SimpleNamespace() spatial.oil.nodes = ["EU oil"] spatial.oil.locations = ["EU"] + spatial.oil.land_transport = nodes + " land transport oil" # uranium spatial.uranium = SimpleNamespace() @@ -1467,8 +1468,8 @@ def add_land_transport(n, costs): n.madd( "Bus", nodes, - location=nodes, suffix=" EV battery", + location=nodes, carrier="Li ion", unit="MWh_el", ) @@ -1568,28 +1569,31 @@ def add_land_transport(n, costs): ice_efficiency = options["transport_internal_combustion_efficiency"] n.madd( - "Load", - nodes, - suffix=" land transport oil", - bus=spatial.oil.nodes, + "Bus", + spatial.oil.land_transport, + location=nodes, carrier="land transport oil", - p_set=ice_share / ice_efficiency * transport[nodes], + unit="land transport", ) - co2 = ( - ice_share - / ice_efficiency - * transport[nodes].sum().sum() - / nhours - * costs.at["oil", "CO2 intensity"] - ) - - n.add( + n.madd( "Load", - "land transport oil emissions", - bus="co2 atmosphere", - carrier="land transport oil emissions", - p_set=-co2, + spatial.oil.land_transport, + bus=spatial.oil.land_transport, + carrier="land transport oil", + p_set=ice_share / ice_efficiency * transport[nodes].rename(columns=lambda x: x + " land transport oil"), + ) + + n.madd( + "Link", + spatial.oil.land_transport, + bus0=spatial.oil.nodes, + bus1=spatial.oil.land_transport, + bus2="co2 atmosphere", + carrier="land transport oil", + efficiency=ice_efficiency, + efficiency2=costs.at["oil", "CO2 intensity"], + p_nom_extendable=True, ) @@ -2611,46 +2615,36 @@ def add_industry(n, costs): ) p_set_methanol = shipping_methanol_share * p_set.sum() * efficiency - n.madd( + n.add( + "Bus", + "EU shipping methanol", + location="EU", + carrier="shipping methanol", + unit="MWh_LHV", + ) + + n.add( "Load", - spatial.methanol.nodes, - suffix=" shipping methanol", - bus=spatial.methanol.nodes, + "shipping methanol", + bus="EU shipping methanol", carrier="shipping methanol", p_set=p_set_methanol, ) - # CO2 intensity methanol based on stoichiometric calculation with 22.7 GJ/t methanol (32 g/mol), CO2 (44 g/mol), 277.78 MWh/TJ = 0.218 t/MWh - co2 = p_set_methanol / options["MWh_MeOH_per_tCO2"] - - n.add( - "Load", - "shipping methanol emissions", - bus="co2 atmosphere", - carrier="shipping methanol emissions", - p_set=-co2, - ) - - if shipping_oil_share: - p_set_oil = shipping_oil_share * p_set.sum() + if len(spatial.methanol.nodes) == 1: + link_names = ["EU shipping methanol"] + else: + link_names = nodes + " shipping methanol" n.madd( - "Load", - spatial.oil.nodes, - suffix=" shipping oil", - bus=spatial.oil.nodes, - carrier="shipping oil", - p_set=p_set_oil, - ) - - co2 = p_set_oil * costs.at["oil", "CO2 intensity"] - - n.add( - "Load", - "shipping oil emissions", - bus="co2 atmosphere", - carrier="shipping oil emissions", - p_set=-co2, + "Link", + link_names, + bus0=spatial.methanol.nodes, + bus1="EU shipping methanol", + bus2="co2 atmosphere", + carrier="shipping methanol", + p_nom_extendable=True, + efficiency2=1 / options["MWh_MeOH_per_tCO2"], # CO2 intensity methanol based on stoichiometric calculation with 22.7 GJ/t methanol (32 g/mol), CO2 (44 g/mol), 277.78 MWh/TJ = 0.218 t/MWh ) if "oil" not in n.buses.carrier.unique(): @@ -2683,6 +2677,41 @@ def add_industry(n, costs): marginal_cost=costs.at["oil", "fuel"], ) + if shipping_oil_share: + p_set_oil = shipping_oil_share * p_set.sum() + + n.add( + "Bus", + "EU shipping oil", + location="EU", + carrier="shipping oil", + unit="MWh_LHV", + ) + + n.add( + "Load", + "shipping oil", + bus="EU shipping oil", + carrier="shipping oil", + p_set=p_set_oil, + ) + + if len(spatial.oil.nodes) == 1: + link_names = ["EU shipping oil"] + else: + link_names = nodes + " shipping oil" + + n.madd( + "Link", + link_names, + bus0=spatial.oil.nodes, + bus1="EU shipping oil", + bus2="co2 atmosphere", + carrier="shipping oil", + p_nom_extendable=True, + efficiency2=costs.at["oil", "CO2 intensity"], + ) + if options["oil_boilers"]: nodes_heat = create_nodes_for_heat_sector()[0] @@ -2724,19 +2753,49 @@ def add_industry(n, costs): lifetime=costs.at["Fischer-Tropsch", "lifetime"], ) + # naphtha demand_factor = options.get("HVC_demand_factor", 1) - p_set = demand_factor * industrial_demand.loc[nodes, "naphtha"].sum() / nhours if demand_factor != 1: logger.warning(f"Changing HVC demand by {demand_factor*100-100:+.2f}%.") - n.madd( + # NB: CO2 gets released again to atmosphere when plastics decay + # except for the process emissions when naphtha is used for petrochemicals, which can be captured with other industry process emissions + # convert process emissions from feedstock from MtCO2 to energy demand + p_set = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).sum() / nhours + + n.add( + "Bus", + "EU naphtha for industry", + location="EU", + carrier="naphtha for industry", + unit="MWh_LHV", + ) + + n.add( "Load", - ["naphtha for industry"], - bus=spatial.oil.nodes, + "naphtha for industry", + bus="EU naphtha for industry", carrier="naphtha for industry", p_set=p_set, ) + if len(spatial.oil.nodes) == 1: + link_names = ["EU naphtha for industry"] + else: + link_names = nodes + " naphtha for industry" + + n.madd( + "Link", + link_names, + bus0=spatial.oil.nodes, + bus1="EU naphtha for industry", + bus2="co2 atmosphere", + carrier="naphtha for industry", + p_nom_extendable=True, + efficiency2=costs.at["oil", "CO2 intensity"], + ) + + # aviation demand_factor = options.get("aviation_demand_factor", 1) all_aviation = ["total international aviation", "total domestic aviation"] p_set = ( @@ -2748,29 +2807,36 @@ def add_industry(n, costs): if demand_factor != 1: logger.warning(f"Changing aviation demand by {demand_factor*100-100:+.2f}%.") - n.madd( - "Load", - ["kerosene for aviation"], - bus=spatial.oil.nodes, + n.add( + "Bus", + "EU kerosene for aviation", + location="EU", carrier="kerosene for aviation", - p_set=p_set, - ) - - # NB: CO2 gets released again to atmosphere when plastics decay or kerosene is burned - # except for the process emissions when naphtha is used for petrochemicals, which can be captured with other industry process emissions - # tco2 per hour - co2_release = ["naphtha for industry", "kerosene for aviation"] - co2 = ( - n.loads.loc[co2_release, "p_set"].sum() * costs.at["oil", "CO2 intensity"] - - industrial_demand.loc[nodes, "process emission from feedstock"].sum() / nhours + unit="MWh_LHV", ) n.add( "Load", - "oil emissions", - bus="co2 atmosphere", - carrier="oil emissions", - p_set=-co2, + "kerosene for aviation", + bus="EU kerosene for aviation", + carrier="kerosene for aviation", + p_set=p_set, + ) + + if len(spatial.oil.nodes) == 1: + link_names = ["EU kerosene for aviation"] + else: + link_names = nodes + " kerosene for aviation" + + n.madd( + "Link", + link_names, + bus0=spatial.oil.nodes, + bus1="EU kerosene for aviation", + bus2="co2 atmosphere", + carrier="kerosene for aviation", + p_nom_extendable=True, + efficiency2=costs.at["oil", "CO2 intensity"], ) # TODO simplify bus expression @@ -3018,28 +3084,36 @@ def add_agriculture(n, costs): ) if oil_share > 0: - n.madd( - "Load", - ["agriculture machinery oil"], - bus=spatial.oil.nodes, + n.add( + "Bus", + "EU agriculture machinery oil", + location="EU", carrier="agriculture machinery oil", - p_set=oil_share * machinery_nodal_energy.sum() * 1e6 / nhours, - ) - - co2 = ( - oil_share - * machinery_nodal_energy.sum() - * 1e6 - / nhours - * costs.at["oil", "CO2 intensity"] + unit="MWh_LHV", ) n.add( "Load", - "agriculture machinery oil emissions", - bus="co2 atmosphere", - carrier="agriculture machinery oil emissions", - p_set=-co2, + "agriculture machinery oil", + bus="EU agriculture machinery oil", + carrier="agriculture machinery oil", + p_set=oil_share * machinery_nodal_energy.sum() * 1e6 / nhours, + ) + + if len(spatial.oil.nodes) == 1: + link_names = ["EU agriculture machinery oil"] + else: + link_names = nodes + " agriculture machinery oil" + + n.madd( + "Link", + link_names, + bus0=spatial.oil.nodes, + bus1="EU agriculture machinery oil", + bus2="co2 atmosphere", + carrier="agriculture machinery oil", + p_nom_extendable=True, + efficiency2=costs.at["oil", "CO2 intensity"], ) From 94afba7c5d195b2cf6d7d17016e78040c4659440 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Tue, 24 Oct 2023 16:39:33 +0200 Subject: [PATCH 054/497] add coal tech_color to config --- config/config.default.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index 325bbbaa..cafb9d1d 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -816,6 +816,7 @@ plotting: Coal: '#545454' coal: '#545454' Coal marginal: '#545454' + coal for industry: '#343434' solid: '#545454' Lignite: '#826837' lignite: '#826837' From 7cb677d0e6056f52560e6ddb53e88f76861d8fc2 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Tue, 24 Oct 2023 16:39:58 +0200 Subject: [PATCH 055/497] clean up function add_co2limit_country --- scripts/solve_network.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index f5dd79e0..b372b366 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -764,7 +764,7 @@ def add_pipe_retrofit_constraint(n): n.model.add_constraints(lhs == rhs, name="Link-pipe_retrofit") -def add_co2limit_country(n, config, limit_countries, nyears=1.0): +def add_co2limit_country(n, limit_countries, nyears=1.0): """ Add a set of emissions limit constraints for specified countries. @@ -780,10 +780,7 @@ def add_co2limit_country(n, config, limit_countries, nyears=1.0): """ logger.info(f"Adding CO2 budget limit for each country as per unit of 1990 levels") - # TODO: n.config (submodule) vs snakemake.config (main module, overwrite/overwritten config)? - # countries = config.countries - # print(config) - countries = ['AT', 'BE', 'CH', 'CZ', 'DE', 'DK', 'FR', 'GB', 'LU', 'NL', 'NO', 'PL', 'SE'] + countries = n.config["countries"] # TODO: import function from prepare_sector_network? Move to common place? sectors = emission_sectors_from_opts(opts) @@ -814,7 +811,7 @@ def add_co2limit_country(n, config, limit_countries, nyears=1.0): n.links["efficiency"].apply(lambda x: 1.0).rename("efficiency0") ) elif port == str(1): - efficiency = n.links["efficiency"].rename("efficiency1") + efficiency = n.links["efficiency"] else: efficiency = n.links[f"efficiency{port}"] mask = n.links[f"bus{port}"].map(n.buses.carrier).eq("co2") @@ -889,7 +886,7 @@ def extra_functionality(n, snapshots): # add co2 constraint for each country logger.info(f"Add CO2 limit for each country") - add_co2limit_country(n, config, limit_countries, nyears) + add_co2limit_country(n, limit_countries, nyears) def solve_network(n, config, solving, opts="", **kwargs): From e2b2eafbc12e17254a0a517c87ae76bf08962585 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Tue, 24 Oct 2023 16:46:58 +0200 Subject: [PATCH 056/497] add geographical resolution to oil and methanol for options['co2_budget_national'] to include all necessary links in national co2 budget constraints --- scripts/add_existing_baseyear.py | 2 +- scripts/prepare_sector_network.py | 187 +++++++++++++++++------------- 2 files changed, 106 insertions(+), 83 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 1474b004..7ddc6b1d 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -303,7 +303,7 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas else: bus0 = vars(spatial)[carrier[generator]].nodes if "EU" not in vars(spatial)[carrier[generator]].locations: - bus0 = bus0.intersection(capacity.index + " gas") + bus0 = bus0.intersection(capacity.index + " " + carrier[generator]) # check for missing bus missing_bus = pd.Index(bus0).difference(n.buses.index) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 989bdb78..34bfdce7 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -128,13 +128,33 @@ def define_spatial(nodes, options): # methanol spatial.methanol = SimpleNamespace() - spatial.methanol.nodes = ["EU methanol"] - spatial.methanol.locations = ["EU"] + + if options["co2_budget_national"]: + spatial.methanol.nodes = nodes + " methanol" + spatial.methanol.locations = nodes + spatial.methanol.shipping = nodes + " shipping methanol" + else: + spatial.methanol.nodes = ["EU methanol"] + spatial.methanol.locations = ["EU"] + spatial.methanol.shipping = ["EU shipping methanol"] # oil spatial.oil = SimpleNamespace() - spatial.oil.nodes = ["EU oil"] - spatial.oil.locations = ["EU"] + + if options["co2_budget_national"]: + spatial.oil.nodes = nodes + " oil" + spatial.oil.locations = nodes + spatial.oil.naphtha = nodes + " naphtha for industry" + spatial.oil.kerosene = nodes + " kerosene for aviation" + spatial.oil.shipping = nodes + " shipping oil" + spatial.oil.agriculture_machinery = nodes + " agriculture machinery oil" + else: + spatial.oil.nodes = ["EU oil"] + spatial.oil.locations = ["EU"] + spatial.oil.naphtha = ["EU naphtha for industry"] + spatial.oil.kerosene = ["EU kerosene for aviation"] + spatial.oil.shipping = ["EU shipping oil"] + spatial.oil.agriculture_machinery = ["EU agriculture machinery oil"] spatial.oil.land_transport = nodes + " land transport oil" # uranium @@ -2613,34 +2633,34 @@ def add_industry(n, costs): efficiency = ( options["shipping_oil_efficiency"] / options["shipping_methanol_efficiency"] ) - p_set_methanol = shipping_methanol_share * p_set.sum() * efficiency - n.add( + # need to aggregate potentials if methanol not nodally resolved + if options["co2_budget_national"]: + p_set_methanol = shipping_methanol_share * p_set * efficiency + else: + p_set_methanol = shipping_methanol_share * p_set.sum() * efficiency + + n.madd( "Bus", - "EU shipping methanol", - location="EU", + spatial.methanol.shipping, + location=spatial.methanol.locations, carrier="shipping methanol", unit="MWh_LHV", ) - n.add( + n.madd( "Load", - "shipping methanol", - bus="EU shipping methanol", + spatial.methanol.shipping, + bus=spatial.methanol.shipping, carrier="shipping methanol", p_set=p_set_methanol, ) - if len(spatial.methanol.nodes) == 1: - link_names = ["EU shipping methanol"] - else: - link_names = nodes + " shipping methanol" - n.madd( "Link", - link_names, + spatial.methanol.shipping, bus0=spatial.methanol.nodes, - bus1="EU shipping methanol", + bus1=spatial.methanol.shipping, bus2="co2 atmosphere", carrier="shipping methanol", p_nom_extendable=True, @@ -2678,34 +2698,33 @@ def add_industry(n, costs): ) if shipping_oil_share: - p_set_oil = shipping_oil_share * p_set.sum() + # need to aggregate potentials if oil not nodally resolved + if options["co2_budget_national"]: + p_set_oil = shipping_oil_share * p_set + else: + p_set_oil = shipping_oil_share * p_set.sum() - n.add( + n.madd( "Bus", - "EU shipping oil", - location="EU", + spatial.oil.shipping, + location=spatial.oil.locations, carrier="shipping oil", unit="MWh_LHV", ) - n.add( + n.madd( "Load", - "shipping oil", - bus="EU shipping oil", + spatial.oil.shipping, + bus=spatial.oil.shipping, carrier="shipping oil", p_set=p_set_oil, ) - if len(spatial.oil.nodes) == 1: - link_names = ["EU shipping oil"] - else: - link_names = nodes + " shipping oil" - n.madd( "Link", - link_names, + spatial.oil.shipping, bus0=spatial.oil.nodes, - bus1="EU shipping oil", + bus1=spatial.oil.shipping, bus2="co2 atmosphere", carrier="shipping oil", p_nom_extendable=True, @@ -2761,34 +2780,33 @@ def add_industry(n, costs): # NB: CO2 gets released again to atmosphere when plastics decay # except for the process emissions when naphtha is used for petrochemicals, which can be captured with other industry process emissions # convert process emissions from feedstock from MtCO2 to energy demand - p_set = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).sum() / nhours + # need to aggregate potentials if oil not nodally resolved + if options["co2_budget_national"]: + p_set = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]) / nhours + else: + p_set = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).sum() / nhours - n.add( + n.madd( "Bus", - "EU naphtha for industry", - location="EU", + spatial.oil.naphtha, + location=spatial.oil.locations, carrier="naphtha for industry", unit="MWh_LHV", ) - n.add( + n.madd( "Load", - "naphtha for industry", - bus="EU naphtha for industry", + spatial.oil.naphtha, + bus=spatial.oil.naphtha, carrier="naphtha for industry", p_set=p_set, ) - if len(spatial.oil.nodes) == 1: - link_names = ["EU naphtha for industry"] - else: - link_names = nodes + " naphtha for industry" - n.madd( "Link", - link_names, + spatial.oil.naphtha, bus0=spatial.oil.nodes, - bus1="EU naphtha for industry", + bus1=spatial.oil.naphtha, bus2="co2 atmosphere", carrier="naphtha for industry", p_nom_extendable=True, @@ -2797,42 +2815,47 @@ def add_industry(n, costs): # aviation demand_factor = options.get("aviation_demand_factor", 1) - all_aviation = ["total international aviation", "total domestic aviation"] - p_set = ( - demand_factor - * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1).sum() - * 1e6 - / nhours - ) if demand_factor != 1: logger.warning(f"Changing aviation demand by {demand_factor*100-100:+.2f}%.") - n.add( + all_aviation = ["total international aviation", "total domestic aviation"] + # need to aggregate potentials if oil not nodally resolved + if options["co2_budget_national"]: + p_set = ( + demand_factor + * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1) + * 1e6 + / nhours + ) + else: + p_set = ( + demand_factor + * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1).sum() + * 1e6 + / nhours + ) + + n.madd( "Bus", - "EU kerosene for aviation", - location="EU", + spatial.oil.kerosene, + location=spatial.oil.locations, carrier="kerosene for aviation", unit="MWh_LHV", ) - n.add( + n.madd( "Load", - "kerosene for aviation", - bus="EU kerosene for aviation", + spatial.oil.kerosene, + bus=spatial.oil.kerosene, carrier="kerosene for aviation", p_set=p_set, ) - if len(spatial.oil.nodes) == 1: - link_names = ["EU kerosene for aviation"] - else: - link_names = nodes + " kerosene for aviation" - n.madd( "Link", - link_names, + spatial.oil.kerosene, bus0=spatial.oil.nodes, - bus1="EU kerosene for aviation", + bus1=spatial.oil.kerosene, bus2="co2 atmosphere", carrier="kerosene for aviation", p_nom_extendable=True, @@ -3062,7 +3085,7 @@ def add_agriculture(n, costs): machinery_nodal_energy = pop_weighted_energy_totals.loc[ nodes, "total agriculture machinery" - ] + ] * 1e6 if electric_share > 0: efficiency_gain = ( @@ -3079,37 +3102,37 @@ def add_agriculture(n, costs): p_set=electric_share / efficiency_gain * machinery_nodal_energy - * 1e6 / nhours, ) if oil_share > 0: - n.add( + # need to aggregate potentials if oil not nodally resolved + if options["co2_budget_national"]: + p_set = oil_share * machinery_nodal_energy / nhours + else: + p_set = oil_share * machinery_nodal_energy.sum() / nhours + + n.madd( "Bus", - "EU agriculture machinery oil", - location="EU", + spatial.oil.agriculture_machinery, + location=spatial.oil.locations, carrier="agriculture machinery oil", unit="MWh_LHV", ) - n.add( + n.madd( "Load", - "agriculture machinery oil", - bus="EU agriculture machinery oil", + spatial.oil.agriculture_machinery, + bus=spatial.oil.agriculture_machinery, carrier="agriculture machinery oil", - p_set=oil_share * machinery_nodal_energy.sum() * 1e6 / nhours, + p_set=p_set, ) - if len(spatial.oil.nodes) == 1: - link_names = ["EU agriculture machinery oil"] - else: - link_names = nodes + " agriculture machinery oil" - n.madd( "Link", - link_names, + spatial.oil.agriculture_machinery, bus0=spatial.oil.nodes, - bus1="EU agriculture machinery oil", + bus1=spatial.oil.agriculture_machinery, bus2="co2 atmosphere", carrier="agriculture machinery oil", p_nom_extendable=True, From 2ad9ca8f7b10155d2b8f738d11a4948ac5f17fb1 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Thu, 26 Oct 2023 11:17:57 +0200 Subject: [PATCH 057/497] add regionalised oil load for process emissions from naphtha as feedstock --- scripts/prepare_sector_network.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 34bfdce7..54830106 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2782,9 +2782,25 @@ def add_industry(n, costs): # convert process emissions from feedstock from MtCO2 to energy demand # need to aggregate potentials if oil not nodally resolved if options["co2_budget_national"]: - p_set = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]) / nhours + p_set_plastics = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]) / nhours else: - p_set = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).sum() / nhours + p_set_plastics = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).sum() / nhours + + if options["co2_budget_national"]: + p_set_process_emissions = ( + demand_factor + * (industrial_demand.loc[nodes, "process emission from feedstock"] + / costs.at["oil", "CO2 intensity"]) + / nhours + ) + else: + p_set_process_emissions = ( + demand_factor + * (industrial_demand.loc[nodes, "process emission from feedstock"] + / costs.at["oil", "CO2 intensity"] + ).sum() + / nhours + ) n.madd( "Bus", @@ -2799,7 +2815,15 @@ def add_industry(n, costs): spatial.oil.naphtha, bus=spatial.oil.naphtha, carrier="naphtha for industry", - p_set=p_set, + p_set=p_set_plastics, + ) + + n.madd( + "Load", + ["naphtha for industry into process emissions from feedstock"], + bus=spatial.oil.nodes, + carrier="naphtha for industry", + p_set=p_set_process_emissions, ) n.madd( From 82ac430fd92f2724918ff0e25568fdd57b75a9a5 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Wed, 8 Nov 2023 09:57:24 +0100 Subject: [PATCH 058/497] fix spatial resolution for solid biomass links and naphtha oil loads under 'co2_spatial: true' flag --- scripts/prepare_sector_network.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 54830106..a5ca8941 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -145,6 +145,7 @@ def define_spatial(nodes, options): spatial.oil.nodes = nodes + " oil" spatial.oil.locations = nodes spatial.oil.naphtha = nodes + " naphtha for industry" + spatial.oil.naphtha_process_emissions = nodes + " naphtha process emissions" spatial.oil.kerosene = nodes + " kerosene for aviation" spatial.oil.shipping = nodes + " shipping oil" spatial.oil.agriculture_machinery = nodes + " agriculture machinery oil" @@ -152,6 +153,7 @@ def define_spatial(nodes, options): spatial.oil.nodes = ["EU oil"] spatial.oil.locations = ["EU"] spatial.oil.naphtha = ["EU naphtha for industry"] + spatial.oil.naphtha_process_emissions = "EU naphtha process emissions" spatial.oil.kerosene = ["EU kerosene for aviation"] spatial.oil.shipping = ["EU shipping oil"] spatial.oil.agriculture_machinery = ["EU agriculture machinery oil"] @@ -2443,9 +2445,14 @@ def add_industry(n, costs): efficiency=1.0, ) + if len(spatial.biomass.industry_cc)<=1 and len(spatial.co2.nodes)>1: + link_names = nodes + " " + spatial.biomass.industry_cc + else: + link_names = spatial.biomass.industry_cc + n.madd( "Link", - spatial.biomass.industry_cc, + link_names, bus0=spatial.biomass.nodes, bus1=spatial.biomass.industry, bus2="co2 atmosphere", @@ -2820,7 +2827,7 @@ def add_industry(n, costs): n.madd( "Load", - ["naphtha for industry into process emissions from feedstock"], + spatial.oil.naphtha_process_emissions, bus=spatial.oil.nodes, carrier="naphtha for industry", p_set=p_set_process_emissions, From 014a4cd62e3bc2f41e9e0ccd8e04ff6c169e9a60 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 12 Nov 2023 18:42:53 +0100 Subject: [PATCH 059/497] fix for losses with multi-period investment --- scripts/solve_network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 83281284..fa59f7a3 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -697,7 +697,8 @@ def add_lossy_bidirectional_link_constraints(n): if not n.links.p_nom_extendable.any() or not "reversed" in n.links.columns: return - carriers = n.links.loc[n.links.reversed, "carrier"].unique() + reversed_links = n.links.reversed.fillna(0).astype(bool) + carriers = n.links.loc[reversed_links, "carrier"].unique() forward_i = n.links.query( "carrier in @carriers and ~reversed and p_nom_extendable" From d9ec127f996f854cc775cdfcc6db18cd26cf3ea5 Mon Sep 17 00:00:00 2001 From: chrstphtrs Date: Tue, 21 Nov 2023 14:55:32 +0100 Subject: [PATCH 060/497] Add process emissions to country emissions constraint, fix snapshot weighting --- scripts/solve_network.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index b372b366..e2edb2eb 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -795,7 +795,7 @@ def add_co2limit_country(n, limit_countries, nyears=1.0): p = n.model["Link-p"] # dimension: (time, component) - # NB: Most country-specific links retain their locational information in bus1 (except for DAC, where it is in bus2) + # NB: Most country-specific links retain their locational information in bus1 (except for DAC, where it is in bus2, and process emissions, where it is in bus0) country = n.links.bus1.map(n.buses.location).map(n.buses.country) country_DAC = ( n.links[n.links.carrier == "DAC"] @@ -803,6 +803,12 @@ def add_co2limit_country(n, limit_countries, nyears=1.0): .map(n.buses.country) ) country[country_DAC.index] = country_DAC + country_process_emissions = ( + n.links[n.links.carrier.str.contains("process emissions")] + .bus0.map(n.buses.location) + .map(n.buses.country) + ) + country[country_process_emissions.index] = country_process_emissions lhs = [] for port in [col[3:] for col in n.links if col.startswith("bus")]: @@ -818,13 +824,18 @@ def add_co2limit_country(n, limit_countries, nyears=1.0): idx = n.links[mask].index + international = n.links.carrier.map( + lambda x: 0.4 if x in ["kerosene for aviation", "shipping oil"] else 1.0 + ) grouping = country.loc[idx] if not grouping.isnull().all(): expr = ( - (p.loc[:, idx] * efficiency[idx]) + ((p.loc[:, idx] * efficiency[idx] * international[idx]) .groupby(grouping, axis=1) .sum() + *n.snapshot_weightings.generators + ) .sum(dims="snapshot") ) lhs.append(expr) @@ -935,6 +946,10 @@ def solve_network(n, config, solving, opts="", **kwargs): f"Solving status '{status}' with termination condition '{condition}'" ) if "infeasible" in condition: + m = n.model + labels = m.compute_infeasibilities() + print(labels) + m.print_infeasibilities() raise RuntimeError("Solving status 'infeasible'") return n From e8324b9c2788339837caf8718898b14f879ea4d8 Mon Sep 17 00:00:00 2001 From: lisazeyen <35347358+lisazeyen@users.noreply.github.com> Date: Fri, 24 Nov 2023 09:58:24 +0100 Subject: [PATCH 061/497] fix bug when oil copper plated --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index a5ca8941..81e4d6e3 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -153,7 +153,7 @@ def define_spatial(nodes, options): spatial.oil.nodes = ["EU oil"] spatial.oil.locations = ["EU"] spatial.oil.naphtha = ["EU naphtha for industry"] - spatial.oil.naphtha_process_emissions = "EU naphtha process emissions" + spatial.oil.naphtha_process_emissions = ["EU naphtha process emissions"] spatial.oil.kerosene = ["EU kerosene for aviation"] spatial.oil.shipping = ["EU shipping oil"] spatial.oil.agriculture_machinery = ["EU agriculture machinery oil"] From 3ff925e797574afc11193d7f63316fdbdde03e12 Mon Sep 17 00:00:00 2001 From: lisazeyen <35347358+lisazeyen@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:00:07 +0100 Subject: [PATCH 062/497] add load shedding for all energy carriers --- scripts/solve_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index e2edb2eb..97c78dad 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -352,7 +352,7 @@ def prepare_network( # http://journal.frontiersin.org/article/10.3389/fenrg.2015.00055/full # TODO: retrieve color and nice name from config n.add("Carrier", "load", color="#dd2e23", nice_name="Load shedding") - buses_i = n.buses.query("carrier == 'AC'").index + buses_i = n.buses.index if not np.isscalar(load_shedding): # TODO: do not scale via sign attribute (use Eur/MWh instead of Eur/kWh) load_shedding = 1e2 # Eur/kWh From cea62de438b7c358bf23ad306dccb300b13beab7 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 4 Dec 2023 16:46:11 +0100 Subject: [PATCH 063/497] solve_network: quick fix so duals can be read from CO2 constrain --- scripts/solve_network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 97c78dad..2413f4c9 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -841,10 +841,10 @@ def add_co2limit_country(n, limit_countries, nyears=1.0): lhs.append(expr) lhs = sum(lhs) # dimension: (country) - lhs = lhs.rename({list(lhs.dims.keys())[0]: "country"}) + lhs = lhs.rename({list(lhs.dims.keys())[0]: "snapshot"}) rhs = pd.Series(co2_limit_countries) # dimension: (country) - for ct in lhs.indexes["country"]: + for ct in lhs.indexes["snapshot"]: n.model.add_constraints( lhs.loc[ct] <= rhs[ct], name=f"GlobalConstraint-co2_limit_per_country{ct}", From 66178a5a27625b7055d029403c66bd7ac6df1da5 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 4 Dec 2023 16:46:45 +0100 Subject: [PATCH 064/497] solve_network: fix sign for country CO2 when bus0=atmosphere So that DAC extracts CO2 rather than pumping into air; for p>0, link withdraws from bus0, but injects into bus1/2/3, so you have to take account of this sign difference- --- scripts/solve_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 2413f4c9..53170da9 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -814,7 +814,7 @@ def add_co2limit_country(n, limit_countries, nyears=1.0): for port in [col[3:] for col in n.links if col.startswith("bus")]: if port == str(0): efficiency = ( - n.links["efficiency"].apply(lambda x: 1.0).rename("efficiency0") + n.links["efficiency"].apply(lambda x: -1.0).rename("efficiency0") ) elif port == str(1): efficiency = n.links["efficiency"] From bbf9ca2d9be0af6fe80ffcc667556405ab0bddbc Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 8 Dec 2023 11:58:28 +0100 Subject: [PATCH 065/497] bug fix: naming of p_set when co2_national is True Without this naming fix, the p_set is a NaN once added --- scripts/prepare_sector_network.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 81e4d6e3..606e17b3 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2643,7 +2643,7 @@ def add_industry(n, costs): # need to aggregate potentials if methanol not nodally resolved if options["co2_budget_national"]: - p_set_methanol = shipping_methanol_share * p_set * efficiency + p_set_methanol = shipping_methanol_share * p_set.rename(lambda x : x + " shipping methanol") * efficiency else: p_set_methanol = shipping_methanol_share * p_set.sum() * efficiency @@ -2707,7 +2707,7 @@ def add_industry(n, costs): if shipping_oil_share: # need to aggregate potentials if oil not nodally resolved if options["co2_budget_national"]: - p_set_oil = shipping_oil_share * p_set + p_set_oil = shipping_oil_share * p_set.rename(lambda x: x + " shipping oil") else: p_set_oil = shipping_oil_share * p_set.sum() @@ -2789,15 +2789,16 @@ def add_industry(n, costs): # convert process emissions from feedstock from MtCO2 to energy demand # need to aggregate potentials if oil not nodally resolved if options["co2_budget_national"]: - p_set_plastics = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]) / nhours + p_set_plastics = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).rename(lambda x: x + " naphtha for industry") / nhours else: p_set_plastics = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).sum() / nhours + if options["co2_budget_national"]: p_set_process_emissions = ( demand_factor * (industrial_demand.loc[nodes, "process emission from feedstock"] - / costs.at["oil", "CO2 intensity"]) + / costs.at["oil", "CO2 intensity"]).rename(lambda x: x + " naphtha process emissions") / nhours ) else: @@ -2857,7 +2858,7 @@ def add_industry(n, costs): * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1) * 1e6 / nhours - ) + ).rename(lambda x: x + " kerosene for aviation") else: p_set = ( demand_factor @@ -3139,7 +3140,7 @@ def add_agriculture(n, costs): if oil_share > 0: # need to aggregate potentials if oil not nodally resolved if options["co2_budget_national"]: - p_set = oil_share * machinery_nodal_energy / nhours + p_set = oil_share * machinery_nodal_energy.rename(lambda x: x + " agriculture machinery oil") / nhours else: p_set = oil_share * machinery_nodal_energy.sum() / nhours From 2d323d1b879751bc96303bd6c6a54fda2c90eccb Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 8 Dec 2023 12:27:07 +0100 Subject: [PATCH 066/497] bug fix: ICE efficiency for land transport was applied twice This was overestimating ICE oil demand by factor 1/0.3. --- scripts/prepare_sector_network.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 606e17b3..342a6b15 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1613,7 +1613,6 @@ def add_land_transport(n, costs): bus1=spatial.oil.land_transport, bus2="co2 atmosphere", carrier="land transport oil", - efficiency=ice_efficiency, efficiency2=costs.at["oil", "CO2 intensity"], p_nom_extendable=True, ) From 00e86e6435816fe007fb25d62de90cf58fbc01c4 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 8 Dec 2023 13:28:08 +0100 Subject: [PATCH 067/497] bug fix: route process emissions from steam cracker to correct bus Now naphtha demand causes process emissions from steak crackers to route to process emissions bus, then rest of CO2 goes to atmosphere. --- scripts/prepare_sector_network.py | 46 +++++++------------------------ 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 342a6b15..8e995dd6 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -145,7 +145,6 @@ def define_spatial(nodes, options): spatial.oil.nodes = nodes + " oil" spatial.oil.locations = nodes spatial.oil.naphtha = nodes + " naphtha for industry" - spatial.oil.naphtha_process_emissions = nodes + " naphtha process emissions" spatial.oil.kerosene = nodes + " kerosene for aviation" spatial.oil.shipping = nodes + " shipping oil" spatial.oil.agriculture_machinery = nodes + " agriculture machinery oil" @@ -153,7 +152,6 @@ def define_spatial(nodes, options): spatial.oil.nodes = ["EU oil"] spatial.oil.locations = ["EU"] spatial.oil.naphtha = ["EU naphtha for industry"] - spatial.oil.naphtha_process_emissions = ["EU naphtha process emissions"] spatial.oil.kerosene = ["EU kerosene for aviation"] spatial.oil.shipping = ["EU shipping oil"] spatial.oil.agriculture_machinery = ["EU agriculture machinery oil"] @@ -2783,31 +2781,10 @@ def add_industry(n, costs): if demand_factor != 1: logger.warning(f"Changing HVC demand by {demand_factor*100-100:+.2f}%.") - # NB: CO2 gets released again to atmosphere when plastics decay - # except for the process emissions when naphtha is used for petrochemicals, which can be captured with other industry process emissions - # convert process emissions from feedstock from MtCO2 to energy demand - # need to aggregate potentials if oil not nodally resolved if options["co2_budget_national"]: - p_set_plastics = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).rename(lambda x: x + " naphtha for industry") / nhours + p_set_plastics = demand_factor * industrial_demand.loc[nodes, "naphtha"].rename(lambda x: x + " naphtha for industry") / nhours else: - p_set_plastics = demand_factor * (industrial_demand.loc[nodes, "naphtha"] - industrial_demand.loc[nodes, "process emission from feedstock"] / costs.at["oil", "CO2 intensity"]).sum() / nhours - - - if options["co2_budget_national"]: - p_set_process_emissions = ( - demand_factor - * (industrial_demand.loc[nodes, "process emission from feedstock"] - / costs.at["oil", "CO2 intensity"]).rename(lambda x: x + " naphtha process emissions") - / nhours - ) - else: - p_set_process_emissions = ( - demand_factor - * (industrial_demand.loc[nodes, "process emission from feedstock"] - / costs.at["oil", "CO2 intensity"] - ).sum() - / nhours - ) + p_set_plastics = demand_factor * industrial_demand.loc[nodes, "naphtha"].sum() / nhours n.madd( "Bus", @@ -2825,13 +2802,10 @@ def add_industry(n, costs): p_set=p_set_plastics, ) - n.madd( - "Load", - spatial.oil.naphtha_process_emissions, - bus=spatial.oil.nodes, - carrier="naphtha for industry", - p_set=p_set_process_emissions, - ) + # some CO2 from naphtha are process emissions from steam cracker + # rest of CO2 released to atmosphere either in waste-to-energy or decay + process_co2_per_naphtha = industrial_demand.loc[nodes, "process emission from feedstock"].sum() / industrial_demand.loc[nodes, "naphtha"].sum() + emitted_co2_per_naphtha = costs.at["oil", "CO2 intensity"] - process_co2_per_naphtha n.madd( "Link", @@ -2839,9 +2813,11 @@ def add_industry(n, costs): bus0=spatial.oil.nodes, bus1=spatial.oil.naphtha, bus2="co2 atmosphere", + bus3=spatial.co2.process_emissions, carrier="naphtha for industry", p_nom_extendable=True, - efficiency2=costs.at["oil", "CO2 intensity"], + efficiency2=emitted_co2_per_naphtha, + efficiency3=process_co2_per_naphtha, ) # aviation @@ -2941,7 +2917,7 @@ def add_industry(n, costs): unit="t_co2", ) - sel = ["process emission", "process emission from feedstock"] + sel = ["process emission"] if options["co2_spatial"] or options["co2network"]: p_set = ( -industrial_demand.loc[nodes, sel] @@ -2952,8 +2928,6 @@ def add_industry(n, costs): else: p_set = -industrial_demand.loc[nodes, sel].sum(axis=1).sum() / nhours - # this should be process emissions fossil+feedstock - # then need load on atmosphere for feedstock emissions that are currently going to atmosphere via Link Fischer-Tropsch demand n.madd( "Load", spatial.co2.process_emissions, From 326ed63329d55d5a84f9230840161cdb3673e27a Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 8 Dec 2023 17:53:28 +0100 Subject: [PATCH 068/497] add_brownfield: disable grid expansion if LV already hit Numerical problems were causing infeasibilities otherwise --- scripts/add_brownfield.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 74102580..fb1453fd 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -119,6 +119,32 @@ def add_brownfield(n, n_p, year): n.links.loc[new_pipes, "p_nom"] = 0.0 n.links.loc[new_pipes, "p_nom_min"] = 0.0 +def disable_grid_expansion_if_LV_limit_hit(n): + if not "lv_limit" in n.global_constraints.index: + return + + #calculate minimum LV + attr = "nom_min" + dc = n.links.index[n.links.carrier == "DC"] + tot = (n.lines["s_" + attr]*n.lines["length"]).sum() + (n.links.loc[dc,"p_" + attr]*n.links.loc[dc,"length"]).sum() + + diff = n.global_constraints.at["lv_limit","constant"]-tot + + #allow small numerical differences + limit = 1 + + if diff < limit: + logger.info(f"LV is already reached (gap {diff}), disabling expansion and LV limit") + expandable_acs = n.lines.index[n.lines.s_nom_extendable] + n.lines.loc[expandable_acs,"s_nom_extendable"] = False + n.lines.loc[expandable_acs,"s_nom"] = n.lines.loc[expandable_acs,"s_nom_min"] + + expandable_dcs = n.links.index[n.links.p_nom_extendable & (n.links.carrier == "DC")] + n.links.loc[expandable_dcs,"p_nom_extendable"] = False + n.links.loc[expandable_dcs,"p_nom"] = n.links.loc[expandable_dcs,"p_nom_min"] + + n.global_constraints.drop("lv_limit", + inplace=True) if __name__ == "__main__": if "snakemake" not in globals(): @@ -150,5 +176,7 @@ if __name__ == "__main__": add_brownfield(n, n_p, year) + disable_grid_expansion_if_LV_limit_hit(n) + n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) n.export_to_netcdf(snakemake.output[0]) From 830019a6e5d5ced3403bd4d5d9e28e2d66fe621b Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 15 Dec 2023 09:50:47 +0100 Subject: [PATCH 069/497] add rule that allows cost data to be modified --- rules/build_sector.smk | 4 ++-- rules/retrieve.smk | 14 ++++++++++++++ scripts/modify_cost_data.py | 12 ++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 scripts/modify_cost_data.py diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 5a9e8646..596c0305 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -743,9 +743,9 @@ rule prepare_sector_network: else RESOURCES + "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv", heat_profile="data/heat_load_profile_BDEW.csv", - costs="data/costs_{}.csv".format(config["costs"]["year"]) + costs="data/costs_{}-modified.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" - else "data/costs_{planning_horizons}.csv", + else "data/costs_{planning_horizons}-modified.csv", profile_offwind_ac=RESOURCES + "profile_offwind-ac.nc", profile_offwind_dc=RESOURCES + "profile_offwind-dc.nc", h2_cavern=RESOURCES + "salt_cavern_potentials_s{simpl}_{clusters}.csv", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index b830be25..18b424ff 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -259,3 +259,17 @@ if config["enable"]["retrieve"]: "../envs/environment.yaml" script: "../scripts/retrieve_monthly_fuel_prices.py" + + +rule modify_cost_data: + input: + costs="data/costs_{year}.csv", + output: + "data/costs_{year}-modified.csv" + log: + LOGS + "modify_cost_data_{year}.log", + resources: + mem_mb=1000, + retries: 2 + script: + "../scripts/modify_cost_data.py" diff --git a/scripts/modify_cost_data.py b/scripts/modify_cost_data.py new file mode 100644 index 00000000..3e1f12f4 --- /dev/null +++ b/scripts/modify_cost_data.py @@ -0,0 +1,12 @@ + +import pandas as pd + +costs = pd.read_csv(snakemake.input.costs, index_col=[0, 1]).sort_index() + +if "modifications" in snakemake.input.keys(): + modifications = pd.read_csv(snakemake.input.modifications, index_col=[0, 1]).sort_index() + costs.loc[modifications.index] = modifications + print(modifications) + print( costs.loc[modifications.index]) + +costs.to_csv(snakemake.output[0]) From c5a123b4f443a29e8f0f7446ed45ab48230ed1a9 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 15 Dec 2023 14:57:03 +0100 Subject: [PATCH 070/497] allow additional functionality for solving to be added by file To add this, overwrite the rule with a new argument: snakemake.input.additional_functionality --- scripts/solve_network.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 53170da9..dce63efe 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -44,6 +44,7 @@ from pypsa.descriptors import get_switchable_as_dense as get_as_dense from prepare_sector_network import emission_sectors_from_opts + def add_land_use_constraint(n, planning_horizons, config): if "m" in snakemake.wildcards.clusters: _add_land_use_constraint_m(n, planning_horizons, config) @@ -899,6 +900,13 @@ def extra_functionality(n, snapshots): logger.info(f"Add CO2 limit for each country") add_co2limit_country(n, limit_countries, nyears) + if "additional_functionality" in snakemake.input.keys(): + import importlib, os, sys + sys.path.append(os.path.dirname(snakemake.input.additional_functionality)) + additional_functionality = importlib.import_module(os.path.splitext(os.path.basename(snakemake.input.additional_functionality))[0]) + + additional_functionality.additional_functionality(n, snapshots, snakemake.wildcards.planning_horizons) + def solve_network(n, config, solving, opts="", **kwargs): set_of_options = solving["solver"]["options"] From 1a7f093e037ed177468c163863a7bbd929d322c3 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 15 Dec 2023 17:18:36 +0100 Subject: [PATCH 071/497] solve: pass wildcards and config to additional_functionality --- scripts/solve_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index dce63efe..6f88b904 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -905,7 +905,7 @@ def extra_functionality(n, snapshots): sys.path.append(os.path.dirname(snakemake.input.additional_functionality)) additional_functionality = importlib.import_module(os.path.splitext(os.path.basename(snakemake.input.additional_functionality))[0]) - additional_functionality.additional_functionality(n, snapshots, snakemake.wildcards.planning_horizons) + additional_functionality.additional_functionality(n, snapshots, snakemake.wildcards, config) def solve_network(n, config, solving, opts="", **kwargs): From b3753d73d75eedaddb8da9f6dcfc4bcf8793831a Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Wed, 20 Dec 2023 09:22:40 +0100 Subject: [PATCH 072/497] undo addition of script to allow cost modifications This undoes commit 830019a6e5d5ced3403bd4d5d9e28e2d66fe621b. Reason: this was introduced for the PyPSA-Ariadne derivative, but can be handled more elegantly within the derivative repository. --- rules/build_sector.smk | 4 ++-- rules/retrieve.smk | 14 -------------- scripts/modify_cost_data.py | 12 ------------ 3 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 scripts/modify_cost_data.py diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 596c0305..5a9e8646 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -743,9 +743,9 @@ rule prepare_sector_network: else RESOURCES + "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv", heat_profile="data/heat_load_profile_BDEW.csv", - costs="data/costs_{}-modified.csv".format(config["costs"]["year"]) + costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" - else "data/costs_{planning_horizons}-modified.csv", + else "data/costs_{planning_horizons}.csv", profile_offwind_ac=RESOURCES + "profile_offwind-ac.nc", profile_offwind_dc=RESOURCES + "profile_offwind-dc.nc", h2_cavern=RESOURCES + "salt_cavern_potentials_s{simpl}_{clusters}.csv", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 18b424ff..b830be25 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -259,17 +259,3 @@ if config["enable"]["retrieve"]: "../envs/environment.yaml" script: "../scripts/retrieve_monthly_fuel_prices.py" - - -rule modify_cost_data: - input: - costs="data/costs_{year}.csv", - output: - "data/costs_{year}-modified.csv" - log: - LOGS + "modify_cost_data_{year}.log", - resources: - mem_mb=1000, - retries: 2 - script: - "../scripts/modify_cost_data.py" diff --git a/scripts/modify_cost_data.py b/scripts/modify_cost_data.py deleted file mode 100644 index 3e1f12f4..00000000 --- a/scripts/modify_cost_data.py +++ /dev/null @@ -1,12 +0,0 @@ - -import pandas as pd - -costs = pd.read_csv(snakemake.input.costs, index_col=[0, 1]).sort_index() - -if "modifications" in snakemake.input.keys(): - modifications = pd.read_csv(snakemake.input.modifications, index_col=[0, 1]).sort_index() - costs.loc[modifications.index] = modifications - print(modifications) - print( costs.loc[modifications.index]) - -costs.to_csv(snakemake.output[0]) From 79f443ecbd2fcaf0a350d27c4c12ba5f56f503a4 Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Wed, 20 Dec 2023 22:41:11 +0600 Subject: [PATCH 073/497] fix f weighting for retro cost --- scripts/prepare_sector_network.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8a4f98ce..bf179451 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1986,7 +1986,12 @@ def add_heat(n, costs): ct = pop_layout.loc[node, "ct"] # weighting 'f' depending on the size of the population at the node - f = urban_fraction[node] if "urban" in name else (1 - urban_fraction[node]) + if "urban central" in name: + f = dist_fraction[node] + elif "urban decentral" in name: + f = urban_fraction[node] - dist_fraction[node] + else: + f = 1 - urban_fraction[node] if f == 0: continue # get sector name ("residential"/"services"/or both "tot" for urban central) From a292308c53755d69bc5e2d8764c750e1605ab6d3 Mon Sep 17 00:00:00 2001 From: martacki Date: Wed, 20 Dec 2023 20:11:37 +0100 Subject: [PATCH 074/497] select correct sector name in endogeneous retrofitting --- scripts/prepare_sector_network.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8a4f98ce..7bf9f817 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1990,7 +1990,9 @@ def add_heat(n, costs): if f == 0: continue # get sector name ("residential"/"services"/or both "tot" for urban central) - sec = [x if x in name else "tot" for x in sectors][0] + if 'urban central' in name: sec = 'tot' + if 'residential' in name: sec = 'residential' + if 'services' in name: sec = 'services' # get floor aread at node and region (urban/rural) in m^2 floor_area_node = ( From f77f84af6ad3d588a746da878cc95d8035d7bf22 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 19:27:56 +0000 Subject: [PATCH 075/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 7bf9f817..a09794fa 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1990,9 +1990,12 @@ def add_heat(n, costs): if f == 0: continue # get sector name ("residential"/"services"/or both "tot" for urban central) - if 'urban central' in name: sec = 'tot' - if 'residential' in name: sec = 'residential' - if 'services' in name: sec = 'services' + if "urban central" in name: + sec = "tot" + if "residential" in name: + sec = "residential" + if "services" in name: + sec = "services" # get floor aread at node and region (urban/rural) in m^2 floor_area_node = ( From 4d63a3f21b1830faf5172bcfaea5889a957fafe9 Mon Sep 17 00:00:00 2001 From: martacki Date: Thu, 21 Dec 2023 09:37:13 +0100 Subject: [PATCH 076/497] fix deprecation warnings --- scripts/prepare_sector_network.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) mode change 100644 => 100755 scripts/prepare_sector_network.py diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py old mode 100644 new mode 100755 index a09794fa..8163c03d --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -425,7 +425,7 @@ def update_wind_solar_costs(n, costs): logger.info( "Added connection cost of {:0.0f}-{:0.0f} Eur/MW/a to {}".format( - connection_cost[0].min(), connection_cost[0].max(), tech + connection_cost.min(), connection_cost.max(), tech ) ) @@ -1630,7 +1630,7 @@ def build_heat_demand(n): electric_nodes = n.loads.index[n.loads.carrier == "electricity"] n.loads_t.p_set[electric_nodes] = ( n.loads_t.p_set[electric_nodes] - - electric_heat_supply.groupby(level=1, axis=1).sum()[electric_nodes] + - electric_heat_supply.T.groupby(level=1).sum().T[electric_nodes] ) return heat_demand @@ -1722,16 +1722,16 @@ def add_heat(n, costs): if sector in name: heat_load = ( - heat_demand[[sector + " water", sector + " space"]] - .groupby(level=1, axis=1) - .sum()[nodes[name]] + heat_demand[[sector + " water", sector + " space"]].T + .groupby(level=1) + .sum().T[nodes[name]] .multiply(factor) ) if name == "urban central": heat_load = ( - heat_demand.groupby(level=1, axis=1) - .sum()[nodes[name]] + heat_demand.T.groupby(level=1) + .sum().T[nodes[name]] .multiply( factor * (1 + options["district_heating"]["district_heating_loss"]) ) @@ -1977,7 +1977,7 @@ def add_heat(n, costs): ) w_space["tot"] = ( heat_demand_r["services space"] + heat_demand_r["residential space"] - ) / heat_demand_r.groupby(level=[1], axis=1).sum() + ) / heat_demand_r.T.groupby(level=[1]).sum().T for name in n.loads[ n.loads.carrier.isin([x + " heat" for x in heat_systems]) @@ -2039,7 +2039,7 @@ def add_heat(n, costs): strengths = strengths.drop(s) # reindex normed time profile of space heat demand back to hourly resolution - space_pu = space_pu.reindex(index=heat_demand.index).fillna(method="ffill") + space_pu = space_pu.reindex(index=heat_demand.index).ffill() # add for each retrofitting strength a generator with heat generation profile following the profile of the heat demand for strength in strengths: @@ -3210,7 +3210,7 @@ def cluster_heat_buses(n): ), inplace=True, ) - pnl[k] = pnl[k].groupby(level=0, axis=1).agg(agg[k], **agg_group_kwargs) + pnl[k] = pnl[k].T.groupby(level=0).agg(agg[k], **agg_group_kwargs).T # remove unclustered assets of service/residential to_drop = c.df.index.difference(df.index) From dfc2f060330ed5f270ec32be4bac3f04192dabdb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 08:41:17 +0000 Subject: [PATCH 077/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8163c03d..8e43587f 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1722,16 +1722,18 @@ def add_heat(n, costs): if sector in name: heat_load = ( - heat_demand[[sector + " water", sector + " space"]].T - .groupby(level=1) - .sum().T[nodes[name]] + heat_demand[[sector + " water", sector + " space"]] + .T.groupby(level=1) + .sum() + .T[nodes[name]] .multiply(factor) ) if name == "urban central": heat_load = ( heat_demand.T.groupby(level=1) - .sum().T[nodes[name]] + .sum() + .T[nodes[name]] .multiply( factor * (1 + options["district_heating"]["district_heating_loss"]) ) From bb160d78b1e566789bd99c12596f581c2debea82 Mon Sep 17 00:00:00 2001 From: martacki Date: Thu, 21 Dec 2023 10:40:10 +0100 Subject: [PATCH 078/497] fix more deprecation warnings --- scripts/build_retro_cost.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) mode change 100644 => 100755 scripts/build_retro_cost.py diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py old mode 100644 new mode 100755 index f5313c21..8a3edb54 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -533,15 +533,15 @@ def prepare_temperature_data(): """ temperature = xr.open_dataarray(snakemake.input.air_temperature).to_pandas() d_heat = ( - temperature.groupby(temperature.columns.str[:2], axis=1) - .mean() + temperature.T.groupby(temperature.columns.str[:2]) + .mean().T .resample("1D") .mean() < t_threshold ).sum() temperature_average_d_heat = ( - temperature.groupby(temperature.columns.str[:2], axis=1) - .mean() + temperature.T.groupby(temperature.columns.str[:2]) + .mean().T .apply( lambda x: get_average_temperature_during_heating_season(x, t_threshold=15) ) @@ -610,7 +610,7 @@ def calculate_costs(u_values, l, cost_retro, window_assumptions): cost_retro.loc[x.name[3], "cost_var"] * 100 * float(l) - * l_weight.loc[x.name[3]][0] + * l_weight.loc[x.name[3]].iloc[0] + cost_retro.loc[x.name[3], "cost_fix"] ) * x.A_element @@ -720,6 +720,7 @@ def map_to_lstrength(l_strength, df): .swaplevel(axis=1) .dropna(axis=1) ) + return pd.concat([df.drop([2, 3], axis=1, level=1), l_strength_df], axis=1) @@ -800,6 +801,7 @@ def calculate_heat_losses(u_values, data_tabula, l_strength, temperature_factor) * data_tabula.A_envelope / data_tabula.A_C_Ref ) + heat_transfer_perm2 = pd.concat( [ heat_transfer_perm2, @@ -836,8 +838,8 @@ def calculate_heat_losses(u_values, data_tabula, l_strength, temperature_factor) F_red_temp = map_to_lstrength(l_strength, F_red_temp) Q_ht = ( - heat_transfer_perm2.groupby(level=1, axis=1) - .sum() + heat_transfer_perm2.T.groupby(level=1) + .sum().T .mul(F_red_temp.droplevel(0, axis=1)) .mul(temperature_factor.reindex(heat_transfer_perm2.index, level=0), axis=0) ) @@ -878,7 +880,7 @@ def calculate_gain_utilisation_factor(heat_transfer_perm2, Q_ht, Q_gain): Calculates gain utilisation factor nu. """ # time constant of the building tau [h] = c_m [Wh/(m^2K)] * 1 /(H_tr_e+H_tb*H_ve) [m^2 K /W] - tau = c_m / heat_transfer_perm2.groupby(level=1, axis=1).sum() + tau = c_m / heat_transfer_perm2.T.groupby(level=1).sum().T alpha = alpha_H_0 + (tau / tau_H_0) # heat balance ratio gamma = (1 / Q_ht).mul(Q_gain.sum(axis=1), axis=0) From 146fb170d8c29932faa1d50b31c8d30dd7491403 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 09:41:13 +0000 Subject: [PATCH 079/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_retro_cost.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index 8a3edb54..6fde4e63 100755 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -534,15 +534,15 @@ def prepare_temperature_data(): temperature = xr.open_dataarray(snakemake.input.air_temperature).to_pandas() d_heat = ( temperature.T.groupby(temperature.columns.str[:2]) - .mean().T - .resample("1D") + .mean() + .T.resample("1D") .mean() < t_threshold ).sum() temperature_average_d_heat = ( temperature.T.groupby(temperature.columns.str[:2]) - .mean().T - .apply( + .mean() + .T.apply( lambda x: get_average_temperature_during_heating_season(x, t_threshold=15) ) ) @@ -839,8 +839,8 @@ def calculate_heat_losses(u_values, data_tabula, l_strength, temperature_factor) Q_ht = ( heat_transfer_perm2.T.groupby(level=1) - .sum().T - .mul(F_red_temp.droplevel(0, axis=1)) + .sum() + .T.mul(F_red_temp.droplevel(0, axis=1)) .mul(temperature_factor.reindex(heat_transfer_perm2.index, level=0), axis=0) ) From e8eb9df73fb6a67bffef3eb0f972f3cb3c256c07 Mon Sep 17 00:00:00 2001 From: martacki Date: Thu, 21 Dec 2023 11:07:23 +0100 Subject: [PATCH 080/497] generalize bus name to allow higher spatial resolution --- scripts/prepare_sector_network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8e43587f..2c2996d4 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2045,10 +2045,11 @@ def add_heat(n, costs): # add for each retrofitting strength a generator with heat generation profile following the profile of the heat demand for strength in strengths: + node_name = ' '.join([i for i in name.split(" ")[2::]]) n.madd( "Generator", [node], - suffix=" retrofitting " + strength + " " + name[6::], + suffix=" retrofitting " + strength + " " + node_name, bus=name, carrier="retrofitting", p_nom_extendable=True, From 5ab9d149ba6d145b3dd81357a0d368099c93371d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:07:51 +0000 Subject: [PATCH 081/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 2c2996d4..f50e887e 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2045,7 +2045,7 @@ def add_heat(n, costs): # add for each retrofitting strength a generator with heat generation profile following the profile of the heat demand for strength in strengths: - node_name = ' '.join([i for i in name.split(" ")[2::]]) + node_name = " ".join([i for i in name.split(" ")[2::]]) n.madd( "Generator", [node], From 7d64a733827a4e7a7680b701fb47270f0ebdaea0 Mon Sep 17 00:00:00 2001 From: martacki Date: Thu, 21 Dec 2023 11:12:54 +0100 Subject: [PATCH 082/497] simplify node_name formulation --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index f50e887e..4ab681f8 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2045,7 +2045,7 @@ def add_heat(n, costs): # add for each retrofitting strength a generator with heat generation profile following the profile of the heat demand for strength in strengths: - node_name = " ".join([i for i in name.split(" ")[2::]]) + node_name = " ".join(name.split(" ")[2::]) n.madd( "Generator", [node], From 20b847c62743690009a8ff3e18832ec02eb65c6b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 13:34:55 +0000 Subject: [PATCH 083/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index bf179451..ed9c0bc6 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1991,7 +1991,7 @@ def add_heat(n, costs): elif "urban decentral" in name: f = urban_fraction[node] - dist_fraction[node] else: - f = 1 - urban_fraction[node] + f = 1 - urban_fraction[node] if f == 0: continue # get sector name ("residential"/"services"/or both "tot" for urban central) From 25cfcaf97b5b76c019e02d8827079dfa16b8615c Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Thu, 21 Dec 2023 20:54:17 +0600 Subject: [PATCH 084/497] fix add_waste_heat --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 82578c29..c57f8e89 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3415,7 +3415,7 @@ if __name__ == "__main__": if "I" in opts: add_industry(n, costs) - if "I" in opts and "H" in opts: + if "H" in opts: add_waste_heat(n) if "A" in opts: # requires H and I From 17e9b4d1dfa5c861ec91d61e6d2859db58e5c75b Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Thu, 21 Dec 2023 20:59:35 +0600 Subject: [PATCH 085/497] make resistive heaters separate of boilers --- scripts/prepare_sector_network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index c57f8e89..7eef4f50 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1827,7 +1827,7 @@ def add_heat(n, costs): lifetime=costs.at[name_type + " water tank storage", "lifetime"], ) - if options["boilers"]: + if options["resistive_heaters"]: key = f"{name_type} resistive heater" n.madd( @@ -1842,6 +1842,7 @@ def add_heat(n, costs): lifetime=costs.at[key, "lifetime"], ) + if options["boilers"]: key = f"{name_type} gas boiler" n.madd( From 8a55a55d20215dfe32cc49bae5de3e0f05411f1f Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Thu, 21 Dec 2023 16:08:43 +0100 Subject: [PATCH 086/497] copperplate oil/methanol supply; allow demand to be regional Force a single supply bus for oil/methanol (until we allow oil/methanol transport). Introduce new config switches "regional_oil/methanol_demand" that allow demand to be regionalised. This is important if regional CO2 budgets need to be enforced. --- config/config.default.yaml | 2 + scripts/prepare_sector_network.py | 103 ++++++++++++++++-------------- 2 files changed, 57 insertions(+), 48 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index cafb9d1d..c1e7ed0f 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -471,6 +471,8 @@ sector: SMR: true SMR_cc: true co2_budget_national: false + regional_methanol_demand: false #set to true if regional CO2 constraints needed + regional_oil_demand: false #set to true if regional CO2 constraints needed regional_co2_sequestration_potential: enable: false attribute: 'conservative estimate Mt' diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8e995dd6..b5a0c0d5 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -127,35 +127,42 @@ def define_spatial(nodes, options): spatial.h2.locations = nodes # methanol + + #beware: unlike other carriers, uses locations rather than locations+carriername + #this allows to avoid separation between nodes and locations + spatial.methanol = SimpleNamespace() - if options["co2_budget_national"]: - spatial.methanol.nodes = nodes + " methanol" - spatial.methanol.locations = nodes + spatial.methanol.nodes = ["EU methanol"] + spatial.methanol.locations = ["EU"] + + if options["regional_methanol_demand"]: + spatial.methanol.demand_locations = nodes spatial.methanol.shipping = nodes + " shipping methanol" else: - spatial.methanol.nodes = ["EU methanol"] - spatial.methanol.locations = ["EU"] + spatial.methanol.demand_locations = ["EU"] spatial.methanol.shipping = ["EU shipping methanol"] # oil spatial.oil = SimpleNamespace() - if options["co2_budget_national"]: - spatial.oil.nodes = nodes + " oil" - spatial.oil.locations = nodes + spatial.oil.nodes = ["EU oil"] + spatial.oil.locations = ["EU"] + + if options["regional_oil_demand"]: + spatial.oil.demand_locations = nodes spatial.oil.naphtha = nodes + " naphtha for industry" spatial.oil.kerosene = nodes + " kerosene for aviation" spatial.oil.shipping = nodes + " shipping oil" spatial.oil.agriculture_machinery = nodes + " agriculture machinery oil" + spatial.oil.land_transport = nodes + " land transport oil" else: - spatial.oil.nodes = ["EU oil"] - spatial.oil.locations = ["EU"] + spatial.oil.demand_locations = ["EU"] spatial.oil.naphtha = ["EU naphtha for industry"] spatial.oil.kerosene = ["EU kerosene for aviation"] spatial.oil.shipping = ["EU shipping oil"] spatial.oil.agriculture_machinery = ["EU agriculture machinery oil"] - spatial.oil.land_transport = nodes + " land transport oil" + spatial.oil.land_transport = ["EU land transport oil"] # uranium spatial.uranium = SimpleNamespace() @@ -1588,10 +1595,15 @@ def add_land_transport(n, costs): ice_efficiency = options["transport_internal_combustion_efficiency"] + p_set_land_transport_oil = ice_share / ice_efficiency * transport[nodes].rename(columns=lambda x: x + " land transport oil") + + if not options["regional_oil_demand"]: + p_set_land_transport_oil = p_set_land_transport_oil.sum(axis=1).to_frame(name="EU land transport oil") + n.madd( "Bus", spatial.oil.land_transport, - location=nodes, + location=spatial.oil.demand_locations, carrier="land transport oil", unit="land transport", ) @@ -1601,7 +1613,7 @@ def add_land_transport(n, costs): spatial.oil.land_transport, bus=spatial.oil.land_transport, carrier="land transport oil", - p_set=ice_share / ice_efficiency * transport[nodes].rename(columns=lambda x: x + " land transport oil"), + p_set=p_set_land_transport_oil, ) n.madd( @@ -2638,16 +2650,15 @@ def add_industry(n, costs): options["shipping_oil_efficiency"] / options["shipping_methanol_efficiency"] ) - # need to aggregate potentials if methanol not nodally resolved - if options["co2_budget_national"]: - p_set_methanol = shipping_methanol_share * p_set.rename(lambda x : x + " shipping methanol") * efficiency - else: - p_set_methanol = shipping_methanol_share * p_set.sum() * efficiency + p_set_methanol = shipping_methanol_share * p_set.rename(lambda x : x + " shipping methanol") * efficiency + + if not options["regional_methanol_demand"]: + p_set_methanol = p_set_methanol.sum() n.madd( "Bus", spatial.methanol.shipping, - location=spatial.methanol.locations, + location=spatial.methanol.demand_locations, carrier="shipping methanol", unit="MWh_LHV", ) @@ -2684,7 +2695,8 @@ def add_industry(n, costs): # could correct to e.g. 0.001 EUR/kWh * annuity and O&M n.madd( "Store", - [oil_bus + " Store" for oil_bus in spatial.oil.nodes], + spatial.oil.nodes, + suffix=" Store", bus=spatial.oil.nodes, e_nom_extendable=True, e_cyclic=True, @@ -2702,16 +2714,16 @@ def add_industry(n, costs): ) if shipping_oil_share: - # need to aggregate potentials if oil not nodally resolved - if options["co2_budget_national"]: - p_set_oil = shipping_oil_share * p_set.rename(lambda x: x + " shipping oil") - else: - p_set_oil = shipping_oil_share * p_set.sum() + + p_set_oil = shipping_oil_share * p_set.rename(lambda x: x + " shipping oil") + + if not options["regional_oil_demand"]: + p_set_oil = p_set_oil.sum() n.madd( "Bus", spatial.oil.shipping, - location=spatial.oil.locations, + location=spatial.oil.demand_locations, carrier="shipping oil", unit="MWh_LHV", ) @@ -2781,15 +2793,15 @@ def add_industry(n, costs): if demand_factor != 1: logger.warning(f"Changing HVC demand by {demand_factor*100-100:+.2f}%.") - if options["co2_budget_national"]: - p_set_plastics = demand_factor * industrial_demand.loc[nodes, "naphtha"].rename(lambda x: x + " naphtha for industry") / nhours - else: - p_set_plastics = demand_factor * industrial_demand.loc[nodes, "naphtha"].sum() / nhours + p_set_plastics = demand_factor * industrial_demand.loc[nodes, "naphtha"].rename(lambda x: x + " naphtha for industry") / nhours + + if not options["regional_oil_demand"]: + p_set_plastics = p_set_plastics.sum() n.madd( "Bus", spatial.oil.naphtha, - location=spatial.oil.locations, + location=spatial.oil.demand_locations, carrier="naphtha for industry", unit="MWh_LHV", ) @@ -2826,26 +2838,21 @@ def add_industry(n, costs): logger.warning(f"Changing aviation demand by {demand_factor*100-100:+.2f}%.") all_aviation = ["total international aviation", "total domestic aviation"] - # need to aggregate potentials if oil not nodally resolved - if options["co2_budget_national"]: - p_set = ( + + p_set = ( demand_factor * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1) * 1e6 / nhours ).rename(lambda x: x + " kerosene for aviation") - else: - p_set = ( - demand_factor - * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1).sum() - * 1e6 - / nhours - ) + + if not options["regional_oil_demand"]: + p_set = p_set.sum() n.madd( "Bus", spatial.oil.kerosene, - location=spatial.oil.locations, + location=spatial.oil.demand_locations, carrier="kerosene for aviation", unit="MWh_LHV", ) @@ -3111,16 +3118,16 @@ def add_agriculture(n, costs): ) if oil_share > 0: - # need to aggregate potentials if oil not nodally resolved - if options["co2_budget_national"]: - p_set = oil_share * machinery_nodal_energy.rename(lambda x: x + " agriculture machinery oil") / nhours - else: - p_set = oil_share * machinery_nodal_energy.sum() / nhours + + p_set = oil_share * machinery_nodal_energy.rename(lambda x: x + " agriculture machinery oil") / nhours + + if not options["regional_oil_demand"]: + p_set = p_set.sum() n.madd( "Bus", spatial.oil.agriculture_machinery, - location=spatial.oil.locations, + location=spatial.oil.demand_locations, carrier="agriculture machinery oil", unit="MWh_LHV", ) From a3688a74fde77fe724937e3a899fbc46671bcab4 Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Sat, 23 Dec 2023 12:31:31 +0600 Subject: [PATCH 087/497] add resistive_heaters option to config.default --- config/config.default.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index a6df173b..4bc1ccd0 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -440,6 +440,7 @@ sector: decentral: 3 central: 180 boilers: true + resistive_heaters: true oil_boilers: false biomass_boiler: true chp: true From 12096d1f2f1f7e2daaa088f926b7d0b3d5069d91 Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Sat, 23 Dec 2023 12:55:50 +0600 Subject: [PATCH 088/497] update configtable by adding resistive_heaters --- doc/configtables/sector.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 856ea074..21fd185a 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -63,6 +63,7 @@ tes_tau,,,The time constant used to calculate the decay of thermal energy in the -- decentral,days,float,The time constant in decentralized thermal energy storage (TES) -- central,days,float,The time constant in centralized thermal energy storage (TES) boilers,--,"{true, false}",Add option for transforming electricity into heat using resistive heater +resistive_heaters,--,"{true, false}",Add option for using resistive heaters separately from boilers oil_boilers,--,"{true, false}",Add option for transforming oil into heat using boilers biomass_boiler,--,"{true, false}",Add option for transforming biomass into heat using boilers chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP) From 1bee34d57f155c10e3b7c1078cda14084fabf51f Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Sat, 23 Dec 2023 14:51:01 +0600 Subject: [PATCH 089/497] remove gas generators --- scripts/prepare_sector_network.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 82578c29..b46cc24d 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -467,6 +467,9 @@ def add_carrier_buses(n, carrier, nodes=None): * costs.at[carrier, "discount rate"], # preliminary value to avoid zeros ) + if carrier == 'gas': + return + n.madd( "Generator", nodes, From 125c40601305eea314786ca73ff6d82e57b2f060 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 23 Dec 2023 08:55:56 +0000 Subject: [PATCH 090/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b46cc24d..bb17228c 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -467,7 +467,7 @@ def add_carrier_buses(n, carrier, nodes=None): * costs.at[carrier, "discount rate"], # preliminary value to avoid zeros ) - if carrier == 'gas': + if carrier == "gas": return n.madd( From 640a4b1b2efc78ef6c3b4dc8d996baa92bd73427 Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Thu, 28 Dec 2023 13:51:30 +0600 Subject: [PATCH 091/497] update boilers description in confitables --- doc/configtables/sector.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 21fd185a..734efe34 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -62,7 +62,7 @@ tes,--,"{true, false}",Add option for storing thermal energy in large water pits tes_tau,,,The time constant used to calculate the decay of thermal energy in thermal energy storage (TES): 1- :math:`e^{-1/24τ}`. -- decentral,days,float,The time constant in decentralized thermal energy storage (TES) -- central,days,float,The time constant in centralized thermal energy storage (TES) -boilers,--,"{true, false}",Add option for transforming electricity into heat using resistive heater +boilers,--,"{true, false}",Add option for transforming gas into heat using gas boilers resistive_heaters,--,"{true, false}",Add option for using resistive heaters separately from boilers oil_boilers,--,"{true, false}",Add option for transforming oil into heat using boilers biomass_boiler,--,"{true, false}",Add option for transforming biomass into heat using boilers From 0f41ff79cffa55c0e5198f34b3a7a025c7715f42 Mon Sep 17 00:00:00 2001 From: yerbol-akhmetov Date: Thu, 28 Dec 2023 13:53:15 +0600 Subject: [PATCH 092/497] update configtable for resistive_heaters --- doc/configtables/sector.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 734efe34..2a65e2a8 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -63,7 +63,7 @@ tes_tau,,,The time constant used to calculate the decay of thermal energy in the -- decentral,days,float,The time constant in decentralized thermal energy storage (TES) -- central,days,float,The time constant in centralized thermal energy storage (TES) boilers,--,"{true, false}",Add option for transforming gas into heat using gas boilers -resistive_heaters,--,"{true, false}",Add option for using resistive heaters separately from boilers +resistive_heaters,--,"{true, false}",Add option for transforming electricity into heat using resistive heaters (independently from gas boilers) oil_boilers,--,"{true, false}",Add option for transforming oil into heat using boilers biomass_boiler,--,"{true, false}",Add option for transforming biomass into heat using boilers chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP) From 71985d5e3aa173386c0decb301750f09c5408041 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 29 Dec 2023 12:34:14 +0100 Subject: [PATCH 093/497] validate checksums for zenodo downloads --- doc/release_notes.rst | 3 ++ rules/common.smk | 3 ++ rules/retrieve.smk | 6 ++- scripts/_helpers.py | 59 +++++++++++++++++++++ scripts/retrieve_databundle.py | 4 +- scripts/retrieve_gas_infrastructure_data.py | 4 +- scripts/retrieve_sector_databundle.py | 4 +- 7 files changed, 79 insertions(+), 4 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index d7931f0e..7b1b6d73 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -54,6 +54,9 @@ Upcoming Release reconnected to the main Ukrainian grid with the configuration option `reconnect_crimea`. +* Validate downloads from Zenodo using MD5 checksums. This identifies corrupted + or incomplete downloads. + **Bugs and Compatibility** diff --git a/rules/common.smk b/rules/common.smk index d3416050..a1537c10 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -2,6 +2,9 @@ # # SPDX-License-Identifier: MIT +import os, sys +sys.path.insert(0, os.path.abspath("scripts")) +from _helpers import validate_checksum def memory(w): factor = 3.0 diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 4fe0cd7b..e2e63427 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -77,6 +77,7 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_cutout", True retries: 2 run: move(input[0], output[0]) + validate_checksum(output[0], input[0]) if config["enable"]["retrieve"] and config["enable"].get("retrieve_cost_data", True): @@ -113,7 +114,7 @@ if config["enable"]["retrieve"] and config["enable"].get( static=True, ), output: - protected(RESOURCES + "natura.tiff"), + RESOURCES + "natura.tiff", log: LOGS + "retrieve_natura_raster.log", resources: @@ -121,6 +122,7 @@ if config["enable"]["retrieve"] and config["enable"].get( retries: 2 run: move(input[0], output[0]) + validate_checksum(output[0], input[0]) if config["enable"]["retrieve"] and config["enable"].get( @@ -226,6 +228,7 @@ if config["enable"]["retrieve"]: retries: 2 run: move(input[0], output[0]) + validate_checksum(output[0], input[0]) if config["enable"]["retrieve"]: @@ -243,6 +246,7 @@ if config["enable"]["retrieve"]: + "Copernicus_LC100_global_v3.0.1_2019-nrt_Discrete-Classification-map_EPSG-4326.tif", run: move(input[0], output[0]) + validate_checksum(output[0], input[0]) if config["enable"]["retrieve"]: diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 398f3a30..d906872d 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: MIT import contextlib +import hashlib import logging import os import urllib @@ -11,6 +12,7 @@ from pathlib import Path import pandas as pd import pytz +import requests import yaml from pypsa.components import component_attrs, components from pypsa.descriptors import Dict @@ -318,3 +320,60 @@ def update_config_with_sector_opts(config, sector_opts): if o.startswith("CF+"): l = o.split("+")[1:] update_config(config, parse(l)) + + +def get_checksum_from_zenodo(file_url): + parts = file_url.split("/") + record_id = parts[parts.index("record") + 1] + filename = parts[-1] + + response = requests.get(f"https://zenodo.org/api/records/{record_id}", timeout=30) + response.raise_for_status() + data = response.json() + + for file in data["files"]: + if file["key"] == filename: + return file["checksum"] + return None + + +def validate_checksum(file_path, zenodo_url=None, checksum=None): + """ + Validate file checksum against provided or Zenodo-retrieved checksum. + Calculates the hash of a file using 64KB chunks. Compares it against a given + checksum or one from a Zenodo URL. + + Parameters + ---------- + file_path : str + Path to the file for checksum validation. + zenodo_url : str, optional + URL of the file on Zenodo to fetch the checksum. + checksum : str, optional + Checksum (format 'hash_type:checksum_value') for validation. + + Raises + ------ + AssertionError + If the checksum does not match, or if neither `checksum` nor `zenodo_url` is provided. + + + Examples + -------- + >>> validate_checksum('/path/to/file', checksum='md5:abc123...') + >>> validate_checksum('/path/to/file', zenodo_url='https://zenodo.org/record/12345/files/example.txt') + + If the checksum is invalid, an AssertionError will be raised. + """ + assert checksum or zenodo_url, "Either checksum or zenodo_url must be provided" + if zenodo_url: + checksum = get_checksum_from_zenodo(zenodo_url) + hash_type, checksum = checksum.split(":") + hasher = hashlib.new(hash_type) + with open(file_path, "rb") as f: + for chunk in iter(lambda: f.read(65536), b""): # 64kb chunks + hasher.update(chunk) + calculated_checksum = hasher.hexdigest() + assert ( + calculated_checksum == checksum + ), "Checksum is invalid. This may be due to an incomplete download. Delete the file and re-execute the rule." diff --git a/scripts/retrieve_databundle.py b/scripts/retrieve_databundle.py index 75d8519e..25894063 100644 --- a/scripts/retrieve_databundle.py +++ b/scripts/retrieve_databundle.py @@ -36,7 +36,7 @@ import logging import tarfile from pathlib import Path -from _helpers import configure_logging, progress_retrieve +from _helpers import configure_logging, progress_retrieve, validate_checksum logger = logging.getLogger(__name__) @@ -65,6 +65,8 @@ if __name__ == "__main__": disable_progress = snakemake.config["run"].get("disable_progressbar", False) progress_retrieve(url, tarball_fn, disable=disable_progress) + validate_checksum(tarball_fn, url) + logger.info("Extracting databundle.") tarfile.open(tarball_fn).extractall(to_fn) diff --git a/scripts/retrieve_gas_infrastructure_data.py b/scripts/retrieve_gas_infrastructure_data.py index 42b726db..d984b9fe 100644 --- a/scripts/retrieve_gas_infrastructure_data.py +++ b/scripts/retrieve_gas_infrastructure_data.py @@ -11,7 +11,7 @@ import logging import zipfile from pathlib import Path -from _helpers import progress_retrieve +from _helpers import progress_retrieve, validate_checksum logger = logging.getLogger(__name__) @@ -35,6 +35,8 @@ if __name__ == "__main__": disable_progress = snakemake.config["run"].get("disable_progressbar", False) progress_retrieve(url, zip_fn, disable=disable_progress) + validate_checksum(zip_fn, url) + logger.info("Extracting databundle.") zipfile.ZipFile(zip_fn).extractall(to_fn) diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index 0d172c8d..cb6cc969 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -13,7 +13,7 @@ logger = logging.getLogger(__name__) import tarfile from pathlib import Path -from _helpers import configure_logging, progress_retrieve +from _helpers import configure_logging, progress_retrieve, validate_checksum if __name__ == "__main__": if "snakemake" not in globals(): @@ -34,6 +34,8 @@ if __name__ == "__main__": disable_progress = snakemake.config["run"].get("disable_progressbar", False) progress_retrieve(url, tarball_fn, disable=disable_progress) + validate_checksum(tarball_fn, url) + logger.info("Extracting databundle.") tarfile.open(tarball_fn).extractall(to_fn) From de3b6c9573f075d2bdb93ea0af852c8b31ca03b3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 11:38:41 +0000 Subject: [PATCH 094/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/common.smk | 2 ++ scripts/_helpers.py | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index a1537c10..2c8cf69c 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -3,9 +3,11 @@ # SPDX-License-Identifier: MIT import os, sys + sys.path.insert(0, os.path.abspath("scripts")) from _helpers import validate_checksum + def memory(w): factor = 3.0 for o in w.opts.split("-"): diff --git a/scripts/_helpers.py b/scripts/_helpers.py index d906872d..9945f70f 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -340,8 +340,8 @@ def get_checksum_from_zenodo(file_url): def validate_checksum(file_path, zenodo_url=None, checksum=None): """ Validate file checksum against provided or Zenodo-retrieved checksum. - Calculates the hash of a file using 64KB chunks. Compares it against a given - checksum or one from a Zenodo URL. + Calculates the hash of a file using 64KB chunks. Compares it against a + given checksum or one from a Zenodo URL. Parameters ---------- @@ -360,8 +360,11 @@ def validate_checksum(file_path, zenodo_url=None, checksum=None): Examples -------- - >>> validate_checksum('/path/to/file', checksum='md5:abc123...') - >>> validate_checksum('/path/to/file', zenodo_url='https://zenodo.org/record/12345/files/example.txt') + >>> validate_checksum("/path/to/file", checksum="md5:abc123...") + >>> validate_checksum( + ... "/path/to/file", + ... zenodo_url="https://zenodo.org/record/12345/files/example.txt", + ... ) If the checksum is invalid, an AssertionError will be raised. """ From 715aa25698a97ce30a06228985b381f2a1c1f600 Mon Sep 17 00:00:00 2001 From: martacki Date: Fri, 29 Dec 2023 13:40:00 +0100 Subject: [PATCH 095/497] build_energy_totals: avoid deprecation warnings --- scripts/build_energy_totals.py | 58 ++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 6f9585c1..7c0984be 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -189,12 +189,12 @@ def idees_per_country(ct, year, base_dir): ct_totals["total residential water"] = df.at["Water heating"] assert df.index[23] == "Electricity" - ct_totals["electricity residential water"] = df[23] + ct_totals["electricity residential water"] = df.iloc[23] ct_totals["total residential cooking"] = df["Cooking"] assert df.index[30] == "Electricity" - ct_totals["electricity residential cooking"] = df[30] + ct_totals["electricity residential cooking"] = df.iloc[30] df = pd.read_excel(fn_residential, "RES_summary", index_col=0)[year] @@ -202,13 +202,14 @@ def idees_per_country(ct, year, base_dir): ct_totals["total residential"] = df[row] assert df.index[47] == "Electricity" - ct_totals["electricity residential"] = df[47] + ct_totals["electricity residential"] = df.iloc[47] assert df.index[46] == "Derived heat" - ct_totals["derived heat residential"] = df[46] + ct_totals["derived heat residential"] = df.iloc[46] assert df.index[50] == "Thermal uses" - ct_totals["thermal uses residential"] = df[50] + ct_totals["thermal uses residential"] = df.iloc[50] + # services @@ -222,12 +223,12 @@ def idees_per_country(ct, year, base_dir): ct_totals["total services water"] = df["Hot water"] assert df.index[24] == "Electricity" - ct_totals["electricity services water"] = df[24] + ct_totals["electricity services water"] = df.iloc[24] ct_totals["total services cooking"] = df["Catering"] assert df.index[31] == "Electricity" - ct_totals["electricity services cooking"] = df[31] + ct_totals["electricity services cooking"] = df.iloc[31] df = pd.read_excel(fn_tertiary, "SER_summary", index_col=0)[year] @@ -235,13 +236,14 @@ def idees_per_country(ct, year, base_dir): ct_totals["total services"] = df[row] assert df.index[50] == "Electricity" - ct_totals["electricity services"] = df[50] + ct_totals["electricity services"] = df.iloc[50] assert df.index[49] == "Derived heat" - ct_totals["derived heat services"] = df[49] + ct_totals["derived heat services"] = df.iloc[49] + assert df.index[53] == "Thermal uses" - ct_totals["thermal uses services"] = df[53] + ct_totals["thermal uses services"] = df.iloc[53] # agriculture, forestry and fishing @@ -282,28 +284,28 @@ def idees_per_country(ct, year, base_dir): ct_totals["total two-wheel"] = df["Powered 2-wheelers (Gasoline)"] assert df.index[19] == "Passenger cars" - ct_totals["total passenger cars"] = df[19] + ct_totals["total passenger cars"] = df.iloc[19] assert df.index[30] == "Battery electric vehicles" - ct_totals["electricity passenger cars"] = df[30] + ct_totals["electricity passenger cars"] = df.iloc[30] assert df.index[31] == "Motor coaches, buses and trolley buses" - ct_totals["total other road passenger"] = df[31] + ct_totals["total other road passenger"] = df.iloc[31] assert df.index[39] == "Battery electric vehicles" - ct_totals["electricity other road passenger"] = df[39] + ct_totals["electricity other road passenger"] = df.iloc[39] assert df.index[41] == "Light duty vehicles" - ct_totals["total light duty road freight"] = df[41] + ct_totals["total light duty road freight"] = df.iloc[41] assert df.index[49] == "Battery electric vehicles" - ct_totals["electricity light duty road freight"] = df[49] + ct_totals["electricity light duty road freight"] = df.iloc[49] row = "Heavy duty vehicles (Diesel oil incl. biofuels)" ct_totals["total heavy duty road freight"] = df[row] assert df.index[61] == "Passenger cars" - ct_totals["passenger car efficiency"] = df[61] + ct_totals["passenger car efficiency"] = df.iloc[61] df = pd.read_excel(fn_transport, "TrRail_ene", index_col=0)[year] @@ -312,39 +314,39 @@ def idees_per_country(ct, year, base_dir): ct_totals["electricity rail"] = df["Electricity"] assert df.index[15] == "Passenger transport" - ct_totals["total rail passenger"] = df[15] + ct_totals["total rail passenger"] = df.iloc[15] assert df.index[16] == "Metro and tram, urban light rail" assert df.index[19] == "Electric" assert df.index[20] == "High speed passenger trains" - ct_totals["electricity rail passenger"] = df[[16, 19, 20]].sum() + ct_totals["electricity rail passenger"] = df.iloc[[16, 19, 20]].sum() assert df.index[21] == "Freight transport" - ct_totals["total rail freight"] = df[21] + ct_totals["total rail freight"] = df.iloc[21] assert df.index[23] == "Electric" - ct_totals["electricity rail freight"] = df[23] + ct_totals["electricity rail freight"] = df.iloc[23] df = pd.read_excel(fn_transport, "TrAvia_ene", index_col=0)[year] assert df.index[6] == "Passenger transport" - ct_totals["total aviation passenger"] = df[6] + ct_totals["total aviation passenger"] = df.iloc[6] assert df.index[10] == "Freight transport" - ct_totals["total aviation freight"] = df[10] + ct_totals["total aviation freight"] = df.iloc[10] assert df.index[7] == "Domestic" - ct_totals["total domestic aviation passenger"] = df[7] + ct_totals["total domestic aviation passenger"] = df.iloc[7] assert df.index[8] == "International - Intra-EU" assert df.index[9] == "International - Extra-EU" - ct_totals["total international aviation passenger"] = df[[8, 9]].sum() + ct_totals["total international aviation passenger"] = df.iloc[[8, 9]].sum() assert df.index[11] == "Domestic and International - Intra-EU" - ct_totals["total domestic aviation freight"] = df[11] + ct_totals["total domestic aviation freight"] = df.iloc[11] assert df.index[12] == "International - Extra-EU" - ct_totals["total international aviation freight"] = df[12] + ct_totals["total international aviation freight"] = df.iloc[12] ct_totals["total domestic aviation"] = ( ct_totals["total domestic aviation freight"] @@ -364,7 +366,7 @@ def idees_per_country(ct, year, base_dir): df = pd.read_excel(fn_transport, "TrRoad_act", index_col=0)[year] assert df.index[85] == "Passenger cars" - ct_totals["passenger cars"] = df[85] + ct_totals["passenger cars"] = df.iloc[85] return pd.Series(ct_totals, name=ct) From 74cf849ac4b1c054ef32cf720ee95ada52c8ef70 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 12:40:45 +0000 Subject: [PATCH 096/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_energy_totals.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 7c0984be..67b86466 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -210,7 +210,6 @@ def idees_per_country(ct, year, base_dir): assert df.index[50] == "Thermal uses" ct_totals["thermal uses residential"] = df.iloc[50] - # services df = pd.read_excel(fn_tertiary, "SER_hh_fec", index_col=0)[year] @@ -241,7 +240,6 @@ def idees_per_country(ct, year, base_dir): assert df.index[49] == "Derived heat" ct_totals["derived heat services"] = df.iloc[49] - assert df.index[53] == "Thermal uses" ct_totals["thermal uses services"] = df.iloc[53] From 8a11bdb4b132f6803485c01c2d222cad8e9d3c66 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 29 Dec 2023 17:19:19 +0100 Subject: [PATCH 097/497] solve_network: option to inject custom extra functionalities from source file --- config/config.default.yaml | 1 + doc/configtables/solving.csv | 1 + doc/release_notes.rst | 5 +++++ rules/solve_myopic.smk | 3 +++ rules/solve_overnight.smk | 3 +++ rules/solve_perfect.smk | 3 +++ scripts/solve_network.py | 7 +++++++ 7 files changed, 23 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index a6df173b..0ff742e7 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -627,6 +627,7 @@ solving: skip_iterations: true rolling_horizon: false seed: 123 + custom_extra_functionality: "data/custom_extra_functionality.py" # options that go into the optimize function track_iterations: false min_iterations: 4 diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 45d50d84..9d47c043 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -6,6 +6,7 @@ options,,, -- skip_iterations,bool,"{'true','false'}","Skip iterating, do not update impedances of branches. Defaults to true." -- rolling_horizon,bool,"{'true','false'}","Whether to optimize the network in a rolling horizon manner, where the snapshot range is split into slices of size `horizon` which are solved consecutively." -- seed,--,int,Random seed for increased deterministic behaviour. +-- custom_extra_functionality,--,str,Path to a Python file with custom extra functionality code to be injected into the solving rules of the workflow. -- track_iterations,bool,"{'true','false'}",Flag whether to store the intermediate branch capacities and objective function values are recorded for each iteration in ``network.lines['s_nom_opt_X']`` (where ``X`` labels the iteration) -- min_iterations,--,int,Minimum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. -- max_iterations,--,int,Maximum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index d7931f0e..a7644682 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -54,6 +54,11 @@ Upcoming Release reconnected to the main Ukrainian grid with the configuration option `reconnect_crimea`. +* Add option to reference an additional source file where users can specify + custom ``extra_functionality`` constraints in the configuration file. The + default setting points to an empty hull at + ``data/custom_extra_functionality.py``. + **Bugs and Compatibility** diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 8a93d24a..217547b9 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -88,6 +88,9 @@ rule solve_sector_network_myopic: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), + custom_extra_functionality=workflow.source_path( + config["solver"]["options"].get("custom_extra_functionality", "") + ), input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index c7700760..8ac56db8 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -11,6 +11,9 @@ rule solve_sector_network: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), + custom_extra_functionality=workflow.source_path( + config["solver"]["options"].get("custom_extra_functionality", "") + ), input: network=RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index ef4e367d..322ced8d 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -118,6 +118,9 @@ rule solve_sector_network_perfect: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), + custom_extra_functionality=workflow.source_path( + config["solver"]["options"].get("custom_extra_functionality", "") + ), input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", diff --git a/scripts/solve_network.py b/scripts/solve_network.py index ff2a2f23..539c4e72 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -26,7 +26,9 @@ Additionally, some extra constraints specified in :mod:`solve_network` are added the workflow for all scenarios in the configuration file (``scenario:``) based on the rule :mod:`solve_network`. """ +import importlib import logging +import os import re import numpy as np @@ -792,6 +794,11 @@ def extra_functionality(n, snapshots): add_carbon_budget_constraint(n, snapshots) add_retrofit_gas_boiler_constraint(n, snapshots) + if snakemake.params.custom_extra_functionality: + source_path = snakemake.params.custom_extra_functionality + module_name = os.path.splitext(os.path.basename(source_path))[0] + module = importlib.import_module(module_name) + module.custom_extra_functionality(n, snapshots) def solve_network(n, config, solving, opts="", **kwargs): set_of_options = solving["solver"]["options"] From fba320bfa7ae05a86e567426848577d42a25b337 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 16:20:24 +0000 Subject: [PATCH 098/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/solve_network.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 539c4e72..d79a6342 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -800,6 +800,7 @@ def extra_functionality(n, snapshots): module = importlib.import_module(module_name) module.custom_extra_functionality(n, snapshots) + def solve_network(n, config, solving, opts="", **kwargs): set_of_options = solving["solver"]["options"] cf_solving = solving["options"] From 4b6dd2908324eda4c1722cb9ba41d330df6da443 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 29 Dec 2023 17:23:11 +0100 Subject: [PATCH 099/497] add dummy file and assert path exists --- data/custom_extra_functionality.py | 9 +++++++++ scripts/solve_network.py | 1 + 2 files changed, 10 insertions(+) create mode 100644 data/custom_extra_functionality.py diff --git a/data/custom_extra_functionality.py b/data/custom_extra_functionality.py new file mode 100644 index 00000000..98b0c026 --- /dev/null +++ b/data/custom_extra_functionality.py @@ -0,0 +1,9 @@ +# SPDX-FileCopyrightText: : 2023- The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +def custom_extra_functionality(n, snapshots): + """ + Add custom extra functionality constraints. + """ + pass diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 539c4e72..ed28c51c 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -796,6 +796,7 @@ def extra_functionality(n, snapshots): if snakemake.params.custom_extra_functionality: source_path = snakemake.params.custom_extra_functionality + assert os.path.exists(source_path), f"{source_path} does not exist" module_name = os.path.splitext(os.path.basename(source_path))[0] module = importlib.import_module(module_name) module.custom_extra_functionality(n, snapshots) From 876a28b688719273cc8fd9531845ae78c0e7edbe Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 16:23:52 +0000 Subject: [PATCH 100/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data/custom_extra_functionality.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/custom_extra_functionality.py b/data/custom_extra_functionality.py index 98b0c026..0ac24cea 100644 --- a/data/custom_extra_functionality.py +++ b/data/custom_extra_functionality.py @@ -1,7 +1,9 @@ +# -*- coding: utf-8 -*- # SPDX-FileCopyrightText: : 2023- The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT + def custom_extra_functionality(n, snapshots): """ Add custom extra functionality constraints. From a5ba2565a0abfcbe84d25c75a66fd2639bf08ca1 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 29 Dec 2023 17:30:03 +0100 Subject: [PATCH 101/497] correct config location --- rules/solve_myopic.smk | 2 +- rules/solve_overnight.smk | 2 +- rules/solve_perfect.smk | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 217547b9..afa8ad2c 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -89,7 +89,7 @@ rule solve_sector_network_myopic: "co2_sequestration_potential", 200 ), custom_extra_functionality=workflow.source_path( - config["solver"]["options"].get("custom_extra_functionality", "") + config["solving"]["options"].get("custom_extra_functionality", "") ), input: network=RESULTS diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 8ac56db8..fc2f74df 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -12,7 +12,7 @@ rule solve_sector_network: "co2_sequestration_potential", 200 ), custom_extra_functionality=workflow.source_path( - config["solver"]["options"].get("custom_extra_functionality", "") + config["solving"]["options"].get("custom_extra_functionality", "") ), input: network=RESULTS diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 322ced8d..63be5cc1 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -119,7 +119,7 @@ rule solve_sector_network_perfect: "co2_sequestration_potential", 200 ), custom_extra_functionality=workflow.source_path( - config["solver"]["options"].get("custom_extra_functionality", "") + config["solving"]["options"].get("custom_extra_functionality", "") ), input: network=RESULTS From 79ca64382b56e69315e641c9441e7a036a97313a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 31 Dec 2023 14:15:37 +0100 Subject: [PATCH 102/497] correct path for custom_extra_functionality --- config/config.default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 0ff742e7..b8945f75 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -627,7 +627,7 @@ solving: skip_iterations: true rolling_horizon: false seed: 123 - custom_extra_functionality: "data/custom_extra_functionality.py" + custom_extra_functionality: "../data/custom_extra_functionality.py" # options that go into the optimize function track_iterations: false min_iterations: 4 From adf2c96dc13deb0b4cb3df077e3c552a3dbcddd1 Mon Sep 17 00:00:00 2001 From: Jess <122939887+jessLryan@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:14:38 +0000 Subject: [PATCH 103/497] Update index.rst fixed 2 broken links --- doc/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/index.rst b/doc/index.rst index d30dd8b9..909a96a2 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -116,7 +116,7 @@ of the individual parts. topics we are working on. Please feel free to help or make suggestions. This project is currently maintained by the `Department of Digital -Transformation in Energy Systems `_ at the +Transformation in Energy Systems `_ at the `Technische Universität Berlin `_. Previous versions were developed within the `IAI `_ at the `Karlsruhe Institute of Technology (KIT) `_ which was funded by From f28e9b47d26cc108c99103c3ce63b34d0ed2011d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 16:00:41 +0100 Subject: [PATCH 104/497] add custom_extra_functionality param to solve_electricity rule --- rules/solve_electricity.smk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index c396ebd5..2c956097 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -11,6 +11,9 @@ rule solve_network: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), + custom_extra_functionality=workflow.source_path( + config["solving"]["options"].get("custom_extra_functionality", "") + ), input: network=RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", config=RESULTS + "config.yaml", From 340bf778498a4a6ceffe246b8ab3245a9ccc84f7 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 16:01:28 +0100 Subject: [PATCH 105/497] clarify that source_path is relative to directory --- doc/configtables/solving.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 9d47c043..dcff54e4 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -6,7 +6,7 @@ options,,, -- skip_iterations,bool,"{'true','false'}","Skip iterating, do not update impedances of branches. Defaults to true." -- rolling_horizon,bool,"{'true','false'}","Whether to optimize the network in a rolling horizon manner, where the snapshot range is split into slices of size `horizon` which are solved consecutively." -- seed,--,int,Random seed for increased deterministic behaviour. --- custom_extra_functionality,--,str,Path to a Python file with custom extra functionality code to be injected into the solving rules of the workflow. +-- custom_extra_functionality,--,str,Path to a Python file with custom extra functionality code to be injected into the solving rules of the workflow relative to ``rules`` directory. -- track_iterations,bool,"{'true','false'}",Flag whether to store the intermediate branch capacities and objective function values are recorded for each iteration in ``network.lines['s_nom_opt_X']`` (where ``X`` labels the iteration) -- min_iterations,--,int,Minimum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. -- max_iterations,--,int,Maximum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. From 1b569dde1bcbcd32175d41b0ba3ed265e76a1aad Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Tue, 2 Jan 2024 16:02:10 +0100 Subject: [PATCH 106/497] move code for national CO2 budgets out of extra_functionality This can be added by derived workflows like PyPSA-Eur via additional_functionality. Changed additional_functionality to pass snakemake rather than wildcards and config separately. This gives maximal flexibility. --- config/config.default.yaml | 17 ------ scripts/solve_network.py | 110 +------------------------------------ 2 files changed, 1 insertion(+), 126 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index c1e7ed0f..6d2ebd9f 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -84,22 +84,6 @@ co2_budget: 2045: 0.032 2050: 0.000 -co2_budget_national: - 2030: - 'DE': 0.350 - 'AT': 0.450 - 'BE': 0.450 - 'CH': 0.450 - 'CZ': 0.450 - 'DK': 0.450 - 'FR': 0.450 - 'GB': 0.450 - 'LU': 0.450 - 'NL': 0.450 - 'NO': 0.450 - 'PL': 0.450 - 'SE': 0.450 - # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#electricity electricity: voltages: [220., 300., 380.] @@ -470,7 +454,6 @@ sector: hydrogen_turbine: false SMR: true SMR_cc: true - co2_budget_national: false regional_methanol_demand: false #set to true if regional CO2 constraints needed regional_oil_demand: false #set to true if regional CO2 constraints needed regional_co2_sequestration_potential: diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 6f88b904..433b175b 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -41,9 +41,6 @@ logger = logging.getLogger(__name__) pypsa.pf.logger.setLevel(logging.WARNING) from pypsa.descriptors import get_switchable_as_dense as get_as_dense -from prepare_sector_network import emission_sectors_from_opts - - def add_land_use_constraint(n, planning_horizons, config): if "m" in snakemake.wildcards.clusters: @@ -765,100 +762,6 @@ def add_pipe_retrofit_constraint(n): n.model.add_constraints(lhs == rhs, name="Link-pipe_retrofit") -def add_co2limit_country(n, limit_countries, nyears=1.0): - """ - Add a set of emissions limit constraints for specified countries. - - The countries and emissions limits are specified in the config file entry 'co2_budget_country_{investment_year}'. - - Parameters - ---------- - n : pypsa.Network - config : dict - limit_countries : dict - nyears: float, optional - Used to scale the emissions constraint to the number of snapshots of the base network. - """ - logger.info(f"Adding CO2 budget limit for each country as per unit of 1990 levels") - - countries = n.config["countries"] - - # TODO: import function from prepare_sector_network? Move to common place? - sectors = emission_sectors_from_opts(opts) - - # convert Mt to tCO2 - co2_totals = 1e6 * pd.read_csv(snakemake.input.co2_totals_name, index_col=0) - - co2_limit_countries = co2_totals.loc[countries, sectors].sum(axis=1) - co2_limit_countries = co2_limit_countries.loc[co2_limit_countries.index.isin(limit_countries.keys())] - - co2_limit_countries *= co2_limit_countries.index.map(limit_countries) * nyears - - p = n.model["Link-p"] # dimension: (time, component) - - # NB: Most country-specific links retain their locational information in bus1 (except for DAC, where it is in bus2, and process emissions, where it is in bus0) - country = n.links.bus1.map(n.buses.location).map(n.buses.country) - country_DAC = ( - n.links[n.links.carrier == "DAC"] - .bus2.map(n.buses.location) - .map(n.buses.country) - ) - country[country_DAC.index] = country_DAC - country_process_emissions = ( - n.links[n.links.carrier.str.contains("process emissions")] - .bus0.map(n.buses.location) - .map(n.buses.country) - ) - country[country_process_emissions.index] = country_process_emissions - - lhs = [] - for port in [col[3:] for col in n.links if col.startswith("bus")]: - if port == str(0): - efficiency = ( - n.links["efficiency"].apply(lambda x: -1.0).rename("efficiency0") - ) - elif port == str(1): - efficiency = n.links["efficiency"] - else: - efficiency = n.links[f"efficiency{port}"] - mask = n.links[f"bus{port}"].map(n.buses.carrier).eq("co2") - - idx = n.links[mask].index - - international = n.links.carrier.map( - lambda x: 0.4 if x in ["kerosene for aviation", "shipping oil"] else 1.0 - ) - grouping = country.loc[idx] - - if not grouping.isnull().all(): - expr = ( - ((p.loc[:, idx] * efficiency[idx] * international[idx]) - .groupby(grouping, axis=1) - .sum() - *n.snapshot_weightings.generators - ) - .sum(dims="snapshot") - ) - lhs.append(expr) - - lhs = sum(lhs) # dimension: (country) - lhs = lhs.rename({list(lhs.dims.keys())[0]: "snapshot"}) - rhs = pd.Series(co2_limit_countries) # dimension: (country) - - for ct in lhs.indexes["snapshot"]: - n.model.add_constraints( - lhs.loc[ct] <= rhs[ct], - name=f"GlobalConstraint-co2_limit_per_country{ct}", - ) - n.add( - "GlobalConstraint", - f"co2_limit_per_country{ct}", - constant=rhs[ct], - sense="<=", - type="", - ) - - def extra_functionality(n, snapshots): """ Collects supplementary constraints which will be passed to @@ -889,23 +792,12 @@ def extra_functionality(n, snapshots): add_carbon_budget_constraint(n, snapshots) add_retrofit_gas_boiler_constraint(n, snapshots) - if n.config["sector"]["co2_budget_national"]: - # prepare co2 constraint - nhours = n.snapshot_weightings.generators.sum() - nyears = nhours / 8760 - investment_year = int(snakemake.wildcards.planning_horizons[-4:]) - limit_countries = snakemake.config["co2_budget_national"][investment_year] - - # add co2 constraint for each country - logger.info(f"Add CO2 limit for each country") - add_co2limit_country(n, limit_countries, nyears) - if "additional_functionality" in snakemake.input.keys(): import importlib, os, sys sys.path.append(os.path.dirname(snakemake.input.additional_functionality)) additional_functionality = importlib.import_module(os.path.splitext(os.path.basename(snakemake.input.additional_functionality))[0]) - additional_functionality.additional_functionality(n, snapshots, snakemake.wildcards, config) + additional_functionality.additional_functionality(n, snapshots, snakemake) def solve_network(n, config, solving, opts="", **kwargs): From f494dd85b969f9491a2d9bf81ea98008452440a7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 15:21:49 +0000 Subject: [PATCH 107/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/add_brownfield.py | 31 ++++++++------ scripts/prepare_sector_network.py | 69 ++++++++++++++++++++----------- scripts/solve_network.py | 11 ++++- 3 files changed, 73 insertions(+), 38 deletions(-) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index fb1453fd..ffdaf46b 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -119,32 +119,39 @@ def add_brownfield(n, n_p, year): n.links.loc[new_pipes, "p_nom"] = 0.0 n.links.loc[new_pipes, "p_nom_min"] = 0.0 + def disable_grid_expansion_if_LV_limit_hit(n): if not "lv_limit" in n.global_constraints.index: return - #calculate minimum LV + # calculate minimum LV attr = "nom_min" dc = n.links.index[n.links.carrier == "DC"] - tot = (n.lines["s_" + attr]*n.lines["length"]).sum() + (n.links.loc[dc,"p_" + attr]*n.links.loc[dc,"length"]).sum() + tot = (n.lines["s_" + attr] * n.lines["length"]).sum() + ( + n.links.loc[dc, "p_" + attr] * n.links.loc[dc, "length"] + ).sum() - diff = n.global_constraints.at["lv_limit","constant"]-tot + diff = n.global_constraints.at["lv_limit", "constant"] - tot - #allow small numerical differences + # allow small numerical differences limit = 1 if diff < limit: - logger.info(f"LV is already reached (gap {diff}), disabling expansion and LV limit") + logger.info( + f"LV is already reached (gap {diff}), disabling expansion and LV limit" + ) expandable_acs = n.lines.index[n.lines.s_nom_extendable] - n.lines.loc[expandable_acs,"s_nom_extendable"] = False - n.lines.loc[expandable_acs,"s_nom"] = n.lines.loc[expandable_acs,"s_nom_min"] + n.lines.loc[expandable_acs, "s_nom_extendable"] = False + n.lines.loc[expandable_acs, "s_nom"] = n.lines.loc[expandable_acs, "s_nom_min"] - expandable_dcs = n.links.index[n.links.p_nom_extendable & (n.links.carrier == "DC")] - n.links.loc[expandable_dcs,"p_nom_extendable"] = False - n.links.loc[expandable_dcs,"p_nom"] = n.links.loc[expandable_dcs,"p_nom_min"] + expandable_dcs = n.links.index[ + n.links.p_nom_extendable & (n.links.carrier == "DC") + ] + n.links.loc[expandable_dcs, "p_nom_extendable"] = False + n.links.loc[expandable_dcs, "p_nom"] = n.links.loc[expandable_dcs, "p_nom_min"] + + n.global_constraints.drop("lv_limit", inplace=True) - n.global_constraints.drop("lv_limit", - inplace=True) if __name__ == "__main__": if "snakemake" not in globals(): diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b5a0c0d5..f1ddce2d 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -128,8 +128,8 @@ def define_spatial(nodes, options): # methanol - #beware: unlike other carriers, uses locations rather than locations+carriername - #this allows to avoid separation between nodes and locations + # beware: unlike other carriers, uses locations rather than locations+carriername + # this allows to avoid separation between nodes and locations spatial.methanol = SimpleNamespace() @@ -1595,10 +1595,16 @@ def add_land_transport(n, costs): ice_efficiency = options["transport_internal_combustion_efficiency"] - p_set_land_transport_oil = ice_share / ice_efficiency * transport[nodes].rename(columns=lambda x: x + " land transport oil") + p_set_land_transport_oil = ( + ice_share + / ice_efficiency + * transport[nodes].rename(columns=lambda x: x + " land transport oil") + ) if not options["regional_oil_demand"]: - p_set_land_transport_oil = p_set_land_transport_oil.sum(axis=1).to_frame(name="EU land transport oil") + p_set_land_transport_oil = p_set_land_transport_oil.sum(axis=1).to_frame( + name="EU land transport oil" + ) n.madd( "Bus", @@ -2454,7 +2460,7 @@ def add_industry(n, costs): efficiency=1.0, ) - if len(spatial.biomass.industry_cc)<=1 and len(spatial.co2.nodes)>1: + if len(spatial.biomass.industry_cc) <= 1 and len(spatial.co2.nodes) > 1: link_names = nodes + " " + spatial.biomass.industry_cc else: link_names = spatial.biomass.industry_cc @@ -2650,7 +2656,11 @@ def add_industry(n, costs): options["shipping_oil_efficiency"] / options["shipping_methanol_efficiency"] ) - p_set_methanol = shipping_methanol_share * p_set.rename(lambda x : x + " shipping methanol") * efficiency + p_set_methanol = ( + shipping_methanol_share + * p_set.rename(lambda x: x + " shipping methanol") + * efficiency + ) if not options["regional_methanol_demand"]: p_set_methanol = p_set_methanol.sum() @@ -2679,7 +2689,10 @@ def add_industry(n, costs): bus2="co2 atmosphere", carrier="shipping methanol", p_nom_extendable=True, - efficiency2=1 / options["MWh_MeOH_per_tCO2"], # CO2 intensity methanol based on stoichiometric calculation with 22.7 GJ/t methanol (32 g/mol), CO2 (44 g/mol), 277.78 MWh/TJ = 0.218 t/MWh + efficiency2=1 + / options[ + "MWh_MeOH_per_tCO2" + ], # CO2 intensity methanol based on stoichiometric calculation with 22.7 GJ/t methanol (32 g/mol), CO2 (44 g/mol), 277.78 MWh/TJ = 0.218 t/MWh ) if "oil" not in n.buses.carrier.unique(): @@ -2714,7 +2727,6 @@ def add_industry(n, costs): ) if shipping_oil_share: - p_set_oil = shipping_oil_share * p_set.rename(lambda x: x + " shipping oil") if not options["regional_oil_demand"]: @@ -2793,7 +2805,13 @@ def add_industry(n, costs): if demand_factor != 1: logger.warning(f"Changing HVC demand by {demand_factor*100-100:+.2f}%.") - p_set_plastics = demand_factor * industrial_demand.loc[nodes, "naphtha"].rename(lambda x: x + " naphtha for industry") / nhours + p_set_plastics = ( + demand_factor + * industrial_demand.loc[nodes, "naphtha"].rename( + lambda x: x + " naphtha for industry" + ) + / nhours + ) if not options["regional_oil_demand"]: p_set_plastics = p_set_plastics.sum() @@ -2816,7 +2834,10 @@ def add_industry(n, costs): # some CO2 from naphtha are process emissions from steam cracker # rest of CO2 released to atmosphere either in waste-to-energy or decay - process_co2_per_naphtha = industrial_demand.loc[nodes, "process emission from feedstock"].sum() / industrial_demand.loc[nodes, "naphtha"].sum() + process_co2_per_naphtha = ( + industrial_demand.loc[nodes, "process emission from feedstock"].sum() + / industrial_demand.loc[nodes, "naphtha"].sum() + ) emitted_co2_per_naphtha = costs.at["oil", "CO2 intensity"] - process_co2_per_naphtha n.madd( @@ -2840,11 +2861,11 @@ def add_industry(n, costs): all_aviation = ["total international aviation", "total domestic aviation"] p_set = ( - demand_factor - * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1) - * 1e6 - / nhours - ).rename(lambda x: x + " kerosene for aviation") + demand_factor + * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1) + * 1e6 + / nhours + ).rename(lambda x: x + " kerosene for aviation") if not options["regional_oil_demand"]: p_set = p_set.sum() @@ -3095,9 +3116,9 @@ def add_agriculture(n, costs): f"Total agriculture machinery shares sum up to {total_share:.2%}, corresponding to increased or decreased demand assumptions." ) - machinery_nodal_energy = pop_weighted_energy_totals.loc[ - nodes, "total agriculture machinery" - ] * 1e6 + machinery_nodal_energy = ( + pop_weighted_energy_totals.loc[nodes, "total agriculture machinery"] * 1e6 + ) if electric_share > 0: efficiency_gain = ( @@ -3111,15 +3132,15 @@ def add_agriculture(n, costs): suffix=" agriculture machinery electric", bus=nodes, carrier="agriculture machinery electric", - p_set=electric_share - / efficiency_gain - * machinery_nodal_energy - / nhours, + p_set=electric_share / efficiency_gain * machinery_nodal_energy / nhours, ) if oil_share > 0: - - p_set = oil_share * machinery_nodal_energy.rename(lambda x: x + " agriculture machinery oil") / nhours + p_set = ( + oil_share + * machinery_nodal_energy.rename(lambda x: x + " agriculture machinery oil") + / nhours + ) if not options["regional_oil_demand"]: p_set = p_set.sum() diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 433b175b..4bdbb543 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -793,9 +793,16 @@ def extra_functionality(n, snapshots): add_retrofit_gas_boiler_constraint(n, snapshots) if "additional_functionality" in snakemake.input.keys(): - import importlib, os, sys + import importlib + import os + import sys + sys.path.append(os.path.dirname(snakemake.input.additional_functionality)) - additional_functionality = importlib.import_module(os.path.splitext(os.path.basename(snakemake.input.additional_functionality))[0]) + additional_functionality = importlib.import_module( + os.path.splitext( + os.path.basename(snakemake.input.additional_functionality) + )[0] + ) additional_functionality.additional_functionality(n, snapshots, snakemake) From e3539b0e69cb753e01af5b1c9e3538087b72165e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 16:31:16 +0100 Subject: [PATCH 108/497] heat vent: add bus --- scripts/prepare_sector_network.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index d5ca27a7..329560c7 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1697,6 +1697,7 @@ def add_heat(n, costs): n.madd( "Generator", nodes[name] + f" {name} heat vent", + bus=nodes[name] + f" {name} heat", location=nodes[name], carrier=name + " heat vent", p_nom_extendable=True, From 30c1a1c857b01e944284d984c540a86e882a2258 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 16:31:48 +0100 Subject: [PATCH 109/497] address deprecation warnings --- config/config.default.yaml | 3 ++ scripts/build_biomass_potentials.py | 2 +- scripts/build_energy_totals.py | 56 ++++++++++++++--------------- scripts/build_line_rating.py | 2 +- scripts/build_retro_cost.py | 5 ++- scripts/build_ship_raster.py | 2 +- scripts/prepare_sector_network.py | 10 +++--- 7 files changed, 41 insertions(+), 39 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index a6df173b..37664ad6 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -158,6 +158,7 @@ renewable: resource: method: wind turbine: Vestas_V112_3MW + add_cutout_windspeed: true capacity_per_sqkm: 3 # correction_factor: 0.93 corine: @@ -173,6 +174,7 @@ renewable: resource: method: wind turbine: NREL_ReferenceTurbine_5MW_offshore + add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 corine: [44, 255] @@ -188,6 +190,7 @@ renewable: resource: method: wind turbine: NREL_ReferenceTurbine_5MW_offshore + add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 corine: [44, 255] diff --git a/scripts/build_biomass_potentials.py b/scripts/build_biomass_potentials.py index d7c467cf..aae1fb98 100644 --- a/scripts/build_biomass_potentials.py +++ b/scripts/build_biomass_potentials.py @@ -134,7 +134,7 @@ def disaggregate_nuts0(bio): # get population in nuts2 pop_nuts2 = pop.loc[pop.index.str.len() == 4] by_country = pop_nuts2.total.groupby(pop_nuts2.ct).sum() - pop_nuts2["fraction"] = pop_nuts2.total / pop_nuts2.ct.map(by_country) + pop_nuts2.loc[:, "fraction"] = pop_nuts2.total / pop_nuts2.ct.map(by_country) # distribute nuts0 data to nuts2 by population bio_nodal = bio.loc[pop_nuts2.ct] diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 6f9585c1..67b86466 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -189,12 +189,12 @@ def idees_per_country(ct, year, base_dir): ct_totals["total residential water"] = df.at["Water heating"] assert df.index[23] == "Electricity" - ct_totals["electricity residential water"] = df[23] + ct_totals["electricity residential water"] = df.iloc[23] ct_totals["total residential cooking"] = df["Cooking"] assert df.index[30] == "Electricity" - ct_totals["electricity residential cooking"] = df[30] + ct_totals["electricity residential cooking"] = df.iloc[30] df = pd.read_excel(fn_residential, "RES_summary", index_col=0)[year] @@ -202,13 +202,13 @@ def idees_per_country(ct, year, base_dir): ct_totals["total residential"] = df[row] assert df.index[47] == "Electricity" - ct_totals["electricity residential"] = df[47] + ct_totals["electricity residential"] = df.iloc[47] assert df.index[46] == "Derived heat" - ct_totals["derived heat residential"] = df[46] + ct_totals["derived heat residential"] = df.iloc[46] assert df.index[50] == "Thermal uses" - ct_totals["thermal uses residential"] = df[50] + ct_totals["thermal uses residential"] = df.iloc[50] # services @@ -222,12 +222,12 @@ def idees_per_country(ct, year, base_dir): ct_totals["total services water"] = df["Hot water"] assert df.index[24] == "Electricity" - ct_totals["electricity services water"] = df[24] + ct_totals["electricity services water"] = df.iloc[24] ct_totals["total services cooking"] = df["Catering"] assert df.index[31] == "Electricity" - ct_totals["electricity services cooking"] = df[31] + ct_totals["electricity services cooking"] = df.iloc[31] df = pd.read_excel(fn_tertiary, "SER_summary", index_col=0)[year] @@ -235,13 +235,13 @@ def idees_per_country(ct, year, base_dir): ct_totals["total services"] = df[row] assert df.index[50] == "Electricity" - ct_totals["electricity services"] = df[50] + ct_totals["electricity services"] = df.iloc[50] assert df.index[49] == "Derived heat" - ct_totals["derived heat services"] = df[49] + ct_totals["derived heat services"] = df.iloc[49] assert df.index[53] == "Thermal uses" - ct_totals["thermal uses services"] = df[53] + ct_totals["thermal uses services"] = df.iloc[53] # agriculture, forestry and fishing @@ -282,28 +282,28 @@ def idees_per_country(ct, year, base_dir): ct_totals["total two-wheel"] = df["Powered 2-wheelers (Gasoline)"] assert df.index[19] == "Passenger cars" - ct_totals["total passenger cars"] = df[19] + ct_totals["total passenger cars"] = df.iloc[19] assert df.index[30] == "Battery electric vehicles" - ct_totals["electricity passenger cars"] = df[30] + ct_totals["electricity passenger cars"] = df.iloc[30] assert df.index[31] == "Motor coaches, buses and trolley buses" - ct_totals["total other road passenger"] = df[31] + ct_totals["total other road passenger"] = df.iloc[31] assert df.index[39] == "Battery electric vehicles" - ct_totals["electricity other road passenger"] = df[39] + ct_totals["electricity other road passenger"] = df.iloc[39] assert df.index[41] == "Light duty vehicles" - ct_totals["total light duty road freight"] = df[41] + ct_totals["total light duty road freight"] = df.iloc[41] assert df.index[49] == "Battery electric vehicles" - ct_totals["electricity light duty road freight"] = df[49] + ct_totals["electricity light duty road freight"] = df.iloc[49] row = "Heavy duty vehicles (Diesel oil incl. biofuels)" ct_totals["total heavy duty road freight"] = df[row] assert df.index[61] == "Passenger cars" - ct_totals["passenger car efficiency"] = df[61] + ct_totals["passenger car efficiency"] = df.iloc[61] df = pd.read_excel(fn_transport, "TrRail_ene", index_col=0)[year] @@ -312,39 +312,39 @@ def idees_per_country(ct, year, base_dir): ct_totals["electricity rail"] = df["Electricity"] assert df.index[15] == "Passenger transport" - ct_totals["total rail passenger"] = df[15] + ct_totals["total rail passenger"] = df.iloc[15] assert df.index[16] == "Metro and tram, urban light rail" assert df.index[19] == "Electric" assert df.index[20] == "High speed passenger trains" - ct_totals["electricity rail passenger"] = df[[16, 19, 20]].sum() + ct_totals["electricity rail passenger"] = df.iloc[[16, 19, 20]].sum() assert df.index[21] == "Freight transport" - ct_totals["total rail freight"] = df[21] + ct_totals["total rail freight"] = df.iloc[21] assert df.index[23] == "Electric" - ct_totals["electricity rail freight"] = df[23] + ct_totals["electricity rail freight"] = df.iloc[23] df = pd.read_excel(fn_transport, "TrAvia_ene", index_col=0)[year] assert df.index[6] == "Passenger transport" - ct_totals["total aviation passenger"] = df[6] + ct_totals["total aviation passenger"] = df.iloc[6] assert df.index[10] == "Freight transport" - ct_totals["total aviation freight"] = df[10] + ct_totals["total aviation freight"] = df.iloc[10] assert df.index[7] == "Domestic" - ct_totals["total domestic aviation passenger"] = df[7] + ct_totals["total domestic aviation passenger"] = df.iloc[7] assert df.index[8] == "International - Intra-EU" assert df.index[9] == "International - Extra-EU" - ct_totals["total international aviation passenger"] = df[[8, 9]].sum() + ct_totals["total international aviation passenger"] = df.iloc[[8, 9]].sum() assert df.index[11] == "Domestic and International - Intra-EU" - ct_totals["total domestic aviation freight"] = df[11] + ct_totals["total domestic aviation freight"] = df.iloc[11] assert df.index[12] == "International - Extra-EU" - ct_totals["total international aviation freight"] = df[12] + ct_totals["total international aviation freight"] = df.iloc[12] ct_totals["total domestic aviation"] = ( ct_totals["total domestic aviation freight"] @@ -364,7 +364,7 @@ def idees_per_country(ct, year, base_dir): df = pd.read_excel(fn_transport, "TrRoad_act", index_col=0)[year] assert df.index[85] == "Passenger cars" - ct_totals["passenger cars"] = df[85] + ct_totals["passenger cars"] = df.iloc[85] return pd.Series(ct_totals, name=ct) diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index 032ba39c..c53d2899 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -119,7 +119,7 @@ def calculate_line_rating(n, cutout): .apply(lambda x: int(re.findall(r"(\d+)-bundle", x)[0])) ) # Set default number of bundles per line - relevant_lines["n_bundle"].fillna(1, inplace=True) + relevant_lines["n_bundle"] = relevant_lines["n_bundle"].fillna(1) R *= relevant_lines["n_bundle"] R = calculate_resistance(T=353, R_ref=R) Imax = cutout.line_rating(shapes, R, D=0.0218, Ts=353, epsilon=0.8, alpha=0.8) diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index f5313c21..03c46651 100644 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -836,8 +836,7 @@ def calculate_heat_losses(u_values, data_tabula, l_strength, temperature_factor) F_red_temp = map_to_lstrength(l_strength, F_red_temp) Q_ht = ( - heat_transfer_perm2.groupby(level=1, axis=1) - .sum() + heat_transfer_perm2.T.groupby(level=1).sum().T .mul(F_red_temp.droplevel(0, axis=1)) .mul(temperature_factor.reindex(heat_transfer_perm2.index, level=0), axis=0) ) @@ -878,7 +877,7 @@ def calculate_gain_utilisation_factor(heat_transfer_perm2, Q_ht, Q_gain): Calculates gain utilisation factor nu. """ # time constant of the building tau [h] = c_m [Wh/(m^2K)] * 1 /(H_tr_e+H_tb*H_ve) [m^2 K /W] - tau = c_m / heat_transfer_perm2.groupby(level=1, axis=1).sum() + tau = c_m / heat_transfer_perm2.T.groupby(axis=1).sum().T alpha = alpha_H_0 + (tau / tau_H_0) # heat balance ratio gamma = (1 / Q_ht).mul(Q_gain.sum(axis=1), axis=0) diff --git a/scripts/build_ship_raster.py b/scripts/build_ship_raster.py index 90e006b0..02f4d5d5 100644 --- a/scripts/build_ship_raster.py +++ b/scripts/build_ship_raster.py @@ -64,7 +64,7 @@ if __name__ == "__main__": with zipfile.ZipFile(snakemake.input.ship_density) as zip_f: zip_f.extract("shipdensity_global.tif") with rioxarray.open_rasterio("shipdensity_global.tif") as ship_density: - ship_density = ship_density.drop(["band"]).sel( + ship_density = ship_density.drop_vars(["band"]).sel( x=slice(min(xs), max(Xs)), y=slice(max(Ys), min(ys)) ) ship_density.rio.to_raster(snakemake.output[0]) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 329560c7..b3a706d8 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1630,7 +1630,7 @@ def build_heat_demand(n): electric_nodes = n.loads.index[n.loads.carrier == "electricity"] n.loads_t.p_set[electric_nodes] = ( n.loads_t.p_set[electric_nodes] - - electric_heat_supply.groupby(level=1, axis=1).sum()[electric_nodes] + - electric_heat_supply.T.groupby(level=1).sum().T[electric_nodes] ) return heat_demand @@ -1724,15 +1724,15 @@ def add_heat(n, costs): if sector in name: heat_load = ( heat_demand[[sector + " water", sector + " space"]] - .groupby(level=1, axis=1) - .sum()[nodes[name]] + .T.groupby(level=1) + .sum().T[nodes[name]] .multiply(factor) ) if name == "urban central": heat_load = ( - heat_demand.groupby(level=1, axis=1) - .sum()[nodes[name]] + heat_demand.T.groupby(level=1) + .sum().T[nodes[name]] .multiply( factor * (1 + options["district_heating"]["district_heating_loss"]) ) From e580ac85d962e0ef9d24716125655a0e59712f8e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 15:33:08 +0000 Subject: [PATCH 110/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_retro_cost.py | 5 +++-- scripts/prepare_sector_network.py | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index 03c46651..3ca2b174 100644 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -836,8 +836,9 @@ def calculate_heat_losses(u_values, data_tabula, l_strength, temperature_factor) F_red_temp = map_to_lstrength(l_strength, F_red_temp) Q_ht = ( - heat_transfer_perm2.T.groupby(level=1).sum().T - .mul(F_red_temp.droplevel(0, axis=1)) + heat_transfer_perm2.T.groupby(level=1) + .sum() + .T.mul(F_red_temp.droplevel(0, axis=1)) .mul(temperature_factor.reindex(heat_transfer_perm2.index, level=0), axis=0) ) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b3a706d8..2480754c 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1725,14 +1725,16 @@ def add_heat(n, costs): heat_load = ( heat_demand[[sector + " water", sector + " space"]] .T.groupby(level=1) - .sum().T[nodes[name]] + .sum() + .T[nodes[name]] .multiply(factor) ) if name == "urban central": heat_load = ( heat_demand.T.groupby(level=1) - .sum().T[nodes[name]] + .sum() + .T[nodes[name]] .multiply( factor * (1 + options["district_heating"]["district_heating_loss"]) ) From f2a636c62cbc3dca93eaf7df7ad6686012f1e8da Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 18:12:49 +0100 Subject: [PATCH 111/497] bugfix: correct unit of capital_cost of Haber-Bosch --- scripts/prepare_sector_network.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 2480754c..ac0b618b 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -796,6 +796,8 @@ def add_ammonia(n, costs): "Bus", spatial.ammonia.nodes, location=spatial.ammonia.locations, carrier="NH3" ) + MWh_elec_per_MWh_NH3 = cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"] + n.madd( "Link", nodes, @@ -805,14 +807,10 @@ def add_ammonia(n, costs): bus2=nodes + " H2", p_nom_extendable=True, carrier="Haber-Bosch", - efficiency=1 - / ( - cf_industry["MWh_elec_per_tNH3_electrolysis"] - / cf_industry["MWh_NH3_per_tNH3"] - ), # output: MW_NH3 per MW_elec + efficiency=1 / MWh_elec_per_MWh_NH3, efficiency2=-cf_industry["MWh_H2_per_tNH3_electrolysis"] / cf_industry["MWh_elec_per_tNH3_electrolysis"], # input: MW_H2 per MW_elec - capital_cost=costs.at["Haber-Bosch", "fixed"], + capital_cost=costs.at["Haber-Bosch", "fixed"] / MWh_elec_per_MWh_NH3, lifetime=costs.at["Haber-Bosch", "lifetime"], ) From 2678fdef993eb2c0d1b325c4e260040ed2e19174 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:13:34 +0000 Subject: [PATCH 112/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index ac0b618b..1dc2b3ef 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -796,7 +796,9 @@ def add_ammonia(n, costs): "Bus", spatial.ammonia.nodes, location=spatial.ammonia.locations, carrier="NH3" ) - MWh_elec_per_MWh_NH3 = cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"] + MWh_elec_per_MWh_NH3 = ( + cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"] + ) n.madd( "Link", From 0720ccb00d268c7f81fed419a313cb8e2c5d6924 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 18:14:11 +0100 Subject: [PATCH 113/497] 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 a3659b9b..c319bce9 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -38,6 +38,8 @@ Upcoming Release * Split configuration to enable SMR and SMR CC. +* Bugfix: The unit of the capital cost of Haber-Bosch plants was corrected. + * The configuration setting for country focus weights when clustering the network has been moved from ``focus_weights:`` to ``clustering: focus_weights:``. Backwards compatibility to old config files is maintained. From fd81058008b3532ecba0145e60541bea5e08f343 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 18:35:10 +0100 Subject: [PATCH 114/497] add VOM of PtX processes (closes #747) --- doc/release_notes.rst | 2 ++ scripts/prepare_sector_network.py | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index c319bce9..494abde1 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -44,6 +44,8 @@ Upcoming Release network has been moved from ``focus_weights:`` to ``clustering: focus_weights:``. Backwards compatibility to old config files is maintained. +* Add VOM as marginal cost to PtX processes. + * The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument. * Merged option to extend geographical scope to Ukraine and Moldova. These diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 1dc2b3ef..8620d240 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -813,6 +813,7 @@ def add_ammonia(n, costs): efficiency2=-cf_industry["MWh_H2_per_tNH3_electrolysis"] / cf_industry["MWh_elec_per_tNH3_electrolysis"], # input: MW_H2 per MW_elec capital_cost=costs.at["Haber-Bosch", "fixed"] / MWh_elec_per_MWh_NH3, + marginal_cost=costs.at["Haber-Bosch", "VOM"] / MWh_elec_per_MWh_NH3, lifetime=costs.at["Haber-Bosch", "lifetime"], ) @@ -1023,7 +1024,7 @@ def insert_gas_distribution_costs(n, costs): f"Inserting gas distribution grid with investment cost factor of {f_costs}" ) - capital_cost = costs.loc["electricity distribution grid"]["fixed"] * f_costs + capital_cost = costs.at["electricity distribution grid", "fixed"] * f_costs # gas boilers gas_b = n.links.index[ @@ -1100,6 +1101,7 @@ def add_storage_and_grids(n, costs): efficiency=costs.at["OCGT", "efficiency"], capital_cost=costs.at["OCGT", "fixed"] * costs.at["OCGT", "efficiency"], # NB: fixed cost is per MWel + marginal_cost=costs.at["OCGT", "VOM"], lifetime=costs.at["OCGT", "lifetime"], ) @@ -2168,8 +2170,8 @@ def add_biomass(n, costs): bus1=spatial.gas.nodes, bus2="co2 atmosphere", carrier="biogas to gas", - capital_cost=costs.loc["biogas upgrading", "fixed"], - marginal_cost=costs.loc["biogas upgrading", "VOM"], + capital_cost=costs.at["biogas upgrading", "fixed"], + marginal_cost=costs.at["biogas upgrading", "VOM"], efficiency2=-costs.at["gas", "CO2 intensity"], p_nom_extendable=True, ) @@ -2318,7 +2320,7 @@ def add_biomass(n, costs): + costs.at["BtL", "CO2 stored"], p_nom_extendable=True, capital_cost=costs.at["BtL", "fixed"], - marginal_cost=costs.at["BtL", "efficiency"] * costs.loc["BtL", "VOM"], + marginal_cost=costs.at["BtL", "efficiency"] * costs.at["BtL", "VOM"], ) # TODO: Update with energy penalty @@ -2339,7 +2341,7 @@ def add_biomass(n, costs): p_nom_extendable=True, capital_cost=costs.at["BtL", "fixed"] + costs.at["biomass CHP capture", "fixed"] * costs.at["BtL", "CO2 stored"], - marginal_cost=costs.at["BtL", "efficiency"] * costs.loc["BtL", "VOM"], + marginal_cost=costs.at["BtL", "efficiency"] * costs.at["BtL", "VOM"], ) # BioSNG from solid biomass @@ -2358,7 +2360,7 @@ def add_biomass(n, costs): + costs.at["BioSNG", "CO2 stored"], p_nom_extendable=True, capital_cost=costs.at["BioSNG", "fixed"], - marginal_cost=costs.at["BioSNG", "efficiency"] * costs.loc["BioSNG", "VOM"], + marginal_cost=costs.at["BioSNG", "efficiency"] * costs.at["BioSNG", "VOM"], ) # TODO: Update with energy penalty for CC @@ -2382,7 +2384,7 @@ def add_biomass(n, costs): capital_cost=costs.at["BioSNG", "fixed"] + costs.at["biomass CHP capture", "fixed"] * costs.at["BioSNG", "CO2 stored"], - marginal_cost=costs.at["BioSNG", "efficiency"] * costs.loc["BioSNG", "VOM"], + marginal_cost=costs.at["BioSNG", "efficiency"] * costs.at["BioSNG", "VOM"], ) @@ -2615,6 +2617,8 @@ def add_industry(n, costs): p_min_pu=options.get("min_part_load_methanolisation", 0), capital_cost=costs.at["methanolisation", "fixed"] * options["MWh_MeOH_per_MWh_H2"], # EUR/MW_H2/a + marginal_cost=options["MWh_MeOH_per_MWh_H2"] + * costs.at["methanolisation", "VOM"], lifetime=costs.at["methanolisation", "lifetime"], efficiency=options["MWh_MeOH_per_MWh_H2"], efficiency2=-options["MWh_MeOH_per_MWh_H2"] / options["MWh_MeOH_per_MWh_e"], @@ -2732,6 +2736,8 @@ def add_industry(n, costs): efficiency=costs.at["Fischer-Tropsch", "efficiency"], capital_cost=costs.at["Fischer-Tropsch", "fixed"] * costs.at["Fischer-Tropsch", "efficiency"], # EUR/MW_H2/a + marginal_cost=costs.at["Fischer-Tropsch", "efficiency"] + * costs.at["Fischer-Tropsch", "VOM"], efficiency2=-costs.at["oil", "CO2 intensity"] * costs.at["Fischer-Tropsch", "efficiency"], p_nom_extendable=True, From 6714858e177ca9a040862906e9b326ce22ecca6a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:47:46 +0000 Subject: [PATCH 115/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 139e4836..62bca811 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2163,7 +2163,6 @@ def add_biomass(n, costs): e_initial=solid_biomass_potentials_spatial, ) - n.madd( "Link", spatial.gas.biogas_to_gas, @@ -2178,10 +2177,9 @@ def add_biomass(n, costs): efficiency=costs.at["biogas", "efficiency"], efficiency2=-costs.at["gas", "CO2 intensity"], efficiency3=costs.at["biogas", "CO2 stored"], - p_nom_extendable=True + p_nom_extendable=True, ) - if options.get("biomass_upgrading_cc"): # Assuming for costs that the CO2 from upgrading is pure, such as in amine scrubbing. I.e., with and without CC is # equivalent. Adding biomass CHP capture because biogas is often small-scale and decentral so further From 9884dee7a0737aa2eca00e60828659b02fa0cecc Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 18:48:52 +0100 Subject: [PATCH 116/497] remove biogas upgrading CC in normal link --- scripts/prepare_sector_network.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 139e4836..1d6e4ab0 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2170,14 +2170,12 @@ def add_biomass(n, costs): bus0=spatial.gas.biogas, bus1=spatial.gas.nodes, bus2="co2 atmosphere", - bus3="co2 stored", carrier="biogas to gas", capital_cost=costs.at["biogas", "fixed"] + costs.at["biogas upgrading", "fixed"], marginal_cost=costs.at["biogas upgrading", "VOM"], efficiency=costs.at["biogas", "efficiency"], efficiency2=-costs.at["gas", "CO2 intensity"], - efficiency3=costs.at["biogas", "CO2 stored"], p_nom_extendable=True ) From b0cca00b7088767e46806dcebd64800d73247d42 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 18:51:03 +0100 Subject: [PATCH 117/497] add documentation and release note for biogas upgrading CC --- config/config.default.yaml | 2 ++ doc/configtables/sector.csv | 1 + doc/release_notes.rst | 2 ++ 3 files changed, 5 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index 37664ad6..dd36f1d8 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -497,6 +497,7 @@ sector: gas_distribution_grid_cost_factor: 1.0 biomass_spatial: false biomass_transport: false + biomass_upgrading_cc: false conventional_generation: OCGT: gas biomass_to_liquid: false @@ -778,6 +779,7 @@ plotting: fossil gas: '#e05b09' natural gas: '#e05b09' biogas to gas: '#e36311' + biogas to gas CC: '#e51245' CCGT: '#a85522' CCGT marginal: '#a85522' allam: '#B98F76' diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 856ea074..890b448c 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -118,6 +118,7 @@ gas_distribution_grid _cost_factor,,,Multiplier for the investment cost of the g ,,, biomass_spatial,--,"{true, false}",Add option for resolving biomass demand regionally biomass_transport,--,"{true, false}",Add option for transporting solid biomass between nodes +biomass_upgrading_cc,--,"{true, false}",Add option to capture CO2 from biomass upgrading conventional_generation,,,Add a more detailed description of conventional carriers. Any power generation requires the consumption of fuel from nodes representing that fuel. biomass_to_liquid,--,"{true, false}",Add option for transforming solid biomass into liquid fuel with the same properties as oil biosng,--,"{true, false}",Add option for transforming solid biomass into synthesis gas with the same properties as natural gas diff --git a/doc/release_notes.rst b/doc/release_notes.rst index c319bce9..cfb67d77 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -46,6 +46,8 @@ Upcoming Release * The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument. +* Add option to capture CO2 contained in biogas when upgrading (``sector: biogas_to_gas_cc``). + * Merged option to extend geographical scope to Ukraine and Moldova. These countries are excluded by default and is currently constrained to power-sector only parts of the workflow. A special config file From a10a60b95139f1cead8158607fc12cb0b5c5b069 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 18:52:22 +0100 Subject: [PATCH 118/497] rename setting from biomass_upgrading_cc to biogas_upgrading_cc --- config/config.default.yaml | 2 +- doc/configtables/sector.csv | 2 +- scripts/prepare_sector_network.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index dd36f1d8..7bfd3f01 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -497,7 +497,7 @@ sector: gas_distribution_grid_cost_factor: 1.0 biomass_spatial: false biomass_transport: false - biomass_upgrading_cc: false + biogas_upgrading_cc: false conventional_generation: OCGT: gas biomass_to_liquid: false diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 890b448c..280c1906 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -118,7 +118,7 @@ gas_distribution_grid _cost_factor,,,Multiplier for the investment cost of the g ,,, biomass_spatial,--,"{true, false}",Add option for resolving biomass demand regionally biomass_transport,--,"{true, false}",Add option for transporting solid biomass between nodes -biomass_upgrading_cc,--,"{true, false}",Add option to capture CO2 from biomass upgrading +biogas_upgrading_cc,--,"{true, false}",Add option to capture CO2 from biomass upgrading conventional_generation,,,Add a more detailed description of conventional carriers. Any power generation requires the consumption of fuel from nodes representing that fuel. biomass_to_liquid,--,"{true, false}",Add option for transforming solid biomass into liquid fuel with the same properties as oil biosng,--,"{true, false}",Add option for transforming solid biomass into synthesis gas with the same properties as natural gas diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 2f4ce271..aaaf3773 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2178,7 +2178,7 @@ def add_biomass(n, costs): p_nom_extendable=True, ) - if options.get("biomass_upgrading_cc"): + if options.get("biogas_upgrading_cc"): # Assuming for costs that the CO2 from upgrading is pure, such as in amine scrubbing. I.e., with and without CC is # equivalent. Adding biomass CHP capture because biogas is often small-scale and decentral so further # from e.g. CO2 grid or buyers. This is a proxy for the added cost for e.g. a raw biogas pipeline to a central upgrading facility From 5e4a81f82896485dcaa850394449a19ec194e852 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 19:04:34 +0100 Subject: [PATCH 119/497] haber-bosch: use DECHEMA source for hydrogen input --- config/config.default.yaml | 2 +- scripts/prepare_sector_network.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 37664ad6..97efa555 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -547,7 +547,7 @@ industry: MWh_NH3_per_tNH3: 5.166 MWh_CH4_per_tNH3_SMR: 10.8 MWh_elec_per_tNH3_SMR: 0.7 - MWh_H2_per_tNH3_electrolysis: 6.5 + MWh_H2_per_tNH3_electrolysis: 5.93 MWh_elec_per_tNH3_electrolysis: 1.17 MWh_NH3_per_MWh_H2_cracker: 1.46 # https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv NH3_process_emissions: 24.5 diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 1dc2b3ef..442bc564 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -810,8 +810,7 @@ def add_ammonia(n, costs): p_nom_extendable=True, carrier="Haber-Bosch", efficiency=1 / MWh_elec_per_MWh_NH3, - efficiency2=-cf_industry["MWh_H2_per_tNH3_electrolysis"] - / cf_industry["MWh_elec_per_tNH3_electrolysis"], # input: MW_H2 per MW_elec + efficiency2=-costs.at["Haber-Bosch", "hydrogen-input"] / MWh_elec_per_MWh_NH3, capital_cost=costs.at["Haber-Bosch", "fixed"] / MWh_elec_per_MWh_NH3, lifetime=costs.at["Haber-Bosch", "lifetime"], ) From 438b40cdb1bcdfe484db3585364b10cf8e4faca7 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 19:09:46 +0100 Subject: [PATCH 120/497] haber-bosch: use DECHEMA source for electricity input --- config/config.default.yaml | 2 +- scripts/prepare_sector_network.py | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 97efa555..31858a5b 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -548,7 +548,7 @@ industry: MWh_CH4_per_tNH3_SMR: 10.8 MWh_elec_per_tNH3_SMR: 0.7 MWh_H2_per_tNH3_electrolysis: 5.93 - MWh_elec_per_tNH3_electrolysis: 1.17 + MWh_elec_per_tNH3_electrolysis: 0.2473 MWh_NH3_per_MWh_H2_cracker: 1.46 # https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv NH3_process_emissions: 24.5 petrochemical_process_emissions: 25.5 diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 442bc564..d23143ff 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -796,10 +796,6 @@ def add_ammonia(n, costs): "Bus", spatial.ammonia.nodes, location=spatial.ammonia.locations, carrier="NH3" ) - MWh_elec_per_MWh_NH3 = ( - cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"] - ) - n.madd( "Link", nodes, @@ -809,9 +805,9 @@ def add_ammonia(n, costs): bus2=nodes + " H2", p_nom_extendable=True, carrier="Haber-Bosch", - efficiency=1 / MWh_elec_per_MWh_NH3, - efficiency2=-costs.at["Haber-Bosch", "hydrogen-input"] / MWh_elec_per_MWh_NH3, - capital_cost=costs.at["Haber-Bosch", "fixed"] / MWh_elec_per_MWh_NH3, + efficiency=1 / costs.at["Haber-Bosch", "electricity-input"], + efficiency2=-costs.at["Haber-Bosch", "hydrogen-input"] / costs.at["Haber-Bosch", "electricity-input"], + capital_cost=costs.at["Haber-Bosch", "fixed"] / costs.at["Haber-Bosch", "electricity-input"], lifetime=costs.at["Haber-Bosch", "lifetime"], ) From 815b8283115b427189f7fe364c6ca1070427e2d8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:11:42 +0000 Subject: [PATCH 121/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 49d26726..e9d97ade 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -808,9 +808,12 @@ def add_ammonia(n, costs): p_nom_extendable=True, carrier="Haber-Bosch", efficiency=1 / costs.at["Haber-Bosch", "electricity-input"], - efficiency2=-costs.at["Haber-Bosch", "hydrogen-input"] / costs.at["Haber-Bosch", "electricity-input"], - capital_cost=costs.at["Haber-Bosch", "fixed"] / costs.at["Haber-Bosch", "electricity-input"], - marginal_cost=costs.at["Haber-Bosch", "VOM"] / costs.at["Haber-Bosch", "electricity-input"], + efficiency2=-costs.at["Haber-Bosch", "hydrogen-input"] + / costs.at["Haber-Bosch", "electricity-input"], + capital_cost=costs.at["Haber-Bosch", "fixed"] + / costs.at["Haber-Bosch", "electricity-input"], + marginal_cost=costs.at["Haber-Bosch", "VOM"] + / costs.at["Haber-Bosch", "electricity-input"], lifetime=costs.at["Haber-Bosch", "lifetime"], ) From ebc25fbf61b469de27c3b0e69bed336d7f3b167e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 19:12:41 +0100 Subject: [PATCH 122/497] 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 b7035974..634209c7 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -48,6 +48,8 @@ Upcoming Release * The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument. +* Switch to using hydrogen and electricity inputs for Haber-Bosch from https://github.com/PyPSA/technology-data. + * Add option to capture CO2 contained in biogas when upgrading (``sector: biogas_to_gas_cc``). * Merged option to extend geographical scope to Ukraine and Moldova. These From c7790d7c60f93bac41e2bac423848efa696f1f3d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 19:16:42 +0100 Subject: [PATCH 123/497] change default offshore turbine to NREL Reference 2020 ATB 5.5 MW --- config/config.default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 2a3be87b..a6c3c1d6 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -173,7 +173,7 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: NREL_ReferenceTurbine_5MW_offshore + turbine: NREL_ReferenceTurbine_2020ATB_5.5MW add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 @@ -189,7 +189,7 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: NREL_ReferenceTurbine_5MW_offshore + turbine: NREL_ReferenceTurbine_2020ATB_5.5MW add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 From 37df47110cee21c8dbf923462d7f60d2d414a7dd Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 13 Sep 2023 10:49:54 +0200 Subject: [PATCH 124/497] biomass_boiler: add pelletizing cost --- scripts/prepare_sector_network.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 9c1a85d7..ae5d12df 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2333,6 +2333,7 @@ def add_biomass(n, costs): efficiency=costs.at["biomass boiler", "efficiency"], capital_cost=costs.at["biomass boiler", "efficiency"] * costs.at["biomass boiler", "fixed"], + marginal_cost=costs.at["biomass boiler", "pelletizing cost"], lifetime=costs.at["biomass boiler", "lifetime"], ) From 4988e77be5e2ae1ba9089deca3dba86a47925c62 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 19:33:02 +0100 Subject: [PATCH 125/497] 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 b7035974..782ebdee 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -46,6 +46,8 @@ Upcoming Release * Add VOM as marginal cost to PtX processes. +* Add pelletizing costs for biomass boilers. + * The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument. * Add option to capture CO2 contained in biogas when upgrading (``sector: biogas_to_gas_cc``). From 872c92d1c047e056d0604bebd43bcf16f855d2b2 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 19:45:02 +0100 Subject: [PATCH 126/497] extended waste heat from PtX, revised minimum part loads --- config/config.default.yaml | 10 +++++--- doc/release_notes.rst | 8 +++++++ scripts/prepare_sector_network.py | 38 +++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 2a3be87b..87349856 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -480,11 +480,15 @@ sector: - nearshore # within 50 km of sea # - offshore ammonia: false - min_part_load_fischer_tropsch: 0.9 - min_part_load_methanolisation: 0.5 + min_part_load_fischer_tropsch: 0.7 + min_part_load_methanolisation: 0.3 + min_part_load_methanation: 0.3 use_fischer_tropsch_waste_heat: true + use_haber_bosch_waste_heat: true + use_methanolisation_waste_heat: true + use_methanation_waste_heat: true use_fuel_cell_waste_heat: true - use_electrolysis_waste_heat: false + use_electrolysis_waste_heat: true electricity_distribution_grid: true electricity_distribution_grid_cost_factor: 1.0 electricity_grid_connection: true diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 634209c7..5e2c1a6b 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -44,6 +44,14 @@ Upcoming Release network has been moved from ``focus_weights:`` to ``clustering: focus_weights:``. Backwards compatibility to old config files is maintained. +* Extend options for waste usage from Haber-Bosch, methanolisation and methanation. + +* Use electrolysis waste heat by default. + +* Add new ``sector_opts`` wildcard option "nowasteheat" to disable all waste heat usage. + +* Set minimum part loads for PtX processes to 30% for methanolisation and methanation, and to 70% for Fischer-Tropsch synthesis. + * Add VOM as marginal cost to PtX processes. * The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument. diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index e9d97ade..d797e30a 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1345,6 +1345,7 @@ def add_storage_and_grids(n, costs): bus2=spatial.co2.nodes, p_nom_extendable=True, carrier="Sabatier", + p_min_pu=options.get("min_part_load_methanation", 0), efficiency=costs.at["methanation", "efficiency"], efficiency2=-costs.at["methanation", "efficiency"] * costs.at["gas", "CO2 intensity"], @@ -2982,6 +2983,34 @@ def add_waste_heat(n): 0.95 - n.links.loc[urban_central + " Fischer-Tropsch", "efficiency"] ) + if options["use_methanation_waste_heat"]: + n.links.loc[urban_central + " Sabatier", "bus3"] = ( + urban_central + " urban central heat" + ) + n.links.loc[urban_central + " Sabatier", "efficiency3"] = ( + 0.95 - n.links.loc[urban_central + " Sabatier", "efficiency"] + ) + + # DEA quotes 15% of total input (11% of which are high-value heat) + if options["use_haber_bosch_waste_heat"]: + n.links.loc[urban_central + " Haber-Bosch", "bus3"] = ( + urban_central + " urban central heat" + ) + total_energy_input = (cf_industry["MWh_H2_per_tNH3_electrolysis"] + cf_industry["MWh_elec_per_tNH3_electrolysis"]) / cf_industry["MWh_NH3_per_tNH3"] + electricity_input = cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"] + n.links.loc[urban_central + " Haber-Bosch", "efficiency3"] = ( + 0.15 * total_energy_input / electricity_input + ) + + if options["use_methanolisation_waste_heat"]: + n.links.loc[urban_central + " methanolisation", "bus4"] = ( + urban_central + " urban central heat" + ) + n.links.loc[urban_central + " methanolisation", "efficiency4"] = ( + costs.at["methanolisation", "heat-output"] + / costs.at["methanolisation", "hydrogen-input"] + ) + # TODO integrate usable waste heat efficiency into technology-data from DEA if options.get("use_electrolysis_waste_heat", False): n.links.loc[urban_central + " H2 Electrolysis", "bus2"] = ( @@ -3426,6 +3455,15 @@ if __name__ == "__main__": if "nodistrict" in opts: options["district_heating"]["progress"] = 0.0 + if "nowasteheat" in opts: + logger.info("Disabling waste heat.") + options["use_fischer_tropsch_waste_heat"] = False + options["use_methanolisation_waste_heat"] = False + options["use_haber_bosch_waste_heat"] = False + options["use_methanation_waste_heat"] = False + options["use_fuel_cell_waste_heat"] = False + options["use_electrolysis_waste_heat"] = False + if "T" in opts: add_land_transport(n, costs) From 777899f686b4641d9fc52c09b6c9db6a30be4e1d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:45:53 +0000 Subject: [PATCH 127/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index d797e30a..c39ac9a0 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2996,8 +2996,14 @@ def add_waste_heat(n): n.links.loc[urban_central + " Haber-Bosch", "bus3"] = ( urban_central + " urban central heat" ) - total_energy_input = (cf_industry["MWh_H2_per_tNH3_electrolysis"] + cf_industry["MWh_elec_per_tNH3_electrolysis"]) / cf_industry["MWh_NH3_per_tNH3"] - electricity_input = cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"] + total_energy_input = ( + cf_industry["MWh_H2_per_tNH3_electrolysis"] + + cf_industry["MWh_elec_per_tNH3_electrolysis"] + ) / cf_industry["MWh_NH3_per_tNH3"] + electricity_input = ( + cf_industry["MWh_elec_per_tNH3_electrolysis"] + / cf_industry["MWh_NH3_per_tNH3"] + ) n.links.loc[urban_central + " Haber-Bosch", "efficiency3"] = ( 0.15 * total_energy_input / electricity_input ) From 71b27b524ead6afe24a2e065198b299389c4fda6 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 2 Jan 2024 19:57:40 +0100 Subject: [PATCH 128/497] prevent failure if potential waste heat technologies not present --- scripts/prepare_sector_network.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index c39ac9a0..aa3e65fd 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2974,8 +2974,10 @@ def add_waste_heat(n): if not urban_central.empty: urban_central = urban_central.str[: -len(" urban central heat")] + link_carriers = n.links.carrier.unique() + # TODO what is the 0.95 and should it be a config option? - if options["use_fischer_tropsch_waste_heat"]: + if options["use_fischer_tropsch_waste_heat"] and "Fischer-Tropsch" in link_carriers: n.links.loc[urban_central + " Fischer-Tropsch", "bus3"] = ( urban_central + " urban central heat" ) @@ -2983,7 +2985,7 @@ def add_waste_heat(n): 0.95 - n.links.loc[urban_central + " Fischer-Tropsch", "efficiency"] ) - if options["use_methanation_waste_heat"]: + if options["use_methanation_waste_heat"] and "Sabatier" in link_carriers: n.links.loc[urban_central + " Sabatier", "bus3"] = ( urban_central + " urban central heat" ) @@ -2992,7 +2994,7 @@ def add_waste_heat(n): ) # DEA quotes 15% of total input (11% of which are high-value heat) - if options["use_haber_bosch_waste_heat"]: + if options["use_haber_bosch_waste_heat"] and "Haber-Bosch" in link_carriers: n.links.loc[urban_central + " Haber-Bosch", "bus3"] = ( urban_central + " urban central heat" ) @@ -3008,7 +3010,7 @@ def add_waste_heat(n): 0.15 * total_energy_input / electricity_input ) - if options["use_methanolisation_waste_heat"]: + if options["use_methanolisation_waste_heat"] and "methanolisation" in link_carriers: n.links.loc[urban_central + " methanolisation", "bus4"] = ( urban_central + " urban central heat" ) @@ -3018,7 +3020,7 @@ def add_waste_heat(n): ) # TODO integrate usable waste heat efficiency into technology-data from DEA - if options.get("use_electrolysis_waste_heat", False): + if options.get("use_electrolysis_waste_heat", False) and "H2 Electrolysis" in link_carriers: n.links.loc[urban_central + " H2 Electrolysis", "bus2"] = ( urban_central + " urban central heat" ) @@ -3026,7 +3028,7 @@ def add_waste_heat(n): 0.84 - n.links.loc[urban_central + " H2 Electrolysis", "efficiency"] ) - if options["use_fuel_cell_waste_heat"]: + if options["use_fuel_cell_waste_heat"] and "H2 Fuel Cell" in link_carriers: n.links.loc[urban_central + " H2 Fuel Cell", "bus2"] = ( urban_central + " urban central heat" ) From fb5b10780536f1c3f337f7cbba5da185876795ba Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:59:36 +0000 Subject: [PATCH 129/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index aa3e65fd..4e7ef6c6 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2977,7 +2977,10 @@ def add_waste_heat(n): link_carriers = n.links.carrier.unique() # TODO what is the 0.95 and should it be a config option? - if options["use_fischer_tropsch_waste_heat"] and "Fischer-Tropsch" in link_carriers: + if ( + options["use_fischer_tropsch_waste_heat"] + and "Fischer-Tropsch" in link_carriers + ): n.links.loc[urban_central + " Fischer-Tropsch", "bus3"] = ( urban_central + " urban central heat" ) @@ -3010,7 +3013,10 @@ def add_waste_heat(n): 0.15 * total_energy_input / electricity_input ) - if options["use_methanolisation_waste_heat"] and "methanolisation" in link_carriers: + if ( + options["use_methanolisation_waste_heat"] + and "methanolisation" in link_carriers + ): n.links.loc[urban_central + " methanolisation", "bus4"] = ( urban_central + " urban central heat" ) @@ -3020,7 +3026,10 @@ def add_waste_heat(n): ) # TODO integrate usable waste heat efficiency into technology-data from DEA - if options.get("use_electrolysis_waste_heat", False) and "H2 Electrolysis" in link_carriers: + if ( + options.get("use_electrolysis_waste_heat", False) + and "H2 Electrolysis" in link_carriers + ): n.links.loc[urban_central + " H2 Electrolysis", "bus2"] = ( urban_central + " urban central heat" ) From fa03c61187a232c452714979515967910474f14b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 31 Jul 2023 10:52:37 +0200 Subject: [PATCH 130/497] gas_input: switch production data from scigrid to gem --- rules/build_sector.smk | 3 +- scripts/build_gas_input_locations.py | 56 +++++++++++++++++++++------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index dd49fc6f..1e8c70ba 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -85,12 +85,11 @@ if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: rule build_gas_input_locations: input: - lng=HTTP.remote( + gem=HTTP.remote( "https://globalenergymonitor.org/wp-content/uploads/2023/07/Europe-Gas-Tracker-2023-03-v3.xlsx", keep_local=True, ), entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson", - production="data/gas_network/scigrid-gas/data/IGGIELGN_Productions.geojson", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", regions_offshore=RESOURCES diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index a3b945ab..07707658 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -23,11 +23,10 @@ def read_scigrid_gas(fn): return df -def build_gem_lng_data(lng_fn): - df = pd.read_excel(lng_fn[0], sheet_name="LNG terminals - data") +def build_gem_lng_data(fn): + df = pd.read_excel(fn[0], sheet_name="LNG terminals - data") df = df.set_index("ComboID") - remove_status = ["Cancelled"] remove_country = ["Cyprus", "Turkey"] remove_terminal = ["Puerto de la Luz LNG Terminal", "Gran Canaria LNG Terminal"] @@ -42,9 +41,43 @@ def build_gem_lng_data(lng_fn): return gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326") -def build_gas_input_locations(lng_fn, entry_fn, prod_fn, countries): +def build_gem_prod_data(fn): + df = pd.read_excel(fn[0], sheet_name="Gas extraction - main") + df = df.set_index("GEM Unit ID") + + remove_country = ["Cyprus", "Türkiye"] + remove_fuel_type = ["oil"] + + df = df.query( + "Status != 'shut in' \ + & 'Fuel type' != 'oil' \ + & Country != @remove_country \ + & ~Latitude.isna() \ + & ~Longitude.isna()" + ).copy() + + p = pd.read_excel(fn[0], sheet_name="Gas extraction - production") + p = p.set_index("GEM Unit ID") + p = p[p["Fuel description"] == 'gas' ] + + capacities = pd.DataFrame(index=df.index) + for key in ["production", "production design capacity", "reserves"]: + cap = p.loc[p["Production/reserves"] == key, "Quantity (converted)"].groupby("GEM Unit ID").sum().reindex(df.index) + # assume capacity such that 3% of reserves can be extracted per year (25% quantile) + annualization_factor = 0.03 if key == "reserves" else 1. + capacities[key] = cap * annualization_factor + + df["mcm_per_year"] = capacities["production"] \ + .combine_first(capacities["production design capacity"]) \ + .combine_first(capacities["reserves"]) + + geometry = gpd.points_from_xy(df["Longitude"], df["Latitude"]) + return gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326") + + +def build_gas_input_locations(gem_fn, entry_fn, countries): # LNG terminals - lng = build_gem_lng_data(lng_fn) + lng = build_gem_lng_data(gem_fn) # Entry points from outside the model scope entry = read_scigrid_gas(entry_fn) @@ -56,16 +89,14 @@ def build_gas_input_locations(lng_fn, entry_fn, prod_fn, countries): ] # production sites inside the model scope - prod = read_scigrid_gas(prod_fn) - prod = prod.loc[ - (prod.geometry.y > 35) & (prod.geometry.x < 30) & (prod.country_code != "DE") - ] + prod = build_gem_prod_data(gem_fn) mcm_per_day_to_mw = 437.5 # MCM/day to MWh/h + mcm_per_year_to_mw = 1.199 # MCM/year to MWh/h mtpa_to_mw = 1649.224 # mtpa to MWh/h lng["p_nom"] = lng["CapacityInMtpa"] * mtpa_to_mw entry["p_nom"] = entry["max_cap_from_to_M_m3_per_d"] * mcm_per_day_to_mw - prod["p_nom"] = prod["max_supply_M_m3_per_d"] * mcm_per_day_to_mw + prod["p_nom"] = prod["mcm_per_year"] * mcm_per_year_to_mw lng["type"] = "lng" entry["type"] = "pipeline" @@ -83,7 +114,7 @@ if __name__ == "__main__": snakemake = mock_snakemake( "build_gas_input_locations", simpl="", - clusters="37", + clusters="128", ) logging.basicConfig(level=snakemake.config["logging"]["level"]) @@ -104,9 +135,8 @@ if __name__ == "__main__": countries = regions.index.str[:2].unique().str.replace("GB", "UK") gas_input_locations = build_gas_input_locations( - snakemake.input.lng, + snakemake.input.gem, snakemake.input.entry, - snakemake.input.production, countries, ) From 7c058f1ed333d41703e62d3d406d0d61a803da7d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 31 Jul 2023 12:20:43 +0200 Subject: [PATCH 131/497] add locations, capacities and costs of existing gas storage --- rules/build_sector.smk | 1 + scripts/build_gas_input_locations.py | 24 ++++++++++++++++-------- scripts/prepare_sector_network.py | 17 ++++++++++++----- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 1e8c70ba..ab8ff4ed 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -90,6 +90,7 @@ if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: keep_local=True, ), entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson", + storage="data/gas_network/scigrid-gas/data/IGGIELGN_Storages.geojson", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", regions_offshore=RESOURCES diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index 07707658..ad449202 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -75,7 +75,7 @@ def build_gem_prod_data(fn): return gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326") -def build_gas_input_locations(gem_fn, entry_fn, countries): +def build_gas_input_locations(gem_fn, entry_fn, sto_fn, countries): # LNG terminals lng = build_gem_lng_data(gem_fn) @@ -88,23 +88,30 @@ def build_gas_input_locations(gem_fn, entry_fn, countries): | (entry.from_country == "NO") # malformed datapoint # entries from NO to GB ] + sto = read_scigrid_gas(sto_fn) + remove_country = ["RU", "UA", "TR", "BY"] + sto = sto.query("country_code != @remove_country") + # production sites inside the model scope prod = build_gem_prod_data(gem_fn) mcm_per_day_to_mw = 437.5 # MCM/day to MWh/h mcm_per_year_to_mw = 1.199 # MCM/year to MWh/h mtpa_to_mw = 1649.224 # mtpa to MWh/h - lng["p_nom"] = lng["CapacityInMtpa"] * mtpa_to_mw - entry["p_nom"] = entry["max_cap_from_to_M_m3_per_d"] * mcm_per_day_to_mw - prod["p_nom"] = prod["mcm_per_year"] * mcm_per_year_to_mw + mcm_to_gwh = 11.36 # MCM to GWh + lng["capacity"] = lng["CapacityInMtpa"] * mtpa_to_mw + entry["capacity"] = entry["max_cap_from_to_M_m3_per_d"] * mcm_per_day_to_mw + prod["capacity"] = prod["mcm_per_year"] * mcm_per_year_to_mw + sto["capacity"] = sto["max_cushionGas_M_m3"] * mcm_to_gwh lng["type"] = "lng" entry["type"] = "pipeline" prod["type"] = "production" + sto["type"] = "storage" - sel = ["geometry", "p_nom", "type"] + sel = ["geometry", "capacity", "type"] - return pd.concat([prod[sel], entry[sel], lng[sel]], ignore_index=True) + return pd.concat([prod[sel], entry[sel], lng[sel], sto[sel]], ignore_index=True) if __name__ == "__main__": @@ -137,6 +144,7 @@ if __name__ == "__main__": gas_input_locations = build_gas_input_locations( snakemake.input.gem, snakemake.input.entry, + snakemake.input.storage, countries, ) @@ -147,8 +155,8 @@ if __name__ == "__main__": gas_input_nodes.to_file(snakemake.output.gas_input_nodes, driver="GeoJSON") gas_input_nodes_s = ( - gas_input_nodes.groupby(["bus", "type"])["p_nom"].sum().unstack() + gas_input_nodes.groupby(["bus", "type"])["capacity"].sum().unstack() ) - gas_input_nodes_s.columns.name = "p_nom" + gas_input_nodes_s.columns.name = "capacity" gas_input_nodes_s.to_csv(snakemake.output.gas_input_nodes_simplified) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index e9d97ade..9387d4b1 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -454,10 +454,11 @@ def add_carrier_buses(n, carrier, nodes=None): n.add("Carrier", carrier) unit = "MWh_LHV" if carrier == "gas" else "MWh_th" + # preliminary value for non-gas carriers to avoid zeros + capital_cost = costs.at["gas storage", "fixed"] if carrier == "gas" else 0.02 n.madd("Bus", nodes, location=location, carrier=carrier, unit=unit) - # capital cost could be corrected to e.g. 0.2 EUR/kWh * annuity and O&M n.madd( "Store", nodes + " Store", @@ -465,8 +466,7 @@ def add_carrier_buses(n, carrier, nodes=None): e_nom_extendable=True, e_cyclic=True, carrier=carrier, - capital_cost=0.2 - * costs.at[carrier, "discount rate"], # preliminary value to avoid zeros + capital_cost=capital_cost, ) n.madd( @@ -1162,7 +1162,7 @@ def add_storage_and_grids(n, costs): if options["gas_network"]: logger.info( - "Add natural gas infrastructure, incl. LNG terminals, production and entry-points." + "Add natural gas infrastructure, incl. LNG terminals, production, storage and entry-points." ) if options["H2_retrofit"]: @@ -1207,10 +1207,17 @@ def add_storage_and_grids(n, costs): remove_i = n.generators[gas_i & internal_i].index n.generators.drop(remove_i, inplace=True) - p_nom = gas_input_nodes.sum(axis=1).rename(lambda x: x + " gas") + input_types = ["lng", "pipeline", "production"] + p_nom = gas_input_nodes[input_types].sum(axis=1).rename(lambda x: x + " gas") n.generators.loc[gas_i, "p_nom_extendable"] = False n.generators.loc[gas_i, "p_nom"] = p_nom + # add existing gas storage capacity + gas_i = n.stores.carrier == "gas" + e_nom = gas_input_nodes["storage"].rename(lambda x: x + " gas Store").reindex(n.stores.index).fillna(0.) * 1e3 # MWh_LHV + e_nom.clip(upper=e_nom.quantile(0.98), inplace=True) # limit extremely large storage + n.stores.loc[gas_i, "e_nom_min"] = e_nom + # add candidates for new gas pipelines to achieve full connectivity G = nx.Graph() From 252f6d2c15838dc17ded00271f4edc05b417bec8 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 08:13:01 +0100 Subject: [PATCH 132/497] pre-commit formatting --- .pre-commit-config.yaml | 2 +- scripts/build_gas_input_locations.py | 21 ++++++++++++++------- scripts/prepare_sector_network.py | 12 ++++++++++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7b9009c3..78e70b57 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -50,7 +50,7 @@ repos: - id: blackdoc # Formatting with "black" coding style -- repo: https://github.com/psf/black +- repo: https://github.com/psf/black-pre-commit-mirror rev: 23.12.1 hooks: # Format Python files diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index ad449202..2f967c75 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -47,7 +47,7 @@ def build_gem_prod_data(fn): remove_country = ["Cyprus", "Türkiye"] remove_fuel_type = ["oil"] - + df = df.query( "Status != 'shut in' \ & 'Fuel type' != 'oil' \ @@ -58,18 +58,25 @@ def build_gem_prod_data(fn): p = pd.read_excel(fn[0], sheet_name="Gas extraction - production") p = p.set_index("GEM Unit ID") - p = p[p["Fuel description"] == 'gas' ] + p = p[p["Fuel description"] == "gas"] capacities = pd.DataFrame(index=df.index) for key in ["production", "production design capacity", "reserves"]: - cap = p.loc[p["Production/reserves"] == key, "Quantity (converted)"].groupby("GEM Unit ID").sum().reindex(df.index) + cap = ( + p.loc[p["Production/reserves"] == key, "Quantity (converted)"] + .groupby("GEM Unit ID") + .sum() + .reindex(df.index) + ) # assume capacity such that 3% of reserves can be extracted per year (25% quantile) - annualization_factor = 0.03 if key == "reserves" else 1. + annualization_factor = 0.03 if key == "reserves" else 1.0 capacities[key] = cap * annualization_factor - df["mcm_per_year"] = capacities["production"] \ - .combine_first(capacities["production design capacity"]) \ + df["mcm_per_year"] = ( + capacities["production"] + .combine_first(capacities["production design capacity"]) .combine_first(capacities["reserves"]) + ) geometry = gpd.points_from_xy(df["Longitude"], df["Latitude"]) return gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326") @@ -88,7 +95,7 @@ def build_gas_input_locations(gem_fn, entry_fn, sto_fn, countries): | (entry.from_country == "NO") # malformed datapoint # entries from NO to GB ] - sto = read_scigrid_gas(sto_fn) + sto = read_scigrid_gas(sto_fn) remove_country = ["RU", "UA", "TR", "BY"] sto = sto.query("country_code != @remove_country") diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 9387d4b1..d5c979fa 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1214,8 +1214,16 @@ def add_storage_and_grids(n, costs): # add existing gas storage capacity gas_i = n.stores.carrier == "gas" - e_nom = gas_input_nodes["storage"].rename(lambda x: x + " gas Store").reindex(n.stores.index).fillna(0.) * 1e3 # MWh_LHV - e_nom.clip(upper=e_nom.quantile(0.98), inplace=True) # limit extremely large storage + e_nom = ( + gas_input_nodes["storage"] + .rename(lambda x: x + " gas Store") + .reindex(n.stores.index) + .fillna(0.0) + * 1e3 + ) # MWh_LHV + e_nom.clip( + upper=e_nom.quantile(0.98), inplace=True + ) # limit extremely large storage n.stores.loc[gas_i, "e_nom_min"] = e_nom # add candidates for new gas pipelines to achieve full connectivity From 4983a2e02178dfe501358ce24636f877ecd4f478 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 08:19:52 +0100 Subject: [PATCH 133/497] add release note --- doc/release_notes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 634209c7..36823791 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -65,6 +65,9 @@ Upcoming Release * Validate downloads from Zenodo using MD5 checksums. This identifies corrupted or incomplete downloads. +* Add locations, capacities and costs of existing gas storage using Global + Energy Monitor's `Europe Gas Tracker + `_. **Bugs and Compatibility** From 19b503d7580faf75dba539923d255c37f4038fd7 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 11 Aug 2023 12:07:03 +0200 Subject: [PATCH 134/497] retrieve.smk: add scigrid storages to files of interest --- rules/retrieve.smk | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 4c9ca814..4ded2a46 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -169,6 +169,7 @@ if config["enable"]["retrieve"] and ( "IGGIELGN_LNGs.geojson", "IGGIELGN_BorderPoints.geojson", "IGGIELGN_Productions.geojson", + "IGGIELGN_Storages.geojson", "IGGIELGN_PipeSegments.geojson", ] From 0d03d384cc0ce27e681b76d14418b6d1b5cf9d1c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 09:07:08 +0100 Subject: [PATCH 135/497] lossy_bidirectional_links: use original length for loss calculation --- scripts/prepare_sector_network.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 998f954e..09de541a 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3309,15 +3309,16 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): n.links.loc[carrier_i, "length"] / 1e3 ) rev_links = ( - n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) + n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0", "length": "length_original"}, axis=1) ) - rev_links.capital_cost = 0 - rev_links.length = 0 + rev_links["capital_cost"] = 0 + rev_links["length"] = 0 rev_links["reversed"] = True rev_links.index = rev_links.index.map(lambda x: x + "-reversed") n.links = pd.concat([n.links, rev_links], sort=False) n.links["reversed"] = n.links["reversed"].fillna(False) + n.links["length_original"] = n.links["length_original"].fillna(n.links.length) # do compression losses after concatenation to take electricity consumption at bus0 in either direction carrier_i = n.links.query("carrier == @carrier").index @@ -3326,7 +3327,7 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): n.buses.location ) # electricity n.links.loc[carrier_i, "efficiency2"] = ( - -compression_per_1000km * n.links.loc[carrier_i, "length"] / 1e3 + -compression_per_1000km * n.links.loc[carrier_i, "length_original"] / 1e3 ) From 2b2bad392f6c83771472d93ca2df597608ea6b26 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 08:08:21 +0000 Subject: [PATCH 136/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 09de541a..bab8de7b 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3309,7 +3309,9 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): n.links.loc[carrier_i, "length"] / 1e3 ) rev_links = ( - n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0", "length": "length_original"}, axis=1) + n.links.loc[carrier_i] + .copy() + .rename({"bus0": "bus1", "bus1": "bus0", "length": "length_original"}, axis=1) ) rev_links["capital_cost"] = 0 rev_links["length"] = 0 From 075ffb5c043edf16b1a9b69c4be3ed31da7919b4 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 09:26:08 +0100 Subject: [PATCH 137/497] add release notes and documentation --- doc/release_notes.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 505c747e..82f63252 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,13 @@ Release Notes Upcoming Release ================ +* Add option to specify losses for bidirectional links, e.g. pipelines or HVDC + links, in configuration file under ``sector: transmission_efficiency:``. Users + can specify static or length-dependent values as well as a length-dependent + electricity demand for compression, which is implemented as a multi-link to + the local electricity buses. The bidirectional links will then be split into + two unidirectional links with linked capacities. + * Updated Global Energy Monitor LNG terminal data to March 2023 version. * For industry distribution, use EPRTR as fallback if ETS data is not available. From d829d6fd3da28cc7103648132b07726deda1b9c8 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 09:28:24 +0100 Subject: [PATCH 138/497] add release notes and documentation --- doc/configtables/sector.csv | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index d610c862..2767c603 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -107,6 +107,11 @@ electricity_distribution _grid,--,"{true, false}",Add a simplified representatio electricity_distribution _grid_cost_factor,,,Multiplies the investment cost of the electricity distribution grid ,,, electricity_grid _connection,--,"{true, false}",Add the cost of electricity grid connection for onshore wind and solar +transmission_efficiency,,,Section to specify transmission losses or compression energy demands of bidirectional links. Splits them into two capacity-linked unidirectional links. +-- {carrier},--,str,The carrier of the link. +-- -- efficiency_static,p.u.,float,Length-independent transmission efficiency. +-- -- efficiency_per_1000km,p.u. per 1000 km,float,Length-dependent transmission efficiency ($\eta^{\text{length}}$) +-- -- compression_per_1000km,p.u. per 1000 km,float,Length-dependent electricity demand for compression ($\eta \cdot \text{length}$) implemented as multi-link to local electricity bus. H2_network,--,"{true, false}",Add option for new hydrogen pipelines gas_network,--,"{true, false}","Add existing natural gas infrastructure, incl. LNG terminals, production and entry-points. The existing gas network is added with a lossless transport model. A length-weighted `k-edge augmentation algorithm `_ can be run to add new candidate gas pipelines such that all regions of the model can be connected to the gas network. When activated, all the gas demands are regionally disaggregated as well." H2_retrofit,--,"{true, false}",Add option for retrofiting existing pipelines to transport hydrogen. From 9d939fa635f8a0b55f7049dd23a29facfeda1471 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 10:12:43 +0100 Subject: [PATCH 139/497] remove helmeth option --- config/config.default.yaml | 2 -- doc/configtables/sector.csv | 1 - doc/release_notes.rst | 2 ++ scripts/plot_network.py | 4 ++-- scripts/plot_summary.py | 1 - scripts/prepare_sector_network.py | 17 ----------------- 6 files changed, 4 insertions(+), 23 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index d7704a27..e8ca22dc 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -451,7 +451,6 @@ sector: solar_cf_correction: 0.788457 # = >>> 1/1.2683 marginal_cost_storage: 0. #1e-4 methanation: true - helmeth: false coal_cc: false dac: true co2_vent: false @@ -954,7 +953,6 @@ plotting: Sabatier: '#9850ad' methanation: '#c44ce6' methane: '#c44ce6' - helmeth: '#e899ff' # synfuels Fischer-Tropsch: '#25c49a' liquid: '#25c49a' diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 280c1906..57e6ce3d 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -71,7 +71,6 @@ solar_thermal,--,"{true, false}",Add option for using solar thermal to generate solar_cf_correction,--,float,The correction factor for the value provided by the solar thermal profile calculations marginal_cost_storage,currency/MWh ,float,The marginal cost of discharging batteries in distributed grids methanation,--,"{true, false}",Add option for transforming hydrogen and CO2 into methane using methanation. -helmeth,--,"{true, false}",Add option for transforming power into gas using HELMETH (Integrated High-Temperature ELectrolysis and METHanation for Effective Power to Gas Conversion) coal_cc,--,"{true, false}",Add option for coal CHPs with carbon capture dac,--,"{true, false}",Add option for Direct Air Capture (DAC) co2_vent,--,"{true, false}",Add option for vent out CO2 from storages to the atmosphere. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index f84c0f83..5ac7925e 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -79,6 +79,8 @@ Upcoming Release Energy Monitor's `Europe Gas Tracker `_. +* Remove HELMETH option. + **Bugs and Compatibility** * A bug preventing custom powerplants specified in ``data/custom_powerplants.csv`` was fixed. (https://github.com/PyPSA/pypsa-eur/pull/732) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index f44bb6de..67481120 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -31,7 +31,7 @@ def rename_techs_tyndp(tech): tech = rename_techs(tech) if "heat pump" in tech or "resistive heater" in tech: return "power-to-heat" - elif tech in ["H2 Electrolysis", "methanation", "helmeth", "H2 liquefaction"]: + elif tech in ["H2 Electrolysis", "methanation", "H2 liquefaction"]: return "power-to-gas" elif tech == "H2": return "H2 storage" @@ -495,7 +495,7 @@ def plot_ch4_map(network): # make a fake MultiIndex so that area is correct for legend fossil_gas.index = pd.MultiIndex.from_product([fossil_gas.index, ["fossil gas"]]) - methanation_i = n.links[n.links.carrier.isin(["helmeth", "Sabatier"])].index + methanation_i = n.links.query("carrier == 'Sabatier'").index methanation = ( abs( n.links_t.p1.loc[:, methanation_i].mul( diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index 5804e785..67ac9b55 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -121,7 +121,6 @@ preferred_order = pd.Index( "gas boiler", "gas", "natural gas", - "helmeth", "methanation", "ammonia", "hydrogen storage", diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index c4a67a38..f746fe9c 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1369,23 +1369,6 @@ def add_storage_and_grids(n, costs): lifetime=costs.at["methanation", "lifetime"], ) - if options["helmeth"]: - n.madd( - "Link", - spatial.nodes, - suffix=" helmeth", - bus0=nodes, - bus1=spatial.gas.nodes, - bus2=spatial.co2.nodes, - carrier="helmeth", - p_nom_extendable=True, - efficiency=costs.at["helmeth", "efficiency"], - efficiency2=-costs.at["helmeth", "efficiency"] - * costs.at["gas", "CO2 intensity"], - capital_cost=costs.at["helmeth", "fixed"], - lifetime=costs.at["helmeth", "lifetime"], - ) - if options.get("coal_cc"): n.madd( "Link", From 92df7bbb9c786667364f7358f5ee90caad87ec1d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 10:27:42 +0100 Subject: [PATCH 140/497] build_renewable_profiles: improve logging of time passed --- scripts/build_renewable_profiles.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 3a1c525e..ef8683cb 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -277,15 +277,14 @@ if __name__ == "__main__": snakemake.input.country_shapes, buffer=buffer, invert=True ) + logger.info("Calculate landuse availability...") + start = time.time() + kwargs = dict(nprocesses=nprocesses, disable_progressbar=noprogress) - if noprogress: - logger.info("Calculate landuse availabilities...") - start = time.time() - availability = cutout.availabilitymatrix(regions, excluder, **kwargs) - duration = time.time() - start - logger.info(f"Completed availability calculation ({duration:2.2f}s)") - else: - availability = cutout.availabilitymatrix(regions, excluder, **kwargs) + availability = cutout.availabilitymatrix(regions, excluder, **kwargs) + + duration = time.time() - start + logger.info(f"Completed landuse availability calculation ({duration:2.2f}s)") # For Moldova and Ukraine: Overwrite parts not covered by Corine with # externally determined available areas @@ -304,8 +303,19 @@ if __name__ == "__main__": func = getattr(cutout, resource.pop("method")) if client is not None: resource["dask_kwargs"] = {"scheduler": client} + + logger.info("Calculate average capacity factor...") + start = time.time() + capacity_factor = correction_factor * func(capacity_factor=True, **resource) layout = capacity_factor * area * capacity_per_sqkm + + duration = time.time() - start + logger.info(f"Completed average capacity factor calculation ({duration:2.2f}s)") + + logger.info("Calculate weighted capacity factor time series...") + start = time.time() + profile, capacities = func( matrix=availability.stack(spatial=["y", "x"]), layout=layout, @@ -315,6 +325,9 @@ if __name__ == "__main__": **resource, ) + duration = time.time() - start + logger.info(f"Completed weighted capacity factor time series calculation ({duration:2.2f}s)") + logger.info(f"Calculating maximal capacity per bus (method '{p_nom_max_meth}')") if p_nom_max_meth == "simple": p_nom_max = capacity_per_sqkm * availability @ area From fdb63bc6ca4c3aa332104d26bca1c0a5d5c546c1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 09:29:08 +0000 Subject: [PATCH 141/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_renewable_profiles.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index ef8683cb..83c79482 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -326,7 +326,9 @@ if __name__ == "__main__": ) duration = time.time() - start - logger.info(f"Completed weighted capacity factor time series calculation ({duration:2.2f}s)") + logger.info( + f"Completed weighted capacity factor time series calculation ({duration:2.2f}s)" + ) logger.info(f"Calculating maximal capacity per bus (method '{p_nom_max_meth}')") if p_nom_max_meth == "simple": From 6b344c9901f7aa78d8714ad00cb9626b2773cb37 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 10:33:33 +0100 Subject: [PATCH 142/497] renewable_profiles: remove conservative potential estimation method --- config/config.default.yaml | 4 -- doc/configtables/offwind-ac.csv | 1 - doc/configtables/offwind-dc.csv | 1 - doc/configtables/onwind.csv | 1 - doc/configtables/solar.csv | 1 - scripts/build_renewable_profiles.py | 98 ++++++++++++----------------- 6 files changed, 40 insertions(+), 66 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index d7704a27..dc818e84 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -167,7 +167,6 @@ renewable: distance_grid_codes: [1, 2, 3, 4, 5, 6] natura: true excluder_resolution: 100 - potential: simple # or conservative clip_p_max_pu: 1.e-2 offwind-ac: cutout: europe-2013-era5 @@ -183,7 +182,6 @@ renewable: max_depth: 50 max_shore_distance: 30000 excluder_resolution: 200 - potential: simple # or conservative clip_p_max_pu: 1.e-2 offwind-dc: cutout: europe-2013-era5 @@ -199,7 +197,6 @@ renewable: max_depth: 50 min_shore_distance: 30000 excluder_resolution: 200 - potential: simple # or conservative clip_p_max_pu: 1.e-2 solar: cutout: europe-2013-sarah @@ -214,7 +211,6 @@ renewable: corine: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 31, 32] natura: true excluder_resolution: 100 - potential: simple # or conservative clip_p_max_pu: 1.e-2 hydro: cutout: europe-2013-era5 diff --git a/doc/configtables/offwind-ac.csv b/doc/configtables/offwind-ac.csv index 6b756799..c3512a9e 100644 --- a/doc/configtables/offwind-ac.csv +++ b/doc/configtables/offwind-ac.csv @@ -12,5 +12,4 @@ ship_threshold,--,float,"Ship density threshold from which areas are excluded." max_depth,m,float,"Maximum sea water depth at which wind turbines can be build. Maritime areas with deeper waters are excluded in the process of calculating the AC-connected offshore wind potential." min_shore_distance,m,float,"Minimum distance to the shore below which wind turbines cannot be build. Such areas close to the shore are excluded in the process of calculating the AC-connected offshore wind potential." max_shore_distance,m,float,"Maximum distance to the shore above which wind turbines cannot be build. Such areas close to the shore are excluded in the process of calculating the AC-connected offshore wind potential." -potential,--,"One of {'simple', 'conservative'}","Method to compute the maximal installable potential for a node; confer :ref:`renewableprofiles`" clip_p_max_pu,p.u.,float,"To avoid too small values in the renewables` per-unit availability time series values below this threshold are set to zero." diff --git a/doc/configtables/offwind-dc.csv b/doc/configtables/offwind-dc.csv index 1f72228a..35095597 100644 --- a/doc/configtables/offwind-dc.csv +++ b/doc/configtables/offwind-dc.csv @@ -12,5 +12,4 @@ ship_threshold,--,float,"Ship density threshold from which areas are excluded." max_depth,m,float,"Maximum sea water depth at which wind turbines can be build. Maritime areas with deeper waters are excluded in the process of calculating the AC-connected offshore wind potential." min_shore_distance,m,float,"Minimum distance to the shore below which wind turbines cannot be build." max_shore_distance,m,float,"Maximum distance to the shore above which wind turbines cannot be build." -potential,--,"One of {'simple', 'conservative'}","Method to compute the maximal installable potential for a node; confer :ref:`renewableprofiles`" clip_p_max_pu,p.u.,float,"To avoid too small values in the renewables` per-unit availability time series values below this threshold are set to zero." diff --git a/doc/configtables/onwind.csv b/doc/configtables/onwind.csv index ba9482e5..b7e823b3 100644 --- a/doc/configtables/onwind.csv +++ b/doc/configtables/onwind.csv @@ -9,7 +9,6 @@ corine,,, -- distance,m,float,"Distance to keep from areas specified in ``distance_grid_codes``" -- distance_grid_codes,--,"Any subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes to which wind turbines must maintain a distance specified in the setting ``distance``." natura,bool,"{true, false}","Switch to exclude `Natura 2000 `_ natural protection areas. Area is excluded if ``true``." -potential,--,"One of {'simple', 'conservative'}","Method to compute the maximal installable potential for a node; confer :ref:`renewableprofiles`" clip_p_max_pu,p.u.,float,"To avoid too small values in the renewables` per-unit availability time series values below this threshold are set to zero." correction_factor,--,float,"Correction factor for capacity factor time series." excluder_resolution,m,float,"Resolution on which to perform geographical elibility analysis." diff --git a/doc/configtables/solar.csv b/doc/configtables/solar.csv index 803445d5..7da1281b 100644 --- a/doc/configtables/solar.csv +++ b/doc/configtables/solar.csv @@ -10,6 +10,5 @@ capacity_per_sqkm,:math:`MW/km^2`,float,"Allowable density of solar panel placem correction_factor,--,float,"A correction factor for the capacity factor (availability) time series." corine,--,"Any subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes which are generally eligible for solar panel placement." natura,bool,"{true, false}","Switch to exclude `Natura 2000 `_ natural protection areas. Area is excluded if ``true``." -potential,--,"One of {'simple', 'conservative'}","Method to compute the maximal installable potential for a node; confer :ref:`renewableprofiles`" clip_p_max_pu,p.u.,float,"To avoid too small values in the renewables` per-unit availability time series values below this threshold are set to zero." excluder_resolution,m,float,"Resolution on which to perform geographical elibility analysis." diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 3a1c525e..c33bdf9b 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -7,10 +7,10 @@ """ Calculates for each network node the (i) installable capacity (based on land- use), (ii) the available generation time series (based on weather data), and -(iii) the average distance from the node for onshore wind, AC-connected -offshore wind, DC-connected offshore wind and solar PV generators. In addition -for offshore wind it calculates the fraction of the grid connection which is -under water. +(iii) the average distance from the node for onshore wind, AC-connected offshore +wind, DC-connected offshore wind and solar PV generators. In addition for +offshore wind it calculates the fraction of the grid connection which is under +water. .. note:: Hydroelectric profiles are built in script :mod:`build_hydro_profiles`. @@ -26,20 +26,9 @@ Relevant settings renewable: {technology}: - cutout: - corine: - grid_codes: - distance: - natura: - max_depth: - max_shore_distance: - min_shore_distance: - capacity_per_sqkm: - correction_factor: - potential: - min_p_max_pu: - clip_p_max_pu: - resource: + cutout: corine: grid_codes: distance: natura: max_depth: + max_shore_distance: min_shore_distance: capacity_per_sqkm: + correction_factor: min_p_max_pu: clip_p_max_pu: resource: .. seealso:: Documentation of the configuration file ``config/config.yaml`` at @@ -48,21 +37,30 @@ Relevant settings Inputs ------ -- ``data/bundle/corine/g250_clc06_V18_5.tif``: `CORINE Land Cover (CLC) `_ inventory on `44 classes `_ of land use (e.g. forests, arable land, industrial, urban areas). +- ``data/bundle/corine/g250_clc06_V18_5.tif``: `CORINE Land Cover (CLC) + `_ inventory on `44 + classes `_ of + land use (e.g. forests, arable land, industrial, urban areas). .. image:: img/corine.png :scale: 33 % -- ``data/bundle/GEBCO_2014_2D.nc``: A `bathymetric `_ data set with a global terrain model for ocean and land at 15 arc-second intervals by the `General Bathymetric Chart of the Oceans (GEBCO) `_. +- ``data/bundle/GEBCO_2014_2D.nc``: A `bathymetric + `_ data set with a global terrain + model for ocean and land at 15 arc-second intervals by the `General + Bathymetric Chart of the Oceans (GEBCO) + `_. .. image:: img/gebco_2019_grid_image.jpg :scale: 50 % - **Source:** `GEBCO `_ + **Source:** `GEBCO + `_ - ``resources/natura.tiff``: confer :ref:`natura` - ``resources/offshore_shapes.geojson``: confer :ref:`shapes` -- ``resources/regions_onshore.geojson``: (if not offshore wind), confer :ref:`busregions` +- ``resources/regions_onshore.geojson``: (if not offshore wind), confer + :ref:`busregions` - ``resources/regions_offshore.geojson``: (if offshore wind), :ref:`busregions` - ``"cutouts/" + params["renewable"][{technology}]['cutout']``: :ref:`cutout` - ``networks/base.nc``: :ref:`base` @@ -128,25 +126,25 @@ Description This script functions at two main spatial resolutions: the resolution of the network nodes and their `Voronoi cells `_, and the resolution of the -cutout grid cells for the weather data. Typically the weather data grid is -finer than the network nodes, so we have to work out the distribution of -generators across the grid cells within each Voronoi cell. This is done by -taking account of a combination of the available land at each grid cell and the -capacity factor there. +cutout grid cells for the weather data. Typically the weather data grid is finer +than the network nodes, so we have to work out the distribution of generators +across the grid cells within each Voronoi cell. This is done by taking account +of a combination of the available land at each grid cell and the capacity factor +there. First the script computes how much of the technology can be installed at each cutout grid cell and each node using the `GLAES -`_ library. This uses the CORINE land use data, -Natura2000 nature reserves and GEBCO bathymetry data. +`_ library. This uses the CORINE land use +data, Natura2000 nature reserves and GEBCO bathymetry data. .. image:: img/eligibility.png :scale: 50 % :align: center -To compute the layout of generators in each node's Voronoi cell, the -installable potential in each grid cell is multiplied with the capacity factor -at each grid cell. This is done since we assume more generators are installed -at cells with a higher capacity factor. +To compute the layout of generators in each node's Voronoi cell, the installable +potential in each grid cell is multiplied with the capacity factor at each grid +cell. This is done since we assume more generators are installed at cells with a +higher capacity factor. .. image:: img/offwinddc-gridcell.png :scale: 50 % @@ -164,20 +162,14 @@ at cells with a higher capacity factor. :scale: 50 % :align: center -This layout is then used to compute the generation availability time series -from the weather data cutout from ``atlite``. +This layout is then used to compute the generation availability time series from +the weather data cutout from ``atlite``. -Two methods are available to compute the maximal installable potential for the -node (`p_nom_max`): ``simple`` and ``conservative``: - -- ``simple`` adds up the installable potentials of the individual grid cells. - If the model comes close to this limit, then the time series may slightly - overestimate production since it is assumed the geographical distribution is - proportional to capacity factor. - -- ``conservative`` assertains the nodal limit by increasing capacities - proportional to the layout until the limit of an individual grid cell is - reached. +The maximal installable potential for the node (`p_nom_max`) is computed by +adding up the installable potentials of the individual grid cells. +If the model comes close to this limit, then the time series may slightly +overestimate production since it is assumed the geographical distribution is +proportional to capacity factor. """ import functools import logging @@ -210,7 +202,6 @@ if __name__ == "__main__": resource = params["resource"] # pv panel params / wind turbine params correction_factor = params.get("correction_factor", 1.0) capacity_per_sqkm = params["capacity_per_sqkm"] - p_nom_max_meth = params.get("potential", "conservative") if isinstance(params.get("corine", {}), list): params["corine"] = {"grid_codes": params["corine"]} @@ -315,17 +306,8 @@ if __name__ == "__main__": **resource, ) - logger.info(f"Calculating maximal capacity per bus (method '{p_nom_max_meth}')") - if p_nom_max_meth == "simple": - p_nom_max = capacity_per_sqkm * availability @ area - elif p_nom_max_meth == "conservative": - max_cap_factor = capacity_factor.where(availability != 0).max(["x", "y"]) - p_nom_max = capacities / max_cap_factor - else: - raise AssertionError( - 'Config key `potential` should be one of "simple" ' - f'(default) or "conservative", not "{p_nom_max_meth}"' - ) + logger.info(f"Calculating maximal capacity per bus") + p_nom_max = capacity_per_sqkm * availability @ area logger.info("Calculate average distances.") layoutmatrix = (layout * availability).stack(spatial=["y", "x"]) From 38d587944b8625cfb208f6cc0c5046b1a3ee97d6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 09:35:05 +0000 Subject: [PATCH 143/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_renewable_profiles.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index c33bdf9b..0ad840ba 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -7,10 +7,10 @@ """ Calculates for each network node the (i) installable capacity (based on land- use), (ii) the available generation time series (based on weather data), and -(iii) the average distance from the node for onshore wind, AC-connected offshore -wind, DC-connected offshore wind and solar PV generators. In addition for -offshore wind it calculates the fraction of the grid connection which is under -water. +(iii) the average distance from the node for onshore wind, AC-connected +offshore wind, DC-connected offshore wind and solar PV generators. In addition +for offshore wind it calculates the fraction of the grid connection which is +under water. .. note:: Hydroelectric profiles are built in script :mod:`build_hydro_profiles`. From e423945e7d709d1cb59d85caab4b306bd752c045 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 10:54:53 +0100 Subject: [PATCH 144/497] gas_input: ensure all columns exist even if column empty --- scripts/build_gas_input_locations.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index 2f967c75..9ad3760d 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -161,8 +161,12 @@ if __name__ == "__main__": gas_input_nodes.to_file(snakemake.output.gas_input_nodes, driver="GeoJSON") + ensure_columns = ["lng", "pipeline", "production", "storage"] gas_input_nodes_s = ( - gas_input_nodes.groupby(["bus", "type"])["capacity"].sum().unstack() + gas_input_nodes.groupby(["bus", "type"])["capacity"] + .sum() + .unstack() + .reindex(columns=ensure_columns) ) gas_input_nodes_s.columns.name = "capacity" From 29afffb4ca1b8480d88580769960b9536c17ef26 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 11:31:56 +0100 Subject: [PATCH 145/497] fix potential duplicate renaming of length_original --- scripts/prepare_sector_network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 2ba64e87..54d5d7c8 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3441,8 +3441,9 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): rev_links = ( n.links.loc[carrier_i] .copy() - .rename({"bus0": "bus1", "bus1": "bus0", "length": "length_original"}, axis=1) + .rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) ) + rev_links["length_original"] = rev_links["length"] rev_links["capital_cost"] = 0 rev_links["length"] = 0 rev_links["reversed"] = True From 4606cb131b292c02e95b2af3583e7df48561fcb9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:44:14 +0000 Subject: [PATCH 146/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 54d5d7c8..815bf6ff 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3439,9 +3439,7 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): n.links.loc[carrier_i, "length"] / 1e3 ) rev_links = ( - n.links.loc[carrier_i] - .copy() - .rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) + n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) ) rev_links["length_original"] = rev_links["length"] rev_links["capital_cost"] = 0 From 05495ce48413d2aee4c351da29b230cd62add824 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 12:46:42 +0100 Subject: [PATCH 147/497] fix lossy bidirectional link coupling countraint for myopic --- scripts/solve_network.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index a2125895..0bfc68ff 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -691,13 +691,24 @@ def add_lossy_bidirectional_link_constraints(n): if not n.links.p_nom_extendable.any() or not "reversed" in n.links.columns: return - reversed_links = n.links.reversed.fillna(0).astype(bool) - carriers = n.links.loc[reversed_links, "carrier"].unique() + n.links["reversed"] = n.links.reversed.fillna(0).astype(bool) + carriers = n.links.loc[n.links.reversed, "carrier"].unique() forward_i = n.links.query( "carrier in @carriers and ~reversed and p_nom_extendable" ).index - backward_i = forward_i + "-reversed" + + def get_backward_i(forward_i): + return pd.Index( + [ + re.sub(r"-(\d{4})$", r"-reversed-\1", s) + if re.search(r"-\d{4}$", s) + else s + "-reversed" + for s in forward_i + ] + ) + + backward_i = get_backward_i(forward_i) lhs = n.model["Link-p_nom"].loc[backward_i] rhs = n.model["Link-p_nom"].loc[forward_i] From 80f9259bac4742b0f819ddc6542da458a7690874 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 12:57:22 +0100 Subject: [PATCH 148/497] handle gas pipeline retrofitting with lossy links --- scripts/solve_network.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 0bfc68ff..98afd49d 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -774,9 +774,13 @@ def add_pipe_retrofit_constraint(n): """ Add constraint for retrofitting existing CH4 pipelines to H2 pipelines. """ - gas_pipes_i = n.links.query("carrier == 'gas pipeline' and p_nom_extendable").index + if "reversed" not in n.links.columns: + n.links["reversed"] = False + gas_pipes_i = n.links.query( + "carrier == 'gas pipeline' and p_nom_extendable and ~reversed" + ).index h2_retrofitted_i = n.links.query( - "carrier == 'H2 pipeline retrofitted' and p_nom_extendable" + "carrier == 'H2 pipeline retrofitted' and p_nom_extendable and ~reversed" ).index if h2_retrofitted_i.empty or gas_pipes_i.empty: From a3cfc8cde51a87ed2fe0babdd4f5c5b42cf993be Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 13:05:46 +0100 Subject: [PATCH 149/497] add heat vent to tech_colors --- config/config.default.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index d7704a27..b9fb76f4 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -885,6 +885,7 @@ plotting: # heat demand Heat load: '#cc1f1f' heat: '#cc1f1f' + heat vent: '#aa3344' heat demand: '#cc1f1f' rural heat: '#ff5c5c' residential rural heat: '#ff7c7c' From bcafbb1e5459ac90eb3fbb65f9b3da22149a2f7a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 13:15:43 +0100 Subject: [PATCH 150/497] compatibility for config with single node in single country --- scripts/build_clustered_population_layouts.py | 1 - scripts/build_heat_demand.py | 1 - scripts/build_solar_thermal_profiles.py | 1 - scripts/build_temperature_profiles.py | 1 - 4 files changed, 4 deletions(-) diff --git a/scripts/build_clustered_population_layouts.py b/scripts/build_clustered_population_layouts.py index 083f3de4..73972d3d 100644 --- a/scripts/build_clustered_population_layouts.py +++ b/scripts/build_clustered_population_layouts.py @@ -28,7 +28,6 @@ if __name__ == "__main__": gpd.read_file(snakemake.input.regions_onshore) .set_index("name") .buffer(0) - .squeeze() ) I = cutout.indicatormatrix(clustered_regions) diff --git a/scripts/build_heat_demand.py b/scripts/build_heat_demand.py index 73494260..da7c476e 100644 --- a/scripts/build_heat_demand.py +++ b/scripts/build_heat_demand.py @@ -34,7 +34,6 @@ if __name__ == "__main__": gpd.read_file(snakemake.input.regions_onshore) .set_index("name") .buffer(0) - .squeeze() ) I = cutout.indicatormatrix(clustered_regions) diff --git a/scripts/build_solar_thermal_profiles.py b/scripts/build_solar_thermal_profiles.py index d285691a..4e7a6cd4 100644 --- a/scripts/build_solar_thermal_profiles.py +++ b/scripts/build_solar_thermal_profiles.py @@ -36,7 +36,6 @@ if __name__ == "__main__": gpd.read_file(snakemake.input.regions_onshore) .set_index("name") .buffer(0) - .squeeze() ) I = cutout.indicatormatrix(clustered_regions) diff --git a/scripts/build_temperature_profiles.py b/scripts/build_temperature_profiles.py index 9db37c25..d8eaadce 100644 --- a/scripts/build_temperature_profiles.py +++ b/scripts/build_temperature_profiles.py @@ -34,7 +34,6 @@ if __name__ == "__main__": gpd.read_file(snakemake.input.regions_onshore) .set_index("name") .buffer(0) - .squeeze() ) I = cutout.indicatormatrix(clustered_regions) From d7051e7f66eb3bdbe0f790ea4513cbf01133b09a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 12:16:43 +0000 Subject: [PATCH 151/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_clustered_population_layouts.py | 4 +--- scripts/build_heat_demand.py | 4 +--- scripts/build_solar_thermal_profiles.py | 4 +--- scripts/build_temperature_profiles.py | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/scripts/build_clustered_population_layouts.py b/scripts/build_clustered_population_layouts.py index 73972d3d..2f237656 100644 --- a/scripts/build_clustered_population_layouts.py +++ b/scripts/build_clustered_population_layouts.py @@ -25,9 +25,7 @@ if __name__ == "__main__": cutout = atlite.Cutout(snakemake.input.cutout) clustered_regions = ( - gpd.read_file(snakemake.input.regions_onshore) - .set_index("name") - .buffer(0) + gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) I = cutout.indicatormatrix(clustered_regions) diff --git a/scripts/build_heat_demand.py b/scripts/build_heat_demand.py index da7c476e..77768404 100644 --- a/scripts/build_heat_demand.py +++ b/scripts/build_heat_demand.py @@ -31,9 +31,7 @@ if __name__ == "__main__": cutout = atlite.Cutout(snakemake.input.cutout).sel(time=time) clustered_regions = ( - gpd.read_file(snakemake.input.regions_onshore) - .set_index("name") - .buffer(0) + gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) I = cutout.indicatormatrix(clustered_regions) diff --git a/scripts/build_solar_thermal_profiles.py b/scripts/build_solar_thermal_profiles.py index 4e7a6cd4..ee6ed881 100644 --- a/scripts/build_solar_thermal_profiles.py +++ b/scripts/build_solar_thermal_profiles.py @@ -33,9 +33,7 @@ if __name__ == "__main__": cutout = atlite.Cutout(snakemake.input.cutout).sel(time=time) clustered_regions = ( - gpd.read_file(snakemake.input.regions_onshore) - .set_index("name") - .buffer(0) + gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) I = cutout.indicatormatrix(clustered_regions) diff --git a/scripts/build_temperature_profiles.py b/scripts/build_temperature_profiles.py index d8eaadce..a13ec3c2 100644 --- a/scripts/build_temperature_profiles.py +++ b/scripts/build_temperature_profiles.py @@ -31,9 +31,7 @@ if __name__ == "__main__": cutout = atlite.Cutout(snakemake.input.cutout).sel(time=time) clustered_regions = ( - gpd.read_file(snakemake.input.regions_onshore) - .set_index("name") - .buffer(0) + gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) I = cutout.indicatormatrix(clustered_regions) From 00aa07242a313755f8de1a2a6da7111f4cc1abf6 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 8 Dec 2023 17:53:28 +0100 Subject: [PATCH 152/497] add_brownfield: disable grid expansion if LV already hit Numerical problems were causing infeasibilities otherwise --- scripts/add_brownfield.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 74102580..fb1453fd 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -119,6 +119,32 @@ def add_brownfield(n, n_p, year): n.links.loc[new_pipes, "p_nom"] = 0.0 n.links.loc[new_pipes, "p_nom_min"] = 0.0 +def disable_grid_expansion_if_LV_limit_hit(n): + if not "lv_limit" in n.global_constraints.index: + return + + #calculate minimum LV + attr = "nom_min" + dc = n.links.index[n.links.carrier == "DC"] + tot = (n.lines["s_" + attr]*n.lines["length"]).sum() + (n.links.loc[dc,"p_" + attr]*n.links.loc[dc,"length"]).sum() + + diff = n.global_constraints.at["lv_limit","constant"]-tot + + #allow small numerical differences + limit = 1 + + if diff < limit: + logger.info(f"LV is already reached (gap {diff}), disabling expansion and LV limit") + expandable_acs = n.lines.index[n.lines.s_nom_extendable] + n.lines.loc[expandable_acs,"s_nom_extendable"] = False + n.lines.loc[expandable_acs,"s_nom"] = n.lines.loc[expandable_acs,"s_nom_min"] + + expandable_dcs = n.links.index[n.links.p_nom_extendable & (n.links.carrier == "DC")] + n.links.loc[expandable_dcs,"p_nom_extendable"] = False + n.links.loc[expandable_dcs,"p_nom"] = n.links.loc[expandable_dcs,"p_nom_min"] + + n.global_constraints.drop("lv_limit", + inplace=True) if __name__ == "__main__": if "snakemake" not in globals(): @@ -150,5 +176,7 @@ if __name__ == "__main__": add_brownfield(n, n_p, year) + disable_grid_expansion_if_LV_limit_hit(n) + n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) n.export_to_netcdf(snakemake.output[0]) From 42f11752caa06a57f3b4bde2de24f0d5e5e95255 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 13:35:11 +0100 Subject: [PATCH 153/497] standardise formatting --- scripts/add_brownfield.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index fb1453fd..ffdaf46b 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -119,32 +119,39 @@ def add_brownfield(n, n_p, year): n.links.loc[new_pipes, "p_nom"] = 0.0 n.links.loc[new_pipes, "p_nom_min"] = 0.0 + def disable_grid_expansion_if_LV_limit_hit(n): if not "lv_limit" in n.global_constraints.index: return - #calculate minimum LV + # calculate minimum LV attr = "nom_min" dc = n.links.index[n.links.carrier == "DC"] - tot = (n.lines["s_" + attr]*n.lines["length"]).sum() + (n.links.loc[dc,"p_" + attr]*n.links.loc[dc,"length"]).sum() + tot = (n.lines["s_" + attr] * n.lines["length"]).sum() + ( + n.links.loc[dc, "p_" + attr] * n.links.loc[dc, "length"] + ).sum() - diff = n.global_constraints.at["lv_limit","constant"]-tot + diff = n.global_constraints.at["lv_limit", "constant"] - tot - #allow small numerical differences + # allow small numerical differences limit = 1 if diff < limit: - logger.info(f"LV is already reached (gap {diff}), disabling expansion and LV limit") + logger.info( + f"LV is already reached (gap {diff}), disabling expansion and LV limit" + ) expandable_acs = n.lines.index[n.lines.s_nom_extendable] - n.lines.loc[expandable_acs,"s_nom_extendable"] = False - n.lines.loc[expandable_acs,"s_nom"] = n.lines.loc[expandable_acs,"s_nom_min"] + n.lines.loc[expandable_acs, "s_nom_extendable"] = False + n.lines.loc[expandable_acs, "s_nom"] = n.lines.loc[expandable_acs, "s_nom_min"] - expandable_dcs = n.links.index[n.links.p_nom_extendable & (n.links.carrier == "DC")] - n.links.loc[expandable_dcs,"p_nom_extendable"] = False - n.links.loc[expandable_dcs,"p_nom"] = n.links.loc[expandable_dcs,"p_nom_min"] + expandable_dcs = n.links.index[ + n.links.p_nom_extendable & (n.links.carrier == "DC") + ] + n.links.loc[expandable_dcs, "p_nom_extendable"] = False + n.links.loc[expandable_dcs, "p_nom"] = n.links.loc[expandable_dcs, "p_nom_min"] + + n.global_constraints.drop("lv_limit", inplace=True) - n.global_constraints.drop("lv_limit", - inplace=True) if __name__ == "__main__": if "snakemake" not in globals(): From deba2a4ed53163ade07d2ba7a64c4f928ae10c72 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 13:41:42 +0100 Subject: [PATCH 154/497] tidy code --- scripts/add_brownfield.py | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index ffdaf46b..9ddd3d99 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -124,31 +124,25 @@ def disable_grid_expansion_if_LV_limit_hit(n): if not "lv_limit" in n.global_constraints.index: return - # calculate minimum LV - attr = "nom_min" - dc = n.links.index[n.links.carrier == "DC"] - tot = (n.lines["s_" + attr] * n.lines["length"]).sum() + ( - n.links.loc[dc, "p_" + attr] * n.links.loc[dc, "length"] + total_expansion = ( + n.lines.eval("s_nom_min * length").sum() + + n.links.query("carrier == 'DC'").eval("p_nom_min * length").sum() ).sum() - diff = n.global_constraints.at["lv_limit", "constant"] - tot + lv_limit = n.global_constraints.at["lv_limit", "constant"] # allow small numerical differences - limit = 1 - - if diff < limit: + if lv_limit - total_expansion < 1: logger.info( - f"LV is already reached (gap {diff}), disabling expansion and LV limit" + f"LV is already reached (gap {diff} MWkm), disabling expansion and LV limit" ) - expandable_acs = n.lines.index[n.lines.s_nom_extendable] - n.lines.loc[expandable_acs, "s_nom_extendable"] = False - n.lines.loc[expandable_acs, "s_nom"] = n.lines.loc[expandable_acs, "s_nom_min"] + extendable_acs = n.lines.query("s_nom_extendable").index + n.lines.loc[extendable_acs, "s_nom_extendable"] = False + n.lines.loc[extendable_acs, "s_nom"] = n.lines.loc[extendable_acs, "s_nom_min"] - expandable_dcs = n.links.index[ - n.links.p_nom_extendable & (n.links.carrier == "DC") - ] - n.links.loc[expandable_dcs, "p_nom_extendable"] = False - n.links.loc[expandable_dcs, "p_nom"] = n.links.loc[expandable_dcs, "p_nom_min"] + extendable_dcs = n.links.query("carrier == 'DC' and p_nom_extendable").index + n.links.loc[extendable_dcs, "p_nom_extendable"] = False + n.links.loc[extendable_dcs, "p_nom"] = n.links.loc[extendable_dcs, "p_nom_min"] n.global_constraints.drop("lv_limit", inplace=True) From 257b16efd8efae8848171083c1d4c04ab4af9579 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 13:47:13 +0100 Subject: [PATCH 155/497] print IIS if solver returns status infeasible --- scripts/solve_network.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index ff2a2f23..8c46e025 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -839,6 +839,9 @@ def solve_network(n, config, solving, opts="", **kwargs): f"Solving status '{status}' with termination condition '{condition}'" ) if "infeasible" in condition: + labels = n.model.compute_infeasibilities() + logger.info("Labels:\n" + labels) + n.model.print_infeasibilities() raise RuntimeError("Solving status 'infeasible'") return n From 2acddb6a7ccf1c6d30bcf8d452e7c2bd61a7a36c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 13:48:34 +0100 Subject: [PATCH 156/497] add release note --- doc/release_notes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 5ac7925e..31e492a8 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -81,6 +81,9 @@ Upcoming Release * Remove HELMETH option. +* Print Irreducible Infeasible Subset (IIS) if model is infeasible. Only for + solvers with IIS support. + **Bugs and Compatibility** * A bug preventing custom powerplants specified in ``data/custom_powerplants.csv`` was fixed. (https://github.com/PyPSA/pypsa-eur/pull/732) From ecd85d23d317e1acf106bf1a2b28c82fff77a275 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 15:01:43 +0100 Subject: [PATCH 157/497] add option to use LUISA land coverage data --- config/config.default.yaml | 7 ++++ doc/configtables/offwind-ac.csv | 1 + doc/configtables/offwind-dc.csv | 1 + doc/configtables/onwind.csv | 4 ++ doc/configtables/solar.csv | 1 + doc/release_notes.rst | 10 +++++ rules/build_electricity.smk | 5 +++ rules/retrieve.smk | 16 +++++++ scripts/build_renewable_profiles.py | 65 +++++++++++++++++------------ 9 files changed, 84 insertions(+), 26 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 74844ec0..eddd0271 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -165,6 +165,10 @@ renewable: grid_codes: [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32] distance: 1000 distance_grid_codes: [1, 2, 3, 4, 5, 6] + luisa: false + # grid_codes: [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242] + # distance: 1000 + # distance_grid_codes: [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242] natura: true excluder_resolution: 100 clip_p_max_pu: 1.e-2 @@ -177,6 +181,7 @@ renewable: capacity_per_sqkm: 2 correction_factor: 0.8855 corine: [44, 255] + luisa: false # [0, 5230] natura: true ship_threshold: 400 max_depth: 50 @@ -192,6 +197,7 @@ renewable: capacity_per_sqkm: 2 correction_factor: 0.8855 corine: [44, 255] + luisa: false # [0, 5230] natura: true ship_threshold: 400 max_depth: 50 @@ -209,6 +215,7 @@ renewable: capacity_per_sqkm: 1.7 # correction_factor: 0.854337 corine: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 31, 32] + luisa: false # [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242, 1310, 1320, 1330, 1410, 1421, 1422, 2110, 2120, 2130, 2210, 2220, 2230, 2310, 2410, 2420, 3210, 3320, 3330] natura: true excluder_resolution: 100 clip_p_max_pu: 1.e-2 diff --git a/doc/configtables/offwind-ac.csv b/doc/configtables/offwind-ac.csv index c3512a9e..9dc0614c 100644 --- a/doc/configtables/offwind-ac.csv +++ b/doc/configtables/offwind-ac.csv @@ -7,6 +7,7 @@ capacity_per_sqkm,:math:`MW/km^2`,float,"Allowable density of wind turbine place correction_factor,--,float,"Correction factor for capacity factor time series." excluder_resolution,m,float,"Resolution on which to perform geographical elibility analysis." corine,--,"Any *realistic* subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes which are generally eligible for AC-connected offshore wind turbine placement." +luisa,--,"Any subset of the `LUISA Base Map codes in Annex 1 `_","Specifies areas according to the LUISA Base Map codes which are generally eligible for AC-connected offshore wind turbine placement." natura,bool,"{true, false}","Switch to exclude `Natura 2000 `_ natural protection areas. Area is excluded if ``true``." ship_threshold,--,float,"Ship density threshold from which areas are excluded." max_depth,m,float,"Maximum sea water depth at which wind turbines can be build. Maritime areas with deeper waters are excluded in the process of calculating the AC-connected offshore wind potential." diff --git a/doc/configtables/offwind-dc.csv b/doc/configtables/offwind-dc.csv index 35095597..c947f358 100644 --- a/doc/configtables/offwind-dc.csv +++ b/doc/configtables/offwind-dc.csv @@ -7,6 +7,7 @@ capacity_per_sqkm,:math:`MW/km^2`,float,"Allowable density of wind turbine place correction_factor,--,float,"Correction factor for capacity factor time series." excluder_resolution,m,float,"Resolution on which to perform geographical elibility analysis." corine,--,"Any *realistic* subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes which are generally eligible for AC-connected offshore wind turbine placement." +luisa,--,"Any subset of the `LUISA Base Map codes in Annex 1 `_","Specifies areas according to the LUISA Base Map codes which are generally eligible for DC-connected offshore wind turbine placement." natura,bool,"{true, false}","Switch to exclude `Natura 2000 `_ natural protection areas. Area is excluded if ``true``." ship_threshold,--,float,"Ship density threshold from which areas are excluded." max_depth,m,float,"Maximum sea water depth at which wind turbines can be build. Maritime areas with deeper waters are excluded in the process of calculating the AC-connected offshore wind potential." diff --git a/doc/configtables/onwind.csv b/doc/configtables/onwind.csv index b7e823b3..f6b36e5d 100644 --- a/doc/configtables/onwind.csv +++ b/doc/configtables/onwind.csv @@ -8,6 +8,10 @@ corine,,, -- grid_codes,--,"Any subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes which are generally eligible for wind turbine placement." -- distance,m,float,"Distance to keep from areas specified in ``distance_grid_codes``" -- distance_grid_codes,--,"Any subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes to which wind turbines must maintain a distance specified in the setting ``distance``." +luisa,,, +-- grid_codes,--,"Any subset of the `LUISA Base Map codes in Annex 1 `_","Specifies areas according to the LUISA Base Map codes which are generally eligible for wind turbine placement." +-- distance,m,float,"Distance to keep from areas specified in ``distance_grid_codes``" +-- distance_grid_codes,--,"Any subset of the `LUISA Base Map codes in Annex 1 `_","Specifies areas according to the LUISA Base Map codes to which wind turbines must maintain a distance specified in the setting ``distance``." natura,bool,"{true, false}","Switch to exclude `Natura 2000 `_ natural protection areas. Area is excluded if ``true``." clip_p_max_pu,p.u.,float,"To avoid too small values in the renewables` per-unit availability time series values below this threshold are set to zero." correction_factor,--,float,"Correction factor for capacity factor time series." diff --git a/doc/configtables/solar.csv b/doc/configtables/solar.csv index 7da1281b..8328d342 100644 --- a/doc/configtables/solar.csv +++ b/doc/configtables/solar.csv @@ -9,6 +9,7 @@ resource,,, capacity_per_sqkm,:math:`MW/km^2`,float,"Allowable density of solar panel placement." correction_factor,--,float,"A correction factor for the capacity factor (availability) time series." corine,--,"Any subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes which are generally eligible for solar panel placement." +luisa,--,"Any subset of the `LUISA Base Map codes in Annex 1 `_","Specifies areas according to the LUISA Base Map codes which are generally eligible for solar panel placement." natura,bool,"{true, false}","Switch to exclude `Natura 2000 `_ natural protection areas. Area is excluded if ``true``." clip_p_max_pu,p.u.,float,"To avoid too small values in the renewables` per-unit availability time series values below this threshold are set to zero." excluder_resolution,m,float,"Resolution on which to perform geographical elibility analysis." diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 31e492a8..a1eb644e 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -84,6 +84,16 @@ Upcoming Release * Print Irreducible Infeasible Subset (IIS) if model is infeasible. Only for solvers with IIS support. +* Add option to use `LUISA Base Map + `_ 50m land + coverage dataset for land eligibility analysis in + :mod:`build_renewable_profiles`. Settings are analogous to the CORINE dataset + but with the key ``luisa:`` in the configuration file. To leverage the + dataset's full advantages, set the excluder resolution to 50m + (``excluder_resolution: 50``). For land category codes, see `Annex 1 of the + technical documentation + `_. + **Bugs and Compatibility** * A bug preventing custom powerplants specified in ``data/custom_powerplants.csv`` was fixed. (https://github.com/PyPSA/pypsa-eur/pull/732) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 6308552f..055cffca 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -268,6 +268,11 @@ rule build_renewable_profiles: if config["renewable"][w.technology]["natura"] else [] ), + luisa=lambda w: ( + "data/LUISA_basemap_020321_50m.tif" + if config["renewable"][w.technology].get("luisa") + else [] + ), gebco=ancient( lambda w: ( "data/bundle/GEBCO_2014_2D.nc" diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 4ded2a46..99ce344e 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -249,6 +249,22 @@ if config["enable"]["retrieve"]: validate_checksum(output[0], input[0]) +if config["enable"]["retrieve"]: + + # Downloading LUISA Base Map for land cover and land use: + # Website: https://ec.europa.eu/jrc/en/luisa + rule retrieve_luisa_land_cover: + input: + HTTP.remote( + "jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/LUISA/EUROPE/Basemaps/LandUse/2018/LATEST/LUISA_basemap_020321_50m.tif", + static=True + ) + output: + "data/LUISA_basemap_020321_50m.tif" + run: + move(input[0], output[0]) + + if config["enable"]["retrieve"]: # Some logic to find the correct file URL # Sometimes files are released delayed or ahead of schedule, check which file is currently available diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index c579f588..60c11921 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -7,10 +7,10 @@ """ Calculates for each network node the (i) installable capacity (based on land- use), (ii) the available generation time series (based on weather data), and -(iii) the average distance from the node for onshore wind, AC-connected -offshore wind, DC-connected offshore wind and solar PV generators. In addition -for offshore wind it calculates the fraction of the grid connection which is -under water. +(iii) the average distance from the node for onshore wind, AC-connected offshore +wind, DC-connected offshore wind and solar PV generators. In addition for +offshore wind it calculates the fraction of the grid connection which is under +water. .. note:: Hydroelectric profiles are built in script :mod:`build_hydro_profiles`. @@ -26,7 +26,7 @@ Relevant settings renewable: {technology}: - cutout: corine: grid_codes: distance: natura: max_depth: + cutout: corine: luisa: grid_codes: distance: natura: max_depth: max_shore_distance: min_shore_distance: capacity_per_sqkm: correction_factor: min_p_max_pu: clip_p_max_pu: resource: @@ -40,11 +40,18 @@ Inputs - ``data/bundle/corine/g250_clc06_V18_5.tif``: `CORINE Land Cover (CLC) `_ inventory on `44 classes `_ of - land use (e.g. forests, arable land, industrial, urban areas). + land use (e.g. forests, arable land, industrial, urban areas) at 100m + resolution. .. image:: img/corine.png :scale: 33 % +- ``data/LUISA_basemap_020321_50m.tif``: `LUISA Base Map + `_ land + coverage dataset at 50m resolution similar to CORINE. For codes in relation to + CORINE land cover, see `Annex 1 of the technical documentation + `_. + - ``data/bundle/GEBCO_2014_2D.nc``: A `bathymetric `_ data set with a global terrain model for ocean and land at 15 arc-second intervals by the `General @@ -133,9 +140,10 @@ of a combination of the available land at each grid cell and the capacity factor there. First the script computes how much of the technology can be installed at each -cutout grid cell and each node using the `GLAES -`_ library. This uses the CORINE land use -data, Natura2000 nature reserves and GEBCO bathymetry data. +cutout grid cell and each node using the `atlite +`_ library. This uses the CORINE land use data, +LUISA land use data, Natura2000 nature reserves, GEBCO bathymetry data, and +shipping lanes. .. image:: img/eligibility.png :scale: 50 % @@ -166,10 +174,10 @@ This layout is then used to compute the generation availability time series from the weather data cutout from ``atlite``. The maximal installable potential for the node (`p_nom_max`) is computed by -adding up the installable potentials of the individual grid cells. -If the model comes close to this limit, then the time series may slightly -overestimate production since it is assumed the geographical distribution is -proportional to capacity factor. +adding up the installable potentials of the individual grid cells. If the model +comes close to this limit, then the time series may slightly overestimate +production since it is assumed the geographical distribution is proportional to +capacity factor. """ import functools import logging @@ -203,9 +211,6 @@ if __name__ == "__main__": correction_factor = params.get("correction_factor", 1.0) capacity_per_sqkm = params["capacity_per_sqkm"] - if isinstance(params.get("corine", {}), list): - params["corine"] = {"grid_codes": params["corine"]} - if correction_factor != 1.0: logger.info(f"correction_factor is set as {correction_factor}") @@ -231,16 +236,24 @@ if __name__ == "__main__": if params["natura"]: excluder.add_raster(snakemake.input.natura, nodata=0, allow_no_overlap=True) - corine = params.get("corine", {}) - if "grid_codes" in corine: - codes = corine["grid_codes"] - excluder.add_raster(snakemake.input.corine, codes=codes, invert=True, crs=3035) - if corine.get("distance", 0.0) > 0.0: - codes = corine["distance_grid_codes"] - buffer = corine["distance"] - excluder.add_raster( - snakemake.input.corine, codes=codes, buffer=buffer, crs=3035 - ) + for landuse in ["corine", "luisa"]: + kwargs = {"nodata": 0} if landuse == "luisa" else {} + landuse = params.get(landuse, {}) + if not landuse: + continue + if isinstance(landuse, list): + landuse = {"grid_codes": landuse} + if "grid_codes" in landuse: + codes = landuse["grid_codes"] + excluder.add_raster( + snakemake.input[landuse], codes=codes, invert=True, crs=3035, **kwargs + ) + if landuse.get("distance", 0.0) > 0.0: + codes = landuse["distance_grid_codes"] + buffer = landuse["distance"] + excluder.add_raster( + snakemake.input[landuse], codes=codes, buffer=buffer, crs=3035, **kwargs + ) if params.get("ship_threshold"): shipping_threshold = ( From 045eeba4cfc17500c9740706c60c9f61fc4a3a68 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 14:02:24 +0000 Subject: [PATCH 158/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/retrieve.smk | 6 +++--- scripts/build_renewable_profiles.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 99ce344e..e062091e 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -257,10 +257,10 @@ if config["enable"]["retrieve"]: input: HTTP.remote( "jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/LUISA/EUROPE/Basemaps/LandUse/2018/LATEST/LUISA_basemap_020321_50m.tif", - static=True - ) + static=True, + ), output: - "data/LUISA_basemap_020321_50m.tif" + "data/LUISA_basemap_020321_50m.tif", run: move(input[0], output[0]) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 60c11921..d4cab19d 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -7,10 +7,10 @@ """ Calculates for each network node the (i) installable capacity (based on land- use), (ii) the available generation time series (based on weather data), and -(iii) the average distance from the node for onshore wind, AC-connected offshore -wind, DC-connected offshore wind and solar PV generators. In addition for -offshore wind it calculates the fraction of the grid connection which is under -water. +(iii) the average distance from the node for onshore wind, AC-connected +offshore wind, DC-connected offshore wind and solar PV generators. In addition +for offshore wind it calculates the fraction of the grid connection which is +under water. .. note:: Hydroelectric profiles are built in script :mod:`build_hydro_profiles`. From 94f4383e0289e2b81e9edc20e21f18910156f0e6 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 15:22:13 +0100 Subject: [PATCH 159/497] distinguish dataset name and dataset settings --- scripts/build_renewable_profiles.py | 35 ++++++++++++++++------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index d4cab19d..b58482ae 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -236,23 +236,28 @@ if __name__ == "__main__": if params["natura"]: excluder.add_raster(snakemake.input.natura, nodata=0, allow_no_overlap=True) - for landuse in ["corine", "luisa"]: - kwargs = {"nodata": 0} if landuse == "luisa" else {} - landuse = params.get(landuse, {}) - if not landuse: - continue - if isinstance(landuse, list): - landuse = {"grid_codes": landuse} - if "grid_codes" in landuse: - codes = landuse["grid_codes"] - excluder.add_raster( - snakemake.input[landuse], codes=codes, invert=True, crs=3035, **kwargs + for dataset in ["corine", "luisa"]: + kwargs = {"nodata": 0} if dataset == "luisa" else {} + if dataset == "luisa" and res > 50: + logger.info( + "LUISA data is available at 50m resolution, " + f"but coarser {res}m resolution is used." ) - if landuse.get("distance", 0.0) > 0.0: - codes = landuse["distance_grid_codes"] - buffer = landuse["distance"] + settings = params.get(dataset, {}) + if not settings: + continue + if isinstance(settings, list): + settings = {"grid_codes": settings} + if "grid_codes" in settings: + codes = settings["grid_codes"] excluder.add_raster( - snakemake.input[landuse], codes=codes, buffer=buffer, crs=3035, **kwargs + snakemake.input[dataset], codes=codes, invert=True, crs=3035, **kwargs + ) + if settings.get("distance", 0.0) > 0.0: + codes = settings["distance_grid_codes"] + buffer = settings["distance"] + excluder.add_raster( + snakemake.input[dataset], codes=codes, buffer=buffer, crs=3035, **kwargs ) if params.get("ship_threshold"): From 1a6031f318aab522d3356c2bb4ef314b3eed76d2 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 3 Jan 2024 15:25:27 +0100 Subject: [PATCH 160/497] only copy config.default.yaml if it exists --- Snakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Snakefile b/Snakefile index 83530df7..14ce0e40 100644 --- a/Snakefile +++ b/Snakefile @@ -14,7 +14,7 @@ from snakemake.utils import min_version min_version("7.7") -if not exists("config/config.yaml"): +if not exists("config/config.yaml") and exists("config/config.default.yaml"): copyfile("config/config.default.yaml", "config/config.yaml") From d145758fb7ff4bf126ddada8eec6d8f942c93f4f Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 09:00:31 +0100 Subject: [PATCH 161/497] gracefully handle absent extra_functionality file; add file to path --- rules/common.smk | 7 +++++++ rules/solve_electricity.smk | 4 +--- rules/solve_myopic.smk | 4 +--- rules/solve_overnight.smk | 5 +---- rules/solve_perfect.smk | 4 +--- scripts/solve_network.py | 2 ++ 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 2c8cf69c..44e3a807 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -28,6 +28,13 @@ def memory(w): return int(factor * (10000 + 195 * int(w.clusters))) +def input_custom_extra_functionality(w): + path = config["solving"]["options"].get("custom_extra_functionality", False) + if path: + return workflow.source_path(path) + return [] + + # Check if the workflow has access to the internet by trying to access the HEAD of specified url def has_internet_access(url="www.zenodo.org") -> bool: import http.client as http_client diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index 2c956097..7f6092be 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -11,9 +11,7 @@ rule solve_network: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), - custom_extra_functionality=workflow.source_path( - config["solving"]["options"].get("custom_extra_functionality", "") - ), + custom_extra_functionality=input_custom_extra_functionality, input: network=RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", config=RESULTS + "config.yaml", diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index afa8ad2c..7ca8857d 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -88,9 +88,7 @@ rule solve_sector_network_myopic: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), - custom_extra_functionality=workflow.source_path( - config["solving"]["options"].get("custom_extra_functionality", "") - ), + custom_extra_functionality=input_custom_extra_functionality, input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index fc2f74df..8686b205 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT - rule solve_sector_network: params: solving=config["solving"], @@ -11,9 +10,7 @@ rule solve_sector_network: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), - custom_extra_functionality=workflow.source_path( - config["solving"]["options"].get("custom_extra_functionality", "") - ), + custom_extra_functionality=input_custom_extra_functionality, input: network=RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 63be5cc1..a7856fa9 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -118,9 +118,7 @@ rule solve_sector_network_perfect: co2_sequestration_potential=config["sector"].get( "co2_sequestration_potential", 200 ), - custom_extra_functionality=workflow.source_path( - config["solving"]["options"].get("custom_extra_functionality", "") - ), + custom_extra_functionality=input_custom_extra_functionality, input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 5a045577..2f170dff 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -30,6 +30,7 @@ import importlib import logging import os import re +import sys import numpy as np import pandas as pd @@ -831,6 +832,7 @@ def extra_functionality(n, snapshots): if snakemake.params.custom_extra_functionality: source_path = snakemake.params.custom_extra_functionality assert os.path.exists(source_path), f"{source_path} does not exist" + sys.path.append(os.path.dirname(source_path)) module_name = os.path.splitext(os.path.basename(source_path))[0] module = importlib.import_module(module_name) module.custom_extra_functionality(n, snapshots) From 60493fc55829ddc95bd8d55d35b0f505cef5f624 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 08:01:00 +0000 Subject: [PATCH 162/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/solve_overnight.smk | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 8686b205..a3fed042 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT + rule solve_sector_network: params: solving=config["solving"], From ab1d93279a76fe2608183ca0ed2968514ce0b3fb Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 09:19:29 +0100 Subject: [PATCH 163/497] move LUISA resolution info to a later point --- scripts/build_renewable_profiles.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index b58482ae..b736f68a 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -238,14 +238,14 @@ if __name__ == "__main__": for dataset in ["corine", "luisa"]: kwargs = {"nodata": 0} if dataset == "luisa" else {} + settings = params.get(dataset, {}) + if not settings: + continue if dataset == "luisa" and res > 50: logger.info( "LUISA data is available at 50m resolution, " f"but coarser {res}m resolution is used." ) - settings = params.get(dataset, {}) - if not settings: - continue if isinstance(settings, list): settings = {"grid_codes": settings} if "grid_codes" in settings: From f451e28f582f970a5b4f3a8336d99c89c67429bb Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 11:42:24 +0100 Subject: [PATCH 164/497] add release notes and documentation --- doc/configtables/sector.csv | 2 ++ doc/release_notes.rst | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 938c120a..5e2514e4 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -79,6 +79,8 @@ hydrogen_fuel_cell,--,"{true, false}",Add option to include hydrogen fuel cell f hydrogen_turbine,--,"{true, false}",Add option to include hydrogen turbine for re-electrification. Assuming OCGT technology costs SMR,--,"{true, false}",Add option for transforming natural gas into hydrogen and CO2 using Steam Methane Reforming (SMR) SMR CC,--,"{true, false}",Add option for transforming natural gas into hydrogen and CO2 using Steam Methane Reforming (SMR) and Carbon Capture (CC) +regional_methanol_demand,--,"{true, false}",Spatially resolve methanol demand. Set to true if regional CO2 constraints needed. +regional_oil_demand,--,"{true, false}",Spatially resolve oil demand. Set to true if regional CO2 constraints needed. regional_co2 _sequestration_potential,,, -- enable,--,"{true, false}",Add option for regionally-resolved geological carbon dioxide sequestration potentials based on `CO2StoP `_. -- attribute,--,string,Name of the attribute for the sequestration potential diff --git a/doc/release_notes.rst b/doc/release_notes.rst index bb9732de..03d9318d 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,23 @@ Release Notes Upcoming Release ================ +* Remove all negative loads on the ``co2 atmosphere`` bus representing emissions + for e.g. fixed fossil demands for transport oil. Instead these are handled + more transparently with a fixed transport oil demand and a link taking care of + the emissions to the ``co2 atmosphere`` bus. This is also a preparation for + endogenous transport optimisation, where demand will be subject to + optimisation (e.g. fuel switching in the transport sector). + +* Allow possibility to go from copperplated to regionally resolved methanol and + oil demand with switches ``sector: regional_methanol_demand: true`` and + ``sector: regional_oil_demand: true``. This allows nodal/regional CO2 + constraints to be applied. + +* Process emissions from steam crackers (i.e. naphtha processing for HVC) are now + piped from the consumption link to the process emissions bus where the model + can decide about carbon capture. Previously the process emissions for naphtha + were a fixed load. + * Add option to specify losses for bidirectional links, e.g. pipelines or HVDC links, in configuration file under ``sector: transmission_efficiency:``. Users can specify static or length-dependent values as well as a length-dependent From addaecf77a7048955f49905c2b2f54371d3fd3a3 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 12:43:55 +0100 Subject: [PATCH 165/497] move comments to documentation --- config/config.default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 57416cc7..9e8f57a6 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -463,8 +463,8 @@ sector: hydrogen_turbine: false SMR: true SMR_cc: true - regional_methanol_demand: false #set to true if regional CO2 constraints needed - regional_oil_demand: false #set to true if regional CO2 constraints needed + regional_methanol_demand: false + regional_oil_demand: false regional_co2_sequestration_potential: enable: false attribute: 'conservative estimate Mt' From 593995675e43d860c120b568ab19f8ffade31b32 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 12:44:47 +0100 Subject: [PATCH 166/497] gurobi: avoid double-logging to console --- scripts/solve_network.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 2f170dff..ecf56a24 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -854,6 +854,9 @@ def solve_network(n, config, solving, opts="", **kwargs): ) kwargs["assign_all_duals"] = cf_solving.get("assign_all_duals", False) + if kwargs["solver_name"] == "gurobi": + logging.getLogger('gurobipy').setLevel(logging.CRITICAL) + rolling_horizon = cf_solving.pop("rolling_horizon", False) skip_iterations = cf_solving.pop("skip_iterations", False) if not n.lines.s_nom_extendable.any(): From 8054ad382c3cc3806c7ec808137206358f77d888 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 12:47:26 +0100 Subject: [PATCH 167/497] prepare_sector_network: simplify process emissions with outsourced feedstock emissions --- scripts/prepare_sector_network.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index e211be15..ea0c4f3f 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2996,16 +2996,14 @@ def add_industry(n, costs): unit="t_co2", ) - sel = ["process emission"] if options["co2_spatial"] or options["co2network"]: p_set = ( - -industrial_demand.loc[nodes, sel] - .sum(axis=1) + -industrial_demand.loc[nodes, "process emission"] .rename(index=lambda x: x + " process emissions") / nhours ) else: - p_set = -industrial_demand.loc[nodes, sel].sum(axis=1).sum() / nhours + p_set = -industrial_demand.loc[nodes, "process emission"].sum() / nhours n.madd( "Load", From cfd689bbec29fad829cef8d2e6b1fdf89fd2ebea Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 13:03:03 +0100 Subject: [PATCH 168/497] add snakemake object to custom_extra_functionality arguments --- data/custom_extra_functionality.py | 2 +- scripts/solve_network.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/custom_extra_functionality.py b/data/custom_extra_functionality.py index 0ac24cea..e7a9df0f 100644 --- a/data/custom_extra_functionality.py +++ b/data/custom_extra_functionality.py @@ -4,7 +4,7 @@ # SPDX-License-Identifier: MIT -def custom_extra_functionality(n, snapshots): +def custom_extra_functionality(n, snapshots, snakemake): """ Add custom extra functionality constraints. """ diff --git a/scripts/solve_network.py b/scripts/solve_network.py index ecf56a24..4b988666 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -835,7 +835,7 @@ def extra_functionality(n, snapshots): sys.path.append(os.path.dirname(source_path)) module_name = os.path.splitext(os.path.basename(source_path))[0] module = importlib.import_module(module_name) - module.custom_extra_functionality(n, snapshots) + module.custom_extra_functionality(n, snapshots, snakemake) def solve_network(n, config, solving, opts="", **kwargs): From 34535bcbffd5506faeaba7c8ada546e29f00c7eb Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 13:08:14 +0100 Subject: [PATCH 169/497] custom_extra_functionality: assume same function name as file name --- scripts/solve_network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 4b988666..203d8b0f 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -835,7 +835,8 @@ def extra_functionality(n, snapshots): sys.path.append(os.path.dirname(source_path)) module_name = os.path.splitext(os.path.basename(source_path))[0] module = importlib.import_module(module_name) - module.custom_extra_functionality(n, snapshots, snakemake) + custom_extra_functionality = getattr(module, module_name) + custom_extra_functionality(n, snapshots, snakemake) def solve_network(n, config, solving, opts="", **kwargs): From c3bcaee1a22a888d2ba1147ed643fbf7607ffa86 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 13:37:35 +0100 Subject: [PATCH 170/497] common.smk: find _helpers.py also if pypsa-eur is used as module --- rules/common.smk | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 44e3a807..0e85b620 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -2,9 +2,14 @@ # # SPDX-License-Identifier: MIT -import os, sys +import os, sys, glob + +helper_source_path = [match for match in glob.glob('**/_helpers.py', recursive=True)] + +for path in helper_source_path: + path = os.path.dirname(os.path.abspath(path)) + sys.path.insert(0, os.path.abspath(path)) -sys.path.insert(0, os.path.abspath("scripts")) from _helpers import validate_checksum From 817995c8a25dfc2f152c817fc383944860db0939 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:39:28 +0000 Subject: [PATCH 171/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/common.smk | 2 +- scripts/prepare_sector_network.py | 5 +++-- scripts/solve_network.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 0e85b620..2298ff91 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -4,7 +4,7 @@ import os, sys, glob -helper_source_path = [match for match in glob.glob('**/_helpers.py', recursive=True)] +helper_source_path = [match for match in glob.glob("**/_helpers.py", recursive=True)] for path in helper_source_path: path = os.path.dirname(os.path.abspath(path)) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index f80c72f5..0fb9729a 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3013,8 +3013,9 @@ def add_industry(n, costs): if options["co2_spatial"] or options["co2network"]: p_set = ( - -industrial_demand.loc[nodes, "process emission"] - .rename(index=lambda x: x + " process emissions") + -industrial_demand.loc[nodes, "process emission"].rename( + index=lambda x: x + " process emissions" + ) / nhours ) else: diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 203d8b0f..aa802ea8 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -856,7 +856,7 @@ def solve_network(n, config, solving, opts="", **kwargs): kwargs["assign_all_duals"] = cf_solving.get("assign_all_duals", False) if kwargs["solver_name"] == "gurobi": - logging.getLogger('gurobipy').setLevel(logging.CRITICAL) + logging.getLogger("gurobipy").setLevel(logging.CRITICAL) rolling_horizon = cf_solving.pop("rolling_horizon", False) skip_iterations = cf_solving.pop("skip_iterations", False) From 29a95dc997efd4f4e381b3ee800c5f98208917d5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 16:02:02 +0100 Subject: [PATCH 172/497] default to approximating transmission losses in HVAC lines --- config/config.default.yaml | 2 +- doc/release_notes.rst | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 9e8f57a6..7f1f2034 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -654,7 +654,7 @@ solving: track_iterations: false min_iterations: 4 max_iterations: 6 - transmission_losses: 0 + transmission_losses: 2 linearized_unit_commitment: true horizon: 365 diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 03d9318d..09417727 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,9 @@ Release Notes Upcoming Release ================ +* Default to approximating transmission losses in HVAC lines + (``transmission_losses: 2``). + * Remove all negative loads on the ``co2 atmosphere`` bus representing emissions for e.g. fixed fossil demands for transport oil. Instead these are handled more transparently with a fixed transport oil demand and a link taking care of From 73abb6196796ae0d741050f5cfe333b8c02cd768 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 17:05:54 +0100 Subject: [PATCH 173/497] add_brownfield: fix lv_limit reached --- scripts/add_brownfield.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 9ddd3d99..e151c441 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -134,7 +134,7 @@ def disable_grid_expansion_if_LV_limit_hit(n): # allow small numerical differences if lv_limit - total_expansion < 1: logger.info( - f"LV is already reached (gap {diff} MWkm), disabling expansion and LV limit" + f"LV is already reached, disabling expansion and LV limit" ) extendable_acs = n.lines.query("s_nom_extendable").index n.lines.loc[extendable_acs, "s_nom_extendable"] = False From 29b24b1b414b33685e91840bfd5b12da5b13ec3f Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 18:42:47 +0100 Subject: [PATCH 174/497] segmentation_clustering: log distribution of snapshot durations --- scripts/prepare_sector_network.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index ea0c4f3f..8c93ba5a 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3481,6 +3481,7 @@ def apply_time_segmentation( sn_weightings = pd.Series( weightings, index=snapshots, name="weightings", dtype="float64" ) + logger.info("Distribution of snapshot durations:\n", weightings.value_counts()) n.set_snapshots(sn_weightings.index) n.snapshot_weightings = n.snapshot_weightings.mul(sn_weightings, axis=0) From cf5f3cbd88dc90da3767bdbb7e84840fb5a76290 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 18:54:49 +0100 Subject: [PATCH 175/497] segmentation_clustering: log distribution of snapshot durations (fix) --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8c93ba5a..62bfa80a 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3481,7 +3481,7 @@ def apply_time_segmentation( sn_weightings = pd.Series( weightings, index=snapshots, name="weightings", dtype="float64" ) - logger.info("Distribution of snapshot durations:\n", weightings.value_counts()) + logger.info(f"Distribution of snapshot durations:\n{weightings.value_counts()}") n.set_snapshots(sn_weightings.index) n.snapshot_weightings = n.snapshot_weightings.mul(sn_weightings, axis=0) From 9530d63e551f1cc19dd6847f10902fec3d59da0f Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 18:57:09 +0100 Subject: [PATCH 176/497] cluster_heat_buses: performance boost and tidy code --- scripts/prepare_sector_network.py | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 62bfa80a..26aa50c9 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3332,24 +3332,24 @@ def limit_individual_line_extension(n, maxext): aggregate_dict = { - "p_nom": "sum", - "s_nom": "sum", + "p_nom": pd.Series.sum, + "s_nom": pd.Series.sum, "v_nom": "max", "v_mag_pu_max": "min", "v_mag_pu_min": "max", - "p_nom_max": "sum", - "s_nom_max": "sum", - "p_nom_min": "sum", - "s_nom_min": "sum", + "p_nom_max": pd.Series.sum, + "s_nom_max": pd.Series.sum, + "p_nom_min": pd.Series.sum, + "s_nom_min": pd.Series.sum, "v_ang_min": "max", "v_ang_max": "min", "terrain_factor": "mean", "num_parallel": "sum", "p_set": "sum", "e_initial": "sum", - "e_nom": "sum", - "e_nom_max": "sum", - "e_nom_min": "sum", + "e_nom": pd.Series.sum, + "e_nom_max": pd.Series.sum, + "e_nom_min": pd.Series.sum, "state_of_charge_initial": "sum", "state_of_charge_set": "sum", "inflow": "sum", @@ -3411,13 +3411,10 @@ def cluster_heat_buses(n): pnl = c.pnl agg = define_clustering(pd.Index(pnl.keys()), aggregate_dict) for k in pnl.keys(): - pnl[k].rename( - columns=lambda x: x.replace("residential ", "").replace( - "services ", "" - ), - inplace=True, - ) - pnl[k] = pnl[k].groupby(level=0, axis=1).agg(agg[k], **agg_group_kwargs) + def renamer(s): + return s.replace("residential ", "").replace("services ", "") + + pnl[k] = pnl[k].groupby(renamer, axis=1).agg(agg[k], **agg_group_kwargs) # remove unclustered assets of service/residential to_drop = c.df.index.difference(df.index) From f9fec1a4be62d72ca52934bb9e6be9ca4308cf7f Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 18:58:04 +0100 Subject: [PATCH 177/497] more precise restrictive handling of opts cost adjustment flags --- scripts/prepare_sector_network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 26aa50c9..17eb832d 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3286,7 +3286,8 @@ def remove_h2_network(n): def maybe_adjust_costs_and_potentials(n, opts): for o in opts: - if "+" not in o: + flags = ["+e", "+p", "+m"] + if all(flag not in o for flag in flags): continue oo = o.split("+") carrier_list = np.hstack( From a67c5ea3b71139ed90130767dcf6c3d6fb7eec65 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:03:34 +0100 Subject: [PATCH 178/497] default to full land transport electrification by 2050 --- config/config.default.yaml | 12 ++++++------ doc/release_notes.rst | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 7f1f2034..1e26781d 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -381,14 +381,14 @@ sector: v2g: true land_transport_fuel_cell_share: 2020: 0 - 2030: 0.05 - 2040: 0.1 - 2050: 0.15 + 2030: 0 + 2040: 0 + 2050: 0 land_transport_electric_share: 2020: 0 - 2030: 0.25 - 2040: 0.6 - 2050: 0.85 + 2030: 0.3 + 2040: 0.7 + 2050: 1 land_transport_ice_share: 2020: 1 2030: 0.7 diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 09417727..01833ccc 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,8 @@ Release Notes Upcoming Release ================ +* Default to full electrification of land transport by 2050. + * Default to approximating transmission losses in HVAC lines (``transmission_losses: 2``). From 62bcded8001f2a3ff31b218ab0225594b1adedb3 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:12:04 +0100 Subject: [PATCH 179/497] build_sector.smk: simplify gas infrastructure rules --- rules/build_sector.smk | 126 +++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 68 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index ab8ff4ed..23ea604c 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -67,76 +67,65 @@ rule build_simplified_population_layouts: "../scripts/build_clustered_population_layouts.py" -if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: - - rule build_gas_network: - input: - gas_network="data/gas_network/scigrid-gas/data/IGGIELGN_PipeSegments.geojson", - output: - cleaned_gas_network=RESOURCES + "gas_network.csv", - resources: - mem_mb=4000, - log: - LOGS + "build_gas_network.log", - conda: - "../envs/environment.yaml" - script: - "../scripts/build_gas_network.py" - - rule build_gas_input_locations: - input: - gem=HTTP.remote( - "https://globalenergymonitor.org/wp-content/uploads/2023/07/Europe-Gas-Tracker-2023-03-v3.xlsx", - keep_local=True, - ), - entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson", - storage="data/gas_network/scigrid-gas/data/IGGIELGN_Storages.geojson", - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES - + "regions_offshore_elec_s{simpl}_{clusters}.geojson", - output: - gas_input_nodes=RESOURCES - + "gas_input_locations_s{simpl}_{clusters}.geojson", - gas_input_nodes_simplified=RESOURCES - + "gas_input_locations_s{simpl}_{clusters}_simplified.csv", - resources: - mem_mb=2000, - log: - LOGS + "build_gas_input_locations_s{simpl}_{clusters}.log", - conda: - "../envs/environment.yaml" - script: - "../scripts/build_gas_input_locations.py" - - rule cluster_gas_network: - input: - cleaned_gas_network=RESOURCES + "gas_network.csv", - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES - + "regions_offshore_elec_s{simpl}_{clusters}.geojson", - output: - clustered_gas_network=RESOURCES + "gas_network_elec_s{simpl}_{clusters}.csv", - resources: - mem_mb=4000, - log: - LOGS + "cluster_gas_network_s{simpl}_{clusters}.log", - conda: - "../envs/environment.yaml" - script: - "../scripts/cluster_gas_network.py" - - gas_infrastructure = { - **rules.cluster_gas_network.output, - **rules.build_gas_input_locations.output, - } +rule build_gas_network: + input: + gas_network="data/gas_network/scigrid-gas/data/IGGIELGN_PipeSegments.geojson", + output: + cleaned_gas_network=RESOURCES + "gas_network.csv", + resources: + mem_mb=4000, + log: + LOGS + "build_gas_network.log", + conda: + "../envs/environment.yaml" + script: + "../scripts/build_gas_network.py" -if not (config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]): - # this is effecively an `else` statement which is however not liked by snakefmt +rule build_gas_input_locations: + input: + gem=HTTP.remote( + "https://globalenergymonitor.org/wp-content/uploads/2023/07/Europe-Gas-Tracker-2023-03-v3.xlsx", + keep_local=True, + ), + entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson", + storage="data/gas_network/scigrid-gas/data/IGGIELGN_Storages.geojson", + regions_onshore=RESOURCES + + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions_offshore=RESOURCES + + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + output: + gas_input_nodes=RESOURCES + + "gas_input_locations_s{simpl}_{clusters}.geojson", + gas_input_nodes_simplified=RESOURCES + + "gas_input_locations_s{simpl}_{clusters}_simplified.csv", + resources: + mem_mb=2000, + log: + LOGS + "build_gas_input_locations_s{simpl}_{clusters}.log", + conda: + "../envs/environment.yaml" + script: + "../scripts/build_gas_input_locations.py" - gas_infrastructure = {} + +rule cluster_gas_network: + input: + cleaned_gas_network=RESOURCES + "gas_network.csv", + regions_onshore=RESOURCES + + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions_offshore=RESOURCES + + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + output: + clustered_gas_network=RESOURCES + "gas_network_elec_s{simpl}_{clusters}.csv", + resources: + mem_mb=4000, + log: + LOGS + "cluster_gas_network_s{simpl}_{clusters}.log", + conda: + "../envs/environment.yaml" + script: + "../scripts/cluster_gas_network.py" rule build_heat_demands: @@ -722,7 +711,8 @@ rule prepare_sector_network: input: **build_retro_cost_output, **build_biomass_transport_costs_output, - **gas_infrastructure, + **rules.cluster_gas_network.output, + **rules.build_gas_input_locations.output, **build_sequestration_potentials_output, network=RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", energy_totals_name=RESOURCES + "energy_totals.csv", From 9d0040912b8b50ca2d69ae4c2720a486d7b98502 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:14:11 +0100 Subject: [PATCH 180/497] retrieve.smk: simplify gas infrastructure retrieve rules --- rules/retrieve.smk | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index e062091e..198edf97 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -162,9 +162,8 @@ if config["enable"]["retrieve"] and config["enable"].get( "../scripts/retrieve_sector_databundle.py" -if config["enable"]["retrieve"] and ( - config["sector"]["gas_network"] or config["sector"]["H2_retrofit"] -): +if config["enable"]["retrieve"]: + datafiles = [ "IGGIELGN_LNGs.geojson", "IGGIELGN_BorderPoints.geojson", From 1e5f9e867da7719a27fa547942916fa4fb6ad281 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:17:49 +0100 Subject: [PATCH 181/497] build_industrial_distribution_key.py: add dropna to EPRTR emissions --- scripts/build_industrial_distribution_key.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index b86d47c2..e6d515b0 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -130,7 +130,7 @@ def build_nodal_distribution_key(hotmaps, regions, countries): if not facilities.empty: emissions = facilities["Emissions_ETS_2014"].fillna( - hotmaps["Emissions_EPRTR_2014"] + hotmaps["Emissions_EPRTR_2014"].dropna() ) if emissions.sum() == 0: key = pd.Series(1 / len(facilities), facilities.index) From 0418af6071841606532ba7366c8acab7ae3957b2 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:20:26 +0100 Subject: [PATCH 182/497] config: keep nuclear if created in prepare_network.py --- config/config.default.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index 1e26781d..95ae738e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -295,6 +295,7 @@ pypsa_eur: - offwind-dc - solar - ror + - nuclear StorageUnit: - PHS - hydro From a0f43aeeb77937db24223c4dc1e85d5cc0625706 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:22:26 +0100 Subject: [PATCH 183/497] config: increase default solar deployment density to 5.1 MW/km2 --- config/config.default.yaml | 2 +- doc/release_notes.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 95ae738e..ba41fe5a 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -212,7 +212,7 @@ renewable: orientation: slope: 35. azimuth: 180. - capacity_per_sqkm: 1.7 + capacity_per_sqkm: 5.1 # correction_factor: 0.854337 corine: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 31, 32] luisa: false # [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242, 1310, 1320, 1330, 1410, 1421, 1422, 2110, 2120, 2130, 2210, 2220, 2230, 2310, 2410, 2420, 3210, 3320, 3330] diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 01833ccc..33857780 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,8 @@ Release Notes Upcoming Release ================ +* Increase deployment density of solar to 5.1 MW/sqkm by default. + * Default to full electrification of land transport by 2050. * Default to approximating transmission losses in HVAC lines From 608a12fed26ad22e64c2dfc341163830000ae62c Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 27 Sep 2023 11:53:00 +0200 Subject: [PATCH 184/497] prepare_sector: allow planning_horizons wc to be a scalar value --- scripts/prepare_sector_network.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 17eb832d..79bc67e9 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -286,6 +286,8 @@ def build_carbon_budget(o, input_eurostat, fn, emissions_scope, report_year): ) planning_horizons = snakemake.params.planning_horizons + if not isinstance(planning_horizons, list): + planning_horizons = [planning_horizons] t_0 = planning_horizons[0] if "be" in o: From b135a0cc01a76dbe81ffcdc3ca5cdc63891ab846 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:42:22 +0100 Subject: [PATCH 185/497] build_ship_raster: performance improvement --- scripts/build_ship_raster.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/scripts/build_ship_raster.py b/scripts/build_ship_raster.py index 02f4d5d5..7025e85d 100644 --- a/scripts/build_ship_raster.py +++ b/scripts/build_ship_raster.py @@ -62,11 +62,13 @@ if __name__ == "__main__": xs, Xs, ys, Ys = zip(*(determine_cutout_xXyY(cutout) for cutout in cutouts)) with zipfile.ZipFile(snakemake.input.ship_density) as zip_f: - zip_f.extract("shipdensity_global.tif") - with rioxarray.open_rasterio("shipdensity_global.tif") as ship_density: - ship_density = ship_density.drop_vars(["band"]).sel( - x=slice(min(xs), max(Xs)), y=slice(max(Ys), min(ys)) - ) - ship_density.rio.to_raster(snakemake.output[0]) + resources = Path(snakemake.output[0]).parent + fn = "shipdensity_global.tif" + zip_f.extract(fn, resources) + with rioxarray.open_rasterio(resources / fn) as ship_density: + ship_density = ship_density.drop_vars(["band"]).sel( + x=slice(min(xs), max(Xs)), y=slice(max(Ys), min(ys)) + ) + ship_density.rio.to_raster(snakemake.output[0]) - os.remove("shipdensity_global.tif") + (resources / fn).unlink() From c1f527b663b5e9f11f283f2052ab23eaba3c9788 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 19:44:29 +0100 Subject: [PATCH 186/497] build_ship_raster: adjust imports --- scripts/build_ship_raster.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_ship_raster.py b/scripts/build_ship_raster.py index 7025e85d..da8c8b28 100644 --- a/scripts/build_ship_raster.py +++ b/scripts/build_ship_raster.py @@ -42,8 +42,8 @@ Description """ import logging -import os import zipfile +from pathlib import Path import rioxarray from _helpers import configure_logging From 254d50b1b4dc35d7db3b8cdc56ba99b798df3546 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 18 Sep 2023 12:25:04 +0200 Subject: [PATCH 187/497] prepare sectors: allow for updating co2 network costs --- Snakefile | 1 + config/config.default.yaml | 2 ++ scripts/prepare_sector_network.py | 47 ++++++++++++++++++++++++++----- scripts/solve_network.py | 8 +++--- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/Snakefile b/Snakefile index 14ce0e40..f6e581a4 100644 --- a/Snakefile +++ b/Snakefile @@ -125,6 +125,7 @@ rule sync: shell: """ rsync -uvarh --ignore-missing-args --files-from=.sync-send . {params.cluster} + rsync -uvarh --no-g {params.cluster}/resources . || echo "No resources directory, skipping rsync rsync -uvarh --no-g {params.cluster}/results . || echo "No results directory, skipping rsync" rsync -uvarh --no-g {params.cluster}/logs . || echo "No logs directory, skipping rsync" """ diff --git a/config/config.default.yaml b/config/config.default.yaml index ba41fe5a..331f7382 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -478,6 +478,7 @@ sector: co2_sequestration_lifetime: 50 co2_spatial: false co2network: false + co2_network_cost_factor: 1 cc_fraction: 0.9 hydrogen_underground_storage: true hydrogen_underground_storage_locations: @@ -985,6 +986,7 @@ plotting: CO2 sequestration: '#f29dae' DAC: '#ff5270' co2 stored: '#f2385a' + co2 sequestered: '#f2682f' co2: '#f29dae' co2 vent: '#ffd4dc' CO2 pipeline: '#f5627f' diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 79bc67e9..b0d0a4e6 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -549,7 +549,7 @@ def patch_electricity_network(n): n.loads_t.p_set.rename(lambda x: x.strip(), axis=1, inplace=True) -def add_co2_tracking(n, options): +def add_co2_tracking(n, costs, options): # minus sign because opposite to how fossil fuels used: # CH4 burning puts CH4 down, atmosphere up n.add("Carrier", "co2", co2_emissions=-1.0) @@ -576,6 +576,37 @@ def add_co2_tracking(n, options): unit="t_co2", ) + # add CO2 tanks + n.madd( + "Store", + spatial.co2.nodes, + e_nom_extendable=True, + capital_cost=costs.loc["CO2 storage tank"], + carrier="co2 stored", + bus=spatial.co2.nodes, + ) + n.add("Carrier", "co2 stored") + + # this tracks CO2 stored, e.g. underground + sequestration_buses = spatial.co2.nodes.str.replace(" stored", " sequestered") + n.madd( + "Bus", + sequestration_buses, + location=spatial.co2.locations, + carrier="co2 sequestered", + unit="t_co2", + ) + + n.madd( + "Link", + sequestration_buses, + bus0=spatial.co2.nodes, + bus1=sequestration_buses, + carrier="co2 sequestered", + efficiency=1.0, + p_nom_extendable=True, + ) + if options["regional_co2_sequestration_potential"]["enable"]: upper_limit = ( options["regional_co2_sequestration_potential"]["max_size"] * 1e3 @@ -591,22 +622,22 @@ def add_co2_tracking(n, options): .mul(1e6) / annualiser ) # t - e_nom_max = e_nom_max.rename(index=lambda x: x + " co2 stored") + e_nom_max = e_nom_max.rename(index=lambda x: x + " co2 sequestered") else: e_nom_max = np.inf n.madd( "Store", - spatial.co2.nodes, + sequestration_buses, e_nom_extendable=True, e_nom_max=e_nom_max, capital_cost=options["co2_sequestration_cost"], - carrier="co2 stored", - bus=spatial.co2.nodes, + bus=sequestration_buses, lifetime=options["co2_sequestration_lifetime"], + carrier="co2 sequestered", ) - n.add("Carrier", "co2 stored") + n.add("Carrier", "co2 sequestered") if options["co2_vent"]: n.madd( @@ -635,6 +666,8 @@ def add_co2_network(n, costs): * co2_links.length ) capital_cost = cost_onshore + cost_submarine + cost_factor = snakemake.config["sector"]["co2_network_cost_factor"] + capital_cost *= cost_factor n.madd( "Link", @@ -3626,7 +3659,7 @@ if __name__ == "__main__": for carrier in conventional: add_carrier_buses(n, carrier) - add_co2_tracking(n, options) + add_co2_tracking(n, costs, options) add_generation(n, costs) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 203d8b0f..2bbd0164 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -202,10 +202,10 @@ def add_co2_sequestration_limit(n, config, limit=200): n.madd( "GlobalConstraint", names, - sense="<=", - constant=limit, - type="primary_energy", - carrier_attribute="co2_absorptions", + sense=">=", + constant=-limit, + type="operational_limit", + carrier_attribute="co2 sequestered", investment_period=periods, ) From 2d027e80c3561f60ac293edffce3ab3c69981842 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 19 Sep 2023 12:22:16 +0200 Subject: [PATCH 188/497] fix capital costs of co2 tanks --- Snakefile | 2 +- scripts/prepare_sector_network.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Snakefile b/Snakefile index f6e581a4..7c16ff9f 100644 --- a/Snakefile +++ b/Snakefile @@ -125,7 +125,7 @@ rule sync: shell: """ rsync -uvarh --ignore-missing-args --files-from=.sync-send . {params.cluster} - rsync -uvarh --no-g {params.cluster}/resources . || echo "No resources directory, skipping rsync + rsync -uvarh --no-g {params.cluster}/resources . || echo "No resources directory, skipping rsync" rsync -uvarh --no-g {params.cluster}/results . || echo "No results directory, skipping rsync" rsync -uvarh --no-g {params.cluster}/logs . || echo "No logs directory, skipping rsync" """ diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b0d0a4e6..4cfaa95f 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -567,7 +567,7 @@ def add_co2_tracking(n, costs, options): bus="co2 atmosphere", ) - # this tracks CO2 stored, e.g. underground + # add CO2 tanks n.madd( "Bus", spatial.co2.nodes, @@ -576,13 +576,13 @@ def add_co2_tracking(n, costs, options): unit="t_co2", ) - # add CO2 tanks n.madd( "Store", spatial.co2.nodes, e_nom_extendable=True, - capital_cost=costs.loc["CO2 storage tank"], + capital_cost=costs.at["CO2 storage tank", "fixed"], carrier="co2 stored", + e_cyclic=True, bus=spatial.co2.nodes, ) n.add("Carrier", "co2 stored") From c71c4e75675638e55a56336d13ac3dbb3e0cbf6c Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 20 Sep 2023 15:27:09 +0200 Subject: [PATCH 189/497] add biomass constraint for biomass spatial enabled --- scripts/prepare_sector_network.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 4cfaa95f..feb3faef 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2330,6 +2330,14 @@ def add_biomass(n, costs): marginal_cost=costs.at["solid biomass", "fuel"] + bus_transport_costs * average_distance, ) + n.add( + "GlobalConstraint", + "biomass limit", + carrier_attribute="solid biomass", + sense="<=", + constant=biomass_potentials["solid biomass"].sum(), + type="operational_limit", + ) # AC buses with district heating urban_central = n.buses.index[n.buses.carrier == "urban central heat"] From be5331c89c8aeabd64108d1c15827da47519c43a Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 22 Sep 2023 10:51:36 +0200 Subject: [PATCH 190/497] formulate sequestration limit constraint as operational_limit constraint --- scripts/prepare_sector_network.py | 2 +- scripts/solve_network.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index feb3faef..0caf45dd 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -587,7 +587,7 @@ def add_co2_tracking(n, costs, options): ) n.add("Carrier", "co2 stored") - # this tracks CO2 stored, e.g. underground + # this tracks CO2 sequestered, e.g. underground sequestration_buses = spatial.co2.nodes.str.replace(" stored", " sequestered") n.madd( "Bus", diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 2bbd0164..e76d4004 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -182,9 +182,6 @@ def add_co2_sequestration_limit(n, config, limit=200): """ Add a global constraint on the amount of Mt CO2 that can be sequestered. """ - n.carriers.loc["co2 stored", "co2_absorptions"] = -1 - n.carriers.co2_absorptions = n.carriers.co2_absorptions.fillna(0) - limit = limit * 1e6 for o in opts: if "seq" not in o: @@ -396,7 +393,7 @@ def prepare_network( if snakemake.params["sector"]["limit_max_growth"]["enable"]: n = add_max_growth(n, config) - if n.stores.carrier.eq("co2 stored").any(): + if n.stores.carrier.eq("co2 sequestered").any(): limit = co2_sequestration_potential add_co2_sequestration_limit(n, config, limit=limit) From 4e03e5a7ecb8165306087bad6413d4e9eb2f8ce3 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 5 Oct 2023 16:07:04 +0200 Subject: [PATCH 191/497] prepare_sector: add VOM for FT and methanolization, always use `.at` accessor for costs --- scripts/prepare_sector_network.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 0caf45dd..3a3c9992 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -102,7 +102,10 @@ def define_spatial(nodes, options): spatial.gas.biogas = ["EU biogas"] spatial.gas.industry = ["gas for industry"] spatial.gas.biogas_to_gas = ["EU biogas to gas"] - spatial.gas.biogas_to_gas_cc = ["EU biogas to gas CC"] + if options.get("biomass_spatial", options["biomass_transport"]): + spatial.gas.biogas_to_gas_cc = nodes + " biogas to gas CC" + else: + spatial.gas.biogas_to_gas_cc = ["EU biogas to gas CC"] if options.get("co2_spatial", options["co2network"]): spatial.gas.industry_cc = nodes + " gas for industry CC" else: @@ -2257,13 +2260,12 @@ def add_biomass(n, costs): # Assuming for costs that the CO2 from upgrading is pure, such as in amine scrubbing. I.e., with and without CC is # equivalent. Adding biomass CHP capture because biogas is often small-scale and decentral so further # from e.g. CO2 grid or buyers. This is a proxy for the added cost for e.g. a raw biogas pipeline to a central upgrading facility - n.madd( "Link", spatial.gas.biogas_to_gas_cc, bus0=spatial.gas.biogas, bus1=spatial.gas.nodes, - bus2="co2 stored", + bus2=spatial.co2.nodes, bus3="co2 atmosphere", carrier="biogas to gas CC", capital_cost=costs.at["biogas CC", "fixed"] @@ -2734,6 +2736,7 @@ def add_industry(n, costs): carrier="methanolisation", p_nom_extendable=True, p_min_pu=options.get("min_part_load_methanolisation", 0), + marginal_cost=options["MWh_MeOH_per_MWh_H2"] * costs.at["fuel cell", "VOM"], capital_cost=costs.at["methanolisation", "fixed"] * options["MWh_MeOH_per_MWh_H2"], # EUR/MW_H2/a marginal_cost=options["MWh_MeOH_per_MWh_H2"] From 6078b4626239ef94984a08bc16ac19b5b2e9244b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 20:04:56 +0100 Subject: [PATCH 192/497] remove duplicate marginal_cost for methanolisation from merge --- scripts/prepare_sector_network.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 3a3c9992..0cb9759c 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2736,7 +2736,6 @@ def add_industry(n, costs): carrier="methanolisation", p_nom_extendable=True, p_min_pu=options.get("min_part_load_methanolisation", 0), - marginal_cost=options["MWh_MeOH_per_MWh_H2"] * costs.at["fuel cell", "VOM"], capital_cost=costs.at["methanolisation", "fixed"] * options["MWh_MeOH_per_MWh_H2"], # EUR/MW_H2/a marginal_cost=options["MWh_MeOH_per_MWh_H2"] From af7c1b15e6b9268a2948cfd9bd8f7c8752920e26 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 20:10:05 +0100 Subject: [PATCH 193/497] add documentation --- doc/configtables/sector.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 5e2514e4..90979180 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -93,6 +93,7 @@ co2_sequestration_cost,currency/tCO2,float,The cost of sequestering a ton of CO2 co2_spatial,--,"{true, false}","Add option to spatially resolve carrier representing stored carbon dioxide. This allows for more detailed modelling of CCUTS, e.g. regarding the capturing of industrial process emissions, usage as feedstock for electrofuels, transport of carbon dioxide, and geological sequestration sites." ,,, co2network,--,"{true, false}",Add option for planning a new carbon dioxide transmission network +co2_network_cost_factor,p.u.,float,The cost factor for the capital cost of the carbon dioxide transmission network ,,, cc_fraction,--,float,The default fraction of CO2 captured with post-combustion capture hydrogen_underground _storage,--,"{true, false}",Add options for storing hydrogen underground. Storage potential depends regionally. From 48832874171601e2eec0bf2b7512ae5a4ce718e1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 19:10:04 +0000 Subject: [PATCH 194/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/common.smk | 2 +- scripts/add_brownfield.py | 4 +--- scripts/prepare_sector_network.py | 6 ++++-- scripts/solve_network.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 0e85b620..2298ff91 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -4,7 +4,7 @@ import os, sys, glob -helper_source_path = [match for match in glob.glob('**/_helpers.py', recursive=True)] +helper_source_path = [match for match in glob.glob("**/_helpers.py", recursive=True)] for path in helper_source_path: path = os.path.dirname(os.path.abspath(path)) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index e151c441..cb1f51c8 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -133,9 +133,7 @@ def disable_grid_expansion_if_LV_limit_hit(n): # allow small numerical differences if lv_limit - total_expansion < 1: - logger.info( - f"LV is already reached, disabling expansion and LV limit" - ) + logger.info(f"LV is already reached, disabling expansion and LV limit") extendable_acs = n.lines.query("s_nom_extendable").index n.lines.loc[extendable_acs, "s_nom_extendable"] = False n.lines.loc[extendable_acs, "s_nom"] = n.lines.loc[extendable_acs, "s_nom_min"] diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 3a3c9992..ec76399d 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3044,8 +3044,9 @@ def add_industry(n, costs): if options["co2_spatial"] or options["co2network"]: p_set = ( - -industrial_demand.loc[nodes, "process emission"] - .rename(index=lambda x: x + " process emissions") + -industrial_demand.loc[nodes, "process emission"].rename( + index=lambda x: x + " process emissions" + ) / nhours ) else: @@ -3458,6 +3459,7 @@ def cluster_heat_buses(n): pnl = c.pnl agg = define_clustering(pd.Index(pnl.keys()), aggregate_dict) for k in pnl.keys(): + def renamer(s): return s.replace("residential ", "").replace("services ", "") diff --git a/scripts/solve_network.py b/scripts/solve_network.py index e76d4004..36b53086 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -853,7 +853,7 @@ def solve_network(n, config, solving, opts="", **kwargs): kwargs["assign_all_duals"] = cf_solving.get("assign_all_duals", False) if kwargs["solver_name"] == "gurobi": - logging.getLogger('gurobipy').setLevel(logging.CRITICAL) + logging.getLogger("gurobipy").setLevel(logging.CRITICAL) rolling_horizon = cf_solving.pop("rolling_horizon", False) skip_iterations = cf_solving.pop("skip_iterations", False) From becba42a88669c5e59fbb127336a67cf5498da49 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 20:15:00 +0100 Subject: [PATCH 195/497] add release notes --- doc/release_notes.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 33857780..88f05854 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,13 @@ Release Notes Upcoming Release ================ +* Distinguish between stored and sequestered CO2. Stored CO2 is stored + overground in tanks and can be used for CCU (e.g. methanolisation). + Sequestered CO2 is stored underground and can no longer be used for CCU. This + distinction is made because storage in tanks is more expensive than + underground storage. The link that connects stored and sequestered CO2 is + unidirectional. + * Increase deployment density of solar to 5.1 MW/sqkm by default. * Default to full electrification of land transport by 2050. From 0534f574e9ef15b59d475991080fd2c47c8cd2c0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 19:18:07 +0000 Subject: [PATCH 196/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/common.smk | 2 +- scripts/add_brownfield.py | 4 +--- scripts/prepare_sector_network.py | 6 ++++-- scripts/solve_network.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 0e85b620..2298ff91 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -4,7 +4,7 @@ import os, sys, glob -helper_source_path = [match for match in glob.glob('**/_helpers.py', recursive=True)] +helper_source_path = [match for match in glob.glob("**/_helpers.py", recursive=True)] for path in helper_source_path: path = os.path.dirname(os.path.abspath(path)) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index e151c441..cb1f51c8 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -133,9 +133,7 @@ def disable_grid_expansion_if_LV_limit_hit(n): # allow small numerical differences if lv_limit - total_expansion < 1: - logger.info( - f"LV is already reached, disabling expansion and LV limit" - ) + logger.info(f"LV is already reached, disabling expansion and LV limit") extendable_acs = n.lines.query("s_nom_extendable").index n.lines.loc[extendable_acs, "s_nom_extendable"] = False n.lines.loc[extendable_acs, "s_nom"] = n.lines.loc[extendable_acs, "s_nom_min"] diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 79bc67e9..8a45da2e 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3000,8 +3000,9 @@ def add_industry(n, costs): if options["co2_spatial"] or options["co2network"]: p_set = ( - -industrial_demand.loc[nodes, "process emission"] - .rename(index=lambda x: x + " process emissions") + -industrial_demand.loc[nodes, "process emission"].rename( + index=lambda x: x + " process emissions" + ) / nhours ) else: @@ -3414,6 +3415,7 @@ def cluster_heat_buses(n): pnl = c.pnl agg = define_clustering(pd.Index(pnl.keys()), aggregate_dict) for k in pnl.keys(): + def renamer(s): return s.replace("residential ", "").replace("services ", "") diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 203d8b0f..aa802ea8 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -856,7 +856,7 @@ def solve_network(n, config, solving, opts="", **kwargs): kwargs["assign_all_duals"] = cf_solving.get("assign_all_duals", False) if kwargs["solver_name"] == "gurobi": - logging.getLogger('gurobipy').setLevel(logging.CRITICAL) + logging.getLogger("gurobipy").setLevel(logging.CRITICAL) rolling_horizon = cf_solving.pop("rolling_horizon", False) skip_iterations = cf_solving.pop("skip_iterations", False) From 7b1600164fa292eb1ba2288340340deaf1cb3f59 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 19:18:59 +0000 Subject: [PATCH 197/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_sector.smk | 15 +++++---------- rules/common.smk | 2 +- rules/retrieve.smk | 1 - scripts/add_brownfield.py | 4 +--- scripts/prepare_sector_network.py | 6 ++++-- scripts/solve_network.py | 2 +- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 23ea604c..ef2fc6c8 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -90,13 +90,10 @@ rule build_gas_input_locations: ), entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson", storage="data/gas_network/scigrid-gas/data/IGGIELGN_Storages.geojson", - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES - + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions_offshore=RESOURCES + "regions_offshore_elec_s{simpl}_{clusters}.geojson", output: - gas_input_nodes=RESOURCES - + "gas_input_locations_s{simpl}_{clusters}.geojson", + gas_input_nodes=RESOURCES + "gas_input_locations_s{simpl}_{clusters}.geojson", gas_input_nodes_simplified=RESOURCES + "gas_input_locations_s{simpl}_{clusters}_simplified.csv", resources: @@ -112,10 +109,8 @@ rule build_gas_input_locations: rule cluster_gas_network: input: cleaned_gas_network=RESOURCES + "gas_network.csv", - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - regions_offshore=RESOURCES - + "regions_offshore_elec_s{simpl}_{clusters}.geojson", + regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions_offshore=RESOURCES + "regions_offshore_elec_s{simpl}_{clusters}.geojson", output: clustered_gas_network=RESOURCES + "gas_network_elec_s{simpl}_{clusters}.csv", resources: diff --git a/rules/common.smk b/rules/common.smk index 0e85b620..2298ff91 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -4,7 +4,7 @@ import os, sys, glob -helper_source_path = [match for match in glob.glob('**/_helpers.py', recursive=True)] +helper_source_path = [match for match in glob.glob("**/_helpers.py", recursive=True)] for path in helper_source_path: path = os.path.dirname(os.path.abspath(path)) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 198edf97..7a180e22 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -163,7 +163,6 @@ if config["enable"]["retrieve"] and config["enable"].get( if config["enable"]["retrieve"]: - datafiles = [ "IGGIELGN_LNGs.geojson", "IGGIELGN_BorderPoints.geojson", diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index e151c441..cb1f51c8 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -133,9 +133,7 @@ def disable_grid_expansion_if_LV_limit_hit(n): # allow small numerical differences if lv_limit - total_expansion < 1: - logger.info( - f"LV is already reached, disabling expansion and LV limit" - ) + logger.info(f"LV is already reached, disabling expansion and LV limit") extendable_acs = n.lines.query("s_nom_extendable").index n.lines.loc[extendable_acs, "s_nom_extendable"] = False n.lines.loc[extendable_acs, "s_nom"] = n.lines.loc[extendable_acs, "s_nom_min"] diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 17eb832d..70f57953 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2998,8 +2998,9 @@ def add_industry(n, costs): if options["co2_spatial"] or options["co2network"]: p_set = ( - -industrial_demand.loc[nodes, "process emission"] - .rename(index=lambda x: x + " process emissions") + -industrial_demand.loc[nodes, "process emission"].rename( + index=lambda x: x + " process emissions" + ) / nhours ) else: @@ -3412,6 +3413,7 @@ def cluster_heat_buses(n): pnl = c.pnl agg = define_clustering(pd.Index(pnl.keys()), aggregate_dict) for k in pnl.keys(): + def renamer(s): return s.replace("residential ", "").replace("services ", "") diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 203d8b0f..aa802ea8 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -856,7 +856,7 @@ def solve_network(n, config, solving, opts="", **kwargs): kwargs["assign_all_duals"] = cf_solving.get("assign_all_duals", False) if kwargs["solver_name"] == "gurobi": - logging.getLogger('gurobipy').setLevel(logging.CRITICAL) + logging.getLogger("gurobipy").setLevel(logging.CRITICAL) rolling_horizon = cf_solving.pop("rolling_horizon", False) skip_iterations = cf_solving.pop("skip_iterations", False) From e594f34e0029ce73a8083e6b28b60315b23b91c0 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 4 Jan 2024 20:30:00 +0100 Subject: [PATCH 198/497] fix sequestration buses string replacement with pd.Index --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 9fe4c95a..e35d3a64 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -591,7 +591,7 @@ def add_co2_tracking(n, costs, options): n.add("Carrier", "co2 stored") # this tracks CO2 sequestered, e.g. underground - sequestration_buses = spatial.co2.nodes.str.replace(" stored", " sequestered") + sequestration_buses = pd.Index(spatial.co2.nodes).str.replace(" stored", " sequestered") n.madd( "Bus", sequestration_buses, From 29cda7042b2b506001d2955059ca0d6ce75f1d0c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 19:30:29 +0000 Subject: [PATCH 199/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index e35d3a64..51ab52d9 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -591,7 +591,9 @@ def add_co2_tracking(n, costs, options): n.add("Carrier", "co2 stored") # this tracks CO2 sequestered, e.g. underground - sequestration_buses = pd.Index(spatial.co2.nodes).str.replace(" stored", " sequestered") + sequestration_buses = pd.Index(spatial.co2.nodes).str.replace( + " stored", " sequestered" + ) n.madd( "Bus", sequestration_buses, From 558763e40ce651062449f1b113d3e306bd4ccce1 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 5 Jan 2024 14:32:37 +0100 Subject: [PATCH 200/497] add release notes --- config/config.default.yaml | 1 - doc/release_notes.rst | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index a5e49539..b9e8dc91 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -90,7 +90,6 @@ co2_budget: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#electricity electricity: - voltages: [220., 300., 380.] voltages: [220., 300., 380., 500., 750.] gaslimit_enable: false gaslimit: false diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 88f05854..7a045866 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,11 @@ Release Notes Upcoming Release ================ +* More wildcard options now have a corresponding config entry. If the wildcard + is given, then its value is used. If the wildcard is not given but the options + in config are enabled, then the value from config is used. If neither is + given, the options are skipped. + * Distinguish between stored and sequestered CO2. Stored CO2 is stored overground in tanks and can be used for CCU (e.g. methanolisation). Sequestered CO2 is stored underground and can no longer be used for CCU. This From b6cba0388c3ba7a8b6b05b4c8c8283022d616d2e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 5 Jan 2024 14:34:48 +0100 Subject: [PATCH 201/497] do not skip gas generator --- scripts/prepare_sector_network.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 0fb9729a..43b09375 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -497,9 +497,6 @@ def add_carrier_buses(n, carrier, nodes=None): capital_cost=capital_cost, ) - if carrier == "gas": - return - n.madd( "Generator", nodes, From de2f9cf46de39c75a18d5dd88a688578961e0134 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 5 Jan 2024 14:38:15 +0100 Subject: [PATCH 202/497] add release notes --- doc/release_notes.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 03d9318d..cc1ecdf0 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,14 @@ Release Notes Upcoming Release ================ +* Add separate option to add resistive heaters to the technology choices + (``sector: resistive_heaters:``). Previously they were always added when + boilers were added. + +* Resolve code issues for endogenous building retrofitting. Select correct + sector names, address deprecations, distinguish between district heating, decentral + heating in urban areas or rural areas for floor area calculations. + * Remove all negative loads on the ``co2 atmosphere`` bus representing emissions for e.g. fixed fossil demands for transport oil. Instead these are handled more transparently with a fixed transport oil demand and a link taking care of From db54006ac8e0cedb0e8302a5681130e9b91b1d75 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 5 Jan 2024 14:46:02 +0100 Subject: [PATCH 203/497] add exogenous transitions in 5-year steps --- config/config.default.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index 17eac834..bc067266 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -368,8 +368,11 @@ sector: potential: 0.6 progress: 2020: 0.0 + 2025: 0.15 2030: 0.3 + 2035: 0.45 2040: 0.6 + 2045: 0.8 2050: 1.0 district_heating_loss: 0.15 cluster_heat_buses: false @@ -392,18 +395,27 @@ sector: v2g: true land_transport_fuel_cell_share: 2020: 0 + 2025: 0 2030: 0 + 2035: 0 2040: 0 + 2045: 0 2050: 0 land_transport_electric_share: 2020: 0 + 2025: 0.15 2030: 0.3 + 2035: 0.45 2040: 0.7 + 2045: 0.85 2050: 1 land_transport_ice_share: 2020: 1 + 2025: 0.85 2030: 0.7 + 2035: 0.55 2040: 0.3 + 2045: 0.15 2050: 0 transport_fuel_cell_efficiency: 0.5 transport_internal_combustion_efficiency: 0.3 @@ -417,18 +429,27 @@ sector: shipping_hydrogen_liquefaction: false shipping_hydrogen_share: 2020: 0 + 2025: 0 2030: 0 + 2035: 0 2040: 0 + 2045: 0 2050: 0 shipping_methanol_share: 2020: 0 + 2025: 0.15 2030: 0.3 + 2035: 0.5 2040: 0.7 + 2045: 0.85 2050: 1 shipping_oil_share: 2020: 1 + 2025: 0.85 2030: 0.7 + 2035: 0.5 2040: 0.3 + 2045: 0.15 2050: 0 shipping_methanol_efficiency: 0.46 shipping_oil_efficiency: 0.40 From 66c9513fbd58ed9c3a70a1bfefe46dc454ca4c8c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 5 Jan 2024 17:20:52 +0100 Subject: [PATCH 204/497] prepare release notes and amend documentation --- CITATION.cff | 2 +- config/config.default.yaml | 2 +- doc/conf.py | 4 +- doc/configtables/costs.csv | 1 + doc/configtables/sector.csv | 8 + doc/foresight.rst | 2 +- doc/preparation.rst | 13 + doc/release_notes.rst | 354 ++++++++++++------ scripts/build_monthly_prices.py | 2 - .../determine_availability_matrix_MD_UA.py | 3 + 10 files changed, 274 insertions(+), 117 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index c80b73ef..f8b28b5f 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,7 +6,7 @@ cff-version: 1.1.0 message: "If you use this package, please cite it in the following way." title: "PyPSA-Eur: An open sector-coupled optimisation model of the European energy system" repository: https://github.com/pypsa/pypsa-eur -version: 0.8.1 +version: 0.9.0 license: MIT authors: - family-names: Brown diff --git a/config/config.default.yaml b/config/config.default.yaml index bc067266..c59ff394 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: CC0-1.0 # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#top-level-configuration -version: 0.8.1 +version: 0.9.0 tutorial: false logging: diff --git a/doc/conf.py b/doc/conf.py index 1ddae466..fe577ac7 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -80,9 +80,9 @@ author = "Tom Brown (KIT, TUB, FIAS), Jonas Hoersch (KIT, FIAS), Fabian Hofmann # built documents. # # The short X.Y version. -version = "0.8" +version = "0.9" # The full version, including alpha/beta/rc tags. -release = "0.8.1" +release = "0.9.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/configtables/costs.csv b/doc/configtables/costs.csv index e307985d..b69c0bf9 100644 --- a/doc/configtables/costs.csv +++ b/doc/configtables/costs.csv @@ -2,6 +2,7 @@ year,--,YYYY; e.g. '2030',Year for which to retrieve cost assumptions of ``resources/costs.csv``. version,--,vX.X.X; e.g. 'v0.5.0',Version of ``technology-data`` repository to use. rooftop_share,--,float,Share of rooftop PV when calculating capital cost of solar (joint rooftop and utility-scale PV). +social_discountrate,p.u.,float,Social discount rate to compare costs in different investment periods. 0.02 corresponds to a social discount rate of 2%. fill_values,--,float,Default values if not specified for a technology in ``resources/costs.csv``. capital_cost,EUR/MW,Keys should be in the 'technology' column of ``resources/costs.csv``. Values can be any float.,"For the given technologies, assumptions about their capital investment costs are set to the corresponding value. Optional; overwrites cost assumptions from ``resources/costs.csv``." marginal_cost,EUR/MWh,Keys should be in the 'technology' column of ``resources/costs.csv``. Values can be any float.,"For the given technologies, assumptions about their marginal operating costs are set to the corresponding value. Optional; overwrites cost assumptions from ``resources/costs.csv``." diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index b6a10d43..be096974 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -91,6 +91,7 @@ regional_co2 _sequestration_potential,,, -- years_of_storage,years,float,The years until potential exhausted at optimised annual rate co2_sequestration_potential,MtCO2/a,float,The potential of sequestering CO2 in Europe per year co2_sequestration_cost,currency/tCO2,float,The cost of sequestering a ton of CO2 +co2_sequestration_lifetime,years,int,The lifetime of a CO2 sequestration site co2_spatial,--,"{true, false}","Add option to spatially resolve carrier representing stored carbon dioxide. This allows for more detailed modelling of CCUTS, e.g. regarding the capturing of industrial process emissions, usage as feedstock for electrofuels, transport of carbon dioxide, and geological sequestration sites." ,,, co2network,--,"{true, false}",Add option for planning a new carbon dioxide transmission network @@ -130,3 +131,10 @@ biogas_upgrading_cc,--,"{true, false}",Add option to capture CO2 from biomass up conventional_generation,,,Add a more detailed description of conventional carriers. Any power generation requires the consumption of fuel from nodes representing that fuel. biomass_to_liquid,--,"{true, false}",Add option for transforming solid biomass into liquid fuel with the same properties as oil biosng,--,"{true, false}",Add option for transforming solid biomass into synthesis gas with the same properties as natural gas +limit_max_growth,,, +-- enable,--,"{true, false}",Add option to limit the maximum growth of a carrier +-- factor,p.u.,float,The maximum growth factor of a carrier (e.g. 1.3 allows 30% larger than max historic growth) +-- max_growth,,, +-- -- {carrier},GW,float,The historic maximum growth of a carrier +-- max_relative_growth, +-- -- {carrier},p.u.,float,The historic maximum relative growth of a carrier \ No newline at end of file diff --git a/doc/foresight.rst b/doc/foresight.rst index dd1e0ecc..f8ea6108 100644 --- a/doc/foresight.rst +++ b/doc/foresight.rst @@ -41,7 +41,7 @@ Perfect foresight scenarios .. warning:: - Perfect foresight is currently implemented as a first test version. + Perfect foresight is currently implemented as an experimental test version. For running perfect foresight scenarios, you can adjust the ``config/config.perfect.yaml``: diff --git a/doc/preparation.rst b/doc/preparation.rst index 5cdc8031..d8f76839 100644 --- a/doc/preparation.rst +++ b/doc/preparation.rst @@ -94,6 +94,13 @@ Rule ``build_electricity_demand`` .. automodule:: build_electricity_demand +.. _monthlyprices: + +Rule ``build_monthly_prices`` +============================= + +.. automodule:: build_monthly_prices + .. _ship: Rule ``build_ship_raster`` @@ -102,6 +109,12 @@ Rule ``build_ship_raster`` .. automodule:: build_ship_raster +.. _availabilitymatrixmdua: + +Rule ``determine_availability_matrix_MD_UA`` +============================================ + +.. automodule:: determine_availability_matrix_MD_UA .. _renewableprofiles: diff --git a/doc/release_notes.rst b/doc/release_notes.rst index f1b9bcb9..9baeeb88 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,110 +7,22 @@ Release Notes ########################################## -Upcoming Release -================ +.. Upcoming Release +.. ================ -* More wildcard options now have a corresponding config entry. If the wildcard - is given, then its value is used. If the wildcard is not given but the options - in config are enabled, then the value from config is used. If neither is - given, the options are skipped. +.. * new features -* Distinguish between stored and sequestered CO2. Stored CO2 is stored - overground in tanks and can be used for CCU (e.g. methanolisation). - Sequestered CO2 is stored underground and can no longer be used for CCU. This - distinction is made because storage in tanks is more expensive than - underground storage. The link that connects stored and sequestered CO2 is - unidirectional. +PyPSA-Eur 0.9.0 (5th January 2024) +================================== -* Increase deployment density of solar to 5.1 MW/sqkm by default. - -* Default to full electrification of land transport by 2050. - -* Default to approximating transmission losses in HVAC lines - (``transmission_losses: 2``). -* Add separate option to add resistive heaters to the technology choices - (``sector: resistive_heaters:``). Previously they were always added when - boilers were added. - -* Resolve code issues for endogenous building retrofitting. Select correct - sector names, address deprecations, distinguish between district heating, decentral - heating in urban areas or rural areas for floor area calculations. - -* Remove all negative loads on the ``co2 atmosphere`` bus representing emissions - for e.g. fixed fossil demands for transport oil. Instead these are handled - more transparently with a fixed transport oil demand and a link taking care of - the emissions to the ``co2 atmosphere`` bus. This is also a preparation for - endogenous transport optimisation, where demand will be subject to - optimisation (e.g. fuel switching in the transport sector). - -* Allow possibility to go from copperplated to regionally resolved methanol and - oil demand with switches ``sector: regional_methanol_demand: true`` and - ``sector: regional_oil_demand: true``. This allows nodal/regional CO2 - constraints to be applied. - -* Process emissions from steam crackers (i.e. naphtha processing for HVC) are now - piped from the consumption link to the process emissions bus where the model - can decide about carbon capture. Previously the process emissions for naphtha - were a fixed load. +**New Features** * Add option to specify losses for bidirectional links, e.g. pipelines or HVDC links, in configuration file under ``sector: transmission_efficiency:``. Users can specify static or length-dependent values as well as a length-dependent electricity demand for compression, which is implemented as a multi-link to the local electricity buses. The bidirectional links will then be split into - two unidirectional links with linked capacities. - -* Pin ``snakemake`` version to below 8.0.0, as the new version is not yet - supported by ``pypsa-eur``. - -* Updated Global Energy Monitor LNG terminal data to March 2023 version. - -* For industry distribution, use EPRTR as fallback if ETS data is not available. - -* The minimum capacity for renewable generators when using the myopic option has been fixed. - -* Files downloaded from zenodo are now write-protected to prevent accidental re-download. - -* Files extracted from sector-coupled data bundle have been moved from ``data/`` to ``data/sector-bundle``. - -* New feature multi-decade optimisation with perfect foresight. - -* It is now possible to specify years for biomass potentials which do not exist - in the JRC-ENSPRESO database, e.g. 2037. These are linearly interpolated. - -* In pathway mode, the biomass potential is linked to the investment year. - -* Rule ``purge`` now initiates a dialog to confirm if purge is desired. - -* Rule ``retrieve_irena`` get updated values for renewables capacities. - -* Rule ``retrieve_wdpa`` updated to not only check for current and previous, but also potentially next months dataset availability. - -* Split configuration to enable SMR and SMR CC. - -* Bugfix: The unit of the capital cost of Haber-Bosch plants was corrected. - -* The configuration setting for country focus weights when clustering the - network has been moved from ``focus_weights:`` to ``clustering: - focus_weights:``. Backwards compatibility to old config files is maintained. - -* Extend options for waste usage from Haber-Bosch, methanolisation and methanation. - -* Use electrolysis waste heat by default. - -* Add new ``sector_opts`` wildcard option "nowasteheat" to disable all waste heat usage. - -* Set minimum part loads for PtX processes to 30% for methanolisation and methanation, and to 70% for Fischer-Tropsch synthesis. - -* Add VOM as marginal cost to PtX processes. - -* Add pelletizing costs for biomass boilers. - -* The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument. - -* Switch to using hydrogen and electricity inputs for Haber-Bosch from https://github.com/PyPSA/technology-data. - -* Add option to capture CO2 contained in biogas when upgrading (``sector: biogas_to_gas_cc``). + two unidirectional links with linked capacities (https://github.com/PyPSA/pypsa-eur/pull/739). * Merged option to extend geographical scope to Ukraine and Moldova. These countries are excluded by default and is currently constrained to power-sector @@ -120,24 +32,21 @@ Upcoming Release Moldova). Moldova can currently only be included in conjunction with Ukraine due to the absence of demand data. The Crimean power system is manually reconnected to the main Ukrainian grid with the configuration option - `reconnect_crimea`. + `reconnect_crimea` (https://github.com/PyPSA/pypsa-eur/pull/321). + +* New experimental support for multi-decade optimisation with perfect foresight + (``foresight: perfect``). Maximum growth rates for carriers, global carbon + budget constraints and emission constraints for particular investment periods. * Add option to reference an additional source file where users can specify custom ``extra_functionality`` constraints in the configuration file. The default setting points to an empty hull at - ``data/custom_extra_functionality.py``. - -* Validate downloads from Zenodo using MD5 checksums. This identifies corrupted - or incomplete downloads. + ``data/custom_extra_functionality.py`` (https://github.com/PyPSA/pypsa-eur/pull/824). * Add locations, capacities and costs of existing gas storage using Global Energy Monitor's `Europe Gas Tracker - `_. - -* Remove HELMETH option. - -* Print Irreducible Infeasible Subset (IIS) if model is infeasible. Only for - solvers with IIS support. + `_ + (https://github.com/PyPSA/pypsa-eur/pull/835). * Add option to use `LUISA Base Map `_ 50m land @@ -147,13 +56,238 @@ Upcoming Release dataset's full advantages, set the excluder resolution to 50m (``excluder_resolution: 50``). For land category codes, see `Annex 1 of the technical documentation - `_. + `_ + (https://github.com/PyPSA/pypsa-eur/pull/842). + +* Add option to capture CO2 contained in biogas when upgrading (``sector: + biogas_to_gas_cc``) (https://github.com/PyPSA/pypsa-eur/pull/615). + +* If load shedding is activated, it is now applied to all carriers, not only + electricity (https://github.com/PyPSA/pypsa-eur/pull/784). + +* Add option for heat vents in district heating (``sector: + central_heat_vent:``). The combination of must-run conditions for some + power-to-X processes, waste heat usage enabled and decreasing heating demand, + can lead to infeasibilities in pathway optimisation for some investment + periods since larger Fischer-Tropsch capacities are needed in early years but + the waste heat exceeds the heat demand in later investment periods. + (https://github.com/PyPSA/pypsa-eur/pull/791). + +* Allow possibility to go from copperplated to regionally resolved methanol and + oil demand with switches ``sector: regional_methanol_demand: true`` and + ``sector: regional_oil_demand: true``. This allows nodal/regional CO2 + constraints to be applied (https://github.com/PyPSA/pypsa-eur/pull/827). + +* Allow retrofitting of existing gas boilers to hydrogen boilers in pathway + optimisation. + +* Add option to add time-varying CO2 emission prices (electricity-only, ``costs: + emission_prices: co2_monthly_prices: true``). This is linked to the new + ``{opts}`` wildcard option ``Ept``. + +* Network clustering can now consider efficiency classes when aggregating + carriers. The option ``clustering: consider_efficiency_classes:`` aggregates + each carriers into the top 10-quantile (high), the bottom 90-quantile (low), + and everything in between (medium). + +* Added option ``conventional: dynamic_fuel_price:`` to consider the monthly + fluctuating fuel prices for conventional generators. Refer to the CSV file + ``data/validation/monthly_fuel_price.csv``. + +* For hydro-electricity, add switches ``flatten_dispatch`` to consider an upper + limit for the hydro dispatch. The limit is given by the average capacity + factor plus the buffer given in ``flatten_dispatch_buffer``. + +* Extend options for waste heat usage from Haber-Bosch, methanolisation and + methanation (https://github.com/PyPSA/pypsa-eur/pull/834). + +* Add new ``sector_opts`` wildcard option "nowasteheat" to disable all waste + heat usage (https://github.com/PyPSA/pypsa-eur/pull/834). + +* Add new rule ``retrieve_irena`` to automatically retrieve up-to-date values + for existing renewables capacities (https://github.com/PyPSA/pypsa-eur/pull/756). + +* Print Irreducible Infeasible Subset (IIS) if model is infeasible. Only for + solvers with IIS support (https://github.com/PyPSA/pypsa-eur/pull/841). + +* More wildcard options now have a corresponding config entry. If the wildcard + is given, then its value is used. If the wildcard is not given but the options + in config are enabled, then the value from config is used. If neither is + given, the options are skipped (https://github.com/PyPSA/pypsa-eur/pull/827). + +* Validate downloads from Zenodo using MD5 checksums. This identifies corrupted + or incomplete downloads (https://github.com/PyPSA/pypsa-eur/pull/821). + +* Add rule ``sync`` to synchronise with a remote machine using the ``rsync`` + library. Configuration settings are found under ``remote:``. + +**Breaking Changes** + +* Remove all negative loads on the ``co2 atmosphere`` bus representing emissions + for e.g. fixed fossil demands for transport oil. Instead these are handled + more transparently with a fixed transport oil demand and a link taking care of + the emissions to the ``co2 atmosphere`` bus. This is also a preparation for + endogenous transport optimisation, where demand will be subject to + optimisation (e.g. fuel switching in the transport sector) + (https://github.com/PyPSA/pypsa-eur/pull/827). + +* Process emissions from steam crackers (i.e. naphtha processing for HVC) are + now piped from the consumption link to the process emissions bus where the + model can decide about carbon capture. Previously the process emissions for + naphtha were a fixed load (https://github.com/PyPSA/pypsa-eur/pull/827). + +* Distinguish between stored and sequestered CO2. Stored CO2 is stored + overground in tanks and can be used for CCU (e.g. methanolisation). + Sequestered CO2 is stored underground and can no longer be used for CCU. This + distinction is made because storage in tanks is more expensive than + underground storage. The link that connects stored and sequestered CO2 is + unidirectional (https://github.com/PyPSA/pypsa-eur/pull/844). + +* Files extracted from sector-coupled data bundle have been moved from ``data/`` + to ``data/sector-bundle``. + +* Split configuration to enable SMR and SMR CC (``sector: smr:`` and ``sector: + smr_cc:``) (https://github.com/PyPSA/pypsa-eur/pull/757). + +* Add separate option to add resistive heaters to the technology choices + (``sector: resistive_heaters:``). Previously they were always added when + boilers were added (https://github.com/PyPSA/pypsa-eur/pull/808). + +* Remove HELMETH option (``sector: helmeth:``). + +* Remove "conservative" renewable potentials estimation option + (https://github.com/PyPSA/pypsa-eur/pull/838). + +**Changes** + +* Updated Global Energy Monitor LNG terminal data to March 2023 version + (https://github.com/PyPSA/pypsa-eur/pull/707). + +* For industry distribution, use EPRTR as fallback if ETS data is not available + (https://github.com/PyPSA/pypsa-eur/pull/721). + +* It is now possible to specify years for biomass potentials which do not exist + in the JRC-ENSPRESO database, e.g. 2037. These are linearly interpolated + (https://github.com/PyPSA/pypsa-eur/pull/744). + +* In pathway mode, the biomass potential is linked to the investment year + (https://github.com/PyPSA/pypsa-eur/pull/744). + +* Increase allowed deployment density of solar to 5.1 MW/sqkm by default. + +* Default to full electrification of land transport by 2050. + +* Provide exogenous transition settings in 5-year steps. + +* Default to approximating transmission losses in HVAC lines + (``transmission_losses: 2``). + +* Use electrolysis waste heat by default. + +* Set minimum part loads for PtX processes to 30% for methanolisation and + methanation, and to 70% for Fischer-Tropsch synthesis. + +* Add VOM as marginal cost to PtX processes + (https://github.com/PyPSA/pypsa-eur/pull/830). + +* Add pelletizing costs for biomass boilers (https://github.com/PyPSA/pypsa-eur/pull/833). + +* Update default offshore wind turbine model to "NREL Reference 2020 ATB 5.5 MW" + (https://github.com/PyPSA/pypsa-eur/pull/832). + +* Switch to using hydrogen and electricity inputs for Haber-Bosch from + https://github.com/PyPSA/technology-data (https://github.com/PyPSA/pypsa-eur/pull/831). + +* The configuration setting for country focus weights when clustering the + network has been moved from ``focus_weights:`` to ``clustering: + focus_weights:``. Backwards compatibility to old config files is maintained + (https://github.com/PyPSA/pypsa-eur/pull/794). + +* The ``mock_snakemake`` function can now be used with a Snakefile from a + different directory using the new ``root_dir`` argument + (https://github.com/PyPSA/pypsa-eur/pull/771). + +* Rule ``purge`` now initiates a dialog to confirm if purge is desired + (https://github.com/PyPSA/pypsa-eur/pull/745). + +* Files downloaded from zenodo are now write-protected to prevent accidental + re-download (https://github.com/PyPSA/pypsa-eur/pull/730). + +* Performance improvements for rule ``build_ship_raster`` + (https://github.com/PyPSA/pypsa-eur/pull/845). + +* Improve time logging in :mod:`build_renewable_profiles` + (https://github.com/PyPSA/pypsa-eur/pull/837). + +* In myopic pathway optimisation, disable power grid expansion if line volume + already hit (https://github.com/PyPSA/pypsa-eur/pull/840). + +* JRC-ENSPRESO data is now downloaded from a Zenodo mirror because the link was + unreliable (https://github.com/PyPSA/pypsa-eur/pull/801). + +* Add focus weights option for clustering to documentation + (https://github.com/PyPSA/pypsa-eur/pull/781). + +* Add proxy for biomass transport costs if no explicit biomass transport network + is considered (https://github.com/PyPSA/pypsa-eur/pull/711). **Bugs and Compatibility** -* A bug preventing custom powerplants specified in ``data/custom_powerplants.csv`` was fixed. (https://github.com/PyPSA/pypsa-eur/pull/732) -* Fix nodal fraction in ``add_existing_year`` when using distributed generators -* Fix typo in buses definition for oil boilers in ``add_industry`` in ``prepare_sector_network`` +* The minimum PyPSA version is now 0.26.1. + +* Update to ``tsam>=0.2.3`` for performance improvents in temporal clustering. + +* Pin ``snakemake`` version to below 8.0.0, as the new version is not yet + supported. The next release will switch to the requirement ``snakemake>=8``. + +* Bugfix: Add coke and coal demand for integrated steelworks + (https://github.com/PyPSA/pypsa-eur/pull/718). + +* Bugfix: Make :mod:`build_renewable_profiles` consider subsets of cutout time + scope (https://github.com/PyPSA/pypsa-eur/pull/709). + +* Bugfix: In :mod:`simplify network`, remove 'underground' column to avoid + consense error (https://github.com/PyPSA/pypsa-eur/pull/714). + +* Bugfix: Fix in :mod:`add_existing_baseyear` to account for the case when there + is no rural heating demand for some nodes in network + (https://github.com/PyPSA/pypsa-eur/pull/706). + +* Bugfix: The unit of the capital cost of Haber-Bosch plants was corrected + (https://github.com/PyPSA/pypsa-eur/pull/829). + +* The minimum capacity for renewable generators when using the myopic option has + been fixed (https://github.com/PyPSA/pypsa-eur/pull/728). + +* Compatibility for running with single node and single country + (https://github.com/PyPSA/pypsa-eur/pull/839). + +* A bug preventing the addition of custom powerplants specified in + ``data/custom_powerplants.csv`` was fixed. + (https://github.com/PyPSA/pypsa-eur/pull/732) + +* Fix nodal fraction in :mod:`add_existing_year` when using distributed + generators (https://github.com/PyPSA/pypsa-eur/pull/798). + +* Bugfix: District heating without progress caused division by zero + (https://github.com/PyPSA/pypsa-eur/pull/796). + +* Bugfix: Drop duplicates in :mod:`build_industrial_distribution_keys`, which + can occur through the geopandas ``.sjoin()`` function if a point is located on + a border (https://github.com/PyPSA/pypsa-eur/pull/726). + +* For network clustering fall back to ``ipopt`` when ``highs`` is designated + solver (https://github.com/PyPSA/pypsa-eur/pull/795). + +* Fix typo in buses definition for oil boilers in ``add_industry`` in + :mod:`prepare_sector_network` (https://github.com/PyPSA/pypsa-eur/pull/812). + +* Resolve code issues for endogenous building retrofitting. Select correct + sector names, address deprecations, distinguish between district heating, + decentral heating in urban areas or rural areas for floor area calculations + (https://github.com/PyPSA/pypsa-eur/pull/808). + +* Addressed various deprecations. PyPSA-Eur 0.8.1 (27th July 2023) diff --git a/scripts/build_monthly_prices.py b/scripts/build_monthly_prices.py index c2e88972..214d39fb 100644 --- a/scripts/build_monthly_prices.py +++ b/scripts/build_monthly_prices.py @@ -6,8 +6,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -Created on Tue May 16 10:37:35 2023. - This script extracts monthly fuel prices of oil, gas, coal and lignite, as well as CO2 prices diff --git a/scripts/determine_availability_matrix_MD_UA.py b/scripts/determine_availability_matrix_MD_UA.py index 8d10f45d..efe9a712 100644 --- a/scripts/determine_availability_matrix_MD_UA.py +++ b/scripts/determine_availability_matrix_MD_UA.py @@ -2,6 +2,9 @@ # SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT +""" +Create land elibility analysis for Ukraine and Moldova with different datasets. +""" import functools import logging From b98f1ef9dc7e328393bb0fa2d8f405d868acb398 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 5 Jan 2024 17:33:32 +0100 Subject: [PATCH 205/497] documentation fixes --- config/config.default.yaml | 2 +- doc/configuration.rst | 2 +- doc/img/intro-workflow.png | Bin 205261 -> 232347 bytes doc/index.rst | 20 ++------------------ doc/introduction.rst | 2 +- doc/release_notes.rst | 6 ++---- doc/spatial_resolution.rst | 2 +- graphics/workflow.png | Bin 745458 -> 651103 bytes 8 files changed, 8 insertions(+), 26 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index c59ff394..b16f25f8 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -280,7 +280,7 @@ transformers: s_nom: 2000. type: '' -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#load +# docs-load in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#load load: power_statistics: true interpolate_limit: 3 diff --git a/doc/configuration.rst b/doc/configuration.rst index ceda1141..92ed269b 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -383,7 +383,7 @@ overwrite the existing values. .. literalinclude:: ../config/config.default.yaml :language: yaml - :start-after: type: + :start-after: # docs-load :end-before: # docs .. csv-table:: diff --git a/doc/img/intro-workflow.png b/doc/img/intro-workflow.png index da2c06d8013a713e0451b70910b7ae475f6f1320..27b5a389d97416a5c61710cba4beb41ce90efaa3 100644 GIT binary patch literal 232347 zcmZU*2RzmN`#&xukqFtNB=eXd$qr?Y9DC(ti<0a;l9fAqBr7{)XOr6zva$(D_THP{ zb@cgs|DVU>|GpoO+c`PsJzlSCJg?{VyacPMJR~BZA;7}IB9eb3qk)Bm&yIzKdkr5O z{>3+Y=q~)gGgW*jgLQ`aFSRZ^3JdE7mb{FVrpx=~aaR|Vh3nnZIXZg!m6|`Eq6`rh zZHNRx!kfM<%mM!d2K@6m^W*b!9_E`oWt3$L*v#uTsg205%nh+UwVq_7*j&t#EJRk# zDxQ1II6#>+(!j> z_1~jW^jf&lf8St!A~?P={Lgz6@tf}d^Va8pnYs@1-p4hA@0qak@pCs5Hur6VCv4eI zL-d;FWw}&@qMEr5#<)7PM+c4n{G8>j3OBm;_Y49g7fQ1(U}2eD>xr-6Jk6h!OQGcn zqpFL&-OBuEDLKx7_RB41XR11izaO{6KfjaIh2(aIiF>DiMvmFNLUsSq=Q31@8bY+A z3vBp0*mB!`>y%N=R>tG@>DLZ5+*%jUx4irO$=@^d;Qu2AuO!JH3(ib7pKUuVO9*7~ zp_!X%+g`O$>>fLIJP~7zTauN|YHb_;?{r5b)R3(?- zm8F)e;L%C%L*nd9^NV_|gZg@>jTUx%PDsVRwCzHR)-(H0!cA0BxLeN(yvqhogfb{E z{{8-Isa?zqW%i7Z^R;~N8Lr5Wqn zouhg~F;)Zz>IP;Dd}cE&+t26^HaEU|p>@>kYHFst{TyoGQ)nu8xOKR`dM~-}RLVFLLMT87b+wpp?j!8YVZWBglE(WO)NC59~*l>m&In*x#NwZ)eN# zVAd6mMWPWL_#qHAsUl9v^_m(L=UQlJzH-Oy9&Z8d1IFTztLR}K7Vl_8OPJBs^KW4F zU;n!)G_nQj#>I2gD5t2c(Z(bAz2>w)RT0t8E~<|FkvJ3&RUO^mZ{%=3C5Bf$0=uln zoowvr;p-E$%Peud9lq2Cvvplo4tLOpWDOb#*4qw$zmV$n*M9nh<5w-hE-MYM9*AWO zVc&r*X4#7gD}Kr@^!~p2|Nql5_r6ovlp~toESSG|hvGC8PPk{gtni<6e)xONmyg(k zqe(5oUg>Jn)KTOhvtI=^;-ZIjo_w1x|NBYFlmG1dKO8OdeyRl2HKaMoNJkwRS`-2q zLi=Ag$zlBaRCEM-AGp7zw+zQLe$tWQM14w~2{Zc7ZuS%ZT`P*w1H!MhqCZQ!#qaa+ z@r}Db&h39dEEe58H#bw2cQogHI@g(WSNmS-p$0Xoxw+Zz#=oY;7xjh%#p)ZW`pT$@ zF`ERY*n)GuT?lnzv2C>&BG2r;gFqgSCR3|7G@*-%|FL>Yfph;gDIO_C1?A;Q>^Bjg z&f1^KA(7}|MV`9tfg-P+n#mLHB9zNwZuai-$ks3_LTvw+KU_FiCVkl`Smt-rCC2YF zUPJ7U&hV$6?_=IQH`&B#YO*-4;L6z{X?N4vdT7Tq6Cep5DlBNq19Uw=z~p9;0TK@r-r z=6!Z#d^9@bwUspa{R?j$jfC9aozN*c-?K*3t)2(Op0jsS4t6UWJa?CM)yXCHs=7UY z;V=q2{Q0Kca5#`(R9~%wh*iiuJ@rB&quQP#C?1pFe)lMPJk&02Ic@pcPrJS82#M3L zggiZc$|@=o-e)IQgEBV1nHCF=Gf8Z|i}>ljR_E{UPb|9LC~?v!u`#w*f3*6L(Q|u$ zW7_!eN1R>V&R~0{7DMyeQE!Bo<6KuVPs8!1S)Ac+Gvnz$$W8_ZmtVfL_O%;FlV_*( zo=1fZr-!YK-nEBczl{EW55$~7iFr2OZWdNn!oaVgJoVqG?mI0H---}**k7OO>gtkC z`)oas=Y2BdUAI(NQ@>kYB(^(@0t@l3cUsXy53jF(J~eWSiCFh%JpSdm=016+TXbt; zuRe}%H!9`$>CWN+t&nZ}Y88j}KAP6vW3Og%ywZO1aAygLteZ`=*{`YJt6P(g{Fmzf z%h~UnGaYvlltwf-BjlM$9ghaIjZa#=k6Xiv?O`)gPL?g~8%}mPQZj9Y+&cw_U}~A^VY% z7V}a*w16^ajeQKtL!8kN9~XNYVYZjKKxx26o=(UT6%*cT7=}YxX89YiGntRpLFl!&k+Plzk3v59Ns$ZIJI`Vx;8pGdV17wmV~F` zF?WA5w-&C(^zIQa)zh%R<|k+!Ma7P)mvaKjeFDlPxLWVzdcw;Qw&-rWzgy$OV6F^7 zq|wxArF@7%`1!BQIHTW{(F(WG@rVwVC@WJ_)2@j1)4hhXs<{tiRWDfu4e}hGW_EDb z*se{~wZ5g#$nO^0qceQOOj=i0m(IqIc3S-@e>av3-25AaHATwPmC4hB?Cfm#bwKE7BNuAgs)~kJ@j<3=ydULsmQzAeF9aiW8}V4jSy_RjK}T`d+w3jH7^l`^@oc~MGf_8Yyr|~5gvbT z4H>*7x=!@dp@U02rQ5pP$aN;>YEZLj@%&l~)pVuO0lwdj?d@&b@#>xNHLtr39gf|| zg+YCL!y2c8ygbI!^`Nu)h|_OV&uu5`>nbbv4AbtaR4f`^2bd zFNCu&-tNgAFQGgSE~60f6zx(5_UFNKi;KpBe;-{(AfWxiYs_n+d8O5FlPL$HsAY7| z!@})4cl0#vzu=?Z+Zl`t_PSLLGo5!QZTsC8*Em^ML*tmn2M6{Xy?g&J&nBnNk-~Wz zu@#s}-FKIJCpGF6Oo~gc8?;6+R_Y*15L=asTaW+Zo6qFuNf}E=lJ>5h$7UOAxKZH7 zr+a(PpMF`EQzv&NPiwf*Q8HjHn4t6;asBVDa?_n>Uo4&H<^y`J8F_hC2HbHS%AS;^ zRfvC5JGAnVu`?Hqc>aFafaE{vTxPeX^p{{3O$}-M^%(ZB;xaDMuw8sV6QLw!mZ;|+ z(%CXKa&-_|6U90R$X$*ih6mhkbfGP#<$48LoZZZ}LP=hF!hg?6b+M=uUZq~n$>U&e zxIZA4|1r$)O1}z9Po<3){V6YsFUv|VO)Y-&kvjQpdH$qM0bFSkTqII)E=J;0)^!K~ zY5yp(a56rOHB0K0o4FRPI&3Qx+QNkY_1HV$?ZKd*RuzF@%ml`x&A@864Jz5EM|Dd?UZ znV0G^@RA^t$N#(*uP_UsSB*8bD0vt=Hu&A+67T3~zl~#Bw^#A0lRCLoXu~FVp!7}S zn{gf237`aPzsen>klRl#_61k!vkpQ)|Lar!+_~$aE$#bHsx>alN4k)wsj`^wQ2$+B zoy5Ok+T%AL4v*=#8HWW&w+cQS){c^nnN1f_yGr*T9=k)$5>LbGNWHI(JeUrRVwcRGityYq|BQDL3c`JFS_L8HAXC{_rXD-~9Pvnp45eO%s$q`LomL6%! z%Tu9NgjkdOFhZ9j1`JKtHj7PxBZh;sB9%Y1gy3>g=WBV4b7EnAetJ13a|!dx%ti14 zOO$+e-@v6i^SvJsE9mwT1CAK}1SS52PjuH19VM;P8wVcZDMbqUNzDts*>d&mR7(|w zr!spF;tzX1cl~+mvGko%AglbF;hFovWIS%v&5mF4I5Q-NmE}Xf*F`S7HEQH)A}DMQ zcoM6HMpm4Hntl2Ha~B_fX(HerT*#2f((Bf_=D#{O7Q*bSO^S7XZ@4g%CcJ;Il-(EO zyx~@7R5UcVHL|j+7h5@4{3;yPVdA!z@bg_<`k7bET2__EKc5>NtY;TqM%XB!!p46( zRH`@OK)ED)`1+HFw(ccX@vT~ZswBH%L87QsgzqAAJD!2I)3YDhFCb9cRia+wV%7o+ zp>U3MVhc+~u4wkDjfgam5)ouQuF8Jjl%HoU%D_lNLlD#)^K5&?$^8b&`hka0k@Ho< zP5Ub+r@`NS)3x@k_Kp2!cSGNgnIGYQPSsRCSRHwYCcG6^OjOu$xJ(;v)Z3r6^h;)% zar=&9md)fxHU-^b$$z&5lpmAJ8k?k9>CG6}w6Eky`~ASL8GpO^x8kt0p09%Y`^>EQ z)<-3~4`O?4yi}~&$>mX`N*|bhucZKKu#%Ee^h#Tz5=+q#Ek5qCS3`?wRU@&5@n+0g zxYuJ;B0_I%b-&N(sG872GM*JnGxrR-m-6 zSE6cqyFaU)Z7#|#+C2>HC8Dck;@E!8U z8UJBr>zzwfsH;(MFK0X^c7kr|gl`q7b9nvMb4dkHvy~-i%8vsyZ>b|BQ%28j~eGUvbH=3R_PME^7ClIpk@ zI)ZKTqV;@RX!P5)wZ@O}b5fRN8qUrOMClsq^qEEa^S6Ank+sgw$5z?pL-VrKVP`Ij zinpx~E*H@AD5h7!9z5l@t^N-P3&Pa)saEUt@&fU`&Z>D{MXo7;7p$2{sTmnl-oHnL z(up#tvXK+uV!ujCKGHj$>wbHdkb3L4X{jb^{>$EGAxXw_$`ut$7)IUB z9Mx7_T)eTdVOpHiFm6{FB%KC%p<4E;8!P{%4-D=eCBmmQE%EPZ-^Ud=82o&qI~6Hv zJ|%6TD0w^FO8544_P5Dx4EN$!B@*s^}qS5b-*&_lfQc#STV9WdWbt&Cq}9oyk(DB=V_; z-285QD_M3FNmgMk`X_!*5R4DZkM!@-7rIO`i>E!&@{HnsD%xzDn@4js2zEWaH|NwT ze*ggXDE_+#2~XK~t&dv_gN<85$hP)BcSTNq(#eP|-P(^Q{8x7~`(vAkL@rxA_$c>I zEh>47)OX7EusX3wNt#@ifTzxg=OSq&GgnXIdEzn&KCeAK`-HTl*ISX+C2vF&wU|!P zNA0`3cH4c_W?q_+kpZ=2-<}q!EFTGeS!LysM}2j{Q#eaW;b|tPwZgaxWg|nS*oD2~+-?(plO! zd3k1BNo=ufF$(1pZ`eYjovX*~Qo84yYAEfR&fW7f+c|F(e-}JiPIAboM>3msO9Kye zso6SF=-$11{QMeP^S?G+^z`-h_4H!<{~d*bSy-4VSZ3Z@Rka)H$8bZ9>upaROiXA#Bk^47n z@&^>+WYrDk&CYE@a{2+LI^?}$o!1qGH~Jy}^sZ(kbInyjHS5Ng0a0y#zJ2?)zyIa5 z8B*KI%1V>T=L?jzJ(@_dSBw2UJtT(kD3ped>ZQ@w=tLYXJv`p?%{tZGeKs1vWfEVi zksGa&J-y+=pYV~Iw7k+5Lg2Q0#3fRv8c%to@?U6ketETEp>Y=}oZCbLYfSQ_JZ8V{ z+wJJCyq9HqmzI|1BHCsDju`;bt5>feE8lFU0&#I0#Sq^x8PmO%$XVpvKg$^ZKW*lBQIlY!nV;QwbaYms~4PUyeP?;72LPAda>rc?}%<}q`cI6|sm}}9syRiqQ zRu1@2EXt^V#EKu16Q+ARON4*E)v?$Zu>ScGTZr@p93IPfKC6Gssy?MY*;sixvvmL) z-P@~PzhohlbYDb7#C+)8m~IUU3Id|F#uH54@)I#SPb`E4SBfM+&yN7W zzV6Ll8T$3}=b*TYxk690d6GcSKX@m?^RqNRcrR5MycI!gaEXStl-Q1xfETf>PzyFB zdVX@`+FhGe4gYxTb@rNw7FPR2*POe-&OpcH| z2d9lBnB_{ntoEZ3^_sedH8}m-C8<9B{DEpmA)}X7KXV^vqgz`Kj9nq9!jcURRyc}Z z9^iUg{Ns)WxtWQ{jVP#pAXE&FjoEC6U}a_HS!=K+b*i{ho!CL;7s+gu7~3&ZGGbe- z^L}H4i$YP?HDJKn@Tu;3z>v&1=k&mRrc+&im{g9%&9b=XYKpv^4f86* z(Fo!Xwf(dm#-H$gb-c!^dLMWdi0@%W*BZZ*%gUddBtrxM)`fQZr@Bs<(lFHe*5-i+ zKx+)nuZ|_SJmD1a1HW2yk`dEr!fN~xh{@kqgn~Xo@^%oWQ^|hW#zN$lmv@zzn3#yD zm-`OtyIm!ZalI%x!4!03+Tn2%-@pIa;N6gAmCj}drTL5lbsdw>NZZ_2u#BI!tXhi( zwK};WcifSvIyu|O_p)Vt zA08eKCS%=qt%rbjusM_Ssz?7P#x6xgJ&yNZpyLOuf!E?hhdtQ(eJ4Mc*|hpoq5=~* z&DaV&?zVP@8r#!S-4LddxlZB!#6!UiT`2)2>;}VgQ#B93JSzoBTM7!cEST z%<_5_wz}Hdl;T!yicer|uQG~@3JIa9w%qD~ZsT)OdGdmdA~bj_FHXj#&Zu&1Wy7U? zkqW8{k>uH#YmQZiQ9n{RJhNE{m}j?e&Y#WF>)h|ep=RB7g&+~vfmEg8&3@8VGO`S2 zfAAAqiUf8|>ywV}HNmPzs8?23b!G{y_Cvd?n=#iQqLCRF#A1WYU;@Z$H(&W zS1lpep`srS6imz%(sGl7$Z2Ads)OK14;JWC5(HvQ2mAN!Ya1@22}&v>`fb+bn{;38 zDz#n9G;%-kgvA$!Mf3>Uc+wO{dtbyXVxxvXW)ZDrv!gY>OU4i#cz9L&UzAGqr0`V6 ziF{2+87u=NI9lINIJpa%uT?c}hteMKiJjG1pq9<(1;*Se(VRb_!fss8v-G-2Z;t?1 zjDq^rYoRS{zMLrj1WOe`*=u)Bn|=szrF1XhTu!tzJTcN_NbCO9`{^>~sVUC;F1%bE zHmM(PMztw9Pq4jX4qp2xoD8s3cknSSx0+Cr7?96@{xBQHFy{h!myv;EnAeWjfOQsu z{03ysf5T2BG$5IL+#s88Y-K4CLU1GT%aZA5cps;5JJCTV0oO3+)DM2EPLmd7yo|a0 zXM7Cu^qHJWE^+-KITxlXFOkIaufl0C3~$je1Nm#7NE!IKuR~u!SjMF z6br~6pUhAp1IxPs+?w~|*ZjX2aEDpvWIKw82@A(7u`J|u%;=R{$3P+Cgbcro%Cv#f z8xIe!1Sn~+g9(aGcEw5MQV5YC1)VpLYL&Yhk z5A1=7i6jy!MI!WU^v{M1Sd=6x?bJj&u9Oa(;16v%TayAq}9Z=Bb=9jVB7Zn%2*s|Fd^>^XMdByQo43 zfiBGB126p<_Vz8qJ%<23^J1NfXJfBDu9=ABB1 zCOzv7QiUef41UcZoBHS+yN6*SpUFF@Of)MRfn2n)Nc{=A2d@17g`^5RxkJYM{@qM$de)5SWU_^@@Mbt>X|ZrHh{RICQG~hE>QSafJYk(>bhyG*T{KHj z@_EGe8~sq@toMJl0GMSpxrwn-%d53y0)a#Wv^*xYPr=v zEgb<0w%20wcPP*9fd|G;*da$fVzv~QVS1P2@y@JRCx`0m+!oio0L>{e4pLU_hWd<4 zzZ~X)8nH3?swXw))6G{#LP^Q1K=--g++Iv$me&xABcN1KkIr})@isiX7a68dh>gme zGZdy1cUixIQi`2Z~?_QD=32t1+%#PcMSHsv!;aCL2fSek>`t(oy{DDPB5%wU- zY!=M3Z=Y_KMM_O6f#LswtZR3z!rh^Aj|;(xG|jkT-eA`@@klT%1>P) zjYM{g3Lve{zI9QWkshvH^zOwxajY=L^$9a|5I=J8@@#W9L&j}|?ssQsFVCYs&jXIb zxpcM1YBrq>Q>{2T(bTcsf`2Tv=q}VLPTw@7;xxSLvF_huI#ThBRzuZCB=zP%R8&;2 zWtoF;09yz^lC`}f5AkL~!W<#L5J8)Te$7Fq9}A8&F&UVv``pB2vhPXKX_7@~XmbMd z#{W${)=WIl*C=Y}WwOZ^7g4YEUs5!Bz>EzR8ApgKy6>%qx0o&s6%ph4AIpWs6gJ#? z_!fc!KN?^kIvkj$tBpUt20c(3iI$Hwi)ekIoIvyOW2z>{0wKg$P4HBQT11CtU+}d- z%pE9Rz*t#T$Bct!pJWRW(#XEA5%0G{)pMZ@4IvQ`x9xfL!=t4Q7tF=if&kQ#v8wQ* zzngFEu8gr8HtJYC$T@djYx{EWvBE-bs1iQQ+>VkbxJeo;GomPzsJ60qbmHZmAv<&| zdc{jfF6M<66%EE$KYzi5hIl9^B?XB9ExdcAL@9*t2Tz*Q?E^PdGd^s9hmOy(VpaX{ zr!NvJBkcmcz*9X4jQ|-uUbfF|JsbXf0hLJvRoNvxJWb?v+$USJopzOD7#pw(NoOVv zh7MP-42L@%)Bp{WjQF?^LHx-d%!9Xgn)iuR85Fj2s#*8R5GBr^v6We2;IO3;2E^p$ zirN0^OUwOofhQ(S32^B1Uy=w4RM=%dOg|TFA%oIP6p4h(LUnU07uxbQDcs~!*-g2J z4s0Gmn4|UK6XPs*1`Fayk_f+{!U!`UD7H>YVSd5rwCI#iyZH_p}VC zS0)?P#9Ul}5@U|`k==8y!)lq~k!&GXgZzVtt_I;)6g{{eDE(xz-m||IZ7Wm+Np)$5 zrY`68^X1{kOMjhO!aTZ7cg!|jEfB( zF})#hdd8Zm!JgEq;h#kvBnKI_W?Y4=G)ELWGZStEi--`)IK->N_SaAOHBH&dg;(g(ItpkNKxNWjH2cGtx+%r2%r};L%g3!q~?- z%hwp$+>F;wn-@UjAyC#aBW;HBU0Eb~qSBu66^TQY0kn_)rB3{)$+5Gyw>6;<1C^Fm zfgZB^wp7AX{whc+%6-i8qu`tAH+=B4q4c@+n3**9c<(j(@g;0uIa*b*Tj#qEm3$0C z{BmdDHA{aC+A=}FK78J14~bOB%=zToevmDCC5DK1?f1t1>B*5IM4Rt(TLs1q4EJyR z^u@Wv!orfrSn73hXu_+LveOu?k}UG-aN7zU-#R@~W<|!N#}Ly$2me!LO))VfE*-q8Mh7^G|DH%7$h&ik9qt@YDD5| z9|gvF?&dYkx#E1q)42iik)E^%+n&QCBO^mY7TX~-kDy^$ZWEWzR!;YGU;q;Y0*y#D z-*wC!9vxkmz4kvI*=T^lVlvF6>`S`LA?cHA5W##UB_o+Lw1gwt32tTOyWZBMlFCl| zGHzEUhslBQJm89{x(gOEn95G&dGnHdPD5~TFf^lo7!R9u#P00w($uBnrAtJ3i2w!y zwhhqZMPj9wsIBlllU+PpC8Xy&#Rr>)<3jyAp`N$=l_KL3TaQ?3IjP+L2$m(v=N zt(qbZxH@_bYFmLz1JfI+EV;e^<&6d>ChFaGtTWC59FR_ z(RuF`pfbxTDm-rkYUP)oF5%{=vqX)6m}Eu9(b4gfUiqRl!^(4^)4t)6z5~Zv&2M>U zFS{13^N&KulQ<$IA{9MOzfZJ}(Js13p_ZP`&1u=DD4cAdtS0%3!G^z+)F*5(QDnuJW;&KTrU|bc$0-B09JsEx$oN0Q$sd&*~a~ z`SQhT4`@e`Z55Z{rCZB zozptqBu>+q{?OmG*2v!2*jSW-IH(!6QZq-7ja=^hh}F9d9T`Y+X=-l@W5YvxBG@{> z`#i)+gL{zjk#tut&5*=vV9;GC0{{#iw%RYgOhN1sP_ahhxrMGy^*CxG#~Zx8x#Lh_ z7yX++C1bFUDlB!kO>aX*J}}RJaF;M`Ty%%cJkGNIr(nykNjY&ZRkuh!C#JZ=+4-rn zu<(iTl9Ee;B+6eG9G#qJQ##VM+L@j$T%N$DV#(kl&wii>P-zE)q5oHK% z$yyFjBs-X&q3+uCll=ujaC&+=j4!*d%5`h@fF|j^_Vv&&@vOXSDypX(;)5w~*%HxI zWC`o_l6%j5S2IhL2mS~skJY)~4Qz*c&d%QcE|7C3@g*dFQD*n3u4vrP$|RFkl1Cyv zkuoC5A65mww3zmGhcwFHgZt@O2AJ4*G3__rgsN4$F?$K3@4x_H&Vr+$&%v5;qhCNMNWHi(YmVgS-I6^Z|THGVA&9{F;$}# zU=*RTepz0u&yFAa7M=@>ii<-ddZ#j}bJm1+cyzS7-&|TLNVQOfB?`%sQhYa}K+cmF z?nvMkBnaO7+it-jwCyyb4w^qD@1$EfJUAJ;{JEzq`TkvD;crx+MbodaO=#XbcsxZG zm3f>!#-sP!edR2M?re9sxHivV$?B|mP#hv;ISmbs$cx{&=hX`kYd{xBX2f#`eAX*S zQ_CqR08B?)UV*1cAq%N&!6@xk2;75D7KV^9N3+U4o=9a=nBfCyRwN$3ak2##&0_?G z`*iqS0cA4WCntwHzLF*t5$hg~f9_9_g%ywCj637T@-)&UwY7OH9?XAZ)l=W@QG)#` zwNPbxXA-uvvjgln4WJcE1TcHjZy=B~jL$eg0uGSAc_qI{(%{APW=(v(53eyq zJdFJ4R)~pYCYaXsFYiANRr{`ef{z_Uk_Bp;mUeyzG9jcw(yv^((nI{M#H_>3-QD5{ zpFMNCHTy71LEU6|qC!x+N}s|c0qYh2e>ujXrSUSWsNRkXKIqImYXO?frv5`FJ#}(V zabpNgc>Zkf3!uFH1KeKTr~K=z_3nySw0tz-Tz__cf(6ia>?hma$lJyN6Xgh zlBnJ{BesK-cYkFPB3@h~X1Eg699C??3zERYd!k<@-ZGwb59^|bmFo*@q&a6@J+WR@ z0%%*TEi>;-tf&yeB+u|d=!-DD1KYfJFV|a;BgFIu2}CzgkL?GQQV43vu15vs@M1>| z!_`ymz)=wQFs3bUeTz1tHP>E=THrBuJSk(LP3Z`bZz4gj@hmnME~%_(B~bi>@UAhf zktLzTEJ94%Q%G%@d3nt8W0m#~ah$Po)YH@;HbZyBY(>mW_iCVYK|#SjkE2#d3)8@Z zo`yp+l#uXZm(1Cp8Ut=e3qWx`fnbs*@@g2Zs!T>NkO@jGNMwO1+PeJELp+48r<68T zgX!IHsYS#&hYV`N1;?%_DF(*-n;rX9sO85iHj}>zI`?QOuOD8z$XYKH*asj(3iXZP=ny^2Czi`E;fEU8wbjg68VF{WX_?QxS!7vf>Pe5a6!Mx(z@ z@t!o@_PeovaymFTD0#ytd7}!#XjGe;ybMPSD8nAF;-ucknC*8Sh#;W~X=nK`+MtwJ2h%;_mvm3z>?L3$(#Qo ze5gim#~Fa?38U5*D0UGQ7ZMT@7cWdv;F2dL3IMeRUg5KAIWN=#nB{BlM~$tZd7R)5 z;LrH*xP_RyJ38KqYPU8Wo1yqWeisA18oz+1XVAj5rTe%#P_$%V*nl zEjLYRl>6Sam;&Ko76zov%2?&}CmpPK9!#Iy?ys!Ur#)YyRM zV`qIAiB+Fpo{AQJMFhqXM6_Y{XMkGc__bIn~gck!;D5;D)yRcB=7jG678`K>Y4GsM8{u0RteB3%s)G zKrP>X0LQyW%*iU0p|bLk*2jAo=t^<>m=UYzIS^RPr01kwTK$DaNss~nUBzc!Ii~$d zN4;`xycqS++1YtzWfN6Q^{igWwN-{`10#h$>`N&uX8dZK;^{koh)9zxZQI`6g<`?9 z*aaFIv9T02<93+aFXl^7dUk&Fhgvy0MpxIFmFkKZw=V5eR90T{m->D$$vBc3K$wv+ zXwXRKGW)Em)%yfEB2)9V@?(rD08J}>fcw?4#+U*0QKvVAH}QPXP^`UWl<1;@TnU^( z_)oE4k5dk#dlj+v8KEHzeG~xPy#g!qy%|YD&-ekie6|Fr0p%B<4Ny%2v;xVpth#`5 zs9Z*`WxsVf+)ibAd0UC?wgM$9+-!877KQ=$*(gso(REjWsJ8TG~2*YN*rv&eL~Tii10C+u4@~p&jdrg4}$zV;^Orl z2b)QD)osvuM$4!lA9Q<9OingHwF{c$a1rgCyhDsZhTom|Jhrk1I{pV~Bq&=DT02jA z?qQ}Gpm;ffX%P4qkYi^LSl6BGj)4RtPjo!GaHq`PX`dR!O(w*WsOs*1w7>5HoXU73 zhOySh#R`2tw6x<^=jrJw5GfL)z=sCP6O<9EA4C_n4%G09dw?%UW-qrL;aBbh$K;4f zr}I+{RwECzqXtwsr^v(>^jw(kH8&&1QgJ~z-meec(GRVv_`jiv53m=bW~1C8!jik^ zdAJR294ZtD41i4CDo4JU3?5?2JU%aU2D)(9mX`GE++K+!udb|ku2#*h!qVD%Ow(e3 z@Bs{C7=Qpe46+O8;30TcS63e%9@d}k6ivD<6&!yhQx$yy%Q5bCv;r~$_2{`2Z*iJ% zEvJcy7E`b+y#_B&3yV2mbH%sQ&Id#mmX?+l7JwE7y3_mgU~Y1^q7pMBfeI5loX?m% z-K~THm>;kd44~C`{=8?!X>Vu8(Cc6ZoRm}R(=d=EmtbI~mBBrXZ})hs+k5^2WA#j| z{@1DX#>PgB@_cOU{!CwI2P*}Q8n8-$inFX>gdtLqyQ!@JOHCD&Ft(UO>8!f~(E-_? zo}OM%=w`ry1{-+}AsJG3o&B2IHq#pgCf))Xu-snBaU4l8wFybXnC+`Y1*cS0T6hOi7O@U#};6IG=y0IzVr>^MXi8}YnXJbyVHh??_TqaG6_hBAp zm3DF;UAH&UL3MOIC!tD=T-X^hzMG(QTzBkf1dDGviM%K06!=E7k^mI+wj`huGfFQoHeLci6x-)|A?vL49fz zOrKoBxCorcv^v{gwr%RUXDb)1z;c^*a#nNfK z0+=I!|BVP#G9)l9aRI~G_9wC@C_xj&x+qdr>IP!&?%L3e!+ ztFayc&598iNplb}E9qq^5=(+guUw4hx5se8|IO6NyWih?xjoOmu zSc4W4fr7--3mLJ>2}bICL zOZZ?BSy)=KC97cgjZ|OdMNe_Y21uWv$mqBlUt)X##D*Y!Ili|4DNq5DLlMj<_!EnN z0W3@G@e3zH{E#hK?@=io6-r=1NP`=rv<+Xy3@w2QzSdf5vYnmk3JYoQ zb74ftZ{RcModwB|JP0U4{6CS*e|CS4$A?K!|kD?HvIcxXFp@qX&|PiD$XHBL0CS!7}?$W+)Z4 z$*TW(_rQ#%2^t5c#h6a;$FJ-!)$AZosfz9N$JK9V-e3JP-F>>;ZK?NQ25*DMYa=wy z$Zg@@V6w7E0IZwN%1TP>9k*`X0(c1+0XficGS&d~M7gNp^#hO77;U3mukW?_3|G4M zCl)G(WYzoa-$ff<$Muc;uuvE)Wyh@K{+`poR@R!={ABxl{*e577-N(iz&{RiL#NNW= zo&ZmJfBe{l!MF7c#uGNNe#eKi4)?4Dz7b;hPIdO(gx~i(G4q((3V(r+BYdD@cTCG{LkT}v6 zN*WM&R?Rg|3E0E;62q6}k`7#{{f!9k;{tn6o9dm~lNI~!8HY6(_yWC~k@v|CXWBd?>eNnp5$uU@T(6P&@wrOr{`i^D@= z=qDY%*>7zr+BCEm!%Wzfl`AKW52R?SM{^`R+}X>^6B)njpJjFE9Ao$lm#~gOR((5n zAewC$lr#hH=8Hx_k~>FJUAX6rn)W`-)SzZo_9qv z{*LOJ!{bI9N@dQ1fvzl%?cRrLkO~1YoC5U*tWp&~kNp}i*b$;DR~((3CSJ619P5K@ z?(g3PppSqtOUBbFM%ZTh`%bkm4rWl}#MRJ9wY0W&)@kq62cuzg$E~Qi`KLUK`@32 zY9bIxz)&n0GRW^5o;1Hsvae5&*azXr2S~9pOuc=5FM*4yHYj9Iu@m7z%NZ*wJGN|z zkuB(YCE8@FA}oUvx!1WsOsjO%55z?zsAOa)nK2VY(9^Ik@0$LgsVgfxgFHF2HM{m` z1c^lMOg0{;ZBGs#%X#@uDyD?4JB=N)w=>krZxkVJlO1y*VOUpqCj8i?`cp&iJTX2N zcXT=%FiH^f1a^btJ7>`W!La zzBAB@=6ragKPa6IQc%t*NUpJXtbs0NBB^{(|G=@&3OJ4_W>h-!iNtd!`QA-lThbPhS!Cv*TomA53cJeLxNX&3!@PyFxX}S2ouQuFnuI&w| zlTu%*KNHe-cfa3v@unk{nBQq@P_imW;+Bpt463AP^u)Qh&--Q5#JJ+sJ^QhS>(j!_ z5D^g;27?pxXM_757;P&o#&dyyh{c-_j%O~w=+*24sFo_n!Y45qijYVw4r?Mnfer== zpndpr8j`cX*QT{S)u9z!EDAk9yfE%`0mu2KCkjxGUICoIo~Td!hCQcJO=iDSuxXeQ z%bom~Zr5j&kIt16^Y+DKD{@>}POJrAM_=imXq1o8LN_+0yN^;vw^ zBa6sx6?>?y;lXU?jnq&08T^f@SNy%>5H(?j8E4)ATEW6tx6Flosn{56&hC zjd2<^fQCJ`^&!x zp(b~Alo}!J=AGwX(b^KTsh{k`33F{@a1r6JtceS+=}CFfo%C>Hl<@SV%^#NM%n?cu zXhjMt-}gG+50u$AbAG=k(P`$3OH99`d+|(#jgXh^OU99uf_>D{pjZN8_rmEi{%*>S0O}VYt0E`{&P}=*M()S0BPS z(a}i``l62Tp^sFG!1tRbshysoEzrQF}@I*7ROsv}KVABYy>IO7Vv z0>!613@dI}sw;CFe}MYE!$*!mC`lqR~qJx0{ia~Aty7Z(>j_vP@ z+DBbGy%`T-dpoG~>pff{Ws8YZWh`Wb>TOGPlz__l<9VeG&`4AELvo7klNj@6E*zZ1YDv zodsu?yRW;{Nss8iC(^#8`j*lArc*56Zox!HZKUnCLzvY4u38#@y^vn&jWYR88-5qE zn=74Hbe%@N*-aqc2<5i6wjwby5SW{HsxkDQ5Q{urblC_O&xz;G|228@`13`>q>mXq zMY#?geubAzeBn`GY6di;Cx{C{&Argo9vux)Ud+nKvxZWdnY2GKck@ich-(Bf>6)V&cwu`Nsb z(lV4egh{Lf(E+k~43gK=*9Qc^rq_sPd29cyo9I-CuZzmvdO)8G+i0 zoF!A+j@z-Xay?sAjZ=zN=9ZGZ*bl>wG%!TK$T&B-mCgncaCOx#%+Jy~F$-cT!A;<~ z&8|wl%!7(aIUj8dth3L;4R_F3I3q#GjX1grb(4Uw2nqf#C3znjp!pbhp$VqM@)*VL ze*+&f7L2AAXt~)G>&U2UlFLrI26J~?f9B|XJ6nE@oMXLGa8(RQQF{jmXiNSTxb&Yc zzuc8$seb9O?<7fB2C_9ViHZk+|^*d&j zCPgH(ifL-XFlqhm+nZAf>Xh!Gk&$3^l2EMfn^{X8|Gvb}3*rTu?5~ms!LZ<%i1%=* zBPAG0vh)5>CX3|t#HwH8Kv)HVW1oBpmL9^oF>-O8l02AKtrN>3W71l zEA{L~Kb$Z8UP+sG#&3|7SV=vN;<8Mf|+A%PKuHo2Wk$XbP*xZbK$Ea(} z&d%@0-s|4C`X8xB!{`{Gep{gqdzb(NK`$2<*S?${-S!q{YiEoZL9^;qlPgH(fEky3 zy?h}tIm-%~zJF&TpG6S({n~K@HunZe<1b4ecEI^CwfyRe+;bRCk2|E zT)x{Bwb3wBJRmNkM=m?z6ijgIsczQiCsQIUHi;EBL)?kmpMhhkt`pWw*li;#QjR6K z8nrzfqWFwSCH3`fj%1a+y}di=WhW@C#(17=+7L#L&Q>TiP!z>x)l02lrSBQvW!u>4m?bj9;rAey* z)PH^Orrp;Mqpg5;PWbgQy@DO%o8YUrKtQYv4dW0xV17nE!e3E=E*&T>@%*WF@KQlr zz_NAr|Csvjcq;h!Z!3w2$i#DAMvrLXGy_BPvEKij9-?`(oRarGt3Z`aVJ zcBvFOCU{Q0}9KyuR2mVXh9=?Y7}`{hZ}bzb|f$X2^}!l!Q%vU(q_rrQqm zr{BF};K}$>-zdr3Zel;s=l#*?rmiLzs}N7z`|XpHgiCaEGpDw%ruSvmkEGiIWWh#J zXS((h)g`QPzs5Mc1!tUx8a(10h)=i*d4MAJwe%#l88RacO-yhz07S+}{|a7$Vc)NCKPUiRA< zX(YF-8ZGB02Z5}FUe;d74pogYSr`K-Wm>s)@^wd@L_1<{^4k%xX!%pf+d_4N4-=xMTG4?jx4-F$If<0|ZKTBl&TnI|{=6G(1Is_s`AQqB}tI4@h(z@<4(DpgM9(06032XXs?EEWSYCuw;ZYUSUj0hv;E|OtxBvB@Z_g6v+mS|hr zrFQ(rClZNj_8vE2_;)6`FHCaAeed?1mg{yH(ysJzK&8}=$ zeAlm2 zpg)+c|Nd=L8`Xb>YfX!+k$Sh8+gRx;5uv#Z*)Ia8*kO{3?{&=Jj3h-TMv$k>7=?Ep zi5F159{A~t7_L4xmnTQFCK#HVciUBc6Sk6h*cgyEu;!k{1*!^E3VvthBt27@M@C~b876+RS}V3CCXZKR)0_Ph za@js)jANt^jFL;Vbm%#8v^n=2m-D2@Hb&qM>AKzXtvCi`-*BcBS+h;81!yCqqI5#V z^*SnFb}_=qy*(>3pz zi+8Yfw1mzPb&!ItS(}StgN94JP3-qHGuE?@uz}o~ImZ!gX zREk|gVWb}Z`^snciL}|C+n*o2P0x2lwCt)%A~j=u>LjdHbY+(~>}|W>JtZVJ zVcBMd7>G2}($aeE^?ZL-8?W~C#JA5%IPp6vQY#@@;6OLtpus7zMzR2>)g(hffQk>o zts%;j%K9C`oR@FanjEVVWn^c66N!Pvi^(a{Ert^supuv}k|_9+)J8)1IcXK|eekMz z9myu*t0flYUQimzQv5AObvZa~qNszCMNvVh`FBQ>eYLm0sWQ!b&t-#bZDx$=d)F2V z0S|xi4$Xl=9)(s+52*Lk87LL+DRg7{ol%37OYbySVi)GLxQlXr;gk3N98dVrGqHh-777yy@49Gm=(y+ex zF1y;5(jZQ_gn`ubko-$5*vc}hD}hi`Q-f~@6Azkxs03Dz#1q+}lwEMQA2GjOtoM`R zUe)N{oj8NU&*sKWH}Zutg+@3%IIot72!wxF+*rO}JIs9!-SOzlM%lz|YkKS2TNsZh z(0Z3{Vw4d1p(N9hh1W#}FKN0a@V@)<*%BK`7FWy7;+wpX|` zE`T@&oaaY|X@ib6Aem8SPo)Wh2hh0|Ztn_1a`7Lv{n^1Zcb%F}Gfkv3y){UGuby#N z9I6~G#2HDG))O%}+uged%y7$4R4b-W6c?=&UPpC2HghRD^1TyBfYr}%E*qmu1n}NI z@3d`eSE(!S43{s*=w8%WpB)%#xj+lqG!GvN(UNlW2k9{*aU`ALe&tRIvup9AjRb7x zU!0Dm4<&XTrG64#>bq%U1f(?}n%R=H4Gi(2w~z!Qg+J!E!C#iLZ)G%OA;3isb*Fso zoB;)b;OA|7A0HpBPYNJK;C#j`AzTD(F4L1Fay|(zalO=B$xigOhw=3|`e)P^KiIp; zxcqvGKRF({k_fR0b#)Tx4zNsudlGxSQhnq*`%#;~Ud-Z^Ba5L6dRPAZd=9nO)B_?R zR;6hBrk=Q81WGyrLC?MpY`{TWGU50(C)hzb=U$iXP31f)y=qB&v*DtlS_Ow=jbA`O zfQN@L19@3l*_{%79cp-Lp;I4UWul{NIZad`$$R9+a4REKu*E&spo9XgsDrh9+ay|` zMX+Cl+RuGt-z9*{{)x-OmIJY8&w*^4^exAZhOKvgIn7U$|M> zt?4{bmS`&hT6Ro1FL+A49;Ue0k)p`4C5RUMY`ZFnbj?Py>8nK#tXC76^pTDcFHTXPM65xZUOxO~T=b#*t1KIM8RW~9rcn<_Uk z-2= zZhW-}gvH7V@5(yxn;=PB3pnzTCQteUqJ)Q%>FKnrVNM`_^x61{%kp`~6(l=34bw>>FA!6h7A@s;Gc-EGoL} zlty>&>T|yO`AJw%Fzh^mZX8!Mc%JG#)9#uzq3XMj(4eHUDrqyB5&feYM&l5E6}z(X)JZuFaJ8-FjJj3(5o$=jkT0Z_}U- zNNqGn=4ph8}ei7zoKg8fg0BC%qnXJR@`kJ){X=ZRl;}QVX)_z(i~JmpVcDH-L2* zWM;S6jZH1L_DbG+RYrda?k||)e#Nb4I4t6OW5^2$ld6fID_0^&XuSF}L&xy@?sJu1 zXc*{5=HYX3s_llzR=C*WB}Um8O__I|YZU-05#AHIi$-|W(SZzACi1F^i&5ac>JHFz zNHyS1+tFH#L5GGjN9QEs;|>?;ahDCp@Tqrr$)i146Ts-%)rC|QBoI}ATATR+UJa3r z+&?WM!_%8ABj>ZYqGy2~2bOk^dM=vzF1+dX_Bi=0@Ch)_S3*EoKkCHL4$`4e^W{DM zTIWe_>hsh}ck4Y=fH_J8D9!?RXv4Hbk2|gF%eHj8+sR)RFJRQ6X-B-w$bj#yp)RJf zI|e?a6jzyzQ=t4|1RTF?OASi+@y9q+v(SMh1g1Uq z!i~o=BfQEXoE6)xfSG6(;$Qn@ArQjb8+Vbg%c)o%ESr!))AE-nVXxw$AO=yJv{6uqk+<7B^p#6=Of_pJ^5{x+bhmMUOWCkn7%<=lwdT}xRj7kH4EE3MF!6M zaXBu>DZ=aaFClMFY===5*K_+BN$2YpL>^qTu&k6y2?dKJG<+*l^)zt0#dN0XX!y+r zmUkza$iu2hv^k&4K0YMzr@TlTsZ%ltQJV&uIb7$%%J0}h=9Chq$R#a=#Q$ho^4#+z z>fjgYXKs*fmyC!w72$>Y9?B#5^NspWsR3{}(CWYmoXlcZ0OT%mv{E&{(zrBBVQ1YR zngW7FK4=G}bV?1_5|p{9Uw515J3w0$J6n(aScy;$z?EIcAS|}B;+dse%oRP>S8P-= z2>Zs~O};UEohzj?o{?-kWp`oM4_jf+Ge5AOYVhVyQl&tH$TL88dTsp??8Y=uZ5$l< zq92W~Vwr+HS7aWE(^WO}#>0Q;@X;X;4HFe8#wZTH)8KmI5}#V>R@ z6X)-MeGP^CP3XwfC|QJ-6f|@;g1go(1YF>pmG8YPOy319+4$;O%{`(;BLWnTbsyAT z%s+Lg^B*A>I^YL}tq?=!R|@wh+?Y&p!_DZACSY8eHQ?=I>!>6>=iD;{1*f<2{SbYQ zR)HL@PxMVQgru#&wQk%-Kido?|r0UyFbZVV(Xr}q?Q~?wui_rCK%ReEjo>~C=>_vLURE7MKtZf5B*%OZ&npte)yVMM+xxiV((%@@GPB{sOHzZ&V0&R zy9-j4G%=SUN0I29ADMD40fzt5l2$l3M|AU#=u}ga)M4W&_9gmVi{^f{m zIfn8aE;kTT5rL7F7RqRsNRN{9=WyWZvr>g(^J__}NPLL#@;0Q0#svEt<5%BW z*gee9@VrD|`QX8Is5;ML+pPXm@k}z(_Qkcsw9qz+XR(N>6%1TP}8{x)BBfJRO%MLDJ=!DsI6PO+e8A}tv%y{5atj{t#oB} z`l%IaC2;9x%!3!_X71t;0$UzT5!6JrY62ujfQLo5iX&}}QaU48`jqb=l_==xvv3~V zt7x$o4in<1&O-U%tH*%pM?sB1T{=nU&;M!xVzN=R*OLyZ|Fwv;JR-dQhRJi{(7l5s^6v%#u?ikidbrf`^9(6A!pF zJQvOvh){$`dwcCv_U8tVCnsorT>+TdtSpLz{%L_h$+f36=i#WQsA;AaprW*K0&`5f z%2b^R5R_8YOSw!f~M*^eSRp6C}v;oS;kte8o2<8jOg zF_$T7g3z2I;DFa$LV>7TpQuwnNI)ugPmgv<`y*x|D1Jex0!3VnaUg(}r{4mV;!n?g zNLw0wj&B4CWiaAh(h50q_fD~ zD`u0P*I1KOOW(ZV8viV;0k0JJm{He%$V=V?(Mhre+4?!SbOCuHCrS-uL4+~5Yx|3P zfO!1rP5e;#z=SZ>d@zYK#T5>xMkIvhwcITBef>JipagVMyyms0?;wBb#kwfZCC+EW zRz2l`g~7#xjyYSI~U1k0gJMS9LL$|Es;C@hqynm_rM*8$uzVt9w_)yCI5 z2%|Z5T&AnlG;*d$RVy&y_fMbDN?|9Sc=?>6a<$$wJA}{!(k%uqnx`7_zN@Uv`To)< znURhTGRcZoScz^SF<@<&%VV@=fek<|Q6$5_3O5-$B{2csZu)><;}qzDrI}uNus%5V z?X!g?_Ucw0z9{b$qW|)%%~<6Xh9{>iChslV)cUL2tZ;`Jg)gs~TkKMT&grX7Ysz!8 zG9ncRwXe94BPZrO!Hj{+e?G(i?P}{P;iAVOWI z5pyZLlBR%+CflZKdN20nV^2W*O?DOd3fio6dfCrMd=ffG98Z=Njyfy72p!JVe-$4}jrD9OmK0s?t|StolDwHKzZ-nxsx=noZAaI1|Zns<9xsz z4){y4-g(yjrMv0GEO4tKKxkMoPl!VP-Uu0M&1Qyc0G+MOu511nHaReS?QVdM3VwW) z^8y<+#d|#AeDS;*f7K|dS{Y+O_Ro4MI5?X=Rm!L~`Knsx3%kum8*JqH}H68U@k9+v-T{aBBGmH}MdA16Q z@k80wf1z6f8U_F)M3{7%Uld1&+K2{ExN+&*J8VyGTDRt{{j}4LrlR%{t7+JIo!##p zMJiNd`~bj(OEKUWNb6cn#)U{S!tnd|?|)OcCqN510z~dZ7!MLIns8)OB)KO?TI#&- z6DFu?=zO&OX>DwbV%uloy-!lTc1MtO)~g{ZGIFVLi{kgsfwD5@50;&AG|@R0Mm1{t zCOXtflz$^@@&QK`XOQmpwn&JqjzeeT$c&LChF9{A-lmD+?Obm@Yhp$K6ay+){DV)1 zK)0Egu>B9<$M{>j#&{J3SZw%=PeOO305km4m4-pa&T3}LPOi={BPz9EhgKL86moW` zLER)Zt@QP2kDP5MYm#4auG!0xgP*&}8mf_sCd0QHp0hGnjX8;i)Au%QZ8+A{zk7G- ze8h7)sdhIo8qn!gspiEviH%>y?#sp>d)Q~-6t5<#MG=Xy5P%M8Ii?HVeQfDwYF~z_ zKHsJSDF$HRU5%~-att+5-rei1*Sn+k4%s#wN`*W25b%-|- zL&S(@ng$!)>zT^Wmns(LnUzC+WFH6EMG>?LFr&E`X;(>FffaYV_svGoB$|U-2@u$r zHauNLDbagS9xW}wIoA2H;MD+0l>jJoc1JKvc}VbZ+%jYZy||!7)}Da<^Uk@ht}Yn6 zAm=tO4!9EI=M;Ptj#2W(e9L=RIToBkG8^_$x|Ix|u?SaKaDH-{z;w$u2)1|leIbp0 zhW3`kS>`WB7nr0$tz_f6&y}PxVxWW_fY6Y`HRkm0cA+NYu|1-XoLZxIejCKF|F&&4 ziK{-|HS|GUI6dfup^ccTP$29)1|v>%hpI8#CqEB zg38Fc`8z9netmSCXfdgLJ-AeJe;BlcXm6m^tpjxXHm@;EQ+HQ zr0u8-fV$Pa?tA45sK^C|iBRMhDtURbDUh>}dhBKRF-#NZp-yh^-|u*i;z5BfiZDz- zf+r2=uSZUZ_>uYMTCzm;Ym$mkPri`Ch3Z+I6V%P{$Z_6QI~=2W{Q1|foW9WP;bn;b zu&Np*53(T`1y<4GX}oGaJ-Zl?pQrT;_>oY@4Z{*6@^p&QVznK zc_Cd=JzINZD;&Bw`N4|=sjFoI+?n0CSQG4p$I8D$_Mv7W6^YqlD&vzX_>Q{lpi~e| zD~;grgm*aB;vCwOBsS~@a|m>{KK`I zNSl42$GE8Fqe3!GlG|{2JJGhJ!n13ARYg!2iF*_<#Plgl znl=rrCE+{e_6whYm7|tFt-?gwZwImR;?}KOkS|k0egw8NNcu@q-32E~_0kJOpF05x zbnvO{Dum%PpCU-G?I*L0VvX^+2%JhPFZ(AJMh0#KB57R>ncs%eL{>SuOiB&H=_}SF zf36}4a8p_2pW45(v!W&BT?_XS{ug|V)v8rGwkB>&OMq2>`tH=si z`DyE|QiE1$7(j95_g`fiDAfRiNKkgVH||(FzTZeV1@QSEcndJdlul1@ChVmb@j%1d z;Jr?XhHd~#7h|hZobO#-ZL`oUn}ONEfRPF{)&drX++Hr0-!KJ2A&?#wzZ&x8Q2^sO zhopUtu~IakLH4R0HV%smwQNv zwed*~|CV&{@!!pV)yXLkseqaKfAccPp;ijz#(DTNQ2nlB4L!pZf;eoz1p2ac>c=c% zo49Z_3M54W5HtNOP{Zv%mkFGNGY3p}8^fTzu%^0t7S0ooM8=gDS)YonJISz2`jxD` z9xyZ2pkf&5NM+ZsqKF~kZ*>|49Vh4<;0!SqjexDp&o;3J2t&m=necS zD|@zA?ZHLV?6b)ll*TOc17t{0SS#tI@S9KNyGVsGD}&e!9ExpK_MMM!uqeW|Ca-Xr zXBF3hgtj^Ntee6sFS)g;VMoeu+doD<ef<+0pTh+g8yF5m$N8G~m2@V6 zE*u%rW+!Wyl)Z7IcPst@!6=S^u1ZCk5*+A6s%5T`h+tqg;zK$z^g(M|i)MJdF zyj^O*QfJwqC%JHH@cp^5$vSVRpbwA8$hy33G~9P8mYGg;OA8m**k4t&@_%}f@DctnQl=SKA4|(n26^OXV8?2qgWKZ;} zd)+I|t9zrsIeX9yF!`lGM^ag-TP6v*T*$Q*rjuU+5;{qB^=Dz8K}o5WL#7P?JFE$a z2sDHPoce(Rc+&?k#bm`@MybyYaHC;C-GDd(Pvt~mAtAPCs9mIkPXj<9pbBgXRNTZY z1|_@SUka^?D{($M0L?vu1u{oq`~YL2eEcPF4?nXIP!@25TTB#wsl)^b@JhP_$|4iq zOR=+itDSlm#8IK-6?eG+=C;7MtucOjbGB*TB8RJ>e-T1*Y=sDZdrGALV2qXk!*yR@ zqOOBY?Kr3$-IAg`D0HYHa!Hu}fqg?%0IIMbz6)1WG;HaMaG@)K6b^PrpleCz+$S?4 zMN}gDLI&`ECWqH**m(Vr>;F~h){+em`cg6>SY>4KnG@Mz6`Awxsog>Af~ zG((xME2_MLozmam|L+Zp!c*49f&KI_5e&+N^Q^J6;3xk}n%>{p_NaT?@w-tXQbxQ`}FoJvn$zqrc zo22o!6jTxJKJu&CwLk;_@Bxa~y2#o0o11P}d65oFV+e02xQ*eG(=CQL@VV4NYd`!a zS6`|V;)McI5jzXdTkFinYj=ZL5O|8UBI^BLZ+{J)KghU#BO@&he}4wlF=UAoHRa_< z@+g%w1zts+fc;5t75}g|6nTvBrBs2Fj&vJd``iRTsu^!4f)FR=U;Z>-%KaB2q5Uzy z@{BqWX+0%`7Ig1g*FAO&{Hi5`=dV*7$vV^+NAx|@;~td0_}h1C(L=OMMd;;sFf&q< za00{)J6<$xUyP8z0k$y*WGq=#5Z=`&HBjL8?B;s_jWhy2aE5F9(($yyEJGHd~*@$Smg-W z&`TMnOy=lc-@iX$2NHM@a=0g%G&^Ai2?Qo_V(e?iVrcl^)u;s6*@2WNrfmzXoHgsb zh(2zJQ82i3hnVF*lJ39dPk~jZ+J#T{s)lgzGC6kQQ1xprqLoCPwzOKNqMKoyPflJk zul}sBvz3YF?Su;2)>g^rH7M*rSHSS$3?F5Tt}q113vvo)G+qxc!xDDR^*Po|(q9IE z)e@&BYK=`r7cN?J^E-dMpnB>^U}I?a^tMp0g~BNLhKXN!pD@|uhs+Wlm5mVpOn?^( z$yR4|p-;(AI=oJHwcoUFe`uXqpy{7dX5U)qWkbUcxP`R@%e+c<16Q`Io|Nxa-lX&T z$2!2bp&%dgVaie<$F3GIBeKg+={H?Hxl>?r@-MlcM!`$ejcI@?BgHx zu0wU))~1Ah)H);X_Diuri>N@KS}71*$)8-V_3*fPFLe$K=*4;Wutt#?B|{$p-9wwzZWErcM(cQ04Lu7yaA9K#!vHD3 zVOM>CXcd4dC-B0x?I|c#7-HJKCMT;(rpL~TFSv}fOV0d+66e2$JcSOn((IwNwHA{h_xp$rcXi;0OPIh)pw%ZQ2&dCz_6IMt5EN=I}r<>63}1FAmz zp3fN%9PZGf+Y7%AP=vx|`vchCNE4gn6Z6zL@r}s4M7(=KT&hM70~w2G`JlrFmyz>@ zLJ??KxF{bZ(Gb-M&N`wWMb$*x8KVFB1319#vkA5bkP8r9TWC;{{_0gVT#UzY z$UH_^rho0!uL|RA#7c&LM<0WtIoCE^9trMQ}-JDgwc$=lVXJ*3eM` z#njNThw%)lrFQ_!ezCG2Hv5!a1;p(SA65my{T>8@Loh`Mm$YLs<6k{*oKWAHySE{T z&7}1{RU&)W_wSE#?1kyEFZSw8HDEK4!brw(r%*F}$>EGF{ zPS-8Q&i3?>Bx|N8jf71mY(y{pQ5%{Rr{P}~Sf>Esi;c78{0KCNk36LZ!HlICY z;GeK3jZ61Hyp}G_AI3m1r-1Vy1z-SgXl&qln64bQ7lx+yHX-WB`Qy`vLwnJ(al?8t&r1N>pE35Uag>cP7=yJ=xa z4@>(4`Ybb;Gr6@TsMpjlEF&!~Eh!mI^#+BvvWs%JSKiUrW$-KC`=DD4MJ5E6R+p@%;X?INl>tFri$k) z-Ic?hs2*#wMH=eyeBfumE`@EZk-xJ5)0bz~mQ#Xs67ZFR&Itb=P7zhm3jX z$o7YGnLDAcg7C*(+ga*eEfXXp%J}&m3g~@j4o7YKV<0!yp1I6c;L|)Tq%pbUg;mgw z^7Ha?t&+nW1V_j7^ZNK8oWpI*9@QtN3=Cze9&|M8gCb9x(a*Iy9AK02j#B?gUqY&zNANseo#*h4-Iu>2`4Z|L6F8h zJ3GgkRL#N$k44?uC~*Gt(Pt@h0WYiO8Pg^xAu;;03Ce2FYr)P9w1&P6mgwlM8w_v( zkr(A-;WuemG8M!K@W&#MsgGa&v!4JhCSLR$_8A&JwHk-_g^+fDX$;Lp4bJK?528rR zSO$r(P~&h^wlqB=gp3ja_)OU0jo&3F(1 zOMAq32f%%hJF?i20{{Kd+3+Pm=4!GHy^AouaEGhh6kc~pE)VT49 zWW03r<0qbfgyrEiUf(gTR;(iE?;8sAe_GF00T>~RZkA(K{Vd$Q4I?JkzrkpVPk`nl zSO8lDuk&3x{IHeq|J1MbHU?Pa)fv(;q5gkv2V>>12vO{+!#6COh^3!i03;@J<3`K& zF>YL4MFp-t4QP`f{{+OnyLK08!knVmRge`^NR`0&5ifwWQ9wx;K)T-**#LynH`>g> zb?K@N2KFeX+F=lgl$4ZcQ=O-M`UQGr@D;Y{Fp9zr3jP)XRET-n^0)gn^m&osMp;PF z1qDyMu5;DsMyn!}8Q@ZX>fu?{r0*eSWsCwR`gGu(ME3u9mZTfZ9kTK4i@?J?V}}Eb z%^CrP9+JR;1aup4PYJxta{yWA#Qe7B%1R|KRLY>}x7GNs&lREXLXkrx9#lA&t-ee0 zzGYS>2~}Q#8>!hJNK@#f+GktB^x!(ZUL;dZ=z818+&rqi-(HvrR&ZYZM;^7*@w-De4k z<${6&zhD>o;#-^bqm>&IGp;-C@e254f66h)Ml(4t3=7)8`TQn$zNC!+PlqpJ~i8 z4L(g5(9FC?`X}%TJikzSbyUItQwZtl|AgA3PU^c^xAES1jJhp{SL91ID^Yk3olMC) z2ajC8{u`-_Nnhq1dE?DrTrcI=BcMJ^RG5mQarBg&kW|ESa{iV8W(D8d&3$Ui7i@V{K z9LAq2CC@>H4IJjcrH?R0RGO(_a;h{G6bl|tO1Cu=?&_NRSP9d^o_*WDSTDo%dlYbi zcm^n&!+%={)B9$?YjvXU!>7^*BAmm+`o8LH0A@W$+EtnLOPbOjH$Bq`n3C}GDrr2b zQQb7=8x1(g8&ZB}T)scM+I-2FSLK&n)keybcQP_zCWpKt_^3JQZs4zHi&+|P@}-0? zWrx=uc&BJ{5qt`Vp1giT9--qg1TT}uDk@pX`}Dr!pHfHOo|+rXtG9SBe%8&Voa~tL z7yDNJ#hPYS?og$swINQSf)@bmf6M@dQiA1+p8%7YfWs=IaW97qJ{ zFw_zi5dfuNV?h90_%L-6fMQl2&gS~I2)O%?NKrUQ@H_z{JiP4LFbOr|I2%w=4m3qF zD^y0wG&D3V8DU7!S_4y6&YIf}&pERM*Mm>zRcCzVMCBk>0$}WXMXV^{=~KWB19@>? zSMC@H9#7hov#Md@r6P8c$67zKb!-tus2fqPUlO#YZ|#=2Rp|NU?&M|^@;4fu0Q)zq%5PG&z@&JX!AmuGGXplU*oT>!2Yi^f8zp@Mb=AS!C>8VpkN?a zDuk3UU31viML%O6s`5tveUK;}Wa~51{+snG>@_*S8?{4+nF?GT$&1ZBt?A%;~7 z3P>2%%uWg2kltbT;1LdW2H=gr%P6T@(%RYE+uPXK1PhLYTkW02zEO+_9uRm!dPGsO zeS0rEnXEQgdEj+0wONqi_fPX|N*!@8R^`@rmKV~$Ie4#EDf+cq7iwY01W2ZXi)(4H zyLS<&|C(#lDlCCJ5e6F zx2_TD*N5gOtIb`R{5EmOpR~bk+Dc!Vp%ttoCfHaw3%c3SQ6uytfZ1NXayk%~(z+o= zV{}xn{rFQE>3w1MJEVX5>C-dyjkxH^4vn7}b`mGq7nf@*PjmlaqTGs`KC?TDde!RE zqaHPudVBcv;qlqQ1;L$i-REvguMQ^E4mbO&=`%N5P`nqTwPZUcPS2uw9=ej14!sZB zqR}Wc8(GeV26JNK6>lfC5-ef?PcH&muir%f=~bu33-^COX9+T>VH1H(X*mgr#}|Kf z-~gNnS3abjTu7@nKO%Gx5ajIq)|8J54G<(aQ%Z+g4QZ!l5n+&U z4*f?*Y=J}Sta!#eAY*5jGC-pU%%LJHZnG{mOrXJb1u`_jQj90tBdJ`S7$kmc(5F9v zqf2_Xqw15c8eTuM4X_qHi__m@qdzJ0y~_Cd`p{V=FPK!yN=sKysXQ%2J0zcQMGFZD zC9?0m!nb>!9s1@aOl<^cS2IxPS!5ZT>k#OGL{|%t^2a7yP<4m zv;RKdZ!N%#9zQl{a=u*2fdB;*TtmK%W)rWJ2yt|%b9)#5{DBNPy|)-?$IR|1qYyB^ z5`K3%+jH^uCp`feAKLTqZ{)eX5FtwE6tm2j)y4v&xZb?sy?z~dc8~(BoP#p1uzzv? zsIZ^_;Idx(mD_Q=M#(T4;P^NoTRY@F7}}wzyvsM-bpIny;?Av^{8xr-nB$^|GyU}e zmByD6J5+vDt!5&lg&tqp^8-+nLOEI1BUFc9g;1A6k{c!eZGMTMYQ2K*p`djM@Wrp8eP8+8AO8Jp!+VIi+v9d9_ zW1%PH8W+iF9HWNaPi>1$xrkC8v(M2u_i~py+c@su`Zu>2EW>q^Yg4`3d$A1T$DKYu z<91uThiwmL-n&jKFZr|R&4;;Tx!l3AUrP)LbA5;C>uJK8nbXgXVTAlS z6!btjTo9H9z4QU2FQA-NqgEBPBcjkRaiErdYGc8uE;}{OXWCkvo$jFQ;C#mUtXNBG zm_jkMzyV0I?E}CN*j0Y^Ge<*!G00qDa;vS;6L3RfEv=Rppo5nVI;P#L^v#g--D21D z_6vnxG^Pz|l8?l~P@ttvfjS+)N+_Uj+yIT-u3w<}a0fsPaG-DH>i96Gsu#e_9&iC% zDc^mOUnE4htj@P7DR=D99$z4*|59{D*Fnz4i&y`=Y|Wl|{qX=qD~5GBmm2f~=2mKu zuM5J)NJ~Rdb4TWI3G}$gzTt|7Uo^&OPnC-rT(d#ZQQ`ED;)uDqsB#yF}c zemmG9qw;=fIj-wYeKeIhx7K_MVY$OOeJ^;@XXley%yfcmM2`JrN41xI&c@$&rc~V7 z`q6eCr`G0-&TX@2 z%$qD*dQ~Cb&qI>2dmA|lRiEVv{11SSf-h}o3#RvP0IvEyYrgL-QfU+HJLLr&GIrg8 z;(#JTS%PKQRW_PmM_JOs*{dBVa&Unz3Zzr5uQIS~68NqkG`OiydjAj-|2|-2^n5P7 zNHCEd62UqJsUJMf0X0rlO&4%Bg5*c+$ zwtNA(*^;bzcn{_1HR)nQYW8hTj`~{}cjd z>sjTHXb55b^a+mzV>=2Vdo{U+QVGf+z5N(`9tuE!??`nN2#Hk^v)<`$N-$%J1|8$t zg@CH;?n(zCux|PK3>49GAb_zGq(dX1=Zm|te-JRqG{C|E^ZRmp!Oadm6QCd9xf{yC zsTPMsa_IX~Iw7W$@J|c`m4aI4T9PbZ$}&JI4DB^u_q09V_cMA$7I5uZK-Pi0yc$7g zC8!gFA0{>^l^U3snQ>x(0xYcJ_r3>Z%*ew{>FKlr69DPby1-Hd8ONoQfBuxUpG~_^ zj<_AwO1=;Pa z32@p<27x1!6!y7td+(rf=5nsl29XYV`4xKD1fRdXt1y;v}LpfiTnq7H(>TT&yj>@bwm z6^2kxi`U#FgbW3MkYMsNq>9vi@`WIn> zVt=^p>u?Rg9@}Rvd@dpgfV&CI1%Yhj^$*3x#gM=h3)t->vnLyPsldo+A%M6JWYZcz zx=@OV*WM&&0Xgu{AV9{2R+L^Ur3Uc8!91gaMF4d6{-nZeTc3Cl`lo}A4`v@@95>R= z47h2orP3WvxV%1)9pOEloIbhRJl#AgEMGDR7=T$v{Iu_@)h2(no~P<0UtKvW`I638 z-z>cRa;mElh&=K@RA>&h%&8J7(2tG^Pl;Lw>I@j)F&_WoKmFA%ce=TH3RV=DPSifT_&ffc z&Ai*YqctMb1Ml0yw@rPSV?-)mh%q(1FKhreILBWAf;Ob53*6R7+u=mQ00iPNh?H2_ z8){D$!15&e+#t@2q|tBj8E|yI6cPeFNOsQGwWJ0! zVjym^#5zRq*FT)s%-3bX7?uvfv0L1=C+a1JLTvxny8KSfv$mqELxz57KhB4$jeK91~JM^$7TJEG@4zgayPm&52F9iQ> zO=sx#T9N+YHQlJcaplCw_&zg+efnV8n6ELdfh&{r+dZXb?T+u41icX~#;w%zel>u9 z(Pz^&j-SO~v@!7uUotx@M-p5AT$$o}`<(*4V}12|cjHK+^}EOL8#f=MHIL2^GPI}5 z_`kEB9gV#gTUF{UCq6M4R|5D4yZ=6;GJ1>(DDu#!9U!(`d^_-t!mv5@`E#z9QeVETgNYa*f?-QQAml;-Nn>JymUsu| z9Kwhx0Qe`GEfc%JCk73dw}S(*RRPRAIM|+tF`Y!k`GAt0UvMRD-Lcj&sW1c)IR**I z6KT$BI2!#uYv31#Y9#FkE6L!_(KH)IKr$D)$LdAihIygP1BeShghbK5-+0R8U5?g| zf2@Dl`o?4a_Y=(}8X97jMD|7){RAA6+)QJ)%rS9doEB_jQyhJ;LA2rQ&R)5pTc zg?wEOdoEmTs3|u7ysLJ?GCp5-5gS4c@#lxdT7gTYwNu81hCT;#DM`&(Epq0`%DuF9 z6~whmG0odj&D&IRn^f3;7rYUE<>RV%@V;{k?f1QuQ-JyOuI0M~1dDm=R1^Juv%vN% z^h_DSf^m;MW^i(4Ym6Kcuzh!iV97Hk|DAYN%F(Xgw9SY{WILQ*l^ssRUkk6D4m#Qo zTHj}q_Ssm}3O*bThB-AX06&`__N725cGC25*EB(GH(0Xw-@0wL)WI@q(N zveTtIL34MWH$w>N>CF1s>AF}P)!JXR<{dS;(^h*|c8{zFo#3 zSv$X;?M*gLr57wNE(WhqnwXkmloaQ6AT5322kf>nu@vC-=esk#>w=0dTw{uxuJ4krHh0u z4!L7a_x+ujQnt=m-Z5RGx2{jP%Sz?m{NkW<B#pW$n2(Kex=M6ker4tkTWS$0eS1iS_;m)6Se z7HdIZ?8@LB^OJ_=BPn#p+WM5z8=5l-YXK^BW$hWyXd5SxMd4O3DR_LZr6yMQR42b0 zg}5>P)^T?h^f{H+$=92+xFV5>v5kQnx%z0Hxu1e8pFNJNg?25+s6qq_AhGukWIBs3#hjC^2hReiwwK#$ zrNm>y0~Aq60Id6(sBVyA6VllZ8atTwgCjTmGF$&`yUaCVHewNc!sgZ~IVyIO*e5pos!v3??dK0s}zcpq(`wK5+knb8Q1-A(wQ$61E?gIMS7h zZN38x5^OTOGz~x(;PQqW0_a`%qM9L1U94&Isrl)gIU&&ogvHZ+lYq$5lg6ddEkx$w zK;cxtb{BuZ3<)M)Y&u}OjmCV(M|wQH#22&vVH+DE-CS1(qQal_BY*CP6f8!%{rLX< zxK-|00pdoQWowL2OqzF1%I~~SYw)It)_jkU??Zx>(qU6>gxOhWU0@|5;fdU~Vx`V`dL z2o|`8?|@d}tfnmRDRK+0WROV1_ru z`wOCs4=y)vUjFZ6{U4sb103uAZU1ZURmdhQO7<#yBtRwN@SHi6N*9#MKlye zDA{F1C=o?SLPl0X#{ayZ_kI74=Qw`HQT=ZBeSbgWy3XqyUD+FpH_Ib^l#*tXHkXqC z<AtzU1;GjDrCQZ&tRag5gV9j%CVm}03I<-4seE}1vkBqXiH!pv!Rv6$#a|NW*n-+A-J=c>Pd zo3{ToJ9GS|d*Ah`e;W-l6RY2R5_|THUDg_$Ygd!cm>Nmaq9)EE1@rOaNw`BJEub;< zx87!JM3kMuwUgfrhtlsqGd8X8uShG%%hNt3{qh7XBLxfjl2CY3N09YQW5|_v?Sd4p zF$}nsl$4OWr{0VFOj)ky&!3BX<*2`PH29A+09+rb%UxZNTgfq|w2neCFD;F1G_(6c z5)u-+GzWv0Wn>vK{EN`JB@yp*<_y(ilh67%mn4*HYbXM9jGd~&FpGiHif*OUgWyQ$P!_}s_ z(57IJJBRfa0EhLM?qdfIv|JZ6GMN2%(8y?;%!bz2b-cC1clIiU`!#Yu|5foM_cG-d ziikSH0|(BYJNL%>bybyym9D%oan#b%fK?xtj7 z&cA&0__6(M&|N!PTN%_Cj*Wv=lJl_>gfY98gOobLA|iKB2y$>JwYZ%HO)WoPT%Mys zTd4WnJ03L^F`BTys?$WMv7h7enWuD2&sDWP^NxGEzkb)T>SN`Y8{dT{Xn4IKJ|I{Ripo2Dc#|4;v{Dqhu`|~3oDbGy)Qd!btb?)LQ z>~oC9v(+wo;0C}?=h@Gj)#wm@%kPM|(WA)4m?imdXt&Fz|61~swiXjZGFo!l`iJwo zn)p}ZBCjlkjxZNg(Gaz9w+|i-q`jniO)JxzzbDa5dDOIpjF9r)qRaBUudP6D|G8nXrH03J9*y1y@@rh zaP{4z*`t#jON~Y1fW{jC8p|RFBIIV$G8$ z?+kd*5JI%qQ&Zu`(WrQ*s%JFv-yEelN8BFWNJdTyos*PL{i3e^^Rl9F<|2rsCWfNZ zxKDV+PZ*dfiiwH!Hq329;U5D&4f#`zWV*r$v%6f@NHlOM>GPZEpZIfVVe^WL6$4r* zP3T(s&e@i_uq8a=n`+w-6%{Rg@ghLLUOq!Lv2wt}#du60is zJqo4lG#dU?{;=n&6$8JN|E~B{7c9x%9HHm(DBvW>iCQ}gZp{XQ+9Ec`nEc|a+rP|| zB1h7@DG59Mm>xyE5kpo=#h%R=4aIgzM$K;F?MGl#;2y*TIg)f9Xfb09vwYh&YRP7 zs-j^SzsYW1caDUnXxHxDXu$3V*Gh`Z(uRY71oBF^tJ>bZLk6^aBh2Y3si^jOWi%@V ztv5N9KxCye9M&{K_4?^=eX3V)U|ftTEDF@L8#fTa2rQ^$Ks}`eLkk?>*qspUlj1*( z#jhkL=10=~~z!oL5>$dp>`}z9vYhC8k zM7b)T0qCTz{sYhr&yat-YiXZV5o~_{^Q6}D5CswX-boD>Oo%Qfh|9JD^f|`LM5x!7 z^*tFT1r57TRJgFHF8R!Yv||0Ho;=cEgglAG!*NKOMu?U*uxkjaTwDQNFy?3|=){gAWm#gKURm;!yoks!(RBePdXcoxJ8loH@8`Ys~532C_!7L5Vp6fG^`@a34 zrrLXlnP0|>Z^y#nL?v|rPXw6RW^IK&v9wf?UGoHe{4)ayc1}*t!2G%K$;ro0pH^R9 ze+7l)x%~S%IXPTv64PXWCLp&M=Vs&JxRIR=B58!igHCucBkUQ~tSxA26%`e@m~(UW ziarNfdgEl?5+}NAmm5$fU>fgRTT=k&h6!D`9j8l{){3}{w2)_3>OMc)=AJ$N zJ~YNepGhWOCQkA9N*TGwF(_)O9SPJ0&NU16EwVwSdj!x2 z1tK!X<(%7Z;~L5@DDdnpwuc+?tZ|WdJ-tea(|g?Ft?%A_c^#n8<~`OiN`^UL^VQ6J zGk5uxt29Tf!>JgN2?f5Jw?z~;V`J&ruGeL@s)?}SR8&?rFFO|B5^5?Tg&IpjLa2dX ziqq)i$pL^PL4kn}PLWYjz4Z?_ogkeAFM`Qu*>;#;=E*@Qb}}xv%M;>Q)_adj!KJ zOVA&!wyXW7EDOwnjPT%n@UJ@xD}roVUwAl+tIglY6FL@moAFb3cU`yy79W#HKt+B& z_06jH@7}?0p-!NE7J+bpg~$lnsCtZ+wacVDr_@)43GLF;`xpC-8a{5T)r=cjz-?V|?|(iNN&KdVB2PSiS;96fey!C$@TY*$BXgwZ5# zQ2!;HGDU@njbm$jPD!Wf(e2RE(xUteaACruBC*2oqqc8;oT1|0RaK)Me}>*?HJ&ra3wzeU2`+n^CGf|>1lU2w<}3W zF_#x9b@0@|_eV(ze&^@UG?SzLiCb+Sd~msS>lQpub?Z0JC@*Zz=XCl`UA*~|KK1>f zkfq-u9+5(^7<<6gn|&WS7j?~=W=g;VR z^8Gq;nwa0f)R}t`UlJ;d?;|6Ue@*G>a)Pf+z&|WG|7-Z^Db3#mNwen*VmUh1}w`6#q5mtKjHNl85#NJ&6~Qwux?AI zjx6*W1Kr)Y5=X6Ti$fR=9XhnKvH~r?2M!r*lShvpc~q}BEeq7EZwG8n5Sj1&M&I4Q zeuSU#mAB?6Px5cws`qU!&~Im2D{dsb*62fx6R-V|Z@$8{q@{SCAv%t`@P*tK!Qb2W zX;%dPdGy}Np`LO$rKhfA)pLZ&On8C8GJ7`A=F~XP8PDA3R9D@#JUDpb6p1g0y;AVl6G9bK!XU zJI@sJGd_D~=K_$(?U|-(Tt#T*e^|bmWD3hn*(f?w+ej01b*pg@trB>Ee!o6Rc8FB^ zO}|3mVuVtb9UJR38IfZuVb_wKkid9&;>?<)j0|!ODF|Fk%$5&=6CjI5y<_{97Mg1u za7}kND5>_5ihXP?PfwY%6hFLF(H+2t_<4kxscC{_%4geiiaZB~wtCfHts z@_-r~H4h|#7XGoZv4)0*TLji9e_Fe`yGKn{=?iDbIW(#=un?iD)RSc1^Az75 z2kR+*AVo4=BWNj}V;8QG93>iJwpkGzqKv;)S0JCoqHZ5P*9 zeTiD<>`OSD$`AwT`|DGaU`TMW^e5LpcoC8ue4?v>6dZ*E%<*2*#%?IVklhIv#=-TO zi-=0H0wX&AP-gQ2UU2iusWo!Vjh~sGWuAj3xgT(=DqyXu{eE3iT zHp)IwsZcM_KH0*ewKfYLB39phqqO+=_^g1R88w^hze!*XGSZ2h`}f86?151o0-zVL zK#gunp+`u^yx^9S+f6BJc{>^0Z%>{a0vTW874|$S_wlP|4S!*jV946FhGCRR)cK}X z6<)(A`AL%To}Qmxs&F$=6mfpGZn5m%eqN4?6m@;$g~dJsCYPV3Gdyzx3__NJ03NnGgTAOWYc^; zb>3VK%L&O?J9=|z9pLAZ(gMQXh-J53@a&0_HMG$5Z|!ysgzhf1twPb+g}Q^1xUChE z)jG<_!Ld?v>+c}l;^Ja*!|aJcjUst2MjVN=Z6wSV6^ZOh-Q%K|E zdpqG=vgeWHx&`Vw#0eyOsFb&->Artf6Bm!}7~{Qa@Wj#$qd8+Q9tq@PqkX(|smdT1 zl2!3j(AaWtaG>{eR1T((Z^7Yea`-S5sIa;!D4=PA$`i7g-o8E{;u5eJtTD$r2vy)N z;OIDFv?b1Q3q6ZpWfe-Mva%(h7dXTb-3nuedWuiHdFE$rZNEV#G4IdVjMc)Ps(^WtJzsYrC>SZp~VohgSk113I-!B34y-|M?G+8zrJ2=p|P;VvTe z<`l}}ygW)G`Q}Z?Og7ekhu{yJ-n>aoOPl<&8Xg{wCh6b!IKpj}`p5e*)9C#0v4az< zD@T|Vquh>G6mRBK$hs1N0~axv_e~{UV@N|r@G(0BDcoFc(i$q~Z<-ri`>A4EZjYeS zzu$s>gKXSv6U(j>Bc-U(uCpo1Q9ix}4wNLOOf1T@Gek_m5iE9}adM&# z(jNg$y>l=pq{;=JsnjY65#QOX9y+A@?b9cHgS|$g*YT)i=f#D5BpP@z>IPOs_GAH$ z&Ct9Pq4vELEb2JCZc3lri=G3@sg6vQB6QRxB|ZbMd>t)1Z=9EHwmPSrIqjv2KCjI5 z$dOXdLCx~7>uAoNfY;$vLP{F^TIRk>QZfLtz{9syhtIBIsYgW_4|Q!Q)FMZB8wba} zGpclwcKsCLLL*aRDyK0`G~U7iaC7EnVPqubeRDcud}bzJI835GDmIoD#mmVRar3>N z=il@6(5nsEUaaN(-;_g49=5Tw--aX)68wf=k4X;!3w@UCWp$8F^wBy---GwB_Xja9 z+3+#PXdPz@vGv_-l#~$Pf{zSW!v@(WmPR(45xU04jA^Z41?;@B6JNc={VZtK_wbp( zUi++#8121>4`EE1a#5I_J%vU&^G-&FWJ-&=gAfl756+4Q2S2gnjCDMJmId}77XIn8 zY%HpYyd=VD0rD#>AAb&EqeK!DekFcDR<}9UNM6uoZDB!CRc6M12wT&zzEGW5c^}rY z%U}H)@}WuA{{8(@DJ_O2@O}a6+24TUwdc4euD_|u-_@ve5OiF5el$Lt{|`&yTuBse zN(HV2w3no=Y<9Q-dL?LhQL1jGkK*R$Ciz87NB5m`lI4P|NnlEbe4Ug5IeBXH6%>Ga zG0ZD_&c{Eac4YyQY`^^rNNGryBj73x(2;q`%YXs#rr;c>8~{&>4-zMiDK;}xMy7`< zxQyfSG?IOWiY@a9btU`wHI&LBwl9v2u(NNaW8a6B1};R4BmL^$tmNd*{{Dm!f24gCpIf)cH%1MP zL8s~E(3Lb)o1rlx>{M^_$Q!j6JL=KLzyqXS>^KGR7zu?q2K|Q z36EvOSs+ji%6;5(C|v{SSFqNm3V(k&}D&@@2q>d;2&+XfMIIm%hf(<}Mp#1&${JFe*+uGX70&3&+1=(a=1tZ{v z2O;4x{>qj8>gVH$@3`R}SXNMKT)1#SI|>P*EISD8G{CuJq;yD}I;5Jp^z7DtKIV%`fBWf{1L$6MEl(6=Bem{`RPe|csqW-nZ;uQY z=8KDq3u9@n9kgQ;6l4jxfpbU4_}3OeLD-Ekj2fKh0+M=Fh0R?ONTnLl)tLGB7FJ&fyoT6dSD`*%TsSA)cEYpEXe*B7UH0=mH#oA^&}3 zsJlT5Y5uVE!Gm$!92=O$(#eoQq)EV21Pu#00T8MjdUv2+nv0!!^ikh0*8Jl)79Nhk zHH0a^Dq=AoK6pU;H*(KbLjIhXRJ=y-v|qYXdW++#gC+yR_wV1){PugOESl$?h>$b@ zN$49o9b|uM=DP|%)L3?iV%d*6;nI{Zjhj7Ue{pE3`~G4t?425E+i+hRq+4FFVWkXH zW5O!I5cub_CV_<=Td_;nic}mI)wbf=&_^Z|4Pa%ICOUj{R}Hpad3*BYN#+>6$K8#M zjnr-+s*^HjNf6p8%8y^Z9Au^BSl5=zuzzL+g)1B%k&6hxivaq6%+^+bpa0ISTRhTF z?QnkGZOrQw@Zu|a_%N*6)6C3l&z?P75BLKG_>WK7P%4_GZ(sn1(Opw6PUT8EiiEFX z{LXJqdpkKf8Cp-S%6|4O5g?N55{*xLU%CzIO?yFBpev3byxW?U_ntZ4oB00V{Eqm+ z#3Zl~a+ALKk1#RESR6UBh#*>9_%lkdUtXJQlKnYU(xHhU?OD7EU@c{Lp0<&GLC!1K zUiv>z;O-CKa|@jA!YGV!YY?kV%Krx7KoI2ven_bwLupNHlJ*eNu5n&6YHE0Ye?ywk z%>OtbkaTfr%G$sGvBf+sW1K(2*`ZGalt_BRb>D7Z5r4wpZYwU~efj7U_+As@FAn+tQv^LePUDyd&5g>*2+EhPQ} z=sH-?bw4jp9dYrf;v7_*Vj8@M>!}VO@34aG#E$1`9Q)s)mrg4$H5=c&VXXN0VPdh) z279t*wYzBN&Yh&QW&6KhTDnDdLT#Q1cwPE?BAhOK8K)TL-S8J)ni=>9ii>M)W0j@* zX1Q>dXKd23=|2WhB7j+`qU}*%FufbCgC!0U>K{CMv{O@a<8F)qPC8EYMEhP`P&MmI z$HTN|dmWMn5X}8UOf?bvw$-VmPodHYBQVnN9|hGl!&3LJWgNRKDgAC^)V}upicE6> zI0V^E3V&t5X_Vyx-OIp%CJmQ9R}h9H;SV$jf|6Y4^5x5C&WI%x-M=nlW}58vvL9zB zNW&jKkacbU^=I|^b;KB^UcWAX?YXr%T3MFnNE!RXtopvbFJJ&j%=)VjPFU8{rnMr- z1%t7)AEEbLjvPUZ$phAyIhuyzSFiR~=!(!@&&o2fG-c%Hnf|#=&5evu(?9U|-bho4 z8-CTtkKY5Z+x&aNnMIaLZ@LY%f8}$z)h_>|WxbpB!O`T97Mks17E$D=7I>~w>m*Y# za7Hd?Iy|#Fc<>-?_>h+>z{6XH!th{vb$*mS+TK{)2OVkdn$XmIV|%U)IibJHPru_N zM>1Rf{ri`Y@{aM7&P#O(_HEmWPStE+?;9ODwEiRI@UQ>Od;88Q6LzR{Pe@DFS6RfJ;Sez&f|4o-09XyC!af0a3{5OSaJS*_mLlm}YuZ{NO+aXxjKNLnlI(+aGpsi`UaV+tDPH87jRPg;@JgQo!ytXX;6Zkr!L z%u{=p)Qo(n-u=wi`u8`KG3V7Q8}LABpOZYZe;>vZLcmn~JreHu>Zh}EX4Mb0D`2*b zj5Ph>j0+cboS2-%u^`eVy`7eH4`T5p9^eOt8@|t9ZFyPG!9j#wK$Wi@r+fWL|61=8 zMW5mQ0NE zk4o&`{U=_u0=5s>Fg29UieaInjca?}BL`?=3^_q*Qo~{<$%i8@PpWFx3bLoQGI^sS z>FnvDE*Smv=@Z@31Re=OOHCyj_bftXR)t#;oW_LMSTvRU4GbFfSTq)=%LnT>F@_R^ zAu|3L^%-!SfoIrut?Qshq^6`eys#PcAGr!)HI9?1Z&kdnw6I>5eFBag`Ly-0y7y2m znamg(YQOQ$yC|VB=Y`v@iiXCeVr8w3W&FR_f%Nd<<+0EJDgJ}?5lKX|9Yq%aA@CY_ zWvUjh8{}F)J56fB9RwPgNUo*J~ZAPz%C$fq}7cP3mDfrf0Q#D2ZlkF{Q`q$L9!>MzDwc%ccU zbV$$cs0Un!fi-BDn1^eAVUN>4UhY9EdLqajqvU$R35aIo@Iy|e13|95ZncjSGlh9F_!)i3iRDSaO`A2k8 zK4#cMu!}PLn-zX~9t!}7m?F=ixeDhod|4QVKO7;7ciZ;4U| zZHvTC|FewDF%%8d#R<8JJh2Rk%V=OfefuVm`m~8w|OKr+(>+~4z*umCsu^wj3Xul2u!q$HPANsFA_m(k0Cu(i2fv-!EZ z`$gcNU!(=wnrxEifScPSD4@z#7qdpfUKTh1rEl_fvB!u;J|T!8U<8K^ zwvK^L@j6ZcILF~|45;ePJG%h@$n@mw-r=spS_3fsx*}5@E7bgVFob1Y4;(BXWVr%? zf${oN+bZP#Rc}6?31L1ri?!H?S@3(6!Pg<1m#b_y8+kpK*Q;i?agmd!87`*_hbBz8 zYR;9>=MJM7*Mw8MPlra+uvgC43G6Y$)ol1_W3j99C8C$yAucX${oD~CDQQ#?`q?&U z8ZX>m?kRZ3BxLl)F&zmN-L8LL`A!1< ztn{DzUiXEPfGYpY-c#Y)TLREL(#`zx0d(l#Cjr-6+?1l`P5Rur zw)EALiMj#iQO9j;EQ@RhIy=GcOFcMBVv2s)FL>boM|hZAJ?mOYw*B`(JMCW8zcc$z zoZu@g#84{YsYWR8L$>B|ph7yVC^i(F7E}zR|BnmMmP21-W~zM}4p9ycU@W@1!4RQI zwy>%S@ZEm#lxttju(RUp(wo1a9hn&)Cx{%0TWM+A^3P7djLh|ghK2^rl@?T!n$Sw% z>#*Pbz?cg=@zNy?#l?k{HH`jhFH7gub_&8Gw7BNCWM zaSrFP#_>OY*thgP_2!ESPf7BzV~^Sf`^E)NiPoF;N2bC`Q=?2yC)Yxfi&?YXxE``% z?fQOr@x=_TY@nLrqx|c9d2MiWeGo_aE_QnP&?y{?>xcEs*aNS_{g++*(5nj*AF=WV zySu40I6(+yka=B<%|aG55we0N8gJs*!&%%^FLL!K~$Mcw^4@aN_g^1zC!O=gDXw)zU z`DAg}{o8A9&|744dbW5qp9EJlw=^dC%xQKTE;T?i*qDBBirko^vF$(Kx*I4F00A%g zXRyLz=3B-muxGTew;#r5%ntk|dDnEjW0VL*eO;8o&)kHz167eJCR2pz&Kqz|nUSIP z$KYvmsl0}1PaZ~U)hNx0P|$~Wh>3A*+tz`pnAHFnDF9goVUj^~c6Dv#9b%2_nt<^Q85>t~!hMPjmi??mEv3woe4~GL z5M1OMh8b5LN4jD-;x$NIu9%f8ZA%;~SsEBgHe)X~g*nCIN6{e)fL;3D!Y4{;fVazn zHidd)tCFr@(;Orw`2ALKYz@dc>K9nvq%!C=4k?ZKkDj>3=J*usq1_n#YsF&DpoxXJ z@n*|4e>#lK04C5i&EallAQ5XYZPP2$vzZHKi7VCK4ZB#U5gSTKHgaV zAh;Ptm;datstus*5+dy0-%r4LvmcGN`TnjVdP;_s9>{eSbua>TTWf?7%a^_3GegH>eMk1|Ra~OufDvE$PsMaHxc>T!r-q)&+PK$TJS77o zM$s+TdhUb&qr;H)TRA{IOG{7qkZz|{w0*DL!23IDDw2|Pg!a$L@#*O*z-Odh^kbd` zE3NwEV&Ks^epZlv09X?khOEuOdx12K0kE+!<@W2-L##kgKnKxGyg>KXQHg+u_jTbTYCso^p#yfVAC(;aZXVeRN zwNVq=AIvh2CG!qC*H60%Kev)%q;6;`t7}p;Ea=i0Xu+{$pv81gA`lgK@g}hW4JoSHT?97n^&y1K4j!~jgu@!p>PQQWbMp;VN~zrE}(oiJbw z2ol))g@O=5>$_{$6-G`<0)=68G__UjZ2*grU=rl#9~8Y_R;COqHIg6;H|qB7+xP6r zpm)y8$(cP(ZbGk`m~!?nPPijGnU-SL;BSlVo7QUYev}sBC?s1@QTBQ>N%ift_o}M} zoRYO!!7JM(E#1CA>C!P>B)42MfvnGcW|TU1tPyElJ$8>EgoFe3JH}a=%=bUfzs&1M zWb>&!evpi?$&S{d7qs$XbY(GXP>f-si@yixHDNp-lk2u(dh&~v z)jWmkQZMBvft*ir-whghFu55~01&Dxs@b40$M$B|Q1mAba^cf;A4ME@UvN2zGx`FH zIzwJ1<1b}`AkyCg-vVz0pS?o_@26VP-$?IQwe9uS#^MW#)hbF#bWyqjNn>N96xaVh z3)Oet&OK1BH#x@_R-p}}6j>rS4$@4{U^wz8_)*t{N9A-Gx-IpkUWXrbC|^*TUO&8R z=g!q_F8qv?Iyjt%Uj6Jo29`BS*=6*tQYR{A(H3JUfYM+URU&IcNunU7H!o8bZ~LehFraMls{~ab=dkgqQ`umhCau2=*50ypt2dv_ z&Ykm*qDFEL9S&wB?J)iDyS`pLe8rU@0oUE@`LRN(Rl8j^U_UuQcP%p${7u+m8;X(> zSbDWQT$jOX4c=G_D5^%&KpnJ_MIvbVRjy;*dYN&_7TiV!nEj=lp+fWCR49iN=6n?2 z4pB1TS{|8$z~8p0$y@!xyY6`Xd$@Tk_!=%6Ke5D=mgT1F_3+d3xFiACAePz42#uFG zE&0!BLlDvp4RcO7NlHig&9UkZJ)u*zCpBH9v!E4Lj>4BggATEXH>Jo%ABoGcR zv&K)~!=C?y$Du<^QoY0^Q}ApZ4S;@f0;WkQQOgq(r^LzF9c%RMIp_Pjy^_p z`T@N-gUt%s+_Q?ekj+qdNQRns%MXn5&?X>1CuD6z5bzhts|-DyJM0lqem%8%7JlJR zRH4W$#s`E+6bSvf_wG?owx^&v zM>lX8`pqm8UOGBDbhej3bH@wsa2dt98?6j!6u zO)rLq-#jh2BUx_ik5dT!+^jDkd#Us1tkA* z0jN^2w+jlKG1fA*;AV7@i!`Y~s|_YvFG`x%?I?HJ&@e$Cg~txNP!Rc!?CcJwV!*9) z+hhz)BK6ewFd6}_`P_zt z{*3G3Fom?I=%DlA-nfaxEM;6Qrhd=g9Ei9>q76a!9{={VbQ&)Q2MEMV^Q|(2;Kzf^ z3e(|&{8UcShfJ@-V`~jHp7oB9t@^B1*c#b%IS>-v@?p~IE$L7J%{tkWd)~f~! z@wZknCPK?61NSA8;g0{G?qhc~_gZDzGAfG_wfFX2f!GCOK>Q8JR(D^z7S9-B@EU?t zF;Ni_2XrB`v`J0>0DY1Xkfd8z2d@AsMDz?e+jzs$g4z2V97Zskz$7}UX>w|cG=mNK z_jPbd%e{GyAn-Rg!8p2oTZ)wyn+2bfjKCCjrF5DWreZi!7v%)pf|x#? z=(8Yyd2)xRHhJ$)7i52S20>~QmAXU_hDJs{*mNn31kp5yD-oO5JW5bPf*Pk>oc@+= z+jfwEi#>@Wut&ak4<@I&g758ElEcG=n;C7dDl_6t1R9{4h(S?y_V2?^9YgobAA;{; z*o~{{nbqyoRQ(&{bX4$_o~DMCxA>v?u1GSU?+vDq>O*I$%2(Y@6Wn0dHI$<3?ewa?E3v{&pnC=(_wF0H^dW{3x zp;xbN3B|Ux8Ea<$&OL<5BY-y?(*D0f)?@NaB`~J@;PS~u5mXs1twDun|Lg{IK!gbl z3{+2g)7bcPbaZ`Hz$e*5v> zfi>$SANP29#%f!lg28lB)%0(Ih@|6Yvkh>=UIL#f8;iM*p=k}iB6F2 zXY}=%5I#!cjns*4l~dA!&ZoI7t*s~gDt&x>?s6eN6<8wRDb!=69)w%Lsg}y{zBvw7 zM`vffuNpe6Xd0!{cHx8jNY9VWCnho@Z>#1LRut+-WQ2*Q1msT$7Qe^U3PO~ zZy|;_(lNpM3D_|6)-BXLuiFKS)nbt<`uOpJI>JY{Nm&tsICL=EhRA8-10C)co~zmv3x`K2{|Yj4Ti?hQK6(^yQZP0;>g(qR8X;8w7xv<10V9Pjyxdk*@J-p0 zlY($$*~sF^p8DswDJd=8C@Y1oR^jYXFBtki@0tJ;80(99$?A2TEL0u|QtH$Mw#1QP z8v6L{&%REB_Lz5Jf9?k;LLRUigY{EMz>goz({n^H_i0wVRrl6Kv8=R|>#A14 zD+5;1|Iw2^(lbT9HteN+712S-0V&b1S#?-lsPBJpk%+IqZ~#bQwi^xOnc0(3>EXh8 zp=3;sHapBSgangLewNLom)z&?y2a7uL$6LeJ&8X)Fo2m!cE`w^`o1XbvkIolT*hXh z+Gh5Pmzb_V+)bj1;bM&p*clzwnsYX2(kygD>OlO|W);2onHO}2HK307omuANe!MDldH#RMI zX=0hYDY|m!yV34hn)+$iOAahfavz14C6hMfLNnGI5<#W=d@6+B(l_6WTX8xj1>y`xyP7p6HX0S{m#{_uhCWDWS_9Q3sln@uQ0% z;$i9E{mlmd z^~(N;>ip(h{`Kw&7+gTiX@BHRa#~OeBeWI5!osQ3LhS4tq4y-#ELoOMnP-IVrCiyj z$yI3nD!W#2-tKIF)n)JEvPkEbf9h&w+e*UAkLh^M8*bKtUTSW%L<2FyvS+j7{;Y?| zx_e3i`y49hsuO+ymPtjvkHHZs8Mm7cm*R5^o)k^d=nQ|C=dCduYSq0Ac)k)xcK98tJK)x zu08Hw1WitJ<}TGsewd%m^@MyfXJu8Sewv&}IQNa0QGRW2UKuBfBv|B6PA zdK(KFO0RjG`bHNnDEfXi(UB9yzd@ruH8bPk=GGwFcKR70&ns`gV|2>O&V#O{@m6Qm zR$fjhXFX0}pbOYHLgRKAHU)0=$B(ZhD6#z~*1LQAoqB(mm=`Qx{!r)n4^hCWbM!oH z657UVfqO+{!w!B}@cg}Nz1{s2_tUlgrWKKr^d|=;iO;AEnu4{@h5mJ&ejC;Vs$Ue;l%^>^U1CJpe=cd%j zH_q6?%lj2`>D>F6+kvcXVv=tzYi4S!tn0EMcY4Y%$iiYPLFDgbKBNZw26tCi;V0eT z8lF9S_DEt>E%`3RcYsUB%1b4? zk#;m;s`J0*@q^itUC;A>i9XR z_Emro1llLsyjz)>?#h|S-}3N4iVRMZh;FXjoSbz3$SO9bn``0rc`Yq1dYr#`LUI&! zXO3A(^@P37H(S zBcG_%R+jIUgDM6id9*V9mu}4@of0_#;9%-`CAZl#JzII9EN>Pv-u`qpZjJq{l@*5< zs=l5XcikiLKA7!()P=&vA9aN__a;^;iO?LW1Mfs=w;1kcvi+v+uAcRnP_is2h2r; zLRt@EspN549Tcngs;c;JJz%B0oBx@OqC~*jgShxWvwgo=Y7mYX6V^xsg4jHfm8~zI zEFF7+8Z&=^eAu)h*m2FeZ|PDt461UF6o|<- z$k&RokDt=FuU)0j{TG1=YCen z)u`y#+T=p|TUsJEtMcH5uVuA?f##9?CWkJ5ZVK_5NF~YU?tg#5l28E$Iln)@juN3q zc7ox})XUn$h%IpIva`}r3L?F5IdZWe$89;Fj^qx0rOLt3H6PATRhT zLPgx%b`e65{iRxvLwN}T}gCCWhdW4=ErWHFIYKXd+O96WO~^K1_t=2(Vr}3Qp2Jgamu$i3j0W`sAe1F>NGim zqc#vA%czj~e%5C2=6Iy#(rX{c751pNmoEvH0(YzFRL6L**kdEAzQX6;BK)8(%0t3>Ip7MNLc=+kX$nqsq zTU+L<|8Rl~ za2Pu1!AAYPcLZ>375$lh(hnDS2&oBx;z-j__KVyjSWnK7xc;p2<-66ABg$&>fteDL z9v^A6S&0*huA6tSP4jsSL@A3EvEgr>KL`?{G3EkSa-Vp87HoL zI99@_@@iRoZ_#5S_btiH^2RLrqs(=sIPDjL!bgrB(__iM_EzZ2Ufx$pg5e)nE?hRA z`dGQV!a(-I#Y9{-)B0b-frjoPvP23(Sl-D{nMylq=l>S#;t2;MzNbGam@d9w#IAXj zmA&!6Z~J0#Pml5(yNO+9zSU#rU2z{Tf890ze_Vii)>eTb24JWEObSxk=%~FX0xLBy zzkfJEP2^0)rbk@_-7v~jEMHtPvh`ujyx>4oS49_dqm>^Bitz&;NDKgFk>|?N{)Dg7 z)sU_c+M-)VfBc{fQmw9)CC%a;mFnQ&E?m6Wu%#;dWGS#Y@x+`s1nz0BnxFnp~k>~6!ZZp0mbtc*|wanlANa!o_mENsIgHA_}-Y_Z9 zGXoPRDmN%jgpBiPj5#Iu4mn5G8=JMaIJ1;~-M!9}+!#R~Z4dS?Y@`TQK|w9Z5{Ju% z&R(P-yd3-F7(9{;Wpd1A5Bc{yMLb&!TEE{Rmq{fMXI-r9*Ec}MmJJ>ZxML{9fy3-s z?P+8Rul*G7K;3?%XEUawAXW6TiEHCyUD(L@pSlivIb0 zyV<_u>}Gf2S0*aoii=7a#z^}C4bE1DHvN6S&l;0k(C*-O>|%{luOrfe6m$zdzB{bw z74zQ8y71qe!o_TAf#K1%xWQRgdF9JmP?`b|7CNFpRTp=wVYn?zL#@|=I~+V6?9Pvu z5py7U&9tr)Pjf$1&q_+yu4h3v+}xZK|IpObSiSye5Xg#PhWbqHs0`PWVO9H@$?ecKIrgwJ%@4 zNB8BBdar4>?~UX-Bl8t!yR7C~77gpTtQ{r7shpHvF76C+j(GBzyWjK=m)xB9u8aDP zoYarfKu0d=xA&Piy7ZLu_)HtjzL>B?ZAL zWyQMsH47#}Gc(!iqFjuPc!IhiZ6NzICXPS~083^~gz3VLWV@;bNfR9H<(mavM+Eb4 z`3x!jNSf!E(g~rB#57S}ezs+A1FeKIDr&fq!9K_;6zP_bRV5f{o3V?V%4d?$Yt7dQ z8k34J#~HO<|;$%)vN!NQ-ssqZ8Qjc%@2YQAR)933+Wf{d>Aj-Q)bag)-V z4r`#};<>wyA}Q0m?(Vw1*0M+NbotjyJ2oT5-r-xdyCnbn>DkhBDz}xDa+m6rm}k$q zhE!)Rr1KtZV-m}~bd>!rjjl7Tht19trE!gMTwRHb)D*#R{b?%Ay+%^*y`XvA&9nNJ z&BDS$iHE7*q4LC2l$oiisdg;!;lc?zW^i4Amq8f}1oB_FoI3}|JR>9H2ti5pHgdbv z3mPO~GH7_K-ZrI`!V?36h1@hv^lt#}?w;l4v6%9!oS=r1toZmPAOY}MRJV0>6uo0| zv2vhOvar1T^RO3Vk81oqHi2ZN`xHjt?uxPtd~yX>6Isrkb$nFKp=>M;sAY~yunS+4 zzyv&0i<^hY?@5%;yo9?USIWlM!qMxVZKKVx*}_6XFzBWSjGCl4cg3cpqei+$x&6Kd z_N}TG+LMlV3lJlpXSN+{5aqRXdN_R9%d|u2^R`}oa3B2FyY1x?2S>xcxT2-+ z+8!VOfCW>hp)}v|M4sA5^CQf{u_vWsPo67RJidC+{ib-qp)h+(a={BV?6!9Ld3}2# z5^o7}jn?tgUFFnqrnkN=Dy=1>E1P1lsYM}ST#1-Vcw-c9q0EMcX?w&sQ}#c`8*~m| zqWKu_Y~!fexZ5k1`R|>K)vuzjL0@%-9_g?%)ZEOGJJufN~g?s%j12^y`eCn+Mm z4}@i!$c@ay^dv@=I2EK;?{)}C(jIg$QV=e2np@cRQMgf$5vBc*LFlsT1(g$qTJ^=9 z0uYsgns8~oJ;}Ajs{f|BsqxO`;0?$n)&BdT3rCWZK`v}tEF}0+wy1*RGGc7? z^Tf{GyQ8x1!u3KYI{_>hclX^FJ^;sqJca*hf%7szM{p1xsw}hek{rZ((K$xji>J{2 zV$y6Q!{n*QKQsjP6jsM|TaFlA*n8Djvz-0W64zldF{t$3Hc&O%+CHp!Vv-iqQzQ)*?V7 zS%;;8s>xfPKL*n1BR%5Kyf%i_8Ok%qY%TPJpNh-bvt$GepE5Jm-kn+9EcxqH^W@U; z>dz;xPLEc5ZYlR(_4s{f{p(oP;O;lqRDHF#oqQUfc8`*FJLRh_Vso`2rYyBvKkfQB zN|ty1AUjLBL>ze>`Q1lBZys7qi3b&Qn2c5b4hm9IPZ-P^eV%fz$-CsHf)>lQ5!L@k z)q6){{rBgriIS}Bm61^?dlV^&NcK)vLXvEfkgTjS zzYpEN@A;kY=a2iG`Z`5Sy*j6seoPtj5o+hc z`$Z(ezfMxq)umF`<+$=ayrP%e*|a~vX2+hRXA@3ohkyS2mZyWI_f1ye2mah7%`k0o zium*|nu7j6XCwP}W_0SY@qYiD-%=`-NbeVLFKn-(5{r_{y$fFoem$MtP5 z6D`8%o7<=hW+bG6_5em2S1~&QZf|84>ATRx=v^Vmd2fbitG~Z`QAd>;H?!p_Du3i&oHn>n+KH08|0;c- z1&~&sqIpM!=A2N=3R9>WzP|cCXa=ufs<^`Wcj0}nz!vz;k?dj&J0gQzZ|q~y1cxbT zviqi!E6%X%8y=&F2ll{r2_lXQpp~f8C@)VO^CA&sc4Q%M5L@-n>IlSr?p^e_X1YPLA1pV}hc;It88MHPNhA=Wj92i|${`kJ=k1VM>ReEJ0! zij`%*EiD!Dt7CC!d%$h0mAlk()If=yytO+Qg{gMbdrdXjS|%+KY9Ni&u1={4=l?iA zvQk(ab%+du-UhmS)X#NK?PtELz$04YAC}%Ybh_#T9PfGIib+AVMx_jc9vW!N? zNNioFuo03f)5dGR8)X@@mx_K zP-deX7d@sO_JI`Y(UK>bYj-DUjZ1yx5P9`1m3AfqWXTiU9{U+Q7}*HLbUN4(;by^ORF0;s@eamqsDhz(CT=N;Mq; zM5W?DflW+D;QNA`p)PXb@jQjqL){cY+?g17cbVrVsucL5hu!43BGJJ*auUS`O58GS zVd;`{kH_8q^tQ2w)VY@awU>0$UvNl|8{QPqXH>C)Qu#``eKX`rPNRT(Qk25)d)-Y)vs*^+Pm zL_fD1)uYOHOJNp$NApLJ+xP=MXb$GHolxn9^^PhUydWo0Mb$m(#peBQauyX8t^8fM ztVndYeqHJw6n_f$tf~@8Z0L$xlybZG^sxs|&}x&-EJT&a&%Wjf(8=xg*J4EOi4B)d z>Li0na=Jk6kMaSB6C69TqS%kVJD|=iuzN$>Z|#^1FZG5i-zcJVV)#}0(03mh8HvoO zU3<%THEH8B(;RLg^};9z5;hbjq#Hf!REHQ&MJYoMhPh{*h^|d`yY#D@>wu_x?H%)$ zv#vbq%reM$p3(B-ss2U7=$hPMMyWU~`N}kR#k~SWjtZN!UZirh?=0A<{@Z~DZj-Y} z-e41ZGQrDJb{Mtr2l1#tar$h8kB-Y0$@4>=kCd_bI20XZzN^O1M*x{8B`>ed&y1%^ zLsJXjM_%R)>7*NS893_ny+3;JXv6LDw9}5*fhKDnB2NY*MJ>f^qZ}B1%F4?>j4$Lp zgS_0>*!Z{l*?mO9lPCPs*pw3!<$6kg9qgEP!S7$Qa@XQ9G$TC*dG{Ff1@*Jfx9^#m z{;R3`pvD|I+YnHRT|w&^bOEaNk1K*dg}fV`Pe?#cx2i5~e7d+ex)*f=0~f36K6##} zCV3M)IcBjt;ys|~&dzfI?e+DPE%}@cBkq(hkD7M}zTS6E{H(HzmG=iro+w4S|I^u&WnXl;i2Tx`B znQ6X0SoN%Q+h2zl5V;Ksw#lQ#8yk0$v`##V)(ikAjED(5HTtC|4C+P0fvHa|(bp;T z1?dYe6-O|?vY&{&*K}Wn?`Ta>mY7P+Q&hCvRmppdtFB>`hRXk@_Cef^L`&@9J8kO( z)X9y=SlK^cIW8WG@?4JDVV!tUA;IC?u%8v8r>!z%L3#F1D#}IV9xawh-(q;b;OTvG z3c%cz!c+893Lafv$H|8J6eCI=%Wr6eVx7+LkW%t0dSu6kR>bb6AN&Qc*;CH#ia7a=NZ;C}w%F9F$lj zUzJh{NzVc?PPvmyMK{3VlbHTq5))^6OI3L*C0`o7s_Hq<6HiI)(1JAQ90cO@)B%s- zN92;XpIldWym>HMt=e_nt4i++>h6_lc6(7J9A7$Sxp;s4FZwQ@>kk|2oXle&wK*HP zUfMl{p7`{LG*o>elRp_@A_el{%qPv6jH?6_NK zIt+%VXBZ38OmodlOw8|mbSS!RZ?Adl>O%2IO#d5dBqvP&`UUeeZYcK(VRb#hhv?e~ zwN;Kd_8y__U#IC5%k=(bkGgUlFnC>@4f`606 z@k0b9zGwvk!lZVy%7%ZeusMtP76@Ig9LJUPy5R}GI?u)7%ld-5gu_XwegH0m3I;(2 zNUKlN`GdNbk00;lf4>q)roq*3o+c}zMpl=+mdY*j`-$7up#|!OFGuTIbVHsp%DBz8 zP-P~MyxABj@^{@(7GamHtu7*;B{*$)oR*Y%yIY}i5iz3T9D&jWZe#2foIGj}P=>Ya zMeh*(4@tu{R5H~c{|{E}x@%eIo__|{BwlK%8L(L{8@ER|&D(HAbSPS8S5e>I$c8-; zR7$u^@HUmG2oeGUgVVFjMQvXjA`A)Dv~tE(~^8w zBa0D>OP7>4TjrUVD0ngDWHZp$AtxCF+U+jV7p$U?xPL;#`092?!JG=mXdZo?kC)Ft z6ji+Na3czG5r|7R9;cC!Us58~Bp)fNi!+V?zIyxB3e#D?jBk1i!aVWLP zIjY*3ckeI9{@L&n5QENf+ji?x^>7!el}MV$#9nT2iS<3WJfJL3el5#5=gZ{eb41w$ z*NHic*SdLx7NC*r>Xm%H)u=?Dz(Q||i-RuO7{;YX^v<;BGq_VI83j=ZbM+D-+KX|uO2 z@4aZtYsI-cUzw>*oCQMt8YD@pw$wk5XZf#&-=2$b*P~f-yaIXN9I1aM!;*VarXAGo zc&r(yO-qLh&SZB93U{rl*5tp$dX>R=&f0X0p?Wmvj2cZZ`RbRT-f5Sifq{%pJN1|s zT|Y-g&`e7oTzAu~$XrD?yxx+)8=r|nk@Db$J99zS@19a$Kyfhc&IfYuMx9dH4vyb^ zte_)}%ir5u9`ht0Q-BU%G=52ZMK{~t@)HS>sr1vNLLvg8@f!wD<@Kjm*6K#)!l^}J z8A87oLQ(`+g8WP1VSd(ml)iJ?1z~1+gCsu&Hf%HsIR3mucMQbKb9PE=#cq)kB_A|z zVJK~(G1RY)Y#2P4#Z5xXcEGscgHu1YLHzInp%}0^8;-ClFe3onDQO z+^oStYk|PStk5tp;#I!En0jJXnXK*|wZsm|dkgM(rEV)=SY%>VGOP0X$3GOvSGaR* zxzt)gulRJ)!X2o-Ei|1FbOvJQ!~GiqN**K#aKyjbHeOazLi$h^ zRNcZ~6raW!&J0sELY@<(i(!C|m@0&iRbr8L`lKK^;rGiCoqE9^`-Om8KqWQVAoo}?B zJ+Z?b>f7|8dRB~{oM}ICk7+FxG$$k4$2b`d%Z6Pb2K>84oD78OMDYsyDwvncwmCKg zlEzttU-~4zgOYaRT4LG2%)r3j_|v+8c=feQ18Q_3+K z&mdXlI`lAB3QW-QGOIz}Yr}9`tQ_=^)MD+gLpc__5lij}-2=vNH4k;dPD)$GCM#yH z50Ymp^aV$BmM|!KT52Pz9vNT@e@ARgqC^>(tP*dhJAls|~CGSp3SI1c?7dJN=#vh;T$V0z@qgTJm<7?4BA$>j+^DmXH<*QBMg7HKsaL4kym1rbMJArKq#NuR>RMb!-}9XA=ZMP@PaKEn}K@`>ReTW|{?HaIQZSoyuS0bgyLrjpmYni^lu7o#-n#dlj}`x#XkSyY=& zyBbiC2Qp2&>~SWTzwsFV!=!YBpOYX8sTKfWk$K>~0D<06z zTJ|CSc9p?7D7tAV^tP<*=w8#vIY=MAf6vqev%VwWU0iOHq49VdiR? zy#(Fijtj!cz-L&w{Az|d!_L=~vrDv*+f5Gl(vQUWp68g@@m1UIt#a&MnKtgddlfhH z;X_63@Jh)0w13E*3ZL&1d93vgDu09Qz!-*h_Ti^@m^YFVsXtRjoH{oDz*p}%#j`0- zk0UR0a^N)5d;Zy8LR(AAw8DKUz1hc#A>i3~LPBEOc-rOEmN7ok=5eSA8k{6oZZ5tc zgr?`Qw@jjwRc27Fj<-6y0UtK{`mQl_Z_O6TQM+>7R7prq!J!~O?g|`UV znPrC`HluoQD>ACzG?NQu^0qXCDsG zf#H0~oqtiC=L5ar$GzO#x22ObGJYck3M$FnXR0X3MwnPqWqAT{8^+0=Dd>4u>)$qx znxO)>AuknOp@$mnh4zLwd|uy8|H^IqWzsqI1TeO52YpD*_I}0kp9w5OHQ@2unlQd? zr8E+WeDYj$CPkfImW=!??8tdyv|iSvgOK)@BTbJ5Ht{vgCRnS5ABl*F>=M*C!UdpD zYw7Q)TQvf^d7s*POY9cY*+r_Sg0sLN8{dex-c;4-$X&)QgDRF9(QtU~lBv@L@T45< za(yjCcjDB&(V*)O+g7jAh>;xB!3&;aKzErTQA;Ht>L5k{H#aHPFuZR#G&H!ALp_`K z&bf-k(JMh0K9aCiA#l-y1TO)<%?IllaampDyl&b^|>+_Bf&2mss(XxtfsFTI#O z?ldQVI<1#n3A_Z2{l$?t2a80=EMg&+fx!jkJ_uw0*}q*sSeQ|KlGisctI^0~!lf+F zE8i%mfQHmZiZS3w?4w5r6}vo_$!`A=&S36ls_DooJQx^AaS=)E>DUt#%|H3;7rnGL zqOyQQ{1vi#T_nlMo+tH*y{SafB}mz3?t{taz|%g`Tmk65PVnF$s}ltkgW>xp7(Zu( zC4C$)itwpC?xAoq#{m`9a*HKSGnk_tAK{YX)dkVYCehvCzrB;NoVYUZjmdhqbqCooA?jiVfR1v z1Ug32bL{cAOUR?}jwGVIQf5tljM&?1kxXq^Xdz+@;;RuN~cEuB|cBo z9R9=eZ*ZP4J19W5YEvBW!)S#V*)T$S$o=tt7FA^2``6^<=flDa(5YhQw{uBjK%OOu zN@WD*cb;~`f0?Gvi=XxXc3ep5P2aV=6a0MdJb5!1FOiHfz?tcIKhdLvoXVXsb#}LK zTBT{H#;+Ae5#YhF?Zf_zKhYkvioW_d%^;;TyO#k~UK^ptnum|xOgHm*Jgb(Bw-go6 zG5o&sba6PocPn=;E-$||$c|9qBc!SEL;R_>Vn=2%)98MUdRa*PY+I_nM$A(zE~4YO zfiVjo3mN|{lhQI4)5O1g=?(#z(c4zbY}i9rT6K#{N_+?IX=EUwqigX-S1=A zY3Ck&Y=6jNkS(c!>R@n36l8RBCF3`wTzOK6RsYYh<+zPV|B%gMYwe%n!cnI`4(-7W zu@5K`2jf#=dL4+{zwfDU`e?5lF8>Z&_8`&@Hf~J&Rs|Qz6MY=I+Uf0VX8Ho8#9qpp z2dReOc-eV^iT4M?p*yb3VnVk`AhUd~uSB>Y6g%r4e?)J9JScrTDhlKT-lx}(1wvbG z78Vy#u&i_w-Ql{BMX-huc<(noZU1oBt1aX2z3)=h24u}Mh`8L`+$=w>!c(pSUyErj z1d72kodXWHuV23&eSnQj(W&u25A4pwXq@23iqGP)to~-0-8C~it9|P}`A3w;Wuma2 z*}^xrh7R4JNHy7KMQscy6ViVg2PAGAEXQ5xz>9Qq$~cIt0_x8nn{>Q7jrHj*H?{- z2~o9vAQR)ogxM0JER*0+Rrt|C#{naRj#ncmEgjG3J~5pcSPFjre8Jhg7Yb3zqKR2n z+0^SymqXK8XB|F>Y6`GG)fKA3*X~w^&aXdnHPbFoMUIQO_D(Oiw(d|0$(#fx894Z4 zZhZ4I+36A{dMe}<`4O>I$+U@R?q&2%6+#gIsV7j*knUSSPu%S6?0tqgirVt1SrbCZ z9s+MdtHksQ{)yq)rv}+(74F9?jP<|~0Nu3u&3k=6u8%M9i*;APeKuOty|d z^(#F&RYvxzp&^H&ky@a$(vp%qYXNS)xrHT!SI98_L8j)Cyg|ass7OprC0z`1uh6wHdd)S~WZyD@H}|R=P=nR}7qwdFv(KAEe;F!> zPZ#)?{*A}K#++wi_S;d7bhM`Ckr-dR7`SPSam+y@&kL|KP&=Cf6om09Y3|Wmox4cY zy!WNS6hNPspB|=C#98;~3I&-zEUtEY-X7$R^2yaz4*fYe6I({v{h7^q z`BLEaru$RPvlkSeG&>X>R@Va^OXa`7#pFAu1h*$OH8sFgGz%3PP0!6azVKq-o(aD1 zF-wSB#wHBbt-WZl;GBk=@IwvwmC}@`zcwq$4UpxQTvjMCk;9wPfHiL=S!RXxsL!D2 zswE!irIm{lBG&91J3V>9H6@vw@4f#~#;ZmHX0_c{wsw5(~M|^dEd% z!?pXWhP2Z|N8zu)^CGW2uIogsR zrO>-g$Lv$rt1zXmC*wFUx#S*Xk-CoPzTteDb~T=T=bv;uuCx&6XlhC|nOj_aYAmg) z%cBB77zr+3Ok^z0ng{Cgg}xqTVzSiu-^`oajTyCx5clXLNxdbLCktkG0X7~&9bL*g z{+^+7w{rq4uX1yZb6DS`eY6rw(`g)?4|h5S%J7vzHi5UG=j8-#T3`nNBe@htL0ufO z9bAL}samK0{{dXpLraiL!0jFLkeVD{MAYPOhVt7?O1M*BeB9G&vorVwsIr5D6^O<9 zcZ1%^U8+I_sF?S+eKJhAikq5fgixXIABF~%%J;&SP=$+A-5YhJByT`;;Y=K}ZrQ-S zhS7}|`2TV#*LlxV2Sfo#+g4eCOqm_&C)aP{Rb_PnY`DZb>8g70I%gYyYLb-6#pa zddM}I`|&m2SW;!b49b_nhOx)l=|Ne;if44B{ovfJi}YT?iG2aK@j*xNK!9Pm%K6$!w}jLwzHZE1O4fgFa!A0l$DPfMaVoUn=I_oaS7Q9%I^$!ddEb%aMXJe36UGZw@J)3RG;9Iy-w%DW*I_Ca~aA8 z+?Cx^7z}|SpiqS&I7QzjuE}b6>!m?9)|6)wgBSADdh0M1PEY6Xt0Un6F1RB0Kn25X zd<0+NcAZ}aj-$Uw6x`gDoBVm2=L37(6-JQ9%RkQ@aUXWu{PTz1j}mia{^VEKs-Ys_ z(vW9Sy&%L2ZnLOw+}gHM%_r$LfH8@L4qFzvvq2WvR`E=omLagR&;92r8o@Y`@ti?H zE+x3?zhqTLk~-0~wKZ;eFUZoN{{whjPQCPv#LiJTE!bIlhi@cc8s@n>I91POcR4!M zDZjpzq!rx4flw7I;cf(AF0j!FqR_W$Y*yZ{kj zb=~gK`IL}c%R;Iy5b*pn0u_{fMY`!-K$@W=VJNJqIHJ5UsV)?=j76s2($^%|R{VwY zg%E&s=8iX9Tw>eC-IBK;d7YVg)paFlrI--F7NA*3-B0_;^0nsdMX2MsWboCcdP6oanD@$2;0yeLV_t%T?j}+7!97sfw&@a&Q+39!@qEn_a~f9vK=@&lsMNwD2b#hsqo<_=+i^LyM8*8pnN4iKQWis4u;x5@5 zJO0<9i0%t3@%zth?b;Jy5Pj1le^oQ|e4Cirxoc+q9y`re`B`6BIPv}}Q^(YjYjSYz z@XoKZtRZHIJ9+ihM;goXSjg`bam~bh_{Pp2vh>;h{pnMSe|g4?x!`SYov@tZqk0S701nInv1BmTXHF8 zrlyreJD@iLI2`4JCx&&j)KGM~#$F;@|AlET^)WIUCuYJ;@Hja+M+%J~d<2FDH49iX zHyeK6Jkds{ef;Xowv4y}H0D>8($MclR1#{LnVybFdPo&^7ef7hm3V6uvF>IFZgN=Q zQP`F;++pGRsZXKd|Bv|A zD0zrt>~?2*!82(()vqrt<_xDA{oJGKOJipzYvx`Q~%qPt>|B=bp2)Ezk`$oWC%}K;qy$ zzT|$oeD8>jy~tm(-L}d{2xKgs)c!TT5p`o@`@eslaxR5H?(Yt_7@@}irf!rC%)4^( zvV_%#ECWHMAhauT;lpPBO6I#_`xJeafY8=^m1U!MC}jl2LSZ`6iO&&ST(`ALVX-XZd{ojS!Jq)#S&{PZctAiMsQI=&F>_Pp;z zKOh?Ad%^Cj;v9Jv)!t9Eo*{D(!L<8T0(o3$Zc5#2JtUB0ZfCd67g`=wB!Uqeth|%$ z%yv;#G`F3+n1(k1lVHm)>c$1n$vrC^Jy=FD6TLR%iM+nNFHw+1RdETOhX4frF-)-< z`wc_!s{Xs7Q!_+Eh+5BfI@sb?GsyPcwQHsTLcVP#TM(hIGJ7pawiB;+zM=?ZiMUco zJ4-f--2keyI87*GB9VLG>MT9*Zu4}g^^04Kb&j0)xIysc5lFkcp|?ZQ-@>@{kK2(o z3X`}$p`W>@!iOtigl;DoPhc$i6wOurq~rsUcJW*lY?P)XQB!0#aaLk(P!Cu;;(-Ky zz2`7QULb%1P#)#3MLW>{9IdpcPt(`s34y$OGLs3}DxTIFvMGJCY1-@vXL&ijk zF)uxeT0bTNg>5`s60!V~-@jYokQ;fllcKgi`pL4-NolP*1(NS)`^{FL-;Vpok- zeNrHOZQ_@@V|c55YRRi=3ojcUfe_i|^MdCy^x(zUILb{IT$iME5a4Fn0OI8UX+&{k z+8q;V34GS8Cqj>-3~(APC8zjo!#_1-`ySJeO_+Xp9Yxf^*?!z^iRJRMTzQM7yNd^R z5~^oCM|t;>X>KpGO;#Kpr+gUnVA7afsguN;B9}saHPbYg?cV~7$IVp+aT14a57>z& z{O^65bpHKUh81Ur-@?expUw6XJDDt1Qm6d?(Nvg28lKN~X|Vabl%c19v{X`0tpxKQ zOJ4BEgwgR1uGKVw=BcI90f+veQqx?-s`XqcL~4Z^zaKH(&i(pzZKh}Ml+mvw;K%LC zwMI*}XU`tmE-pNGTF>yTZ=*YvbE-xZetzh-k!d^4#}viAyt2ZUdX>SK=kj;d|NEa6$SYN=N>MXr$gcdY)&!jUJ zQq-cHJc;Y+{?_ANttK*$T$9^u3J7UzpZY-003enVtvj;aZL+i{?7yKoe(;@Jbr2cd z9$2q2yJx|UKY79; zL|#MBCe&BrGl)2hsZq`Tmx-b2=&Iet5j~3*+ojorAPe?WhhlS9mJEwgW zqIRX}sKq=*>__Ogjt-`1ZbHCwzSGmBKe^b0;{I^GG!&}!du-i9aryQ zIcFCz^y5{e$9JqOk8_grXQ#!J4of%YyBp&?u0V zi6?GlifI1a3MVpa%S}PK8mTMR))^+kqxN@k@jm~?6^YBD{7vFFw=R70de3o+_f31L z1pws&RR2G=gNbZkDDpZmm`aLx4L^g@+3E6edtp$VbCC~>XE633XD@HH@rViL{Ze~( zS=0yl%so8-sc~XS%15SWxmP$8^!)I;>~R3GZBEkwL=GEC0GTp6SDh{NJG zeI`Kbjb9e)9$Ob@;<%fDHG4&>Z>C+=rRqv`_X;n)t3qm;?}y)=C>y}RCl_7B9yIP2 zWWmLF8vC8CcyF#W09gf|IkEG>Or&S-yG2^^Bijg=7wYsNf{{+baI`{2N7xDK=*BGb3SIm1WH}bb<8=58X10HowmME zK9c;ivFUM(0RK5dn%;9ER=Nq+p^I7lbgu${o#6(7kSaV5*yQA!wsG=DeKZ?qzJCNd z7*xYYv3PKnjW@p4W?KQu$D;(};3FYwjhF{&{8;5iE0d;OjGacxp+m&`SQNN9zU$%) ziOLgQ*SXKp{>vnroAU)<`}dn&9$ z>_Ib$R-NXHp1fv6Ls9D*P-me?#B%QJ=DD$2sOecw6F{l#(u_xKTO?eJ^EfN5bIPUe^$iWl%g9hXvqKYs zOWC+=R=w47uQEE3&qEX{3dJ4`^#w52 z+^oSv1n6uYEkaP@X9mPJ;`k@9zadXPl75Ue*7`MpRLd6k5S0v%61)L+ZxrrJv8Y1S zH!DGZwWzPTS+BgT%wOR<3Mdg>HT;27;5M|Zn2l)#|FMR0DW?fgsXmkbPr>|-OwFwk zUmM1}QveVlr`-6bgo5G6=UyNYzhbmnK&GA4!B$avM8U6>om{*m7RPFy!%R;#5(5gm zxtA2oAw{t$IEc0d09R6yk~;nCXLuU9djgFdZ){kJ{Bf0GV4yj0-_F{4Y_OZ)7u96- zZQj+p?J#=mWN(ZZ$6Ay7`gBh{968|PtfFi0`2^J6)KbGksvrw|kK#5YlJ^pD?UnKtO8+Ibb;D-iyn^!P!DN}$nA@fxN$(^<2>$C@dV45aqZcR*F^ z>oRegudru$s_ePSc!QPgLTq4W=kU9SEn`8dgnQcqUFRg{JyBs%2x?hWF(jTgeeyDv z5ve>Jl=~n+`GOG_--%-hXomaR86PKxwXcNV*fIB+FX&7i6eQ5fRwvH5l%0@}AYwW{ zj1bfNV7)R4!P7nVc@h&LhFGGK}-ZO zt2=l0`uXB^MmjWV%x{>UU?ym&xctX5sH7>nkkMlg9St9L@yeoBe;$J5VWK=u++E2y zCf@J!uC*h1%zfAWe1ZHyX{*yC8b#B`*pjc)Kw?SmD$si4O`XgP1?@EV+qZ8I>{_L+ zk|!oYU4%kw8!(&uS;LsRMx3~MMDhK$Z8&o<{#&h}Zh+4KxHKT(gy6g6##iGrFF(=3 z<gxlIa;TDwgYd3nM;sYfe2}!^nh7glU`(nSe||-U?Cc1U5a98(zaLK$HV42V ziHYUzOB#38Nhtj6qX)F?zxDd_t3wEsmp8J`clypz4)Q>kfVHme50Pm!03H6~;G3x0`4Tbmusx5B7o}o+LBe|L>wDT_@ zvtN(Rj|6X1ETdpx{RpJ$i;PW-v@bj)<>k3&9`C5dk_asb09vlmczW!iF2X^<}E1MxCW`Fi>y41~!8xViRFAGc$iDvwz}VhoX~7TBDB?KcNxt z`u9mQiXRmlugHBGMlY~m^t867d_(=%jfTRHK1~3c_!U6UIDzmNn3`IaJW}A1NvZGV z0xj@s9n6IH*nzeM{3x{{bM!6w?aKMxQ%T9mN-b9d+A-*X6Z&vF$B#!rk3VDw`SaWj zXndY@5GZ$~o@g}bK>S8z*+#z59){q9pTg(^f_-mUAZ~wdgj|lBsJpkaq2lrbNVN+_ zeucbz^$IjT;9G|x_#%L)7l^L$Ns-(h?Rk1o`Qi~JwI>|{^F}jE?$}G?G?&NM#pv+? z;7P4*;2UGC6U7LO|Dg5;|I%sqxDj{9YeR5-P{4r;DLX-Iqydi~!{0S^>sJef-Z?~f zZ|}IF=>q;WJ_*V)aybA3Ha0dq<+dPo#zg2)B=5b+2^VTj>W6OfOFrGMVrKQS6s)}P zj6kutNakzEZ#(k;8&qg68lRRg=2zGF`)1KDK2g<;WQ@UwWuu+PQFN=imuW_pS) zh)JHuloMhRq>SUp_g(NTG&*k(#z8hR25JsxBBpOFV*h40I$|Xc(aP`F8|tq*x-7?| z1HRz}E~FD`u^iCbb|u__3VB~IeVveq2sIgLtTmQi(DS@EPiJ>w{%)2C+4i%rL8ldkRlSjk(V%mFic9#rx1H{C(azX@bmSwe&at0Irn-Pt8Yat`t)FEA}Ka=d0rH zxpuA9gJq{rdKRvZx;kazUnrHqVn1Xqi9Js(jH<%>V;4$}Q%El01a ztD{$dM0_44oZ#EpURKG1N|5eil|B0M@3>#v_!GNTWQmfu9ah?wP!z|yKi=LMTz2Ki z;`lE9vhKCTF11_5gFV$m7}ckBRf~h6!4|MEw2VQ;fM0t>8kfYyi8Mjw6>|`osj^t} zRn3^{U@4v$WQjPnvb_9576M8~dCmrWV0*c^LepJ6Jm@mMFL1H=<`Ei&)sEJDy)O`o zBQ$CcY%2_`>48ckp!jl~&I@+oQ*0Z*bish7J}ivR!$DVARyb1h>9TloNb2PZ{kXvz2R2U%cm9&n7uFlx9#J{)ob%XKx=OvE%qbAo0?2a$eX9`j>;u_k^^3ZclfPn>olr zThqLd_P!TIcL&%b-eYI}zs{=$r>6#Y6s3zkm6)`)B?LDl%Y68 z)*o1aWS(94Yo6A&AmbpSsS6W8s3&s`wqzu zcz-6Rl+Bj*_rNRWr~MW(__o=EL|^>lFXZp6Qhd3_*>I@H!p9TRU!`Nm2)>9EnEO`H zH+|!tp#_$fWk!lOMn?=+1^6u0s;j*Ya55akLoe1dwFDr@^)&?6flAt~i{B*~K2qqi z9DYd4qC9LQYeJu9kd2)iySh;hc^HK)yCXoMpY_n=fb^sC-?^4BPW#FOlW!&&D=$D@ zsQGOQh;?IbTwx&Np!EU2;OmVM!)MqAcbr55bSI&YpJQdd5L^FTRiSJkb~=eu&p4=0 zhQ1vpmh0EyK(RUYqUraCbn3;k9?*Yk4@P+R0E8Gb?#cGZaq!tzfLLNGov^d8_p=J!)H@d#!8 z4*U!7qgj?oa@7T$!HAA>JilATAT^*ap7|9(MBiqK$-U40vb$2+sGCaYf}r*t7})qd z7RIlR?Y({B=AgfxM1egG-R^j`Wrx~fBHqxov#J>5ArNrxbMeDi6R6~?0E-ON?1Wv4 zWWc-eQD5TU`Xqj>(19lRxm7C5r|hD62kn5Q0b_fEg%{4%|Q z1^kreO)Y+AG?O|l6&6pxARKWb1M1t}IzP8x;iQ!``vTs#`%o%|sPGNl+3iZwcyiTlo!gxoXeClM~#JI9VKOkYBU+c>hlW=k+>Q}^xJjU z{t|bnxlJzs&(z}}FQjHSP>41?eZ+;JLO`GlOg7>iCqsiz(^DP-PIqYEuU$Lq;3ZUt1T1JuqoeJO<>1|#eeaj{ za2v+O%3-34hrwh~bTAM=O)ACs{;P~pjea}#8T|JjoDk<2nIleB8C#IU&j_|Qh1okG z3e!WRbuycnM4Ara4Yhrp0uS-~cD4oto-H<(1)4lE)NXc+G5j^c-{Q*Nsqm2wvVgf^ z4Xe4&*^rZ)%lJJM$PrXI%0`LxmT^xGSMU)2X$Duyu54>X$qH=B23{=^tIzpTJ)U#5 zvpdAepuOH%QeMuf>#9IFp3rI{ToiR-y;C8_Ao3HZb_W0*n}XeURZ_VYhKGkUE4v%mOgtSZ;AArr|_dN6}~7JlH)`Sdzh5l;{HH4 zkl9J#wbg|L1J0cfIXMP!_kx%3x||FtW^!VpctY!`C-YF6{+DZdsPygcz|XSuogzx# z7yiO%{EU^AcV;6;Ul2|`mW~_!lg@f9x7^(Y)ngDn-uS?C;u#D)R|@^UrpN9%jfKLz`@BL>E5NrLY6XN^H6e()IHeNjz^hl%a zE;XaU>q=I9EYOj_ezL&T$b(y>{fFX{4veQ!oL0vt zWl{{XLDqDfxL@=-(tnD})cl%Rg{i!p9Mz~G@}=)YU0cial4sv~LCS``p<#04{Neqtd$v`Th4J4clMJp7 zOKJtVMc+V@f!Y{`o7|6OJG4CFUoU;BjWoN?|vk~VOk>iXV*IK^`h z?tLlMcX`&Vm3C0X4t9{b5nPhz4Hsd{~w$F$saE{=h1koYD;;2B; zmrCO|hn_e1rXf?QDM}`ld_B6KWh6oi`DFDm`=iw`RL^U$m+2iGxO+Un{l7#nRWkqf z{68hjMd!ScDP^ShOc*JTU(`A{J}Zui3qC6&EM1ttYMT>%+~c!cP)xU}y)z;nMpQ7r zx2czqOe#coBM@0sufGz|`(Wage?`KeTPWSJNkMaoOAq^7;EqV%BJ z5z{Lx?+j)~yJ+_0>AVz*v7v~ZDZ168ewV;|BuApaD5dwkUYqopw8xbL4q@q!+s09F z_wJzMjoi{879 zrX=dxI5WL3);DIi44JWP4Gn$P3QpOIOx*e*e}2pJ&)=%&UVmFYT_4|cPfR>~fBpkW ztTi-4n7NV1g~0)Y_T;H0eVbI-kaU8U1HRS+cW>e3{PvA(jn}rY7bo}Ty|5=Y2TM2q z>#90wpUC>>lS+e{E33QFnnu;elab-1kzET99#j6qfl!x(4bOmX(z#Sez#f+FeMXQ& zluu=m``f7@aF0MK9nah86l_vO@2t{J$yBL6hQ*MR~HY?Dmcrp=xsvx44t zKDlyVAJUju`~9B(`JJu($5j1w7}GrR_id7j*9R0Y$<~$K&NO4UdP{L95i5Di7*PqA zAA&0GaO$$~?$SK)eC60EZ0sBnwU=Ndzba=^SW=@&Xj9 z-Vx9}3^u8fF4TBD#v1wmy zbb0Ge?9mS%Ch|<}#WP)81Tl(NW56mVh9MON5>-x}!H;i}B}`Rq3}^n$+}K^J^D{HT z$PRf^pKs4Y1fXR(QsWcm^#U`L0Niip zd1Ev^IB1IKh|*Fh{Qkk)?lN%2>N3~&w;4Cdw`@(%#;^X*3})Mta((LzdC{x!+ACk)x64~wG`1?MC+BLjZl!;cd0zNYW%3z; zvW0zP*}Lu9-(BvdXWqY4UkPQ)DGuVGk8kY1i9gH6KVNlrQ>03)YNICa==$ONnCD?0 z^S#p#QE1Cp{Gi7Xc0{Dmc0+P=GQ$LoDLcPTZ~eL~pOBmD{6FD`m3BbXKR}FopN!G> z7Vns~NBI8VwMpu~m7PANP+)HrE?95mCPc!=Jf*a+qcySU6<-pCmsbSc#=%!ZW@B7* zql4ZGx?s)7Q*5_=ez@S4~_T5)s`y3O}EqQlR=qjCC3L|neBX=^@}6)ja7Nd+pmJl zH#(NPZcT-6y`?xVn(5s)Pc0wsEfu8OCj>AY92(C4)*q0j$c*a%_wBs}vrNlVE~gi; zbm2l4aIs>y!CuK1H|xj0X+1gD7B*}AO}pNdGpD!fZ!O28i`K(I%S-{!J~5Y-m`=Y) zlDfLz{gZZy*nv}P)c3f(?FR4s99uuyJTS8a0N zb$odBk@*YzFTouvGSo->_-yZbzUnTy(*4osVe;ZR_kg>)8@~G%&lHS5XPcd$Kg#cj z!?CfU>XCvD#qUpC$XrXP`nx9}3Xuncl?~S~vnP*hYip;8@Z}X2F6qqY@~cBOi?Pnu zYb6Y)B(_cU7=h5K&sa@P=BhkZ(n39ou(l%DL#z z)^Xv@xFznkAJe8n-WOJX*Pt+Rv!OaQ$y8ptJVbYkn`Z!`Ts zY0tHrqc!q{>wEU}Ha*p5KA=|mXidJwd*Qz^Z_2%r?4f_PFM7|NS(puX5||JmKS~z> z^&~jxfXB0pd4IHVYJ1c=`T-* zo9cD4{MDYJDr!)7xmDBg$@Mhaef4B93u+{r#!Fy;S z_=-m6<(K^GvqM$E6Mx}GZCVt{&Vp9X_Rh-5s)dvPho|oj#IkS0zU)1c>^(we6tef; z6xk8U%FbRH2^o=O?~#$cM`V_jY}rC8vbXQ_eBb-^*YkRwH}`#Azj2<&c?>*27l+oa z`tS>&M*sQySA&Hho2U9xct0RjFu+j%=zHya)%kXgv%36Jv2G@-M}SGoS>#f<*ro1R z$56Cg!1{6GPmU?NNoPp&YW6?(zJ}HVf_YiD&j=@4nMSc9{pkOnYsq8}30E2;k3Qz)O1b zCE{jBXH_OgVvv!0N>D&%gCkb<$iLD(HQ-`9%K@ zi_Cf@ZHybg+qwb?Z>S4hf!Gw6KU z>!s`3kgL)D+S)gr7o4ewt-%meJxeQOa=N`eaC8G?1G{Ajep<0C_wL;JK05kh$>L3X zd~tEH&Fz=3@9mxH(eE3vAyQv|nlT$)RPDKY1(QaNl!amO;BgY?nx<=UJl^##vDApC zsL;Hdg1O1kz~qtnOgus^*!~z88UZ4rVfO@ne*CRlvv2g|>aQ_o{&M`#TRB}S_;yEo zC~i_053v%jW-Q)RD&2<><#=Wf*Q%$*8u2U^ShwU|8;ogs2r$uJFM|>-qR7e|J9V;B z90}AZVo}y%ApUAtkB@N%(@A8(Nm%I}Cl}Y=Dj!%p4Q5Dc#si2C5l7c13w>N5N-~!h zz@|^Hs04dHN7X2{s}coPtbw!`($vl&t@U_{&yz49*WACcv$b34jHamZcC zp?cXt%SxXv5fZg(nMS2`+#X!STMm5qv^*OHlWtPvFU^vHM+L(xq_l1AVk0|P7tjY zSRHP@b4I;VT)wb2mw2v}T>pBYP;?EqyJIJWH8GxbO?`l@kZ)3B8HOX!pg#dEDcNoglVUG`>2e&>LC{-?2T7N+J@YWSU?KOR;UfD|V7 zRLdz_Ofwsr@p=3V*}s1peE%^|-F08e<#RZp_(@I?d7mlDh$-%FO1^rCZn)@sHQf(+ zMa_W|kAXE~VGB=U9n%vt3@`j$m3Y+a*Gs~Ki%w^3aynp1HI$)v5cc`A9AL5WxmxU8 zw{GpMPLI#bL^82J$b5D@hCFO;y<14E5({MdN;fPlhOD0TzOfw5sCqd2@@Y4(8lOi< z@N5t5sAl2CE0U@*O@ouFJ^CI`?|BR|QTco2dqfToXZ%`Q3t zToxC1jdX~G6qmUT6FAP{ouAfrlLr`E3~;{CD;}udyNP7VR31I(GQ}ZFGq1!5Lyt5f zeLfOcqq_F}{lDZ#Mq5l9zuxJv9`5fm@&?V$&JOPa$y_8i4r-8?2VxfW(pK$SuWs=q z8EI=v>-U@CJ(?HV842k`kVsZ9pBpL5d6 zl2rdc7oZOqbtK-1-(Pv>B9jL% z#-FBqN^22ZwtZ?F_y&*&21T0i&TI7aLz9G*6sRme?TH}T)1!&Dlh2GAIEh%8m|Fj& z5U8O5xwEy!MIbTOmz4^nAK(m*FpxyRif5wtepX`$-MDu2CLEUxuGeCJJ3jdFY|9jSb>}*Wb>(w>0bG9jD**@6BB5JYG;&sG9A=j;oxB`ep6;- zO&hS5jZgtr!Mj{~|4e%#Al+1NvMVYmXpxn`b95qovyJBBnY+Wq7~XU5^p%E4KAnDx zJ!1*tr2FfxK5I#qLneM4Qz9ql^&9?n!s^I~?O!g^mHgeGOWR)-oxY8Zj_jZ!(9u2y z*VM|7#Ye!{fc#OLJ8;Q?h|qwme}R!08x#uG);Hrn$LeB>K;;0qt<4?CqK5FUibN+T zCs55nUSRs*=csR(I4eduy!eKVNTz|FyInV0#m^MU^2Lhdns13|`PR&3DK0kFPO_ma zwivHw-z6tYr*H&GX+3yAb|ObdO)Xp72j3}FKMrH{A&gbCXJ_neZGZmuSeO%T$IHoZ zfA}5IV(s^4u+$BtJH+4Xc;c$B68TpJxrDzWFwd@#VHVH$#k#mD1x11ISDT0w1giq}{se{5Q8YCC*FJK{J)Tub?%2 zuzUCE(Ss+ps0br(j*>qw=RrD^>_?jK{-PEc=z+G{7ttL0@;<`kWPP(o8JuOSRSla< zqB32ghtO*@o8-#ios8r5p>{Xy_MWe!L2U%}mxpMNu#3XDME`npO= zon4rDPZV{8kJu|2`&f0bRud#JR+8fF{8eiU!r(%EDH(G)rZBxWPDm00IGk4DFcAGA zqpDw?QUc<8Ax`R-vy;=6qX_}W?b{XA)o!c(iL9)wdha+?q$Wm2oR>aFKrrisipis3 z7G=Fr_fO;>qxsakw+2(*BMga26{5?g`Hg6Qwx@z;NPVsgD)|ayHfI)OJF&I2lb@vbKFEAp6mWvyrKb~a5%aRN3TWI(&PNztur&(hBozH^ zU%*14p7~IywzQ41z}eE+nN74U1BHg*5#*G9$9x+U^hxqITM@%Et%A{rTqAu*Yg1Ll zn_hJhPK6~F6@?F0U${6o+1O5ZSYSY*^bg`%ax9VoL{Vyf9T^FEl(@ePQ$G@FUfe(o zxJrbV+k_3|#62j9$(mlFPtS1@l3b2YVj|A(j_8gBtviXmUZKCz-}&3h?O;hmHYf91 z=||L3>dl)sF|n{Zr++kuk^HbZoCdh)yB$+}BAxM#Pat7eeaoe+g8MzIo3r$1nXUjg z63g4$Dq%$}p7Z!631_Z*5?cvopz_*Yf$k+?UJ=B*0WpJg&*8u9#9<-{Ur4_Js~Wf2 zsVNXCiw}L`;}RDK^C)k4r=g*tdIrUvi&w$QJ_o-ceGLX@yk>8PfnlQ*9~D|Wfrlyj z=u~c(2QlaRogZ}?YOlaffaje0dGp(rT+e0dq~&y?cJUuE#WA-EoV&O+ z2P_$(&L&crW@Te?VA+NdS6n-4dM}N%8Q7BMy%w_%9sWN#rN`8A*%ZuRW*Cm+27 z45gH_hbuB%NLwk=E++q`Vg~ModLu-ly{T-O@@KoM&45@KprLLQWB{`=C@>X)_a9BsqN6y;Dd^ zEGp{brU~)@>;#xMDD4{%;_Tsl5~&3v;!qiFBcrCreen=(+P^ztF9>j|(49L_W2vdD zA3uHMsP&H?k2gt`^w|5vOk|A|DbX;<=(a4j35k=@mXCJBK%yowH8)}up7Rlgqy4ec zD!IY!@N3`u&L*=~;Y|x-^bxq9Mn-~y%W`!#Ao14b(C2i*Z8X6Z6B%dI+Ewv4l}fWb-;dX*0IN9>q`58`&W@zCA`L zst0JsVz4}KSiLCt_KTm7?}+VZ0{M5ck+EnPqTLk|$`LVvh~e7Wx3_);drVM-9p9o? zk6)Rbq(C5`!SKv2803l||Gm0mfiGKVhx6@r)+sI`{7#RtNrVd~A9xz?*!C_Nm3`F? z??n&bPBo`-Y>s~(8=kx=`;{qC1sJq(DlO&ZF>%_>!3QRbO7~-0oxpO65(7&)9;i}) z-meceH#dW7d3fu?*lbaCG-~^;jU@|d(?Zy5C@k-6n(Ud8Nu|@a{rS*Is#jQfXCJ3$ zW&l-sN|E;r=GfX^1}&zVR<(OC47dird@-u9kaut>HRe%#6U+b{#!(n%K@`;de9Q`~ zp}9R#^)d@>k9#EvarbJ9eDlVgZvVI%}6v0RP+wLxADJ# z>gd2F#geA;GZIS`KpBo>AA{-Z2=lFb$U6s>Hx7K$osZs?v#_$>ASXvdl;f|eYDQ!H zGKNdV=@)cS3e4Uq5L2bd@BvMln3k5dcL9hqaKy$w^IZ3}6b>a6WHZrFeSu%mK7EvE zQA>=p-cH4Dxx4p9mNA`08N!&*ElA!8aFKl|DZ$TcqM@Ra!BIeEl#plz@)8_&a5*PT z12GHyquxNkwzvdCv6R|8nt%UU1*bJJCq4J_4oQmc*yoPF>n6s!zQdd&s zJN~T-Iez^{V?%7DQ}9owgNG0^2#HpGGMU^cf2u`3oemU57AlY2uDx-HV5Ep|I9t8i zCbh|!4ng_c@?}GUDFmfw|Gf^A8MNs;pqU3oS9bdt5WS0wZ%t$qCM1vOgPf7Y>eb^~ z0^B^E2uv{k6%P-gmNB(<_`7AhYns63h~K$Rfy(sI`x<03woy|2RDiT%SUCvn^zm_p z9G|TY1~q3Qy#!_SSLX}DbJNqWynz`G`YZo<6if`9$5lmW2*2mk2H%^p|O!X(GrB7zsZoakKN2SJFjm!;B2752CRs4>xg)zK@%EHZ9Pfu<_6l^J& z*rG7BeuD^D=fIedV0k_25UXKmwLbvDVF$R!YE(=O7zFuZuMoIcI@HMrmR;gWm%>s{w&P#%X?beeD zKIC1+fxHhF{%#6Xr+a&D2*?t^DgY+A)6B0JJ8XRbXz*A2UcKNZVq|C-E1%l4d|zK5 z>`5A_GMsFpp-9tCY57I3L{S|aOKlMEeSgqliTybf*Hi-ZKyl^KvzfYHd> zaIhQ`2N#!dgA1TaRw^pEI&w@nzaY=VmGDJo#}mpKG!uLy9~7y6<=EY1H?nKlT6&+X zA8mIg(R+o3g~cj9F*Kx#E*}932I=p2km0SL5{DHk3du;AH?AlUP~*WPDD!uz9<`&z z3PgX+p2CY~#*6QoBa_>1V1KlDdjR*wo-DCk{f9f;p5CPjh|BP`aGxi=AdKtikjb3~&V#E4JLCvMKjY;EvEN^IcXrq{Nl7uU z;`=5h$o2F@U->M6K?kBhe*LvJ(z|dwEWG!V)xY?LrwHF8qG!is<-kU}N@fP~PG)9c z_gjv;ocA4{&%w(ZN)uHK6=k`3ljmV2`f*Z7qINhTQt72VIm!POH>OK@xf`v$P&|`# zyDX7`az^%Lln56RJ79@Vgzp;EV^QE7ityPI-4TFAD1XCG2IrfVdA-xiu5*g_oi^cp z78TH2`rcOoMGe9br{v3#Scnul`80dW#IqC&c3W2o@KZR9oQ1vULJ7Q1^c{bYFQ&e9 zD>TJB<23E0v)2v2G{h6d=DZoP5evBRJt7U>jdc1fE_ZV={=Yy;1(yOaaZ_~YOQyHC z#F=a!iX2!_KwUdMqPYHpY&awYz5k3)LV`|W7cIOqYcC$O$BYLZYr9aoB=MS=nwY4E zN<)xQq6(zRagbsLy~Vp^m_f7ZG{?Tiw(;@0AQJ2HPHFZfQx^%+9*p%q=sgd1a3)za zyp>y=RNR>a?;&^n+?|pVoI`+QU&F3&iLH-zLZrl=nEF2>N5y%Eji}Xg z$G$OfAc9n=udmGqg_SxK77*g0EZ01X`b?$vdc?egHpnbE|6`YhG+_^%t^P0NXV7Z$ zfFB1dztva?kmdI){_!006|bjOR#;vg0tiu{Z+iH6Z7^-#|I}e&ZQi+u7P#XF?pX>s z51Twnc~2ca`pF}|JUXz*BiGC=JbGDwIK}fVKDh4a9$VF%aVCbU2^~b8!;Ce5vafg( zZ`;|SC4|f{FLz=$GY4Dgh}7X#f9IbCX!eo=bHM^F~weB2W?|h zllH7Fh%)0@RbdxD_I@5ekN3ft?C0fIuL_~4=C50c6Q({6;FQqh@khk}?1;N=HdrEc zSKWDv0{PlFA`7SHuRjVmq#wOQ8>Ig#X#60g+DO~0AVijEc}>Blxu;O`Knk^+&=%pbb8~R~bI%&E7WLjMwA+fdv6(RyV_Hd={(iM^u0(pU)4%R&hW>C= zRK>OQc_|i0s)Dv9j#|mIG^#0iezY9JJgjX1;#_v`lrO8<-aB_>2By69f1`woW_D;m z_?x6;8zk}y$_oALnsXZDmyD(naa#|RGQ5PZpy#2)MFzyIoE5=} z7?@4Ag(|73l|X*^q~{smrWUg%KH<{`!&}!WF=0;g?3ux<@f}a7@x>q+%fj3|aIX6y z*8@Q6?%%(G`yvy)4dMV{t3iDT%+v|))eq+RmjU(Cn|`*-WiYcxGY z6h+X`PCNWk`t<6Nf$v#!-#nQ7fF`rhDI5%0SykUY2C1@-@x{wePbprc3OiezpX}Go zd2jxyo9BsBddqD@wur*VN^kMzq5jS>zm-hGwO?j<3oT?f*=Mpcl#DSkG381o>5K`8 z5>7A^UAHlCCom8*9G*hfz`6GsL2%x_-UBDir;K-GMV#M&uiwgV4rZKS&-JWuL5JzR z?M@=y`I#^RYS5~U{DY!>y2dV!e^9`5XwgaRd~X!Q8S_<7hDuyCwfxfH!yW$pK`m%M z2|r2}m`gi<{&yCn*%{uyia^@~qA9fYAT+F6`zakWv&*f3%M_7;4L6C?-&OF}v@O3D zO;A~dFBBU(weN8N!%g?iac-m9s~1`J2SDBPgSxgKA0Kt5J)bMmDH>i2isF6+_LM2l zTD>;MOUqkNZk+(n!R|++`*$2TV*d=LiGETfU4&HWAJ6AoKtiBM@AqAkmn!<_v|aiA zB0YGDAMDH!bHS8DmcK^l?A|v z{dDz4MGqYSp6JrEZlmg;dJ>v->V!uMv=U?izSmT%-|5eRlmLh^(~?%IfP52(=uk}Q z1ot;sQ8qC)(m`+e1yg7Vhrr_=UWvA$WSo*5heysJY}X&-;}6Wt+MaKjA{2CV3UAgI z!|4^QNq{P0*+U4VL61MvoaN0VNbA{-YTXCps_KRsr}g2i&9bJ~zZ_j$cD||d%2SgJ zwKngpCYed>f7k7KO*>Oz*;DH<18*Znf(?7=1(8JkMt;ih7mP7scj{k0TP@Eo&kuFg zTXy<6hr|z4*SI|eSM6A;Os$|?^4;m9KVMe_>%@S?P;z(*vtcWn-QsOy>!3*~oF-ys zX0D#WBnH}>vN7BwHXg%-8ABj|G;H;SNs^b04C=|SMFrdx088xc?J-n@REWzZy~N2g z#kiL;aIk51>D?Jd@cf56IqQyg%kS9+S0|@!_|6{G>1>YQHh}nD9&o-1E9h*mKr$~^ zw+^KlK4!q>>AaceVrY%s#KnGjfc%+xAiIsWL&c@9 zZQ6o`FVZGydp!EraMl!MHr{Vs-pwdC{MU zjJuyF>?#Tho|-SSVot)4_eFIl{Je)po6xcK%sIP$SMIRGx=Qxilyir7BE5SrIY2`Cu#+FRG&OY`jB6yI(~D~Cr7pW#(x z&6o*Iy%!fe?Ne>%S@VpU!_yDH*F5V)!%gIVI#OSoNW|j%mHis>OA8%tcIOm z-gZHicJRUM{1>doxmpJp+Kj{moGr&lUQnE47S4DbOg(|q#^-o7>DlDRMc7w9@a+o^ zgzP85QXkejly)^%U&s(_CwuJ`xUo%|J^$U;H`$-Gj1k}IWk$^JP{k1-x9{DXnw-R* z%ZB6?WB7!wuDhB6C!@*9lx_|Bpkw>=0_*wKoQb~v^VLNCi<5~q|Lsp$BW-03Ki_Lg z9IwDh!p+G!Q~h+bAj7|Z`5##F#4#%lheAZ$VUo-zobCZTI2Y%|08l7}?p&IB= zXRyT@N}P4=%FmB_g4fsA_pD`~Y;0MTwj6Nv%HNE866$XI&_CKHB{zN)s!{u zC7egY6=SxEN-Pj7E*&uUeBMv;xKC3l{!X$QNyN(bV&}T+N<}bc#NQ5k!Je)zS`jzw zwBgCg-bE+qyGC%H&pKnB(6Ek!#UH+t{oXe#?eXX0rt|wp1-b+mL+F7-l4r!UK%nda z(>lkx3=wzSPQG8MFR+NnNJ(Q^A`WKY6Mg@rZ|2vvwhL46;bgdxi;If>O^6_BIY6<=&3r3t$BN;na6Z0g>7y0(5Q7K` z@Q=|{RtAaEdNJ@^=i$uJz**s?)(T_IF98QF0+EXJnbYJVW;-}TYET$x0`F7Hu93LDv$L}sIVm9l=eT_S%I37 zB20T|^(Rz%P^`=j97PRbXW;PH1c0^?du3LN}qSL9j3YY?p zAGW+3S~piEqt9n9ldsKDduudaXVZAuWl^mRoH?|kJKdoWyXsc3i`Rh*y6yrvVUA}0?Q#0DswGy)(rj_vvQOY-oH3~&sA zS-|%*++PaKrmEa{Wzn8#)9KF_;bdtOwdHBs`=$!7)xy@pv|qU9w> zQl^zAR$BhOY3R1_ij#!H{9@AzDT9^nVB_zOji_5H4tlbWzHxSyA zmt^|t!nnrvhKXOPX^V)csL#f?JfFkAAiX|{~`Vv%@mk*iqm6$Y<8-xL14;m2>u|5Q=RQuYv>BGv$I3fmcwRTx-Y;KA|qX0?KV;#_gz_kga zvhk9KFJ^;?;5_PMO#-(d$QLd*X*z(wG@*H4S6NvYbBKEUmeP-oiD_zV)zO^NY%A*v zxDsp72=m>!6QYI(7ByZU8zt1sZ`5h+K>kbkAQQthwv=e@yx7*e|E z=|N!+C>5}pQ+Qb;Ey-+Y^TikA!N~lE@I9KVo2SIet#4?k9I($GxcdO6``+Bi2T|sA zjg8Zn_scvTvRYd&pgz1RN5S;WfA`J+T+Ura;kiM6x@}rPDR*MOI z4P0Ad&W@ASv~lrP9T?QYhi<8=8a3yGJw}Zm22biVi3N6TdUOvex-_gF z2CU1}RGM1_l+n-(XMQGytFZ)DeYdP1&?u!eia2Lwk4{9ABg6bJ8wRCy$ z@$mv}rs-m%BIC<}D+o=2ZKKYOXYdMB9f;V&Anixapfu`%0#Hd#{pX0v9x8$?wqRk2 z?N8K*4g8J-C2_kSx$UPUxS?G4a-Hf%@V0#5*fr+ndKqtI~yYyi2HA`Q64;gpi7Ufg5V88sb>rcj?sQ5iw zr|xz(zRCoa7@>eZy^Gvzc49*4_U(W0Pgm{T%{LoyigZ%|Kuk_f7T^B>^@5I$4tugS zJbxHV_=hb{@$Q$y5aX`hIJAtrOOd=}*yvCQUEAlKDA>5~$jQO+^w~2-?YHn5ec(nu zw@FL?($Kl}{5m6aGY*2Fg@6X$!NFm-(8<|8c>EDG;LjASVJbU6PlUkKFgu$GvnIK$ z>g!{EkbP)p^%&JT?%$W5o*-GQ!6?%6hH969hzN-A&2TlAlyDWcw$B9PBSUZ=Lvz#m zWGEewhGOXHfb=w;;%^U_V@3P`5pd%c1fa+>}=NaD;cAj zvNFf5Tfa6o7?r^nsHL`cJSp?85Xidz(^LTE1oZXH%rCmT&))$5Gc^@FO0UMhrtIj_ zQ6N%{j_&H|c>*=%4@QAujmIH6X2GcwH@a`=Ka7I}vVJ;8trozqc}<(^Gc(QM!QkNF zu&W=G#OLxRdyE@J;=-?F|7R&96I@P1#VEsS{3_Syffg7_z$`Ce77g(fGxhiPw;4Ol zR)8Mblz};`33QG!I^2Nx2aYn8;(QO6ncGWju`cx+ zmTE9Sz5_)!^nmoR2}C@%7Xb92)ib-QWzpaCt%$S*x5P=6$$M%zX!@!jw3|gbiVDZG zw6wkyr+;5vK*I#&HGH&0V-c2X!3VB%X6P(}8WpqQ5@$!Anu=+9isX*cz= zGsv9ZJ#4%D5wHwwDs<_RhgIDJop%HTVB#GW6~*xE;gB@Uu7uMD0TG&=HAcX&6mqy| zPnotW7DEzQoXt_fY2%Bpq194cN06kur$ah-v8#le1%G zKbH*Y73pQSYALUkl$5}!?+2b|8#3p&oejJMNHxo_s_0r%uy%KX_+fH7K+mLlO6`3S30 zs{6Y9r2Q2Q9eU)iU!y*m+dO*)m%w{+oKQ<*F!S;FzK1CeEY86}4L4&Q9TLI}E$_as zUs;rQ;K{h1ifzv)mXq;7RT^-yn*kLoSaBQ%ST8{Rw*cLH(^|R@vT%MluXy+0Y}l`p zY?MHFMu7Xky)c6ynf3KYaHX`tfAyBfq|t7Ir;ahye_5N6nYr_dET}?r6@Re#>({#b z#z0>mB{elOHmZ0Iwy3afBO5TamW5qRK}rv~i7f?yN?T5?d7}{D&bnj3cwPE_7=yBl zxjE9He6rRX$Nb>K{ukahIn>FjA&E^pq)au0H(3x9nz;23KmU2c_kTnpsrAqj7$3@q zCGC{-^jn*d+_(cEDwK!2LWFnW=r0FUaJlje50D(8FoFu52<@5Rr1*~#0dK+-Il0IA zAEg+iDD4s89Hk79+1;+eyCFFw)P8qZ9}l`Mqgwl?c6MMN4_NBg;9A+gvO6d$ARxeAT%DPTjBT@EFST8sw)vSv;yPqC zQ=&^ZpY42c+Xu%cpl_oD4nQ;d1WRW}h?n;nR7ynRd&GvVuv1m0;oj9XGCGBVJd4L4 zAhsrxcQ9{&+#0CuX#6hW?D_x*W?|v>n6{SXruOAuw|Q>$^XEe%{+FcK{1-agyKSUr zXRkuKs?ww4qtM!Sha}se(E;WYENuKviSs>O797nE1jLXKc11SoACO1njc*x{^ef?4PLyLP62`yj#^cWy9_ zkgJ4&2+WfR&hcUWgM(I4fqP zX$fY#Todm-Fgic}`enPadRtsvy{Lhg*v9xnXPi?XOqQW$MGf2S!mETz2-b7~E*lJ+ zwaeMSBdIuIur$=Jyyf6(!U7++tmVM)@(CtjpNfelaM#jbY-8*ZI-+~8!E0B7ntBe-=yhYEb+V>{2l-oFGbI{Nxa@$oxf1%^tD8%UJZQ3R=fr#p^Q(%Qcu zjZ5xO+K|Q}QX83mxwv-RShnJ7^9TxPnXGL%7G^4~@OJ)SpVi&jOm5X+XJ;=gF7{rE zU>km_q(iWM)mbc#zg+u%@Ok1fk(Gv*-?h`=xAI)=+F57{#gEOmHQnrqfH&P6mkfOB zMnR!i)uJwotb-FeP@D6}>7c{0A3xH-$pAJ%O3Ep;Z5O}v+i+J* z=irtG&v1A?ux5a51BfBI-^I=sUKnoB6U4uYa<&3n05~Av`c_s|g=X<^&U2YS(kG=M zn%m;BwRQjF%J1Lx031BpUc4F`A;k3bmvETC2%-h1L-qCV`gay1WU@S=Z?1hdZ>psQ zG-rhktdR_IMJXt3AMpb)wuZrpQ5 z+7tCny$*g)!A}q=L&NF$i-S7YzG48>^YWI%`M_F;(`@!?#<8iirsgg%%8JfZR8`Ld zEG18;hCKexJ~TA+-di65!~;++GIDZobej2dK9VE*E$Iu)D`jRbU~5k5>4e-c z+^c2JChX*Elv#GB0m~u9TM=+YN~J!w41(tWVu`%19$G}$1uHJcS5qe{zY(Ajl5yYS zV@H<<%!4oKyHSeh4fP_VRIsCCwb=;UE}$97FT=682<8@9XKH#n#eu?*1S z#$EfbxOw%`*-91`7GP_-)D;Qoy136_=nQeo6%`d=orPO#nHhJrugF%$%S-_HGBPlz zhwJm|$p@iVnD`&BLb?I4t6{_uaMVd3YrN==)cx?7`B2_!sH1bWM*^QE3wlWL)_;8K zC8gz9(2I9h0j7*F+<@I*sDYm{Fxb}zJ)^R{f;GB46jZH+<>dj;8o&tbmw5_-ttNSI z6k)NnJ`-Q)kN7)Z$&-pggUZ)7YvZwIP$Rn$Dekax7Bp)HCn#7a0i+Sb(+>NTKuWP$S z*+#CIY+UMS&rzf*_m*bAQ=g~8q@)kdDs>GFa3hC#b;Hjp*|Bf@@JB#^nu-d}lp|k% z;8{saOG9VvjvzpB1=@V#V=(}x0CR20|A1Qy47#G$RteHif4;=^yHjAtvw-`_Gd>E~ z#Kv{(aMyuX7!+p|VGw@{4%y`7Yu@*iDVbh_SpPO1hAG*usd%|GT( z6LGhNrQVBr2WAuFgSGJ90c2;7jpZ;UVGJml3_rLHRaSKr=RWc3N+GGl$6+S-FjccD>O?5dU9|D zf@OyA-M&3CKX0a^1KmBeYA=f|8VPS80PXz!D@cL=pKbet@(I|qo^!zy`DZboH}A73 zd$_x+Yih3j{HepsT*v6u;yl#t_lU7XX#au+;fXYJ_nCIDO4sCtpx)n8RZ0(m#R$i; zqUACg8XEhl*`r5{_f5o5!5Ai?XGm8<&Y1!hYMCRa8plhik0fu+4(8Ai&L!R^5a>!i z0nW-k>56ZJ@Aoy}3ALU6*m_WAJOw6mdU`9jd>a?XNmaDE7oFfuf{Qvt&KCP`a45s; z1k4oLzO0N4{p4}oz5OmbW=;3^gE*7fY@H0j@htE{!)OZNY`&5?ZlQwRJS=SB$VW!* z>JqSbfT9l=H2q(=|D&4sQjXGY^>4MVz~txJS0xQuvp0l@MutQSR4))= zIw8knnzG+Wxi|ZN2LzK0{gt7$_u%CK8M)A=bms53&D!srn$f<#gLk+rcIVjl>NFa` zQrX0$23lInehDGokHkmnE%R5uWuva(#_>G?rx}czhdEQ6NtgqDwmr+;1d&z zil4~&&1Bj#aSb+lRu&2ZSFXvIF&zMEV1Xj+FdO$mn|;~*2bfKClKwOZTzIiJtuB_F zgkeBOHKF<0;ve)d)XWb4FhPLJjkP#}9EItb4>p#%x_XSnN#Q0NV6$x(C!1B3mH7n) z%&EM7O(u z(lEQzKIig<8$4fIV-=T_-5iLnXa!fCUY^#HlBjN~k8rqDR9w5t0E7I!otKngSY??9MwFoMvRzt}Q>Km#o+LbL>Oz_;ug_ zL9Qk((!`Hy<^}k`NWn1N%fbTnsT0t~y}TOeJJAq`kO1eG8bfXT61J*wcj=}cC2Psd zV%?**8ZQ(G+_=6hqj^bXkzxjAIRG+n%0W=nuc87T=q-tRT(jcdzyEb`4yTx+9UuOM zG8`5l?|i5QOfWzj8Rp{frJgS}0n;>>2gW#Xa_oxiyRLBX@;+Cs)rHYePz(#^wFo)5 z#Muo>KYUPSCvEiZ4MR=(qOPh+O-lOZegk|F*K z&O|yzxgIZfTk_pLV|(NS64-pzCrcce>v?A=)~kzmU-&KZX$Fir>iVS5VMK%O0J=O~ zuLVj9i`d>NIzX%M6Xyf=LtLsQBhxWC3HECMDy1K@b5M>X{Xt11?n{lp>pKX1G#M>4 zN1^L*HF1?Z8HoV^6>c5iYQQv9^CZke8p5l@+5)QoG{@e)E(oU!S8Xh%k15M*tOx+(hebPEOU*2X9#JiHXtNo5 znn_kmzzV2Ma9;rb>rd> z2Sut>sPhm%Q#ep#Q^3h#|0}CvLzT8X#t$jcCp0}c!7slW&Dz{SMIyU)?tczuB!&7K z9_hOtju?wK@ZNgK{UR*d(#1eTQaY-|)$7Z3+HDill?Kymuz9<4M~+wyV1+9lFxTsY zObe=;ttjF zL78os9d{;6jIP6lnO<#jD-qI%jY=QD#rxm`PB7Gt;LOt5*~!7d;oo1u|5Z_|v>p%q z55CRKy{5SYK4PbdezJ>egaw&TWLI!;aF!(O3usCJ5LmXPyGckZLYn-VtUby@S2yG? zYD5sD9Ft(p+BKU&{`*Um0CnL+H;>uM-?u{;pj+9-4}7e!0aY-p0p5*#C$j`XTV15&Fq+dt{3*woGlG$eipp^EN>zSb}r5@M>D+tx;({00Vt8{F-pSoM-z5`^(_cH~qC^ywTiH>}7{0UKSp z2Ubd2#kUQ6`}<|E3NdBtVQks^k=Fi`0f;oARtCr%TK?*27HkV355Oo4uvVM9^|6Z= z+oz8oWMNyf*(2?FymtUn%Y4;@#Kv9yk=FlW3UOlq??9LHQ16TlJD38jYWz;_Sb2iZ z2OvwJ`@OJx zj2`D93e$;PwN{slZ;-O~g-pJy{~eaV`Sj@=FG49?w4Aq5*)|>}f|bADbiCagYZZM8kJI%fkEBHzh6w5&OJ~HqSMb^&P*5O+ zzu%z8A`EMN+2Ujw9}P+>EBO;hK3P;$*VZ=PA23l0iH`sSSUoqOi|`~weG^QHF4oWk zDFe#re#ztQZ^NHHa+9PlTDV?8NAC)a1um< zEqkq-5C6;8uf{-D1KUkjThOgRzggDMki3)LI;^y6jRa1YMIA`-Fwo@seY;JF6p2w~ zU)Q=&xT6T&Y5$imoemEb`^L4NUn_eEY&p<$T&cQ5prnMF3=UQOu`ycZ4 zTcpdA%4_wqLp2T!U*367PURa)KWES1{*4>X2)v6Z`MBi)QRN{u*DE^J!Qj3+!XBSN%7#`Lw zNSTd6ZEy_pi1pe+d$sXkip;Uu7(!h1#esXoO#e+cQ1fIVxmxcyH5A=jI>f~c_S{1& z8D}+xM2L2N1((|6%hw`B#>u2_5UCFh0@Id{GLy+h4~MFyVz2**V*pQO7fo=S*DKv8 zR#sP+|I1MLUS=Jhse&RgS!Ckdx3!>21XRtI1F&(}ZqR8!Os$#c=Es0aj8Mef?br9( zMOch7SrfAwvBGEDtKq21@o@XFpT`++l@%Ai3Vihj*SmLcknp(~DfC|~stL<5Bb)|C za<+j(umUc|QzX;%eYiu^G2>4gp_m006iKoCdrqIi#zQr-q;L_D0>8=bck~p&`9DfJ zwH*wD?o8ShxoxVgqoKW^@38R!K{NCXNIMk&!#K_H|KkF1a;`lPQf48^$_xcJjo%~iP}-$MG^r?QE%xp?+F&6( zc#s2fFYB_zoZ^9rN%Y$!D17>F2Ye#-ZoZXgg`H>rb9$aU^(CLjFSc0LmWFEk1^H#SfZvdH^j{`*Qq0yGE+c+@|cW(|@G)M4@-=nZ*9(Vut?giDF< z0~Kao7-+RWibOG&xuj?NG`UTV3Z5#H?Wlp81=Py*TBKwZ$|+vv!-ANIDhsR3NwIJk z5pW6a-w&M)XS;dRW(233Fl&ZRE9)tKXYRL5@dw0!8pz7Z7RF(--bb8?jn=#Vo&7A!U@VbKOid(Fib zLjZ!;jf&vV9pNkbNy}ZyOos1H3Dq#ZFE1%E24Dw{Btsf5GF9-e?|Z`rOnsgZf+rF6 zhQVDZQaKlr4}z72=sogj->gMN!)f<~^QghqF`NZps=NKM8?+r$QU__@&BqOoFh&XcKkWFbKE8sJAM=Pp)zvSVuAB-*9Jsxg}K1GMLe<-Kfc?Pw(UO%(`@K2aO$+dG5C^y37SwWLY zFf!$>69yvey!`S&w(-5yOD1qH$crZdsc*Dj=`+xn^4RQPP^OS1xf)EKgyfCTsb*q_ zc0gRx$`F{PB=(0cqta*pLFsXZ1PlZay##CuQkd3zcw{HZgABsJ?i}K~|4Xxm4KOo3 zO+`%|0}bcN-UgtvQ0~?ks;|am_ugE6c!rN04SMF!h!D3{+?I=?oIMLV5I`2HJU5rF zd=)OSV5{8l&vf(3Vj#wjZ3kc2^;^t~5ugIHQ#!i!EaFNd4?t8Bq|iMM0#P6gMq#)L z1s+~K1rg$8FdIoyh8{>cyN$t|5S9_cHt!ryh}5$@>P)4Ujz9i)E4`My z-Smg}{_8@!!Vw5x{%MDW{>Y5*i-6x6+&FtFKb%wr_8 z#3A#L?3IY@+a_7rd+#k|mk~m!kZh795g9A zfoaaI1sAv?Dm61x`Bf{(ow;)Js;e*HoC`|-=6ok0svvLqS3K`(b^K2SR;QnxlVhZ- zTL-OmdvNfd65oX_;4&Z8EEX?-m!#k z4|*<`Gtj&xb8|K|puCTR73RXj>Pj~^K#M7wd}G7Eha<%+X|Cd}t3IN+mXeoGVvgnC z6Opb!FM&lr5EJ_|eMT(Q-%5CeE;2|{VHy?!O!|MLXc;1DN*Bc-oT zZy<6La)AshI1ntnyuCcHC}0qn-2|lO!LrX_x1BDxm>I$<1)dQ^fe><=m+@HNq#CWy z?Q8R!3d@?mhD}MQdQrwH4d1^&Hi&v>`;KxDW;pC}@ixC6CF<Fu7O-)w5_+2O!BnKDd<* z<`d#KZ~W@;;b zq0=W@tXT5DQBx_7tYKH8Y^uP42xwpqXqao|^pR`C0(AxcQaow!69I1A2$KP%-ha8w z2IVkL?<76heaI+Ta3W~~R*`%n3V|sageV#MPBzM}3DdWxSED-;oGA4yR1>B4(#EMf z%YIkU<|X@*^e#!pi9KQC#&VGPEPiWEe~thVXk}|FbB95_q#*n%!v(u^jT?9;_Uk)R z{B$u;%ve3d#)5VT&{0@E>Cu`R!ELRS=$A>ieNgdFEQXeADJ_I43<|Rfi|$KQB3-d+ zIsWtE5)KzMA_xlL>dMZ@xR(AlKZH1}Lv?0DwO2V2>xsqba;+AFZC*pj)j#HA)_$J( zlb9JS2Q@isE;ruG;9HWXVg+9d&*p{z|F;KL+1DU0McmOf)ab&(E!?0;_JN zpf3wf@P&Z^pjyO=Xnm4#zrYIugDMvpJ)fHg7R`QfqH`< zMB;1MV6~kQWRKqo2C(bhxG+^Be3X#LgaAi=zy!5RAw44lz!MK`KTEPO(A5De99Uox zvcPkA?elvrx%4iNkDT}K?Il(x`{fj(R6JiEnZNx{t{=4h^re&+dizwVK9;d`?6FXW z0n~^;en7(yvna5>;OlV#7Q<6H$gT#oU4Rk)!UU>OjU+8Kl_r)K%m={|{?8xIs)g!DZ(u?O z2n{~{%FJgj>&=?ba`wUg*FHxb-(|>e2>llwdq?pRQRi*e^A}FNSj`KYDdw#+RAl8H zksy?`uU8>y>komK zaPwxg^+Tx66bo?tL43te6=BMzNUhSBX@Y%|Z`DHLzMR`J$vGjR{U2BjW-EmLXcLcw zlXG(c9C4Yy%qb8=4Ni$D1!zTKaFIJ8CIov>{%KlP*7Y}&be)@kd}2Xwm?`ryA8v|Y zH+fRKeHw1O_7C0MbWBmagGQrmrEmdmBMzx15X8HqMZwNZ{rkFbHoHICQk1VnHY9Mu zcs-T*ogFR>R~h2MOn&a{2r49kEjXMoR5g@q=Y3Nd9YO=; zZoW?+R@SbU)<#jiFWo;Io_7{|+gXW=Cc|lWPGssvNe8y*qjel-1e_M|0uoBm4*WEi z@w!l-js1UKHdEz~AWU<%%h^6$sTe9-)3#;4r#Z3j!#A85wYak)`a@13UsiLs9{HN` z-j(7KH;=QvZ9gkIyE*y9caPYc(x9y%Y2&1dTq@8r!n>!zo>t&qp)lDjQ_ar)hP?cN@?}%`eH@WNIDDHCkkbBOdokmDEQX0 zUHsAK!dW&+*Qmoz@diEe1iJHMKDA$cF|k2j&G_n62>$4kgX@c*-`g8Ph>S{!SA2YJ zVuUrhSYMOhIm1VaPz>_~lcy$x4Y^LijUYP&m=6Dw%Xp4^>(ELIom5OmjJk;N3WP19Gm7d$5yUio+{x-VP zc*wYQ-tBLR#57qP6g2&J+H)-NsuWN!@URCTX#(8Hm-Y`Ta<#ZFh2V5oo%){Jadq)f z;9+MD0;|MlH;qkUz?eV$3REdCdVUAqK;8-N(5jZ?xpX-a0Zq`T+Y$NN`)y{F-UoR`z%{RTsF=6n!!ig`Gt^74YA_RI{JHT{b} z=BQ^6piwItRA(tx=Y&uc9c^uf-&L9HuPy1$`}7h5_`eD4HmJ^}yXx{>-JW8$E<7S! z@_SCNg~X`VZSGH=7bbrCT=0ee8<4|1vO6D`@Y81geRsg0N3@mxd8b<2nrTC%ux6xK zV(`V#uTN`ns6y!%OJ~wYGEV){2$6-7X*WsDMBx#86R&XO)}c3f(TOT%?xV7@7b2`J zUKrfJW%BxE4Ie~n76;EryhhA1eit<0O>K$$IlmeGcjeJ@e4U-*58e=KW-Nq1`eyLp z@-0QySM1t~ERMVdzm0;c&&9jnBQbR54&A56?_QrFEdNU63l+Q+< zfb8SDRqo2;g+LoJOkj&Ks9IpM3tZ>a?ik&E;01##I&czrF42{T7|l9%r%t)+N86AGqe<{UJ0s~?iW80FK zf^jZ6*WISwYPF+En`};krGnM!oPtn3M8W;)#=e@z-*bMQ*Y?~&V(dG%{MHV|v;K~C zDHmv3`}r}d*~BqQHqQShggGgb7f@1(ra}XmV8I6k;kr8pGELY+2;1JfjKdx@o#JLX z??GdRjpM24$f?47yi|MS0PkezU?{~;#-Y74^!Xxbc^Fbp`;lMY_G7ux-JKEmkk|W= zrwX}SRFTCm1jRT7lmFh%TJWivnhSkqe~=^>03V{sVZJQSk8}P??|0mGC#iine1?^8 zU-f^uH-WJP+oY{;hJ_!&PR2~qJkS4w0!r{EbICQ$eIF!Z=7S)<9A zo-sn!xQ`WqsTt=2&srRyFAVh6NBa?<!H6tBVi!?_P(UJ z_;nHjltL&bPszTm8lM!(v+4M$uCI?-Jb73f zSmmcELd4ERF5*dpzTP6sMVy%~q=D0Z99;Ue=?(E_&8`tIUw4i10(AQ24zTVnzdQXT z@F*acvt)3|9|!Js5CHdWU+Rz0Q?brjX-uWh)CyzMrVXuUoT@Rpp^##*mMAI}t(LRi zU~_W7xOn!*=lHRzF$G4=#ptAHZF)$3WJ(2wiVkQJQ!w+-aUX3-`L*rw(|Kw42v`IP z4R+AwO;7Vt5pN7f%gxVs#w`jDnpRoeSlD;5)c(;&cfwxX!8B2iF zQ*3+w^DN`S+4R$K4ec2UjL{!V)5@93Qp@I z)U2P2lu#z%yuYl;CiP+dH#QxG>r4#n;@QWJuQu-2y?Q!su8l;(XT51!nfk6#Q#^UfE4I4Z| zkl>67A#SWq2cX;o1Fghgpj;3y(60s_Qd3hLa_r~N+IhuuS4pS%v!^5_*JExmrRu(w zj+d)@li#P?;zCg5!|u0NyW`FD@T|xwz02fe{EzaVb2#4BC!8tz7a`wDG^_WTzV-Q& zqw|CQQx7+Z>jhI9e1ud=1nIxi+4ChUel6stT2)O}ch>xnSUN=H`Dvc%5H_?c@U^|l ziF0xt+hH8_T@7(HJ)Rv6FdqdGt#oflhw13lRCaxVnizu`dlDk=g7mJ}`$Men93^v~ZVzvGS|(-Q{OF ztp%@K-u-I!_1g%4>YPRL0KJ@rBDm@;mal&nx7yV3l71D~Q>_=G-UP#i3(sV|SKqB} zrNiE7AROC3xw~F<7CbLo?BYnvLYq_HqvC0Rw$PQsl$k*!vXxU%3^x*2YM_(fBm#T%~?+YW2?T z3$bKs^ZVp8qnfh~rM3!v;p5=NLvZx}Q{`{(6E+nM$#`HiKpG|!$Yl7*U4Y^=ZqY;C z%%mO;2?#-jeRO)0k2bUU{Pl-@%b^kRvqjeEzD%8&PYVO}b<$ zyVptIxh-+xn8r0+;<9^%>XWS&_e~A|Y}z^gjN2OzYxt}_Gn`L2!>~Joa zNWpty-sx^S=}vMNCyMAW!?~6X-{~jM@#)zT5jlbxERHp(IvqiMX{JyHdT&p0vuZK| zT(~5+qSUtyONXGe66__7zE6R1W2EE!an9C9Zj&{sXQ|`uJ$mMr8r|f$cUbT_ZhP0y z@nWSm+n(OFB*%fv#Dca^yA)0xX#0jELgs5BzS2rCca`U!24I24{8GREd`0~BvpOC* zs~O1g`|}xz;VC~>S((Wg#>V_<+B-QOUv~cBaBjK4C+Vuz$B>#${%JK6MS$=AhUH3= z`Ps6tiV?4kpf-DwIM5kE8F}j4q*+W4j=hrv1mxN7=%3E!$5($75`zFRd9U9#S~7}G0CQ;I8ddN!OHws!!b3zA~1xk0D{k1b~Y z7_7CkRAsV;@gAE691uUZO7iSckk&|sAW%KMuNKwCS~h5UC;HTjl!Z^7^8sVw#}b{_ zFcd#3()?Bm&Ir#xop3yT;n%^MJxj|`Babot zT(`=T+GV!9D~bUTk;>hU(3hMUJq!cTiF9w39k5*>lpE(!6v#zYT! zQ;YJ&XJ~gO!*G8PSIAxcyEAWP6Ls&y;gw?fgvgy_!}CQ1p5!C86b^&|$JQ6y(A_4s z!SkUXsw*^bi6RSwpB|t3Rz3=5sAD}WK`_V8LkeR3WT-Y*Z+sy+G#qngJ}{r0{Ek=V_kp9|L2XO`Q)DF@z@HbNr5(Js7 zxxAqGpjCRFb>1YpeDA#EaB{r2lh{kwV>sot$AV?qs+fU@c8=;Fyu}pDEK)WOztX$Q zm%qgr$;uQnmI^oi5cezgkTtN8g#dI|i+zii@gPMW{u?5>pCP{F_*dcfU*spqQ@DND z0GI^=ktib|89YL^-CS-2=N(}%BF#*k1LfqVVZF6H4CRk1r`?3TYMP^U+Z(6v zeN#=+z=yxb!ciedpLcq6v@Vqzg0cwc`@qa=bw8+ol9?e+X@P8{m2>dqw4mu!W+he9 zn!a(ZUG2EQmWaq+?l>rPg^y%3`jdD=Ql>3up#DQ%pF&b!qo(pAdlskt<5TE`gA@tZ zvK;1_f-ThV7|}-GI-EArJI{M|$Pv@JqPp;I+QW)2Ltjb^^Ea9|b`2+zNjv4J@7?qD zmDQui8Qd{U*5s6w^A0!r*#3TyP5cEpaO=$mHIw%1YilpJKc%>5pRY8Xt;{;e5ALKI z`HDDg`vE6y(q4x>$>(%;WbkLQspM zC}l7CL@-H5;@l!z{xmyYmE_pKq>HtBta#Jte8=pk{T3?XB!Df)@^o*}`5H)Kz+1g$ zyzRozP6>3mDT*-q=cfgS3i-}(vgtmOuTL6jG(Y}so&Phjc!`7~I77z5ik~)H!pAdp zad7rn5p&l6*B%Jm^=|9A)*yknMqz51?jlNxFQb+t(ZS}z-5qHjDsYJolz%^km+Yi* zI~^+w8%${}0*8^+GC{WH>6p|N(va^{S9F?L%iG`9Nz75aBs%=?oQZKmDC7#kF;6?I zEJYO?zIoECm1s7Uw3Yn(m=8byJifCoq7#Oc(V*I4#a@~tYhCm5^6DQ0FP+oRzkgiN z(c1XAQkFp>lJiBEG^{P>^snW=c*fmbXKLJPf=Kh(qjnZB62r z9C+;7U7Gl>G-lAU1Pe01818HDEY1I+r`UwrS0CZ-{N(}R#efrTAo`L_B4C-H*4FDg}!1*@-;g~7L)w5MSI-5pUk1qu;+Q(^cclCCMl1>*)n5?m5+o zY1-Sp*E0zMv%*5HBZsE=U`(n0)x~tWjw-oIvESX=Tq!P9u}Dn#TiOrNA4|6{SL_}g z9O51_NgR+dmnUDwnOaQ!E6`riSM?_PBwRgfQA6y-`nvHNG*|+*giG76oL_Buq4Di&{nts>6=me zv(aj=zN6!>^OFRj1A2DMuTUZI)~33GnGpYIJ)aEu`nCaP9<_^nhKQYa5XT#4hAv_U zLks5OFozQByZ=f9(jBYQa+Alq#Qv8H&}9aJ)-Z4!UscUVkzK2vxV7eCDMcDQxTIV( z20w8$Wtj|jmBR5N`N%g*}iY4Xl z1T8-EC9aCJ>Slf>hPe5tuO?NY?^+I@1!U+xdhT<6CXOHnP~X}4vJ<}X77JpIxuSNB z7GIhmWxG-s7v>AN?bv;AJad6e#swz?Gi1H*8>#i{ z$zM2I({LFv#<*w38Xpk6%+ zVORVQrenw;3Z=pDDNBN}uItI6Ctg$s5G9cq$Q-U3Yx53y3iB<9l84m-*Qavm;$e%i zgOgLDY7uCPDqH4B2G;k1Uk@>srF4-mA*J_|VZ|>!32FE2ijfs2kr~RXQjkoSr3z%* zCKKR3lgw(te`a(LwDH44dC2BU;~iQONKZ<<)T4#Htzf4QO48xs;WgX9$97C`Z5>3;RcSVtAW$+7?UIek!2EG4^YSTLq5b(Av zEEWH0`i-Wb#}F)j>g&f%J&)$4j1Yq=y|K?~Qy^U#hQs~c@V}&VfBIyRto8S=y57wq z`$MYk>OfR06Qo!6nLyD}=UFZbQ}E7_V^)=Pi7cRYd4!F`>${$ixwhX0LK~oSArTW% zww)xH#Qc$!ki@TW>1E|iH+WgzN)K$AIsHA7gtESsp1XOa(@~w|yPZ(p=9Qy+*8>Z! zC+JOCM1%Vlp?K#v0*E+fXPS->{Js)VwVlfOLYKn&eiy7slc)^B>9?|LivJQ8&h_iC z^nuqb@NnoZJUM_eOe@1j_ytw!^?BnuSq+nvCJ3IJ1M{p-zg)YNb+!G6&3l-5jjy^* z$gJo))#+cPAcM|h{4XIaO+mVlKM-EmVyv#uepA5l(Q}w$!0&dTX)_ak@VMyS%fTgY z@WkP#WeOIg>j5-mbIut}-@56MS$FZ)@8^qnDmHiCyr^YTo!hYg{Q8AQ9q!w79_y^x zJRryrSIvFN!(=Y!$h%RoAP}j@p2W)B3k)CaQvA`)%X~kYZQqaY^rc-#$F@bGU=a!z zw}1+|tPDn)%)za*8^E^jWNd+P1yJ0;1ujn=iN~BE57zQdhEGYFe6_P1fbT+O=w?Qf~efMK;O^5(!;y zJ#Ol^Z$3>|>uCYve|9DzmQI`NJtdnSlfk#=lcr5 z3~>v5s&n==aH0Ujr_6pk(V}2vB}VSQe+(M9f<9Gz7+(bf)FNzHNyk;}xH~#R(pf%` zX(=WaOspQ%^0u-ZyPzSB-HgCC~Oc!w4{P!PB=Y!i!o|~`i9)YRh(a}-E zyE6tt$9Lf-X>zYLN{0XxpCSpbV5`$tMdEcj8b6WT(hOvRxMjY;Q=8m`_m5&~JDnH< znIMK4*jM<{;c~B_wI~t)h)YjK*j)u^CpchHnG2~6EP7VqldigYxw+9WL)6meY22Va zrqu4v!z=uG7z72Lfa&PI1D5k5NP6t1fs?%U{l1kUJaXWBgQA%_D!>~c1~}Aq+_JJ( zC(xpx@d|vH33ORnlK!Hjk5%Au9DMk3e6>*X2IyrcAAqw3jINNuo(;a;>2%7KNX(`F z*AMd4-;|gC!(7w*7V)Ja)E>&d{l`z7wV(O(_)prWQWiWV(rVY{y7IFw`b4WtTZXSv z7n#$(Oe3zMA)s~M0L`~mEz^Syl`ovqGJxR9=$bCPTTwoEIExL;($7#v+u|fdz z2Y?rxyu6NM*(N~pWb>Z*eX~%;>PKrd7=#oJUT0u{6t-E1+NP#;2Q=I_7W(1OyBB_z zHBPUONCX50p|h1VVCeXOD+Nzl>SxXLdd}k~LDzJHiiD1m4ao8gAcmYhGIq>ltlHDzLSS^ckjR<^w@^{;5v{09u{ZHR}jS3 zjAzNC|50Bj0P`ry{Zu0C&EtMHw-&z71y^ZUCxz=~o zeC#p{943Rhd~hioR~b$@JB7ie9e6!>eU>K63;>M2NrH0Z)&00N!zLK4_%<{AMoQy|yNVsw_W3&lZ74v*e;zoG2%NXK zGO7N&pM&zw=@Yh{-KqoKe_GFPZwWt7&#(O79MI7nrXc-6BEG%2BN-<4hU>-~pT0jSg5(d+uV1 z$#=w|m_$*w>{qE4JvJ~%37i}RyyZGQeY3bKQkI`qY{W5O9_=0rCv3T2#8SX}LIvAQ z0;V?B;x%c^99KDw3BZh?sRbzd$LVMLe;5nwU08b)w@-Y};he{CGQ_R_{W~+?Z%$zr z(PGTsVu2NvCl0RCR)Ud87KEv-?Mh=}*@V4Yp1M`dIJi6Ll}$CXL1@Clf_YF21nsr+ zD?@t$eecAx^2@?uGad|>do%@app%3FPtCXrdlC%AsCEI!S#p6|uVUmH3Bh9FYZ)~q zB+occb6=#V(wy z_Zq_|{V$L&wEAi;jboVwIm|zEZ4OS)2;Yl})#UBG!%e+JE{z0!n0<|9^{6aMiz9tI z9nf-MMtsLDnW8<#^-&l&IMgy(m^leRYZ3%KNRGjsy2&+|oi4dRyg69l+7DVMb>Wq( z)aWP9@~>g!26M*%N`_{`wVnro0icSC_`%lk9GW+$uSoO8U#y6WIg4+TAG74tT`Wa< zSj`}KDxHJ!t{;Dq?Tj`;R*DavDwLfgqKn`bK^EqSoG`luvKWOdfK z@Lmo59jjT4x7UPVeo+XD3%(au9Us$l?P!{o%;fW0Pm7aoH10~T^0J}qn|BGA!gpDN z;axU_@c>{3hQA~P>B^rMoFZ=a^H4__Ry-BT00yLCMU8QTaJoNZMO+SM3Wugxr6@0Aq34#f3i}|GVR3PBH&clFw&BLy^#p9i zhhfnm5!Eq#^=-tJu*joRUy#TxIORTSP6E%PN&8Md90nC=g#S?&;E8-+h`fn%crKWU z`$!0+#_+B|K*BZj%u*K^0j~A8(@EO+H{DM@E;&&OTReFZGhYjgEP65+^#Y;E0gcx% z`&Gj>KNou}Oj%48@&%-kflSdx`&eVR`rE0J)gvnl+aAF{EAm9w+dnslMF%I@%i166 zo>fwG!ISoCC`#j=X$URa+XKT}=zI<6<|oo_K0~BkVsgP}seuxUE{6Z$GG67!kHp*0 z1nGP>=Q`fY5%e=4F)?y7Vvh}I;(x*L6=!h=NEslv0Is^bSnO$|Q(b1?Vn*^b&5j1d zuDWZ&=*Yh2*t>DmG5Se;zC z^HXx}%7+-Q>a($)6Wy$P{`|u+Zs@+t;(H7uUe%jz32X1Pwvl9^ssEp?~ z(QTk+>|Nhivq60RuP4)n9P%&@Hn3Hv7PlvlEt;Vry)Z_DW&=zq<(1+#^Q=9g&x@@0 z$mRn>25noY6v{6vTfLCD#?{*8f;<711i0m(6#iYQ%vyK_By;<*UidN|?F)f;ecS3v z%zK?o2psMVK|0cdI{~A;Y>x3#OjsfJN9~3!s(W_NO+TCHy0!}w#m*CdsFsorI%pC} zNK6&T8ZNLXhFt*n4kr~f#h=fkYE74f#@Zav z`e|~5IykN&Ki8wob>C9Koz9!O@;T^n(=?pLb^2s0$yE2?NcU)%I*g2-zH6ytZaPyA zBvs%$F`TYx7E}F9hp|UPgSc-)t2}bTv=VAK#nj;)I4cw6@uCa?ee|vV%76p413g)r zff^E8zWMYy<86pTS=^J|%ra%vxMm zsCWRp$>o2!9x*275GLl>Or)EZUJ2D?6-3UtOUU$`L2jaz*v?(?}(M45D4^cXffMs zl1jgXR>DrmQk`@xubByuDgSAhVQLZSsC5W?>u zwPb!`3#lWG=+V-@XUd!)mRcB@FD@@1-Bml*wzPCZtah4u(2|1Y7|MX0zA!(~`vCh} zA_riiC6}?4-B!n+`sTONTZ|$2onwJdc5ug-Kke=+GhIyU^8I2hP}+R^LD042f;s-G zU7FHm1~jiHhA}T+@9sVWR0LARuc>>9WlJ&f7j5POa}37?AI0TkC6rNHH0pqE_mKr# z8N7%c&r`MzHk1N}?u~mJQ41OU8G-cN)&OJd{KrXN``h72@b>UKO!ZS36hxnZt3?L~ z++y$KDeEz!fiL z+KSMUz?*ixDu)1-JKP!fLnWi|Xy+l#2D)Q;C4d2zTs*Ds6=)RE>fPXG_O>>5BVD$99`KCWNDU^|(o_d_1#{tL>Xahj3MI!W* z)5(V7(MmKvHo@~QqLya7X}Ywb*ph6Ucj5xt$>Qm$yVT(eU1wx$n}?x-BS9s!7*0-s z21WTy2k(~lk72789Rt>H%#R4MrF?*sD$-g5BS$D>POK5GCRFznrm86i<+k)+aA{Up z6GaGIwZ)?Bw72Nz5v3w-VSscaVE8+_bxJX*bEV{-fnW1{mVe)35YD#QEsjjY@$s6r|I?oB*UCx7_>NM zKjTZeab;Y%CCJu?%DH7UkYHkSmj%vRsA|i!z3MDjle&PA_Nk@@hNl3Zw6wGUZ;qSO z!C`D60HSz%i(T@yeQR~C+LOcyg!PkbPZ?j{LonASa=5&xZXFFB06rEi39o}k z=LB<7m$6gJ!yEq(Ho1BCeJ>iQO@c3adQ|L;SGNyAl-o<%BpU{hg0Zg1fS{E!Jl2y4 zfyqT0+COOcG}!J3HzU2WM{M51YvdIbq$L4pm5#S}K~aefHndk6pTi&i)b5Zr6L)$N z0=^0=MzXL7Ssp6a!Xj_d`yq=7;P#eNoj;|6e;gS2MHg z>0Fn|gixn+JPzgy@7n@Hax%-NUnMYlWngIi3ieHt+@l-z4)v2jMbZzd8hz8f@ZwAN zn4M6Ts++gBe#MAKwxkH`W-dTeqO{okhy+z0b5kQk0Zn{DY5Sh8w~A(;0{=Qr?Pkfn zi*9EtVFTG+^>peJh45os$GI&QA}soxUY<+2oWzQ3SfB?Q6g>0f8=tAaVO2{FU4)6uSa!Akw8Pa;55461SkXFH|=<)a49BmfAvR#CI;ZzKqlBao(*K8!V}e| z*Z&pgz^jC{hFE{bXPnu}XHD*}TI6+d;0TRahiR57;omPNT%F)VkkiNEV`?cfB1cmF z`ne(v0L%`vGte!ueJ=V(!IfnRVAY2cnToi_LVM7(xyp{4x~=AeGW%mg!{@_Tga4uF z1GAVIuEL6hKb0b0(1#PjdQo;*3cX{glyAPLgbdEdQ^W0Nu#i0BV0K*BZ#rdvho&MS$#gj~% z9{z99aT5R2#r$T5xmK~&+0G*)qYGMO-*)ArZ+1dzTsl;y6;Q`7bJ@JVIFNzYEpuBQ zz$!3W(0uxq49XtI_t?YCOhym?Armm5J-!mH%nsv0&+Xr&JDt9pbNDCDVQtJ*a?uVR zcg;yU9s4gIPvj(`ZX|W(is3|EHcgp(eplF08ut$=THTju4o>5uS)n2UGN}E*h#j2c z{?ir8>3cv0{DQ*M`+V4Opg`Ez^8btOVSs9?oefApEcZrX{!V7X8Z4g(1+%8i(&+u7 zL2-{QyePRq5W=Tp@@BRVfeB=4rZj3N6x0F}@n$4AfJu{Pj;wTuf;7!mkdBEzsvG7h za3Zzsy8aj2mI!iKm{J<^2e-{?7NfF-NeS8jhBK?@`#oV!9*R=fcnR|qa;_};OXM(n zDK9tF+=TT9USkdlF_=6M=#f8R_UWV|4goMoiGhc@8&Cq7{XJ4dJ}0ps&@y(U z9kE%^{|r_f559pt8a#mDW_D!Lu_A{d{=*shxY4V!uf78~1Jyz7d~9qiOl|{(%b^9C zb%4(`tVoqdK?p3pk)a_k6|q6}3JMza_! zQU0r>?Q{exBxpP@dpi~lTJzJAk&}X8^8Vc5Ew6!18q@r7`Yp-${=v_V%VfPi29jlu)Q0GjedD#o1{hk{hr$vT&o3h zI+!j*AqhKR3$cW5UZTr&6n=eakP~(_w5Jzuce-g2O?FlW&DOpXyFB!A^kjTbTW-bf z`A_12up(G>BOAU59EX{$pNxma$+45Vb|C2y>e8r-51k-!BINsDF2Im7`~3bf-~R1% z8fX9^4T%C%`RFeg@4(Fz*eDw&g}9TU(oe}52_iZeWxz;x_ejYF;Vz*vIAGv!Ld%}f z6Uk~0(-B9oAFtM*ya&E5wI|EFN252qG`lkn0lvokzAB9b5Q=8B71kNN*5hjrsGuVP z57?~w1131o)&3QA&u*%snl~f{jf7!^-^qc%7jmS1E#D#bh`9b?6Yi=sdy)Z4 zgDUEt6#{J6XmTso;a-Ku3f58BQ)6xIFxD#@wiCL<%LeriJsCU{sD#&J6kyUaWCJQQ zAo!_sW@cRF8fJ#cyB62XkKkD}S>ZL*0CO*Uwlh89=&m0 zdfOwd7O<+`4|%>!z?TB$Yc$dl;^k5%iOgIw)$Sj{eao-Rh%pF;2NsD+$2xp)+cFjri)zB8h;p)s1PB@dx z6#+>iK(BEOK|iD4Wo~OLjRe2}15d9f>Q+-@V`F`Nx8uapQZZ;zl0NG5f^b?yRFo2L z7LsvbSt1#B554R3W6ejkxE5SQpH^FaevIa?$Wbw^q@}vJwxDVec@c~V1lPWwlamV` z5_B;ylncAaHu0pn`S>z=euIJ*1Ofct&dwSKm-Jzz`by2()A;(F{<-}|4@|(IDNaOx zzb9on`LCE(LQ%%Ah@RC^;K5kGk6=gl`IX~4qy)I`4!2b>(M$*(PfqEZc2Xd{HM^yL zr#V4^J?Xn3Y3EaqTbHFPMnJ8(zP`RKmZMr^ervSh2XXic1Fy#mCWP_pX9~Z>Qxx;m z_IFWgn-a|;TN`D1WrlFG9bN9dOLY(6pMnCmiP|dAZg}lOc6iyFH{YJgv(SmUXQT=}{PIVK|9*Hr~>WmBz z176Eb9rTvQUgkOi&tigoM`-5CB^S^8h?H*g&CBp{kGRC+smW4tm5jJo0i@3?i-T1Z zRp=mFG#G+mUSh}u0A>Nk?u2zfG+JIRG0PSr&HeCL?D>G;>aHh;c})1R7N10P-YP~e{T54*Hv@OJIX_Ir z2zb{~((@xR|ELI0?CiuG+;9Yd0NXzUv*Da;9D$#sn-{!Lz|jHNb$MoXb{4uLjsfKh z$qcDlHFwlAgh0&*s$GA8*b9#vqrU}jRfFoz&_fW*L5qcbIJ>ixjOwai-@I)x37Arl z`OdvD8IY5_1V;&>k%$JkLqoy}m()3769MqbJVGl<{y!~ikwQBhX|oQ$why6@<)-cw z=l~G|OzB2e0=|=C!slx(s)@?cXeA#r-;fkC$*R}(z5K~Yh5yhxQs7CeQ{B^`nksOh7luo6-<*ytEVbw`idm9b zo1ItkmhZk@QrA0hyLE72LSSHLM4kz#*|CIssTgeu_Fw7m7{d*JgUG8-Rb%f6j}wwc z@}}B)c<7FaaHD|bVQUM_yU(Tqe;V{TslF~$L4iNWJLlWfq|OgJDp*?dZ1kSh~@zqhST=8K`9IxjUKwCT#Gi*CX3a<4W$8&dsdpjm@M&hl>TH!r^# z)uN!?(CXzo3W-dZU<@;06^tC{L73>k2OLb~k~zs9&{MQBJKH9pO0VMmC4{btR{(M< zpfI?k|JsEQxO?!L>N0;mc?bb`VhpfIN6Ud zZO)}vw7@p0dJPrzL`U(+$OxcbP1DdYLGiTU)B>eNyGh=8-2!J++ zFO7!Caxln^Ip?(^KlL?22B$|p039jN1Ta{FP{BXFhU;Jm^=%9j0vzpJffo6aP{xUPn$_y)L{2)8C6qrKO>xN%bb^-5FLM$ z7Ku@3$LA?|^!z$m81zEc3+>xtndkQ!s`~JiC{PNf&wl;Ib;tQq8OS92N+Wh2cpL5Y z>rBhyg^L3VV=_Pi8CgLvSC5LhCDCAj76LVi%3DA?}iNw46n$QxgO#HmpX?Ba}mjTG| zDj$J=;hZu}Pz$t~oko))^kkqJ=rVKYOn}=9I4?#|UgurDqEBL3FBtJyZvWWlOH=xa zV(pCt)gmZVzX8PoNER}0IH7`l#7$7m1=n+UNX_yK{C~}Hi)kFR#y|=Bf^RsOt6d6f z#Ho(k@Ef$Bz+V{bF#}m{$+ALXdma%{gmq9&f#%+TVDn+rrMj8q_%v>sSm_Q^3KsqC zhdWqb%&K6V2(ySkq;TtResHyh@6QG3I23hpop}Xt7W6GR8DD?En+h#Q&sjO(q;d1U zO_F!VGyah;$S;#8$4>2Eog{`|-}Qv~b$1n%*-+*_IFh-QZs+U_u5VDVJvYCb)eGgR zID;Axk}7EXCvQ`7l=$HgDz@)lgmfO?0+Jcfw1B7wejyREfKDFlC)Caha+1zd2})I) zTG3!D0>w^3Sm4*+#K1+54f|Fy)gZOZ6k%Y4d3{N^3{V@qA7g%4K_QrchLoRbK(dIP z2gbtF&HoNWd&6)eJ4lra;9Q4)I_`5u25ylZC?@6~JU)n&;Bhd&b#;P!gLM-(UZ&T_ zABn?8zz`LOn=2lV@+eQxfg*{}S!c&#`2ORH5%5uxpA97pf%U9c23H+JoQ%ym%niWN zp`M))C=IB0vMjR>Fy|GnoN`!0-vBlMI7(DL8e834TjRyZmkvRe0MZ4Ky$FO`mIS1i z7o31V^9jFV1w<3>KOSBP(;ZCsOHQEhz_6mMGv6N*<}JZD#R}{mz^*pk3*9_qOoTCCU|Kzp z)t(iwPo+88Cg}eRf!dhdualSmCYovu!m32n;*ZV;MT0;}13WEzaesf`=#zUu(ILDX z5DDGB;1dIbNmd@@*Gw5_zkapb2~EEVr+qr~adIu%ZhU67O=!qY2<8r;A18YI>63ox z(7(whJgo;0AAl!Qi!lId@ief(N`^|bummKGt%;edqqZJKb+C}2ksP3}Pf-Nn)y2`{ zI53);B`=NpnoQW&7Nr1nhx59N!wSxI47XCI%A%$2he`W+Szi)qB$x`A5dqggyL59t zf&AASx_~CrIviUN`L{W`I|R9rHr*MWqP1+vYjX~`Udx2IaFy@pi@eMv-O}=i+jW7l zRqqR0dEMZ@1R_QNp4pQGNSuK>djIp1L#%9yKy@Em_f7(1gwMCPjnDSd=Wb$4er}37 zAKAEh@NDCDr51r&?eKd6-G31(uJuqD0>J0MB8o=Ca1@5;h64jvi1Cvpc8*VPDlz`B zxl=ord7Xq0=UXun1LFefsE`YW8n*7nqebc!q+$VR>6@u;yA^EGcP?xn0)|%Z4i>J! zlzd)FQK#Sd;lpp&dYGdL4gik*UatqPgV<@Ers+-vK+s9SLg3Z~M}g|cwac^*rB+!L zoSr-(rO5!A43LI+n{KBo!;i$EM6?(M)5r+f4O5`9Kr7!n>3%0;R~i zc0Hk0t{yEEogfOtN*8c@YRR?PoUqJLNNk_zGR?ulEI^nkNgzOiOHehJpI6rgK03g` zCA?@&J=eojKjNc5Yl4u)fslOZ3egIf3>`dPvg0OzZH+*&MCxXo{U zY@kLPUGXUi^FKpExp;8cf9L?Q*6c~rPeWCUaDDI3(_FyZZ-ggC&y{#nbH-8BdMeRB zg##o6DEUISik+v~6%yeLnu38Cp)?RRYytOal;*}X2T`QpEH}@jyYtSV$pU9KQWiZn zYetS%gb9RVW*nYDVU$n z*ZMZW6rK46n18kuk{c4*lE-hs|ETPZc@_?msrwqV8sNonluSo{8fGC@4h0gtSoS1} z)IflH0N!q~m3sAE%=d)0Chxb$+07_1|pQ5dyr1ga+q6P-FYb%!liR$MG z?H*4~UmF^NO!N5*+6@9}$Zsbqzcu#XW8%R8lpcVtA%dZQj4TTx4^)O8JNm5~VofzQ zgcO{q-S0nsjP!%`chNt7v3YO*^eJm_XxnV5PQ|0=Yzh|uXsv$(OjIc&E|k1qC86nq zNV=el!Kk2$aE1!)8k|9eS@W>Pde<;;s$Y)4`^S{MTEU^CTS#ZST#{C{}*?s%;C|NYxYWRL9Zm1NIktE{3)B^hOu86hNlugHpw zRMHSBTV_U9QXwNFQFdfx{VwP8`2Nlx=a0^#``q{Y{TkQv`Md_)yj@L(d=O5v=?mNh zZGd!YjTicscMxlwoL*CQD2Ua*%Sx8r=J(?C$~v0u$*m*(K@XpzV#PI-U#tS;-HaU3 z++5G!aCgo&nsiM6-f>)yPUcdU0LS>6oQWAya7C>;>J95am2wTkGg;1&IW_$l-RCd z8q_%*4Dp^BcMx!3E(t6NDc0qJ&C-S!C&ifg?~1|A%k0>k$1F5(UF3`E1Pz_cmIR5bPSv19MXP5>I~h8 zOCWehzqKT5rPtqxiCc8!E@z+qS7zdc zk@iIT!t(6)ocH&@CJZc;IAXydQO)eMm5p(o8+dWHW)Op2FiQ$e8n&}7bi_{fzN^B+`MZ|uLL0*`#QgWA zJ2wyo?n^)VOwhU00dgo#8kqU~kDk0VNpJQH%>*3e&VBC|IM7ElzD5h!F>vv(>97hP zT4;XfzQ~*<@*BCOn$Qx)p*Q7Lj;75msfEm|9mRr~@>xgCZ);Agg;2M5ET5<6uKm=k zn10h*x#VILYrKHneKI-AAO5QcoEK?FE!BCz!ZYd(ilq(Jf}{qm;T7E2;(A0p5M4!^9KQ z3!WIvUNY++UO}=gs^6&21P9{U*J3_@FbE!?G(iZOnoE&78)ZRd%J1gJ_hG&IA5Bk?gu9)pU&$;lIh+Zg?BlI_XP`) z{|#>9bAm}7-x70~esmqTCjrp0EXfZi96ZpGC^Ag6bScZut1atF#UQvdqdzw3-)(R1 z>(?@o)Lb*9qBk z)K8b7Yr8O#&*3Mn1~Dicuq_1Rle>BfIY-qI`Y;xSkh?xf^8>YoDjueeygN==0y zUJht-1i=Wo4^r}0HI+|9nt5mPU%pg%6XWy$^#mCoBA_SW(8x^lg(nrVJ$Ux-4W-Cm znoDvEizHmWY0FP^sUrKrLwGJcKfRpkR+;)xv8`5 zj(Au=L$puNmL7d3ffh8T24w&8Av=RIfM>_HM8D%22%ROVwJ@ej30vnYwXNH@;hs%? zC7cwR&0!pQ)5!KBQ9;C>L>#fpkE^+hbER`)WEI}7eEyfF>!1adnJJX(Q zsU@<3DyvgofhlIMR(^kZ9_gzW|HBxzC~4y^3IGQv|CJte6kS7`Q4Qpdn@k#XnD+^^ z7zhP!r%9)_&A5M0&FLY@9dv}+-$!|;-GAd>`TXJUppPZ$p(DD$#iRQP3Iluj=U)y{ zin149L8d0URDELU@eNvp%bpXOCqLsR+E2Y&GBH0-cVo==SF*2ed4(W4-02#-{}}F% zxFESE&Puhsz6n~89N z^|sAiV-fE7Y@!lF~(%qU|Qqo;1 zTd8WAx^(8unah`H<+|Y#U%Ep-VnO+Lg^D#4$)DPp=-9W6!50kFF`oX4Y>_=@k8NzD zyToZmC&!3=uU7TVrVKeJ1sh?Wl&nGK(h%%F5Xm5SKZUt3O(>(mp^&Dr|pxdq466oWdo4H(LJUe5-7jF z(!EnpT@V9EEcg;p*p&@*4w_k`nHXV@(i#2fnutRRoP)!0J-t0&XDOQ&(EWt($ef|{ z*M~H8q#8)}f$l^z+wamf1EJG+Pq0QkBlk9bCU#p0HcsbMO!WCVsi8{*p%T4KpxpKGjU_)BE?~$vdKb^GQxu+NvgP z+}vXlNq#@>s~uDqBqIyd$QTq57#XgZ#iN-dj4pV(cCzXnKTa(o#$_#(bt0G2la`Hz z1%zN`v3(Ms3Pa5mW~__KDk?ahWVAboFzLa&+QH#qhy@~gzz&t+lxN%%e3z_ou_^I^5sby1=bJLo+#vk^$Eayhvb*CV8I9$LRZqe`7~)sYUhkWNJwD#Bgx zTawIUqN3osgu7zq6r@d(McU%fH7Cbj%-nr5Gt4LmpdLl7#Bja2agg&;7R-{^5Dr<40!;Y$WMyg zldBho8F{h5yq3xn-mb?kUD`KdgzzE#Br*I}^t_?u6{hbqx_^ZXwLaFX_G_gs zd1j3`gouxR16f2=RP@QXHARTX@Y;zpCu)w=%(!2~YP*?g0hW1`nbv?~$%U6Riqgu; z-i=nunZ^ITB|3*2X!SKupQ4BxV<@ z{3CA3a5~My+uE$uxmHaRU+UZo6Db9ItLPG+k;UlsSBnsA2W;Sw zDFT6tj2}41M2U$aXtI{kXg#Lgx;{=ztp5zmKVaDHSi*6n3*nP@hjioFtUWzTU%qVL zUNhfkpeqysQ0+WIOyH4|yP07d9T#Un|GhU57L%{PLDUVe>XY}sELlmiBFinJGVHmQBswx4*@=cu z6q(T!RdR`X?_CD&5P^6}WPFn>5XXuXiG^B8|E0^9=W-6zO)O^fu}P)2wHZjagk7=r z`?RqqI6$#=_#asXAH8I1TSPNDD4i`)CJ+l&@gi^#U47=&)ggwGO+ykO;L#quf2QscKvlxkd<9! zvLF!f%dMY?ihn|I^pht--0RdwPLA6AJSeLF^-!CnVhsHKasO1);08E-x~Ql~_hyVA zPE%+@^*J}>HZe-b>|{Y<=x;7Grz%A4VyIV~A{4#{nw^0%*Da3~WcRt|O-n?uQeo$l z5!CUmz&?MItEDMTIsaCbf?H3LcHRC;IWaAPfV*}&!GBkxcE3eHSh@7=N(v$zHK!{J zGY|flm;kF4rZ9?%&0`B29JB2NkqDG>pp;*1xpg=rKR+L-y0B(`ntpm~7d5n<1Fp5X zS^j9L_f1bG$($D1iGW3?w4{Hqrw73ZEWTe^|C=~`T)SS3-E$Sm)D-zVG?$ zy22tWd|^7C`mwGxmq;k8MoJ0<7M#|XL+K{n z%IV~TK)Rm#t2$fIeD%#QxAKp5Q!pkG77i6z&RjIg`y3DufJM=poKioc{rvKw(0T+^ zgM$ZC`i}+g+3TfN7EyYh)w+l4tff#fo)1P(o$t5@42rVq!LVOJsJBMGsj z!F(pCMGz4N^5lgJ>~^6ipr&dXTcABi_e@*T8o2y-RUHrcYv&P7rXwz#p?t71KbYm` zr)IRdKPx94<^MQ+RHpR%t3*u;TU%Q$SHp&v&WI*<*`}Lr2O{<^So1Dy=auMVUB;+Y zS(@l-?O0>O&+Qi_s0%P4(dE|m8(Z0LrJE-#xgofSi4%M9-^fl^m)CX1hAOukq5&ue+Kr6j5)&~yiPV1Bw|Xg|O>ol9%iVn$krR?dP3DqsN=jJv z?mgnhP9A{RVz7%e7dS^>R*`Ad4V^=U?eEbnsonu@zo{dtn3aFXYOOY}CB|CAm9R?M zb)ylDw#$qbCUw=O6rM*8;PIPMgWB(-I4gxQAdcGJbFw^W>OzV%!qks434n7Z-z8zL zFP%zUY_7X{*LFPmI130klEy+ZGOnr<2k&a{gNfAxX2O(Zj$)<~S(FMGBp>7w;(}TX z2VT2Z>>JAJDC{K(YPo`#Y%u0r25oq2Tn0dleR>YWJC6VS2j*xQ?9uH zvWJFRlgX=0vWQ)x368nQ9h%qxq$|-ymXNYGT7B1X9`qP3&!r-^m+@*`soVqiN~bOg1_lP?LtA^-HGkgOx*4cAfIM=< z-|lA!U-fy1y7R=@m*9RU*?7L6$A z#5-JETu?!(X1qqy!}RpD-#Vm{G2H%U&2)BMJdeyNBaquGmu}VvgkftdB6`V2M~4Sq zpy^MH5OWIqj(?ir4{h-YNRr4V47+lz-BSggSf6W9Ugk;EYkKLLdn#{!baGoFGfBpo zW9zR}zB4B+bAlhQE^7C0j-&)CT3TE<@KRFEq#e9lJ4&be-d)vq+uxsPjwiI%{ApfZ zOLH^ABDGZ`Q1ZA)?de@=PNR@hfvsk(SGYGx#TXhG+DDj`q@+-;*L=ySHAjd@YG%DG z0xh`=W;;1dNE7flNKW5}mq-R`d@$FNY5rGmOH2Q}IJ`SzzlO?Vq^bKQF$8Od$Hs>K zr8X7!h#AafjXo;ks~*&tqrxA*7K0W@+cTtRPoA(A2YVuGmz=Onv91nZgP|pDP@?2S zBAA>Z215FVhAXk^7}6!`0T5NaeScnzIs2D<{(DTuPMT-kQV*n!jmlkVOfsSbkJ7obtM#~qIo zCP;@5QxWDD=zua-rRs_ry~9tS7sBjGAOMoEM>9)`L|U*e9cDOmFz5ynhRA#CWzuU% z{;RM@>lh*=FCWpAzJzXU(D~7w3plsifS|Sf{=nwvDc2NN=2mG7^qN3LCL|KlU%r+vII8anI$@^v?lNL{82k&W~ z(&qggJzO6Y6okumt=sFK&PS;oN6`J|sr&3_cj$2wV9leWk3EOhl#G??2m&Z z#~XNutC9?hB;fOs+zO2?;+<^fHYrRs(Le$L)gvwU;AsM2dAa!@OVg= z0)Vt15d+^)4Zf#?F%uILrh6&VR1ac#9~L2k2jkWkFYJFlhy^{|>>S@d^GFd0+DyyT zoDhfCa<8o!T>Fah@-TUMw?oLj?fA`YqNsim!{PdC!{&mQ!8Wp`l`&*5ba!*Bc@8d} z&~-CiOHz0O@W5~JN>}}oW+Ru5j*!N1dFWGbI~xXod}P$~BZZ@JYym?TT>Kjw8#o4V z{fNvUE=hup95PKT0`%8r#9^m~gkm)R=x;DGYS7=+xtEY2^XlEJd0jm{SVZ7cV7g;p zkt%ivTeu+1LUR{2hV(~Se%fGbqf@rFwkBEm88{m?bHYlmstY-5kYDO$XFo$uzO3Td zF54G*dAj=gtsNa1RpAi99zHXvp&Mi&%t&OoNW99_7_`PxP1~l{u*ofA5d46@{eqNnz>E+${qk zM{^L48NgkUroK;eRblu&x%eYA81BwSgZ}_*0gYSs(A`cun)=1sp9Cvf3}Qv4JTrG? zW5;gPkO*YCGe#d>q|rfLhgob-r^~t&X~T?rrm}~4mLVn~wZ06vg}SdE0(WEd8aV;N z{Gn{}Ogo&RC~i|(h>?0;KyY0CH;M+#Jy(iMr0&w~^%qEh-zpN~`}_4xr*NF&7XA6? zJq<@kZFk=l>0Q_F9mzI=@5g5zq#I^B9p8;3IQ#b{gp=)eJIbJp8Vmut2`$=<^-oy% zC_I>3Vd^&dUo<259`?Ji!E`bsXwZpqg6tFkFym%G`8! z|Ls<5aBp*n5m;Y$-&>nLh5PU@KXXqtGSCd6L}v*UT*72>=-i2Uqnk!QD$k&9Pr;jJwxxd)@n_s|70Xtnhbpxc}YJ4cWbPRn%+LlWg*o7 zcAswl%*M%yG5%I({d1C_qdB$Txn2|o(%SewbLHx_i&ES~_B6uVUKD@#@mrC`A(K&D zdu5!C6kJMNekdJU$2%s{STLM75~+!euXdFtJtFN*Pfltt@6B~+g>O%rT##|UZD(-M zm9KuD${Lu%TWG92JNx`$hV8G0ee9v1Mx~SsoKIIhp&TF?@S;6M*qvzzVT z(cE`hCJls3@*lJ5{s|iO>|&Nxx4{f3q&Tl>41V!JmeK({xTP=%d^FCkiq5%Ye^~1{ z^k_{T$Bs4dA|0=3M*GnFS3{F*95;B#rZu7UINoVIaClh}V`r$E8*NLY$Y06xvvSdlKdC93Y>HRA`n+=|DEhhci6jBRM16i(L)DaJXTky)p%ouh1y^9$Gi&r?UY;B)bRHQZYBd`)s zrbudRue`nA5hq^Rdptu94|Um0?ts08-)-NPfWMuXxOax_t^whJ_lw4XPnHS#le#73 zua>z#+Rd%s-oC!oIUyyJ*XTXo-(@N=LV*=&>J`AUOHiAX!h4abv}WU%`=qorC5km$;kJdZPzYOGLnSqF23+X zth0Cfzl|3!OB~(y5S)vc3Q{QA-_0KsYLTM%SWjO+ZPM^w{Rof+W;w(JT;8Gw4v-{~ z89Lz#HZSUfKJUWI;^)sP%l82hp?m@nd_TXUxJX3Oy?g3Y+`b`FkHHP{sN;mEHLk(a zr%%H$bCUa1^2@(tBeaPzL%&kSUR-fhY_?AskN>qH2#b_w!;KBp`eVky-Rs{ROS~0o zL;API>hIn76K)W9T*#7{c2>!5_2>1$T;^D%Z?55DwH>o%E?-FqM@<8p{$A$px$~e^ z^n%1Yl?QkCzL-;?Is)+c@Ug?HIV*fA;S!79VBoKVam6bGJU5CJ5D)tc^O!Rj>?aur zF_M#ZJvf_E<48Spm6})jskvHOX({GQBnr*uTI2`=bZ`jv4@EGg^t@zbT>rXS7uU;@ zH(EKGjcw$t-aNb%%`Y5fqstr)t?ewMQk(m&4igfJvy!5mM}v#kWgP!VpR9eA_oBhJ zbN|us@ZP}PD?YhuZYC?K`-*C9SVd$qFQwPU{jt*|)BIY{Ml+pqe2V>K@A!?2X_Ovi zEVUO4T!+?2ABvUO{g_5b^FDzzm|yxeo-OZ4<8HeBL+jbD;YQHgA>Lk zCam1tJlKhHOfYGP%85*pT!kt5z}j*$8~h-2qY=*t+;MH8!vWG%%LTi zJ5Oz?t~Tzk@1h>9kWTeau&ul}_-~f3-kh{_is^3l=Z-^BcPvIo~z>4GaFnL1inSYQ&tz)V)M zFg$6T87iYJ9_8csD&8(zaK9=_KlBu4l5dY}G+OVVDMdHim zXENCxwz*5jcK475oI1ZjY#k8Q$eiKK@xs}&a#k`0o^5kfm7nY!f@x1r+8I-RJ?os@r9=De z#rv2(arRE1oORO)uHeoy&dEb}H!izfk$wv*N*M+2?SBoY>H!AkbemcOApYYo9X-D9dhf$?uhU_uv(wxCnheXK7&n^7K+p+VZ zyt7|;Zm4JMck`OoSA#YI#hU7`zV15f5}wc7w9j8(?J;Yt;PXGE%;2QEQA;%B=&*He zOjG_=-f*<%0f`S?@?qG4bo{PsOw(@dtV)$>& z7%n5u%gYP@KKDbSj2;S-jf8}!n#O%~1G_}XT1T99s2}ISV-^UR07nLJpF58JeR-?- zss6U@_ts+W3bygW*ZIQ-Uxpos%59UTl@3>M>DGKtxuHcS_q32QeZ3SA5!g52n{P9-#*q z0_b}_PUP&qew<~vK2y+i@xa2&>8We`#IIc8OL7^@ze81Z+Trjnf;!<;?WKPQx}1dE z1O>ydR<@pJ6B`GsPibM6pHi)65n#DKP&!uG(p%%DMI@ zZtKdPOKugDjS-5kFI=50@{euCczCLLzg55rfFd0&v)X-aAP zdIxI_{T~-#_Cw+Uo2-m8Q|!0$wmk}dr_07nh?1Q6GWA>KLXRXt-N5jc>}?NI)|OpI za|%mJ6tYaBO~gVHUvBMJ8*#IRX&1`4t!en$;FdNuHEla*STQ(@b{aT$>AC0tp2~x{ z?lBL`LO5r^cXx-=f--T!;LVe7p1u|JwmbCu-(jS+ z>kWO2)=fi~OBKFSXi`K!V+!!!*ZuIp^RV>GoAUld({BokBQ9zP&Sn4Pv^jp$ ziFUKqUx|ot+<>cS^1nUDrx#kL1?yO85CYSD7gA}=-OMPJn;25b02zuFc8}Ig^&Byj9Ts$ zytnvA8+{Z~59lc*4-^y>7>ULF^<6@<1SFK_U+O|dBG3o2!SuntS>QKXb|9(~2+>DD zuh5wO+-%5R_Ht9=*~CC8<*rGug?-7waR5)n*9*6&8yY`#bAkg<)8aFncb*+9z!nnyD#cT(bJjuR8W^P2ko`w#P< zj`sFw+pRqz7Lsq&NjXr&q6K-|gT(T!skiFRdGI`yo)nE!Jp%!bi1@e$x+WwF3ZJX){hR=fBgP8&4ITjD6VFlzxM|5 zjbJu}r}4d}(6)u!&TcZY9Xg0rZNRRgfB6Oz?6cI&Bz(S!*4$`S0awZ;Xc{sP&$jD9ej)D-D zi96kvC2nbV0S|JMGERZO(87h*qHzofp69Ub;_L=O_1}mEO~v zuj~fN2sIMH*PZB3xR!HuO8@C0r z5D~;QPX7D!ohZnFeJd|XmX}n?(Qbk%PwGLSf?CVc=Yx3_8&1BUZ&rg{JnvC@r6t~~ zDQ1^!QjlDoy?2;~!zzPo zy}0%3?@iFhz6=g-ZmxW%rJ@RA^z_?B4StlMAhcni!XLa;{^r@UXJ~DrWroh000Tac z?kW)+s6`Wr36fOT?d*8j&o@cK<9Vbm7!Gv>LMOP1<+{D1uXS!dQw6Pg1I z;uf^9ahrto9S5u8d!Odzgf zcr3u6E5HC-Pa`9vbLWaZ7e-sfE9}QVBCwZN?b=%m z39_?!p-D_`1t@}*KZdUz=}NBumVSZlgc)Kioz;47%}VE=(b3@y_CHUaf4w~2$GNfrs%15St>ev5bdy^B?vt3THs4$n+kXTT6Tzk@Y?MU3cKkGn21i#}whn}SW z&Fp+LpWt?wPfjsiJ4$z~fip9DgXF)bbDG;ayW5#PUF}YW?E5E?fxBrz!G8yB<%~NE z6O-w!@x<=e7r7Ge*!=0Z{cMon7aO|0<@qzy$PeueC@0Q{3g07O;`;&OE5*#EB^d7H zciH0jMA>=d$a{kiWhZvXN~caSFfxKvZQ&n=q1nrq$4{K-=;(;qTT!&I0i z7WIJ^hFjTYOtj0<;hN-SQoKZ|8K++C&|iFW>TADKHOzHX zSBC?;|8hM4AwKoyE#UB%vSZa>_LZMoZMExjFd*V*ti2WwMPh6W<4GBMgLaA!S9Z&o zgR^?4)gwUXMJ8B2JB{;e(MS22Bf)YV8?BS`e8;+ZnZufhU@B3ml)10eYCg#G*W+ZJ znYmvNOG;K+gfkD{_@QHMZGG+9Gvsh4F>(_%Kl$OHvV7vf^`+0fU9FzRkEB24zPm_n z=iQ_zW9MzynlVAZh4=iq{;Qt)PzdT36pVSu^<(QQVu;ML&Ame;oovD`IKVSqL1*xh z2^_06@&pO$?(Xgv?!OY^(zOpD@%bj`p<|h8aP&8Sp2wa%iv4a~OS2%JrYtFOeA6AR zKX`{kk&K`t+J7Q8&8KwfZI2lmwGgn=%JW#itaY*B>Z;;p^3r=x5^*|qn5)TlV*AFa zq=cKo{#LZ~$4S(lZGRg6N<r;xYTRA?z&bIlZy8fAe=*{f&IkVP~9O9|sCWoK!mv=t* zyzcoq$nH+030VkffYOxKQze+6`<>z=-0o#NL^Oxrf+=3aA&cj zCR1u)v86e5<*|y=C2s(5^M>ZwYmN4Edn+@K_hi^eu!j6yS%CcprF1^tfSWah#;C_Ad{rO6h{_;)bat zXT2O1miW{sK@T{>2k#pQl`=K>PS?sBIdqqh5Jt7f(;po<-S@@g`)!YQxt<_ax+3E@ zc<;Zex=i@|m&hD?nz(Xxg}1fOc&@u0w@&(#;N8Xc)Z2M1|8xjHfj}d;bz$U{W)vqE zmszp>d0^EQ~Jc$kKo`XbA&xJsRm4m$MOwnN6s!q(r=hm71@IX&ZvAAdE4|lpLYzTh4xjcsxjm_4Y)VBP2nlEqv!ZWi&K2IKTEq#%QTk z9e5ITbr4%q642B|XPj{+iv38hJsc=@&hCwd!(6ctBwjALmVqN4eLRbk7`4KZHzTOQ zhsmx)zV=C0Wa)uNZI$NrDF#3FC8`9N_6RbxbQ`Ks-)Zz-nf-erecL$7quk>H0YvF=}ns%wF-X8LS0t42aN;KEzAGL-h< z0kv@vThW2nnU5;zu(Wp!^1HN*a0>p`5UoIAG5X42cRO$DJ@+s>Qp5m z$jZy3gdq?>S+uCG1yHD3pRE{a!}NLL+4Fpm#PI=BUtdx_ZDBk%Vk&G(OK={IDYE*$ zOF3vwms~Cvxj?T>%Wkaw83(k%M+2^)HH(TxGh0$S)QqzUW0RIE&<+J{!MMKHmNaKF^icv57!XU>CiNf-{N?`}76 z`82`{F-`J2RJ>6<&3E~a4cE(E|5~~6rxo@r$<-TIF%i_%tb189q-VNB!u48#NSJv( zY-_!Gd%Z(>E-EszwX;*$ef-WNiFd1(ATy@5zr)|nmb(c&*6&z>%mIG#*S?!x6@xK6 z=tI!j2px;zJYQf=6!{)Y&ii*>E^)`pfC|~We=L)tMsj^*@-{4Wz>f+^6gg-{+TNnZ`sC*FWB& zegFPFP_ocMOv#{of6P8*;utD<-GmmmPL&n%;5tymu}Fyt#NSTVbaMX5EK{p}aqdoJ z*Bz(Y7kb>JpE&XicnRhPw>THIjV{`rn@4A$Pra&s_v8sYA0$i)vhwpCd-5+qLhx&L_TBQg>pK!YaLrw4`?jOQ!qtqJI6_1KD!~zzM zfKA8+~|?iYXU)% zmi!PdU0`txj>VXZ`lu9qzUJ7yX!U>h3%m-*4kTGIt%NAVN`OL~6LR#-PDGJG^C{V1 zQdD$$Cz|n-WNYKZVOjQe1YZLN!-QilA9?WcE^myo%;CJlV%lh`w>8qz zs)s(LdVN+I@8U=EUA4_$h6F!|J4|nWIm@)?acQY10$(f(R|}iCyr&DBc2=nitx`k7 zhLYPP;$@!Y<-ydxWXS6}_OlkP$`98^5PIO)UPSz;7cOAh~qoPd9-S(&Sd+eI~BXMlou3qd*V|TVnh``CC--3egbNOncDG=IF!(Ht|F$CtClE#rUavhN;P z?YY@^!Nt#*!|;`UrQDAmR^~@D$G;726|Za%)k~K2&p0c#SufVq;MU~Z3V!$$7r6s< z2_so$Dcwyf=eNS+@jqd)ScMa-Vz~H3ZjO-%?5tD=&=uHgY^p)Ea}y1tihzECI7ZE7G)SGNM$+Eg+^=<9 zb?rw2vYz4FkB=F>*>h=Pake$-V4%mNS{gR4lVLj$1aPn3A@Y6Q_zf&q*GzsG$zw~t zd&i|ZJvBu_aP#mOQ{0-br~U5Iv~PY5C*_V*yMkIO0sB`#Kmbid(zLxA31!S%WbeNE z%FjZek^OpTe%=}6U_1<%kN~98bx_tfIhI_;?rhk3Jn4P`8AUX`uhu{3ofh^by+(b+ z+pI8P(D7A%zK|+x8yIKUqG>~{Vn38jPxj7-4(-;8MI-4CDvMh+)|qo4<<&exC-eV?qSRRci8*l2zP$H$wit<0r} z(LmeRG*fM3UJL0f@@XU0<}F7G7NGxK!>JN6wu)`HgQtZOK%>Rz9uAhU@2mR0IX_Yl zVwdwa5pAmC!~ak+NPUvg^i2yknYW8Upc%e9;rZ;l_1W(mKVd?q#d6fiNy5kX z*QdvGm5V17Wy)};1m12|o#yu3C!V53b6jyu_el&|8)@yxLv?m8sIIO?R~hY$?CcRB zBQ+QXgxigy$x&5RB{@uFS0Y>Mw9(piCnV*^&-OHl>Wv$tBXT{ai>qU?V~W0mH+$&G z2r*-zX?<+$#bvqCLeGJF9y@#wC(>duCVP`Z{Ep?Y1P=h=ZW>O%{#?UMIDR;9L2YhU zc0*8#D#?_T6KPLSM1qwNGX^>u&NClGl*WvG`SJyDMs<0D(eN-)PriAm0q4mAtR=p= zahLY{aa4#Kh9k+v2I^J_2Xixh*`4)< zN~Kn`E_ux1Wv7o8y6g@mvGZQ9RJQXDjqRWLYAcKO50$(8dtz_|k>L8*%jE4>+yG$O z^!B33^&Z#G3AgjAH-Dc2O4y+uP=mDv?`DkFf*hlDEfX*$9Tg@rJ{*6(LCI<}BqmhB z?eNCqS?xCyn$jMM03BGAKC^~abhqbv_Jzv3ael*;lUhp5K;Itk%&BtWXpJ#_C#lRC za0Kx1m?+fTCXH^~c-=Hc@x7FtjV;?q1pnu44_l4tr+z=>ZN zaZ&`Mt^)@GX(=fwwPG*7^HCarRW6hzc$f2Vo>}U!7F;HIfB(1;qka6ej4yCBM6y^S z09GhgX1={GD4xW81hz?J1Wq;IjbIitv>0HKAe0bpRJzBdIa~NAZQ%j9(#vzU?ots(k^>}n zsKx?#bWp~cnx^Y4X;o+W{S!D11?j!S#4kO_2L{=g7b+^ttwM@Ky&Vsb@JA&j9=5jR zI|rM@rE+KnVf&F9hbW*A|M3YiMMu;a98)mnb0Jzf*;CMGMND8SXrdQAuCLEOx`rBN z=e7zOdJ3_M(1xa_M2d83lp-VAV>o)(UftQGRCQD21jXGEcLtr_=3y=;b90_v&y*Kl z+nXzQ7TXoLZ!dM>tOqKo7#J`m)qqY^jJXx}AML(FvXYX7eOe=&Hvk3`?%vh7w-3eY z^k7BLwhq*2Rca3b7OOXBoOo3qyV(4hP}{yWSbh`e!~4hGV?cz(bPufejC~MiHN=-* zc9c>POji(0<%7@(p;1=P!|5>4{EvQ~h?*VwQRb3N%iQ@rV;QRr!CVBRQ>UbPWhe+3 zHj=N&?c_1tW3rq_g%mb}uqo6*^&31?^+@7_Us&Y(;oRrDW19kNm9`g{Bd=ny0vy1A z8$yqXjt8B98pFfGsWLX=71Pptfaf64tHuDPoj9tmc@5idy zh<#I3l&~5`M~X^EBW10t*7^@n!T|0LoLn7av1&Bbb$&*4dR!GxYkf|R8I?N=Q&X5; zqE~%1Lk(I&K(PX$=Gt3L7bTGcAQI<%VTu+poj-3s;=Ve_Qn@fU1$sCrfdgR;C*#`q zfTv&@N#G$r1#~ohNRy%HO`osG_=_lx2|aDduOPKyUz0LhA`l8RaeZZ37FIlW^$(l!4bMs8z@W*7e5IY!?WQ;w^@PBxTW z)8u8X*iolCHj?Z@?WNKyxmQ0fjIBsJQP6q&aUh9+Vd6`iJ_#Z2W0S;%rDA?5s>S45 z3SO$EV?wdDDc+w$!zqUTom8T@hPJX6R4)h|?V$@9X`cz=@0`L~{!IFNQ za=+aE*^9kI;P3xr?_hablSB3%6%+FW{k|Om--&N`(eTC0*^gWekRO$K(~VV&$tFf^ z>5LNFfiDbECFWj{M!{ygE4L#pdR0~iNcKkX1Qn^8J6P2$@ZFun@eNfsxF-PpW)GS9q;5wl1;0;YlQ5(xoA|PX9eDD-s+ZX8u14sc5 z9Xh1?Z!!mWB13(T>*D=j)262y|20%h8KvQSNI;uG;f2uvC^@`L*DQ zO>^NT^a$)DRJFoZ%MDE~8>r|n6k6_Dh%yoh;vh2I@EbFJWp;aZKxt3#4fMD$NW|pE zsd{r60C~q)iZF}{@1U62M*sJ%r1bQS4+mb=wDy&Ta#~t$X)iU<$|q2B$eW^Lwo?X{ z-<)!v9atN1?cCKL7<9MG{9PE4eXo+@tb~QBPJh~)D&Z^Ma2G@P%$I9{`vzsgXP;Aep1gFrB1!Z#6+_1Cqg7oFfC z_ytR!p46DR!w^rQ(fd%65tM}cpzVmBR?l|TilzGBS`V19s1Kpe^!@h>h4GF7ORtpF z#>yWB?ZCd1BWYTswJ*NXG4pFET2*Gd$~;KY$h}G4q(UyO{HU5=<701N3HwjCk;eZ= z)O&z)*|-1Wml2ArBr7{fwr(U_p+Z8X?5HFml0CD^N-9(o5)HdTHf5w?q?DZz5|TZC zudC<(J^mfv<2j!1{oJL`=Xzi7^E_Ycv@n3nE+R7~pzbT%LDm1$0a_Ow)6C3zwRACfwhpv_R0^fvhRbnN zXtj02r%w-N1hgKCxB?L7b}nQ25%SZBl_sceEI-6eT#hEZc9*22lY>Kz^mAPH8aGaU zH-Z%btsd?$Od*;UTrW?lC@bHGEF5N+rk*)nDtdEFf7a}1pfA93{@$Pecr2%r%dU;7 zI=F(LwQq9IfKhGb#9=}mD0!avXCNt)PVZIst_g^WijItpZAzw9npgm8hWKOPfKy}7 zajpnumxJ8#T$syW(->xUs zdet-kgT1usUY1)(eyyq^p3BaxOFj3eH#R6)-(*%y{s?2<2o)@XDDU}`cETGQ5<3|PW}_|4>e`$?|Lcvm$dV~C zmF`@RceF`0KDC}YEKCGu)x@4umXsp`YZ9xbx7NH@Ke~s9iob(b-mzl}u=F3y;1T+VRC@S!q`b)5HdrIHcSDS=FIruCyOjt;H-Ma?W2uIp+uK!8 zhpH`ivq$EZ&wZ!m^UXsWkMVf_&r5uexl0sv6@X5o-zEuL-~iBd74OTe|E@0pRiLDP z<>tN~dx{2{c>L$AogKsG&B>~MuXA%JQG;ik{Q5~?+sWVX#oN1fRPYtYP8&{ zRNz%{IgmI3PRXlRud>aG$SI`y?&naq2FO8ZnRv&4{|@anaB#?aCBNqu4dK!swCtiC z2Xhp#_L1R0uH2TCmcfI1dgd?ek6K#tM*XM>W5$mv2k$nM+`|+2_Vn$9gxXfl?Bm!W zsMyju%2|7%nkUox?Z6*p5WZ+Tu?1_T$!g6NmjM-lh5|33+VZ&E?L)J;fk89u>S!Xn z2of0StG)_I1y}hdnbvT?P(M5JZ84-`h#empS@>nO&b5@e)kQhJ(Y(N}(Py%p*5U@x z2xQmdXM~J?!sUuJR@f>`c3rdWC$#u*f?)~c1Jr{gF2Gfl!1XB1EG~Axp2Z&xgcE@* z%D|x2))zm4wy+lCYeB!TNb>*qmQ{Sd^t*(J{>)tUEQzY#5HC!f`ZfXXf%em^<9(=|H0%!l{=|IjX4Nq<`s6uqNhY8vH#Cxh|lo3$wG%o0ej}j+3k(gIsj*1 zBuAn*=6^QmD*lGh*iy(4v7_bi; zULjnU2;P;yxB7OQ71+ELz(D(a7hFcPQo7!NBwr>ujO^o;^F2Nolb zjQ-8d&G-`9+u>`s7K^gXg$u!NB-(o*q5Vqlt)=nKp{Z!7qB=+i*woKYg+cjWV8|vw z;y(Gdj0CY|$86j1K8K%%$r;&gkMnGdZ;yw$GeJ$yx{0TaKBk0%pi`=7*I};dgReAj ztR9~$zJsdlirVaFV*o_-mkUCj&2bZ11gy^Ddv!)Jv9jvL&G*3iiix_L=*;`8C&`v_ zvOF|Tj7rmY+rq8vrIY%BAyz@^1cAMLaiV^7=^X zvPSMeX!+yXPTy0{eE#Ac$49`E&atW_p<_5e-xv7m-R1#_bfS(9!woBE4Tj{JoBN5K(Wo908?ZUgr4+|KG-} z;XlAfOpYJVu`Kt7q)9V%3aEVYJDrfU5pZQDkPsX_3OWzrs(iyer=y_=7hF+q@cW2G zIp}Ln7T6s;dsgK07Z|l%OUlq?c1?}*)a_e=rylb-hro^?PFvJC{Hp*LP%*pEQvq8e z2y_pA!%64XepRmRR#RI?dv-)+)+CR7?hCjHya8lEzYh6{|N3%o_+ka#JG`s`s%r}a zfN!_%J`P2Uohx}=VlK@=W-CElPXj-UP!H*JFR(#|^vkGFU6lc9M<22NyDN7bz5}Kk zpS8zxAljqH>!*cB_mG+hemdX?G6ff_TQKv@Pxc(z(BhQ;{kX62 zXn(Zup0#{htZh-Y1c8nb_)LPuE9>fD)KA0&Ncip%0F;_7q!TkZH1zvh;m`C~RWVUf zg6P7vg?j^k!IKrfUPxE~9LYUCgbw;trT?nFLiY=3n85Jt&MlLDKi>_!2?XWpNO~-O zN{>tJW+++WIgt0kE@_VWfe2UuoC7`4)2G+5SK0mrSq6ZCK`a0u`~&z6-X*d+fZicL zmu%8F6C^mOKz-e7L4Bak7P=?>i%96}I zxA-6o6<)8SGfzF*e1u}*;6t0Hd5#IJRmxts;hE7k=`=&U3m8LMTA+OG?(NNOu}6YH z#6!)I=ZuKJI-L(^ZK$RVC^&fNOvFCG+D?m${3i5B3}Ni}M5d=s-Gvx0Iawl37kN^e znv}R59vflpf@UhL-a#9m(go`Z-vs0q-fST(KtaF`2;)3xe4@{_1b4CYws^Zcu2%1I z1Ma>0E%`@ElL>2jNW{Fh_cs7Mv4p0p<%StX$ZHq<8`8KRNm%v>oqO_Rdv^->ca zSIZ(#2nG@r6UOTIftpPb6EzW*{lS`+3g>o#w!l>$POP3D3+p7m=y{hJ^5$ofJgw;RmcCsmh!`%B>Rsm;dOP zq-b+<%p^p=tlH`T_Jr2QH`@?|j3eUuyZqm&$w4W~M#se41VPtHM5v zS+&HbmL{N4?y~Y+MEyW&3#$xk#M>WTlAK&2wmPD2K_D}X#;wGm{VC8he5xGNd_hzm3xj!E^xUTwq>vfVqpP7&y|VZh zDzpAkgZqkjoCsv=&)?Rw^y{dnXlIGrPo$L~)oYu$DUNf+;xIS%s2&GOjmzysjyYVV z06W4WrKhS;v{unf!BvERB2pgWSJ_ufH+p#6LL+bREtX`-upaY0x_=(}R7r~q3PMp1 zRsmrR=~un_YX5a9U5A6avjk?m*$j)H@gd!Tf~d~%2kV>k9_VBJ+qcjtX>1N@u@{$+ zzzS*L>b4SjyRKGa2p5AuVr&fU8s_kmCr=8<{n#7_s-qWro{1gOJXTXb@^wHj&m|~F zG>hn3yaNPgeD8OF<`0_XNGbe4^N=3B|2lj^s7@dd%ESbsd_+<~7+L@PgkYSgjLfA+ zZ@H;~@uGvXlY(;e^yxIdtpX9&)gWrhyeZbG|tm=<0TW zdxD7|^>!=zh09sllj6qc)Js8If`SGY z^UAq51=s(L8-0gEwZa*@K|j;8i$j)(j9{2DAH!U1Dh>gd3lh5TIdd_DkrC~~?~|mX zq<5W*wN3r!W`}^SoF!2>is2H8*LeNy|NF(txu$Y)_#P&!qHm5eGBQx*^}aaYhDh9V zAMbl1Ha>Zu2j=F2Z{uV$aFt0l5!5l{RCB*Op^xp)SR2iJ@Z!|PQ>VV;jCnz^!r@#$ zPp^ugcM7T{1ammEtTSub?caH#TGfr7Q&~+Jg5dNPg7gk**3E*@4Aty+-W3+#{OjmL z0oH3SJh@p}1flNS)tr|WoWuc~%+Ig<__GaUIRjOM={KPXDQ=Y;cvS57oWkV-g5|ys z%G(*dtGsDSA=e@z=<*}(q<%$SO~>dy3Rh`XZhu z!l|v#ipMvaSXgZS8bd*#+uggDvwQ?=1f)3{90!p$C?Nq4*|M2v2p|3to(VMU+qNCK zyXQQR3AAjgyuVx&!Fwfrwe-0-P!~-E0&Y*#sz}CzB1m?pMMq?1;oHWV$lsU5)g^H zTuklVgtieiu*YZex7kf7q-G427yQKuYq*O+s45*pQ!R`rfq?^4UwSKiiZJsP%Ut@g z|JweWB=j(65o)S zdMbP3C`J7x=Xxw0#Gmr2PbQQKiJ@>kfH14EP<^0=Z6Q`-h>%rE?r}D;i|w!RRfb{2 zTG|QdG8HZ3`}=$Uf)4iRc2B5x=vnIYnAG)A#dd~@D@Rfdks8}JS~hgYOwznq8bbgm z@$?qmVL`#G2{n35k_pe!(`)PL4P4W$PhIJtCWu(BFV1J2)w%UIh01EPYcof%)Lf{N zMTQ)*ISKm<7qni}zTwajj6>^>{|7Thd*{=;MVk<<%ovWc$RN0DATY+F!gq0L_7~XK zMU0x0T_tU{+y7k!eo~20^oU7GK@PxZ={2&o|F?Rtl;S})Ew;BDMwIdx09-|o7((!vJf@O$!!_lX7sEbqvG#cMnPTVK%jz>Q41R2CCMCA zF)`N%NukmRG~BUc!$)@j3lCp4_G$|J`)bq|D3I619=TI5@dg5ubYvd>{DVm(^#=}i zlAb(3lSiKF3lRtc^j(xSZv&PQFQTt`J)C(s`%6G&$I9ByvB{-uufYbE;!6-+0`3MX zLP?~hryo9a$a)cA&A{&tG~ZYThecUq`uOQs0grJ}=gv&?u=leYckYO=UIWswUVH*E z1_*jwz4BoozlW;?T2drShV%KOZs1i{;r)?~qnN{lj)|I*;_@X3{$cd^m0mEp&6h(U z*T~LpQ1m`y5S`6ZYj^dF*DkLVPEAvjQ+%)A*Y#3|&)+%ODGw#`Z;PbMu0<`E1g&85caEvOl^!P!>)%r~jhrSy`OW+CKI zMShx7opclf!*z9PRh;;5uiY>7y^vG9GT9@+dQDJJ5W_CwjY&G4G29Jp!>r$Da@IoY z&@*4SAnUuKn^}RC^u^#w1+{(bQ^Y-lH#WQ$DiS6QW`GLtuwyYnSk_z}s*6)`KTYqa zAHB3YMMr>EA*UGJ{~p?Y*An1L_>3-3!_;S@yPc$V?RxU;+0}e=>o;DE;RDVk%tE@M z85NI8Uw{0*&Wcry$+#8)1gc@73BFp6*JT*3SAn3I0qed9jn(wvL1(SaSF1ZvZ-BC* zmCT3ipx1x-!@X#=P|Zb@CKAlsK+pahumOxNDy&;QpQ&dU^#T|`U4p(Y16PVA#H0W2 zU6Q*7C_+kqD@wmCo8IJ&##_B_vdj&z4;quqBAW8qqTZg_YA8OiJg>~_?{QFEa5a5M zlu3_$S79|}Lp{bT&7jrD&k`Z<Hb*ce%1lH-$^F&l-K6*3=ToUS8sa1&xJ}?^rfO1e21rnMt zYLbf}u~_uju>;y6^L0QwSP%7Y3Ev*fj~K&)e?R5d;j8$PW3l|Tat&F5z%RyOh(aHT zBo|(x3-Mi7@VOz_%G${Jz2o;BPC6=h@nM|7O$RPt-sA1aqMFuX56aK_6)Q^fty`bx z|3-2cJ3FxM?$LB1>aOlZ!D*R5I_=*Xnf#<88agP`oku4|p7vzdTrW+a?A`o_& z9Xofze=V|eXK9hT=A9YUJ1Zw*wXKH$*Yuhd&_)!k&2{c0)Dc{w#iX)d{^i*ZcL5~D z>7qEz{4VNkwSNK5vIIKL`iwB;`7XES-&JTp#j743BLY!E?ESA#Z371GJKeYwm&qfe zQ4Cj0WN$PLVL8t6ePu5rer9FR5Zv;P1OZkBpK%$yzy*7IEKdZIISE3VPV21K^H`4U zORXx_9PC@RAlN>7z!TY{P*`SN`%fHyN=8d% zKsuL~ufd*13oVK++_)|?b$}-mAVsAxq*PKX|F4W?wl_vJ$ zl+;o*S8agAd{X}V9`8Q{G9*w4lCfszW#~+>1Pj677#pz><^ld9R%_D-8YRX98HGySmG?V5ww!nG-gADU09(=wBnU-8oGn}o zqUA;PgS;N}fC~>0x9B>+hlZkTSau3QDmObg`ICibVMv7eO!m9Bkx^^DZT;C#*j88A z*4hf;&Bi8ukv9BLK3-nzid%zEV(z2QKz1;eUl+RwKsSHz;35VrYDx`UK*x`hwlaO* zQcUuAJ(=qNU?86NjHe(VocOQA{Nvd|)ZZz*6H9{7FrCATvV)l}EiFwqycn1+{>$Ru zpM|E+ak?)~ef4v!vXjL?pL(jtsc0K|=_}IMl<*)W1)*(Pk8cEzuKA;J&M@M<8I<`i zbsdXzA6EdS$F+RX!C|_{Q0q(-LsZYHInlAr3SER0e3{pFrl9==Ek{@vb$)Z4!$EGK z6YKHDI(zsT5E6)E?E?9kz^W$Qn}-X~-W6T!oa0SJE zKcK(G#*u$P(6p~#VwnlJ@?1o5U``#RA}@lkxOgBMgz^}FE59OhE!*kg2-8fuIXS{>7Oqr!)x=; zw~44ekc!iVEu+a!)+cf>+aUIEcds*t3p#;MNphLx<=bneTXUvRKOr7NM?}t#7-ml{ zf~rJ07H8kBs=9{bOc2-sj!FTL1RC^i6k4c!h^fV&4{}ZOe_(pNb0}kCC@&Oe42hL@ z?p&GbtH$SkHua~TuO1$uk}go&Xcpbj4S>|Vr7Ju*_$WW0r55YJUIRgVTVIdtvH8wv zR66LLC)Jv(ACu3yWTXUDd&*h(qJu};yt#j<0HLPnG0@*o0rm-M#lf? zSvV7#EGqrWbq<6!4S`b(2cBJ9Qy04%{B;rCf5ig9&>7dt&19mR>NAy-_bQDOUQ-$2LxAMQI6 z|IhuZHr;^O2$W&>%a_g3mSd>FC9sSWZSw&&1wuaX&`Y@cn>jZVd61Yvw)q;k-Q#;s zq!cH~`O50jERLU@zWxX3#(|)1hG?s1F=iz@^gnQz4=0cfTTHU6yCL}Zz zwC+o&q)^Goo(yQb%_2$^e(pEKaw9l-u!(P}d2|Lj;92)QO3c9|RnG=8P~t|2i<9x1 zw!5~Uvb-BHb-1pv$^veQ%2bJ97OvRryO zx{K5t;z}jyHjOs-)=z%mtN?6{;omVmb_|H_C#~5r2-9URet&^uhG#PiON5ZyDyb?k z&NRr*%JPKkqG1|5(G0vMy_Eq07;Au8lFbdD5v%i7yr5uzdU?@Bk@6==i(rR9d_C*v z5C&cGSi}2~mQ(1HyT!|KF{gBb)a`)N#ZEOm(Iq?(4_LqPd$CJ{q^AA-Re7Go@Tp10 zH})Mwz5q~Fd=1^)^Bvzv`vpjR!(prn|JvR@Td~kHHdFlh>gvT+ZNO*fdWG2|XT4Pz zyp1g_E6|O>{gVoI7v~a0ez4RVJS|dI2uDxulP8OPSD7AOJAk96%r%$mu;tyV) z`HGKPOYT%#dFr{jxHi$#_di4|?x5=;*=6X4s?S6=4WR>i?K-qcZ#Voe0Czl*&3N0@t5Kb1>JEfkaY zMvotZ^ZD~Zi;ZXvF%Oz=*g%*=g$QciMQzg|$Tw&={3=pCZ6~l)JLHPjl5E)lj3R`1 z^~)qx5B3>INHw`hl;N5apjNnvMW zi!xC7`lXYb&l-koE-)2WOhJEy*Iy2) z%lr|+!MOIYSL|R?xx2iC#BcDtp`l92G1}>~DTlnCwJjShf0T|{*W%RjU+Aa3wqJ9C zR4ib859-A3p|_`@jk&`gK@txb#3pF{u_qQgxmFxHUc2vBZZ=!Q{Nar&CqA4UnlWBT zJ%0e*w@#>p*{d#iM(h@E?K19T@`jF~Chk6e1UHV)`r71r*=&nh6Qbb>Fv(0!0D(64 z(ot)y3`qq9c}!y>1VixgbUsw4ZKH#KJaK~g&&+-KrhiXf;?#=>Wm|~DZ++ti&VNKt zZ^kp3c7NZea_HKiA85RG2D5F}M==(m5R7G&p*R|V2*F@11Vz8xcjwsJ@1#0~RS8{} zDOg4-poM_cagE(>VQ;G1dceE#^~|o$A)YDO$5^B+ggEmy-3EEr&naD|UYAb}ES}R| z*`M<7jhnG<{&fQnxlmVlY-9xO9i~>7VCuc@V{FJ{_CQu(v^Lgep{4sze6)0}Aysnu z#q>zQyYwa=_TQrSC9Ox*nk9fl$COiRs9W8(G4v!(n|}Y342d7sO#%AlC4a4fVu7ld zP{;Nz4Q9YEDr51N{@~pv2>&2YalAl?uKMaos6%^?eaIJSD2N_0^(IBx%i^5t|BDRU z7Pg@1yD)`rVO%2gV-%+xMi4|ZmOzKF&^EK1f#^d4!7UEWAqxu&zUjc@0z}|wTjsLs zj_?gXnChPy=BZzcj!u@gq1=-W;SeyQjSi)reArQg-MrsloVOdd2<8W}1E-H6?*4tR z4f2H8HsKveWyyJa8cQpL{iLtny}`q=tm^K3G*kcHS$Q(K8-;~55kd+zkLp92B5ta} z+tb_}Xk!W@Bz9A6Xy-3kHX6N694Tt^5YNlo#^Aiw!NH+n=MH6MWtfzYn?irK=bn<+wD5yZ4`gh^iVS9b zfT1M42gx{$T8YaFk~**;Xq!-ka0$WTG|uv?&h{K`?*=*T{rlC=)swW~`o_!j6Be|d zC7)F_dx%>5XZyqz+5uuQ?&Ae-U-+$WcdhLa5Y?zMeXo}Fhw{5t6E+Y~;LKbyE;*3} zkCU@l-`qP>G+IGav~s$hq;u2D8zM8vzz@}?BKV=wxv6wg6 zoJ$6gajWY2!p_7vm1TZAn{Oau-A@! zC(h>=C0ss%|0|84sE-KaeZbEVuTu3yNan}x99}iD@C5dohC4bslCn_TOq({%~S}M;;G6L`+b zO8o~6bZPEDZ6kO8sPUV59c}^>R)gn-hhNjXbv7*I-544?in?=8?p#c_lbY*b!*-9Z zmimX^C!hGp`OJ;u<;GGR+`Pzcus}aRP6`;Fea_wa+i^0Ozbhf9Z&X%R7MeP1ICN%B z|97-i7v2k~Ez~N`*IinHHchzD2~NaMrOUCJvPueD7p!I(PQp569{CpTjbe7Gd+*^Up1_atJ7PAVb8qq#)@NC@@cn|I8U!I~hB_Z00l>ya9&B5cA zT$a8T>`*?0aN~}+Y9J9wAs+RPiWuQZw~^ILHPk(d{*r<~WcZ(*vPlfYjl{%=f#Q0- zYpS3v$rXLM%}73h#dkiI$9XHn@5_LtpEYXTk+kqetAc+C+Fj`X<|Ndy9+K4Z!K_1S zI#)Lt8yfPnM|zBR#6dBY&~(s!LNwj&3IbrRyv6*3))GSYXHTC(as-_UNPcXJc|G$M z?2g`Pn%_TG-7o6!G1LmPHlh||D7IO;T((Z}|kGENW=+Ec!B&e`YWv~5+lp6l@0Nfsp zw=r;r(#%njUPP|)SRP}KL?}QKXsa}jO6<{)Xx zt%SPR?U)EVp^eeIfa;2GPq%jJUH;qEIbFm2RRFHEpC9fO0VV_h9Ty7tQ9C^@>Vq3D zn^?X{MErh#vS1p}amiGPAUJMoq|)43trs15HbHSphKj%*o_Z4>Rn`wt8;BPjckhST zHb*bO&esL;Fgjs$RZy;D_J`Vh8CU!hlc$hZ*Jg3CUK=Fks{ltZt3oGOxxTg>l(Ium z@H7;>Oe!;mc(c8{7BLNj@V_Fv_afic|4HBhHpHrLYk{!fjH@;wTrVRN$!cr?+>nPX5Lqlj`Up;)-2ZR6sHH?~&z(G@uRbs#AS`xl( zgMtq2#F$`;Jt_VL^Z*5cfCG}?XzvVe7lLLVO$@AI zx}fTTS}eIVaPa8A@-EisVS<$BE(@&!7wtkH#6d$pf1WsYtor37`d;u0ztCbru!A5G zJJn87#EwS-z4!4aCJ@8_m!wB^+XX)dDmzlff+z9-x^Had{?0dRVT1k&|AQ(RZOC1| zWSezwdzm0%His4%oDpE%>YK>R6jL>4Pj z{e${eVPabDJ&Pj0wmKPr>^Jhn!SgaG04SWaNTXS@3DzL0$dd)z=F-Bl=U5N?a`>|* zI*XXZUWgn?>H7A~3$JR=$346!(X)U?Bpp?ve*x}#f5qWi##e_J0Q?p(1e;Ae29%av zC0Si3w)5w*g2gg6rjo-;LKR06uW$ z;8#dEl3>u=T4v%ex5_8PYb@E$}xKKkiL~)_v{gBqGO}kF%PvClkks_9CvqhJ%>c! zGZ&-h2i)x~X$PQo1A7$s2Wv8y=O<&)`>XnSgR;WwC=;;-WRedV{SF*Z$^EIJ=nAx6 zzR&YKCM`FG-i(VQxlw?I#e9_A30)UozJ};WycByVPgr{GfTsDM2?sK)x!vzEiy*to z7s#u@-8~0I*>a!~VqV=Ym@%w2-X#296ygLsSrr;nELZ!NQwZWO!w8SS7^lb7H1WZM z0C24sJIk}OvdYTtn;eGZ^qb?W)DT4uC8YLYF)I4oJRQt;LJr&b5<|knGcz*uAE;VL zCe&{54(9*tFbix9=4xDXTIzh5S-`9*0|Forp70dl;qKksbIN??Vp7*xs0h)?3fTz$ z+dXuPK`kgh)(A+%pX{=ABO#482-|lw==U95m&(P{^*J98mMV~VfA& zhX)0wTFCe9VCaK(hu`_y<4sR|YC*8*-(}sF^_)gp? zlPC`^5XBfI$?iaP8VoiS)QsZgm4k;Il}fafiZaM0v)O!D*qjJ_o)_e&#mPXEwGHl0 z2JM|7sHMjN}c>&F+g5-6py|VHA@dYr0Aky%Q#DhVe zhis8keNc(E84WY}l>fl9f&W0b!*Z5dnyJz=iz`Ad%NBLw9f4mQ00_;@A@LL0JiKqx zvtG1MI{LB_($^GLgR=Y?BJ0>N%R+_kD6bU?dZ{0;8PK}e`oBf?weM3NpZoRv7+chm z(aJvGQ;Oo)FpgOdi6p!Gtl;-21@$G6Boj z5Q%#AD)yQ|F}P7Xd9k_rl6iUy!h{#r!kR}f1Fwj0d?+cGg}gSD$Ix_G{6Lus>S-vO z^NcP0(CHQ+s_tfGmz15a?QqSLzCxoNJHoU5(--GD3e}YOSN}aeH@$Ix*0lL5dvtp8 z0h`KOQ<9Oa1wk4E0|UKYKevxO)MwuB>A3(_M8&yBIiP7Mz+g1iFMW}X$TRm{cki!t z(Wv{_<%5zZ7-tXGz{LZ18VL!P&)f{i*hH=Tv0R4_bIY+~?ccs_^gv9WtE=pbL3Ms# zXkP(l$5ks~0x_42y>?CG`fh5i5u87^&M8n6Aygf&j zTPQrPd|fMxsoKuq6!qh^ijd#y{5daG!|#VxrA3cW5T`R$ns^h&oG-03R^2%b=@QsW zH0mHAfHYLH9QE1K6cuZ`W6#N7lHByC>i%m?yhL?Tzyuu0yW&d&eM<<}M#7?x5U69Pj)RDDofTG^8)U}s>AeyTP1bihY}b0a<6+wA z#Mg8LK^bI?6AV2dgox)QpS+&)QkZ-8#1podJwv zXJ-d_g5f?LaDP~qVrl7=ZweI&XmMC7%q979_`JicKW^-{p=8#1*=y&PX_zN-?$dwT zG}_KQZGMqdJcRVsfbz;S8d1D*)NYLKzBX?qGH2@9H%-nIDGCJ}WFn;}CVEw9r3pfx zB)wt0!7ICu@mtqstNp5^C7NaG?0R0-whnhB`B(w)#{w1?gk`M*ysqV?mE!m#KhLX= z{S|uz^tC)9uH z-sr6j{7|)J%NER9?G6_&T!1j?YC}bVb=PmcEX%hPYcJ2Pb0`dUA$SSmE_hwE(-)U} z*DLHASxJ=@uo+)y5J+4ifL`%^G2Pb_V@J@MR}IIOeyC5!6chP&I*S{1Z}jqaNBL*% zhscLmW4p40qyC8p2Q5K_*<4oYPA>{6$};qWq7G6Ti2U%2g81-(%#gvIZ0lyu2m><{ z6W(nydctTg4>kv)Ki0;$nsho}QAx?$vt2EnCbs^bvX^Ys>H+5c#>Vm5>6~i*zMc!x zzCDp6HxHJLZj1hD_WOfZSbXhif_owAWl#&Z{+HLjwJ;~kXx(kP_oco4->$8Xrp7ig z8fP~;DL+~78I(U=FM9BH>`xgj!!W#oS%8I)qQ;^+6=g*na_N}cMF z4%P9MtYyZ>oDa6E#%gWm&N-{)K4Ee4I9@i!b%~Th_NZ{o_AmL7;xk?fvP58Vp ztQST3pLKDY?8m|V^7-?PHs>I9Y5x_^)~5u7j#&6%W_FnC&LzeBCFtO<`W>QZO z1YJD))qc8kuFnh$a!fQg@QQBIV20=vP>{Hz^(QxZ4~I=VvkR6Tj?K3R=UCW_!UeIC=wjg`ANXp;=Ma{oHX8fl8;o*ar*e(+ZZ2i_ zN;Stqujpys9R8h-u4J>Hh<7Fr!u!S~qO@%%AM0ME{(Ge1x2pInX$E6aHf3I9b-r^d z0{xAsn3IwTXuqTNzgh!iLwlDdfOVH{_i>s=Xehd$B7e2nf(QNDty{v(bnqo?XVi}H zWcoiXKsaDqNy!+PEOm7`mW;k{PuqGzFJV07cf{N;y@^4WQzPLb92cn4b?%4!Jv>`a z%})>>*Cx_!UciE%-V$NM@y|^%;G&3^3PRZ0e(G+at0UZu|BWB-Z#K~h^_}^)I_~aR7@w@%<51OzE7<^ zEi5(NC$_V*L!8%$Q49ON(Mmv*+b}c@y4d^e^{r@8N&Dc6#KU#Yxsv(75f*`P?erbO z!tmil7jQ)MWstFcsT6kwsK{+nz;&=4uAo+ZAvoEE=SydZ7uU9?W-p4!4yD8?HkmFf^NBv5qklXXNf5_9 zS*_Rww@ju==lL=TBl>1o0zp>zn^9R+bT=Z6LflhFDP&`=V< zT1g?gVTQ$sjr=`Cc|!pOB@{r}M3 z^oJdBx=^ztz9g$Lkj{aJQ3uZALm7hGcH?BC8gD8HnMzhTrPidtPDPykv-9FDNv6$* z8Q(OtAWRRwHzFc7Ha3!eg19XiUefFKe{KIJ60WKmGXVMC287 z?lbLAzqrB@Xb3ZiYD6vMM|efB7MS6=nqfA7?7MSDrbFE)TmlpBN}Y4dWK6f(D@dF# z_)`At`;agXN7Y2UQ`EWT#Ym`naD|=Dx8|>eas|Z%i(9vB!RAe99N(VKHxxxI=T8?! zY$&LX>;XIT%1Q08IwbhxXRN&xJ=J2^x??B;66byM`fD6Kl78RS^!>gthYKlF{0>vPsmG z)rLI$KfX2ocV|S4Y-Sr&M8LLh|p2S96-~@ zPnX#?YT4WGf`m8Z4Zl3q4V^h3_C-_EA~%VBKNAaOFok$r^0d#_lRNvL=bO-trg1#3 zfkaxHd7qPy&a7)>HYOkRoL?F;YAf~!5BJz^R{K~UtvvvN4(Snlddbw(6!uR&5v_0A znJWSZijAINqLSla$U}4j;;4};o7U_bK_Qcpt>`RX@Z*(;*|W_ab|E{2W~pkpVRbDl zLjT|c4@XB27)M_lL|crkXD{z~yU4G}24C|Tk7 zxN^rPI-1e>e;#ZIAW$g?0-0NeqBP%Y62|;0udHFmfsxmR^z}P$Qlu3RGE*2Nm3UhH z;$|=7CR{EIw%)6gm@C?UHGJmI$m-W_&t4sCG5SQK8kOf;u2yqgyaxvVy>8R5Ed+48iN@b5h|gl_*MHI7-jQ*xUQ zx&-n~EKG+?NE3lEGQ8LPzSu@E1oLB5))$HY=7`_`h}`}5IYQJgtGDHHEZyAV3`gpF z^OYP21%qPgKnb=Uufi$GfWsjiEDQ##mhHQnKkSIPJ!L=c#^Csf!KbCmC#o;Eq^NDw z(cYf_ryAmq<>ik{CeXI9G4|`w1;b8o!O`)>H^;n?x2JIQ=B-Rk-9rmpLRe9bo03Y)47#6}?0G9Xe;7g~f+O@ZE$r7*rd zXO=TOl(DB*zQc+tg1<`jvKl0tTU|AJ)np_`(0C5G(M$2{zmv+!_ z@)eex`C~qZK0t_gIjX{Zx@ymwF9(nkHE_T%g%nmjcM;)MdF{pKJ)nH zKj$5!_t*Bz7JvEv`{~zPpFBz!2x6CzxBllZ_Gev6g9W{9{^jAk#n(?krxU&C!p9_1q5*Id2U`m5;l8uJBUkG&5t5;vJ z2-M=%cZwF;M_XfB>_fOGjt8R6#=t!2bkL*y+0#|_E*jtn>3p}u587?`^-i`%X#2;H zt7DV0dw03jW-{e$fcwkTRF|0=AcX9hLoS>5fvLjq7OfrMh=y_VAy69tq+$AFRTW7TU%ZxsAx3VVb{2L1)IQC4c~ zDI}BIFHtpJy-u~lJ-cS56cAGCdi;mcA2GII`8`>$Zuw=bQPVJ25%L~g*+mC>RL)j9 zcgyK@{Jv87?RmRH_vRH^YP|w|2O(vVB)TgYB+Sh2!HY97aYgD}z9~#?;_S3<9d>Cj zAId0r^5mL1-SFQRFnTEd#R_wIpL=7^=FyR^Ol<)&@@OE3Sv zng5=f8tuSwd)fMP`oP{NTIaXK$Vs#Fd_LHxIFT)@$3@Y0K>Zl?DTz%y*Y&okp7-gD z=|tym(o=IO@|@25%s}fUQBBV`edEecSC{VhvwfD>kyoD^=^v#qt)+xVC%typ2YdvG zsB%jt4}>EES}QoFvk(C-OKvWL^;{Bg;tm{u>`!K7L(EiIx6{sUE>IC~Pycy!J=De& zbCm1!dfDf@j@hNh_&gM6h`{L9p|5}Z{+rOCR_rdGO#q#ta@_N82)zxTVEvD~&d=X|-c{0Qvw>Mo1VELrVU=rXj``p>0ci zjF){U1kE9lwH~!8Y1>d}y!WJNhJ$qLZ&{SbpB~9M;}x3@bFd8`YJA;T#<{jtoM`!H zx_V@W>psy`yiWRkw-=?hBcEZRp&Uh<$&BGqaO@A=d=US^75%upyj;hG6FDHP*GQ^$ z`^fPs-nO9~A|i~MuDhKUPyFiKF?`r1L4V^t$wZYT1+9;VcnYtVKh(bHT<$2=Aa}o2 zX|3S^-`j|jQk^1cOs#5l+|(K!j`D@y^qvZO+s}Hd!(*jF4Jm_bNowk62BW*r-6x-| zJ@IhpcVZJddv+oEWLM*Wy{PMjsh}-6T!)7?43yBHhwUL89NSc{LD*_nfbEg3t>OF;syFo*1aBELscnSRiMQ+gf{&sv zvLc?g!;=-m`{cg`Uw=56y z?=DMI#vgmpu=CP^TZ+G(aVRRP;y=aA9_knG@@KYRA^PJ|dehL@#DvH!v!9-w0Ip(e zBy(r29*X4|?{N8bsoP`ctWNTqbv{DKUXw+OOM56ScjRGJ(7xB^$=P#fjj)m|;`AHw zt+|K#AH`NE+fQt#T=1Ca{`L*6w7x?D#3abAFf7gxT#2c+HY5Y+?uf&OtBX-6WUG)M zHGjE#>N&06p4afKYHtp$lc750UC<~0YUkGFBgu=)pL^#dAM8$C3mh~sQEMJs&m0)B z=|1n8aCk_ZE!F17djuo4SnT*}%T>5_r5OhPcw)%` zHncCUR6N*_@ZsT;m9%F=4E!eoWuiXbY2JHUELm>6oX*Q7^TYYJZ~79{YwH2qW2BGW zdVRf7D=uF}TA7{)MFR_Fk=FEk4xtH9g9JV06OI}Qw>xqtkv`zF--&ZiD2Zaagm;fk zzTK)76gYjWnvjQc`s+P;D%zC4bQi2zLH;2_JfR{8sYr>7_KwEKR<2?nz$_J>rRKgU!n>mkh` z)Xv~yD|(GdMU0nOLx)FblhYe%;ld5ZIX{mK8PS$`8!+#Oj%&sfXCK(;nvpU}T_Lw$ zIGYe3?Z`-5(JoVrCEP#`XnjB1KV9;D%=yFJra*o|L-BPdPxr;z-i&eV&;}A9R z@E;0nkV&hVvXQ4AItc`aj$T%I0p!@PtN0Q?8T@C^=xi_cL|IuKS^ENCme_5?WqTRR zdQt5(KX#`8BdzuYi_-G9!Dd|-(^x3zHyCz&&eMG@8piqHU8COSCg@*nISg*iM2~bb zM9+Bb>=vS|zAP#%Q>vFS+_bg(#3@I8rE}qL+c$5a;nxnbbJKSE`kqnS%&X(f)@L^A z^{p~A;qT&PPqRIL6qVQIdBwF)@p;Hx*S%|nijvqWxL-~&Pvi0TO?oS`^G+8pfNoIy;`x+8I<-XkDLG4b@IR`osj0)8J;xuWBh~E5$F}JmAy*rG4;)`_24BZAN;m zqwGlfNW=GQOCTdrRkd#Q&Bew>{%(y1OX%K1_QmV^xuPcQx2w;%*nS%@s(BNisC=us zf-g)T=b-9R88lz2RsUnZ9zMxriI8E8833aJ)zTx|?U8RGc8))kQR~z|N#zFCpuH0!LFd8L3fX*ASI9NdFoN#7U$N8 z)c2Vzbd|OU58~!-?8Al~BoW}o%{PtG9uM3w${QB*Z=}PWH`NrUnfj)#?%j~<Yk&hb7 z;eD-u)TEcEmQ62Zw2j&X;Gym1`Peu9LY)0Dx^jG}rALKAHLro7jEP|f#69|c>eB4k zG0zXkuRm?;H_e2#>Imh-+Cs3Qd2gJGe*Odr=X=7MpYpoR7Zr5~lJH6T%Xkj_&Z2`L?4%MpzCy9|v8_j4{r~7|oy>~nn{vJPWJN7Y>gsg0mknD4eC}bsB*$z>NVb3(n^;I6@fGyK8so~1@Y0V{PvPp zkZ6^IEcXA(0|1r?zhiBodJZ0L5ZFj>V3@1RS*|j8F{cf(n#qDu70h(rS#_W!3DThbq^0#AeX|yGAXjVZ$yn{orMdcO{ zu?n8RO@QyK5&2M=mY%CXP-;Qs{z31J^{f8)WidO6sxa9qqu2^Mf9 z;U26qDF+e)HrLk(?LvK6i-02!XOSW_4#W|FwSX%gKp1URSf}_m1R~}~Sf{lk{L}mQ z`IjeI!Xi7rz$6XE^gC0?)=w3VKh7ucW#n=Zv6WDQGm(4C7P1KbfsFpYhxuC`YVedj zlA_t{pXJ$Bg(r2a`pES3+NM4kK}19Zl%+tl&!Ev)P*;Nl45IYjxX$>_GcYa}Z%N?OLZS$fHd3IU*X#@_!1Dsu4 zJkQw^5`be_gc)uG@}f{LK$6_tE)qZ-hW1nWse|t-$alajP!fQP8g2sHE7vZwkH);% zBpeqatj39E0K5fg$07}o{K#a%5=4$bipFLbtT`FB&8Vo> zVgv^;>_602ptN1=))p677(s6g8`hi~TFZXyzH`|1ZGi*Csc!Qn;O>~YK&>8R?$!7L z`eSuQj`_(_FrBWtSdkMzR6mFi%V!Sh3;cet|BLM+FJ~eofHN&u_ZNmcisde_pzvpQ zR_py0K)_gHU@bHGiVe28u?ewo0-ky7#QG^pXjqaHhrn@q$eLfj9_{y+7~c~Bh}Rh( zxOuMzC{hUsKneu` zxBR^>(x4eUCev+N{bVbN->o=K03JY5uVJIE_^eV_fatd)ijydP-l}NG?3}kIZsRG9 z-%4@L$f|23qkSZcR2NhmI0q=EaLys0wW0x zUVI%i`E>U01cDb|spmUFp1~cn1h_L`RZATFB85*U5fY=pko40=o0kEM`uW?8LucbP z*}dhTYVn=rsn;c>-4zHGE_2-+J$TnM7ZdzPE`x{%sRF@8XTK@Ao=Zv7viIoyG1@88F@`aJri z;>2ee7HOr4gO~FV#zU6<&^#$IyStXLV+I@`V6?=8XvZg$ej}V$E56U~@G%_4y){x6 zoim>sb7sz*)82nuDEPs|SwZyCwq(7nf@zY1#oN@4Gc$~gH*C~2&aI!Bp%mQ3^gPP= zVeHG}BVwxGos}rkqtd#ZsM(~suP&XrZeKHD5=26I)N1?fq0IWxJqM!Ok>yp{3*;mT zk2TD40zdiP7B>rf~AE!N)uAv-cdGyUk{%L3^ z>6- zv}d0h00O=c7F1DLDV$2!ZVAJ*tXZfJK=pc=H+M^h`k7G3gxKQ)$#l{gWKDL7(sh|Q;^Ay5$4m!*Ul$vh9Xc1$nOMyID8B>#0jOL8R}s4 zYzmv0JSV@jVnV9TlhCUBFTZ8dr?SU3N!%B$&fuQW=^cb#z~SK}>(F?u zOP_ek1w1$x(?jIM1ZK-~icqGGEXRXFI1g0KRLGW+3m=p-dYM@VYZCVgT;?WYT=kak z9~X@cjjWZfGlA~K2YCWN920GVU-{5(TsU!Qh;0_YhavHku<)sE@r|0l?JU*GiCT%Y+%Qta$@V?==c$}Cl{hEL%r?35zj(GhC0km ztfZ5DL)?oxEfx!4ex98z$kw7JQxRtYX%U_DjjanM3cBC~1#6t6{vC?3jen~-;U2eWMpTS-LIgKOnk%kHCKR^=1%M}RxKD=1=@}g4Z&leZEtRMdI4i# zrh#U^vbj3YokDDY5xTTe zy6zYWKY6?zcJAV@{J?83Azf>qx6LhU;(K=0U(Y07kTKKFe}f>O(P%{vklsUV61p24 zF=ezjbLV!`B%-E?VFm@ngal=Iz2eg?Rx<6@?i!{!`F+OGNp~|)+7W$?5)11(w5-X_F5$;s-a3PNpKhVWlOxVn zET(Z?Imr0V9f!LC$B#|`=#}9+h-EENK;Xa&pe@_=nj*?*3yVQ^Ax>*Sn@Kg zE`=t{*?QEG6J#wgM!wtMm-aIP%m6;rAmz5L0~-W2N)~ee-&tP_txN2)hi@=ZgJdF4 zrNE>dUHk+#)y)!CIThpN!nqz@rq08bQ75Tx<<)*C9P;hXYxu0vwOpxiBu7=zHr(Bl zTv6OJm5sUrn5%3UYo2nax30wKM7t}A8ZXMrt20u&7H=CH>l$xxv0v<)Rw*?Efpx>r z-}3T6g+mQmT0I@1mE&ppOPPID$hIh98e=(3M72|c1MdMJ9qJp>;xO@|+K^;q-c@_Z zJAw|aMVS&x{SzmdxCc;ZTsg7419Q#xacs)9^RROgnV&8b2Pw<2aok~abOE^s2$auj z0)GsE|GM67P>x-bNaqcCy_3CVcmnGjUq2g?fY%0*)9(I6ci)p(n(~;0`US-rlhwA(a&)qqNyDoi@ROEz4NC)|9wgUqRrFj;WH3}KEx9-UgbZn)hUd_?HTnA_( zSVj$n)EYov22K-5ocz2PmxkT|G2PrNx8QHW-YxS>OLk`GwD}<-6h<+Qcwug9$Rp&o zPM$c-r{dMb$%cVwj8&!4Y+MY(2_qTIRXV+_>sUF9mx?$G*a0c%8NEy1PXnM}z&GHEtrv^ZMi7J|a^AY7M}gwgP*h96 z-&1hYp^(Ox5$+A&zrVY?w@AgCtE|O1Xdwu)_M?_b=lWEu7fyB8JP~y^Buwv{=I|e= ztBk51iLkTO+@1#!3Qf50f#xHqe@X#!47(t6G{{gRRdM~EFr4x-q(6JsC0L~&_44ngi`f7v;Gf}$ExX*R%$cvm+fKO{NJ!b0q zbw)>MnK(Fty9_9i6vL#*Ja2G|__p-B&4NQ>-9y$-=^Mz6g&#-3wFwAYFFVB8RyQ_k zB7C66ZMW7(Sv~0DIETQ$DJ}?+i)cb!<$JTRwdXrT%#PXxUJzatdE7G?$uRJC3P4Cf zn2fY4UDPxp&B#e9l_tSf;ZGF4!8(VL7r|9|y=y+PkbTsyW3$9U>1Mn?cGs7cN9mXJ`&`2;>PAZRI`H zhlO4e^24`?lf=8U^V>{}yslQX zxC#JY08(2lz=u%WK^%dE_tYu=PoFt`WucT+Hb^~Th=fVi)n{txgZ^im$hkuPG?2{z z5L8#E_J&S=V4%NWOhiOWc>>pdk!D&&>`61EAC?;8peyfzkI&Qwmd?wtyMl13*Qtjv zX11;0iZyB1?*aw@Joq0>=Y@Bty={_c%ZrSn@qMb}w=*2dQEqQ}hbYOWWPVV`8RUPk zG5_iAKyB|c!cg^*o+N04+)|P?7?M&M()(4H!P~d}MeTN~D045k(T+SH`#=bg?d|=e zV{nt+YgEbAedWE)&1DP5XD~T#^hR?B+vnAir#jV9b|OVxTyg{%RlE4MY9l!P;r@HS z=mr-_G7Fslkj2r?+27wq52I2jeU;8k^%aJXx~PP}M!}C)b9wU$cSuGjLHjSWfZcWp zdPz~A%UGTTpa^uf-=K_V)mXFA<}-E!xFT03D2C~UqiU}1AZ?NE2*QLTNbqzrXr(4W zClB-G^E+{iFb9A6!Y#dfzsL429XvfCq9MUk0|9b0_)BNQj($EV$*HN&m#oQ`3_{bW z)r5bKTzDJn51bee25OzEjSF(gC@3~(;0jrkF|y1#Fx^+wFL;A7lpegvp+TFR@oTtW zbsFvyaoddO_;#-#BtG64P8@eF&7`LRe|^vzGHj4hr`zlgt>L7%Q(&gu(3uQjKs| z8~v)^W#;kn>kMp31NlI&7nwzhkzi>D;~XTYS3Wy@*=fIz|H9#~^*qCyR}*GOIK>`c6XYdt zn4wAP2=S-M$ssH%T5`WVz;@I8ZS*yHiNoDtvB+9MyFr0pMG7e;!#P}^v?C`8x?g7X z+1pf4?(f$(QK(9?s$~Y*O86{&IE9Xw_^#l)i+Mw9S~&p;qiX1G_=Z3oJ-vYs{&#PD z@%d_O3~O?wLRCud5(rP>#BDU|ttspHOhCuhFcT|khg7Ahl`%Z9#`$)@GbId}Ok&#e zd_e(bC$}sp<6@ys;;nlT&gnH*mMe1lWzCVop9aUNk;uowO)`8lBau?+ZBKQ&t8!xb za^&*>_BvW6eBl@}vik1bz(uvxB~|WfU;|}S;dc5joD&qw#8|2TU>)Q-jXWALdhQ89 z8rJjd!we=%kRLl)bS?zhJV(3pgTlD&!%MB}?pEJGsa{u!2|SLGAU^#5wH1pb%7B5$Rm;g*aS5+c@HD z8rdz=86#C6DlWh@s&!{K%$|1IaV{s zrrpDlPGrnUD!B*le6Yg3G>KjIfiF@Y;G6cWdn8stKUGl3oc=g#iFBeMf+!>-_3m9< zqy)hOJB5LzSM{gaF$|OjGjmyUXx~Iu%nHCl*cX2=6py)?+ORLGRj`D|H+Q~Tj3A&& zNieVZib=s${nAm;k>%>n%eq~n>&74L(_g&rfGA43ueyZd8W(c#}Qp~u*=pVoXFD)hgreCu| zk~rzku%C$Cc{VC|%|iBr(BnK)_!^*^70%T%Hdf7~$>%q?6JG&H$OX3S&^}{WyEX^a z1^T5B%{fS<8sAj|aY$3K7m8Bd8?&wz);Bcl{C@rA2E4ewO)l_B}|n+4F`< zMpoIrOsXeCX$fRH=`r~{Re~JofQjQgwPdV>`{KRDn`H2{-JfexJ1JMscY~<8SMyKh!3G2`km3>NGmOB_LC((mybq`( zUIDv6OMzLTL)FqCru);EDemd*tE*EA<+d9>n^xTVwO17Qp1{EOcq7T!GW2Ha6Lxat zzA<*M^dv!)+}fTjuP&em*ye#{K<0qI=vAL_1DChAybj_vP&UTKD_iZWOq)>h!OC6% za4m#+BDi4UhwQmK0bLNwH_B0qRD(A!$eq9}GO#?eWC!EJY2vVu1VR4HJ{%%LRX4Nn@2qs0GZa-ry9H~rDL`dYWYJj+C)Apg~Jm9buf1fAYa=i zUO`%HVbWLx3s2}K28!?wa6xyat-pgi53+~w!7bN@BB8Drz!haq7&5Q!C{>g^97}iA z-sIZ}dassO^4msyjS>J4+E}*r2RsKWK=IXm?YcHW5-L_yIJyFz=T<%%vJXrMoW%RyU zJeXoj$ygRrQ1*cYM1(p2MCR!-&}65XnV~z`wM$ypBH-Aw{vag-jx9*Txx2WUVO@>) zx(+dU!|(Cq6Ux~|{!HMJB`p5pktn9iAaDeU+oJ$ZBui-o*UW@kK(Myw0&h$RcRoS+ zt)ggJlfIlC1X~yU^#@N`&JosZZnl0FUtOyWD*tj2Dq$f9@&^#gbuBt$h_nmjmLR5L z$~hJJ6J`a_^0b~i0Rt^OM?w;yuTj;H9iPVTA?qT}f^Wq8^EO_wM8ShXgZ`g;q)3)@-((v9%*P_IMFk^Bi;O%Jjp3q`TyLOsMd{ zBm~WgI=sOw16?P@;+aulI9|&&+lo(ek=fk1>3bM{Rj|O{U(PTz~(!mC9Btx0FS;g=R?7IwB&ECBAE7 zVq&UD?9rP57^|mmZiK+30r@Iq@@Jrx zm8{2yo`=tV9vuS!)P~O6E;M=$S{QK1^w=`pxgNLJ)(x{CUGHeh+6PIpvf>|1hfTUc zLD(D9*%x^b(IUOI)+}o*m}cJNOIC4`Iq+GCdL5I>q<#U{)BMkBLL%M*X|*OobjZX(#WgBxhnw z3@(t4cBmy4*w>Vnr0VW^t$nGQzBl1Hhy|Db-(-r1)r!z zqUO0r00c(}K#CB|e-097Ci|SFFNlhM&huppS{2iv?X=e0z6FEcB@1{B_d51E-#IOF z>$~HRk}3y+7Q#*&+sjtMERz|Zbo>`bcOFJ;9WYGYUqzJ{+c2Qga~DRP>QuRbB$)J} z?Q*lIJgr^e7bJTTSXOYC(yrXJ@L78NQ1QNWCcdD4L*aViFd%LeT%etYbR=R{y5S4D zev>q|w;|d@jf`eT-Tks~0`@xy_KY>dwS?eOetga4{{5O{V)qHtf&akq*4%Ts-QE4m zJJZV+3d)A;CekQHrgCDI5k{#9#x*C3=><)_!U9Gl|L7RQkE$os61MC3H@pF3hI$MU zc!Pk@+c^B96pQxx3&9USGpu&t8AuTk2vY-& zhWrsHTNhkT@XtO^xxda4qXpHiKVjX>M$YARox=O^8;g#p4w-KjoHkK;69UgAJ=Sn! z3${j2RBhdauu274T ziSLk!a7qoH1CZz8D`sNLf$I}!I<03ipm|rmT9GJNsQ-W z^_bd?^ZMHq*Y9x?;z%%8m<|VRC9I^E3WlTcPYc+2i$`}^Q7{KW=Rn^}{t(cKz-*%{ zK$4sAQ1Jv`-~B8`eG$r=R)7?~G)|jn_Zt!v44-}7z#hS)J6wYInmorF>;`Kyw70`m zxFZe%DBu!x{N9855+LSwDHHPtJv*;KCUtZSICSv$x|!^c%FzQD6mjY&o@N4Japhl6 zTSkU*F*vI1M;+M~-{xCPRR#WVm3)N9e)Cy|JXEP60}0BCyKml4ygz)Lq5HIP8^Uz(^Ck_L1!$TiN?kr1xciiokxOC>0-H5vA!2P4f^YM zc_bni7+JVil6!cMH8ZsMJm&}ob|7Ogr)zO)j}WURo!R2Cnq<8QK|x_FndX%fkoY~> zAJ@HsJ*W84TTAYjHt|c5)0CuxXMg^FefY%=kAtsXw6$Ktdu; zR=%czNx_Jm34jVl%lb+|?eSH+gxZ=CG||wVcgkco^g$l5kLgLc(zRYLT&$U51NTf~ zH}b-EG9}G6-Sk-F5C#Gh!dB{2jLpqk9xT&xeTA5j_xeNhgln`7UGyU=rTSl+L2$VEjtRiEmQQ{Ge06*3){cjXdJX+l&9j(DU!h52)nCre4*0 zA8+Rc>PHyCAVPVOQJRGsAF39uNCr_H405I**MOj~!74HyO_Lm!&fom2rZ0b zJk1@>6n9#;TmhL|O&F(*nmihu};6?8>5DK&}dM6W7l~T&nTpD)9hT zz=6kr2G;oih~~w=J+?m~Dl8-c^8fBb|4ELGiZ4lB_%_)zlK{@z_aW*t(Lld}i}cx| z+g$mO>=bwn;dvFfU6Oj_@dqgtBn^Q64=!w!n+ZMMMKI`offK{$>9UUnlUl<0rV?d- zttX~U-uY?-jDvlVZ!7%9`X^fqb#zsnJ(u3``UfV5=P3e^eyEc_1ikUlw2f)#c-2k! zpDC-Dj*d-697xj_?PkqbQI7b#TbCe(E8yhs+!?xITBG|Qhh3XIUu*c&w`HzTJ^y21 z3=^ei(4Nm`-h-k%Rpnes4+V{?b2j8XlHiQr4Gp2}bg5}a4OW*<{Jw%voT1vak z8CSsy6Jt%2g6C%xf7_{rto=_50EfiU@!z0U@RH(dw<);bVFW#X3vMUwjSnHA8~32t zjo|dyBF(@K*dz5U00uD@B+9di`hL-@{6S;Z7YwBeFF|E{_X@$CU(g~529=T!;NO4j z-IHX+al%VBnhPGKRXb!7oRB@!@mcp_J8NuM6B_My=pvoz6gp`s4t6i#@VD@gpzQP zOdBYx6Nt)(w4Mv*kjAY?@M<=i(Rv{22^hsQ`xKwiMRO%^5xJ2^$W-xLDGY=T-_#FH9o@R`74 zP@IthFa)2LGty|Lvn>^7jc`3t;petp zQGTx=thOSVKw_+o>wD)Q6={*wNl-6(p>KD~f9Xnwz&nag@`x|*Y;_&9cz~=c)F1lQ zppOUAFIp}5xBxI))6`Vva3i=~{L2{KXq2n*M&R?YH7F4CqJEANjRW%1@^XJ6xoV3= zxKIh;HNzJ&_6>-7Q014qUs7wDXIr#aXArKkrac=>@Hba0CO7=J&E(beG^J3DA~q4qE|Cms)lL>Gv^ zn>qF@6^Me4tZSu)`X>}+F8?0*L0e;D@h;a0cF0U-bDlCYpn(wIDE^9VUd5>;3J?@i zW&4=GRq@$1=VRbXkjrJ&Xo)Gxi8$)yAk?UsE=9qT?aSuIguLM7FU$cFBhbwS7b@Vz z%MSloLby;@)GyV|yKR-H}lbd}Ymj+};=x#uSigwt5ImaIDyP&&4@c}=X zTu!loT-Q%|mk4!nkc;VM$fF1RApf(mT7N-=wjpL$lBmNlsUXq7^+q5?4Q7zGOuFwB zErW{RxG^?fzDxauv+7sv%*Kzp@F%*vlXkb>%*8$|Bl^Daj$(3Nt&7;QOtB+ZMXpB0 z2d=A8qrV?x@Z)h7%Lr)Zgb+kClr~+-1YK_Us5RsqQ*ER7b{;Hs2$#p66jquwCTa1l zsz9E8Yc#<1RnvhO>CE2`Id*}p9F(|sS0Y`WgU&D=Fe1&QQTF6rv%ktJ`n%e1i!>2b zdr$PQZlFw7x`op7N+@(osLVCWJwiOPqQd9;Y%MF$%cARnex=pQ@3XOd!vGP$Rz!0- zZ!4%`hJqKilpt$-^R+;>gaXve$X4dU8iK|*GOn-C0RTe9sznuFf;#d7x&e;z%ENe+sgW08A9G|G<5ztbNDffiSzsogdGuIp&vZ=X6L%6s=sZfkOw7di1@p z5bwy|9RFBwbDQL>ez+(jW2TCmH5;f4El(3RgrZT4GyNIrU}DnnneQ8-rFFXbfsz4) z=*{^eO7Oe_taR?&%-Y)8^fVCUd3`AWUWvt9T?>>bvaUuPr%X@jK!z`XO74vyVd`?r zJ`^8%RFfkaxEaxBPw!qihkGmD*leLf(DEX4%f)}HbI&}9*GLajD&}!n$%m|KV8a z+&wgIz{aFTW<2k;U&Y!AqV&A4S22+G|4I}C4n4iOWW*#_kP$kG!X?lotE^Q&iRp_pEk#ulsEN1C(_M0q(607W+tUo_qzET>)kOLTnSK=(SHi9R1aJ(yK6G@1`|7E7=dl1ihGdvS(z5d(k&)N>pU_`(bIye7<#_`7FzGJylN zL3oDfrHG1;Ak9lF)gDi zVp=7BehZ@rBLd{&nxqGYmiR6a6#HXWEBar5FZ6!vae9z{GJN+h$qNVFEEW`qo8e~F zWkL1w@D;r*K0k5m`9N0BQ@@hz{Odpq&=&pOXUDHe1tBGWi-C3UeJoGT`o4N0eEzXgY&q35w zw^JcOVOn+Cz9tl%3qzXxLL4htZr?0FxFhr6n^yi1_*S~&*hfxYK+HK)v|7#7pGli| zntRR~fFA|Mu)UaIHkBp}dMu_dZTVAmM6xMupUVIz5H*-0nA}ra8wxV0TEP+3Zx!4I zR5QAv=mrnjn>pKer^lYOENrI84Su1>i>m7I-yaqyWFS4o&!qGC_!Pgd^O5+rWTtk# zc5=NVNtYXQbZ8lUvMp<3ztqX*)tP}i-E@AO`J`Qm{2bVTKPsqrs!O3>WRJ8vt?75e zu-PfQ9c5IzwDvAH#A|1Axm_3hF7v+Cpo-FH=^uW$HlsC0>)C^z=%n-riIS&2OrZ6C zxp&|874V&ShjiCeBr-!IUIrXv5MIgCY_Y41_z&a0x$6lHHQFd7f(s&Y)lbqAN$bdM zKU&r(a@jn&$=4KDwkzSL%9r#XK!6PdXeC~*GHiz7Z8wD_rmBi>%N*?Ik!PMMMj0g& z)K0WHmxknd<0|I;yz>uIbTQ(sRD0&k{FCZq{s9+kR9havhKeRYS+D;jv`hc9a3XcQ z8=yUQ_I^M%v%P3Mo7?;w+e|vsEZUCUS`Mcu_gvnJuJ4t1F1*<_;Y#$C`}L*j%%kn# z_5=B~Gn+ruLCiywvsSG}4RVOjt}$CvXZ7;a=&D4+R*oy^D&nRyZ@xF&Xw@0arx+HL zT)9Y_fARXo8(B8Y5*878uUc9}5x8kp*?+*TnOwYtWfOcRkkUMR@1UaPUj7iQ6lyMB z&@x=O@IBxQl#@c&5pOLy;L476fIiG`%gCB^vtiyK2XioOoQBXM~UqM2T9sd)KpY-$}%IIy$!^sUFK78_Hm=~>OpiX*up zRK3~S$QO!Nm*Sf0OtNyy`E|2aPLE0wp`UYVVAk(TvQ9~B2VaVX*WSSemvXL?;y2MP ze@y5(HZyA;{&5JVV^dz{s`!hb{N;|I(o}8Gw`lh6%Lbwtf+Z;o% zC88}a9xC17_!RY;$Gqzz=4p_LP7d8zGL701PfqSy*l2T!a%Gx$c8*POtmJ*-H=nx^ z!^5f|Atr}7EZ#4!GXE4jzaRdE_5iMs^;Um$siADZU-|#ZHO5X<*L12Ol_*x7TvEQ^ zD%|}=2sM@X)X$GA=yc@ds&~*l!PD8N&Rm7prlcL5@1nQ5p?>Himu|Q+GE^z(i;kBR zrJQ>8o=Er1o)-t^m-5`UBimVpp%?mfZFC-@IwfO#oh}Oty(e7r;d_r425A?nJoOoEr$@7GGOjfSq?5(&Ax) z4oQGsIp~(3d${T>4FyT((cK_Z0LlEWQuY6-Y@~L2sBs_G80Sf>`FH7giCEHO{`YY} zlKx8_6?<~`j9O@`7M{}C{)8q%F;!9QMfpm-+SsgeR?N>Uy+~vGoqF`88iA+^ueq=Q zr3o3&YTj1Y>_tY{wSmNA=YJc8(^ocJ|cf*+X*PBECj7D(Gm*D8XfI8eIi zC=I9^{LQbdxO1nR0gb*?bn@fwgB`2aKkB|6I_*WDEZbLbGN9ww-T#E&$7pEjJ;r z=I~AGm?w7>(zT!^E%d*_7&+ffXsP1_uoo{0S+P_P-=%b-LktrRj+YLV)nNi0#yrA4 z%-{NGS3NYc!r2QR2qJp!%)a_Rw4kUcQ~5Xa@Zw_F*LKReCtAOcYeoswHw7jAH6g*! zqtefo|l61{)HSn2rggM0k_`n4JbX9IrTI=j6A zL!ipmuKyngIaB+1rW_d~JPJj$aHEQJc*iVm(fcX5e@5@l+1F^NrO1qTznuNqq<)u3 zK%rH)*FKEt>GGAhMHwBYPJ2JHa)H|BPPH=?mg+PJK|AI=pl$2VJ-VaMZ!5_yo z00<3WCtkAIa&gPyCrQ6E&+$@l5k6ZDI68M)K`iFohL*_fll5EU(RPW*pGVIk6;yC|3w;LJ&I>A?vnBe96PLOYAD0Db-@6$5$Mdyf*-fM_|WhC2<+2t^Nw|zAK z2-)Al$={~P)>X|-4)5xcqhpiHb!P`y%+Jx=zLL!B16@gUCkTC;*|iJ!31sO2gokdW zg=0c^(>nl(ffx8k>U{UAv}ggJE`keR*YSwrD&r^z(pILVIl4YY_;9!{*h6Aq{MknI ziq%zi99}-Nfo(>`DnCY`4!d*YR_WOpLaRHlnxcL;p3hhvJU^&C6lF2J&D{P>{VR#o zs{moib&36Nd=et6dLmDH4Z{HonI4i2byO|XZv@h*R{^w~t^P-nLi;a&e>?Z^uTCM~ zlt`G;;W=hz`|A1|7w*prob;Sj3r78n>H2j}sb#`?^AkT`uRC`l0HfuGLjSHfd4Dz* zQM()oVgVZV$F9)P1Rr9<%-p?$j~`=zn_omErV3PWMs=z!RC2zkAsX0ml?r-A$95;x z4tZ*H_wSmB{6Nhu;n*4a#sscz@5CNk5|jpCvU5}nRBnWKfO7rD7Gv9ggz&3nOL_t1 zu7|sh$KUw^*O=iGok+eIyskJY$%qOg)*AQHDxp_P-1t_Y@z`z)Q~cpAtG>f9(omt} z3*ooz-MB-pft?c3yWnEu!AJ9Qg}~4=YhDsxA`oS1p^aDL8HTtv&;4rW)`%ax_MO+gOV)Q+bF>+$ zf@K|L;npmh8lz zfWKFchXNP}cSK4&;p-@T5b0DmUAI5zEM3~v7DbcIL7qYeI|LTY$Xm|)cLKi~UO!g$ zpLudCB$OcQ2aT6r7B{bE-bOqS{`f*Sb)Hk5o)Rz1#BniF|EPmb3#R{=&G1}|!bLC% z;730=U_B%X+jeFLm}&yDYKH`N{N=XLvvE<;#S^b@?Wp&#k08+h(${i)Af=7jGy)0 zQT9!N71YaP3_|0bk}q_OY7@ z&EL;;UhD8~h{Db5DUJI48S1jG4#8`rRT1=fnNKiNV($_s18=W8p3II0Ed*W>4#uAn zHIi=(+}-!`-Z1C-T%K!{i^O?&%Wi0t3|@M4{JDzV6zkz;KKR=r=6L0=?Y{?FSnWdH z#=E%tS*;`3>};~r9$?*g^yZnY#`Po;N>$*|KrcCTw_peZ88tl2(UAF}$N2W-r!{jc z;^Z$e;nS`^U2)Z>G)e~}e^35+C(!3wRI1eQ0Jk?3X+;z4@m!(GlkS*}aaai^$^=J}FTV~A zR;7#}19(+{Q_a`-q|KTv)mSvyVJh6Cf&R{qAM#r}zd5B&@scCCUQUS|N5FIWAEAR^ zjyc89^0e*SlID%$%qPxzSbLBg`*c)vZ?sxyL&bCAM&)_Kl~4rSW((W3r5vIyl!F#* zyOnaZm2yLBXNBCoa&N8+$auQQp%zvL<>bHw@FSa9&CTE6e7Oe9=m6>ZD=z#!KH9)` z^;Vvu;CfWK{rRZ6yXE>*`OUxMN_=-|elJZ>iq?gLgmt-}J@x{gDFZGRLoF+uEGaJ0 z|JC5R-Wz7OG+k101PtADLL2t$1|&k;Dh`j5Bz_7aoK{3$|121 zE0SdD%<+{s1TVT)%CuVS4Nf$d6S-_hI!$#A^^^so6m8GbEVf{Ms!UH;PO`Igp*l7j z8?T@>K##HzO2%$`TMYcdXu@mU5I?bkyw~8@m2{c}6-Mi_Ti~#)$jnV$`;3F+gH*_T z>iv)nmiZyS)!LH0CBKXF&utAnQjMtlvAC7*>!U9-LGB2)?tI}}ryZ?9*afO2=?OEw z1>TS>@3u&{$cpOQG~slzVz2dHH(H3^R1M#FbG(H$WGBd|ofMQGnAx;`)64rfU4POb zLH547KX#)sm7vPxZCw7w;muJ;*%u)>6&h*NMkNRw5)HZ|5$2isdHaFux;f`!)jhF~ z)Zd@hV*(Bg!Nr#>$VN+dm&N1Tf@cL@QmgYF6-L#62}!c5WWIZqh#j||UU*T^b%yy2 zli!;BqtmF%%tGj@Jkr?q(uR_~m`#fb{AW*F6#*)ye>e2*2JmMv#qH|?=V!q8@6NC0 zB|^Q=jw@J5&8@|@ODT}AbHA(1=D%xuO_=lB*rxB$&)8a(8(9_KIdr48Yv@kR%=oj) z#g$RbfQB#UN!USR?D2RWz=q4Zo^}%PYzY%6X^D0*W_lvW%aFlh6 z#k058eM969{0LkOiFxG{6DJ0zNL&kX1A93^Ddlh{g0Rd&S2;CjX7x_)Pj=Q{FX`Yh zGO!%1IQJ4p89PiL$@^T7taPogX~Z*p_17qYv!)qj z#^px7PbKHS6Tib=)eC1gW&XS&Qy}I6onR#$xG1YkExyB6$-j105qbI~Qohywm8h6I+)iwa3SeCiE(W z7uMWzLX6V!b;H%Dj?X!!7_*nBXDBv4P>_Op>wWB5uqA_Jg*6uKou}`AbS(R##c2i# zkrsXaLQRrv!(C3qTL3pA8TozL7@%zfLhA5>W399<9X#eZP*tLz?u;97jPE!@6ZOSTl+TE%vxK@oCE8+3}atZ+@*k zuf$3QLOTn)f^Y5Iojbm(h4=lxo8CE^o~S)3@JG^6hczfE>j=3xziY0l2i2ScpJ@Fk zg~?y}Q%aw!OVBw>1-twm`#rXLrUC88R&R(&PziAW%!4-qL?s!*hYwrf{GcY={wm$~ zqOy_^4MW?rXXiFGoa$I-R|}UJW>L+nLnL+N@b8JO4)qcOZShj1hLjok9v8c=Qsy!k z`yy=U`U=g{nI{?4%*4bmW~`QOY>u0@JzG&93}QNKbwgJQ^DBOCaslLd!*`mDd~OTg zVyAYIWZli0ioSr|uvgB2w?AWI423-BdjtY6K}%z~2f)_1Nm4 zpm;T-x)zt*r<{Ly$_5SNwZx`Q50QeSYWZ!Ruv(t)agoapXfP$=>ID1&H43 z1om$c7l=8nkgvVumA-5(vP&HMP0hom_pe&Zz&Mfw^&atmBe;@@>TqCJ8}kCDP00G{ z9JBwn-zOQ6zTjuntPm~)j+)V!`k=5o(TN3Vhbgs!#~MtZ>{n_{BicHfpKN=WPY%&L zl@l3KVtH-~Vg!)&BZt(JItLC7H8%?6VA*1P>AgO`E=If^e!w$hdc(gse?_U#izY3U zId#b3%qj6twbV5E-E%J)WC;}bUA&9U3&sqxb?q zKQEks17QdoY)eRmgco>IlZgNmcJ>@Zvjvj8rw=(rff>;_)HU}kn2(zxgZLV}8D!hr z3`w$&zAw%K3PxUr?caR7HUz8evJNcZ-m|I=ugK?S>$+V&4iinZIkSWe%w4c!k(i8f z9bQc#aRGM{rYjQgo`b<3Z>xD<^j*I$SoE!~%7{>B1*^K_8>)!*y_S0_#Gz^Jd@?E# zy4A$Zp)T|2lWF(MGXEc4?*UHr`~Q!hA`TUbl&p?~B0F35C?hJ8UD+dLZ^|wi$zCC3 zuaK?CNLE6JtdPAOvVYIlsXm|2^}YUo*Y&-w@B33auXDfd`+ly+pxUuX_xi+k?5P>5 zE^hew*U|OEyqD2u=IP6_#Cx4)sGYwLDQ&LmT8~zLND?H>UK*@XJom z4X{?4@?s$MBb53*SGPZB@Y~OztD?d5>RK$9$Bfe2+8Us6k`H#L>cC|AG^yXn!QKea z2Eg=swFLaN8yNSwDbQkIG!Os&PVGi%L6Jwo_bKGl!1cvo7cK|*-#ixWlGBK{zDC!s z_ekskEXxPkA-A{*_^vyj z(}+5boFJ6S0G!n5iu2pk5o~ayLjm!W>Vv%a=q0jE;Sd1OAxI%x;Y8Kww)91|RLZ!w zN=Hbh#Zxsen(4fZqID8e97zeFue`y+u3q?(DAA_q(h*uz>L!-8SR~-STiechZ);85 zv+YSL(eo|SGIjOh8yD2x7T*40I(UD3LnC?y26s3NdOP<=)u*MH4o&E}3lFf{c_2o&Fa*c% z%a@LuFRrN$RmaY+{FJ^z;P-$Mhc?foDI8SigZ)qAp&h3f-~J0`UqQ0`jc!J9cXf1p zM3MBGot_yd()drCy-YP|8P>l;JbQ)p&ZrM z?5W74^K6c4bW-Y4sh%VbK|zjUs(U9%-&txF7W7Ya8}z=&KJl!WuZ&tH%J^-s_u9!* zmNOpO^&f^E`H$U=0?|9pXudVqXh)a=g1ioF4hnSrvrS@&-yZ@bcE^BMPazGa)B6Cg z{+P5-mb0}}cd+ABGpDEKTLdhtYcKWPS3YglEP047E+gx8o^h+?^Jh{_V2$4- z7Y<2L5Sl;fHnU=t1Mv9rJ7$kaCZd4K=I(qcIrOEIYLh;iISp!e$H=|3I!jQ|Z4T32 z7->ZiC5FO$czC#5^h9+uu8t5k60aj%gGf6~Ek+R}i}CQ}9}m{4V~GG9J=Vs@BuB0` zq~zMi0C0*Q7o*$Gr)Hg_N=RXX8(%anj0tE+bEl*l#7QrHH01U^eCVbxNL7^4C4{%% zGfjKDUYpt`R+V^(Zeg(`j`TG;DcddwH(yVruTbK?M)!h7f1Cgk7x zv9ve5wF-I6^q_=#PL zeAoO#HN6K`04(oP)TSY;(gPXIX3^mj$B1xZN_)0|M2DYLHpq{)I5gR)w39a9zV!j% zn=*qT6Ftl`+n74n;M%7nOAF#prBtUH2SJTS5V?^~xknyAA&sO-u&-r63%51NzE@KwVX7;!jr^5xQ zvgV%cJ{DhX3V9mfxbD>)?65GgJ)At8Nb-5~$F21qJ*-q+?eLz3aa!iOQS){rJ*}5{ zo$vNc`pt`ps+OUoz?z0ykcw2wHrAOZYwE7x!ymsJBz9#U-3Pd{n3e9`yDl)5pSg-S z$~#_z<0kB~Iw7$Oe+8Socelz*rHY=xbvgx!S|;Tnn5x~G`C_}`Eb-Q~g2Z;{!SB!_ ztz#lwIB3BFR}6j-n$!$%Vypz(l8*c9kRq#g?CJk%_&_pMd7dG(A=nkv6=h!@-bojS z22;|MoVx77J;Kb-h>*kVw>!0~ry^R{f5qGE|8AD>e^H0isl!cjd2I=LtqG2-ggEWO zbEmR*!qvXJVRNuyu-9wgF)hQm{k{1rz$KGCHn28cJA+nK8AD{r+ut&4w|fgbe^Mqp z!;O#lsKTHgY{7u`)9L<;FMy1GyOH&3%8LHC&UCMvbiU*7Lp|mnz4#AQasPEPkZ)DcpvdC9^69jk`fgR-P8GT5vX8;< zkEiPmD&fBQV7Lqu2uKaRcFMhWz{pVy%(B#$Pml%NNDxXXYJgj$jjIk?hqWs&Y;*w@ zju+iS*7;6>{@(s(9akH#_+h_?>JriW*B(tvt;Np@1 zZV+O}yTtBD2wz|tcqY(%jW+Py0$){-KRqYrJzHH|yb6B{tl?9Zz3quhL*o(?=@T~y z_Iepcy<@_7EFPV~!U9S;QudWqg8mFMi(x1W6ft^|FPY2QPhcA7Z~(nBl=2kj!mcOM70G&ShyTR0Q1sHJGJk|!#l&9undg5J`%qP7KVnk^E?;XEq%jo z><^9-CpDH0!Rzhu`ye+mXT`RJ#}@n0@>E|ea`m9aP7nV&wZSBcGO$u+TL_3=C+1cT0jP z=72xEnI)T!jtN0^rCp4?{sAPQrymJPKJ)$*YElp*Z6%&Xv&+S%TI+)W6Ut;OsR%h&(YN%UuVg8s?{^2wteySuxO z6jD*HoVaucW^qN(OWQM3Wc>Stz<35RSk0VBkvs5ofH|;^d-jQmKZ_9LZh#7Lj7&NZ zoS!a!e0-YYhCFm0PlSwbER9Iat1DAMuL8;Syk;{!XYG=AeiSyt0eu=w@gE3hO(e7y zKulOZEltxYP?-oUK7ru?LR$fyg4%iXJ0SDLP6ajLar_w%3va>`!7j-KrlMcOd=rmj zzIK?LWLuXlxDXgZ*8tX+G!?LnzYfl>hu&I-jOXgw7e0EiC!SBWs*!Xg==P;k$bL0U zONCa((k5IKv9UC{!}3JUzkacp>7{9|pL+%*I%cg+?iplW506U;n57;5g>FK}6Ym6` zT1REG1)uW;I5x3QyGcXP)u-naowV9*oP6K*y%`HJ`jPcx4`oelRr~}#P8dH{fJ$QC z5pHS6**)!*FYxhm`O>6enHv>x5eMjBQj}(C%{_c z2?yvq4b=f(@KPkuR<`Zc&c7Bo{4iiy0KQ2RMd;eX_2LEP2b@+6i-t{c3(Ay>?-SpP z$iTfu_@Cy@bwcGgu$5ZQa$q79#25l5s?GRCEUq%aK}KT$tWg?pg3z=a*($R4_|M|? zWKwjX!4AP7y3O#OUe;|hFAcVM_z!#2q$!wi4m~73umBNtfd`Vur6}GUIT~Jm`kA1h zg#vlXqe1aSp~r9k}Wm6J4E34lV}>=`K>kv78z6M1;`87H2etEc9EfjVm0 z#r&upUXnDhj|$^dbZanmwxz#EYMe~IH_+TMimkRSl|`?(y-1<4szu(1Cth@-TlOr? z72eomEruZ7LC7~tlpdcjXz||1$gjBGS%0wb}`}}KY;eAxuC{kST;i9qFAjly;-*z)KVD0=h?#RvR(IPY`;p?<((6p zM=5zi=z^D*A3-wAD&2gfj~(zrKDZ1clcAlLar2^dAPlT4bQ>5{k4hGSP1zo=UgiLS z#+5L2RHr`@QBxri1GIl!7L2a)GzqHEmlV4ajgf-L{-Hu>eKx=;DMeM8(7Y~U_ANz% z78NBLZYwv(G8s4X=gW_~$v$X0dV0-fIG;kAp>m|iCST&37qZVrB`M8~biWS_JS8(s zySpyAc!|)%is)0H`1)Lo;?kdUa849t=a6xK-Zy?}D!EJ2^?CO_Zy^gL5>Eo;q7R?W zenUepv!w>-RFsHdYtrlVHXvNuc(*!lu;{m0Qt~_`%|P#$_?$KtK@< zH!IF{Xne(Rg$|xXQN5u5h!h}vBCq>B1UkbU4s`z{&v{?g3P<#V5Jo@9tv!)6{N7-G z+>CtB;=L>y@I5d%u`sL)30fzU7l(DGc=NzH3HlRO3zsbK9lr@Sow46O(p*^r%Rt5AA}M3>S+hJwAx^7~%Pt!(}V>s?fnnfokJt%4*NM(3}m zN#aN_aB0I2+*QzHaKBp6FB+$E5<%|6DgIbdydi&kIoCXsrA+#%#(65vK3|HoZnF}s z)(HCcd88!X-ysipn0tpZs|nlo$!3pxONo(`%uO~eggN|RZ}4Meys>o4*QdBC&tD6v zB5$K2m;p&y?_q|T-rNDmyk;A8@aE6rQ+tdU>9QCjn(*Tocbww+^JMRp?dVPi1;3>~ z9Z9@hH43j5y6b0!yyW0pg*|z__>FKfIrpqOXY?rx5bJ?V)c!e$9giF#L_`p;Kn@U0 z#Yucnw>$8|w60h)TT$ZowG6E&&xI*zd4|s0d0BmL>V9kP?$XLh2XYzpQ$r!Cc^mMm@F`G^+B-j4TL?*L5-cyhJP3l zco1`=0PWtk^MI~x7@JO$ISoose0KS$?^bYM@1*LMHZ_ZzLqwYvyluE12lje&xtNTUD4mSPSV%>(=lAo?KV0yj3p z;m!j%U>=z0wkLgUEJU&GfR3RHlBJ?_CZsWjkP}?k#$RE%AxWgRiE_&B&2CsZC~=w^ zd(k_!w^=u3R%)~mW$e<#&23VKB4MUHN03N(J&DCCB9F@dn)k1ZDmroeD)Fpg`k37~ zb|nI9&-RE{0dJl#`)0g3{p3wo;hy64do1_9m*0!^`w(S(cc(USZFj|3l?vPUov$pE zqt3wV%LOF`1p^nWyCTVUBjs*~HiOS+ymQPYK%p{#Cv2S<2a7jV)ncMzn^1Z}(caYb z21?xOz!}H5@4yjjj>galOg`Nt9a}H6k z|A28yW&Y;oX5HR`ji8%w$pAQL&K1;g`hKr=DQTP3emkV9tUQk`Q9wTiF@Uomg~eG+ zj6zlF)#yhH%U0+{CB^|bX{v6tcs#F!|a|bc(MKXvMyaZR)QREVG$!x5GZY zIwzdDqbk~3;%erXlvFTxe?)7tD07wkfF+tsU^0?5addkk#H`NJGY`eD(q>WuEMWjF zJ5EIaexQHuI3y8jfp?`)U9lPFFlk^2g)*fK^Hm1_Q*GVETM868X#b!weFX**{QO26 zwk9~x&`?!XCB<}zt$jIS6#~77B+qSgOyl&lnP9X>E}IdEm2*hs`Q)}u7So;Q*<3~6 zJ%b@2*)}|^rKO@$chEggU#CdjrZRrrrp~zcbdO8;D~cH>2c%q z2U1l1DxXJKDFv{BT0WwMMWl&NCYs(oikWw;vg-LJB6EKxiNrhUfqJBbP*2??Rc9i3 zhUZp%uGnf4JHMS@F;6g5V?2+S3hk(1OI|Kf9^} zjvS1F_AHfLw?j?o^Rr*%Hc%+ZP-rEPO#v1Njg(X^N*BdLb;-6}4ZnH+FYZ5vB z>ct|Zg5GoWwG_5z?vn;3CNK!=G~%@t@^!!0&#%%ak4Bb+?gl-Y(D@p1p)H&bkbzfZ z*6wV1EJWwy<8v%rJ~Zgl{nd}l%Y_x}Gs@H}&*fSesN~>JSH-IRhWJ9x*oYiLP2YW% z+A?A2>f)RG42odh1Tz7z!LvxdMCw--@lku{3eBmLbTx;&Vuv!Ut`>Q%1?`z|8Oecw zD1MTD6a)O=FBo7u%opqA^!`MQzwS__*MZXDCeUgspQENV_{hRFHLiep2UEBqcMFC2 zdW>xaN2dVrHS`#=Y3d@Mt3LuapH_xS(g3is)VdqIigt0o4kxep)~&f?L49uR-wT2y z52Gq0+!GmTXh0Pg!~_J4UrwEwt>iT5BxewVhzBYs3CG}(zUW^;(Onjn6`_9K>QhJr z?{MlxXlUC}aIyUnN!OQZLhe|lhlc&YuQIpVbc>x(0ZzO(lpU*jaVc1<&lIT|I&~Q| z1SBBGZx>ig{jTc>>K33+)!3MGMkah`@t2VCQn+gkEH;4DDZq55HAERuJ3UVhafkww zQq$?m+2iBag=JmATB0tQRBWABrRV3$dy0<_%gK)&i>XOy2xFB&W2ncgi610GQq(pl zp@~K=9&Uo?pS}u+OTSyU%)WhT_2W8ekSoH+1XZ-T$lHo2@0nnd-nb0olDpXO)|Svo z<=3Db0pY2jpBj)M|N}Fye(I9n{YBAzH)E6{7pqXqrn1^3X{a1o-*C?XgmD zSPT(hWy;6+B*4owXJ$P2(~rYJ4P{ogRYSIwS5BQo6@I_1aU5tWl9F_n{KF<%KSG%D z+=A&U5DqJhxz9}CXe2kg9K<79!L1@I>!NV4{7acP0RaI)szs@1Ze>)}jlI-*nWQ8g zsGV0fD%yPF99VFo6w+nRVOoRw?5wax<%7oOy0>j~B-l{((mc;F_Ig}Yq_(`iE1z|< zZsV)NTN=G!^%jL{v-`Tir(IdDpQ~AZ0lHGj>y-63@GYnAS3SJ)*g2S zO4W$gmNAOe>7)$v;xp1{=rs~N@unk_+7v@6rD3g9Ra8FVuQ-NKR-`|3LO-PNJ_y*h z9&JmVmZH0Ug!&>2#%)@lnx6pWec@|`^v5&SP-YEWV&+$g2$GwNe3lBS`U8L8aOLGz zN>m6Sua82x`bY~M-Z^DV1{h4E2NBwNEX0+Uo_!sGbF(9p64p7z=hlmIy>&G?^wa%_ z2q2dAynl)L>ix!iU}EA81we=heWXgF?VKy~xhyt-Oa%fM4v9%hdQZux;Cn0c5uJ?7 zfW6f>fM~98M(gZs%~oC&52FZp#yo){IUfd@#E^u;aa3iPdl19_94dw5_IlBIYh?dD zRQD2W(J0`;C%~@KrplfC=9%j=uP_K>Ur5PcFt{@!5zGdQEfh{Y&`@d7+|g1(4K>=ba2?RLz5W@!2^fEh5TALAlY|NhPj4UwmS+6Pe2*2#dY zDiwR$q=Mo;ub~0^PK<@^IfnUec%PNPWOPC8c6QIqD<~VJAdYN&JY@eI2tUB}SaAlQ zgqq>;6`%ur_#mavtHF;FoN#9r9jGg9w+d_umL7o2N-BZ5GG!98yAP z<58gDbRHW$qzSpWh_JBm)vLqXN!Qh>>P9*#%ncXeX8p1drQYoWI+1V=G&JAaY}Ax37JwTza?^w{BNq(hXER?r5W-Q7$M;85`HT~LxcY8 zSzfoxYv)P=KCy#dI=P;IXf0fUe0-#52lAtP@-ln)^Bnk8dQ5U7AbqetbrO1qGxjg9 zp{A{QC+YDA65zVfV2il6#gsKyIdAU-`eP83WC9Jj-#h!T9pZ?E9#m-apueIHN7R!i zPXMM6?D`2cbUwZvdJ7ns4(Q8Q=%sasMNTS3h`+1-RnOtxcmyu|WSUH!=du3RZs+vQ z#KH!G+6*$#g~dFFlMow;PJVe$)a3@RJwa4lM8rb*Er^g5XXok{u%0BrHVn+z{}Bvc z+oCQICh-1rF1{PQ?8|GWR<_*36@4*Z>$|l=Ze@IWc`S}v`pms!4&+1L$on_E_eDrq z`U~%9C4>Y4I*OA1Yivk|&WH-r1EoJe74$eyGY%Z$aBA|kQ0Xbg=FYc#6G?Fe#;cXp zml!pAQa?z)D=dk+?usOaG>-?#rsCG&BIOYhf?msMT+I2xlWbQN@z&wgshf8&NCeW-|_tjB2NW*bDNp@c-Mk8FDKU9<>jp2~f<*K1=Ec7ZmrIHzAZ-6qJ;d zyx(aV7zE(eKd2Vsupr9HhC~M7J4Ub!o$2rhENWEg1qC)uNgAL#YP&j~Sm}@(Y zcRD6O5n#&pB15j?GH;&9F=Z;lrch+QzoGrh)ZCSm1d>Hj?BDBnnv>pDkVakBGO=;p zskfxm=B7sP zjso{1gyiI0jax_O^nx=0?4zJ_g`k@dEcTRC#5tySyF!G(ua`u#YhC8P-|>r*`aaT$?q#^b(en(|q`>dY7gebGeK`y{BLdZ3F! zxD?{>1&$F&7m@{pdCY=~SAtp|+jTE5$TUGL5Av`3T!tUo1!P4i&=4^o5j1i(Txm%q zF8Yz7thD-|<>WDs@JUTDmg#pGCW(2D-;yr3sN_^#V?29)3<|buUc&goQG_F)sd(n} z^eADyEFu=}7#bW5s3q8Y@Df_zxF6|p5QnMc+7{$qz`di9hCmGM(~ayWlPdi|eRaB= zZ9ymGvt&Vz9d3A9aC`v6%}bFcKMvM!l3+gvX&tUVS*XQfySNT@9zaXh-ohp2ele$i z4oO`A|7EPelHA#R4O?FgDH9aNV1jE=YN2}(pEC(FG1Q-oNl18Q+}>6Wk)nuDI6Yh( zCi}(2cH!Wujmj0u&hCJPU}qj^`5e?2L6;8krgO^lN8N+7!dmySxb!21xX)qJqd3nRBx(-Du-;Ry zi8?(X5Vep5WRKt@l-4Q<^8wteXY0d@1{V-cOVD(sJ{uKaBtR|1q+}KFSbqx3R5twr zK`K%ZSf(+U_KpO@7sw#BIQkqnKsFG%IuMCOJ`n9?W|YZ*&$@m#`91Z>5sZnDR8Z?5Zkn)N2P(?}nRHavgQxJpAXR zs``iR%{l0Gnw0QHKs^H^PqKj5Ds-BM_4=X31er4}(@=lEApW|Xi6V!{MOTBR36%wx*ETVw7~oiB;(U7FB6<#oZLOm|FHN znx;Ue0Zxw3lmvwdSgSI89^nU`F+7piTOps0%!F4&()%oReG_8lK3-{5c$~H-^Y$g! z1n~2YA?ZONf0rK|mx-mBuC6ZLJvZi(fD3F$yd3gHPAH0HntMsR-vL{i<*@7!pe5bI zk6koxQV1t$3_iHYeW)JaNed4ThxQzJr9$&0_EiCEWj@ZvqgARYZ10A@IRZ! zImhrS|UvVBr{DRo|B+CCmagieyw+_;Fh6=3J*wg^DSWU5XfCr z{r{abd1E06+lyTGUEXr%>!Wn4Ln>oN?KoUcwndRvTszAegR%nj7*O7mjmTBmM-v*_ zqLo^z`0=-GQ$&&o6&xnmC-4sC=>@%$ChSF!R>#@ie`zc~SYh$PXiz{PBRjiu>L}r1 z5bTU)IQEfLJx`OBl@*c)_GdpgcW9W7+t%f`J*#pu zJ^XhWikz18GkY$UgD}#1&WF^O5}tN6zWL_b5HXs^fd*LmAf;^*3|F7YGVOji9Cbw4 zc;J3f%Qd;S@NjXC_G)4bwB5l{)rdUfJQB(!m*Da?A>bQ^C)7F0GO(X`^`5lqo0!Y7 za6eiX$y%!MM1xFKW!TWeP^5&A?Z-){gtZ#IY<<(s2{X9=6GlhIS7NG6){|^2c7ND) z=4qE&K=s~W0=tzv#VgKKANS8cLP{3l@`j4?r@2lFwt;JG2_$Xg;?dN8)n9j>UU1lMPB3XqlWp zfBsJy+Dc*jEF*soYo%#&5_(fmgf0fAMYkG(h`b+IHa-7j@`Yi7Vg|aMpo4-B^^*XB zfJ(G{>?M-_mSCfD?XuiogI?yG$Wp#aV-+K^ha)=j5= zOj%#&K&1wuHQtcw`6nRu2FSGB{u=Xt0;_=$-4h5S04TV-Z*~gF6}v`8Y<|S4X2P>G zg?I6{zrRU62Z`hbOWVVS_pZdZBT1O7fdPa`J~v?nRTFY0VcOQfUD_8!X#>i#$bLrA zVdT_}iarLHe~ytVi?hy203AoZCi2SsHrr=d26fd+0V0F)7l~>b4j+ychl=fH2abzoR?p7_(N~c#0`fU0GF);fY9gl!xaO*zn}3Ee0Pa49H?*Ero5HXoQtw#m^Y)8$@`5t6YdRg1I6r^m6M@%)@N`HZgbdH5V6x@%-fQ#jo15njet+aZ zI=3iqVG(<~lL0S-KuYTYFVFZCn@SHbRpzh-J&fv_s_!mPHccLJdx-L-kp4gM7Z$g`6SKRvla^<2@NZt z+ygNwG@!kraq;ic8Tl`JmQQ_sDbDui$e}8sW;dxSy%J$IH^V>pmc*rijIsW6g`=4kFP@g-Si9Jhn!flUH%UopIdn8sFY*}0^A^k+aw#w>M1^u+7e$Xof zmzAY7=7?4`ws&2Y%_jkF$yL4l@t%%fu0dT=7Dn>MR|lA#AH@J$-qwpJ8Vl_MdXaEW zAy-ZZ5`2Vy-TyXw;2ye+Lb~T&pE;#Z8l+ z-ulqQ{l5pD_wY9dacDLuORK((YQTuxmZjlWaRX@L_Rfx=)%U_zd!o9A$CB{U)FLtNN>Ht5%`x>;l>WhUG-3Ai=EgswWBo;_%;wlzP@}xE|psXoJ}k;>6ohDsuQ66)>8>hpw*_KbC+(N!Mtw=oN1SMX;av_N;K zc>~Pi1u#3JJT8aZ!h2?dk=e#=Y8fyR0N+~<>d8E)p5d;-xdM`TaLBTB0MPNYFXUkq zW|?r@mC!c**K?a!8#grV(oKp)8os$Is>Xj^dKc_VKX(Ure2d)RF+jCL#W%F%)Ng|= zu!cI-)(AMPXBv>aE^ocq^DOlk(!q{OGj`pO9P+6^I$Y3Ecx|V{ijjq-u$(lay77%X zcA*yPmNf+x4UIuT06L%l?IgE5g%H&IhBYVJLrzic~rf+8zwk zk)}rEN~CULLTp#Z?!}9?&b}y% zBiR;Bar?gDD4e4GH#LBSg(V`kC^HuDIZ5uTtsrR5==9^U-R_LXBJS&Da+O-1D|2UD z>;;mthc?<8Z#bo2-OV3$8~IiKw%QC86Uk!?vNbVPFOOj6mM7xhUhp)7S@DLU2>!xA zwe{+Xh+aAS!nNk=_(V{HfYVDIM}3*WT?i?&kAx;nt;XBZ52{~8%Bxf1D{D=F07@LJ zNhFe&PFH$DE_)Z%Ej-*787H`R|Nf>WXnWo~wbD2KBQxJ2lni%#+xj7KsZ>e!w^I9* zB0+r*3!4?e0;)?6d0OVf+iE|@Ozo1LN4nxZsIJ+fa*d#+ERBwD@1v!3H5&4{NLgZh zC?}(vp-Z`%0J^29t`Z~eE|*Flt402r%!pw2iAgd>-6>wLkD&LL!9#lSn8Lo;6PaS{ zJYDAs4D|qVsbA#?U5>=ZK0dd43x)LEqhqWZ^a`-y)j^i^O9o_tskD&N}>3}(0 zJXfpQ9NB7xsqN_%J;69i>%GKT+_u$=hcICT_I1Jy^mVpE3Xx-OG5J_4#ETB>miM-C z)-(Mj#McFfujuESO9zfKg@h*4-WBDav!}N2Grc3>EN?a!RI9@nw~J%Qyb zZK@doSir#ZO|CcrOU%gUN(kLqWnihJZe}C z9(ry*X_dcKx01g?o3AzQaQBNo6>5#c=@dB^Cxxq4Pz76P}sfsSVgZtG=zyPG#;0nJ3w22?6K(B`61-QMZLWATKxYwZ8;Xxhn@*gsbvYp? ziM;;tO)9ZeXZqsb$8P&dm#Nlr7JWV)o*E}TMLuO0D+g^TNNL0qP3CZojq{7Q^Ucc- zHeXSEv{2t)Cub69ONhHX z#ySl*me@aiEe%L&Px2@ZRUfV=JssLSS#h|A$5Lv8qk1Yz4?y%X4hgX6&zvHXU8#(TTAF; zM@;rQmOygb)^;`KK?o$R(t&zaj(PBZhK7a^d@>VkucxRvZ%sz`7Z|_<$(N#2Yz-2R z!NPk!30|D#VEh5Yj#>ZXv>D{LBHh+@_CTXW_8i4;K$$yyBw?M0e;cTHDQb!jO8^X^ z%(7NiUSqvIFtN`b`T03lt@C_QbJ>P6L=@!T?U@0=gtTgw`1WDo9GNCM^nqud`|e6J zBw^v^=lRY&1aS^H_t$|$=KJWsklD+mX+qftV zMj#q}4tf$Rjg*66cg7Z7<2K5;NZ0T1xcPwjAelUGcHN8Mb$_eBQg$}kv311~QM&+f zbaBAHHyvYn%8%k>;DwC-8)ppq=5QSt-|oe00!Gt?*?p3!YsN12vK4uIz)N<~U9^k~$d_ThU#Ndu0BbMS)oNUaBm!i;S9m4gjCQ}}Pd zn3n^hzYV(3;H#Kh(oqRn2bCNaRA+#;*oyGzR5SS)LcKPtMrzi-D(NsvFD?wbE!Aue zyV1UA%Djrp>I911$X18bFfQN8W97NQt3h24T<=_8UObQ6cldWs-O&Z8x_iUa8uB>o z23wy2whX8f_JV5LVV5azPLNJ{1ms8{>PajuEggIT0w3V4q1X{y?~+O0onZ9>zDa>j z`C^;Felf+*=RnPC7aS40dX?dYJlx~4rb!h*wgdsE+qGM^zUaZodv)S*j=1 zV56D{--cWv>EiME?D-F`j!5ErJJ9cwV^~a95}c)BH7W1aXo(k@2d8v+?G+rk*7h60 z7yY_7v+nqi;``rV{JcbOz`#`}eBU*q-#mV6x2u`K%?gZ00W<>Z8hKqMG#Yq}$pBUd z6K}o8pH9I=Qibc&ahm`B7)+|b<#_2w#jOtC_mfdN;P!ATw0RBTX@MmG!lu*7p?nkn zuo7BR06H16Z39THbjmWqB;j=fWCn=0k6!850B*pqpLk^R+TjEPDo&CUs1jN%m&^|mju%^J4w8h$8Ozu3GV3i0L-TK7k z`S|n2OvD3G)N$S!bcO+13_l3@$*x0qYH(z~ER`*JZ{C!v_V-UX3;O%#Jbv*dZvk5|Bi?;2rL6l-GHb^(O5I96*Zcptrj{`Ee_rpv0Q!bvezg47ZH2mlPj` z$_>MbHt49aGJ^QgFkqCP3HRNE0N3G1C9l?#ZfqG95>0_;LS zyr!h202*?0%`|!F;FnZtJL`I9nTimdDoX@{oJXF}@R9#OAibz#%L8TD`HP88!!B6k zXcCOPyu1LER9*+3vEsU(Ta(4?-LR1#FO>GfqWZwqvQ%A$FgKEaH?o4uW(j2OJ4-KT1$?mJ) zZrwN~?GC(0o1+Xs9A$3Y2!^u;2$ z3~HnRaf`#n;!M8@wZ2}9C+4{HC-3x*#gA|S_Y*L5GlR++N6Dw34;Ii)7X;(mR;lEK zt*TgkW~BVwZvqzwe71n?35DfZ28N_IK((>5OQWA>Cvb~d%C&)Nffqu_>;)DDawgla z^t%I#(0b6YH(M}(8eBPG77bJ%7^OYC;~x+(c|=2_Klko~goQz=a}>@9GnesTg|T1P zu6@X9WbXsHXQ2%CGfy+!d9IeP2{7G-HYMBV5PH#IYk38Q%#jtq{V&eVxdAwj!EL?> zp{!3O*mc0BzM|L92tKE6oK;o_`+HExf)Rx61H3h_0eCpYis$N-=UdzK!+$_6VdD10f7Y#jm3#A* zG~Gj2$GPZ4_DcYZNIzqzJ3*%-0cM_ePxCepb*Ni1f;EjWzQIb3CWNmHCSL(*+P5nF zDVXL5=SQ3c_>?yiJ-{kYdQlg^-;d8;1>_gsn{Q5xIlyQYaah+43Q9>5Wq0bm`6FTzMi zI8X65wcsBOgHZ4gvZn=a*{0ufGdDK!Kn4NsRu>4s2wf^Jx zAiy0?L;V%P{yyj{uLbW__@g^{n&J$dK-YQ%G5RP5*(<=qFz?C0GOPnk5{UaF9Rm{ zMYYEZc24T+7i^O6kCNxZokH$DN)T||Z~&UhmOxlTA_9_-BHbV`jDmK_c7((hC8iPf zfqRdNAi(S(kA;5)%=2)SbNP^BHH?nFruYec?HWiPIz^YnFpwp_UxYubUi}QLwK^aM zK`6g-74A`52Xekyh}=NPUIPZ&!PBFhLNjk7Oa{NC*1FgS-+Nn63UvPogJ&rzn3DeD zuu6;@x7wy5)1O0w`emU%N%iy5sZ((or4I{7B{^ZCJa=>D{l!S>C7Q)T%u*#w;ntm#agWxnv3FYsu_L%@8_ z8Q@;>hZ>R1<282F013m$?t`VOTd=kf9S`Qay8MK^MP~#EYzW&ANxmkdllRv%73Ad~ z*6nS8dm`LIDHGp;0?QSm>D1IcDg`10ArI64RD>DfL&iwO32} zB%w@sy*z}>^-!;szNGI&WSHB|Z*==ofNV?T+FOaWJuTi5Ey4Nf{jU$GCxX71L2-d( zdT=^IMr#q%oigh|78Vu&o#)R1E#H1FkNSDKjJ1^D&WDDe19!2@zQ6l4nu)~|Fr>NX z{sEtf4<8bKkYPFxg8tfhl|ze8)#LOgd1EgGhn*qtfq{C0Eno<)Skkc5dG#XChMJ~c z%g*U?sL5-)1+cEXhAG8wA*vdquc+WoG(ip_3*o@NN_zvXC3q@r8yE*c%KhbV zE;%adGhox)ug#|;BP5tx=V|(3k4L|CnQxZBk<}jrl5!AhQdmD2D8ZSEuVh0BY2*7A&{f(lyX>ULJO5-ph4ybM z*L5D+e^!E^iUBiL#BScZVNC0@22Dn&e9UvvrD|}E*`GI+5QXhP{Xhd%xDIW^6g3KI z@P|XNRkqYO%Z-8HC$-o2~Yx!i$bvA$& zd0F0(R%T``XBdb0AY*|6Z-^~xmE%HOT%2|o4pp!I@>Yf%mw@i2=(ge=Ml1p0-|sbT z0vGZS(CJ)Wi6V8u`B1Uqb90Bh)0orLfRnJf)2`ok7~I=e55w<>MY8$V!Ent3x zeBVDUMwH|o7!aM-v+stSbOYl4JOseKDX)Fg?ysEY;NxbnzZwk`ZiI?kpj|q@7vFG=O2OP324m7?ycXoM!|G!ftn{=eNoO`Lv>Y4gQ@_nPiBGqPiUP z{IlQ{&Eeu|68u<80`~X!huLT9PrRNwiC>RtQpo+jFAh~TH#aA$n!@mhKuHI3WC=(l zliMaMe?DV}li@g*R}Q)|Mt(&cSjqhm%M#Ok(w1-9Sn&I&f_4o{N-5?-k2F7+HKW_#JL(VWXO@CM->`UI}CR>*>BAMF+T=cvxN2 zV{sXahfaE7@e8Xpvpt_pk*ak?)Scod!p?Itrs^c>`Q=#U&ziR4ch}F6AxPAg!&mU|GvvTLthYQR z&0LIgl@WBi46RIE+tv%nae(C9iO^}J)H1r7`#&ci z9~RFqr{xTi!TJm?BweO$y57)I(0GZ3bNmT0!~5Cn9MF|nLMl1f zvgPGgSX)BT3S~p=*}I^PwwqcUBY2b#KQDSi`&& zD*hWth|hr-2mXeqq!Szm%wdR~ciI=u@9)GV_sqx5w{D0#n3*Z+*RC|tLMH_&f-dWn z{cxE|T)pmMkkh+e1jPOMl1}}vrdO(1H>u}T^w2APSH!<>(M#sYGNsH_PUBLEKNJ$b zQ=1@1@DhNrE8^GN{iNb{%g=w%e9Nmqq{Cb%Kl4&ZNXYP`hU0LA!?8zWBe?blKb#(6 zV}JI$sX3H(9s5O}%v)|93O%r0lv7uQAO{m)xRr-Nh#P3gT)sk3@54=uZ94(&4bbX1 zA)Np%0X%diSFH`#PWb1;*|M2BTyk!p)pPm1D*22zY(qZV3b)#BTKd7K9mNb+HmNM5 z)&ZRy)o$WP;aOM5>O}0&r{PjvnbkF!%l|5qe z8zeBX-5rYx!?wX&VPR!;tAe7IDY^3~2Jm5k6>z&eP5n34Nv>mil{(H+Nb|>Ss~nt) zwnIlH_Qg^R%?H#eE5EUn4lKE`N-r@%C0z|wBOY2EU&D_&3LUhY=#=c)V&^9!hat9V z=aKr0k2>9L*T;W9)HG?`CiRj}rxDVL;Mc6(s{Nf@W79H!s(sM9e8^HSo{kLv%cF99=8NPGSj6{*3=os9~z<^8E#3O^>k+pWaHx z&4ODi%6px|f)j-&BsqfJk`=uU4wxsn=h-`Ge!Q=|p}&N4MY^<*J*Z~FqzNXK{dW-Q z#*?AVa!TURDm)i}iaJ4aAv^o*F(Qa!_rv|@pUxku!z2CRJMH$xNj0069UpP-cdp1- za21w_&GXp((K3J`b7YJ(s(m~s6H(`xe$H2o>M^!&S(tT4TM*XkFUti0VC!`EUB!I? zL__2QMNez;aqkKwy0QS+4Yy433uG&NA64kq4BRGF@J~jDC@9pjsH#Yx!(RG%gDN|* z@VuqxcO<+9=X6GX?zKcc2@7aIuWA0zB;+U%;&8KT{=+;2Gv7vO>;fU!!nIG7hohLF zkQ9t?NuiM5m*0GYa0OJ{#28BYpDuok|MN**4~^{|0HpK!<@KhH&>zSPeZ@3s?bif;nJIe=v(CfmHy+16&I zwMMR_zm%gQF^as7{kK=*Nwv`Xj`EgdFjxk}1>SsmHTZ#xF}@@5Q;qBdnh=KZz^Myl zJ!I&qdAs3))P}eD-;iIQt18xn>kVbtnO52&PVQKw;c63Zjj7VWz(8=lW{SCBumYTs z5euxDU|A;V!0YKu0WyFM=@5qP@S0Y%&_snF+<1{sTk)T6ue|moy|8~4p zIkIj0SeEX_S6AFz`y_as_++V7k$SF$NkNXAu=TUd&SKa4B2SHxFt2V)GH9_PpvScP zWWs;&#S;|uC&P|M18sp^Q1`0?jD{FO71Tpg3y;RWK8cspz=z$UqhzdUY+TX80c8CM)O>c8h%M}RfUZQ>ubepb6Bz$8_r1*bF zl01$F@vV3vFM|fmvL#tJ@I-K~##B;dhv<+{rzziX0pkm^A*Tz|(z}=c#H8uR@?@Cv z0YGw%k^vN&`&9`60Tw$n0A}%~)#S+q$2qbiyB=NRHakoIXNUv^F4ePCP}eOVyle;U zN3cTUPPsn2Ak+%io`0Q*GE=DZ|ZCXy;23N=z5HzZ47~_VUPvq~-hhh&;Wy4z_ zg6fCWgxd2M51Heo3C} zrFA<75T(vy`UTN+hhw@)&EGc`65GrF8Tp{RNB*n|prv~FF}}dw5qk=MEnkb{vxPTw zdx!U57=9-Z!K1}s8SB6Nibt*_U`tKi236FJ)kBnk5AL2j9^IHyNsJ9^pD%q)`)?ga zm$mKCDm{QB2LNOn21dgoiPX~2j=p7*q1uU@E|0P9K~leu@SSdRM$h3YUyq$M!9)Gv zQN7P+W?P)22+MR9M3Bb{WKT|6T3B4y*TMj-0`AcN{5?O+&KFoLcsRUpoGm(+uy_or zN^oQ~DKLIa81PJ$O}z-qXtkv`L@QVYP11* z?RuQiSWBtsf6=i1r-&69Q0oEC!y8K_4Fw#23xR`%Fk#dQYp#!B|2b>7JdWNW%~|{W{dg*4u2zFpr%mVH#DrDFXgBNV4xX4 zVFLp|(uLR-RuD*@! z&!@SL1OtmRF^cu^T%|q|=wE)p05l3P^ubImm@cWb?iM3nX}Ha7%Aq#xNImaX|6}DV z3I3O%sdps+*aE4=70SvocHthdEfVQ-j1H<_xsNKzOL)O?!&I12r;meq2YyggnKQ- z{}D2yMo&u5g0PsFSu=fo{kG$HfKS2seO6qDR=MUE?)&`&avVgOk`Y!G#qRk0ui z!K(%vzE8{?-r`Nb^NC7 z;!2~^*7`{YwdvUnFtb2SM}*!FYjbK@S*+-qo_(&JvhU`Cps$2V0E!Nu!V`Ra+o@N2 z+h|Cf(x!EEbUdUH!~Kx?Ptrkkgw?fZ_pf?(oWSjL@M`NB`!Yp$)|r{zz_sYfCeg0X zZ*Stm;^bDX_c;QQ&hKIUH#4c7?nMN4J8xwA3D-xOvG?d8r`#ffs5GHQV#6B;%VK8s zErk)1es*u0@3}}k=lp{$Qhkg1#IPo)ghzP;NcqpZ?L<0M0Ov?`R@u^?g&t`|JLOM& zLZxuTi1)5xE`(R0;CDz0Xc7~Lx2!WL_-^@$8KQfV*QZMy+6T0bZ6j2h#6C?}Rk&jD z-Cnc(Du6ZXz45N@X+E79+fm*R$4)4ZmqJ0$$Cv)WUGW&QuuIX@+c`9ZmZnG)6B^M$ zTzH6wiGu+5-n!`huAK+Dv}sX=R-gF!+8g#cJ8u_uJG$d4?;ZYNS5#CI-LHv*Qu^0g zpvKvZun0vac3D5^B0#;K#A{;l`#2qyID7UQ_Q}X^p&v%{xi$yyuM$ayGbp3ta20Y6ted*`^3kggm%kTkonHp{TZjVr|3vdlk3`sgtJ7WK1u#DTe2w^q7jm2K zrLXx)vos}!Aeg#{GXc$F%sQmbPW$}^xQN=ueD=S9n2i%E z(+T`-M;1V*+C+zA&;6`@P0t%ym^BweA?pJzT6ge?~jbZ4`6(i-J(=DWa*XZ zb9Vn(@L$Sah~P_q0iQtXa2GIL_;rJ|44`FDz=TS|ZyhscA5hT%N+^3f%8jnb3c@Xp zShF;WB;4vTG1wlxNmqTBHnSb9V-S`=+fI!D`{$!>NQ{3?09RlQrze>P-4%LUJ%ybb zO$#8Y?Czx5bv$e8($qa2cj>;^Ol}z_PQ7rK=96C>IT-x3O`ZP(%WT#U%HN#4 zp1DXslOXAZPTq5fPn1j4?Ye%A)TPxQIDGvIi_W`pS#ekLmF&CvRMZcmw^kQs0K~Wb-;{ zW^#jr3SZdioYZY@>~1epoqjCp%-rC=;VfGxMRt=V6CBNFKU(Zby2xKc6xjT;8$oQ< zmqwEvza`$x`~(l^_QJaQ=2}}EDBnuY9zxRFyOQ>H$gDz z!nec6A44~=01B-8buJdV@mRo~yJ9?-7Wjtx?%6eB#p}JGyX_)+^4fK|-@`+-LDP;1 z(h->;scPusQoC5y5;)G0jo6dR$mZj+rct*<>%9o+V+)iw=Cq%m;ssb+)I z>>ov-fojUIwrT zl{htQKg{NK40NhjYFvc;J-UW7ENc}Qd#+3qFft%_?tS)0hC<@pEDOFpTj&`xuncJl zOtpN{vp3c(@tmVpk{e8*Z3JlEoP9+eRrwtuQr*~!wz|5yY?Fj{(U6Rs^}>SiyX*UX zKWDS9WDrwWL4VtjgPrs@>2EpFzfQN^Qi`=S5bbeHsZvTZj-zE9m1|JCF&A2`WU}eQ z78xrt_tD+EADycHe9V{q$yc+v`PAOVDX;vM+GdjPd!}l9xoRwnT@6NqdIHR)3=PTT zyD;jO8NApPQ`=U{L0WM^uOdv_%1Y7HbVzWbkxQr8AA+2&jDhTtv7DLy48pN|pcNAH zLC7@ji(S540TqZ9;B-PG1ru^Z4UO;6MaZkF3OY`Yf~5G$(@tnm2+|$urwy(meT|8F z6$JO)SsH?l+UQ4?o_CGgsD2baqt1jl4rsKjyy_ST;y9y#NDswJm&&cWA-PwBny4Fj z$;{hAj*+JMV*Y`s1@9j}e(?9FYJ&d}o~bK=ZlXHiy%5?K1M&Sbk)V5MkHx2a87}h6 z&?E;>&2u`^seXu3U-~tM%aP0{Z|o8f zaA^PPD;GP4wU9kh%rE*fB0~Gi(*xj5KR@2bZ{4r*`syvdGoqsTu-%uBSK&2p|7ttZ zZmA%RKO$tZIL8!W1P~}NmE2%FgF)eEsxahE3E(?)$RN*U{W(wO&0Y|55dVQ3p!+qp zj+27Ib9f~S*qXt(A8@*ovNEfbzfE^#bUY2e&EU87JdHOBc3N8`(`h*M%G#B=fASeq zpY7x9JPG90cHF4xnF(3~b-$(W4vR{=Mbzzk|LG ze-Uu@#|PUg@+Y;lw4k}#dgSU&%FnhoBM27fXQu)@Z0jotwFs0ef)<^nAbSZW*aqY> zf)!oePW-teo&j1X_pYuklkBMoN+VEpICa~>kT#Ggsi8qo@a);Mk&coDn6TgYywAr% z&PYXUR;;iyPjbz$-^g~s^>QLMXr)A>KOS7u!`u6p&K=7?!8z66;km6RtL!e3&nla( z3qY9ah1F*@bS+B+q*4iFcFuUb>2Y?xBCNOJkrCJ<6W;KIaP8`mO`A4FsjuI5>}Ail z)8y3~c0{eF)o;*#XDO(yToECON%NyPOm{`1yYCL@v4{&+K>^-99I4-K<5jdVFxl?d zbZJmZ75@XmR>GUz7rP@yHa4AOGILOce&}G}-#Sh;@>aQhRy8#>?qU`e77bObr=;KX z|HiziP6hiL9*|+$7UHX_Qe9iSmAN@ixC(B5`mJ!UDgOM~7DAAM2ipkUg#d&weFZys z&0dgDh-8;`6yqA=f8^+GuT{l9PWEvCxQ^26#bAAQ? z74-6(m(bK)VY&BYG5um}iD7TnM32ecL#is?pm48Tsr)XFTwp?9jV$GV(#zlfRkG`P zCWKH4O*mmT?!TarY*?qqdNndU{D7MomPerETx6Hw*NO;YX^adH3*qIkE0x&2v7rQ^ za+8!qfGfGtYjkupIdG?a z8OIloX*#yUYLWFvy3S;z8kU8MB2Ja3^@82xi4!NX6OM6lK^@WXgjL$@Q%Z|d1|&R5 z&d{c)CCHO6UAlBeL`0QC9ySh^mX@}*X?D42W7z`PDTI=-EVMiMUe1dy)O8XM|Ipo? z>4bhI_R=vN7WBS+mikUk^TcLwoVK7>#C`*9c>^Zw^alk~{bRzxy$nFy-#$be;(rD&B@Tj|Z9kakBv=FHflX8O6 zo}4U}do(-vU^8zX1(yPtGL5nov!|`c6^U|B;>SWac23KBy3q0jn-b2at?(JKL znxKffhS_(w{m9q#EBEp2Zz>-P>%XX>5t5#L9j7FUy>*V9dBn!aDPL2HVRpH5C=u0E zzkhaJw0kP3dkuF3aWgaoK072|93-qBYgb%br$dYNqHk=xVeMMtyw+n?7(INQHuvTq zl>-%(f5usl?QKIg_2bvIwe@8mxNK))LJI-nwv3lvLrV?IhCg3ZtV%pF&j~)lD>A8U z%9i02ZD$h4pMOggeDnn21q`X1QqAr8B{Y+&SP!5}NXTjOHBHSiJGJe3w38*&iyx_H zn7T4&5v!)UY5wAcV5dcTZLLC_!D->8Y(IEFG2NmIdf#x%&2zU3+hP(D7`>i9-wKe* zlGiDi&8@z)%c5S+jAQAON++NIsz|wfk%!R0Er7%S`-J#TFB86?A{qzw_?U@eg5t zGO!y`IALhdOGvEX$%gC(H$rSeb~^O7>XA*xaIdyJx#N)BD~hLQ5T9i?WQ&nbmdGWX zp`RjpH3>V-KHeuGG&`90Z&mdw^}8Dx86(C2awA)G(*vOFx0)X9GRYeA zwwtR@GGJs^cx^NE1LBaG)hg*0dWwp5NR@?f`{cROrm&nR8>h8-uV>=+m-`N3;St@^ zV6-)kGSb1xj1#{4m7+NgV!^S>%TM-868`Jt4}Dh7kRPI8YvCOvYDCK!A}Wpya_Vkj zt=@@U8Xqr3ChgfHx&QJ2BOUcCd+OB!c7J9+xBt5oH03QABxjrS|*Z3(5U<7n9`nk_%u z+i^1w!nWIo?-Q&TP4GI{g}A2=?AsSUcM+e9U6S477>IHlLRsoKv|{zT!6e`f(*=`f z!-xnK7xqSa9DWF2-e?v~cW8`3YJ9n+l6CLi(fQuL-eZ1BS)?}nxp_-HPw?;vBmBhO z5X5h7%wzJou+W`CNk!x=xxb=3T%xM@`Sa%p3r)~-hg4o(K8&N<32&E{mPWcHBQrER zQd08#s7O}%^M(%UvbDFi8+3AK$B)rIdVEi8%8se_0QL~qvn?#(+p_HhL z--85*3F{~>rMbSyIe;bFfD8kP`H$&;7AV!}KA7j@+{(Th%ulF-PTyHA`TWRt{Qj_w zKp*ExhshfvB6)-y3egOL0psS(wBX=>C*od6TO7S|>C)q}+IPaeR(t`4KAbr{@fj|( zEb-&mpm-zTK93*6_@i7S;4gIBfLXfe-h&6f7;;Yx_uk42l*qlgeC6yTGlp`jxb-|( zqi1NiZtYqb`OOwZZPOawuV25$Edbeaf7v+}_?0@(5chHIYmG<`;3-(G-)1T%qoUYa zQt0XFv&TI*RPAK;?0~#OLR=h5=yR2UcnoxYAjXDE`zy>i5Im(}u+avfE%0G)>m{Ws z7x9`VO(wul>EvMH!*+Dlf-BctTf8xDT|25!bvCQO>Ej(l?ddAK<;j(QB~Pa`<=$2lK;iT25m;x@=)P$1>vnw0VDbEgCx9e4%{&#EGOP^XRw@uIVUz;W24$ zESe@{oSPXLouM%`nmB>%2bVVNVuO^Xh(dsCA1KBfYE1*;_UZ50w>OEu2Gs~oY2P2e z?%#d#^&eFj)y-4l)Z*)S$j5DVw4B%};AaYPsy!+P_V3%L$nFihp0Q_H-NZIW6eoS? zSGN>$BtioY?NVQ)vGCJ|J|~oZtXrLjt`^RT!$e4flw}*AMd#B4mn#D)6bi6hZ5^G3 zZuy+_!S^(4)@_AbT3A?E3y%JGwq#c(+9;0)rC3tdjGu)j{Q_tsRlBcu`eV)yc^T z>Okg5rRV0&o6#pp&mR4SG9i?$w89sjK79*82~vx? zOg0l)rT)X2S)Uu8UqA08&??=O)&^II?sV4!mm?+vr5A3XBIm`6?P$kkU)<@qbhZE8 zd86W%j+D@T(vv+LnfuzL;tIQhxN988wcFIm*EJeX$bX#sc`gAN1=N1>oA&YX)iXXB zWkMS)53t~VMc6gf>E7my9lym;SiZqB-bYt_T_JisQd2pEOTEWzI^?W$-nptC(GM@V zq}`{7jDpE8v3YYKQy>|qD3c$YmD*7Xsm$-Y;U-o2{r>5@ZKP1jFrFdnM^$?0eEXel zYbJpW^uCN4yS{8~3Q)#!C6gm7lA4raT6W=PS$-dbr&F;xWEO{7E6QGRT($O)C^5Nsh@pn&{ujr4{F))N$?(R6gi1t(cW$pOh?S{x* zieXICplH)sd<^S90aFRja-t}qjB{=;W%mc9@moi`Gn4ls?s-(Dm)ANJ)gb<+|FrV* zvv6?ioqt$4^B|p$-ZpkP!LLWCB0W@SU?w8ZnQv^3&kqK#{Ixs}lC35_b;iUTq(`R> zQ&ZEwUPe((^FwFn(?n<)B{lc_kxnDC=4Jt|utac_yg-K(++ zHWI*`A~)ZLBBq@i&S`3fQ9cwDFs*Z;@{Xc^>$)qq;?JTkmEfTG>sQ{JO>>ZpEl*GD ze>d=A!(nk1FQd<8>G9bw%Vp=Y`vRIC?(8m*2AT=)R9zXU=qSZIE_U?1{!o;udl!*E;G$yPhfDQZF|?G-;M*=A(0!k=Y>* z`lFrec=pEoZ?_cpTrI<+^3U3}_a8poAofhjz{p6J$^S&$;iVbK($}pWY>5yaGOnsu zeb`5Oo1)Rt>=I!5anj4XOt1Yky$ki20yTvqpXm|k^0xZ&R8fmhqW|C+?b;%x7d92& zO20CD$RQ;yFDH@2#l`soic6AKuTdYrddxR5?&pq0NdZ-GO8!<&6Nxl~v!k!957q?g z9$@g&Pw9)Db~aFzXQ9)4kaf^$XqDGx%ktL2;Ly-BMtk?~pU#NC8sc(@bdB3D>A#q=+KU{iIE45c17C;!t&pFbV zO?tfj!}VFyVp+CgoPGa<*K{4WGdLr5Mn&xXHg;q~nVIl^a1+zlj|qyQIoq8M!%*EL z{^Dm=I4?o@bel-)WxO zxK+wkSY}%OY*VU421Z6!l3GGaM8w%1CA*0D`1t5(aWcckjUFH8XIZ;`|BXMDHFy~d z2?vMF`l$H+73VG|$|@w3rdnLU0MG@Iv(&x_~ z+qzE4XQM(Wb#73~|kJi?zvqwxaEPi}gn`A2WCoEdpcAdUR!2+aMPiOXBx_tSG zk}{c0##L3_HoCfH`=+=5$xx^SHQ~I)I1O^7%}h^KYK@z_d)3F_({~c%Ue+K|h+3k| zPI*Q*a2#-BxGTW|G#2flMB#xkne5s<;ZV1tLvZDa_?Bv^qAR6 z6Q>}0G{@20qF!2G{@X11_axMyJ4LMJ;f2VkC@~|1O9~C=?VeP0UD>z`XXWz5>Abgo zdK=C`$qXzRO=_1f?;&AQ)@vXs_Ef{6pF8AZ?O`^k+6E-7%Lnf)t8f=WS25fdvm8 z_=`$N6rxiam`%Vgz&fhNwtWBo9a*JQP`vcT8bK@+sDmsIPc9LURHM)HzDLE!C&OYR zZ*@HldHkZfdII-Bp!53r4m3Mm)@?I0&bGDY3xHcQnM5Kb#;;m%T|B#~>^`=cp@oN- zU~?LcQwcNJv-F%tUkD37V|o~j;b&+-#qr+2tw(|@Hy6M7t!$;b8Mt=s+HJgMKRwmj zCwfD&v(;ptj?bZP3~OMgQ`NxKTUXST86Emhpi!!c3OL~7sw#BBdCYvh6LwkP1kf4I zq(PRxgL>@snhh^D{AUI3KX&X`dTke5u&ba&)SEY^s9?eG56)!fUhq)HvMDKQ<+#0N zc>#pb?>YPYLd1rgVf*o5w(~W0cPKcH;iora-F&sWvGG-)O|AxQ?xI?jimDjKbK4Q* zx;mQ@O?~<0u@R>Ov$$}Z0PBYFzEF3!-xAaM~ZuTU-vkbKnLYUA`S$=UKNWXGpd^`h%1u?Cv$V^ zL}u0poPDs>%h$K=`_Y;X>J~0!dUQWB7nAfs&)hp}pt-U%-@BkqYlMJ^hNiH%xc%;m zF<-F%n6xvm{*)O}Q7v4gbwZaz22`-= z-wJv`8}M**yM00?01z@xo2eu9CfQI9^l|Wt2{};)peYZx8`2m z3ZN6$bZ=9pR|k~6O8MY>iS*#;i%sA7sX)2pF7d0UN@YIywY(m9q^Yb?aZB4%q{poI zitmDp*|Z5;&Obb7X_Fo@Z8X(z*{95!uI86QAW6VOfFvbIy7gB~nSNh9b^WvQ9`*$_ zG{>0B>ZwxO?aF=1&2MTOu`iOb9ndGxYahy9R#sXTp-e_?vh?zMY}tG`pXuO&S?Clc zfi?H3xA8XLtLNWseLr@s^fh;4n@po5^EoX8ahZw`CHe3KXPe2XcN@J6?(SV}F^&jh zcGiI&JM{XsYgaqo`)ZW@5ztYc{{E=7$McK26++#zo^@$5J{Q~qH=1k@wp5*@4=;Yd z(~@aJwe#W7pC@{G%PfArsLXIx__)&etYzN5@2_2VEu%NvFO%!!Mus|)Q$#n>Z!`QH z_~eFWsBLhyWyqQ@{sr7u=8|6Ws*^23gPx>byEfWORg?q?NOiTGd;T$v_jjozZ@pWR z0G!gq@Jy$-vyehJ&h_49+MoZmDxKuNR`e;S;edneh}X2K@ej#c6c(I_a9P+x0)`>t zx?yZ)a*!sgdexs5ax${--Gan=<_puWd)CZ8{uVM&e&1Moc8un+vwrC|(Vy>PayB1F zIURfUdY{m+usNZVv-cLy!JFFWUyKMvJE)RJ`SN~L+Pf+h=&8~dSJ!^hli%NTFm&W# z;Fy+kjPc>IfywK%j;O@@^QA^Mn@fZbsZX#O)BF0}&^#s0de-F2{Y)GEUJ||D5O-|d zV-`ex^k``Xpk{vOHmBv6X3FT{mP_8`E++LezvEmY|9sr?p)={XIqUqpUCOs)9vph&R^Zx;1EVvai1Ly>|`y z+fqE$X|%pS{jGN^>9N*MrkE6c)eV2|tA6UgosUd@cw*-j+RegDpfcP-sUcZkwG?;Q zDeFmuP)H;Z_OPV*Rkxn$ZQDcQFp-e$`TTCj7wcLPL&M%W?|W2B=U-`qVO+TWp3naA zM*FCbw@9lrDOq`oM7s*2hg0mcq+_|iZ0?DvI%Q%oemu(KhUU}cXS+&YxrilwpD8Q3 zfbg-RYZJFh_nxJ|W0bq4dSSKdC&djwlBKhN%QOv~h9(PXjtc8fxxrk{dm2(aO88BN)Mvy)9i z`Fl(fQd1{kcySPj4T=DPi_>k{k_`HPAFxJ+*Qdx(156TbCIEo}_ajgU6mm@ee7!!^ zw3Q%I`gZMjgUkEIoj{=}A-TXMfv4{)4p*1}|?22zezW}!1>hTf(+X#E7U;O}@ z@eiQMZOP;h!1YidN{j{wcsH^Cuc1)02kXC)Rq9n#6v$ykWV*RmQNRR1Dn2ew6@Ox2 z(1X6tpyk3JE|g1f66!*lE$jp-0}QmyN8R|1!WK@oSr`IAowSf*R|F1cdN2>3fccv- z18Fc-TbL?wb`z`7j91ID0|$c7&hATY5W**IV7aYilMtfl^JqJ!6=7nx&?F? zFccYVkZ!(D=q>0O85uj%zA-Lc<8&`!S`S1oEO`%!1eb)r=n1(D`Xv(%LhhfS-gxBY z6{1$E=xh)7nqkCzLH7N;^u9bMYG=;82lD96t~d<2Odn6qlqAv%ef@3#&cIPIvhb!% zU{^^kwFW<6PrKvf5%9HRnlr=o%FvkD*-gVsqOHdk&QS=y0pLj{Rib0CAnKDbL$4@L zeSF|(#VI5-Pbe_J{ug+%EMPd?DQH``Gr$pV279Z0d-qbrpge)iBC)tL!M+E0D9Xtt zV?F-0Vl_ofO|2Q&XGcj;%Xg7apFel?PGf*jj*B@r1Gi?~sx!J`?6vFb*GFKs%+K|M zefd&W3xfR&Abd)IZ_e$X)Uu_t6f$}#=VWk(Qcpa=#XL2|bP-cCqfvwr&~ z78Xw6=0f0=czERdq{YQ$T5@7*qH^!p4PedIj6Fx{edW%|qyQhEntYK?yax0jg4pJh z^D_ejX&ua#=8^xx7ac9G--o&i-CLqnS4M*avm5%6zr|e(QYGx7TlHug<#V( z)?_#HHt+p=2P09LN*5GETfz$vY1Pj%cUxG^>BYlX4B-ISDNk?*IrBX^ zd^0ICt8f{J{%08it)Ka{$FmXg3eqt4Ky<^F^;?ewr>53gOM)CM4H3!cG~q;0DD#xb zBy%Wnp78Pk%K$!lVN88ttU!2PhRmltS1M}T7akF@W%K5wJ}8Db+1Lgh1?)z38TrXc zkPdVY*}wpsvT4hf4LeQ_uKU=FXN;H&+X~Pc<{nlMfDyD5IG{eKIYA`1a6d}CxH9*_ z5`}d8DVzx!`bd}5)fb>Kj0u2|5h17YWD({dq49QormcC+TwnA#9#EmGb2bo5h{~Xk z%_OEPPVrs)6l|Q}|9}(nFbOtj$Ya~u+L|~MvOwM7^ipd|gU+|AvJywq&pWh2CoMW3 zQ8sPfOjx}{G`3DNUJ0qvDz5kf!m!cxo6k}B! z5CCu9zkg473D9?SJ?~?={bHZRQN4z9M9(^igs^6bfdvWI<1{3g?;_#&G`@%ZkJg-O z)>yNuzAq_=@<~uc&F%O{D^p0m+CZd&I%G!9jRPNoi0C<1=|J{FhnV=SUKME@pw-Ej zFWu=mSrF-v>i{M z`h$ZOR#LOaoC3r^E{`r1a`tdB#&1+qR9wD%xhk;YV@sC3wVj>awQHdXgp`G_WAlU_ zHBitVi*gqUO?HgrSIl-k$BAd6ufH9cItj)?E zw8Pw%QQk@yrc6NJ_yYRj9&=lO+K5U1M8h*K+99;N>sx!iOzsEm?{?0fbU$)rg{ z&je`A>6#Hh1xP*vm!i;86Au>9!jnUDmg!CjPzV^^s1*syQ>^$C|CH)L;P{HxDAj@+ z6qc%L0EK++oZp50afPQ#{u5uWR;AS6I22becl(sNt*Ua8Zk^!Ex-8z@r`2;A zF|n}-M<{#u?p+ykY~?a{)V#&`fz(kQirDGa6e;Pj>b6}M^_2=G0t(1`D;{f>Zp(1i zl$Cu}e>E>$$ZaV-S#3t*+(PeD{F zCBfS^B30_1Cw5k*lO_vpO~ zGm-IXe+Uq&IJQv3*r`eLh6a)wWnJ?15^;qP=2f?{Lo022D`IlIk9W9Jq(;pd;ebQm)S2(%u096`1)tgyk!m_YMxv@ zFOl-#!jW*4%-S8*RbZ+gX6xVY8TK{_Dd)ww*zy`-f!W!*wS}5z7)q{wZEtVK9dlm{ zm}+NP*qq#<#3k|1uGAe?h6|13asjdDd(M=uSR0X8cfXM9Ft3il8Qk@zrf(<@wx4jj z6EVZLCGOA5QFGMMUp^~(;fqPFb?uwD;I32e3PLPJ>#5DprL8M6R*kK`XR+`7)+bs! z`SvMe{n70n0F<0!HoRCmM(8XoLRpxFoNOj-=-*@*CdK~~`5WDwT2MB(zCp~LZ~b=I9w_;Kb^o=2I}w$~7ahKGw1G!UwW)j!^KxjmGl z^yd)=@Bee(^Pl@Q>27M+S5{TMmom#$x{8>eYQ9lOjA#2+DN0Lv3{im5zCoHFdzRh{ zDm-x4q)@gmxJ(i`Sid2?E7IOb@1D=_i|QC$<`1a(a0PTLPeObLt{W83EAXnG1$)@- zI?pXl+ODm*n4&#y-~KzHCf4ZaU$Say@!WXeq_~yyOUgQ`TsB;?2M&mnL0L#hNF;Hv zUPONrBCP~Lf>J_kUD_qyg8C8?2GF-8GaS9ZVerk=Euo;yx}}%DRt(jPkm1}%OBSd( z%hUaD;!dTb4=dXW{g>t8L8j%8Q$z5%j^MzChs|8`K<7Bg$;)?G@QH$KmPzPvv|PwF z`Ca-+MU^WNSwY+=2evbfglon z86F;@InCsOY=qeJpj)WXQ5}$N5G}ijp&f==i9xp$g=O=fMK=8aQ*rn1 zN_stg{ey=OSEc)N{cN}a<(Me0t6fV6NU0A5Ik4NH=XIJ*Eo{RSG8-5h|2lS|i$Y3+ zYjn|S6|jgp_+cc2Y*0DOAdyq@snE=B+m5wZu(T+GJ-4AOM^`tB^3>ZKw$fl;QIn`F zBeR>d|H=K!5i`I0BN30;sX1yl_h`3Br4_WH$@!yVxXIF`ube;c28tzp$I5>eFJ-Dx zL4*ZRC6KPAG{nZl5ELrz?tQGR2Fh#yUb^?FreA*jdcm^m6h7`3f5uXSl}#jFI1Rc3 zWjYgY(G5gptw-((AsHhyP;F=(E<_sC)l@DDO`l?d$ zSY~!#a0$v;yPpyM&u=~})4d=q%}9vtkhdkPV-DrzBV|-cBm~Khxc@@gx(mL1Id7>M zRatpO%C~=F`B`WsBqibOO}Zp2+eX8LoerGE&&MZHLj&4uNM!18N({9Ypr{|LI(oJ| z?J~b5)AOhLhKfoDqlNw7*OH@7{^y^6pj~%&bAueE(gZwwSyYidWI~5Y$m+m|upKx6 zsTGNVg~jBU@A2q0S@)OHlF}5>bLU`)+F&VW?x<}NBxXx{GZ3Q?Ff1d+~4vnm0=ya|%U)J0i zF(wC5nd6GnrTKvpAiVhb`HvlY%hPk3b9ujIA3T2C0{JX{R8_*n$4l#oUp0ot37J=x z3a#C?kl!c`k+;RMU5WJ6zY%L0V8TjU*a{3~kryb!Z{w*3;9=Qdzw$m!_Hnt1%1EuSnax zK`No90eZQ@Xa3%T>$V=*B`BEXV{p@Dd8QVqX=$P5T~AAE(oi=8!nBAPc{*PM?LTvy zm*3;i{wI1^!}!S#R4XPLPG>af^9u<%O%8s~;^n{nA2N~Wx1JpA=|$mjv+-{<%uooP zeYhjKqRYc2F&E39zj-*Xz92a?Vnq?ND-;1o zzklr9U2Pgh;<%7<-Tg)knQrNRpfcKFYS?nkzOX;0JpGXnXY*4l@gKvv-aF!Ga%q=` zI7K#TlS$01g!l-(x^(6NqhPJ;nFkJ6(#11A6z_DCH|4S2kzD^?tZDcGf8|T1qXic(q}Z24#MO`Q0SGGWEwd@}`cOC&foCTqIAGj~73D;aTbV zj=_ZFR7$tJU|d#=I~zrzQUP4bq03HzdOIU6MdwO$rw<3oW_HUo+68=Pjh>)=6No?V zU|XhOPAyo!mg#-E#b`)gLJzzNs&d8>9XVwS%C$%nah#}(bby+!j|4_*Xv9- z9sCXE{KF)l{f(c*Kj~;9?F1s?#K?I4oSMVwKTL`(tzFRa85tZj6Je|=EAfVc-x1)j z^Tu2=h{~9mnc;q}ow=;O!?{SjVcC&#EKv1kAY@KG@n7ZtrH6-l#xJqFtVebpNJwg5iTIOgjFOWx=SA(*(M zT#eC7T4?Gz3QSP?%g;Z9TAoo!JEbI}Ir!xk0XcnLzj7q_4G5$U{V@XdsU7E>UcRgN zAyeHU+mbd_%iq#4t%y6ujkGGMIEOhVb8bYlXCy{dEu7zasXC16@6L;Ja`bDS)6&k<6&ucd zDlT>c2uFCzW@ZWmNHK2N(mrH^>PiBuz~H0DGzu$+Ui|C7hs?S60?3wK^3}9=X z2H2LcMuc*H1_&VPlq@hx?zSjTC47Mc_^qwR#aKUlZO~azA@i!_SlUd!44l8wl$eqE zJ;C*0tY1@i!I3a0!%)lXDz!InT)z96PQN#nhU!J5+Bx^g4`pVx)fT}qpW9^pjR&S@ zyZgc)KI6R~_JduuCI0eLW35G!{AQs3jhZZ*-bm7y!9j7F%L84#Z()7jgt`mdrSN+q z|1w@i840j;V$m5xzYKt#K+Hcuwu~%t0X2DUl!m^C6iO}hANcrLV z#sA)JyAf621SSiod1VLDp9_vAGlRMw(~kwq4O8tD8Y>e&W&811MC7(j&8E(U-F~5+ zB2Qk&*W^~V)<=tMZ7Shxzqk$Q1imQ$1M*rt~(bZe_eCL+v)wCpr&70e9 zoJ<#fkMYZ%pEjVM!r-9@mrJkwB^J^E!aDedfr}9qcE+`w?Ox!)goVNStCYmz^-8ATfl){Q+Atm>8tY)~H0E!!^oA-F!yR{!^k1pVAD37@d2U^5n$A<6B%9mS$j9jHj#5%m0-9Qx z45WU{KC2mEZM6N-Xa~+V{>(Xobi!gF@IQdTSi(Z+Ng%lWouIm`k)`=vczF{QAyZRR zV`F33h0js12$~OJDrz}M&~TfjRdOA4(42NNRF2cfp@S222DbVg#DBxidUU^1q8Fbm z(M&KtEOA`N!c@zXjl?;?*&@?T=XEh`z9a2Gnz)?vdgjDX5f9;=egfQO)8*M_KJrtq zqKbnn4wv*#=4@Gt!l*YzMxHiO@Q_heC+f3nYop>1qJCr$xk$Y_7w}qwxV(PdVq~1C z=m1lO<}9S)0q2E`Jll+|@BH|fP9x42U~VaZ6#a^vTsBHJ-szN}DG1Ce((#(;m4?|Q z@8##u=-V$t>>lu&{C-DycqZ;Ks$JZqmG8EhXj;%~@ec}=NmVWbu7mE@IVnc`ZFF9f zM_N}rfyh@%`rP!J1JU$HLq0}YKjTgnSg?P^oxlB9Y*>-c^!M&X42YV6xy`kWdbO%p zjXdCFP(3M8QM%|+P$IlA`{mi82K9IPRWU?!1$aM;K(7Qo3$=^iln<4D@4K^leSMxcv>|)i#iK4!Q<;bf~(*NYqeQgT{1I4Xj2M4k} z7mB~`<@$VGT5Q*&dvpwEY8kwg?%rlAzx_8yZ}7*lkUPUrw ztTl1U6EFsV+G_qgt+T?LYodjHEX9Qd1v*p1Z8$hplvkvjyOTGT8*+*MDBJMGOF@TT z4+e`J&C}vg;n8Y+d9%mE1W!3Pv77l8 zh5ypXJ&xZovU=he(|Xddo?Ked)Dt4*;MVg( zs-{kKFYniGjfx)2osun{{^A3j3B750 z<$JF2_9y@SoeE3I`qRSd(vD9oPRuzJbBLJ=CM`B>ZwM6w9;F?l?YK|X-p)u&1fz;LwPd<-=C*A5{Z2$63{h~DK-vFS4sQ(<3 zy5)`v-&Lzt;X>|gNJ(f|6S@3Y_q{pQn{%8OP~ihhXQydB#DXz_eg1HDhjv;zP~ZRw z#e*!zu2bNWc;SM|J8ciE(^zgGs);t3j~+cj^DT4)_|j&E+Hn&|L2$abg`x_-ctI^) zImgKng?jndy3hd@#l+!fY;%@57d10{+sY{Z0IAY@Oiu zK&Z}43=m&TSqGf}fzc6O%n*A>&wK(!-jbj$%)$}`f{n-(5Xu>;uGC*VLT~IF9vw|o zid&tRGr%D2d#nw&FRUF()#A}b72QC?0(bG*D3q6&?Hx(9O?{fsXFmz(C7Xi-bCA zDT9vdl|x8WnxLM85<{1}cN6u-zG{!){zDtkaMjo7GK6?8Zf;|A%rrt3Q1Vy7`@x!} zF~d6H^Y!w1>)BsF#oKIQG(zZE9y}mgr<9;bQSBq&#U;6@{|WQ<3vu$&;0x^R(ydy7 zwb+C7EvmtgX`$Y`07O2zhD%Dk!3fgFDn}x8=HeYfN5wt zybj|vLk4% zDw|Q00gk=6q@)Ge0NPSH;ZmZAL9}CQJB7|~5c~3vFj=kwq75gks^PXmoCv<&-d0G! zlH&s@Ujqey#dHAQI1}qclv(wAGFP<$ugeEj4I z;i-Z!B>d$|$|nc`m{Da5Sq)HQbv@cs4|eblBS9r9#}RF!YFrU)~2V8d}4Kgex!5M&cQRe`mk3KqM>dfOc~;f1_K3^p}CqMX+Gl?o>*$3wB*;Gc5- zhklTdKt6R`P*8PX7o$b!QU0XC1N6S7Jr847u%_rl(b7JP7gjnzD%}5ZrQ(IYlIrPh z$pAjfPmgvZzYMAumf^>9k9Jq}U^!%#uBv+`oQUJj*BsPDn==b*?GM>pge z@c|CV^H7&r?CrB^mE||CA5=x==OGe-+HhZMNHx{uU!#$;d|SRZypp)WuOi&!as0>jlNr0TTXPO=_|Iia%_1FU zb+PPQDUZ1PWj+3kT}2Xm|MRb-oU*n1g1HJ-AwGam=c8-oY&!M_c9liuvQ@ zE_cdx?-N&!ms@qcYK-~#B*}_?8@>LC#L1k{rQINS9+DBn>RJwi02a_Bsesw8Go-h- z7o|C0{du`aq#tJ(iH6Pq%$1W3d2f8X39Z-dRWux?-ngec@oP|H`1<-1VnD))WKRso zN6|@l%4OM_cDc@g@YqRGNAINvo`VLqflDuLVfp{A^kX;^iv4+!d@7;*z{X}0UW#pI zX}Fbmpw|BJ@pYKJI01noxA_h)oy2=onnfS~SDhK2|Gtp^r~Qg5Jdf@)|UX}t35 ztEaJPQMiz)TSkf-ztLPr2uL>{l7k|GEGkM!9Z_<9C(l$|dIe$ogJTHs#RCe(2HICB zr;uWI7Uy>#37eUAvGFDUY`EPWx;>-WbkzFwtNDV8Bof2MtJ`+`Xc|7ew0cX!fjbmE zKdOn#4Nx=MRepeU3AONvDb)$;K|VeyaG${SdKIcEKsfr>uKhq_!-$sM*cvJ->?Aw` zJhQGsl7vh)LORHp+fPtX5ZwoJ2cOL3Ve@Q1dhNsAwHrB1$Gw{#!379Ws_rr0`q3=V zhlFSraww5lFAGQJ)mqKp)JQ+BROK+U%gAP}=!*FqK0lDl0M$nS`CdyY6ZZc+HS#XQ z@|WTSSOirmHXrV{ISjL|3EXlalRd!4Hx0of5vxE#`uRGTF1OH?D_2g=%(#m|Ami$K z4nvLO+WYZi5(yVBd~v_=TF-jIQRva5(ulefF)`U#M6`mVrQyzD3sXT0Lt|qoV1%~G z0n$~a?9HX`5sPv-ek~p*cm#=e$V-+d+1OP+#VVr zAe}*g?Tm@(FnS2Z-57z==vmR*!YPHY)j-6XA~0nR4ksqYO$Cee`$Vv zuy)-#!dwpVVA3I!^($|SjO&eG-S=6H3ZP;v?sbplStTU&YR8mv6>~WBk{UpR0gQy0{ zRtK4qEQOKEkb_Xl+HmX+l}aVDWamiP*JLMr_dDO^oWAe6=8xv;^uE9MeSgdI+|PaA zPgt00N-Zezur%G3A9g0|R7H#ZjNDwIYxCvbvWf$*>>#DSaA@fn8{O%A){5`8nvBA6 zJwN3Kg5uX!^>lTsMqKEfu-0YAM2d%YyIuA?)9M-Ld@!mXZ?+R}2aI12j2W_1I0L~S z#n8L5>x`6ji2~3uOdA5Ah4J5J66OO|H)au3bpjFjEE?L^Ss~Xz(gDX-Y|=pYX+YaU5x*p(rBt@7fuxqx#(Tf9e2M!UD7&P zdm!JM^%LMlJg+zGE@0rcQA~`9L#dZ%BMgulQVim|yY2W2k^JOlB!e1EqsnnaozfshQU=GjHwwjSFd}zJOHYrFZ^9XeO|gW@-0fm-krEPP79~x( zaPK$2aKrrY<*TZtkA=dc{FKe@-EPP$+`1djI)2R8)?MBB@9?9M{hNeE(Qo+Fas)M+ z>YJDMwry~Zn)IaH*J3F9?&r^MR_K}Uq|@|EZdm5)kVk_r?0=dQFQTJ=*VOVn7hwMkDpKe!`8;bt!b-4(t45KewZ1boRXnM7oDEC zLkk?bR%LE#TbY)(e|f4ydF`tkUtO%X^_SYPV68l}5;}=Fo_q9d#`Hs`PXj}BO^1?# znsnJ751nViBaVMBdx*)0W~GeB+1SXFxqV{I^U4_dg8wKry#90r|ApOVOl%UgHQDL`pd8QH3^Mc`%Mxs9Km(d?(AEOL~*nAe@Ph7>zllIpq_ix1Cp$qL(+tCC2xh>x~8L)4q@m1dbLK!;TmxYcNRjtUh+&A-UntZLSp|z#hv*}h{_*7WE?SuF8sk6H>KGw9YcXRsaMB7#r zge0!L{WzbIz*be&QU?KXPO9Vn_3osx5nl;;k#y4aqlKeG@AK)Ynq!74p&bncz1`Hk zZ~oxtlQ4Og(G~8wIDHh%S$GT)rRlDrp)@bid``Sd|G9ae4{eq-;yk-F=$ENH?h~4% zfeYybEWXvL@QXJowj@hw$8Yjo&dS<;aLjOn5%6-t%!b8c5jksx>$Yk3rd)0E`_5w? z@9*vlJIgn2_&Vv5bLlURF}mY5N@ntn-Pw03nG1K`uSsd$Lb@o2XjKT)O}%}8n#(W=k=W4?R(@v`C?Z1%%WD1gPO0uhy38c z^Us@Qm1g2w+TW$u>T7xP(i=@y*2OmQrA)!Gr9RolGt#Z6TmXI#dDhAZquZ2tO zH0-+2#FPxvoug)60nX`G6pF{-+wFW{nBkDduaAB4>&p6iHv|x*#MD91*)tzi>zV22 zZ{=YF80vvTm@#mC{rBdAf&*eHIbtd_2K2!e>6&k}+3&SxQ;gpj)zI*amWQ<>;Zzp6 z?e4P)2^De9r5qeteUEz1+B-NXYeCYMvO;ctEsDJ9O7Z(@bxKWaXqMNOCuHacyGQ4pf}F$Fqjc_vKAcv+t+-QMXh8+8m&3MBGa;^)73b?DRqII!$9 zW0O%hycmJ%FdB{j?-5f50aRi!Fq$tH>gbRw>tURgzwuLi5 z_a6z)rZp;AaK^jAa%~>~9p_)?3Q^JaG_&2z5B-0#hoCM2CXq$oUDS+W#o;A7a~}o( zh*0<^sk3xwfXEb`38RGV*tbY$n5!MA#pRt3xsbB(N;W5clP3J(T3!E$cW) zTR&hvWSSvCnheO$a$w9; zVQ#LV?a5CI~KhZYR{R3>ux_ z(i!fow~M{8a=HJEvEaZeoVZ@zRa2doN<(Oi_Jt5&Y1gt=?>a2m$_4f6}^KTSp zznnia@6P=S8eJyl-Gc|vR1#SaP-GF5>C~=wIK%zXOF^`yr3G@L?6wj7!6N@IBx|R6 zPbEa_j;+KpT(LWU`Q=_>Vj|*U$fO3`Ax{Opl1Z_$>X=j7>Bzh(17aZ}MT@S-a2Q1@ zKo`9?^r3JClu?he-Lnx|9L5JcZtoNSAX98q7vkK0X;_WMjmR}>oCf+hE2T&@s*(b- zH>+(P*QCeym3+rbq2PdMF8Su$m|AwUTa#;QW`>Hol_QlKR6(rcXs0Mfm3Z~St-No@ z|0dtDu>EEnv=U_(p}2}xM^)YgmIY7T`73qwcF%#tdWxwjGMEbZ7wgAmhI2kt8oWJE z5+y?Y@7bB9p|fbKp~6yEZv7q2x3Bu*12mMiy8Zeba-fR!wzvbq$S6 zDJc#qJp=RSRy>QjYI2ca}{L04p>oXrro+LO`I~7n5*5 z_8b7Yp&=nfHQ&)2JqI-S&!0QDRzyw;AH?l<_uZTg-U_xcpc4>u?C9zo-#<%px&8c> z8{=OWJo#cKSv`LIn24XUvc~rJd8DgMjSZKx&bK=BIfIoimQ-bAhD-T75RI|y zxOv4v_(_vIq+`&LLGL@T!XM@;63{XNna{`97kdwQ;-1;5saW7?nte`lHU78_sIj|* z^a87!_kCnzkqO@YaK8l`x#3iUwWmhg-QMk3fT&{~=;~Vk#b`yavw_zRfp0{0stP2t zD23pl6<*tJRA!pK!cR$1`mcW&iqrs}u}O)^N5D~2U@P!th|@lt7>E#{P^PL^rgQ(? zp~~A~cJcyo4;vZ_g@vs~Bx)-E*tdx;JH;B27%Wjfye_4(|7@X+@O^VGTUxq$ee#!r^(8SGL5m!zBwB+>dSqZLVOGT64c8P*yKjRBKuwQT4^Jubp`G@e} z?0$MB{fp6@{4mon=4XoPBI&x!+nBxEWEfF_tUE=qwiQm5YCEc{PYdwnq) z&V{L2$jyFRe|n4Va`frF`$4WaRr1p#Iwol&JGpk`}=g|w+zmP7JKJQzi+Pyia z-TkVyY6au2Ie>4nyUexjgqfCIb;i#E;?lJlCYPK`q}9pQZxyK4p2kCzhK?`Z&*Rjo z9zn`FzD@G2E`wSADCN@I_ZK&PB&R{S*;2abkc*R=b1o+^^`m5bbN)F*zV!9s?QWVl zGpaW7yz<{}V{N^PZ_eFmE?PJR2i8^2CW0*gym_RiV8s6XfMc)Q&pYRE`PDP1+`$K} zm~JETg0za0yO&l91Y9G=l#%A#{G;T=%~iG+9?S7YoqQE~@#0s%@U>(w!dPI2HN~mg zC0KbnyxmVv4LU3;kswJ+8OT#U{K}(gKKS5~jEQ#v&>rqI1gm?s#1)! zp4DbD_ESe(;=wU%agy;-R|enQT1HUofFz4g{uo>{TEy7T{BS%0c4!j$~iwCCgAY5nH;F!)j2=+J$7-xKvmV%EXDXc@NHhrrAt0w3b`%XK7^|+HGhsE zN_L&4%(+(}FySzyN|wl-JaVK8rsReuCT{x4*t5ly&pn)KR^e0#)dS(36azc9`P{Mp*piDyXB=WDn_BgdN z2p|d}0K6_X#JICc&ci3c7%moo;sDYte~Kz|?0cj1Bq>}qCOUc!6hf|PF!Ays< z_jP%K>g4by4)u%P?(SGsUm66#q)!;>ag-Dxl>oLB_p9x5=+jN7Iu}GybwD5WhE^zJ zdr%g0sEXN2LPf5xz0hsVnl%Qo3bmlVfx4HscMLN4>p1o!BPYPF+-07P66%1)<`Q@d zBER0|8hg=C%A`8Ai>{E!jPwQvp4$(uMD; z3);G)d_4n!@Y&8HPb1FBDVB-mPCxXje}c;mJzx8<+gap zbq^UBxGcRu_gzn9Uf_O(yub`ZK#C|2rG-+UTBvoZ;u9dvLkSyfFBi+`8L$r4tz9b+ z0dva=3;1&Ke>DF@f)@qRS!$>YZ%2gVdQHnwG*r~L3q#m zZGk`mQ>HbEmniIu(-fdIN|Xeu|F{8ncA6t-BvIwdIfw986A~@*T??{{X z?W=EVTQL4bHoBV0b0K&$defjbhPCGm<_cyaI)?BQ{SJ`8675@X!HmoD8><&PmN5Z{ zCJ-p^!aSkeQO5evC+E;UHX(@q)KR87dS4$wFnwsFN$8}rvhsp21rb*21MXmb7xYX4 z6&`|OnrO5zJ9}=#<`UQy-rnAr=uJ`dJ2&}|>Oq=vn;Hi4C3X=ol>U}Ec|B1Q{Yc8u zw&3&PV(zHH2A_@G(^&u4oRfZFB=f4mY&PK=_HV zVSX3;p{fBL9UQ!EV6o7rJoBTds1IRHj&>bz#c;{phhT}Yf(FYKgmw6jBOsff9`OcK znM%8URGV-f0Hpz)2!uf0My(-SM1B+(7ngA~By?DZV-?2l1d7M(wGRn8erVQhc6PP| z&@f^B0mcDgIMDdru=O=KvNKrh3USBH@;evCJpzIz!?Taew)bg7!2%hd!KI@JHVj^P z0#v``Hm)U%pi!&>*{z{XUccj}=<2GS3Vzc%lhPy{xebs&Hc z=(y*|r;i^CdTv<)Yp+&1S?Nl)1OEiPkja^uvYPL)45g){AiW_-F8uKRd-8;kn}ef3 zpg3gwFJ=ldtwfd1Guyjv+g_7UQzelS{g#)2-{J0XbuX&Xa9X%?uYmEgTr+z5c7oiZ zj{9~fqi7B*Q`p^%hbQw!pqrN6lVi&ZV+wve2}uu9i;(Eta=4~#EAN~4ZqCeLSjn_+ z#QxlJne9~d*|~l;F~6TR?74s?W*Ij=G0|4$S7v=)owJoPqpNzMbz+*l>s(7)$(Xpf zR916NZY4>FWqUW9d_yhBj|=+)tc2Nr_oyf5Z=TlBPujQj#-vmZX!`4srEZP-&Xjtu z^i1RGM~CmG3Q3ZE&k>r#zz?r>h?3s-*}lbL%sDt2dSq%25%I)`PFkIcdbLBx{-)+q zZgR&4_MOy=x2&C9&v)CZ>UC<9lHN?-j5^)(uOItRX!qolo*kpov}YZ;Z|Bo%<#oOC z?Y(n@Hu4;*Gfexx7-C*0#x_xkbUiQs-oqF7ykbWOA9c+SmuU0piaYasln3}^#o6Xs zPtSM%#OGRQ_pDQIs=991e){0@1!EEv0QDF6lf7c6zqo&v(M#1}{}Qe4nuz%^ue$RO zsv3Pw&cDB5MZPelSJu2FgrJD?P=AUfzy3j1Sdj1hO!@oRq)=dH`g_+kW_(UOOfHeS zvOoVyzgPtiXC&Fx@UB*(WdoU!$!M zCq#NgKQ3)PK6Bkgj&gE0H`#JDhF@{dy|%IVVeRM^p5+ByU7Ls_P@Fo)3CQ#{{v~d5 zj>FgZGwkEk^H*;TDr5C2_{sG^^NP@EiMW0zIclNzS8p4X>UrNTy0t}X>I~-YJCW0M zQK?*;+M#K&OZJOA^2cokZDyaD?(j|O-KU*|fN`Hfjom-T%>{$5tTNLzH*tMnHS}-` zK4MbVG~LTPE8$Vx!@|k^oR_Uw!&>x+_oGD6D@yAfwuh`0`GaYHs3zf}HRiG87w7jV z5~eucT=PPn0Ilg53x}jCkMTE?KOrRdquQFPxoMQlyy$BD>o;B|zXzv6&h?0%nI5(x p(dJ4>;-m#!qh$613bHz$FBeC>oakr0_;z!B^gcI`iWE(7Xp$>G zeRhrKQ(Q6^XC!a3@0W<_ZG$-aR_CiO`SVGXiBtbfxfs90J~U}?w`ea~Q0R=d^SN1{ zarLKGxADpU_m^8jMV{M9h5!9k;Z3v~{=dI!$%3R=|JPR*-#>%3$lqTe9|z8O3U5(= zndZOqMkvfvIK;P*;M|Db`@wT~Qg6ktT#uGr6o{P)bfa-6whKjM7ryXwx7htdV!?N_s-+r`VL zmpiV%*|EXzZViacc&+wkPiUF$`xABI09ukXUF`h7TXEvwxB4N*|Bq>#Sy(_GzUWb_ zGeUZ5xi#?qw`#$8omoQdZNpzHae1$Cco#>vQf^@glgC~=Tm3z^7nc9M5Vmqe(f7gT zk^HSB=4*`s>ka3RM)w#CJG1znzO`P(SRYaAM_xe!mww*apL;zXqAYOV_}uaO<6eKu z8aPXa{;au@%BQq?6dd!0WxV~A%*Us(KYk7jujOWAf=qBz;rVOZT{TR3X_XAC_1!1WPh#l5D5%=C$-JAIGw$4ckuRV{v>G&^Di7^Jo?ap_-VxPj_s2F zyJ3c+HHJ7xWC1vcIR%j?yAwYi0o-`hF5zPMxYIZea-+X&+kam%n&+>rek1umpOaCp z4_3WIifjkY>QD662^EEVH^GwoGIE%@Gp-fseXai2-t7f`v7tX^xvg8wQz7QpgeKFE z7ModXH949B!9q_U&t}f}$6d{K{`*1-Kg|Ck!=fclQokUd8@ByJl~^TYn8l!SFvn zG+FwZDet*Em#Z(iyuF6?{L`Z}h*w~ywRwsf;r~2}>J*VT8m9nP3dH9o>6t~9ClJ}aI^l8}(VGvwpR^C&RgyCYb*zHz+|4dU+ zaq&nRQ%~6gPj7F!$IRyb{-y`%haDOFr^nXQw;Cs%%(s?Dx7T6=Mm8-C7q2%2{N0?2 zz<&?g?HOh#71J~;bL928yBphdis^$qsZ?+j4gb_VnZ0vk{(JU|L*=Ko#sg&7m79CA zm7G^6WFPLUnZ?-ud{!)^8%-fl#!@b=^>K}M7-3x#GVA%ub)r_U-vPh(( z|9a|nxy;@bRdsbNe7aF;Yb5Bt(2oHOAtJfASiU_)g9)#xxhnbRtNivyCF!it2p*}| ztq#+Be*>=q;lE*1Q^{+ww0*V6qn;3Uy|=g5^KfT&ZOJjEM^raP5H$pIO6`jHCV8?KaVdN7tAG zOG_{Nu0@&IdB0W5ZFz)yYPCb%pF(DTl5}`y^O8?$Y`{LYdZDOp!bxoP1Esq8-Me_* zGDp5fTZBlg%%PY=-I9m_FSYL!WyUpjil)WI#W#$UPL|^`e_hA>)W1Gf%M#C?X;_$L zz?-GP#hlQ=oT$>2BHF@xPR}nORn$>$9OJ#gji7gb%zTXu@0Y9iKfMp!f~_UC$_*s8 z_CB)3PDqUJkbIgE^an$>@b_nA+MhV(SY0$X_rRb~5AOud#zRX>OX7CPt&xYcOiW>2 z)Poh zVL-o)ZhfDPu<*+StJ??FhY$O0+&X4$Dqncp9SrMjT99d{lV$BLzOgxrC+io`nRE$E zJ?;jcX>rxuTGn^p1B-(L-hnR%V}4ts0;yfwJ+c15vl#)5q|)23=o~5^?&)1uQi|)G zA&XGxGhh6a$TPn&=|s!4`!#H}e#MV;#c##uPWjMkf3g2rrC3J$o#(?f#H(tJud7{V z&MeohNF#(zCYc%<#Zd~ZwwuqX>*7|-u29Y~e6+R@v*fx)r5K(?P;Xj{9}f1C#U+>9 zD+@ci;k_X?Q`_3kzqKxZ>_2@M|1~f-feUsC?57h|a#%{Vo2v~A-%YQ>e@wc6lD0X2 zi*x)tSzK4DD7Im5xuu0v<_UkmPA4q`L+eoay|tb007h70NXOmguV2Z&yu2D@Q+cMo zp*~q`X{4Ad((_kl*lK05A2B~>U(nQdtyOolArTC2#JQcp6E*6M;sAyeReW{noqxRj zGBpC(m7T=X1n8p0{P)EgekT^2-@kuD%6iSxVOFHEnbFT<+)uQvy?w3F(T@-uq59}> z4+q)XT4~o-mkL3nO1{n+b;&gaqw!96#@-FzBmEZb@@zw1wus+v9I7ZTAbkrP#E;DV zH1Y-)?g-G*Nf%+p%mo_F1q8&{QG?BLYx)~R?=$qDa@~+MIoMOts1hqF=(l-s(sg6L zF7sJcl#Kp3c}_6>(F^HET!Nze8yS9^w|zIuGg^y}c8l5QNw7&q4owN_()ppX0o!2# z;Yv(?Q~_%=0gr-CkxoJAwspZYHgA97_njpCUgyCN9`sIkyde>Dw1;V5Ib2?`u(Kn| z&d%OG7(eoR|L5CHB(Tt^YU-xhE`{`;Oj4EMZ_gd|)kZ@8_g@FLTyom` zK1cf=QS+QW8-ATZLD``9NE95^m@nJ7VGYsD?agN~_w%gYeptvybmkaYU=SKT_UYLfK81I(pY4&&a!vlY6#}Ajr+j`Yy>Pt`dywE-* z9p|!Yk}Y5^>Ccf?HICrzwAos-ffzW~;PVcq2`nN>Ny{&QvAW%un?9l*7y}$&7nl zLZZV5i_+>h?G}P5uLc*AgCAedCikv4txrFGp#l616SQcEv!)L7*jO11aJbZW%7Y^z zzmP1};YoN%Pk^x9qI5`~%s;gmm(spwn3QI5HQR}_*ojp6r5Y9vxMuXU`os+IzcIK- z|BU@~t3_#{c}atj#_3ZF;{&Hck6)rfQrZ>;9$CWr<9D=psr$ER!aPNPZ1nNIw;fPy z?s5515>D78fBVfV?m@H`&{wGEFaq#|M?gz9Oj^5}rj{F|mTROdmiOeGu73dkSi9@m zUgv`wPCR=h zrN$i9Tc+~&+gQCQ>1T>;JO{UW=3F}u>jhF&;UdGEtYwrq2K$`<)(*tniIG1da*YSL zKWLwLuZR8dtcpH$=={5s(7vs4Zq>`bvW2(woX;Q=3G{iowjb{b!gVvIcVWY3RiEhu zx8no*h^)L&+oik}Dm&qCH9FjtM0mE9bia2bfA8#Xn zqnVMf!+lfk{cfynr1p)XDGpKMyMSnBe-py!c_Vw8dtJ;T~=tqX) z)X?>ukN&%!WX;WwM!vsm;SDvojP;e$nF)xoozJ!s3FRegO+6$W+lThgetf!?_8l{& z-NH0b%RY}&KEvhzLi{8`Ks)mN-e|sQF64r$VYre@xG!C8klt42 zNFW}J$ol^E;9jXgUloy0h4#_PHx)k*b3f*{uJ}LKcaj2b>i@V>B28b!L|U*&b1`y? zSmrt!wzB@^2*jVVD|01x-fVtvQ5tT{S2bTGDNAN9nDQcq&GO!v!rb9SQA;Hks^rLC zu@pbb;u$`XU_pgJY|1apD-M3V%cR@>XIXy`s=JCa*omCC6B&+QcyTG~`^$BcoV`ctDN>*I1`L1m7&V|M*!?aibG>iddUGmQgWY8u#LZ}7m{wiBu_ zC(j9v}eaQGMD&-=*@zm`QG_?yKkEA&tsB|;eBU2 zVd4jd+6OCMIk-+WQaDDp_a#i{PUuL#US{od>6KzltSVqAzZ5wYe^QDl0!?THe~Fxd z>y?HkF7aF5ZFYQ&TkpjB*yi;v)I9Ds-4o%XxrZQC!<$p3nMX|}u|M4N#iIE?O9mMi zBFJ|A#DQnk`l~kGOX~6L8;fXFkI_)*zF3HVQZdoUBvHSe|7Qy@UK-&96 z5ew~)e$NJ>FU_}?S#|3$rmDbN0-yiO+4*KPN}Es`7MVmQxUVSsb0sUvs3+0 zR_A(AN(=wKBj$E<>n7V957vj&-I(OBx2dV zhrdACjn=t)x;#6+@gy8y{?J*e#6UFfOcSq9OY4Z z=>C?s2L(gbw=R6QO*SnyqnL8ek?i^Xv*7mrczHn7&DIAS5BCb|R*f3WTCBA-T0Z4z z>r8VWO8LU#i(jlSu?9r zKZ(avTO>gNS!Ml1mnj7<^k z3nWF}dvh`p`y;2`)(O2WE58`9FyE5a?~cP~`d&+BKCX7yaPh)hRUSx5B|~<^-BGj% z1#HNJzY%{Urj<>!d}#5Fn#({&qn4V3%ja`FyLoyA;q6#Y3CZY;+uc(-OOFRG6rMKf zdh)jDz&s==m&VmIV_igY!iNc8Vfm_u)U&|c23x;M9MUbX1(S_z3mSDXgRaMUyHczR zt&VPy5EO3ZGi)^9&cAxr^b7i_49R-T*H65Tz#gJ z^Uk5Tcg`FF?y^h{rAF~!@xvMPto;6FA-8v}mZFI_C49QLIGGbEZ_>+NuUNCGq_Zfc z&FbNb@3`A5AWchT(VZ@Z1U}YjP7P6hZ}LLELNNBdjvejNP`+z?cq+$%fDTP_bX4lp zN0N#`;&K~7r_O$6B3<&c^}!E^*`C%;_*Bqmn+NLNYsA8WG!rLxu+wF6c-6(+NB zA+75Ud}E@aK5b<7k~t6g>7rSwqlA}8$_#i{_YMf~gJ@}KzrOlZxdAi;D@6o?gocHc zKAipHcHpgFWZYC~JBT2nrC49>NIQNSt6F+#cwdCo=yrGuW^lCFKjY(W z>+M7ptJdK&k6%g0YWwp+-XOwn!Ph}kXJ7wu)fXoM7+Nre2(Gdr-fwfRMx2kIUDlwE zQZzaFg;G}G$3nZ4I(by9)8^uB1SLK)<-=a}&JAqXQlB|_T$LcnogsdEn}rL5Y=)4r zFG;-radn0{GHbW0UV8D)DSt$eO`GfTIEG1Wwr%mE$Is8_ z*b|hI#>tkjJEaC9(+d=p1^!HpyNEzWca_^-tIzz8C3k6>U*u5%B6?RkWTAjz2%tYu zh8O>ET-gn16za)~q}q!;==~CDKckR7>Y%T0JG|tcUcxeejcAK5O~Qku=ROru@}QT) zZoI*-rNP~gbMn_OuC}%|kwsg|QGyH8`75i2UDeCG%ZIy{UlAd7W;t57%dYW4X#IYU zJCgOSo^8uR<%0fCaV6-6lOAt)&xWR)l-0g9M}lmohQXRUz;%<5LgQ*tQq6mo)q}=j z^ldxqvpBqxhfpRu{5o;+c9QedhttngE&xcQzv>c9$evelX$;q?66cj^u_M9Zv#RUa z&S^Zk8#+uxJZ$6TLv}{JEY$q$55?$xzo0K%|2LKtz8yN9eoDJZ3R+_Ov$u73}91gga{nSospc*vr(-Vy6+61K3a5_peG62 zO_D*2(muuG-QK8ksTpw+WKUDe2IT8=zTOlw9UR_d{{2;C#QjT`M~v!+hHe|b_asNm z%ZCJ{rHdZi`+DB-{Uc9F5=6{%mDx@t)w+_*?XgAacQS-~rMTk$X+)KS5>8hB)C7=6 zbw{<|r)F#Ob!=K!yYCCVF$qx1rBusJ$c_U{k*9skyv}n%Jvrw}H|J_7HL1y$oLnDW zmYYs7KeXijT=g~ao9E#JxGnVy`n=T6zo(UfYzof`Ut4qTQlj9bIQ{-`cL52UoV>F* zQls7L9WEZn+sT!v0+`QcqIdZ)V8f@r-vcRIDDdf5FV<-D=cB~C9q6!WI7A_zz z{>E965DwsxMJYj=S{R#B%(dL!2PPDn`WkHk+)Wu2NM-Lq?&3i%UVunyw9k>-#oI~! zjq10_lDlW&4NZ&ngJg1hPuGop8Lx-)_~+y?D_$>mRW?p7H%=u-Kt=|$NbqG>L;dPi ztE%CvN#S{60wYF7gGDASi9GrU0;}8GTv~Wex$B5I5GgXPKZAU)w516R4Fv@v&!?m8 ziLdl{$<}zZ>yh&ZFON6T z6^{mFW>=NoWPabk&8~c?dj5Idss1pZHP82R(h5Xddi)vPSm3^&vY!Ut>=Y^EhsMUh z0jqrO#4|BWG9=3JU@A^P92eeXoxi$xm@Sw2%Ke~neSi3_V7|8COEu27dOSy6aQ^oT z|DHeor%x_ciq71LhVHsom7FLxXl^ILCXkbakw;%o4fU}uKWAD@(_~KOUS|@-T?aVO zbE98BuH!D^>d-z?^Kh0d`Z^ABiiAF}WfH`etTE0`L6;h1dE|MQb@I}_77z?TeZnQY zUv60VvgoTKyRsZdf+o#)j#mEbfFL00)rb$C&Hmcof>J%}{BZ=#qwEJ-^XttVEuJFk z;&C>Gni8YfysC?nrb2Xz>=X~YwQir@+V_`vsg{ecyBXTip{#oA77jAvAnH)Rp%=|# z;{e=ias4J8V(#QbR_C!Y04qDx9S57(O6r`^TRhaJw(a*ga{hDA<05qwaW^)3ctM>E z@4KCd@czTP(XR^|=M64FdfY&cEhFufUI9y*8e59$o9w`(JxY6#)Ja$I{sfuDFD&z< zL|Y=JBB`xB#qUqtPRblyaQ^j`<+&)I0%|dcL&`77Lj!r(=hism5cySsK~|(WgvZb1QGMU zgdK1k3OpB+JBdvKKJD>5c(=l&ROumYHIn;VoEhSfUO}bgm`&xI%#6+%3lC1%flJ4V z&3!hmCR4!_W9MLXzmnX=@uqr-@Lj@|`Y%p9zpX$!001t{w7EQ5;H=0~pjRN~zDUci z{J7Pk336a1UqpD3e2$i^NUE+$Vedyw>VkfA{uv`17sp zn;Z$9%j@@GgWc=;329KkxgmA@_6wQ*jxl!yBOu)UHVA5Z73$5G9AzmMv8&@(O#`+X z<6>D|<@{|<$kcB`7a_#tk}^q;2%Atj)^AY%{P`0>z+;0tXTE_VXh;ZAZ^%w>X&(%*bhh?HmmJlFkg~8XZj`_!G6F#=bT5dDDU2grsezgRA){?Vt2#qc2P8?hE{>U zy#PLi5Gh0bM0u$@@%2;`(t;;V@5Qs9=2TDDsk;YzLYUE=>#Vy}Kzb4P5#mrg#{n{C z)&{Gxmi({W#iJ^%?Rx^WNv?-(zYnty_%gaJL0GC6TKIE{`msz{3l3O8)i5#qAWJ4v zZ3qGLhxu{9EK)k)`jRNV`Q&xt2@3#TS6{#-!6Rq{24(W zH!*K64uP&&;4$BK@oxET2;mShOIm{RVnKF+Kt*;~x?Ws$w|ppcqPU+iAdBlwvAiTB z>5&w~32#a?NoKk06zFb*xPl3|$4V9SzgaGvb*V8Iq7yCAVx8B?*NL1or2*3v^V<~) z3<;qNBV}6t^wbWNvSfZUd<60XWlKv7YJ7(AR_A~VNKw6BKkah$t*gpM$V_Pg?sW_# zVc9$ZoSTAHu`*U=A6=RJvLLAH@d03wopt60he5kM0K8wpiqrZYeIsU0yZogvWoNMjO z0&Qy7>xNKgG5UQE;PU3xjyE{4EwKbji+r6oGs-c$i6stI=dH`Vf(kBVskJ#3`)o9S z{Ng?PB~4z4?j%Al=}9J%dJ7vFp4WTP=kOvpS9(Banm7d>4tP}NLN{<7j@2ZZ1^sl? z{MLdguiN`$cU)_XQ8Z(G5xmTV6E*QZj7!Z+y2VSPQ`d8Qn`T_{C!xw`&T6GycEgyS z8@kP(qB`|C1!Vt!Q!e_v^A`!HzRgw8A$+23j0OZp0HZ}N@)+y9W zWxOYtGO^}4vEdDFHM9icU0)4~K{Su@`fbp7BFU)48g~t#g7-@o3%S#q#(XsT?36te zL|fiU{LzcXiytB=xu~NcFp9ZM6R7u5^t=E~k$CSQr}u#lccPV}B`6iOht=a5o7C#U z4=PP${i-qs7eZPsdS0PcYx4-LU^m_w^9`0*RQ6{`%>)Pa&IPw)AF1UIPpCxXofjBc zxJAQn`eAXAH*k!0=(ZzBy`bI#Y2&lW4CSy98TrOr089eEuOzBeE>dfA`Itzgsa4`W zC0wk~F4T)t<$x>Mg!TcHWDXEOI|8o2gYD5Ymo=u9uhU2KIzl09=95MF5K(M*9 z@MZGKco4WC*F`A2NM9ACB?8}p3WsQ`_Urz>q^Zx6Fj9Y|tlTtTr#XU>6FOaBUpAM9 zbKR5``ZytENoOcQ)M~+~a`d_|*_q$D+W?YYm$f$Twd|hiN4nbez@~Xh#&}9L*i~hG zo10zp1WrvT?-}5);^T!aCwJV{6Lttq?WF8cftns_!{$kW$kwU&1!8<$Fn-8#@Lj*m zBj2zvR6AE~V;bzP7;`925rKzHtWLJj*IZY45y!4Px}siFF;AxrdDpEkw`DT0%Njdw zLJWS(PI3AJ)|ow_BZ-iE$z1{>^?OtPEh{kfAGD~c=k4impB4Td)sDT@K8r)hc@pv{ zT)TG4sA< zynyiX*{(vB(2E5o(U>n;JpQ4%xp@%Jg)D~_r{aK(U3mF2UhMZ$ORzqW;GRE!KG7{m z?)Da*3$hwqJHGxy!=Pt;Uvd`%>sXJ)%!;Vx>u6P}-C(D<6=aAe4u8hjQ(0U#8sK@F z>c`|xnlfUe~A#TXzET|97@+YbYAM6#8q2WfC7*=u0Ovw)U3*=(kp+Yu1JbyJ! zZQECR`@kQ?^+oY;>8euHKbJ_pVtvu!-oQ8u||1%3y>k%PHHzNxZc2A4lR z)*l8N*~UP6sN{T$x5SeLs|;$#$}*D$qLBf1@jB7g{i_FJW#wZdBlKh53zv{aP_Ih7 z)~(TQA43_~#)OW%Of&Jc>p5BvyxyzjY6r<&*zcWlJ#XL~07z!uwi!TybuK5EHas1y zTOM@%tN}E<_3RetaKpI+BL&|f)ZL6BSJWJ}?Oxa@>kJJ4(dHEU!)>zpWUw3ya)A1I zpxX}H; zIRjIvU(nyTmJT6p4inaI6EeOMHokK27lig>2tA+$I|gW(ms-Bmz|Q*#PzZIKK+NOo z-%uERGRbIC4Dlp^Q~gaq>aIOJ5h@RTGrzM484-Tzy>3Qy^XKV7%G%q%m~2z|w`Uu}IWRfBeS)43u+A7AyZhgb>{6`hW< z!f50qV`0cH-@D9Amc<{HH?ffwZct7F0QieV{#e~(BiDp-_~nl!Q5l(W*I4I}p8Iy+ zvE2?;j^;V_g=t^A=Um@lrLI~hhKKJGpz*?x0qk2Pr;o;9#>K1SGJcTk(hq>{BOlVk z^+MorIlFOb90{kxNEqh#%x(W4NTg5d_s;ttOI2E{0Kobtx@TORvpVSF*iS>L4{Z`_ zp1vKP>at{zHUUb5^X_;<*!E^Pes&6P=e)reXp|8gS@)EbTvJmRM4uT3dzx(Ke_QJG za5tO8f-d)2dKrKEc=jfn$|>lK0@X{QukzDO8Qngl&AWmrN$vBl;$rk9)uRs8#(eJk zg*eLbWZj79# z57g8%**oxucogd6Ix1H7&}>MV_7z$p zaEcMEBQbDJATK9%U%kaadEybuLEaHb70!DKIK2y13+6qR>}(uFQv2h)h_=G>40zFG zH6OuUKJ;YR5#u+69VXs_UER{mJg-;K?*!IJ6{U#K4-I{SM6bb1jn;9~AIb3-K*uu| zZp!Gn9}IY9cqtSzYroBCql%9bU$Q(qg)BRTX2$ux0;Z*oS!kr}3qj+~1{?4VU7ePt z-{ZSFaX{(H;~c&EB`TZ>Ol!6~!|dCdgtYWn$^6Sn#s_oXa&E#V!F!XCSU?LIoqk^m z2PfxcVd0ZV_0G>!$Qi;#5Ur0ONkijUL9#XW^I53M`H~6Y0#phN8!pchF{C2sa*Mlh zw}VyR%5EPzT}B+Lt{|Mv=tF>_jSCyi5C9*>h9^CL@uGQp`fl$6wEA2Y z6l`{i6-rjib>98+;A0t4c29Uq80o{i_Xq(>a;m*V5YKwk5tq(O=+P*stmZDRRT;Nu z4B3SaFX{2``wU9||ExDV@5v@T9bGdJ6xVgZTq;pwT(h{-x_th5yjFh2w0A*&`?2_*p-RH7xBFMP%=L zm0Rf+=)T_=FbZ$AxD-o{ccko`| z?@2&$qLojDC)@bp174kcc(}OgU(!i1MFDuHp*2o|6TqqcSc1}q*?1)ZBdyJy2;lIt zsA!m6X34a7Zf^txuw^C?BGb6La-p{1$67J%CuOCdTijQ+JxDyuZH?GP>c zlrI5(f}XX6j)@bcg|B z0?@6%Ox6go92~n%7n(BagV2+TMWvkU*#u!Nx0HU)ZFs}s;|0ksi(X^6$D!NS%dfQR z%|$AU_`4+&;-qHIm5OUNen=YNq^-Zvr8%tnnr_O5MP4fNi zLN7`GSu&BjTb=$42;95cX;QA&Pcro!EiIb(AkBiY-v{i1`UFG3r*&u?2n8SjJlEKlIoIYT_ZG16pt_R)LBm=e zF-W*WpKE@$)T5A<2V7KgTvU%ib%b|@;7Szwv)Bl#e33Is9u(wmrHPwoHAE;$@q<=9 zCFw`y80Ip%FRXbKw`n9$`}?27*{){`s5I{WR}?f8w#B*}Ek=8hnlUm9y?Bwo7ze zft>;ets|d~9x5o9sKm3oeTJINPJC1mn(X@O4}iL(d2lJ)m=Bt_*r?82I=6I@-~?17 zKsipV?`*$F4G*tql!7!|8_lkKgChY>4txV35Ah%mzYx5o(oapL0%gI&pE(4FOH&dI zd3F1^p4%l%!}Zq0JPWrXe9w-1U5HF;z}X*^DoScU8>RSC%Ex_(Qoi%5(*&Y)t|v70 zI9RYF5I?4%eXQr*E4~C(4rh=%kj9T63F=rP!o3x8v^47uK;G)qT+HGUaouxX*&G1< zMlO?#HSS~l;1noQKqkt|%cCk%o*aM&c@#Xj}o1OMxCMPLFNPD-&+8uYwLGa=_4A)YGH+Bs#kAj;=x{ zU}Z74c`D$bpkEZ#VFU{$UnJ2nKsL_NIt@leNlCf5$jmw~+iIane7xRSU!bOzHX)rG zOaAzvVssBG2qI!)7BYfWwApn5ZRXJAG;&ZNKma2{-hz1DY-fFn$}Lu*AyQ_qLr88; zklva>+HFw4eWzw#m#2)^5^7j&ZEaCsGx~Am^Gj&Y?&)_Xb?$edV-Ooz+uL8DzqUE- zh>QG36G88JMLN`#AizL54i`tl1MimrsA`PC7~xvfv1J902tv-ohY!&Td~nWH9B@5& zCV+@&Zg$oz#&%$<@_MyF-)@r$2C|%`w7kK>d6%Qz%T*vO7RsE9zHIFm!dR+wD;!L0MX{vL}KBWI+Nv!yI%9VRh zRXK1Fv|sV#$MCkZZkYdc8B8u(^8#PGypVi@U4uLE1!J!3o>#pooW=6iZpQx@{sY>- zh7T;*NDOpV6w#nLIhvzW5LQlpCd4r2ClTHWS~@z5dnd^4!vn+^T1ZXR5yT&BEh_Eu zwHW3GItfGMAX=UPVbRI_=bbafjd5EiKjsOv(rQv&mX;;~Qqb+T6c$hxgdQYNK8$3| z=ca-}r&jF&P!$vr3cd9Q^Gd!TDT4bDb1(4%3kZM(q(+@MF2Zd-J70%n%isse6oe2*k^G(JE95+-PbxT?HP5C zU+`iF?hqdSs?P?DU!m}?PKt=662ts}pP!496fmup?J=2J`Hgo4C&A}uw?Kj{x>;(V z0O$kQH(*wO|DZ*VX%8AD-xJWl2JiknHPxt$G)pa49y0XmssO+f6w+yip>;ro-ZQVg zD_5?7!azKD`Z20?13ZCXkS>tjuzpV_rERE2@|{oD_P*3&!<@2_9+8fYU;mZ1;~=%aUkv~l12xpc=gn4J=a*R@7;s0Wt1^*B{5@Vt-V}nc#HU8 zYE6tg@zZf3|Chb%o?RH0TClp^26P$3cr@HdktKFqg8&a)A)PL0ybSDJ7<>f&=jE632JZ>`;7AO4$q-I6H1QmS=_I_A95+2x?rpVDvlBZUYpzu zs6xv2i7ybG_)BI%BLVPg@KTz*)HukFFC*Hj05UQ-2bw|Mp>5~|WKgtp{w2;Us$@on z2OB9p#IdU$PjokukfnP3(?njv&Rg$aia6BS;l^Hb_b;#(0&Aj>P3UvOke3=2hOv>} zsZbxZTF3%1C`8u^b0jR0Sp!zUGm(}KF9F^A9eQRv$unR9aDki{1n3!P((#p*g0G;_ zTEKgvkrzA$B#S;i89>z0*P&p7MgjpLpq(g7ZoJVk$6ou z=pTgu(hPAn!+^3M!luY;ui;dTU-67rBR%D$Hj#L zaa!*Zg-&c+pjpW`LI6uCus*sk6sf>kde?>o0XeHu0x;#~=m5Cu*`E6qbMIKPxXL;q zjvxKwma+5so^-a`S-{1rNmjrnp_3lK`~%!{_^vRr3b*t( z>{zDp8wm2w=d)OKetj2qYh|1?wJX%fvEJ?0JisLcc@i5dTJI0J4%C5IsZCl?Slj~A zDvMI{#!af7Z~(g^pan;Q(MR*llR`}d&VW#JoCBzc@)ueDkT*c@1Xc*j8{lf74Ox>r zvF~d!sCi(F^dy$n*7$G^kC_|oM79)vaYnL&P7kFdl*~B1yedgn=Kxb@bfb`qE?O?0 z9b`=RpOipjQ=q$F2>~C5BLuEo$#y5_dUBl&P!_bWqYUqxr{PIgE?<6xw$;Z<@8%8U zkoCB!a3p|BBh-&`p;z9@DNU*52g$&aMS{k>Ck8*j2bAL@%42STsG#>1a$1&TkNXjL4G$pVd?!an3krj}`-9Vn7bklUzXw{upS)faxCr5s^@6 zkXxPuS{>mH_AfOcDm8e!B7Q*av2#mZy`VcEQZigc#x*A}^TdMGmiNGzvH1ZvlZ#}C~*_eda-!#En+ zI|5#Z-5WphA9nLwvNdag3dkIUtJySHk2hR*N(iapGm!G5tWM`wykp&1TXr4gT%dMNX4>O`^} zK=ZmRAwg(<$9NM|4B?_Y8MLmGWJCx#@z;0Wql_~7C96uqQfPDm=fi@$fTq<&_d4(T zZ*v}p`(7xY1q=p=MFxURxr1CL{#E1t5~%79h}ca~v(iuz;t`-WltWO+?nyuL2i-={ z{SUe3c%0QaNWS2sP@Wv)Ryf5X8@73}@%^8oYe7u=2s&(6fZ634dDtyg?K(#REo8*w zTezf>fiMGhGno&(b^-?H>=xX?S{rkvH!i;4o{BR_r$Kh|q==-wLK zV-g*5(Qo*D)_0nXsR^nJDE(vo|F9v1mZ!U63}}46Yy1Oj#F`Oi!^mE0IgHVp0E}8@ zZ>SsU(6ym%e`<6bPc2zI_y9^P8&s8l) z3s`0lHBhL*$QU|gH&AT>JSTC31xHqcX1)&DnGnDvb$2Cmp>&0U>%^mL-LY%T^Bhb^ z+wIPSCLTCQy64ns$@R}yj;HTRVcaHkdF%H~=QfN$#XtaoU4)AtOw@CHZ>(y{9yBJ1 zTc8(ww!Q*3E^zsBkJD#ttW37Bc}kbt_fmj;kvb_;{wq4HLwKFWGtNhcI*_v|!iFJv|MU7CBk7 zzM%aJ-e`Zu;^Ny{ayKbh8n}JB0{gs1RQrbgcmo5pNQnAk;5+mH5a5lSyC5ziGB99Y zWj`E>n$&iX%r-9Mv=Q%x!ehU39GBjBzPqQ}cF5h-`mkGB$TjW1UI3{ubYcoc>7eBy z6EPCY_qXW^8MmO&!+A9)eH#Q#PZ&PMSlD;=g8T`-_UR;PWGN*tf3bybwYhl)(< z@Xc9t#!D^3+Rny7RE3ty5IK-u!8WA)PM{QY0(3f}lqxj;xv67ruxCjt=~Lr}$)Qar z#}dzB`avpiSzu^zL9Z|XGe8p>`8ptA0)m4J6bu1D!N*NavV4&otn+9~LEgPqtTSw0 z!JgYiFjOcOQ9{s}N`XP`^gAjPF2S7ODRY)<+NRHO3E5_T2t(>M<_m-8hq}NYKiJz` z2{_tYJKVxB0riUxiLLTre)GWU0g-i%@xjoUJku^&!&d#uBn%MpgHqkF+h08Ot0$Yd zz0!Nc=$+jou1J)%rr|Pnv{y)*XbvHqKNNseC_qaDoMU72REP!_9s*fW%I8}GfS@3l zfZW=+35imH6@Cjj6baPI4^Bxr2b~Wf93qg$n#@b?bu&RaF-I{-tsBqOnx}lSS*AuK zjLAA}%zgo`6IN9Ir2vu4-fX%`n1*2 zYyp&BGo`v@&*ni)bo3+`N~2}0RA_O)!2)DV&)*%K!?jE5{=X^F0JjZ8ypdq-nR*48 z8eF_{v<}y=q8!(KA#_x4`;&gdr?bn4+S-w~x1RaO~J_Se(K)rB)-8Y;PlUa{Ce& z!)}xHA!X6a+@pN9hMTZKI!yIhZ|}TXm$#+ zx?M4BuaK}kLWO4KA5o9Rz+CFeiPF^PP$Bh|8n~Q%u2Q{3>L4I zXB-eg!!HjH&vq(i=R7S@=tCJ1TB51$!^Q4ZI9_@vrp}Jb6HY{uy`0?Sy5Ap9DQCj8xhcXQ(q_?pxGS0LgnJ6)r z5;|ayd}1Pw(!^Y!b=(y#b8vY`7mZIsN{aJxOh!*n?;jJgIRGz!ePNCSCWL>zk0g`( z_yOQ7%&!?38!Lb^0z~uLTIuS3E(}u}@LB`}m_46`=_C%9^{6KE#?d;D(&}pPTC~RS zt|y7X1`G7TkSlhramJ-*N0cS_#*@kIF)=vZP~bR#uLiGGYCY2;fJ%#d2VWN+v{9v~ z(YJ39uh2z@YFOzP5BA&_a-z(|g`|5XWJ>5&9FG8|;zXs&$x4gg=>(*`ySw6ttE5L{ z7#QbwIIum!Ixq$t+EZY#x8yi6#%CwEYE)bAV4gme88AuV@|QVR1npxJ+uO8_bE+zs zasIW)8&%NEpPo{4}+_j2GfI>~BnLtWUZq44)k zw@<=7;%+GXYHS25>UmmP$lyZSM-?SGf^)bh-~3_=ev)$>L?450=WGmpCa?wAwQD(A z$`#^r4vb6#YgNmuF~wic<2SsBBwgB0-L^Na8^v#TzF%qB{K94fKWj+xaJq~9FzCV+ z{~h8=?0L7$7x-Je^i-c8q^1|>Ije+VNXMpY>v#xT&xTE1(=aam?q_UVDAtu2zVF~Q z;c6YzJ)7XE_zz@Mw3k*T=P?#*S;8w(xpiBPfTdTSBcaK<9Inis``|QeaW}v?aK!vf z+q&05gmYUI(-ebl_Q8lPWlBuEd^p2 zP>i?x(+8D?peIz1F5j%eXTRGAjtB%*pG_rGOPOII+xNP~&y@~DEwBw~UfKoyPdjIt zUrIR(n?qlGjWPAWLsP|9nmBoPu{{bCtE*(|>+62wTN0RciR~!NcGR%RQ@q2=mTiLz zrjmd5xA9CQJ>p1@YRzO84!}P+3@GG3m2MiL&K*#eSNy5#O*q5BKI zIjjNL@peqWvr5BDi%UzV9gE+-RlU1cpp4>mSJz0v5JdtK0Aw3qVr>bXLV|or}H>TLsN5;$G~QL0GZA1vhBw zf$f^i5mTt+mPVjmK`JwC+b#5txS_{yvpTJOf?`p+=uEswm7Ft^6sL0RBn@TpgPP7i zu=3VCfBt;DpMA)aN2V8OOjkTJdf~=Ib7XXA$scqS@cz>g zXN!Q8y=3bOR))Xbxq0_$Or72})n9H}N^uA96W@6g}^HMnXbDwAoA~RS~v|BZ2(O>4!D+;5_ag9?(w< zrHO=dp_DKkF*P+cXzsyR{ef#h(4gKu8**!?yu6%}#*;$sBUk1*Fs3-*4auTffgkaC zb79+^48}LI`pI41S(isZ!-6xV{+!84rilkabb0;r>8UC?Ct3s;WJg~OhLN*#QAIYe zWNo`u8iEwvva;`3hXiKuy;wDqb~D?vO_=*owiv=gP-ixa+cNx>A%2Y?bSB!+Iim+3 z&8VhuZ>?={7coA2QT=#TaPkhu5`2~59W*SbOM1!a?pRLDbS6U={L_xR+n`K1up_9U zv;m6^ZO^js-h9amUYMTyXrtRpwb>8p>%fCU7J_zw80`M@voEkp1T3Oi*JPPk?oJEQ z5wlECnmx0k#fO%2p!|V@p(uL#R6F{5Hs@!oqkjJUq`c%|+bOI41>Vlh&oh+zCk7Ta zGAoqmseVM5>2oL26lKjI`%?i!vZ>hB?~aX3hkNO^#c?BVA@(|nfyPS!S3-x-3~F(&yEL->N}Hb69sFW7_94U(`sb0j&CA#d ziGBBwmOG0pE4V<())OX2{Vbw@z%lx!|IOF7vO3Es2ydM;FFtb1m_l&~(Ls`N<$DQ7 zawnWPNSK-ZHW!RpSb|llP}9%OHY{WXk}yTp-B=Yw1~guF&!$#C8o2wXa@Zd19=OWM zHqh_SoKIBgC!daR1oMH0JA#!DvSTH3lECpMs+=s;^RYfTcB`W4p!l#0C%%vBf?ks0ZWqEm!0q=mbDqnKT@!zY^2pGXmL_WLcMupr1VJts9poSV<5Cbh zTEx}7p%a{JRnv&erFT2UYwB7tcyxI-p9)03f`0cAsxyl1s_&P%-+R~l7pkz-7?1Td zJp6j|;;g~p))8Omiu?ruqSe_W3v!OGX{m@b_PV+{sJLfCMQth#^EN??1UOCU^~i#@ z$WYm{Uk{Vq!~bVW6mdNjvX7aoT6=BQ|7zR*(4gLw=J4kgBHVh@@iqVaAJ2ZDO&IMD zo{DT<&QRR4H~e`Li*FWiAZ-5uu$Ua*D@YS5sxUFOQTY2Iv?^3|9{W(+?T8CzV3l@&iC^kul2be zT*-$e1r79Q*f994WiOPw9~aIAyfVs!HwL5j<~-#T$5g8$fRG-mZpzT!lasZ6ho2kf z{|7-Xt@Rxl#>_@@!@cx=tIN*Z-U}yb!aX-GEp0v;xA9S}7#&6k`~+-5_!C03hrG1! z#c+}c4}EOidA%7IMukKCeLM-@teiT<)RqpHb%S^_F*RKWaFAp_@R=*WqvYDrqOyTe z<@ZxzXPDV0n{IlzN(l*ZUAH#;d;<&B+q^sq(wQ@7FyH<6;fprv_mdqsvHAmehE0iy(Zjd|KOI%!#*SBvUNf7O zD!VVbsQu`;KmFF?z~sD7#A@udhl%6jZ_Z~zeMOO4 zlbBAVrcc%a?hAZhu~CeBgO?w@;}zo3wyjU}slO<85kM|1Jx`(|9jY8)UKPiWR!+G~ zFLyAuZnNhx<0}=$y8V)LBhChw-?%l&+=GkcK^Zx(sc+qJ2lLIm$%%E25w)*a=yUY< zGKExz)s(%VwD*_$qCR1HkYmurWc|e6!}V!9`V8nhukUdF^8Lw@MUcrRqmGQzMc%sx zI&9x$kMoVlZ>qB{{xjB%I2QkFg_)&)gVS87F~nV!%B+DXP_?h>a-sGqD&A%V;=}o6 z{zeZw1m;&~&IIU~fFOymgq+&5vo|2~D=LFrv{9CBaf7^Osrb#Zh*sOY%nPBwW{wI^ zd?@Fx+r!t}cW#B3CR8rK_?Y9nS7ly%S`?CbHJ2v3J9p5&N1zK;cju>1cN*wo?!?Gy zIeP4XzR>USkO!N~d5R=S&OV-d^)#F93OPp8Ms(~B2>oGw5wE4BE5!7=tZXX@TZB*N zSXs0aQEcypCGxECY_B;REceu=%?0 zl1j4m;SkI}6q3uUp3}c08>-$E`Cm@{^83ne;nEJxt6$#y2%MB~5Oa-XH;tjF$cgL)?5@Ozhi|w+LL^7UrG>gZoE}YH7GgRv-HM>z#N{AOm zYYfB(f`D`HAp6HGaao#i5DS9ecW?0j{&L+F84{UT*{P#lJecF>6>Qdj%yDJS>^is7 zDfFZL%JApaUzXRX^qVABob>K9>w8Xi8$-K4KZdreHUa8N(89St=WqO6np&2RC zMNdyIi#H2331h`I<)iP?jWRn=OIGW=bJC%myR`o-I(6>CoMVlgP6*>#Rf0Y zMXsI10C^ToaScHqJ7V`14qNvUMv2B(|70G~%1+kX4njMUkU++R;zyK?NI7CKa77#k z_Av)X$FC0U035x%;whymyU4S#OB+_Eez{%n&(C<4AN@=r8T$ILzXx^#A?%pTp1 zXG)?{-#mWReQuTarekl;kAb;T=WdCZOzu*{O=JgraB}JOK&gCrZ>j9M1xa4oGFEG? z4WaoR9TzaAkbKC!<&%?>8JS5(Ijs+Ja7EwhFzG&_z|!01-FUJx8(nM8$;CCJIsYYhmmC#? zT7x20fi%s0^^Ote?I^%#F(5;M?O1A$7;3si;Dq_>onh(=jgeVB9OT_z*PGD!re`3b zZ9ipm?(>Swts(OX@d6Fj3Go|OzFV>^^?bRU`!2P~3N&ejO@nD5UKdC=c#}STqFt_I z-w(t$)3^*96#z2V$-a**nr0K_3Hdg^_3XATUePKWA9|UWLbXxvekHJ!2HQMjGL8TK zva@^MTtD>tu+u?~(Ct?b{IFX|bXC~7DqX52k;^QA^F;@m0edT|7})`H08Bg(y5anM z84AdR8nLS@abPjGZ3JL1mf0yGUNb9o;)NI9yT{1M$*C5iio6_Ot6bqfe=;?No2{b1 zi&it{eSaEacduK_fSkFKN&jQ@y6|K}GTD1Jh0!)yqbK_8Ta^O;)xWF9=;cZ~4G;Iq ztkxX*%DV?2D@%yvkt4EL%ahdD*r@O+10SO*PtZ;;>2KP`O?Ggd8Dd5`CUyNRxdE1P zTjtQO@op9#eWyU(p1k3izoDA6ld@Va5tU`1b!h1hSa-CyGdZ_-Lyq43_pzzoTf5C) zyqNua+Rh$JDXIRX;LxIMQ-->FI_3Ys7MHl47$x8ZDC?9_Z?;4$rlX^CKOB3MlTJiL zL`5@SiHeu?6j5|1(WAq{!Z1Edg`MBfX$F7=LNo}O@P%I-U-+AtpT6~Cw9tS~yL+A^ zo(S@@AGZuUV|CeA->e*84oZiw*)&7-xqMY*? z^&%Rg17GL06FkOU9392S<;w7OS6;$b(t=l>2op_rR~PBspz83AxlyI!Ctvu?#ac2$ zf9vsf>p_ruSVDq=gtZg={PrJGqRNJ{)p_Pz(}#^yk65#&axj&h)w+e#9gu;EFY@#b zj!>F6k#4B3US-}-e$Dqg9>GVPs4GH4HWOzDB>;5xcOfOO*`u{*Ki{$74uM|r@VId1 z0g~Q$i)s9<&!|`?5Jxn4ja0)zsc;iEJkNM1fSUuhg3I!9?vKca$4}XA^7iI9D01BK z>$}x?5#Qxc;RkkUI&LgmWt1qTYv`@f`ewlSEx5eQwC-@=xm4lr7EXEjX|avAdFnz; zehufA%#2mqe>GaXk$oO}XUv-kGRvj$_ggROv0%2uEkq2XrzsDye~g9F=rKhM6j)H1O;$noRp2>@#qy7%Rw zOXuIlAhl;4kUn1c#k@AbUq{@47nPS&U}>;dN!8>-GJ>ra#Tmw5y-(5_A4yJ z{M&-ULO3yh;Jsfb`t#nG4|%PBT#BsH&jy$f2||s7U}M+8VT_HYFZ!Otc?ga}6);re zT^n!GG2Y^Fx6c{jv`VH7_NLRMhTg;Zjv>^e)C ze?1ow6$J-zy7ck zHj`5T`~%n)fv0@&deke4Vu|U)d1=dct6a2z!1w$0r>d!W&8lfM->Xouzc9+|{r&re zU>9s6=zZ6p9IU{HqZTCbQtTYD+pKLhn?+OiZlq96xHwUySgEBo^SNR11W+KjlevX2$zu+a2ti-xt#tPh?7*PH7ErSN0Z# zs2wamzI+;krvX|u{<`NKcjpwJTy6rq9UZpMhu&NTpDkAn`JzzYJ<@wI;1jH+JW~`b zJZesXw_>jF)_8xCzx`fV`o$34D}|ItXAN6j8J3D=9iq+4f>l-qoPI8_*JiV>wAPr3 z3q{w2C8W>q^5U_v-{BYWu`2KNz`%Tp#%_DgK!Cg>BQ^xcJ1|u~JQL>BMHZul!~=^Z z6jeYc-(`zn^2b?)G(0OOXZ@}69Wxr#ynPC4@;tmx72mX;f)Z4OW%xnKv*uxF?uLD9nidB!emfVtF;dY^7=1@!h252BN zGj}E3!?Wx9_ij<{BcESV#c5-aeKCs>dY$MaY?N>#<11~p$PbVPRJw_+)-UN+uxkFsT+ajaPt>)Jl#!aigb5S~P^6Nb|XWI}b>#zY0dK>eq zb>)a$k@s6ofzy~6!6gtdICr><;TS{_|H%8DS>?Y9H`*Aw6c_@=4`6$`zl7xLV>;%e_OWcD5LKcsZ#NPaCqV!;w(P$v9 zKx|uMC6~C`KLmg;@^?Yv)i>iW>YD)k;r2Bc2>nV*O2WRU94rf`7x!J8F-Of`X{5q1v%9NEV8;Ez z<(*`mUwA9xhhDtF!~%d8Wf>Yx%sl`uh@E9z`;G}4^7c@%ldQt`eT|svBi28YHS7lk z78nl{-zJ1(`a@G7GJ@AR+i))}1{n{wg<&y9ch8lo%M+OKNlS zzFt0v)m!ex^Tt8!s)(EbfdG7W<3_(Fd8^V(^=9HdJm(pY#Sn>U&`&=r zlozPY#<1>hKhXy{F#Hygu3CMEvqVCWN1N1Pd-8c>H$)2(vrZqhd@VZy^aO-n8AAQv zaQUE||8^dhu%q|Qk5Zm+XiCZd>&T{c(<7wWOUrkuKFWd$m2QNcX?}OK^8E5jRzmlt zxRu9HYGMoK(z=5WG$bU1F{>buUOX4ijF~<&%?4m)*v~hUu~|Wn1L2(3^$Uz-2gH4H z*&G&av%P1+Mm#$+?%<#BC-1j=wf)#ND&kU!!JIY8w^2K8iQe{2t4cX{K@`RoU6BBM zS-feTkOr6sbJ_F8BimSeiQ0#^Dh-aaTmAk02F7Hl8N&55HijzP!snKq1>JaO9<1>xai{9R4&pYC4`{l&gp6Y3! z6dZJ?gsIlG`@}iuhA|xJfAG6ZpdhgCp|U_qlbXv}0JDi7-XAmZ zRtIBKwv7;z;gCUNP{Hh+);!$O(n2pBjDDuAqa&cVxo$Al8u*K=h_tlys6k`~8bE{H z*ER|)Da9TO+c?RxDH_D1!pLY5QTq{8?dr;LpNU6bTqA|cP3j)VeZK#HT7aUXnRi3I zkBqXa`|?;)&u-Q)>MW(BS%(HbKhF+j(#u{$o#ZdDHiMv4$}jB3JlE3EA)lhb5QgZ) zmoHzQmI}B@FZap^2-!1vz{hA-{M!cePvDike*Kz+Zq_|ibuvSnv7$I#^Y_Ha;Ta6W zPCs{u)M5qOJoV(ma$jYXvbo}(&sWmlFR=6+t3ZshxM>#|XqSEyVPiKKhs zf`8*+l&kzH;hx#Y*!IJDWbV5wopjL_Fv!r}ZsmW`<#N+;8G8*%5rmjlx*$c-yR+K9GE&atrkHzk1F~iM` z_dfa|WaYH`7o;wBFOHRMI&tmqGitH}u}-Z~oDQ80=Rp12=Di2UeCjuANagD{Z`O4k zyy!jN<@;d|p9W*zm&C%PeI#j{yUXI4ZJgjfu%5%|alW&KpV3I&tzSL{&bZVKC z6T{6{nA6mRq!2}s`y=dry5_@kD5{v*@TkL%$R`o5ldgqd@Vd1#xDQ<;BW$se_5gDn zd5L%BBM!jq>@32g{7rEpd{2HFtSnKl?_n6{EQZr><$GSimiH7Jyp@dL`+`I?KS`Y_OLK zcl7l18@~pJyM6P=%Nzv#{Xy zsjiM#s4BBxs__cZy(}DPzaT;1m%grO52fJV>K;q8t%Z1XrQ5~!5rj$dm+6d+ea3=* z5m)fSz^VCMm+Ek6AH0ruZLdG8@d)GqN$0dw0;-_0r-$#tEndGn;zTz(g~cA-2;JcS z(~Y79;S=7DXb-_}MW@^9ynN%0GV$gVPP$`uZuqq~wr;k>=e-y$b`v}%kf`ML@}JZK zG!K^P*BH(_xLv^0D9hA3uF_$>;}gA#-Ad22(<}e}{hRA05jcpTq6(imIP@Rwqf|Xo zx@8I~5b{ROc)Tr`kK0DLW4XTc)MQ)~gZ6pHL~ykbcB`_LnauKR5lFF0=X*A%#vGiT zrzsz$x7Tg5emCd_MDNdblB!0!+KQzfKHLN-^yI+>GKVGB&!7UBJ|OqynU z1g4h<*q{mi(b18Q6ZH=EP;5)4o*lqIOuW5$kd!C+?8{{W)*cF$r()M4o*gBiSlGz@ zHrKuz47%Soq9De``7oqY0`)IRQ<&Np2?!jz0)o4s4OmO1mil2!m)-%u5swbKQYkCL zyxtAS-4VC6k0v6iw%-xtzT5^*;%tE5?47t%w`_a$>ShQ4-(4~PhBxc<$c~gFo@Nmq z(&3uI{`gSy3O|63>9&72cs=Z!r@janBBY^{R8P)ArW$T`)tE2zKT4itb3Om8W$xyF zyN;&CnDRiqrL)K8!n`k}YKD2TwOHl)jh_SMo6zhTO>+haG2_aFs37kN0Y4RtsDULV z$D?Y^yB{d0pr>#ys%o@av$VCfq5D?sPpA*X11dEp;CF|Ec!bt-l6hG|fCMD=1`S{d zU}0q?KNIiDp8p=}@d80iDuz-&XFP){h6s9sr-1~cH(=;MK-)Th4@XYZKz3g^2kMKRIQ%t1P* z6c{>xBI{yidC?qhKgR-i&J`^_vtW=}m`o9?pTZ!MQ}pmUxSjdwK}OQWD_5wIY}Lce zVC3R-k-%!axIA7|=24G$dA8r$>mYBA`j|>pe40$ZKfvU#HU+%L01dKM^cduxts^^N zX+t;uEtznLBUD#k|K>-tyQsvCnT6-ln|h#RH*IxKpcl^~rkHl{p?^k4oi$&=eT2S^ zLqV-`*ifXFh|UMBq2(T}+~59P3JiXFQw4zTXm?bbsDCn)_*)%(lx4H{{Q`p!9cAX^HOMxgjXG|E zL_41Jv-(&(4jEPbjwbl)WswRO509y(rD6-XC0g)2H_N+PjwkH$Q{l&x z#IA$PZlV|ggWT^g=Zm)_oP6NBAV-h#ap@McV^+EuoPG>l^rIcq@|0n{5p@;IXbqrl&r3Wn|9=GM-`9^i}osLnB-){B3RK?n&3oupcpkeho5CYvCg zLl0a7*mE;?vNqY~;akDRg!b>gvVvh11Y5r0D}&VwXl(P{fjroiu~FgOtc^@P$e-K~ zg^pb8Z#&$U@ltd&(nzG%S(DN^kBUpdJW+CKc+QcN=f;Nvl$G6`T0d^i#%`{z-^MeS zrX*MGO2j`&O43`TuDj<@g5Wa~7neL!!!QuuLqozj`Wb$EfO`{f$x+ONXl$4XEd#$n z&7~{dZF7(VP$eoh0r;|n47@Gwc6p1(l=mAjj=Y?n&ow2oBi{l0p*G{OK^Gs%7m&a! zpr%NecfmnGga&9P+rA$LMo5#ZK;fW>GiukraDi)~rXT4ezzaz4@OwZ+ir(CdGKf1K zz&1b86rL$IUJKnR$Ns4tG5M=*dt4kW&)6&0<+XYC8sEDkIMLf#Q&ZDYKgb({0p(Gh z#koT}j0LLm3X6vXs2{3)&pRY!%#3PG9$kuEE%=YDp0UbxPraXr-mIUYO||+V&mkj< z-|tQW2oaQ`q>iKZ9C!ALiiVF=o$s1<8yp>dWzThbUyP}_xqtjHcwqt*?d3UeG64l(TACe{!qEv^EKKh^TzT<NM(3a)+&i;R2z z<#JciSSiW_oejQmSI z+G4sZPZ(etC!Nc&0+MRrt;J<8JmgtzAAe$7c-NL^=Pww5eGI`AK)8G6k9Yzb0H_)1 ze#A@;n>c2Pry8m8+I9py9k>pSbK@-&A>&LCpNPH0K1@*ExFDiITH>K0gfw_i@lVbr zNOPsD`QHf}tvONJFJR2>+Im0cQcv26(rpo2DRcElT5{fjDZy6EHFBc1Up%d8$bZi+ zW*}5cL2W)LHrtJk^O|u$)qB!2ucANU43fy|??ny@^H!RybN2 zYP5Vi163ToHD9!>pnczW6mvkUYZM@yvDl4NpI;N%r+ncQEPhp00cx__sn!GKNV)J$ zAZTFvOPsK{HD)MGbZF)ns|S|xW8f%MeLkf>um!CYhB}fDE{%aR+j!wx;2k##0g3~A3zW4h|^U}Kyb&{9NrEoV%4mhhI9fM2VFh08E1W1-_Q`LQjxCaei6F~ zsw`PJ@-(qU?ljA8wI<%zpbOFX?eUl`co@BCIhwu!5+@{*%O#RGc_eGvTsJy%5F&%3 z4%O%zr?Bo3AwEnrPM;)6ss_Iomc4+;1!=n+_;0sX)?eGL&4YBD+w&`wY2S?JNpapU0w= zL5K(tpO}v?9~9;UbU^@kZD(ciN#i5oVh#Zm;WFCJo;qyg7ZF5g50X(6Oe`&*Cu=BX zXq!4XsDBN4Pt<`~X!FlCG@Ruen#fZ>RsaE&oWWKm#z`3}@+ZBi}Mfl5Vv0rnw<(Hp3)0dh$`85tR2!)Gv)qQC%x z-uCLx5coI@#{OwnZsE?axzW%M0iKZgCMSkRsDHtmhn{|#UwoU5RBeAY{h!BiantK* zFRd~4Fl_?rf?dqQ%;gp3^P}$J;o(H!7`o{`pR_f_r{v?$XLOF!i;LjtLMH}1oSYqF z!iGMJg(vh>dRr{SvRPSKyvMpxWl>7E4|DZEs=F7`+PcA=d9VHnXSl=Xa=xL4{&Re< z8|V&@;{{nnBB9?&<3^_K#s?mX^eobA9lGaGmHm>Q`< zmxO^tLVs{95YePC>brq@P{HZE;?|r0mSD$O$qty$i9XGJ4sHK_ObkGC0i%v4^j44g zaoLs}yr`_gLYk0DzKI$tUdB5BAr!FCm4E)Ms`%jWfdgxZQbB}hd?qqg@jiTR&q@XE z0>ll_i}*u@xB8g|FhN4^hW>L!3CR@yrZUhyWGS^By#zCcWND62=Ou2aV_=vj;Iobn zR|b*V9z=@CX}!UHJ)j~Ke(^PH+1T3B*ce_`<%v{=#1wqF_`^RB>&y;v5O$`RT7jjr zh^8UPcx?2L(?N+R{v}+d&jLMoZKihBv1D}Q4(s(}_wAWY>}k{5S2jLH+SKvX<7Y)Z zsqcLmo>!nsNkfV&M+9WPmYa!(PFtwURo6j311w});c1c&G^ilHb){LM;F+JF*a^hR zr*TUWb}NuJ+cNLaizlHppHfEkKnJU~cvFGo9Dn?^edNq%2Tt@9RaI3#?KsQ2OPD7C zK{5!>Rt@rXx?P*Y=m(7jFsS2M{C9y#0X#$zo+Sm?#%uny%IF|h-7APN0y`yrF41bPPy`2U1S8X_?&KE!IS zk$NIYtqTn}Cn;EEZ|QL%o~13xd}>K*(>d$T!OK|>L*ddb2@;Ro`+p_E00PZq5xHSf+)JUUO` z{oe%O=QHxG?fQ4CL-?4w55Kqscn4r73Yf0Q{Ybm_ty^oeVSvD^uNd9EAM6_16e2Jo z_$sHNUckPI$elszc|4{_#Y1$ZrePNZNg!L8(tctaAl{c}lcB$+Bh{mUDSw{q1qA`d zX zIz4=ji0k!`Sd-07&)tro#sfbw*eKZTKtNN=UIa9?w2Vc!<>yb9SF8AeFEcVin|8U& zRaX5wmd6!3AI{l^_&^2%!DE&}4FsvtXKWhs!wswffp^!co zk*X%-XOCpmGdXf{UdV6!7YHS_&mL?-(oH)~{T{m7@84PA6834l5Ia0P%qa0XE};>b zsuS}QrdWqg2ciP31rPpgbUcf*KQ`x*GsE8}P5}93Ua)q-hoG;2*Hzx{4iBJhxw6qV zy=2ynSQ5CJynA9eLVr~yum&rhMqK-w>i)^FflSRA#cDIFyf%Eo&@ZzR7^Me%cBTdF zIX7$*fa(7D@k1?h-8Q*r93X7lS?-%VxVqjx&Ch4}4UwuKC^2<4|BMF53ACTsZU997 zS`OMzyAA-}KgSM;qVO5{B5Y_t1YD2(WQeDH-kH9Jngldian(LHHk-um4#EUuTA0td zeVF)Ba*6zEEsNCORv)bP<7e7(sX&<&W{a1{I3SF7{Bt1p*Wm zQxcdP)Gmp`+lhaLMSrS4q_XGX)Cx@9Y9k2ky>g9)*A${n(`(ll{pDmOf6XoKmywZi zu1|t|=KJ^iuT#TJ*hKd2`zm5BSM3DBOZ8c315m`uVHUAh!5nhs%Ahi<>-JCu#ipN$ z&T$^E$vPvUrUtjXpcsPi0ttJaL&u>biK&%ux?%Pdg#fc_(%lfWe&pZ)B6&W$!toyn zJMH3XV`C%YVqv6-Q5Lt0k$m)97=D@i4hrO~3F-vEYzZfo#ZK%zb8z*;urV+-n@=|;F zl#Pdg*^k#EA&|pEE7kp=$*OW_Xh?TOm4}#0ZJY(5w_LMfQ z3wmB0E^KGpGOQ0i)!6N^G|%wv3YOAB#H{m9q}l!?WJ}hEuc-2{EByz11UMIU%&h<=ywG7Ii{%B05g2`kX8ykWEPe}H zI)KpM*9*hGCrUjY)u@kl`=>!w6QU~Tk=c~KT_)KJt-*CgWxEy?I}e1=L^IWQ!${X& z=It$_CQ6G{KobMIFu0M{Cc@&ZfNg@%kwF8YiN- zeDD^j>^fl2?VHa9?N7;9#wY4k#wvGC@o|l?`!rsJe1)hAPtv`sT{$$%Aw&?9kWgHn zqd?Co_Fgrj8Xa5P>i6Q^AtS2TPuT8JqoM-!8b!DPFgRO4IjgaUgT>WK{IJvfU#E1R zLr1x`KMOufCb4r*n0Db(fU|qQQ$Hl(B^zbVJ>G(?y52ggwf^-lNJa-BCS3R&YD`G-_ z&lFD1%F7eX*@@TYjzwT+*xwkqIc zM5(`X0n)U_A#)3|va%vIfZwQTBngm6X1!9ZbPU_kQe?>C1@9Ec=U!4&|)$&}+#*C;X>DYb=}P1aX^{P^)5Nh7lvKxYNM ztPh{h<>B3lDWaQz!gt*WFhQLDR>DG6vkw4lFF;+nSThhSK&giA%2E~35{rKTei76l zVk&q5gBWhO*f<(ssmB5y8N4?VTgDi-fWLs)CbsTyq}Gi~K=)DP5YPO4CIl^_c{pY0 zxcFV6t|CG{6&kw58fiL{gvvdPn_25 zz=KI_YDG-Pxwm5IPtkqW2NVQbe>nH?yY5H)x-fZz+M*!6eD$hg@Ve2$HBjV;22~UK z*67s^9mm*QB?zHjRbMd<9&~I}*nQO%L-!PgJB}Q8@ z17j93+$X5HG_#o<(l=mtm~`=HT?3z)A1ao$jSY2k3ou|n9OTit96(M$A0hN3sb+4K zb{!`HIO~aKkgFm*WQJO~`sgGq$nLcNgeV=rx?CrH+C~lo7(jo(lHX|$4FP~agxQ>v zf8k_wLlrxEYin!P(cL>6acd+*Q@4fZ|Neu`&)1K>$FGOyrTfX9f9q@1ndm52g(kv$ zYxPl%zjE~_<#X9~%oGjMa}yK$E4uCLEx6r_<7_c)EG{mReCnkaX(4O}@Ge)i1ufyw z4xSaLq%f)ACeL`f{g#8ao6;HwF#}@C^tU`h?7@5m9`?5OVpC%0i|J65we;vtPs;$R(@6 zjcmaaK9tN*c&C!eVyc@4H>R7dPYM0LE%yOj72^Y#vU zDj0Ot#}9M^N5O|qK_Zq9nV3iP;(rS*DJM-Xrf3YdB@KxDV}8&M%*3guNP`8Uym`rZ z%aA8pK|AEIW$}OGI7zKVk?IH|9_qN~t=5-_p;~@joc1Kz5b~%?GmZc#RV$FNVciGL zA0Mg^(>DE?iGNm_+|->rZPeZYqbB-0vmiW(P9CevbC#b^>aA%LiYv83-=e1ieei*D z&hu{+rJCdLhYaVjj-pLP9bUs%*}iRi$ZaQR{2wmYmby#8FJc&E;PH$TuyKNi_aC5` z>`nlBW;7`wwUys&9v>6LYFJ-LckE8X$wEAqSMT<6=x>v=+uyzHo4SkP98(V{}8ZktR1X3v-MADuzmp7-O&qo>0VA*pYe=>tqaph}PGcKweX zgP|p+s(xMHo>d$k8vlwEOA4fTg>{9Ooi$M0Ar}y8u1A1AY-K%3VZCSq`9jN`CI0}Df#y4pJz43?o|rHiiyva)yrOkNik6B#20x~-Ry zCQhi)Nof|md4%QYAMy@4xa-pVM71G5J{zn-L)1$MsX*G%1~0~6#GFwui{RxW;&UhE zs0#K$Jcfy$#{bo!#qdl@RAISAZ1IXVC#VbjyqFzeUOIw3^uwN_xX}iUfd%(c&) zn?EIn*x~5_Fe{y4_eb@9HIYf%(%Gp9zjfHhen*@~$Z*_mdQgiR75{!nc4I+VzbGb| z8=iCtd$!EN$8*2E6m1CyI}lv-x_^~J{Oep1ur}otN0;_7%U|u^Y3r zoaE3`o8dGsP{O1Kgr>s7uOQEtSZFw>8{7^fQBlOwx4NyFn%?$hoq%Bgb zL6TM2h=F}^b}zgzxI|XG8;O=XJ@>VroBIRR$Zhnqu#P!dDt0N1mlUe$jnbZfzrCpq zBNjzeZhOgRZ~cu+j1=*~!jbx-tMT$dAQWJ~Qf6Vi#UKTlUTf$moaXnCw!dkKy$PKW#%b5J?q3sm0-yJa&x9;vOkS z&$QkDKj<346EaN$?S2u15V>IbsOWzEI!HTJlTa1JxO4UqI2_m7rPe9EDX!N>aYK;2 z;ygKz1Ug9P?@w1nMMZp9$f-vNjRQ+azkb5K2ovyeXxoRdj`~b^a$`y-!1e3R4pNUH zOpA8a@}s8)!0=3`sG|zc!e67OZ~s?kFPbMO0e@bLb(_^3M@t0jd;XoG!q3FT{r=~g zA?+CNsSNQQgN+{c3(XYgjga~b8?PehV>{R`6p(^%XZRRV#e0eRbdUo)Ak=RG@TIxy z>1eNc^h7lUDTz%LI4q2Vx%50cvA>8Km#!yanSw)r0A;8Oj$`P6s(0w}z>zx(1)OB+ zYpaFnq(vM1QLr*Dnky5T#yOLZ?9@en*-O68&zF4d7#Y!q7{7_3rad@9|6{Y$3yU#J zHD?-co;p5g7#xub3FSjVc13*i)_#k;He%fQ&RX^=gi>0Z8nQ1~vC&LbfBH6dJVj0p zCfJImv)I8#;%St+rY(;FU;?sUo>or9cA#%i31yE-Ic=! zfDt(c8jDZ%6N+3c#Ly-74ri9#$5KJ>n2zFy!3(IdpQ(gfR_T|^)0(9F$|;*S`3Og+ z*=@KucSK~h<>y(LZebEdF6oLYqY_qy;u~{xP+a04!(Rt~|B(3w{ePsSeTV5XhIzQ}jw<-V`ew@8-o zY$6hKN3VLXTz=vkGp0PBqa!c${Y2I`g_80fiTFnowcdv$+y4eyx-AW_9y&6<+&evC z#T>Xgop)EQ+WVOQyf3c{HC%Wg_5F&_oq+tzR;`iTprMEc;!<*emGu{j{$5og=EP&Y4_>h zKWwh15ELIO4|Q2)uYS^Ls)GBJGr7FycWw(J*jLlfahQ&Qx1kvN?SZR;P_qtgAKySp zk=C`-6mn=&JG;!C)jF{JV`@+~C&$)_ugtD~zPRWUf6VKx8jD=1{)GUY1lrd}Ehb{i z97=ZN>YJ)(WS!=gnD9vUD_b(?a#{6fT>Wy+G9c?urfvj$nY<3*lVsZnt!B zaCjmo-F01oxR$7GgoUyU69_CM*o|>r3|j74r=zp#mYCxcMPutU8Wa_@Up@R#R=c!U znyE}ar`O(TOl^#U6m>->cR9zq0^KD{8@JH&TdqDRW z-BQ{xR+H9Ow``7YSI%W)P6>W6yOqSv6Vl&AZ@q`Yp7Y(*iSrlSMdvNd&1FSckp9#% zGJ7iUq|yNdM^!tdG!A~1dIQ2MIVXn+KNtL5Ipn0S@dRJ*e&dF^t}bFSqVDSb7*ut3 zKFk(CQ9p&YdQwSA>B-3_YEP)_rI)-$p1WRKmVX_)UOMB$ZEHOW%}a$39*xc)5&ctc z{&E9L`K@(Zxf$cVR9yEZ9T`4oTeB>dbGOC)JR%Qra&wb1Gq*wyh4~1>F7=ykQ#K0& z3j1pt5&`!%50}W1+M!Aan;NK3e({0|x!`0!euIk?_4{Oed0mXZOw-YUrYIm%Y$}B&7Ga$ zGc!&Cn$&-@Lc2oimI}*vYNKG!hn>Lg0V3V zpd}!>;5&QoKRucBA-G8*=sD{O^XCR(w|zR=H&vHIUo>8q6Z~js`9P(TT)2O<;IdG12 z*#2;C|LF%Uzqa5TvhFh^ksV-NyKHB7uGMX-rG*U}Bnh{Pb>Ysd>6N>3A89X#ODq57 zowj=T=uzR5r0ce}`-X;x4>&sz=j+lXN{k@K1X)7VH8uSvCmsKGpHpJTaoWFsKSNX3 zg%pjXv@{xEVdh^)PlSMdOB+tJ>fkY%SJ}{D>O;A|P-#x8_#J|-# zOxgCy^5WfaXnIssRVhi29z7EOp`CE|*q!{siS`}|1`kVhz1^QHoLa{eW4gn8e(Vgs zTlmQ}aC|D|&FclrPPc$^t=7Emt&XF?3vBqDcOCYieV>?`O0AH*zv^~)K;BRHJwwtq zWw1+W>gXVd#b;e0&)(y{oj<&lyo_GGsNiy&OO}f)pga38c&8aTB)z`JiM*$)b1+0d z^=0MrVD3}*B@f3s0|m$ZNIU)%eg*G+tvJYMz-@YNj!`GPz1{HO;lsNmg=zd9*GpD< z&$-|$DD0+O5G%|exUd5oxcYqtNYp|@Lxn^|>#H|d;dz>vm=H4YGht(5VYyowrNS(; zJGBzU0C~{>w9ol@1f9BBQ=|N?sfo+om?ukU>J?Ay#}8M3tMAZE*uxb3qSTYAMivzp zcXn*3C(iU`YwJ%f^=<$}dwMRxs|Fx<{8%`aJK*b(iCjMT=w!O;vp=|M_$CYu*^h-o zTBD}>i+jzNu1^?TT%acAB{s9P6fD_dEXMX>diuJGDN^yq7e8CqLcbRmKD7GcH_EU;gD|ze^R$ zmz*Ch**7#Ip@C0L-F+u447YXM8$cE*9xOFo-P7swLc4wK!(!`x31t=L=d)ox2kWTm zQzPce&Bi&kLsW2P(FQvy1ZMZvM{B;ec)~A%sNts)4rkAvRru`7hs_v()`krmFua?o zLN^E}5LS;IeVeM_q>sc z=#-aC*cfV}oP^XhO}}|ki12)P;?2RQaL3X7q>AZgzFQG5vfsW9C@wC3S{mpg$q7dN z$IKjTU2;h$w6$5X-@J*8iBWWasiUQp^z`X^(fkD2xvF6jDO7UvRwi!>n@6g`Z_h{U zt&_FQdwaj{-Q9+4Q*=pZZXEiszr_{XJt&9qV?b1cZr;54RJ!x+Nmz7|t&BD3 zSp9q3JWScoUvlmCmuqDt-s{7hWFX2Lamj#z`@5K^sKl%+28}Bg9Z^{#n?ovzxKBKD zlOFipI5;@ejEq#@H1FO`QJYO@K6^MN*k~`?+A2UuXvk_|>|RF~zbShrM?y`!cdNbY z{7dF@tJWLj7sR7j1Y9hpY{dvWziPH3LT^&-&mIwj%Id-6Ee5xNT5IZ@H`qgwrF$nX zjuW#L)}6bOJ=dj>_(%0n<^GrBag3qlUf z<7&r<(sJJy&?AJe=}mk`k8WRBSPzYDZbUG+9uxqR%egFPF0!9dj;bbP|jk5mI%0t5HV60wzq9&wfU=V^yOo(Yyo_L~K*j?E5_I!3grTF{TT~kx@ zgXc}Ds}sG(Wu}#5oz73hj05ggd}9g!`mozUG=8C##+Caw&qP<@J$)hOj|DARI?xR1 zG3{rgoz_2lgdWet#fv17T6l*srJc_*+YFM8hK2_2OPpgI3jms!%mGPbpXA^6Xx!o3 z__1>=$@s6XOI^6R^NAV9F-Z^am4q&;3=-+pp;Dgbv|~#4no*j3XD*#cDyCew-Hy~{ zGCSS-U{^ZfS`OE4ft7ZTroSzVvnT zApfOz9gh&#@Oai2B6L57tJ_#siTT5w^%;*;4X;1G6?pAE$AduiM-)IXqNxi$OqH!-ekvyjimgduKI?Tw&9kyqYj?jbvIeH z>5fEP*@jJYjXxa>Gs-63IoIOZ-*qptFZrU_gPe-LMyQ$yXoR;Lbr9gz?&Uc(p(vY) z^VA7<#UY!3>S}s=8re0TwVnGpLNRmH3w2)U_AEetF=6npEvY54ufKlPc$9Hci5deJ zdfzL_`)8Du*Dg$BW###CbGWT!I~&K=xi?lX)q4uhKkTR%W_BGbdZQl2^Gee_qb(?F zxAD!L!J*YF7bEZ2GSwJO0A-7fT}S_x3tSj=n9w2IRf1hW;l_=lgZ})w@5c@fJpI6v zrK^%Q@27l*rvJrwmhFPfDy`II8RM>j4=OmCIMI z@Ge*2vYM>7Z&{}DKUT>%AGzbck%E+)wkz(NQEb<3q0|$R#Y_^V=Y2=axaP;2c*qBh zFh42XH%8?s$vhujSSZ!Q_6AV_=}nLDpEK2%oX}a_y&KN0_qggD3dY<1oxi>=1P9aL zC|TZV+J=*iI9J>#wV%Df{0RwJO^;~yxx%cwO4r^n`T!PZl z(oV|U_nxdBKbw7eefwg0@yQNW0qN5pXh#=LNHRta_zoB=kNDFe&Y~$`g9X$-VZGZp z83dYeA;Jzamis5yd_13gxs0Ja?8guN?At>#?q4t(Bhnf=wDpP)*kLaxbr<+vv{Xsr z+;BWBrprWvMAAXJv6PZ34)arS^e=gWK4tIksmQB?^#-yQr|2BgpYd^S4|L_2>@^}AU1!GSZ?Dn)JfCiK)b%K6Wu^fR8_58RLQ zdHdC?S3+lYB71Li)D|1RfLQjY6ZC&c4OYrEk&fjIZ~sJvL`jmRbyx?T6 z^>uq$*0}ZM{$VCFzDEa@g0_;Knkh(<@s;^S61Kf?bKTwX%dz0eFN#!^vf*Q`UNN(O zKWvaw(o?m{^u0}e^uTmc{n%vNQHU*rgM&$EN(u#AQ-mukEBPPRLCSai`oVGrb)hI% zIW$m>tb1JMT3XEDyp#k$z!5jIqGvHOk49!kd%^{UE2#z5)YWAd$JI4%o{m+Gty74v zudgTLAJgS-?R37Q;^(hWa7Wg3q+5qxqvwob2#5F5sP)oVnMh^sh19*@6lMpL?>j}6 zT*}q&b`E4@alCfzV+D_ZGnge<&WHt4Iu>oCp|SB6e#P~QF{M=G*W})$C&K-w9{}4K z(RaE*xijhM_CpNh#yc+jw!PxCx6tLQ`%MJ5p@Ohz4fOsTFAy^Ad!cn`mn4U>@Dmox z@~1B-NDoSOc9o;}czH=bTt_p?o~nw?Sjo&lPp`b9LJr3ihv??vu|)nYFvvhPukLIP zfdD=))N*w_D@?X8GBWCJ-6m}>@Epe_xtG&Jc4<63F zA2s8Re!6-{prhfcK>k$8pnB6@T*3oqR$iM@g7l*gvaLZ_LIww~kh*&nU-u?`*b1vY z^f|@F$1s~;LJT5c32+xg>$S1jo2wFj0DO~(Zf0iY`91nINpF}Q>}->#apy|;5H1o# zp?BBX+VA`8zJ$=>7M%PoTekcj9$r^Jg{v9h@!r{EES%l7H6f&OQv5XAm7B>)Plfw~ zl~r67>ARM6srT{fJo4_!f?5*82&4=U^n%CJDBX%|GzC-Bow%HX6xJ(t^hZ5@{1_k?vB@qh|J%=yNyUo06L2>O(3A7As>;ecTdvQ} z%rHcrdp!vG*|`_hn@AkdY-e+Y4VxZDH%JOGb!B@Bk{xnnrOb7nJ$rV$QTED}-OO=x z3;<3MG?JX1eV1w+)c5bvQ6kG=U*@wvn=lwSexoXBWV;<9@KM$NVAS=Kg4BXf3tH#f zvfUFmIsTs(0BBECwEtoY*by8x#<>K|TkAGSY>!{$NGT{K1M}wYfX0uM#oTR=JcU41vmL&S1p(i!+PAi+ud}Y}%rq%I~HoEo{E#cT$#2_+n}? zQiDc((V%!_+f9%8_%pli-ja0}yr&Vyy>Rq6&${+*U51#L7*nA5AkrcA0}qZpTPDhr zYZt}mbN>%h?*Yzb|Avi!la?ei4IyNdtYq)(WF=A}B6^a&S15aBRkAWlQVErD4J4LuJ$z0Kbe(Ob~7uG|Tu|frK>u z{!LMA6bZu)yk0<5FJ7FuDWhEo=F(M^!4UIT9Kfj|8l4+Ajx#KC^FXsmMN4ZhCyS3Ez_Q(oyA5~a!M6za>I6>1BbcNFL(yrl=UhyNfp=& zgi&pIY{-Xv(Tyc2OEbCB_1$Xc&07`dk^)Wte$PG8l{aD8U5h4Z=~s;mA=&|C=D1Hq z`>HoJTU4r>UN$Bh4nB|D*9>thGn-$Xo&54e;KkN3PPyZ`$OpWSf$F;UBeU$7EA6%=g-H#x8laM9PHw! z&z^<;>1@T1u6tmyHqbbiYi>KzdUHVew*tb>-0NRIi|jvNss!_O$!7a+iK(etOm}gV zCs;~VVwT0u?(p#NAd2aj>Grm^U8(#ol3z2Fsku(4QN!EIKO=-+TwMHfL&FXdrthHr zk*g@CX;V>5G^vO?;kzK_hq&#yQ=p7J>Sci~l`P!Y@8Gx>Z)j*pRKpenqrsqu!0wi2 z2}@hJzdC68m1yvOD=Mf8+L+=yu@9|t?%e6)OWbi=solF^gn*rJa^=%%A~v?V-9(e%Yggcf)F}Os8d)vQ%Uf;ieZ~XYe8=HvetT9!G2@{6@G`b*F1>~Q? zf9M3Ub%Db!uc=9Ob3HsAfb#-7;gt5u` zx)0lINVQqq{ri@8&JM%7<7M&CK`ffQE-dU{Xf@%IEroe7AOJiSJi7H>mh~fbGQ-$| z4y-kYKf;oPPMm-m=e!oMq98m_!mkN~g|N`6dXsgbm+#g+%q=W>N3&8RL%aKDdc3DRS-R#@ z7O~PkHEO%vmqqHG|E+&f?q2;HXQH|;;5&LzHOlOYQ$@E{+Xz=mc+e4NG@jaUTK7@e@G=4J7VEO8Qf%g-- z#Fx3<5y?Z(<$ev_EOj3qde;v;ny~tLJ@L=|-PEG|aC`e2zl&$8OJWV@R;2y-_;^xf z>o?5g$yJ<$$DK^{b#?tg(Mga>ffrVlfO%wjqBF?b)o{3?zyn0@@NcO`w#&e}J((Sr zY1|htUQG9K_3~n(4Y|YQS~}sGbJd}6H81(s1XJhKI`JYleO3zJt=$x$JYC_EKN&vg z;ru}HM?3mlK5@{y=p}?|1W;ky3`CEw|}M6~dMBey`8;R?>R_ z`^;X`@>0tKvB21?LBVsLJxMAWPVp3wk%{bH|62%5P6+^o&AT-hJEp>{qD|kN9Fw(U z5TUSdkY4PWES=(P?M?pVvof01)YRlx!*YvBs-d5741;AUQWUWpM{p z(dgFN0!PLS;lqRC3ehq+C50KBtX_Px$k3_08s;k5wH8^djP%2!hNFR>kFT#}?B!`7 z9Vt+J_BIsJYFM_v{{42^%=}0Kbz4@$s8ciZaeA1DbEr{2d-_zh{mxUpK-2vIt$N^1 zV}1l`z{Fq+M}FR`YsYIXmZNQLQdwQ%ia}o$Cg*a;Bz7^8Ee>yQ79J=bjzj#$L zuidjab*+55a`zJaRwA^#|D5Y_XO?QnC@uA@S*!8j_qw3?(l&Fc6 z66j3!R-{?`YAmD|7BT{W=BS634l(~kUNHEj44|EuKkPmRTMZPEuU`*gFVkSY54IUZ z(z<>f)o+IOU+i*J^f7@%XLa+Y5-9$4Z4P!!QD-ukjSeon&)@&6^~T0{!#XAQ4Wv;M zS4;=+6Dge_T&4S{@b2p;EP%!>Wy6M3Z!yb>9nywq4iGjh_z|IJrS%;ZYm(_oZ0bMq z?zKr*tY)I}pLvt(y$6Uq98EjU8Ktgv3^)Gx0q$$S4rVt(#T=N1SmQ5HL_rcD4iIoc z;vKzPPJH*_41YN}EAM=#TYm(plI&wnZbhgHvpYEky4)vDR9Eel4Tr7G2KKd%UiBF| znM#b^GGfF59NEDU&TINM%g0;m!?&K?Ot0~w-e+~;-eVx}q{{T%R~MjjqphbG2i!#x zxr8{<=s-xlN@b{`l#us?>8}&+@5!TdCsRhYwcTMp;_)!i{?g-dHRzlfjjA< zUnn%kUx>^}2FUUrCRUz=Ym43YE+kBJCmOBCQAoKOn zr7nG}_}8|m7*;q&Ltaqsf8 zXgh%w|sK?-dv4+b;%ZE|v2c z=r4iBp)^sp=(MEpKcP9$55XGJ`+^3UFqAy_5d|o3H+WAv4p@SwB)jxs?=-C6n9&ju zPa_oEPLgTPQ4%n5&Yzr^cVSrgi+>{U)l*7eBNMEd`qfm-d^$8UThHGw`fhno*TPHJ zO%uK2xn&sl2Y}ujyVDzI6p$TaU zyhGnHV=dehOy2(NtP}-U-xB{mhTn_tHr51d-n1m0zk(#>GA?|pE8^=^3zE;Jyw=6* zSsUkt(21y8XtGkPQjAqqaop?wj|;3Ch+Sqx&f#r(N947L&%WQfw?{>Gg$BsN%y>Zq z$TmH1+ilugE7+rI%e$f`KH5xKlr1u;u){=Wd{!+@ z`>*DTaWc0GF*`3QEiHUK3Zd>xK0C2_9!|ZC)v^B>s3{P$tS}%^pozie&#_wE*w8TH zCtYVUwT&Vx%wN}Ws{F6}qrR^;PHI81&?I9c@f z_YIIwF}R_MR=tDCo|!G1*Dg`-9TxmoZ5Q5^5wEW9cy7<*`^J@oyS%?Y89f6-Z}<8{ zHx{#-8XHL@+)=Q;*hEs_TbQ!VdKAWs&ESADoH%i!X!J><)z2QuMj7uoRpb~o3-GEH zu|@?nVmt^QRy(g1h`%VP?BDWcDwE@6wBy6u-wH&c3KGi0S0`QH9Rg0l zUp7rf*fL8_mBsF)$oqDpFtLC+Zepmx^T@1ss71vdqvdzM##ZCh)kHApz+@Enze$tK z`dLAXJrtue*8i?uNVpdlhZ;wvoHNBG5GO{=eU^jxo`j?7Vy7!ho<;ZA|9xM>R(M~v zrd_*h)XnpCN-hmsT3XWiwT&%2@y1XfM$>%g5ARV3-uVzdaA*TDla%}Qq#!TP{!F6g zmXu*ZVPSX{?qRjQ85hac4H^Qf@>ke7W0g8`jGsTN94`^uM6mx>jpOEzR>iocv|l`h zM+$l04GN{Ga{O$)`VSF8?N}9}0uwm0A7aE9k52!*WZRn-#LSlKIr{ki^kaVSU6_V~ zZ^v67(+ZlzrWGEtuMBpUz>I!`UW{4zIbd+`POUf+83uXQg;hV1!!K8+eH7 z`g8F1u2G*l=dQ0S9ewis$49BGRK=iTvd;9HlM#$#DWhc9#Q;~Kmq#k|GHvMBKYzaWSXYpj(_1o94 zP5QL->Y;Mz5&f`ULO?UPo9-`Py`m=iUmKgr$lSw+4zY{=ITn9xLJ{I^M5%>Nft;*2 z#RMaBB)g}mV6u7T)Q8Lp+R%<}B_PH6h6WV_gH}JziP6u5^`#eF-js=g$m7qZ{U}D5 zNPgQY{=UiWeOWr`4=p&8^+6NbRSr_oWXTxx((DOutvoix=8Zc7)qI^q16BRwBMYc@HGY8gNC~jHEt+;N4Z|+5ngwo%MfQfc*25rHFD60^4Es=!LfCb z*yqD(cb8z;QOm@a9IgI%z-_>t88CqGOq_z+mi;Ly*>T>WzXKNBcS>F_=LfKc0R5cK zg#|c)W{zJv7EhQfUVn3CaK` z#`^6xZku{WpUiSz8b~#6(~67v_iv7U-%{CeF-JC;efKe%V~Zxfu*AX{t0diZT`~o9 zrCvboq{;&Y-)F@M9SJelNhYyKg2iWGV9*hDQr!%ryZy|}kQT#( z-=c~5^Y&MbSN|T&2+&Ex30P`qMmGQ>ZrvW8%a_l3+|uQa%lxQjK*8;aWl5Z+tFWao zCxk}g?%hi-EA!IYO$+rU#Q{3-o8aquJh}lV4G&W9HbxLY6PsitHftS>Z6W{uH`K8V z)!vJM|7f;0hTs1_^m1|VibX;|`vI1;s9|^f6qtB~WyA#{_23|J}e(=qY_PaAv z1>L6bKJXbWNrC}73GHb92<-g>4wl3X$`%0cPj*e zStzs}hCJz}@Pr>0RDp+pcCQ$uB)^o>AFaad2O8@RnQ1=|2irh>)Os#?@`bnB*|U2P z(J)7c(p8S2SwOLS9?ShRX*US7%j+40Fb~4sXOW4zA?d}wBpCq>qv3Y8!!n~K?Pt^c~$;B zp;JswcEwQSrAu<<(kg(yn>-|S4qChpJN1==7TplIdU1aun5mvps&~Se@QCxskTqJ00iT$1;|(yZ z^vOv@UIOnOU``FQ=Xm34Mbq4P&##I5v1$Q7DH8mR_*4uH51?ft9FI?(3MeTl!5c`^ ze(U#)I_~B!ax%1cI?|^xBmjOLo%+tzvlOb|Fb&r|s(1PFo{Xmbi*9ru{zugcmSdw0 z(Ka+xt8W8aW8EQg(ObD~7FeV$4;AF<*|sa& zoIC#hJ91cz^*PC!c}|c}4j(>@8yr~Gi*4kO@86REIK3FC9+dG`Xx<9K!d?~WLi#&T z6l{f(klDxB`33gv7a7trWos;@0(Q2q%K-s9lCk(!~-`_Yyk|C z?kKTdY>Quq3L^Nfrg%md2DLObp?{qA@+Dt?!x=Qn;E`f|5v}uohm=Afz0klq+XQqqh(5X2bt~8 z$cPp+kB@cte!J@SMHtb)eYV$O%PX&)W`TUM+I>M$&Ra-CiqSZ2 z&2P!@{1hx-(W5hejGKVrZ+AJa}eWjnjOdfGTM zK#Mcuz8*Pxve%s%wJK2IBR`Y?xSnq0=CTlfSN7#!D z$-_II4EL{tbHY9so}SKzxd2df@&6F0QD4<2wG2A+!fBddXR6k7vzBm0R`ud09ep{H zsc>l*bB^D(f!cc7gL{v9_k6f|%4!=4yvtpY+ff320Is}QBtLn=`GH0$_Jp9>(IWCo z?_)-^xp~4*ypnrca8+vR4hK7{lx)2@&S4%<_s!{L2(%?nPn{sz$Q>xH2?!8VIz3xf zJZeykw^~xIddY-`hu^Ki-Q-CPu*RTIL_}GU7DOieVvV!~y@iaic$` z`al~yzwQ^h3KsGZ#r(&?Tsz%s&H2^SKGJdiwgD z@yB(tJLV%BEvvVWDc*D2c&STYmuX8+dKA0gOd?P$l3mjn9=>vXmZNt-rNn(lvq0nm zY3XFATAaTprw!CkK9FN2VT55J&l6jV0Dr(S;P=P~x1rH<)bOKSLZH3jZi^&FNZn6N z1U_Gq`H=n`cOr<}7(N0GJQ`nOmiIt!W`ZHDM1^{at#EHMI|QBBe(y3#oH%uTVXs9l z?=P~?4e<)R>fKkBb6aC6+(G?=&Q`SQ>ns@>1?NYsWXe8_&mGu3ohKQ4jXFmq-p@(V zu(}>P-fU*@E7B`zl5GR?q6FFa`}bRT+bH2$O%UdRyTK(32qXGH6xgUA4=ft;{Bre> zV%}u8YdpIqK<&39$h1}5>5r|tlWLr>saro&+e_UyoB}ZdnCQKFb@z)XLTXH%Pp)yN zzj14O&xeeL9}zjux9*PI<>vY1e{0_vKP8gf>G0vCuh-ZY)j${!thq;pev>fsguPW_;*!)*QD(`t@DQ^0Q+{L>e>odUsG=q6T@>gsew*_$ytC2p_+#F}Dj zU-L)bQBWgCdw^nE=e!8^c2PQa=I8FOu}3WehJt-|UD)%_bkC+^I`v~M+~=d*2%-)L zWmNvQ53EreYtvGSl+!6Ex0elvA89&rm;!=;lvTdN?jWavAUVGLMj@a_Q}jw=&em;P zw155eC~pt-^Q2ip$BJ={SR}+q+bh7W(mlXCzt|amrTw_x7K&DeG&X_w<30gCjB>wD zJ$m|-8%&ZIh!kMw0CG;-zzk0rHhptZt-C^l_BO6eUL#}~57?$Dg|Hm6-*-%J5BUCO zbtip)_%bLP&IYr@eZMn!d&GHtJLwU>7Fhvy11?><6FnFIK%RrL59Un>vi28|agOnApyg;leY9BL9aA zASf;#f)}}2-Eqj9@7jD;K0n77|)Uwc|5KdUH+I?fk`j!si)^_YTEW)%iC3Km4NC zL<0VleV$16u*v5w%?Nm^$OhYq?NtIjVm3A1!(x%ae(gto-LY9$|NE@BwpK0wGGMM* z?+Bh5rOywT4;}=F=ZgZ!)|MZ09fHMkxGS2vEfscZ=hCpzA>lmrDbA8w%B}46Ed3;} zhd|R29o;0+R+Ep)R) zHTxzTVKaPVq}ezYBmtgEvnyM2CE?h;|FOH3Ug2RkUQm{4*Bu=k-fGa}$z@abzCF~kI-~#eOPynX{;wxEAi@wc%nYbU@!7o7n>5{(B-uFpM?QFOUvYd^<1@tSxQAov zaT$Xu^;*7zRf{{O>WjCsG5z!LadEk4Jymn|=((pTYHZj|+pJRD-SiO*%l{=pyld zzzz7iVt8+!v%}^~@-woi5;MbBsWc2W z2z1D)#1L#!;EJ7Nm-o`-xB+R}&3<&Fht6Vy6fd@>$Xq!%^KIgBu0{5`HWV~ zq?pitO0Xf&@(~;?NC-ARcO6jQZCAd&cV>2Fw_V`)Qg5?i$GPcYf-^r*Hnemqu)~|= zd(1)_I~y!+yjd-3w9}N^Pb+hrn_$GW6&o?S2T)YpO-)V3MTraNDmSPWV!{)K7#R>A z-2~2kVQLH}QZuV-M3J`oG$$u)Y)R$AkdGH?GUTl9VTmyUAe2DNWHgy^*}Jsv!3#Ve z$i!XJAA0<-ddPIvFEPSxu5$a&@gx5xZ*qmsS}gUuT5?J7*6mC3b~$igxpIxGK6G%Y z>c&E88QVgewc-8HT46wjxYg|xehON0y*C`4d-Pk&lb>w~xRI)N>?rXr*wM9(HNisW zE3@8HvW_IyBNuK@x~6?0#2WVSZ{J5x&v9N~`lvV!*rql%pFm1MM+D}^^t1q(pPah! zp})65(m2meyoE0M9c=IXhBo09MTgn z%H%e>Xj=c4H)8*-g%Gyj>e^^OuLnE5S5RPPr)Y`Z34K2y=dDn^K zi{!f-USKAI_l<*@d5}7IQfXvyRV`hQL%~ELtHr&#f&7wo@5-SB^SmD&-1{k&kE%n& zYoeQ#;wTxC@}*0=A#V7;q%4xyyWjzABza_-YESaytfdf2;-C+pdVd&7t@gJibL`Uj z_iN>B*}LhJYAq%aF&+PGCd8fEZ*3!KhrB7u7?BTtFre}LOMN}NcjtYSMd~Bxg5#F- znr^#UP2M{4es#v=xUAeg#W2_Fxmr$EaU55FTYhqVzL%!{o8+8K;O1rlcydR7cu6Gl zWq%7ZherWwENbL=+&I)~Xid&KU7%N2K5cNTh4P*Sk+sn&&n5w;1N8{1uv8YQK%LBg zLfbp8o&zJE4`8Gja$sKpjOTQHxws127&iY_nTR8- zMhY2exo>r+!sAk>oyu>23bHE$i(g;yLJ#+i1&i#5X0hYP!{)^qeo3ugbIISvpeQF# z0?Y|+2|GgwVu;hEe48lJ8baFtR@CrG@p-MRtW@j8;qw@XPxrqCsUZKj=>C`K4gHb@ zCV?kkhnlvwyP4VSaos1o^UVX!TRLw8`wjnjjq-Xh@oynvcjK1s(#CsM=_J?>VAz}n z>Abn+S0yD6N9$+pa9V(2eKe z34vk-nt;4pWWES-=r);t2VnOE165{}+N4HEQ0g9l@aDE_1qo6Z8GvEoeUUF*JCZ83 zf$@AAm$mJA`+NorM*n*w@$8`DNY-_c#EgA!Aw+_%4A$mUgSNGLK5Hdgqc-ezfnTdM zVpYp4c$DEm%Hmav6T#npevyE`&wXN?L;_?d4_cBxyZRo;^!Hw5;vus!cvHv_t;&$jlB4`sHLau;~l<$5i3vPL!R z%u7!qZN_|*l#qy-O_@DalRGote6^=5``3T^EHy#1lPa3DVNc_#s_TnqD(ecCUaZ~k zp-HJR$tb099lFKKNh9XqjfF=R)SmVsqMZpy2QFElW$Lj$)}{@LrSQIvmDL9+DImf! zxodL9ragJG9i+9Ok|~U)H8eCxJ1@x!3kx&-S?|Lh{t{Gr&}?>vhsF@{ z4A6fjzKr7^ zm$vg()Q6<~_;a<0XILwmE6Y1k=rF1zgI1sLxxXg2RhHKI&zQZxtdy#f#&+r_L0lIU z5FnAjz*1|Evi{W)HO2SuP?=HDsff7fzP*%FA0h(VAJMjCe$hDcamUQtIafEI!2{N> zOm}BXCRxNF<@-#anNneTG6V&>UYy@Q>-eoSU3ix`Gq${D6QQ=CjZieLX>?#yK zBqR=6(45!S_9fO#8f^AJdUAE55Cm%Im)ZAy42dgx5CqmS6;;eLZcK=p5EP{RXN+;ixhi0p#;FhbZ9LH+R*lhI<4U3X z0Cn~E;(iyEoqYT|GK|R{`|Edn+*)|QYW6>Bx|1?SEsp~<)Rn@&f5Po=bLeBNzrEI+z`+x?9Hy6+5kWTK0 z)Br*2ErbvxvCb7YmRe4Sp(uPANxs;12G-9Z!m56eu5as7b@QU#hnX9?;$)=9brRoi zXg<;~470v|B+hKl8#)cge@Q$3_6YG->CnB~vrAzR-V~jz70|W8KN3 zJ+*t0%Y7+h>}{bCMCECHX8!zL3y4`>@RK9Sy7?TI-FVU8_;({fmjBZX=fkwp1l6#| zbX=O$mrUxKj(F+stn9dUrg1GMHum=TxHaA!s%3IAzvFix|4?eVY8kDnNM8Lp)c&!q z+Hum!J6JBjYm4T9&q^R(+w0M>1H}S21@<>WwhVB^f%jOdl{JwFGn`UQKb^*L;9>}k zrNg9L;@{tjK@O~-6ceynpsC%D^9D33{^oafL^*!z?&rdg`J1-K!u9xR-B*-no}K1t zXE)_2Qg&sxsV`>dt9)70FArL`TM7)nPh*&-o4TWRXTuyZV8eRki$57e@bZXx%!(6) zs)F`fffxQiA(*q3%9p%Sa&?gV2D;~f2&!=!r_*nbU1PvfwzLff|0UiOP2 z+00J;IJOD#Qqe8rsxV8I#!!Z4TV_D1Sot9DZhB>{D zPnaaO%~Et2tZY<{R|MOv<_e4!li%wut#&M7>pQ9)M5!I%c8^n5 zv0}RO`0?W%FGr+1qqp7GB+EKZp1M)D?O$a_axVYiQHLanls6L%iz_R$|CG!v#qCRe zg!CHH{gWR}n@AmY$8HR;IQbKcz2%~+rkA=`ILBC54UQ=`Ua#inzn75~8v6TETC2&+ znAhzS+{ccoUlES`3UmPk?c>Mp1RRq?*Ne|>w#G{v@={fR=Gc-5gbqIs<9X~uO$z+x z1Mo=3P8(OfcvFt{UA~DqP4LPQK6tjdVS-x{DuYcO9pRY#12cdPWjbh@pckyZyrQKH zem@pKv02?dp}BiYY|KA_E7}<{kp~y-$;J4elvhF3p?4==RgHW4bLo@YmIIkf80bjv z4F&d?{Pgf=myn`oWB6`%cy`c&+dxE)y{)U5Ek3x6QQaj?OYVqn-}b7nMIY==>ff$^ zFdg}x_QCDMPT#0f2demSfux=BXTDPBnY}J5ee|`}_o|geYFxDZQT+^UeSZoihS0%5 z`$AQb#INQy)&l#{y|T2*6<1Ptzr&Lw;CJ%HFjP@vF=8*Y!>+}v^~rY{<8MUQ#NwrtBi3!oQvNVccD zvv7`}fU1_Sg3YA~dykJ;1%)p-CaS%cr&b^tRPgK5+qExK?Hx&$p#|GRA9DZqOyc}- z*V`%Qt#5Oa?<-5}{pRbGM7r*Jh21@D^~ly)JHLSwom#udGHEzO8V}t47&6zhU*Mo7 z$a{NRRh*xxZ&i!nIBHKj?C!YNy{B#LF6=9|2Ay?S^Szy+t2S^fq{H*Y#^OfBM%1Tr zraHQjWD`Qhfg)f9P<*ph7 z&$Cbs&aIC;SvuO<5`q;bPj_^6^-WJxlOR7QpUBJ|Cx}(0>93;Qq(_b~I2m;4X9`l+ zC}TJXT`%~b^&2;Tv3GV3C@7d5{{Z<1yc@w>E0K}4V${1{YYVMTxvL70@r6+f={*#X z=_w-ImFVj<{6K35=UyJ){ zAl!^}i>s|y?Fmg?wjy__lxR?ut)Z*Rx$UPa2N~pT!v^OjcesFIu%$en&sUUGq1CX9@`?f=qf*DnUQ8N0Lw?HcIyosA{pm0LZJ`3Xi#dy zjHYCTJB|j_*=>+I1cJ4~B!dDD|6MKJ0$-nI8r&!}YM=5WYoLd3@8hGnt|3Xu#aP_) z>-b3L3H2_*L^MDZd(IRw>NHtXjxzuefmP}-cC$a#&%ty2e64_E`xGCfPTk!PU?Ld0 zT)sC3!+aU$$2s4CYwo9{^;_xbA;H)Bac(pg5N5S8~v7r*Ca-B~?tBGcPto&bm#0vW2;i ziueMq6^~HeHkG5Hl8fTb5CKNFkR3L)8(9n{l}-|CwMp5f;HlsnYE8(WrzXd4AE~oy z`Dt|u77P0RVvZFQ6to0p75#EbqKL=dbQHzLqMX={{9FMMRw>WPKf_GE>D+&d=LVvt zO6KuVp`)FujhzcM_HZaaLW1MN6;hP|HMyVEH7J~BG|9ctAERTCOs0YrNoe)duu!f2 zFW}s8tk@S8uroAn28;FEfgaAyIU*FmHu|aFGZ{hm7_jXK&`Bh*M=Y}96Jh}5JD)a+ z_Rg2g!4LX-N@`s2_z;dI0F|r8U*{d&-PLHJpan6Kl#x4IkM=EiK(2Lj(bydOJ1ZUC z^b{6u+G$#*co-LWe;WAe)FtuBQ{UCh+Ts+ZkP#ZBP)z7B0R<8RP5~S<-2kL;%-gN z<*l*ljA)EMWa-f_JN3!Sfv_f!JGjGFE720)8NeuD14W&2$JYAFbSBw7By1EI@!^X- zL4%AGvNW+4Wzpuh&ctn^yf48bZ)#*@Cxl@M`MbHglt}RBoASZPpIqeGe4eUTAqJ2Z znYk;|U<5n9bnPUe>o^j+j1YLxqddTt&fT}Pw7;;hkW|6A9Cx8L$;sTngoD>Vm zPSTUAzpp)^fjya>ot*L$Twg2$w_NO{o^g|c0}&21f*N22VRt`;16%Y)&fyjI&(FWk zy=x|vfROU|fqxK(8izxug<^?6PMuYf=L~D-VJ)qW;ObxdHbSqbb;mTkN!bg42V;!ggZ{cG2#z5XSM@dK7Y^6+mI?2FJ(4gRQX0dG%cuHbcSQ!q;qZ zX~Bkhnq~?QcZ;>$;YrH^JpXl7~Y!T5DN41AxF@VO(P{1e9`tQz4NK^owo#H57|_qn|cE1xvr z@FjfkXqBr)*c{4OOk~QZKmb34@GqJ@23DoM~%mPK|oEIA@XX|KWu+c)_f3$|)$k;fBEmt|?1NxhY;G)y`&S10g-5+!GC3UujYzpgPWoK;6 z3rH;r{|DkaqksS2`UBT7;d63T^>ANywJdFa-5D%*<9^z2s1=F^s6Mo2|$u zXhEY9;$`#K1ai8L>yX*hqVR=hU}{6`FZV!GknUGImOy6NoNhOhI3!m+54SH$-z$^F zRwSNs=3Ni4Gf3NM$iV&iOj(@Wj zY1vu31$$XUSu~^t5s9leZ$@w`g;OH}!!RT%HT5(#Ion@IQ}oIQR0tvp+Ix9*7rJnd$^E4X>8qg(Hy&e{1;E(UqN5hcIX4Nv0#s9IrIvX zGCLQS?efcv-rE0%3qVbB>bGhA39j?@PO_Pai4z#|grtmD!$lgM4f@24rn}sqb8?P1 zhlu9z$t2)3+&TQ1q4@R(R*1dlxA7vw!w70-W#NX$ql2`F4XFH}SB!++wLuRr&?BDG z_yIpFzZ^zs6!Igk*F8mSV?bKLc6``dFxk~|9`=?fH|UP&ME)xqTeHMbG45Q=U~=nrDVY; z5nX{BM3w*2e5EMy;ipag=d*eT>AZSEBU+Z}oEmATB@r(q4=Sy0=No zt=A9>aLYv!kCHtN#~1_pmRPIpw)Th52Y?=#EQEFhgcXgFC3B=h8tHhqDf~@D5sucV z3%r4LVp5Y9XOD^`zOdCyZ5Tc@7s@S!s53iDD`(L7P*Jq|9D<$sULbg+M~7D1B(sPl zw992NwR3>!8<|!3x5$Vn+CvY+eNo_wgn=ah0?!Oj_?vN->)1kOE|tjau@RH8L%>l zt%WrE*LhFV3-d(sP0b%EpIlyBueeZPC?B~te&Pzugt^u`oyT_h%l&0@NK=MWCygL% zCd~4r_8;!r%vtu1j;GD4CR`*#Rx>YuOtpl$80x>oujwFfz)`|&ZYUzX;TSS6J{+1u z3J5Rmhx%Ej;OmyrFaO%?Xh+wQrN8%_aX$cJ%y+}5iM9eAqC>ZposR`!jAwNDvOK*K zEL31XnV<$WHsw7GE6Q@PnStBOs152?07IzwLf;j^DOcCZK%q52O7c#q7r#mjCVZ!e zhsYaytJQThIhRZFuT_v23{R2T?luh94rBIQ**mSV&qYZ`5q6lz;ynZ&!ppjAwPMhn z8Jcjxh9r2FvH}jrwAlQF0?hRP zwJ=CQJ5dv>a*&)#FI=Y?_C$@4q-ojx24gC(zJFt#QJbxV$|S_{3123BfmwvpH{p^P z?1O;#F|aPLAJ(A=l^-MPB4vN~cJ8eb06U$U9NxIhh#XM&-fS?$jpaUJ6$n*ur_DJ( z)IxNw@Bv=z9cc1Q&Qj>ML)kC9F}C2LByv-e7HkfU^+di`g$m0VQ*W!|iQh)n@2FK0%e7)Pus=wyP{HU||b}C~#dL zO_JG$jwIyFO?&%j5q9q_*a*mIQvI9YkeS7F*!YG1s>JJU@^X0>#&2*&_Y(&b*_NnC zfd$ukU)=1~h<5GrVkKr`0Mbxp)1SB&K@n*Bs=Pb`h9t4#op`vgQam?qjARm9iOlf0 zTAIRwvV&p8@8naX$z~jR(`n z48aJINDkbr^9g_;5D6}jeAD06TL~`nx4{kzu~&fpINBjn=b<4n+j}t_y%38E-i)Zm z<>{i+{9rDk>BE9iXtkNi>+}2|cA}L2QUE6)rSv>Z)kR*)`L)kRdf$kd0uj?Km!;}?9@A9icGEY7tU9s zZ#;cJE3h<{+oJz31KfyPxMd_%b+amI8aPsO8}P2sp^K6Kc<e>sJcK{Orh!bKWnHJebA!pXz$%{ll7ZS?mpcr6nb7tK!H*Acn1+JTHLk z11%;f%W#A(M5aN5=eDU3eb%mw{}s0%x1W7>{IP4wBO|K=JMegM=$uRtpW$vC>hk$k zAZqU6->V%-(#51}1#MQ0t8^g26Or0x4-N$e1DJ&-P^%1DeS0EwkxgECU*HWPzbsfVT?oluN8zKbs`tSX@hW7&ii&( zt$#8}#^e2A{u#F<`WiC7_aDo&;=gr%))MzI+P8+M8G9&sAW#xzs=)p$1#N^P2(a`Q z`a0b7pBF>YRV%VYZQKCci6q|SoSZ2K-UY??UKlcAIM!yp4~RZ0*M8&QT=OD^wKMDJ z*5i+%dR}HySP7*W64iy<7S=+%M3{-=8OfU0z<=hTKGHeYgsT_wwwMFja|cuJUaL&xNWRUCrG1HV`we=oX-o$;9!KZ$sNW3g#(9q>w!FA$V)8IxS~iB z6%{3wLto;4TjL2omVzv@+y_X6O5w3{M6s6noA)1fUT)gR6Bg1uyJ<>pYxnUKdb z)u_2MZ#wM7Ijz<6!D~z`dTOesa!v{r6NEP>Pb9(P26KBisT8i#Da7~9X#El&6xgG% z&Da+6Xv4?4GzRsVtTpewvHyre0~8YL@ShG+?ZjGT`tDJ`>s~~IMzwVPoh&yE_6$(} z7`^akrEX1ST5fB9+6;^EgWRalAyt9@17=0lKMIYDMI|o@CaO)oz{_mcR4jCjPfqrs z62Lvl%F03+8hZRW{Aux*kQ5PI4$_=W3*Yj;^6E)z@p`cyYu#K?MFr==8xUZ!yCo@O zaP7bguaIU+t`;qZv&-GMbb!hLi#GviCsh4ga5o5xaQz%evVYx25y1J)zUho@?^Pqg zE9HkJQGOs%rL?*8#Bg8&zzWaK)P_ap%tbSFfkvLMKQ9T9%fDY<79XwHS|ZyI>@++1 zFqaxFmK$`l>1}LnWyJ?Zog^@WM;&4*84vd8Z5WC z$RW87!)+76l9ti=Q{y;)&=^L96;AwG5v=7d%PDFM5xn zLoA1W{XiFvS{zRR9&-4|C@{ZIrt-wuqv&OH@b-=XhN?>`dN2a6pHSgB2o!8@jXj4t zmINanUwNRxS^I^rZI{puwp89pc!NOgtNDD_?kWMK19O|N&)32O)qp;6(2gD_TR|i9 z;>FoPgvd-^AK7LXp*@qRaDa85 zYEHu~1!5p$$15})^ep)?Y46akp=nR3HMjHep?c&=2k}uIy_#tO8YLPy?JRq(cNtpA z748O1Lv0^rL%$=8L#?Q!q_Vntn>!0)9riA=9hqyJk}%N7J*SEC4^adKB-McPJ;)3UFtBjSTKD1U!xDppk}ki-B?b-(ZRrVvEn{Y)#HmV zVjkGTskF)L-*ZASYQ{~KB8aIC=PG1QtHLrQ{a5Qh*pR_jS#{=R>nK;lyyu_si;oK+ zJ0|f8qu<`%BNZ!ujw>a3d$9jOp+;dLg_7yoAf@aHz)~_PpFaJxM=|pYVYT($sj+^> zR3%E+ZPT zJcYoCtbwF|-9JOK?Zq(u9Lxp?>-PtnXwLp0BoKCss`wF^+K<8 zH1H1(5B0A0mbZC;f-yJ((&~NKffUFr3dsrOAzJ8|V92+xa5_`yL|(G%uAnM-VID@J zg@-2id4TF`%Abb}P9{~TrO-*Kq1?trBz1Ow5H2p{X8k7BriS$<#Mb59R&f{CCoeRh zi6h0VBE=k3ZRQ8nv6}vbUu?&!1YovP3F|I|Bp@glA3^z|rd${#U*W{FNFEX_;R*+~ z>Ww5?W1w;2Y2s8pc)NIyFd(mZ@C^hvtRWu@*AztEidLLd!k$OmXUgp!KfE|l24eh! z)IH#c4G!FvXCm?rQcS+l`*vLdR6|7-{F#<=dscJB<=j@aphfSKi>Lv3xOMDph2c1k zl@Z;i+e#e!@lmAxFTUeWj$|9DfcR7B89Z#!yovya8X_7)&g()Sn;Rmfx7A zpOf|9)-U)RtGKGA-~(b}*-3 ze1WgN@o`H0yZ~st3kEs2p+-PAPdG6F1i^19XV{M~a$^ekO$fy?#T0#A@c%PNBO3+0 zc0}I1W4>e=2=7xX=O9eS@N_DkxFVf^Lzpe7t1S}+l{LsNqA*X>mdj{*5IV4%!lI*5 z@+&(aWZ3($DPS;#{r`lzU*g4&zT}U8rWynG4&--W`xMBe5C)1FX5NM#b=2vh;RTh9$&y9@NwyeXJJQ*2KXaDg#UGz-4zp#^Wj&| z3IPz@geZW2;$Ufe9EyH(abmxL(6Y8@_b?9})MRC+&L|;h5)a^^y=q)d-m6z~-(KJ( zK?;)vcvM_%5QVo1v7m!KL$MRSz;Hl4JNO~bI5*0RDvm=9c4-_9HwxQ9{R><#t5T*{ z6525V>^)YD3s)M(J@AxI_PmOnD=Z?;i(f#=O|;;lFC4snqB7xXN}{YH9BQW)_a1#X zC*yIrQE$LgraZUly0gM>YY{M@a6B;s%*bFbbDs-zagc#jMj#;JYX#U_wTiwLjNh!U zKSS!gfvGanmpj4+{@eHQyF}7Zb`p|VB4qE8jLIwxql8LIWM-C>2w4dsgh~-5 zWG0z$o7sC)_MZRq?(_TpzsK+RJ%{Hwo};I6-|zQpT-SM?*LjZG1*69Z#+{^X zOi91O3fK)w$RG*z&#lj*qYq-TUntE=;#tCL7JpUs?N2Jqijmr=B7GiZtj%P_0qOlO z%&{tPM_tKk=UM5NtiUk?qe<*eLTB|LWUNq+a8Eb_j>H|K`>xTe4)KeQZ=PhLl&SxY zq8^X@?d$c^176Qn6Cy0*kVJ{@y?1Pk>LGj2{~^ME#_^bDwO8c7Ds|iw4#{-~6#^Jd zqf~f*oJ?*A^09h-;GCeJ`?71yDFNGcsMmnWqW;FDCf~QEOw2E-CMcSQ zqxHt|S(?G{!WUF|8AJi-g8ETA6SBO2 zAwXk|zYX|I;NFHw&60i_oOB@XjiTu)cg87o%i@jV-~&!JBZ)hKRKHFLFwL{P#V=xm z5jvI1ySlnmhF*B6TLCoyGEU1_apE@ks)hzV@UAnGm~Fi)(b2p`ZU+b=9H841B+CXF z&T!J8@Yp()9}?*6N@7T974I`&lb$3cYv9&#l>;mPud8)mzdyFw>Gj57mq2)x{>TBE zcwUYmHNuFhoR(e(T)Po`iwA-qd{Dr?_=Bgp8-`26LkE}NJlT@6cbzincQ2r0+q#$5Ay@;xizQ@K3>lAG#2lM zKj^Ow{*yW-^Yfy8(@rMU#Rzl+TkxBbmq36*RfS`VdhlH!mfmtygWk0v#DjRwfSGV_ zdER;Qy{)aS(Xkh>VSR+0?~Ou$sJ>+=EKlQ6?=E3wLx3{d6{8NC-Y*Y_X&;*eYR`#C#xBgMDo8WMl&5Vt$Z zIDGyCr5IYW|Ghj>3ZVlRLSMTJkOsajOIe+yoALnqaGxn0`m|XdalB+e1=26zhh$DR zY6m?C>EoyqJ!jOBi`xj0ILAFZwXTLsDN_OK1Qqe;WJCUx}h^Z~E0SP1Cx zh9;vnVa1h?!@$CnwcF_ay^JRZ+u^2$`jcSi$AU~`TKhvlbkNGF%EeBu%KXcn<+OMz z?9Qo<{O1y^@25|3lHwqK<+GUihoSnP+9&qceK^NrQWZGTwZJ?qf}a%?J3J@5n?t5V z&L6?Wy|BQbuqY~h^kATEe;MinG~H->uLws#2`@j9cxIQa>vha$-dlO>$xg{R4Ntf9 zoEN+ePrx<8bO>4wd=DH+&epmrC_G^KawKdkT9sBSQW+!_eeJdY+~MJiio5P1j%#!p zB!9n|mVz#klljKU$eb`Q!Dh7$8ozQPU~L)0^nJ!rKU-Z6i-ZQeeU$N+jO?_~DrShheKZ^2z17~PdwR;}} zYCRS0^BU9daiW3Vr3^yN2ZZICank_S3oO?_2$tXatbb(Rsj{~gNk>R_A2@XLJT_VX ztBfeT6ot|p6JcWQ6P0KvK(M?eL#8#furJD+9U$rWF_iJ~U)H09XziAyb)yt$BPtNKV{aX;kcc`RG>E zygGDXI01UyIFVb7zj{DU`4%%#`K;^KZ#%R;4-7$FLArr&Jq{mEgRZuAU3gFt7%ot1 zY!+~GIP)#eawcn2kkhZ!`bSBV=oU-JcEKBobaGc)gs3n}Mc2gL{)RIG-AekTOTICT z6ZQ<|Pr2*U?p(nW^5WsHlQH z68jTt?ptNGlQ>05rqmA~cvpr$s37(9KPd-o&nhZ8=)b5+0TRGkz4$p!Yyn&^|v-suU z#-FHbv%^*5PIHPJo2xjxC1;$1w9YMRxcPIJJtuZMUqH?Byf3rK5>9r^ZTIr&a$Y(* zZm?qS=XPQ~GV*P9-A&RRYn-q}*KrSRt^F>drE36j7#T}HaMoiU`1|)QU3t!AnfH^j1WZb9 zoCrR<($!2eI5_9akCJaLQ*Hl#pg?$N!9zLW6vMMhv1|H9j;|_Jf=*n zt$dRur1W(7Y+{3D=090flwDH(^f`BH6YL-T6R$73T)ceQtI6_U{}^wG4;+8c_kbZt z)Fm+lF%`eg^8$;)r3Ap=^A3wKFI{BC_fO~?bl*K@NN~2dKPg5!@gPU?{d1RQTU?qa z2Re+Ne@y;q@q%mdh64R-Yb-d7NLrUQH$aalb0rO7PYJdha$;Tq=A{20dJ!WrUIAPV z<9sL@Y0QsGf8x~|j_bBbZun00*tiFg8$d5oAv4n^$q$qs_#IXosip(kmY*+svQRM8 z6MUz9h0#iZ|L>oAxb8nTT8H@MlaRhIDsWF;inaqii{g}g1U;Ler_Z^ zTrdP+x-Jw-=7h%!)XX#02cRF!rlqHbop;P^;R;flyL|x~Z7flU4Lc&Q?|{?rQx$e~ zWV|bx>_Qs=rW+)?*}ad=<5>AHPA|>*BR5cUKWBVi0P7HF0gfOJLk@88C0y)8{V1+2 zmZ3iJYKHr96v5rWVvi2QoG6wMtV??K=@+m@TYpJT#`<>N;hEH8?v`Z21HVbYP=BP) z_zCm-cxxmx6O4$*_86o!*-1p#Fis`{T7Xi@8M$1#PJFW>8lRNtz>$ZRhHW_(ce zG}n=MPZ~a+{di}j;>SwvxlzJocOlQLy}xSzX{l*8R0o)G!A++4PM>+vmOI8wSbahi zTq}3C7oB-R^LRSQTD(8>FF?42vv5$6ZcE&-AOi9859bG`!T??r3NFg6HqU`NKy=5k zB3ssr0tkDqB2${d57_(e&Z~}49ikQU!(0+a&`8v*1AzIOKYwm=L5{7ae1v`_Mm6&i zSM@A|pZR-cVZWaoV0l&}-|v6?02>^GxHVdp+Mutnr$Gpz9~Aqb%d2H(5&G8wR;O2NX)>3F59td<^XwjSe~;ybQ70G7kY<&m=Cf4-nkL?#bkR(NvIWAn1PJ zvj>lexcC$7xVW_mXz&4}?ECs(y(70Q1x(k)1&S{()AXf^?gRd+=nu=UyR9pO*nGr^vfwhl5*cjrkP>;fAEV5-b9gN=Fsk~=w%?!F>EA3@+>LjN* zN1*MN8(+rsg7oeXIxZi6sX`(}j%k&`+Y#oM_w(IPA5HkR6(!}g6N^F?!zofbck|by zT1R(xVBG2(dFW3;9towY?FTAQpCfuh+(a&xNB&-`xA2{+OkQ7{Q>gUZ_W1(SfNaXn z{mIs+Dja6q^}{&Cl%tky7u&Yjc^7nTX$K(xkEMJeA!mlp5N8B7adO|4sI$pWceY$P zUi)iq%k;~~ArO9lt2nv1Zk*C|*UfD=Dx3fGblTe&WB~`z^cx6-C%^yU6v|2SR8G7* zdr_FKG8}mW&|RZ2ck{muc-iWf*g z&~xI7AGNzb;t$Kp9Z<@jBI$_n`F>g4i(MTS&{xsr&VLB4^1*%$Za>rXmS%~`yAq{& z@!>jX(m>{xt`a&I7mzM^JN3=8ZJ3_`N`!v|Msg0hXKrQERnop3t9*$D2viX|q*~df z$4ZCB6qWXGHHn$>nBdgojsh9pq19#@NfmwI@MXw z$(DxYJpcgV(73Et zpN9e8*Q_iO42=(s_m0_tpC!siy}Kmc91|RQ17S4ue48g$HZHW&oM6f2*LtZjd=j94 zgd8}Ejm-m`z?f3pzQ~_Z^cOK8p!Z!|R;}uYH%{PD_n?sgFbq@2D=t~9Bhd}bH%|Ox z)CjOVdBwD-NTjYzXc&FnYPI$Coq}YrHy}i|*qJPbEPVz(N-B_&8wO(b*qLmHn!%1i z%G?UC6thH1d$$3!BJuB9SB`kgN!Dm~T|rVFBoJo?svR%T`JL4L!e$n}3BqiY@-s3{ zD7?sA{v_+BG?6r<94?Umqjwtpz(IZ(6DWa!t71_m9I?cH+>bv$hhQ<|XvE4*C@>Bf z!r`g+ch{NZhBrcxy}AA-SJ=;w-+?zaci)~GrI@25BjBq4#F9wbZM3o9j*Zmbei<)I zDtYoL0Lfs=xQ5Xi%-hW4aiarRz==tcm)!fdxVVV=YxZqlu4=-ecsAl}$*2J@9V^{B zK4H$noT}5%tTQSDr~IzCwI~XnMXHBe z6*q3ajMM*VxFWFyIk~?b}5vJIBY=YU_Aq-{1T%TClmaRb_FQd z6KXb}Y|_1&m9-s}+E5suUzb|3;z3u<{dsXme{r))S9Vr`_4^2E6&k>QfO?Fg1Zj4X?$UbC1h^~ zg2#p}34RKBS5QAdTKoeH=s$O+s~#R~!JI*q#H*Z#=3>@INGzmX`R7V#r@Du$EktCM zdH3c-&=NY8<%4lK_dSI5o|`|HMiLysBTo0Ntb9uwIwU=D^W(F4PP8l$BGDCQq(zJ8 zM6-ep5;YIb$K9`UBRbmKqbiy5!#Q@kNk!jb_a4CQiMgAZVcgQ`1G#?xz}0$hY64nH zU|es~ymo+=?}56t&LpkLQV91s>OG)!Z<~m@Z@5C#IV@yf;0@DyccU)AwkD7U-bz@^ zxSy{2l1{9-PxF+d*tOrk!Ou})1EK{ZDYgTqCrAGNN>b{EBl4wxOxNyfr02(tIVSYP zUYHBC65FXmhyDZYTZ}06Lh6Vk3IJVd^gjq;>w#7)ho0$i$L7R_Q9SV2 zCI!_v?HD53B_1WV+s1m_IPj7i>V}q1fyPA#?U_1$B zW<+z$3Tj)ECU0g*=1ywps>Y-SHUkJo80MCf-hVaCRC2of|jKvDHrov}21y~#M_tajPw9+w57p`mmO=B!&3#$Al@L2KXVtyZl4zPyWQzVPq~c2UE;Cfrb9 zihe(m6R~#afi;957-ys6p*soZQryexha<}R_b&$X()|>nKL-KDV`?_J=Lb?TuSz<# zZ@N8JEORh6F$pO{sKGTp?Pg0+(k}Ax2Lc9A;P7Y1&G@z9C3)e^Kc77|mD{zZE_Zb& zc5fCf#-0-B?U!@=OSy}>uCcUc?Eo4L7x9Kb=Z%Cm!Pf@+dmD~jYs&V2K6I2bUR;IA z9ipK7@5v*&mfGy#z8xuUzW znDt?kpdfzaRDr`h!{M-k4MBt$ff_r7K@co75KTZM&_zMbWz;JXO9VmEBcM@#!*!j5A+nNn&yBjrp#8Q0jooU?0dQ69DF(c+#$iC?`vH{Ea*kQq-G|tkT zHxI69r+><@+-A>hwg1>so7t1gA}jg{!}a6e-rQ>~0GC}1c*%1j0s>W=Uq`>OCGKz) zjq`S#mykO_Sjq|<_h2DPoltHo0UchSq@O0))@;lX6#?$^!S^IBr z2sL8FlBE{(&N!d3=Ln$buHCxj$FRt%z%bZoIq!F`1$^~>6@JIS z0?rQS;sZMa`!{0l=hyVIGu{70dW`-IJe9*HM=WYyF+QGh)34RBn1i$De2aDQQ2B)YK+x=dM$HXruIUyEQ`O+WfPyxCrO~Cd{#ZCbq5MSIBXXScf6#|Nuz8t`?r~Ts?1wn`NQ&;mp3Y{8iJ&Frw@iMQSD*Y zS+nUS_B3QqFR~N{bbnem`t+-6u>&QJ(g<1X;mC!M1j+;@6T`VF8x(Cm93O`O4~Iy=iAE%Q1z zZNR$}_0lW>jGG_O7A`NR!Rt<@^b@Wc5YSd;xI_UZY@cCX(q7kGyE);Z^0e@0u=~1V zob}m$46KIBuP*NV7PdY1){DZzCd&s}={F7>y%F{PMx;hh=It9>_}OdMC%uW24dkD$ zx_WcODt~S*y8rjd+jl#8Z+;VbY1JnA;pNvN&qD{cKVIIrhH6CYXTAq9gI`5Qzk}Oj zFG)ohxSi|8-T7N)*E~E`d#`m5w`UG`btelsU7dE_SWNjWx3;3avgo+&Xze!KZ7UY< z{l}J{%&%u9Z;E8E(DQe(eb3*pR{qGAS_F~x|I%4tJDGMpjtI1#IMx9l&#P^J9b%)b z_v$B`*xq3J+jcwj7#{9ysTlsh2|E*2oPF{@_z9hvFn4zs0tQmLALGNgNG|R^7 zpG{x+qw5|^jIg_*eKdu<3Jkk5; zZ7dpb-9I4aiCu)^<+PvO>8E3_ec+=iw{KIsciZPV`GrLTPHPAZRi6K`_e74jvNsINJk=0?0aZPEj+B^iqFucb}GTw>!s_ zWRu0x7l#Wi-*XoE`s4U)%kAH*-AkNI^`OBywA7;3Q}$x7d;9veU++vKJyF zqfTp<_H4q$(9Xm2LrJIiI-Zm(?3S;sX}HM+YKi74fdB=TAJuC-l=KVDLDw=bO*a{s z`0JY?AsF~9M^wb}@-kyJeb7z6Gi!qHHmQPE5m2)Td_FLKHwi*6C#N{+)LElsRvE>b%f2PqyrO zEPF+i+v5in%M4SNXH?GZGf86w)al`0>YoYMm zFu+t2JrhwjH`bIAF`@f{a|bED1A0hs%3TF+(i2>KFG50SX)5UUJTY;7zShvU>F43T z>Y=nW@vY4B`{h{y_v)3ydBTt5^!Pq6ozh`_$jQ+r^}|GegF!xJ~7xq&=f4MMdxX_VX&~kVxYQbo&2r*KZmd_egHoV<=+qK=NpICKD!pbm+IIhpU z7PH8+ls;(Qyy1}RU$~M|xV84oR6C}%>-sSnde$4sQXVS}HfeqDfVaRKVef+{tR1Xc z7?21cwF=kUVW^1}?qPG@fQS)z;pT38l@jLo^G_AVSem+sNW5jnW?soM2 zoO`Ad55_1Z`_A=x?A94^XgFYX=+`8c__58Z+DL|?x7=-p8>S#1Ah_4hscVvw-nDSN zEpsQOA^G!djkbjZ_U|Jt6ci^+#^g{sV`${wDUdKwCH*ROh2{;Q97GQYcX^?_$%!CM z09l;s56>pM=ty}|?(=xQ-aUQFTYf#YknKW)VE^LqrtF$qnYF3n_(30D<%om&yU4Oi zpQcs2EZL6>Ch&c=X`Nuu6KFS(xKTQl>CE_z@tZQ%1{xlahhWIx=>q`WKlbYu^e||% z(Q_#7#auHv_+sEQrpp*|0rvo;9<3E7bDpX8Gj=C{+yl85%&GYC{L#t>iV?R})Rw%g zwtDDiAG-Jc_Z;`y#u~*&!H+=lk6Xt0S{Wm&hYB{e4qpnR+7i95(9-^D`;DI`b01{X zK44d0in_G#6{l(QjRSoXi=!a9g+=U1w8LUWAZBO}2aVK(!}{jJMQ4fK<}KxW3h+Kj zjW;chBlO!Oop9$Jw&m6t#>{(b;o=?--`8#>T(}^+@nHPa67^c))7|;hs*zWO!fu?i z+-7%n?Y-!;+x=Sw+9X50xwom8bT`%%smnO{YZ41KAcKZ600znswFWDz2dS}25yEY> zJae7)HW)2BYwy_d8m4xjh|qrvj@A1AG=*r4@U64J%O~qTKVUK}4>u7zh?@P_#LGH+ z3iDU^sG{$1dTEZA$zNI{PLZ{zDJzR}=~cWc^(wr!y8Fn?JRowQumrn=yW97Zl}Vv{+h+JllfB>(7=_=bR5B8I4wH3mZJm}EX3TcglFa*R1qnLrbncx~$M)?X88 zLZ{Oa;fqlLKmpL&n5I+462(7nHOTGcE>7;eGwJs^!7e8+PbH_r{|rnn-M)T0q_%aV zqFVk3@qHnIfO6NpdC|JpQD&3km1SAcZ_Nm!xg)X#Vv|>!v!7D?Q%0KZbT05QX_V^; zKW1&hLY~q*zFJbC6h}yDl4=}(4Dd>-(_haz^Abr&iMkg|IaUgEG?J^Z4+lvA6a`%s zZqe;K8*>czu#|x?Ceh)4yA|SO7!-r2wC(YwdKwHF;GG;k*JIJ4R-j14K4`mcGs~?mcAMlFIZn>%n{kDS9%qN$3;IUu#Y5^c zZJ83!0*r3VrN+rEVyp~o53V^JG!U!Fuo8dKMc&6hsZ!JofK1|TPopMyjeq_RXbA-) z7uVzmHpJIX&RcIGF#LYDd84uz9|aPULr{;PU@^H09B6Q_aO;BwR=0PDN(U7EBr+XJxw?YP#?IjT-6>-mI;kR^BA4#JGq#r__Lm)dmojD`>vlGJ z_HscX$+=58xdFCv9L)4b$V-kCf}2Bn0WY2JZm%Gan;7NcuR3ouFOw+j+#%~{&`mY7 ze~`+xzRruxoQ80OPWpC71rtU7rNiGuDPB=I2lY7rDk*+0vdiI?rl8S?L#}$EU zo-o=GT9=upiUk;c3J(8ezzovhf)TwKDVz@?ddcYPuCA}FGFDesUN_JuGsFHZaenvB zTem_^tbR~zdUn=Gp1?YJb4{W#Bf4GWS%wH~ln)(koabKTl_mg(%F!H zsvY<5m%wmfi`CbM=TtFL9{hZ7U|GX&cIZnn;C3gA_JD568Z4y|W(_DBpnhEQ_@VHf zd%(x4y|+KW%8X?xJp4O+Izcp!(aK-xDKTr$>oaG zh+*MJTz&jWqf6%A$R$zXP}1~9y6vTdpLYO4gOM#B zn(H|ExYbJFCcE3Ag2#gV8{2H;c2E?twORi>_@a1nmUl4F$h=ha8$%v*wht%qDt{j3 zllKhABzdJP25oVWZQZ+&dH&Y&ylkR&<)aHHZ(Jbv`u-)x6#!kZn&`xdwT&wOxO-u5 z5FW-=^9d0%@uG(UR1+kSbUWHq*Vw54d{QCzEA{4&jjQE17xs}8s99|UE+st_6#XA9 zfTf7<<7_8WCT_u-P~RUuktASexGBoSyodg8BuWQR1!j730QxXN7;jW)c!lY)%p%zX zg8Iui%Kh=0nhzTw)EZ*hX5=H--z_80Q1gR#I{A!;Cx!Xdl=FOa1nnyQC6$IJS6s$d z7w-4a885Jf40NEeH~Ywj#0@z)feL5wV#upicBM5(eYI9UnbH*h`7`a0A3sJWC$%)Y zkm`aoji2Lbg#qBzp+8GLxBN8VHdP`Wf63t`aiR=CF?Cie${|isyR&0c)uUz8HBaTK#MC>o=FD^U>snLnZKF)`y5_CxE?T9qf)NIsy zr#~__RtzU^=nXWwf<4Is(H)1-KerL~+$#pGV=9}%-yrA_s zLk`Ttp&dIAwE{m3>8Bagb0<0W6rh;2~@QLmGFrZtCOC3#A4*5kqEUAL6RBs%g~;*%@KDHWKmC637|yt`vI z)8~fXM3-XvK5Q)i$N z^Lr^pK33J7ErBQ8C^b~oESF+d%Y4+Hzb!ew3rMcdy@vkj=S5D3)WZ51+jm<%hL#Dz z&b{(Ye z_6hLD9M~ck6zf8~D#l&THz97&8Hc;IA z$?U5RZ0mFDuf2qaE&ml&ojW7}86fU7vp?3WStkw zHCz)75#7=Bb3eJx1q4&9Y(r^%7E>+{kdgGN=AMki!+TeIC52v(e?P-LHu9P-mcgEO z;!EB^LeDjrwa*uFN~R&&4e4Aq{AbUcq36G1k$$0kqZm*A{FZi5E46qK6=AJ1Qp;tS=d@8~#fw!eQ`0?9*;p^p;l zZg8HZ(s}5TjA*zD)wthn5K#clA zYeIN9`OD%n{eTqy9`qI@i)bXfD#fIrdcw;z-`_*){9W9aaFnw@FU3KAjP57j*4O&n zwyKYxFyEnIukqmdEVn((G+A3XVJ(J<07e4)Ofy3QBNMx)2Gqwa#6+t^^#CgQd@zBV zxXxS!4Btr6>k2K|)O+^StJa0a*QKy2rKrATXQf7(@x}arX%s3M>E)U6V>G5!_OQzMKoXU);IUCGPC=-x)X)AQtZ#aYH>~J&>V8?~t6h@xkq^WpjD#b3 zJ9pG7uz6?Dn=_7FyU1W&u*@A4foU}u)bdyHztG?itqqq_w5Wte%sIMEK0zCDLZs#f z`8y&~1RUy{=Ip)9iq8_LDJzFqj@GufKd{1O(; zKW5#|D@_@5w9*``yoZN;1?8NR3@l>#Dl@CL2-TL&t_A$jd#UmMQEcZOVov0w+0>bt z6`xTlb*lvJnO@a~tL6KzcH0Th4T(+G1fa~&-7g~|qW4^m&va5&VZ)ee>>IJ*3T< znVBbZ9k@tiKM#?)WmNAVYU*i?tVQhWfknvnk-#N!w})UQcKPD=CBhXHE@6+RtXRby zln*CVEQS8cZp}MDD4Jn8`@|wcN=)>orqv|!6H}8u#9s$nzP3z~YY`r8XWc!c?v=d{ zd@$J0iw6%-Zu9vS{?oML9mnwl(7Pf#1L{7)>&(n^w(CoK4;0b*nUt8E+1O%yX*KT6 zaFRZC{)*ecyxoB7j$?c*@b@)~Gs|k9jkG>&94F-)loI!OPScbv(YII9i95D#^3DJGwvk^N7{vIor_ho4DQF-jXRMnrAfmbwwK3+ zgdRZ2c@Sw^jSp0ULTC4V&x*4!8)+W=t>mRE`=`O=tPGRKc&^Sai1jNvV9M||@HScB zw8YTRwlLD{W}r-eMQ!4Pd>{iv7>A#QJS{A>(Jo$vDwdV56lo$aCJ1vVe=M>dJSvpnM>+(Q3e zF`JS$Q5F8WCq|QDz8>u#%GXjv9^iF(?_@-4W;=29GM|sz%7quzxf)5qLAn91a@+d3-EheI23|&TmnR8z^=?t(JZJ-1uw$ zS&f4lz3IIAZ_mB`^y1kyf%7u*kChIt&gW zds;I^ERA!hKin%UI`T2iC8c*K_^D(q>F7hkWp zaB{K+hLCH1ogtZjZQBaa0olI;3yCz8+te7sl;RLRWv%#T=hlj|C)LhVf`gSYBSkC5p;gK*p`!KaNdH!;y6 z$uW50oUP6x!_VP3>gXu`_{o#HuCB8SF$k?QHz!A2brJI7(`@T? zc_WG+obse!=$)_pqi@gKq#3RBGQ`!&=02&2MX^n`_u=UrP7ecV_`B*qM}H;3lCx;& zklRVR=kQT;z6@jF^?O&oOFE)peRt1nVb5 zf==pJy_F&)y4IEpY^RIQo7=Gqax3_qK|O?62$1_&Lm_j>Ll2un`kPU8O02%+$!^t} zLvTHU3i8XBFC>c7!GYml$BV=*7^IUfM%>D0W;Am?nC#LSTA#w5bRmdPP(pJ{b_w9D*7|*;5*T+BS zhcq{AS@ptd9AZyO79Hm@d3>cg)yS-K-!2M-)Oyog*1w=D;^P?aI!wAik0r85DjOXP z73P>Ry}#XUV&BK3Yl zcVlNq$D>x9wO+h#bD5od!5Llf4s7p8{gjABXi}9O(iXM;|$ZEYO|2C5!sWe$Q8B^*cRGHPC-~NDK{~2Kd-uLsLOu)Ck;Jk2`|8>{|LW=7 zE6qo^!g`zpw~q|#J7EsPPsU$0B-VQ+eLisJbC@f&3rv7T9JqD2E5DgbV1ZW z#jMV+(vRmcHc+8kW3VT!9__74fMHtm@VP_!skM?py8M_kA5Eyv;1B8wr?GifYARH3 zEyD=RGl;obf1(0zjNJup*+Y@H>S;J3q$@2en=U<+(b=?NEJ9ZYdcJ#&jE`4+v){wzGLn~ZZ!ekK zmw3_^4JOC={xizDKt1CKFcQvi*Eq^I7O571kVFazfK@at^^Rc72I1lZ!>CSz4;kKO zk-bmHw$`&<^R{ZMvV3xJ|KciF$lq;*$3eD9!2Su8#JxYB)HOGU+gGtvHvK8dw3gHfxEDXdlSGfvfuT_TTE~qw=irEodU{?3 z1qHehy7NBtZo(1#Deq;3#*NS3i}4^6UHCTnQOB5$eBZ(tandAR&u(Y9Am z0Ve3MZ#Kg30~k~$LX^=v(O$69lop?mK!!6Jt;ON9(NbY`qE8+_o{Av4Qk)84c~Ezw zL{CfB8`Nc>+n;MVtCf+TKJjfl^#orYYNQUEvV#M1g$tQ!iKE^o%aS>U0(rx-lZwj9 zWL9Dax;8f!lg%Bdckk|nvpoNuoIwUy!^|x#^eqp^@^}#EyWa1w%Za_zsduE({xnX| z-iFwXxumbR=kr~MBCglAw`+E-wi4YLcKz6U^X0X&037@w{I!2ef2sCcNw203q~=aw zQWIlWBO@b4!=Q1$kk6d&AK6%)EUO6NnXXl)esGm(7d16mxrbGgeg1)J7kRHF*+4UU z!#ITGDW5vEop6;5NjyiKy)`7Cx9xOJE_alQKHJwLm}z(JE3vw|v|DvJ$M$T;Sl;GR z;HFQ$%VJWin5^t>)SSpxx*bRykjuI+W-ZEd+kx0FODnc=`fJo`#(GxUglkl_UsR`_ zz^sSlRg8?Y{us5>kh%`tI>)gXYu$(XZbm42?z_0yjMN^2=8wZ0W9>GGU1yPYcy@kC zhcnKwxvc%;x`1K!r_nr*M5ESJbG^9P*##d({>N8qJ30(aZ&d~&q-JIv3!_c@oW>vG z{Y1mhEq5$%@xY$;T#6bOy|npX7q0f@^siB$XChLvq{YJRo#bv=@~L$e){(k5p_9~e z&iTf|5AeC>78e_ym_FFYWtmYSK$Ege_&$A+SHL(=O{^IAGJTNwg1@yZna8|=2a+Yp zI~=>+vik$1>*dm1vnLByQOuI6_{}xq=C5!1at7`AlRl?dows!_*Eo{8dqI!os--UY z%1qm{x%?4YtL|Rg4Jpb*;ikLHR1sOW-6)Owa+L`NME9UG&mN9(DKDINTkPBpx)T|t zGOK?+w~O80%61s06#p&oznt|Huy_&XO9^M@;VVoMkcmrmlm?tieIwP>|#QEo~m zb}|3lQPY#LxFc)QbamccvrL&BJeJk*5KpfD^T0Qx26j%RxGmfje0GG9`dXnYoxjRgj0bU!e1Lp z9TaDp>SLR1yx(MIhUvTf?6-Lq5O6;F$L|{_Xol@9?X5Fm$pxPcLTI4fIWc0je`&YH za8B^Yn$^|9%~c7H4H;Ec)$-L?r@kF5lD3cLjH}Gv74t>%_Je&q zR|yx%>q;sSM6YxFqI_0+^w;boW^4+4%Rl7Tl=1zxVMrl%ZGZ>X(^Cm->%5b*FmdZM zC|sd0*qBdCh>P2TRkzf~Sa^Z19k&|pY~1r0?LqlHJt*iQ*+1?+m%#ROzS)Etn-ME= zZRC`Ev3TL~8IU}%G40hfS)t+P;juvrfMBy8$Wneb7c7W2Ha8~#5;s{YW)zcMMBQxc zzHGkMAiqwFi?Fu7{$ZN?e998!3mRrEz#G|Cnf4r%+J;nC`IQ9uhY($2T&`=8VL0CB z(;<}{?b5PP={Rj4{osh|A)3p25!WnpClgV`7r3oX_4x_HyNJ}mFU`tt-piXR-br|* z(ETy1i;B=5us^8L<^}OOPk2?j zUkRq4tj92S`8w=a-#e;6u^z8m+tPA@VTVPljJSv_G0e)*7+|bp{!Zr^mE^Kgq;JM+OK~J#%N9)mKv^_p;!&yK)T*CP?+z{~4tT z`Na}!>aW>j6B94in7u)6%)XC3dGVPmrZ)g$X;pDoov%D$&@LqV{4mleA`*K&R9Z|wR(k`*B?8?_QTWH`Ls42w5tizZ=KP_0ya+Nw|> z`0l{VM&g-Y7oMqbICr-@MhEr@@@(>KIE?i^3*>XuJ!qcz;_tR2_fDJ7@pwWES z|Garj7(GU?6rAG-N~XRSqAwz?@LoXw`>%{~<)l2mPEb)wngSu!_e2_I4b{1a-A3Y` zOm$AWGh!bK=FidKV09mMbmy_oRrwmJCma!C+gnNG>>f9}S70^#({*Um_Tg0~+&YBf zR~dPE{H-~9&3wz{j=nWREiLvh5B3S%68Ngw^7J3*(2wrE>Q)1@OJDG#GF z7U(NVOg=Te3L_duSET2B2;7&36*pEe&zWGd7RN8GBm7$6vT*UuJlhk4mziDhRhc9ADr}r zZ^dV#oF7k&)7Hgq4|$tk7Ek`xF<*jh%3gQ zc`qhqUi!$b&bZ9U<+DJyf?2Y#8`jokq*DC%Z`C6{KdB1wxEfg9L!a?B&!;!uDm>ks zaX@i+*k8Rfw$`%14kB4~Rg&jCFCD235HR|t(#S?QR0RJxIlzQ3e!Ax{x7@td{dbML zz53$vucr2cQB_igzM}R8+M{Qw%w2qGMrOfeRiMmWq$Be5qMCb|HS0|VeKQj zY!0?LGRJ--(kzvV7d!|zao>;OHjhO|k0+#(;~r6#@Mx$gP<}%K3*6%R^=TZK!u_)j z_V&Hv?)~CZb%E}57+OI7`ch-E+&Q{-W2atn*Oi9Y(vp&GIIAwaILS!^^N_l>Hebhr z*=VP!@7qZ=7iPm=N!V;%?6^k_fy%esT$@h&=HA{XY&9ctkkH#SoDuIm%(hI4iXS?? z=`xSCvh4MRc9F5qoP+u2cJ@6!ANnb1YmEQZ-Z_(Nr2o22aDio+A zji=Skn?d}w+Wc~Jan!vcvCF$~YyUg>h_Z_;;Gnh;JXW(jb_SM_J^AqUpr;*R&nESI^Mjb-1tog}Vc3TTZV}ddOdo2;_-%r6JXzc*S+K zwVqGd+?lB5me?!G-B(7FF=T`^GH>b0Jle%B7eRv6ijfn384gaLt`k|^zYbmhA1%P2 z?n1b_lWEBFcU7230!l{@4xo z4iX+gAY^qq9KiJXrPtIg?!N|1O^%?ZU#br;c;r~P+KC=+DMWrbRc+rx_=F>#NgQ{TGdV|o<0N*$yJGlgkdI69V~hT` ze0EaOs0tRY3FFqhJ5n3>A&}_(|16!3kr=A^{oz}63TTU7$mV36{7^C|A@H$}<3NdI zYD+~Dm=F-9OvrHAxr8ZWu!a3g)BS**PxPG1@%_J7kAlnW?HU~NfLxX@x(Z;96G^W4 z@Jx8><_R0xfB!tnoIJnr@bvGu%S*yvrO>uyH{KdERO?Ku?>j_gevPTXGnWb@wJUQs zgV*6?6#yBIl2Jeg$@Lj^=yt-cUAwG~{@hQw?e173AECHd+wy6XlS}|wNJJfA(v3yR z?k%T(N{H*$9cM=v-v!@fzh0T*yl}QZS$>_b3%!Fzdc%0lVwP0)s&O>JNuWlhlUU1oqGC zzf{o}!G;?C!oBFxtJ;$cpF;8x8_Sbnz=0kglUI`D61;<&kFHJEmZ%eojt$`-`mJN? zSLql1?ZtX=ANi{t%dbN!rY|hISJWJMs)BI59aA#YFcySK$x0*B8UvJ{(lEl&9u93I`U$snhP%I-7K6wxW>> zGP;)czP`!IVuZmCuz%bn0IvXj2xeY%4q|SZU3NW3KhiI;2S~KSw>RwGN__k{csXk^ zxkyUZT$I#HIcoct{QP_0f}@zz9GRF-cxQ)s?Sn?k-81vA77skiT$ndp*1njiu zt7I@cFha|yxa)`7#1za2N=B2;r{MPHlJyXUjtx#G z?C{=p3cC1XiUOFuo|~WVt&LN@VP(a+XIX*W^Ye9L-=Egc=Nf2V=t_oG3myy;KszYP?0eHkqAe;n4jJxTyGvZ$jCE8{rzN}?MGq6DSCLRfZ zB-Mdp3tSz3OAR%hPJJK;Ti_f${>;cUG}!_lGF~H4m@{9R%H9YgPRTL%HD+cRw$dj& z01SBP{6WR^MuqOP6XB5+jxJ_qZ`6JdsOGdA_~QUTu|mo=1}BCgdYFz$R+NX4na0Zf zo9KgOd5T5D7lei=v}{XS*qxxJ{O&hE?cIyo0T`BTY-%DgKR`qOKepaGoa??18@DP+ zG9xP?Bq2Ll$qto-kc=`zRz^lr$<9jlCKZw-SxHECNP{GMZ?d2Bd)>e1`RjKdj*jcN zZe6}UpZ7Rl=j(i(CmK0Rq%91P%A#9=_%fFW-IH_I1pVa*(H5X`0kNB#n_&%4M6Iib z5o5x20-Hg$~$%Ol15Em*G}ERn)+<@4dtHrWSJ(87`PIFcjsEHgdGW&@3ZY~ z--*DCA*E9-=Z3GJJ9&)JZ8t@B(lNC(M__ZQXnP5kY4Hn+uNyt!^2+_I8-@qAs%4iK zPc{$lA>HE;;;wUBy1IX9=gChpb@lz*=YEE8+|ZntDX(KW7Sl9mOslY-WIO|}S-ecM zo0`uQSq~p>Ko6>uUz>k#@eiy}WN;!JjN5NJjs%{01QFFUL4MuW@dCqlnigD7oH=$_ zr|0bgZF8YSVwmn?nQ=h{sn6Y4exJqL8(s@IVMh3Qh5a!y96zL_r0{ita7#N{9@dh` zRRa1HGTJ!C!gcP4U-9YoW9NP_&6jh;@i8%?x`?`4WBUE#b}0^Sf{}}$AZNU0RKFJNbTa&BQxjNe$kfPJZ%PA^m#5&}n&y9Pl@Z;_gsi z&`^~C&b&f;OkyYxrp$4d#Zy&om-VQ|v}ln$Qp{7L$hH%Ve(^zAkwG{v%OW`H(3DX> zL%d>X%ju>NWN&|Ue~QJ3MH?$?d@O5aF#q5hp&nUy|G3-RRz+DN&rGni%8Xv)2zky+ z`;ymx^=Es!x*p$+`5plGsk=T{5+@^R_^NS~z>fOe%1=AA_}KB#i9Y(a!f^;!B?@j0 z7t2duSj4%wYLbLi=?3^n(o1QDNsG@+6M_haI-D#{tLUeOM<;u_CUmiGQgegf=MiF1C zVXyrglLJxR1<>fuN_rpFQ$At5_rSryuS=Yn7qU!`&2Sb@#+E2oR~e{7P;nPQRMq{d zs|NI>J~C}EfwsE*<4MA!i!<0@AUiORg**?s64oa-PRh#@ru)z>Y-hj3aPM;Zz2h{s z=C}ba@!cRg@FAYMt8gNA?Kl+}E|`rIQ-55X${BD;iAm0x=@D8}<(% z^~?tuGs$v!l*7|5H;NPfdGnGWN$tl8rK0RN1H*N>n2> zRQnFKfW&6_Rh*OXnWvrii!oHEW3FE>>w|iaGP^9u@^$xR(V@^+?TJAqd`04DI;+Lb z#CQoLOi3zO{N5GsJ-V`;d0ksTiZq;omCg37T~K~w7>)%U;@Q=W&ZuPmT}9^)6MfAs zjB=7r=1xy%s$7%qYWe6kDERNk2Z`C73&FJy#<+<-WC+)C$LVErU3&SgDZCnkl@)Dq z{56U8m#iI)dRr`EW^&-JaXf-bl1H%rK0Q)QnhX_I%t%L zvh3qp*K@N?xp60>KWj=9_eErTRO5AAFfmiTYiXu2W9>5!FJ25dsHLCRlCDdXNBmkN=fc-y zdX2ZA6ho9|E?f0oGPiSv*{0d8TaTr}_4V{V8$OGo9zK2LiPnpmLZwf>A23cMk*M{0 zktbRm0(4w_IHFAX;UcXR|Dh zC(HT7|I1q~|IfMDzs>j6hMbSa>b+?B^~47JM)(kAOUXGfVm#CpJ(N@u!bSbrS0G%DA7P8>X!zXnY2(&7^-vm=!D68^( z$ndS~1ivgwRpdf{{Yrx2ObC%d`y<%^?-Kwxt*Q#ok&VG8qWd#(<*o?PVpC6cA&;x? z>UtGYX-~(HwGA@*9+|J<(>GO!yH@8`vN8g!1qM;=(nH$3!a`LSm&F{r%cw8ViWh5a z)p#)^=pO34|Mn!S6r;%pYY*bqcZ^}rCn!WNW%1S&|9jv^d3TNtj`dbPR8DefA{A(0 zs)V)hlfTD38dsT#($3h_m8@?^{lqwD(QD47LKuCX@Jxdy zPxpZfd8xWWIz5FjX|QR z+*|KPBv|u&dfw7rL=>}0VH~&2BS1x+tvF^ff$XjivEd>UWEmH-&bTVT0TBlMzykyU z0mI39%ueB@z}R)XQ{RT68q(IKo4Dv{B6*R`G z_eSThwy{z%*`~$DUQ^`AzU2|Uchf`bF=I~?gNK#<%n2n?( z{biTS;0bMQp?LmmEz1V#Cl=Pvs^`z2Khm5{Bz1jCarOOvx(J1;N@If^aA_(635~EkgP?f662wp#WiZwjA(WL)amh^;9 zaYjKFHG_|NDy!*Wvlm4+>ww3>ovO_?^4D^k-pl=FdIrMn&TNO|1)AXda$`t19NX3i zw=xq|%v%!S!>U&VKizY=z%rJR`dSn%VFd`5eod<&PYOyD&@(B)w_Yc-SpM7c#lV26 zu)(+Z0dT!qhN84VraoKF{ak>z#a5z|aiv#;;cEi7xf}FzZ;nsSCyGlB{#Z_}O z+fzMQyRtgs?MJU6xY@hP-+KT4^S^TTj0KW2=+fNF1pcmp`ONHUz~H;2(OTmkA*k*u zZA*5oD`CKxprwHSY+l|mrOb=a8G$$_M7;nyy?LJf>3b~mrezpgTfyl8EuOjib_Wl? zb${|xKqC?d*iMDW19Dz&^Iki*58Q2i43dC61_HYk=8ARA6~)^YG5dx`TK!!94eYII z2NZyh_1Z#Ffj^eLV`arF#+=}KnU6`>RwCA9-?Y; z`8OKNNHcK1-6}>K2|%I9ur(a;*)V(f`bw?jf8q=hMH>5*JShaEb*8H zc?ek*ARiGC)^$i-)GBtI`CRG@@2z8-JVYM~9O~pcY3`F8S@5xB+6@&q4hpP#jKZK( zfdUGdG+b+?E&N0b6uV&Biz!=dBQ(Yd3gI*N%y+MQpA)JP-#%e*dKQPDBjb`Gy+#@M z&_Hk{ z1*+}rKic_UetC4zC&cO zOLcNIH&?dT+S?6%DY^twqBqa;-?eyaX^*O3-RKC0>ygU>GaHIs(tU~peiB%8lqUESGr6IxosHKQp0nSjtbI(OfH0@$nwYiG zc5#?E`Aa=&5T>G=jlvct-c}CG5yk=*1HmrIv{T|yAF^e2c_5Dls!(!3W z?WJ$tkSTnR`89o8z4Z#E;!UD{lTD-h-#LDFE;&to9e!f3m?seBO(Ji&w&V0=hk{6< zhVQ@kefijDR_Ft2u8Tx&UzST1vJaq*Xdpx_+%6|Je)3!-UK1&8pZwWF>eS|-@Qds* z+J%k)T#WH`K01d~Q2!64en`QFf1%E<4kPzR z?Jj6^o~3<|KkDZp=pQ@p$XRiFcmAGjW{R+qE*=I}n7N=WijreDw71UAv^Y;N&G)+; zf-(p^Vjt-&jbmM6Tu^r~TW@Tbw)qkty^YVpr&EsjX7GRT$8AfIjpCylQq0X^IBerh z6d~xd4|7WvYp0(E3I5sIUu`7OeK}_0ufZR&s;bSxNArpz9jEOa>wY!&#D0J73JC&k zdV?pG8jTz*S>#L8S+)}RQ2%3kG_|#(#D^fVgq;Jrrv#18#m1-I3b`r~5n{IoIm@eoGud;FpI%;x6n9mM!tu4N(%C3vxBSHKwvraufj zXSejBWWm7+%;mX}24T(9gPSjvj&*7%xA4sc<&@9Gm(5y;ANo{;Gi}80zACHx2Z7uj zs?!WlM(6HNGF1Fw*~Rfp%e!K}v^}l)#M1+WPTbK;&Qwb+kmK!fg9@sTJLXvY=UxmG z(ON&|Y-gl+@Tm2Dw{8Bj(2kypod@0bUwQbN&xd#zO*;;b{B&1rjH$O#J4VIpEfmR- z8g+4SyFRd^V4BM>u4z~}u?1gH3m>^m=wy;@>m1*N{1Mp1>G>n))W4^gnVBDPC5(Fh zT{=j5H-l{Kw)QRXOF>Hb`ZMqGc@`#+Fjl}F)?ux=k0i&zTgP6Itp1_dEuSOr1Z8%o zSQSZZ(0#gBY(0hnJo{m8q6^Nv2cOn_`6o%Ue4dCXDRbxU6H>n`<}ZTb8LN2y`~e)v z#6)1=38Yrj`wW6&8EXMEwCNZ4xN`ql)>QnLAr=*Tmi?W8SrUKIv6bdu&m!^+#P<_H za&UCtLJ+G6c!G6<-1fUS zt^f3O7(n$LON~` zDGL7^sP9**7L>0OfZ0$uj{ep9jg8XVbTg+bxN7fmWdXIL&-oA+*$bE;+WA&7|dUMxSiO+}5H zGz{3SOI$xVeB$kmcEkOzMD5=V z*ek<-J8bXoI&L=~o83S?!YRcj9oP{c@~+c)-^|+zHm`&M&BjQw)KAB^Ej)fM3T(cl z{`2I_!~Vh@`(B%}>`&k9G4Qw_Ofn!oiNAvOLh{<~^(8N#E2r!Bg~4PWatyR?)i%PA za0XpyS63IN70X}JU3?x^n#gjYPg`KEu&+b*yVhvI>QS&FlqK_)qw0pqzyq-`7_zKY^Kg#5Ay$II)H2 z%FY@tG^q55K8j`(7CNf7EoNt3xg63~`a7iB$cqZKfd?(Ix6S+&%JE-wDeosco(opb z9#=N3XrxZLa@rr0s@ctcUfvnw+OD?Fv*-8~AqUd16!w0b_l>AE`LybD)!lpcG&x6} zp~2t_~OHDxqx)aHs#92ZS4x-vGj`zgcMW-HVbOq34%tDZ;moKww- zZoSZYJccnmE2TZ&Je5R}066GV63W3fE0K6S4X#E@0d~U=3uT2|%unxq>kWBAy0b5h zQ~7d`%hF+LSGGNE*9z3Suk1FR-N|G-@~ey{Z;}UEM!Ukww^J!$IDRnWh>~Pi+akfu za@>{sS=@e>U5iRrfCo+-|+-lK1v z?_lvbtxR1ZQh=jjtE|E`&tV4eooMu+W$M?4pI2D9!c25z?eU5|Ee2Kz^Wt#p-*tzm}fBzk1sO(Fjin+E=L3CNuAGfzQnlyr?BGpWtoM_>#K$Mk@tq#W*Q5wWLD2}481w^qq$p!IVt*&qL8GZDZh-k@{#i_kLh~1uxIaXZw zbGPods*ihJoZiv-0x(H2B-D?$3m9xWpG&ZFJ@N0=*7UQ>YNGlrp!#m>eZRyeb?Yt< zFXTppZPJwNV7ZFFSc`q-xE3Fs=bEclC6b7l7EBWm-GzARwe!0hwQ`+WW1X{g`(DU@ zaGDMI^I`90Vz}l8@wPpXt79ymICy9I&V1TnbmDg9#S`{!@$}BA7!<@|h88iPmJLHG@(gR|zbwk+ z5z!x={zUXAmZk7`1Y~(x!NLp=%{bzk(slWRYJbC)!CFi)v*S8Fx$bykhu2);fXg-s zv&Ejb6bog7a>TQnZ4z5|&b9?SvsugMm*1`?zL^wwX=cTxk#Fz9G4bVR{mUkBCvaTf zPFBDGsCKGc*abc^lvN>&LQg&oB*A=meJE&AiI4uhZ5W5%F2{#_0l7Vso&1ZRb{I)Z ze`$@B5C%q#T%>ewqn4!E{Nl&DGqQHFLS6o^H%Z|x?Y|`-8g&x)5D6D~J&oSo{6hb& zpG$0}RS9|HzMgVD4b)ks367t9+}yKw1tT%?N3qpKDE@!`G=!J_YbHjX&f(=^zLLa! zd1vx8$#)C!PF)OazX3fcL^_B_APi`)zlLHPp%iaQOZAmz3pGBW_@2I<`QpVsh`gv` z52iY@eJI>y-%PY(|9zdrDWw+GSj9nu6D4IatVR5~?+ObJNycYIPMKgl;*1&t|VAVLHv)+FAjf>6($>=p@k&L5yN;m#J}b_-^pUKLKyK-j!Gqoqy;1VE$2B zh0~G0pFnbd`gSqc|FYQ!AGg|fja{W%iN$yIz>SyXk!6;h5zR7R@bJK&^@RS97iSmS>Cf1{IP%k9wyMf09f3R&4*5}-694lwkDq+1!$m4?jbB*a;?OZPT zXwL^`rVjkqY>J#sVRa|UzDG>+wAiL=UQ6R%pDnppjnvIrs-~~|$yHR2lL8y#oOXib z0!<#&u(ep81D^}^Yg8T$>Qep*I)gmt3j6-Hu&IODKIa&ke^FedIKbYm-A#-`PpMh?OpX{y2iQgqF5=q@xKb`Cx zyWFTZteBrc`0E326IjeH8x*XU_e>sbRDwzY2GUA@^J8QM>dLrTsi5>6bq((l*U0g& z>iTq)d90inA!q67N5E2J3X}w70S>=7!K?Q$denv zO{OL@C+fZay!K4MuIi<-`F+)UT#7!fbUeBDjVa^_Q{biDM>*e=?_whAV(4r8W{b0YstNB-I6lHqfu`)h6CM$KFAYP$9v z;8ALDCBk)6=U-ww)AjRUbkowijJX-^3~zewBj`FiDM)ETsS`r-pK5BHS%q-r~S z60aZ7+WDRKvp2oTiIv3V?zDd~xL7GiWPM1sV7_uc5%u%= z4|YlYOaE}=)83^ZBZ1A9=e6pthBy+Kb9_s5JYCj?&K*t%uPn>stBt~xP=$iX*t-P6 zXzF+6>FITlt4q5>>BNSrvgsDY4FU_AeG9aUYE7&xZopbj82=a|ztCSQ`izy4v% z&WYIf`5U(`Pt1ce%FN6p(*4sVnfd#T)1M6EX~sOK-iOQ$_C{4!yl|bzAPqr>0GBNQ zYr@f3`Gl5qB@bnwDYA2ZI=^&4WQN*gGIm+K$m%u!i(-F-!t+% zzKFf+b0#Y_3jdI7Q0H--VsT!X>^n85@$IkA)-tsDI^OpZogK<=3*F-@I?rP8{6~B@ zmq_@T>T)(`lZTb*a;_P>idPt3Elkzx9Jz3ke{9%L>;-d2w$0hZpGDbSmjw=D28#EL z59aRPzfaIxzF=e&f+O##W=@8*iWUzY)?D7f)^B^0n8%uQb!5b!8JyUNQiQzJtjGYp zAi{o!i#-%=@Q=VilI!i;I=O~Vu;*xde?1F!^YKY0TUUA`a>}9fyHj}`l{@Fdc{S?A zd0~>9v@`{qtV5M{f@9|Dlqv?HZr>vx&sJEcYV!nMDNuT07}#gXWlR4xA{z4%BDvtz zM)Nwuc@__i2et&r7`fa6mQmv{_gc%n< zB$IPA*ELDx@$1J31f0ozOg>(qZk}%DBA#ulzxx`i9!rGue6!-u=Ir$J1N5q%n$eGcFGzjx{q!RoCDaUnL_5;9$dlU@r ze+_PHCiI*Aw!ITXGoao@A41vf13sa?iRZ4n9OeAG{UiucT?C5)qMB2}Qc?!=Ebh!1 zy}3;P=x#_!T41&6Y9~qg-;$yv0LQ{=x#LEkeDC5sfal62e|nhOehJ_{S|a*uFLa-? zMdqE7kWeAXhL}Mg9&@p9!=@mVnB+ClgCL1T_aakz)UOu!~8I+mnu5hEOg^d2w`IXdy?uO9>bV`8G_#TG$-J^uA5QJHMN z&S(xirIwbKZr*8zn4cQ9k)7kW=Kj=7h5hzNN&tozEp80IPAbI2wVmB$cq;GPfI%sY zDqEoC#vU>H+^PgI00?7ju?(nlc2jmZ3ex94$o&j$GCx1RpcBuv(FyL?AfcxfM|g<- z(n&u4i{LGcyZ8NuLF&M*w1SzP*Q=K2?Qhz@AC1-N?hNs2PrCph1JR^KA=&?wT zSL&*#$>`_sb8@*&=0$(dbLA?#wmXvr)_#7Q^LvO0IT4(_rNy5P`)wkV04~yZBM!@l zZ`@)ERnJ~MiuFzU!MwXJfE z1R6jk*VxK70qJMe{XYbCV5s8Nd?gBQ#Zr=hn z4VaH)kOfh2-@9IBJhN`hsr#Zk$HMXcBme7iW`hl3tsiW-sma@2Fj{=%*eU_V3ofb3ycSk3A&OIH| zM%okPD1AF!u%x|nhsA4aF0+vrvpsw9tHX(LXwehF=iVDD`%whbP1@S;X>fvw6kjlx zpe7?mGOzT;XSXYIEEvwE0Ivoq&-?P-eJ4&_vl?1lt15Kdl3qt4A{+Nw+;$equc@gi z$eRA(n;$3=BYQ;NZ(E6*wgzCZD?~Sd2mZ?F@g58jZ>iPeqlae@x)WRsXCLmTF(i^` zyb5JFPonjSPXsN(s`$jY89 zatuDQxS;kXr#D@dnk>D*^cxkV*2?yrBjaE|DIfZW^umz=axpxyHE-X)oRKiG=$nFJ zx#p6c7pw-7IvIe}?k)e+&ttDBX#;arKpjjuTo zp7MK6@*ME|66t-Pc5oU0di`H`vB?)xO;XuZpGS!igHjU$W}173I6DiTX=^_%JZ6e+ z7r&se;|gKj{gz&&nU_scv1QM}$xq$x%*nC(juEl!PNy1EL~^ zGyc3YiGX}v_i1H$xrJi?{Z5T$u9+9GG zG@j^L+Rw4!{;r?CJDB& zVZ(4P$+3$Dg@X9)|GHX|D_c#^;92V7?X4unoPWoc1_%l?Oohp8bBe`L^^9=-@WH2v zj%rwR9si7>&IM7K{`+v*H@Af9(pRs9zdejYm<9iHP~%U8>z_&uZOHK~?LX*g|7fod zrHYl8^ailHAvdn{sR!aWu%F=|O@5C^Jt{%MV(8vdLP(^{+h~UDUvv=-2)~h_xtN^K zL2|yZZag*?$|N>okMKj@Fj8y}59?srs`nvj`+JR#KI6gGZKu?LhmV-CfsT0YLEk;J!u2uL__OusO0i+SPd;20AShG5IMo#P%Q08x zlyA1q+Vd`w`c%>5$eJuDC_tnk6u-!A3PYa}w0k_mrBRz16CuDv{w@sP-QLemf*>el zb1f}G^`5@>CQP0W95{eZzn0bj(jq`*(9uMssBv3I$EjqF+o&85IB9F(Iy(2b$L}e7 zjj3x6?+w-8r&@ZwJNE>MAz0!bhnO;J#kUS#b=t7oZ~?t3+ILUyVlvhr_&Ykcbj}CS zCJ*E=g@4rtRZ6_3rKRM0r)K%Pwp&t~<;ufvLN;K&q)WtlTbI3UvCFNUAk&ynRq{CE zxD_mzjHQGxw&XpCh3Yt;t#gs)Rkx9R#37gEu!EkTUK$(l{CzDWQouN5&h9jZqY7%> z9FmfT!5YL)hV8|;fQ8V(1(^f5OT6Xeom|#&G@W?!THHpoxlU3FO%a3)-MW4IAtq&U zdBHmy0X30r8qB+#OH&bB=1>g{3uD}I_YLB)rfDl-Cfs$%8^fV`jjGXCdf2Xn*=N6j zz?1lmYhn8!r4~>EZDR7aMA{*3gjj&R*H@LEvDdeB%@x;gK_p;${|a z?e(sOQ7z$I8cph-g@?+ae_L4JGBPq8%wcbns?qrpJ9%dvS2Gfg*4Hrg(wt<)RJ zhLznpJwka!geiI4YbBC9=pc(x%QbUNxdl2bwt@{~dSyf5J9+JKEtccvF$|fB@k7sA zRX*QSisDAvQc4P)vwnYHADhdv7BTls=S>N&cuiyx0W3m@#Ju){elB!#e9@ zf7+m2IU0v)I(dc;3d7n8e?NHTEd~!t-D2H?Z72P1uM)?^QCnU1LmIvJoZ~p~7LR^5 z_6f+1eX7bSfgGJ*J5Hy&Y~3z>f+YNbN#X3Imu->3tFp2n{7y*G##4vScIefZBEx)y zSm86!iRTKzq1~g(q$R3&qJ)~UzokX1@4W-cgS{DrFpD1OD|dfaU7Z_YFU6X3F(os! zi%s0Q^zdB8Z{CmB_+vBLM9Y5R9EW~WiZ%R+gZ!Fj)&)LFT(i84l$mOBZTRHX{Reb+xxpb_E1A<0VB*4GO#6Iko&hYf1Az9}h)%*Z^JAJ;|9 z+}zyKO3@KPxM{-3?6Fu4K*vz~Z4+KZ!`Vdo+1Lbia~-1F=d!f_z`?#o(FbfI`n z9h$&l)APJxim9xg0~^_lnPC6rE%z0A@yI?ertus=Q+jDB$=Y=}yVFKbH=Y)+05T9^ zCW1+@-iz!a|9c$mhy3t@3#@t6X>rBlD{KRA6n6_C(b=$#sfWFLzw?n$N2+eC-2b2# zp07=k3gaS2IBC<@6)2h)MyA6YIa{Z@l3hqh=pujYv(M_i0U+%hq#N(xTi);3Wu7fO zj32C$X_FAG%IX#1-HYG{P!b4dMmo*>V8el_+1ZE^7F3<>J#ZaJAx{^IRBJ~R&9r6P z)(#L~&1iE|6dB~&$(enV5*z>>zmy}WNQ0SSDtUk2?%I+dem7U8|bRl(P4KH21 zq{q3J8biJdT~&(;7ye6YzIn)A@vqk1QIf_icfY3cOLxL%$r7&mAOiC6zoL^5ky>^} zn2C%CFwyW8aI{; zJ3~T_&2=qq(j4HsrKK3(s>;f(i3B8Neypt}h3RN#)o=46j0K^)s6ADcrpw<^d7#1R z`;Q;-?_Bl<9LY_6$gSchta>=0<1|~F971!($M=44*|R^fQX+YYf2s2N05>_wGzZYk z&G`qT4gc^nZi|vevvmJZ%gij)2h4n_XLmJ=ZZa)}DpbWHnM*XW<*h(4&5?fm*x6MC zlG0N=kREW1!V%bE!;{7r3~+pm_KktS+c58!-M022Plu`=QS&kOqryd%!LaTX6vN%n zqb?J3_LF?s=~we%-l?pE&ur)yhX6da$Q2eVDpUf0X8}DC03?R|5zg%cT{4p?*h{X`bp|h&n|T3^L?|EbO!_}cALJv@u{%ViWrWifNQ7# zkk5tD8d$pHzlE~;rh|j_ebaA~y|THTry^%^oCxDXYub1pv#Swnk1RuMOM+39P3$%_ zG4Z`@>?fU!P4p2%E|>Bf;BGa$dR|H6Ebr%+iVIJ1k$iho^VEZY9XRY1o>+b|b~>a{y)VK$!URCo>dLNLoc;WnO@dyL;*I=66p7BVdWQmk2rW zHw-#ub=tgNrBXRGsCP3w2`Fzk$3p2g_tI3V9zC1v=nVhq(k$yzZ7YK7|V6? z^NYZA<*F9kOshZkhY$V?zDr~s8S?1LLWEIeJ-7OVR0D)KFw24CIz){4ht3V& z!fTxW8k7C=$!dUuY)gJ#X1d96^yfaAwzGMmZA&bcY|4LeeM~kfgr+9V z{I@_|CMp+1DGvN9bp%jFXb6sW3nz7>d_4dxA`gdc=G=Bw^V6{!!@aGct=C1QhC{bncVcZp-)JXhfTJvTHYKCH#@G8BL9Dl&k99WlNX1L~!mxfpdw>(A# zA5j?ivVnO4^k<;-Ov&v@bKnf{-jUub_}cTnlF9bwT6DoYo;)1LX~@YQZm*Bsm`Ond z95M}h%WKQAJmM1_AN_|1pCQ~bQPOe!c_aC~yErTHk;Te%!LeeJ9YG$tK^RX8mK%j5 zBW4zK+2k#JkGN5djIane*M1S});kpH)DhhdZ)M(ZHZ@}e;jYD>p$fe*E+-SON?(T% z%}!Pvg1Jw7Ou)q{b4K3fR)1Gk7C+YOry>ij1+qzZ&rMDI`tiea*}m1Q*Gh=G!RUCP zDzBs|uf7pabY6%&mso2em&@Ac<}z(_ZknwjPSZ>dzMTq2%meqIOkAi|&ePR#=ZF_l zV+~OH&P9{DP}uhIRD*dDA?bT`bQEu-p`ihc0lGCT<4&LJ>RhE|C9KQ<-?S;?n#A2% ztVjMP8beY^!04WyL2BG22sCwbdw_UgM0J+kDY$(${Q|;_I>i?qtG6B^S_FkCX2@6+ za1tk{s(d3EVr^F+qf?G7IMQsn*p+|Ca_@gJ&1}GGgh90lwzftGD9e4hpL~ERbmomLY2+2D58kIsEO&AK z`LA{z8&Roh93PpmR+>?R27^@k>v+b==h35{H|_1U@}sB4!{z>*dfhO6n~OOt!$1I{ zn^&AeF$$P?^=8L;A(!g-XFq%2Updiu&8t~Aa^IZ~sUs==Au}(^Bi+%mpD*KN-lFM~7*wIO8u$Q7T>%6Ux;m^IVr7Iu~4!MXlpp4sxd3=BJIy{?#-1H&}-$ zrhmXWjzf=-l&nq*x{II$b9c{OmlmgFW+BBeBozP1y2lM75)Ws_+&0hG2RZOll9G}D zBx(k3b>&}0O?$$tcx&=HDyRARLDl~i&R=&Hfh!q44w>;HR8jr*i;W{PcnK99mavfi;$Wh`1=wVvjfgtp~Tp!M)UJi%-9ovPSC z*~w_)mfkAwyJ;ay2#1)M05ejLq`QZ{sfA%1L!K$E{}P|PYco0G$3kO_b}=DXZ}j6B z0uYjkc>U}cLVjqGa~Jw~cJVkZEC(20h*7<1TVe?8HnGH|U88+Cy42TPPWhsD_bJVA zW4@cbyH_}ws$6SJ;T(%~kMb1+F0SDUpN-pD+HfohR!k>4Lw!Nupy~`iaEgbQ7s*_& zrbrmugpj}SS#@uQIq$08@86&Pw9L5DfWEV}*x#X{`x4fOsx-fICvmIo`Wrj`OCUh= zW%y73Uo8MQq5mahBdS<%2c^sD;YI=ezxOdO0AdUO-%Yvx`xxJc;20`?ym=gRc==$d zQc_Z06%}>ppGj@*3sK^9)1oGmaCa2$?eFgtf7d^2RX0ft@J@&T`LkBB3OYWV<~5i` ztZf)n+w3ny?9<{JYOq}29Tz{p^KAnV9iXtVkmKB)DG!8k%Ty5<@UXqU-2&4`PdB?3 z+J!P{fE-`JYt$>pms%!Wl&Hy)l9RjLzG~U&S{;AX-lI)9hHh~UTxl@OPj*H@m#tMhzCvR` zl#MXed&597ytdlMk&%X8Gzwm{qZ_YJFwtmusCQ`5D`N*q_ZRk;`i>IQn$XGrRLh*p zy}dS!hfZ0N8DaN^^Y78i?RDcxe#cRyYG(Y&auWt^pi&>9`vaWpeC%UYEc z#ODL3nCyKCoWTa}4s|rjqR`+=h_=P}2C`a{g53Vvjf?Xj%v-1Q8fWAO#7B?!3{MjM z-HZ$Q%e@kR@(QMj0Os)Eei^l;Hwjk=L=szCZ?8z=v;;Il-yG#C&l_!Ww8y|` z698BK%D;b)z%@zU(Uo(b9UspdXMT>7=#~^1iSNCY#EX+XLhBwV*hK@s5aG6ZnJAB~ z|9jzQ%6|;R1nZX%E`0=jn~hCg!CTR3tTLRV?F}~|0Lj^wtM}%(7Wis$*wpO5ZF1s) zoK6MlNK>A8(-P;>^57U36^*G}3Rf|6_YaDN)yIn4=eFg5i$R&9E+KID$RY)s93ZD# zPYnzO%+nR=iQHXu|C|o%vE~1j3mO!PYjO+Q(9P2&=xCY4E-|i-&wJbg!o9oAzFwk2NAl%;8F zPm!B&QoUVI`jkmU;(U5bC4YsK=8)0edrB9kR#K#>gT8-uGVbdc>OUUW^kyC&{4K7v zYUov>)0~`EW9;1-_8;+(vETg1&4bsfyla4#j3bmi8fC24+#VPgKl*h(iW^WBzi5y6 zHc{K16nx%|jXOAc@sa$Tb zC{?!t)F)4prrGscW$T>5)tme}`rxX%WiySc2`c>b3krz01;=z+pKks&8`z@E4zaSS zN3VKpih7S_6rE&_@z%Uwqj%2&EDE3pzv<_Q%V1^)BFO!1OA^>OvTi0lVsW_eD1-bW zJ?ckmO`Aa|`k7(!o_tO@iIU>Mz3p&rbzRMyn?E^@Wc*E2`eFjP-oGAr!SI}U70Xq0 zQ6VNIta4NHbS~H0I!B(~i+^j2yx3q{%r5gSR3NGM?AZf09-lq1n zUlt|RW4HLl*Y3o+C!|i%F=W&eJz=E3ca?47KJ6<(k}hhl4+FO}FW0ucgeqYUuwugU z33pII-w-fF=HSdsc)=i4GvDn7V=)q9Y;4@#hJ&#PGYEgqUtAs-NFVpME;1n8N3POV zuSbYvPOCPax>DF~Y1&s1~WhM1=MvKvtogT>Tt4Izs67PC4jO zBUvroxoj3bl(enmm_`=BtwF9zXKWXFi9pGOWb4uN0hQ zU)cN?Ryz$hquVAY?_+En9XhNKj$qD(H5mli-uZdq3)_7qshh40Z@tc&9L}m~xGvJM zVYhk8`OeUmFbBz)l+CE_)QBaSLLxb8VDuKzd%Nm{+-oS4&gSbO+qL6Y%9BN*%tJ7b zfVB%Usvp+B{@vfth0JVR1A=Uc{IL_tim9L!*95X|FuKP;?n;~& z-R(i7q7{KJ@Lu3Fb^lq^Wp&`ACYQ&laT}UQ8VuH2<9mR3h*Ek!E{d?Y8=x=(n2++U zDk>s|Dak5pk-^Iu&o(DkT;os_SXK?-EE`x^Irw2Q0j>=Z`EE>?_JKgB%90}zPLHS= zi+vJ%|1r_X(QcRP$@sOZSYlual8xF-9-UR*C=O0J%bO42J(5V6Bi(I;OL=Rw10 z9m9+Qno6in(U`Y0pjVcjo&A5U`PNm7!jPIMO`g-OeVvob_%*}^P%IH_ZqV?gEBO|$ zjPBsA-oCzzM?war(6>a5M~MGzE#(0R3{nFqqwEm_Pmuae!NV4MrX9((XXHe#>rJ*& z)~Ah+jbWnnrjz8^&%2To)91|7Bc#Od{s^7E$=F>6RXJl}VEtHY&+E5uAGW2+lM?xE zZ|*JclVgk+6aYN+ca_!})CWb@{O-y|*akgW`i)*(MOoUwB&Zz}`d3-v_)_C|-A5u< z!_fK%Uj~Bte(gYBLb@WW|1>_I?h;oI>)J-odlHsW(l7nz-ya9A11$O56emP@aon^h zvJcr(a?r$w)R|v(b(b{Z68vIOfG)X73_AxSY2#!h`Mxkti{s!Wh>Mc%{`gmN=4?2` zPI=BWj~_jdX}jeAm^^s8N@ypkjAjyM3gCl))>LqAml@Z?%nswVdXj}U-;Rv_Fu5=1 z$?96JIEUs2x|pLBh%`?0ee^4W+;8Dc6n>{$QlV(V_4z7cmyN~YRssgc*PVoNeSw3> z{Px%7--VLf-JP&K^Yc$gP?)OW_x|}Or*r)K%QuV=a-iinmUI>X$+_&7i_0a+Kt>M- zZWCkU`wfHfFSd$gPBu<1zaC|_m@o^k8sI2w_;167<$MX@3tp=G)azaRz}v!5;Gm6v z;-HjTR9A63@2o;%$@f;z(21K$xQSr0ZY+2}X-t$ktm}{-J{153X03@?k6C>N{#85kttHq>hKJpNq}O75Q6GTjm@>b zV;$Ig@))_|Rby+Rf)BTM%59!9d|s3xaD3op0ijTyfQRZBoe{=SFXt#g*`dvd{qMlT@`u z-?hl6R($XdcGcSmJw&V_0j-0DKobMRHFgNbqm7J=TrP5Oj$Yt=<}RK4rLZzz>8&om za>%GdX}MKHT<`Sg>PFr#G?LH>>9l*)JH3i-{lrS~f8BbQ`5mugXbym6i&V?Xrn`pZ z?O|t>3hCp$FF||$a;!#AYY_RlAj}};K%*I@4CvLT>n=4}D89}Wa={mt|AOcF2OO5zuF%krnz5WjqaW`+?3|)J~6xvgZCW$|xHNPX4>_2o>W$J;L z(Pzm9?i29!K;F3b+Wu=%RfusHe(10d^B7_-2-+SjXPHJ zAL%~0z0HpE1LP2h&eXiW!N3aNpQzeB(Krf04`UlC%2IG|c;$F25T21H*JX9v0s;^g zDi}g^gvyxB`|Y(kf;KsK&U0=@?#$a6`!DcarroEZWW-5MRsIk8qJ;QubZJ2GBiLIp zw{w4s4e~|DdsB4z#kPI>0W5BCYJ#>og7wc<~>;P$Vuil zJ#a9!cBMp}tp42dF8Wn#62tp^;zN`wqFPoQIZxXJA*PaP%fzR2yZl`DIpbcR>kmJ^ zK{_59=6aHJ4TJMw^6VTKQ{az;EEH+)Yj*_EH-an+(e(HDg5QAwfy3S1@Fyp4LTP7H z1B5<+rX6GfgK{sc9*4+*e_Qjedhw?d^YyUd1~qT}DVc*DkIn7m_3Nz$*#F?U0aq|u z4Jrv@p_h7-FCJ9GF9&)CLl4YaqtYmR-*UyDJb$|Nn$jQpP_kIR-!t#kTEmhpPtevB zp5%=dvYp0ubT!>C99F(iDG`wXh^ymHynJPOJ?} zdv|B5N=vVgm{HGFKzCwOWD>>w)1GQcf|vB4%R_{(CatSQ-~&ZRN56m8N+4Tj&13ex zd!T5>!Pt$>z}&aEv~*vIleoNZd*as(%EPdAz=y=03M@E)^9QRE6x*QO8|k5o;RLx- z{{iQd=h=($pepT|{FSmnb|y`98w0pk{dL$^4^ccI+B|d)s2VZE8@HXX00_qe2&q=G zwYh<_*Gf+oKHh&e*IKPiLDSgRIncDs*x__Y*rs>x#$hF;XKkaXLsZew#Vf>uce-^; zcutGwR4baCJxNu*G-UnT;ME+GX?cC4E*Gxh*5LPZ_{yYqx1j%sj-AJ+a#5*8bX#&XgiWB z<0GR~#ojfp=b$24@FPo6Ep2v=u1SOa61I;+nc!;>Zia^D8&~g|^n5Pyg1A*X7ga`` zDJ9jxzEiA^+QFY#I?FbjQj+p4wH#6c+f4&4saIu+L&BY7QMj$wT{^4G_CHX>e=jG| z1-&8o&c)w4R`oN1&-B!Qm7@89fH2M$2~1aMU^T~ zd)|>@=qdNT%`&k6FR(XJsWJ`>=wz@zt`qn^Q}~U$zHhBm*rw8XrSqa&Yyz?pw0+!s z!XAIr=Z{sCPOcvu2Y)i4u20e;Z#JYge0-|2%q~NXVySyJ@By+ z=nQZL664SGuTs)}>d1esX078PDw#{~Wx|S*p@VpI3W?>lFr{m55oag69{!hu^^ww? z9X*kekM{3Ji?8(4FF;W_T739(QqAoQ$Wrhi34a6B9op0X2}e5lJxb5|UY#5od(mwx z_BJopDEZS~(oETFj}N^DBE|2Or%N&KQPDaLb(8%jaZ2GV5^AUdEuQ!JUY{`$W48C4 zo)B|)q(+%e(3Qdu4V8$B^Ic2vK*LNIaFI`Ee2ATB{w(s ze@&Nv)202pnPYct9vgvBKt1b9Y3q&(_>GUr#{Y+@w}7g0?be1DAtgv7-2w_oDIg$7 zr<4jv3rI+JNOvQG2qN7oEt1lyAl)6(Dc%2E`<(NSZw%gd?BU+v;(6|v^QzhUHY#xx zsbQ3HL+QOa0%0lB-VlRV)FeZI4xAo*A$r?X!OU1ByDb$g5Y3$kH+r3S9<{K;(~ zkQOgSlOjioDt7X$dq=)z6%W=+5}?;4RBCY;TMj+D_W@Lb@P$aFa_e-~ota|7LIpS% zzW!4-1y0+*G?&DarhUhTLQSbhn}F`}wmc`~vUd>@Y$|23(N9?YDe>6qyw8?X_UEvE>yC zH1Vq*0mwRO=Ru*wQVQ1K4+|3~+4|US2yJr{agOK*8Fwk0;Fg2|>=RJQaDFS#|1!~#I3&`sqGsCSfpYHD=8IEL)SXxis75}E{`-ul1(DU`TjwNTb5Tj@R|1c@*e zKR-XHj$pbF=&69dS)0`dDG-3uP=Kt17IikC$>-*O08mHuTgWW7seEgMa|DMX3`sGt z14tO4Q-sf-?a7&$B1`pG7xJKiP7eERN_`c^ED!B3AUg*~SO6gBzn$i}O_!zFY5C>j0VD$S4knK zOqnF!XUck+{&ZZqwDHMLrkD4zz6`I|97DZX>?O`FI|~YXD2qXB;HBGH4`PUsX>VvA zZqQdwK7M$vQK)efL>oBmeHD9r86kABj7w{63OfedcgZW5cd&)xZ(T%%@GXh z`D6(oAQHCxNd|J}FzZf3ZVZ%{zqvDP?K)+#o~};>G$l%X`XiCeEvzCv>>hvxE*3n1 zRGm@DUk;H)NY|XQZa*gai-mxEr3!891py_v;GjtV&h#Qf)ex>2z{tC0`A<8Aw;igd z8dGAROLoc~gWn$3D=`xb0WVjKpg$#z2RiTDT;jr35u(z9e)HU1cf+9rs^h!YNpxb~ z2y>d_u0&42rxvOJs|Pd(3IOQ>$iw%6!68|h`cR+C{!1(VWNF@{ zY?~(zO8*W4O|7b}ZGl6HlO6^jdR#-MXJ#)ZxcZR4$-W>UjW8@osK28pQ5k?o&}m1< z#1ymuW_Sy_BPd24CvTWSHQpxAr5+@@af>l z8S#o)abG_3LdnjEUTcLlQTL zpKXpLb%9pGb%O6h5eEC1fk$w}&_ zJA`FJ04O3gA{Fo=sDmI@10Lgn>yldfk|%x4{FZ>r$0z*Nlu^M#FDFVH8t}`F z?*>U^Y+QuE)&^XshMWtWw_97*WU_7KLd@H`_Z_OIZ9t?^VO@tL{D1vY=(y#`%k=$Y z<;VIfOuP<{+ebhuawfYYfREU8d8-msBA-?(AO}=4kVNZ&uZu?` zAjv!0GS#74DdKxMQunq|R1G>cmLG`4>Sblr_soErgyA$fzzqdU1eEA{fhE&69U!(~ zpKyIr-!S^03&-$2YrB%YlhY8-KqX=A^dFhwI$z`*uqOr2{b4ZLPQ$h6cFQa7+#sb% z_U-Rnn-slJZ^P~79JTCzH=90DIS=@b2l40TZ6H(te*6LD(`T%kKG1 zz0V1twFl`;x7C=8pK@N-KJ_FixxOMu_TW4NZ5q&DaJo#n#^1WhxJ-x=6Y2ra(^$ZV z-7U2^Vgzb8xDbZ6K=fDw6%_R+CMoC!A^RRK5)dRJ(woCQ|2#9E$^!+n<5lQ>jPahW zz2%Zjs9^4d@jlnL{kVk;y=zPJ9w|s-Kugp;L}{>ngw|I+sREGOyxoK9%bK2PSd38F z5kG|X0IaUS+z^7*?3?2;NV}m|_#X8VCUk(v8c9g9;k%l5u27>KmUH!(?(2qmg2EY) zu`ZLc*CKh!c>%pEXown9)T_wgJF~{$Stz5_V^x4*2Qp)em7FgGfC9x;9bH}Oh5l|9 z=BF5jr75^F4G$ij)q9@$Tk+onmkrG6YM>jn=fMDl4}kcNDnS*a+zJ93EOAY+#$dO@ z=?^+9bNc{k=UZe0D4^}xo4uO!p;F-Ci!U3lFbEgfr#Wa%tyqCW#ooThOiWDASQ+=utjdmKowgngrJCg)n7FOXbl)>a*K^mwJ8uVB%?BxU;V|` z7x&Jv{hzGx;NSee#vDE@m`Y9giFE&CfLj;$plgR83L~=s^kP0h^p3iH{C%T%RQR^^ zcR;{FD@#c@UG$QP9CraeHDY(UC%GVv0i+eXw%13tG(PP{rSt??N-xS^i>8GjjSdfi zo(EHpKm53%NVr*nGz4F*J;;t$e7|cK!lyLtV%7u2#L3wqyObIX*?|=q&@xYc{ECMh z4Rj%MV%Pg(Z_i$8X!=lq)+WM8!>X3%>+6Jnw1x*rZ&$EL9o0c!|x7*nPK?Ri(W~7M6B8=go(|$0HY&Z~j z>?}@X=EyeRog|{IUU=0#6_k|u5o6#l07RQ>J+c_+W+9=>lxC3M0CsA&$8XFC+#29f zh*Ui<<)wF?T$0A%xNDnKK0)Bm~+?Y#K|q?ZBCi34{CH1UR+ z4FzOwpkovDxtbd6eg8aE-t{C${Vv4LgUjKobsUjjt0R6$hT|C0ZShE&Wd3?^iHeG2Jo&@$IhEjAUcs9{{V$g9AWS~m3eCyUaqzhn2MNx}!P>Lwpaj^o7^gB^aa~|? znH(Df0VLEbfHNSQSuGC9>SFnj?q6Nda**IW&D0mOgND%j*UFMbg*MXLDa;D->#$J- zz#s=IUF0tf3Ol#!tH;Ds9blqv1CbO`Q*i&Iy_c8X?OB$XbM({*2B5UVk>CKF&u~5V zo156D5i3LY3NWDXl@f0fNFg|--9d!~Mzd7PV2>pHHhW!zZDH6`sVf`0eub^5M0*3< zBI9i60HMb#a!{oy^ZtVjZ@o805_SVN5jS{mpf zfcHmgYwQH|>teowyZ{7eL)~{@6g&reNE?7uunIuIlwY;7e+s*6y@(4AV<@(7i~U=BBtnUAV4#6wDLbIc3mA4qpasN^OLJhouh_?0E}()()eU4-?TlZW}~ z0u*#m<3L0|rtiu)`QoMs9lwb_?OlZinQqI!Mht|>i)^Z3{s7Drpg%gfyg|_87&Lez zY2_7-IvQ4}T%l)!&kr6bh)T6Kdk0MtfIo3vQoR{)Qm#2sf?MbAcDcsaezrbn{lHk2 zqO7@cW{kSy1_roB2#M3IEQZEMCd*n_8CqM?DB=FEZ!0yAOQ-Z$ul2+U){VsfG8z^< zf8%~W9r)x?b^wW+w;tqh#sWQ@4Aukm;Q6C80BM16fR-#)j+tIweKK_2iXT~&z-Q~H zUGiNuGk_Q$K)nS@8D{}fge9}K0?z{o4V%KG9#imzLCYyr^bpPqkm;r9$4L40Cc||lL+}w*e}4Lfb=JMK^Y?oNCfbXagb5H zT{)#Uzq1TMwZNZ6mnuNQL&*WqGE$U0^n7ok${52~6+{l; zmUM|+y^&gsviK=z(@qc^KOyfa2RT`k-)H9rBTlFKl<`oZ@6TfYV(*fFG1V9GI|+$S zK-hCl2WxTrOCc&DxB4w`B107_Qevk&ai;0OdM`c>+Z|n_ zR5UV{R%?Y53l4@-*u$i;TTp3$vd{9gO2EO@6%$yv7kryoKZVX92L_}MtQt$TKYzAO zPwNeiN@frMTmpU@op#52B;h}v{*H2v1xX9?FmLvx14-FnHgW(Fut}yQhTS(bzE&)r z-e~Omw6ub#BcSCxLH21kgC*kgMLnFHJJg5dQx={Fg}2qw3779EtT%&is{$R zKQ3Zsm6I=m7`waeEi^j?+PFpuXvNRy&KdX*tDgG*HT6;zi4AjT`3T*Acb|1-rJ?WwtTVX zbc-&e_7jgm{O`X-gg+Y{=a--f1~m+m;1>@$&pc1jPcSifkk_b~%EZQ$HFUA=8E#sg z_>*l6<{s^>Pv1dT3mmcHd?Am-Ptclu+nER>Z`_Z30hcu(t^i`Qh`(QP2W1{0WIv+4 z95|NhR>AvJ@EnfnRZp=6kNDb45O&B%g;<%Clc8~{AA@jL=Zr630x2t5;KSU> z_A$7Yd6PB^c4g61U7&`GF)5Ez&YNs6c%c42VheahxTpEcnCiNS)Wv5Z)%Gjyw7_LQ zXx_iL@cc%Y`W_}L-xrYnUmiS~Mz_$M1D)!B2OiWEuu~tPcGwTuOD~`mgAcsR1ldsq zCJ~l_L|lrIXZKNJK=?UxW?H}brp2_l(2qOv%>V~MH3Zrdtyr1h(TyOO5epD0-1Hvd zza!zqZsSSUhc`_h2u!UX&_)@g5&lhvy^Lwvh3%kRpLPaqMx`eQpvCY^r}tBy=#Fpc zij})vnMK|L-H4~>RCzu`tw7Sm!-S+aFx9=VZ^fk+BpkD&TabML(-B@1gp5>(BV#L^ z(O{%xLX4O_(GN=k`i)6t#%J8*Rvx-Y#3psx#;4yy0ZPBW4*kwBOT87`-GDy8_4c^8 z!tuOdcs(ID-=uvG@~mM)vecjcTVMae>IY)##fuASX!~L5H9^eAzQ<4J{bW|`_p5{3 zpHV~_+LwwSLl7hckpZLtE41hsZiv0}od%Wc&PQEJToE<18t!514Z3sjFh^w12RzKKRT_g%M1f;G0y#1aG zonP-hV1>SH;SW-sfy%wNkYWlLj4VIqevW-wwodKGs$Q8Dz&nvx0gU)7{qdtcFz(tP z@Np|ELm;65?a*UN{GXADLS#{ZR>4uHQ$&cl=P@%iwaLa`9}M7p+(sCb#~_i^Ba9~@ zrJ5E^S^frWLE1{;I|08=8nJAKz=zV@LSVlcRyVW>VU`ERs-vl?sWW0SWkDGH!C(&d zu*r0&otD(29jBPerAhxj%EPP4?qk6dUI`DWwcOkz!CGN z0zNI+-|l61PJ2(ofdoP`q{VZLg_0SAo-<1<@1u10cNo^81A)pQCAIcl9yDYiWUv+}2T2;!U6Dh|@$pW$;^9Y5;jjlt zK`xnKjz0fUfUls+4e>_!H*jc!Wii4wrdtbG%g3azh5N}{hF1HGZ;X$CWDOMd&?5jf z1xi8B(|fD(OHHk+JeTmXvQe(+eI{ovG76!3?-b^Zx)U6xCJTOj?abnknlE(qQNDK5@H z6o_!e3ABZpCfkHu9netAZ*O&zBh#pH_%1~%9jmFgcXp5!WNVhCOorp* ztiRBwH^O@XAQV7AXu8x3p7-`vz&F{>)+5nv*lWapKY`Q{miFrTG2oL>lIJ$R?z4y~ zFDvtZLeE_ju!aVTMkugJ%XL|UC;U(tRd&n2?Fft$`+ATfI% zJ{!n?hOMu@Yj4R3QJjZuqNmb?!YWnHi_;^(i0m=V+W!eaTL%SefbWVsMbpEgf%sT*U=m`Qnpel$#uZfZgS>=!Oewfhizx}gbwS?SY-P!RD-vBYJl z>GCIAFZpYIt?Gr&HmCv875Dy?&KG2sG1{o!<@j492sLv<<@(GpKe;i^-ihXsfESEK7X;jWb%@R|W0 z$kZ-G+U7x&0dNwlCNxviS|i zENsm4a=*K*1ZhNl$YcX33})Z7tn5Q{%7LpG)CA4Yq1R7uH#cAP0#7wb6%d>YQX}sa zg9ZUx@K1VPU!}+#)l6^uNwe~i4~D~@1;B55bgX*G87U!jqk)&HUXZPa4K}8P2 zD&3}ralFt>*A|eJbbVfE_ctttDz$%E(LvdKl)lfJ-!KacJb^;(4I{ugoE_c-au@(_ zuJD0hfKGwx7jkV_8P5iQIR-+e(J?^vKi8ftR5UetaLE2AYjykuea3;cm6g)wWwfYO#Rr}ZupqUJ_Fi+Bu za{|=UxPk#=@rIpxMEE%1eNbh?D2uDV23N1YL?9R#VtT7(Ki_^cvMsy& z-e>fS9edi;Up^@!j}X^~RwoUgNks}$#m0N@?&6QHNND2i=u6k78eY*%eU%?U~zVz(Jh-vIrtmcjvsbe{R2Gk*9Otlz`erUhY9UK|$t+}Pb* zB44KW5GMc}(}IwR`qnY$0%2mJz&MCS7eV(qLw!FjWI{=byrb^@t+Qw*(T^3OA4AGY>lEYs>HsnZ46f=dYxD*JG)p?$?S6VFGP%zXoVaMJ>*8 ziKQhE)CIyvQCga4pwcEhp_8W-o&Sq@osL#?J8G;?yTsPcNYTt|rpDQv!2I^@3vCjd zwul>~2)0iTPK-1cerP0CjpDPS{J9r$N8Im;JW340&b%l{4sm6xbEDz=Vy&suqQQVd z9j8b`sube7xFY=K^pePkLxLjpm27y30;M-(xi7rp`SeL$XKbeAAt266OX$~PZ*6Jm zWS#$dU4Oal{8e-7{65!vE5$NqE_AC%p18!&ZcCP?;L@m9g4VZEWd5#zi%#7`9%ajRr z`EEp~m662%E{|nPePO}0n5|+4&>ZB$ z5=a=9YB81}mfiOeSB_OQPqWTcBZz(wUCzfWWkh{W!ru0Xf+T3rAO^mpP(dWxJTYQH`(T{n4mE&7^=G=0Y%cowr>3SXu$N$# z0^s40-lnRj7j;K5f&T8@yF&{-mJW`NfXRb!j_1Jx^g<0PGQQ0`P$=&no&sJzy9M@l z7#Qpu8Hu~Jw4}7rs3muVhSEpglOfssswb2nhzy0CTTAHPfyG?Iqfe6cA0&%jAR-J+ zN1DRO`OTF@A9c*}UplkW`B^rr#{^2clKAnrM*rM9F%ol&z@Wa?b@oZ)kT9yrPwV>Z zyDe7myk;(wb~CWWz=`HWcQ)vi+0qcVD>wRqnsb2@8 zV6>v68Ij#y;>dhS|NH)v+^4>{R4ppuuMks41dB0hw<2+xH>jubUw&*Z!QGXPB(@&d zrN+{ILueQvj&3kK*;Un!X@xqvqQ#2VUzOI_gzzBr)0avoCR%MP>h)ki`8^iPh+z{G z)mFIv0E-C*n(Our4YdlN0!0`e5wRxB|61nY=#ky3ie$dfW7LqiC-;dBe;+Rpbln3h zCIK;V!2J9xxQkjlIzqIwUuF$HvS0p;oy`A*f#lCtjB%;fiTqsbY6upY%R;Mx)5qQF zdfFCc$NaVo^ml51qTx$4gfQ=^wcG6%S`3OEDSPZ{1Sz~(Udn5$j(ohlL~1xA#sZ7e zelkO!LPQd7Qear9IkZM(6VkjS#XTEW%f{7tr70VL`;v!}v-!bYcp@Em1W^Le5rdj|IQUo$ z6R&(11$BRVkb=>8bAJxz-85L*)Yy+=Q<9T6!q8K~+bfR(oH8cy`5*R~7{~UTiTe+S z>0~bO+}jgO;wME>H zO-aG~pg>yUl}fwTavt!M+{sNp!rTulNzEZ&N)4rA%|8mI5ep@r4AV$vQ#G0TMCaLq zPkg2i-wtu1!=4inR$&Mg3IwK$ttBJ5!YEMi)otHvCRCKNR)_3gSxr*D zg=VOISo9OWBrJYNTH8yQIvYjE2ah;O=eH%tXNxll221OFLhW*}AA7uyc=F1gzRMy& zyvvuA*YJk%)lGEbghw|J)yt#=4(N}5nns4BSjHoMurXZE-lud_v8N^CVB+XN)mw>>*;8quiqBUvJ%7aeg~!HP0=wDdl;w)a#n@ zu4!WU*(8ga+Msa8@)s{4c7sDgViOXUc_>8Hm*{%?7co39x(GzYGCO`w#;MjBZMS1i zSqP(O%FyE2d1T}5;A_0c~ z6}73e6H6;0NV_n4HNMp5yUR`GzZwG8B@nE3}cLND)O{^6;CNdw54WDA#5D41BYXXi&OOFmLKCRG*_HQ~&&- zg+hZIxza%lOOoVK1;JT;a! z=qZ)4sv3)|goMe&nlU8v2|6z0juhz$b5YNWd6m&Tp4fQJYonjnjCRZ_$$@jl_twfi z_Qh9?piAZ@L*8GHc7u=DzVxJA@K)2~2z>pxp!3UfNs*XwCOT8MqkBTtc&%AYlIgxq z(dcD7mXsTt`{VkY1NU#Uf(0tsGP0S~ob4`A8(^oPVbY8a`I1Iitd&%F> zV$R_Tt_SkIi5nM=Gq8jNzH@{J2J=%1;-!MVA@>p&vGHr$P+dsZ!gXlX(Sb2ibjy989if+b)(sI7NpKE zDhlpdR!FKa>3UzH{7^250<=6ZC)pE^Kls(VxVQkAzw17KfiDY_twQ0_Lp*`t5i%}) zYNN1R({FoXv|#Om%u8@W=I67?F~7(5S!D7pxa59#m1|B*PX5HmC{tw;R2KmE$$lfY zxsUz*lAD-C@ls$g?6I-6U+Et)*Z3=|Gj|XqfV3>;HEagh0DEuK4aY26*ry+wms6lr zF}@YZA1LK~MHnyPF^l2f)FcihGCpf+zd0O!3qD*a${i}5>28^>6T5q=?9r4pr)4;b znZ~KJsBp@WTUaAYzmxsT+@c#Y48)0kp>8X#UEBafqYdE!_>O@F@1QJC-QE~0&rbsJ{ zyMnkR9}E=8&6W@s7a!|MOvMLM;~O6dH>=~H|MrH{|wf6@6mteoTx13@Up$HzqDWc@b|9g^1X&P{*@4*TVC$?>yRDq!ae`WD`+}Kv2JEkYZzV=jGB8OAb^IoBi>MXPPH2} z^RU+7F3F;q#T~ZLTt2b8^EWa5V=#1fXIr)qzHIPv%rxAhXenTuK%hJa+3)O)8;~eh zs3Wi@1cJ7_1xjIhfw*{G8^BZ-78h4I?tDxxwUB}u6;fQ9T^LbcyCAO+80y_13uctZ^wy~Nc+kD=jVKLS+f#Q**K=f3ki=Lqf2Kw`lq!96Sn;DU)i`#|kIP~$s8 zE}UfUX^M!IdtlwlHRr&bo1INBEKEfdW-?%{^bPI$>jtjJ)_onzYK~ji@!GhLq9if{ zd4%%tiVud;hu6c?f5&~<~wu=IBrYI^MYFM5L zpS6!vV~u)frL7C?Uin%s+eEVATz{&jlt(FgDUpF5p%SdK*U|J9;VT%6&Sg?4{@L6J z6NcXRjf@1t(1zl3-5RHYj!h4!5HSa*_|~U=jA`8SRMLV6*KjSgXW2E2kZ0@@JM{$h zW*|?);SU-Oxp#j9U6XKMPiTim&G9L`P#DOBKmhrXlaupGuh^Df_1urB>*S4CAYUNC zj538~d6if#CWTkqn^5y3&FjMOfeU`nb}*k7VHdzl5tB=HPLeS*Ie8Nf;T-ixImA;`$cNr-bzp|PJk&HbJ5)+w zqRe5n249dwQiE0@_0^UprO9gryX&9w1ULbMeBgjugt8mqD;+_`@c8j#whnAfU6&yP zRk1HO5YO4l_EZXz>9Z@0Z;KR;h+lkN=Kl5>4cAxpnQa^1uet($0h~0StJ4)$9VVhM znC*f1Z{!%6%VF#T7rrBNOYu2{%0nj^il^8TVQe^A#u<(ieWp}RY#o_{rp+G1ho3-8 zgrZrbD-JVo)6{#ZBqb%`yo4EIN&JT_E!@C%!j=q;ijr1WCsKd*EH)`A42VLL*RL7w z+_|y0w+H#55ZW3V9u9E2FKC{}t>7I=!N3?foLe33?M47qfUg&3k^pr>`%s^49}}j~ zEiIYADK|522JvASIc$F7pzMZOIDnVhR0g~rcYhfZFo7R0*O7clfX$7I1`{h+SIq&; zgbaU%yLYjXCEA}qGBPq4M8w2|R8%nXIT-FfxLWL}1qz7mzWjX#407M#AR0Uj5MaR; z6vL~W5A1(&AtIaE`fQDzAvG_KhHW38km*SfBet267q_Fb`KBpzcvdXao(*gDGy8BU zK9vsX!w{mbZW*6tG?uuomadPnv3`&gPoOBBq1ucR8`=~lz*g$E2pPYe_~q~3l4UkaA>*3{*4c74L9k8KUwO0L4a^3!?V%g z6#s5G5J~alE{&Hj`+La9@?R8eZEp|$komLdXQ*fhyV(~0vxE$#R01Oyh;w~6wj=8g zZ{({yyvt~{CB@-)Q9{U@6-JFfpjnUG?BJt)}3u9Y`Qs2d*kLUg$$Bjvl*0}chT1B zMR7zq!S4v?-sfN{H#fCTlqkgVjpzQbC`>pxal6`|n=>@b`Fz7n>9Wd-0t3Mj*XEwm zrmL+Tj)r*)ee=X}w5Y8CG_NYv^_7*kaa#h1AKoOJDJrbABz*%zJ;g3s#GYiRDt)@* z8T%JOjQW%d=Oj)=uE=anB2%>?gy4+%Bm7a2p?LX&M;B^!N9_>y${Mfv5oo@=y=vVjY!JrCq%$Ad@ z>*7F;qM+;c)MweCzY6gu^-LJoy(Q%GBjam{FvUzssXKDR@&vVoTTa1&bgp9D3V2Cz z;RJ#AadD?p({OUZz^hNZdUs!YH*({`)>czf^GhTjg)9m|81}ueIbP22lWyf^X=$lv z4Q=$I-RZyAY3usZs8E5Shuf9V{mZ^Lm8pz|IGEtfr(8=OTnr&DPg-q(EU^ei^VqUb zGR0j^3nRpxWai99m&2r%`0w5(}UG51d6*vAA+EpHa(v zrnG;0uPZbhFgO2qza*`{?MioI*%=H}A`s|}K6s zmkF*j#5XmT9(lc#FJJD7>^7o_i`{y?{m6BjdgR;7mQmNQ`S~E=OnF8Db$gFu!Xp0N zTNkqa#81PBV45rh(4Ohtb}TYcQC40SJ3c!4)5Vj=2#8fNlWD0|Utb>qe;g586S9-P zbLWoMcXPtDk*3S$iJ>7Wn)>oq8Wh~Bvk#}~n#f1`9v&%T?oX8nR+01}%|n;o)4i4( z1~gu9cCo}UKye#E#wlT8aku8?`#t$OG=qYd-@5eC-JP7?<>Yv^c(PERVPG@0Zk4`7 zAcW_4d*pVl4zn=uuyl`_@E7*!5B8^Dv#4GsHE=w*#3tQ#WpVwr0RdYiWMpTLkDg>y zJ@RNqJguZTpIHx>CLG_1jIZvn;@>yM+b^^V6^N#!>=;w~OMr1#&q-SP#*F(4P4Ofr zI@Rw{OTy?5o%@O%L2S9R6I9(k{u`So|wOVQ3QFXKXP{JArni*mJ(@xlY^PDVE- zP_?RAvz~XvIizDbZlM|7>S$xh{=1U-?HlgKNTKA*mlO#cFBjtWZHv^w@T}mS+XJVR zT*^J%mUQUhd6T~K_wVj%(6kr@jE70a-z5e8tN!iS31L;rGJ{ysY$e1Su)0R;3M%Mxl0)zdtJc zAzU0;6C&scRjjsrRpy?G)p&QAssp@@=N5H?g%cukuQ!sOSv%x#W}Zo6qu+e$BjNYo z2&R;fINR~E*X8%N#9xj%Sy-*^xQ?e;jtd_1yLntHqQ6Of_h-mNHsnMR;- zu!CQnG^`B-xW)N^hOo1zCkSSR)HrY0U0t}R{lP>0BEd!=5(pl=)H|kyF}wFZ$US}9 z_Wq6{i}Mu-M`li8v|E}t(^z(PHo`9Fh>9F*>*hOEw$`%Ozv*Eh0s>6>3^5O~yJ@y- z96*-7atO;Lv!DPQd4j8%h5H~OB!l|Ty|GAZpo3l-9_-Ac7Kt)CGD?t70R9Y5nT?ID z@ym;^c8gI0nJ~T&xh)+Wc$XYb1H06jzM)aper1s><(MfpXPyw~t7rIpj*+7p*`}`f zeCUJPV=*0(cdD1wGr{Zl!)bC*7H0nVkr4AfTUk_r-n`1et8Dn!K+p#l`wWNm1FWM9 znFzYa6O;sIvl7k+Q6(DYn?i^ur5r6Q=Au5qcc+ zb6LOFPNh}tkP`yJ32P`$A++mwVulJ3u9(M1k&#fnfxaek?Vb>;>?-b zlC1YA#hQP3&$DzTH&ZFK&8MDM$bM=vueOusZc~|6CuVQ0Rnf;VjxbasF$wMCt;rCB zi-p@Tp=zwgncb%0^2irY%VxTU6p|=8IXO@E)2=sN<(BELb}{Qt7LbuXV?V5^T(+me z;JT(3^QHz>JMvj3aOyyq`|R@1F@ zs2@3?!+6qVgWPE9NB*#ecW=c(pnCuTDqz6RFLovIPcN%~)PJ6IauXgo zv2-8Rb8Rx@PKWW|D}PcXH8pR$Y>qXhO#++0*C&Y&ovZ}bpVY^~TYGtN4X_$w#I6Ky zQ49J416cR(7dvs$u+x(K^NW@HlS9#Adw&}K{d1T(t#sR4c%)eTF+RQ(Kk@M3pc{^U zNtQVGY-$S|8xSAimOhWKW)>Bt{i;zY0fTgW=zy;PaN`zqBuN6!%gaOnYx(;bvBTBr zr@zzM*tprDHMMxts8o<6vt}jyesc8n=N+>sJ0GhLF`{Q!K(dTA_=sUK^Q`q(E1fFc+xy*t^k|3`SN?-`VrK0WWZph~Sm*@JFex&Gpxq5}l;IV^Wm z7<@v%kzi+{v$$enxwx`)m@1Su`5`|3U0#~^gz?K)uNd6-djzl<0^yX75FE{sGoD~-wOo7IbsAnK% zn{Wrpe*iM}to6MPUwB`_&4Tg-MqsIIvERGb30Y51!Gj9%i%Sspz%qM%bqs&2)mVw& zCRo!I+zos#oy(jzH1JRJYJV6Pf8Z)}uhkf&vAn3L^EkYR@&qoalh?Po^qCRRAmB3u zzJu?IL+&{P9~i;R7%O+ObJaOJF`=;JP_44UOCfoSecWT~%Db|`UgkW}^1ea6QZ${I zGV*^g|1BDd45eWmfrZncc+tUWLh4(=&2Ew#=ESZ@;l%b8N~>!;34Nr0N>k zids_0daZG8^fKYIpuPW2G8qwTlxEjR`)picR0Hb^rb5xm+sp zTyr4h0OJHJRLJv(Q0(>@hdkbxk6wMT{>7XA1%0cz{^VVJ* zN0`g`=1ueI{t6I05*)8gVn2LnlRXCB6V`RmcmBKv)$@#$+2{%UIJ$@l{F}t=u0NUm z;xoJgsGufqsBcn0HSi8tR}pTY8BXhpkv?QS044U&$jHBkr{>IbclySxiYhq@o+HF~ z1)njJuO$jaZqNGULhC7t>dla|g^pl%eN3tTEA--xFtJYCq<8z`Z||Mj9Z}ESCQN9w z1w9VfAPi!=ZvW5A-@`LAw=z@(3-DHYQWLlKeK_jJKGctyE+)w*m&)BJ`X|J1V?(BO5l?^I~#}ieK>*v45 zh9m&{1t^@HntJJ(M%DFp)#9z<^M5&)xlfbr4p!AX_u6h(ZT*;h_x`;<7<226CM-i^ zVr1bwK_KBa*I6$C@2mYZ5IzD#0j-Z&^W3)6=!n61-Tao8aq(*qU4Rxd4d(_zTU-0Y z`D!8J!gb0X^XhE0VWB&TZ>-9mX{6WyKca16@Ty~GFjoBrAP)QZi*SXAlFH@3taIZb zBGP>rF?FMZsq3ydHZ@QYT0cD=7B~2^Ka_g<6z{%X%~JpIvs|;aft=8=FqApU2S9Wu zmOpRu3xwAvxrO;gO!Xq*2=BWsf-&C~tNf22a?kp%tCT=`cs`s1DW0J0)vEV=jf!bKo+3 z2*&mwR^zCRhwsMWs)0oUfadPdGnLc2SpeaXvtHd!=0kX3qA#etL@o~o`4ad5J)b?F zIWDmry$=*Mgx$@-n;I*7ebY9*=f~w!foTZU2?axDS{g$Y>`vs}P0NP?qa{H22JmTS zW~Sf)j;Ny50A|)R?KOY0{pr8I?$94~%C-w1PZOI>&LJ^yvFA`hC&H)7MJpvbldA7)lY1`42~wm%Qa zZqbQu4yW!OT^z4yyOpzhmG-pL^=iJg$vruYr=uDe2de-#!?HgnohL!B=sCy0zyNG+ zy179WvA=_{SL>P$&2w|~1A~KVFJE?rB%S?g3cv)25>D9|=m?;abJQrSKc0DuEcL+e z8w-WMEUi0wt;^QGYPN#PBM@Z^Ogj++@1XHb3k8APq<}6z)@On0V)x%~uEp)zonVEW zW)+{aLHXhycyE3G^WJR1ajvSX8wu4I6a$M;KJKq+UH$Tb`hW>QK!`_ykVTH8&G7)S ztG$^0t5;A)v|f8dugF0~TksU9s01#9Kf-rl?NL%uNpg_hi3iaQ2?CQlpsQ{0M+B|TeEnZyYK)1`xO^i==&Yv@rC@)HQEFc>MW@1 z>7FYoC}cuu-`CldVA#e>5svd3-rD~H4UR5#ayglqsIb4TJ{_t5pB6wlzb%mrEP@CC zp8uVWOD2U@uAIiHh=#$#$A!B|tJcN3@#tpNfNQFtJu1-TaEw&UZsjdB`k{e3;zs@D zmMs(HR>5e8s=o<32qjw;H`t|bIdlKtcgx+{tJbr={zjh=iXHloztLDC1wgN}ZTScT zF_y2~5zr;==whX?dKdadNRx<$46zXH_;iAYtg}R%=lM$X38jzFl0B}Km{<=ejrleCK)t|$WuKxt(R+t-hTZ}X92o>+9GWDzZ%Z;e zkXCNN+NlaPQJ8y0jsb-l^0)`O?BpB-=%AjUg$VwRzCP8^99#o9oRC1~4p8F<9$?{x z$+}?jW5|S?2|&7q6i;Y7hq`33b=EgFN^PcvfG>#u@Zmq%lex}VrVCey@(6wf z?syb8m1&6Jf$fM5m}h1tBejr|dAkDyRWCwQFAih}Ab|EeKaY*v+!758;6Dp~1+M#d z$;lD7_1&776#J}9_C{Q4jBO`>;2~ELG*y5Q(p4`#)i+?{OjsQE`O{c_{n@Whx4^)< z!-zNO#F#74+!E*Y{oTp_kBNz$dCeOz->ypA%TXSfD)Qi@1Fk;4dyF(5g^X0CTHT}T zP`9i?c4?_pDimcTq@;U6rjU-mCUpY`@q~?pk&llUnx=pGvjV)l{(wGY{P;m8lf@HA z6wHNW@OyhP=fdAXEIF9#u}Yusqn#-oz|Us8iS5yFe(R@3{9fPNX4lnaKaCb;R z{{y8iYy*&Cc)lOK4F*ZAQl((h-zKW}0=+9}B7}A55o{lRQS5{exd%q15Z-q{C+b(C z{JXro0LlRR!1Rj$kFYm^#P@LWnXHNhLxe$(+oy427gZL`ZT= zl7wW+lp>_bJZH*0&)>f8=Y8Mr|Nqvz*7vNdXSLkoy3X@=9>YHNv3KFa<~{ne7;=RD z^qylje|1(@w~1R@J&`&wF%cIo5MwAbv53SgV%bjoM~<)&u?)jRz_z4L4Z3N?6U%^w z(#p!7_&1>KE_UiC1r{G0AFpNeI0^#}GJwBmzWZbu(4ZXG)}}uE-G;i5&nFB?D3pAX z%O`A!{=uxl<}43d0u68PQmwkjz~9%RPf~mPtyJ?_R^O&41Z1Un(GdIXt%WR=eq@B? zAAWgeWs!O1Ycv?ZoY2ux!%;Ky8ru`|IIH|yM@QsNQN5?Rx%99BA_TxM-4gK>DHj0F zaM3QBPyiNtcs+-hH_Kl;eUtU{<^;QG8AH-oLrW2Tcb zvHyWQ=VE;!$!WpvdxCmDsI?ddU@)(aWKn@1M1)je%fP|IL!TDXujSw%nYS+SWdLJL zED{Jjvh!2F5i;}azso79@974An2mb#2HoU|c@-j3b2m*Hc;rJ~zLWs{$aUmvQ?}xv zR?iOo#{EYAuMY7ogbh#&kVB;ALtKmn2LRYJqI`Pa42vk+K|LW>G z^~Co9HE1gcT^Ys2zpdQcD=P_rMD9F)E&_E2CLInlP%VWp7Y+E*Y7XVWoFAOTIJ_PH zjN~GXwSddYjD^wJvoJd71NsWG!%9D+e|S-^A6Ezy-pWd$%0KfsT0c@(cYJwM>^8=N z6hTs)?uraN)zA9W;A0|~9x>CnD;qLF+6apwzo<54hdbOZEqv=%r%R`3_^}ETp zwzoGNxPI+g|1aF6e$)nacwAjE4?{3VWj8Z;xgfUo;zh@L3PNC|>!;rMBd$B@oi~Oq zb2e$Ekw@=VSOXl2*(yo#+_>aI;2e@SBm0gRu*};>q3aY8y=<0SFVs(Y%S)cwc5V6{=!ChW&0PqUc|}+ ztUrCF#RtvnP0h{qz*WQ1aB`55k=fq3QH!c=GTz<+dFZv@rq|z|GA`6Zcsm{oty=jo zN++gKOtj!xfq^M9_1Uv$e;3&3A45j?*_ls5Y)3&m+VBWHaN`dR1fsG|J&RV3%tP-_ z+PnJo78asnQ&OV&wpZ#QEWF|M$a=PBr#?T1eK^z?-`T4|D6yhEGjj(3WJcVD*o1^| zgyHnk($0~k*vh+@6X&$KHZuW7f(i-toG=gf`CX=&LEXvf*U-?w`?VZC^RG`G)uCp@ z;PAAWS#;*fcs0RTg41pid<-JVPF_I)XeH9>e!A+*fa5p#t4Bx0z&|=Bv`$Q|EKIOO z+op5(hZB&`BMO?(gNKd$|4=%tcRZQXgZ$guw+|Q|7^-P{m(sHzxM<*CTj8AgzZJj1 z+J1{U<`!T9;7z`G`LgE8t)8)8<&3CU%}Uk$!7!se1Qr9(i->*Uxw>mDQoRmA?heOgubMs9x5-Uwy@K zF;zd!Amlg&N~Djp2l{MO)_1>u|9)n5Bz5r1fr=WT7{!ly+rtO^BZ4Uz2T%~8o#`A2kecF_vk~30|UcXaBitrTJ8#d_DmSLZLr6Cdf3KC_jb`F6s?^h zGX$YWB3H9wwaIZMd2M}ZvKow0#U;ci7}bVEM>Bj__;%8VccS5U>8%5RvEjl_tcH?R z{Qc@ii1p6@Rmfz#zKU^Kito~Spmrpn%JBIvv_4o*Z=_2z_>{G@C*&!y|6lR;bsAi+}MKwxSEUFLHA) zwR}~!6KedbIph9!?CWAnnmX@JdE)#;imp1VOwM;r2K8ND!C>1x&(df-Zjj&K@Z>{L z_IduP1l@~rO8s7RWx(tm`?^)qI%Ea3K3CtI?#SA zD)=CNR$lMN>%ZX)g4joR)_%`6M37)ay+cZ@gLe!apNVoF9BbIIvz!(wduIq`}4HBuK6IO zi5)ml4>>JWs(yurCknT~INS}L7A>?esJDq>lSmu;oo_|?HB}`>UuBaO0~6xE$+xOs z*(7$Y9%GsDEuEcr@Q*El1M=!fcdwOBy{AR*jF}Op@7#C@Ut85j?`^K?T)J4~0B&|2 z9wcWZ#F+Fy*jpq1vhvkGTz>5sZ$%J4Fdm~evr=SM#jO>XfcFt@-@ZNbd0$>%HKWSH z`B$?<&?STk*?`!%dtkhyv_whpN8L3uaOZ$p-Y>0W8|5=6FmaBOf~Z1ZU?3`+!)P#g z53hH0cD8nPaU(VN(_!$B*%$_-*gRdvvsNtSt*oWd3CyKe)=(*4EeIfyRF#E76qMI|8Xy(EEcPAUNmivG8g{EZI+9~kP) zO|v84iS6G%EXsREjP5DdX6=lz=@JID}XQRjhl*9?IzE{8HqgCuzv|5`{xY9mZieu2!#Q(bjaO!6I@}CeFEr?=CBEG6 z=(w=um8|G_AH8Po7=|8^=AeW2XB^7BB%kf|UeOSy zHx|_tZvZ)!PkJO-zV|J9`<99DEH5v{+<)j(EcGu-Nvg$7o(Aq8*H^Bev*M)tq?}ER zeh>oD<@FjB@Y@9N3Q5k{-}DzT z11FHL_>B6+D-%naZ*F=EWoOTC zZ}#*%&1|-#VhG~5xZ-5wA8LPNLkYLs`;65%O`+`0gs&pAS5tL0pVp564?GDm;1hTP z1ZsxO3CGZSE4_oJCUnu!-Zf8LaCVk<+_~1F%bKR zB#hsE0G)aaM2H%I(gQJ$)a3{3-T+u;>-jQJ$3lFAuDUP3o;S(hR?`!QM=Yk8DWI7o z5Zp_Z{u)}=)z_m5NJ!1>=yhGqncXTaP*t!!VtTn z5<@}{g-YK8yXh!mZY+A0)%(5!%#5Z2Pi~i6n{F}kGb9##9QdZlYg#Fb>9lV-k3c)^ zn(MD-)~W=x*1rjET>SyZ`aJhS#RLm!Qn1KKYbzg&R=}bIF!SIuzoYq{2DUR}b2zpD{Zh41PEVDuJ8W!>sK7@7jSli~b4b;q(|%dyr4%-PMeBuloCjq(b3`S@ zmTG1Qecr#%vem=G$vJl-RxRxm<;@k{+oM$MUXKO26( zy|y!&SLyS}yuP-!D%La1yeAJMIAy$k-IBF=SM=WoZ8w^=jW-6mZb>mq)uz(#9Q&9O z$^*x}M;Cago_vL5MfYG)R7AvVhe$$&QlF>WcJodmP$|0q|hb*5B+++ z)8*!nIs^_}rT;9`;Ny-z7mAwRq&*BiczJ@44LG(X6<&2gY&$vxy3P&!7i*2!;xUt6P4S}(tWv<@8&b&0VqV1uvi+YkD& z6;<~iyK!SO`R5c};pVX$A&Ko&Tc7236VZDNPka2geU(`(+Merr3_m>gK~vki$CD#vh17o>83`gwUcF5FseF2m z{eMoz^Xkp5u~!y*9_r+~4C|C{9S&vD`;>mE`tuPk%B({h$-5p@S{*UxYjfS++Uko= zV4)(1z8Xo~zHj%aU;Pr1DR{@EbMUZXyKv9ng2d=%eVYkFC6NM!C#;{?Ie{A_@^YJq zSDZ8R+yUC*=;UN=v)|I8E}!`(Z1C*`-SyI~?$F1NIU%ryA$y-WR1`2s{J385{5qdr z@pQaxRZYWX64wQiWA^qhwf-q5T47J|5||FS(3juptlqcy>;DGu_Y=-ZkArGPJOhAw zh7*(FLw-Vn1q;*~B(k2gT6vO+@eVAbtLnT!F4 zL&-2(YMVCkgP?J%!uW;A`~ghT7vsMn)Z4!9$}1-)=Yjgb8D%Egul_8R&Ak}c>ZJ}* zQF_&NwNd|?nqNHzAWx-IMPB}Mvn0I@YCdpN(0h>-50wL21gS54PsVYgOEDfeBFc@{ zY_(lq;tSe(E}O5(s@Jbi1Uaop(*@%r`@N1Bl$DW@d771F^Ysc<=6@ZeL$Nm%|My9d z&0*WIM@?4_3aF^?p>z5TEcWHnQNuqun^Nq;;d$nHyjqt<7EpRVDJSdCLZ?JNU&PmW zR5+5X_b4DtfA4=($|qtDOfSX0R55G?iVK8BmRoYf^VBIiOz!#P8vdN3psD3^C_PNk zte6<+>o}w;oSwLcjT9?-gX|Fz<<>5)>QuzdO9Ci!df`LnC-8d}V1ntOD+o@N zF@6g|VE*^t=5h#tpat3vk0h7(OZ}uIflD2m_r;9$Oq!Wkesdc`&H$4%pPqI6=#|5F z8o9i^?3_EkGg8p?G@3I$l=|!~q*ICZZ7T?q8t-Sep!=e9sdn^Vzi8k2Zhy!(4G}*2 zcYP{hmpr4l54-Mqbi6*qB)t-V+UZM|=yQJ1RPG{80k7RM`$P2`iC3m2AG1!O4MunG zmsy!+(Dhp44u&jl?(SZ)%N)0fLxeX41*={n^NCYa4vb;`US4a--#OEks=HKggp^n- zcQRJhsmgZ!a-q}vXptzv&}{txyX@h?6?y64Dao`<(b4wiG-#flueaepSG`$&lY)CxJl$@{O%-%}qf{@PhpUK&BY zg1PO7bAX~k_2rnTj6Yqv=|@HN_3>Jny)HE?o~jx!9YNy{LLIEQ_}!3KM~|wCcr}k} zX$?+qO--wbUAv-2NG@?#`LaWB=;X+`6gyxPIN)1*GLajOT=cm8JO=v!mO!Ae(LvGo zz8OlQt@v<+=GdnaggVWY;gON~f+A{x(TRy_6uzx3ErbHO4}w3*biKUZYxxt~8Sp%v zxY@rCo>>?0FyIn!YrM5C@EcosGqYa2`fYBTszrp)pJu7GeVmw#QV8^L#?%tL3GE;VmuB(l&Qe?BUTQ zn8t=DFsDm(?Bcj-{gz$RU8aV`Qw`T~sPP2Xc8SR&X$xNi%Pa7|oqjkX%K!+LBQ?6)Pi<}X;gv_zvUQF*a-oWeCzg&-v(6GFsT zc5ZepuAIRtgO@2LbBWaA51A@Dlfw8^9t1^kZKPh7b-$~g`+O(sxqU96`t)NVo5S*& zV%iby6&%Xw-Ital&WP0>Jl_#=gEZy6s|2xHHS9q(lJ@$w6#u&KC2!^|O)nBcso^85 zC*n@os(T-l+z#k#|9Z%_@I9|bOq@)DHzjs;(M4mUTi~J2>NY5r2NUn|@y7^*qzCQ? z-;~vz6irevJc&QNO%i&!#K{6#=)vp6#<;b$Y9!~@p!>c0dP@Hz&SG$wF7}ue)Uo;5M3KZ>pB^+u~sL@**bDGBY9`(#fqR%S2Yo){=zP8 znOgO}EN9+u4;4w!A?ko}M(c9vb8G5Us#;o<;Bl;2OG`_OiHoO`{liLQ-E-#b*&RT} z0qegsE0g~|5R!cQYhZWowu(eD4@RnHU&?63`!^1Zs3q>+mNN~;@*^oh-0Dugl5^9F z?%j`|9&fE)rePCQ)UQ$H%pBy(}G`0NuB=>jKOk28Wv zR=0V%rELj>oL$-`c2`$8hyWr> zgqo+0;YTStjLceldl?~ielU@r?T(Ph71+N+W`!Eq56HksZy3)?d=V58x&7QYt&szp zS|DE##Vm7;duFW*+FQ^*f&YW!_-S~~^JXgMOaef{A@73u8~!<@`5vG>k`$HNb?@H2 zfRK<7rjx8*HFswo^ZcNvw6GYke__yaOaAlm1wC4`U%a7lukX?B@sL`<5Qc&g>78k*nEi+@xJkyZ1H)$_T8VB3g2$38T~Fp+v~@@P0C4;84JeD}8X zbdy!riS32*ERWvh_A5s(=6VY^Vffc->o@3ZnP*YM<@lObl)>F%=ndIW4F54KEwK#6 z)YNhQ=7@lEBGXXi$4~jQoF{TTP9Q4A>H=?M%;hlL*~E_ zUH3R$xU~>=ylD_A70dspXW6&Bc|NplEP1`+K$?9*-w4=3^NNp~L^{jPBu3yP~Kv<6Rdi z_65n$f4FsrU*wOz4&}<=M`c1^WNTnWf0?4tfnJ5t6@f>g1+so`+9mupX0@_k!x?=5 z5Qw@M>xIYpN~#ZZF3o(PDoddekGLf@PfCDpS(V+BO9J=r%R0{VCyg`w)6KSY!P9=X zBGtH9W~hhOIo27*IR7BBaspw6XIfOg*Q%s2%QIJ!@J@f)R{7vG)}YplR>$EgT2B#z+1&=cJ+XL%M0yF5e98x zmNWSquu7_B-EQoc{d_xbU#Ch;#?ow>Cl5o^!A7QG`O=Ru`;lFUXz69bY*pFEzQ0~E+N)R_kxh#J1UwdWx3b4_ivx| zu~jZTAtCQawdc^pV3t|lU_GBd5kuvLw0|Yg`D*ur5@Nh)6?Um^1?%vTn4O>bc)jPw%FE~& z<+qiW4g6@D{+V4ox@)7m!apFuJZy1hjQi^oJxa$OZu$GkdRa!FK19kS>0-VN_xZP- zH?)N->}UkLC9NtRYN^`}#t;7rAMIuxEJ=6MAlY_ZyS`x_DoS8zqu5&NFt2-F<@^21 zg=AU#On*(c(o2dSGshzN=U07-y%xu_dzXn3I`!Lumd(`+AKRtA-q}lm`X_1s)(r5I z;z_KWwlPcpc7u%YbCGT1NlTd1^*@H0tz&LDQ!VyKux((F_p8bdW8v>#F|tlUa45o-30Gtc35y0Z#70#m*y4EMuTu;)-S5g=QG8T;UWX5cSwG)T zv!WHj=bZPLg789)p<=A#qhs-rv_ae0NE2>5HOg(9CHk$@0p;HzTfhEVYJ2(>hRr9WW9fOu8=HizFh&NwI3rQ|MNXR?JC4frVPol$?n*$1ch z+aRShZ^gPd<)>kWUk?-==(i>-`l}~nBy8q(hqs;1xj9SepHQu`?SF?!<5;`<134mc6-lb8O_@?^+d| zjlEN6Z;=q}^g?^xe8YR4${2aFJ{&$XaOH2I%L<>N`QX_@I|wbVoEu?P6#<=(K1t^t zUp*D7+&7axJJYY8oqi1l$mrp+{CY(fxwj@(c7FGNRrAe7eB=G0po;Okl`o&~aJMY~ zV8=Qeb0}}-pY!*5ORp{UsnGNUoGwfdoxmH42$;)-P4f@CDDJ;e!0ogN5AFm=*e!s- z4>@K6!{E9@S8>`2XPAv&wy~j%IIiY(Dx($dnY2}xoua)pC4?j--5nhnqck%{}(v^IYjSE3;hY zipi1y1!EPXp^ZI%PF!T2`Qk#lt>w-&JY|s|L&NP?@6B8>rRYv_`465Z*atlTlA9|MMMp`X%DOAj+fcMHwUHpE@Xu4T9hHN032epL~to(NSwj zS+Q(hJ9~AcdwrA3zbUwP?U$+HHg}Di?XBY*cg!EnQf>?1aT%8SoG=*ByLz;2<=l4U zywP-1@>9Z0s}`TO z=T_;E;fHIFGV9%vX^QqM6Cc^+DvBaaeOjTKQ_TG79XEvPe$5zW1WfO{_V=Cmw|P#z zP~7Z3^X24o3)B~;D6Wt`-Eco+!p(PG?-h)%OG>Db#NryBy^z)Kld79Xwz(g?Tb9)f z1b_0l2*JDIV{u=GVS6EZxcDkA6%wpry>&B`?1N#825fCix}g0odf-#m_m2%yS~8nF zoDIIe@}^mvn&1#cl6qmY*uur)l4GE5Zt$aIof^7+4U$YfTJK!(l<%%9@9y6xr|Fwf zSUuWYEZQqeynUoLo*M}GAN)2s$J{P>HG;4U99U*sh>bL51g@&WS!S7MVt<<7hH^U$ zIfN~m9g6h7Yo>uBu<4&%m%4SHnv*`ve`fh;ze4D~y9qr0Yc_i}ru}F1`p5|JhQSq! z(`&Q+y7Spsk=k5Ghk!zi$X(If^qW7@*vSV$=(HFFSN@>Z54?V*6FZ!N~x!(AVV2T8W><%;SCcB)DTnI_j*ua z;OWTrUT$3pOgM7XPW*SN_=h8IvEQCJ6qkt)hG{$#ahuUvEh3ij@&lu_QbDrUWs+$s zt}+hhd4D}%FYx(8Oe#}ePyxN-;kNvf3kN3$MdKPSdwXAu{0_(kVl2c!zW=Sz1Ko_) zdo_yg-lpE*iwjeG!;j+Xyj$H91;?b{osRwHTk{#-QA+-;mHu1H=|ZXg(~->E?fwTl zcAd;q>7LmB8*ja_yseJZ|HEZv(Z4pLcY~gNVXcjQ@WB^rMXv=aC{{C3^?{O_<=0$* zA^-_VyV0s>(QET}$f1%KP&k1)DqbRH1uv)-x5T!o{7qMwc}@oy8}+NTMKX|oIAR>_ zA1s$n5hnRZP;M`8QQh5&sZ|d1-;#Q3-{!imlA|vNUQvhXKY@Tb`LUwTS`clrd*aDv zLidNq>^Ivuzc+e2kGtA0M?O?ZBs?x{WVMmIsL2y-z5XD#Z-}ojXOyr}?XIAEgTtuhJ1RGhR>H7)cpvzJx z;#4gEf$BS6D9dnn5$yiD8eWPa`SiNb|Pa`P^`k-6eVk-|=tV7y2;cD?j4A@q&PZr=Q7{c-Rd~Jecp*v z6|G+R@|SI zXt>ISzFaTzozTFX-|mjDPwzalXyJGKk$(9{My}_%QPn|8YyM+3Nmq9}CRx|4aE_}{ z-f&rq3N3B45;{*tun&`Xk+8S?Iydsm)j~FlC%Z@J-H$IA*WOl2Sv+QSs>ZF)u;W#tspy@qhX(2{uKk)!HEu+cu%4cj1y?DK8k9b*4n=!JFX#NY&m9z{ zY4uEKhNuErk=U+zYdRdq123Ym0oDJ2I>w;dvyx5refPc(kfz9fCpL-m+FKyMgnwGf%of z*8)a2A>Do)>+5sFCxzp}m3Ub~F z8q-3pT`!Ahe2DL!Pj0n^*}(1I>2nW8VGcLDws;*GV@z6P1#{0cqV=c$P-kObR}Mq zgsELF?bZY*esrho4FQ9!wnfDwcfHD@F`o$3pg}!{LcLb*C6zVmEv6{V*e{E9KCd<2 z7>LOfiu|=v6@U0~YU-6tG=V_{2nNjil;gt9f@Gsn6Pikf!3V%cS;eWT)m8?bK0*~R zDmQxmM-;@X2!S$OMa;Xscp+s0!$P+*(W`2Bi^QOqS200-rKpp5Kod@7MRy1q(~0OL z3;V@Ic>W8AN7O~sbm0NQ)dpE*bnn%L^-U~`d^CF1khN<;hO@~)RX^v6s`&L(nO};Eza(`TZVc>|M7{Vt-*;l_n0YuGZC4m0U&`8Md_pbDT7delb(}XP zNf51rpv`>3ST~5@I7Txg5MnJlar?kU0cogNc>GP<*olEuQ>rTieZ}tnaxMa|%?Vh< zw=L?#A(*~4#K3(uAgtN~18oiBMZ|?5o}3fH6y?2oS%%C%tmyvrCCmqlysa%xd?P~R z*$+FS4`W=z!a}AsAT5ASfIB!TcSeSVC=Wb)t+NbGGv2fvvZnhG_>H)=8gZW^@LVl4 zwxY~|qZ1Py#YnMD2n!Le6Ha(>G+I_wPf3j$U_p(gbd6;`Z(7HdgZ&$;^P-$1`*WU( zj>s;j)DNmkaU>_wx)>9mLEkmj%Klq@SP7D!mAj61uGN;6;571;r$JVLinM%fd>_1J ziaMikr}S+`;=^ipu5kbXLDiu|8x5^7#BSP~0W9Rs?kL|Cy_a5Q@xfuc4i@8ydVj;H z0~MQri+-P2%%>D^fv7ehbIlCZthO;{VUjRG4SpsVbSuZk#q!ssbvvB&by!(W`%XUHhd7D>b!m%`^1Y z@Ne}{RA#amag&ENpV+&I1ZotBFh;?xS8`RT=#9zE-5(h$N-^qQdjH;0ZG9=0MXJoI z$dI^(E6uAwHZ0+_R&{yi)1n-}T3Z1Oj*%SaxvwXW4soZV%ELp>MufWqQ@D zA$5YCBw`2q8VC9%;wh6R`T^m$JgCxV+NXnI9M zaw4?I(y8+e03llDhZ~89+8h_uU`cp(RigVJoGl6NmfI=f)3^b4wn?9**S=h`}c8LW(sKf0*LuwRugT`kq2`f}y^4Su-`MENdY;p!*F& z0SURkCYTw*EQ&f??Fxm@@$OuXo>17UmDN^tnVn#!x4Lddp%&a+J511_K*>EcvPNGRB9R+*&({KYxq&N6t;rJ^3GL9TG-H*8kM(56B zFf`2n=3&Aowfc^ZcBRJd+oZeqAMQ;=MZB(c+jTAOHBNSr;oKw8d|67OY4&56clFPc zj~dEEwV24eD*Vk|D)q1XZ2xUPgeevXk=Te&A1V1ys3(;*-R|z{Qe5o4DEL5VLE41; z*VdL_OkX|Q?&^N2S`R#t0+E6!DfS(<+re;26WTZDJ6u)aRs>5M$#{j>bw^eReX$VM zYmY@z?inI({3!fZxeIn9avAYVO&8}G=io!ByUy)rqs8D%Lx_czI_bpoGkalp8#q#U zVZS18jAhL&%ftL>G56ZW+%N?~j-^a5oOD-!=}xvzQo`OKeoSyJ93As)xNQsCiE1^t zLY5vW(_AGNfWB*xj+r4KXJVNs2sRa2a`d@30z)s3|)=rMPFYS%E%hv}YpAIHwzm@Yqu9i35ii+j6nj%+%wjP#2n$vk59rh}!^&#Y9_W?2#h;%{ z#Q#~SuN1TgYLk}ou5WII=3TK$wMwuuM!Z04FuiOTLvJa7Wolyh&pe}kN8aRYcJFjn zzO?h7do4vBu$DzB5a=9qAy*R?+iPp`3tpSt%lAxnU`CBoe+NSorRT;uh)9r8R27U4 zvdEQ$uN-St!@y8b}XN_upKA z`w2D&6Q5btUY2@!h2*bz>GGQA%1qjK%`t3v;6X9;o(5|PQyfg{`XKy3)?DGU$^wU8 z!pvA!>bI3yp3m%SL#RvehDmJD^I}O8kC;&uV*fG0SmL-+7|yoFgD7e6b=RJPcD$dt zRmC&e-wmp)yLk07*2w1+4^W4Q2A=iHPYF0hC&NMat$B#X=!n+YqWp>c-s!Mk6PHG7 z9}K25!)6B8A0>auv+&SoM&cl?&__KVmSq4&g}ASr8uPWZCh?eBuibrsp%oRqZH8R3 zZu(et5a6Jb^!a`?%?Fh~%=0ML4jJ+(4?ACo=iMoRS@HLaj=R`~BZk#kHIS#S<=*Z_ z(unXHA({Sp?WOU)zwV{N1JrUO61EFIdpS+l%qNV_mqH5>L6?nW^eiKC`eZ08!X;B>s4lUVaRMjLo;BLZ(({V8IX_67=f4pO zD=Nl|Ul{$9BG$6?!T?1Xtro3jRvS8WP4S1EFGeYQ=pXo^4X&4zs<+1%CF8lq@4xAs zB(_1N-L#wM!+$)(pez1M6gSs(8P0~qGM%&8HSIWAbJg>T=-w^!e^<&jPr3`S(zKR@ z%I-ud1#>Y>mc7|*vDb%6|HY_x6=tSDt`XYqKRuUgTyH1ZI{nS6HR*xzF|i$N1?{#n z&%$*}UL4J}_Qt|Fl$YbbXt@4hMpcY@234`ai?{!vEi(Jy5eQZ_foN1H%#yg)yYeH? zFBDf7Gi^rYmCJpe7~o-32s3&_>8@gDtMT=x29GX|#u?`QLL|R;N+is95RSCyRZw9P z8~48gs;Gu8aEE4?~`nGYy@xmR|LIH#wgk!l+Y>72aXIhk@k^nTZ_-@T&ul-ya+ z3>fE3I+K3(-hq{=$16>-2#yhc)mt%>?xlhQNfeZJ)mc(@P*M zxF@b%3hAAbI=&whUL&vGe$`5^j&K{B)R?KIC#*(&O5v(u&JXw@t1^+l?VOCwJBkqU zKDyh%eDvq;`6038lpl7Xh$Fqz=5nadkQ`!ol}MdNA45E7=~TI)x$ojGcpAnE_Ash! z1lSeQUO@lhw)(c>qWP7+*~C#R-# zXy>@=EpFVP$6oG5TUCokQmycJV2n})PJm(gKWp+|#?PrTJ@X6r`>5MSC3S)2`478H zF#}HtvGv3?nPhscMJB^D$(M0Lk0fc}Jm#Blua&(uk-#_;uebcF65M|;Na+OFq~F9+ z#qWIsHMoL4{}pz_UL%(SPL}01Th)*rut)L#8>WR!NeGv)DA(>&urlFOVk>EQ=S(Yy z3YxWKZ?EyquX6v_=CE!{%9Ox{O92}Mo}s+ zBaz^Ukl3Vq_26ua_I-Xg~5B?>?y!dEh$nU+8bHk%XO9n2UVv zdFOxx@7rE#WLYI@3El^bdXUjk7EUpWXAfRE$A1qn7Ha|uZ~ zU&2}BuFDMmJuG^$o*=PM?7X|rv%LOEJvrP_**E`Z&{WVaA-DMAMYxI4)jfak{bL*u zy?{^(PFCibu@ix&P-k~2LjKKk;%;`HDg(YTGp06w88cSwBohdLJfP$Bb!ZxRKQ=Mu zepk4n{s&G#NXQ+1A!Uq57grF;9^5PBN}yvcy#*I?zYTN=O1SJKcRq;z3t7yIO?uN$ z1+fP1@_&kL?m#Eum~tu#V6HKP`&vHGtqa|_H4#HOIlc3@U7_Azn(wwUN}D9v=la|L z+M@BqOUb#EuFUK}1l=98OQJE$=mFI=RK&#u*&Ys-S2W(lVTXC~wbQAxY%FUJbOA?! zYp2M|Cq@cxh>5v*7=lDw4|9%Y;ROtGP~q-&n#m8>;|$Y}H_kcS_YEUDtHoBUAl^Hj zSAyVuq8O|s8s2cZw&rDkiR8HMdp{|iMyrV(=*|yW_F3 zB26I9xq_Lgn-xM* zzY_;0VsC9%583C(mpsrc85)w@lhu|T{zAk!_NX}LTa4Qed-9-kzRz{9HVBPax9HKv zR!oz%7r2ZY@DTRTud=q1Id%+( zy_NDWsWG$UaK6-Cm*M>NCweyN%L;mpRwK_Gitd27fEP+exyvyy)Wsz|`H?qQL7$>z z`FS;Db~7iYkOkmReWakGc3zRVR7{l1!I*;m_Ew51Q*vgtfyKR+qYR48Cz(w{)hve6 z^H4+_SAoRl4{h=^Z19ny(CKc=_-ZR-iHi*<(P-~?2`HJzl1&hjj0m8Nw_@ zy9?ZQoH;(ag3E-VG`f*A!QIzorWU=>T93RAi&Nd95pt&A(=4)#Z>jso#3G_!q#RpB zL2!t&wX}`_x^E&y3Hyy|qF?U<#oXNVg`Is$ebd!~p*|sz!M8yvni;#979`kccO7J* z1z(AG?DL?f-@t0=h1^Gf#y2}(Ur!T@yl<#4InJ|qtDQ6Qhuy;(rT1U;^pHUS;E(sT z*~%d04D}=h03rp&olKThO9i_|iLWLPbJF{OaYqPhUt`!5G9-9#eYK>>*?Gv*+U6Mf)3Hi>L z>yOyZgnJ^(@A;Mc!Q?jd(f$LlWfP+L)AUJzjR1VJm62ykz46~oeM6#pGPRa3-(E>~ zpP|^KxlZRxC#%Vo3fe#1yTKLy!=mGrV&6>ZS5r^>p8XX(J6y-}2k*!&MNb%Jw~Yy( zj>+BKwzzoZU(n^mRN3CPNq6Vz9wpSw=-{!Y-sE!w-s1h3*b@Spnsl-F7F+Qp`8L)} z02XBphJ}>3p_LYH%`*_AyEJrpf!3exj`c8`4Yg(KHNdi+oro>dySV{{VE~%K_A>^G z4=2*ivyC|Aig6n5ueUoC9e6VHi_vw*QYlHIl&pjQ9pd~y*I420IsQA;mwrYRBesvs zpGod}P5q?ma=@>N(E33rRwPxM>D3AE(2$UfUu<|5xL;a7+O_+_f1_^iAH5P2Uf3^* zIE3D&)zmlLbnq0z)GIaK^!-mL=-gm2LrKBd!!T!CKUEY9c`n;;Tys>p4 zSf`H_4hFc*2V_{uWMQI(ikOkW-RtcLCue{zgaBO9SYVyyW2icHGVgyse$(hB&&=0H zO`O^C+zj%qJ8Ob4D#)v_tITTy+^8ZFGjO|O?V$y+2d3HzFQKhduWAgm?1Mk-|{q* z1~cL^%%sQMyq<;!4$4A70QU#bcWtV7_^d#h<1CU1fc|3#6S-xLyB&_gD4q4Ru(||g z#+oW=81a&+4RUew7M*HDDLvF8#CnIHii|YH^t-}W=3k5x505rR*+_ASTyWe4Q2Yx> z9EiT+4?mmK@18J30ht*kD4SJZJf(y_X~I40X}kSEPnkC?>H#yR`pi*dpwPJOkY-RB zC#sK&$B1Wf0DCWl0F<<7`@Z^YvvISmU8Uc-l~9_g;*!pn(JHpzrNEAHkHm47nm5Ew z5!bJv_!S_&h~p6Z99>Bca4+p1JR|>^q$xzDg!VDTwX(BOb0!8QQXXeacIBB;8QC2d z+sSFdmv6Bx$r+{TQoUE({$Bks8%=0zoGwdqghl}MOtz8T=y6lrRFppG`iEUwZ@D$# zaybL{1r$uoz4e*@)8X&eVX@If@4F3s-WYt?)1KD;3k7r~}RH9*Hq zP6EIcuJSgP)&~<`my~EX_3DRrkzA5si;)QFlhtF{O0ZRB7*#bndj&v}i2mlXXztxB z_;5u0&no}vTq^rn2`i;d%?Q6n`ugK4nGz0qEc4mMIhm{^*oi>)7?5**jt2{6EOG%B z2?9sj$-AeQ_oWw!NXrQ?G^PF@0UoRvj3|IgHb1+N#BZW#gCZon%xaULEU@xp^!_Xj z;A>@O)9pArKs$bG^WvcWsTC8LmeF|8_)wI6Zf)l^y^q&+C}HtJhBNc#d8`QBseQ9B z^1>6P7V0d_V_R0qN|vvx1F{~hk0ButxscFyN!*-7I|fNJ0s(lNpZ$RzqPic71t3Kz z*%a?wGQDzQH0h{)te)fs&$%DzXR;|IC55+`YyKjpVF-qstrV;Z&n1u$PUnRieiWoR zzc71RX^UWI=6eQJ+9$KXf=DXsWnGcBE>WyYQUkrkL-{P{J8B=Co=Nw8{|KVqS_=2m ziWsq%sPeMzuzy#w-OH4NGD!_B16b35xI9u8f5Lk2WN-D&hx}=d%7FZywOxa9MBqe9 zt)(i4tIZ=BCBn`kKpJWWXVaYXzjQI)&vaR!rHhk&j9F(Evoh6yY{#T~j8pwo!Q?Zg zKf@8yjZyW-%i5lQq6*^Yxjr|TYnB(IRBt_X?A>_@Hjb#eOoapc4>p#?pAw;5yL;c; z@g0%_pWlk=g_Fge^M4ZAEb1(!?HwIsHjDU_yh6@olVd*Dtg^i!;qDxZr-2#Cetf$A zc;%qWQ@QAg5~}=*E+3d`7VzK`(*bH z;-1h(G$2S#x?geUB&0*Y!f+==O3lNQMyvCSCIg$FSV)1}c43UI+1;6zE(;})`mzp_eql@8QWqy_d zF|~D{cYL_U?zePjr0J^R_(i#?gGVPaMcJDhGLNbNTPGIpJt#|O);CdwL_Ut&M_`CeKmxR}NS{~{Qe^T}bY0J)gEd_Zo z^4Vk3ZigaKwzn!G3o^`U1mRi7-*x0w*UlNe>%0Lx7EkTa{A$|Hi=H)Eos-6GKxIHI+}bjh>~x_q1q~d$xvbbP`Ck}b03>-Fe_Y%b+mdzV_l{Q=axsX)JB%KF!@ta@dMX}Mi6X~d6m(09 zQ*QD^GGaH(7?H zvW47ksjP9AElCJj%a#;LwycqzEQ7(A@%xP4_x&IL=eUlJ=Qy68=9+8H>pZ{T&-TUT zn7>o5UPmrI`uKKif07}A->?21enY>8Q(-5T!n0EkJ+IBPeFKw`K6;@#F#qzsyQS?2 zu>pR_vhgd5F2;_y@!oK(-sf0nVL^r*p`q*K#fuU_=5~)29V3IpT_XIYrN4IW~kXC6?4vXw_XjeGm*j9D<+$-L?YP9HB z{Y(UK@c?05y8;jtJKmOk?SHBi4BunW^f}#CI`{9EUQX_Eq^$Qv50__l{Uuv5`h&Zg zi#idV@@o}DAtFZCi|4N%USuu@YIyT7W``TWLG{A*Fc zH!z`SuubZ!mEDC{wDC&|E(S!?a zhfSpsln3Cr(BCsSuA#MP%kw)pP&+8xW#imHY6AO&_ZL>6WQ#0{n(hD9#oLIVW6>uO zCH!uxs-IE>)z7_t?Q1mGH|*DAZwaPGQs$l-Nm(7TDEp{I-q0uY`AyUZ!|OaRCO+C= zYy2{~bdP*&$jiZ}=B}&Tc*Lz&?4xt4;0_~xm*^Cmyj(NqDFUWB08GW$9D}JClK5u@ z`g)WBgxi{wA$lhgCjLJhuglTA%!jti&D9WlB=5tHuJ#WUsn7)73rEu^yxQz3MzU5& zZYlq1o8Q4$jsX=4SdMz{;LcdccI|bJNFX4x6@DbC=?3d;nbXCFs=Hi{$Px5UunY64 zC%2A0x9}S;jdd#u#s6AJJEGDHECvpS+`sbdURY$EDA`*#Fq2(%n8C!s2}jVWO0I-nn*dDHD|>+w|a`@>qrc%?69w>swAfM|Bi_tN*$eYp_?BFI~m z)lky(dPLXV(-Pm~u3PqkIG|KAG&0uyX}{rWi*dQII8)--?Puw zJ*7$T#$fjKZw<+()Bf9kwD1-PMc#ucW|u#fq_D@Uc}UP!KJQyYM*0+fa$qnBvZyl6 zD)e2^Kpg<7lLivL1t)(V0@^K$eZe!<*FnLlv-G%d%`uK7`@|EQ{6W@0lFPB{2FB&PSO zlrP=>lx8H0B}=%Chx1js9!W}CUhG)9@TCM1lWgm&of$e)2Ja{k`S`D0W-3v~p+w<) z5QjT~p37WV(1CQgyDq~dL(hn(+H*)jJ3N%y-munL*oE@6SlL-u+-IR1d@Z5`Y1!rv?J zGaX_qw;pupu+FM#_pj1BI%iM*NImPA5bgAx|Bk5+glS2Q!&(hIQ0ClFX2*8V+`jI1 z72n?Ja16&>E>F@NSR=kWcQ>cQ2a-`kd6QB7rz$N&p65ru8Mf+y3|WQ1*9BBOTd3t| zApdi*-dZzU)zS3XCRcjIMg7=EI4e+!;r+}_dC}zvUI^7}a`vzwTIeYZs0gwk*Geap z+bP!Dh5!2{HTypl#83!=KYPx(Y2R~mxf4U}bVcT<@;*XvfhA6@W1ti=vb(i=ZarR2lR3bXF_}#};JL7FqldOH>XBk}-`WOx*yMLWYFx0p;j9lyMFRLZD}2 za+lhAkYx?ilIWIw{mMhRU#|EAOK%v88J&CAqw-y>P(^Mg`(9@hZVrsUfYzqF@g7>f z#e<4OwZTf8qzfwzIXoI|&fCK`UcMvRq5np0mpgK;G~8YqIyaA^BMu^3Ckmit3DHv& zszN_Z5Eo$YL)@!tR{|mdMe!2+Pa$raRXgBvYiaf`0wWC;2YgN^KP zQe{Nle7{|tG5piKz>bO@H|@>YTGC%AJq;2*W3<*I0{q&ZOP5d@32|+*c`qA$CXHui zak+dEyi_@g^szZ$e1^u;NCO|_!0_nmr7oEKC51T~ZiNprk4>mLW<>&xgE}05%#C<( z*?_VBWzqipz}fTJlDEcM|MzDO-Wd43?d|>Y-v)2O#Kq3%>|gsxhFG(KiCwJ1ped-P z<<0#nyEl26=fZ!62eYf|S-KYP3|C>RWjaCl)qS3YQR`5DA4Eq5(g|J`+uzqB7=vAI z#V5!d%0=5;G+D|_fTRgB9;-)11s@-N)&0zA$OB`TSD&WAj|cqax7W**WqrSAV4Vk& zA3eRma1PoTfJ)$*6~30;H#G+*|JKw{E;^w4BS*64p`)VPi88Ew9V)UCv$^$J9-3?( zFT!+}G zCYS#dXzrgbpQIRc+QbHV(9V}wh%Lm6AvW>RU9}y3*;FaTmj`I|2NxS0*foM~baK@= zt2aKWF!!)EeErv?y2iL$r;4qnY*c#6M~hOy&?B<1C0Vc<{zo=THZx)0yz$;67xR3F zk0CQ4Re%%>7VDNHY85R>uS?;L{_4qW@Wp_WP3yK;c@3X$L00 z!>Vz=pD;t9fPM(%uI$pb7Yumx54SMt`AAp9tE5}9D%X%yay9Qq<+{>w&-%_oF43ad zW*@0PIZk|24m}YH=+0AO|C2;%`NV@EDy@40tXAB!$FEuw2;CB#p?%*+u+jP1YTnbJNjo*sMe;njJ(1BrB1?VKmN!PAiMYpt~uvN zl@27B)(TdU>-a*X6BJLLUaWy;MqPoqB8hdqb@%J{XB34*OnIQjF+G1C8(2zu^LD?X z#rV{IRHDfKa@+qx?YHS~dUDmn0mKa>=rIxXrCFwaiKe(KOIWag*?&PR$Eq~L`aL^+ zcd^{;c9yE_V|0(;R~g;o5%>UByGMFZSO8FCNJ3UQ{IWLaM?*?VN+f-41-KM z{8#h5v*(&rblo<-5RS?Vs94wfYvVz0eh`%AV!mt0kaQB={wdq;V}nCxnQv<%q{}YM zxelg7q{C8~>4P#UNzt$SgHoYnc@$y$QX7ua@Kd76vMkcq>v!84@jUI^b~KW+ z?zgxyn4(kiDe6+eL^bo!s1;6xizQD&J3K+Gyy#d2{Oj! zh4I{lEE~ra=+v~NV7_zg<2O}L|4LDlbC0#k1RVQk-Z5PJRn{thCu}>k2(1f)1z;0| zX&#l*s&Zb$Lll%UgXLbQy$Nw)&J#cKjN|N}$1BEftu*6-v7wN1K3`J8C_?NMwO`4z z$ggA2mkce#YnX>HLOE?kRKXahF$lCb?c?ReYn0Vko)jQI;VUZB!FC5>)wIX0@){r6 znvUKwwJ=RkE;LmdrymQ>ADHEL;d1T!vgFkQO`Ar{GP%~tU>~2YV=+BcIejwYTs8H_McdT zFsmJ;$|M`Y-V1kJsebf zS)x}t0UbXYvvG~xM_!5k(a*0|j$sdS$W+?lel%e`&=+i@y=)!BW8QC?*|M*FMdueI z+uKye8g6|?AM$`==Z0N6O}b}~a@bbYcob?G@5HrFLjI2*9b$0?Gd^DmAr9E?F*{&<~QYrp;$%I?0FREzI9avwBCbLLmPg~G;)^lG@BThO-y zOvjndP{A3;=A|#AMM48dxD9$4X$qe`!a4tnuDi7`wT;lr&=Lhy*pwYeXkb|I*AmQ& zZ*fB`y05)v9b*@m8+Kp&i8VEH_RFYkTVih6r_UGne7zW|%#9Lr`j#-G;5gK2oh^=M zJVcH-m2(HR4%o^~?%tcD$*JqM29wTt--?gETjo-zmV4DQ4C@vJ77SW_yQtLokCP3@ z+0{bUPtb=A++rV`vD!TuQA^YcsXEj;!wV)IEH*=zRJjw_H`i+GDbL%5m;O?(JKhbX z2L)=0-`GJdvHQ5wfm(>EZm8b{CmS7Pz*k~6jHxT;Yd{zm0*(nGsr%XvT0dc6WO?|l z@B6Sm*|T?KhU+=bu|MWBCV*4G+j`Omeb?>$)!B!kqlaYnP`N(01}4hObEhIMl% zzk7RLwr}KFmxL?aP!4cZZm#u8JxTo`6D%=0=V>r*TWBs?r29fYWsI9}Zbj2<*4zTp zn{OkExNsDelTkm5hO>fY`E|(ikF5O=u|IbEOi;csfJdl0;Jn?b2gO1(BDu9P?GM?WttLelX2jSgfTAy}y zJ+^sh9N4Jio~I()0;#Wr0J~_%i9pi}_va3(+l%peNTtGPMme~BFa*j-lZ<~l7=Y*b z0+{bT&3#QW=01-0(@S^JT0b?(y@}O{h5F^6O3fXF7RdJRIS<~wyftJ`a{9yoLr)D^ zMbvRUbHdwn5><2+f&ET?3`H=sYeTuZO_Fi?{h)ts4nD^Vj&kd;&fdz1*Oe@b0-=T9 zYIYxwXcFs^>lqe$F3f<1A6HctTZJd^d59HTCGiz$W=wL8`AM%h%ut)myqGxI43^^V zSNv|uJ|rVJ*c}4ByUsN<8jkrfon9yO(~LeO>xL5uaLzEc!&pjc^dEa3L3+zJ4)e1sHfws7E9}DhSv>g-xsnH-L1u_&7^fdj@-eR}C1C?$ zSaLnaq2C6e?D`{l1fG#8$R&d;`TuPDG!Y4&bwxWq)tJ8|T!-@SqYUFzL#R@>`a#IpVAC zCNfc@@L+n{oT9Sh!@BsGzg@3cyJ4$C4hm2%n15aqt^+>8+ZtYTxH+&g2oAr0hHE^T z-{_=W$x)e3;<-_qpBZb$u9Zc zzUIUBS)rc=<@wi8ZF0lU^IUdh+p!FKN}Y3w|MEbD{oOZcOK?)s+sd*|r`>>i2yrrk zznlAT9#12o{;16s{Q5u{Pd3`rBdw0(-T$YuHbmQnr`B%o0-cw%q|L zB_p*riR`YO+0>bu7mZsuZw(!fOc7&`p&C%V_8u>`>EG|MOwD~H7Vuo{!Djgl*1X#& zqKyU`2{o9*x}E?!0G_<+Sc=_4kT|^vYgtvaA_v`I*0WG@ibm!R?}Llng5^eyj;+|b^XqXnF#$eXX@dgdKw_EmLc zZGw*fr+We(mn3&Peu3>uQirscdrG;D@$@}J*@%MOjB5hzxuC>=NkL&P( z(c5cY++1v+Z#45;PbiZXw3bCP!<%N+X0ukC{m^f9YaYz1(0YEFiGV2gYuh4q7+%Fodp8gk zmdOp$7X4uQ7~S3f9^+?vRuAnvraP7-8<$x7n;eK=F6wKC9%{0fFK9L($>T5B+#%Xnq`V^%|i6w^U}Xj zk-XC!OO^8AX?gwlYtxa#wL3oz{4Td5p-6&VC)#s&ZN9U}ZImYUnu|xW&ya_paMOjF zz46)wIew&6ktm7Td1FcRptcQdbFkQo4&gR6+IQ`R0~$l>s!YNG zpI8%;-~CN%vy9^Z$Whb~W@$bBe50+v8a*$=i|B80tdqoKOi;|EK0Nrb|g9DS4-M05BzL_3?6qbqUb&vW-qPAPY zV}=kHcx>$@m&9l>NVW^jQFUQ2lM3AAdbsp)HJ{lpwreTpEJyd@BoZHx`6j|W}=DTb7qqV}6Zn!b~ZTS@N&`ep%D6n6lP2VBXSs=V7 zegxI*)vn1__mxcz{b!v{T>U%WaW_fRINjvL)scxOj(M}*2|bh2=g;bAEIG+9?YUw4 zcdr%yJn>$9cFDgB?J!c1T%Qod3li4-vNFE?@>U$A#&Kk9$&_~il-Pa$qkgO}d>szK2QeRbdL>xSNR^jL9NJrvLRpp}TI7!2MsrEvuQJc*= zV(j?Isj)>Oa|?oxh5k;R*wI;IP(k{=#=(vHN<2I)%rIvry?L~>hbu^bZQtMb3RVnr zE?hsb6^0!4`2wcN8B$m+Ts=l;%b zrPzBrH6++1jR@KvcHhO<|5Rx1%i#I%S2YN?F!&^*VFxbIScJOFn$AV3(h)Aq)M%`W-eOd8V;lS@C(F0Wf1_dvG$s}W6$njp5ag)>OTc0X z7SnA{#(uuCPf;)OdhQ>&M(K~+Yl>`{f(bWTo{hdiWX47u&d(-wjg1*$I;hSGx0kAo z9q9C|q_~EU9j4(T0V{rDx2bQHDuhiB&f3)fz}jUrdxM{!c!+%}-Jc&Rqq(BE(SXF8 z`T1>er{}nGpC--8>fHHIj}YDF|1xG~V|EfxIKu`DL+jN%*`Y4Zj5ZTv<9fy(!B#Z< zRtCG;*U=npF=?ILNa62CzTHwC9^;`=uah>ZjM6Co304$oN4fWT-e)0_C6DAH4C+Fh zlxc~s|8U2-`-ir5dX9Bp_-kMb^(;O87KT+yd*5XX*B0Z} zYe`j-_18!^vSf%1oq@4KFUdGXS8XVh_*`(4VJJNch2Iq^(W4DL281sjpXm4gcXtdG1} z=sp<73AM)P+)}Bm0deQ4Moyzx{@uFvY7qR5uYh(b8fqwlY-#bHZ+VLto$uWji*=== zGvW(j6!9s|WrOlN%b&$60kNWni0D50-`@v6u5?*$BS*<6ozGZ9FiP2)9lk6aJLLF; z+?XjxdT2Y&0z*TMW5g~rBBh%eZdn)`3l3v2465Xa39nT*M%K$8iM`MzFMlRsv2*)uK#eN~eu$j*@6E?B+nY6Mk)zQ)R4fOMKnlt)kAGpC!_l zbK~C{8H)(49o1B_kd`~of{hBR8?6Jg`vI!A20#^v(4H^G+y5P;a=qfiW02F6I`6e- zd29UBnRS|bWm)e)^o5QK*MQ48A7NX=hD&>EgEeWNRg1bxU$dnq-x)sknPaV|Z$l*u zANMW@s7bVwA@@#Yr|$ls6IfWt(h{(xhl2vc6JK04-V7+Fmkes3-^G>wX^U8BgX_~5&&=iO zF3Kk~gund7$Lj?Q4;FTf1gDV-9@>3=?s^WY_dmP$`Hkd8@=Tryozw{+@eE1pJt+O! z@MbGd_lN=U=4{Yt2`m*C#`dMBOKc88z}bf(@|ThI_Kk@2@*X>1(wYVvFs5rzW5exo zoxJ%a|J^QkvzgC{ z^9)UTP;#Wh7_fRl*KbMg^ikjH`*|DH#~b33WM+D-HF@p(u3bNHz9*@`RK~r~{6yJf zb-k!bjqoo$Bp$PTW|@tLCU40fnq1EI5aZ)$ny?J|s&r?%vbq6z)SGPc74QD=Lxy?pkP0)#%pQ*U-z^re11g zda$;HF31>pD4nHylp}oW4KtM78tX}zYVQV`j0}=2ijj7x>#3(;gVIdyQ z;09^!9!LA{A6oayadM>75$-^J8lIA1kfJG)x5;?LHDyI5=2FI2e*vB~!CN}o!&*Au z`Hhv)PYkzQyPeeA#!BZcrg%>lbA?ntq^;0*y3uD02!tz^o1|Cr@saY%L&;{lunZgR zW{rQ1?2O^sD{WxNQ>c9ZW}S^lsZN{(r+}GnUy6r(lVrYe(9

Lo&65XBiv`tXZ1z8^y);_nV5IY`pevQi8BhUy2nuY5#Qphcndmx#C$9m{JzQ=@ z7rI;er-c`&+f=X4x_Tc``29fBPFyD5sapN5RZ(SVg4n%H)tB}Ha~k&y1NI3Fl;Pnq z$(T{J`)O(v08>5Nmey18*;l8&Uc{OdU!*C>Z@7If5srDaFG44J-;uf*I z>@>e(VKPx$bkE`t zJ1JFK->ZaEX*JA_l&L&KqqxL!N;kbawbkUwfnitLN|arYy|>u*A8uTpmgtXmeABiP z;1(JydNtg0SWte;(7E^e#DMps>Q5g5JgX(A=*Ky4^0u4&O*&3lF= zC4{s!Uy{mL?)fb>u$H{P?7w97z95UX$mOFM+M#=OmQdhtW`?eoH?sQC86zH9i__(#jET_>7Ao--!Qc4b9Ss8P1}?KT z=~iELiHh3;>@)4XE0C3O#K%!>Vu&Nxv^VZQL?)m;M=Nh^jDi&z0{HX({lKNVK$G@@ zD6{fm5nA7}4<8GqsQu#iq~63T#cXBeoxw@v11=L!qyEcM<9=^hVxe1T-fi5jpnvbF z4`1R!85Cu@S11$8nyyKgpK1^kO*V?Ux%FDCv|w-Ecz!O$W5vtz-A#Be1Ywo9Rk5{u zkDFFwn#sdOm#m3o>%46=kg2-&;Bpzdm!am~`jQ(|jJ&npKv)SUa?wS@A@EsLDhuIL1lo9)Lzn;W!XImS5v09)rcTVk8TWlRR^5hMBFScO# znEBcnb^WKJ)S!J+T@*K-_$Aq=BfI}C{hPa6NmF@t9;6?7HoSSHGJe*~u&p{PMQKhc zY0wI9N-{gX9H!@5;ortCo<3Vy;~dr{FdB5x$tYDR^^>C!m2PkRgUMg1C9t&!v|w=3 z$8fF5$(-r^rEQ=0)}8xRE!bZnJIZpQx^di9c0)Hw=98?^ZCBF z@v)$KZDPa7%}-=Vd49gTbh4?@%t~A$DO>o(Kq|PYU&qRh?iqfg-5PXGi1i$C6J_6D z)#5i!*&)=|?ThmFgw}w7K9{8ABP*R3U%G51S~~AZC8d_iB1mNNYJkc|?GBFcr%!B( z&3%8!Pfyyg6XuL>FUj&d3(b~Q{5;`o8kf+lF_AS* z^qb=KUuA`iBI1Hrx&GB7iS$Vm1&A-9m%g<3i62vZc5sb=P%xSG!hgsZc@yN0wbN|>CZ`jaKKk`o8(xS7w9L%^psK7Q zbrgonmexUi%V%%bXUcLN7gG-R?BAcNdMcNfXIr&Tx-F5~2%h9MhUoFAgqtjHg`5vQ zfJI*g+4aIVQ8a+}utJzFtW%iYbEb#v?K;L{cJMF4?V)<=#W%a>g%ACR*khUTUq1d^LQ2ySbi}L{i#bWG{etV(~}B49E~{V!zpFvuxde z5=j2g#XWfi;&;}PPDpV73Zg2!-TBS3=W5>4owADY`z>VxDt2`lR>bvo>}y!p-ShuY zt)0KmWcy~lAKDo~bG#P*AIi1;einq3vu29(^n@#X?YU<4edH#p^10n%!Bq}6`+HOQ z(!9Q8FpKl|her7&g?1ZeZse)XoU%F8!C^k zrB%P;NZS75g*{0-Zh@3=vyN(Y|GHUYS@+g?rC=)&?#7#TPwyl43h9NvTnaC==6Hr* z8NtxjnYmhISPXe9QulocE;as;7#r({+q4b$jzH;<4UDObX$a6y8f(~?uAz? zskHWZ64&oN@}+0Xbq*bYRHyep>=b`Bd@Zm_EFeJ~aUiCPqQJj#of^a{ zfXo74zs#P`lw!p#c z!GxU7HN9*5_jnKg8A>v#X1#IB_+&GLQRVuA9+nh z2V!1(h7Uf&!-2hy0FVU94@2HWs-%T~P~LwPr;K?KfB^8Emqa8Ia}s4XLMw=iF=-p= zKln|?$HzaK@I%JR;+M4d)Y^LiT?3LQ({<7sm8}v>-`w~*u$0v_DV0!p^3k#T|Mc(q z{cmf2!Cni;;xDhW1bOA&tQ(!#QdY!z?xSe4_06oh`6f}P(@~<;J?pYfcgOP|5oxmE zz1l|)1%wn1t=55xw}BUtS+D&sw;Uzn@{jXeH`x*!6c|`-lxB3PT*<-tNB{K4UZ<%0V;if#o*E}A-M?F%UTKvd zbL4Ts`UlMcefRp6jf0lP=3L#0ZQJCwgxs#KTVQcg8R=LXvhGIql)7EEdC!rBJvm4C z{p>8SBDyrsY(Uq!dtuSg%U=abZoRdB670L8jt8*uD{|;ZvoQvnE&Hte;(UB1z0s~0 zlMhj$s?PQ_Vm{v%bo#%p&o;;}4JA9L$Jk!5SK?awq)cLEw%Hz+9jx!GqQuF~o%zHZ-&rcuget{VYMzTL~dkm-V`STe2 zfH@22KUG~$KDS#fNb9Sqhw`Y@hX=H7MCG2r$B;H|=C@(}c3B%TnNVGvL7U*7x-{(m*pH7UrUKrNZ493u_!w7VQl68m0tNM>a>(=; z4p&a=tkDwWN`aCDlUSOcRM^yTTf=90;X_%15b^GC`1}4g+&~ItU?10Fe^mEIq$% zXQf7m#sxHk`5#u-+0K!6uc57^m0CC6dO~+wI)0?zgErarn!I$o@m9CMDIqbNb`ao) zUsZfPJ35-NaqefLhVu8blR~zU`XN5?T|Pk@%}92;eJt=C=^|BqrKPgEzTIuz?n3j_ zNf{r`&xO|?TP|{%k8pG@*OjS9*_?NyZs51&CIW_O)7$8_IV(!@Gd3lK{cC)PMz;GL1`>sPrYzVnM4RaIcYYJ&n zfjzt-RW8F-EC^;XqY5z}vUzCtQt^93Rtzz9w~zb_?uTQ{MA9B*yTKs~@}a8hT$^VX zk$+)9=gU27aksYK&ENXDreX#ZbLnfGjTJ=ZaduXy$1oTvzf#GZHA?LZ>Yjym3K4H#`o zA3o2kJL#Jc7`VPf=QmasF0glascMgFHujxq$}Qzf06TTx$4{&GXzBW-kv;WOF)3D7 zKb4u1G;SzbTq!Q0?fFAoqQ-Fcz07T9mgUrmEKjg(C-{ zWG)-p!G^^^&MQLN2@u7AoyO*yX%h31B)ZQ0C(5bkkTT+8j5UYY?OZctE5GhILp_K& zJ+e{%H1kL-G)2#E`O+jIS2}uF(}s}hYxRoj*X%xi-MCg(Rew>N&Kl8qfsl^^7HjIb zFX{(pA3D8k8SEC1^@i4^PG>HmTViEpYo59fPeYj?e0j)G{s6b5uAHp;?AOB!Gtp)2 zI)*n!zyIa^OH%B8ipJbug7pYPU7j^qQDk6r{n#BAo+Kc7pH_sE42+6z+w znhy|t%8$FLjC1b}5~KeVt7Z&mv`rxKCD6ugr=K)fWl-qBDvTVj^^CJ9B>uuM+J1Vdw5(+`9fZStER z21br3((pZSA%Wt9W4@#SJJcr(-uhD8Aw~J>jr(Y9Q#w5Zs=El^^Uc>S9X@W8s9Zl( z-Rr2CV9-Z@R4ef%H+FmDnwwc=n!eNgzD$V}^702Z`Cihbml$J^ESEO|+;1l=1SM!m zZGIoM^DGo%Q;-@_NHmMq@R?^^r1j|JeX04rApkcSGcT))dT5SnT=Ad8XB*m(8nPA*wd z7QY_mn(K1>ieVO)mp{lauZj1bIi@yMjyvk1b@fzn(R;am3(hc=+}o(v)O(}NP(C{G z30J8pcjyu4COxI;x%J%KjoZ)yU)ozZwqG%WGMxIOt?l8EL9DVujigGf{aTWi6SD=v zE=nu_E$!s)-Ul2l>G_LvS>z+)BFq|72gn|U!)!P@zs6#%0Y)&#m$Pb2F%{2z+PP3vMm>mr5atzJ%b&8AH~RFl`Va{7#XkR{ zsp>spxwIKl87w6x0>YSN5O!Bej+^X#+u_*JIziG9i@(*kp?GmRQEWGFHbN3l?#{=a;z*H~h@zqSyx+g>D=1_p*WKiZ~@BQRU z=dxQHu3bpIZda{e`?jzDn_}oTF+5nNY|rpV0DdB~b|Wpb=j6NOBcBD)3h zx`fnq^M&F^?s@)!fp!F&JWB-n?TCDjnc|jt36Cf8A^nDH7l1K#(u;eP8~MeE#K?>6 z3ehUxW1|hVd+`<_46-1Ldd8S{-dkwiwsfOc$sO0SnZoSS-yxRE5*oA-gMP@|fawy% zGa7&lAad#6Q7H*0-}&)#9zI!Px*l`QXPF3)bhQ4RRWkqMRiaZ?2Y95^bk+HOHfe)+ zVb88>StV|X)bG@V8qF}Jk`cXy&$b%=S>6LX(X%W>h%H9YdJOZ~I_h_LKUYlBTy}(_ z8ypE_a%hW6bwah<>Z9@fR)DR*0SB}Yu)$HO4?qiNDjhU>?aq>!Xxcqe9pR(?>Y%%b z#1s0)#*h}{f(w=tB$eC;oO`A1KC5OTAp*o2zgib*KJ^vbB+QtSKQuYJ-wBZ=W1~jo zj`(y(!jbLKEW-UI(h}slL5Y#*Vs)}^x8-EKIt^p z&XU=PST{gU_P7H)D!i|g0X6+k$lM}f8pAQa#wbn?gInKUEDVO0!q#I2cH>1oF91hE#PfQrn%Vj0eCZQlId;eh1k zpkBrZRVeiX5hEDgK|#n{Lh3(F*9A;5QmwV2v9`G|L#T1Z3dJB>~0XNu2g%G9?L z@|d>Uo0C9$8LKT2QZ5QrP#@b6DciT{B7Lh2z6tR}QQ49>KQ;pqVm z{V@E|ozkb1IQ3lB{;A!hols@{WOy<)JIRTc!2(DKX<>c&Ycm#?lSke8sh0dw-uzA% zHtTFt%Y%L>++f3J6yOc&lvs8;(jDg2!vg{XANk|(#}+T*-ifDki-400X&dUZw0I4Y z5M!h1UZGQ9i|HHk`8_lhPbp5BJm9-rCm_XQp-{j4S{ij4a-)S0x;@CuvQH~n8qFy1p{Wvj2V{@F-N}mCx?^3 ztu6!lFM~cDQ3(@FUxE;62P@!^21SLgw?jhWDYMBW_rzPMGceztK{%eset#-=V(kn5 zS*DUuZ`8#jNasfyGIaShG z(C!Ni(2+o+D9p)Bfcw;ed=6#vt6dk}r-lG657z{1N+fNUbn6px%V=tR@%P^=2`656 zJjF3$Mx3*djry^l(v5x;Q|dv5MCIq?NGc`oZknuk30X>m(sYff)as{P`3%@`^ znF+E{!R)k|MQ_U~MCu__0e*!Iy>q<=cYT{~DKKCpD;H%ZLYK)FvlI@UfsUNZUo%TB zf)ankxvFi(*Q}}-RZpT7I``jKlW&Q5^!}xP>E#;tfAD{F9ds#V97$|%(YTw-N&9P( zG7M~{Z1c=6PYuEKHGOMvMtu`^BmLZ(626A7ii&4qUS}r6PBJwT@n2_(RSFK&NNxiv zA^fsi@<$ogp>_6p0t1F^DpZU4C@`zX2Nqo-X`Kz$BnbJCD#8O!`v0lGZ+ClR^x{r` z&8${79mByH57sO2-y7Wl#DM4aGG$W~0wJOQfzfY zM(DRMkGE(iz#81H7Wep*V}7!^+@D*hlDx7U)QibNpT06|?`R=A+|WW}{3qk6Op?Lw zw|Bv{s0&g)*F}xMK$E!9nR1WcYtp03{6`0TiLM7XT$4I5S&?)&)uK@9y!$&R-+esB zab#}%=gSe;>(HDbLj;)xMPbceL~8U=DZJFT2QmhkEx49m7=DosOw4Mu(`w3n{`*!H z1Hl~*gl8WtJ1&CfPm65Rf8Sdou%Jk0zusY#$GG-B`PXt1y`WpsWx~gFtl#!2^(lNl zoiowC&7-gEA}x943LX&aT*FGhofRe%JG9a>j0dwL5`#t}p4}BsryytZyR2K_BSX|2 zKz?qwwt7GMvik1uApm=6aDMkzjS9v=C}?bq4eFPEtz&)%|1y*=hfi;Zk*_5v(jWY(9K9t?m8^L(&_hFU!R%-Vj&zC_}gB$>cs3b*;noF&-Q4$Ecc z*yTcBuI7n2N<^bZuG`z!u0dIi#a`Fl}mhrFJ%^WeFL>MeKeiZzv4j1%p%EZK! zm`tI^4ZD7B2VzAu0zS(QBW&r6SFBDs<5uj}wNJQ#9>84_O5Sc7a4F21F&KZfhUF}+ zu*(s-pej6`Pu!1ibL&OYzN;+!rfKlV`EX=@K5$^A_pI}>EuBl|N?kEmX!Tcc!V6ux zjcKz7zN{@<(Y4y3Gw5xEw>~oa?3@Lv0i0nVCKx+>A>bWkd=j)2h3-|o@t)i;`>aFp z;L(xRvEu#-Y45F(=g|x^8avCMMD;>(z}0Lac*Dq;c!#)3CIX~ba?#hI zei6ypxMXB}4>>)^>DOUA9Bu+erlK&zMJP!x1pN)~%EAl%Ela_A(k|j{nML zJ=$M2@g4MAC|l~mZa?s)vKpz4_h7L{+$@$Z!U)l#-%wU-ejzY9}NKCX@h859GuFSbHELX(FX`)Cqg?8tlOpn&CAS_Y5S=>?f>6W6D+% zPL;XoSPZ@!(0@t$$a?X-rb>-u@{f$@2s&Bw5G}86W^e0mcZvDPm7OQ&>FIO$swf~% z?$~$J3IbPT^>aKswO&8Pwf8zck0DUP^s=o;M{sHs8NNQl9#Db3^eM*8-NWE7#KkgP zxRCump={Ipazei3F6KZH$~(H}-=>9;3U7{V{x&juQuJC_@SlZ{KAS@a5`^Lks?m>G z++;d&0jE{83t>NZ;~uk&pb2@B=shPoN1|8VpfXwgM$bH-a(yTJ31yb%5f+}yVY=@s z-(9#Vds#7mOX>xW4bO*QU9Y@0b5&1cCoamV$@A-+B$-n)x+%IBor;w6G#k?;`IPYxf!O6qh zM20Ax_dk01Y;Lisq0sVRjRWWc+b1CMivvaN4oDtnq(Gu*JO3O_)3XO>7}IZ5O#JNh z74<5b3^XwhB__G|Lrr@L>o#1|@c@DW+Sox#kDvIo8RSu@e}&!e7cyx1aen zD!@2y{>5>HET%$ps67eu@f6lsmI~Xwf-2pd271B9jF6 z;yC@oH~>m4AO(eqRgV<50mlWaUejyD0AZ;+9H>Jjv+gZwro#(%itoN}6PsFkPaO+jM zg@u1LWMySFOdoy0C=o(gb2yhC@P4VgySm5jmV%H7V;(5ffy)q)06%z31sz3-^2JAt zVZg<0ivti&D&W?}gTKC`#Sj*s*AM?i+>% z?i^h`<{1hLnD_3y7YF)A*}nlRxP{rK6fSiFFwK z=W2vMBax6~~pxC*s*{NY@}c5^pw6fiD9?Fq&d#o~fSfSup=%^N&4 zM8om8uGq9_C#0tXw}I1dbsq@ii~6(l#Wy{SZU%nc&Zv&%qTT1LF_R0PThc)bWR0>f zWA3+F!^REh52RPaP9XStu-Y|=AJ)vih$#b?)+Ih3lQ#2~qt@S$NHWHF4BY5_lS%Z1 zIJvPBr%CLMcd(*dc!Gw%zaGCLG8#)`GS;oIybdB>+O|pdojo^@-=F-<&!5x+39!wEz_$c#hvClh-dH z3m=V*B_-u@#p*6&a;M#)yLtXhlOj&~_L(zxec_mHy*`^m@atyNA=MeAG}S&*MwRWl z$}pa&pF@4eh-SKyH z9EB|OhG(@A{~7(JiZ(-HJSL*eX&xQ9hewhPJ%HRqW@=W|7LYUW0`S@2sj`lEpFpql zqu{gI5Y&ep9b8!c2%`dQ_T=OdM{9^Xp$^6M1_~EsvShl_IYHKd%xRPbTFw9o5l{bS zZ&n5It1TYyTazR%o~@xQjP3)!XfMQhHYA&HLMPfogI3?=Mgf*QIwW*^m$#%GfBsF0!X;o%!vF_2V|tn?yG8c~>L@qk!q`lmY{{}LU?sla^1jd(sbM-(B z3U62l86{!2idf@#pyRO|_NCdeU3ID{466eJ#7#@znAO@rNiuIz#7rxE27Y?{2_rvz z|0+8-3{SN2vZZ@MXzw(b@Fz(gfKxj~he)i`bC6SU?pupg4t5$SQ@CVr(+hpBu!;C89YDZ`1zhlgRVe57G9YjUz_#l2@hpmlH&tB`*S42@8f=9>vy5s91 zAi)iso0C3N4xJ@s4iq>>9%X%4GhDKs?|nikhs@9lZrch&aZ&x^LMkHQ*mL*f+|=?r zuK!V96T*VPv!(E-P#mPBmFcGJB_*5(@Tc5s9qG=)F{= zpV<0o->Rv!t}s`E{qukehP`Y={?@V($?KYg#3&LW7|_bm@Vb72< z8_AL^Gh{XjbLv{Mohs_8->4-a@dF1tGkg~agGMM?-SIMS4fzf|j7G+TMHD*YIrAl8 zP!n4VG56d5!B6hj`?fTDP2Y-*Y9#L55pnb*83X_j#`c)AI$~eP{xQmGUB#84_Nlp= zH*aiA$jV>&es+c9>PlK!TzrxYQfZ5>5cU#48kS(UtL%41s$zsI4d@mw)WSWJx|mys z<=XyvfK|fGC&|+Zy8@b*NmV=!LxxnL1fh2?jIW2>*6x{|iaNkppxn=#Rs``@4nXc= zG9NTrb~W$a*t(ba`mJMcWDon6CG{DI5kP&j+y$r|r;v5rVC@*hHO|cikdk>TPE9zUb%p$YfC^Vmx$w&iBftK$Q+bDw^ zKAi@qv1H5_wD?TJv^aPl(KTWO{Qqy`Zj5Ml%m3j{_|113o!k z>f?-TYNSl~YKO$He{42Pr2|{03NQllng;cIK-`$9A(&RDLfV8;C>G|nZN@?cuLe7R zPkPGVE&EIWg73BF+q8B3+NxWf(j=%NU&o%$Pr@n-s4K zXq~j*YZY*r>yHgFTRZ*KPgg_pVPe~aL(5O9SHDau>At(3>IoJZ=K@geng=z()z9Ao z3;{Cr0=<}c3j(XsAs}GmAHX@$wuP~pKyHK&G)QP({8a9hI8i}i0dLaxi8WF*K((>R0vvZ|hlp8+ZIqu{=!^#OT2JBUdTu;2eHNdW&@u6skhooWgXRVUDs zf;h$g<`Ghb_vtgDX&y8a-TBRdZ7@C|s$E!f_x&n5-NtTP@&J}t#JS2>eqFxz2)SV98(e^yB za?8GE`v8d1c?7}0x&HaJ8aH6CLF~mFAibus4u}dq3GDzQ%4SfUK9Wen>30=Um@FprXd(RY+!m6S@>vTPuT~s3{bdh*$kMJ z6{s;PVrEJK36(4$hTKsPGczH5Ef}<;6K;HLA?8p{1I8Oj<1V*J zz&+$^K5089#cQ7weF6no9!-cz4fKqT4T|`R!NLMiMvYWBflei*Ob$~!K;l!c@3ET? zG}+}*SODEJxr0jcC=3yBX)z}aF)kc%Dc(oHepSQG{2XaV74;Mznh_zsLFkPN^l>+2 z)lsa02=Xw67o-Um^gb-bYx&D*th!h4IgO5s5VMq*cTX)J_h_qN1qnNkUD3tF6G&qg zax{`}<+=GV{ycepseDHvAki{9`vA?FKs||)hpL*h)hH7w>FTdhZ9q;%>g8}AfrO%sZH+M}p^1wU0KQKx`UDUgtF9trJi&gU$;M`R7^5ppxGyC5tCvTg zkQm*8Blxs?V?8P_JD4PMGk{afYgjT3Dk$pD?Ps~A~keC zrH&;J!YM)cSn3DJNRKm2;^Y3u4!2su5IRJs4owz2E6d9aVkpo6OOUlLrN#l#ibV(V z==FZWk}Gh?6;go@5vQVCq|ArmCZ~ z^rF5O^w22ab0aM*s7I;@2{0jDgipn=?WnGJ2X;W9uWe5T8ySHF@33`rUq?q0f@F!n z9pFBa-4<3;lNO+fU+!pzI_I-t>&bzVlfPfQlw%4@Akp|C&`S60@y2iZ)D1oe%sZKb zJCqNdw(}CulMzb_dlneujV^JwaubehLn@5=$i)@eH1;Wi4KggG4DskH0lx!@a!C4! zJethm#w(~DfXPBeZU;lP(hhN0dG?Z5+mf262n3LFC;U*p03ouWdAh-hYX|PHx_fGn zfKrj)f*Co*{SUY7zpTP+3X3B!*b#5WKtjrXa$C2S$GkNWd`CO<=QgpX03wSt*p&l; zPoiYwo36OFGxR{ffZ&L0PqUGRj?cOPLPKFCd}^SiP}at8e}9Ez^hRq8^5qtd^ArbQ z%s|cM#POm-2i@(0kug7k5&+0d?F)RKXmjG4RMSTwXu&{Kx{#)FuRUx|U0tnj*7+CA z0q8I_{?XO5woek7GKOvGaptAa=@4}tzP^#NY(Mhq(?P%&k(G5{_R?w`EtI413`~Nu z71V>(_plez4u?xo*O_#DXM81$Q7nUxPP>i;<(-W1t%Hk$Zm1Ti1<^s!Fv!vmz{y=| zU1cLDgv){Zl)N{J1!{XyjaD8^}PXQPL^&tcKQ=-z! zhJ^zrBrL77;^xdmr0lF=jSv5aTB&?I$MQ7Hq=64Wql9T)7udF;j1AaA(lFTS8lYwX zIt(ufVF^pxv1P7<$g@i^#u%ap_At0PRCVoksGJEL7lHR%BK~#xBxeL#%y^*vuw8IX zmSU9jB%~RDhyr&NGOz-|R6ybmde<|6<0j4~?Dh|U8984(voeLaj*v$@AR>5dp$yR> zd}75sPebJz_TnM$|1sCd7Cx}wKi3KRn9foT;BY`YL)^&36sUA)w1Z*$U-W1yG~oGF zsJPu%2bXd$#QWSx)4pZ9p$h@KXMV3O>3kTppMAJREp(m)S3N++eg)}ZJHpa>q7!wM5FOC)&(P0TG0n5hcp5P~v@Q-IWdT5}J1dnyCS8>Lx(WPpVVwlPJ7KIp^b zU35??9Hgh$0ncv*6)OGRJt_*g;OPA@T`NoP5NY9lz*;~TA(oV7@{oE~&r5dA`lwUs zEQA*+5HI(MoHC`eCPAX`jd9h%<-|2;Ot0QuU;9q?2iGCtcis{U=4S>CMgStu+2SD zMr}PnDW;Y|Wo`_FOd1Mfz`adlZ&KLNzFa+Dkd=$@@~ZVVOoU;EKycW%LOB9u z3qfS!LBwHR6=;eU-x(MG6ovJrA`nxq1`!~!A9jFJaKpkl&~5%YMfs3ux_K!-5c8A; z*IUhdTRn2T5-QE`^X@MD)x&Cs0+;c3?zA^cpo|~guhV`MxXegmGAqJ37_=uG{0?|U zpqFWai)@!1w(o#@+oMQM1DKXr2YO9ayvOu-L5KPvGPyUK zb@-S$KT+E+i%6JX2Q)^4v|pr-%`^8#fM()H~Fg<53XA$`X!QUvIQ6AA$jo#$)N z$~ZMyMjZ4jEGG?x&BAR1eR6cFyX6AnRy%cN_Y=hqbhnXqdlzY5Bs%a|J)qG9J1+#q z?LDvnIEld?H%N`Xyndz#LG#91Y3)-OKl62Ex{F7^UE2ge)iRIGAMGs{eE~y(1}DD{ zz}!JLf17%LC2 zv0Ot=?HO?h1X@YZ+T5_I_QuGL&kYnJA^V<1uAEFeo@{wKSFh3!ILjbCyjb3G|9KaX z75%_T(c-MZu|UM3O$})tWN;FkAAf9ZgYL!$#u0*jK@=<0I<6eYej8z_n}A3FxVh%x zYaL4~fcu$FctxSBKAN5-7^Au$>BGJ)sl_bk?XfyueF6*v^O(M> zTEy8zF)A9T_?HYFbAVjrd-)&6pvfQ@FS|4L?v28c)U<^9R{EW@+QPz~kufyHnu@VL z1GA6b&E!7nfm{1z@=VZv|FvSmsZ@E1%HyeB_s9D$-Cd|TLm6@yuqYF5sHUf9vg$~) z1$MeplXhf6Nfrzv3Pz>Bcj+Ubd6a0^UH>uJFRuiNKY+mZ?8t%jB+F=`pHj1m#zRV^ z#KD8BgVRoU?Ug6DxT6d&$C#=mTF_hBFtfh9!YEXB{hVWZ9w(?&f_SVw^mij%7)3zWFlsQ9wB(5kGI2{JkeH2_Luku_?x2lW_m; z4}*7(yW5T;LV$gRT|YPBroMa}XkXtprLBfDM(=#wL#dEEd{84gWt4SbwJ(Hmk~COY zQE8N0)mxwbQ1BTWvYcpI$>L##Boy5$suHM19mZ3RR83jt6#-;WO?;Hi`R=Y z2^ZHr>3iwCs4^RP=I#7nNjR5(ar?6GE|3647}1mFQ~|AuKTA4U zxrBpGqKlV$WxhD{PVb+vHo)S#S)tq9aAndvMS7yslJD%VUP(N~RWda1NqgS+indwO z@T8IRCsP|Sd^*u)Z0Sf~f9+16(kYvLA;gNxY6nJFIr?wJUH!rDMKBDsr##Q&&+kyZ zU9U19@dwcY4X|xLM21|5!6lm%e`YM6Kk)ZV@>0CoO{f+Q3CVoDF190DXku2NaE=Yb zFc)wvdVf#4jkZNl;QB58*&K4us{UD-Q@WYOZL>Z2yBQ;tdA&N>V%IXNmF}_k^bWF> zGZu@n5)!KCTr43yxX2IH%SHDNtdDSMgoGTq- zhXmr&luTW1{P2BIS--W<`~uJ3*m1ozbb5kY8o#=Aj{tiGP1W6z@Kb6y;pZJ5&ovtg zuUQ>#_n+z_Sj9oNDa*O_nzTUrpAuuOH+r@w`5h=JS;yZU%i%bVx(K$cWw?}@n);fe zVrf~@Mz^D#YnAf~>B>G7{21oHbt1f0EgKM@t;0ofzLL z+e|0Quv<+-BW8?b*yDU(Z?73$gHC$`4rX`54_ULJY{1&wk-6EjsV#!dF$t%O(-~La zr(5(HwuL5%jwanVT&V@e+jrukkLI!7zO1p$DQ3*t6C#RHdw&~_$Pa2pyr~h-S=XBk z)Q9Vz61qC2+m6dT-Hi0kuegY!a_;Hr!J_N9!V?ng?D>|m%-c`dB?}*~duBuhGg6#> zJ@+#kaMZdSk-7v#m)?!Ne(*MNfb_0MgJE0g{ROJI0lxlae>6eHwn?0ChvD~)kPgv+ z`{~;~dE}cZL3~s423RKHp|62>4R!TbXKc%^@PED|nGkY#|Gwcnb;rSKcxM46Z#K_+ zdzMARBB!%cB}cpXn!(m!-=S5ZQ7p5S*Q%N`y8B%VM^Q^@P~>N4 zXUC>|{;Vrgw9X_{0aFSaCOA`|m;>1oXmB7uH(W2rC|tO3!I!Yv-OsnfYkq4tEJs^%Oe3&f|KWr<^S68pBY25M~Vgz|Ue+!t;$MwwulUoNI1Ay2CWK zVJ!wkT6YkZQ&mWRG85F{pYv|AY}ouyj0gOzTCKGoPzyyJ%0tXho`~Z;FvrP2gDaPO`K&^W zdP+bE!p~8q*R}jaimtBf&))U+&JV%9TX9Nlix(wJeJWHtD*k1uN+8sA$HRGHBu9=V zrNnh4bR8?7&2bbZqwDEeEy(vWG113Be@3<_MlrB<+e5iSy!QUiEnUVhyU+IyoE$e) z3gm>9@q@y53x<7tX*o|HKLU+VhxIg^4jXw3A68tuB=eN+48O~_kE9gjY-oe3S>%oQ}P%w*+R!3gMRZqq>M zd?3|>X*8a_UCYrLy7rIs?~WbBbQ*_u zyUoS7w0ipbn#S%RZ(;Q3B)^)zK1Utb%4VClzIAW5^4j@(G+HwH~Q*(=M_ItyxLsjLOrhbjk7B8XC2N*NGo! z^Lo|9QF$Fybm2|t*RF1lo$zjFFa4Zk$dwL%o>^S1_Tj?^WO@*wIIjn)G9b-(Gty9u{LO}rl!VR$5muA!0qhfG83VpuME%O_1%}=V!AWc9Y)6% z+mFl44_B7<;acnKk$=<*JYT|RAQH_XyWMn6 zUcL(?^0JgzQV`>ad{GP6O)S#tCb~6OSn=h-F_Y4vV)s=mOvAfTX8Gq95KrT$6}^SN z7!cjr@Nh6OXX|fI%$4*%v~n6HX9DQe>gp;srMbDeY+fbkR7YYP*ORhs-HwjKdy8}@ z_U!^)_)d-YYx9jh$8WfdkweA;SH?2x17${&DvyPDi_<-L7cXqV7#c7$Goz}ZaXzFW zIVp+pDK*dJL(+`1wWA^~las_aArLbyd_?1?n83y~D zUFQ`HpRt6O2akBu#ic}SIjYS9P}}MUHHc1~_G`oY=;>DB#cr5IbnNzE5r$1Yn@TB8 zd3t&pc?-oZ^V-OngS+UgaGqURPT2K$Go@MXklHG~>w)Q1;2%y|gg!+f_my)Cuq)7C1Dua(kp1m@Ld|nSAhK<$t2v4X_CPK&_y`XjjH_V~Iv~j|^@^Tz zj~X^5M0`gRCbagzxZ9RxWJGZEC1XEUHa0a)O%_bW#B&{|4(U^?6|INqJrWnaceg5* z>d!cXTpaO?<2g+5XWfHmPP=$nISsG5;!MC7Zn$*!{45KMbD1=5aHWu;50W+?Yn)lc;o4!EeUbOB*Tlp`20T(! zR1`MlP6%n1-;ikH?Dbdy2V>M@H@Ntan+T!G_Hr&GlKEu`~HA|+wJd=rX+n8>-=qFc%L-Tei$$c}a$wJ7T< z@iE{f<*ncI3lOcV!|5=P2$*_8fCKLxo;njO3vaiP4m?r^mRX*h*nc%)cQYZH-!2{& z(^#m+dUt2LdSn+&o%2M52Jy76d7SfejoFJs;iGdgsBr8kxsnM}ZG>QmnVn+rRTH71WRz;FpWxdj^Ok z7s?$Y)^@fCyyju-SFvdmrJncp>S=!4*sCv}2?+_ot1#9chswq(m_>EOMj#p&?~;XKQg5{^DzRVhd6Iy}~QpH9_}dyMii&dkhg25%Fu z?PQadQa0Rn{&$#;id{>JbEqSoXMxJs`2!C-THoFguo1H>W0E_pmtd5>9qZWb)hak+ zal5B1`ZT=SwMsklou8ZTaAu3{F5RLPbdc(LrO?IGCX&3evht$0c|7X#$HL zhW5pZF~2h_&_TH8#m1lV1BHy&yp?ADb9oodVmYio($}sHL!0uJckz9-(4V);j+|g_ zBFTiU&r?NaEz$dWpw(docIfQT=uQbNX4;P*4o_)?FPp6sqaJgRJx1I+7A_nf5n*aC zy_5$dk41u~f@@4nq_7uC4(u6v0T|d#T6hyOnAjrU*98R*nlBR}0|-mVd+^}Fl@PZl z#s3MyZ@IMQ=5iog8Cn*5Ao`#!Tt1h@w2RNP8Y;h8(yglC_5+jEw9kiBSw|=9gxH2e zXFkU~z>M0u%0IVe4R$l}cz0^Qmx7LyD_c!h)DibRvAz|7#U>r&tZJWexb-qB_*bm% zbHIek57<%gf!+d4g2v68Jh;R*rp6l2O5MXJtlq8mu|W^2k@}egFza-lE6UIw;R)^H zuPbO!60zxET|80GQdxDLNot`v@T1ppKtCHoSz@rfOViN)bm35Y;+9|=lJ;@!eIMm zpU!$ZE-{i5W)v3QRQVY)kNzFhOI$tr=&GmJ=XsZ=spSjj&&!G>zoEvQu7OPN@+_1tDb1 z_}vqDEa?^cUojY#(7%rL;zd=sf`?cFaBzB}; zS3L=@xEBEUh^VNHC?4|}h+Ty(MM3|dH~hj)nMt#Ks7oE)-6^o0F)ChOHAHo<%aY!= z4-RHRXZYi75B0Numa(({cgUHR;H3>QlRKzDL&)jpWl(6@bq+bDV0u&_vY}+xPJtF! zxk{J$&LO+noKa|nbqCn&UbPv_GQvYhnGROebArvF!!%Ow6@ccUReY#7N02}ugnCHu zj_CR_>57)`Z=Z(3)J;3FGBZnqQ+KEw2CviwX0m_L+O~53GK5R=5CCbH*hInF7Mr!4 zHZ?c5p6SlOLtlDV7Ml{bX6dP&#oGr5A@b@5b&8CyUvEM1l+m_43W>sCrK?@@0x60_ z2iCyZ*%^z5ri~+?t}x&V>HaQ7{rkr!k=S||T1cZs@0H}%?zn?_Dje9;rhF5!D*xuqo5pk}SB~qV$-v&kpgRs){z>&wE4Sno_(CKTexf*)ZAPlJ zKryIvZDBY|f*}!N=-^=DN5(Xo0Gz8sFsCLjAG9++x}yM=O&bvHgf_iu_hK;aWL>j5 z%=lHq<+~Si51?+rO!f4aFRx&~t-4PD=OLHHzNol3YPW{Fq)Ui6>)5a7lJKyfoQ!U` zpDfFsZSsAxEg{c!#7!35KyN6MEbr|>UQtlJxU{?P8|+jk$m=YACy$UTKGJ8B2vb2P zNtmXh8>8md3BMF6Ls)_ANZXpXx5N!RxEMR~41a%*3Yw&SWH$FEno4zMz}$MSdR<#j zMfUQ<3!h5+msy%4T>67Cm zgqy*&+X^oy&4SpjidYPkw20ggUDrLvw$G;@hr=nsi$#O&^M7XdEGa?Qzb=&ItUpO23Z z8|<6{XGBL=;g+SH9SGE5f#A*e+pMBu-%KvCY|-y3W65ppG=}|-!&he=h>7n0{@D?W zzNZ~skXP0DH4tUE0U5ZEurM>m&CRV~AVB_5a&d8w$T?ggr9t_xb-{%#7Bq#cKsNBB z_DA5L%iQZS#wR6!c+4bhUmpu5#;CML)}Zg1z51ZG@6C4v>T7s1Pg8~S62pA@`0@2? zGLm078!A!JukK~lL=$t}Ge%N1u^#~y#B@a!7oQ{z8vML^TiEp)R+pLi2Zy$ay)=r; zBUDam?;ryvn%8G-Fa7xZUI$6IXiR~*S*Aq~E451{V0*-LBI%QpX3~tLL0JcU-ezTG-GnX)DgIF< zY2O+!!PI_6_Izpl{yhhOJv~FsgsyYMel;}&sXI73>x_%Pr+Rnj_O-3zlb#yQ>jb=_-#Uij;p;I+EF4*vg&I)!l7E=YRDq-{s4h`T5F7v;;z(&HQOy zf))HIR2s1D)C>$br~7ToySr6`*sh6y%=)DLxqCY7vVY#`P43tm6rNi{nM1Fy9B&iP zgSE!*;yL;3hBH4~=PK79JSBIz{E{+{AId}epD9`kq9KHr(I29J| zUZdy#W3>;}bA{h);k!o7f1`M|kFC2iN#b@6>+bfbT1;5-lLGG4))!~{%Isl{KPASn z**+Q?qDaqCo2v1&8p@Zvy;zkj$6_KDFJ$aj52|4wL*qQ(fi!yz^$13Vfkf%%&9H%i zzJUQtG3YkG84(eYnVlVOLgTGxzLRuUi8 z85I{7W0GPx_5YkG!*&}>%TLvlr%gFD6JJH@t29~XUFbFrKSdT`^ik9_unJsHGiW~y zBU6zep-+GJ?kep3;*yeRT5qpfgE2)JUpi>)1*Z(`7qJ9IK|#TvC_0Jep6>1!#=?*o zv*(_>g#7ww!{))K8-EgdpR@88SXFj@OnfpZxgNK*mf^VTg`n7X?p1=t>zNos+hk-E z+^cqo2>%E+)xpH{=|^XxIwctyKW=VrUfa(C@GzU(J7Viw0FPxs<^@lN?O#01u$E*j z4C~|I=!krCegfyt-)G&hxm=!hBjVnSY8KlS8sl1eRF;#I(~Gle5c1Iwe+_*ZurL*d z!v&r4VE%h-|A-u)B=SpNpabj@7~Nm$0y82;sao zh`t;E+z1BRpFiL5)rt%(1D9~#=E0ziE5DBhieZ7syw(7oLvXTdb`@0mw4BeNzDihI zXF)#7jDhgfLy;;e-dK2`?UeYR$N=@edS`8mkC!(+E33)Fw(U{^M6&vMk(UzQSU$;* z%fHfoD&g<%qGRtbtix==>Us~L_ZJQUDXkHj09;O>WMqqmKw~1h_M*>Qm=1ys-u^1> z?q2bshavD!h$ZoE)~?n7wl$;>DaLU=q75FvZ{t~6-t=$~*a*Gw>^hkHat#hnPDMW> zO$()L+|2WHV=i47+>FlG6Nq!|9bgo-oLZ)-bQf~i~J!+@&EY?BBg8BkQ+VlroXj+x;z0o@3l3L;;;VM3MfhBZR`MH z9#&Qk3mbdSH?ibP3qy2xKA}nAeJ$PZTP7iZBmGqp$^uYfLY|lnA}=WMVD~avKHT4T zgL;C3XX?cXmhcFfos!(M<~$`lVt--;)EgEYtgxh{FMt~VyR0}p-0hR4KM8!_(+E?d@%peA3`kfh}e9$fh z+g^|oS=rdA3eY@<^+lK9`ft>69l_s9obsx{aUN&*&r(>XOnKD;_~NofD?S;v?IlOv zk*hY{-+u#gYzSC5Pj3j*5T~Z4>F6HE*SX&My%z)&25d_7jm47hwI;=RB3soFUdLSs zoEqTWfo!OiwRM;jzX2n|pZh||VPkKYC%~WBAqmLVHi^Mr=6Pl)3f9J+?=k0K%X!+_ zXHx$j1+|hf^+FM2Wodaycn3tOwzj!4Ve8pk*2xP&Om2C(R%iYKPrVB<{njSgzwKuz z0sA;SH1s8+{^?e00Jar!X|+dCgzX^V|zXU zia+iU^(GPCb8-t85j0l72Pp`EcNrcYo-~HQum+USmKQmUg-;UvU2Vhu{zd;#7Y~NH z^{p1;m=*+`gMwH4qsv5)LxPdH^w-FsZso#D2X6_=saF=)n*cPpb}cZX^u9o+!IU`* zdFNZ-!_MEoTro8W@B|SY77gc~ zqxrx;>m*0DJ-=>kVW9+J*XHMV*gSgIo@`#%O(VpgyAdmQevkx0L{_rLa<^>Elm1#> z6gvC=$Nf;f*b(A(bZ`LgU8bCUu3W0Y|8k8!kr3IkU5?i#`3E8#u81zXk$zLq0iwG!IN0>`*Mab~FzPkk&Ad z8PFt}u}XQdhQpp2kKA?L^(851CWRWPtgQcRf#CX38?`^R-(;rUMzFn z%KPO^NnEvmA9X3VL8{c(JL7})TDRlM!NbqTY6=~u2h_Fo) zoi8pKH`CgmA6n!mftVA_XlIdS7r3~gMaOl%n)LPAcy$3XESj2I^_kesah_8w;;Xs? zw{u^Ps>WuOz$}=K%*L=O9lcLJQjBMNT)k2PC;ObrCO8QnRd#pkz3gLM=(@YeEX29% z-DswHrb|lr2J}UB`g=46{)U0!K5jvLlnw@XYkd)-4*G8EJx(sPCSkU8&6u2nOMWc*}}J ziwNDd>+)7$@;d-zL}Q@98_mtUSsRSaPi`}F{+-XFQ0S9&T;PKF!o^|+2eqp~mk-<> zuQ+A!!vNVZeu-%mDoo8g}l~_8R12yXPd2tB1?OvVi z<@x^5UwezX)Z5+7n-W|TA515j*;iVfS;x01FVstMxfU+dz#~e@{EpGqU(vB)$IkTL zD-1STNW3>Vvl!dx^Std37eL0YOWW186i`QI%)r0^U?4$c5yd)mzhEI0O75zttQ}n& z7ZIRJ$cKh_d1E8wV0Zd_u{AljwkdzCP%TdQn&V{1S3Sd&{@WZ86vMeW{xxYO62-wq zRk;s}mc^#KY1{zJn6!6sSxeVF$@CWzMfp(4D=PK@f{Q2m0R!!PT9>pxc(WJ^U)Ikr z`f|>+GA-Dok;?SK8j+q-(X~993Y{@IiN!u!C1w0Uhkg+zuXzCNmtQ1u=63`g{e1!@ zo&Yf;v#d<>;K74PF#wVkC^+~?)+FZ)sSbJBn3&tn44jS>wEI{L(dRVCuu}b)wYLKL zhdX{c?eKQR^*#ZGB|Q$z4B_T#Dc;;zZ}2FDRs;6YfINqXhm+QxlOg`M2KHuPA< z^HUS68g74|TaTGiW5pG86?>uboz0PK@L0)M(WNf+LQNAI^HQ#qRa+k}*VEe@-EhG3 zamZg2>?5GkQ!xzcNab%Tu5ww`o3=(6(VUsp9w^x+Z=SylDfqc$n&s-ICh z7<=pr)Y7ft_YfWfpz_7W4aAtv|Ik;$jHtkgg`pvNwwm}9aa!D~s-U32=>vrZ?#o-> z$xVcUf`Fw6qW$q>JJc1osw1H?H4Froij_`z1m;Iv2WRyPcJr=x-)vSr2u7-#$J+aC z;t>*zpAl|6B*a+(3d=EYG6)a(Vp9NE(sOL#`_$H^aplT=L?$|BtY2aw4VW#v-%so& zf|SkA6z@X~^7-a0L!xR})zKw>X>#iJ*+W@?6+t8c(S74@eiZB`AA!zJXHD!k=ZKGH z0*6@wF5rLDy6t#x45Xbl#aHYMg&-&?mucx{T}+eI_8v#X#!ZB^%Y9Ge1N z7FGzW1w{PGA4{zOu}f}`ApxcU2TYQVmy-Uxo_Hsy#CCrsIFC^j+e}%g-Sq+=It?@= zF;m*vzPvtAaRo!4YTERC8Z?B|&}4!WtN6?%&>`&^slMloYd?!ofeQVr8*x^CaX=hE z7#1)m0X+>B*#dBiBcAJeh?x`e*m#`_a=7}dadTb}Bk+3fcp#;}&8Y+pZS6rH@pY{Q z3^qlnOn&};^uAhKE}&pE8$YP|_T_cO@3RF##&szp=SSLTOh#+fzUs;Lmy+%_(u4fNjGP};YGvj5~JD0LgPytpI@5Eq0sBGcP2y8JMHXT3HL zDLez7KjpK?$J(>B{w0SErx9If*gl0*gdzmwP3Xq)B_h^`Qa_WD_jq%A`+}6v6_fDf zcF~Y7fqTn+g2O=7;dA@(&B(wTj>O<=BVXuZaA}Db)#)?vu69}Y?AAH8I9h9fP%AFh zaRE#ZNd?r*oxi-cHc}Uaq&@+;Dyjx9FFSyYH;bDv8xDgsOdR-1qjSK512+y zPedB11JI)Hz3t4dTc(6{+W2k+=2+nc*ISRDY;F&B(Ydi_uYZ}ItWo7+0y%ZD{ zFNGp>iiDk&^S6ge6e9KAGmxS*cw!8;rB_&;3Jx`JM`4@5=60`U*DCn7=z5E2PXC4} zL!WSs%(Q0vI?VsHUY=}0h+06GL>NU#g$-(*9nfHK0fW#K0F@S;yorTkjHm}d0-irku57t~4l-%j@ z9$uD~8S(Bj7m$+#_NKc2y6yi}Gjbf&H!^yOIA=pH3;nH6Y-@s3BdRw|IBI^KE@x;vW%P656&qLcCId^+R#$)NCMIF4uY&rt|0KGVJJ7P&tN@G(x#@pNujO zkB{fTRE!4;uY3*S{4~DwqH?P@&meEQE6sZ8>j$uneehhFpflVwak?MZ@m8n@tVzd& zgC&UaLS1r_u2wpTG6Rr24PgJ&f(?y`kIw~uga(j@RP62Z;bP*6gRt&&-aqXNPZq$E z`nifZdDV^*U7enk=a4~j@81U5p?CXjmOAmWY8Ds!X6f6M-G8+?9-Pb@8>wg{`g-Hk3fuzFV zI{xC2DAfDUz}PLe9Tt+eE&~!-Gp!GC!{edm65HX-Ht(Hf@K~%I9K8sc4XQEAOMg69 zQ`1c|vsXxw5on+HcnZ<8I`mwMC4fiN1XC4*REj@x z5y6SWVClf#Dgax}($X?o*fkfVJI-SEsGFW!E_$GV52P1UQ&VgTu*i^00`(OsIOLXn zC8QO(+b-e_r+1-zijH0LwFIR8gFvmq>ph>qB@=$Io1r!(O)ioDRP=4Rm4^G+76D zk+T@2cn>7aWDR{cX<&eMLLXVN)3gde{mWJV@$88EI$vEc*I(hB1<_N>dMzlo(Ie9w=w4sjHj0EUczN%!bh0pc1UAs*1+Af4P4cDq<_Z=CTHhj17L;RE0|lI^^`U za-l*V)~4^-jQ9vsh)5FRJ)wX<*?@H0&LBi%SO+u);VIMaZZwpg2t+J*2@eyKBoGHE zHOLLVZnxQS;r_yQUwDzz2=J%^P<{KSq6O@eF5C1c0+&J$iE&r^4D#ZHUE^0akxUQ` zhOLQAW{Mk{dVjfXx4)A%g!k}5);_5#BWQD{})l-bz3M~EHkNS5vC>`X#f zT43sW;XjS_B`+ei8$B!p|CAah#gk|~8z25XGCl%ERNlM!o@lbb&CT=IUm(l@&#krN zxJ}slw6wI7TcQnDu66$3>;*lnN#SZR0}#A90igp+EX^3IZwC(YQi7{TshW3Rz$5SN zKJOl2pXLFZ8Fw=QAHKN+zgGe1blr)a&p}q zn(gAnZlFvcv_)$Jw}}Yt8jo_9#gQEF@YQg`K%K~_sHnhK?PTQU0~6Wtz_b#mjf-jn z*LvsYl=$piVcWv0CeS<2!Mj8_?BFT^z3oCcKfudaZWXrs*e4RTpp@k{_u9?RBOc1V zP*ah|78Di&M~r)Jkfip%$w)>p4MxR!J(N^%7qlsJsCmqAjtN__z+z27Sn)u`n_ey# z$9IGPKRFEuFnabMC@N+$vzi+aiwUqjyMC1>l<^=k@A$>s zgnI^*bTcuSSM!EAF3)xn9wH5t7NtmU*~o?e}8@WLSO zf~Ar~7#qMRIm)D}Xl_@#T>@Mqq}+o*KYMQR=ky;Gkwo@Kmzf-vF)+Pgl|3lyt%b#c zPzqcUNKrH8l42oH=5b}6oR}c}L3>{42VayJXQSi!zjt;2l4YUkmWkr%&Z`zIRdeLr z+7^FIgEY0Nq}T~#;jKRva`=6j@S)JucPq=xn4Me#q0c{01+l%8vzivm^xcVMhUCD5 zA|;MLWf}B3A%(n#1*OF*eY<9>>y#b0UH+L~!}qZfTNDFCY3S+g3WEz&3kbI&yta4e z>X@8dXTG?raX^Q{?b|tEXwa6;FD_lm;*63K#v|k|Z2v#dmZ3F8u)#v5cM6S(dwXs^ zQ_KAJ6)MuhKX;P>X~U+_v^hO(DYN)E1?6pCD01QJf45)3b8xY~n)0|}D_eq|R$5k{ zx4b(7{$0L!-n%C^`aCn{a@|YERS>Mg5xyhBKgfn|*s-v9)S#CL7QY9s`+s$zLd#6jJD`0u~wyr&0*XRDW z45e&9Smm)$Qwk3YI~gVvcKjbMLFFtxJvCeP;EV~C3#PN?mH6~irW5JxO2+o4R8J(z z6c&53yGlO!lLtCsu;=ccn#um0M?6~vD9y~m!gDli>5p7~mv?vun62BV{*(W;*B%{d zW9f-XD-9M)ktoyaxxI*+An@)n8J&op(P2yzZJ8mnCj*qmKYBO&#H?3Nu2Lbo@tK18 z)OOgb4G#LX%`71Hj$eY5Z_A^R6$&a1#Iir$8~=9~=Kt(=>AQ!Mr3x|AD@ARs{Mk@p4(r7LhgmH6f>or)%o^Lz5wco^OZN1bM`?k}B zd==o@Y8^jzRpFm(juYFjsfiU6(>sb#3c zy)a;kYX99Lf_#NaCXZr9>$e4*d+icJuD|d(B6HcnRt2I8Ae7EP@;+$~Il!X`w4cd5 zj%nm?JYvr&EIcG)YheL|r&*wJAOJ5?I%NZSMxZKlY6;{2S$c`jOt`H|C~_^ou&ufO z@^4~|dcz1+a|jx-DbPuSaFo~zWZ>L^PhrNu{|4S@0mAAW9==U?zN=s3-{E;ilBDPP z*07yM&#giba1LsR=i%X+x(Z)GkmJ{*Hl7S&Zj1Z7Kq)R2A&YYh3ka7Ruw556PR=%{ z)ywkYV9GY72AR%3BgJqQ(N?D+#-y3IyF$(l0Uf5HV)GZnl$3Tj>bkKo^M7uIfvAql zwG)7^wZY2gb5M6x)6%*y-Cy(W!Grx!oxk{>97c1_iFVWt5FDfmk8}`Vt=c}zA%$#x z$$wWw1;qwmF)%kb&$F!o1`BeH4qLIuf5RHo8}9$Sw!)iiQAia1xrN{B=iQ3ULqKHi z5^*WlrBo-o=fV8<4Ll^9pMh_(vb8NKiw^A>8OfcQvBF>*#yg-!a50x<$;sI{3UJ0h ze}JMCimP{B7_A+h(~jjbdhqM{yLfP*kcwRT-)}O!{QbfjX;&Z}$k<~iKoa@$rw82o zbH+ZRB5nTPD+WVS z0DJ62W1z4D`4oh*!iR}zxEew!AtoJP0;0%Q06A2kBrf%r{eU9j-`jFZfCfOMc?NU^ zgdDyFpf3QK2ts7&FMi)UGGa@Y_Ue_kX5+_y#cb5k3)Bs+3nSG-b2nn4$q=Br4;0Lo z|1GzVz{>7G<@!eY48iX1VmTT#AHwck&3#D1q4M@fkwOkbK^Z&w?AKC4?Q+~gMTxq- zUM8j2yo-0m^VJ{4O(o*frFznY2Um55Gt;wj<#gCsHLDoUqMsct4>LK}c-@v~YF#$^ zLdLU)&%T*p`<9nJj@wVh@+2&a`7hCrhO|wg(ddUkua}fo0Caq0e(v1)^K4M7{3aF3 zNpj?2>4m>G4po07=tI)`_finDSzB*ZyM(3#Q3j${EIO+v6ZUD?$)_i(c|dMB3m&o2 z(vM#HPo)wSpgC^3*$Qwk)Z*o_=M>{F0%gDxTxwogE>a8@4R1Tbmk8}HO4Fr|TrfK7o8%SWSv0n4)g zOe9ym^vsVqDC__U4vU6d1x__QDJS{AgJP_E_38sa_)ZBWd9zU>M*0_W-H`OaUyOiSaJ%AQ~-NoVl94J!ldE0=P7>^G89!^ zt2%NV5LgV_dXl5hLpu%_bwJO}KaX0&2(XI-g8Mzh4DJexiH*ERGd0=5;P~G^KFiSK z1$@fx-riSWo?&|cN~DFC4A?{qInSg|SORrKLE&kYejYTmP{gaLLk}(j7~rpg1&p7L0r zO6@>5QYN(0c64;?wK#ux|33Zo>pQAE3TW78z(`L@PFA?VKGWHj^`7MH($p5=f?IUEv)di z2p?Vb74qf{ssX+P4`oQTR##V7#ETaKR&M8_yCUbW%gJ$FYW!G8>;Y;Jzkc5Ilbtz} zh4kGdh(}8UYpKqsK`~xL@S5eh_z_d#)FtuckpC=y3Xt%iZJTK3bBFf1E-s=tDA|uX z!VUtMV0Ahzfw=4&ORJuvV_{0XL*Il$RIHha^4|>6Cjf!bVPBoNJ7Up-TXwGolXbeg z9ICwTi`DDj*0*E@dfs>R^rS*QgNY_-N>=&L-$ETA71Avt_*)830`{TJ$geOnmV$!s zD%>hO@AvdjJ1+R^znJIU2}ld?F>IkgbW2nVnq;8Bt^>bt;aC`q)_wBZTZ^ z)p0TsQe=~3M@II(A1@`o-`{;-*L_|0Uw2p6^*!f&eLmjf^?E(WV?6CtRA?SlsiN+E zGT+Hkyg$->eF;#5-;^4DKwHj!eMYzEty>F_azKFK-yZA%xXoQlyZP#0Cm^d#s&W2c z#4BwmWdL3*6lyEPz;RQ6D9ez&WmR`rWfzv&B@w*IFDIYVFFwm-VmMWZ9(uE9hgXsG zqwcNe1P#>G{IJZT(1}t0avQT*?~|oQZzvdXY-z(5dOUk3)X~)yF;shwtEtYQ5~7o6 z(u3ow7XFjHetMD;(En9Bga!tzENm;9kt*$H`eE=fHu)!XeS< zRXhJ9_wTFh>MCP~Ff$7$<=bURkF&EY`-BXoyi$*avG`WA?)IZ-Jqg=smvDktu}M$- zm!O@|x`y5Ns5wGgqty}lmQj3c|^Vh#@COd>HkrkZV#jeZ6$-kp!NHC_< zY#paSf^7c{W9k-=Wu@keu^yB%Ki;HE4+U|{SOFofDd&(gKx``uy8(9|_>@azwM%_I8qxbfH zp(Kf!!J|ed%@WpIR)?vzR`Fx&_%sU0Z(N%ZTjnZL)?8EFIe(J2-JmqY?7ZmxH(suH zMCblc9Y$Ukhl>2&KljQwsGAFT*QOp_{H<4C_Vio&b+unN8|ZeN40&}%^-t%!?^HEQ zj6DwuH`SsE84KHhR70;db1yjJVjH5py>Cf=PTsw1QZ_0^pCk2k2lRgGY9sBzQ0LHm ziwe04ls`WDetK^^a>-7k=SG)770ZY$?ct+TKVL_8W^XZH-_twzyzVoFj6F^~o#_;K zR6+ikZZPA)Qm>Q&G=2PA1_GNbYjy?d?(j7F`;GCaR@qnc5pvlpHb1<0q<@hMur}kh z>gb_o?KZFUAI~&8b58Pp;@TXdLd#Fg>B}}sFO;R-%XO}PJJI*p#1z6+d@&^|I$AN3 zrbJuXa4#547@FdqOtpOKdvcfZs;ErUa%}u;YL>jBo5!1u=Q6%Fb8K1(e6+|Zx0nud zM{~6U{QUekGNJvE9<4Y0VJWN`HpUjV6thhnqit*}*8C9Ja5lMCUhx+hK0e_3IY-6) zeII)qMSX*goo)sVnh^oO}KdsfT z$@xJj-}_zEg!2Qj+1ZZ&B!V5!G4o%aG4DMLY;JSR#Is5Em>*UI1YHQGl<@v(c7D3; zFFki7QRih32CeXYpSqv;QL@f-@rG>peS5jU!JN+DfopHkvO-zw_RujE~{E zh=^G0d2AwjU%KlinH(jS1DwqwB73CTnSg*G1E#T${pSU#*uUM{?0rjCfN%8$%ZGj9 z`8Drd3kp1pMCZMhjwHU_8_hOY>2UF}v;ROoE&iz-=_@R^-rz&*+M+_+x zD_!NSr>eRW*{7SE+jf?f5(V#uJq6CLoqh{NH4M>cP640O>e$D!mt8yEZ@(i-{oMdK z0eQ#Pr4->s5HE0W^x4Y#80cjq#fO_8^6c3oOQllTWB8V(taODr$gpfLjpU5;h>PoO zE|uXn+se4~Jq*$TJO(hj-hnX1sT$p#H{I`hdS+736je0otD*x&LX`o;zb<)_Z-?fP ziJGBncu&kR=7FDAyHmlYXL{>ygb(e72793sG7VCRSZetWH z&?9tdHf=IR*d*ZUzin-RE&G2MNR~tcl+Xr1ssURi(iO8zPe4o;8D4jWpwZv}`h(v} zTriT8`DU5`-;o|MAq^np^P7L*B3uC{;OfwfKDu$^=cdcUWk`Ko@>1b*K@b`AO^A{+ z#43+bLL$ig3Z~K4K+X-wfn*@Lkd9w>>io%N-lF0%KosJmg7RuJ*U9@BDr%jY`PR7;A!~)V}f*GPM_;irGX65%8cIw(Gjp} z789SFXv6OU^02{Yy4KLA2Y84kQY(0o2z(SDGa3C%53dnuER!gNfk9NM zAZ}a&wgE<3f`0Dvitz}SF)bpN*Ff%j%hS`A@LZ5rPk{+SeolOTW;lXVIuqz0;jRF* zCB_ZJD+A7thYf6i%hdzY0#XGXI1|27MAu?${0%4y!QqZ@5+Se&Mn(|pF(Ox8Icp(J zJI!Er?%W*;I9Ztfh6-feX2YkOAaVNohe4pMIX5nGHkiW6Gwp1h#m)3iNGHRhl5K8q z<>%&H9T;+`0{TX0rQpEBIpAl~Kr#s50d3m+A{@pQPGRUoK|lWqqpQ()p;3^ZBVX?3r`; z4IuboC=o>WkVm8RulBhz^60`GVaMPVZZIIM9D;tQoh_jq1{(+_F2EsnQ56&vWEB-P zK(1X|z%Up*K0XV>@d`0;53LDN10F#d6D@tZ>Y+1t>+72XtC`{%Z~Ck=^~$e$`}RID z38C?W;W0RT@8jh+-$U{#W=C+w1nm2D!8R;8lT2U$qM@o%EyO4niBeX@FcE3Bc}9vVqEJ348DG*R8kXx#^2!qw3V+D&s3{L|-@bcJFh5JH?X#IN=vlS&V zDqKxZF99f-G^^t=!Viu_0)vVI$s6}f7&hAA*rB571CC$LY9(lZ=2pz>CE*JEGYY4T zF&rzafx_F4bSsOGoouPo*XRv4hr#0hZs$HFfG=q3gQz(cYzVFan$8+{+YSck@=erE zcJFIMw|$L{PD*|7M28XwtDYMv#w@~z>>?G>EP)VZJG22^bM#qns~}wmuSZ0 z7jv2IHK+jtPfbN-2UsOg8fy}25gL({9&)UsMMhkc;tghH?Hez;OJLOwGC)9k=J{un~Khxy|{}iNo9wGK8Od;^U)bRQ1 zO!F3mAOJ`*7X11R;v;v!p-Ts)YB;a+RQTkfxi7)_K)Hd3Kf+;%zyjI|!*n0={WI3~%liNrWJpXaS~H0Sy3r zsaO!?ZUjb%wV0Dru#G2Tk|^xaYa&kyq1mbZuJlNisuCwRx24Ru1oO#^;XW?6(+tM$ zi{~Gmi-7ZZ-19LLT4YY&KuO2*;`U<x(aoyuP=i=)9-|A_+?k2oJZkzL&gISkbNRhH(rc zv&jq;=wWq3l;cuTp&_V$6ExygR8>*Vj@6byNdN6mVIJC{w?{Lt-G1c-w!nVTBmW?E zS@44))@_zCAExA%9W-lGPR`Bb53ai@FaKlc&YiodDJLzu1mp)SB#=y1xGhVjip_4X zvs!umJV~Y$1_r9lY{P4WaM26Rs`mEw;c@}irAm!=#qr~_lP+h&^wh}*ZayeaG^47h zsny?+9-6!i^EjmVQBfskQSU_P!@oB+4Daj|k=`s{B$0{aRrF6CRc`rD|#{w$$x|JKBM$Ej2M_6^*~)JwK;4 z_VscZLw_y1n>`Z!YhYoxDz0w&d5P)OIYz0#doIoZ=5%s&lOwji6T-QU#E$llMc%b# zzfx+~GamnHroB{T*vzR@ywL)JpOx+HeJPxkF2P&@kGJ2pnMw&mGFU)6pYw3(Joie` z4wF@w+e%g0-LC0Uz)jNi4^2%^+zMM{XcmHjsD&gVFXH6F!M=-%k&V#HFlBhPE!%a5 zC#~P@KQ3)TiX|%)pyK!r7e=WQ>ghgvHvTF@Q&CO4Th__??qrN&m?lD6JAcBtXtl5E53U+I^EXIb!eerjm3?-m+b}G{f@7d-E5p)$H`ER7 zMNM=0C=Ij1)EvM3U~8ul9Qx}WCZ-5w)#1G~N=R8k*sqA0o9->uMyU2EI3aP3ellE0T{cyk6eKWIp)zNiI)K9^V_fUX7 zeCQ^zCJ8Nmx6?9b1Y1rmEv?^v=X(9-nby$7h`^DUU>Efbv8`3}{--b93tdM~#chQR z&UoI-Ns^^K+3cQjVBmyB-;-gcOac}lLiz;+*fk4t{ODP!b9)inzPjoZD%?Ot0f{Zm z^qc&nN2+=|yyqVVwOzmaZs8pn#K%s$Qf^YHcFr{G)V%nhpg)J1M1Mn13Fd^v5wZL4 zH9TT1&*-l$wcW0+Y9F0dOdoC7v^L|$`0+Z`jcf*7ntc|+%vmW7jVUJ|%FBDmZ2on! zx=uZ5Y|PN?yt7imc~`&FKNl3~C8zoe_vqY8;fNSdCm|ete>obm{8wIiFCTn=rQ1|~ zIeH%JaI1h|?(TwaLDBM`&-!j;9(*#y{yO|&T9v=-1s>)Mz827QAs2(erJi-kt`zOy zV3Ac4*>#JwcDfgDYoBnVPmpwMe20KQ{tm0s5EtW#(`OmB$7o*;EatV4m2rC2C-mr_ z9VYS*{-EEy_oYkE)AEhykuH5J)K$KO{j}7v;!ribgl$3j%Y3(&8GKyiXtYQWc4a&~cG`qp z{EP8>1Kf*EL)b97gz-RG-?ldGoYELj&q~nFGz)t0Cuc-plVZpIjUZc-Gbu7Ch(R{b z=ATCC#dGnh4Mq+5LmE&0)Yn%9=DED$#w;c#rmCi<;VUI*$OnhAe_7h;bfJ$>Z58)i zlBFSghF0UO^}}K{RaN@t^5SA%KI++}%}pmHtr4$|`Dhzlxj8wNc^UZml-qk?YGGqj zF};qSo_-TOy&*n*^m~Vnj`wE|50BOkb`0aNote03^V9JlF!jJu!lCPa>-#Z9cj_-h z(mn14+o>e`tLYUGR&IyB)t`d5iQ^NOynkt5(5=0Tehg$ce@Dp4%5MA>NBTxauz@$N z`k6un0WU>6_KDk{F)J3I$OTpa{C^*K2lfFNV)BaoV?h1gGqo~omZds$#kucVM1*D`VyD&SvuY~(FFZTk8u+QRnZ~qwTD;T z<$|RXfbLWf2B3mbu0#V9ilnQ)^ugqOTnL&m?_=BB&k`(a+12jchMxuyPK(3?jLpky zZa>zEC#M1zlB(1+PPdgyhw_V6nB_w}1-UkRQhK^8A0b)+1nORM^9VTjG_pd7RugE= zQV^hH*p4p;N&0S8>gA4wJ-|OjmUmqpXRL`}M3W_ff(|cRr+7=7$_=PN}g4R0}0!2Z~*?w#%(b}RVv7k?{tv!h+ zDY@)g9=$M59o71Kn1E0>kFc{dX+g4>69!%H8QPHNvK{6}0T7AC3vJ`7pD$t9IKIaV zNCx=5vNYuP?RME%2olS7nb$+&_Hg_-0@dh;ckj+vKWx=hR{p)&Sg@sd`6VA$R#t{6 zz;F3BXodcNVdtQhR|WS0h$GLkC8&(-FA=&-s(7hx_?$$xjQx~#Bt{1a@|8?1TX?7b zM0WzuR7`lq* z=xd9-yUV|m2AUhna4HQpUsymAHj2nuaXw0kYUh(;1Gb$fc5iIPY%yZuNm3MbsNA)N z*w-%I03AJ)7z!HZN=EQxK^NM4FqufvJTc>z;V^)cEeYlYn&d*&`5G?m_ za^5X!TRi}d#hcEpyO#1>I$kXRyJ%wVA{acekt^60fj6=}qQXQYN8-n8FBr#1%R7;> z_+u8z=aclyI;B@ju(hDADu{5FOMM@vKNH*|f4rp!wUxxg$LoBm^4=y~P2a=lsT~Ep zq!W)=J?}Y83k(4yx4m96LQxIFWQrVFY1K}^e|2h>; zB{-$D5<0nSh2DDQy(a=M35oEBRyUqr`c9_1x*E_eq1kSTgNhK|^XvfyVu25>&<(emi+W`*Qr}nG&tdOh7!03RsC0G<2-y1lpjtvii+DTeH*-ckI5F8S&7gBuc2D7;lq(!<#@6uiDJSo1) zf25WjMN-(Pq+f=uBibu$%-!Oc!RW%r$M+nw8>Y){w=P@Eylx`_#wdJE#4L>~?V}l8 zl9Q8(IOu&3|Mvg<(n8EJBD_u5SNc`gXO{B~i@UgLjiBp7Y*N>|7x;5%*DhD%SP_0(^NeX+k$#lk$Ry{oJ`DnGoQlDU(idE8Z!s_vpw^|&RthhIPJ+nmKL*b#Xwp7(&%mMzct#Tz(1O+BRimj#fI zN+Q|oavh#hlV*~&ZYMMu7p=CbUAK?(oQD39Y)VhrubC2$ZEu^oJ?p-&VW7rA6=`OE zr0KIOPLzLaPde2@SzC~Y>T0X}r^SclKr4o2XPC^phF$xnI<~Ge8?+s*8}Q25b5KCL z|73QbppECFwbH&R%C}cJQQ*LqzH6YNIXe-L&ALdm@}t zn}L7X>oxdS99-#pPri1(8}it@}u(#y%PKocG4o&r_j#x`P=yWr9wOvsd!Z z7#7X-J?qS{6rb(n%$<9nnY*ucgeyjHMj@av*>Jq&(yHYbuU1_f>st5uZVj6s#b}pw zuXmEk9-ivc*8A7GD=Do=>zMpBn7x@}msF2?O~;-}ql3bAPluL6V7&F(4cDDM*2P^Y zu|KW2O45sbGIw~;(LZd6)4kl`WU>&_R{SL;R{PU<ohhtN@xJ4?(WFK)=}jf>0Gg5vJspF@N{85~Ww&tS zONc$ws0YV3>T4zY?u;Y_TA3N2uzLGFN!PrL^9{y!Ua8i{v__jYX}y;5qET{fBacr@ zdmfJez`tRF=O;qAj@LQ;+N77Cpn3nm zS?jprBAzXa`$V2WbiCTVrP8h}P}PswWMF)TG)drbux2yYorcfEa&fdX#A-}95AKNj zw9{mUhKB0lpa{BFIw4b|n~NNoARMTG_`3NpTj;-05QZ+>vTOZA(=GFPkVA20HY_l^ zp?_S>Hel7K9{qNkl-`{UZRngN6 zBld;pQbCe)6rDzOLqo&-ac3CQC&ec|mn9Ph(3!IPF#Sfsw%dHzmqOKdJ&}Kf@iLFSi-DN1XbkN8;7f;{u! zL34QWX{Q?BCc^83%??L_#M~3MiPm^>5?DX~V?F~I#Urgoo0PZ%I{oXxk%o(u2zIkB zo3ntX3xs?E6`)uB2p+-irLX1+q26g^TR@(Tfp1Qy(ub-D4K8@z9e^#%1%SpZG%O=`gcllj}XPQ2M71R%_T{BM3iG2Wq zW0bC4{r2s)0^X?^Jt#eX^49v_H2DQsq-++s0IZIb8Hw!Stj-f_jVYlGB{?_bvtalOZVqAm#`pL45AKhkscCC7N!UeCe@=HCHYN}Y8K3}a z%?cN#A;pkrqe2;)ggE0{()AdCijO9zMG_+_yNW(+`5ke3aKNj0s!+IkSOVj z!{=!%q|7qY93Gzwx?D_Afcci?+i~^5n3hA*nliS{iHBXSo-8Xc+QKvUF*GaMN{79- zx5}F|1{6j-?TFnpQH!OerKN`F1EVYp6;_pl%ONbyh$AeqC5LnO3qH8ejl$Tz8$EVk zoX5z?W8;(ZoL+cc$Gcg_KZfQ$ELNSUFy==(M591yN`_t_<02-nlpcsh?^Ja4s*X^J z|8XqHP(;HDsVXt&&%joCY=Nv%a(=QR9roBzv<@DS3k_F@YhZ02o64RRwy{WMkfJEb zeCJ3p)HZL(ovL%Kk)`F0=cm|KZmhYV2k~DdlyTi|TP+zfxOVcfmzVXjIgPr`jX2j% z+-5E-@evTNyfcBZsf&S!J>X@2_=dKs9?2h$-WBEWUaE#pg^FC6dB(N5lyUw;f{uxu zSSZKzi8`F?;<3>E_CV08`N`jZ|9yaUnn=tEKv$6mybvWji{uqu z8c`wjCgtm6vl9;kSgcpq)-p)sBO~2<(6S1{9#EAMaF8g#Xp#RT(24Co=#jdtKgHml zhuIUKAm7A+e!`&zv7em4;I7Hhh(rr)^WkOp|9dZ{6GENY!{|dG-MIL~ci>!eQ-O#R$*bk_ z9(F3RKqga0h{zO&t_o^_42!x2p*=Q5>qX0~4oEQ5WIzWXUc6`-kyzk8Q+9g!lWwab zLQ%;4;y?~g%Ab2qWbeSB>?ru_unT)f71Q?_bY-R+{4Wl^=e&9~3$W41SV10Msz$o0oK&NwVxBSCoSzzJyZUS9{%!MHsEYIcE zH7?%blkL8!joya}+wg;kKzyEY#<`SdVUeUG$HK{NisPjodgujCIh#W74Otift^vwcInku~*f{egI4 zj&(c=%WgtqLDOc%=q!NE9-yXis2WKV&&qYW0b#zijgSazi&*T}iYP((yO7vLMZqCU z0nCpo^cq((C&AB!=o?qMgn2B1U39?TaRR5qEP*sMi1eSJ_2lc26*<9}Vx>SKl9w3Q zsTfzHYygD(uw`y6^ZDnD2Di`!(|ds$-A9k4eLf)t1^7m+mfgfyot7om7kOS=uC}tb z-C7`G_rFa$CmcX>AcEju)@&~RY-irzm_yohJ8Vnc`}{U4nFWY7!gKeApPJPea`^AlR=Nj*WYWdULio4iEAxw3NQ z{rzhr4++)Dz%pTlcCb|A)Yx*1ajk3g1CeUKy>D%GS@fro2yY&4e5uAAS$b zqbjxt=fQ)TgwKLQ`7zSRuQUprM-=3sn5&}$XqkAmR|pw{BMe?R*hy&bKZ0mf98Dqg z_Zn?{kXu(wG!bEe3XF*yP5MXK=7-p@TMZ)C9!);qAcz6!*q*(>bqOD8nt6WQb>3c! zD?q{(BFr&Iyl7qqF!-pdVz$<>7lJdpNP!X$wh}SU{O0O(J(ts?2X2?ztcTnZzd`Um` zOU?l~@m(z#ITeqWg-TPAWpE1W`)<`Lh-%$^NXCG)2e=F|&>4k8h1Qk%i1~dmYyhA= zHRCemX~10N65)BO_$^0xcyDL4$VQj?l*GHsHk6n1X6kWOU0P&Zp`w4ydR+d}`I?ht zpP^@IY3X19uk46{ulx*hzFx^l%mV9c6hyUNq$iaigJDblEfG~)r+eY$FGQ*hqDQ&t zFsM2^iIkR5skrkd{{10oA9Z11+(T|YzT}FFXm~-1 z`Xy00f9}GvXi5L~pIZHcV{2A2xf{I!!{Gnv;MSon%>8OByp2HxfL8(m@h)&j!mZ7) zJzE(aTtV;YCQ~w8!It`j@L36A2`HGOLq%-nfI5iB&kBD>{8K%)3>iiB3EJgGNAX9H zsu1TO9H}bK&e;SfBwz6XcnZH^q1P~z^X@U`bF?bex$wD=zm6?M=~G97!r0;))xbL0 z;I5;lQZ2#NCh>nAJd_-Q%ZQ?%7$`v+frvv)WH|Zwlu42aHa{6|CO%rFivMS;T6ofx z(RdQ4@C)b>X7<8Drbf>`3@7y^GA<_wIs*0a7FU8m!Lev$aDONgOqWEPX!}oOFj+*2 zVQO6(G~x^Dc5CYtGL?&X^$axUS_?6E&E!-Rkyh3}^mnR;or@Jc8pi?G{8t=%)LKA) zWw!Ud_(0*_ppB2F^MW~gSLHuUAo&!=9<4jr$eXg|NWRGPwX^TrimE^MqEAxUDd5=p z@4+LJ%QH)_I$y)lNmKCyZLiJhM@w@@**X3`$4en0vI?J~=qdaC)`R}?GU7k|oBGoC z=$ue#`c6sIBxW;^e5LAr^UdF~Nt_3E%yF#eo}3E6H?d`!1bLwdjTIwFN}6$d&lQ{9 z{lKkQqsgtvFS^++czaK5%fart+1s?plkV#C1EY?wJqGQEXFZm+4drF>XKQ1m4dRro zl)w0U(x-QR;jfdLigIDt6xQT6mmg@BHZM~lFA-AxFgvOIL+H#&U*C0GmzC@nb4N`* zSzWTE!kWZwsdlnyAN0c|!e8HC-SaV7@O+C-Onqm#{g+qAv}~up$d`oycdC23duAV+YG$CytCLU!A zKj%B1mh!>u?&b>W+t+fcn+DQ?gRK8qinVkjSRikCS{|!9o_DWPzQAhSQD|1yVT!g` z5Q`CIS;8_CrL^~_soB#Jb0~l!g+0&rtvP8qseBgyo?~ZL{&sWUlX|ZsySE=SdC$M)U~*f7@bvaX z|95E@6FG|JW+`%AIRnBz^8?f2R<7a|KfS%Wc(DEd^iQuxzvUt?vNRJkR1-8>F7yfP z+_{sHmGw%~-%#p z{J@K!`E5Gi0QJAd8j5hxD258>KfmDo$KE7bS+r)6duTs;;l_iYhfT^)ClD>^%S+ArcjND|*7 zi=X}J5Lb(%h}>msC_KLk9OO@dacyd5=Jb9Tya8wiv#)vxX)eAldUQ04K?-ac$uSb$ z8n}3!e>%rU3Ae=k-2QL$H=;|>M@YF;V%3^21s!@&U z%>3!6k{5@vfZ_*@^1d;e#M6N zeKSs*zOi7ePDg5#O0tOs#jIzRnO|LMld;j$QQF*`J4x+bQR z_tssZ!m<1xhlSQGE*9T9QGUN^`+@TCmoF()o#Y^x(PU+%9_U!X?YCm(N>%PaRg1Sq zqP}OJYLxn{XMN+la(#PkH&^LRf7$+ENy(-T>#+BFyo=wKKl0`6iMi87-ps6w)cu@t zk#0}TFYt~JG>5qyJxZlzm6c5UjCPBOMVGV*mT|$SmRc&+p`ht)k^&JGpj!XQ{Y2V=!g7adCw{GNTHPjGXOyafsIb>BEPa z*~TnW(~m~n9M8v8I1Pd%CD-irr<8cQxHz6`$rFir&O5W`>%y0sEsam=oM#rlM+vTJ z44vn<(wAMA!`5=PQiZEC|4l?hVx?AK$a=PN&)Hd9MccW>Jw#ip7VkLH5$H?7Dw=m} z&PfX{so@nV?PwG*DX*QrJv|nsT_m>UPlK;m@FCi~?ck~PYd3IE=ZvRD-dI^C+U!uQ z5!Kd7JzJkfDH*$V%|hbxvvQAeo^Pv|w`X0o*<{Isqg3yK$+3a#?B3A74vexHzma+0 zZ5=Pk>=I4y|7{lqja+dZIp-uTMWc{qVpdY_Ch#bhbATnRI@9pfwuY4}K81GA4DJ1D z)WDwG<-^M2>@s_fdaP~AoX1I6c(~H zE+oqH_|quT(&PG}e|>vzFCqnX<8S9$GU@dXUDioCO9fN;+L|x`4BUmI^dAz zN^)}VFmRj=B!)bc&H{UZ&dyF^vP7wq%!6a;GB=pkZl3M8&+o4#O)o#$C_pvhRAByh z8_`9`!gS#M$bB!P%}`DV-4{D_a~v+BI&S9D$>751Gg1W&W5DRyz8Rg{xlW^>Fp4+7 z1QcozgHoVJxIEz8QVQHlcx)Dx|3PpFke#d0+KFKq4$u8!Vq%HT$qqyRVt9bT8<@lS zfk4s$hgt`{xxBo*C)(+I*rwjPTaR>CUep^tyVztFQUK$)3{!yX#J&{oM0Z~^<;v`o z7!)psU8FnTg^r>lnjyn5Z!$t_DGS|fB@u$jp!Jo}KG_w)COQT`*Dly?zQ(9aUkZ-5 z5-3I7XZlPeOHsR7SF3AwfU~ZUuFay^3|G@m@Zd{XpsAlQfd7}wd9p0k-GPJ(> z^u6%SQX{L7OFL~hd7blf)5ArQbA0fH`}^4!_^38z^*`@@S6_b*BUcZg8&MiA?p%JZ zue`iGr%QaG1olwx8X7{#LnUKt!(nYtDe}w%!#?6e?nG6Lgg@HF5>YCqeYNOY1d)GX zo31VTavOtjZM%dNzs36t_t41jBM2J06iQ^3H)6o#WYfTvKuTSfjR|z3wH7%P$A*Sx zLA(C5$Tb3CzQuq2`gKRNJZ!q(KDa#ch)u!zGGhfLSkmTof=S<`2E} z?cDJFMzXZX{QP;ZBK^F}j(8`2WYs&iOg9IDjW1jwF>L|s0vc(i8y;_Q7(;9?=sgDlO0scU*T$HA@^V{F zGM-}>GzoH;;sK!bE_#b+!84isq?vyYKbSN7*-D9avBmSqgF(0Xi=fkX;N4v$KZ!|y zB1p7MTyp7eFVa+FdSF0W0u=HlS)NCa9t9bk>gwtmS8c|fKl6o4?>Rs2P}9lDDFte` z%bf=zO3+|GVBg>9>#fPPnJj#Z+NaxL?AKnK5>_%)XUR5MES&-`QH!SM0xm8tlcPzl zVStbXe){Pr6I+%xMrSkzCvgx(w6?Y;4-olM&*#r&nfbGylk1#I19>X2go~OvgdaH% z-LuXLC9jm|sD`g?xV#N(O*Gy-Z1L=*i|K(H>J1zQQ>{B*U$V37+-oo?OMLo_F*A@# zBcBTvu{CQRO|52@TpmvH()?U8#A^9+4;FtIbB&e~r8+cxJ23KHTQ!$a?Z<=lsR7J`s+8 zbteY0?Yr!yeWKG(zPbKr`bS0H+(owX(y7n?7#;YS6T3r4tk7Q^^)7PMNVNY}m6gB2 z;bj<@QBu0twmx_0+lg^X#eC1kLj4WFEC){`dQ)kg|NfIuz~1lw^?JOHW}T2RN?R+! zFQ(hYAG$Yp=T0h3V=<@vM<9trI2%Mbs?e4d=IJx}4<1lTpa&I+5qA9^&c-tW0w_f$ zBcB-<9+Tj?#>It^QO|AkKZEB*orc<8SI5z65%yNyiI)Eng6-4OqjJ?`X=2V37pCH> z@nGaXvoXC+lJd-x+w0HuM2*Dr#c1fOulnH52E~YQN)HQT$vA{p^ zPnz1TSB-);#S( zX8JDb7;?0D=drVAFEPq+>lejU&-gTD+njO`qNe0L+G!PmnPsu%l8X=b@ex|Zo3M~y z{AFqF^JAkO$nJ!Vja!b#+n=Qv)aQyKgP~F8GtvcmjmzR};?^v(voHLK8bAVPyofA@ zD_VIomq_+E25U;0cwQW;6%Yz?g@9IPdfJy_6B05!ZqpU5w!2EW?j~xrHyF4^{!GX@ zySrJ>_czrY5DKE0?%fPF@!o^>cF|(gTaljCrxF6#Sj2)jHZU`UoX^4o5+Cl0$<|G@ zdA=rE^V>rmWcT*+YR4rzCMQ|-)$S@Q)2goa-}OE^irQ*_czNnAdD^YRIYyy0%%(GP ze^&USZs=ozSC!dh*Y%adRo8y%kvyH0Cz~8(pOIm#97XH57FNAwCojr26<^)AmFYE` z4@+sl+}zr*6X(+dWhb*452RrC_{RM!x)?ZkS>4^-him6%NyZ-+GbhxgjP;S<-(B2d zXCHI^63;8D%wmiY(Pv~W?<{a1ZmfJ%ccm}r-N28Wn|{rD7`4k)00&3QjqVf%JR}Y3 zvBPT3;bSE_gSm^enG4Y?%+mW<8H(d~?o878;A<0;t|p6GMebgRYPhcRVAywNJkyCJ kz3pGO*ivG4|A$%Ed*YmuPXq@R<{43sD;`Tca_Z0j1`_, which automatically triggers archiving to the `zenodo code repository `_ with `MIT license `_. -* Create pre-built networks for ``config.default.yaml`` by running ``snakemake -call prepare_sector_networks``. - -* Upload pre-built networks to `zenodo data repository `_ with `CC BY 4.0 `_ license. - * Send announcement on the `PyPSA mailing list `_. diff --git a/doc/spatial_resolution.rst b/doc/spatial_resolution.rst index 0293a5ce..c6e9c3de 100644 --- a/doc/spatial_resolution.rst +++ b/doc/spatial_resolution.rst @@ -45,7 +45,7 @@ Here are some examples of how spatial resolution is set for different sectors in • CO2: It can be modeled as a single node for Europe or it can be nodally resolved with CO2 transport pipelines if activated in the `config `_. It should mentioned that in single node mode a transport and storage cost is added for sequestered CO2, the cost of which can be adjusted in the `config `_. -• Liquid hydrocarbons: Modeled as a single node for Europe, since transport costs for liquids are low and no bottlenecks are expected. +• Carbonaceous fuels: Modeled as a single node for Europe by default, since transport costs for liquids are low and no bottlenecks are expected. Can be regionally resolved in configuration. **Electricity distribution network** diff --git a/graphics/workflow.png b/graphics/workflow.png index f60f346221f0ccf0bed4f7c79081275b8568617a..a43f240ddd2433dbe5b735f97a59e63b667c66c7 100644 GIT binary patch literal 651103 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%0A>oPOA;^#&ExE1b4C?#5gurd^EK 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 ?7H&&^XhVrsSe`O`}WIwPuUGfycq>K-S%uWKrd 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%0D^4(TvuZ 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

-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 Ivgh>w0~}DO-v9sr literal 745458 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

xag z__$m=^a6#E5nvJgTU``S)<%vR)plJqgB2%gz#A`YJO*-RsagK+yt5c2zJ$x~Cv4X6U8snv~tK9Y`UwB{)Jv4;t zN%Q=%bHxL$3ols)?@C;2**bbPVP>UJ;KU?7l7E#uiIi|^e*f(FEK%#qa#VN;`Nhq% zk^HNF6}$Yc+~inOai_Y67;P!ItqoJYv!|5m>Ni}IQU2C-bzsIwr`Y)12mU4A3@^%1 z*uxin)vZx5a@BVBq$lx>@~MC`06f1~p}WXv^j&xX9U0WIXJe+c6t<9~7FOizH>7TupZawY zA67-oA>ifK3Q$gQWD!#P-o~Lv-lNf42-5^$s9GzF(!uu+*V!MwrKN{D)h%&}X)KyRPk!(~P|;@+@DK|;^vt>eV&*Gi3z9jkxmOL36{w^`jY;SiM$XdGizD*xDi@9dG56hG&r7(0NS)FD9rlU;M)y4?M5 zVW^4|9!bH}uQ-POG-g0VGu54G!uFZpo$s$f7&bls5^q#x>b?V%xRx0arZytLZ^8N+< zLnGgugu)Hw=b@w;Q_wdr*%lZssy-uQiYeE4O*}RRQk43x)4novg}zY4emT1*EhA;i zGCy`L?+Gy+eE|*?hKGl0Wno`ZczCp2xgSYacf|`aumB*#V|G#o6)}PK5m+sH9L=_S zNqeTO4yZ$a@-PVa5!sNJIb=>9u`4(n!8e{Gp zj!he33yi*PZZDo|*O&MazsGV5N6&B;8mDm=JoMUnsXd>aEo|nl#J)gfKwhA*54Gtx zrs1my8%uY$L117!}+&-8f}ZXI7hzr%1*e}|^Rzre%(hwjUW=wBQG_cv(k)+y1n z${CUjUk0OdAKL>9?R+aLjvZXP+7AxY(BNAt)SnLJj1M{sDrXl`>UQjTaLf2|VKY5f zLJJrH-d@kA7>a#APTfrF)ZQK$^r9mpv|ql5{nF<@0@pHL1~_%=fhD>|D!N-0#hiFt z{yMEiW6y&hX=0FFFI#$j)7)E}ZBVeI1tCBV%Z$M(4(`ANHq&!#0L>54VV<6l3882^frX|75Dww z^@}c)C>8^y-anO>(R?Nuq;_Je5H^p)pPF16&^acie;4{kDzRQ#Yv5Z%grz2j`(^N3=8WW$%-<50{SB*=E{YT=rMtF-y41S4Z7}GS4U5 z&RD=iH*6edbLS4daMA&Pmf(=Gn{KIff58Oz9SB(ME6z5s7y9Qd(OL-~Pu(1jXud^x z{B!HTgxOtzomEzQ9=!FVfHd4L%N&`~{vk7+Ul%?xo$!(VjJYZ4++b*gUlH}92mhZv zek!!8ehe~N^yiUCf@_q8a#&vqVG_!}b;V_X^>|xcII>~&AzVvo0mZw_I8@WHIVCl; zwOL|6uoh!d+-#GVshw@Op@TYa|)lqHUWl>YF zhT>+CTC?F!1LrhE1h9ojNv;>%8vMGxKlpo=F>q9_vP(R8D<~*ncW|ywF#kR%=^qmL z=!FfIokJ`+U>GBUT){~;GH&0me#5BA;;W`+&-q7~(G>|8LD|)DbnXSq6Yd-QPr+=0dKjJ2yuhh{;t+h{pt*+LYfM_PG*VqXz(!VR zdj3;3v&pGh$9I8pej`#?q#vA6Vq=6_yOI@0)jZC%7PWpC#(zF0UrH#Is-9gIFuL}a z^R=~p*+Un8WVWi(#a8%{_}3?EHoshpbxybsdI@-$xVN_dGo}FwicUcnz5DMmsknUm* zAilJx-29$Sa4+0}2)Qbub3u)Om{h15iZLR5wE3EVL~7TG-*zT5LjJAMf8huc`AkP$ zcB)DDALJ`xufUq|UEZa^_PVm`2F!!@5kMaCN|Z6@SZuojGSKM3f(3yUkF^kGF9SM-nzq18ip zrQfZMUgARf$xrgxD<}54UK=Oxb7Z1qrBkNBe@9Xe<;Adz=Ot7tJJbw4by0=dJ?^WI|#HQBu zz^o54bEsC8&L=cBY_;HM7G{~8Sw0qJyCy}uX>4mID>H)DSxz&Uxfi5$;@qxj--Bbx z74JC`s*@+Ckg)NT(v=-nziP4|!pZbC9MvbQ+ez$KpKzYYw{CJO zbMi6e(n+}daaaHDm}4E_*AYqk{CRvzjorhbG{3oiQh9%NXT<)tqG?#D5SbF5o}M3f z{T5RjRd?M0h$d}=$&Q%QATNr1sJvYwT$;^+0WbdptV6b_0Vz}zr9orZZ2S7s>BF)@ zm+Mv$d(3{Wryeo_IcFyeE*>hpIQGu5c=G4(p;C_HVWEl8l(&8Ti7?iJR;voj42Z`- z>w!CRNZ3l?+3siS(zR0F98v$Fg*YSuFDBnDrd8sCssM{@>dY(0W`Ubq69ab09-DMe zU+_o&G3vno_*DC*rxSn#%x>=5^z`YzL82B-{zc!A`in$bBjF=IDeALrlI6CvvT6h4 zsLnb9sK-f5f&v5^{g;s>9-Vd1Uu}p^Pw_=aw!%gxS^bmoy31=QmweYmQMg`D&t}`< zTtvb`twZuaxnVlFfj0k`5av{MD^UirGL%i4NJ;RBOWzhiAj3>qJg9$7lr(Z1Pdn}_q0r01xK^&^hRUw)t_&2=h+JOU;Q(mwkqh$9>Xsqb8kve^V^Klg38h zv+pNwd7rgn%iH!5`iaiJN3`f}&R;`KJn0-Q<3kH`U>FENm=su=TzlXKADE^)rW{mC5Un5m$Pe4h>#T3x zH&wnjeozU=%Km}B;ietrk5%nGeMwEb%~$7tR?TZ<07%l&yMOQ+0sU$|kJyz#a-8zyoQv^*>;0)v47PBKcC!_skEdi4KbL&51l@~2Se29z$UkfD$R(+MxH!9N+*qHb%wp(I?i zj;@s@tfL_+U8^hm0B6s4Ou*_z^YeCTm=@Nj48NBwg}-s1>))Km&!jZ}tyILtf4?zK zGxzou1~}p{b{2r;QHhdv98fhpy_uiAG7Ut$q>ay=-ycMaFe~{vGw1U{yTd~!q|hLB z+-J`AcJ;=TQsLJ$P$`=PZ?;&=Ld!TBW{x=9MP3bJMj#?k!+Y$C3_0?7vekhjUVvq& z91C>%TOqC4hCgV(w(IxZ?0)Cy0Lg+cXWT0?k(l4;%CFHafZ|db zC_#T_9$(SA*QNB-i!q=hDjfgg_sF6U%w~U$o}E6mb-YxW*{6Q*vTvi)4Qa-RhvPE) zpTm>kA30mLIY#7eUt9dP;^ooOxIbSdDm*C66|90wKJC<$!}ZD-u^kJ;=zXZh9U7v8tOD; z?bZeiBZ85dTJNpW0AK?<#55*IM~h~)2IM#XcWV!Rl|4y}iTwP@hZw(cj%kD;5H0qR zB=qZ>Y&YW`51Db4hhOordug<6O>mjO7AJl=`_$~Vw7HTY5OvmO3(l*`naTQ+1k8nZ zLN!IibeGl|@SwPNGkuoexy1v^;^2ZJ) z1kevPo)dB2N&mIqdoaIemq*lsgFbamV5c2-dg1#ZKtC{9b>8zv?R{=;3R^E|ACSR< zPgGc;gTnzwJDu~=!inRju#@4xVjnPvLv)3(9pi75RpQmN*B2d{Gre)2lyT-2{0hvi ztdi~MQS#IpSb)+Oxi3d-e*P|AkelFY z*Hev==!j#awK_h4Aseu-g|wmTh*R(FS8{%C*N@5&-{4jTe$}`KVQ0g#i1h5 zU24YJ)9h+E1(;P|Kk7`Sz}_$(ZKFFqvlS8y0gX$Vtww zd%j&l%F%mZH8j8w_i%s0M}bQ!aQM)Hmj65k#S`ZVHs8U4FvsZAL$!%IbFqKCUq_hS zjc@!vy1qP~s{M^xqlyd}i^x!1Ns^EZ8B2v^NHRr9CG#9dr3{%WH!>GR2&rTqN=QN{ zNivfu!!aLo@7nrx-+$iM=X~y`+r2nv@BMv-wbrv9WlCFwXR*R-^CCeF&+Eo(KdRXm zxhyEXTMIhaApP;F)ZvX)Ty~7xLOIq1s&SSyWK=lH=-=_vXpjW9C@+IN_(P!{QpWzt z!8M1r&hJPhNp1^?S01apTK@3ElkMZ%+qd29SYZ;2A$0@0qJn{GIAmMqCX7bSAB<%X zJ9kzi=}E+63%T^y)SksU$yoi}+g@(E@NKQ;7p7`=@ks1rB|Te~dcM#ga3w)aqI~Be z@rxnd8yDoXTKf5vlvDKp=F+@4#N>%tSg0Ivc;H&@U*nQ@BRgCWOKvV)SXXAtJA+<> zJ2ae4MkW={9?k}46ymG4g;d6$EZ%3|A@=#X@FwU9Cg!|ad}<7@!;5ENsMvJ(x#_tc zZ5>wJTv!0UVbNPd3_mY;FOqy(?goQ_n~Q$tzV{nfh#zV6qE}Jd1HpJypc9cm2l$ zE?;X8Ii@^!I1%-d=K4|Lfc2r2pV=?h%3PIr$3qwKPRjV9%R4Kcgt6I2@7LO(FmJYb zlhVYQ6(oE|!k|e5idT$Zk9|457l=QB-D5nwTS%&}(JgT!Az1tfNrP9`e#Yn%$;oLG zmA@u>BrP}ouccz%9s-#%G+G#wdlNT{_6J}v1fcYe_#c*7bVi<=+@1#8>zFV1`dD#d zbohplpkKc#7s{W%%oM(}>;Vv>!86}j9p%xX4SBqkzs52i^i&koTEz@pISos0Xo%24 z3_2H#P|%q}r-+LI8vK`G8z|LXIyX*wF$Rg>dU##UhK0(Qt_&@TvgHRQFSlF+p`WTt z$Z<)hQn8`Ogt49uJRV{Ao{*sEy5z=K!5s<^6S_a<+WD~? zlN6r9O%zCMh@qbB{QSV$TFtLRE+FMIGWOsQV#nG!7-!-_CDvb4&oC72&S^4jpd={z z@R(+~-P)7ra84qsz#tp_A#jUp@22DComkbB#3EJ1B3mXOV!vSemY~nKI3ss2mz?ol zo;}4%G)vgWgHL)jAqv|kSHR96Ebp&Y$^6r-6yS7hUtqMMYVZ8Fk&OBSJXeN~G)Q{C zd!tnS^7-D8Iz_;R_4~CxxqdDcim|EGZ<5R`NM@W;IP&zQaOcxTG+XtB9N99j+^v5b zyt`jke2oh6+qSUF;w$#Q-~WszMJFg+0H&(Y0^ypCs&*xEaE15;@4)(gT7Q`EPX? z^_DceajhSucCftl?&&z8XjFe`;SBgN8@c77i(h<|0y=u(|Mm!lDvlpEkG;pF{(J2w zO-7GPOdcsoqbFc+u?zHf2y;>Gs~a7hnc)3f~AAl>2lw_6jQ#W3fgxejvp zr1012xeUH}2kc9_H8OG)OfmeEEU~wf!Qb+0?KaLVcjk})5YdO*Iimse$rs0;`-|-H z|9X&?hHCu#_wUwcT@)bTv$FDIBW(N)CH$(?4rfmf2|#At6uT-7cNJC z(~~z9tz4i@U4H@k2O#hD7jj!-lp&lQ`M%z*pt^t3(;6Qm*EDJ8y&Rqaxm@!rbCH!=T0kOG0P zJOy0|F-A~)xfma#YFRd}E|7jA9_gMhym|-LiGV2GEQ zDhL|qJCFZ#`hk-PCw8HZnclenea;LiqSqH3+E zo5@`Dzbg-@Vw)i0II!a4rq70rJbCWp-OpkUh=T!Uh}uvSR92KXA|wixO7zVMtrVy3 zi*|(bAn}!0ep)ON^Y>6%WpBp?Sunpu^SS}D`HyF^WFy0=_3~zIBqOz^b>OemUXXG1(qRIa2 zurY-Y%VL`z#+YZlKtQ_L$deX1kr!w>?Pctj7w4FB1GF|lz7|%sCamgJe>ND$Q>nMS z6v7Nezq#1Fz@gXgF>oz3+55cLS$2B5hv{RyDlj2Tbr9Vq@7)b`p#MVqZF?Rmc|j$1 z*c;;OG*`e8Zf2rOv4z;B06zDmJwWei9agMigpk)e(X*$15zh*75b$WX+ESlI!_1Q9lY5a_hQX2V zTVyvte+MBK3J2xKFDR2CRX1qkhJTAgbzqLZ67Lv^u-V4dVj;u*LWp(1`^dOwB4((Z z>-(?CDm@ScVWh%XeNB$XAmVSTNW6i%&c@ajp(y1NcANob!t|!v4kk_=!cWRmVEx`Z z;zj$8imm=hyH!wlz0;lRiH6b!MwnDQvgOpJ4C`IrYI-Ho8h;(Wp{a2nzUwnyyL3iQ zc-j7X9@z=6Z%}5ReJAO2w}ixJZz_7mYG*91K;rZbH`@K~Y{s|D7Oi8P@cEWK{`3^8 zHZ`%xD?dhE3kfqWdl|XJh>(a5N>jQIT-nhXtfIkC5S(1l3cM&ThNIiRz0YC%i` zrD(+w?IRYjPAN?!7Nmk1X>Dx{jF#N6Hof4l7T_^Q)QR=TDeGTw85*0K_RVpGtixtU zL|P=2;+u~IHBjSV?K{25gF6bz-@o@a9Glwsv|%uL1Y8?R8aTJ7GI8wYWyIYm2g!pl z1ptgHH@Y&^vo%(6H5``tCY7qlxiOMiCXLs6_~TpZ*Ls4j2~oG~{2b$8QEbabso<}1 z)NKhBL7ZPAM1ar*_WK{&0GTN`R1{^rQxzL?Ms*W=N3DrcktDHs~idXIX8 zB(gi6ay)BahoN#RnC5hm2mT<}~S=rpG^fBk^wm9uRnO-~cd3kN8il9ECqPpGG+OAg#s z+<(^ImgYX)cp8c7#p~CSpRZ|cLX84x0H)WwdLzx+CyR|m9*m83so(i1==+&-9tH<D6FGp4ZH0qsn5i0)nt~RQLjN{kdS^r&@5GNeZlM=5#pRKz1qfM zYPXHYvSJRjX6V~FFfsNrU`(WM8f@9FSZVH6m^N;)`u;iE9<>1zdL9nnUoCAHg)#f# zrwKt7z1!2^S z7lbER4m-eChjt2?#1i|fL7|`o6_S!6{a*H#KS2ysAmDVfGp|AfrBXUNbiJ1${$Ge! z0aEEM#{))3J}i**)G`0L|4>jxcYFyPCZ;=!?>#f_*p}J9wx$*(j+8W%?t(K@E!8iB z@!22{IJ~3G=^e|_`+~*V=1jOGLCWIQ!;ZQEzIiNuCB*j6b}Zh6WMTVZ6J7Iro_lJ(*=I zvMW-d^5g4X3RxYa(g8JwCha4x<=9@`>zLi}m)r?p(1dmi{!sBBIgz-~PuSXqvK>J= z`8nWj(T1SNn%?BQi%M1>?KW3%`A%TL+^+CT0SQms5c{5<(%}7IvpDQaf0>D`{QVb@ zdV>$vGsbX!5*De;<$6TanTL-T-WXAR9l4=|YxjFzSMhe4fwL!)EsUl8x@l7n!vEh&$r zHF2p-Cx)eAa!Eey!O$V73s7BT8`{+W6fGP5xd+a0_l}+tp`yvq8G z-sLlB-@r?wf!0dV?P%9l%z4=QqNC)hrDAZyplZIcU-BggiGWlf7LgaMf^RJLNa}Q< zwQ6_o!H9K7Az{i34i_p+jQCDdIMKTF$c%4i2~lsRqE^&ITck2oby$(lv&Y?EV*{CX z^(s8AKPNr#Nl@wr#ths$V&-gdVB6;6f}#QOEkX`$V5;)kY>Ow4-s(Fu;)@)=@)fEK z02bBv%VwJfSFD+U?LP5D*<-!n=G&aA7wLn7KK`n(aCmf#fad{r0UUa)&dkFxlvLDb z5zBp;{+JYLh7^TyX8R&Tj$G#{l(Z|l8TXdA!gwB_0cPtDq@SUy47xnAWN>^a*+iUJ zyKePrB$d71oX9Ktnd8k&Os>i<|0}o=2NXH|W_cIqIl8K|C?eK;Me@FP^vU2ptTTnc zAH66xw76WKcme}XVltU<62UD*hcwimgs~aCAgTs%fjn8|*=q6h6nS^+vHQ2s>0Lh0 zGQ_-!HeJEzB(dgxl#kO$h+X#FL-yYI4wdIPse}9A1mka%ubAw> zH~+bC+6~2;@SWAUEp3wb?j~Qlrc4EtllsNG@FWQxM}BGP+1U~_DM&F_&4e^g={_rQ zY0JxSS;)Ihf#n!P|7neBJP%ahP9}wdK zAA2V-9?)!q@c>OaTFL)Kab~hGkxfa9?%LCL!zIj7d@=ZQTJL^0o^fN26lk9GjN6X> zL(o-%GC#2HX9Z0UX}3TwU3Ji^P_f9Mg}!|{83ur3vvYEwzI@T|u)cp#@RUB=wCDE5 z%leFOxyr}7Nmt4`cbwRzt2N>0~{fk66lt78Zu#kR1!ybe$LX z>uwly)(zmHA-0ea_Ifl#W|N!zwExJDl5$M?5$kdPDA!lwcm|@?0+nKki-jvi;8GDR zbQt^9<~>20pSpxtP1O5o<(UdTOzhrjy*OZY>2K75=`BqO@NK|}# z;hjQ5+Uxxb2(f8a61nT8_Jsz@insuOXKdwr4bfIGe8*#t0fTa@*Qdx z_W}3qL7fFI6^(p!_)iw*IP*lGqx$-Q6m_avr*>H?c942RS300CLWiT*K0dhtLuojGt-HGw01$Zh9czc1j7UXZj_ zvc+@Gy`!imx4S{G0}oR~I?ev={Bosvc^~#&@@DF{cyLUO@h+E#91m1fcq$RL@K2(+ zdp%{39FM=nU*VRUU%PfzaTL*?fWjbALQNN1JEsZf2dS8KG#GCc6%`H6Q*%BQ@^XGr z3B?(*UUK!(>+QRnq*nyMKOOUvM=ZLbF4!1Wm2^6TH&Q_fGRdQYu*E33IGp!vi#+fK zDHiW7n~yElPPdeH)GXW~jgg?h0_=s_@UfxjFA7_T`Z=kX80Fc@G4HGqj;>|W!YepA z<$eTuZrA#Tml;JUCb`Eivj6E(F((PLi=c|B1c1Ts%KaI$U%p&j+EHIE4+vJ+QV~a~ zC+FXdI|-#*I%&JDqQ$8v8XL*bHWPkar9Ni7^)edX2Nu&412H!`^`hvRWNF7n{VV3} zL(`5kVt?9u=*ziaOLXN59WJrv8jM9LLnYtc-JQLa9x5(cq4lM2=&GrXH{Lv`u(-78 z16Nbko?)`J!99D16Cq}tN9>Lwx>%%4&*>&SWl%Mt+|NhWW-uoT zA>iv}quGNifFQqYU}Zk;_0*|+)3rk_`k5U4iIstxxEs3JFc;i@NfGw4@A0&tfuRQT zQ9X<2sr>cl2J>W|Gc7$@Vcw((jOMhNHyh?FA)dy*`^C9Qpo`nhcCW_tU(VI13$88i z$LmS&pQ!jwMF#GOeaQLpz%4tZRUjw@JlEjm3ucc%v*)~c;Aqv-(t_a`r29X~2Ph{l z8S+o;m@l@bT5l%j&RqNa6G6}0f1s+@J(B}D4ubN}VUy7I$_nC;;OAgo6#ty_B6X}f z2|$AJBivn(u1)X$$7W?exkTWo;PI2>yP&DKi2-_3Q9gdz$AD!p*`j;KWNqI9pT-s& zsk1G|CIA(RW+hD-?M#nxO*pGp({28`8q;ro3>jzi1nvuNM8G3k|LgnolFdJNzU<@P z`z^ikvbL{p;iZgicF(tT6lmez7XQN@giO=0+ZPi`+X?tKDynPWz^Xu0mQNZ6<(HB$ zyM)yBrx?SfF!432f(v*BHkABI|^YA@@zMop1!%mc2f5xQ-bC9nY8-w0m1jhADu^e7HXx+Uf*x++Z z)WG%i+EY(xRpWxs2AD#qO6+2RN6vL{5Fj9kdkx+ah8$PTpf(|SC-SDHjdH!Q%gt!I zJd>7|cq($9q_iRyfag&@lS{nVRMEbED&C8jzflo(UxM7Wx1nw?M1$*YYf{L(<2&R;f&B<5q#R z6N_xvT^khIu7zm-XLc8(88{7l$Np==RUx?}T#@sQzvTvwEdmk)q^15{7A`d+pnkLu zBc&x8i&5F)S@lo-SXX&fs^vSwEZc*1YDZCn(P1O~$;;rFp<@N? zrMGm#e);!sn}(ghQ2eeLp_`L(f#EXNM=yxj^&LDToo@S>OStSh_3G;oBQDd~^jQ`6 zE8pqtwyCeV`lxt7*+Yje$>AApI>K z?EF!+J+}buF-m(pCq**!z0M2f_bbR$X?V>Q=EUydGr9}$1Sy{eVmkzfg1u;3Y;(yr zQfl_g$sDUS?yH)&KRoJ?Z(J{9@iz@5@*+vtJ330}A3hav;m@LleFMs>Q>!mU`O!M}@TdA*{R4y&{5_9;*KaVX91Fqq}uyRcO&W%6T1 zm%aG2iFeZr-h}Z&P{r;FHq;r=3BT(a``T@rSe2ZXwxKLcU4VYQZ|ccKZ;l$%BN4ra z*7fAuN1!*HGvM_k>_+)mO$CxoIrPKy==V?m~wM=%yG0@XvWFu$a*(lN}& zs>=~OUGOS4WyEpA$&XG}($@#qju(tQSBRo^4@S3LCQWMJ8E9PH+&qG{>#f)d>lOdS zeO=L10ba6LaFuj-7_i;l6)-MxA;!{AC<`8QEieURB21J)Bt{@bQmUuqn3;pXK{ zYO@WxdS8%_JqSLHmj4v2hDN3qJZWhM$EtCE=RbZ2SJT3a$Y)4f3$AqJ>~C~Ikilmk zb}gJ;3MrGTXUSkNX>uTuLV<{>C+(X)0J~oL^@PHLe*K(}lH#WU&PEC~%Q=jfetq|R zn0Y^OZhLicPO8r*_f63F&BPx^W>0BA6=|K@vR|bW$^%?aBtUd(WNYVt*vA#5aAp8e zpoYWFZ2riaKyw4s0V`e=FnTx4OT-;EeJ&7EVIdl-UVpQ#pBG!Eu$acbgTm1goUdf5 z^`dF$apPr8HubMACbuXd=JNK;yC&S_aF;p5s(@pj4y{so%mnzbvvGL+>}e}%dOlWMYsJFn8CK0_#aBd~J95 zJU!V9GLsqx0~jW!J(nuA_+N?!jZVM<1jnuGQ1X8eTANyFN7eZFKJ0P$Is;d3q7~o{ zJs1)k5WsW!WzBu&`|tpAGaX)g_}2TqZV_gFkBZKTa|W!-uB>XgBh2;5>eYr1+UtAI z=vn1#_E*7?L{f<|=}%gL#Up=tC{G^X2~*3RJ!A5d*7q&r9tA1(hIaPQi+^q%ico}y zccHmXs88)ZJvVhG$_zed0tW`!F300>;NW^9)2%8doH(T@ihyt+1f`^;47e83Tz4%D z!Fk}`z8&2J92M%kdG&QzVbVgwvCxQ;&1pMh#(LKTAJ1@;A)yd;f!8fp@zU{{oVYe( zExDyaQOpN>2Z-juUZ%)d$vCmM2{pXFduX&8Qoc7j4ze}WHoC&yC9 zNCB8vz-_?;mSc3f1S26RuZ!!QPPi6J_w7a2zzF=ONv->WZK?LJ($Y@qPuHo1hIDi} z9$AP{NT4e0WF||XzF`kiD;jN>DBw;kt(F+6H(?J{#c=DY>wKO@SJkac$kvaVZ4xmx zI{Q;PZQZ<=0@y5oC_O8vo5mF7i+f)l>d;%gCXG zPf`URx%eCe#Bm4Jo{nFzk7PL21XU7)f6p=Vc#5xNs!;}iLVc1!y2+f;4kkij4JTxd z*A1*m3t!I5kY2`kWi>54wq?NLayXS>-su;yI&Y7nNfX?!aO5&s*TY*8bS~BuMKuf< zgkumvlsIgNq&Rr{?Jhc-onEmF0W8%ULp^$*03h+QdKHK}J2~kzP!Nhh2I%C~tNqw? ziDozdb~EPV9-c;k7EL>%eW$IzA37!=$(n3QTf?dboMo-02rr)|_I^p(CSGpt&dyGl zJ84SV?pKg7)ZW{6zD~K}_3e5S8Eyuz#aU*v5-+9n#&_o8WoT5#mY1%f5A$H8yoLD$ z6cI_}!-Z|6*QFKbo38b=YRK`>+UuN5J1HEnbg;AAMF-=_j$yXAnO$p>_V}uE%A(= zKAVz9&zGTTac%~Rvrl-nBpZ{oGJLST2bD|VpVMZm?edT^?V0O(0Jj&lux;*HId&Ak zD6|K8)_C%$pZq7L*7Qv9MX4B6J^kAT9?k9F6vY`NwXn4OKx~51+vk4J* zW&5LN&u_oXAw=eGi?zc?lE`0Ys;}n8aYfU&b=(%Mfk2f1q@8iXbUrMTt{h}8HbfKE zW=pLbVz%C=$)npo6Mw1b$WVdUrf$)2U>U%HkU>qea>tyKTYVqVMh#1vWi_F>&GdHU zdhC(aM2E`=3_k8OaodS6qm4)a9i=`;P#3hIltCi}L1Dj)1V6t77HcpwNGq5&^$xtO zeo^G$ARBkQWe+~ZIOj?<8#&~{zK@4CrQx3f`TVxgs2l4OYiu`(w7F#S?!mmgI43<` z@4KnhL*-p#Z{s*mV3EW-Gq6@^y|;>P)v^8w%iT0ciEeBWhH2)clPKoli&=n#uqDj+qy&^6%yNa%IP z`iy|3B{Vvt2@T=q)VT^|0tYxe@07E9)l4WSgDR3u{exFOD>l_;{cV$Dl)HWiJFWm3 zS=027yUTQ_9v^ZHAe{j^T;%hc2PHO28AKP{ci5icxkNbTIWHjz%f@&)RXeFQ~C4u8VT4;dSbZC2Pro@yY6*^r4c3@o4YU z=;GE6hYU4&+h!X^i2Zw1HND!<%)F>h!fkHCq&?y6oBX?ncU)I~Ow(y07Krr9yh{b! zJ%D-FqW* z2p@!Bv}0)c^W_}W<95XmJS4^}p7-~F#V5Uh&o;)*pWqubzQA>3?gEM1nuG&{ePOEo zD(DsfB7;?0?C?|yW>8h9&f>X4Fnw#jlkBLv1Ledd4}4ny{tP zVjtQUycbM&Lq~gYXj8#+Q~-GW7?C1QkQG;mdZLOmUMU8GaeV3dK^>E(3fJ=UhdX9TqIE}t ztfN$>{QjT)%pU!KPc~Ax;fYN{fflNh-77>Hwy;1h0?UnkJYkQAWO2Ol!n?!-!Ri}j zuYw2p9$yo%SL6vx5sSiFq~OBxT3-FHAue=dt1#0_IdAn`-=sEvi`BvGs@s?-IH<|JMzA|E8Z443;&*bxovLo= zt>+`H|6&6bMT0+M{qPjb#lC$gJw4}z;u>+1Zac%{#uvkncdN*7`=Lz2VoF3mo%F^r zjKp@sE6^xyHTHpWpxegc$nq}xQ8f!>27=7iNQ5TaZ3)43!p4`Alpypt z2fGWQzb)@N>HJK3nc7u~^cp9L)`(-7R6c-MWwbD;5&5b2khnB^16)`B-D)Q>KT3Ed019SZ3K)C6?>YrHLu0vYH&cyyO}i>GB2^BY@F|sOOKlD}jN*+0LXcc+>lrpXK1F zvyh6p=z0%}NHMnJHG*-K#EaxXXM0!IU9wlW&`1jpy!Zan3l@0=d*Z%=6<}BFxX?u7 zZ%~KWV9UFKkIYo@vEVU%kq64~>uGL|+OXvSD(DzZ)XX4hVF*Gy(vlDt7kImSSXn#l zHlnz061l9ai%&K#^t+Wr)ZG;mp7^UIYyu0)8S|??*pKsL_39v-#nupYe&YRmVf#}SD*xpFr?WDR7AxWjJHopDmusODBbn?p|=wZ*TDOGD!&U#B)2;0!2*({+rpU^yTnV|@QlaR>3@9b^)zYeIRllxl_ev& zni|?=k0bdxEKfUNc_$vfZdny<;0v~$1h|bT_#^HBicHzsg(Z^fw!hOq{L$wmw{;CQ zWuaNOh=Fhme?(>4hng(0H$@l+D$_8}J%9IS(G_AAvV=f}$-Svb1>_6u?kC`%t=E)% z=KHz$zTSedMN1daC;n0NAKeN~fMzlOD_tBa3;I8!bpT7P#KE}#q0hL zhD5~!cv9p+fs-|CyTMk`a5!;f8xB{KXpOcHE0nt90SpZbgO2CD6z~0twH?W>M;SI-=Z)N+*JCYt0DueqDJ z^VqLRG|BKm&|UBey8QC4dP;+mIA?5+wG}!D;9dY@pn*v&GX&TGDGM?Nv7QX=9!HzK z?tMXKqtf(hEvmYC`-UGt?#8EEHjyt!@3M8{2sarC5u;YRxaJ9YdVCLDzOZr|xsyy8 z$a`N#7P_e@XEl}2%^ifT3J%q$?fcI}z^WK<5nj0Qed4G7M(f00LSk!gzk}TpS{MM} z$an|Cf&;AQ&=F{*>~GX;8?bfVE+DShthw~mMenq}zMPo4^>XsvbW|*1YYKOei+~-P zf$>9$Sy&>!4^e_bt+?6grOF{s=Wt5QUOt#Rp*nyKKv{b`53VTGe^8%g z7ZwH`6_lWKwOLQdoycv8>p5zR@_Z#}*w}R9u^p}tsj|e`L@|Nzfmey`QlqzQ8&}+* zkP5YF-I(3(%jv?KSk>~Uy;4PMq}LCJ>?oTwV!ueJ#a z1Vs3gtE)DAaw}}((x%@Q#2|Dit-NuU#XJRVqZw_sR{5=(%Z}E>X|+BBze0S| z?jR``%)*CoK>T>k9;OYj%`unZM&;5bD^v(E0-QN8l+Xb<`qy=RiQA2+`Cds&`=fdTc? z<4fCSW@hl9;k+NDbeYs3b}MVgXjCL07A^#Yk9}9 zOmbg6i3^>->zjlkTVq?#c&@igg|}>le5a*NMp+gG6RWUF8{$SZ8EDyypz1we#E#k4 z2M2jv3fmI%3X?CPkt4zC0_1bc6UsF;--`p-8-ery z&VkNo4^fInq3#(8?pl3fOJqKw;Rz>!TT&QkX7>kUy5{+8o)8rvpX!Tz<4?nQl zk86lNSoems5lJ197w0#F&lAWvraT%NbWy$I;sE0AIp{avjcN-RJ(3biXp~@gM$<=J zxfT`{WDXvDi>{=5Ja0qKYok5P;)sK~+o=Jg0JJ!OI=)2|1heyADyZTn3@}l#mF7)a zSGFFL+_uhM=T;%$WfQ@1&`akHRmJo?x3UQk2-Nje92u7br^y$#)0@x)Za`GtAW}C zDRq1LtFq)7}Di!N$Z1K*D)Ck zPCGc7W;PA&86KBWnL3Uvg98zpkbo9RbGtPc9)dqz1WZJ}3s@`LqkK+S%PjSilF-b3h$<-rhXYmBLk#XLp}WpJbV*#MGtGBPyq3aU$tAe zsNP0OfRmn|lYVuc@KnQyYf7K5P~n|WJV^-&LCQ=oMa`lZO&?T+j#75|4{XM_;Tgw6 zgf|ZKAI~nOz4+{he!rFxM8w;fLv-7B6oxk25Ksp;GJvAe($?O`&42?Aj0U1l$Wb6| z8fBeNu5w9WpsGJwb}Vb3^^yqii7Rx?z4$$TzyaJMBA;ubnMLJLpNT1TSC|RKNz0uK zxt6wagCxe|^hDV3?&|65Fdc&f${gE&>p#+fTn_$@(ovdZD0=5AU?aQsqB9>@Fiuvl z(d0t(wi{4px92^=f+^HHVi?ugdStN(k>L+QgaYY-d6i&H?Jn6*3tlB>4-GQc>Ozh} zCX>HTwqd~`Bp0AsLj}$nhnw^kwuyPJMB(BBjidM165mygnOf%9iyXw+HDW`10gx`H zR%_(A#{FARA2`d__N1az&Mq5q1qJemY<;+C`fStD=vpffb=*8Wz+wSfbmF+wOLjL} ztW{iCQoudNmDJO}otB0pf>$>MDkR7>`{XQ)b`fVY|gD01shl%deO0RP_X_VZYmgcDWBc*o7nePYQD$Q3c;ye%Zt z%fSwq3^zlH@&tN1Ose!9Y(FDL3%?dx@PD8aL85$AtR$+Yg8xveuMW>dYfwB62jp46 zCRsL)0Ydh|HVk+cPb=Ue0lP%WyE0+Y{mp!%d@QE!>gpIETud&AT3za9sLQ$z05sWp zO0AxQ+(RIc5}fp7OABte`q{N$r3%$cb#n#(?n{^h$VPHzA3AD!Iae6mZ760*0~?%-UZ z7W?V5lJw-g!U8g8Vv(Rw6`WQ@gW$kYa42ZqDcKP3ya@3+D-ay1kKH&N-AiS-WHO&lu+~76Vplw z^|XL;66&kG6WLxKUI8G)WT|n+$^HUoU-9Y%3&XC~ob0(exLWqb9;6PB& zfu05o37B=$a}aZj<6%Bt6WMY^D}|l1fvPCuq1s51Z8$B$2K^>z=CK0l8@jsNYb_755c$PdRPjJ2h^$jKmu~$=#&%W86I$ zqX~F<7K`1YSEt`XpnblZ9YPY|n5mMyU#Nj}N?-v_|1npb@{*mF1I+r4Dqsu`viF-}- zykmEGBJ2BECQqOxxs!Of$pv*DdJGg<{M-xz4~}Kec5VU-oVy&?>`lr>XH8(%83xB~ zCf((}x3%>;&D=w_0N(;vV?B|beM3Sj)8T5i$R>cp2okE}P$Qat6rSsi%wFiz0c~Dj z_<#34j=eJ=9{|*yk)iUweIf)@z2ugM11`lWw z##7mbs_>pdl5Wy_E-cVWihQwjUf5lRyRL}TcBRGS=FEM;K=EScHwlZa8(LXvb#Z%8 zJfL{~^qcCK?{y&tBXXgS$!nI529TPYM_gADc1jH7QeaNe0b*=vw;7Ni$bvxy950=O zdgssA>j7jlRQ>P!q1i!l?z$<;@0lH}^{cYCKxm*+Lex9HAsOJ+z%=V%th8ZoYzM46nK5{y!oXTU3ph=Nsaz7ay; zkMX#oC_z9912Y4I1&uw#57caIDaJ-isF8zKUw2z7CD@sS--{P%%E)BqIm0!>YEu{<6kl*@No;?Vp=)~uqzggZ*u@ZhIp>(;rMy*p_oo1>N;A1XxFKznO} zsE+DR&NeCPJTYrkn)7+AH**Hn8c}A>yY#>EPQeiC_O+A@eaj~8oXdILjD8I}Gy9v=~UGMScbAa^! zd>J|8Y3#lwYoGl{;=!?62O`Sa$?+tiyZyZALbt)-pk&siZ75q&u;A)uWjw4^3z#~k zFT&>adwDz2PzGV6HyX+>d%d{AsuGVk{p_8X`*8-8czM_Ln%*rONw4HMR_gYphiJrb zd?7GRg%#&^TvOBMc+@hY9MSvW?CTOyykih$kA`F!7#RUN9GZ4< zO)wKhIzlOohS37&p&SY~gUrJ2L=0FErwvo-V$154SNeMAmJw(`zA8VqzfhvcNiVh} z*CBGYk?4U-#^$H5KuN5_srX-;B%`QU)z$SlZwZegIE189fAnxV8wSKojhG)+i+kgu zS66RDhmMMVaPS{ghIpdEH-z;JC_$==7iOb#a`RgoN#dL*)=}Vxm(%~&#e^dlD~I;m z2@v|}-PoT36?LBNtx<4r9mfaX;@iMe5gcer%PYF2?)`oHQTW7}a_tK87hA~A%+^xZ z*SC&-bC{I*PcXI5lMz)i2uGOfaN* zFzimiK-FLYc>0~Psb;xMGdKYfgvSAsL9879hKceN$EunOJevS8>+c@<$3Cr?t`2>S&vG0&<-3j##$>B!M1!u|7p-@b)30zJ z>V<^xXs-+$*xb67Pis`B>YsE_z}FxYnGRZXITwY5^nu{JO-XF%unyevwJ;= zr5*JYOZw~<@~Qm=wWrh3u{T~hbPgYtd_jSeKC{*14$co!@3E&6jhdIfoX_=e?SCBk zyxGRW&W;h3WLZUbE>yax_?{ZJTCMGC8IeLk4xSLGdj@sCY}5(A-Zool4k-eklg|bw z9Uji|+9)G+1U*vq`BQ7(24wcEh&u?TC##9#VzxpP`{B&uH{)8JmzYx(*h!=Ki2Z@6@UyDxYz3PIISaVe{qHQeb_fpASU~L z4F{juN{tu>oklksT`1o?AtOgI4l&V93;%HY>%V!T~PiOGj`TMIISLX~l4j5Bw$TVPM-+Mgz3k+UDx9V1GN z`gBOg!mEu3nFc54@R>&&HDf0dTVS40D@ay>AQ>oZ!io5^|f`E1X5D{^=h}^m9v()5Mf#E93 z)c(OsxW=g`-@M&m!v&oQYGXPGC1T5yO4Ia2W@koX9$th@7*c=m&`vyC<^OFNVOP5Y zl=U%|(<$h8s_N^b_Zyc3-O7Km^v*hW4s7e{NX&`{f=Hj%iCAfCFtA-#us^iET}na>g%0$!GBarc7Uo_`D1jqbSCJcD8yJ>WKg*cS1`=AaaDd z1~_`IUB|mY=Q@Y;Qx8`JeuV20n6NEr38HmCHPy&lIui%1AQ2X3Ro=nWDc7Wy#tl?5Sz8Rrid;u5pK91P{e2Hh=7nW55^&o&kJY#4>Np z-xEKu6TPz4_4t5@Q07?J?Vzkl@K}9p1y#>}bXA|@AjA4KK=KHkJm2O{YNr>3C>WW3 zx7IH({y4}uFz@dt(b^L0mw3YJubxOtyHhuTDz4UQ^2cqJ^&0mv+wp!i=Ak!Z&G2m% z;_%b`DbLZ2fs;4CP@DDjRQIReN$YOCN^m+jDZon*a`SyhyNS&qlj&W`fUKB>Y2 z%m4be4IMT0a@An&VHFT*w6xIlA`YsiH{Jvaap;f= zS~xf-pt0~$*dq@SNZwLG*{eihoFjfoJLA&Sa7c-|i<(8PUdH?B)0;_LuAFQ3U@VQM@Vqc>Es*RipXJC52hDT@h~#{*Q>K1 z#c#$Sq5ZylH8k?fdn7O+k~;@Om;Ew!&NpCBh1k8DYXfgs74A47!Yx7~Lh$CnBm&0f zACO`LF6TsVV4~rmYsR_;>Ttg#;H)1bZw4efMqm-6XXh*`d2<4ZnZe(eu7LQh?7oG7>T{8nBj-ZkJm=DnvLg%s!NLPL8JsopWJfVZFGB1e!ZknqmAcQqefh&%Offl;}F~-KAUUOq$AcyUHXArba z&y&I5-#@W@&IGLz+Mg3_7M}F#((^U9%ddA79?g

kn@gBFlhD!+E@u*f}tOoVN<$ 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 *1a2Xn`WTUo4 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%0DfT76i4A-mcmgI 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 J)-l^V{{xeQ&XoWF From bf5c323c276235034e78e6cd26bfb91a32fc388f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:34:20 +0000 Subject: [PATCH 206/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/configtables/sector.csv | 2 +- scripts/build_monthly_prices.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index be096974..338cf34e 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -137,4 +137,4 @@ limit_max_growth,,, -- max_growth,,, -- -- {carrier},GW,float,The historic maximum growth of a carrier -- max_relative_growth, --- -- {carrier},p.u.,float,The historic maximum relative growth of a carrier \ No newline at end of file +-- -- {carrier},p.u.,float,The historic maximum relative growth of a carrier diff --git a/scripts/build_monthly_prices.py b/scripts/build_monthly_prices.py index 214d39fb..1c6d461b 100644 --- a/scripts/build_monthly_prices.py +++ b/scripts/build_monthly_prices.py @@ -6,9 +6,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -This script extracts monthly fuel prices of oil, gas, coal and lignite, -as well as CO2 prices - +This script extracts monthly fuel prices of oil, gas, coal and lignite, as well +as CO2 prices. Inputs ------ From b2744bc0cad2cf8614291cc84445bf1e51e04fbd Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 5 Jan 2024 17:36:35 +0100 Subject: [PATCH 207/497] update envs/environment.fixed.yaml --- envs/environment.fixed.yaml | 958 ++++++++++++++++++------------------ 1 file changed, 489 insertions(+), 469 deletions(-) diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index ca2ae848..7dd903a3 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -1,472 +1,492 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: CC0-1.0 - name: pypsa-eur channels: -- bioconda -- http://conda.anaconda.org/gurobi -- conda-forge -- defaults + - bioconda + - gurobi + - http://conda.anaconda.org/gurobi + - conda-forge + - defaults dependencies: -- _libgcc_mutex=0.1 -- _openmp_mutex=4.5 -- affine=2.4.0 -- alsa-lib=1.2.9 -- ampl-mp=3.1.0 -- amply=0.1.6 -- anyio=3.7.1 -- appdirs=1.4.4 -- argon2-cffi=21.3.0 -- argon2-cffi-bindings=21.2.0 -- asttokens=2.2.1 -- async-lru=2.0.3 -- atk-1.0=2.38.0 -- atlite=0.2.11 -- attr=2.5.1 -- attrs=23.1.0 -- aws-c-auth=0.7.0 -- aws-c-cal=0.6.0 -- aws-c-common=0.8.23 -- aws-c-compression=0.2.17 -- aws-c-event-stream=0.3.1 -- aws-c-http=0.7.11 -- aws-c-io=0.13.28 -- aws-c-mqtt=0.8.14 -- aws-c-s3=0.3.13 -- aws-c-sdkutils=0.1.11 -- aws-checksums=0.1.16 -- aws-crt-cpp=0.20.3 -- aws-sdk-cpp=1.10.57 -- babel=2.12.1 -- backcall=0.2.0 -- backports=1.0 -- backports.functools_lru_cache=1.6.5 -- beautifulsoup4=4.12.2 -- bleach=6.0.0 -- blosc=1.21.4 -- bokeh=3.2.1 -- boost-cpp=1.78.0 -- bottleneck=1.3.7 -- branca=0.6.0 -- brotli=1.0.9 -- brotli-bin=1.0.9 -- brotli-python=1.0.9 -- bzip2=1.0.8 -- c-ares=1.19.1 -- c-blosc2=2.10.0 -- ca-certificates=2023.7.22 -- cairo=1.16.0 -- cartopy=0.21.1 -- cdsapi=0.6.1 -- certifi=2023.7.22 -- cffi=1.15.1 -- cfitsio=4.2.0 -- cftime=1.6.2 -- charset-normalizer=3.2.0 -- click=8.1.6 -- click-plugins=1.1.1 -- cligj=0.7.2 -- cloudpickle=2.2.1 -- colorama=0.4.6 -- comm=0.1.3 -- configargparse=1.7 -- connection_pool=0.0.3 -- contourpy=1.1.0 -- country_converter=1.0.0 -- curl=8.2.0 -- cycler=0.11.0 -- cytoolz=0.12.2 -- dask=2023.7.1 -- dask-core=2023.7.1 -- datrie=0.8.2 -- dbus=1.13.6 -- debugpy=1.6.7 -- decorator=5.1.1 -- defusedxml=0.7.1 -- deprecation=2.1.0 -- descartes=1.1.0 -- distributed=2023.7.1 -- distro=1.8.0 -- docutils=0.20.1 -- dpath=2.1.6 -- entrypoints=0.4 -- entsoe-py=0.5.10 -- et_xmlfile=1.1.0 -- exceptiongroup=1.1.2 -- executing=1.2.0 -- expat=2.5.0 -- filelock=3.12.2 -- fiona=1.9.4 -- flit-core=3.9.0 -- folium=0.14.0 -- font-ttf-dejavu-sans-mono=2.37 -- font-ttf-inconsolata=3.000 -- font-ttf-source-code-pro=2.038 -- font-ttf-ubuntu=0.83 -- fontconfig=2.14.2 -- fonts-conda-ecosystem=1 -- fonts-conda-forge=1 -- fonttools=4.41.1 -- freetype=2.12.1 -- freexl=1.0.6 -- fribidi=1.0.10 -- fsspec=2023.6.0 -- gdal=3.7.0 -- gdk-pixbuf=2.42.10 -- geographiclib=1.52 -- geojson-rewind=1.0.2 -- geopandas=0.13.2 -- geopandas-base=0.13.2 -- geopy=2.3.0 -- geos=3.11.2 -- geotiff=1.7.1 -- gettext=0.21.1 -- gflags=2.2.2 -- giflib=5.2.1 -- gitdb=4.0.10 -- gitpython=3.1.32 -- glib=2.76.4 -- glib-tools=2.76.4 -- glog=0.6.0 -- gmp=6.2.1 -- graphite2=1.3.13 -- graphviz=8.1.0 -- gst-plugins-base=1.22.5 -- gstreamer=1.22.5 -- gtk2=2.24.33 -- gts=0.7.6 -- harfbuzz=7.3.0 -- hdf4=4.2.15 -- hdf5=1.14.1 -- humanfriendly=10.0 -- icu=72.1 -- idna=3.4 -- importlib-metadata=6.8.0 -- importlib_metadata=6.8.0 -- importlib_resources=6.0.0 -- iniconfig=2.0.0 -- ipopt=3.14.12 -- ipykernel=6.24.0 -- ipython=8.14.0 -- ipython_genutils=0.2.0 -- ipywidgets=8.0.7 -- jedi=0.18.2 -- jinja2=3.1.2 -- joblib=1.3.0 -- json-c=0.16 -- json5=0.9.14 -- jsonschema=4.18.4 -- jsonschema-specifications=2023.7.1 -- jupyter=1.0.0 -- jupyter-lsp=2.2.0 -- jupyter_client=8.3.0 -- jupyter_console=6.6.3 -- jupyter_core=5.3.1 -- jupyter_events=0.6.3 -- jupyter_server=2.7.0 -- jupyter_server_terminals=0.4.4 -- jupyterlab=4.0.3 -- jupyterlab_pygments=0.2.2 -- jupyterlab_server=2.24.0 -- jupyterlab_widgets=3.0.8 -- kealib=1.5.1 -- keyutils=1.6.1 -- kiwisolver=1.4.4 -- krb5=1.21.1 -- lame=3.100 -- lcms2=2.15 -- ld_impl_linux-64=2.40 -- lerc=4.0.0 -- libabseil=20230125.3 -- libaec=1.0.6 -- libarchive=3.6.2 -- libarrow=12.0.1 -- libblas=3.9.0 -- libbrotlicommon=1.0.9 -- libbrotlidec=1.0.9 -- libbrotlienc=1.0.9 -- libcap=2.67 -- libcblas=3.9.0 -- libclang=15.0.7 -- libclang13=15.0.7 -- libcrc32c=1.1.2 -- libcups=2.3.3 -- libcurl=8.2.0 -- libdeflate=1.18 -- libedit=3.1.20191231 -- libev=4.33 -- libevent=2.1.12 -- libexpat=2.5.0 -- libffi=3.4.2 -- libflac=1.4.3 -- libgcc-ng=13.1.0 -- libgcrypt=1.10.1 -- libgd=2.3.3 -- libgdal=3.7.0 -- libgfortran-ng=13.1.0 -- libgfortran5=13.1.0 -- libglib=2.76.4 -- libgomp=13.1.0 -- libgoogle-cloud=2.12.0 -- libgpg-error=1.47 -- libgrpc=1.56.2 -- libiconv=1.17 -- libjpeg-turbo=2.1.5.1 -- libkml=1.3.0 -- liblapack=3.9.0 -- liblapacke=3.9.0 -- libllvm15=15.0.7 -- libnetcdf=4.9.2 -- libnghttp2=1.52.0 -- libnsl=2.0.0 -- libnuma=2.0.16 -- libogg=1.3.4 -- libopenblas=0.3.23 -- libopus=1.3.1 -- libpng=1.6.39 -- libpq=15.3 -- libprotobuf=4.23.3 -- librsvg=2.56.1 -- librttopo=1.1.0 -- libsndfile=1.2.0 -- libsodium=1.0.18 -- libspatialindex=1.9.3 -- libspatialite=5.0.1 -- libsqlite=3.42.0 -- libssh2=1.11.0 -- libstdcxx-ng=13.1.0 -- libsystemd0=253 -- libthrift=0.18.1 -- libtiff=4.5.1 -- libtool=2.4.7 -- libutf8proc=2.8.0 -- libuuid=2.38.1 -- libvorbis=1.3.7 -- libwebp=1.3.1 -- libwebp-base=1.3.1 -- libxcb=1.15 -- libxkbcommon=1.5.0 -- libxml2=2.11.4 -- libxslt=1.1.37 -- libzip=1.9.2 -- libzlib=1.2.13 -- locket=1.0.0 -- lxml=4.9.3 -- lz4=4.3.2 -- lz4-c=1.9.4 -- lzo=2.10 -- mapclassify=2.5.0 -- markupsafe=2.1.3 -- matplotlib=3.5.3 -- matplotlib-base=3.5.3 -- matplotlib-inline=0.1.6 -- memory_profiler=0.61.0 -- metis=5.1.1 -- mistune=3.0.0 -- mpg123=1.31.3 -- msgpack-python=1.0.5 -- mumps-include=5.2.1 -- mumps-seq=5.2.1 -- munch=4.0.0 -- munkres=1.1.4 -- mysql-common=8.0.33 -- mysql-libs=8.0.33 -- nbclient=0.8.0 -- nbconvert=7.7.2 -- nbconvert-core=7.7.2 -- nbconvert-pandoc=7.7.2 -- nbformat=5.9.1 -- ncurses=6.4 -- nest-asyncio=1.5.6 -- netcdf4=1.6.4 -- networkx=3.1 -- nomkl=1.0 -- notebook=7.0.0 -- notebook-shim=0.2.3 -- nspr=4.35 -- nss=3.89 -- numexpr=2.8.4 -- numpy=1.25.1 -- openjdk=17.0.3 -- openjpeg=2.5.0 -- openpyxl=3.1.2 -- openssl=3.1.1 -- orc=1.9.0 -- overrides=7.3.1 -- packaging=23.1 -- pandas=2.0.3 -- pandoc=3.1.3 -- pandocfilters=1.5.0 -- pango=1.50.14 -- parso=0.8.3 -- partd=1.4.0 -- patsy=0.5.3 -- pcre2=10.40 -- pexpect=4.8.0 -- pickleshare=0.7.5 -- pillow=10.0.0 -- pip=23.2.1 -- pixman=0.40.0 -- pkgutil-resolve-name=1.3.10 -- plac=1.3.5 -- platformdirs=3.9.1 -- pluggy=1.2.0 -- ply=3.11 -- pooch=1.7.0 -- poppler=23.05.0 -- poppler-data=0.4.12 -- postgresql=15.3 -- powerplantmatching=0.5.7 -- progressbar2=4.2.0 -- proj=9.2.1 -- prometheus_client=0.17.1 -- prompt-toolkit=3.0.39 -- prompt_toolkit=3.0.39 -- psutil=5.9.5 -- pthread-stubs=0.4 -- ptyprocess=0.7.0 -- pulp=2.7.0 -- pulseaudio-client=16.1 -- pure_eval=0.2.2 -- py-cpuinfo=9.0.0 -- pyarrow=12.0.1 -- pycountry=22.3.5 -- pycparser=2.21 -- pygments=2.15.1 -- pyomo=6.6.1 -- pyparsing=3.1.0 -- pyproj=3.6.0 -- pyqt=5.15.7 -- pyqt5-sip=12.11.0 -- pyshp=2.3.1 -- pysocks=1.7.1 -- pytables=3.8.0 -- pytest=7.4.0 -- python=3.10.12 -- python-dateutil=2.8.2 -- python-fastjsonschema=2.18.0 -- python-json-logger=2.0.7 -- python-tzdata=2023.3 -- python-utils=3.7.0 -- python_abi=3.10 -- pytz=2023.3 -- pyxlsb=1.0.10 -- pyyaml=6.0 -- pyzmq=25.1.0 -- qt-main=5.15.8 -- qtconsole=5.4.3 -- qtconsole-base=5.4.3 -- qtpy=2.3.1 -- rasterio=1.3.8 -- rdma-core=28.9 -- re2=2023.03.02 -- readline=8.2 -- referencing=0.30.0 -- requests=2.31.0 -- reretry=0.11.8 -- rfc3339-validator=0.1.4 -- rfc3986-validator=0.1.1 -- rioxarray=0.14.1 -- rpds-py=0.9.2 -- rtree=1.0.1 -- s2n=1.3.46 -- scikit-learn=1.3.0 -- scipy=1.11.1 -- scotch=6.0.9 -- seaborn=0.12.2 -- seaborn-base=0.12.2 -- send2trash=1.8.2 -- setuptools=68.0.0 -- setuptools-scm=7.1.0 -- setuptools_scm=7.1.0 -- shapely=2.0.1 -- sip=6.7.10 -- six=1.16.0 -- smart_open=6.3.0 -- smmap=3.0.5 -- snakemake-minimal=7.30.2 -- snappy=1.1.10 -- sniffio=1.3.0 -- snuggs=1.4.7 -- sortedcontainers=2.4.0 -- soupsieve=2.3.2.post1 -- sqlite=3.42.0 -- stack_data=0.6.2 -- statsmodels=0.14.0 -- stopit=1.1.2 -- tabula-py=2.6.0 -- tabulate=0.9.0 -- tblib=1.7.0 -- terminado=0.17.1 -- threadpoolctl=3.2.0 -- throttler=1.2.1 -- tiledb=2.13.2 -- tinycss2=1.2.1 -- tk=8.6.12 -- toml=0.10.2 -- tomli=2.0.1 -- toolz=0.12.0 -- toposort=1.10 -- tornado=6.3.2 -- tqdm=4.65.0 -- traitlets=5.9.0 -- typing-extensions=4.7.1 -- typing_extensions=4.7.1 -- typing_utils=0.1.0 -- tzcode=2023c -- tzdata=2023c -- ucx=1.14.1 -- unicodedata2=15.0.0 -- unidecode=1.3.6 -- unixodbc=2.3.10 -- urllib3=2.0.4 -- wcwidth=0.2.6 -- webencodings=0.5.1 -- websocket-client=1.6.1 -- wheel=0.41.0 -- widgetsnbextension=4.0.8 -- wrapt=1.15.0 -- xarray=2023.7.0 -- xcb-util=0.4.0 -- xcb-util-image=0.4.0 -- xcb-util-keysyms=0.4.0 -- xcb-util-renderutil=0.3.9 -- xcb-util-wm=0.4.1 -- xerces-c=3.2.4 -- xkeyboard-config=2.39 -- xlrd=2.0.1 -- xorg-fixesproto=5.0 -- xorg-inputproto=2.3.2 -- xorg-kbproto=1.0.7 -- xorg-libice=1.1.1 -- xorg-libsm=1.2.4 -- xorg-libx11=1.8.6 -- xorg-libxau=1.0.11 -- xorg-libxdmcp=1.1.3 -- xorg-libxext=1.3.4 -- xorg-libxfixes=5.0.3 -- xorg-libxi=1.7.10 -- xorg-libxrender=0.9.11 -- xorg-libxtst=1.2.3 -- xorg-recordproto=1.14.2 -- xorg-renderproto=0.11.1 -- xorg-xextproto=7.3.0 -- xorg-xf86vidmodeproto=2.3.1 -- xorg-xproto=7.0.31 -- xyzservices=2023.7.0 -- xz=5.2.6 -- yaml=0.2.5 -- yte=1.5.1 -- zeromq=4.3.4 -- zict=3.0.0 -- zipp=3.16.2 -- zlib=1.2.13 -- zlib-ng=2.0.7 -- zstd=1.5.2 -- pip: - - gurobipy==10.0.2 - - linopy==0.2.2 - - pypsa==0.25.1 - - tsam==2.3.0 - - validators==0.20.0 + - _libgcc_mutex=0.1 + - _openmp_mutex=4.5 + - affine=2.4.0 + - alsa-lib=1.2.10 + - ampl-mp=3.1.0 + - amply=0.1.6 + - anyio=4.2.0 + - appdirs=1.4.4 + - argon2-cffi=23.1.0 + - argon2-cffi-bindings=21.2.0 + - arrow=1.3.0 + - asttokens=2.4.1 + - async-lru=2.0.4 + - atk-1.0=2.38.0 + - atlite=0.2.12 + - attr=2.5.1 + - attrs=23.2.0 + - aws-c-auth=0.7.8 + - aws-c-cal=0.6.9 + - aws-c-common=0.9.10 + - aws-c-compression=0.2.17 + - aws-c-event-stream=0.3.2 + - aws-c-http=0.7.15 + - aws-c-io=0.13.36 + - aws-c-mqtt=0.10.0 + - aws-c-s3=0.4.7 + - aws-c-sdkutils=0.1.13 + - aws-checksums=0.1.17 + - aws-crt-cpp=0.25.1 + - aws-sdk-cpp=1.11.210 + - babel=2.14.0 + - beautifulsoup4=4.12.2 + - bleach=6.1.0 + - blosc=1.21.5 + - bokeh=3.3.2 + - bottleneck=1.3.7 + - branca=0.7.0 + - brotli=1.1.0 + - brotli-bin=1.1.0 + - brotli-python=1.1.0 + - bzip2=1.0.8 + - c-ares=1.24.0 + - c-blosc2=2.12.0 + - ca-certificates=2023.11.17 + - cached-property=1.5.2 + - cached_property=1.5.2 + - cairo=1.18.0 + - cartopy=0.22.0 + - cdsapi=0.6.1 + - certifi=2023.11.17 + - cffi=1.16.0 + - cfitsio=4.3.1 + - cftime=1.6.3 + - charset-normalizer=3.3.2 + - click=8.1.7 + - click-plugins=1.1.1 + - cligj=0.7.2 + - cloudpickle=3.0.0 + - coin-or-cbc=2.10.10 + - coin-or-cgl=0.60.7 + - coin-or-clp=1.17.8 + - coin-or-osi=0.108.8 + - coin-or-utils=2.11.9 + - coincbc=2.10.10 + - colorama=0.4.6 + - comm=0.1.4 + - configargparse=1.7 + - connection_pool=0.0.3 + - contourpy=1.2.0 + - country_converter=1.2 + - cycler=0.12.1 + - cytoolz=0.12.2 + - dask=2023.12.1 + - dask-core=2023.12.1 + - datrie=0.8.2 + - dbus=1.13.6 + - debugpy=1.8.0 + - decorator=5.1.1 + - defusedxml=0.7.1 + - deprecation=2.1.0 + - descartes=1.1.0 + - distributed=2023.12.1 + - distro=1.8.0 + - docutils=0.20.1 + - dpath=2.1.6 + - entrypoints=0.4 + - entsoe-py=0.6.1 + - et_xmlfile=1.1.0 + - exceptiongroup=1.2.0 + - executing=2.0.1 + - expat=2.5.0 + - fiona=1.9.5 + - folium=0.15.1 + - font-ttf-dejavu-sans-mono=2.37 + - font-ttf-inconsolata=3.000 + - font-ttf-source-code-pro=2.038 + - font-ttf-ubuntu=0.83 + - fontconfig=2.14.2 + - fonts-conda-ecosystem=1 + - fonts-conda-forge=1 + - fonttools=4.47.0 + - fqdn=1.5.1 + - freetype=2.12.1 + - freexl=2.0.0 + - fribidi=1.0.10 + - fsspec=2023.12.2 + - gdal=3.7.3 + - gdk-pixbuf=2.42.10 + - geographiclib=1.52 + - geojson-rewind=1.1.0 + - geopandas=0.14.1 + - geopandas-base=0.14.1 + - geopy=2.4.1 + - geos=3.12.1 + - geotiff=1.7.1 + - gettext=0.21.1 + - gflags=2.2.2 + - giflib=5.2.1 + - gitdb=4.0.11 + - gitpython=3.1.40 + - glib=2.78.3 + - glib-tools=2.78.3 + - glog=0.6.0 + - glpk=5.0 + - gmp=6.3.0 + - graphite2=1.3.13 + - graphviz=9.0.0 + - gst-plugins-base=1.22.8 + - gstreamer=1.22.8 + - gtk2=2.24.33 + - gts=0.7.6 + - gurobi=11.0.0 + - harfbuzz=8.3.0 + - hdf4=4.2.15 + - hdf5=1.14.3 + - humanfriendly=10.0 + - icu=73.2 + - idna=3.6 + - importlib-metadata=7.0.1 + - importlib_metadata=7.0.1 + - importlib_resources=6.1.1 + - iniconfig=2.0.0 + - ipopt=3.14.13 + - ipykernel=6.28.0 + - ipython=8.19.0 + - ipywidgets=8.1.1 + - isoduration=20.11.0 + - jedi=0.19.1 + - jinja2=3.1.2 + - joblib=1.3.2 + - json-c=0.17 + - json5=0.9.14 + - jsonpointer=2.4 + - jsonschema=4.20.0 + - jsonschema-specifications=2023.12.1 + - jsonschema-with-format-nongpl=4.20.0 + - jupyter=1.0.0 + - jupyter-lsp=2.2.1 + - jupyter_client=8.6.0 + - jupyter_console=6.6.3 + - jupyter_core=5.6.1 + - jupyter_events=0.9.0 + - jupyter_server=2.12.1 + - jupyter_server_terminals=0.5.1 + - jupyterlab=4.0.10 + - jupyterlab_pygments=0.3.0 + - jupyterlab_server=2.25.2 + - jupyterlab_widgets=3.0.9 + - kealib=1.5.3 + - keyutils=1.6.1 + - kiwisolver=1.4.5 + - krb5=1.21.2 + - lame=3.100 + - lcms2=2.16 + - ld_impl_linux-64=2.40 + - lerc=4.0.0 + - libabseil=20230802.1 + - libaec=1.1.2 + - libarchive=3.7.2 + - libarrow=14.0.2 + - libarrow-acero=14.0.2 + - libarrow-dataset=14.0.2 + - libarrow-flight=14.0.2 + - libarrow-flight-sql=14.0.2 + - libarrow-gandiva=14.0.2 + - libarrow-substrait=14.0.2 + - libblas=3.9.0 + - libboost-headers=1.84.0 + - libbrotlicommon=1.1.0 + - libbrotlidec=1.1.0 + - libbrotlienc=1.1.0 + - libcap=2.69 + - libcblas=3.9.0 + - libclang=15.0.7 + - libclang13=15.0.7 + - libcrc32c=1.1.2 + - libcups=2.3.3 + - libcurl=8.5.0 + - libdeflate=1.19 + - libedit=3.1.20191231 + - libev=4.33 + - libevent=2.1.12 + - libexpat=2.5.0 + - libffi=3.4.2 + - libflac=1.4.3 + - libgcc-ng=13.2.0 + - libgcrypt=1.10.3 + - libgd=2.3.3 + - libgdal=3.7.3 + - libgfortran-ng=13.2.0 + - libgfortran5=13.2.0 + - libglib=2.78.3 + - libgomp=13.2.0 + - libgoogle-cloud=2.12.0 + - libgpg-error=1.47 + - libgrpc=1.59.3 + - libhwloc=2.9.1 + - libiconv=1.17 + - libjpeg-turbo=3.0.0 + - libkml=1.3.0 + - liblapack=3.9.0 + - liblapacke=3.9.0 + - libllvm15=15.0.7 + - libnetcdf=4.9.2 + - libnghttp2=1.58.0 + - libnl=3.9.0 + - libnsl=2.0.1 + - libnuma=2.0.16 + - libogg=1.3.4 + - libopenblas=0.3.25 + - libopus=1.3.1 + - libparquet=14.0.2 + - libpng=1.6.39 + - libpq=16.1 + - libprotobuf=4.24.4 + - libre2-11=2023.06.02 + - librsvg=2.56.3 + - librttopo=1.1.0 + - libsndfile=1.2.2 + - libsodium=1.0.18 + - libspatialindex=1.9.3 + - libspatialite=5.1.0 + - libspral=2023.08.02 + - libsqlite=3.44.2 + - libssh2=1.11.0 + - libstdcxx-ng=13.2.0 + - libsystemd0=255 + - libthrift=0.19.0 + - libtiff=4.6.0 + - libutf8proc=2.8.0 + - libuuid=2.38.1 + - libvorbis=1.3.7 + - libwebp=1.3.2 + - libwebp-base=1.3.2 + - libxcb=1.15 + - libxcrypt=4.4.36 + - libxkbcommon=1.6.0 + - libxml2=2.11.6 + - libxslt=1.1.37 + - libzip=1.10.1 + - libzlib=1.2.13 + - linopy=0.3.2 + - locket=1.0.0 + - lxml=4.9.3 + - lz4=4.3.2 + - lz4-c=1.9.4 + - lzo=2.10 + - mapclassify=2.6.1 + - markupsafe=2.1.3 + - matplotlib=3.8.2 + - matplotlib-base=3.8.2 + - matplotlib-inline=0.1.6 + - memory_profiler=0.61.0 + - metis=5.1.0 + - minizip=4.0.4 + - mistune=3.0.2 + - mpg123=1.32.3 + - msgpack-python=1.0.7 + - mumps-include=5.2.1 + - mumps-seq=5.2.1 + - munch=4.0.0 + - munkres=1.1.4 + - mysql-common=8.0.33 + - mysql-libs=8.0.33 + - nbclient=0.8.0 + - nbconvert=7.14.0 + - nbconvert-core=7.14.0 + - nbconvert-pandoc=7.14.0 + - nbformat=5.9.2 + - ncurses=6.4 + - nest-asyncio=1.5.8 + - netcdf4=1.6.5 + - networkx=3.2.1 + - nomkl=1.0 + - notebook=7.0.6 + - notebook-shim=0.2.3 + - nspr=4.35 + - nss=3.96 + - numexpr=2.8.8 + - numpy=1.26.2 + - openjdk=21.0.1 + - openjpeg=2.5.0 + - openpyxl=3.1.2 + - openssl=3.2.0 + - orc=1.9.2 + - overrides=7.4.0 + - packaging=23.2 + - pandas=2.1.4 + - pandoc=3.1.3 + - pandocfilters=1.5.0 + - pango=1.50.14 + - parso=0.8.3 + - partd=1.4.1 + - patsy=0.5.5 + - pcre2=10.42 + - pexpect=4.8.0 + - pickleshare=0.7.5 + - pillow=10.2.0 + - pip=23.3.2 + - pixman=0.42.2 + - pkgutil-resolve-name=1.3.10 + - plac=1.4.2 + - platformdirs=4.1.0 + - pluggy=1.3.0 + - ply=3.11 + - poppler=23.12.0 + - poppler-data=0.4.12 + - postgresql=16.1 + - powerplantmatching=0.5.8 + - progressbar2=4.3.2 + - proj=9.3.0 + - prometheus_client=0.19.0 + - prompt-toolkit=3.0.42 + - prompt_toolkit=3.0.42 + - psutil=5.9.7 + - pthread-stubs=0.4 + - ptyprocess=0.7.0 + - pulp=2.7.0 + - pulseaudio-client=16.1 + - pure_eval=0.2.2 + - py-cpuinfo=9.0.0 + - pyarrow=14.0.2 + - pyarrow-hotfix=0.6 + - pycountry=22.3.5 + - pycparser=2.21 + - pygments=2.17.2 + - pyomo=6.6.1 + - pyparsing=3.1.1 + - pyproj=3.6.1 + - pypsa=0.26.2 + - pyqt=5.15.9 + - pyqt5-sip=12.12.2 + - pyshp=2.3.1 + - pysocks=1.7.1 + - pytables=3.9.2 + - pytest=7.4.4 + - python=3.11.7 + - python-dateutil=2.8.2 + - python-fastjsonschema=2.19.1 + - python-json-logger=2.0.7 + - python-tzdata=2023.4 + - python-utils=3.8.1 + - python_abi=3.11 + - pytz=2023.3.post1 + - pyxlsb=1.0.10 + - pyyaml=6.0.1 + - pyzmq=25.1.2 + - qt-main=5.15.8 + - qtconsole-base=5.5.1 + - qtpy=2.4.1 + - rasterio=1.3.9 + - rdma-core=49.0 + - re2=2023.06.02 + - readline=8.2 + - referencing=0.32.0 + - requests=2.31.0 + - reretry=0.11.8 + - rfc3339-validator=0.1.4 + - rfc3986-validator=0.1.1 + - rioxarray=0.15.0 + - rpds-py=0.16.2 + - rtree=1.1.0 + - s2n=1.4.1 + - scikit-learn=1.3.2 + - scipy=1.11.4 + - scotch=6.0.9 + - seaborn=0.13.0 + - seaborn-base=0.13.0 + - send2trash=1.8.2 + - setuptools=69.0.3 + - setuptools-scm=8.0.4 + - setuptools_scm=8.0.4 + - shapely=2.0.2 + - sip=6.7.12 + - six=1.16.0 + - smart_open=6.4.0 + - smmap=5.0.0 + - snakemake-minimal=7.32.4 + - snappy=1.1.10 + - sniffio=1.3.0 + - snuggs=1.4.7 + - sortedcontainers=2.4.0 + - soupsieve=2.5 + - sqlite=3.44.2 + - stack_data=0.6.2 + - statsmodels=0.14.1 + - stopit=1.1.2 + - tabula-py=2.7.0 + - tabulate=0.9.0 + - tblib=3.0.0 + - terminado=0.18.0 + - threadpoolctl=3.2.0 + - throttler=1.2.2 + - tiledb=2.18.2 + - tinycss2=1.2.1 + - tk=8.6.13 + - toml=0.10.2 + - tomli=2.0.1 + - toolz=0.12.0 + - toposort=1.10 + - tornado=6.3.3 + - tqdm=4.66.1 + - traitlets=5.14.1 + - types-python-dateutil=2.8.19.14 + - typing-extensions=4.9.0 + - typing_extensions=4.9.0 + - typing_utils=0.1.0 + - tzcode=2023d + - tzdata=2023d + - ucx=1.15.0 + - unidecode=1.3.7 + - unixodbc=2.3.12 + - uri-template=1.3.0 + - uriparser=0.9.7 + - urllib3=2.1.0 + - validators=0.22.0 + - wcwidth=0.2.12 + - webcolors=1.13 + - webencodings=0.5.1 + - websocket-client=1.7.0 + - wheel=0.42.0 + - widgetsnbextension=4.0.9 + - wrapt=1.16.0 + - xarray=2023.12.0 + - xcb-util=0.4.0 + - xcb-util-image=0.4.0 + - xcb-util-keysyms=0.4.0 + - xcb-util-renderutil=0.3.9 + - xcb-util-wm=0.4.1 + - xerces-c=3.2.5 + - xkeyboard-config=2.40 + - xlrd=2.0.1 + - xorg-fixesproto=5.0 + - xorg-inputproto=2.3.2 + - xorg-kbproto=1.0.7 + - xorg-libice=1.1.1 + - xorg-libsm=1.2.4 + - xorg-libx11=1.8.7 + - xorg-libxau=1.0.11 + - xorg-libxdmcp=1.1.3 + - xorg-libxext=1.3.4 + - xorg-libxfixes=5.0.3 + - xorg-libxi=1.7.10 + - xorg-libxrender=0.9.11 + - xorg-libxt=1.3.0 + - xorg-libxtst=1.2.3 + - xorg-recordproto=1.14.2 + - xorg-renderproto=0.11.1 + - xorg-xextproto=7.3.0 + - xorg-xf86vidmodeproto=2.3.1 + - xorg-xproto=7.0.31 + - xyzservices=2023.10.1 + - xz=5.2.6 + - yaml=0.2.5 + - yte=1.5.4 + - zeromq=4.3.5 + - zict=3.0.0 + - zipp=3.17.0 + - zlib=1.2.13 + - zlib-ng=2.0.7 + - zstd=1.5.5 + - pip: + - highspy==1.5.3 + - tsam==2.3.1 From 647a988c75eefcf6886192bc1749d9871df84a17 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 7 Jan 2024 09:48:43 +0100 Subject: [PATCH 208/497] config: set default max_extension to finite value for loss approximation --- config/config.default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index b16f25f8..b37aaac0 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -255,7 +255,7 @@ lines: 750.: "Al/St 560/50 4-bundle 750.0" s_max_pu: 0.7 s_nom_max: .inf - max_extension: .inf + max_extension: 20000 #MW length_factor: 1.25 reconnect_crimea: true under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity @@ -270,7 +270,7 @@ lines: links: p_max_pu: 1.0 p_nom_max: .inf - max_extension: .inf + max_extension: 30000 #MW include_tyndp: true under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity From 01f201743d195b177eda9d0f7274fbde80bc8add Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Mon, 8 Jan 2024 09:30:21 +0100 Subject: [PATCH 209/497] Implement everywhere_powerplants --- config/config.default.yaml | 1 + doc/configtables/electricity.csv | 2 ++ doc/release_notes.rst | 6 ++--- rules/build_electricity.smk | 1 + scripts/build_powerplants.py | 40 +++++++++++++++++++++++++++++++- 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index b37aaac0..7ef08e2f 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -116,6 +116,7 @@ electricity: powerplants_filter: (DateOut >= 2022 or DateOut != DateOut) custom_powerplants: false + everywhere_powerplants: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, hydro] diff --git a/doc/configtables/electricity.csv b/doc/configtables/electricity.csv index 00eec0c4..22a22d57 100644 --- a/doc/configtables/electricity.csv +++ b/doc/configtables/electricity.csv @@ -24,6 +24,8 @@ powerplants_filter,--,"use `pandas.query `_ strings here, e.g. ``Country in ['Germany']``",Filter query for the custom powerplant database. ,,, +everywhere_powerplants,--,"Any subset of {nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass}","List of conventional power plants to add to every node in the model with zero initial capacity. To be used in combination with ``extendable_carriers`` to allow for building conventional powerplants irrespective of existing locations." +,,, conventional_carriers,--,"Any subset of {nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass}","List of conventional power plants to include in the model from ``resources/powerplants.csv``. If an included carrier is also listed in ``extendable_carriers``, the capacity is taken as a lower bound." ,,, renewable_carriers,--,"Any subset of {solar, onwind, offwind-ac, offwind-dc, hydro}",List of renewable generators to include in the model. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 2675e4c6..d9583065 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,10 +7,10 @@ Release Notes ########################################## -.. Upcoming Release -.. ================ +Upcoming Release +================ -.. * new features +* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/848). PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 8cba33bc..6b092638 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -41,6 +41,7 @@ rule build_powerplants: params: powerplants_filter=config["electricity"]["powerplants_filter"], custom_powerplants=config["electricity"]["custom_powerplants"], + everywhere_powerplants=config["electricity"]["everywhere_powerplants"], countries=config["countries"], input: base_network=RESOURCES + "networks/base.nc", diff --git a/scripts/build_powerplants.py b/scripts/build_powerplants.py index d6553663..69920aa7 100755 --- a/scripts/build_powerplants.py +++ b/scripts/build_powerplants.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT @@ -10,6 +10,7 @@ Retrieves conventional powerplant capacities and locations from these to buses and creates a ``.csv`` file. It is possible to amend the powerplant database with custom entries provided in ``data/custom_powerplants.csv``. +Lastly, for every substation, powerplants with zero-initial capacity can be added for certain fuel types automatically. Relevant Settings ----------------- @@ -19,6 +20,7 @@ Relevant Settings electricity: powerplants_filter: custom_powerplants: + everywhere_powerplants: .. seealso:: Documentation of the configuration file ``config/config.yaml`` at @@ -44,6 +46,7 @@ Description ----------- The configuration options ``electricity: powerplants_filter`` and ``electricity: custom_powerplants`` can be used to control whether data should be retrieved from the original powerplants database or from custom amendmends. These specify `pandas.query `_ commands. +In addition the configuration option ``electricity: everywhere_powerplants`` can be used to place powerplants with zero-initial capacity of certain fuel types at all substations. 1. Adding all powerplants from custom: @@ -73,10 +76,18 @@ The configuration options ``electricity: powerplants_filter`` and ``electricity: powerplants_filter: Country not in ['Germany'] and YearCommissioned <= 2015 custom_powerplants: YearCommissioned <= 2015 + +4. Adding powerplants at all substations for 4 conventional carrier types: + + .. code:: yaml + + everywhere_powerplants: ['Natural Gas', 'Coal', 'nuclear', 'OCGT'] """ import logging +import itertools +import numpy as np import pandas as pd import powerplantmatching as pm import pypsa @@ -96,6 +107,28 @@ def add_custom_powerplants(ppl, custom_powerplants, custom_ppl_query=False): [ppl, add_ppls], sort=False, ignore_index=True, verify_integrity=True ) +def add_everywhere_powerplants(ppl, substations, everywhere_powerplants): + # Create a dataframe with "everywhere_powerplants" of stated carriers at the location of all substations + generic_ppl = ( + pd.DataFrame(itertools.product(substations.index.values, everywhere_powerplants), columns=["substation_index","Fueltype"]) + .merge(substations[["x","y","country"]], left_on="substation_index", right_index=True) + ).drop(columns="substation_index") + + # PPL uses different columns names compared to substations dataframe -> rename + everywhere_ppl = everywhere_ppl.rename(columns={"x":"lon","y":"lat","country":"Country"}) + + # Add default values for the generic powerplants + everywhere_ppl["Name"] = "Automatically added everywhere-powerplant " + generic_ppl.Fueltype + everywhere_ppl["Set"] = "PP" + everywhere_ppl["Technology"] = generic_ppl["Fueltype"] + everywhere_ppl["Capacity"] = 0.0 + + # NaN values for efficiency will be replaced by the generic efficiency by attach_conventional_generators(...) in add_electricity.py later + everywhere_ppl["Efficiency"] = np.nan + + return pd.concat( + [ppl, everywhere_ppl], sort=False, ignore_index=True, verify_integrity=True + ) def replace_natural_gas_technology(df): mapping = {"Steam Turbine": "CCGT", "Combustion Engine": "OCGT"} @@ -149,6 +182,11 @@ if __name__ == "__main__": if countries_wo_ppl := set(countries) - set(ppl.Country.unique()): logging.warning(f"No powerplants known in: {', '.join(countries_wo_ppl)}") + # Add "everywhere powerplants" to all bus locations + ppl = add_everywhere_powerplants( + ppl, n.buses.query("substation_lv"), snakemake.params.everywhere_powerplants + ) + substations = n.buses.query("substation_lv") ppl = ppl.dropna(subset=["lat", "lon"]) ppl = map_country_bus(ppl, substations) From 4d1b301f82e8d9b8c7953904a9ac48181d758443 Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Mon, 8 Jan 2024 09:33:01 +0100 Subject: [PATCH 210/497] Update release_notes.rst --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index d9583065..088ac2c5 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,7 +10,7 @@ Release Notes Upcoming Release ================ -* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/848). +* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). PyPSA-Eur 0.9.0 (5th January 2024) ================================== From 6e630a85e10e1a8218d51da9c7bcdc0cdbb832de Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 08:33:49 +0000 Subject: [PATCH 211/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- envs/environment.fixed.yaml | 978 +++++++++++++++++------------------ scripts/build_powerplants.py | 22 +- 3 files changed, 507 insertions(+), 495 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index d9583065..4cdcf00a 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,7 +10,7 @@ Release Notes Upcoming Release ================ -* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/848). +* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/848). PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index 7dd903a3..5aa51ec3 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -1,492 +1,492 @@ name: pypsa-eur channels: - - bioconda - - gurobi - - http://conda.anaconda.org/gurobi - - conda-forge - - defaults +- bioconda +- gurobi +- http://conda.anaconda.org/gurobi +- conda-forge +- defaults dependencies: - - _libgcc_mutex=0.1 - - _openmp_mutex=4.5 - - affine=2.4.0 - - alsa-lib=1.2.10 - - ampl-mp=3.1.0 - - amply=0.1.6 - - anyio=4.2.0 - - appdirs=1.4.4 - - argon2-cffi=23.1.0 - - argon2-cffi-bindings=21.2.0 - - arrow=1.3.0 - - asttokens=2.4.1 - - async-lru=2.0.4 - - atk-1.0=2.38.0 - - atlite=0.2.12 - - attr=2.5.1 - - attrs=23.2.0 - - aws-c-auth=0.7.8 - - aws-c-cal=0.6.9 - - aws-c-common=0.9.10 - - aws-c-compression=0.2.17 - - aws-c-event-stream=0.3.2 - - aws-c-http=0.7.15 - - aws-c-io=0.13.36 - - aws-c-mqtt=0.10.0 - - aws-c-s3=0.4.7 - - aws-c-sdkutils=0.1.13 - - aws-checksums=0.1.17 - - aws-crt-cpp=0.25.1 - - aws-sdk-cpp=1.11.210 - - babel=2.14.0 - - beautifulsoup4=4.12.2 - - bleach=6.1.0 - - blosc=1.21.5 - - bokeh=3.3.2 - - bottleneck=1.3.7 - - branca=0.7.0 - - brotli=1.1.0 - - brotli-bin=1.1.0 - - brotli-python=1.1.0 - - bzip2=1.0.8 - - c-ares=1.24.0 - - c-blosc2=2.12.0 - - ca-certificates=2023.11.17 - - cached-property=1.5.2 - - cached_property=1.5.2 - - cairo=1.18.0 - - cartopy=0.22.0 - - cdsapi=0.6.1 - - certifi=2023.11.17 - - cffi=1.16.0 - - cfitsio=4.3.1 - - cftime=1.6.3 - - charset-normalizer=3.3.2 - - click=8.1.7 - - click-plugins=1.1.1 - - cligj=0.7.2 - - cloudpickle=3.0.0 - - coin-or-cbc=2.10.10 - - coin-or-cgl=0.60.7 - - coin-or-clp=1.17.8 - - coin-or-osi=0.108.8 - - coin-or-utils=2.11.9 - - coincbc=2.10.10 - - colorama=0.4.6 - - comm=0.1.4 - - configargparse=1.7 - - connection_pool=0.0.3 - - contourpy=1.2.0 - - country_converter=1.2 - - cycler=0.12.1 - - cytoolz=0.12.2 - - dask=2023.12.1 - - dask-core=2023.12.1 - - datrie=0.8.2 - - dbus=1.13.6 - - debugpy=1.8.0 - - decorator=5.1.1 - - defusedxml=0.7.1 - - deprecation=2.1.0 - - descartes=1.1.0 - - distributed=2023.12.1 - - distro=1.8.0 - - docutils=0.20.1 - - dpath=2.1.6 - - entrypoints=0.4 - - entsoe-py=0.6.1 - - et_xmlfile=1.1.0 - - exceptiongroup=1.2.0 - - executing=2.0.1 - - expat=2.5.0 - - fiona=1.9.5 - - folium=0.15.1 - - font-ttf-dejavu-sans-mono=2.37 - - font-ttf-inconsolata=3.000 - - font-ttf-source-code-pro=2.038 - - font-ttf-ubuntu=0.83 - - fontconfig=2.14.2 - - fonts-conda-ecosystem=1 - - fonts-conda-forge=1 - - fonttools=4.47.0 - - fqdn=1.5.1 - - freetype=2.12.1 - - freexl=2.0.0 - - fribidi=1.0.10 - - fsspec=2023.12.2 - - gdal=3.7.3 - - gdk-pixbuf=2.42.10 - - geographiclib=1.52 - - geojson-rewind=1.1.0 - - geopandas=0.14.1 - - geopandas-base=0.14.1 - - geopy=2.4.1 - - geos=3.12.1 - - geotiff=1.7.1 - - gettext=0.21.1 - - gflags=2.2.2 - - giflib=5.2.1 - - gitdb=4.0.11 - - gitpython=3.1.40 - - glib=2.78.3 - - glib-tools=2.78.3 - - glog=0.6.0 - - glpk=5.0 - - gmp=6.3.0 - - graphite2=1.3.13 - - graphviz=9.0.0 - - gst-plugins-base=1.22.8 - - gstreamer=1.22.8 - - gtk2=2.24.33 - - gts=0.7.6 - - gurobi=11.0.0 - - harfbuzz=8.3.0 - - hdf4=4.2.15 - - hdf5=1.14.3 - - humanfriendly=10.0 - - icu=73.2 - - idna=3.6 - - importlib-metadata=7.0.1 - - importlib_metadata=7.0.1 - - importlib_resources=6.1.1 - - iniconfig=2.0.0 - - ipopt=3.14.13 - - ipykernel=6.28.0 - - ipython=8.19.0 - - ipywidgets=8.1.1 - - isoduration=20.11.0 - - jedi=0.19.1 - - jinja2=3.1.2 - - joblib=1.3.2 - - json-c=0.17 - - json5=0.9.14 - - jsonpointer=2.4 - - jsonschema=4.20.0 - - jsonschema-specifications=2023.12.1 - - jsonschema-with-format-nongpl=4.20.0 - - jupyter=1.0.0 - - jupyter-lsp=2.2.1 - - jupyter_client=8.6.0 - - jupyter_console=6.6.3 - - jupyter_core=5.6.1 - - jupyter_events=0.9.0 - - jupyter_server=2.12.1 - - jupyter_server_terminals=0.5.1 - - jupyterlab=4.0.10 - - jupyterlab_pygments=0.3.0 - - jupyterlab_server=2.25.2 - - jupyterlab_widgets=3.0.9 - - kealib=1.5.3 - - keyutils=1.6.1 - - kiwisolver=1.4.5 - - krb5=1.21.2 - - lame=3.100 - - lcms2=2.16 - - ld_impl_linux-64=2.40 - - lerc=4.0.0 - - libabseil=20230802.1 - - libaec=1.1.2 - - libarchive=3.7.2 - - libarrow=14.0.2 - - libarrow-acero=14.0.2 - - libarrow-dataset=14.0.2 - - libarrow-flight=14.0.2 - - libarrow-flight-sql=14.0.2 - - libarrow-gandiva=14.0.2 - - libarrow-substrait=14.0.2 - - libblas=3.9.0 - - libboost-headers=1.84.0 - - libbrotlicommon=1.1.0 - - libbrotlidec=1.1.0 - - libbrotlienc=1.1.0 - - libcap=2.69 - - libcblas=3.9.0 - - libclang=15.0.7 - - libclang13=15.0.7 - - libcrc32c=1.1.2 - - libcups=2.3.3 - - libcurl=8.5.0 - - libdeflate=1.19 - - libedit=3.1.20191231 - - libev=4.33 - - libevent=2.1.12 - - libexpat=2.5.0 - - libffi=3.4.2 - - libflac=1.4.3 - - libgcc-ng=13.2.0 - - libgcrypt=1.10.3 - - libgd=2.3.3 - - libgdal=3.7.3 - - libgfortran-ng=13.2.0 - - libgfortran5=13.2.0 - - libglib=2.78.3 - - libgomp=13.2.0 - - libgoogle-cloud=2.12.0 - - libgpg-error=1.47 - - libgrpc=1.59.3 - - libhwloc=2.9.1 - - libiconv=1.17 - - libjpeg-turbo=3.0.0 - - libkml=1.3.0 - - liblapack=3.9.0 - - liblapacke=3.9.0 - - libllvm15=15.0.7 - - libnetcdf=4.9.2 - - libnghttp2=1.58.0 - - libnl=3.9.0 - - libnsl=2.0.1 - - libnuma=2.0.16 - - libogg=1.3.4 - - libopenblas=0.3.25 - - libopus=1.3.1 - - libparquet=14.0.2 - - libpng=1.6.39 - - libpq=16.1 - - libprotobuf=4.24.4 - - libre2-11=2023.06.02 - - librsvg=2.56.3 - - librttopo=1.1.0 - - libsndfile=1.2.2 - - libsodium=1.0.18 - - libspatialindex=1.9.3 - - libspatialite=5.1.0 - - libspral=2023.08.02 - - libsqlite=3.44.2 - - libssh2=1.11.0 - - libstdcxx-ng=13.2.0 - - libsystemd0=255 - - libthrift=0.19.0 - - libtiff=4.6.0 - - libutf8proc=2.8.0 - - libuuid=2.38.1 - - libvorbis=1.3.7 - - libwebp=1.3.2 - - libwebp-base=1.3.2 - - libxcb=1.15 - - libxcrypt=4.4.36 - - libxkbcommon=1.6.0 - - libxml2=2.11.6 - - libxslt=1.1.37 - - libzip=1.10.1 - - libzlib=1.2.13 - - linopy=0.3.2 - - locket=1.0.0 - - lxml=4.9.3 - - lz4=4.3.2 - - lz4-c=1.9.4 - - lzo=2.10 - - mapclassify=2.6.1 - - markupsafe=2.1.3 - - matplotlib=3.8.2 - - matplotlib-base=3.8.2 - - matplotlib-inline=0.1.6 - - memory_profiler=0.61.0 - - metis=5.1.0 - - minizip=4.0.4 - - mistune=3.0.2 - - mpg123=1.32.3 - - msgpack-python=1.0.7 - - mumps-include=5.2.1 - - mumps-seq=5.2.1 - - munch=4.0.0 - - munkres=1.1.4 - - mysql-common=8.0.33 - - mysql-libs=8.0.33 - - nbclient=0.8.0 - - nbconvert=7.14.0 - - nbconvert-core=7.14.0 - - nbconvert-pandoc=7.14.0 - - nbformat=5.9.2 - - ncurses=6.4 - - nest-asyncio=1.5.8 - - netcdf4=1.6.5 - - networkx=3.2.1 - - nomkl=1.0 - - notebook=7.0.6 - - notebook-shim=0.2.3 - - nspr=4.35 - - nss=3.96 - - numexpr=2.8.8 - - numpy=1.26.2 - - openjdk=21.0.1 - - openjpeg=2.5.0 - - openpyxl=3.1.2 - - openssl=3.2.0 - - orc=1.9.2 - - overrides=7.4.0 - - packaging=23.2 - - pandas=2.1.4 - - pandoc=3.1.3 - - pandocfilters=1.5.0 - - pango=1.50.14 - - parso=0.8.3 - - partd=1.4.1 - - patsy=0.5.5 - - pcre2=10.42 - - pexpect=4.8.0 - - pickleshare=0.7.5 - - pillow=10.2.0 - - pip=23.3.2 - - pixman=0.42.2 - - pkgutil-resolve-name=1.3.10 - - plac=1.4.2 - - platformdirs=4.1.0 - - pluggy=1.3.0 - - ply=3.11 - - poppler=23.12.0 - - poppler-data=0.4.12 - - postgresql=16.1 - - powerplantmatching=0.5.8 - - progressbar2=4.3.2 - - proj=9.3.0 - - prometheus_client=0.19.0 - - prompt-toolkit=3.0.42 - - prompt_toolkit=3.0.42 - - psutil=5.9.7 - - pthread-stubs=0.4 - - ptyprocess=0.7.0 - - pulp=2.7.0 - - pulseaudio-client=16.1 - - pure_eval=0.2.2 - - py-cpuinfo=9.0.0 - - pyarrow=14.0.2 - - pyarrow-hotfix=0.6 - - pycountry=22.3.5 - - pycparser=2.21 - - pygments=2.17.2 - - pyomo=6.6.1 - - pyparsing=3.1.1 - - pyproj=3.6.1 - - pypsa=0.26.2 - - pyqt=5.15.9 - - pyqt5-sip=12.12.2 - - pyshp=2.3.1 - - pysocks=1.7.1 - - pytables=3.9.2 - - pytest=7.4.4 - - python=3.11.7 - - python-dateutil=2.8.2 - - python-fastjsonschema=2.19.1 - - python-json-logger=2.0.7 - - python-tzdata=2023.4 - - python-utils=3.8.1 - - python_abi=3.11 - - pytz=2023.3.post1 - - pyxlsb=1.0.10 - - pyyaml=6.0.1 - - pyzmq=25.1.2 - - qt-main=5.15.8 - - qtconsole-base=5.5.1 - - qtpy=2.4.1 - - rasterio=1.3.9 - - rdma-core=49.0 - - re2=2023.06.02 - - readline=8.2 - - referencing=0.32.0 - - requests=2.31.0 - - reretry=0.11.8 - - rfc3339-validator=0.1.4 - - rfc3986-validator=0.1.1 - - rioxarray=0.15.0 - - rpds-py=0.16.2 - - rtree=1.1.0 - - s2n=1.4.1 - - scikit-learn=1.3.2 - - scipy=1.11.4 - - scotch=6.0.9 - - seaborn=0.13.0 - - seaborn-base=0.13.0 - - send2trash=1.8.2 - - setuptools=69.0.3 - - setuptools-scm=8.0.4 - - setuptools_scm=8.0.4 - - shapely=2.0.2 - - sip=6.7.12 - - six=1.16.0 - - smart_open=6.4.0 - - smmap=5.0.0 - - snakemake-minimal=7.32.4 - - snappy=1.1.10 - - sniffio=1.3.0 - - snuggs=1.4.7 - - sortedcontainers=2.4.0 - - soupsieve=2.5 - - sqlite=3.44.2 - - stack_data=0.6.2 - - statsmodels=0.14.1 - - stopit=1.1.2 - - tabula-py=2.7.0 - - tabulate=0.9.0 - - tblib=3.0.0 - - terminado=0.18.0 - - threadpoolctl=3.2.0 - - throttler=1.2.2 - - tiledb=2.18.2 - - tinycss2=1.2.1 - - tk=8.6.13 - - toml=0.10.2 - - tomli=2.0.1 - - toolz=0.12.0 - - toposort=1.10 - - tornado=6.3.3 - - tqdm=4.66.1 - - traitlets=5.14.1 - - types-python-dateutil=2.8.19.14 - - typing-extensions=4.9.0 - - typing_extensions=4.9.0 - - typing_utils=0.1.0 - - tzcode=2023d - - tzdata=2023d - - ucx=1.15.0 - - unidecode=1.3.7 - - unixodbc=2.3.12 - - uri-template=1.3.0 - - uriparser=0.9.7 - - urllib3=2.1.0 - - validators=0.22.0 - - wcwidth=0.2.12 - - webcolors=1.13 - - webencodings=0.5.1 - - websocket-client=1.7.0 - - wheel=0.42.0 - - widgetsnbextension=4.0.9 - - wrapt=1.16.0 - - xarray=2023.12.0 - - xcb-util=0.4.0 - - xcb-util-image=0.4.0 - - xcb-util-keysyms=0.4.0 - - xcb-util-renderutil=0.3.9 - - xcb-util-wm=0.4.1 - - xerces-c=3.2.5 - - xkeyboard-config=2.40 - - xlrd=2.0.1 - - xorg-fixesproto=5.0 - - xorg-inputproto=2.3.2 - - xorg-kbproto=1.0.7 - - xorg-libice=1.1.1 - - xorg-libsm=1.2.4 - - xorg-libx11=1.8.7 - - xorg-libxau=1.0.11 - - xorg-libxdmcp=1.1.3 - - xorg-libxext=1.3.4 - - xorg-libxfixes=5.0.3 - - xorg-libxi=1.7.10 - - xorg-libxrender=0.9.11 - - xorg-libxt=1.3.0 - - xorg-libxtst=1.2.3 - - xorg-recordproto=1.14.2 - - xorg-renderproto=0.11.1 - - xorg-xextproto=7.3.0 - - xorg-xf86vidmodeproto=2.3.1 - - xorg-xproto=7.0.31 - - xyzservices=2023.10.1 - - xz=5.2.6 - - yaml=0.2.5 - - yte=1.5.4 - - zeromq=4.3.5 - - zict=3.0.0 - - zipp=3.17.0 - - zlib=1.2.13 - - zlib-ng=2.0.7 - - zstd=1.5.5 - - pip: - - highspy==1.5.3 - - tsam==2.3.1 +- _libgcc_mutex=0.1 +- _openmp_mutex=4.5 +- affine=2.4.0 +- alsa-lib=1.2.10 +- ampl-mp=3.1.0 +- amply=0.1.6 +- anyio=4.2.0 +- appdirs=1.4.4 +- argon2-cffi=23.1.0 +- argon2-cffi-bindings=21.2.0 +- arrow=1.3.0 +- asttokens=2.4.1 +- async-lru=2.0.4 +- atk-1.0=2.38.0 +- atlite=0.2.12 +- attr=2.5.1 +- attrs=23.2.0 +- aws-c-auth=0.7.8 +- aws-c-cal=0.6.9 +- aws-c-common=0.9.10 +- aws-c-compression=0.2.17 +- aws-c-event-stream=0.3.2 +- aws-c-http=0.7.15 +- aws-c-io=0.13.36 +- aws-c-mqtt=0.10.0 +- aws-c-s3=0.4.7 +- aws-c-sdkutils=0.1.13 +- aws-checksums=0.1.17 +- aws-crt-cpp=0.25.1 +- aws-sdk-cpp=1.11.210 +- babel=2.14.0 +- beautifulsoup4=4.12.2 +- bleach=6.1.0 +- blosc=1.21.5 +- bokeh=3.3.2 +- bottleneck=1.3.7 +- branca=0.7.0 +- brotli=1.1.0 +- brotli-bin=1.1.0 +- brotli-python=1.1.0 +- bzip2=1.0.8 +- c-ares=1.24.0 +- c-blosc2=2.12.0 +- ca-certificates=2023.11.17 +- cached-property=1.5.2 +- cached_property=1.5.2 +- cairo=1.18.0 +- cartopy=0.22.0 +- cdsapi=0.6.1 +- certifi=2023.11.17 +- cffi=1.16.0 +- cfitsio=4.3.1 +- cftime=1.6.3 +- charset-normalizer=3.3.2 +- click=8.1.7 +- click-plugins=1.1.1 +- cligj=0.7.2 +- cloudpickle=3.0.0 +- coin-or-cbc=2.10.10 +- coin-or-cgl=0.60.7 +- coin-or-clp=1.17.8 +- coin-or-osi=0.108.8 +- coin-or-utils=2.11.9 +- coincbc=2.10.10 +- colorama=0.4.6 +- comm=0.1.4 +- configargparse=1.7 +- connection_pool=0.0.3 +- contourpy=1.2.0 +- country_converter=1.2 +- cycler=0.12.1 +- cytoolz=0.12.2 +- dask=2023.12.1 +- dask-core=2023.12.1 +- datrie=0.8.2 +- dbus=1.13.6 +- debugpy=1.8.0 +- decorator=5.1.1 +- defusedxml=0.7.1 +- deprecation=2.1.0 +- descartes=1.1.0 +- distributed=2023.12.1 +- distro=1.8.0 +- docutils=0.20.1 +- dpath=2.1.6 +- entrypoints=0.4 +- entsoe-py=0.6.1 +- et_xmlfile=1.1.0 +- exceptiongroup=1.2.0 +- executing=2.0.1 +- expat=2.5.0 +- fiona=1.9.5 +- folium=0.15.1 +- font-ttf-dejavu-sans-mono=2.37 +- font-ttf-inconsolata=3.000 +- font-ttf-source-code-pro=2.038 +- font-ttf-ubuntu=0.83 +- fontconfig=2.14.2 +- fonts-conda-ecosystem=1 +- fonts-conda-forge=1 +- fonttools=4.47.0 +- fqdn=1.5.1 +- freetype=2.12.1 +- freexl=2.0.0 +- fribidi=1.0.10 +- fsspec=2023.12.2 +- gdal=3.7.3 +- gdk-pixbuf=2.42.10 +- geographiclib=1.52 +- geojson-rewind=1.1.0 +- geopandas=0.14.1 +- geopandas-base=0.14.1 +- geopy=2.4.1 +- geos=3.12.1 +- geotiff=1.7.1 +- gettext=0.21.1 +- gflags=2.2.2 +- giflib=5.2.1 +- gitdb=4.0.11 +- gitpython=3.1.40 +- glib=2.78.3 +- glib-tools=2.78.3 +- glog=0.6.0 +- glpk=5.0 +- gmp=6.3.0 +- graphite2=1.3.13 +- graphviz=9.0.0 +- gst-plugins-base=1.22.8 +- gstreamer=1.22.8 +- gtk2=2.24.33 +- gts=0.7.6 +- gurobi=11.0.0 +- harfbuzz=8.3.0 +- hdf4=4.2.15 +- hdf5=1.14.3 +- humanfriendly=10.0 +- icu=73.2 +- idna=3.6 +- importlib-metadata=7.0.1 +- importlib_metadata=7.0.1 +- importlib_resources=6.1.1 +- iniconfig=2.0.0 +- ipopt=3.14.13 +- ipykernel=6.28.0 +- ipython=8.19.0 +- ipywidgets=8.1.1 +- isoduration=20.11.0 +- jedi=0.19.1 +- jinja2=3.1.2 +- joblib=1.3.2 +- json-c=0.17 +- json5=0.9.14 +- jsonpointer=2.4 +- jsonschema=4.20.0 +- jsonschema-specifications=2023.12.1 +- jsonschema-with-format-nongpl=4.20.0 +- jupyter=1.0.0 +- jupyter-lsp=2.2.1 +- jupyter_client=8.6.0 +- jupyter_console=6.6.3 +- jupyter_core=5.6.1 +- jupyter_events=0.9.0 +- jupyter_server=2.12.1 +- jupyter_server_terminals=0.5.1 +- jupyterlab=4.0.10 +- jupyterlab_pygments=0.3.0 +- jupyterlab_server=2.25.2 +- jupyterlab_widgets=3.0.9 +- kealib=1.5.3 +- keyutils=1.6.1 +- kiwisolver=1.4.5 +- krb5=1.21.2 +- lame=3.100 +- lcms2=2.16 +- ld_impl_linux-64=2.40 +- lerc=4.0.0 +- libabseil=20230802.1 +- libaec=1.1.2 +- libarchive=3.7.2 +- libarrow=14.0.2 +- libarrow-acero=14.0.2 +- libarrow-dataset=14.0.2 +- libarrow-flight=14.0.2 +- libarrow-flight-sql=14.0.2 +- libarrow-gandiva=14.0.2 +- libarrow-substrait=14.0.2 +- libblas=3.9.0 +- libboost-headers=1.84.0 +- libbrotlicommon=1.1.0 +- libbrotlidec=1.1.0 +- libbrotlienc=1.1.0 +- libcap=2.69 +- libcblas=3.9.0 +- libclang=15.0.7 +- libclang13=15.0.7 +- libcrc32c=1.1.2 +- libcups=2.3.3 +- libcurl=8.5.0 +- libdeflate=1.19 +- libedit=3.1.20191231 +- libev=4.33 +- libevent=2.1.12 +- libexpat=2.5.0 +- libffi=3.4.2 +- libflac=1.4.3 +- libgcc-ng=13.2.0 +- libgcrypt=1.10.3 +- libgd=2.3.3 +- libgdal=3.7.3 +- libgfortran-ng=13.2.0 +- libgfortran5=13.2.0 +- libglib=2.78.3 +- libgomp=13.2.0 +- libgoogle-cloud=2.12.0 +- libgpg-error=1.47 +- libgrpc=1.59.3 +- libhwloc=2.9.1 +- libiconv=1.17 +- libjpeg-turbo=3.0.0 +- libkml=1.3.0 +- liblapack=3.9.0 +- liblapacke=3.9.0 +- libllvm15=15.0.7 +- libnetcdf=4.9.2 +- libnghttp2=1.58.0 +- libnl=3.9.0 +- libnsl=2.0.1 +- libnuma=2.0.16 +- libogg=1.3.4 +- libopenblas=0.3.25 +- libopus=1.3.1 +- libparquet=14.0.2 +- libpng=1.6.39 +- libpq=16.1 +- libprotobuf=4.24.4 +- libre2-11=2023.06.02 +- librsvg=2.56.3 +- librttopo=1.1.0 +- libsndfile=1.2.2 +- libsodium=1.0.18 +- libspatialindex=1.9.3 +- libspatialite=5.1.0 +- libspral=2023.08.02 +- libsqlite=3.44.2 +- libssh2=1.11.0 +- libstdcxx-ng=13.2.0 +- libsystemd0=255 +- libthrift=0.19.0 +- libtiff=4.6.0 +- libutf8proc=2.8.0 +- libuuid=2.38.1 +- libvorbis=1.3.7 +- libwebp=1.3.2 +- libwebp-base=1.3.2 +- libxcb=1.15 +- libxcrypt=4.4.36 +- libxkbcommon=1.6.0 +- libxml2=2.11.6 +- libxslt=1.1.37 +- libzip=1.10.1 +- libzlib=1.2.13 +- linopy=0.3.2 +- locket=1.0.0 +- lxml=4.9.3 +- lz4=4.3.2 +- lz4-c=1.9.4 +- lzo=2.10 +- mapclassify=2.6.1 +- markupsafe=2.1.3 +- matplotlib=3.8.2 +- matplotlib-base=3.8.2 +- matplotlib-inline=0.1.6 +- memory_profiler=0.61.0 +- metis=5.1.0 +- minizip=4.0.4 +- mistune=3.0.2 +- mpg123=1.32.3 +- msgpack-python=1.0.7 +- mumps-include=5.2.1 +- mumps-seq=5.2.1 +- munch=4.0.0 +- munkres=1.1.4 +- mysql-common=8.0.33 +- mysql-libs=8.0.33 +- nbclient=0.8.0 +- nbconvert=7.14.0 +- nbconvert-core=7.14.0 +- nbconvert-pandoc=7.14.0 +- nbformat=5.9.2 +- ncurses=6.4 +- nest-asyncio=1.5.8 +- netcdf4=1.6.5 +- networkx=3.2.1 +- nomkl=1.0 +- notebook=7.0.6 +- notebook-shim=0.2.3 +- nspr=4.35 +- nss=3.96 +- numexpr=2.8.8 +- numpy=1.26.2 +- openjdk=21.0.1 +- openjpeg=2.5.0 +- openpyxl=3.1.2 +- openssl=3.2.0 +- orc=1.9.2 +- overrides=7.4.0 +- packaging=23.2 +- pandas=2.1.4 +- pandoc=3.1.3 +- pandocfilters=1.5.0 +- pango=1.50.14 +- parso=0.8.3 +- partd=1.4.1 +- patsy=0.5.5 +- pcre2=10.42 +- pexpect=4.8.0 +- pickleshare=0.7.5 +- pillow=10.2.0 +- pip=23.3.2 +- pixman=0.42.2 +- pkgutil-resolve-name=1.3.10 +- plac=1.4.2 +- platformdirs=4.1.0 +- pluggy=1.3.0 +- ply=3.11 +- poppler=23.12.0 +- poppler-data=0.4.12 +- postgresql=16.1 +- powerplantmatching=0.5.8 +- progressbar2=4.3.2 +- proj=9.3.0 +- prometheus_client=0.19.0 +- prompt-toolkit=3.0.42 +- prompt_toolkit=3.0.42 +- psutil=5.9.7 +- pthread-stubs=0.4 +- ptyprocess=0.7.0 +- pulp=2.7.0 +- pulseaudio-client=16.1 +- pure_eval=0.2.2 +- py-cpuinfo=9.0.0 +- pyarrow=14.0.2 +- pyarrow-hotfix=0.6 +- pycountry=22.3.5 +- pycparser=2.21 +- pygments=2.17.2 +- pyomo=6.6.1 +- pyparsing=3.1.1 +- pyproj=3.6.1 +- pypsa=0.26.2 +- pyqt=5.15.9 +- pyqt5-sip=12.12.2 +- pyshp=2.3.1 +- pysocks=1.7.1 +- pytables=3.9.2 +- pytest=7.4.4 +- python=3.11.7 +- python-dateutil=2.8.2 +- python-fastjsonschema=2.19.1 +- python-json-logger=2.0.7 +- python-tzdata=2023.4 +- python-utils=3.8.1 +- python_abi=3.11 +- pytz=2023.3.post1 +- pyxlsb=1.0.10 +- pyyaml=6.0.1 +- pyzmq=25.1.2 +- qt-main=5.15.8 +- qtconsole-base=5.5.1 +- qtpy=2.4.1 +- rasterio=1.3.9 +- rdma-core=49.0 +- re2=2023.06.02 +- readline=8.2 +- referencing=0.32.0 +- requests=2.31.0 +- reretry=0.11.8 +- rfc3339-validator=0.1.4 +- rfc3986-validator=0.1.1 +- rioxarray=0.15.0 +- rpds-py=0.16.2 +- rtree=1.1.0 +- s2n=1.4.1 +- scikit-learn=1.3.2 +- scipy=1.11.4 +- scotch=6.0.9 +- seaborn=0.13.0 +- seaborn-base=0.13.0 +- send2trash=1.8.2 +- setuptools=69.0.3 +- setuptools-scm=8.0.4 +- setuptools_scm=8.0.4 +- shapely=2.0.2 +- sip=6.7.12 +- six=1.16.0 +- smart_open=6.4.0 +- smmap=5.0.0 +- snakemake-minimal=7.32.4 +- snappy=1.1.10 +- sniffio=1.3.0 +- snuggs=1.4.7 +- sortedcontainers=2.4.0 +- soupsieve=2.5 +- sqlite=3.44.2 +- stack_data=0.6.2 +- statsmodels=0.14.1 +- stopit=1.1.2 +- tabula-py=2.7.0 +- tabulate=0.9.0 +- tblib=3.0.0 +- terminado=0.18.0 +- threadpoolctl=3.2.0 +- throttler=1.2.2 +- tiledb=2.18.2 +- tinycss2=1.2.1 +- tk=8.6.13 +- toml=0.10.2 +- tomli=2.0.1 +- toolz=0.12.0 +- toposort=1.10 +- tornado=6.3.3 +- tqdm=4.66.1 +- traitlets=5.14.1 +- types-python-dateutil=2.8.19.14 +- typing-extensions=4.9.0 +- typing_extensions=4.9.0 +- typing_utils=0.1.0 +- tzcode=2023d +- tzdata=2023d +- ucx=1.15.0 +- unidecode=1.3.7 +- unixodbc=2.3.12 +- uri-template=1.3.0 +- uriparser=0.9.7 +- urllib3=2.1.0 +- validators=0.22.0 +- wcwidth=0.2.12 +- webcolors=1.13 +- webencodings=0.5.1 +- websocket-client=1.7.0 +- wheel=0.42.0 +- widgetsnbextension=4.0.9 +- wrapt=1.16.0 +- xarray=2023.12.0 +- xcb-util=0.4.0 +- xcb-util-image=0.4.0 +- xcb-util-keysyms=0.4.0 +- xcb-util-renderutil=0.3.9 +- xcb-util-wm=0.4.1 +- xerces-c=3.2.5 +- xkeyboard-config=2.40 +- xlrd=2.0.1 +- xorg-fixesproto=5.0 +- xorg-inputproto=2.3.2 +- xorg-kbproto=1.0.7 +- xorg-libice=1.1.1 +- xorg-libsm=1.2.4 +- xorg-libx11=1.8.7 +- xorg-libxau=1.0.11 +- xorg-libxdmcp=1.1.3 +- xorg-libxext=1.3.4 +- xorg-libxfixes=5.0.3 +- xorg-libxi=1.7.10 +- xorg-libxrender=0.9.11 +- xorg-libxt=1.3.0 +- xorg-libxtst=1.2.3 +- xorg-recordproto=1.14.2 +- xorg-renderproto=0.11.1 +- xorg-xextproto=7.3.0 +- xorg-xf86vidmodeproto=2.3.1 +- xorg-xproto=7.0.31 +- xyzservices=2023.10.1 +- xz=5.2.6 +- yaml=0.2.5 +- yte=1.5.4 +- zeromq=4.3.5 +- zict=3.0.0 +- zipp=3.17.0 +- zlib=1.2.13 +- zlib-ng=2.0.7 +- zstd=1.5.5 +- pip: + - highspy==1.5.3 + - tsam==2.3.1 diff --git a/scripts/build_powerplants.py b/scripts/build_powerplants.py index 69920aa7..16683bee 100755 --- a/scripts/build_powerplants.py +++ b/scripts/build_powerplants.py @@ -84,9 +84,9 @@ In addition the configuration option ``electricity: everywhere_powerplants`` can everywhere_powerplants: ['Natural Gas', 'Coal', 'nuclear', 'OCGT'] """ +import itertools import logging -import itertools import numpy as np import pandas as pd import powerplantmatching as pm @@ -107,18 +107,29 @@ def add_custom_powerplants(ppl, custom_powerplants, custom_ppl_query=False): [ppl, add_ppls], sort=False, ignore_index=True, verify_integrity=True ) + def add_everywhere_powerplants(ppl, substations, everywhere_powerplants): # Create a dataframe with "everywhere_powerplants" of stated carriers at the location of all substations generic_ppl = ( - pd.DataFrame(itertools.product(substations.index.values, everywhere_powerplants), columns=["substation_index","Fueltype"]) - .merge(substations[["x","y","country"]], left_on="substation_index", right_index=True) + pd.DataFrame( + itertools.product(substations.index.values, everywhere_powerplants), + columns=["substation_index", "Fueltype"], + ).merge( + substations[["x", "y", "country"]], + left_on="substation_index", + right_index=True, + ) ).drop(columns="substation_index") # PPL uses different columns names compared to substations dataframe -> rename - everywhere_ppl = everywhere_ppl.rename(columns={"x":"lon","y":"lat","country":"Country"}) + everywhere_ppl = everywhere_ppl.rename( + columns={"x": "lon", "y": "lat", "country": "Country"} + ) # Add default values for the generic powerplants - everywhere_ppl["Name"] = "Automatically added everywhere-powerplant " + generic_ppl.Fueltype + everywhere_ppl["Name"] = ( + "Automatically added everywhere-powerplant " + generic_ppl.Fueltype + ) everywhere_ppl["Set"] = "PP" everywhere_ppl["Technology"] = generic_ppl["Fueltype"] everywhere_ppl["Capacity"] = 0.0 @@ -130,6 +141,7 @@ def add_everywhere_powerplants(ppl, substations, everywhere_powerplants): [ppl, everywhere_ppl], sort=False, ignore_index=True, verify_integrity=True ) + def replace_natural_gas_technology(df): mapping = {"Steam Turbine": "CCGT", "Combustion Engine": "OCGT"} tech = df.Technology.replace(mapping).fillna("CCGT") From 33edb0b5166f3f0568a08832b01dfc2709be03f5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 08:40:44 +0000 Subject: [PATCH 212/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 088ac2c5..940a391c 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,7 +10,7 @@ Release Notes Upcoming Release ================ -* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). +* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). PyPSA-Eur 0.9.0 (5th January 2024) ================================== From 61211eb87ba0e484536308ec70fc8a4eb3a31ff6 Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Mon, 8 Jan 2024 09:45:14 +0100 Subject: [PATCH 213/497] Fix variable name --- scripts/build_powerplants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_powerplants.py b/scripts/build_powerplants.py index 16683bee..f94000c6 100755 --- a/scripts/build_powerplants.py +++ b/scripts/build_powerplants.py @@ -110,7 +110,7 @@ def add_custom_powerplants(ppl, custom_powerplants, custom_ppl_query=False): def add_everywhere_powerplants(ppl, substations, everywhere_powerplants): # Create a dataframe with "everywhere_powerplants" of stated carriers at the location of all substations - generic_ppl = ( + everywhere_ppl = ( pd.DataFrame( itertools.product(substations.index.values, everywhere_powerplants), columns=["substation_index", "Fueltype"], From 91843ace9368a1a86755d2114dbf1feb83d1ec14 Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Mon, 8 Jan 2024 09:48:06 +0100 Subject: [PATCH 214/497] Restore REUSE compatability for environment.fixed.yaml --- envs/environment.fixed.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index 5aa51ec3..31a58835 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + name: pypsa-eur channels: - bioconda From 962517d559fc779e3375c1e7ee88c8289a124232 Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Mon, 8 Jan 2024 09:49:44 +0100 Subject: [PATCH 215/497] Fix variable names --- scripts/build_powerplants.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build_powerplants.py b/scripts/build_powerplants.py index f94000c6..5b7e7415 100755 --- a/scripts/build_powerplants.py +++ b/scripts/build_powerplants.py @@ -126,12 +126,12 @@ def add_everywhere_powerplants(ppl, substations, everywhere_powerplants): columns={"x": "lon", "y": "lat", "country": "Country"} ) - # Add default values for the generic powerplants + # Add default values for the powerplants everywhere_ppl["Name"] = ( - "Automatically added everywhere-powerplant " + generic_ppl.Fueltype + "Automatically added everywhere-powerplant " + everywhere_ppl.Fueltype ) everywhere_ppl["Set"] = "PP" - everywhere_ppl["Technology"] = generic_ppl["Fueltype"] + everywhere_ppl["Technology"] = everywhere_ppl["Fueltype"] everywhere_ppl["Capacity"] = 0.0 # NaN values for efficiency will be replaced by the generic efficiency by attach_conventional_generators(...) in add_electricity.py later From c284223a3833a19c93034e3465b645dfaf9062f3 Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Mon, 8 Jan 2024 13:56:02 +0100 Subject: [PATCH 216/497] Fix error for multi-horizon models --- scripts/build_powerplants.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/build_powerplants.py b/scripts/build_powerplants.py index 5b7e7415..b9339cbf 100755 --- a/scripts/build_powerplants.py +++ b/scripts/build_powerplants.py @@ -134,6 +134,11 @@ def add_everywhere_powerplants(ppl, substations, everywhere_powerplants): everywhere_ppl["Technology"] = everywhere_ppl["Fueltype"] everywhere_ppl["Capacity"] = 0.0 + # Assign plausible values for the commissioning and decommissioning years + # required for multi-year models + everywhere_ppl["DateIn"] = ppl["DateIn"].min() + everywhere_ppl["DateOut"] = ppl["DateOut"].max() + # NaN values for efficiency will be replaced by the generic efficiency by attach_conventional_generators(...) in add_electricity.py later everywhere_ppl["Efficiency"] = np.nan From dc90398b12bb49788f5f588e466e656f8737a893 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:57:33 +0000 Subject: [PATCH 217/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_powerplants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_powerplants.py b/scripts/build_powerplants.py index b9339cbf..8f99cd41 100755 --- a/scripts/build_powerplants.py +++ b/scripts/build_powerplants.py @@ -135,7 +135,7 @@ def add_everywhere_powerplants(ppl, substations, everywhere_powerplants): everywhere_ppl["Capacity"] = 0.0 # Assign plausible values for the commissioning and decommissioning years - # required for multi-year models + # required for multi-year models everywhere_ppl["DateIn"] = ppl["DateIn"].min() everywhere_ppl["DateOut"] = ppl["DateOut"].max() From 725a0ef8c01d810a99f57b92469061e7755a7cc4 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 10 Jan 2024 16:17:16 +0100 Subject: [PATCH 218/497] maybe_adjust_cost_and_potentials: cover all flags --- scripts/prepare_sector_network.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 37d6f0d2..69c2d467 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3346,7 +3346,7 @@ def remove_h2_network(n): def maybe_adjust_costs_and_potentials(n, opts): for o in opts: - flags = ["+e", "+p", "+m"] + flags = ["+e", "+p", "+m", "+c"] if all(flag not in o for flag in flags): continue oo = o.split("+") @@ -3361,7 +3361,12 @@ def maybe_adjust_costs_and_potentials(n, opts): suptechs = map(lambda c: c.split("-", 2)[0], carrier_list) if oo[0].startswith(tuple(suptechs)): carrier = oo[0] - attr_lookup = {"p": "p_nom_max", "e": "e_nom_max", "c": "capital_cost"} + attr_lookup = { + "p": "p_nom_max", + "e": "e_nom_max", + "c": "capital_cost", + "m": "marginal_cost", + } attr = attr_lookup[oo[1][0]] factor = float(oo[1][1:]) # beware if factor is 0 and p_nom_max is np.inf, 0*np.inf is nan From a6edce58fbfbf049eb6f6726d8a9535754b00c9d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 11 Jan 2024 09:47:09 +0100 Subject: [PATCH 219/497] remove wave energy generator --- config/config.default.yaml | 1 - doc/configtables/licenses-sector.csv | 1 - doc/release_notes.rst | 3 ++ scripts/prepare_sector_network.py | 47 ---------------------------- 4 files changed, 3 insertions(+), 49 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 7ef08e2f..1d28223f 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -814,7 +814,6 @@ plotting: hydroelectricity: '#298c81' PHS: '#51dbcc' hydro+PHS: "#08ad97" - wave: '#a7d4cf' # solar solar: "#f9d002" solar PV: "#f9d002" diff --git a/doc/configtables/licenses-sector.csv b/doc/configtables/licenses-sector.csv index d65d3b36..a297b2f6 100644 --- a/doc/configtables/licenses-sector.csv +++ b/doc/configtables/licenses-sector.csv @@ -9,7 +9,6 @@ Swiss energy statistics from Swiss Federal Office of Energy,switzerland-sfoe/,un BASt emobility statistics,emobility/,unknown,http://www.bast.de/DE/Verkehrstechnik/Fachthemen/v2-verkehrszaehlung/Stundenwerte.html?nn=626916 BDEW heating profile,heat_load_profile_BDEW.csv,unknown,https://github.com/oemof/demandlib heating profiles for Aarhus,heat_load_profile_DK_AdamJensen.csv,unknown,Adam Jensen MA thesis at Aarhus University -George Lavidas wind/wave costs,WindWaveWEC_GLTB.xlsx,unknown,George Lavidas co2 budgets,co2_budget.csv,CC BY 4.0,https://arxiv.org/abs/2004.11009 existing heating potentials,existing_infrastructure/existing_heating_raw.csv,unknown,https://ec.europa.eu/energy/studies/mapping-and-analyses-current-and-future-2020-2030-heatingcooling-fuel-deployment_en?redir=1 IRENA existing VRE capacities,existing_infrastructure/{solar|onwind|offwind}_capcity_IRENA.csv,unknown,https://www.irena.org/Statistics/Download-Data diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 940a391c..be6be9fd 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -12,6 +12,9 @@ Upcoming Release * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). +* Remove option for wave energy as technology data is not maintained. + + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 69c2d467..b57b832c 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -913,47 +913,6 @@ def add_ammonia(n, costs): ) -def add_wave(n, wave_cost_factor): - # TODO: handle in Snakefile - wave_fn = "data/WindWaveWEC_GLTB.xlsx" - - # in kW - capacity = pd.Series({"Attenuator": 750, "F2HB": 1000, "MultiPA": 600}) - - # in EUR/MW - annuity_factor = calculate_annuity(25, 0.07) + 0.03 - costs = ( - 1e6 - * wave_cost_factor - * annuity_factor - * pd.Series({"Attenuator": 2.5, "F2HB": 2, "MultiPA": 1.5}) - ) - - sheets = pd.read_excel( - wave_fn, - sheet_name=["FirthForth", "Hebrides"], - usecols=["Attenuator", "F2HB", "MultiPA"], - index_col=0, - skiprows=[0], - parse_dates=True, - ) - - wave = pd.concat( - [sheets[l].divide(capacity, axis=1) for l in locations], keys=locations, axis=1 - ) - - for wave_type in costs.index: - n.add( - "Generator", - "Hebrides " + wave_type, - bus="GB4 0", # TODO this location is hardcoded - p_nom_extendable=True, - carrier="wave", - capital_cost=costs[wave_type], - p_max_pu=wave["Hebrides", wave_type], - ) - - def insert_electricity_distribution_grid(n, costs): # TODO pop_layout? # TODO options? @@ -3698,12 +3657,6 @@ if __name__ == "__main__": # TODO merge with opts cost adjustment below for o in opts: - if o[:4] == "wave": - wave_cost_factor = float(o[4:].replace("p", ".").replace("m", "-")) - logger.info( - f"Including wave generators with cost factor of {wave_cost_factor}" - ) - add_wave(n, wave_cost_factor) if o[:4] == "dist": options["electricity_distribution_grid"] = True options["electricity_distribution_grid_cost_factor"] = float( From cd8001116dcd2bb553c5f981a59b33a36b2769e3 Mon Sep 17 00:00:00 2001 From: Thomas Gilon Date: Thu, 11 Jan 2024 14:11:25 +0100 Subject: [PATCH 220/497] Add warning when negative bev availability profile values --- doc/release_notes.rst | 3 ++- scripts/build_transport_demand.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index be6be9fd..a6a1b485 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -12,7 +12,8 @@ Upcoming Release * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). -* Remove option for wave energy as technology data is not maintained. +* Remove option for wave energy as technology data is not maintained. +* Add warning when BEV availability weekly profile has negative values in `build_transport_demand`. PyPSA-Eur 0.9.0 (5th January 2024) diff --git a/scripts/build_transport_demand.py b/scripts/build_transport_demand.py index 0bcfb7ed..be8ad414 100644 --- a/scripts/build_transport_demand.py +++ b/scripts/build_transport_demand.py @@ -8,11 +8,17 @@ improvements due to drivetrain changes, time series for electric vehicle availability and demand-side management constraints. """ +import logging + import numpy as np import pandas as pd import xarray as xr + +from _helpers import configure_logging from _helpers import generate_periodic_profiles +logger = logging.getLogger(__name__) + def build_nodal_transport_data(fn, pop_layout): transport_data = pd.read_csv(fn, index_col=0) @@ -130,6 +136,10 @@ def bev_availability_profile(fn, snapshots, nodes, options): traffic.mean() - traffic.min() ) + if not avail[avail < 0].empty: + logger.warning("The BEV availability weekly profile has negative values which can " + "lead to infeasibility.") + return generate_periodic_profiles( dt_index=snapshots, nodes=nodes, @@ -160,6 +170,7 @@ if __name__ == "__main__": simpl="", clusters=48, ) + configure_logging(snakemake) pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) From a4802b701843062436d0f36562f562fb1c60bf24 Mon Sep 17 00:00:00 2001 From: Philipp Glaum Date: Thu, 11 Jan 2024 17:23:25 +0100 Subject: [PATCH 221/497] initial implementation tech specific renewable profiles --- config/config.default.yaml | 17 ++++-- rules/build_electricity.smk | 1 + rules/solve_myopic.smk | 6 +++ scripts/add_brownfield.py | 80 +++++++++++++++++++++++++++++ scripts/build_renewable_profiles.py | 42 ++++++++++++++- 5 files changed, 141 insertions(+), 5 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 33078468..aed7c61b 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -153,11 +153,14 @@ atlite: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#renewable renewable: + year: 2020 onwind: cutout: europe-2013-era5 resource: method: wind - turbine: Vestas_V112_3MW + turbine: + 2020: Vestas_V112_3MW + 2030: NREL_ReferenceTurbine_2020ATB_5.5MW add_cutout_windspeed: true capacity_per_sqkm: 3 # correction_factor: 0.93 @@ -176,7 +179,9 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: NREL_ReferenceTurbine_2020ATB_5.5MW + turbine: + 2020: NREL_ReferenceTurbine_5MW_offshore.yaml + 2030: NREL_ReferenceTurbine_2020ATB_15MW_offshore add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 @@ -192,7 +197,10 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: NREL_ReferenceTurbine_2020ATB_5.5MW + turbine: + 2020: Vestas_V164_7MW_offshore + 2025: NREL_ReferenceTurbine_2020ATB_15MW_offshore + 2030: NREL_ReferenceTurbine_2020ATB_18MW_offshore add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 @@ -208,7 +216,8 @@ renewable: cutout: europe-2013-sarah resource: method: pv - panel: CSi + panel: + 2020: CSi orientation: slope: 35. azimuth: 180. diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 055cffca..95103c47 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -259,6 +259,7 @@ else: rule build_renewable_profiles: params: renewable=config["renewable"], + foresight=config["foresight"], input: **opt, base_network=RESOURCES + "networks/base.nc", diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 7ca8857d..a1bad5b1 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -51,6 +51,12 @@ rule add_brownfield: H2_retrofit_capacity_per_CH4=config["sector"]["H2_retrofit_capacity_per_CH4"], threshold_capacity=config["existing_capacities"]["threshold_capacity"], input: + **{ + f"profile_{tech}": RESOURCES + f"profile_{tech}.nc" + for tech in config["electricity"]["renewable_carriers"] + }, + simplify_busmap=RESOURCES + "busmap_elec_s{simpl}.csv", + cluster_busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", 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 diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 9ddd3d99..4ce2bd4d 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -16,8 +16,10 @@ idx = pd.IndexSlice import numpy as np import pypsa +import xarray as xr from _helpers import update_config_with_sector_opts from add_existing_baseyear import add_build_year_to_new_assets +from pypsa.clustering.spatial import normed_or_uniform def add_brownfield(n, n_p, year): @@ -147,6 +149,82 @@ def disable_grid_expansion_if_LV_limit_hit(n): n.global_constraints.drop("lv_limit", inplace=True) +def adjust_renewable_profiles(n, input_profiles, config, year): + """ + Adjusts renewable profiles according to the renewable technology specified. + + If the planning horizon is not available, the closest year is used + instead. + """ + + cluster_busmap = pd.read_csv(snakemake.input.cluster_busmap, index_col=0).squeeze() + simplify_busmap = pd.read_csv( + snakemake.input.simplify_busmap, index_col=0 + ).squeeze() + clustermaps = simplify_busmap.map(cluster_busmap) + clustermaps.index = clustermaps.index.astype(str) + dr = pd.date_range(**config["snapshots"], freq="H") + snapshotmaps = ( + pd.Series(dr, index=dr).where(lambda x: x.isin(n.snapshots), pd.NA).ffill() + ) + + for carrier in config["electricity"]["renewable_carriers"]: + if carrier == "hydro": + continue + + clustermaps.index = clustermaps.index.astype(str) + dr = pd.date_range(**config["snapshots"], freq="H") + snapshotmaps = ( + pd.Series(dr, index=dr).where(lambda x: x.isin(n.snapshots), pd.NA).ffill() + ) + for carrier in config["electricity"]["renewable_carriers"]: + if carrier == "hydro": + continue + with xr.open_dataset(getattr(input_profiles, "profile_" + carrier)) as ds: + if ds.indexes["bus"].empty or "year" not in ds.indexes: + continue + if year in ds.indexes["year"]: + p_max_pu = ( + ds["year_profiles"] + .sel(year=year) + .transpose("time", "bus") + .to_pandas() + ) + else: + available_previous_years = [ + available_year + for available_year in ds.indexes["year"] + if available_year < year + ] + available_following_years = [ + available_year + for available_year in ds.indexes["year"] + if available_year > year + ] + if available_previous_years: + closest_year = max(available_previous_years) + if available_following_years: + closest_year = min(available_following_years) + logging.warning( + f"Planning horizon {year} not in {carrier} profiles. Using closest year {closest_year} instead." + ) + p_max_pu = ( + ds["year_profiles"] + .sel(year=closest_year) + .transpose("time", "bus") + .to_pandas() + ) + # spatial clustering + weight = ds["weight"].to_pandas() + weight = weight.groupby(clustermaps).transform(normed_or_uniform) + p_max_pu = (p_max_pu * weight).T.groupby(clustermaps).sum().T + p_max_pu.columns = p_max_pu.columns + f" {carrier}" + # temporal_clustering + p_max_pu = p_max_pu.groupby(snapshotmaps).mean() + # replace renewable time series + n.generators_t.p_max_pu.loc[:, p_max_pu.columns] = p_max_pu + + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -171,6 +249,8 @@ if __name__ == "__main__": n = pypsa.Network(snakemake.input.network) + adjust_renewable_profiles(n, snakemake.input, snakemake.config, year) + add_build_year_to_new_assets(n, year) n_p = pypsa.Network(snakemake.input.network_p) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index b736f68a..4b326da6 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -200,14 +200,25 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_renewable_profiles", technology="solar") + snakemake = mock_snakemake("build_renewable_profiles", technology="onwind") configure_logging(snakemake) nprocesses = int(snakemake.threads) noprogress = snakemake.config["run"].get("disable_progressbar", True) noprogress = noprogress or not snakemake.config["atlite"]["show_progress"] + year = snakemake.params.renewable["year"] + foresight = snakemake.params.foresight params = snakemake.params.renewable[snakemake.wildcards.technology] resource = params["resource"] # pv panel params / wind turbine params + + year_dependent_techs = { + k: resource.get(k) + for k in ["panel", "turbine"] + if isinstance(resource.get(k), dict) + } + for key, techs in year_dependent_techs.items(): + resource[key] = resource[key][year] + correction_factor = params.get("correction_factor", 1.0) capacity_per_sqkm = params["capacity_per_sqkm"] @@ -334,6 +345,29 @@ if __name__ == "__main__": **resource, ) + if year_dependent_techs and foresight != "overnight": + for key, techs in year_dependent_techs.items(): + year_profiles = list() + tech_profiles = dict() + tech_profiles[resource[key]] = profile + for year, tech in techs.items(): + resource[key] = tech + if tech not in tech_profiles: + tech_profiles[tech] = func( + matrix=availability.stack(spatial=["y", "x"]), + layout=layout, + index=buses, + per_unit=True, + return_capacity=False, + **resource, + ) + year_profile = tech_profiles[tech] + year_profile = year_profile.expand_dims({"year": [year]}).rename( + "year_profiles" + ) + year_profiles.append(year_profile) + year_profiles = xr.merge(year_profiles) + duration = time.time() - start logger.info( f"Completed weighted capacity factor time series calculation ({duration:2.2f}s)" @@ -372,6 +406,9 @@ if __name__ == "__main__": ] ) + if year_dependent_techs: + ds = xr.merge([ds, year_profiles * correction_factor]) + if snakemake.wildcards.technology.startswith("offwind"): logger.info("Calculate underwater fraction of connections.") offshore_shape = gpd.read_file(snakemake.input["offshore_shapes"]).unary_union @@ -395,6 +432,9 @@ if __name__ == "__main__": if "clip_p_max_pu" in params: min_p_max_pu = params["clip_p_max_pu"] ds["profile"] = ds["profile"].where(ds["profile"] >= min_p_max_pu, 0) + ds["year_profiles"] = ds["year_profiles"].where( + ds["year_profiles"] >= min_p_max_pu, 0 + ) ds.to_netcdf(snakemake.output.profile) From 5ef317ac399ac86efcd6b6c907f1a8c8426c757e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 16:27:29 +0000 Subject: [PATCH 222/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index be6be9fd..52b2ddc2 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -12,7 +12,7 @@ Upcoming Release * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). -* Remove option for wave energy as technology data is not maintained. +* Remove option for wave energy as technology data is not maintained. PyPSA-Eur 0.9.0 (5th January 2024) From 8565c124c034f90436c5b37c21424d456d7e5e00 Mon Sep 17 00:00:00 2001 From: Philipp Glaum Date: Fri, 12 Jan 2024 16:50:17 +0100 Subject: [PATCH 223/497] fix bus filter for buses without countries --- scripts/base_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/base_network.py b/scripts/base_network.py index eeb87bf5..340b6f36 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -560,7 +560,7 @@ def _set_countries_and_substations(n, config, country_shapes, offshore_shapes): ~buses["under_construction"] ) - c_nan_b = buses.country == "na" + c_nan_b = buses.country.isna() if c_nan_b.sum() > 0: c_tag = _get_country(buses.loc[c_nan_b]) c_tag.loc[~c_tag.isin(countries)] = np.nan From 7ebf3b186c5c5d9840208b755e955813e5d8f60f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:56:15 +0000 Subject: [PATCH 224/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index be6be9fd..52b2ddc2 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -12,7 +12,7 @@ Upcoming Release * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). -* Remove option for wave energy as technology data is not maintained. +* Remove option for wave energy as technology data is not maintained. PyPSA-Eur 0.9.0 (5th January 2024) From 1613299a031bb87bae68375c9e7b954a1e9f6291 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Fri, 22 Dec 2023 14:18:33 +0100 Subject: [PATCH 225/497] add more years to config.perfect.yaml --- config/config.perfect.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/config.perfect.yaml b/config/config.perfect.yaml index f355763c..4dde8db9 100644 --- a/config/config.perfect.yaml +++ b/config/config.perfect.yaml @@ -24,8 +24,11 @@ scenario: - 2p0-4380H-T-H-B-I-A-solar+p3-dist1 planning_horizons: - 2020 + - 2025 - 2030 + - 2035 - 2040 + - 2045 - 2050 From f042c7792660b5fc7cc256fd815a11b1b1be30b0 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Fri, 12 Jan 2024 21:33:14 +0100 Subject: [PATCH 226/497] add new constraint on co2 atmoshpere store --- scripts/solve_network.py | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 1c0f6505..db842054 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -208,7 +208,7 @@ def add_co2_sequestration_limit(n, config, limit=200): def add_carbon_constraint(n, snapshots): - glcs = n.global_constraints.query('type == "co2_limit"') + glcs = n.global_constraints.query('type == "co2_atmosphere"') if glcs.empty: return for name, glc in glcs.iterrows(): @@ -795,6 +795,28 @@ def add_pipe_retrofit_constraint(n): n.model.add_constraints(lhs == rhs, name="Link-pipe_retrofit") +def add_co2_atmosphere_constraint(n, snapshots): + glcs = n.global_constraints[n.global_constraints.type=="co2_atmosphere"] + + if glcs.empty: + return + for name, glc in glcs.iterrows(): + carattr = glc.carrier_attribute + emissions = n.carriers.query(f"{carattr} != 0")[carattr] + + if emissions.empty: + continue + + # stores + n.stores["carrier"] = n.stores.bus.map(n.buses.carrier) + stores = n.stores.query("carrier in @emissions.index and not e_cyclic") + if not stores.empty: + last_i = snapshots[-1] + lhs = n.model["Store-e"].loc[last_i, stores.index] + rhs = glc.constant + + n.model.add_constraints(lhs <= rhs, name=f"GlobalConstraint-{name}") + def extra_functionality(n, snapshots): """ Collects supplementary constraints which will be passed to @@ -837,6 +859,8 @@ def extra_functionality(n, snapshots): add_carbon_constraint(n, snapshots) add_carbon_budget_constraint(n, snapshots) add_retrofit_gas_boiler_constraint(n, snapshots) + else: + add_co2_atmosphere_constraint(n, snapshots) if snakemake.params.custom_extra_functionality: source_path = snakemake.params.custom_extra_functionality @@ -910,13 +934,13 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake( - "solve_sector_network_perfect", + "solve_sector_network", configfiles="../config/test/config.perfect.yaml", simpl="", opts="", - clusters="5", - ll="v1.5", - sector_opts="8760H-T-H-B-I-A-solar+p3-dist1", + clusters="37", + ll="v1.0", + sector_opts="CO2L0-1H-T-H-B-I-A-solar+p3-dist1", planning_horizons="2030", ) configure_logging(snakemake) From 0a789a22dc58876dfd11e873024ef1eeec593653 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Fri, 12 Jan 2024 21:33:38 +0100 Subject: [PATCH 227/497] change type of co2 constraint --- scripts/prepare_sector_network.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b57b832c..35d98657 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -761,6 +761,7 @@ def add_co2limit(n, nyears=1.0, limit=0.0): "CO2Limit", carrier_attribute="co2_emissions", sense="<=", + type="co2_atmosphere", constant=co2_limit, ) @@ -3606,8 +3607,8 @@ if __name__ == "__main__": configfiles="test/config.overnight.yaml", simpl="", opts="", - clusters="5", - ll="v1.5", + clusters="37", + ll="v1.0", sector_opts="CO2L0-24H-T-H-B-I-A-solar+p3-dist1", planning_horizons="2030", ) From 0bac08934aa701e89887afe8085edf715deda22a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 20:34:54 +0000 Subject: [PATCH 228/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- scripts/solve_network.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index be6be9fd..52b2ddc2 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -12,7 +12,7 @@ Upcoming Release * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). -* Remove option for wave energy as technology data is not maintained. +* Remove option for wave energy as technology data is not maintained. PyPSA-Eur 0.9.0 (5th January 2024) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index db842054..0b503644 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -796,8 +796,8 @@ def add_pipe_retrofit_constraint(n): def add_co2_atmosphere_constraint(n, snapshots): - glcs = n.global_constraints[n.global_constraints.type=="co2_atmosphere"] - + glcs = n.global_constraints[n.global_constraints.type == "co2_atmosphere"] + if glcs.empty: return for name, glc in glcs.iterrows(): @@ -812,11 +812,12 @@ def add_co2_atmosphere_constraint(n, snapshots): stores = n.stores.query("carrier in @emissions.index and not e_cyclic") if not stores.empty: last_i = snapshots[-1] - lhs = n.model["Store-e"].loc[last_i, stores.index] + lhs = n.model["Store-e"].loc[last_i, stores.index] rhs = glc.constant - + n.model.add_constraints(lhs <= rhs, name=f"GlobalConstraint-{name}") + def extra_functionality(n, snapshots): """ Collects supplementary constraints which will be passed to From 97d51a63fe963bd22394aca6bb6e1f774e53a44f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:14:11 +0000 Subject: [PATCH 229/497] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/snakemake/snakefmt: v0.8.5 → v0.9.0](https://github.com/snakemake/snakefmt/compare/v0.8.5...v0.9.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 78e70b57..02d360d3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -74,7 +74,7 @@ repos: # Format Snakemake rule / workflow files - repo: https://github.com/snakemake/snakefmt - rev: v0.8.5 + rev: v0.9.0 hooks: - id: snakefmt From 68421e6aabbe676982b448ab2759b8f1f7691d31 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:14:31 +0000 Subject: [PATCH 230/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- rules/retrieve.smk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index be6be9fd..52b2ddc2 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -12,7 +12,7 @@ Upcoming Release * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). -* Remove option for wave energy as technology data is not maintained. +* Remove option for wave energy as technology data is not maintained. PyPSA-Eur 0.9.0 (5th January 2024) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 7a180e22..5e1e3e59 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -191,7 +191,7 @@ if config["enable"]["retrieve"]: input: HTTP.remote( "data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv".format( - version="2019-06-05" + version="2019-06-05" if config["snapshots"]["end"] < "2019" else "2020-10-06" ), From e51e405d6e7886220556b97ed6d444f2b41624dd Mon Sep 17 00:00:00 2001 From: lisazeyen <35347358+lisazeyen@users.noreply.github.com> Date: Tue, 16 Jan 2024 11:51:55 +0100 Subject: [PATCH 231/497] add clipping for links --- scripts/solve_network.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 1c0f6505..9fbd1eaf 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -341,6 +341,8 @@ def prepare_network( for df in ( n.generators_t.p_max_pu, n.generators_t.p_min_pu, + n.links_t.p_max_pu, + n.links_t.p_min_pu, n.storage_units_t.inflow, ): df.where(df > solve_opts["clip_p_max_pu"], other=0.0, inplace=True) From 3f8a55992c76769a29362b29a5989c2a62293579 Mon Sep 17 00:00:00 2001 From: Michael Lindner Date: Tue, 16 Jan 2024 16:50:54 +0100 Subject: [PATCH 232/497] locate project dir if pypsa-eur is a submodule --- scripts/_helpers.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 03bde840..70eb4df2 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -223,7 +223,12 @@ def progress_retrieve(url, file, disable=False): urllib.request.urlretrieve(url, file, reporthook=update_to) -def mock_snakemake(rulename, root_dir=None, configfiles=[], **wildcards): +def mock_snakemake( + rulename, + root_dir=None, + configfiles=[], + submodule_dir="workflow/submodules/pypsa-eur", + **wildcards): """ This function is expected to be executed from the 'scripts'-directory of ' the snakemake project. It returns a snakemake.script.Snakemake object, @@ -239,6 +244,9 @@ def mock_snakemake(rulename, root_dir=None, configfiles=[], **wildcards): path to the root directory of the snakemake project configfiles: list, str list of configfiles to be used to update the config + submodule_dir: str, Path + in case PyPSA-Eur is used as a submodule, submodule_dir is + the path of pypsa-eur relative to the project directory. **wildcards: keyword arguments fixing the wildcards. Only necessary if wildcards are needed. @@ -257,7 +265,10 @@ def mock_snakemake(rulename, root_dir=None, configfiles=[], **wildcards): root_dir = Path(root_dir).resolve() user_in_script_dir = Path.cwd().resolve() == script_dir - if user_in_script_dir: + if str(submodule_dir) in __file__: + # the submodule_dir path is only need to locate the project dir + os.chdir(Path(__file__[:__file__.find(str(submodule_dir))])) + elif user_in_script_dir: os.chdir(root_dir) elif Path.cwd().resolve() != root_dir: raise RuntimeError( From 21a223262f145476065e2dd9dd30943bfd24594e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 15:53:15 +0000 Subject: [PATCH 233/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/_helpers.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 70eb4df2..e0982fd4 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -224,11 +224,12 @@ def progress_retrieve(url, file, disable=False): def mock_snakemake( - rulename, - root_dir=None, - configfiles=[], - submodule_dir="workflow/submodules/pypsa-eur", - **wildcards): + rulename, + root_dir=None, + configfiles=[], + submodule_dir="workflow/submodules/pypsa-eur", + **wildcards, +): """ This function is expected to be executed from the 'scripts'-directory of ' the snakemake project. It returns a snakemake.script.Snakemake object, @@ -245,7 +246,7 @@ def mock_snakemake( configfiles: list, str list of configfiles to be used to update the config submodule_dir: str, Path - in case PyPSA-Eur is used as a submodule, submodule_dir is + in case PyPSA-Eur is used as a submodule, submodule_dir is the path of pypsa-eur relative to the project directory. **wildcards: keyword arguments fixing the wildcards. Only necessary if wildcards are @@ -267,7 +268,7 @@ def mock_snakemake( user_in_script_dir = Path.cwd().resolve() == script_dir if str(submodule_dir) in __file__: # the submodule_dir path is only need to locate the project dir - os.chdir(Path(__file__[:__file__.find(str(submodule_dir))])) + os.chdir(Path(__file__[: __file__.find(str(submodule_dir))])) elif user_in_script_dir: os.chdir(root_dir) elif Path.cwd().resolve() != root_dir: From 55eddb6e1d0588ea8e6c2d335d0af52d44471d14 Mon Sep 17 00:00:00 2001 From: martacki Date: Tue, 16 Jan 2024 20:13:28 +0100 Subject: [PATCH 234/497] Norway currently ignored when building energy totals --- scripts/build_energy_totals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 67b86466..80c5d442 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -479,7 +479,7 @@ def build_energy_totals(countries, eurostat, swiss, idees): # The main heating source for about 73 per cent of the households is based on electricity # => 26% is non-electric - if "NO" in df: + if "NO" in df.index: elec_fraction = 0.73 no_norway = df.drop("NO") From a74c7b69c80d1c0b15c1203872e9799dbd69de6f Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 17 Jan 2024 10:02:51 +0100 Subject: [PATCH 235/497] 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 52b2ddc2..ee8858a4 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -14,6 +14,8 @@ Upcoming Release * Remove option for wave energy as technology data is not maintained. +* Bugfix: Assure entering of code block which corrects Norwegian heat demand. + PyPSA-Eur 0.9.0 (5th January 2024) ================================== From ec4e9aa548fce44109d851bf6f33070395d10787 Mon Sep 17 00:00:00 2001 From: JulianGeis Date: Wed, 17 Jan 2024 11:23:29 +0100 Subject: [PATCH 236/497] wasserstoff kernnetz --- scripts/prepare_sector_network.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b57b832c..ba3f24c6 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1324,6 +1324,18 @@ def add_storage_and_grids(n, costs): n, "H2 pipeline ", carriers=["DC", "gas pipeline"] ) + h2_pipes["p_nom"] = 0. + + if snakemake.input.get("custom_h2_pipelines"): + fn = snakemake.input.custom_h2_pipelines + wkn = pd.read_csv(fn, index_col=0) + + h2_pipes = pd.concat([h2_pipes, wkn]) + + # drop duplicates according to buses (order can be different) and keep pipe with highest p_nom + h2_pipes['buses_sorted'] = h2_pipes.apply(lambda row: tuple(sorted([row['bus0'], row['bus1']])), axis=1) + h2_pipes = h2_pipes.sort_values('p_nom').drop_duplicates(subset=['buses_sorted'], keep='last').drop(columns = 'buses_sorted') + # TODO Add efficiency losses n.madd( "Link", @@ -1332,6 +1344,7 @@ def add_storage_and_grids(n, costs): bus1=h2_pipes.bus1.values + " H2", p_min_pu=-1, p_nom_extendable=True, + p_nom_min=h2_pipes.p_nom.values, length=h2_pipes.length.values, capital_cost=costs.at["H2 (g) pipeline", "fixed"] * h2_pipes.length.values, carrier="H2 pipeline", From 446b0b37227111e49fa3e4e566b68b031f558e28 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:36:13 +0000 Subject: [PATCH 237/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_transport_demand.py | 10 +++++----- scripts/prepare_sector_network.py | 12 +++++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/scripts/build_transport_demand.py b/scripts/build_transport_demand.py index be8ad414..33c8faae 100644 --- a/scripts/build_transport_demand.py +++ b/scripts/build_transport_demand.py @@ -13,9 +13,7 @@ import logging import numpy as np import pandas as pd import xarray as xr - -from _helpers import configure_logging -from _helpers import generate_periodic_profiles +from _helpers import configure_logging, generate_periodic_profiles logger = logging.getLogger(__name__) @@ -137,8 +135,10 @@ def bev_availability_profile(fn, snapshots, nodes, options): ) if not avail[avail < 0].empty: - logger.warning("The BEV availability weekly profile has negative values which can " - "lead to infeasibility.") + logger.warning( + "The BEV availability weekly profile has negative values which can " + "lead to infeasibility." + ) return generate_periodic_profiles( dt_index=snapshots, diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index ba3f24c6..8bb9089b 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1324,7 +1324,7 @@ def add_storage_and_grids(n, costs): n, "H2 pipeline ", carriers=["DC", "gas pipeline"] ) - h2_pipes["p_nom"] = 0. + h2_pipes["p_nom"] = 0.0 if snakemake.input.get("custom_h2_pipelines"): fn = snakemake.input.custom_h2_pipelines @@ -1333,8 +1333,14 @@ def add_storage_and_grids(n, costs): h2_pipes = pd.concat([h2_pipes, wkn]) # drop duplicates according to buses (order can be different) and keep pipe with highest p_nom - h2_pipes['buses_sorted'] = h2_pipes.apply(lambda row: tuple(sorted([row['bus0'], row['bus1']])), axis=1) - h2_pipes = h2_pipes.sort_values('p_nom').drop_duplicates(subset=['buses_sorted'], keep='last').drop(columns = 'buses_sorted') + h2_pipes["buses_sorted"] = h2_pipes.apply( + lambda row: tuple(sorted([row["bus0"], row["bus1"]])), axis=1 + ) + h2_pipes = ( + h2_pipes.sort_values("p_nom") + .drop_duplicates(subset=["buses_sorted"], keep="last") + .drop(columns="buses_sorted") + ) # TODO Add efficiency losses n.madd( From 228ff44f75de10d4174409776cca7328185815ab Mon Sep 17 00:00:00 2001 From: Thomas Kouroughli Date: Wed, 17 Jan 2024 13:50:32 +0000 Subject: [PATCH 238/497] :recycle: address pandas FutureWarning --- scripts/build_electricity_production.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_electricity_production.py b/scripts/build_electricity_production.py index beb859bd..e89ad78b 100644 --- a/scripts/build_electricity_production.py +++ b/scripts/build_electricity_production.py @@ -58,7 +58,7 @@ if __name__ == "__main__": gen = client.query_generation(country, start=start, end=end, nett=True) gen = gen.tz_localize(None).resample("1h").mean() gen = gen.loc[start.tz_localize(None) : end.tz_localize(None)] - gen = gen.rename(columns=carrier_grouper).groupby(level=0, axis=1).sum() + gen = gen.rename(columns=carrier_grouper).T.groupby(level=0).sum().T generation.append(gen) except NoMatchingDataError: unavailable_countries.append(country) From aaa587d34f84dc22f7662d7f5855ae1e1f2161fa Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:51:03 +0000 Subject: [PATCH 239/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_transport_demand.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/build_transport_demand.py b/scripts/build_transport_demand.py index be8ad414..33c8faae 100644 --- a/scripts/build_transport_demand.py +++ b/scripts/build_transport_demand.py @@ -13,9 +13,7 @@ import logging import numpy as np import pandas as pd import xarray as xr - -from _helpers import configure_logging -from _helpers import generate_periodic_profiles +from _helpers import configure_logging, generate_periodic_profiles logger = logging.getLogger(__name__) @@ -137,8 +135,10 @@ def bev_availability_profile(fn, snapshots, nodes, options): ) if not avail[avail < 0].empty: - logger.warning("The BEV availability weekly profile has negative values which can " - "lead to infeasibility.") + logger.warning( + "The BEV availability weekly profile has negative values which can " + "lead to infeasibility." + ) return generate_periodic_profiles( dt_index=snapshots, From 4cfb06c55f96c619a5ff18df1f435d75eb147e28 Mon Sep 17 00:00:00 2001 From: Michael Lindner Date: Wed, 17 Jan 2024 17:07:19 +0100 Subject: [PATCH 240/497] group storage with duplicate labels --- scripts/plot_network.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 67481120..650a24ef 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -273,7 +273,7 @@ def plot_h2_map(network, regions): h2_storage = n.stores.query("carrier == 'H2'") regions["H2"] = h2_storage.rename( index=h2_storage.bus.map(n.buses.location) - ).e_nom_opt.div( + ).e_nom_opt.groupby(level=0).sum().div( 1e6 ) # TWh regions["H2"] = regions["H2"].where(regions["H2"] > 0.1) @@ -1068,9 +1068,10 @@ if __name__ == "__main__": "plot_network", simpl="", opts="", - clusters="37", - ll="v1.0", - sector_opts="4380H-T-H-B-I-A-solar+p3-dist1", + clusters="22", + ll="v1.2", + sector_opts="365H-T-H-B-I-A-solar+p3-linemaxext15", + planning_horizons="2040", ) logging.basicConfig(level=snakemake.config["logging"]["level"]) From e07f0e5c2b5bb34e8fcfb3b127ac9e30109beedc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 16:09:36 +0000 Subject: [PATCH 241/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/plot_network.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 650a24ef..31e72289 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -271,10 +271,11 @@ def plot_h2_map(network, regions): assign_location(n) h2_storage = n.stores.query("carrier == 'H2'") - regions["H2"] = h2_storage.rename( - index=h2_storage.bus.map(n.buses.location) - ).e_nom_opt.groupby(level=0).sum().div( - 1e6 + regions["H2"] = ( + h2_storage.rename(index=h2_storage.bus.map(n.buses.location)) + .e_nom_opt.groupby(level=0) + .sum() + .div(1e6) ) # TWh regions["H2"] = regions["H2"].where(regions["H2"] > 0.1) From fec871c1ccce766b8c710c67f35f4d407278a443 Mon Sep 17 00:00:00 2001 From: Michael Lindner Date: Wed, 17 Jan 2024 18:28:37 +0100 Subject: [PATCH 242/497] eliminate a few future warnings --- scripts/make_summary.py | 15 +++++++-------- scripts/plot_summary.py | 6 +++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/scripts/make_summary.py b/scripts/make_summary.py index fb13e91e..9da915ef 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -522,8 +522,8 @@ def calculate_weighted_prices(n, label, weighted_prices): if not names.empty: load += ( n.links_t.p0[names] - .groupby(n.links.loc[names, "bus0"], axis=1) - .sum() + .T.groupby(n.links.loc[names, "bus0"]) + .sum().T ) # Add H2 Store when charging @@ -560,14 +560,13 @@ def calculate_market_values(n, label, market_values): for tech in techs: gens = generators[n.generators.loc[generators, "carrier"] == tech] - + dispatch = ( n.generators_t.p[gens] - .groupby(n.generators.loc[gens, "bus"], axis=1) - .sum() + .T.groupby(n.generators.loc[gens, "bus"]) + .sum().T .reindex(columns=buses, fill_value=0.0) ) - revenue = dispatch * n.buses_t.marginal_price[buses] market_values.at[tech, label] = revenue.sum().sum() / dispatch.sum().sum() @@ -586,8 +585,8 @@ def calculate_market_values(n, label, market_values): dispatch = ( n.links_t["p" + i][links] - .groupby(n.links.loc[links, "bus" + i], axis=1) - .sum() + .T.groupby(n.links.loc[links, "bus" + i]) + .sum().T .reindex(columns=buses, fill_value=0.0) ) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index 67ac9b55..e0067d7f 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -154,7 +154,7 @@ def plot_costs(): df = df.drop(to_drop) - logger.info(f"Total system cost of {round(df.sum()[0])} EUR billion per year") + logger.info(f"Total system cost of {round(df.sum().iloc[0])} EUR billion per year") new_index = preferred_order.intersection(df.index).append( df.index.difference(preferred_order) @@ -214,7 +214,7 @@ def plot_energy(): df = df.drop(to_drop) - logger.info(f"Total energy of {round(df.sum()[0])} TWh/a") + logger.info(f"Total energy of {round(df.sum().iloc[0])} TWh/a") if df.empty: fig, ax = plt.subplots(figsize=(12, 8)) @@ -304,7 +304,7 @@ def plot_balances(): df = df.drop(to_drop) - logger.debug(f"Total energy balance for {v} of {round(df.sum()[0],2)} {units}") + logger.debug(f"Total energy balance for {v} of {round(df.sum().iloc[0],2)} {units}") if df.empty: continue From 213c4b025e9b53a8ed56a4745e0410baa86dbb2f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 17:29:45 +0000 Subject: [PATCH 243/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/make_summary.py | 14 ++++++-------- scripts/plot_summary.py | 4 +++- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 9da915ef..7223f4d5 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -521,9 +521,7 @@ def calculate_weighted_prices(n, label, weighted_prices): if not names.empty: load += ( - n.links_t.p0[names] - .T.groupby(n.links.loc[names, "bus0"]) - .sum().T + n.links_t.p0[names].T.groupby(n.links.loc[names, "bus0"]).sum().T ) # Add H2 Store when charging @@ -560,12 +558,12 @@ def calculate_market_values(n, label, market_values): for tech in techs: gens = generators[n.generators.loc[generators, "carrier"] == tech] - + dispatch = ( n.generators_t.p[gens] .T.groupby(n.generators.loc[gens, "bus"]) - .sum().T - .reindex(columns=buses, fill_value=0.0) + .sum() + .T.reindex(columns=buses, fill_value=0.0) ) revenue = dispatch * n.buses_t.marginal_price[buses] @@ -586,8 +584,8 @@ def calculate_market_values(n, label, market_values): dispatch = ( n.links_t["p" + i][links] .T.groupby(n.links.loc[links, "bus" + i]) - .sum().T - .reindex(columns=buses, fill_value=0.0) + .sum() + .T.reindex(columns=buses, fill_value=0.0) ) revenue = dispatch * n.buses_t.marginal_price[buses] diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index e0067d7f..2a6c9f15 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -304,7 +304,9 @@ def plot_balances(): df = df.drop(to_drop) - logger.debug(f"Total energy balance for {v} of {round(df.sum().iloc[0],2)} {units}") + logger.debug( + f"Total energy balance for {v} of {round(df.sum().iloc[0],2)} {units}" + ) if df.empty: continue From dd8db719accb6faf71fd194227211cedd1bb9950 Mon Sep 17 00:00:00 2001 From: Michael Lindner Date: Thu, 18 Jan 2024 13:53:59 +0100 Subject: [PATCH 244/497] revert accidental changes --- scripts/plot_network.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 31e72289..63b5d848 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -1069,10 +1069,9 @@ if __name__ == "__main__": "plot_network", simpl="", opts="", - clusters="22", - ll="v1.2", - sector_opts="365H-T-H-B-I-A-solar+p3-linemaxext15", - planning_horizons="2040", + clusters="37", + ll="v1.0", + sector_opts="4380H-T-H-B-I-A-solar+p3-dist1", ) logging.basicConfig(level=snakemake.config["logging"]["level"]) From ecb0a1f79f97db73c49a225f9832c66b5cdab9cc Mon Sep 17 00:00:00 2001 From: euronion <42553970+euronion@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:12:17 +0100 Subject: [PATCH 245/497] Log unhandled exceptions stacktraces in log files --- doc/release_notes.rst | 2 ++ scripts/_helpers.py | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 44cea086..a48d1a4e 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -18,6 +18,8 @@ Upcoming Release * Add warning when BEV availability weekly profile has negative values in `build_transport_demand`. +* Stacktrace of uncaught exceptions should now be correctly included inside log files (via `configure_logging(..)`). + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/scripts/_helpers.py b/scripts/_helpers.py index e0982fd4..beca3f4f 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -80,6 +80,7 @@ def configure_logging(snakemake, skip_handlers=False): Do (not) skip the default handlers created for redirecting output to STDERR and file. """ import logging + import sys kwargs = snakemake.config.get("logging", dict()).copy() kwargs.setdefault("level", "INFO") @@ -102,7 +103,15 @@ def configure_logging(snakemake, skip_handlers=False): } ) logging.basicConfig(**kwargs) + + # Setup a function to handle uncaught exceptions and include them with their stacktrace into logfiles + def handle_exception(exc_type, exc_value, exc_traceback): + # Log the exception + logger = logging.getLogger() + logger.error("Uncaught exception", + exc_info=(exc_type, exc_value, exc_traceback)) + sys.excepthook = handle_exception def update_p_nom_max(n): # if extendable carriers (solar/onwind/...) have capacity >= 0, From 35f1c06f75a4a4e540277bd760c96ec7b3bd4083 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:18:25 +0000 Subject: [PATCH 246/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/_helpers.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index beca3f4f..c5c96db9 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -103,16 +103,18 @@ def configure_logging(snakemake, skip_handlers=False): } ) logging.basicConfig(**kwargs) - + # Setup a function to handle uncaught exceptions and include them with their stacktrace into logfiles def handle_exception(exc_type, exc_value, exc_traceback): # Log the exception logger = logging.getLogger() - logger.error("Uncaught exception", - exc_info=(exc_type, exc_value, exc_traceback)) + logger.error( + "Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback) + ) sys.excepthook = handle_exception + def update_p_nom_max(n): # if extendable carriers (solar/onwind/...) have capacity >= 0, # e.g. existing assets from the OPSD project are included to the network, From 682d3d857b3ff9908b77c3ef57b562fa339a39bc Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 18 Jan 2024 17:25:05 +0100 Subject: [PATCH 247/497] cluster heat buses by default --- config/config.default.yaml | 2 +- doc/release_notes.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 1d28223f..661f855e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -376,7 +376,7 @@ sector: 2045: 0.8 2050: 1.0 district_heating_loss: 0.15 - cluster_heat_buses: false + cluster_heat_buses: true bev_dsm_restriction_value: 0.75 bev_dsm_restriction_time: 7 transport_heating_deadband_upper: 20. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 44cea086..7b0b8c33 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -18,6 +18,7 @@ Upcoming Release * Add warning when BEV availability weekly profile has negative values in `build_transport_demand`. +* Cluster residential and services heat buses by default. Can be disabled with ``cluster_heat_buses: false``. PyPSA-Eur 0.9.0 (5th January 2024) ================================== From 7c23ef08c5a1b42017dc625e0cc20d555aee9720 Mon Sep 17 00:00:00 2001 From: Thomas Kouroughli Date: Thu, 18 Jan 2024 17:04:22 +0000 Subject: [PATCH 248/497] :bug: fix key_error in validation plots --- scripts/plot_validation_electricity_production.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/plot_validation_electricity_production.py b/scripts/plot_validation_electricity_production.py index 5c5569d0..e95a8126 100644 --- a/scripts/plot_validation_electricity_production.py +++ b/scripts/plot_validation_electricity_production.py @@ -45,6 +45,12 @@ if __name__ == "__main__": header=[0, 1], parse_dates=True, ) + subset_technologies = ["Geothermal", "Nuclear", "Biomass", "Lignite", "Oil", "Coal"] + lowercase_technologies = [ + technology.lower() if technology in subset_technologies else technology + for technology in historic.columns.levels[1] + ] + historic.columns = historic.columns.set_levels(lowercase_technologies, level=1) colors = n.carriers.set_index("nice_name").color.where( lambda s: s != "", "lightgrey" From 4d74be9588cac870c4341fc7e7f15cab5178df75 Mon Sep 17 00:00:00 2001 From: Thomas Kouroughli Date: Thu, 18 Jan 2024 17:12:39 +0000 Subject: [PATCH 249/497] :memo: add release notes for PR. --- doc/release_notes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 7b0b8c33..4cc89a7a 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,8 @@ Release Notes Upcoming Release ================ +* Bugfix: Correct technology keys for the electricity production plotting to work out the box. + * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). * Remove option for wave energy as technology data is not maintained. From 498f3bffadba8d62139fbc8a3ec75a4aba41e12a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 18 Jan 2024 18:22:21 +0100 Subject: [PATCH 250/497] Update scripts/base_network.py Co-authored-by: Fabian Hofmann --- scripts/base_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/base_network.py b/scripts/base_network.py index 340b6f36..2fa31f98 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -560,7 +560,7 @@ def _set_countries_and_substations(n, config, country_shapes, offshore_shapes): ~buses["under_construction"] ) - c_nan_b = buses.country.isna() + c_nan_b = buses.country.fillna("na") == "na" if c_nan_b.sum() > 0: c_tag = _get_country(buses.loc[c_nan_b]) c_tag.loc[~c_tag.isin(countries)] = np.nan From 333e99ed3bdc3e1a56fa0309b752d42b9cc0c010 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 18 Jan 2024 19:33:57 +0100 Subject: [PATCH 251/497] add release note --- doc/release_notes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 52b2ddc2..914791a1 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -14,6 +14,9 @@ Upcoming Release * Remove option for wave energy as technology data is not maintained. +* Define global constraint for CO2 emissions on the final state of charge of the + CO2 atmosphere store. This gives a more sparse constraint that should improve + the performance of the solving process. PyPSA-Eur 0.9.0 (5th January 2024) ================================== From 88ba4af9ad4ee9d874416c3c4ddd69aa62730a27 Mon Sep 17 00:00:00 2001 From: Julian Geis Date: Fri, 19 Jan 2024 09:56:52 +0100 Subject: [PATCH 252/497] Update scripts/prepare_sector_network.py Co-authored-by: Fabian Neumann --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8bb9089b..8648a4ce 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1326,7 +1326,7 @@ def add_storage_and_grids(n, costs): h2_pipes["p_nom"] = 0.0 - if snakemake.input.get("custom_h2_pipelines"): + if "custom_h2_pipelines" in snakemake.input: fn = snakemake.input.custom_h2_pipelines wkn = pd.read_csv(fn, index_col=0) From 9c56c1e929d8bd27c8d6ac10d45dbc4d7716f4f4 Mon Sep 17 00:00:00 2001 From: Julian Geis Date: Fri, 19 Jan 2024 09:57:26 +0100 Subject: [PATCH 253/497] Update scripts/prepare_sector_network.py Co-authored-by: Fabian Neumann --- scripts/prepare_sector_network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8648a4ce..292814b2 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1328,9 +1328,9 @@ def add_storage_and_grids(n, costs): if "custom_h2_pipelines" in snakemake.input: fn = snakemake.input.custom_h2_pipelines - wkn = pd.read_csv(fn, index_col=0) + custom_pipes = pd.read_csv(fn, index_col=0) - h2_pipes = pd.concat([h2_pipes, wkn]) + h2_pipes = pd.concat([h2_pipes, custom_pipes]) # drop duplicates according to buses (order can be different) and keep pipe with highest p_nom h2_pipes["buses_sorted"] = h2_pipes.apply( From 128e1afc0072ddb21d01ce58137e3823f81f7c4e Mon Sep 17 00:00:00 2001 From: Julian Geis Date: Fri, 19 Jan 2024 10:01:11 +0100 Subject: [PATCH 254/497] Update scripts/prepare_sector_network.py Co-authored-by: Fabian Neumann --- scripts/prepare_sector_network.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 292814b2..4c47b91a 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1333,9 +1333,7 @@ def add_storage_and_grids(n, costs): h2_pipes = pd.concat([h2_pipes, custom_pipes]) # drop duplicates according to buses (order can be different) and keep pipe with highest p_nom - h2_pipes["buses_sorted"] = h2_pipes.apply( - lambda row: tuple(sorted([row["bus0"], row["bus1"]])), axis=1 - ) + h2_pipes["buses_sorted"] = h2_pipes[["bus0", "bus1"]].apply(sorted, axis=1) h2_pipes = ( h2_pipes.sort_values("p_nom") .drop_duplicates(subset=["buses_sorted"], keep="last") From f876d78ed4cfbc2d14d424066b25a598abc8deb3 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 19 Jan 2024 10:34:49 +0100 Subject: [PATCH 255/497] fix linting: run ruff --- scripts/_helpers.py | 2 -- scripts/add_brownfield.py | 4 ++-- scripts/build_electricity_demand.py | 1 - scripts/build_line_rating.py | 1 - scripts/build_renewable_profiles.py | 2 +- scripts/copy_config.py | 2 -- scripts/make_summary_perfect.py | 10 ++-------- scripts/plot_network.py | 1 - scripts/plot_summary.py | 1 - scripts/plot_validation_electricity_prices.py | 1 - scripts/prepare_network.py | 1 - scripts/simplify_network.py | 2 +- scripts/solve_network.py | 2 +- 13 files changed, 7 insertions(+), 23 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index c5c96db9..67b20877 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -15,8 +15,6 @@ import pandas as pd import pytz import requests import yaml -from pypsa.components import component_attrs, components -from pypsa.descriptors import Dict from tqdm import tqdm logger = logging.getLogger(__name__) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index cb1f51c8..229b8b07 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -121,7 +121,7 @@ def add_brownfield(n, n_p, year): def disable_grid_expansion_if_LV_limit_hit(n): - if not "lv_limit" in n.global_constraints.index: + if "lv_limit" not in n.global_constraints.index: return total_expansion = ( @@ -133,7 +133,7 @@ def disable_grid_expansion_if_LV_limit_hit(n): # allow small numerical differences if lv_limit - total_expansion < 1: - logger.info(f"LV is already reached, disabling expansion and LV limit") + logger.info("LV is already reached, disabling expansion and LV limit") extendable_acs = n.lines.query("s_nom_extendable").index n.lines.loc[extendable_acs, "s_nom_extendable"] = False n.lines.loc[extendable_acs, "s_nom"] = n.lines.loc[extendable_acs, "s_nom_min"] diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index d7d9927d..4706bf58 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -42,7 +42,6 @@ Outputs import logging logger = logging.getLogger(__name__) -import dateutil import numpy as np import pandas as pd from _helpers import configure_logging diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index 589f3656..4d45b910 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -50,7 +50,6 @@ With a heat balance considering the maximum temperature threshold of the transmi the maximal possible capacity factor "s_max_pu" for each transmission line at each time step is calculated. """ -import logging import re import atlite diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index f9db9271..6c450aca 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -340,7 +340,7 @@ if __name__ == "__main__": f"Completed weighted capacity factor time series calculation ({duration:2.2f}s)" ) - logger.info(f"Calculating maximal capacity per bus") + logger.info("Calculating maximal capacity per bus") p_nom_max = capacity_per_sqkm * availability @ area logger.info("Calculate average distances.") diff --git a/scripts/copy_config.py b/scripts/copy_config.py index a549d893..3dbee6a4 100644 --- a/scripts/copy_config.py +++ b/scripts/copy_config.py @@ -6,8 +6,6 @@ Copy used configuration files and important scripts for archiving. """ -from pathlib import Path -from shutil import copy import yaml diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index c387c6cf..93411a4c 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -12,15 +12,9 @@ other metrics. import numpy as np import pandas as pd import pypsa -from make_summary import ( - assign_carriers, - assign_locations, - calculate_cfs, - calculate_nodal_cfs, - calculate_nodal_costs, -) +from make_summary import assign_carriers, assign_locations from prepare_sector_network import prepare_costs -from pypsa.descriptors import get_active_assets, nominal_attrs +from pypsa.descriptors import get_active_assets from six import iteritems idx = pd.IndexSlice diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 63b5d848..b34ba432 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -903,7 +903,6 @@ def plot_series(network, carrier="AC", name="test"): carrier, start, stop, - name, ), transparent=True, ) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index 2a6c9f15..d29207af 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -12,7 +12,6 @@ logger = logging.getLogger(__name__) import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt -import numpy as np import pandas as pd plt.style.use("ggplot") diff --git a/scripts/plot_validation_electricity_prices.py b/scripts/plot_validation_electricity_prices.py index 2a187b9f..38c9fe96 100644 --- a/scripts/plot_validation_electricity_prices.py +++ b/scripts/plot_validation_electricity_prices.py @@ -9,7 +9,6 @@ import pandas as pd import pypsa import seaborn as sns from _helpers import configure_logging -from pypsa.statistics import get_bus_and_carrier sns.set_theme("paper", style="whitegrid") diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 632e6078..75e5daba 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -58,7 +58,6 @@ Description """ import logging -import re import numpy as np import pandas as pd diff --git a/scripts/simplify_network.py b/scripts/simplify_network.py index f88d10d4..f8629ea7 100644 --- a/scripts/simplify_network.py +++ b/scripts/simplify_network.py @@ -86,7 +86,7 @@ The rule :mod:`simplify_network` does up to four things: """ import logging -from functools import partial, reduce +from functools import reduce import numpy as np import pandas as pd diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 55704d4d..c6c1b10c 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -690,7 +690,7 @@ def add_battery_constraints(n): def add_lossy_bidirectional_link_constraints(n): - if not n.links.p_nom_extendable.any() or not "reversed" in n.links.columns: + if not n.links.p_nom_extendable.any() or "reversed" not in n.links.columns: return n.links["reversed"] = n.links.reversed.fillna(0).astype(bool) From b1d21813af24c531025d55eee19e67b30ebe1200 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 19 Jan 2024 10:47:58 +0100 Subject: [PATCH 256/497] fix import order --- scripts/_benchmark.py | 6 +++--- scripts/add_brownfield.py | 10 ++++------ scripts/add_existing_baseyear.py | 11 +++-------- scripts/build_biomass_potentials.py | 2 +- scripts/build_electricity_demand.py | 3 ++- scripts/build_energy_totals.py | 5 +---- scripts/build_gas_input_locations.py | 4 ++-- scripts/build_gas_network.py | 4 ++-- scripts/build_industrial_distribution_key.py | 4 +--- scripts/build_industrial_production_per_country.py | 6 ++---- scripts/build_population_layouts.py | 5 ++--- scripts/cluster_gas_network.py | 4 ++-- scripts/make_summary.py | 5 +---- scripts/plot_network.py | 3 +-- scripts/plot_summary.py | 3 +-- scripts/prepare_sector_network.py | 10 +++------- scripts/retrieve_sector_databundle.py | 5 ++--- scripts/solve_network.py | 2 +- 18 files changed, 34 insertions(+), 58 deletions(-) diff --git a/scripts/_benchmark.py b/scripts/_benchmark.py index 4e3413e9..ced102ba 100644 --- a/scripts/_benchmark.py +++ b/scripts/_benchmark.py @@ -13,15 +13,15 @@ import os import sys import time +from memory_profiler import _get_memory, choose_backend + logger = logging.getLogger(__name__) # TODO: provide alternative when multiprocessing is not available try: from multiprocessing import Pipe, Process except ImportError: - from multiprocessing.dummy import Process, Pipe - -from memory_profiler import _get_memory, choose_backend + from multiprocessing.dummy import Pipe, Process # The memory logging facilities have been adapted from memory_profiler diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 229b8b07..ac58136a 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -8,17 +8,15 @@ Prepares brownfield data from previous planning horizon. import logging -logger = logging.getLogger(__name__) - -import pandas as pd - -idx = pd.IndexSlice - import numpy as np +import pandas as pd import pypsa from _helpers import update_config_with_sector_opts from add_existing_baseyear import add_build_year_to_new_assets +logger = logging.getLogger(__name__) +idx = pd.IndexSlice + def add_brownfield(n, n_p, year): logger.info(f"Preparing brownfield for the year {year}") diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index e7894324..c8486758 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -8,25 +8,20 @@ horizon. """ import logging - -logger = logging.getLogger(__name__) - -import pandas as pd - -idx = pd.IndexSlice - from types import SimpleNamespace import country_converter as coco import numpy as np +import pandas as pd import pypsa import xarray as xr from _helpers import update_config_with_sector_opts from add_electricity import sanitize_carriers from prepare_sector_network import cluster_heat_buses, define_spatial, prepare_costs +logger = logging.getLogger(__name__) cc = coco.CountryConverter() - +idx = pd.IndexSlice spatial = SimpleNamespace() diff --git a/scripts/build_biomass_potentials.py b/scripts/build_biomass_potentials.py index aae1fb98..b6cbbfbf 100644 --- a/scripts/build_biomass_potentials.py +++ b/scripts/build_biomass_potentials.py @@ -9,11 +9,11 @@ using data from JRC ENSPRESO. import logging -logger = logging.getLogger(__name__) import geopandas as gpd import numpy as np import pandas as pd +logger = logging.getLogger(__name__) AVAILABLE_BIOMASS_YEARS = [2010, 2020, 2030, 2040, 2050] diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index 4706bf58..a08055ba 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -41,12 +41,13 @@ Outputs import logging -logger = logging.getLogger(__name__) import numpy as np import pandas as pd from _helpers import configure_logging from pandas import Timedelta as Delta +logger = logging.getLogger(__name__) + def load_timeseries(fn, years, countries, powerstatistics=True): """ diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 80c5d442..39b2a1be 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -7,9 +7,6 @@ Build total energy demands per country using JRC IDEES, eurostat, and EEA data. """ import logging - -logger = logging.getLogger(__name__) - import multiprocessing as mp from functools import partial @@ -21,7 +18,7 @@ from _helpers import mute_print from tqdm import tqdm cc = coco.CountryConverter() - +logger = logging.getLogger(__name__) idx = pd.IndexSlice diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index 9ad3760d..0c9e4c4b 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -9,12 +9,12 @@ production sites with data from SciGRID_gas and Global Energy Monitor. import logging -logger = logging.getLogger(__name__) - import geopandas as gpd import pandas as pd from cluster_gas_network import load_bus_regions +logger = logging.getLogger(__name__) + def read_scigrid_gas(fn): df = gpd.read_file(fn) diff --git a/scripts/build_gas_network.py b/scripts/build_gas_network.py index 92e686cd..8df7744d 100644 --- a/scripts/build_gas_network.py +++ b/scripts/build_gas_network.py @@ -9,13 +9,13 @@ Preprocess gas network based on data from bthe SciGRID_gas project import logging -logger = logging.getLogger(__name__) - import geopandas as gpd import pandas as pd from pypsa.geo import haversine_pts from shapely.geometry import Point +logger = logging.getLogger(__name__) + def diameter_to_capacity(pipe_diameter_mm): """ diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index e6d515b0..08de3bae 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -7,9 +7,6 @@ Build spatial distribution of industries from Hotmaps database. """ import logging - -logger = logging.getLogger(__name__) - import uuid from itertools import product @@ -18,6 +15,7 @@ import geopandas as gpd import pandas as pd from packaging.version import Version, parse +logger = logging.getLogger(__name__) cc = coco.CountryConverter() diff --git a/scripts/build_industrial_production_per_country.py b/scripts/build_industrial_production_per_country.py index 74cb1949..0aea4f15 100644 --- a/scripts/build_industrial_production_per_country.py +++ b/scripts/build_industrial_production_per_country.py @@ -7,11 +7,8 @@ Build industrial production per country. """ import logging -from functools import partial - -logger = logging.getLogger(__name__) - import multiprocessing as mp +from functools import partial import country_converter as coco import numpy as np @@ -19,6 +16,7 @@ import pandas as pd from _helpers import mute_print from tqdm import tqdm +logger = logging.getLogger(__name__) cc = coco.CountryConverter() tj_to_ktoe = 0.0238845 diff --git a/scripts/build_population_layouts.py b/scripts/build_population_layouts.py index e864d925..3e2b77d4 100644 --- a/scripts/build_population_layouts.py +++ b/scripts/build_population_layouts.py @@ -8,15 +8,14 @@ Build mapping between cutout grid cells and population (total, urban, rural). import logging -logger = logging.getLogger(__name__) - - import atlite import geopandas as gpd import numpy as np import pandas as pd import xarray as xr +logger = logging.getLogger(__name__) + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake diff --git a/scripts/cluster_gas_network.py b/scripts/cluster_gas_network.py index e7554dff..b8da5012 100755 --- a/scripts/cluster_gas_network.py +++ b/scripts/cluster_gas_network.py @@ -8,14 +8,14 @@ Cluster gas transmission network to clustered model regions. import logging -logger = logging.getLogger(__name__) - import geopandas as gpd import pandas as pd from packaging.version import Version, parse from pypsa.geo import haversine_pts from shapely import wkt +logger = logging.getLogger(__name__) + def concat_gdf(gdf_list, crs="EPSG:4326"): """ diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 7223f4d5..7f08b678 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -8,9 +8,6 @@ capacity factors, curtailment, energy balances, prices and other metrics. """ import logging - -logger = logging.getLogger(__name__) - import sys import numpy as np @@ -19,7 +16,7 @@ import pypsa from prepare_sector_network import prepare_costs idx = pd.IndexSlice - +logger = logging.getLogger(__name__) opt_name = {"Store": "e", "Line": "s", "Transformer": "s"} diff --git a/scripts/plot_network.py b/scripts/plot_network.py index b34ba432..d8c17587 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -13,8 +13,6 @@ nodes. import logging -logger = logging.getLogger(__name__) - import cartopy.crs as ccrs import geopandas as gpd import matplotlib.pyplot as plt @@ -24,6 +22,7 @@ from make_summary import assign_carriers from plot_summary import preferred_order, rename_techs from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches +logger = logging.getLogger(__name__) plt.style.use(["ggplot"]) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index d29207af..7e2c955d 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -8,12 +8,11 @@ Creates plots from summary CSV files. import logging -logger = logging.getLogger(__name__) - import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import pandas as pd +logger = logging.getLogger(__name__) plt.style.use("ggplot") from prepare_sector_network import co2_emissions_year diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 3be2bdac..21291d7e 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -11,6 +11,7 @@ import logging import os import re from itertools import product +from types import SimpleNamespace import networkx as nx import numpy as np @@ -22,18 +23,13 @@ from add_electricity import calculate_annuity, sanitize_carriers from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement from networkx.algorithms.connectivity.edge_augmentation import k_edge_augmentation +from packaging.version import Version, parse from pypsa.geo import haversine_pts from pypsa.io import import_components_from_dataframe from scipy.stats import beta -logger = logging.getLogger(__name__) - -from types import SimpleNamespace - spatial = SimpleNamespace() - -from packaging.version import Version, parse - +logger = logging.getLogger(__name__) pd_version = parse(pd.__version__) agg_group_kwargs = dict(numeric_only=False) if pd_version >= Version("1.3") else {} diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index cb6cc969..5baf2c56 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -7,14 +7,13 @@ Retrieve and extract data bundle for sector-coupled studies. """ import logging - -logger = logging.getLogger(__name__) - import tarfile from pathlib import Path from _helpers import configure_logging, progress_retrieve, validate_checksum +logger = logging.getLogger(__name__) + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake diff --git a/scripts/solve_network.py b/scripts/solve_network.py index c6c1b10c..4a1e27f9 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -39,10 +39,10 @@ import xarray as xr from _benchmark import memory_logger from _helpers import configure_logging, get_opt, update_config_with_sector_opts from pypsa.descriptors import get_activity_mask +from pypsa.descriptors import get_switchable_as_dense as get_as_dense logger = logging.getLogger(__name__) pypsa.pf.logger.setLevel(logging.WARNING) -from pypsa.descriptors import get_switchable_as_dense as get_as_dense def add_land_use_constraint(n, planning_horizons, config): From 025688bf70b50c182cd17fa358cc39c07604cdee Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 19 Jan 2024 12:16:07 +0100 Subject: [PATCH 257/497] refactor and fix remaining linting problems --- scripts/_helpers.py | 24 +++++++++++++++---- scripts/add_electricity.py | 10 ++++---- scripts/build_biomass_transport_costs.py | 5 ++++ scripts/build_clustered_population_layouts.py | 2 +- scripts/build_gas_input_locations.py | 15 +++++++----- scripts/build_heat_demand.py | 2 +- scripts/build_industrial_distribution_key.py | 4 ++-- scripts/build_line_rating.py | 2 +- scripts/build_population_layouts.py | 2 +- scripts/build_retro_cost.py | 12 +++++----- scripts/build_temperature_profiles.py | 2 +- scripts/cluster_network.py | 5 +--- scripts/make_summary.py | 4 ---- scripts/plot_network.py | 3 +-- scripts/plot_summary.py | 3 +-- scripts/prepare_network.py | 2 +- scripts/prepare_perfect_foresight.py | 4 ++-- scripts/prepare_sector_network.py | 6 ++--- scripts/retrieve_monthly_fuel_prices.py | 5 ++-- scripts/solve_network.py | 4 ++-- 20 files changed, 64 insertions(+), 52 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 67b20877..d84f025b 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -360,8 +360,24 @@ def generate_periodic_profiles(dt_index, nodes, weekly_profile, localize=None): return week_df -def parse(l): - return yaml.safe_load(l[0]) if len(l) == 1 else {l.pop(0): parse(l)} +def parse(infix): + """ + Recursively parse a list into a dictionary or a YAML object. + + Parameters + ---------- + list_to_parse : list + The list to parse. + + Returns + ------- + dict or YAML object + The parsed list. + """ + if len(infix) == 1: + return yaml.safe_load(infix[0]) + else: + return {infix[0]: parse(infix[1:])} def update_config_with_sector_opts(config, sector_opts): @@ -369,8 +385,8 @@ def update_config_with_sector_opts(config, sector_opts): for o in sector_opts.split("-"): if o.startswith("CF+"): - l = o.split("+")[1:] - update_config(config, parse(l)) + infix = o.split("+")[1:] + update_config(config, parse(infix)) def get_checksum_from_zenodo(file_url): diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index e626f456..c9e5abca 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -294,10 +294,10 @@ def attach_load(n, regions, load, nuts3_shapes, ua_md_gdp, countries, scaling=1. nuts3 = gpd.read_file(nuts3_shapes).set_index("index") def upsample(cntry, group): - l = opsd_load[cntry] + load = opsd_load[cntry] if len(group) == 1: - return pd.DataFrame({group.index[0]: l}) + return pd.DataFrame({group.index[0]: load}) nuts3_cntry = nuts3.loc[nuts3.country == cntry] transfer = shapes_to_shapes(group, nuts3_cntry.geometry).T.tocsr() gdp_n = pd.Series( @@ -314,8 +314,8 @@ def attach_load(n, regions, load, nuts3_shapes, ua_md_gdp, countries, scaling=1. # overwrite factor because nuts3 provides no data for UA+MD factors = normed(ua_md_gdp.loc[group.index, "GDP_PPP"].squeeze()) return pd.DataFrame( - factors.values * l.values[:, np.newaxis], - index=l.index, + factors.values * load.values[:, np.newaxis], + index=load.index, columns=factors.index, ) @@ -622,7 +622,7 @@ def attach_hydro(n, costs, ppl, profile_hydro, hydro_capacities, carriers, **par hydro.max_hours > 0, hydro.country.map(max_hours_country) ).fillna(6) - if flatten_dispatch := params.get("flatten_dispatch", False): + if params.get("flatten_dispatch", False): buffer = params.get("flatten_dispatch_buffer", 0.2) average_capacity_factor = inflow_t[hydro.index].mean() / hydro["p_nom"] p_max_pu = (average_capacity_factor + buffer).clip(upper=1) diff --git a/scripts/build_biomass_transport_costs.py b/scripts/build_biomass_transport_costs.py index 9271b600..05b64519 100644 --- a/scripts/build_biomass_transport_costs.py +++ b/scripts/build_biomass_transport_costs.py @@ -80,4 +80,9 @@ def build_biomass_transport_costs(): if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("build_biomass_transport_costs") + build_biomass_transport_costs() diff --git a/scripts/build_clustered_population_layouts.py b/scripts/build_clustered_population_layouts.py index 2f237656..f1d386bd 100644 --- a/scripts/build_clustered_population_layouts.py +++ b/scripts/build_clustered_population_layouts.py @@ -28,7 +28,7 @@ if __name__ == "__main__": gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) - I = cutout.indicatormatrix(clustered_regions) + I = cutout.indicatormatrix(clustered_regions) # noqa: E741 pop = {} for item in ["total", "urban", "rural"]: diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index 0c9e4c4b..d8727063 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -27,8 +27,11 @@ def build_gem_lng_data(fn): df = pd.read_excel(fn[0], sheet_name="LNG terminals - data") df = df.set_index("ComboID") - remove_country = ["Cyprus", "Turkey"] - remove_terminal = ["Puerto de la Luz LNG Terminal", "Gran Canaria LNG Terminal"] + remove_country = ["Cyprus", "Turkey"] # noqa: F841 + remove_terminal = [ + "Puerto de la Luz LNG Terminal", + "Gran Canaria LNG Terminal", + ] # noqa: F841 df = df.query( "Status != 'Cancelled' \ @@ -45,8 +48,8 @@ def build_gem_prod_data(fn): df = pd.read_excel(fn[0], sheet_name="Gas extraction - main") df = df.set_index("GEM Unit ID") - remove_country = ["Cyprus", "Türkiye"] - remove_fuel_type = ["oil"] + remove_country = ["Cyprus", "Türkiye"] # noqa: F841 + remove_fuel_type = ["oil"] # noqa: F841 df = df.query( "Status != 'shut in' \ @@ -96,8 +99,8 @@ def build_gas_input_locations(gem_fn, entry_fn, sto_fn, countries): ] sto = read_scigrid_gas(sto_fn) - remove_country = ["RU", "UA", "TR", "BY"] - sto = sto.query("country_code != @remove_country") + remove_country = ["RU", "UA", "TR", "BY"] # noqa: F841 + sto = sto.query("country_code not in @remove_country") # production sites inside the model scope prod = build_gem_prod_data(gem_fn) diff --git a/scripts/build_heat_demand.py b/scripts/build_heat_demand.py index 77768404..b983f125 100644 --- a/scripts/build_heat_demand.py +++ b/scripts/build_heat_demand.py @@ -34,7 +34,7 @@ if __name__ == "__main__": gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) - I = cutout.indicatormatrix(clustered_regions) + I = cutout.indicatormatrix(clustered_regions) # noqa: E741 pop_layout = xr.open_dataarray(snakemake.input.pop_layout) diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index 08de3bae..fe7cf0c1 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -30,7 +30,7 @@ def locate_missing_industrial_sites(df): try: from geopy.extra.rate_limiter import RateLimiter from geopy.geocoders import Nominatim - except: + except ImportError: raise ModuleNotFoundError( "Optional dependency 'geopy' not found." "Install via 'conda install -c conda-forge geopy'" @@ -99,7 +99,7 @@ def prepare_hotmaps_database(regions): # get all duplicated entries duplicated_i = gdf.index[gdf.index.duplicated()] # convert from raw data country name to iso-2-code - code = cc.convert(gdf.loc[duplicated_i, "Country"], to="iso2") + code = cc.convert(gdf.loc[duplicated_i, "Country"], to="iso2") # noqa: F841 # screen out malformed country allocation gdf_filtered = gdf.loc[duplicated_i].query("country == @code") # concat not duplicated and filtered gdf diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index 4d45b910..5b4cd6b3 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -98,7 +98,7 @@ def calculate_line_rating(n, cutout): ------- xarray DataArray object with maximal power. """ - relevant_lines = n.lines[(n.lines["underground"] == False)] + relevant_lines = n.lines[~n.lines["underground"]] buses = relevant_lines[["bus0", "bus1"]].values x = n.buses.x y = n.buses.y diff --git a/scripts/build_population_layouts.py b/scripts/build_population_layouts.py index 3e2b77d4..e215e6c0 100644 --- a/scripts/build_population_layouts.py +++ b/scripts/build_population_layouts.py @@ -33,7 +33,7 @@ if __name__ == "__main__": nuts3 = gpd.read_file(snakemake.input.nuts3_shapes).set_index("index") # Indicator matrix NUTS3 -> grid cells - I = atlite.cutout.compute_indicatormatrix(nuts3.geometry, grid_cells) + I = atlite.cutout.compute_indicatormatrix(nuts3.geometry, grid_cells) # noqa: E741 # Indicator matrix grid_cells -> NUTS3; inprinciple Iinv*I is identity # but imprecisions mean not perfect diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index d2aae140..67440263 100755 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -554,7 +554,7 @@ def prepare_temperature_data(): # windows --------------------------------------------------------------- -def window_limit(l, window_assumptions): +def window_limit(l, window_assumptions): # noqa: E741 """ Define limit u value from which on window is retrofitted. """ @@ -567,7 +567,7 @@ def window_limit(l, window_assumptions): return m * l + a -def u_retro_window(l, window_assumptions): +def u_retro_window(l, window_assumptions): # noqa: E741 """ Define retrofitting value depending on renovation strength. """ @@ -580,7 +580,7 @@ def u_retro_window(l, window_assumptions): return max(m * l + a, 0.8) -def window_cost(u, cost_retro, window_assumptions): +def window_cost(u, cost_retro, window_assumptions): # noqa: E741 """ Get costs for new windows depending on u value. """ @@ -600,7 +600,7 @@ def window_cost(u, cost_retro, window_assumptions): return window_cost -def calculate_costs(u_values, l, cost_retro, window_assumptions): +def calculate_costs(u_values, l, cost_retro, window_assumptions): # noqa: E741 """ Returns costs for a given retrofitting strength weighted by the average surface/volume ratio of the component for each building type. @@ -626,7 +626,7 @@ def calculate_costs(u_values, l, cost_retro, window_assumptions): ) -def calculate_new_u(u_values, l, l_weight, window_assumptions, k=0.035): +def calculate_new_u(u_values, l, l_weight, window_assumptions, k=0.035): # noqa: E741 """ Calculate U-values after building retrofitting, depending on the old U-values (u_values). This is for simple insulation measuers, adding an @@ -746,7 +746,7 @@ def calculate_heat_losses(u_values, data_tabula, l_strength, temperature_factor) """ # (1) by transmission # calculate new U values of building elements due to additional insulation - for l in l_strength: + for l in l_strength: # noqa: E741 u_values[f"new_U_{l}"] = calculate_new_u( u_values, l, l_weight, window_assumptions ) diff --git a/scripts/build_temperature_profiles.py b/scripts/build_temperature_profiles.py index a13ec3c2..02fa4a71 100644 --- a/scripts/build_temperature_profiles.py +++ b/scripts/build_temperature_profiles.py @@ -34,7 +34,7 @@ if __name__ == "__main__": gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) - I = cutout.indicatormatrix(clustered_regions) + I = cutout.indicatormatrix(clustered_regions) # noqa: E741 pop_layout = xr.open_dataarray(snakemake.input.pop_layout) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 28f08396..01af29aa 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -133,6 +133,7 @@ import pyomo.environ as po import pypsa import seaborn as sns from _helpers import configure_logging, update_p_nom_max +from add_electricity import load_costs from pypsa.clustering.spatial import ( busmap_by_greedy_modularity, busmap_by_hac, @@ -141,11 +142,7 @@ from pypsa.clustering.spatial import ( ) warnings.filterwarnings(action="ignore", category=UserWarning) - -from add_electricity import load_costs - idx = pd.IndexSlice - logger = logging.getLogger(__name__) diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 7f08b678..0fab5367 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -506,10 +506,6 @@ def calculate_weighted_prices(n, label, weighted_prices): if carrier in ["H2", "gas"]: load = pd.DataFrame(index=n.snapshots, columns=buses, data=0.0) - elif carrier[:5] == "space": - load = heat_demand_df[buses.str[:2]].rename( - columns=lambda i: str(i) + suffix - ) else: load = n.loads_t.p_set[buses] diff --git a/scripts/plot_network.py b/scripts/plot_network.py index d8c17587..6a3783e7 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -895,8 +895,7 @@ def plot_series(network, carrier="AC", name="test"): fig.tight_layout() fig.savefig( - "{}/{RDIR}maps/series-{}-{}-{}-{}-{}.pdf".format( - "results", + "results/{}maps/series-{}-{}-{}-{}.pdf".format( snakemake.params.RDIR, snakemake.wildcards["ll"], carrier, diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index 7e2c955d..b2ec0892 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -11,12 +11,11 @@ import logging import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import pandas as pd +from prepare_sector_network import co2_emissions_year logger = logging.getLogger(__name__) plt.style.use("ggplot") -from prepare_sector_network import co2_emissions_year - # consolidate and rename def rename_techs(label): diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 75e5daba..5652dc6e 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -194,7 +194,7 @@ def apply_time_segmentation(n, segments, solver_name="cbc"): logger.info(f"Aggregating time series to {segments} segments.") try: import tsam.timeseriesaggregation as tsam - except: + except ImportError: raise ModuleNotFoundError( "Optional dependency 'tsam' not found." "Install via 'pip install tsam'" ) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index 00f23fab..1c3a0ebe 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -305,7 +305,7 @@ def set_carbon_constraints(n, opts): m = re.match(r"^\d+p\d$", o, re.IGNORECASE) if m is not None: budget = snakemake.config["co2_budget"][m.group(0)] * 1e9 - if budget != None: + if budget is not None: logger.info(f"add carbon budget of {budget}") n.add( "GlobalConstraint", @@ -428,7 +428,7 @@ def apply_time_segmentation_perfect( """ try: import tsam.timeseriesaggregation as tsam - except: + except ImportError: raise ModuleNotFoundError( "Optional dependency 'tsam' not found." "Install via 'pip install tsam'" ) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 21291d7e..4d36e7d4 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -183,8 +183,6 @@ def define_spatial(nodes, options): return spatial -from types import SimpleNamespace - spatial = SimpleNamespace() @@ -1472,7 +1470,6 @@ def add_land_transport(n, costs): # TODO options? logger.info("Add land transport") - nhours = n.snapshot_weightings.generators.sum() transport = pd.read_csv( snakemake.input.transport_demand, index_col=0, parse_dates=True @@ -3120,6 +3117,7 @@ def add_waste_heat(n): # TODO options? logger.info("Add possibility to use industrial waste heat in district heating") + cf_industry = snakemake.params.industry # AC buses with district heating urban_central = n.buses.index[n.buses.carrier == "urban central heat"] @@ -3480,7 +3478,7 @@ def apply_time_segmentation( """ try: import tsam.timeseriesaggregation as tsam - except: + except ImportError: raise ModuleNotFoundError( "Optional dependency 'tsam' not found." "Install via 'pip install tsam'" ) diff --git a/scripts/retrieve_monthly_fuel_prices.py b/scripts/retrieve_monthly_fuel_prices.py index 11e351ce..e64066cb 100644 --- a/scripts/retrieve_monthly_fuel_prices.py +++ b/scripts/retrieve_monthly_fuel_prices.py @@ -7,13 +7,12 @@ Retrieve monthly fuel prices from Destatis. """ import logging - -logger = logging.getLogger(__name__) - from pathlib import Path from _helpers import configure_logging, progress_retrieve +logger = logging.getLogger(__name__) + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 4a1e27f9..1c37bfd2 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -572,7 +572,7 @@ def add_SAFE_constraints(n, config): peakdemand = n.loads_t.p_set.sum(axis=1).max() margin = 1.0 + config["electricity"]["SAFE_reservemargin"] reserve_margin = peakdemand * margin - conventional_carriers = config["electricity"]["conventional_carriers"] + conventional_carriers = config["electricity"]["conventional_carriers"] # noqa: F841 ext_gens_i = n.generators.query( "carrier in @conventional_carriers & p_nom_extendable" ).index @@ -694,7 +694,7 @@ def add_lossy_bidirectional_link_constraints(n): return n.links["reversed"] = n.links.reversed.fillna(0).astype(bool) - carriers = n.links.loc[n.links.reversed, "carrier"].unique() + carriers = n.links.loc[n.links.reversed, "carrier"].unique() # noqa: F841 forward_i = n.links.query( "carrier in @carriers and ~reversed and p_nom_extendable" From 1ffb28b3fc4661c60d5a0a314cd8a94fb7a4268e Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 19 Jan 2024 12:23:29 +0100 Subject: [PATCH 258/497] helpers: parse: fix docstring and take original implementation --- scripts/_helpers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index d84f025b..3173671d 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -362,7 +362,8 @@ def generate_periodic_profiles(dt_index, nodes, weekly_profile, localize=None): def parse(infix): """ - Recursively parse a list into a dictionary or a YAML object. + Recursively parse a chained wildcard expression into a dictionary or a YAML + object. Parameters ---------- @@ -377,7 +378,7 @@ def parse(infix): if len(infix) == 1: return yaml.safe_load(infix[0]) else: - return {infix[0]: parse(infix[1:])} + return {infix.pop(0): parse(infix)} def update_config_with_sector_opts(config, sector_opts): From d0cb57e9ab743d7099ccfbea2266788a9b02cb97 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 19 Jan 2024 12:37:07 +0100 Subject: [PATCH 259/497] make_summary_perfect: reinsert calclulate_<> functions --- scripts/build_gas_input_locations.py | 4 ++-- scripts/make_summary_perfect.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index d8727063..081f74b9 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -28,10 +28,10 @@ def build_gem_lng_data(fn): df = df.set_index("ComboID") remove_country = ["Cyprus", "Turkey"] # noqa: F841 - remove_terminal = [ + remove_terminal = [ # noqa: F841 "Puerto de la Luz LNG Terminal", "Gran Canaria LNG Terminal", - ] # noqa: F841 + ] df = df.query( "Status != 'Cancelled' \ diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index 93411a4c..555e5da5 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -12,6 +12,9 @@ other metrics. import numpy as np import pandas as pd import pypsa +from make_summary import calculate_cfs # noqa: F401 +from make_summary import calculate_nodal_cfs # noqa: F401 +from make_summary import calculate_nodal_costs # noqa: F401 from make_summary import assign_carriers, assign_locations from prepare_sector_network import prepare_costs from pypsa.descriptors import get_active_assets From 9b3e68a6a8c297f40accef7bfa9e2deb6d217dcd Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 19 Jan 2024 16:58:05 +0100 Subject: [PATCH 260/497] correctly retrieve solver threads and add back memory logfile --- rules/solve_overnight.smk | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index a3fed042..ae3a34d4 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -22,11 +22,13 @@ rule solve_sector_network: shadow: "shallow" log: - solver=LOGS - + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log", - python=LOGS - + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", - threads: config["solving"]["solver"].get("threads", 4) + solver=RESULTS + + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log", + memory=RESULTS + + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_memory.log", + python=RESULTS + + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", + threads: config["solving"]["solver_options"][config["solving"]["solver"]["options"]].get("threads", 4) resources: mem_mb=config["solving"]["mem"], walltime=config["solving"].get("walltime", "12:00:00"), From 01c1b9161b85e068900a7f1d2711696d8957d729 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 19 Jan 2024 16:59:39 +0100 Subject: [PATCH 261/497] COPT solver provide sensible default settings --- config/config.default.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index 661f855e..d071f73f 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -755,6 +755,10 @@ solving: solutiontype: 2 # non basic solution, ie no crossover barrier.convergetol: 1.e-5 feasopt.tolerance: 1.e-6 + copt-default: + Threads: 8 + LpMethod: 2 + Crossover: 0 cbc-default: {} # Used in CI glpk-default: {} # Used in CI From 58b012e03dbc7da4701f77f390827fa10b13c680 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:00:19 +0000 Subject: [PATCH 262/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/solve_overnight.smk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index ae3a34d4..39778162 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -28,7 +28,9 @@ rule solve_sector_network: + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_memory.log", python=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", - threads: config["solving"]["solver_options"][config["solving"]["solver"]["options"]].get("threads", 4) + threads: config["solving"]["solver_options"][config["solving"]["solver"]["options"]].get( + "threads", 4 +) resources: mem_mb=config["solving"]["mem"], walltime=config["solving"].get("walltime", "12:00:00"), From 77f49d44042921feb17173652e6e47de0f138941 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 19 Jan 2024 19:00:33 +0100 Subject: [PATCH 263/497] update technology-data to 0.6.2 by default --- config/config.default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index d071f73f..6349f43e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -625,7 +625,7 @@ industry: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs costs: year: 2030 - version: v0.6.0 + version: v0.6.2 rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) social_discountrate: 0.02 fill_values: From fbff32dcfcba57fab3cfaea1e10ae76f1cad75f1 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 12 Jan 2024 16:42:12 +0100 Subject: [PATCH 264/497] build_pop_weighted_energy: don't reduce district heat share Previously the DH share was being multiplied by the population weighting, reducing the DH share with multiple nodes. --- scripts/build_population_weighted_energy_totals.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/build_population_weighted_energy_totals.py b/scripts/build_population_weighted_energy_totals.py index 879e3b9b..20467f72 100644 --- a/scripts/build_population_weighted_energy_totals.py +++ b/scripts/build_population_weighted_energy_totals.py @@ -26,4 +26,9 @@ if __name__ == "__main__": nodal_energy_totals.index = pop_layout.index nodal_energy_totals = nodal_energy_totals.multiply(pop_layout.fraction, axis=0) + # district heating share should not be divided by population fraction + dh_share = energy_totals["district heat share"].loc[pop_layout.ct].fillna(0.0) + dh_share.index = pop_layout.index + nodal_energy_totals["district heat share"] = dh_share + nodal_energy_totals.to_csv(snakemake.output[0]) From 6c20ce83d7f0fd509013cc8d060a4bb91fd2c879 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 15 Jan 2024 16:47:19 +0100 Subject: [PATCH 265/497] move building of daily heat profile to its own script Previously this was handled inside prepare_sector_network.py. --- rules/build_sector.smk | 36 +++++++--- ...t_demand.py => build_daily_heat_demand.py} | 0 scripts/build_hourly_heat_demand.py | 69 +++++++++++++++++++ scripts/prepare_sector_network.py | 29 ++------ 4 files changed, 102 insertions(+), 32 deletions(-) rename scripts/{build_heat_demand.py => build_daily_heat_demand.py} (100%) create mode 100644 scripts/build_hourly_heat_demand.py diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 4744aa25..efaff2a3 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -123,7 +123,7 @@ rule cluster_gas_network: "../scripts/cluster_gas_network.py" -rule build_heat_demands: +rule build_daily_heat_demand: params: snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, input: @@ -131,18 +131,39 @@ rule build_heat_demands: regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", output: - heat_demand=RESOURCES + "heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", + heat_demand=RESOURCES + "daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", resources: mem_mb=20000, threads: 8 log: - LOGS + "build_heat_demands_{scope}_{simpl}_{clusters}.loc", + LOGS + "build_daily_heat_demand_{scope}_{simpl}_{clusters}.loc", benchmark: - BENCHMARKS + "build_heat_demands/{scope}_s{simpl}_{clusters}" + BENCHMARKS + "build_daily_heat_demand/{scope}_s{simpl}_{clusters}" conda: "../envs/environment.yaml" script: - "../scripts/build_heat_demand.py" + "../scripts/build_daily_heat_demand.py" + + +rule build_hourly_heat_demand: + params: + snapshots=config["snapshots"], + input: + heat_profile="data/heat_load_profile_BDEW.csv", + heat_demand=RESOURCES + "daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", + output: + heat_demand=RESOURCES + "hourly_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", + resources: + mem_mb=2000, + threads: 8 + log: + LOGS + "build_hourly_heat_demand_{scope}_{simpl}_{clusters}.loc", + benchmark: + BENCHMARKS + "build_hourly_heat_demand/{scope}_s{simpl}_{clusters}" + conda: + "../envs/environment.yaml" + script: + "../scripts/build_hourly_heat_demand.py" rule build_temperature_profiles: @@ -727,7 +748,6 @@ rule prepare_sector_network: if config["foresight"] == "overnight" else RESOURCES + "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv", - heat_profile="data/heat_load_profile_BDEW.csv", costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" else "data/costs_{planning_horizons}.csv", @@ -740,9 +760,7 @@ rule prepare_sector_network: simplified_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}.csv", industrial_demand=RESOURCES + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv", - heat_demand_urban=RESOURCES + "heat_demand_urban_elec_s{simpl}_{clusters}.nc", - heat_demand_rural=RESOURCES + "heat_demand_rural_elec_s{simpl}_{clusters}.nc", - heat_demand_total=RESOURCES + "heat_demand_total_elec_s{simpl}_{clusters}.nc", + hourly_heat_demand_total=RESOURCES + "hourly_heat_demand_total_elec_s{simpl}_{clusters}.nc", temp_soil_total=RESOURCES + "temp_soil_total_elec_s{simpl}_{clusters}.nc", temp_soil_rural=RESOURCES + "temp_soil_rural_elec_s{simpl}_{clusters}.nc", temp_soil_urban=RESOURCES + "temp_soil_urban_elec_s{simpl}_{clusters}.nc", diff --git a/scripts/build_heat_demand.py b/scripts/build_daily_heat_demand.py similarity index 100% rename from scripts/build_heat_demand.py rename to scripts/build_daily_heat_demand.py diff --git a/scripts/build_hourly_heat_demand.py b/scripts/build_hourly_heat_demand.py new file mode 100644 index 00000000..94ad7266 --- /dev/null +++ b/scripts/build_hourly_heat_demand.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Build hourly heat demand time series from daily ones. +""" + +import pandas as pd +import xarray as xr +from _helpers import generate_periodic_profiles, update_config_with_sector_opts +from itertools import product + + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "build_heat_demands", + simpl="", + clusters=48, + ) + + snapshots = pd.date_range(freq="h", **snakemake.params.snapshots) + + daily_space_heat_demand = ( + xr.open_dataarray(snakemake.input.heat_demand) + .to_pandas() + .reindex(index=snapshots, method="ffill") + ) + + intraday_profiles = pd.read_csv(snakemake.input.heat_profile, index_col=0) + + sectors = ["residential", "services"] + uses = ["water", "space"] + + heat_demand = {} + for sector, use in product(sectors, uses): + weekday = list(intraday_profiles[f"{sector} {use} weekday"]) + weekend = list(intraday_profiles[f"{sector} {use} weekend"]) + weekly_profile = weekday * 5 + weekend * 2 + intraday_year_profile = generate_periodic_profiles( + daily_space_heat_demand.index.tz_localize("UTC"), + nodes=daily_space_heat_demand.columns, + weekly_profile=weekly_profile, + ) + + if use == "space": + heat_demand[f"{sector} {use}"] = daily_space_heat_demand * intraday_year_profile + else: + heat_demand[f"{sector} {use}"] = intraday_year_profile + + heat_demand = pd.concat(heat_demand, + axis=1, + names = ["sector use", "node"]) + + heat_demand.index.name="snapshots" + + print(heat_demand) + + print(heat_demand.stack()) + + ds = heat_demand.stack().to_xarray()#xr.Dataset.from_dataframe(heat_demand) + + print(ds) + + ds.to_netcdf(snakemake.output.heat_demand) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 4d36e7d4..1f404c4e 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -18,7 +18,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import generate_periodic_profiles, update_config_with_sector_opts +from _helpers import update_config_with_sector_opts from add_electricity import calculate_annuity, sanitize_carriers from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement @@ -1639,14 +1639,8 @@ def add_land_transport(n, costs): def build_heat_demand(n): - # copy forward the daily average heat demand into each hour, so it can be multiplied by the intraday profile - daily_space_heat_demand = ( - xr.open_dataarray(snakemake.input.heat_demand_total) - .to_pandas() - .reindex(index=n.snapshots, method="ffill") - ) - intraday_profiles = pd.read_csv(snakemake.input.heat_profile, index_col=0) + heat_demand_shape = xr.open_dataset(snakemake.input.hourly_heat_demand_total).to_dataframe().unstack(level=1) sectors = ["residential", "services"] uses = ["water", "space"] @@ -1654,25 +1648,14 @@ def build_heat_demand(n): heat_demand = {} electric_heat_supply = {} for sector, use in product(sectors, uses): - weekday = list(intraday_profiles[f"{sector} {use} weekday"]) - weekend = list(intraday_profiles[f"{sector} {use} weekend"]) - weekly_profile = weekday * 5 + weekend * 2 - intraday_year_profile = generate_periodic_profiles( - daily_space_heat_demand.index.tz_localize("UTC"), - nodes=daily_space_heat_demand.columns, - weekly_profile=weekly_profile, - ) - if use == "space": - heat_demand_shape = daily_space_heat_demand * intraday_year_profile - else: - heat_demand_shape = intraday_year_profile + name = f"{sector} {use}" - heat_demand[f"{sector} {use}"] = ( - heat_demand_shape / heat_demand_shape.sum() + heat_demand[name] = ( + heat_demand_shape[name] / heat_demand_shape[name].sum() ).multiply(pop_weighted_energy_totals[f"total {sector} {use}"]) * 1e6 electric_heat_supply[f"{sector} {use}"] = ( - heat_demand_shape / heat_demand_shape.sum() + heat_demand_shape[name] / heat_demand_shape[name].sum() ).multiply(pop_weighted_energy_totals[f"electricity {sector} {use}"]) * 1e6 heat_demand = pd.concat(heat_demand, axis=1) From bd8a5ecf2bd5124a1062e0fb8666cdcaa18df19d Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 15 Jan 2024 17:51:08 +0100 Subject: [PATCH 266/497] build_energy_totals: output district heat share to separate file --- rules/build_sector.smk | 1 + scripts/build_energy_totals.py | 31 +++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index efaff2a3..bfe168e1 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -256,6 +256,7 @@ rule build_energy_totals: energy_name=RESOURCES + "energy_totals.csv", co2_name=RESOURCES + "co2_totals.csv", transport_name=RESOURCES + "transport_data.csv", + district_heat_share=RESOURCES + "district_heat_share.csv", threads: 16 resources: mem_mb=10000, diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 39b2a1be..53aab980 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -391,13 +391,6 @@ def build_idees(countries, year): # convert TWh/100km to kWh/km totals.loc["passenger car efficiency"] *= 10 - # district heating share - district_heat = totals.loc[ - ["derived heat residential", "derived heat services"] - ].sum() - total_heat = totals.loc[["thermal uses residential", "thermal uses services"]].sum() - totals.loc["district heat share"] = district_heat.div(total_heat) - return totals.T @@ -572,16 +565,31 @@ def build_energy_totals(countries, eurostat, swiss, idees): ratio = df.at["BA", "total residential"] / df.at["RS", "total residential"] df.loc["BA", missing] = ratio * df.loc["RS", missing] + return df + + +def build_district_heat_share(idees): + + # district heating share + district_heat = idees[ + ["derived heat residential", "derived heat services"] + ].sum(axis=1) + total_heat = idees[["thermal uses residential", "thermal uses services"]].sum(axis=1) + + district_heat_share = district_heat/total_heat + # Missing district heating share dh_share = pd.read_csv( snakemake.input.district_heat_share, index_col=0, usecols=[0, 1] ) # make conservative assumption and take minimum from both data sets - df["district heat share"] = pd.concat( - [df["district heat share"], dh_share.reindex(index=df.index) / 100], axis=1 + district_heat_share = pd.concat( + [district_heat_share, dh_share.reindex(index=district_heat_share.index) / 100], axis=1 ).min(axis=1) - return df + district_heat_share.name = "district heat share" + + return district_heat_share def build_eea_co2(input_co2, year=1990, emissions_scope="CO2"): @@ -750,6 +758,9 @@ if __name__ == "__main__": energy = build_energy_totals(countries, eurostat, swiss, idees) energy.to_csv(snakemake.output.energy_name) + district_heat_share = build_district_heat_share(idees) + district_heat_share.to_csv(snakemake.output.district_heat_share) + base_year_emissions = params["base_emissions_year"] emissions_scope = snakemake.params.energy["emissions"] eea_co2 = build_eea_co2(snakemake.input.co2, base_year_emissions, emissions_scope) From 1a477d6b325dd8d78b561295509cf9608bd2b056 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 15 Jan 2024 18:55:09 +0100 Subject: [PATCH 267/497] move calculation of district heating share to its own script Now the script build_district_heat_share.py does what the old function create_nodes_for_heating() in prepare_sector_networks.py did. There is no need to build nodes lists for each heating sector, since all nodes have district heating now. --- rules/build_sector.smk | 22 +++ scripts/build_district_heat_share.py | 77 +++++++++ scripts/build_energy_totals.py | 6 +- ...build_population_weighted_energy_totals.py | 5 - scripts/prepare_sector_network.py | 161 +++++++----------- 5 files changed, 164 insertions(+), 107 deletions(-) create mode 100644 scripts/build_district_heat_share.py diff --git a/rules/build_sector.smk b/rules/build_sector.smk index bfe168e1..14156268 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -710,6 +710,27 @@ rule build_transport_demand: "../scripts/build_transport_demand.py" + + +rule build_district_heat_share: + params: + sector=config["sector"], + input: + district_heat_share=RESOURCES + "district_heat_share.csv", + clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + output: + district_heat_share=RESOURCES + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + threads: 1 + resources: + mem_mb=1000, + log: + LOGS + "build_district_heat_share_s{simpl}_{clusters}_{planning_horizons}.log", + conda: + "../envs/environment.yaml" + script: + "../scripts/build_district_heat_share.py" + + rule prepare_sector_network: params: co2_budget=config["co2_budget"], @@ -762,6 +783,7 @@ rule prepare_sector_network: industrial_demand=RESOURCES + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv", hourly_heat_demand_total=RESOURCES + "hourly_heat_demand_total_elec_s{simpl}_{clusters}.nc", + district_heat_share=RESOURCES + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", temp_soil_total=RESOURCES + "temp_soil_total_elec_s{simpl}_{clusters}.nc", temp_soil_rural=RESOURCES + "temp_soil_rural_elec_s{simpl}_{clusters}.nc", temp_soil_urban=RESOURCES + "temp_soil_urban_elec_s{simpl}_{clusters}.nc", diff --git a/scripts/build_district_heat_share.py b/scripts/build_district_heat_share.py new file mode 100644 index 00000000..d521214d --- /dev/null +++ b/scripts/build_district_heat_share.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Build district heat shares at each node, depending on investment year. +""" + +import pandas as pd + +from prepare_sector_network import get + +import logging + + +logger = logging.getLogger(__name__) + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "build_heat_demands", + simpl="", + clusters=48, + ) + + investment_year = int(snakemake.wildcards.planning_horizons[-4:]) + + pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, + index_col=0) + + district_heat_share = pd.read_csv(snakemake.input.district_heat_share, + index_col=0).squeeze() + + # make ct-based share nodal + district_heat_share = district_heat_share.loc[pop_layout.ct] + district_heat_share.index = pop_layout.index + + # total urban population per country + ct_urban = pop_layout.urban.groupby(pop_layout.ct).sum() + + # distribution of urban population within a country + pop_layout["urban_ct_fraction"] = pop_layout.urban / pop_layout.ct.map(ct_urban.get) + + # fraction of node that is urban + urban_fraction = pop_layout.urban / pop_layout[["rural", "urban"]].sum(axis=1) + + # maximum potential of urban demand covered by district heating + central_fraction = snakemake.config["sector"]["district_heating"]["potential"] + + # district heating share at each node + dist_fraction_node = ( + district_heat_share * pop_layout["urban_ct_fraction"] / pop_layout["fraction"] + ) + + # if district heating share larger than urban fraction -> set urban + # fraction to district heating share + urban_fraction = pd.concat([urban_fraction, dist_fraction_node], axis=1).max(axis=1) + + # difference of max potential and today's share of district heating + diff = (urban_fraction * central_fraction) - dist_fraction_node + progress = get(snakemake.config["sector"]["district_heating"]["progress"], investment_year) + dist_fraction_node += diff * progress + logger.info( + f"Increase district heating share by a progress factor of {progress:.2%} " + f"resulting in new average share of {dist_fraction_node.mean():.2%}" + ) + + df = pd.DataFrame(dtype=float) + + df["original district heat share"] = district_heat_share + df["district fraction of node"] = dist_fraction_node + df["urban fraction"] = urban_fraction + + df.to_csv(snakemake.output.district_heat_share) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 53aab980..306caf4d 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -568,7 +568,7 @@ def build_energy_totals(countries, eurostat, swiss, idees): return df -def build_district_heat_share(idees): +def build_district_heat_share(countries, idees): # district heating share district_heat = idees[ @@ -578,6 +578,8 @@ def build_district_heat_share(idees): district_heat_share = district_heat/total_heat + district_heat_share = district_heat_share.reindex(countries) + # Missing district heating share dh_share = pd.read_csv( snakemake.input.district_heat_share, index_col=0, usecols=[0, 1] @@ -758,7 +760,7 @@ if __name__ == "__main__": energy = build_energy_totals(countries, eurostat, swiss, idees) energy.to_csv(snakemake.output.energy_name) - district_heat_share = build_district_heat_share(idees) + district_heat_share = build_district_heat_share(countries, idees) district_heat_share.to_csv(snakemake.output.district_heat_share) base_year_emissions = params["base_emissions_year"] diff --git a/scripts/build_population_weighted_energy_totals.py b/scripts/build_population_weighted_energy_totals.py index 20467f72..879e3b9b 100644 --- a/scripts/build_population_weighted_energy_totals.py +++ b/scripts/build_population_weighted_energy_totals.py @@ -26,9 +26,4 @@ if __name__ == "__main__": nodal_energy_totals.index = pop_layout.index nodal_energy_totals = nodal_energy_totals.multiply(pop_layout.fraction, axis=0) - # district heating share should not be divided by population fraction - dh_share = energy_totals["district heat share"].loc[pop_layout.ct].fillna(0.0) - dh_share.index = pop_layout.index - nodal_energy_totals["district heat share"] = dh_share - nodal_energy_totals.to_csv(snakemake.output[0]) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 1f404c4e..8d56ae6b 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1678,7 +1678,10 @@ def add_heat(n, costs): heat_demand = build_heat_demand(n) - nodes, dist_fraction, urban_fraction = create_nodes_for_heat_sector() + district_heat_info = pd.read_csv(snakemake.input.district_heat_share, + index_col=0) + dist_fraction = district_heat_info["district fraction of node"] + urban_fraction = district_heat_info["urban fraction"] # NB: must add costs of central heating afterwards (EUR 400 / kWpeak, 50a, 1% FOM from Fraunhofer ISE) @@ -1715,6 +1718,8 @@ def add_heat(n, costs): # 1e3 converts from W/m^2 to MW/(1000m^2) = kW/m^2 solar_thermal = options["solar_cf_correction"] * solar_thermal / 1e3 + nodes = pop_layout.index + for name in heat_systems: name_type = "central" if name == "urban central" else "decentral" @@ -1722,8 +1727,8 @@ def add_heat(n, costs): n.madd( "Bus", - nodes[name] + f" {name} heat", - location=nodes[name], + nodes + f" {name} heat", + location=nodes, carrier=name + " heat", unit="MWh_th", ) @@ -1731,9 +1736,9 @@ def add_heat(n, costs): if name == "urban central" and options.get("central_heat_vent"): n.madd( "Generator", - nodes[name] + f" {name} heat vent", - bus=nodes[name] + f" {name} heat", - location=nodes[name], + nodes + f" {name} heat vent", + bus=nodes + f" {name} heat", + location=nodes, carrier=name + " heat vent", p_nom_extendable=True, p_max_pu=0, @@ -1746,11 +1751,11 @@ def add_heat(n, costs): for sector in sectors: # heat demand weighting if "rural" in name: - factor = 1 - urban_fraction[nodes[name]] + factor = 1 - urban_fraction[nodes] elif "urban central" in name: - factor = dist_fraction[nodes[name]] + factor = dist_fraction[nodes] elif "urban decentral" in name: - factor = urban_fraction[nodes[name]] - dist_fraction[nodes[name]] + factor = urban_fraction[nodes] - dist_fraction[nodes] else: raise NotImplementedError( f" {name} not in " f"heat systems: {heat_systems}" @@ -1761,7 +1766,7 @@ def add_heat(n, costs): heat_demand[[sector + " water", sector + " space"]] .T.groupby(level=1) .sum() - .T[nodes[name]] + .T[nodes] .multiply(factor) ) @@ -1769,7 +1774,7 @@ def add_heat(n, costs): heat_load = ( heat_demand.T.groupby(level=1) .sum() - .T[nodes[name]] + .T[nodes] .multiply( factor * (1 + options["district_heating"]["district_heating_loss"]) ) @@ -1777,9 +1782,9 @@ def add_heat(n, costs): n.madd( "Load", - nodes[name], + nodes, suffix=f" {name} heat", - bus=nodes[name] + f" {name} heat", + bus=nodes + f" {name} heat", carrier=name + " heat", p_set=heat_load, ) @@ -1790,17 +1795,17 @@ def add_heat(n, costs): costs_name = f"{name_type} {heat_pump_type}-sourced heat pump" efficiency = ( - cop[heat_pump_type][nodes[name]] + cop[heat_pump_type][nodes] if options["time_dep_hp_cop"] else costs.at[costs_name, "efficiency"] ) n.madd( "Link", - nodes[name], + nodes, suffix=f" {name} {heat_pump_type} heat pump", - bus0=nodes[name], - bus1=nodes[name] + f" {name} heat", + bus0=nodes, + bus1=nodes + f" {name} heat", carrier=f"{name} {heat_pump_type} heat pump", efficiency=efficiency, capital_cost=costs.at[costs_name, "efficiency"] @@ -1814,17 +1819,17 @@ def add_heat(n, costs): n.madd( "Bus", - nodes[name] + f" {name} water tanks", - location=nodes[name], + nodes + f" {name} water tanks", + location=nodes, carrier=name + " water tanks", unit="MWh_th", ) n.madd( "Link", - nodes[name] + f" {name} water tanks charger", - bus0=nodes[name] + f" {name} heat", - bus1=nodes[name] + f" {name} water tanks", + nodes + f" {name} water tanks charger", + bus0=nodes + f" {name} heat", + bus1=nodes + f" {name} water tanks", efficiency=costs.at["water tank charger", "efficiency"], carrier=name + " water tanks charger", p_nom_extendable=True, @@ -1832,9 +1837,9 @@ def add_heat(n, costs): n.madd( "Link", - nodes[name] + f" {name} water tanks discharger", - bus0=nodes[name] + f" {name} water tanks", - bus1=nodes[name] + f" {name} heat", + nodes + f" {name} water tanks discharger", + bus0=nodes + f" {name} water tanks", + bus1=nodes + f" {name} heat", carrier=name + " water tanks discharger", efficiency=costs.at["water tank discharger", "efficiency"], p_nom_extendable=True, @@ -1853,8 +1858,8 @@ def add_heat(n, costs): n.madd( "Store", - nodes[name] + f" {name} water tanks", - bus=nodes[name] + f" {name} water tanks", + nodes + f" {name} water tanks", + bus=nodes + f" {name} water tanks", e_cyclic=True, e_nom_extendable=True, carrier=name + " water tanks", @@ -1868,9 +1873,9 @@ def add_heat(n, costs): n.madd( "Link", - nodes[name] + f" {name} resistive heater", - bus0=nodes[name], - bus1=nodes[name] + f" {name} heat", + nodes + f" {name} resistive heater", + bus0=nodes, + bus1=nodes + f" {name} heat", carrier=name + " resistive heater", efficiency=costs.at[key, "efficiency"], capital_cost=costs.at[key, "efficiency"] * costs.at[key, "fixed"], @@ -1883,10 +1888,10 @@ def add_heat(n, costs): n.madd( "Link", - nodes[name] + f" {name} gas boiler", + nodes + f" {name} gas boiler", p_nom_extendable=True, - bus0=spatial.gas.df.loc[nodes[name], "nodes"].values, - bus1=nodes[name] + f" {name} heat", + bus0=spatial.gas.df.loc[nodes, "nodes"].values, + bus1=nodes + f" {name} heat", bus2="co2 atmosphere", carrier=name + " gas boiler", efficiency=costs.at[key, "efficiency"], @@ -1900,13 +1905,13 @@ def add_heat(n, costs): n.madd( "Generator", - nodes[name], + nodes, suffix=f" {name} solar thermal collector", - bus=nodes[name] + f" {name} heat", + bus=nodes + f" {name} heat", carrier=name + " solar thermal", p_nom_extendable=True, capital_cost=costs.at[name_type + " solar thermal", "fixed"], - p_max_pu=solar_thermal[nodes[name]], + p_max_pu=solar_thermal[nodes], lifetime=costs.at[name_type + " solar thermal", "lifetime"], ) @@ -1914,10 +1919,10 @@ def add_heat(n, costs): # add gas CHP; biomass CHP is added in biomass section n.madd( "Link", - nodes[name] + " urban central gas CHP", - bus0=spatial.gas.df.loc[nodes[name], "nodes"].values, - bus1=nodes[name], - bus2=nodes[name] + " urban central heat", + nodes + " urban central gas CHP", + bus0=spatial.gas.df.loc[nodes, "nodes"].values, + bus1=nodes, + bus2=nodes + " urban central heat", bus3="co2 atmosphere", carrier="urban central gas CHP", p_nom_extendable=True, @@ -1933,12 +1938,12 @@ def add_heat(n, costs): n.madd( "Link", - nodes[name] + " urban central gas CHP CC", - bus0=spatial.gas.df.loc[nodes[name], "nodes"].values, - bus1=nodes[name], - bus2=nodes[name] + " urban central heat", + nodes + " urban central gas CHP CC", + bus0=spatial.gas.df.loc[nodes, "nodes"].values, + bus1=nodes, + bus2=nodes + " urban central heat", bus3="co2 atmosphere", - bus4=spatial.co2.df.loc[nodes[name], "nodes"].values, + bus4=spatial.co2.df.loc[nodes, "nodes"].values, carrier="urban central gas CHP CC", p_nom_extendable=True, capital_cost=costs.at["central gas CHP", "fixed"] @@ -1970,11 +1975,11 @@ def add_heat(n, costs): if options["chp"] and options["micro_chp"] and name != "urban central": n.madd( "Link", - nodes[name] + f" {name} micro gas CHP", + nodes + f" {name} micro gas CHP", p_nom_extendable=True, - bus0=spatial.gas.df.loc[nodes[name], "nodes"].values, - bus1=nodes[name], - bus2=nodes[name] + f" {name} heat", + bus0=spatial.gas.df.loc[nodes, "nodes"].values, + bus1=nodes, + bus2=nodes + f" {name} heat", bus3="co2 atmosphere", carrier=name + " micro gas CHP", efficiency=costs.at["micro CHP", "efficiency"], @@ -2105,50 +2110,6 @@ def add_heat(n, costs): ) -def create_nodes_for_heat_sector(): - # TODO pop_layout - - # rural are areas with low heating density and individual heating - # urban are areas with high heating density - # urban can be split into district heating (central) and individual heating (decentral) - - ct_urban = pop_layout.urban.groupby(pop_layout.ct).sum() - # distribution of urban population within a country - pop_layout["urban_ct_fraction"] = pop_layout.urban / pop_layout.ct.map(ct_urban.get) - - sectors = ["residential", "services"] - - nodes = {} - urban_fraction = pop_layout.urban / pop_layout[["rural", "urban"]].sum(axis=1) - - for sector in sectors: - nodes[sector + " rural"] = pop_layout.index - nodes[sector + " urban decentral"] = pop_layout.index - - district_heat_share = pop_weighted_energy_totals["district heat share"] - - # maximum potential of urban demand covered by district heating - central_fraction = options["district_heating"]["potential"] - # district heating share at each node - dist_fraction_node = ( - district_heat_share * pop_layout["urban_ct_fraction"] / pop_layout["fraction"] - ) - nodes["urban central"] = dist_fraction_node.index - # if district heating share larger than urban fraction -> set urban - # fraction to district heating share - urban_fraction = pd.concat([urban_fraction, dist_fraction_node], axis=1).max(axis=1) - # difference of max potential and today's share of district heating - diff = (urban_fraction * central_fraction) - dist_fraction_node - progress = get(options["district_heating"]["progress"], investment_year) - dist_fraction_node += diff * progress - logger.info( - f"Increase district heating share by a progress factor of {progress:.2%} " - f"resulting in new average share of {dist_fraction_node.mean():.2%}" - ) - - return nodes, dist_fraction_node, urban_fraction - - def add_biomass(n, costs): logger.info("Add biomass") @@ -2366,7 +2327,7 @@ def add_biomass(n, costs): if options["biomass_boiler"]: # TODO: Add surcharge for pellets - nodes_heat = create_nodes_for_heat_sector()[0] + nodes = pop_layout.index for name in [ "residential rural", "services rural", @@ -2375,10 +2336,10 @@ def add_biomass(n, costs): ]: n.madd( "Link", - nodes_heat[name] + f" {name} biomass boiler", + nodes + f" {name} biomass boiler", p_nom_extendable=True, - bus0=spatial.biomass.df.loc[nodes_heat[name], "nodes"].values, - bus1=nodes_heat[name] + f" {name} heat", + bus0=spatial.biomass.df.loc[nodes, "nodes"].values, + bus1=nodes + f" {name} heat", carrier=name + " biomass boiler", efficiency=costs.at["biomass boiler", "efficiency"], capital_cost=costs.at["biomass boiler", "efficiency"] @@ -2821,7 +2782,7 @@ def add_industry(n, costs): ) if options["oil_boilers"]: - nodes_heat = create_nodes_for_heat_sector()[0] + nodes = pop_layout.index for name in [ "residential rural", @@ -2831,10 +2792,10 @@ def add_industry(n, costs): ]: n.madd( "Link", - nodes_heat[name] + f" {name} oil boiler", + nodes + f" {name} oil boiler", p_nom_extendable=True, bus0=spatial.oil.nodes, - bus1=nodes_heat[name] + f" {name} heat", + bus1=nodes + f" {name} heat", bus2="co2 atmosphere", carrier=f"{name} oil boiler", efficiency=costs.at["decentral oil boiler", "efficiency"], From 9897cd6f0535fdbef82b66816c844a9f0ebf10b5 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 19 Jan 2024 16:24:39 +0100 Subject: [PATCH 268/497] only add district heating (DH) for nodes with non-zero DH share --- scripts/prepare_sector_network.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8d56ae6b..0bf9848b 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1718,11 +1718,15 @@ def add_heat(n, costs): # 1e3 converts from W/m^2 to MW/(1000m^2) = kW/m^2 solar_thermal = options["solar_cf_correction"] * solar_thermal / 1e3 - nodes = pop_layout.index for name in heat_systems: name_type = "central" if name == "urban central" else "decentral" + if name == "urban central": + nodes = dist_fraction.index[dist_fraction > 0] + else: + nodes = pop_layout.index + n.add("Carrier", name + " heat") n.madd( From d98ad95332a8f9c81c06d5a42c426fd0b4be921a Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 19 Jan 2024 18:42:49 +0100 Subject: [PATCH 269/497] move building of distribution of existing heating to own script This makes the distribution of existing heating to urban/rural, residential/services and spatially more transparent. --- rules/solve_myopic.smk | 37 ++++- scripts/add_existing_baseyear.py | 136 ++++-------------- .../build_existing_heating_distribution.py | 108 ++++++++++++++ 3 files changed, 172 insertions(+), 109 deletions(-) create mode 100644 scripts/build_existing_heating_distribution.py diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 7ca8857d..20043286 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -1,8 +1,40 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-4 The PyPSA-Eur Authors # # 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], @@ -19,7 +51,8 @@ rule add_existing_baseyear: costs="data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), cop_soil_total=RESOURCES + "cop_soil_total_elec_s{simpl}_{clusters}.nc", cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", - existing_heating="data/existing_infrastructure/existing_heating_raw.csv", + existing_heating_distribution=RESOURCES + + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv", existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv", existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv", existing_offwind="data/existing_infrastructure/offwind_capacity_IRENA.csv", diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index c8486758..01d54cc2 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -409,97 +409,20 @@ def add_heating_capacities_installed_before_baseyear( # file: "WP2_DataAnnex_1_BuildingTechs_ForPublication_201603.xls" -> "existing_heating_raw.csv". # TODO start from original file - # retrieve existing heating capacities - techs = [ - "gas boiler", - "oil boiler", - "resistive heater", - "air heat pump", - "ground heat pump", - ] - df = pd.read_csv(snakemake.input.existing_heating, index_col=0, header=0) + existing_heating = pd.read_csv(snakemake.input.existing_heating_distribution, + header=[0,1], + index_col=0) - # data for Albania, Montenegro and Macedonia not included in database - df.loc["Albania"] = np.nan - df.loc["Montenegro"] = np.nan - df.loc["Macedonia"] = np.nan - df.fillna(0.0, inplace=True) + techs = existing_heating.columns.get_level_values(1).unique() - # convert GW to MW - df *= 1e3 + for name in existing_heating.columns.get_level_values(0).unique(): - df.index = cc.convert(df.index, to="iso2") - - # coal and oil boilers are assimilated to oil boilers - df["oil boiler"] = df["oil boiler"] + df["coal boiler"] - df.drop(["coal boiler"], axis=1, inplace=True) - - # distribute technologies to nodes by population - pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) - - nodal_df = df.loc[pop_layout.ct] - nodal_df.index = pop_layout.index - nodal_df = nodal_df.multiply(pop_layout.fraction, axis=0) - - # split existing capacities between residential and services - # proportional to energy demand - p_set_sum = n.loads_t.p_set.sum() - ratio_residential = pd.Series( - [ - ( - p_set_sum[f"{node} residential rural heat"] - / ( - p_set_sum[f"{node} residential rural heat"] - + p_set_sum[f"{node} services rural heat"] - ) - ) - # if rural heating demand for one of the nodes doesn't exist, - # then columns were dropped before and heating demand share should be 0.0 - if all( - f"{node} {service} rural heat" in p_set_sum.index - for service in ["residential", "services"] - ) - else 0.0 - for node in nodal_df.index - ], - index=nodal_df.index, - ) - - for tech in techs: - nodal_df["residential " + tech] = nodal_df[tech] * ratio_residential - nodal_df["services " + tech] = nodal_df[tech] * (1 - ratio_residential) - - names = [ - "residential rural", - "services rural", - "residential urban decentral", - "services urban decentral", - "urban central", - ] - - nodes = {} - p_nom = {} - for name in names: name_type = "central" if name == "urban central" else "decentral" - nodes[name] = pd.Index( - [ - n.buses.at[index, "location"] - for index in n.buses.index[ - n.buses.index.str.contains(name) - & n.buses.index.str.contains("heat") - ] - ] - ) - heat_pump_type = "air" if "urban" in name else "ground" - heat_type = "residential" if "residential" in name else "services" - if name == "urban central": - p_nom[name] = nodal_df["air heat pump"][nodes[name]] - else: - p_nom[name] = nodal_df[f"{heat_type} {heat_pump_type} heat pump"][ - nodes[name] - ] + nodes = pd.Index(n.buses.location[n.buses.index.str.contains(f"{name} heat")]) + + heat_pump_type = "air" if "urban" in name else "ground" # Add heat pumps costs_name = f"decentral {heat_pump_type}-sourced heat pump" @@ -507,7 +430,7 @@ def add_heating_capacities_installed_before_baseyear( cop = {"air": ashp_cop, "ground": gshp_cop} if time_dep_hp_cop: - efficiency = cop[heat_pump_type][nodes[name]] + efficiency = cop[heat_pump_type][nodes] else: efficiency = costs.at[costs_name, "efficiency"] @@ -520,27 +443,26 @@ def add_heating_capacities_installed_before_baseyear( n.madd( "Link", - nodes[name], + nodes, suffix=f" {name} {heat_pump_type} heat pump-{grouping_year}", - bus0=nodes[name], - bus1=nodes[name] + " " + name + " heat", + bus0=nodes, + bus1=nodes + " " + name + " heat", carrier=f"{name} {heat_pump_type} heat pump", efficiency=efficiency, capital_cost=costs.at[costs_name, "efficiency"] * costs.at[costs_name, "fixed"], - p_nom=p_nom[name] * ratio / costs.at[costs_name, "efficiency"], + p_nom=existing_heating[(name, f"{heat_pump_type} heat pump")][nodes] * ratio / costs.at[costs_name, "efficiency"], build_year=int(grouping_year), lifetime=costs.at[costs_name, "lifetime"], ) # add resistive heater, gas boilers and oil boilers - # (50% capacities to rural buses, 50% to urban buses) n.madd( "Link", - nodes[name], + nodes, suffix=f" {name} resistive heater-{grouping_year}", - bus0=nodes[name], - bus1=nodes[name] + " " + name + " heat", + bus0=nodes, + bus1=nodes + " " + name + " heat", carrier=name + " resistive heater", efficiency=costs.at[f"{name_type} resistive heater", "efficiency"], capital_cost=( @@ -548,21 +470,20 @@ def add_heating_capacities_installed_before_baseyear( * costs.at[f"{name_type} resistive heater", "fixed"] ), p_nom=( - 0.5 - * nodal_df[f"{heat_type} resistive heater"][nodes[name]] + existing_heating[(name, "resistive heater")][nodes] * ratio / costs.at[f"{name_type} resistive heater", "efficiency"] ), build_year=int(grouping_year), - lifetime=costs.at[costs_name, "lifetime"], + lifetime=costs.at[f"{name_type} resistive heater", "lifetime"], ) n.madd( "Link", - nodes[name], + nodes, suffix=f" {name} gas boiler-{grouping_year}", bus0=spatial.gas.nodes, - bus1=nodes[name] + " " + name + " heat", + bus1=nodes + " " + name + " heat", bus2="co2 atmosphere", carrier=name + " gas boiler", efficiency=costs.at[f"{name_type} gas boiler", "efficiency"], @@ -572,8 +493,7 @@ def add_heating_capacities_installed_before_baseyear( * costs.at[f"{name_type} gas boiler", "fixed"] ), p_nom=( - 0.5 - * nodal_df[f"{heat_type} gas boiler"][nodes[name]] + existing_heating[(name, "gas boiler")][nodes] * ratio / costs.at[f"{name_type} gas boiler", "efficiency"] ), @@ -583,20 +503,20 @@ def add_heating_capacities_installed_before_baseyear( n.madd( "Link", - nodes[name], + nodes, suffix=f" {name} oil boiler-{grouping_year}", bus0=spatial.oil.nodes, - bus1=nodes[name] + " " + name + " heat", + bus1=nodes + " " + name + " heat", bus2="co2 atmosphere", carrier=name + " oil boiler", efficiency=costs.at["decentral oil boiler", "efficiency"], efficiency2=costs.at["oil", "CO2 intensity"], capital_cost=costs.at["decentral oil boiler", "efficiency"] * costs.at["decentral oil boiler", "fixed"], - p_nom=0.5 - * nodal_df[f"{heat_type} oil boiler"][nodes[name]] - * ratio - / costs.at["decentral oil boiler", "efficiency"], + p_nom= ( + existing_heating[(name, "oil boiler")][nodes] + * ratio + / costs.at["decentral oil boiler", "efficiency"]), build_year=int(grouping_year), lifetime=costs.at[f"{name_type} gas boiler", "lifetime"], ) @@ -624,6 +544,8 @@ def add_heating_capacities_installed_before_baseyear( # drop assets which are at the end of their lifetime links_i = n.links[(n.links.build_year + n.links.lifetime <= baseyear)].index + logger.info("Removing following links because at end of their lifetime:") + logger.info(links_i) n.mremove("Link", links_i) diff --git a/scripts/build_existing_heating_distribution.py b/scripts/build_existing_heating_distribution.py new file mode 100644 index 00000000..fe282d39 --- /dev/null +++ b/scripts/build_existing_heating_distribution.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Builds table of existing heat generation capacities for initial planning +horizon. +""" +import pandas as pd +import sys +from pypsa.descriptors import Dict +import numpy as np +import country_converter as coco + +cc = coco.CountryConverter() + + +def build_existing_heating(): + # retrieve existing heating capacities + techs = [ + "gas boiler", + "oil boiler", + "resistive heater", + "air heat pump", + "ground heat pump", + ] + + existing_heating = pd.read_csv(snakemake.input.existing_heating, + index_col=0, + header=0) + + # data for Albania, Montenegro and Macedonia not included in database existing_heating.loc["Albania"] = np.nan + existing_heating.loc["Montenegro"] = np.nan + existing_heating.loc["Macedonia"] = np.nan + + existing_heating.fillna(0.0, inplace=True) + + # convert GW to MW + existing_heating *= 1e3 + + existing_heating.index = cc.convert(existing_heating.index, to="iso2") + + # coal and oil boilers are assimilated to oil boilers + existing_heating["oil boiler"] = existing_heating["oil boiler"] + existing_heating["coal boiler"] + existing_heating.drop(["coal boiler"], axis=1, inplace=True) + + # distribute technologies to nodes by population + pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, + index_col=0) + + nodal_heating = existing_heating.loc[pop_layout.ct] + nodal_heating.index = pop_layout.index + nodal_heating = nodal_heating.multiply(pop_layout.fraction, axis=0) + + district_heat_info = pd.read_csv(snakemake.input.district_heat_share, + index_col=0) + dist_fraction = district_heat_info["district fraction of node"] + urban_fraction = district_heat_info["urban fraction"] + + energy_layout = pd.read_csv(snakemake.input.clustered_pop_energy_layout, + index_col=0) + + uses = ["space", "water"] + sectors = ["residential", "services"] + + nodal_sectoral_totals = pd.DataFrame(dtype=float) + + for sector in sectors: + nodal_sectoral_totals[sector] = energy_layout[[f"total {sector} {use}" for use in uses]].sum(axis=1) + + nodal_sectoral_fraction = nodal_sectoral_totals.div(nodal_sectoral_totals.sum(axis=1), + axis=0) + + + nodal_heat_name_fraction = pd.DataFrame(dtype=float) + + nodal_heat_name_fraction["urban central"] = dist_fraction + + for sector in sectors: + + nodal_heat_name_fraction[f"{sector} rural"] = nodal_sectoral_fraction[sector]*(1 - urban_fraction) + nodal_heat_name_fraction[f"{sector} urban decentral"] = nodal_sectoral_fraction[sector]*(urban_fraction - dist_fraction) + + + nodal_heat_name_tech = pd.concat({name : nodal_heating .multiply(nodal_heat_name_fraction[name], + axis=0) for name in nodal_heat_name_fraction.columns}, + axis=1, + names=["heat name","technology"]) + + + #move all ground HPs to rural, all air to urban + + for sector in sectors: + nodal_heat_name_tech[(f"{sector} rural","ground heat pump")] += (nodal_heat_name_tech[("urban central","ground heat pump")]*nodal_sectoral_fraction[sector] + + nodal_heat_name_tech[(f"{sector} urban decentral","ground heat pump")]) + nodal_heat_name_tech[(f"{sector} urban decentral","ground heat pump")] = 0. + + nodal_heat_name_tech[(f"{sector} urban decentral","air heat pump")] += nodal_heat_name_tech[(f"{sector} rural","air heat pump")] + nodal_heat_name_tech[(f"{sector} rural","air heat pump")] = 0. + + nodal_heat_name_tech[("urban central","ground heat pump")] = 0. + + nodal_heat_name_tech.to_csv(snakemake.output.existing_heating_distribution) + + +if __name__ == "__main__": + + build_existing_heating() From 2183e742b2b44a7caca47a525537f8e827e501e5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 09:18:26 +0100 Subject: [PATCH 270/497] add release notes, minor code improvements --- doc/release_notes.rst | 18 +++++++++++++++ doc/sector.rst | 20 ++++++++++++++-- rules/solve_overnight.smk | 7 +++--- scripts/add_existing_baseyear.py | 8 +++---- scripts/build_daily_heat_demand.py | 3 ++- scripts/build_district_heat_share.py | 15 ++++++------ scripts/build_energy_totals.py | 4 ++-- .../build_existing_heating_distribution.py | 23 ++++++++++--------- scripts/build_hourly_heat_demand.py | 18 +++++---------- scripts/prepare_sector_network.py | 2 +- 10 files changed, 75 insertions(+), 43 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index dc1a9dd1..56fee0d8 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -28,6 +28,24 @@ Upcoming Release * Cluster residential and services heat buses by default. Can be disabled with ``cluster_heat_buses: false``. +* Bugfix: Do not reduce district heat share when building population-weighted + energy statistics. Previously the district heating share was being multiplied + by the population weighting, reducing the DH share with multiple nodes. + +* Move building of daily heat profile to its own rule + :mod:`build_hourly_heat_demand` from :mod:`prepare_sector_network`. + +* In :mod:`build_energy_totals`, district heating shares are now reported in a + separate file. + +* Move calculation of district heating share to its own rule + :mod:`build_district_heat_share`. + +* Move building of distribution of existing heating to own rule + :mod:`build_existing_heating_distribution`. This makes the distribution of + existing heating to urban/rural, residential/services and spatially more + transparent. + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/doc/sector.rst b/doc/sector.rst index 303e7ed2..411bfd57 100644 --- a/doc/sector.rst +++ b/doc/sector.rst @@ -20,6 +20,12 @@ Rule ``add_existing_baseyear`` .. automodule:: add_existing_baseyear +Rule ``build_existing_heating_distribution`` +============================================================================== + +.. automodule:: build_existing_heating_distribution + + Rule ``build_ammonia_production`` ============================================================================== @@ -60,10 +66,20 @@ Rule ``build_gas_network`` .. automodule:: build_gas_network -Rule ``build_heat_demand`` +Rule ``build_daily_heat_demand`` ============================================================================== -.. automodule:: build_heat_demand +.. automodule:: build_daily_heat_demand + +Rule ``build_hourly_heat_demand`` +============================================================================== + +.. automodule:: build_hourly_heat_demand + +Rule ``build_district_heat_share`` +============================================================================== + +.. automodule:: build_district_heat_share Rule ``build_industrial_distribution_key`` ============================================================================== diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 39778162..47c86410 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -28,9 +28,10 @@ rule solve_sector_network: + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_memory.log", python=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", - threads: config["solving"]["solver_options"][config["solving"]["solver"]["options"]].get( - "threads", 4 -) + threads: + config["solving"]["solver_options"][ + config["solving"]["solver"]["options"] + ].get("threads", 4) resources: mem_mb=config["solving"]["mem"], walltime=config["solving"].get("walltime", "12:00:00"), diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 01d54cc2..d61ece85 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -451,7 +451,7 @@ def add_heating_capacities_installed_before_baseyear( efficiency=efficiency, capital_cost=costs.at[costs_name, "efficiency"] * costs.at[costs_name, "fixed"], - p_nom=existing_heating[(name, f"{heat_pump_type} heat pump")][nodes] * ratio / costs.at[costs_name, "efficiency"], + p_nom=existing_heating.loc[nodes, (name, f"{heat_pump_type} heat pump")] * ratio / costs.at[costs_name, "efficiency"], build_year=int(grouping_year), lifetime=costs.at[costs_name, "lifetime"], ) @@ -470,7 +470,7 @@ def add_heating_capacities_installed_before_baseyear( * costs.at[f"{name_type} resistive heater", "fixed"] ), p_nom=( - existing_heating[(name, "resistive heater")][nodes] + existing_heating.loc[nodes, (name, "resistive heater")] * ratio / costs.at[f"{name_type} resistive heater", "efficiency"] ), @@ -493,7 +493,7 @@ def add_heating_capacities_installed_before_baseyear( * costs.at[f"{name_type} gas boiler", "fixed"] ), p_nom=( - existing_heating[(name, "gas boiler")][nodes] + existing_heating.loc[nodes, (name, "gas boiler")] * ratio / costs.at[f"{name_type} gas boiler", "efficiency"] ), @@ -514,7 +514,7 @@ def add_heating_capacities_installed_before_baseyear( capital_cost=costs.at["decentral oil boiler", "efficiency"] * costs.at["decentral oil boiler", "fixed"], p_nom= ( - existing_heating[(name, "oil boiler")][nodes] + existing_heating.loc[nodes, (name, "oil boiler")] * ratio / costs.at["decentral oil boiler", "efficiency"]), build_year=int(grouping_year), diff --git a/scripts/build_daily_heat_demand.py b/scripts/build_daily_heat_demand.py index b983f125..e334b1b3 100644 --- a/scripts/build_daily_heat_demand.py +++ b/scripts/build_daily_heat_demand.py @@ -18,7 +18,8 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake( - "build_heat_demands", + "build_daily_heat_demands", + scope="total", simpl="", clusters=48, ) diff --git a/scripts/build_district_heat_share.py b/scripts/build_district_heat_share.py index d521214d..996ed861 100644 --- a/scripts/build_district_heat_share.py +++ b/scripts/build_district_heat_share.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ @@ -21,9 +21,10 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake( - "build_heat_demands", + "build_district_heat_share", simpl="", clusters=48, + planning_horizons="2050", ) investment_year = int(snakemake.wildcards.planning_horizons[-4:]) @@ -68,10 +69,10 @@ if __name__ == "__main__": f"resulting in new average share of {dist_fraction_node.mean():.2%}" ) - df = pd.DataFrame(dtype=float) - - df["original district heat share"] = district_heat_share - df["district fraction of node"] = dist_fraction_node - df["urban fraction"] = urban_fraction + df = pd.DataFrame({ + "original district heat share": district_heat_share, + "district fraction of node": dist_fraction_node, + "urban fraction": urban_fraction + }, dtype=float) df.to_csv(snakemake.output.district_heat_share) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 306caf4d..08d5bef5 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -583,10 +583,10 @@ def build_district_heat_share(countries, idees): # Missing district heating share dh_share = pd.read_csv( snakemake.input.district_heat_share, index_col=0, usecols=[0, 1] - ) + ).div(100).squeeze() # make conservative assumption and take minimum from both data sets district_heat_share = pd.concat( - [district_heat_share, dh_share.reindex(index=district_heat_share.index) / 100], axis=1 + [district_heat_share, dh_share.reindex_like(district_heat_share)], axis=1 ).min(axis=1) district_heat_share.name = "district heat share" diff --git a/scripts/build_existing_heating_distribution.py b/scripts/build_existing_heating_distribution.py index fe282d39..443c5baa 100644 --- a/scripts/build_existing_heating_distribution.py +++ b/scripts/build_existing_heating_distribution.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ @@ -7,8 +7,6 @@ Builds table of existing heat generation capacities for initial planning horizon. """ import pandas as pd -import sys -from pypsa.descriptors import Dict import numpy as np import country_converter as coco @@ -17,19 +15,13 @@ cc = coco.CountryConverter() def build_existing_heating(): # retrieve existing heating capacities - techs = [ - "gas boiler", - "oil boiler", - "resistive heater", - "air heat pump", - "ground heat pump", - ] existing_heating = pd.read_csv(snakemake.input.existing_heating, index_col=0, header=0) - # data for Albania, Montenegro and Macedonia not included in database existing_heating.loc["Albania"] = np.nan + # data for Albania, Montenegro and Macedonia not included in database + existing_heating.loc["Albania"] = np.nan existing_heating.loc["Montenegro"] = np.nan existing_heating.loc["Macedonia"] = np.nan @@ -104,5 +96,14 @@ def build_existing_heating(): if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "build_existing_heating_distribution", + simpl="", + clusters=48, + planning_horizons=2050, + ) build_existing_heating() diff --git a/scripts/build_hourly_heat_demand.py b/scripts/build_hourly_heat_demand.py index 94ad7266..2d1dee54 100644 --- a/scripts/build_hourly_heat_demand.py +++ b/scripts/build_hourly_heat_demand.py @@ -6,19 +6,19 @@ Build hourly heat demand time series from daily ones. """ -import pandas as pd -import xarray as xr -from _helpers import generate_periodic_profiles, update_config_with_sector_opts from itertools import product - +import pandas as pd +import xarray as xr +from _helpers import generate_periodic_profiles if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake snakemake = mock_snakemake( - "build_heat_demands", + "build_hourly_heat_demands", + scope="total", simpl="", clusters=48, ) @@ -58,12 +58,6 @@ if __name__ == "__main__": heat_demand.index.name="snapshots" - print(heat_demand) - - print(heat_demand.stack()) - - ds = heat_demand.stack().to_xarray()#xr.Dataset.from_dataframe(heat_demand) - - print(ds) + ds = heat_demand.stack().to_xarray() ds.to_netcdf(snakemake.output.heat_demand) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 0bf9848b..241f3c30 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1654,7 +1654,7 @@ def build_heat_demand(n): heat_demand[name] = ( heat_demand_shape[name] / heat_demand_shape[name].sum() ).multiply(pop_weighted_energy_totals[f"total {sector} {use}"]) * 1e6 - electric_heat_supply[f"{sector} {use}"] = ( + electric_heat_supply[name] = ( heat_demand_shape[name] / heat_demand_shape[name].sum() ).multiply(pop_weighted_energy_totals[f"electricity {sector} {use}"]) * 1e6 From d3cf329456056d02fcfcbabe175e6ff9a8e2bb0c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 09:28:51 +0100 Subject: [PATCH 271/497] correctly read number of solver threads in rule definition --- doc/release_notes.rst | 2 ++ rules/common.smk | 7 +++++++ rules/solve_electricity.smk | 2 +- rules/solve_myopic.smk | 2 +- rules/solve_overnight.smk | 5 +---- rules/solve_perfect.smk | 2 +- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 56fee0d8..1a0013d5 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -46,6 +46,8 @@ Upcoming Release existing heating to urban/rural, residential/services and spatially more transparent. +* Bugfix: Correctly read out number of solver threads from configuration file. + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/rules/common.smk b/rules/common.smk index 2298ff91..1654180f 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -13,6 +13,13 @@ for path in helper_source_path: from _helpers import validate_checksum +def solver_threads(w): + solver_options = config["solving"]["solver_options"] + option_set = config["solving"]["solver"]["options"] + threads = solver_options[option_set].get("threads", 4) + return threads + + def memory(w): factor = 3.0 for o in w.opts.split("-"): diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index 7f6092be..ac433cf9 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -25,7 +25,7 @@ rule solve_network: + "solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_python.log", benchmark: BENCHMARKS + "solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}" - threads: 4 + threads: solver_threads resources: mem_mb=memory, walltime=config["solving"].get("walltime", "12:00:00"), diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 20043286..8c46ed59 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -137,7 +137,7 @@ rule solve_sector_network_myopic: + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log", python=LOGS + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", - threads: 4 + threads: solver_threads resources: mem_mb=config["solving"]["mem"], walltime=config["solving"].get("walltime", "12:00:00"), diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 47c86410..aa08b8c3 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -28,10 +28,7 @@ rule solve_sector_network: + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_memory.log", python=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", - threads: - config["solving"]["solver_options"][ - config["solving"]["solver"]["options"] - ].get("threads", 4) + threads: solver_threads resources: mem_mb=config["solving"]["mem"], walltime=config["solving"].get("walltime", "12:00:00"), diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index a7856fa9..ad310f9f 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -127,7 +127,7 @@ rule solve_sector_network_perfect: output: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", - threads: 4 + threads: solver_threads resources: mem_mb=config["solving"]["mem"], shadow: From 9865a970893d9e515786f33c629b14f71645bf1e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 09:29:32 +0100 Subject: [PATCH 272/497] apply automated formatting --- rules/build_sector.smk | 11 +-- rules/solve_myopic.smk | 6 +- scripts/add_existing_baseyear.py | 17 ++-- scripts/build_district_heat_share.py | 31 ++++---- scripts/build_energy_totals.py | 21 ++--- .../build_existing_heating_distribution.py | 77 +++++++++++-------- scripts/build_hourly_heat_demand.py | 12 +-- scripts/prepare_sector_network.py | 12 +-- 8 files changed, 105 insertions(+), 82 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 14156268..a24f9f7d 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -710,8 +710,6 @@ rule build_transport_demand: "../scripts/build_transport_demand.py" - - rule build_district_heat_share: params: sector=config["sector"], @@ -719,7 +717,8 @@ rule build_district_heat_share: district_heat_share=RESOURCES + "district_heat_share.csv", clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", output: - district_heat_share=RESOURCES + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + district_heat_share=RESOURCES + + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", threads: 1 resources: mem_mb=1000, @@ -782,8 +781,10 @@ rule prepare_sector_network: simplified_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}.csv", industrial_demand=RESOURCES + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv", - hourly_heat_demand_total=RESOURCES + "hourly_heat_demand_total_elec_s{simpl}_{clusters}.nc", - district_heat_share=RESOURCES + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + hourly_heat_demand_total=RESOURCES + + "hourly_heat_demand_total_elec_s{simpl}_{clusters}.nc", + district_heat_share=RESOURCES + + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", temp_soil_total=RESOURCES + "temp_soil_total_elec_s{simpl}_{clusters}.nc", temp_soil_rural=RESOURCES + "temp_soil_rural_elec_s{simpl}_{clusters}.nc", temp_soil_urban=RESOURCES + "temp_soil_urban_elec_s{simpl}_{clusters}.nc", diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 8c46ed59..75334073 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -11,8 +11,10 @@ rule build_existing_heating_distribution: 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", + 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", diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index d61ece85..c67d5f8b 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -409,15 +409,13 @@ def add_heating_capacities_installed_before_baseyear( # file: "WP2_DataAnnex_1_BuildingTechs_ForPublication_201603.xls" -> "existing_heating_raw.csv". # TODO start from original file - existing_heating = pd.read_csv(snakemake.input.existing_heating_distribution, - header=[0,1], - index_col=0) - + existing_heating = pd.read_csv( + snakemake.input.existing_heating_distribution, header=[0, 1], index_col=0 + ) techs = existing_heating.columns.get_level_values(1).unique() for name in existing_heating.columns.get_level_values(0).unique(): - name_type = "central" if name == "urban central" else "decentral" nodes = pd.Index(n.buses.location[n.buses.index.str.contains(f"{name} heat")]) @@ -451,7 +449,9 @@ def add_heating_capacities_installed_before_baseyear( efficiency=efficiency, capital_cost=costs.at[costs_name, "efficiency"] * costs.at[costs_name, "fixed"], - p_nom=existing_heating.loc[nodes, (name, f"{heat_pump_type} heat pump")] * ratio / costs.at[costs_name, "efficiency"], + p_nom=existing_heating.loc[nodes, (name, f"{heat_pump_type} heat pump")] + * ratio + / costs.at[costs_name, "efficiency"], build_year=int(grouping_year), lifetime=costs.at[costs_name, "lifetime"], ) @@ -513,10 +513,11 @@ def add_heating_capacities_installed_before_baseyear( efficiency2=costs.at["oil", "CO2 intensity"], capital_cost=costs.at["decentral oil boiler", "efficiency"] * costs.at["decentral oil boiler", "fixed"], - p_nom= ( + p_nom=( existing_heating.loc[nodes, (name, "oil boiler")] * ratio - / costs.at["decentral oil boiler", "efficiency"]), + / costs.at["decentral oil boiler", "efficiency"] + ), build_year=int(grouping_year), lifetime=costs.at[f"{name_type} gas boiler", "lifetime"], ) diff --git a/scripts/build_district_heat_share.py b/scripts/build_district_heat_share.py index 996ed861..3353437a 100644 --- a/scripts/build_district_heat_share.py +++ b/scripts/build_district_heat_share.py @@ -6,12 +6,10 @@ Build district heat shares at each node, depending on investment year. """ -import pandas as pd - -from prepare_sector_network import get - import logging +import pandas as pd +from prepare_sector_network import get logger = logging.getLogger(__name__) @@ -29,11 +27,11 @@ if __name__ == "__main__": investment_year = int(snakemake.wildcards.planning_horizons[-4:]) - pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, - index_col=0) + pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) - district_heat_share = pd.read_csv(snakemake.input.district_heat_share, - index_col=0).squeeze() + district_heat_share = pd.read_csv( + snakemake.input.district_heat_share, index_col=0 + ).squeeze() # make ct-based share nodal district_heat_share = district_heat_share.loc[pop_layout.ct] @@ -62,17 +60,22 @@ if __name__ == "__main__": # difference of max potential and today's share of district heating diff = (urban_fraction * central_fraction) - dist_fraction_node - progress = get(snakemake.config["sector"]["district_heating"]["progress"], investment_year) + progress = get( + snakemake.config["sector"]["district_heating"]["progress"], investment_year + ) dist_fraction_node += diff * progress logger.info( f"Increase district heating share by a progress factor of {progress:.2%} " f"resulting in new average share of {dist_fraction_node.mean():.2%}" ) - df = pd.DataFrame({ - "original district heat share": district_heat_share, - "district fraction of node": dist_fraction_node, - "urban fraction": urban_fraction - }, dtype=float) + df = pd.DataFrame( + { + "original district heat share": district_heat_share, + "district fraction of node": dist_fraction_node, + "urban fraction": urban_fraction, + }, + dtype=float, + ) df.to_csv(snakemake.output.district_heat_share) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 08d5bef5..c67bb49d 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -569,21 +569,24 @@ def build_energy_totals(countries, eurostat, swiss, idees): def build_district_heat_share(countries, idees): - # district heating share - district_heat = idees[ - ["derived heat residential", "derived heat services"] - ].sum(axis=1) - total_heat = idees[["thermal uses residential", "thermal uses services"]].sum(axis=1) + district_heat = idees[["derived heat residential", "derived heat services"]].sum( + axis=1 + ) + total_heat = idees[["thermal uses residential", "thermal uses services"]].sum( + axis=1 + ) - district_heat_share = district_heat/total_heat + district_heat_share = district_heat / total_heat district_heat_share = district_heat_share.reindex(countries) # Missing district heating share - dh_share = pd.read_csv( - snakemake.input.district_heat_share, index_col=0, usecols=[0, 1] - ).div(100).squeeze() + dh_share = ( + pd.read_csv(snakemake.input.district_heat_share, index_col=0, usecols=[0, 1]) + .div(100) + .squeeze() + ) # make conservative assumption and take minimum from both data sets district_heat_share = pd.concat( [district_heat_share, dh_share.reindex_like(district_heat_share)], axis=1 diff --git a/scripts/build_existing_heating_distribution.py b/scripts/build_existing_heating_distribution.py index 443c5baa..67993c29 100644 --- a/scripts/build_existing_heating_distribution.py +++ b/scripts/build_existing_heating_distribution.py @@ -6,9 +6,9 @@ Builds table of existing heat generation capacities for initial planning horizon. """ -import pandas as pd -import numpy as np import country_converter as coco +import numpy as np +import pandas as pd cc = coco.CountryConverter() @@ -16,9 +16,9 @@ cc = coco.CountryConverter() def build_existing_heating(): # retrieve existing heating capacities - existing_heating = pd.read_csv(snakemake.input.existing_heating, - index_col=0, - header=0) + existing_heating = pd.read_csv( + snakemake.input.existing_heating, index_col=0, header=0 + ) # data for Albania, Montenegro and Macedonia not included in database existing_heating.loc["Albania"] = np.nan @@ -33,24 +33,25 @@ def build_existing_heating(): existing_heating.index = cc.convert(existing_heating.index, to="iso2") # coal and oil boilers are assimilated to oil boilers - existing_heating["oil boiler"] = existing_heating["oil boiler"] + existing_heating["coal boiler"] + existing_heating["oil boiler"] = ( + existing_heating["oil boiler"] + existing_heating["coal boiler"] + ) existing_heating.drop(["coal boiler"], axis=1, inplace=True) # distribute technologies to nodes by population - pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, - index_col=0) + pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) nodal_heating = existing_heating.loc[pop_layout.ct] nodal_heating.index = pop_layout.index nodal_heating = nodal_heating.multiply(pop_layout.fraction, axis=0) - district_heat_info = pd.read_csv(snakemake.input.district_heat_share, - index_col=0) + district_heat_info = pd.read_csv(snakemake.input.district_heat_share, index_col=0) dist_fraction = district_heat_info["district fraction of node"] urban_fraction = district_heat_info["urban fraction"] - energy_layout = pd.read_csv(snakemake.input.clustered_pop_energy_layout, - index_col=0) + energy_layout = pd.read_csv( + snakemake.input.clustered_pop_energy_layout, index_col=0 + ) uses = ["space", "water"] sectors = ["residential", "services"] @@ -58,39 +59,51 @@ def build_existing_heating(): nodal_sectoral_totals = pd.DataFrame(dtype=float) for sector in sectors: - nodal_sectoral_totals[sector] = energy_layout[[f"total {sector} {use}" for use in uses]].sum(axis=1) - - nodal_sectoral_fraction = nodal_sectoral_totals.div(nodal_sectoral_totals.sum(axis=1), - axis=0) + nodal_sectoral_totals[sector] = energy_layout[ + [f"total {sector} {use}" for use in uses] + ].sum(axis=1) + nodal_sectoral_fraction = nodal_sectoral_totals.div( + nodal_sectoral_totals.sum(axis=1), axis=0 + ) nodal_heat_name_fraction = pd.DataFrame(dtype=float) nodal_heat_name_fraction["urban central"] = dist_fraction for sector in sectors: + nodal_heat_name_fraction[f"{sector} rural"] = nodal_sectoral_fraction[ + sector + ] * (1 - urban_fraction) + nodal_heat_name_fraction[f"{sector} urban decentral"] = nodal_sectoral_fraction[ + sector + ] * (urban_fraction - dist_fraction) - nodal_heat_name_fraction[f"{sector} rural"] = nodal_sectoral_fraction[sector]*(1 - urban_fraction) - nodal_heat_name_fraction[f"{sector} urban decentral"] = nodal_sectoral_fraction[sector]*(urban_fraction - dist_fraction) + nodal_heat_name_tech = pd.concat( + { + name: nodal_heating.multiply(nodal_heat_name_fraction[name], axis=0) + for name in nodal_heat_name_fraction.columns + }, + axis=1, + names=["heat name", "technology"], + ) - - nodal_heat_name_tech = pd.concat({name : nodal_heating .multiply(nodal_heat_name_fraction[name], - axis=0) for name in nodal_heat_name_fraction.columns}, - axis=1, - names=["heat name","technology"]) - - - #move all ground HPs to rural, all air to urban + # move all ground HPs to rural, all air to urban for sector in sectors: - nodal_heat_name_tech[(f"{sector} rural","ground heat pump")] += (nodal_heat_name_tech[("urban central","ground heat pump")]*nodal_sectoral_fraction[sector] - + nodal_heat_name_tech[(f"{sector} urban decentral","ground heat pump")]) - nodal_heat_name_tech[(f"{sector} urban decentral","ground heat pump")] = 0. + nodal_heat_name_tech[(f"{sector} rural", "ground heat pump")] += ( + nodal_heat_name_tech[("urban central", "ground heat pump")] + * nodal_sectoral_fraction[sector] + + nodal_heat_name_tech[(f"{sector} urban decentral", "ground heat pump")] + ) + nodal_heat_name_tech[(f"{sector} urban decentral", "ground heat pump")] = 0.0 - nodal_heat_name_tech[(f"{sector} urban decentral","air heat pump")] += nodal_heat_name_tech[(f"{sector} rural","air heat pump")] - nodal_heat_name_tech[(f"{sector} rural","air heat pump")] = 0. + nodal_heat_name_tech[ + (f"{sector} urban decentral", "air heat pump") + ] += nodal_heat_name_tech[(f"{sector} rural", "air heat pump")] + nodal_heat_name_tech[(f"{sector} rural", "air heat pump")] = 0.0 - nodal_heat_name_tech[("urban central","ground heat pump")] = 0. + nodal_heat_name_tech[("urban central", "ground heat pump")] = 0.0 nodal_heat_name_tech.to_csv(snakemake.output.existing_heating_distribution) diff --git a/scripts/build_hourly_heat_demand.py b/scripts/build_hourly_heat_demand.py index 2d1dee54..c972da89 100644 --- a/scripts/build_hourly_heat_demand.py +++ b/scripts/build_hourly_heat_demand.py @@ -48,16 +48,16 @@ if __name__ == "__main__": ) if use == "space": - heat_demand[f"{sector} {use}"] = daily_space_heat_demand * intraday_year_profile + heat_demand[f"{sector} {use}"] = ( + daily_space_heat_demand * intraday_year_profile + ) else: heat_demand[f"{sector} {use}"] = intraday_year_profile - heat_demand = pd.concat(heat_demand, - axis=1, - names = ["sector use", "node"]) + heat_demand = pd.concat(heat_demand, axis=1, names=["sector use", "node"]) - heat_demand.index.name="snapshots" + heat_demand.index.name = "snapshots" - ds = heat_demand.stack().to_xarray() + ds = heat_demand.stack().to_xarray() ds.to_netcdf(snakemake.output.heat_demand) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 241f3c30..ba92e137 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1639,8 +1639,11 @@ def add_land_transport(n, costs): def build_heat_demand(n): - - heat_demand_shape = xr.open_dataset(snakemake.input.hourly_heat_demand_total).to_dataframe().unstack(level=1) + heat_demand_shape = ( + xr.open_dataset(snakemake.input.hourly_heat_demand_total) + .to_dataframe() + .unstack(level=1) + ) sectors = ["residential", "services"] uses = ["water", "space"] @@ -1648,7 +1651,6 @@ def build_heat_demand(n): heat_demand = {} electric_heat_supply = {} for sector, use in product(sectors, uses): - name = f"{sector} {use}" heat_demand[name] = ( @@ -1678,8 +1680,7 @@ def add_heat(n, costs): heat_demand = build_heat_demand(n) - district_heat_info = pd.read_csv(snakemake.input.district_heat_share, - index_col=0) + district_heat_info = pd.read_csv(snakemake.input.district_heat_share, index_col=0) dist_fraction = district_heat_info["district fraction of node"] urban_fraction = district_heat_info["urban fraction"] @@ -1718,7 +1719,6 @@ def add_heat(n, costs): # 1e3 converts from W/m^2 to MW/(1000m^2) = kW/m^2 solar_thermal = options["solar_cf_correction"] * solar_thermal / 1e3 - for name in heat_systems: name_type = "central" if name == "urban central" else "decentral" From 31c7c10fc5e86702d47f9e2da7eb7dfd230e8b54 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 09:30:53 +0100 Subject: [PATCH 273/497] git-blame-ignore-revs: add automated formatting commit --- .git-blame-ignore-revs | 1 + 1 file changed, 1 insertion(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 0b78b5b6..53f63e71 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -6,3 +6,4 @@ 5d1ef8a64055a039aa4a0834d2d26fe7752fe9a0 92080b1cd2ca5f123158571481722767b99c2b27 13769f90af4500948b0376d57df4cceaa13e78b5 +9865a970893d9e515786f33c629b14f71645bf1e \ No newline at end of file From 757fbcc464c4c04b94d2a29cd325963f0a35aa8a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 08:31:57 +0000 Subject: [PATCH 274/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .git-blame-ignore-revs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 53f63e71..3f1edbd8 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -6,4 +6,4 @@ 5d1ef8a64055a039aa4a0834d2d26fe7752fe9a0 92080b1cd2ca5f123158571481722767b99c2b27 13769f90af4500948b0376d57df4cceaa13e78b5 -9865a970893d9e515786f33c629b14f71645bf1e \ No newline at end of file +9865a970893d9e515786f33c629b14f71645bf1e From fd57311094f9ef86400e94121cb33e87b6abacbf Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 10:10:40 +0100 Subject: [PATCH 275/497] build_district_heat_share: make safe for single-country runs --- scripts/build_district_heat_share.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_district_heat_share.py b/scripts/build_district_heat_share.py index 3353437a..6e934a2b 100644 --- a/scripts/build_district_heat_share.py +++ b/scripts/build_district_heat_share.py @@ -31,7 +31,7 @@ if __name__ == "__main__": district_heat_share = pd.read_csv( snakemake.input.district_heat_share, index_col=0 - ).squeeze() + )["district heat share"] # make ct-based share nodal district_heat_share = district_heat_share.loc[pop_layout.ct] From 025f48c0c2ba402f61f9cf2d0cf8c4656beae1ac Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 09:11:06 +0000 Subject: [PATCH 276/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_district_heat_share.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build_district_heat_share.py b/scripts/build_district_heat_share.py index 6e934a2b..86c42631 100644 --- a/scripts/build_district_heat_share.py +++ b/scripts/build_district_heat_share.py @@ -29,9 +29,9 @@ if __name__ == "__main__": pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) - district_heat_share = pd.read_csv( - snakemake.input.district_heat_share, index_col=0 - )["district heat share"] + district_heat_share = pd.read_csv(snakemake.input.district_heat_share, index_col=0)[ + "district heat share" + ] # make ct-based share nodal district_heat_share = district_heat_share.loc[pop_layout.ct] From a2315c289e8b264655eb4fab8afaf112d84d681b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 14:31:10 +0100 Subject: [PATCH 277/497] cluster_gas_network: generalise so it can be used elsewhere --- scripts/cluster_gas_network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/cluster_gas_network.py b/scripts/cluster_gas_network.py index b8da5012..bc4a6e14 100755 --- a/scripts/cluster_gas_network.py +++ b/scripts/cluster_gas_network.py @@ -75,10 +75,10 @@ def build_clustered_gas_network(df, bus_regions, length_factor=1.25): return df -def reindex_pipes(df): +def reindex_pipes(df, prefix="gas pipeline"): def make_index(x): connector = " <-> " if x.bidirectional else " -> " - return "gas pipeline " + x.bus0 + connector + x.bus1 + return prefix + " " + x.bus0 + connector + x.bus1 df.index = df.apply(make_index, axis=1) From a9ac68b50e837a0365e6eb3e66d57f433dfb6804 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 14:31:35 +0100 Subject: [PATCH 278/497] bugfix: correct way to identify if entry is in snakemake.input --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 4d36e7d4..41ff3ac9 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1321,7 +1321,7 @@ def add_storage_and_grids(n, costs): h2_pipes["p_nom"] = 0.0 - if "custom_h2_pipelines" in snakemake.input: + if snakemake.input.get("custom_h2_pipelines"): fn = snakemake.input.custom_h2_pipelines custom_pipes = pd.read_csv(fn, index_col=0) From 6c593a551b6f090b1066285061ec41f48c325d1c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 18:07:33 +0100 Subject: [PATCH 279/497] build_hourly_heat_demand: only pass subset of snapshot config --- rules/build_sector.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index a24f9f7d..0586ec01 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -147,7 +147,7 @@ rule build_daily_heat_demand: rule build_hourly_heat_demand: params: - snapshots=config["snapshots"], + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, input: heat_profile="data/heat_load_profile_BDEW.csv", heat_demand=RESOURCES + "daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", From 2173abdff340bd8a1877bd2465d02962f337f525 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 18:20:52 +0000 Subject: [PATCH 280/497] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/fsfe/reuse-tool: v2.1.0 → v3.0.1](https://github.com/fsfe/reuse-tool/compare/v2.1.0...v3.0.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02d360d3..a38e6800 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -87,6 +87,6 @@ repos: # Check for FSFE REUSE compliance (licensing) - repo: https://github.com/fsfe/reuse-tool - rev: v2.1.0 + rev: v3.0.1 hooks: - id: reuse From 48974edc8d3e9b2236e9e9200db5d4f2867ab280 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Tue, 23 Jan 2024 16:27:12 +0100 Subject: [PATCH 281/497] Make data retrieval rules use their own minimal conda env This means that the main conda environment can be changed for development purposes without necessitating the re-running of data retrieval due to software environment change by default. --- envs/retrieve.yaml | 13 +++++++++++++ rules/retrieve.smk | 16 ++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 envs/retrieve.yaml diff --git a/envs/retrieve.yaml b/envs/retrieve.yaml new file mode 100644 index 00000000..b5db795d --- /dev/null +++ b/envs/retrieve.yaml @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +name: pypsa-eur-retrieve +channels: +- conda-forge +- bioconda +dependencies: +- python>=3.8 +- snakemake-minimal>=7.7.0,<8.0.0 +- pandas>=2.1 +- tqdm diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 5e1e3e59..da2dc40a 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -37,7 +37,7 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_databundle", mem_mb=1000, retries: 2 conda: - "../envs/environment.yaml" + "../envs/retrieve.yaml" script: "../scripts/retrieve_databundle.py" @@ -55,7 +55,7 @@ if config["enable"].get("retrieve_irena"): mem_mb=1000, retries: 2 conda: - "../envs/environment.yaml" + "../envs/retrieve.yaml" script: "../scripts/retrieve_irena.py" @@ -157,7 +157,7 @@ if config["enable"]["retrieve"] and config["enable"].get( LOGS + "retrieve_sector_databundle.log", retries: 2 conda: - "../envs/environment.yaml" + "../envs/retrieve.yaml" script: "../scripts/retrieve_sector_databundle.py" @@ -180,7 +180,7 @@ if config["enable"]["retrieve"]: LOGS + "retrieve_gas_infrastructure_data.log", retries: 2 conda: - "../envs/environment.yaml" + "../envs/retrieve.yaml" script: "../scripts/retrieve_gas_infrastructure_data.py" @@ -191,7 +191,7 @@ if config["enable"]["retrieve"]: input: HTTP.remote( "data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv".format( - version="2019-06-05" + version="2019-06-05" if config["snapshots"]["end"] < "2019" else "2020-10-06" ), @@ -316,7 +316,7 @@ if config["enable"]["retrieve"]: layer_path = ( f"/vsizip/{params.folder}/WDPA_{bYYYY}_Public_shp_{i}.zip" ) - print(f"Adding layer {i+1} of 3 to combined output file.") + print(f"Adding layer {i + 1} of 3 to combined output file.") shell("ogr2ogr -f gpkg -update -append {output.gpkg} {layer_path}") rule download_wdpa_marine: @@ -340,7 +340,7 @@ if config["enable"]["retrieve"]: for i in range(3): # vsizip is special driver for directly working with zipped shapefiles in ogr2ogr layer_path = f"/vsizip/{params.folder}/WDPA_WDOECM_{bYYYY}_Public_marine_shp_{i}.zip" - print(f"Adding layer {i+1} of 3 to combined output file.") + print(f"Adding layer {i + 1} of 3 to combined output file.") shell("ogr2ogr -f gpkg -update -append {output.gpkg} {layer_path}") @@ -376,6 +376,6 @@ if config["enable"]["retrieve"]: mem_mb=5000, retries: 2 conda: - "../envs/environment.yaml" + "../envs/retrieve.yaml" script: "../scripts/retrieve_monthly_fuel_prices.py" From 58ac6629fee01b6f06ec3ea4b2c86bc5cba53d5d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 23 Jan 2024 15:35:08 +0000 Subject: [PATCH 282/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/retrieve.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index da2dc40a..05bbefd8 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -191,7 +191,7 @@ if config["enable"]["retrieve"]: input: HTTP.remote( "data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv".format( - version="2019-06-05" + version="2019-06-05" if config["snapshots"]["end"] < "2019" else "2020-10-06" ), From eeb3d0789bcf21fd003dc0a0452712c6ed23c5d0 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 22 Jan 2024 09:28:51 +0100 Subject: [PATCH 283/497] correctly read number of solver threads in rule definition --- doc/release_notes.rst | 1 + rules/common.smk | 7 +++++++ rules/solve_electricity.smk | 2 +- rules/solve_myopic.smk | 2 +- rules/solve_overnight.smk | 4 +--- rules/solve_perfect.smk | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index dc1a9dd1..be3b65d0 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -28,6 +28,7 @@ Upcoming Release * Cluster residential and services heat buses by default. Can be disabled with ``cluster_heat_buses: false``. +* Bugfix: Correctly read out number of solver threads from configuration file. PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/rules/common.smk b/rules/common.smk index 2298ff91..1654180f 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -13,6 +13,13 @@ for path in helper_source_path: from _helpers import validate_checksum +def solver_threads(w): + solver_options = config["solving"]["solver_options"] + option_set = config["solving"]["solver"]["options"] + threads = solver_options[option_set].get("threads", 4) + return threads + + def memory(w): factor = 3.0 for o in w.opts.split("-"): diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index 7f6092be..ac433cf9 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -25,7 +25,7 @@ rule solve_network: + "solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_python.log", benchmark: BENCHMARKS + "solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}" - threads: 4 + threads: solver_threads resources: mem_mb=memory, walltime=config["solving"].get("walltime", "12:00:00"), diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 7ca8857d..aa94c945 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -104,7 +104,7 @@ rule solve_sector_network_myopic: + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log", python=LOGS + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", - threads: 4 + threads: solver_threads resources: mem_mb=config["solving"]["mem"], walltime=config["solving"].get("walltime", "12:00:00"), diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 39778162..aa08b8c3 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -28,9 +28,7 @@ rule solve_sector_network: + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_memory.log", python=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", - threads: config["solving"]["solver_options"][config["solving"]["solver"]["options"]].get( - "threads", 4 -) + threads: solver_threads resources: mem_mb=config["solving"]["mem"], walltime=config["solving"].get("walltime", "12:00:00"), diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index a7856fa9..ad310f9f 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -127,7 +127,7 @@ rule solve_sector_network_perfect: output: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", - threads: 4 + threads: solver_threads resources: mem_mb=config["solving"]["mem"], shadow: From 9f0555863b4051db14927d0d36431825c689be24 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 23 Jan 2024 18:19:46 +0100 Subject: [PATCH 284/497] powerplantmatching: block version 0.5.9 with breaking bug --- envs/environment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envs/environment.yaml b/envs/environment.yaml index 535acbdb..6ff4b7f1 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -26,7 +26,7 @@ dependencies: - yaml - pytables - lxml -- powerplantmatching>=0.5.5 +- powerplantmatching>=0.5.5,!=0.5.9 - numpy - pandas>=2.1 - geopandas>=0.11.0 From 2d12f7ddd0c080dd41410b4006f72bf31665ab53 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 23 Jan 2024 18:41:52 +0100 Subject: [PATCH 285/497] add air-sourced heat pumps to rural areas --- doc/release_notes.rst | 2 ++ scripts/prepare_sector_network.py | 42 ++++++++++++++++--------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index dc1a9dd1..38b47a31 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -28,6 +28,8 @@ Upcoming Release * Cluster residential and services heat buses by default. Can be disabled with ``cluster_heat_buses: false``. +* Air-sourced heat pumps can now also be built in rural areas. Previously, only + ground-sourced heat pumps were considered for this category. PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 41ff3ac9..169e2614 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1803,28 +1803,30 @@ def add_heat(n, costs): ## Add heat pumps - heat_pump_type = "air" if "urban" in name else "ground" + heat_pump_types = ["air"] if "urban" in name else ["ground", "air"] - costs_name = f"{name_type} {heat_pump_type}-sourced heat pump" - efficiency = ( - cop[heat_pump_type][nodes[name]] - if options["time_dep_hp_cop"] - else costs.at[costs_name, "efficiency"] - ) + for heat_pump_type in heat_pump_types: - n.madd( - "Link", - nodes[name], - suffix=f" {name} {heat_pump_type} heat pump", - bus0=nodes[name], - bus1=nodes[name] + f" {name} heat", - carrier=f"{name} {heat_pump_type} heat pump", - efficiency=efficiency, - capital_cost=costs.at[costs_name, "efficiency"] - * costs.at[costs_name, "fixed"], - p_nom_extendable=True, - lifetime=costs.at[costs_name, "lifetime"], - ) + costs_name = f"{name_type} {heat_pump_type}-sourced heat pump" + efficiency = ( + cop[heat_pump_type][nodes[name]] + if options["time_dep_hp_cop"] + else costs.at[costs_name, "efficiency"] + ) + + n.madd( + "Link", + nodes[name], + suffix=f" {name} {heat_pump_type} heat pump", + bus0=nodes[name], + bus1=nodes[name] + f" {name} heat", + carrier=f"{name} {heat_pump_type} heat pump", + efficiency=efficiency, + capital_cost=costs.at[costs_name, "efficiency"] + * costs.at[costs_name, "fixed"], + p_nom_extendable=True, + lifetime=costs.at[costs_name, "lifetime"], + ) if options["tes"]: n.add("Carrier", name + " water tanks") From bdc36dc5da5834275450119ea823916adb247b91 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 23 Jan 2024 17:43:02 +0000 Subject: [PATCH 286/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 169e2614..00b9d39b 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1806,7 +1806,6 @@ def add_heat(n, costs): heat_pump_types = ["air"] if "urban" in name else ["ground", "air"] for heat_pump_type in heat_pump_types: - costs_name = f"{name_type} {heat_pump_type}-sourced heat pump" efficiency = ( cop[heat_pump_type][nodes[name]] From b1ce26d2708e10ac5bc3bbf8fb6ba003b913cf0e Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 24 Jan 2024 09:37:01 +0100 Subject: [PATCH 287/497] Don't include triple solar potential option by default --- config/config.default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 6349f43e..98595d20 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -44,7 +44,7 @@ scenario: opts: - '' sector_opts: - - Co2L0-3H-T-H-B-I-A-solar+p3-dist1 + - Co2L0-3H-T-H-B-I-A-dist1 planning_horizons: # - 2020 # - 2030 From 2bee36be8788bfdd2442312324f7077c4139a099 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 24 Jan 2024 10:17:26 +0100 Subject: [PATCH 288/497] follow-up to #891: remove remaining solar+p3 references --- config/config.perfect.yaml | 6 +- config/config.personal.yaml | 1070 ++++++++++++++++++++++++++ config/test/config.myopic.yaml | 2 +- config/test/config.overnight.yaml | 2 +- config/test/config.perfect.yaml | 2 +- scripts/add_brownfield.py | 2 +- scripts/add_existing_baseyear.py | 2 +- scripts/plot_network.py | 2 +- scripts/prepare_perfect_foresight.py | 2 +- scripts/prepare_sector_network.py | 2 +- scripts/solve_network.py | 2 +- 11 files changed, 1082 insertions(+), 12 deletions(-) create mode 100644 config/config.personal.yaml diff --git a/config/config.perfect.yaml b/config/config.perfect.yaml index 4dde8db9..ff531303 100644 --- a/config/config.perfect.yaml +++ b/config/config.perfect.yaml @@ -19,9 +19,9 @@ scenario: opts: - '' sector_opts: - - 1p5-4380H-T-H-B-I-A-solar+p3-dist1 - - 1p7-4380H-T-H-B-I-A-solar+p3-dist1 - - 2p0-4380H-T-H-B-I-A-solar+p3-dist1 + - 1p5-4380H-T-H-B-I-A-dist1 + - 1p7-4380H-T-H-B-I-A-dist1 + - 2p0-4380H-T-H-B-I-A-dist1 planning_horizons: - 2020 - 2025 diff --git a/config/config.personal.yaml b/config/config.personal.yaml new file mode 100644 index 00000000..b86b56f7 --- /dev/null +++ b/config/config.personal.yaml @@ -0,0 +1,1070 @@ +# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#top-level-configuration +version: 0.9.0 +tutorial: false + +logging: + level: INFO + format: '%(levelname)s:%(name)s:%(message)s' + +private: + keys: + entsoe_api: + +remote: + ssh: "z1" + path: "SCRATCH/projects/pypsa-eur" + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#run +run: + name: "" + disable_progressbar: false + shared_resources: false + shared_cutouts: true + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#foresight +foresight: overnight + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#scenario +# Wildcard docs in https://pypsa-eur.readthedocs.io/en/latest/wildcards.html +scenario: + simpl: + - '' + ll: + - vopt + clusters: + - 37 + # - 150 + opts: + - '' + sector_opts: + # - Co2L0-3H-T-H-B-I-A + # - Co2L0-2190SEG-T-H-B-I-A + # - Co2L0-25H-T-H-B-I-A + - Co2L0-97H-T-H-B-I-A + planning_horizons: + # - 2020 + - 2030 + # - 2040 + # - 2050 + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#countries +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'] + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#snapshots +snapshots: + start: "2013-01-01" + end: "2014-01-01" + inclusive: 'left' + resolution: false + segmentation: false + #representative: false + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#enable +enable: + retrieve: auto + prepare_links_p_nom: false + retrieve_databundle: true + retrieve_sector_databundle: true + retrieve_cost_data: true + build_cutout: false + retrieve_irena: false + retrieve_cutout: true + build_natura_raster: false + retrieve_natura_raster: true + custom_busmap: false + + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#co2-budget +co2_budget: + 2020: 0.701 + 2025: 0.524 + 2030: 0.297 + 2035: 0.150 + 2040: 0.071 + 2045: 0.032 + 2050: 0.000 + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#electricity +electricity: + voltages: [220., 300., 380., 500., 750.] + gaslimit_enable: false + gaslimit: false + co2limit_enable: false + co2limit: 7.75e+7 + co2base: 1.487e+9 + agg_p_nom_limits: data/agg_p_nom_minmax.csv + + operational_reserve: + activate: false + epsilon_load: 0.02 + epsilon_vres: 0.02 + contingency: 4000 + + max_hours: + battery: 6 + H2: 168 + + extendable_carriers: + Generator: [solar, onwind, offwind-ac, offwind-dc, OCGT] + StorageUnit: [] # battery, H2 + Store: [battery, H2] + Link: [] # H2 pipeline + + powerplants_filter: (DateOut >= 2022 or DateOut != DateOut) + custom_powerplants: false + everywhere_powerplants: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] + + conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] + renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, hydro] + + estimate_renewable_capacities: + enable: true + from_opsd: true + year: 2020 + expansion_limit: false + technology_mapping: + Offshore: [offwind-ac, offwind-dc] + Onshore: [onwind] + PV: [solar] + + autarky: + enable: false + by_country: false + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#atlite +atlite: + default_cutout: europe-2013-era5 + nprocesses: 4 + show_progress: false + cutouts: + # use 'base' to determine geographical bounds and time span from config + # base: + # module: era5 + europe-2013-era5: + module: era5 # in priority order + x: [-12., 42.] + y: [33., 72] + dx: 0.3 + dy: 0.3 + time: ['2013', '2013'] + europe-2013-sarah: + module: [sarah, era5] # in priority order + x: [-12., 42.] + y: [33., 65] + dx: 0.2 + dy: 0.2 + time: ['2013', '2013'] + sarah_interpolate: false + sarah_dir: + features: [influx, temperature] + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#renewable +renewable: + onwind: + cutout: europe-2013-era5 + resource: + method: wind + turbine: Vestas_V112_3MW + add_cutout_windspeed: true + capacity_per_sqkm: 3 + # correction_factor: 0.93 + corine: + grid_codes: [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32] + distance: 1000 + distance_grid_codes: [1, 2, 3, 4, 5, 6] + luisa: false + # grid_codes: [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242] + # distance: 1000 + # distance_grid_codes: [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242] + natura: true + excluder_resolution: 100 + clip_p_max_pu: 1.e-2 + offwind-ac: + cutout: europe-2013-era5 + resource: + method: wind + turbine: NREL_ReferenceTurbine_2020ATB_5.5MW + add_cutout_windspeed: true + capacity_per_sqkm: 2 + correction_factor: 0.8855 + corine: [44, 255] + luisa: false # [0, 5230] + natura: true + ship_threshold: 400 + max_depth: 50 + max_shore_distance: 30000 + excluder_resolution: 200 + clip_p_max_pu: 1.e-2 + offwind-dc: + cutout: europe-2013-era5 + resource: + method: wind + turbine: NREL_ReferenceTurbine_2020ATB_5.5MW + add_cutout_windspeed: true + capacity_per_sqkm: 2 + correction_factor: 0.8855 + corine: [44, 255] + luisa: false # [0, 5230] + natura: true + ship_threshold: 400 + max_depth: 50 + min_shore_distance: 30000 + excluder_resolution: 200 + clip_p_max_pu: 1.e-2 + solar: + cutout: europe-2013-sarah + resource: + method: pv + panel: CSi + orientation: + slope: 35. + azimuth: 180. + capacity_per_sqkm: 5.1 + # correction_factor: 0.854337 + corine: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 31, 32] + luisa: false # [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242, 1310, 1320, 1330, 1410, 1421, 1422, 2110, 2120, 2130, 2210, 2220, 2230, 2310, 2410, 2420, 3210, 3320, 3330] + natura: true + excluder_resolution: 100 + clip_p_max_pu: 1.e-2 + hydro: + cutout: europe-2013-era5 + carriers: [ror, PHS, hydro] + PHS_max_hours: 6 + hydro_max_hours: "energy_capacity_totals_by_country" # one of energy_capacity_totals_by_country, estimate_by_large_installations or a float + flatten_dispatch: false + flatten_dispatch_buffer: 0.2 + clip_min_inflow: 1.0 + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#conventional +conventional: + unit_commitment: false + dynamic_fuel_price: false + nuclear: + p_max_pu: "data/nuclear_p_max_pu.csv" # float of file name + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#lines +lines: + types: + 220.: "Al/St 240/40 2-bundle 220.0" + 300.: "Al/St 240/40 3-bundle 300.0" + 380.: "Al/St 240/40 4-bundle 380.0" + 500.: "Al/St 240/40 4-bundle 380.0" + 750.: "Al/St 560/50 4-bundle 750.0" + s_max_pu: 0.7 + s_nom_max: .inf + max_extension: 20000 #MW + length_factor: 1.25 + reconnect_crimea: true + under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity + dynamic_line_rating: + activate: false + cutout: europe-2013-era5 + correction_factor: 0.95 + max_voltage_difference: false + max_line_rating: false + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#links +links: + p_max_pu: 1.0 + p_nom_max: .inf + max_extension: 30000 #MW + include_tyndp: true + under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#transformers +transformers: + x: 0.1 + s_nom: 2000. + type: '' + +# docs-load in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#load +load: + power_statistics: true + interpolate_limit: 3 + time_shift_for_large_gaps: 1w + manual_adjustments: true # false + scaling_factor: 1.0 + +# docs +# TODO: PyPSA-Eur merge issue in prepare_sector_network.py +# regulate what components with which carriers are kept from PyPSA-Eur; +# some technologies are removed because they are implemented differently +# (e.g. battery or H2 storage) or have different year-dependent costs +# in PyPSA-Eur-Sec +pypsa_eur: + Bus: + - AC + Link: + - DC + Generator: + - onwind + - offwind-ac + - offwind-dc + - solar + - ror + - nuclear + StorageUnit: + - PHS + - hydro + Store: [] + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#energy +energy: + energy_totals_year: 2011 + base_emissions_year: 1990 + eurostat_report_year: 2016 + emissions: CO2 + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#biomass +biomass: + year: 2030 + scenario: ENS_Med + classes: + solid biomass: + - Agricultural waste + - Fuelwood residues + - Secondary Forestry residues - woodchips + - Sawdust + - Residues from landscape care + - Municipal waste + not included: + - Sugar from sugar beet + - Rape seed + - "Sunflower, soya seed " + - Bioethanol barley, wheat, grain maize, oats, other cereals and rye + - Miscanthus, switchgrass, RCG + - Willow + - Poplar + - FuelwoodRW + - C&P_RW + biogas: + - Manure solid, liquid + - Sludge + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#solar-thermal +solar_thermal: + clearsky_model: simple # should be "simple" or "enhanced"? + orientation: + slope: 45. + azimuth: 180. + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#existing-capacities +existing_capacities: + grouping_years_power: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030] + grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # these should not extend 2020 + threshold_capacity: 10 + conventional_carriers: + - lignite + - coal + - oil + - uranium + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#sector +sector: + district_heating: + potential: 0.6 + progress: + 2020: 0.0 + 2025: 0.15 + 2030: 0.3 + 2035: 0.45 + 2040: 0.6 + 2045: 0.8 + 2050: 1.0 + district_heating_loss: 0.15 + cluster_heat_buses: true + bev_dsm_restriction_value: 0.75 + bev_dsm_restriction_time: 7 + transport_heating_deadband_upper: 20. + transport_heating_deadband_lower: 15. + ICE_lower_degree_factor: 0.375 + ICE_upper_degree_factor: 1.6 + EV_lower_degree_factor: 0.98 + EV_upper_degree_factor: 0.63 + bev_dsm: true + bev_availability: 0.5 + bev_energy: 0.05 + bev_charge_efficiency: 0.9 + bev_plug_to_wheel_efficiency: 0.2 + bev_charge_rate: 0.011 + bev_avail_max: 0.95 + bev_avail_mean: 0.8 + v2g: true + land_transport_fuel_cell_share: + 2020: 0 + 2025: 0 + 2030: 0 + 2035: 0 + 2040: 0 + 2045: 0 + 2050: 0 + land_transport_electric_share: + 2020: 0 + 2025: 0.15 + 2030: 0.3 + 2035: 0.45 + 2040: 0.7 + 2045: 0.85 + 2050: 1 + land_transport_ice_share: + 2020: 1 + 2025: 0.85 + 2030: 0.7 + 2035: 0.55 + 2040: 0.3 + 2045: 0.15 + 2050: 0 + transport_fuel_cell_efficiency: 0.5 + transport_internal_combustion_efficiency: 0.3 + agriculture_machinery_electric_share: 0 + agriculture_machinery_oil_share: 1 + agriculture_machinery_fuel_efficiency: 0.7 + agriculture_machinery_electric_efficiency: 0.3 + MWh_MeOH_per_MWh_H2: 0.8787 + MWh_MeOH_per_tCO2: 4.0321 + MWh_MeOH_per_MWh_e: 3.6907 + shipping_hydrogen_liquefaction: false + shipping_hydrogen_share: + 2020: 0 + 2025: 0 + 2030: 0 + 2035: 0 + 2040: 0 + 2045: 0 + 2050: 0 + shipping_methanol_share: + 2020: 0 + 2025: 0.15 + 2030: 0.3 + 2035: 0.5 + 2040: 0.7 + 2045: 0.85 + 2050: 1 + shipping_oil_share: + 2020: 1 + 2025: 0.85 + 2030: 0.7 + 2035: 0.5 + 2040: 0.3 + 2045: 0.15 + 2050: 0 + shipping_methanol_efficiency: 0.46 + shipping_oil_efficiency: 0.40 + aviation_demand_factor: 1. + HVC_demand_factor: 1. + time_dep_hp_cop: true + heat_pump_sink_T: 55. + reduce_space_heat_exogenously: true + reduce_space_heat_exogenously_factor: + 2020: 0.10 # this results in a space heat demand reduction of 10% + 2025: 0.09 # first heat demand increases compared to 2020 because of larger floor area per capita + 2030: 0.09 + 2035: 0.11 + 2040: 0.16 + 2045: 0.21 + 2050: 0.29 + retrofitting: + retro_endogen: false + cost_factor: 1.0 + interest_rate: 0.04 + annualise_cost: true + tax_weighting: false + construction_index: true + tes: true + tes_tau: + decentral: 3 + central: 180 + boilers: true + resistive_heaters: true + oil_boilers: false + biomass_boiler: true + chp: true + micro_chp: false + solar_thermal: false + solar_cf_correction: 0.788457 # = >>> 1/1.2683 + marginal_cost_storage: 0. #1e-4 + methanation: true + coal_cc: false + dac: true + co2_vent: false + central_heat_vent: false + allam_cycle: false + hydrogen_fuel_cell: true + hydrogen_turbine: false + SMR: true + SMR_cc: true + regional_methanol_demand: false + regional_oil_demand: false + regional_co2_sequestration_potential: + enable: false + attribute: 'conservative estimate Mt' + include_onshore: false + min_size: 3 + max_size: 25 + years_of_storage: 25 + co2_sequestration_potential: 200 + co2_sequestration_cost: 10 + co2_sequestration_lifetime: 50 + co2_spatial: false + co2network: false + co2_network_cost_factor: 1 + cc_fraction: 0.9 + hydrogen_underground_storage: true + hydrogen_underground_storage_locations: + # - onshore # more than 50 km from sea + - nearshore # within 50 km of sea + # - offshore + ammonia: false + min_part_load_fischer_tropsch: 0.7 + min_part_load_methanolisation: 0.3 + min_part_load_methanation: 0.3 + use_fischer_tropsch_waste_heat: true + use_haber_bosch_waste_heat: true + use_methanolisation_waste_heat: true + use_methanation_waste_heat: true + use_fuel_cell_waste_heat: true + use_electrolysis_waste_heat: true + electricity_distribution_grid: true + electricity_distribution_grid_cost_factor: 1.0 + electricity_grid_connection: true + transmission_efficiency: + DC: + efficiency_static: 0.98 + efficiency_per_1000km: 0.977 + H2 pipeline: + efficiency_per_1000km: 1 # 0.979 + compression_per_1000km: 0.019 + gas pipeline: + efficiency_per_1000km: 1 #0.977 + compression_per_1000km: 0.01 + H2_network: true + gas_network: false + H2_retrofit: false + H2_retrofit_capacity_per_CH4: 0.6 + gas_network_connectivity_upgrade: 1 + gas_distribution_grid: true + gas_distribution_grid_cost_factor: 1.0 + biomass_spatial: false + biomass_transport: false + biogas_upgrading_cc: false + conventional_generation: + OCGT: gas + biomass_to_liquid: false + biosng: false + limit_max_growth: + enable: false + # allowing 30% larger than max historic growth + factor: 1.3 + max_growth: # unit GW + onwind: 16 # onshore max grow so far 16 GW in Europe https://www.iea.org/reports/renewables-2020/wind + solar: 28 # solar max grow so far 28 GW in Europe https://www.iea.org/reports/renewables-2020/solar-pv + offwind-ac: 35 # offshore max grow so far 3.5 GW in Europe https://windeurope.org/about-wind/statistics/offshore/european-offshore-wind-industry-key-trends-statistics-2019/ + offwind-dc: 35 + max_relative_growth: + onwind: 3 + solar: 3 + offwind-ac: 3 + offwind-dc: 3 + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#industry +industry: + St_primary_fraction: + 2020: 0.6 + 2025: 0.55 + 2030: 0.5 + 2035: 0.45 + 2040: 0.4 + 2045: 0.35 + 2050: 0.3 + DRI_fraction: + 2020: 0 + 2025: 0 + 2030: 0.05 + 2035: 0.2 + 2040: 0.4 + 2045: 0.7 + 2050: 1 + H2_DRI: 1.7 + elec_DRI: 0.322 + Al_primary_fraction: + 2020: 0.4 + 2025: 0.375 + 2030: 0.35 + 2035: 0.325 + 2040: 0.3 + 2045: 0.25 + 2050: 0.2 + MWh_NH3_per_tNH3: 5.166 + MWh_CH4_per_tNH3_SMR: 10.8 + MWh_elec_per_tNH3_SMR: 0.7 + MWh_H2_per_tNH3_electrolysis: 5.93 + MWh_elec_per_tNH3_electrolysis: 0.2473 + MWh_NH3_per_MWh_H2_cracker: 1.46 # https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv + NH3_process_emissions: 24.5 + petrochemical_process_emissions: 25.5 + HVC_primary_fraction: 1. + HVC_mechanical_recycling_fraction: 0. + HVC_chemical_recycling_fraction: 0. + HVC_production_today: 52. + MWh_elec_per_tHVC_mechanical_recycling: 0.547 + MWh_elec_per_tHVC_chemical_recycling: 6.9 + chlorine_production_today: 9.58 + MWh_elec_per_tCl: 3.6 + MWh_H2_per_tCl: -0.9372 + methanol_production_today: 1.5 + MWh_elec_per_tMeOH: 0.167 + MWh_CH4_per_tMeOH: 10.25 + hotmaps_locate_missing: false + reference_year: 2015 + + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs +costs: + year: 2030 + version: v0.6.0 + rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) + 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 + marginal_cost: + solar: 0.01 + onwind: 0.015 + offwind: 0.015 + hydro: 0. + H2: 0. + electrolysis: 0. + fuel cell: 0. + battery: 0. + battery inverter: 0. + emission_prices: + enable: false + co2: 0. + co2_monthly_prices: false + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#clustering +clustering: + focus_weights: false + simplify_network: + to_substations: false + algorithm: kmeans # choose from: [hac, kmeans] + feature: solar+onwind-time + exclude_carriers: [] + remove_stubs: true + remove_stubs_across_borders: true + cluster_network: + algorithm: kmeans + feature: solar+onwind-time + exclude_carriers: [] + consider_efficiency_classes: false + aggregation_strategies: + generators: + committable: any + ramp_limit_up: max + ramp_limit_down: max + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#solving +solving: + #tmpdir: "path/to/tmp" + options: + clip_p_max_pu: 1.e-2 + load_shedding: false + noisy_costs: true + skip_iterations: true + rolling_horizon: false + seed: 123 + custom_extra_functionality: "../data/custom_extra_functionality.py" + # options that go into the optimize function + track_iterations: false + min_iterations: 4 + max_iterations: 6 + transmission_losses: 2 + linearized_unit_commitment: true + horizon: 365 + + constraints: + CCL: false + EQ: false + BAU: false + SAFE: false + + solver: + name: copt + options: copt-default + + solver_options: + highs-default: + # refer to https://ergo-code.github.io/HiGHS/options/definitions.html#solver + threads: 4 + solver: "ipm" + run_crossover: "off" + small_matrix_value: 1e-6 + large_matrix_value: 1e9 + primal_feasibility_tolerance: 1e-5 + dual_feasibility_tolerance: 1e-5 + ipm_optimality_tolerance: 1e-4 + parallel: "on" + random_seed: 123 + gurobi-default: + threads: 8 + method: 2 # barrier + crossover: 0 + BarConvTol: 1.e-6 + Seed: 123 + # AggFill: 0 + # PreDual: 2 + # GURO_PAR_BARDENSETHRESH: 200 + gurobi-numeric-focus: + name: gurobi + NumericFocus: 3 # Favour numeric stability over speed + method: 2 # barrier + crossover: 0 # do not use crossover + BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge + BarConvTol: 1.e-5 + FeasibilityTol: 1.e-4 + OptimalityTol: 1.e-4 + ObjScale: -0.5 + threads: 8 + Seed: 123 + gurobi-fallback: # Use gurobi defaults + name: gurobi + crossover: 0 + method: 2 # barrier + BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge + BarConvTol: 1.e-5 + FeasibilityTol: 1.e-5 + OptimalityTol: 1.e-5 + Seed: 123 + threads: 8 + cplex-default: + threads: 4 + lpmethod: 4 # barrier + solutiontype: 2 # non basic solution, ie no crossover + barrier.convergetol: 1.e-5 + feasopt.tolerance: 1.e-6 + copt-vanilla: + Threads: 8 + copt-default: + Threads: 8 + LpMethod: 2 + Scaling: 1 + Presolve: 3 + Crossover: 0 + cbc-default: {} # Used in CI + glpk-default: {} # Used in CI + + mem: 80000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2 + walltime: "10:00:00" + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#plotting +plotting: + map: + boundaries: [-11, 30, 34, 71] + color_geomap: + ocean: white + land: white + eu_node_location: + x: -5.5 + y: 46. + costs_max: 1000 + costs_threshold: 1 + energy_max: 20000 + energy_min: -20000 + energy_threshold: 50. + + nice_names: + OCGT: "Open-Cycle Gas" + CCGT: "Combined-Cycle Gas" + offwind-ac: "Offshore Wind (AC)" + offwind-dc: "Offshore Wind (DC)" + onwind: "Onshore Wind" + solar: "Solar" + PHS: "Pumped Hydro Storage" + hydro: "Reservoir & Dam" + battery: "Battery Storage" + H2: "Hydrogen Storage" + lines: "Transmission Lines" + ror: "Run of River" + load: "Load Shedding" + ac: "AC" + dc: "DC" + + tech_colors: + # wind + onwind: "#235ebc" + onshore wind: "#235ebc" + offwind: "#6895dd" + offshore wind: "#6895dd" + offwind-ac: "#6895dd" + offshore wind (AC): "#6895dd" + offshore wind ac: "#6895dd" + offwind-dc: "#74c6f2" + offshore wind (DC): "#74c6f2" + offshore wind dc: "#74c6f2" + # water + hydro: '#298c81' + hydro reservoir: '#298c81' + ror: '#3dbfb0' + run of river: '#3dbfb0' + hydroelectricity: '#298c81' + PHS: '#51dbcc' + hydro+PHS: "#08ad97" + wave: '#a7d4cf' + # solar + solar: "#f9d002" + solar PV: "#f9d002" + solar thermal: '#ffbf2b' + residential rural solar thermal: '#f1c069' + services rural solar thermal: '#eabf61' + residential urban decentral solar thermal: '#e5bc5a' + services urban decentral solar thermal: '#dfb953' + urban central solar thermal: '#d7b24c' + solar rooftop: '#ffea80' + # gas + OCGT: '#e0986c' + OCGT marginal: '#e0986c' + OCGT-heat: '#e0986c' + gas boiler: '#db6a25' + gas boilers: '#db6a25' + gas boiler marginal: '#db6a25' + residential rural gas boiler: '#d4722e' + residential urban decentral gas boiler: '#cb7a36' + services rural gas boiler: '#c4813f' + services urban decentral gas boiler: '#ba8947' + urban central gas boiler: '#b0904f' + gas: '#e05b09' + fossil gas: '#e05b09' + natural gas: '#e05b09' + biogas to gas: '#e36311' + biogas to gas CC: '#e51245' + CCGT: '#a85522' + CCGT marginal: '#a85522' + allam: '#B98F76' + gas for industry co2 to atmosphere: '#692e0a' + gas for industry co2 to stored: '#8a3400' + gas for industry: '#853403' + gas for industry CC: '#692e0a' + gas pipeline: '#ebbca0' + gas pipeline new: '#a87c62' + # oil + oil: '#c9c9c9' + imported oil: '#a3a3a3' + oil boiler: '#adadad' + residential rural oil boiler: '#a9a9a9' + services rural oil boiler: '#a5a5a5' + residential urban decentral oil boiler: '#a1a1a1' + urban central oil boiler: '#9d9d9d' + services urban decentral oil boiler: '#999999' + agriculture machinery oil: '#949494' + shipping oil: "#808080" + land transport oil: '#afafaf' + # nuclear + Nuclear: '#ff8c00' + Nuclear marginal: '#ff8c00' + nuclear: '#ff8c00' + uranium: '#ff8c00' + # coal + Coal: '#545454' + coal: '#545454' + Coal marginal: '#545454' + coal for industry: '#343434' + solid: '#545454' + Lignite: '#826837' + lignite: '#826837' + Lignite marginal: '#826837' + # biomass + biogas: '#e3d37d' + biomass: '#baa741' + solid biomass: '#baa741' + solid biomass transport: '#baa741' + solid biomass for industry: '#7a6d26' + solid biomass for industry CC: '#47411c' + solid biomass for industry co2 from atmosphere: '#736412' + solid biomass for industry co2 to stored: '#47411c' + urban central solid biomass CHP: '#9d9042' + urban central solid biomass CHP CC: '#6c5d28' + biomass boiler: '#8A9A5B' + residential rural biomass boiler: '#a1a066' + residential urban decentral biomass boiler: '#b0b87b' + services rural biomass boiler: '#c6cf98' + services urban decentral biomass boiler: '#dde5b5' + biomass to liquid: '#32CD32' + BioSNG: '#123456' + # power transmission + lines: '#6c9459' + transmission lines: '#6c9459' + electricity distribution grid: '#97ad8c' + low voltage: '#97ad8c' + # electricity demand + Electric load: '#110d63' + electric demand: '#110d63' + electricity: '#110d63' + industry electricity: '#2d2a66' + industry new electricity: '#2d2a66' + agriculture electricity: '#494778' + # battery + EVs + battery: '#ace37f' + battery storage: '#ace37f' + battery charger: '#88a75b' + battery discharger: '#5d4e29' + home battery: '#80c944' + home battery storage: '#80c944' + home battery charger: '#5e8032' + home battery discharger: '#3c5221' + BEV charger: '#baf238' + V2G: '#e5ffa8' + land transport EV: '#baf238' + Li ion: '#baf238' + # hot water storage + water tanks: '#e69487' + residential rural water tanks: '#f7b7a3' + services rural water tanks: '#f3afa3' + residential urban decentral water tanks: '#f2b2a3' + services urban decentral water tanks: '#f1b4a4' + urban central water tanks: '#e9977d' + hot water storage: '#e69487' + hot water charging: '#e8998b' + urban central water tanks charger: '#b57a67' + residential rural water tanks charger: '#b4887c' + residential urban decentral water tanks charger: '#b39995' + services rural water tanks charger: '#b3abb0' + services urban decentral water tanks charger: '#b3becc' + hot water discharging: '#e99c8e' + urban central water tanks discharger: '#b9816e' + residential rural water tanks discharger: '#ba9685' + residential urban decentral water tanks discharger: '#baac9e' + services rural water tanks discharger: '#bbc2b8' + services urban decentral water tanks discharger: '#bdd8d3' + # heat demand + Heat load: '#cc1f1f' + heat: '#cc1f1f' + heat vent: '#aa3344' + heat demand: '#cc1f1f' + rural heat: '#ff5c5c' + residential rural heat: '#ff7c7c' + services rural heat: '#ff9c9c' + central heat: '#cc1f1f' + urban central heat: '#d15959' + urban central heat vent: '#a74747' + decentral heat: '#750606' + residential urban decentral heat: '#a33c3c' + services urban decentral heat: '#cc1f1f' + low-temperature heat for industry: '#8f2727' + process heat: '#ff0000' + agriculture heat: '#d9a5a5' + # heat supply + heat pumps: '#2fb537' + heat pump: '#2fb537' + air heat pump: '#36eb41' + residential urban decentral air heat pump: '#48f74f' + services urban decentral air heat pump: '#5af95d' + urban central air heat pump: '#6cfb6b' + ground heat pump: '#2fb537' + residential rural ground heat pump: '#48f74f' + services rural ground heat pump: '#5af95d' + Ambient: '#98eb9d' + CHP: '#8a5751' + urban central gas CHP: '#8d5e56' + CHP CC: '#634643' + urban central gas CHP CC: '#6e4e4c' + CHP heat: '#8a5751' + CHP electric: '#8a5751' + district heating: '#e8beac' + resistive heater: '#d8f9b8' + residential rural resistive heater: '#bef5b5' + residential urban decentral resistive heater: '#b2f1a9' + services rural resistive heater: '#a5ed9d' + services urban decentral resistive heater: '#98e991' + urban central resistive heater: '#8cdf85' + retrofitting: '#8487e8' + building retrofitting: '#8487e8' + # hydrogen + H2 for industry: "#f073da" + H2 for shipping: "#ebaee0" + H2: '#bf13a0' + hydrogen: '#bf13a0' + retrofitted H2 boiler: '#e5a0d9' + SMR: '#870c71' + SMR CC: '#4f1745' + H2 liquefaction: '#d647bd' + hydrogen storage: '#bf13a0' + H2 Store: '#bf13a0' + H2 storage: '#bf13a0' + land transport fuel cell: '#6b3161' + H2 pipeline: '#f081dc' + H2 pipeline retrofitted: '#ba99b5' + H2 Fuel Cell: '#c251ae' + H2 fuel cell: '#c251ae' + H2 turbine: '#991f83' + H2 Electrolysis: '#ff29d9' + H2 electrolysis: '#ff29d9' + # ammonia + NH3: '#46caf0' + ammonia: '#46caf0' + ammonia store: '#00ace0' + ammonia cracker: '#87d0e6' + Haber-Bosch: '#076987' + # syngas + Sabatier: '#9850ad' + methanation: '#c44ce6' + methane: '#c44ce6' + # synfuels + Fischer-Tropsch: '#25c49a' + liquid: '#25c49a' + kerosene for aviation: '#a1ffe6' + naphtha for industry: '#57ebc4' + methanolisation: '#83d6d5' + methanol: '#468c8b' + shipping methanol: '#468c8b' + # co2 + CC: '#f29dae' + CCS: '#f29dae' + CO2 sequestration: '#f29dae' + DAC: '#ff5270' + co2 stored: '#f2385a' + co2 sequestered: '#f2682f' + co2: '#f29dae' + co2 vent: '#ffd4dc' + CO2 pipeline: '#f5627f' + # emissions + process emissions CC: '#000000' + process emissions: '#222222' + process emissions to stored: '#444444' + process emissions to atmosphere: '#888888' + oil emissions: '#aaaaaa' + shipping oil emissions: "#555555" + shipping methanol emissions: '#666666' + land transport oil emissions: '#777777' + agriculture machinery oil emissions: '#333333' + # other + shipping: '#03a2ff' + power-to-heat: '#2fb537' + power-to-gas: '#c44ce6' + power-to-H2: '#ff29d9' + power-to-liquid: '#25c49a' + gas-to-power/heat: '#ee8340' + waste: '#e3d37d' + other: '#000000' + geothermal: '#ba91b1' + AC: "#70af1d" + AC-AC: "#70af1d" + AC line: "#70af1d" + links: "#8a1caf" + HVDC links: "#8a1caf" + DC: "#8a1caf" + DC-DC: "#8a1caf" + DC link: "#8a1caf" + load: "#dd2e23" diff --git a/config/test/config.myopic.yaml b/config/test/config.myopic.yaml index d566c6cb..2dab7b04 100644 --- a/config/test/config.myopic.yaml +++ b/config/test/config.myopic.yaml @@ -18,7 +18,7 @@ scenario: clusters: - 5 sector_opts: - - 24H-T-H-B-I-A-solar+p3-dist1 + - 24H-T-H-B-I-A-dist1 planning_horizons: - 2030 - 2040 diff --git a/config/test/config.overnight.yaml b/config/test/config.overnight.yaml index a2a0f5a4..6d1900cf 100644 --- a/config/test/config.overnight.yaml +++ b/config/test/config.overnight.yaml @@ -17,7 +17,7 @@ scenario: clusters: - 5 sector_opts: - - CO2L0-24H-T-H-B-I-A-solar+p3-dist1 + - CO2L0-24H-T-H-B-I-A-dist1 planning_horizons: - 2030 diff --git a/config/test/config.perfect.yaml b/config/test/config.perfect.yaml index 49886b26..f20a2c9f 100644 --- a/config/test/config.perfect.yaml +++ b/config/test/config.perfect.yaml @@ -18,7 +18,7 @@ scenario: clusters: - 5 sector_opts: - - 8760H-T-H-B-I-A-solar+p3-dist1 + - 8760H-T-H-B-I-A-dist1 planning_horizons: - 2030 - 2040 diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index ac58136a..00a729b0 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -153,7 +153,7 @@ if __name__ == "__main__": clusters="37", opts="", ll="v1.0", - sector_opts="168H-T-H-B-I-solar+p3-dist1", + sector_opts="168H-T-H-B-I-dist1", planning_horizons=2030, ) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index c8486758..f219b912 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -638,7 +638,7 @@ if __name__ == "__main__": clusters="37", ll="v1.0", opts="", - sector_opts="1p7-4380H-T-H-B-I-A-solar+p3-dist1", + sector_opts="1p7-4380H-T-H-B-I-A-dist1", planning_horizons=2020, ) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 6a3783e7..33312a44 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -1068,7 +1068,7 @@ if __name__ == "__main__": opts="", clusters="37", ll="v1.0", - sector_opts="4380H-T-H-B-I-A-solar+p3-dist1", + sector_opts="4380H-T-H-B-I-A-dist1", ) logging.basicConfig(level=snakemake.config["logging"]["level"]) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index 1c3a0ebe..f5ae3919 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -503,7 +503,7 @@ if __name__ == "__main__": opts="", clusters="37", ll="v1.5", - sector_opts="1p7-4380H-T-H-B-I-A-solar+p3-dist1", + sector_opts="1p7-4380H-T-H-B-I-A-dist1", ) update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 00b9d39b..d24feb79 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3621,7 +3621,7 @@ if __name__ == "__main__": opts="", clusters="37", ll="v1.0", - sector_opts="CO2L0-24H-T-H-B-I-A-solar+p3-dist1", + sector_opts="CO2L0-24H-T-H-B-I-A-dist1", planning_horizons="2030", ) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 1c37bfd2..5d2701bb 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -943,7 +943,7 @@ if __name__ == "__main__": opts="", clusters="37", ll="v1.0", - sector_opts="CO2L0-1H-T-H-B-I-A-solar+p3-dist1", + sector_opts="CO2L0-1H-T-H-B-I-A-dist1", planning_horizons="2030", ) configure_logging(snakemake) From 3e32dbccb5090e07803fd648ab348d00a7cd0cd0 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 24 Jan 2024 11:23:56 +0100 Subject: [PATCH 289/497] Add support for the linopy `io_api` option --- config/config.default.yaml | 1 + doc/configtables/solving.csv | 1 + doc/release_notes.rst | 2 ++ scripts/solve_network.py | 1 + 4 files changed, 5 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index 98595d20..255e3869 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -687,6 +687,7 @@ solving: rolling_horizon: false seed: 123 custom_extra_functionality: "../data/custom_extra_functionality.py" + # io_api: "direct" # Increases performance but only supported for the highs and gurobi solvers # options that go into the optimize function track_iterations: false min_iterations: 4 diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 6eff10ae..406fd1f9 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -7,6 +7,7 @@ options,,, -- rolling_horizon,bool,"{'true','false'}","Whether to optimize the network in a rolling horizon manner, where the snapshot range is split into slices of size `horizon` which are solved consecutively." -- seed,--,int,Random seed for increased deterministic behaviour. -- custom_extra_functionality,--,str,Path to a Python file with custom extra functionality code to be injected into the solving rules of the workflow relative to ``rules`` directory. +-- io_api,string,"{'lp','mps','direct'}",Passed to linopy and determines the API used to communicate with the solver. With the ``'lp'`` and ``'mps'`` options linopy passes a file to the solver; with the ``'direct'`` option (only supported for HIGHS and Gurobi) linopy uses an in-memory python API resulting in better performance. -- track_iterations,bool,"{'true','false'}",Flag whether to store the intermediate branch capacities and objective function values are recorded for each iteration in ``network.lines['s_nom_opt_X']`` (where ``X`` labels the iteration) -- min_iterations,--,int,Minimum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. -- max_iterations,--,int,Maximum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 914617d4..b55e8ac7 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -33,6 +33,8 @@ Upcoming Release * Bugfix: Correctly read out number of solver threads from configuration file. +* Add support for the linopy ``io_api`` option; set to ``"direct"`` to increase model reading and writing performance for the highs and gurobi solvers. + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 5d2701bb..9fc41555 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -890,6 +890,7 @@ def solve_network(n, config, solving, opts="", **kwargs): "linearized_unit_commitment", False ) kwargs["assign_all_duals"] = cf_solving.get("assign_all_duals", False) + kwargs["io_api"] = cf_solving.get("io_api", None) if kwargs["solver_name"] == "gurobi": logging.getLogger("gurobipy").setLevel(logging.CRITICAL) From 9843397b5a4effda6418f85fcf5c03291435804b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:48:52 +0000 Subject: [PATCH 290/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/configtables/solving.csv | 2 +- doc/release_notes.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 406fd1f9..7189399b 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -7,7 +7,7 @@ options,,, -- rolling_horizon,bool,"{'true','false'}","Whether to optimize the network in a rolling horizon manner, where the snapshot range is split into slices of size `horizon` which are solved consecutively." -- seed,--,int,Random seed for increased deterministic behaviour. -- custom_extra_functionality,--,str,Path to a Python file with custom extra functionality code to be injected into the solving rules of the workflow relative to ``rules`` directory. --- io_api,string,"{'lp','mps','direct'}",Passed to linopy and determines the API used to communicate with the solver. With the ``'lp'`` and ``'mps'`` options linopy passes a file to the solver; with the ``'direct'`` option (only supported for HIGHS and Gurobi) linopy uses an in-memory python API resulting in better performance. +-- io_api,string,"{'lp','mps','direct'}",Passed to linopy and determines the API used to communicate with the solver. With the ``'lp'`` and ``'mps'`` options linopy passes a file to the solver; with the ``'direct'`` option (only supported for HIGHS and Gurobi) linopy uses an in-memory python API resulting in better performance. -- track_iterations,bool,"{'true','false'}",Flag whether to store the intermediate branch capacities and objective function values are recorded for each iteration in ``network.lines['s_nom_opt_X']`` (where ``X`` labels the iteration) -- min_iterations,--,int,Minimum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. -- max_iterations,--,int,Maximum number of solving iterations in between which resistance and reactence (``x/r``) are updated for branches according to ``s_nom_opt`` of the previous run. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index b55e8ac7..f8f958cd 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -33,7 +33,7 @@ Upcoming Release * Bugfix: Correctly read out number of solver threads from configuration file. -* Add support for the linopy ``io_api`` option; set to ``"direct"`` to increase model reading and writing performance for the highs and gurobi solvers. +* Add support for the linopy ``io_api`` option; set to ``"direct"`` to increase model reading and writing performance for the highs and gurobi solvers. PyPSA-Eur 0.9.0 (5th January 2024) From 1fab74c46324a308b8104ce888c98da4f11d2013 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 24 Jan 2024 14:39:50 +0100 Subject: [PATCH 291/497] avoid the use use of `workflow.source_path` The above function returns a path to a cached source file, which changes for every run, causing the resulting parameter to change and the solve_network rule to re-run --- rules/common.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/common.smk b/rules/common.smk index 1654180f..5aa7ae53 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -43,7 +43,7 @@ def memory(w): def input_custom_extra_functionality(w): path = config["solving"]["options"].get("custom_extra_functionality", False) if path: - return workflow.source_path(path) + return os.path.join(os.path.dirname(workflow.snakefile), path) return [] From e4a130353f26076f2ec93ce2758689c126043640 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 24 Jan 2024 14:47:20 +0100 Subject: [PATCH 292/497] Make copying default config file compatible with snakemake module --- Snakefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Snakefile b/Snakefile index 7c16ff9f..14c9e821 100644 --- a/Snakefile +++ b/Snakefile @@ -13,9 +13,10 @@ from snakemake.utils import min_version min_version("7.7") - -if not exists("config/config.yaml") and exists("config/config.default.yaml"): - copyfile("config/config.default.yaml", "config/config.yaml") +conf_file = os.path.join(workflow.current_basedir, "config/config.yaml") +conf_default_file = os.path.join(workflow.current_basedir, "config/config.default.yaml") +if not exists(conf_file) and exists(conf_default_file): + copyfile(conf_default_file, conf_file) configfile: "config/config.yaml" From d8d3b2f2ab161056c2166b4a869cc792b98fac58 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 24 Jan 2024 15:48:33 +0100 Subject: [PATCH 293/497] Fix plotting: compatibility with 4th link port --- scripts/plot_summary.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index b2ec0892..92bf726c 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -282,7 +282,10 @@ def plot_balances(): # remove trailing link ports df.index = [ i[:-1] - if ((i not in ["co2", "NH3", "H2"]) and (i[-1:] in ["0", "1", "2", "3"])) + if ( + (i not in ["co2", "NH3", "H2"]) + and (i[-1:] in ["0", "1", "2", "3", "4"]) + ) else i for i in df.index ] From 2ce7d78dbbe9a85b8ee5f0d8ba06ce429eb8212d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 24 Jan 2024 16:23:44 +0100 Subject: [PATCH 294/497] revert accidental addition of personal config file --- config/config.personal.yaml | 1070 ----------------------------------- 1 file changed, 1070 deletions(-) delete mode 100644 config/config.personal.yaml diff --git a/config/config.personal.yaml b/config/config.personal.yaml deleted file mode 100644 index b86b56f7..00000000 --- a/config/config.personal.yaml +++ /dev/null @@ -1,1070 +0,0 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: CC0-1.0 - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#top-level-configuration -version: 0.9.0 -tutorial: false - -logging: - level: INFO - format: '%(levelname)s:%(name)s:%(message)s' - -private: - keys: - entsoe_api: - -remote: - ssh: "z1" - path: "SCRATCH/projects/pypsa-eur" - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#run -run: - name: "" - disable_progressbar: false - shared_resources: false - shared_cutouts: true - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#foresight -foresight: overnight - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#scenario -# Wildcard docs in https://pypsa-eur.readthedocs.io/en/latest/wildcards.html -scenario: - simpl: - - '' - ll: - - vopt - clusters: - - 37 - # - 150 - opts: - - '' - sector_opts: - # - Co2L0-3H-T-H-B-I-A - # - Co2L0-2190SEG-T-H-B-I-A - # - Co2L0-25H-T-H-B-I-A - - Co2L0-97H-T-H-B-I-A - planning_horizons: - # - 2020 - - 2030 - # - 2040 - # - 2050 - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#countries -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'] - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#snapshots -snapshots: - start: "2013-01-01" - end: "2014-01-01" - inclusive: 'left' - resolution: false - segmentation: false - #representative: false - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#enable -enable: - retrieve: auto - prepare_links_p_nom: false - retrieve_databundle: true - retrieve_sector_databundle: true - retrieve_cost_data: true - build_cutout: false - retrieve_irena: false - retrieve_cutout: true - build_natura_raster: false - retrieve_natura_raster: true - custom_busmap: false - - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#co2-budget -co2_budget: - 2020: 0.701 - 2025: 0.524 - 2030: 0.297 - 2035: 0.150 - 2040: 0.071 - 2045: 0.032 - 2050: 0.000 - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#electricity -electricity: - voltages: [220., 300., 380., 500., 750.] - gaslimit_enable: false - gaslimit: false - co2limit_enable: false - co2limit: 7.75e+7 - co2base: 1.487e+9 - agg_p_nom_limits: data/agg_p_nom_minmax.csv - - operational_reserve: - activate: false - epsilon_load: 0.02 - epsilon_vres: 0.02 - contingency: 4000 - - max_hours: - battery: 6 - H2: 168 - - extendable_carriers: - Generator: [solar, onwind, offwind-ac, offwind-dc, OCGT] - StorageUnit: [] # battery, H2 - Store: [battery, H2] - Link: [] # H2 pipeline - - powerplants_filter: (DateOut >= 2022 or DateOut != DateOut) - custom_powerplants: false - everywhere_powerplants: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] - - conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] - renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, hydro] - - estimate_renewable_capacities: - enable: true - from_opsd: true - year: 2020 - expansion_limit: false - technology_mapping: - Offshore: [offwind-ac, offwind-dc] - Onshore: [onwind] - PV: [solar] - - autarky: - enable: false - by_country: false - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#atlite -atlite: - default_cutout: europe-2013-era5 - nprocesses: 4 - show_progress: false - cutouts: - # use 'base' to determine geographical bounds and time span from config - # base: - # module: era5 - europe-2013-era5: - module: era5 # in priority order - x: [-12., 42.] - y: [33., 72] - dx: 0.3 - dy: 0.3 - time: ['2013', '2013'] - europe-2013-sarah: - module: [sarah, era5] # in priority order - x: [-12., 42.] - y: [33., 65] - dx: 0.2 - dy: 0.2 - time: ['2013', '2013'] - sarah_interpolate: false - sarah_dir: - features: [influx, temperature] - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#renewable -renewable: - onwind: - cutout: europe-2013-era5 - resource: - method: wind - turbine: Vestas_V112_3MW - add_cutout_windspeed: true - capacity_per_sqkm: 3 - # correction_factor: 0.93 - corine: - grid_codes: [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32] - distance: 1000 - distance_grid_codes: [1, 2, 3, 4, 5, 6] - luisa: false - # grid_codes: [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242] - # distance: 1000 - # distance_grid_codes: [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242] - natura: true - excluder_resolution: 100 - clip_p_max_pu: 1.e-2 - offwind-ac: - cutout: europe-2013-era5 - resource: - method: wind - turbine: NREL_ReferenceTurbine_2020ATB_5.5MW - add_cutout_windspeed: true - capacity_per_sqkm: 2 - correction_factor: 0.8855 - corine: [44, 255] - luisa: false # [0, 5230] - natura: true - ship_threshold: 400 - max_depth: 50 - max_shore_distance: 30000 - excluder_resolution: 200 - clip_p_max_pu: 1.e-2 - offwind-dc: - cutout: europe-2013-era5 - resource: - method: wind - turbine: NREL_ReferenceTurbine_2020ATB_5.5MW - add_cutout_windspeed: true - capacity_per_sqkm: 2 - correction_factor: 0.8855 - corine: [44, 255] - luisa: false # [0, 5230] - natura: true - ship_threshold: 400 - max_depth: 50 - min_shore_distance: 30000 - excluder_resolution: 200 - clip_p_max_pu: 1.e-2 - solar: - cutout: europe-2013-sarah - resource: - method: pv - panel: CSi - orientation: - slope: 35. - azimuth: 180. - capacity_per_sqkm: 5.1 - # correction_factor: 0.854337 - corine: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 31, 32] - luisa: false # [1111, 1121, 1122, 1123, 1130, 1210, 1221, 1222, 1230, 1241, 1242, 1310, 1320, 1330, 1410, 1421, 1422, 2110, 2120, 2130, 2210, 2220, 2230, 2310, 2410, 2420, 3210, 3320, 3330] - natura: true - excluder_resolution: 100 - clip_p_max_pu: 1.e-2 - hydro: - cutout: europe-2013-era5 - carriers: [ror, PHS, hydro] - PHS_max_hours: 6 - hydro_max_hours: "energy_capacity_totals_by_country" # one of energy_capacity_totals_by_country, estimate_by_large_installations or a float - flatten_dispatch: false - flatten_dispatch_buffer: 0.2 - clip_min_inflow: 1.0 - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#conventional -conventional: - unit_commitment: false - dynamic_fuel_price: false - nuclear: - p_max_pu: "data/nuclear_p_max_pu.csv" # float of file name - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#lines -lines: - types: - 220.: "Al/St 240/40 2-bundle 220.0" - 300.: "Al/St 240/40 3-bundle 300.0" - 380.: "Al/St 240/40 4-bundle 380.0" - 500.: "Al/St 240/40 4-bundle 380.0" - 750.: "Al/St 560/50 4-bundle 750.0" - s_max_pu: 0.7 - s_nom_max: .inf - max_extension: 20000 #MW - length_factor: 1.25 - reconnect_crimea: true - under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity - dynamic_line_rating: - activate: false - cutout: europe-2013-era5 - correction_factor: 0.95 - max_voltage_difference: false - max_line_rating: false - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#links -links: - p_max_pu: 1.0 - p_nom_max: .inf - max_extension: 30000 #MW - include_tyndp: true - under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#transformers -transformers: - x: 0.1 - s_nom: 2000. - type: '' - -# docs-load in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#load -load: - power_statistics: true - interpolate_limit: 3 - time_shift_for_large_gaps: 1w - manual_adjustments: true # false - scaling_factor: 1.0 - -# docs -# TODO: PyPSA-Eur merge issue in prepare_sector_network.py -# regulate what components with which carriers are kept from PyPSA-Eur; -# some technologies are removed because they are implemented differently -# (e.g. battery or H2 storage) or have different year-dependent costs -# in PyPSA-Eur-Sec -pypsa_eur: - Bus: - - AC - Link: - - DC - Generator: - - onwind - - offwind-ac - - offwind-dc - - solar - - ror - - nuclear - StorageUnit: - - PHS - - hydro - Store: [] - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#energy -energy: - energy_totals_year: 2011 - base_emissions_year: 1990 - eurostat_report_year: 2016 - emissions: CO2 - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#biomass -biomass: - year: 2030 - scenario: ENS_Med - classes: - solid biomass: - - Agricultural waste - - Fuelwood residues - - Secondary Forestry residues - woodchips - - Sawdust - - Residues from landscape care - - Municipal waste - not included: - - Sugar from sugar beet - - Rape seed - - "Sunflower, soya seed " - - Bioethanol barley, wheat, grain maize, oats, other cereals and rye - - Miscanthus, switchgrass, RCG - - Willow - - Poplar - - FuelwoodRW - - C&P_RW - biogas: - - Manure solid, liquid - - Sludge - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#solar-thermal -solar_thermal: - clearsky_model: simple # should be "simple" or "enhanced"? - orientation: - slope: 45. - azimuth: 180. - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#existing-capacities -existing_capacities: - grouping_years_power: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030] - grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # these should not extend 2020 - threshold_capacity: 10 - conventional_carriers: - - lignite - - coal - - oil - - uranium - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#sector -sector: - district_heating: - potential: 0.6 - progress: - 2020: 0.0 - 2025: 0.15 - 2030: 0.3 - 2035: 0.45 - 2040: 0.6 - 2045: 0.8 - 2050: 1.0 - district_heating_loss: 0.15 - cluster_heat_buses: true - bev_dsm_restriction_value: 0.75 - bev_dsm_restriction_time: 7 - transport_heating_deadband_upper: 20. - transport_heating_deadband_lower: 15. - ICE_lower_degree_factor: 0.375 - ICE_upper_degree_factor: 1.6 - EV_lower_degree_factor: 0.98 - EV_upper_degree_factor: 0.63 - bev_dsm: true - bev_availability: 0.5 - bev_energy: 0.05 - bev_charge_efficiency: 0.9 - bev_plug_to_wheel_efficiency: 0.2 - bev_charge_rate: 0.011 - bev_avail_max: 0.95 - bev_avail_mean: 0.8 - v2g: true - land_transport_fuel_cell_share: - 2020: 0 - 2025: 0 - 2030: 0 - 2035: 0 - 2040: 0 - 2045: 0 - 2050: 0 - land_transport_electric_share: - 2020: 0 - 2025: 0.15 - 2030: 0.3 - 2035: 0.45 - 2040: 0.7 - 2045: 0.85 - 2050: 1 - land_transport_ice_share: - 2020: 1 - 2025: 0.85 - 2030: 0.7 - 2035: 0.55 - 2040: 0.3 - 2045: 0.15 - 2050: 0 - transport_fuel_cell_efficiency: 0.5 - transport_internal_combustion_efficiency: 0.3 - agriculture_machinery_electric_share: 0 - agriculture_machinery_oil_share: 1 - agriculture_machinery_fuel_efficiency: 0.7 - agriculture_machinery_electric_efficiency: 0.3 - MWh_MeOH_per_MWh_H2: 0.8787 - MWh_MeOH_per_tCO2: 4.0321 - MWh_MeOH_per_MWh_e: 3.6907 - shipping_hydrogen_liquefaction: false - shipping_hydrogen_share: - 2020: 0 - 2025: 0 - 2030: 0 - 2035: 0 - 2040: 0 - 2045: 0 - 2050: 0 - shipping_methanol_share: - 2020: 0 - 2025: 0.15 - 2030: 0.3 - 2035: 0.5 - 2040: 0.7 - 2045: 0.85 - 2050: 1 - shipping_oil_share: - 2020: 1 - 2025: 0.85 - 2030: 0.7 - 2035: 0.5 - 2040: 0.3 - 2045: 0.15 - 2050: 0 - shipping_methanol_efficiency: 0.46 - shipping_oil_efficiency: 0.40 - aviation_demand_factor: 1. - HVC_demand_factor: 1. - time_dep_hp_cop: true - heat_pump_sink_T: 55. - reduce_space_heat_exogenously: true - reduce_space_heat_exogenously_factor: - 2020: 0.10 # this results in a space heat demand reduction of 10% - 2025: 0.09 # first heat demand increases compared to 2020 because of larger floor area per capita - 2030: 0.09 - 2035: 0.11 - 2040: 0.16 - 2045: 0.21 - 2050: 0.29 - retrofitting: - retro_endogen: false - cost_factor: 1.0 - interest_rate: 0.04 - annualise_cost: true - tax_weighting: false - construction_index: true - tes: true - tes_tau: - decentral: 3 - central: 180 - boilers: true - resistive_heaters: true - oil_boilers: false - biomass_boiler: true - chp: true - micro_chp: false - solar_thermal: false - solar_cf_correction: 0.788457 # = >>> 1/1.2683 - marginal_cost_storage: 0. #1e-4 - methanation: true - coal_cc: false - dac: true - co2_vent: false - central_heat_vent: false - allam_cycle: false - hydrogen_fuel_cell: true - hydrogen_turbine: false - SMR: true - SMR_cc: true - regional_methanol_demand: false - regional_oil_demand: false - regional_co2_sequestration_potential: - enable: false - attribute: 'conservative estimate Mt' - include_onshore: false - min_size: 3 - max_size: 25 - years_of_storage: 25 - co2_sequestration_potential: 200 - co2_sequestration_cost: 10 - co2_sequestration_lifetime: 50 - co2_spatial: false - co2network: false - co2_network_cost_factor: 1 - cc_fraction: 0.9 - hydrogen_underground_storage: true - hydrogen_underground_storage_locations: - # - onshore # more than 50 km from sea - - nearshore # within 50 km of sea - # - offshore - ammonia: false - min_part_load_fischer_tropsch: 0.7 - min_part_load_methanolisation: 0.3 - min_part_load_methanation: 0.3 - use_fischer_tropsch_waste_heat: true - use_haber_bosch_waste_heat: true - use_methanolisation_waste_heat: true - use_methanation_waste_heat: true - use_fuel_cell_waste_heat: true - use_electrolysis_waste_heat: true - electricity_distribution_grid: true - electricity_distribution_grid_cost_factor: 1.0 - electricity_grid_connection: true - transmission_efficiency: - DC: - efficiency_static: 0.98 - efficiency_per_1000km: 0.977 - H2 pipeline: - efficiency_per_1000km: 1 # 0.979 - compression_per_1000km: 0.019 - gas pipeline: - efficiency_per_1000km: 1 #0.977 - compression_per_1000km: 0.01 - H2_network: true - gas_network: false - H2_retrofit: false - H2_retrofit_capacity_per_CH4: 0.6 - gas_network_connectivity_upgrade: 1 - gas_distribution_grid: true - gas_distribution_grid_cost_factor: 1.0 - biomass_spatial: false - biomass_transport: false - biogas_upgrading_cc: false - conventional_generation: - OCGT: gas - biomass_to_liquid: false - biosng: false - limit_max_growth: - enable: false - # allowing 30% larger than max historic growth - factor: 1.3 - max_growth: # unit GW - onwind: 16 # onshore max grow so far 16 GW in Europe https://www.iea.org/reports/renewables-2020/wind - solar: 28 # solar max grow so far 28 GW in Europe https://www.iea.org/reports/renewables-2020/solar-pv - offwind-ac: 35 # offshore max grow so far 3.5 GW in Europe https://windeurope.org/about-wind/statistics/offshore/european-offshore-wind-industry-key-trends-statistics-2019/ - offwind-dc: 35 - max_relative_growth: - onwind: 3 - solar: 3 - offwind-ac: 3 - offwind-dc: 3 - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#industry -industry: - St_primary_fraction: - 2020: 0.6 - 2025: 0.55 - 2030: 0.5 - 2035: 0.45 - 2040: 0.4 - 2045: 0.35 - 2050: 0.3 - DRI_fraction: - 2020: 0 - 2025: 0 - 2030: 0.05 - 2035: 0.2 - 2040: 0.4 - 2045: 0.7 - 2050: 1 - H2_DRI: 1.7 - elec_DRI: 0.322 - Al_primary_fraction: - 2020: 0.4 - 2025: 0.375 - 2030: 0.35 - 2035: 0.325 - 2040: 0.3 - 2045: 0.25 - 2050: 0.2 - MWh_NH3_per_tNH3: 5.166 - MWh_CH4_per_tNH3_SMR: 10.8 - MWh_elec_per_tNH3_SMR: 0.7 - MWh_H2_per_tNH3_electrolysis: 5.93 - MWh_elec_per_tNH3_electrolysis: 0.2473 - MWh_NH3_per_MWh_H2_cracker: 1.46 # https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv - NH3_process_emissions: 24.5 - petrochemical_process_emissions: 25.5 - HVC_primary_fraction: 1. - HVC_mechanical_recycling_fraction: 0. - HVC_chemical_recycling_fraction: 0. - HVC_production_today: 52. - MWh_elec_per_tHVC_mechanical_recycling: 0.547 - MWh_elec_per_tHVC_chemical_recycling: 6.9 - chlorine_production_today: 9.58 - MWh_elec_per_tCl: 3.6 - MWh_H2_per_tCl: -0.9372 - methanol_production_today: 1.5 - MWh_elec_per_tMeOH: 0.167 - MWh_CH4_per_tMeOH: 10.25 - hotmaps_locate_missing: false - reference_year: 2015 - - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs -costs: - year: 2030 - version: v0.6.0 - rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) - 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 - marginal_cost: - solar: 0.01 - onwind: 0.015 - offwind: 0.015 - hydro: 0. - H2: 0. - electrolysis: 0. - fuel cell: 0. - battery: 0. - battery inverter: 0. - emission_prices: - enable: false - co2: 0. - co2_monthly_prices: false - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#clustering -clustering: - focus_weights: false - simplify_network: - to_substations: false - algorithm: kmeans # choose from: [hac, kmeans] - feature: solar+onwind-time - exclude_carriers: [] - remove_stubs: true - remove_stubs_across_borders: true - cluster_network: - algorithm: kmeans - feature: solar+onwind-time - exclude_carriers: [] - consider_efficiency_classes: false - aggregation_strategies: - generators: - committable: any - ramp_limit_up: max - ramp_limit_down: max - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#solving -solving: - #tmpdir: "path/to/tmp" - options: - clip_p_max_pu: 1.e-2 - load_shedding: false - noisy_costs: true - skip_iterations: true - rolling_horizon: false - seed: 123 - custom_extra_functionality: "../data/custom_extra_functionality.py" - # options that go into the optimize function - track_iterations: false - min_iterations: 4 - max_iterations: 6 - transmission_losses: 2 - linearized_unit_commitment: true - horizon: 365 - - constraints: - CCL: false - EQ: false - BAU: false - SAFE: false - - solver: - name: copt - options: copt-default - - solver_options: - highs-default: - # refer to https://ergo-code.github.io/HiGHS/options/definitions.html#solver - threads: 4 - solver: "ipm" - run_crossover: "off" - small_matrix_value: 1e-6 - large_matrix_value: 1e9 - primal_feasibility_tolerance: 1e-5 - dual_feasibility_tolerance: 1e-5 - ipm_optimality_tolerance: 1e-4 - parallel: "on" - random_seed: 123 - gurobi-default: - threads: 8 - method: 2 # barrier - crossover: 0 - BarConvTol: 1.e-6 - Seed: 123 - # AggFill: 0 - # PreDual: 2 - # GURO_PAR_BARDENSETHRESH: 200 - gurobi-numeric-focus: - name: gurobi - NumericFocus: 3 # Favour numeric stability over speed - method: 2 # barrier - crossover: 0 # do not use crossover - BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge - BarConvTol: 1.e-5 - FeasibilityTol: 1.e-4 - OptimalityTol: 1.e-4 - ObjScale: -0.5 - threads: 8 - Seed: 123 - gurobi-fallback: # Use gurobi defaults - name: gurobi - crossover: 0 - method: 2 # barrier - BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge - BarConvTol: 1.e-5 - FeasibilityTol: 1.e-5 - OptimalityTol: 1.e-5 - Seed: 123 - threads: 8 - cplex-default: - threads: 4 - lpmethod: 4 # barrier - solutiontype: 2 # non basic solution, ie no crossover - barrier.convergetol: 1.e-5 - feasopt.tolerance: 1.e-6 - copt-vanilla: - Threads: 8 - copt-default: - Threads: 8 - LpMethod: 2 - Scaling: 1 - Presolve: 3 - Crossover: 0 - cbc-default: {} # Used in CI - glpk-default: {} # Used in CI - - mem: 80000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2 - walltime: "10:00:00" - -# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#plotting -plotting: - map: - boundaries: [-11, 30, 34, 71] - color_geomap: - ocean: white - land: white - eu_node_location: - x: -5.5 - y: 46. - costs_max: 1000 - costs_threshold: 1 - energy_max: 20000 - energy_min: -20000 - energy_threshold: 50. - - nice_names: - OCGT: "Open-Cycle Gas" - CCGT: "Combined-Cycle Gas" - offwind-ac: "Offshore Wind (AC)" - offwind-dc: "Offshore Wind (DC)" - onwind: "Onshore Wind" - solar: "Solar" - PHS: "Pumped Hydro Storage" - hydro: "Reservoir & Dam" - battery: "Battery Storage" - H2: "Hydrogen Storage" - lines: "Transmission Lines" - ror: "Run of River" - load: "Load Shedding" - ac: "AC" - dc: "DC" - - tech_colors: - # wind - onwind: "#235ebc" - onshore wind: "#235ebc" - offwind: "#6895dd" - offshore wind: "#6895dd" - offwind-ac: "#6895dd" - offshore wind (AC): "#6895dd" - offshore wind ac: "#6895dd" - offwind-dc: "#74c6f2" - offshore wind (DC): "#74c6f2" - offshore wind dc: "#74c6f2" - # water - hydro: '#298c81' - hydro reservoir: '#298c81' - ror: '#3dbfb0' - run of river: '#3dbfb0' - hydroelectricity: '#298c81' - PHS: '#51dbcc' - hydro+PHS: "#08ad97" - wave: '#a7d4cf' - # solar - solar: "#f9d002" - solar PV: "#f9d002" - solar thermal: '#ffbf2b' - residential rural solar thermal: '#f1c069' - services rural solar thermal: '#eabf61' - residential urban decentral solar thermal: '#e5bc5a' - services urban decentral solar thermal: '#dfb953' - urban central solar thermal: '#d7b24c' - solar rooftop: '#ffea80' - # gas - OCGT: '#e0986c' - OCGT marginal: '#e0986c' - OCGT-heat: '#e0986c' - gas boiler: '#db6a25' - gas boilers: '#db6a25' - gas boiler marginal: '#db6a25' - residential rural gas boiler: '#d4722e' - residential urban decentral gas boiler: '#cb7a36' - services rural gas boiler: '#c4813f' - services urban decentral gas boiler: '#ba8947' - urban central gas boiler: '#b0904f' - gas: '#e05b09' - fossil gas: '#e05b09' - natural gas: '#e05b09' - biogas to gas: '#e36311' - biogas to gas CC: '#e51245' - CCGT: '#a85522' - CCGT marginal: '#a85522' - allam: '#B98F76' - gas for industry co2 to atmosphere: '#692e0a' - gas for industry co2 to stored: '#8a3400' - gas for industry: '#853403' - gas for industry CC: '#692e0a' - gas pipeline: '#ebbca0' - gas pipeline new: '#a87c62' - # oil - oil: '#c9c9c9' - imported oil: '#a3a3a3' - oil boiler: '#adadad' - residential rural oil boiler: '#a9a9a9' - services rural oil boiler: '#a5a5a5' - residential urban decentral oil boiler: '#a1a1a1' - urban central oil boiler: '#9d9d9d' - services urban decentral oil boiler: '#999999' - agriculture machinery oil: '#949494' - shipping oil: "#808080" - land transport oil: '#afafaf' - # nuclear - Nuclear: '#ff8c00' - Nuclear marginal: '#ff8c00' - nuclear: '#ff8c00' - uranium: '#ff8c00' - # coal - Coal: '#545454' - coal: '#545454' - Coal marginal: '#545454' - coal for industry: '#343434' - solid: '#545454' - Lignite: '#826837' - lignite: '#826837' - Lignite marginal: '#826837' - # biomass - biogas: '#e3d37d' - biomass: '#baa741' - solid biomass: '#baa741' - solid biomass transport: '#baa741' - solid biomass for industry: '#7a6d26' - solid biomass for industry CC: '#47411c' - solid biomass for industry co2 from atmosphere: '#736412' - solid biomass for industry co2 to stored: '#47411c' - urban central solid biomass CHP: '#9d9042' - urban central solid biomass CHP CC: '#6c5d28' - biomass boiler: '#8A9A5B' - residential rural biomass boiler: '#a1a066' - residential urban decentral biomass boiler: '#b0b87b' - services rural biomass boiler: '#c6cf98' - services urban decentral biomass boiler: '#dde5b5' - biomass to liquid: '#32CD32' - BioSNG: '#123456' - # power transmission - lines: '#6c9459' - transmission lines: '#6c9459' - electricity distribution grid: '#97ad8c' - low voltage: '#97ad8c' - # electricity demand - Electric load: '#110d63' - electric demand: '#110d63' - electricity: '#110d63' - industry electricity: '#2d2a66' - industry new electricity: '#2d2a66' - agriculture electricity: '#494778' - # battery + EVs - battery: '#ace37f' - battery storage: '#ace37f' - battery charger: '#88a75b' - battery discharger: '#5d4e29' - home battery: '#80c944' - home battery storage: '#80c944' - home battery charger: '#5e8032' - home battery discharger: '#3c5221' - BEV charger: '#baf238' - V2G: '#e5ffa8' - land transport EV: '#baf238' - Li ion: '#baf238' - # hot water storage - water tanks: '#e69487' - residential rural water tanks: '#f7b7a3' - services rural water tanks: '#f3afa3' - residential urban decentral water tanks: '#f2b2a3' - services urban decentral water tanks: '#f1b4a4' - urban central water tanks: '#e9977d' - hot water storage: '#e69487' - hot water charging: '#e8998b' - urban central water tanks charger: '#b57a67' - residential rural water tanks charger: '#b4887c' - residential urban decentral water tanks charger: '#b39995' - services rural water tanks charger: '#b3abb0' - services urban decentral water tanks charger: '#b3becc' - hot water discharging: '#e99c8e' - urban central water tanks discharger: '#b9816e' - residential rural water tanks discharger: '#ba9685' - residential urban decentral water tanks discharger: '#baac9e' - services rural water tanks discharger: '#bbc2b8' - services urban decentral water tanks discharger: '#bdd8d3' - # heat demand - Heat load: '#cc1f1f' - heat: '#cc1f1f' - heat vent: '#aa3344' - heat demand: '#cc1f1f' - rural heat: '#ff5c5c' - residential rural heat: '#ff7c7c' - services rural heat: '#ff9c9c' - central heat: '#cc1f1f' - urban central heat: '#d15959' - urban central heat vent: '#a74747' - decentral heat: '#750606' - residential urban decentral heat: '#a33c3c' - services urban decentral heat: '#cc1f1f' - low-temperature heat for industry: '#8f2727' - process heat: '#ff0000' - agriculture heat: '#d9a5a5' - # heat supply - heat pumps: '#2fb537' - heat pump: '#2fb537' - air heat pump: '#36eb41' - residential urban decentral air heat pump: '#48f74f' - services urban decentral air heat pump: '#5af95d' - urban central air heat pump: '#6cfb6b' - ground heat pump: '#2fb537' - residential rural ground heat pump: '#48f74f' - services rural ground heat pump: '#5af95d' - Ambient: '#98eb9d' - CHP: '#8a5751' - urban central gas CHP: '#8d5e56' - CHP CC: '#634643' - urban central gas CHP CC: '#6e4e4c' - CHP heat: '#8a5751' - CHP electric: '#8a5751' - district heating: '#e8beac' - resistive heater: '#d8f9b8' - residential rural resistive heater: '#bef5b5' - residential urban decentral resistive heater: '#b2f1a9' - services rural resistive heater: '#a5ed9d' - services urban decentral resistive heater: '#98e991' - urban central resistive heater: '#8cdf85' - retrofitting: '#8487e8' - building retrofitting: '#8487e8' - # hydrogen - H2 for industry: "#f073da" - H2 for shipping: "#ebaee0" - H2: '#bf13a0' - hydrogen: '#bf13a0' - retrofitted H2 boiler: '#e5a0d9' - SMR: '#870c71' - SMR CC: '#4f1745' - H2 liquefaction: '#d647bd' - hydrogen storage: '#bf13a0' - H2 Store: '#bf13a0' - H2 storage: '#bf13a0' - land transport fuel cell: '#6b3161' - H2 pipeline: '#f081dc' - H2 pipeline retrofitted: '#ba99b5' - H2 Fuel Cell: '#c251ae' - H2 fuel cell: '#c251ae' - H2 turbine: '#991f83' - H2 Electrolysis: '#ff29d9' - H2 electrolysis: '#ff29d9' - # ammonia - NH3: '#46caf0' - ammonia: '#46caf0' - ammonia store: '#00ace0' - ammonia cracker: '#87d0e6' - Haber-Bosch: '#076987' - # syngas - Sabatier: '#9850ad' - methanation: '#c44ce6' - methane: '#c44ce6' - # synfuels - Fischer-Tropsch: '#25c49a' - liquid: '#25c49a' - kerosene for aviation: '#a1ffe6' - naphtha for industry: '#57ebc4' - methanolisation: '#83d6d5' - methanol: '#468c8b' - shipping methanol: '#468c8b' - # co2 - CC: '#f29dae' - CCS: '#f29dae' - CO2 sequestration: '#f29dae' - DAC: '#ff5270' - co2 stored: '#f2385a' - co2 sequestered: '#f2682f' - co2: '#f29dae' - co2 vent: '#ffd4dc' - CO2 pipeline: '#f5627f' - # emissions - process emissions CC: '#000000' - process emissions: '#222222' - process emissions to stored: '#444444' - process emissions to atmosphere: '#888888' - oil emissions: '#aaaaaa' - shipping oil emissions: "#555555" - shipping methanol emissions: '#666666' - land transport oil emissions: '#777777' - agriculture machinery oil emissions: '#333333' - # other - shipping: '#03a2ff' - power-to-heat: '#2fb537' - power-to-gas: '#c44ce6' - power-to-H2: '#ff29d9' - power-to-liquid: '#25c49a' - gas-to-power/heat: '#ee8340' - waste: '#e3d37d' - other: '#000000' - geothermal: '#ba91b1' - AC: "#70af1d" - AC-AC: "#70af1d" - AC line: "#70af1d" - links: "#8a1caf" - HVDC links: "#8a1caf" - DC: "#8a1caf" - DC-DC: "#8a1caf" - DC link: "#8a1caf" - load: "#dd2e23" From 9aa154bd048c02fb511e78b1dc4f9524ef09251b Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Thu, 25 Jan 2024 10:20:19 +0100 Subject: [PATCH 295/497] Add several map projection options --- config/config.default.yaml | 1 + doc/configtables/plotting.csv | 1 + doc/release_notes.rst | 2 ++ scripts/plot_network.py | 29 ++++++++++++++++++++++++----- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 255e3869..ef410ad6 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -773,6 +773,7 @@ plotting: color_geomap: ocean: white land: white + projection: "EqualEarth" eu_node_location: x: -5.5 y: 46. diff --git a/doc/configtables/plotting.csv b/doc/configtables/plotting.csv index ed5d9c9f..656ed9be 100644 --- a/doc/configtables/plotting.csv +++ b/doc/configtables/plotting.csv @@ -1,6 +1,7 @@ ,Unit,Values,Description map,,, -- boundaries,°,"[x1,x2,y1,y2]",Boundaries of the map plots in degrees latitude (y) and longitude (x) +projection,--,"{EqualEarth, EuroPP, LambertAzimuthalEqualArea, LambertConformal, Orthographic}",Projection to use for maps; default is EqualEarth. LambertConformal is recommended by the European Environmental Agency. costs_max,bn Euro,float,Upper y-axis limit in cost bar plots. costs_threshold,bn Euro,float,Threshold below which technologies will not be shown in cost bar plots. energy_max,TWh,float,Upper y-axis limit in energy bar plots. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index f8f958cd..0386cf49 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -35,6 +35,8 @@ Upcoming Release * Add support for the linopy ``io_api`` option; set to ``"direct"`` to increase model reading and writing performance for the highs and gurobi solvers. +* Add several map projection options for plotting. + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 33312a44..c078e412 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -170,7 +170,7 @@ def plot_map( line_widths = line_widths.replace(line_lower_threshold, 0) link_widths = link_widths.replace(line_lower_threshold, 0) - fig, ax = plt.subplots(subplot_kw={"projection": ccrs.EqualEarth()}) + fig, ax = plt.subplots(subplot_kw={"projection": proj}) fig.set_size_inches(7, 6) n.plot( @@ -358,7 +358,6 @@ def plot_h2_map(network, regions): n.links.bus0 = n.links.bus0.str.replace(" H2", "") n.links.bus1 = n.links.bus1.str.replace(" H2", "") - proj = ccrs.EqualEarth() regions = regions.to_crs(proj.proj4_init) fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) @@ -568,7 +567,7 @@ def plot_ch4_map(network): "biogas": "seagreen", } - fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": ccrs.EqualEarth()}) + fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) n.plot( bus_sizes=bus_sizes, @@ -679,7 +678,7 @@ def plot_map_without(network): # Drop non-electric buses so they don't clutter the plot n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) - fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": ccrs.EqualEarth()}) + fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) # PDF has minimum width, so set these to zero line_lower_threshold = 200.0 @@ -993,7 +992,7 @@ def plot_map_perfect( link_widths[link_widths > line_upper_threshold] = line_upper_threshold for year in costs.columns: - fig, ax = plt.subplots(subplot_kw={"projection": ccrs.PlateCarree()}) + fig, ax = plt.subplots(subplot_kw={"projection": proj}) fig.set_size_inches(7, 6) fig.suptitle(year) @@ -1082,6 +1081,26 @@ if __name__ == "__main__": if map_opts["boundaries"] is None: map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1] + proj_str = snakemake.params.plotting.get("projection", "EqualEarth") + central_coords = dict(central_longitude=10.0, central_latitude=50.0) + if proj_str == "EqualEarth": + # Equal area but large distortions towards the poles. + proj = ccrs.EqualEarth() + elif proj_str == "EuroPP": + # UTM Zone 32 projection + proj = ccrs.EuroPP() + elif proj_str == "LambertConformal": + # The European Environment Agency recommends using this + # projection for conformal pan-European mapping + proj = ccrs.LambertConformal(standard_parallels=(35, 65), **central_coords) + elif proj_str == "Orthographic": + proj = ccrs.Orthographic(**central_coords) + else: + logger.warning( + f"Plotting project {proj_str} not recognised; falling back on EqualEarth" + ) + proj = ccrs.EqualEarth() + if snakemake.params["foresight"] == "perfect": plot_map_perfect( n, From 03c914bef136bea7fe5b17fdb649ecd3239cf938 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Thu, 25 Jan 2024 14:34:03 +0100 Subject: [PATCH 296/497] Make projection selection flexible by reading directly from config --- config/config.default.yaml | 8 +++++++- doc/configtables/plotting.csv | 4 +++- doc/release_notes.rst | 2 +- scripts/plot_network.py | 22 +++------------------- 4 files changed, 14 insertions(+), 22 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index ef410ad6..51080862 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -773,7 +773,13 @@ plotting: color_geomap: ocean: white land: white - projection: "EqualEarth" + projection: + name: "EqualEarth" + # See https://scitools.org.uk/cartopy/docs/latest/reference/projections.html for alternatives, for example: + # name: "LambertConformal" + # central_longitude: 10. + # central_latitude: 50. + # standard_parallels: [35, 65] eu_node_location: x: -5.5 y: 46. diff --git a/doc/configtables/plotting.csv b/doc/configtables/plotting.csv index 656ed9be..82fc203c 100644 --- a/doc/configtables/plotting.csv +++ b/doc/configtables/plotting.csv @@ -1,7 +1,9 @@ ,Unit,Values,Description map,,, -- boundaries,°,"[x1,x2,y1,y2]",Boundaries of the map plots in degrees latitude (y) and longitude (x) -projection,--,"{EqualEarth, EuroPP, LambertAzimuthalEqualArea, LambertConformal, Orthographic}",Projection to use for maps; default is EqualEarth. LambertConformal is recommended by the European Environmental Agency. +projection,,,, +-- name,--,"Valid Cartopy projection name","See https://scitools.org.uk/cartopy/docs/latest/reference/projections.html for list of available projections." +-- args,--,--,"Other entries under 'projection' are passed as keyword arguments to the projection constructor, e.g. ``central_longitude: 10.``." costs_max,bn Euro,float,Upper y-axis limit in cost bar plots. costs_threshold,bn Euro,float,Threshold below which technologies will not be shown in cost bar plots. energy_max,TWh,float,Upper y-axis limit in energy bar plots. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 0386cf49..93d1a268 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -35,7 +35,7 @@ Upcoming Release * Add support for the linopy ``io_api`` option; set to ``"direct"`` to increase model reading and writing performance for the highs and gurobi solvers. -* Add several map projection options for plotting. +* Add the option to customise map projection in plotting config. PyPSA-Eur 0.9.0 (5th January 2024) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index c078e412..13736d01 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -1081,25 +1081,9 @@ if __name__ == "__main__": if map_opts["boundaries"] is None: map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1] - proj_str = snakemake.params.plotting.get("projection", "EqualEarth") - central_coords = dict(central_longitude=10.0, central_latitude=50.0) - if proj_str == "EqualEarth": - # Equal area but large distortions towards the poles. - proj = ccrs.EqualEarth() - elif proj_str == "EuroPP": - # UTM Zone 32 projection - proj = ccrs.EuroPP() - elif proj_str == "LambertConformal": - # The European Environment Agency recommends using this - # projection for conformal pan-European mapping - proj = ccrs.LambertConformal(standard_parallels=(35, 65), **central_coords) - elif proj_str == "Orthographic": - proj = ccrs.Orthographic(**central_coords) - else: - logger.warning( - f"Plotting project {proj_str} not recognised; falling back on EqualEarth" - ) - proj = ccrs.EqualEarth() + proj_kwargs = snakemake.params.plotting.get("projection", dict(name="EqualEarth")) + proj_func = getattr(ccrs, proj_kwargs.pop("name")) + proj = proj_func(**proj_kwargs) if snakemake.params["foresight"] == "perfect": plot_map_perfect( From 987930c2503d2e45425d7571307db70235aa341f Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 25 Jan 2024 16:43:08 +0100 Subject: [PATCH 297/497] document that resolution and segmentation config options are only for electricity-only --- doc/configtables/snapshots.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/configtables/snapshots.csv b/doc/configtables/snapshots.csv index 4a3e1212..0226a9aa 100644 --- a/doc/configtables/snapshots.csv +++ b/doc/configtables/snapshots.csv @@ -2,5 +2,5 @@ start,--,str or datetime-like; e.g. YYYY-MM-DD,Left bound of date range end,--,str or datetime-like; e.g. YYYY-MM-DD,Right bound of date range inclusive,--,"One of {'neither', 'both', ‘left’, ‘right’}","Make the time interval closed to the ``left``, ``right``, or both sides ``both`` or neither side ``None``." -resolution ,--,"{false,``nH``; i.e. ``2H``-``6H``}",Resample the time-resolution by averaging over every ``n`` snapshots -segmentation,--,"{false,``n``; e.g. ``4380``}","Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load." +resolution ,--,"{false,``nH``; i.e. ``2H``-``6H``}","Resample the time-resolution by averaging over every ``n`` snapshots in :mod:`prepare_network`. **Warning:** This option should currently only be used with electricity-only networks, not for sector-coupled networks." +segmentation,--,"{false,``n``; e.g. ``4380``}","Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load in :mod:`prepare_network`. **Warning:** This option should currently only be used with electricity-only networks, not for sector-coupled networks." From 20f39971f77db4ec3b79a7dea7c419be14321446 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Wed, 24 Jan 2024 13:38:39 +0100 Subject: [PATCH 298/497] solve_network: make sure infeasibilities are printed properly Without this formatting, there is an error adding a string to a list. --- scripts/solve_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 9fc41555..23e9b0f8 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -926,7 +926,7 @@ def solve_network(n, config, solving, opts="", **kwargs): ) if "infeasible" in condition: labels = n.model.compute_infeasibilities() - logger.info("Labels:\n" + labels) + logger.info(f"Labels:\n{labels}") n.model.print_infeasibilities() raise RuntimeError("Solving status 'infeasible'") From 999ff852888f4c1fcab28796332cefc7d16f6272 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 25 Jan 2024 17:19:55 +0100 Subject: [PATCH 299/497] fix snakemake.inputs for add_existing_baseyear with perfect foresight --- rules/solve_perfect.smk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index ad310f9f..76051976 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -17,6 +17,8 @@ rule add_existing_baseyear: costs="data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), cop_soil_total=RESOURCES + "cop_soil_total_elec_s{simpl}_{clusters}.nc", cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", + existing_heating_distribution=RESOURCES + + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv", existing_heating="data/existing_infrastructure/existing_heating_raw.csv", existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv", existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv", From bb202ad2c44558b01bf8d7cdaccaea97bf80cca2 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 27 Aug 2023 17:05:54 +0200 Subject: [PATCH 300/497] plot_network: remove function plot_map_without() --- rules/postprocess.smk | 2 -- scripts/plot_network.py | 74 ----------------------------------------- 2 files changed, 76 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 9f4ac78e..5bbffeb8 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -20,8 +20,6 @@ if config["foresight"] != "perfect": output: map=RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - today=RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}-today.pdf", threads: 2 resources: mem_mb=10000, diff --git a/scripts/plot_network.py b/scripts/plot_network.py index 13736d01..d951d2e7 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -671,79 +671,6 @@ def plot_ch4_map(network): ) -def plot_map_without(network): - n = network.copy() - assign_location(n) - - # Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) - - fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) - - # PDF has minimum width, so set these to zero - line_lower_threshold = 200.0 - line_upper_threshold = 1e4 - linewidth_factor = 3e3 - ac_color = "rosybrown" - dc_color = "darkseagreen" - - # hack because impossible to drop buses... - if "EU gas" in n.buses.index: - eu_location = snakemake.params.plotting.get( - "eu_node_location", dict(x=-5.5, y=46) - ) - n.buses.loc["EU gas", "x"] = eu_location["x"] - n.buses.loc["EU gas", "y"] = eu_location["y"] - - to_drop = n.links.index[(n.links.carrier != "DC") & (n.links.carrier != "B2B")] - n.links.drop(to_drop, inplace=True) - - if snakemake.wildcards["ll"] == "v1.0": - line_widths = n.lines.s_nom - link_widths = n.links.p_nom - else: - line_widths = n.lines.s_nom_min - link_widths = n.links.p_nom_min - - line_widths = line_widths.clip(line_lower_threshold, line_upper_threshold) - link_widths = link_widths.clip(line_lower_threshold, line_upper_threshold) - - line_widths = line_widths.replace(line_lower_threshold, 0) - link_widths = link_widths.replace(line_lower_threshold, 0) - - n.plot( - bus_colors="k", - line_colors=ac_color, - link_colors=dc_color, - line_widths=line_widths / linewidth_factor, - link_widths=link_widths / linewidth_factor, - ax=ax, - **map_opts, - ) - - handles = [] - labels = [] - - for s in (10, 5): - handles.append( - plt.Line2D([0], [0], color=ac_color, linewidth=s * 1e3 / linewidth_factor) - ) - labels.append(f"{s} GW") - l1_1 = ax.legend( - handles, - labels, - loc="upper left", - bbox_to_anchor=(0.05, 1.01), - frameon=False, - labelspacing=0.8, - handletextpad=1.5, - title="Today's transmission", - ) - ax.add_artist(l1_1) - - fig.savefig(snakemake.output.today, transparent=True, bbox_inches="tight") - - def plot_series(network, carrier="AC", name="test"): n = network.copy() assign_location(n) @@ -1101,7 +1028,6 @@ if __name__ == "__main__": plot_h2_map(n, regions) plot_ch4_map(n) - plot_map_without(n) # plot_series(n, carrier="AC", name=suffix) # plot_series(n, carrier="heat", name=suffix) From 46a2f55c1bbebe9a491bea76f9805e363cdd6b5c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 27 Aug 2023 17:10:41 +0200 Subject: [PATCH 301/497] plot_network: remove function plot_series() This function is superseded by plot_balance_timeseries rule. --- scripts/plot_network.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index d951d2e7..dde7d61b 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -671,6 +671,7 @@ def plot_ch4_map(network): ) +<<<<<<< HEAD def plot_series(network, carrier="AC", name="test"): n = network.copy() assign_location(n) @@ -984,6 +985,8 @@ def plot_map_perfect( ) +======= +>>>>>>> ead390b4 (plot_network: remove function plot_series()) if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -1028,6 +1031,3 @@ if __name__ == "__main__": plot_h2_map(n, regions) plot_ch4_map(n) - - # plot_series(n, carrier="AC", name=suffix) - # plot_series(n, carrier="heat", name=suffix) From ce4d18c8616917165d3716e9543b42667d82c44c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 25 Jan 2024 17:32:17 +0100 Subject: [PATCH 302/497] remove plot_series() leftovers --- scripts/plot_network.py | 164 ---------------------------------------- 1 file changed, 164 deletions(-) diff --git a/scripts/plot_network.py b/scripts/plot_network.py index dde7d61b..b06e5ce2 100644 --- a/scripts/plot_network.py +++ b/scripts/plot_network.py @@ -671,168 +671,6 @@ def plot_ch4_map(network): ) -<<<<<<< HEAD -def plot_series(network, carrier="AC", name="test"): - n = network.copy() - assign_location(n) - assign_carriers(n) - - buses = n.buses.index[n.buses.carrier.str.contains(carrier)] - - supply = pd.DataFrame(index=n.snapshots) - for c in n.iterate_components(n.branch_components): - n_port = 4 if c.name == "Link" else 2 - for i in range(n_port): - supply = pd.concat( - ( - supply, - ( - -1 - * c.pnl[f"p{str(i)}"] - .loc[:, c.df.index[c.df[f"bus{str(i)}"].isin(buses)]] - .groupby(c.df.carrier, axis=1) - .sum() - ), - ), - axis=1, - ) - - for c in n.iterate_components(n.one_port_components): - comps = c.df.index[c.df.bus.isin(buses)] - supply = pd.concat( - ( - supply, - ((c.pnl["p"].loc[:, comps]).multiply(c.df.loc[comps, "sign"])) - .groupby(c.df.carrier, axis=1) - .sum(), - ), - axis=1, - ) - - supply = supply.groupby(rename_techs_tyndp, axis=1).sum() - - both = supply.columns[(supply < 0.0).any() & (supply > 0.0).any()] - - positive_supply = supply[both] - negative_supply = supply[both] - - positive_supply[positive_supply < 0.0] = 0.0 - negative_supply[negative_supply > 0.0] = 0.0 - - supply[both] = positive_supply - - suffix = " charging" - - negative_supply.columns = negative_supply.columns + suffix - - supply = pd.concat((supply, negative_supply), axis=1) - - # 14-21.2 for flaute - # 19-26.1 for flaute - - start = "2013-02-19" - stop = "2013-02-26" - - threshold = 10e3 - - to_drop = supply.columns[(abs(supply) < threshold).all()] - - if len(to_drop) != 0: - logger.info(f"Dropping {to_drop.tolist()} from supply") - supply.drop(columns=to_drop, inplace=True) - - supply.index.name = None - - supply = supply / 1e3 - - supply.rename( - columns={"electricity": "electric demand", "heat": "heat demand"}, inplace=True - ) - supply.columns = supply.columns.str.replace("residential ", "") - supply.columns = supply.columns.str.replace("services ", "") - supply.columns = supply.columns.str.replace("urban decentral ", "decentral ") - - preferred_order = pd.Index( - [ - "electric demand", - "transmission lines", - "hydroelectricity", - "hydro reservoir", - "run of river", - "pumped hydro storage", - "CHP", - "onshore wind", - "offshore wind", - "solar PV", - "solar thermal", - "building retrofitting", - "ground heat pump", - "air heat pump", - "resistive heater", - "OCGT", - "gas boiler", - "gas", - "natural gas", - "methanation", - "hydrogen storage", - "battery storage", - "hot water storage", - ] - ) - - new_columns = preferred_order.intersection(supply.columns).append( - supply.columns.difference(preferred_order) - ) - - supply = supply.groupby(supply.columns, axis=1).sum() - fig, ax = plt.subplots() - fig.set_size_inches((8, 5)) - - ( - supply.loc[start:stop, new_columns].plot( - ax=ax, - kind="area", - stacked=True, - linewidth=0.0, - color=[ - snakemake.params.plotting["tech_colors"][i.replace(suffix, "")] - for i in new_columns - ], - ) - ) - - handles, labels = ax.get_legend_handles_labels() - - handles.reverse() - labels.reverse() - - new_handles = [] - new_labels = [] - - for i, item in enumerate(labels): - if "charging" not in item: - new_handles.append(handles[i]) - new_labels.append(labels[i]) - - ax.legend(new_handles, new_labels, ncol=3, loc="upper left", frameon=False) - ax.set_xlim([start, stop]) - ax.set_ylim([-1300, 1900]) - ax.grid(True) - ax.set_ylabel("Power [GW]") - fig.tight_layout() - - fig.savefig( - "results/{}maps/series-{}-{}-{}-{}.pdf".format( - snakemake.params.RDIR, - snakemake.wildcards["ll"], - carrier, - start, - stop, - ), - transparent=True, - ) - - def plot_map_perfect( network, components=["Link", "Store", "StorageUnit", "Generator"], @@ -985,8 +823,6 @@ def plot_map_perfect( ) -======= ->>>>>>> ead390b4 (plot_network: remove function plot_series()) if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake From ffd4e1f1af716dbd790e26da014366758b6188e5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 25 Jan 2024 20:34:59 +0100 Subject: [PATCH 303/497] plot_network: split into separate scripts for power, hydrogen, gas --- doc/plotting.rst | 21 +- doc/release_notes.rst | 6 + rules/collect.smk | 10 - rules/postprocess.smk | 87 ++- scripts/plot_gas_network.py | 251 ++++++++ scripts/plot_hydrogen_network.py | 267 ++++++++ scripts/plot_network.py | 869 -------------------------- scripts/plot_power_network.py | 271 ++++++++ scripts/plot_power_network_perfect.py | 199 ++++++ 9 files changed, 1086 insertions(+), 895 deletions(-) create mode 100644 scripts/plot_gas_network.py create mode 100644 scripts/plot_hydrogen_network.py delete mode 100644 scripts/plot_network.py create mode 100644 scripts/plot_power_network.py create mode 100644 scripts/plot_power_network_perfect.py diff --git a/doc/plotting.rst b/doc/plotting.rst index 895eab3b..02748cf2 100644 --- a/doc/plotting.rst +++ b/doc/plotting.rst @@ -22,7 +22,22 @@ Rule ``plot_summary`` .. _map_plot: -Rule ``plot_network`` -======================== +Rule ``plot_power_network`` +=========================== -.. automodule:: plot_network +.. automodule:: plot_power_network + +Rule ``plot_power_network_perfect`` +=================================== + +.. automodule:: plot_power_network_perfect + +Rule ``plot_hydrogen_network`` +============================== + +.. automodule:: plot_hydrogen_network + +Rule ``plot_gas_network`` +========================= + +.. automodule:: plot_gas_network diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 93d1a268..5bcaf0d2 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -37,6 +37,12 @@ Upcoming Release * Add the option to customise map projection in plotting config. +* The rule ``plot_network`` has been split into separate rules for plotting + electricity, hydrogen and gas networks. + +* Added new collection rule ``plot_all`` which should be used instead of + ``plot_summary``. This allows running the rule :mod:`make_summary` and + :mod:`plot_summary` even if the network plotting rules fail. PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/rules/collect.smk b/rules/collect.smk index c9bb10ea..1d977da1 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -11,7 +11,6 @@ localrules: prepare_sector_networks, solve_elec_networks, solve_sector_networks, - plot_networks, rule cluster_networks: @@ -69,15 +68,6 @@ rule solve_sector_networks_perfect: ), -rule plot_networks: - input: - expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - **config["scenario"] - ), - - rule validate_elec_networks: input: expand( diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 5bbffeb8..6db3079a 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT @@ -9,9 +9,8 @@ localrules: if config["foresight"] != "perfect": - rule plot_network: + rule plot_power_network: params: - foresight=config["foresight"], plotting=config["plotting"], input: network=RESULTS @@ -26,19 +25,66 @@ if config["foresight"] != "perfect": benchmark: ( BENCHMARKS - + "plot_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" script: - "../scripts/plot_network.py" + "../scripts/plot_power_network.py" + + + rule plot_hydrogen_network: + params: + plotting=config["plotting"], + input: + network=RESULTS + + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", + regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + output: + map=RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf", + threads: 2 + resources: + mem_mb=10000, + benchmark: + ( + BENCHMARKS + + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) + conda: + "../envs/environment.yaml" + script: + "../scripts/plot_hydrogen_network.py" + + + rule plot_gas_network: + params: + plotting=config["plotting"], + input: + network=RESULTS + + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", + regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + output: + map=RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf", + threads: 2 + resources: + mem_mb=10000, + benchmark: + ( + BENCHMARKS + + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) + conda: + "../envs/environment.yaml" + script: + "../scripts/plot_gas_network.py" if config["foresight"] == "perfect": - rule plot_network: + rule plot_power_network_perfect: params: - foresight=config["foresight"], plotting=config["plotting"], input: network=RESULTS @@ -60,7 +106,7 @@ if config["foresight"] == "perfect": conda: "../envs/environment.yaml" script: - "../scripts/plot_network.py" + "../scripts/plot_power_network_perfect.py" rule copy_config: @@ -95,11 +141,6 @@ rule make_summary: costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" else "data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), - plots=expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - **config["scenario"] - ), output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", nodal_capacities=RESULTS + "csvs/nodal_capacities.csv", @@ -161,6 +202,26 @@ rule plot_summary: "../scripts/plot_summary.py" +rule plot_all: + input: + RESULTS + "graphs/costs.pdf", + expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", + **config["scenario"] + ), + expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf", + **config["scenario"] + ), + expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf", + **config["scenario"] + ), + + STATISTICS_BARPLOTS = [ "capacity_factor", "installed_capacity", diff --git a/scripts/plot_gas_network.py b/scripts/plot_gas_network.py new file mode 100644 index 00000000..a72c5c56 --- /dev/null +++ b/scripts/plot_gas_network.py @@ -0,0 +1,251 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Creates map of optimised gas network, storage and selected other infrastructure. +""" + +import logging + +import geopandas as gpd +import matplotlib.pyplot as plt +import pandas as pd +import pypsa +from _helpers import configure_logging +from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches +from plot_power_network import assign_location, load_projection + +logger = logging.getLogger(__name__) + + +def plot_ch4_map(n): + # if "gas pipeline" not in n.links.carrier.unique(): + # return + + assign_location(n) + + bus_size_factor = 8e7 + linewidth_factor = 1e4 + # MW below which not drawn + line_lower_threshold = 1e3 + + # Drop non-electric buses so they don't clutter the plot + n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) + + fossil_gas_i = n.generators[n.generators.carrier == "gas"].index + fossil_gas = ( + n.generators_t.p.loc[:, fossil_gas_i] + .mul(n.snapshot_weightings.generators, axis=0) + .sum() + .groupby(n.generators.loc[fossil_gas_i, "bus"]) + .sum() + / bus_size_factor + ) + fossil_gas.rename(index=lambda x: x.replace(" gas", ""), inplace=True) + fossil_gas = fossil_gas.reindex(n.buses.index).fillna(0) + # make a fake MultiIndex so that area is correct for legend + fossil_gas.index = pd.MultiIndex.from_product([fossil_gas.index, ["fossil gas"]]) + + methanation_i = n.links.query("carrier == 'Sabatier'").index + methanation = ( + abs( + n.links_t.p1.loc[:, methanation_i].mul( + n.snapshot_weightings.generators, axis=0 + ) + ) + .sum() + .groupby(n.links.loc[methanation_i, "bus1"]) + .sum() + / bus_size_factor + ) + methanation = ( + methanation.groupby(methanation.index) + .sum() + .rename(index=lambda x: x.replace(" gas", "")) + ) + # make a fake MultiIndex so that area is correct for legend + methanation.index = pd.MultiIndex.from_product([methanation.index, ["methanation"]]) + + biogas_i = n.stores[n.stores.carrier == "biogas"].index + biogas = ( + n.stores_t.p.loc[:, biogas_i] + .mul(n.snapshot_weightings.generators, axis=0) + .sum() + .groupby(n.stores.loc[biogas_i, "bus"]) + .sum() + / bus_size_factor + ) + biogas = ( + biogas.groupby(biogas.index) + .sum() + .rename(index=lambda x: x.replace(" biogas", "")) + ) + # make a fake MultiIndex so that area is correct for legend + biogas.index = pd.MultiIndex.from_product([biogas.index, ["biogas"]]) + + bus_sizes = pd.concat([fossil_gas, methanation, biogas]) + bus_sizes.sort_index(inplace=True) + + to_remove = n.links.index[~n.links.carrier.str.contains("gas pipeline")] + n.links.drop(to_remove, inplace=True) + + link_widths_rem = n.links.p_nom_opt / linewidth_factor + link_widths_rem[n.links.p_nom_opt < line_lower_threshold] = 0.0 + + link_widths_orig = n.links.p_nom / linewidth_factor + link_widths_orig[n.links.p_nom < line_lower_threshold] = 0.0 + + max_usage = n.links_t.p0.abs().max(axis=0) + link_widths_used = max_usage / linewidth_factor + link_widths_used[max_usage < line_lower_threshold] = 0.0 + + tech_colors = snakemake.params.plotting["tech_colors"] + + pipe_colors = { + "gas pipeline": "#f08080", + "gas pipeline new": "#c46868", + "gas pipeline (in 2020)": "lightgrey", + "gas pipeline (available)": "#e8d1d1", + } + + link_color_used = n.links.carrier.map(pipe_colors) + + n.links.bus0 = n.links.bus0.str.replace(" gas", "") + n.links.bus1 = n.links.bus1.str.replace(" gas", "") + + bus_colors = { + "fossil gas": tech_colors["fossil gas"], + "methanation": tech_colors["methanation"], + "biogas": "seagreen", + } + + fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) + + n.plot( + bus_sizes=bus_sizes, + bus_colors=bus_colors, + link_colors=pipe_colors["gas pipeline (in 2020)"], + link_widths=link_widths_orig, + branch_components=["Link"], + ax=ax, + **map_opts, + ) + + n.plot( + ax=ax, + bus_sizes=0.0, + link_colors=pipe_colors["gas pipeline (available)"], + link_widths=link_widths_rem, + branch_components=["Link"], + color_geomap=False, + boundaries=map_opts["boundaries"], + ) + + n.plot( + ax=ax, + bus_sizes=0.0, + link_colors=link_color_used, + link_widths=link_widths_used, + branch_components=["Link"], + color_geomap=False, + boundaries=map_opts["boundaries"], + ) + + sizes = [100, 10] + labels = [f"{s} TWh" for s in sizes] + sizes = [s / bus_size_factor * 1e6 for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0, 1.03), + labelspacing=0.8, + frameon=False, + handletextpad=1, + title="gas sources", + ) + + add_legend_circles( + ax, + sizes, + labels, + srid=n.srid, + patch_kw=dict(facecolor="lightgrey"), + legend_kw=legend_kw, + ) + + sizes = [50, 10] + labels = [f"{s} GW" for s in sizes] + scale = 1e3 / linewidth_factor + sizes = [s * scale for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0.25, 1.03), + frameon=False, + labelspacing=0.8, + handletextpad=1, + title="gas pipeline", + ) + + add_legend_lines( + ax, + sizes, + labels, + patch_kw=dict(color="lightgrey"), + legend_kw=legend_kw, + ) + + colors = list(pipe_colors.values()) + list(bus_colors.values()) + labels = list(pipe_colors.keys()) + list(bus_colors.keys()) + + # legend on the side + # legend_kw = dict( + # bbox_to_anchor=(1.47, 1.04), + # frameon=False, + # ) + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0, 1.24), + ncol=2, + frameon=False, + ) + + add_legend_patches( + ax, + colors, + labels, + legend_kw=legend_kw, + ) + + fig.savefig(snakemake.output.map, bbox_inches="tight") + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "plot_gas_network", + simpl="", + opts="", + clusters="37", + ll="v1.0", + sector_opts="4380H-T-H-B-I-A-dist1", + ) + + configure_logging(snakemake) + + n = pypsa.Network(snakemake.input.network) + + regions = gpd.read_file(snakemake.input.regions).set_index("name") + + map_opts = snakemake.params.plotting["map"] + + if map_opts["boundaries"] is None: + map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1] + + proj = load_projection(snakemake.params.plotting) + + plot_ch4_map(n) diff --git a/scripts/plot_hydrogen_network.py b/scripts/plot_hydrogen_network.py new file mode 100644 index 00000000..13728553 --- /dev/null +++ b/scripts/plot_hydrogen_network.py @@ -0,0 +1,267 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Creates map of optimised hydrogen network, storage and selected other infrastructure. +""" + +import logging + +import geopandas as gpd +import matplotlib.pyplot as plt +import pandas as pd +import pypsa +from _helpers import configure_logging +from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches + +from plot_power_network import assign_location, load_projection + +logger = logging.getLogger(__name__) + + +def group_pipes(df, drop_direction=False): + """ + Group pipes which connect same buses and return overall capacity. + """ + if drop_direction: + positive_order = df.bus0 < df.bus1 + df_p = df[positive_order] + swap_buses = {"bus0": "bus1", "bus1": "bus0"} + df_n = df[~positive_order].rename(columns=swap_buses) + df = pd.concat([df_p, df_n]) + + # there are pipes for each investment period rename to AC buses name for plotting + df.index = df.apply( + lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", + axis=1, + ) + return df.groupby(level=0).agg({"p_nom_opt": sum, "bus0": "first", "bus1": "first"}) + + +def plot_h2_map(n, regions): + # if "H2 pipeline" not in n.links.carrier.unique(): + # return + + assign_location(n) + + h2_storage = n.stores.query("carrier == 'H2'") + regions["H2"] = ( + h2_storage.rename(index=h2_storage.bus.map(n.buses.location)) + .e_nom_opt.groupby(level=0) + .sum() + .div(1e6) + ) # TWh + regions["H2"] = regions["H2"].where(regions["H2"] > 0.1) + + bus_size_factor = 1e5 + linewidth_factor = 7e3 + # MW below which not drawn + line_lower_threshold = 750 + + # Drop non-electric buses so they don't clutter the plot + n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) + + carriers = ["H2 Electrolysis", "H2 Fuel Cell"] + + elec = n.links[n.links.carrier.isin(carriers)].index + + bus_sizes = ( + n.links.loc[elec, "p_nom_opt"].groupby([n.links["bus0"], n.links.carrier]).sum() + / bus_size_factor + ) + + # make a fake MultiIndex so that area is correct for legend + bus_sizes.rename(index=lambda x: x.replace(" H2", ""), level=0, inplace=True) + # drop all links which are not H2 pipelines + n.links.drop( + n.links.index[~n.links.carrier.str.contains("H2 pipeline")], inplace=True + ) + + h2_new = n.links[n.links.carrier == "H2 pipeline"] + h2_retro = n.links[n.links.carrier == "H2 pipeline retrofitted"] + + if snakemake.params.foresight == "myopic": + # sum capacitiy for pipelines from different investment periods + h2_new = group_pipes(h2_new) + + if not h2_retro.empty: + h2_retro = ( + group_pipes(h2_retro, drop_direction=True) + .reindex(h2_new.index) + .fillna(0) + ) + + if not h2_retro.empty: + positive_order = h2_retro.bus0 < h2_retro.bus1 + h2_retro_p = h2_retro[positive_order] + swap_buses = {"bus0": "bus1", "bus1": "bus0"} + h2_retro_n = h2_retro[~positive_order].rename(columns=swap_buses) + h2_retro = pd.concat([h2_retro_p, h2_retro_n]) + + h2_retro["index_orig"] = h2_retro.index + h2_retro.index = h2_retro.apply( + lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", + axis=1, + ) + + retro_w_new_i = h2_retro.index.intersection(h2_new.index) + h2_retro_w_new = h2_retro.loc[retro_w_new_i] + + retro_wo_new_i = h2_retro.index.difference(h2_new.index) + h2_retro_wo_new = h2_retro.loc[retro_wo_new_i] + h2_retro_wo_new.index = h2_retro_wo_new.index_orig + + to_concat = [h2_new, h2_retro_w_new, h2_retro_wo_new] + h2_total = pd.concat(to_concat).p_nom_opt.groupby(level=0).sum() + + else: + h2_total = h2_new.p_nom_opt + + link_widths_total = h2_total / linewidth_factor + + n.links.rename(index=lambda x: x.split("-2")[0], inplace=True) + n.links = n.links.groupby(level=0).first() + link_widths_total = link_widths_total.reindex(n.links.index).fillna(0.0) + link_widths_total[n.links.p_nom_opt < line_lower_threshold] = 0.0 + + retro = n.links.p_nom_opt.where( + n.links.carrier == "H2 pipeline retrofitted", other=0.0 + ) + link_widths_retro = retro / linewidth_factor + link_widths_retro[n.links.p_nom_opt < line_lower_threshold] = 0.0 + + n.links.bus0 = n.links.bus0.str.replace(" H2", "") + n.links.bus1 = n.links.bus1.str.replace(" H2", "") + + regions = regions.to_crs(proj.proj4_init) + + fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) + + color_h2_pipe = "#b3f3f4" + color_retrofit = "#499a9c" + + bus_colors = {"H2 Electrolysis": "#ff29d9", "H2 Fuel Cell": "#805394"} + + n.plot( + geomap=True, + bus_sizes=bus_sizes, + bus_colors=bus_colors, + link_colors=color_h2_pipe, + link_widths=link_widths_total, + branch_components=["Link"], + ax=ax, + **map_opts, + ) + + n.plot( + geomap=True, + bus_sizes=0, + link_colors=color_retrofit, + link_widths=link_widths_retro, + branch_components=["Link"], + ax=ax, + **map_opts, + ) + + regions.plot( + ax=ax, + column="H2", + cmap="Blues", + linewidths=0, + legend=True, + vmax=6, + vmin=0, + legend_kwds={ + "label": "Hydrogen Storage [TWh]", + "shrink": 0.7, + "extend": "max", + }, + ) + + sizes = [50, 10] + labels = [f"{s} GW" for s in sizes] + sizes = [s / bus_size_factor * 1e3 for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0, 1), + labelspacing=0.8, + handletextpad=0, + frameon=False, + ) + + add_legend_circles( + ax, + sizes, + labels, + srid=n.srid, + patch_kw=dict(facecolor="lightgrey"), + legend_kw=legend_kw, + ) + + sizes = [30, 10] + labels = [f"{s} GW" for s in sizes] + scale = 1e3 / linewidth_factor + sizes = [s * scale for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0.23, 1), + frameon=False, + labelspacing=0.8, + handletextpad=1, + ) + + add_legend_lines( + ax, + sizes, + labels, + patch_kw=dict(color="lightgrey"), + legend_kw=legend_kw, + ) + + colors = [bus_colors[c] for c in carriers] + [color_h2_pipe, color_retrofit] + labels = carriers + ["H2 pipeline (total)", "H2 pipeline (repurposed)"] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0, 1.13), + ncol=2, + frameon=False, + ) + + add_legend_patches(ax, colors, labels, legend_kw=legend_kw) + + ax.set_facecolor("white") + + fig.savefig(snakemake.output.map, bbox_inches="tight") + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "plot_hydrogen_network", + simpl="", + opts="", + clusters="37", + ll="v1.0", + sector_opts="4380H-T-H-B-I-A-dist1", + ) + + configure_logging(snakemake) + + n = pypsa.Network(snakemake.input.network) + + regions = gpd.read_file(snakemake.input.regions).set_index("name") + + map_opts = snakemake.params.plotting["map"] + + if map_opts["boundaries"] is None: + map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1] + + proj = load_projection(snakemake.params.plotting) + + plot_h2_map(n, regions) diff --git a/scripts/plot_network.py b/scripts/plot_network.py deleted file mode 100644 index b06e5ce2..00000000 --- a/scripts/plot_network.py +++ /dev/null @@ -1,869 +0,0 @@ -# -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: MIT -""" -Creates plots for optimised network topologies, including electricity, gas and -hydrogen networks, and regional generation, storage and conversion capacities -built. - -This rule plots a map of the network with technology capacities at the -nodes. -""" - -import logging - -import cartopy.crs as ccrs -import geopandas as gpd -import matplotlib.pyplot as plt -import pandas as pd -import pypsa -from make_summary import assign_carriers -from plot_summary import preferred_order, rename_techs -from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches - -logger = logging.getLogger(__name__) -plt.style.use(["ggplot"]) - - -def rename_techs_tyndp(tech): - tech = rename_techs(tech) - if "heat pump" in tech or "resistive heater" in tech: - return "power-to-heat" - elif tech in ["H2 Electrolysis", "methanation", "H2 liquefaction"]: - return "power-to-gas" - elif tech == "H2": - return "H2 storage" - elif tech in ["NH3", "Haber-Bosch", "ammonia cracker", "ammonia store"]: - return "ammonia" - elif tech in ["OCGT", "CHP", "gas boiler", "H2 Fuel Cell"]: - return "gas-to-power/heat" - # elif "solar" in tech: - # return "solar" - elif tech in ["Fischer-Tropsch", "methanolisation"]: - return "power-to-liquid" - elif "offshore wind" in tech: - return "offshore wind" - elif "CC" in tech or "sequestration" in tech: - return "CCS" - else: - return tech - - -def assign_location(n): - for c in n.iterate_components(n.one_port_components | n.branch_components): - ifind = pd.Series(c.df.index.str.find(" ", start=4), c.df.index) - for i in ifind.value_counts().index: - # these have already been assigned defaults - if i == -1: - continue - names = ifind.index[ifind == i] - c.df.loc[names, "location"] = names.str[:i] - - -def plot_map( - network, - components=["links", "stores", "storage_units", "generators"], - bus_size_factor=1.7e10, - transmission=False, - with_legend=True, -): - tech_colors = snakemake.params.plotting["tech_colors"] - - n = network.copy() - assign_location(n) - # Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) - - costs = pd.DataFrame(index=n.buses.index) - - for comp in components: - df_c = getattr(n, comp) - - if df_c.empty: - continue - - df_c["nice_group"] = df_c.carrier.map(rename_techs_tyndp) - - attr = "e_nom_opt" if comp == "stores" else "p_nom_opt" - - costs_c = ( - (df_c.capital_cost * df_c[attr]) - .groupby([df_c.location, df_c.nice_group]) - .sum() - .unstack() - .fillna(0.0) - ) - costs = pd.concat([costs, costs_c], axis=1) - - logger.debug(f"{comp}, {costs}") - - costs = costs.groupby(costs.columns, axis=1).sum() - - costs.drop(list(costs.columns[(costs == 0.0).all()]), axis=1, inplace=True) - - new_columns = preferred_order.intersection(costs.columns).append( - costs.columns.difference(preferred_order) - ) - costs = costs[new_columns] - - for item in new_columns: - if item not in tech_colors: - logger.warning(f"{item} not in config/plotting/tech_colors") - - costs = costs.stack() # .sort_index() - - # hack because impossible to drop buses... - eu_location = snakemake.params.plotting.get("eu_node_location", dict(x=-5.5, y=46)) - n.buses.loc["EU gas", "x"] = eu_location["x"] - n.buses.loc["EU gas", "y"] = eu_location["y"] - - n.links.drop( - n.links.index[(n.links.carrier != "DC") & (n.links.carrier != "B2B")], - inplace=True, - ) - - # drop non-bus - to_drop = costs.index.levels[0].symmetric_difference(n.buses.index) - if len(to_drop) != 0: - logger.info(f"Dropping non-buses {to_drop.tolist()}") - costs.drop(to_drop, level=0, inplace=True, axis=0, errors="ignore") - - # make sure they are removed from index - costs.index = pd.MultiIndex.from_tuples(costs.index.values) - - threshold = 100e6 # 100 mEUR/a - carriers = costs.groupby(level=1).sum() - carriers = carriers.where(carriers > threshold).dropna() - carriers = list(carriers.index) - - # PDF has minimum width, so set these to zero - line_lower_threshold = 500.0 - line_upper_threshold = 1e4 - linewidth_factor = 4e3 - ac_color = "rosybrown" - dc_color = "darkseagreen" - - title = "added grid" - - if snakemake.wildcards["ll"] == "v1.0": - # should be zero - line_widths = n.lines.s_nom_opt - n.lines.s_nom - link_widths = n.links.p_nom_opt - n.links.p_nom - if transmission: - line_widths = n.lines.s_nom_opt - link_widths = n.links.p_nom_opt - linewidth_factor = 2e3 - line_lower_threshold = 0.0 - title = "current grid" - else: - line_widths = n.lines.s_nom_opt - n.lines.s_nom_min - link_widths = n.links.p_nom_opt - n.links.p_nom_min - if transmission: - line_widths = n.lines.s_nom_opt - link_widths = n.links.p_nom_opt - title = "total grid" - - line_widths = line_widths.clip(line_lower_threshold, line_upper_threshold) - link_widths = link_widths.clip(line_lower_threshold, line_upper_threshold) - - line_widths = line_widths.replace(line_lower_threshold, 0) - link_widths = link_widths.replace(line_lower_threshold, 0) - - fig, ax = plt.subplots(subplot_kw={"projection": proj}) - fig.set_size_inches(7, 6) - - n.plot( - bus_sizes=costs / bus_size_factor, - bus_colors=tech_colors, - line_colors=ac_color, - link_colors=dc_color, - line_widths=line_widths / linewidth_factor, - link_widths=link_widths / linewidth_factor, - ax=ax, - **map_opts, - ) - - sizes = [20, 10, 5] - labels = [f"{s} bEUR/a" for s in sizes] - sizes = [s / bus_size_factor * 1e9 for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0.01, 1.06), - labelspacing=0.8, - frameon=False, - handletextpad=0, - title="system cost", - ) - - add_legend_circles( - ax, - sizes, - labels, - srid=n.srid, - patch_kw=dict(facecolor="lightgrey"), - legend_kw=legend_kw, - ) - - sizes = [10, 5] - labels = [f"{s} GW" for s in sizes] - scale = 1e3 / linewidth_factor - sizes = [s * scale for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0.27, 1.06), - frameon=False, - labelspacing=0.8, - handletextpad=1, - title=title, - ) - - add_legend_lines( - ax, sizes, labels, patch_kw=dict(color="lightgrey"), legend_kw=legend_kw - ) - - legend_kw = dict( - bbox_to_anchor=(1.52, 1.04), - frameon=False, - ) - - if with_legend: - colors = [tech_colors[c] for c in carriers] + [ac_color, dc_color] - labels = carriers + ["HVAC line", "HVDC link"] - - add_legend_patches( - ax, - colors, - labels, - legend_kw=legend_kw, - ) - - fig.savefig(snakemake.output.map, transparent=True, bbox_inches="tight") - - -def group_pipes(df, drop_direction=False): - """ - Group pipes which connect same buses and return overall capacity. - """ - if drop_direction: - positive_order = df.bus0 < df.bus1 - df_p = df[positive_order] - swap_buses = {"bus0": "bus1", "bus1": "bus0"} - df_n = df[~positive_order].rename(columns=swap_buses) - df = pd.concat([df_p, df_n]) - - # there are pipes for each investment period rename to AC buses name for plotting - df.index = df.apply( - lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", - axis=1, - ) - return df.groupby(level=0).agg({"p_nom_opt": sum, "bus0": "first", "bus1": "first"}) - - -def plot_h2_map(network, regions): - n = network.copy() - if "H2 pipeline" not in n.links.carrier.unique(): - return - - assign_location(n) - - h2_storage = n.stores.query("carrier == 'H2'") - regions["H2"] = ( - h2_storage.rename(index=h2_storage.bus.map(n.buses.location)) - .e_nom_opt.groupby(level=0) - .sum() - .div(1e6) - ) # TWh - regions["H2"] = regions["H2"].where(regions["H2"] > 0.1) - - bus_size_factor = 1e5 - linewidth_factor = 7e3 - # MW below which not drawn - line_lower_threshold = 750 - - # Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) - - carriers = ["H2 Electrolysis", "H2 Fuel Cell"] - - elec = n.links[n.links.carrier.isin(carriers)].index - - bus_sizes = ( - n.links.loc[elec, "p_nom_opt"].groupby([n.links["bus0"], n.links.carrier]).sum() - / bus_size_factor - ) - - # make a fake MultiIndex so that area is correct for legend - bus_sizes.rename(index=lambda x: x.replace(" H2", ""), level=0, inplace=True) - # drop all links which are not H2 pipelines - n.links.drop( - n.links.index[~n.links.carrier.str.contains("H2 pipeline")], inplace=True - ) - - h2_new = n.links[n.links.carrier == "H2 pipeline"] - h2_retro = n.links[n.links.carrier == "H2 pipeline retrofitted"] - - if snakemake.params.foresight == "myopic": - # sum capacitiy for pipelines from different investment periods - h2_new = group_pipes(h2_new) - - if not h2_retro.empty: - h2_retro = ( - group_pipes(h2_retro, drop_direction=True) - .reindex(h2_new.index) - .fillna(0) - ) - - if not h2_retro.empty: - positive_order = h2_retro.bus0 < h2_retro.bus1 - h2_retro_p = h2_retro[positive_order] - swap_buses = {"bus0": "bus1", "bus1": "bus0"} - h2_retro_n = h2_retro[~positive_order].rename(columns=swap_buses) - h2_retro = pd.concat([h2_retro_p, h2_retro_n]) - - h2_retro["index_orig"] = h2_retro.index - h2_retro.index = h2_retro.apply( - lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", - axis=1, - ) - - retro_w_new_i = h2_retro.index.intersection(h2_new.index) - h2_retro_w_new = h2_retro.loc[retro_w_new_i] - - retro_wo_new_i = h2_retro.index.difference(h2_new.index) - h2_retro_wo_new = h2_retro.loc[retro_wo_new_i] - h2_retro_wo_new.index = h2_retro_wo_new.index_orig - - to_concat = [h2_new, h2_retro_w_new, h2_retro_wo_new] - h2_total = pd.concat(to_concat).p_nom_opt.groupby(level=0).sum() - - else: - h2_total = h2_new.p_nom_opt - - link_widths_total = h2_total / linewidth_factor - - n.links.rename(index=lambda x: x.split("-2")[0], inplace=True) - n.links = n.links.groupby(level=0).first() - link_widths_total = link_widths_total.reindex(n.links.index).fillna(0.0) - link_widths_total[n.links.p_nom_opt < line_lower_threshold] = 0.0 - - retro = n.links.p_nom_opt.where( - n.links.carrier == "H2 pipeline retrofitted", other=0.0 - ) - link_widths_retro = retro / linewidth_factor - link_widths_retro[n.links.p_nom_opt < line_lower_threshold] = 0.0 - - n.links.bus0 = n.links.bus0.str.replace(" H2", "") - n.links.bus1 = n.links.bus1.str.replace(" H2", "") - - regions = regions.to_crs(proj.proj4_init) - - fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) - - color_h2_pipe = "#b3f3f4" - color_retrofit = "#499a9c" - - bus_colors = {"H2 Electrolysis": "#ff29d9", "H2 Fuel Cell": "#805394"} - - n.plot( - geomap=True, - bus_sizes=bus_sizes, - bus_colors=bus_colors, - link_colors=color_h2_pipe, - link_widths=link_widths_total, - branch_components=["Link"], - ax=ax, - **map_opts, - ) - - n.plot( - geomap=True, - bus_sizes=0, - link_colors=color_retrofit, - link_widths=link_widths_retro, - branch_components=["Link"], - ax=ax, - **map_opts, - ) - - regions.plot( - ax=ax, - column="H2", - cmap="Blues", - linewidths=0, - legend=True, - vmax=6, - vmin=0, - legend_kwds={ - "label": "Hydrogen Storage [TWh]", - "shrink": 0.7, - "extend": "max", - }, - ) - - sizes = [50, 10] - labels = [f"{s} GW" for s in sizes] - sizes = [s / bus_size_factor * 1e3 for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0, 1), - labelspacing=0.8, - handletextpad=0, - frameon=False, - ) - - add_legend_circles( - ax, - sizes, - labels, - srid=n.srid, - patch_kw=dict(facecolor="lightgrey"), - legend_kw=legend_kw, - ) - - sizes = [30, 10] - labels = [f"{s} GW" for s in sizes] - scale = 1e3 / linewidth_factor - sizes = [s * scale for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0.23, 1), - frameon=False, - labelspacing=0.8, - handletextpad=1, - ) - - add_legend_lines( - ax, - sizes, - labels, - patch_kw=dict(color="lightgrey"), - legend_kw=legend_kw, - ) - - colors = [bus_colors[c] for c in carriers] + [color_h2_pipe, color_retrofit] - labels = carriers + ["H2 pipeline (total)", "H2 pipeline (repurposed)"] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0, 1.13), - ncol=2, - frameon=False, - ) - - add_legend_patches(ax, colors, labels, legend_kw=legend_kw) - - ax.set_facecolor("white") - - fig.savefig( - snakemake.output.map.replace("-costs-all", "-h2_network"), bbox_inches="tight" - ) - - -def plot_ch4_map(network): - n = network.copy() - - if "gas pipeline" not in n.links.carrier.unique(): - return - - assign_location(n) - - bus_size_factor = 8e7 - linewidth_factor = 1e4 - # MW below which not drawn - line_lower_threshold = 1e3 - - # Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) - - fossil_gas_i = n.generators[n.generators.carrier == "gas"].index - fossil_gas = ( - n.generators_t.p.loc[:, fossil_gas_i] - .mul(n.snapshot_weightings.generators, axis=0) - .sum() - .groupby(n.generators.loc[fossil_gas_i, "bus"]) - .sum() - / bus_size_factor - ) - fossil_gas.rename(index=lambda x: x.replace(" gas", ""), inplace=True) - fossil_gas = fossil_gas.reindex(n.buses.index).fillna(0) - # make a fake MultiIndex so that area is correct for legend - fossil_gas.index = pd.MultiIndex.from_product([fossil_gas.index, ["fossil gas"]]) - - methanation_i = n.links.query("carrier == 'Sabatier'").index - methanation = ( - abs( - n.links_t.p1.loc[:, methanation_i].mul( - n.snapshot_weightings.generators, axis=0 - ) - ) - .sum() - .groupby(n.links.loc[methanation_i, "bus1"]) - .sum() - / bus_size_factor - ) - methanation = ( - methanation.groupby(methanation.index) - .sum() - .rename(index=lambda x: x.replace(" gas", "")) - ) - # make a fake MultiIndex so that area is correct for legend - methanation.index = pd.MultiIndex.from_product([methanation.index, ["methanation"]]) - - biogas_i = n.stores[n.stores.carrier == "biogas"].index - biogas = ( - n.stores_t.p.loc[:, biogas_i] - .mul(n.snapshot_weightings.generators, axis=0) - .sum() - .groupby(n.stores.loc[biogas_i, "bus"]) - .sum() - / bus_size_factor - ) - biogas = ( - biogas.groupby(biogas.index) - .sum() - .rename(index=lambda x: x.replace(" biogas", "")) - ) - # make a fake MultiIndex so that area is correct for legend - biogas.index = pd.MultiIndex.from_product([biogas.index, ["biogas"]]) - - bus_sizes = pd.concat([fossil_gas, methanation, biogas]) - bus_sizes.sort_index(inplace=True) - - to_remove = n.links.index[~n.links.carrier.str.contains("gas pipeline")] - n.links.drop(to_remove, inplace=True) - - link_widths_rem = n.links.p_nom_opt / linewidth_factor - link_widths_rem[n.links.p_nom_opt < line_lower_threshold] = 0.0 - - link_widths_orig = n.links.p_nom / linewidth_factor - link_widths_orig[n.links.p_nom < line_lower_threshold] = 0.0 - - max_usage = n.links_t.p0.abs().max(axis=0) - link_widths_used = max_usage / linewidth_factor - link_widths_used[max_usage < line_lower_threshold] = 0.0 - - tech_colors = snakemake.params.plotting["tech_colors"] - - pipe_colors = { - "gas pipeline": "#f08080", - "gas pipeline new": "#c46868", - "gas pipeline (in 2020)": "lightgrey", - "gas pipeline (available)": "#e8d1d1", - } - - link_color_used = n.links.carrier.map(pipe_colors) - - n.links.bus0 = n.links.bus0.str.replace(" gas", "") - n.links.bus1 = n.links.bus1.str.replace(" gas", "") - - bus_colors = { - "fossil gas": tech_colors["fossil gas"], - "methanation": tech_colors["methanation"], - "biogas": "seagreen", - } - - fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={"projection": proj}) - - n.plot( - bus_sizes=bus_sizes, - bus_colors=bus_colors, - link_colors=pipe_colors["gas pipeline (in 2020)"], - link_widths=link_widths_orig, - branch_components=["Link"], - ax=ax, - **map_opts, - ) - - n.plot( - ax=ax, - bus_sizes=0.0, - link_colors=pipe_colors["gas pipeline (available)"], - link_widths=link_widths_rem, - branch_components=["Link"], - color_geomap=False, - boundaries=map_opts["boundaries"], - ) - - n.plot( - ax=ax, - bus_sizes=0.0, - link_colors=link_color_used, - link_widths=link_widths_used, - branch_components=["Link"], - color_geomap=False, - boundaries=map_opts["boundaries"], - ) - - sizes = [100, 10] - labels = [f"{s} TWh" for s in sizes] - sizes = [s / bus_size_factor * 1e6 for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0, 1.03), - labelspacing=0.8, - frameon=False, - handletextpad=1, - title="gas sources", - ) - - add_legend_circles( - ax, - sizes, - labels, - srid=n.srid, - patch_kw=dict(facecolor="lightgrey"), - legend_kw=legend_kw, - ) - - sizes = [50, 10] - labels = [f"{s} GW" for s in sizes] - scale = 1e3 / linewidth_factor - sizes = [s * scale for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0.25, 1.03), - frameon=False, - labelspacing=0.8, - handletextpad=1, - title="gas pipeline", - ) - - add_legend_lines( - ax, - sizes, - labels, - patch_kw=dict(color="lightgrey"), - legend_kw=legend_kw, - ) - - colors = list(pipe_colors.values()) + list(bus_colors.values()) - labels = list(pipe_colors.keys()) + list(bus_colors.keys()) - - # legend on the side - # legend_kw = dict( - # bbox_to_anchor=(1.47, 1.04), - # frameon=False, - # ) - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0, 1.24), - ncol=2, - frameon=False, - ) - - add_legend_patches( - ax, - colors, - labels, - legend_kw=legend_kw, - ) - - fig.savefig( - snakemake.output.map.replace("-costs-all", "-ch4_network"), bbox_inches="tight" - ) - - -def plot_map_perfect( - network, - components=["Link", "Store", "StorageUnit", "Generator"], - bus_size_factor=1.7e10, -): - n = network.copy() - assign_location(n) - # Drop non-electric buses so they don't clutter the plot - n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) - # investment periods - investments = n.snapshots.levels[0] - - costs = {} - for comp in components: - df_c = n.df(comp) - if df_c.empty: - continue - df_c["nice_group"] = df_c.carrier.map(rename_techs_tyndp) - - attr = "e_nom_opt" if comp == "Store" else "p_nom_opt" - - active = pd.concat( - [n.get_active_assets(comp, inv_p).rename(inv_p) for inv_p in investments], - axis=1, - ).astype(int) - capital_cost = n.df(comp)[attr] * n.df(comp).capital_cost - capital_cost_t = ( - (active.mul(capital_cost, axis=0)) - .groupby([n.df(comp).location, n.df(comp).nice_group]) - .sum() - ) - - capital_cost_t.drop("load", level=1, inplace=True, errors="ignore") - - costs[comp] = capital_cost_t - - costs = pd.concat(costs).groupby(level=[1, 2]).sum() - costs.drop(costs[costs.sum(axis=1) == 0].index, inplace=True) - - new_columns = preferred_order.intersection(costs.index.levels[1]).append( - costs.index.levels[1].difference(preferred_order) - ) - costs = costs.reindex(new_columns, level=1) - - for item in new_columns: - if item not in snakemake.config["plotting"]["tech_colors"]: - print( - "Warning!", - item, - "not in config/plotting/tech_colors, assign random color", - ) - snakemake.config["plotting"]["tech_colors"] = "pink" - - n.links.drop( - n.links.index[(n.links.carrier != "DC") & (n.links.carrier != "B2B")], - inplace=True, - ) - - # drop non-bus - to_drop = costs.index.levels[0].symmetric_difference(n.buses.index) - if len(to_drop) != 0: - print("dropping non-buses", to_drop) - costs.drop(to_drop, level=0, inplace=True, axis=0, errors="ignore") - - # make sure they are removed from index - costs.index = pd.MultiIndex.from_tuples(costs.index.values) - - # PDF has minimum width, so set these to zero - line_lower_threshold = 500.0 - line_upper_threshold = 1e4 - linewidth_factor = 2e3 - ac_color = "gray" - dc_color = "m" - - line_widths = n.lines.s_nom_opt - link_widths = n.links.p_nom_opt - linewidth_factor = 2e3 - line_lower_threshold = 0.0 - title = "Today's transmission" - - line_widths[line_widths < line_lower_threshold] = 0.0 - link_widths[link_widths < line_lower_threshold] = 0.0 - - line_widths[line_widths > line_upper_threshold] = line_upper_threshold - link_widths[link_widths > line_upper_threshold] = line_upper_threshold - - for year in costs.columns: - fig, ax = plt.subplots(subplot_kw={"projection": proj}) - fig.set_size_inches(7, 6) - fig.suptitle(year) - - n.plot( - bus_sizes=costs[year] / bus_size_factor, - bus_colors=snakemake.config["plotting"]["tech_colors"], - line_colors=ac_color, - link_colors=dc_color, - line_widths=line_widths / linewidth_factor, - link_widths=link_widths / linewidth_factor, - ax=ax, - **map_opts, - ) - - sizes = [20, 10, 5] - labels = [f"{s} bEUR/a" for s in sizes] - sizes = [s / bus_size_factor * 1e9 for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0.01, 1.06), - labelspacing=0.8, - frameon=False, - handletextpad=0, - title="system cost", - ) - - add_legend_circles( - ax, - sizes, - labels, - srid=n.srid, - patch_kw=dict(facecolor="lightgrey"), - legend_kw=legend_kw, - ) - - sizes = [10, 5] - labels = [f"{s} GW" for s in sizes] - scale = 1e3 / linewidth_factor - sizes = [s * scale for s in sizes] - - legend_kw = dict( - loc="upper left", - bbox_to_anchor=(0.27, 1.06), - frameon=False, - labelspacing=0.8, - handletextpad=1, - title=title, - ) - - add_legend_lines( - ax, sizes, labels, patch_kw=dict(color="lightgrey"), legend_kw=legend_kw - ) - - legend_kw = dict( - bbox_to_anchor=(1.52, 1.04), - frameon=False, - ) - - fig.savefig( - snakemake.output[f"map_{year}"], transparent=True, bbox_inches="tight" - ) - - -if __name__ == "__main__": - if "snakemake" not in globals(): - from _helpers import mock_snakemake - - snakemake = mock_snakemake( - "plot_network", - simpl="", - opts="", - clusters="37", - ll="v1.0", - sector_opts="4380H-T-H-B-I-A-dist1", - ) - - logging.basicConfig(level=snakemake.config["logging"]["level"]) - - n = pypsa.Network(snakemake.input.network) - - regions = gpd.read_file(snakemake.input.regions).set_index("name") - - map_opts = snakemake.params.plotting["map"] - - if map_opts["boundaries"] is None: - map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1] - - proj_kwargs = snakemake.params.plotting.get("projection", dict(name="EqualEarth")) - proj_func = getattr(ccrs, proj_kwargs.pop("name")) - proj = proj_func(**proj_kwargs) - - if snakemake.params["foresight"] == "perfect": - plot_map_perfect( - n, - components=["Link", "Store", "StorageUnit", "Generator"], - bus_size_factor=2e10, - ) - else: - plot_map( - n, - components=["generators", "links", "stores", "storage_units"], - bus_size_factor=2e10, - transmission=False, - ) - - plot_h2_map(n, regions) - plot_ch4_map(n) diff --git a/scripts/plot_power_network.py b/scripts/plot_power_network.py new file mode 100644 index 00000000..48aa01e3 --- /dev/null +++ b/scripts/plot_power_network.py @@ -0,0 +1,271 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Creates plots for optimised power network topologies and regional generation, +storage and conversion capacities built. +""" + +import logging + +import cartopy.crs as ccrs +import geopandas as gpd +import matplotlib.pyplot as plt +import pandas as pd +import pypsa +from plot_summary import preferred_order, rename_techs +from _helpers import configure_logging +from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches + +logger = logging.getLogger(__name__) + +def rename_techs_tyndp(tech): + tech = rename_techs(tech) + if "heat pump" in tech or "resistive heater" in tech: + return "power-to-heat" + elif tech in ["H2 Electrolysis", "methanation", "H2 liquefaction"]: + return "power-to-gas" + elif tech == "H2": + return "H2 storage" + elif tech in ["NH3", "Haber-Bosch", "ammonia cracker", "ammonia store"]: + return "ammonia" + elif tech in ["OCGT", "CHP", "gas boiler", "H2 Fuel Cell"]: + return "gas-to-power/heat" + # elif "solar" in tech: + # return "solar" + elif tech in ["Fischer-Tropsch", "methanolisation"]: + return "power-to-liquid" + elif "offshore wind" in tech: + return "offshore wind" + elif "CC" in tech or "sequestration" in tech: + return "CCS" + else: + return tech + + +def assign_location(n): + for c in n.iterate_components(n.one_port_components | n.branch_components): + ifind = pd.Series(c.df.index.str.find(" ", start=4), c.df.index) + for i in ifind.value_counts().index: + # these have already been assigned defaults + if i == -1: + continue + names = ifind.index[ifind == i] + c.df.loc[names, "location"] = names.str[:i] + + +def load_projection(plotting_params): + proj_kwargs = plotting_params.get("projection", dict(name="EqualEarth")) + proj_func = getattr(ccrs, proj_kwargs.pop("name")) + return proj_func(**proj_kwargs) + + +def plot_map( + n, + components=["links", "stores", "storage_units", "generators"], + bus_size_factor=2e10, + transmission=False, + with_legend=True, +): + tech_colors = snakemake.params.plotting["tech_colors"] + + assign_location(n) + # Drop non-electric buses so they don't clutter the plot + n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) + + costs = pd.DataFrame(index=n.buses.index) + + for comp in components: + df_c = getattr(n, comp) + + if df_c.empty: + continue + + df_c["nice_group"] = df_c.carrier.map(rename_techs_tyndp) + + attr = "e_nom_opt" if comp == "stores" else "p_nom_opt" + + costs_c = ( + (df_c.capital_cost * df_c[attr]) + .groupby([df_c.location, df_c.nice_group]) + .sum() + .unstack() + .fillna(0.0) + ) + costs = pd.concat([costs, costs_c], axis=1) + + logger.debug(f"{comp}, {costs}") + + costs = costs.groupby(costs.columns, axis=1).sum() + + costs.drop(list(costs.columns[(costs == 0.0).all()]), axis=1, inplace=True) + + new_columns = preferred_order.intersection(costs.columns).append( + costs.columns.difference(preferred_order) + ) + costs = costs[new_columns] + + for item in new_columns: + if item not in tech_colors: + logger.warning(f"{item} not in config/plotting/tech_colors") + + costs = costs.stack() # .sort_index() + + # hack because impossible to drop buses... + eu_location = snakemake.params.plotting.get("eu_node_location", dict(x=-5.5, y=46)) + n.buses.loc["EU gas", "x"] = eu_location["x"] + n.buses.loc["EU gas", "y"] = eu_location["y"] + + n.links.drop( + n.links.index[(n.links.carrier != "DC") & (n.links.carrier != "B2B")], + inplace=True, + ) + + # drop non-bus + to_drop = costs.index.levels[0].symmetric_difference(n.buses.index) + if len(to_drop) != 0: + logger.info(f"Dropping non-buses {to_drop.tolist()}") + costs.drop(to_drop, level=0, inplace=True, axis=0, errors="ignore") + + # make sure they are removed from index + costs.index = pd.MultiIndex.from_tuples(costs.index.values) + + threshold = 100e6 # 100 mEUR/a + carriers = costs.groupby(level=1).sum() + carriers = carriers.where(carriers > threshold).dropna() + carriers = list(carriers.index) + + # PDF has minimum width, so set these to zero + line_lower_threshold = 500.0 + line_upper_threshold = 1e4 + linewidth_factor = 4e3 + ac_color = "rosybrown" + dc_color = "darkseagreen" + + title = "added grid" + + if snakemake.wildcards["ll"] == "v1.0": + # should be zero + line_widths = n.lines.s_nom_opt - n.lines.s_nom + link_widths = n.links.p_nom_opt - n.links.p_nom + if transmission: + line_widths = n.lines.s_nom_opt + link_widths = n.links.p_nom_opt + linewidth_factor = 2e3 + line_lower_threshold = 0.0 + title = "current grid" + else: + line_widths = n.lines.s_nom_opt - n.lines.s_nom_min + link_widths = n.links.p_nom_opt - n.links.p_nom_min + if transmission: + line_widths = n.lines.s_nom_opt + link_widths = n.links.p_nom_opt + title = "total grid" + + line_widths = line_widths.clip(line_lower_threshold, line_upper_threshold) + link_widths = link_widths.clip(line_lower_threshold, line_upper_threshold) + + line_widths = line_widths.replace(line_lower_threshold, 0) + link_widths = link_widths.replace(line_lower_threshold, 0) + + fig, ax = plt.subplots(subplot_kw={"projection": proj}) + fig.set_size_inches(7, 6) + + n.plot( + bus_sizes=costs / bus_size_factor, + bus_colors=tech_colors, + line_colors=ac_color, + link_colors=dc_color, + line_widths=line_widths / linewidth_factor, + link_widths=link_widths / linewidth_factor, + ax=ax, + **map_opts, + ) + + sizes = [20, 10, 5] + labels = [f"{s} bEUR/a" for s in sizes] + sizes = [s / bus_size_factor * 1e9 for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0.01, 1.06), + labelspacing=0.8, + frameon=False, + handletextpad=0, + title="system cost", + ) + + add_legend_circles( + ax, + sizes, + labels, + srid=n.srid, + patch_kw=dict(facecolor="lightgrey"), + legend_kw=legend_kw, + ) + + sizes = [10, 5] + labels = [f"{s} GW" for s in sizes] + scale = 1e3 / linewidth_factor + sizes = [s * scale for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0.27, 1.06), + frameon=False, + labelspacing=0.8, + handletextpad=1, + title=title, + ) + + add_legend_lines( + ax, sizes, labels, patch_kw=dict(color="lightgrey"), legend_kw=legend_kw + ) + + legend_kw = dict( + bbox_to_anchor=(1.52, 1.04), + frameon=False, + ) + + if with_legend: + colors = [tech_colors[c] for c in carriers] + [ac_color, dc_color] + labels = carriers + ["HVAC line", "HVDC link"] + + add_legend_patches( + ax, + colors, + labels, + legend_kw=legend_kw, + ) + + fig.savefig(snakemake.output.map, bbox_inches="tight") + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "plot_power_network", + simpl="", + opts="", + clusters="37", + ll="v1.0", + sector_opts="4380H-T-H-B-I-A-dist1", + ) + + configure_logging(snakemake) + + n = pypsa.Network(snakemake.input.network) + + regions = gpd.read_file(snakemake.input.regions).set_index("name") + + map_opts = snakemake.params.plotting["map"] + + if map_opts["boundaries"] is None: + map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1] + + proj = load_projection(snakemake.params.plotting) + + plot_map(n) diff --git a/scripts/plot_power_network_perfect.py b/scripts/plot_power_network_perfect.py new file mode 100644 index 00000000..ce8afef0 --- /dev/null +++ b/scripts/plot_power_network_perfect.py @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Creates plots for optimised power network topologies and regional generation, +storage and conversion capacities built for the perfect foresight scenario. +""" + +import logging + +import geopandas as gpd +import matplotlib.pyplot as plt +import pandas as pd +import pypsa +from _helpers import configure_logging +from pypsa.plot import add_legend_circles, add_legend_lines +from plot_power_network import assign_location, rename_techs_tyndp, load_projection +from plot_summary import preferred_order + +logger = logging.getLogger(__name__) + + +def plot_map_perfect( + n, + components=["Link", "Store", "StorageUnit", "Generator"], + bus_size_factor=2e10, +): + assign_location(n) + # Drop non-electric buses so they don't clutter the plot + n.buses.drop(n.buses.index[n.buses.carrier != "AC"], inplace=True) + # investment periods + investments = n.snapshots.levels[0] + + costs = {} + for comp in components: + df_c = n.df(comp) + if df_c.empty: + continue + df_c["nice_group"] = df_c.carrier.map(rename_techs_tyndp) + + attr = "e_nom_opt" if comp == "Store" else "p_nom_opt" + + active = pd.concat( + [n.get_active_assets(comp, inv_p).rename(inv_p) for inv_p in investments], + axis=1, + ).astype(int) + capital_cost = n.df(comp)[attr] * n.df(comp).capital_cost + capital_cost_t = ( + (active.mul(capital_cost, axis=0)) + .groupby([n.df(comp).location, n.df(comp).nice_group]) + .sum() + ) + + capital_cost_t.drop("load", level=1, inplace=True, errors="ignore") + + costs[comp] = capital_cost_t + + costs = pd.concat(costs).groupby(level=[1, 2]).sum() + costs.drop(costs[costs.sum(axis=1) == 0].index, inplace=True) + + new_columns = preferred_order.intersection(costs.index.levels[1]).append( + costs.index.levels[1].difference(preferred_order) + ) + costs = costs.reindex(new_columns, level=1) + + for item in new_columns: + if item not in snakemake.config["plotting"]["tech_colors"]: + print( + "Warning!", + item, + "not in config/plotting/tech_colors, assign random color", + ) + snakemake.config["plotting"]["tech_colors"] = "pink" + + n.links.drop( + n.links.index[(n.links.carrier != "DC") & (n.links.carrier != "B2B")], + inplace=True, + ) + + # drop non-bus + to_drop = costs.index.levels[0].symmetric_difference(n.buses.index) + if len(to_drop) != 0: + print("dropping non-buses", to_drop) + costs.drop(to_drop, level=0, inplace=True, axis=0, errors="ignore") + + # make sure they are removed from index + costs.index = pd.MultiIndex.from_tuples(costs.index.values) + + # PDF has minimum width, so set these to zero + line_lower_threshold = 500.0 + line_upper_threshold = 1e4 + linewidth_factor = 2e3 + ac_color = "gray" + dc_color = "m" + + line_widths = n.lines.s_nom_opt + link_widths = n.links.p_nom_opt + linewidth_factor = 2e3 + line_lower_threshold = 0.0 + title = "Today's transmission" + + line_widths[line_widths < line_lower_threshold] = 0.0 + link_widths[link_widths < line_lower_threshold] = 0.0 + + line_widths[line_widths > line_upper_threshold] = line_upper_threshold + link_widths[link_widths > line_upper_threshold] = line_upper_threshold + + for year in costs.columns: + fig, ax = plt.subplots(subplot_kw={"projection": proj}) + fig.set_size_inches(7, 6) + fig.suptitle(year) + + n.plot( + bus_sizes=costs[year] / bus_size_factor, + bus_colors=snakemake.config["plotting"]["tech_colors"], + line_colors=ac_color, + link_colors=dc_color, + line_widths=line_widths / linewidth_factor, + link_widths=link_widths / linewidth_factor, + ax=ax, + **map_opts, + ) + + sizes = [20, 10, 5] + labels = [f"{s} bEUR/a" for s in sizes] + sizes = [s / bus_size_factor * 1e9 for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0.01, 1.06), + labelspacing=0.8, + frameon=False, + handletextpad=0, + title="system cost", + ) + + add_legend_circles( + ax, + sizes, + labels, + srid=n.srid, + patch_kw=dict(facecolor="lightgrey"), + legend_kw=legend_kw, + ) + + sizes = [10, 5] + labels = [f"{s} GW" for s in sizes] + scale = 1e3 / linewidth_factor + sizes = [s * scale for s in sizes] + + legend_kw = dict( + loc="upper left", + bbox_to_anchor=(0.27, 1.06), + frameon=False, + labelspacing=0.8, + handletextpad=1, + title=title, + ) + + add_legend_lines( + ax, sizes, labels, patch_kw=dict(color="lightgrey"), legend_kw=legend_kw + ) + + legend_kw = dict( + bbox_to_anchor=(1.52, 1.04), + frameon=False, + ) + + fig.savefig(snakemake.output[f"map_{year}"], bbox_inches="tight") + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "plot_power_network_perfect", + simpl="", + opts="", + clusters="37", + ll="v1.0", + sector_opts="4380H-T-H-B-I-A-dist1", + ) + + configure_logging(snakemake) + + n = pypsa.Network(snakemake.input.network) + + regions = gpd.read_file(snakemake.input.regions).set_index("name") + + map_opts = snakemake.params.plotting["map"] + + if map_opts["boundaries"] is None: + map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1] + + proj = load_projection(snakemake.params.plotting) + + plot_map_perfect(n) From 3f112f0e957d804e3a556a37b02ab4250c31e114 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 25 Jan 2024 20:37:33 +0100 Subject: [PATCH 304/497] incorporate network plots in rule --- Snakefile | 15 +++++++++++++++ doc/release_notes.rst | 3 --- rules/postprocess.smk | 20 -------------------- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/Snakefile b/Snakefile index 14c9e821..76ea7b80 100644 --- a/Snakefile +++ b/Snakefile @@ -75,6 +75,21 @@ if config["foresight"] == "perfect": rule all: input: RESULTS + "graphs/costs.pdf", + expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", + **config["scenario"] + ), + expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf", + **config["scenario"] + ), + expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf", + **config["scenario"] + ), default_target: True diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 5bcaf0d2..7ffbe63c 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -40,9 +40,6 @@ Upcoming Release * The rule ``plot_network`` has been split into separate rules for plotting electricity, hydrogen and gas networks. -* Added new collection rule ``plot_all`` which should be used instead of - ``plot_summary``. This allows running the rule :mod:`make_summary` and - :mod:`plot_summary` even if the network plotting rules fail. PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 6db3079a..22cefcbd 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -202,26 +202,6 @@ rule plot_summary: "../scripts/plot_summary.py" -rule plot_all: - input: - RESULTS + "graphs/costs.pdf", - expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - **config["scenario"] - ), - expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf", - **config["scenario"] - ), - expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf", - **config["scenario"] - ), - - STATISTICS_BARPLOTS = [ "capacity_factor", "installed_capacity", From 30ccde5b908aa680ea858fcdb08b09b593e901cf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 19:39:07 +0000 Subject: [PATCH 305/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/postprocess.smk | 2 -- scripts/plot_gas_network.py | 5 +++-- scripts/plot_hydrogen_network.py | 6 +++--- scripts/plot_power_network.py | 3 ++- scripts/plot_power_network_perfect.py | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 22cefcbd..f7c50733 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -32,7 +32,6 @@ if config["foresight"] != "perfect": script: "../scripts/plot_power_network.py" - rule plot_hydrogen_network: params: plotting=config["plotting"], @@ -56,7 +55,6 @@ if config["foresight"] != "perfect": script: "../scripts/plot_hydrogen_network.py" - rule plot_gas_network: params: plotting=config["plotting"], diff --git a/scripts/plot_gas_network.py b/scripts/plot_gas_network.py index a72c5c56..cd515e96 100644 --- a/scripts/plot_gas_network.py +++ b/scripts/plot_gas_network.py @@ -3,7 +3,8 @@ # # SPDX-License-Identifier: MIT """ -Creates map of optimised gas network, storage and selected other infrastructure. +Creates map of optimised gas network, storage and selected other +infrastructure. """ import logging @@ -13,8 +14,8 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa from _helpers import configure_logging -from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches from plot_power_network import assign_location, load_projection +from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches logger = logging.getLogger(__name__) diff --git a/scripts/plot_hydrogen_network.py b/scripts/plot_hydrogen_network.py index 13728553..a1183311 100644 --- a/scripts/plot_hydrogen_network.py +++ b/scripts/plot_hydrogen_network.py @@ -3,7 +3,8 @@ # # SPDX-License-Identifier: MIT """ -Creates map of optimised hydrogen network, storage and selected other infrastructure. +Creates map of optimised hydrogen network, storage and selected other +infrastructure. """ import logging @@ -13,9 +14,8 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa from _helpers import configure_logging -from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches - from plot_power_network import assign_location, load_projection +from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches logger = logging.getLogger(__name__) diff --git a/scripts/plot_power_network.py b/scripts/plot_power_network.py index 48aa01e3..271e638d 100644 --- a/scripts/plot_power_network.py +++ b/scripts/plot_power_network.py @@ -14,12 +14,13 @@ import geopandas as gpd import matplotlib.pyplot as plt import pandas as pd import pypsa -from plot_summary import preferred_order, rename_techs from _helpers import configure_logging +from plot_summary import preferred_order, rename_techs from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches logger = logging.getLogger(__name__) + def rename_techs_tyndp(tech): tech = rename_techs(tech) if "heat pump" in tech or "resistive heater" in tech: diff --git a/scripts/plot_power_network_perfect.py b/scripts/plot_power_network_perfect.py index ce8afef0..ff576d33 100644 --- a/scripts/plot_power_network_perfect.py +++ b/scripts/plot_power_network_perfect.py @@ -14,9 +14,9 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa from _helpers import configure_logging -from pypsa.plot import add_legend_circles, add_legend_lines -from plot_power_network import assign_location, rename_techs_tyndp, load_projection +from plot_power_network import assign_location, load_projection, rename_techs_tyndp from plot_summary import preferred_order +from pypsa.plot import add_legend_circles, add_legend_lines logger = logging.getLogger(__name__) From a2cd042472ac6e4148afeb651337e812eb6b2092 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 14 Aug 2023 18:25:58 +0200 Subject: [PATCH 306/497] plot clustered network topology before optimisation --- Snakefile | 1 + rules/postprocess.smk | 20 +++++++ scripts/plot_power_network_clustered.py | 79 +++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 scripts/plot_power_network_clustered.py diff --git a/Snakefile b/Snakefile index 76ea7b80..23835a7e 100644 --- a/Snakefile +++ b/Snakefile @@ -75,6 +75,7 @@ if config["foresight"] == "perfect": rule all: input: RESULTS + "graphs/costs.pdf", + expand(RESULTS + "maps/power-network-{clusters}.pdf", **config["scenario"]), expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", diff --git a/rules/postprocess.smk b/rules/postprocess.smk index f7c50733..d275279e 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -9,6 +9,26 @@ localrules: if config["foresight"] != "perfect": + rule plot_power_network_clustered: + params: + plotting=config["plotting"], + input: + network=RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", + regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + rc="matplotlibrc", + output: + map=RESULTS + "maps/power-network-{clusters}.pdf", + threads: 1 + resources: + mem_mb=4000, + benchmark: + BENCHMARKS + "plot_power_network_clustered/elec_s{simpl}_{clusters}" + conda: + "../envs/environment.yaml" + script: + "../scripts/plot_power_network_clustered.py" + + rule plot_power_network: params: plotting=config["plotting"], diff --git a/scripts/plot_power_network_clustered.py b/scripts/plot_power_network_clustered.py new file mode 100644 index 00000000..e1140fd6 --- /dev/null +++ b/scripts/plot_power_network_clustered.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2023-2024 PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Plot clustered electricity transmission network. +""" + +import pypsa +import geopandas as gpd +import matplotlib.pyplot as plt +import cartopy.crs as ccrs +from matplotlib.lines import Line2D +from pypsa.plot import add_legend_lines + +from plot_power_network import load_projection + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "plot_power_network_clustered", + clusters=128, + configfiles=["../../config/config.test.yaml"] + ) + + plt.style.use(snakemake.input.rc) + + lw_factor = 2e3 + + n = pypsa.Network(snakemake.input.network) + + regions = gpd.read_file(snakemake.input.regions_onshore).set_index('name') + + proj = load_projection(snakemake.params.plotting) + + fig, ax = plt.subplots(figsize=(8,8), subplot_kw={"projection": proj}) + regions.to_crs(proj.proj4_init).plot( + ax=ax, + facecolor='none', + edgecolor='lightgray', + linewidth=0.75 + ) + n.plot( + ax=ax, + margin=0.06, + line_widths=n.lines.s_nom / lw_factor, + link_colors=n.links.p_nom.apply( + lambda x: "darkseagreen" if x > 0 else "skyblue" + ), + link_widths=2., + ) + + sizes = [10, 20] + labels = [f"HVAC ({s} GW)" for s in sizes] + scale = 1e3 / lw_factor + sizes = [s * scale for s in sizes] + + legend_kw = dict( + loc=[0.25, 0.9], + frameon=False, + labelspacing=0.5, + handletextpad=1, + fontsize=13, + ) + + add_legend_lines( + ax, sizes, labels, patch_kw=dict(color="rosybrown"), legend_kw=legend_kw + ) + + handles = [ + Line2D([0], [0], color="darkseagreen", lw=2), + Line2D([0], [0], color="skyblue", lw=2), + ] + plt.legend(handles, ["HVDC existing", "HVDC planned"], frameon=False, loc=[0., 0.9], fontsize=13) + + plt.savefig(snakemake.output.map, bbox_inches='tight') From 5fcfafe971cdb0b7ccbd31fa4a613d989f499b0d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 19:50:03 +0000 Subject: [PATCH 307/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/postprocess.smk | 4 ++-- scripts/plot_power_network_clustered.py | 31 +++++++++++++------------ 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index d275279e..d1c65ced 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -14,7 +14,8 @@ if config["foresight"] != "perfect": plotting=config["plotting"], input: network=RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", - regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions_onshore=RESOURCES + + "regions_onshore_elec_s{simpl}_{clusters}.geojson", rc="matplotlibrc", output: map=RESULTS + "maps/power-network-{clusters}.pdf", @@ -28,7 +29,6 @@ if config["foresight"] != "perfect": script: "../scripts/plot_power_network_clustered.py" - rule plot_power_network: params: plotting=config["plotting"], diff --git a/scripts/plot_power_network_clustered.py b/scripts/plot_power_network_clustered.py index e1140fd6..318afbb9 100644 --- a/scripts/plot_power_network_clustered.py +++ b/scripts/plot_power_network_clustered.py @@ -6,15 +6,13 @@ Plot clustered electricity transmission network. """ -import pypsa +import cartopy.crs as ccrs import geopandas as gpd import matplotlib.pyplot as plt -import cartopy.crs as ccrs +import pypsa from matplotlib.lines import Line2D -from pypsa.plot import add_legend_lines - from plot_power_network import load_projection - +from pypsa.plot import add_legend_lines if __name__ == "__main__": if "snakemake" not in globals(): @@ -23,7 +21,7 @@ if __name__ == "__main__": snakemake = mock_snakemake( "plot_power_network_clustered", clusters=128, - configfiles=["../../config/config.test.yaml"] + configfiles=["../../config/config.test.yaml"], ) plt.style.use(snakemake.input.rc) @@ -32,16 +30,13 @@ if __name__ == "__main__": n = pypsa.Network(snakemake.input.network) - regions = gpd.read_file(snakemake.input.regions_onshore).set_index('name') + regions = gpd.read_file(snakemake.input.regions_onshore).set_index("name") proj = load_projection(snakemake.params.plotting) - fig, ax = plt.subplots(figsize=(8,8), subplot_kw={"projection": proj}) + fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={"projection": proj}) regions.to_crs(proj.proj4_init).plot( - ax=ax, - facecolor='none', - edgecolor='lightgray', - linewidth=0.75 + ax=ax, facecolor="none", edgecolor="lightgray", linewidth=0.75 ) n.plot( ax=ax, @@ -50,7 +45,7 @@ if __name__ == "__main__": link_colors=n.links.p_nom.apply( lambda x: "darkseagreen" if x > 0 else "skyblue" ), - link_widths=2., + link_widths=2.0, ) sizes = [10, 20] @@ -74,6 +69,12 @@ if __name__ == "__main__": Line2D([0], [0], color="darkseagreen", lw=2), Line2D([0], [0], color="skyblue", lw=2), ] - plt.legend(handles, ["HVDC existing", "HVDC planned"], frameon=False, loc=[0., 0.9], fontsize=13) + plt.legend( + handles, + ["HVDC existing", "HVDC planned"], + frameon=False, + loc=[0.0, 0.9], + fontsize=13, + ) - plt.savefig(snakemake.output.map, bbox_inches='tight') + plt.savefig(snakemake.output.map, bbox_inches="tight") From 7becfdea9c044c98224cccf1e6b09a092db4a774 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Thu, 25 Jan 2024 20:51:51 +0100 Subject: [PATCH 308/497] resolve merge conflict --- Snakefile | 2 +- rules/postprocess.smk | 3 +-- scripts/plot_power_network_clustered.py | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Snakefile b/Snakefile index 23835a7e..8a256acc 100644 --- a/Snakefile +++ b/Snakefile @@ -75,7 +75,7 @@ if config["foresight"] == "perfect": rule all: input: RESULTS + "graphs/costs.pdf", - expand(RESULTS + "maps/power-network-{clusters}.pdf", **config["scenario"]), + expand(RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", **config["scenario"]), expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", diff --git a/rules/postprocess.smk b/rules/postprocess.smk index d1c65ced..1ca6eb4d 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -16,9 +16,8 @@ if config["foresight"] != "perfect": network=RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", regions_onshore=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", - rc="matplotlibrc", output: - map=RESULTS + "maps/power-network-{clusters}.pdf", + map=RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", threads: 1 resources: mem_mb=4000, diff --git a/scripts/plot_power_network_clustered.py b/scripts/plot_power_network_clustered.py index 318afbb9..8217ac2e 100644 --- a/scripts/plot_power_network_clustered.py +++ b/scripts/plot_power_network_clustered.py @@ -24,8 +24,6 @@ if __name__ == "__main__": configfiles=["../../config/config.test.yaml"], ) - plt.style.use(snakemake.input.rc) - lw_factor = 2e3 n = pypsa.Network(snakemake.input.network) From a56bd830f8b5808189020414efcae11a7bfc184a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 19:53:23 +0000 Subject: [PATCH 309/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Snakefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Snakefile b/Snakefile index 8a256acc..2021b49f 100644 --- a/Snakefile +++ b/Snakefile @@ -75,7 +75,10 @@ if config["foresight"] == "perfect": rule all: input: RESULTS + "graphs/costs.pdf", - expand(RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", **config["scenario"]), + expand( + RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", + **config["scenario"] + ), expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", From 707adcec69d13e6c1e628fb80ebb7cf64c5aff82 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 26 Jan 2024 09:15:04 +0100 Subject: [PATCH 310/497] all: make H2 and CH4 maps dependent on network config --- Snakefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Snakefile b/Snakefile index 2021b49f..211e7540 100644 --- a/Snakefile +++ b/Snakefile @@ -86,12 +86,16 @@ rule all: ), expand( RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf", + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf" + if config["sector"]["H2_network"] + else [], **config["scenario"] ), expand( RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf", + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf" + if config["sector"]["gas_network"] + else [], **config["scenario"] ), default_target: True From ae825d82dcebae7ab67f591329fe8e6140a96d72 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 26 Jan 2024 12:10:39 +0100 Subject: [PATCH 311/497] prepare_sector_network: reorder buses for dac components --- doc/release_notes.rst | 2 ++ scripts/add_electricity.py | 2 +- scripts/prepare_sector_network.py | 22 +++++++++++----------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 93d1a268..94d5c55f 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -37,6 +37,8 @@ Upcoming Release * Add the option to customise map projection in plotting config. +* The order of buses (bus0, bus1, ...) for DAC components has changed to meet the convention of the other components. Therefore, `bus0` refers to the electricity bus (input), `bus1` to the heat bus (input), 'bus2' to the CO2 atmosphere bus (input), and `bus3` to the CO2 storage bus (output). + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index c9e5abca..8a1086bd 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -288,7 +288,7 @@ def attach_load(n, regions, load, nuts3_shapes, ua_md_gdp, countries, scaling=1. ua_md_gdp = pd.read_csv(ua_md_gdp, dtype={"name": "str"}).set_index("name") - logger.info(f"Load data scaled with scalling factor {scaling}.") + logger.info(f"Load data scaled by factor {scaling}.") opsd_load *= scaling nuts3 = gpd.read_file(nuts3_shapes).set_index("index") diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index d24feb79..3ea8c8dd 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -710,27 +710,27 @@ def add_dac(n, costs): heat_buses = n.buses.index[n.buses.carrier.isin(heat_carriers)] locations = n.buses.location[heat_buses] - efficiency2 = -( + electricity_input = ( costs.at["direct air capture", "electricity-input"] + costs.at["direct air capture", "compression-electricity-input"] - ) - efficiency3 = -( + ) # MWh_el / tCO2 + heat_input = ( costs.at["direct air capture", "heat-input"] - costs.at["direct air capture", "compression-heat-output"] - ) + ) # MWh_th / tCO2 n.madd( "Link", heat_buses.str.replace(" heat", " DAC"), - bus0="co2 atmosphere", - bus1=spatial.co2.df.loc[locations, "nodes"].values, - bus2=locations.values, - bus3=heat_buses, + bus0=locations.values, + bus1=heat_buses, + bus2="co2 atmosphere", + bus3=spatial.co2.df.loc[locations, "nodes"].values, carrier="DAC", capital_cost=costs.at["direct air capture", "fixed"], - efficiency=1.0, - efficiency2=efficiency2, - efficiency3=efficiency3, + efficiency=-heat_input / electricity_input, + efficiency2=-electricity_input, + efficiency3=electricity_input, p_nom_extendable=True, lifetime=costs.at["direct air capture", "lifetime"], ) From b73c614f5bc122cb78cfa6e594817edfe6538b41 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 26 Jan 2024 16:39:03 +0100 Subject: [PATCH 312/497] plot_gas_network: save max usage calculation --- scripts/plot_gas_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/plot_gas_network.py b/scripts/plot_gas_network.py index cd515e96..e2953604 100644 --- a/scripts/plot_gas_network.py +++ b/scripts/plot_gas_network.py @@ -97,7 +97,7 @@ def plot_ch4_map(n): link_widths_orig = n.links.p_nom / linewidth_factor link_widths_orig[n.links.p_nom < line_lower_threshold] = 0.0 - max_usage = n.links_t.p0.abs().max(axis=0) + max_usage = n.links_t.p0[n.links.index].abs().max(axis=0) link_widths_used = max_usage / linewidth_factor link_widths_used[max_usage < line_lower_threshold] = 0.0 From f84e73006fa478e9a3b176081615eb34ad1ae216 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 26 Jan 2024 17:05:38 +0100 Subject: [PATCH 313/497] postprocess: keep network plotting triggers in make_summary --- Snakefile | 23 ----------------------- rules/postprocess.smk | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Snakefile b/Snakefile index 211e7540..14c9e821 100644 --- a/Snakefile +++ b/Snakefile @@ -75,29 +75,6 @@ if config["foresight"] == "perfect": rule all: input: RESULTS + "graphs/costs.pdf", - expand( - RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", - **config["scenario"] - ), - expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - **config["scenario"] - ), - expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf" - if config["sector"]["H2_network"] - else [], - **config["scenario"] - ), - expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf" - if config["sector"]["gas_network"] - else [], - **config["scenario"] - ), default_target: True diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 1ca6eb4d..d01f90db 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -158,6 +158,29 @@ rule make_summary: costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" else "data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), + expand( + RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", + **config["scenario"] + ), + costs_plot=expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", + **config["scenario"] + ), + h2_plot=expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf" + if config["sector"]["H2_network"] + else [], + **config["scenario"] + ), + ch4_plot=expand( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf" + if config["sector"]["gas_network"] + else [], + **config["scenario"] + ), output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", nodal_capacities=RESULTS + "csvs/nodal_capacities.csv", From d6288d3d4dfed4bb2ce58fa4053eabf0123e3404 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 16:06:20 +0000 Subject: [PATCH 314/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/postprocess.smk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index d01f90db..88b56e2f 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -150,6 +150,10 @@ rule make_summary: scenario=config["scenario"], RDIR=RDIR, input: + expand( + RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", + **config["scenario"] + ), networks=expand( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -158,10 +162,6 @@ rule make_summary: costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" else "data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), - expand( - RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", - **config["scenario"] - ), costs_plot=expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", From 8cb7396c112de5e80e04a1ba115ea5a733a4d7da Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 26 Jan 2024 17:07:19 +0100 Subject: [PATCH 315/497] make_summary: name all inputs --- rules/postprocess.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index d01f90db..50fe634c 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -158,7 +158,7 @@ rule make_summary: costs="data/costs_{}.csv".format(config["costs"]["year"]) if config["foresight"] == "overnight" else "data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), - expand( + ac_plot=expand( RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", **config["scenario"] ), From 08a4d196af265ba1e4fc5729b33f654cdd8ffc7b Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 26 Jan 2024 23:16:33 +0100 Subject: [PATCH 316/497] ci: add workflow with inhouse package at current master --- .github/workflows/ci-sync.yaml | 97 ++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 .github/workflows/ci-sync.yaml diff --git a/.github/workflows/ci-sync.yaml b/.github/workflows/ci-sync.yaml new file mode 100644 index 00000000..e5b4006c --- /dev/null +++ b/.github/workflows/ci-sync.yaml @@ -0,0 +1,97 @@ +# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +name: CI - Synced Inhouse Packages + +# Caching method based on and described by: +# epassaro (2021): https://dev.to/epassaro/caching-anaconda-environments-in-github-actions-5hde +# and code in GitHub repo: https://github.com/epassaro/cache-conda-envs + +on: + push: + branches: + - master + pull_request: + branches: + - master + schedule: + - cron: "0 5 * * TUE" + +env: + DATA_CACHE_NUMBER: 2 + +jobs: + build: + + strategy: + fail-fast: false + max-parallel: 1 + + runs-on: ubuntu-latest + + defaults: + run: + shell: bash -l {0} + + steps: + - uses: actions/checkout@v3 + + - name: Setup secrets + run: | + echo -ne "url: ${CDSAPI_URL}\nkey: ${CDSAPI_TOKEN}\n" > ~/.cdsapirc + + - name: Add solver to environment + run: | + echo -e "- glpk\n- ipopt<3.13.3" >> envs/environment.yaml + if: ${{ matrix.os }} == 'windows-latest' + + - name: Add solver to environment + run: | + echo -e "- glpk\n- ipopt" >> envs/environment.yaml + if: ${{ matrix.os }} != 'windows-latest' + + - name: Setup micromamba + uses: mamba-org/setup-micromamba@v1 + with: + micromamba-version: latest + environment-file: envs/environment.yaml + log-level: debug + init-shell: bash + cache-environment: true + cache-downloads: true + + # install inhouse packages from master branch with pip + - name: Install inhouse packages + run: | + pip install git+https://github.com/PyPSA/atlite.git@master git+https://github.com/PyPSA/powerplantmatching.git@master git+https://github.com/PyPSA/linopy.git@master + + + - name: Set cache dates + run: | + echo "WEEK=$(date +'%Y%U')" >> $GITHUB_ENV + + - name: Cache data and cutouts folders + uses: actions/cache@v3 + with: + path: | + data + cutouts + key: data-cutouts-${{ env.WEEK }}-${{ env.DATA_CACHE_NUMBER }} + + - name: Test snakemake workflow + run: | + snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime + snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime + snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime + snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: resources-results + path: | + resources + results + if-no-files-found: warn + retention-days: 1 From ae1b83121d0dfc4afcd0206f1ae1b0a2cf5808be Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 26 Jan 2024 23:20:03 +0100 Subject: [PATCH 317/497] prepare_sector: fix dac co2 input/output efficiencies --- scripts/prepare_sector_network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 3ea8c8dd..52b805d4 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -729,8 +729,8 @@ def add_dac(n, costs): carrier="DAC", capital_cost=costs.at["direct air capture", "fixed"], efficiency=-heat_input / electricity_input, - efficiency2=-electricity_input, - efficiency3=electricity_input, + efficiency2=-1 / electricity_input, + efficiency3=1 / electricity_input, p_nom_extendable=True, lifetime=costs.at["direct air capture", "lifetime"], ) From 7b0356803f07267be1d4bee8b2a1c1e5f16f052b Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 29 Jan 2024 09:01:08 +0100 Subject: [PATCH 318/497] prepare_sector: adjust DAC costs --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 3fa46605..9fba84ea 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -727,7 +727,7 @@ def add_dac(n, costs): bus2="co2 atmosphere", bus3=spatial.co2.df.loc[locations, "nodes"].values, carrier="DAC", - capital_cost=costs.at["direct air capture", "fixed"], + capital_cost=costs.at["direct air capture", "fixed"] / electricity_input, efficiency=-heat_input / electricity_input, efficiency2=-1 / electricity_input, efficiency3=1 / electricity_input, From 81e7c4eb67a8385eee5f5701c2ee134b67fd585a Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 29 Jan 2024 12:08:56 +0100 Subject: [PATCH 319/497] remove pyomo dependency in cluster network, use scip as OS solver --- envs/environment.yaml | 3 +-- scripts/cluster_network.py | 41 ++++++++++++++------------------------ 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/envs/environment.yaml b/envs/environment.yaml index 6ff4b7f1..895b271a 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -36,7 +36,7 @@ dependencies: - networkx - scipy - shapely>=2.0 -- pyomo +- scipopt - matplotlib - proj - fiona @@ -47,7 +47,6 @@ dependencies: - tabula-py - pyxlsb - graphviz -- ipopt # Keep in conda environment when calling ipython - ipython diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 01af29aa..a18121e8 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -126,10 +126,10 @@ import warnings from functools import reduce import geopandas as gpd +import linopy import matplotlib.pyplot as plt import numpy as np import pandas as pd -import pyomo.environ as po import pypsa import seaborn as sns from _helpers import configure_logging, update_p_nom_max @@ -214,7 +214,7 @@ def get_feature_for_hac(n, buses_i=None, feature=None): return feature_data -def distribute_clusters(n, n_clusters, focus_weights=None, solver_name="cbc"): +def distribute_clusters(n, n_clusters, focus_weights=None, solver_name="scip"): """ Determine the number of clusters per country. """ @@ -254,31 +254,20 @@ def distribute_clusters(n, n_clusters, focus_weights=None, solver_name="cbc"): L.sum(), 1.0, rtol=1e-3 ), f"Country weights L must sum up to 1.0 when distributing clusters. Is {L.sum()}." - m = po.ConcreteModel() - - def n_bounds(model, *n_id): - return (1, N[n_id]) - - m.n = po.Var(list(L.index), bounds=n_bounds, domain=po.Integers) - m.tot = po.Constraint(expr=(po.summation(m.n) == n_clusters)) - m.objective = po.Objective( - expr=sum((m.n[i] - L.loc[i] * n_clusters) ** 2 for i in L.index), - sense=po.minimize, + m = linopy.Model() + clusters = m.add_variables( + lower=1, upper=N, coords=[L.index], name="n", integer=True ) - - opt = po.SolverFactory(solver_name) - if solver_name == "appsi_highs" or not opt.has_capability("quadratic_objective"): - logger.warning( - f"The configured solver `{solver_name}` does not support quadratic objectives. Falling back to `ipopt`." - ) - opt = po.SolverFactory("ipopt") - - results = opt.solve(m) - assert ( - results["Solver"][0]["Status"] == "ok" - ), f"Solver returned non-optimally: {results}" - - return pd.Series(m.n.get_values(), index=L.index).round().astype(int) + m.add_constraints(clusters.sum() == n_clusters, name="tot") + m.objective = ( + clusters * clusters - 2 * clusters * L * n_clusters + ) # + (L * n_clusters) ** 2 (constant) + if solver_name == "gurobi": + logging.getLogger("gurobipy").propagate = False + else: + solver_name = "scip" + m.solve(solver_name=solver_name) + return m.solution["n"].to_series().astype(int) def busmap_for_n_clusters( From ca1628a585dcfe1749c464cdbc5e1f5af7a0405a Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 29 Jan 2024 12:22:42 +0100 Subject: [PATCH 320/497] cluster_network: tidy up --- scripts/cluster_network.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index a18121e8..b63e7f89 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -122,6 +122,7 @@ Exemplary unsolved network clustered to 37 nodes: """ import logging +import os import warnings from functools import reduce @@ -259,12 +260,14 @@ def distribute_clusters(n, n_clusters, focus_weights=None, solver_name="scip"): lower=1, upper=N, coords=[L.index], name="n", integer=True ) m.add_constraints(clusters.sum() == n_clusters, name="tot") - m.objective = ( - clusters * clusters - 2 * clusters * L * n_clusters - ) # + (L * n_clusters) ** 2 (constant) + # leave out constant in objective L * n_clusters ** 2 + m.objective = (clusters * clusters - 2 * clusters * L * n_clusters).sum() if solver_name == "gurobi": logging.getLogger("gurobipy").propagate = False - else: + elif solver_name != "scip": + logger.info( + f"The configured solver `{solver_name}` does not support quadratic objectives. Falling back to `scip`." + ) solver_name = "scip" m.solve(solver_name=solver_name) return m.solution["n"].to_series().astype(int) @@ -374,7 +377,7 @@ def clustering_for_n_clusters( aggregate_carriers=None, line_length_factor=1.25, aggregation_strategies=dict(), - solver_name="cbc", + solver_name="scip", algorithm="hac", feature=None, extended_link_costs=0, @@ -451,7 +454,6 @@ if __name__ == "__main__": params = snakemake.params solver_name = snakemake.config["solving"]["solver"]["name"] - solver_name = "appsi_highs" if solver_name == "highs" else solver_name n = pypsa.Network(snakemake.input.network) From 3ceffabc944f8f3d881fc749ab05671e92f19019 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:30:17 +0000 Subject: [PATCH 321/497] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 23.12.1 → 24.1.1](https://github.com/psf/black-pre-commit-mirror/compare/23.12.1...24.1.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a38e6800..d90f5cb9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: # Formatting with "black" coding style - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.12.1 + rev: 24.1.1 hooks: # Format Python files - id: black From d2f2d4ab0b6a77446573b6c85ad1927861804d69 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:31:03 +0000 Subject: [PATCH 322/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_retro_cost.py | 49 ++++++++++++++++++------------- scripts/plot_summary.py | 12 ++++---- scripts/prepare_sector_network.py | 21 ++++++------- scripts/simplify_network.py | 6 ++-- scripts/solve_network.py | 8 +++-- 5 files changed, 55 insertions(+), 41 deletions(-) diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index 67440263..bd285e18 100755 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -607,21 +607,28 @@ def calculate_costs(u_values, l, cost_retro, window_assumptions): # noqa: E741 """ return u_values.apply( lambda x: ( - cost_retro.loc[x.name[3], "cost_var"] - * 100 - * float(l) - * l_weight.loc[x.name[3]].iloc[0] - + cost_retro.loc[x.name[3], "cost_fix"] - ) - * x.A_element - / x.A_C_Ref - if x.name[3] != "Window" - else ( - (window_cost(x[f"new_U_{l}"], cost_retro, window_assumptions) * x.A_element) + ( + cost_retro.loc[x.name[3], "cost_var"] + * 100 + * float(l) + * l_weight.loc[x.name[3]].iloc[0] + + cost_retro.loc[x.name[3], "cost_fix"] + ) + * x.A_element / x.A_C_Ref - ) - if x.value > window_limit(float(l), window_assumptions) - else 0, + if x.name[3] != "Window" + else ( + ( + ( + window_cost(x[f"new_U_{l}"], cost_retro, window_assumptions) + * x.A_element + ) + / x.A_C_Ref + ) + if x.value > window_limit(float(l), window_assumptions) + else 0 + ) + ), axis=1, ) @@ -648,12 +655,14 @@ def calculate_new_u(u_values, l, l_weight, window_assumptions, k=0.035): # noqa k: thermal conductivity """ return u_values.apply( - lambda x: k / ((k / x.value) + (float(l) * l_weight.loc[x.name[3]])) - if x.name[3] != "Window" - else ( - min(x.value, u_retro_window(float(l), window_assumptions)) - if x.value > window_limit(float(l), window_assumptions) - else x.value + lambda x: ( + k / ((k / x.value) + (float(l) * l_weight.loc[x.name[3]])) + if x.name[3] != "Window" + else ( + min(x.value, u_retro_window(float(l), window_assumptions)) + if x.value > window_limit(float(l), window_assumptions) + else x.value + ) ), axis=1, ) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index 92bf726c..cfb32441 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -281,12 +281,14 @@ def plot_balances(): # remove trailing link ports df.index = [ - i[:-1] - if ( - (i not in ["co2", "NH3", "H2"]) - and (i[-1:] in ["0", "1", "2", "3", "4"]) + ( + i[:-1] + if ( + (i not in ["co2", "NH3", "H2"]) + and (i[-1:] in ["0", "1", "2", "3", "4"]) + ) + else i ) - else i for i in df.index ] diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 22fb1bcc..42def055 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -458,9 +458,9 @@ def update_wind_solar_costs(n, costs): ) ) - n.generators.loc[ - n.generators.carrier == tech, "capital_cost" - ] = capital_cost.rename(index=lambda node: node + " " + tech) + n.generators.loc[n.generators.carrier == tech, "capital_cost"] = ( + capital_cost.rename(index=lambda node: node + " " + tech) + ) def add_carrier_buses(n, carrier, nodes=None): @@ -2932,9 +2932,11 @@ def add_industry(n, costs): nodes, suffix=" low-temperature heat for industry", bus=[ - node + " urban central heat" - if node + " urban central heat" in n.buses.index - else node + " services urban decentral heat" + ( + node + " urban central heat" + if node + " urban central heat" in n.buses.index + else node + " services urban decentral heat" + ) for node in nodes ], carrier="low-temperature heat for industry", @@ -3529,10 +3531,9 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): ) n.links.loc[carrier_i, "p_min_pu"] = 0 - n.links.loc[ - carrier_i, "efficiency" - ] = efficiency_static * efficiency_per_1000km ** ( - n.links.loc[carrier_i, "length"] / 1e3 + n.links.loc[carrier_i, "efficiency"] = ( + efficiency_static + * efficiency_per_1000km ** (n.links.loc[carrier_i, "length"] / 1e3) ) rev_links = ( n.links.loc[carrier_i].copy().rename({"bus0": "bus1", "bus1": "bus0"}, axis=1) diff --git a/scripts/simplify_network.py b/scripts/simplify_network.py index f8629ea7..31bc8f4e 100644 --- a/scripts/simplify_network.py +++ b/scripts/simplify_network.py @@ -468,9 +468,9 @@ def aggregate_to_substations(n, aggregation_strategies=dict(), buses_i=None): dijkstra(adj, directed=False, indices=bus_indexer), buses_i, n.buses.index ) - dist[ - buses_i - ] = np.inf # bus in buses_i should not be assigned to different bus in buses_i + dist[buses_i] = ( + np.inf + ) # bus in buses_i should not be assigned to different bus in buses_i for c in n.buses.country.unique(): incountry_b = n.buses.country == c diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 23e9b0f8..a1d790a7 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -703,9 +703,11 @@ def add_lossy_bidirectional_link_constraints(n): def get_backward_i(forward_i): return pd.Index( [ - re.sub(r"-(\d{4})$", r"-reversed-\1", s) - if re.search(r"-\d{4}$", s) - else s + "-reversed" + ( + re.sub(r"-(\d{4})$", r"-reversed-\1", s) + if re.search(r"-\d{4}$", s) + else s + "-reversed" + ) for s in forward_i ] ) From 56b22a3b4ea3e95e521bf4234b21899a963eefb5 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 30 Jan 2024 10:29:08 +0100 Subject: [PATCH 323/497] env: correct pyscipopt dependency cluster_network: address deprecation warning --- envs/environment.yaml | 2 +- scripts/cluster_network.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/envs/environment.yaml b/envs/environment.yaml index 895b271a..d92eb696 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -36,7 +36,7 @@ dependencies: - networkx - scipy - shapely>=2.0 -- scipopt +- pyscipopt - matplotlib - proj - fiona diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index b63e7f89..2c69b9af 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -364,7 +364,7 @@ def busmap_for_n_clusters( return ( n.buses.groupby(["country", "sub_network"], group_keys=False) - .apply(busmap_for_country) + .apply(busmap_for_country, include_groups=False) .squeeze() .rename("busmap") ) From 662252d20fa4ad488c95847c8ea1136ed6d0b629 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 30 Jan 2024 11:06:05 +0100 Subject: [PATCH 324/497] update release notes --- doc/release_notes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 86763287..c20f1ebe 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -60,6 +60,8 @@ Upcoming Release * The rule ``plot_network`` has been split into separate rules for plotting electricity, hydrogen and gas networks. +* To determine the optimal topology to meet the number of clusters, the workflow used pyomo in combination with ``ipopt`` or ``gurobi``. This dependency has been replaced by using ``linopy`` in combination with ``scipopt`` or ``gurobi``. The environment file has been updated accordingly. + PyPSA-Eur 0.9.0 (5th January 2024) ================================== From 9c558a3e460355d212d8d4e28f7e4f0dd87441ae Mon Sep 17 00:00:00 2001 From: Fabian Hofmann Date: Tue, 30 Jan 2024 17:37:44 +0100 Subject: [PATCH 325/497] Update scripts/cluster_network.py Co-authored-by: Fabian Neumann --- scripts/cluster_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 2c69b9af..39b6ad96 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -260,7 +260,7 @@ def distribute_clusters(n, n_clusters, focus_weights=None, solver_name="scip"): lower=1, upper=N, coords=[L.index], name="n", integer=True ) m.add_constraints(clusters.sum() == n_clusters, name="tot") - # leave out constant in objective L * n_clusters ** 2 + # leave out constant in objective (L * n_clusters) ** 2 m.objective = (clusters * clusters - 2 * clusters * L * n_clusters).sum() if solver_name == "gurobi": logging.getLogger("gurobipy").propagate = False From b7750d21eaa58fd1f03af8b51ce39dd745290f71 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 09:44:13 +0100 Subject: [PATCH 326/497] CI: use scip and highs as solvers for clustering and solving, instead of ipopt and glpk --- .github/workflows/ci.yaml | 10 ---------- config/test/config.electricity.yaml | 4 ++-- config/test/config.myopic.yaml | 4 ++-- config/test/config.overnight.yaml | 4 ++-- config/test/config.perfect.yaml | 4 ++-- doc/release_notes.rst | 5 +++++ envs/environment.yaml | 1 + 7 files changed, 14 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c0fb745d..cf52172f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -46,16 +46,6 @@ jobs: run: | echo -ne "url: ${CDSAPI_URL}\nkey: ${CDSAPI_TOKEN}\n" > ~/.cdsapirc - - name: Add solver to environment - run: | - echo -e "- glpk\n- ipopt<3.13.3" >> envs/environment.yaml - if: ${{ matrix.os }} == 'windows-latest' - - - name: Add solver to environment - run: | - echo -e "- glpk\n- ipopt" >> envs/environment.yaml - if: ${{ matrix.os }} != 'windows-latest' - - name: Setup micromamba uses: mamba-org/setup-micromamba@v1 with: diff --git a/config/test/config.electricity.yaml b/config/test/config.electricity.yaml index b750bf62..ef9bfdc0 100644 --- a/config/test/config.electricity.yaml +++ b/config/test/config.electricity.yaml @@ -69,8 +69,8 @@ lines: solving: solver: - name: glpk - options: "glpk-default" + name: highs + options: "highs-default" plotting: diff --git a/config/test/config.myopic.yaml b/config/test/config.myopic.yaml index 2dab7b04..1da51b36 100644 --- a/config/test/config.myopic.yaml +++ b/config/test/config.myopic.yaml @@ -73,8 +73,8 @@ industry: solving: solver: - name: glpk - options: glpk-default + name: highs + options: highs-default mem: 4000 plotting: diff --git a/config/test/config.overnight.yaml b/config/test/config.overnight.yaml index 6d1900cf..dffdab5a 100644 --- a/config/test/config.overnight.yaml +++ b/config/test/config.overnight.yaml @@ -65,8 +65,8 @@ sector: solving: solver: - name: glpk - options: glpk-default + name: highs + options: highs-default mem: 4000 plotting: diff --git a/config/test/config.perfect.yaml b/config/test/config.perfect.yaml index f20a2c9f..8a5a9cce 100644 --- a/config/test/config.perfect.yaml +++ b/config/test/config.perfect.yaml @@ -75,8 +75,8 @@ industry: solving: solver: - name: glpk - options: glpk-default + name: highs + options: highs-default mem: 4000 plotting: diff --git a/doc/release_notes.rst b/doc/release_notes.rst index c20f1ebe..55e0ad97 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -62,6 +62,11 @@ Upcoming Release * To determine the optimal topology to meet the number of clusters, the workflow used pyomo in combination with ``ipopt`` or ``gurobi``. This dependency has been replaced by using ``linopy`` in combination with ``scipopt`` or ``gurobi``. The environment file has been updated accordingly. +* The ``highs`` solver was added to the default environment file. + +* The default solver for testing the workflow in the CI has been changed from ``glpk`` to ``highs``. + + PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/envs/environment.yaml b/envs/environment.yaml index d92eb696..235d7729 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -59,3 +59,4 @@ dependencies: - pip: - tsam>=2.3.1 + - highspy From 718dbbb1c50ba25fb004925e993e517c2e8dc10e Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 09:54:58 +0100 Subject: [PATCH 327/497] CI: integrate inhouse tests into main CI yaml --- .github/workflows/ci-sync.yaml | 97 ---------------------------------- .github/workflows/ci.yaml | 14 ++++- 2 files changed, 13 insertions(+), 98 deletions(-) delete mode 100644 .github/workflows/ci-sync.yaml diff --git a/.github/workflows/ci-sync.yaml b/.github/workflows/ci-sync.yaml deleted file mode 100644 index e5b4006c..00000000 --- a/.github/workflows/ci-sync.yaml +++ /dev/null @@ -1,97 +0,0 @@ -# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: CC0-1.0 - -name: CI - Synced Inhouse Packages - -# Caching method based on and described by: -# epassaro (2021): https://dev.to/epassaro/caching-anaconda-environments-in-github-actions-5hde -# and code in GitHub repo: https://github.com/epassaro/cache-conda-envs - -on: - push: - branches: - - master - pull_request: - branches: - - master - schedule: - - cron: "0 5 * * TUE" - -env: - DATA_CACHE_NUMBER: 2 - -jobs: - build: - - strategy: - fail-fast: false - max-parallel: 1 - - runs-on: ubuntu-latest - - defaults: - run: - shell: bash -l {0} - - steps: - - uses: actions/checkout@v3 - - - name: Setup secrets - run: | - echo -ne "url: ${CDSAPI_URL}\nkey: ${CDSAPI_TOKEN}\n" > ~/.cdsapirc - - - name: Add solver to environment - run: | - echo -e "- glpk\n- ipopt<3.13.3" >> envs/environment.yaml - if: ${{ matrix.os }} == 'windows-latest' - - - name: Add solver to environment - run: | - echo -e "- glpk\n- ipopt" >> envs/environment.yaml - if: ${{ matrix.os }} != 'windows-latest' - - - name: Setup micromamba - uses: mamba-org/setup-micromamba@v1 - with: - micromamba-version: latest - environment-file: envs/environment.yaml - log-level: debug - init-shell: bash - cache-environment: true - cache-downloads: true - - # install inhouse packages from master branch with pip - - name: Install inhouse packages - run: | - pip install git+https://github.com/PyPSA/atlite.git@master git+https://github.com/PyPSA/powerplantmatching.git@master git+https://github.com/PyPSA/linopy.git@master - - - - name: Set cache dates - run: | - echo "WEEK=$(date +'%Y%U')" >> $GITHUB_ENV - - - name: Cache data and cutouts folders - uses: actions/cache@v3 - with: - path: | - data - cutouts - key: data-cutouts-${{ env.WEEK }}-${{ env.DATA_CACHE_NUMBER }} - - - name: Test snakemake workflow - run: | - snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime - - - name: Upload artifacts - uses: actions/upload-artifact@v3 - with: - name: resources-results - path: | - resources - results - if-no-files-found: warn - retention-days: 1 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c0fb745d..172d07ac 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -32,7 +32,14 @@ jobs: - ubuntu-latest - macos-latest - windows-latest - + inhouse: + - stable + - master + exclude: + - os: macos-latest + inhouse: master + - os: windows-latest + inhouse: master runs-on: ${{ matrix.os }} defaults: @@ -66,6 +73,11 @@ jobs: cache-environment: true cache-downloads: true + - name: Install inhouse packages + run: | + pip install git+https://github.com/PyPSA/atlite.git@master git+https://github.com/PyPSA/powerplantmatching.git@master git+https://github.com/PyPSA/linopy.git@master + if: ${{ matrix.inhouse }} == 'master' + - name: Set cache dates run: | echo "WEEK=$(date +'%Y%U')" >> $GITHUB_ENV From c4a634659dc008f9e10095e8787e11064a42ae33 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 09:59:31 +0100 Subject: [PATCH 328/497] CI: correct if statement --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 172d07ac..637a0304 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -76,7 +76,7 @@ jobs: - name: Install inhouse packages run: | pip install git+https://github.com/PyPSA/atlite.git@master git+https://github.com/PyPSA/powerplantmatching.git@master git+https://github.com/PyPSA/linopy.git@master - if: ${{ matrix.inhouse }} == 'master' + if: ${{ matrix.inhouse }} == 'master' - name: Set cache dates run: | From df2296ce3effcb953411892ec6abfc70ea2410e1 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 12:23:35 +0100 Subject: [PATCH 329/497] ci: only upload artefacts for ubuntu and stable --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 637a0304..bba03cd7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -98,7 +98,7 @@ jobs: snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4.3.0 with: name: resources-results path: | @@ -106,3 +106,4 @@ jobs: results if-no-files-found: warn retention-days: 1 + if: matrix.os == 'ubuntu' && matrix.inhouse == 'stable' From bd55e368f7510aacfc234def4af4b525c4b740ab Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 13:04:10 +0100 Subject: [PATCH 330/497] test: revert setting highs as default solver, as not available for macos --- config/test/config.electricity.yaml | 4 ++-- config/test/config.myopic.yaml | 4 ++-- config/test/config.overnight.yaml | 4 ++-- config/test/config.perfect.yaml | 4 ++-- doc/release_notes.rst | 2 -- envs/environment.yaml | 1 + 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/config/test/config.electricity.yaml b/config/test/config.electricity.yaml index ef9bfdc0..b750bf62 100644 --- a/config/test/config.electricity.yaml +++ b/config/test/config.electricity.yaml @@ -69,8 +69,8 @@ lines: solving: solver: - name: highs - options: "highs-default" + name: glpk + options: "glpk-default" plotting: diff --git a/config/test/config.myopic.yaml b/config/test/config.myopic.yaml index 1da51b36..2dab7b04 100644 --- a/config/test/config.myopic.yaml +++ b/config/test/config.myopic.yaml @@ -73,8 +73,8 @@ industry: solving: solver: - name: highs - options: highs-default + name: glpk + options: glpk-default mem: 4000 plotting: diff --git a/config/test/config.overnight.yaml b/config/test/config.overnight.yaml index dffdab5a..6d1900cf 100644 --- a/config/test/config.overnight.yaml +++ b/config/test/config.overnight.yaml @@ -65,8 +65,8 @@ sector: solving: solver: - name: highs - options: highs-default + name: glpk + options: glpk-default mem: 4000 plotting: diff --git a/config/test/config.perfect.yaml b/config/test/config.perfect.yaml index 8a5a9cce..f20a2c9f 100644 --- a/config/test/config.perfect.yaml +++ b/config/test/config.perfect.yaml @@ -75,8 +75,8 @@ industry: solving: solver: - name: highs - options: highs-default + name: glpk + options: glpk-default mem: 4000 plotting: diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 55e0ad97..6fa88738 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -64,8 +64,6 @@ Upcoming Release * The ``highs`` solver was added to the default environment file. -* The default solver for testing the workflow in the CI has been changed from ``glpk`` to ``highs``. - PyPSA-Eur 0.9.0 (5th January 2024) diff --git a/envs/environment.yaml b/envs/environment.yaml index 235d7729..26e18f0d 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -35,6 +35,7 @@ dependencies: - netcdf4 - networkx - scipy +- glpk - shapely>=2.0 - pyscipopt - matplotlib From d32789bd02bc29fafd2f0a411a06ff723b10d182 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 16:53:14 +0100 Subject: [PATCH 331/497] snakefile: allow to share resources in directory ci: use test.sh script which can be executed locally --- .github/workflows/ci.yaml | 6 +----- Snakefile | 7 ++++++- config/test/config.electricity.yaml | 4 ++-- config/test/config.myopic.yaml | 4 ++-- config/test/config.overnight.yaml | 4 ++-- config/test/config.perfect.yaml | 2 +- test.sh | 8 ++++++++ 7 files changed, 22 insertions(+), 13 deletions(-) create mode 100755 test.sh diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4fa9f280..1af8e733 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -81,11 +81,7 @@ jobs: key: data-cutouts-${{ env.WEEK }}-${{ env.DATA_CACHE_NUMBER }} - name: Test snakemake workflow - run: | - snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime - snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime + run: ./test.sh - name: Upload artifacts uses: actions/upload-artifact@v4.3.0 diff --git a/Snakefile b/Snakefile index 14c9e821..8391156c 100644 --- a/Snakefile +++ b/Snakefile @@ -31,7 +31,12 @@ CDIR = RDIR if not run.get("shared_cutouts") else "" LOGS = "logs/" + RDIR BENCHMARKS = "benchmarks/" + RDIR -RESOURCES = "resources/" + RDIR if not run.get("shared_resources") else "resources/" +if not (shared_resources := run.get("shared_resources")): + RESOURCES = "resources/" + RDIR +elif isinstance(shared_resources, str): + RESOURCES = "resources/" + shared_resources + "/" +else: + RESOURCES = "resources/" RESULTS = "results/" + RDIR diff --git a/config/test/config.electricity.yaml b/config/test/config.electricity.yaml index b750bf62..22c8e8d3 100644 --- a/config/test/config.electricity.yaml +++ b/config/test/config.electricity.yaml @@ -8,14 +8,14 @@ tutorial: true run: name: "test-elec" # use this to keep track of runs with different settings disable_progressbar: true - shared_resources: true + shared_resources: "test" shared_cutouts: true scenario: clusters: - 5 opts: - - Co2L-24H + - Co2L-24h countries: ['BE'] diff --git a/config/test/config.myopic.yaml b/config/test/config.myopic.yaml index 2dab7b04..2e7b3e6e 100644 --- a/config/test/config.myopic.yaml +++ b/config/test/config.myopic.yaml @@ -7,7 +7,7 @@ tutorial: true run: name: "test-sector-myopic" disable_progressbar: true - shared_resources: true + shared_resources: "test" shared_cutouts: true foresight: myopic @@ -18,7 +18,7 @@ scenario: clusters: - 5 sector_opts: - - 24H-T-H-B-I-A-dist1 + - 24h-T-H-B-I-A-dist1 planning_horizons: - 2030 - 2040 diff --git a/config/test/config.overnight.yaml b/config/test/config.overnight.yaml index 6d1900cf..8b98fea9 100644 --- a/config/test/config.overnight.yaml +++ b/config/test/config.overnight.yaml @@ -7,7 +7,7 @@ tutorial: true run: name: "test-sector-overnight" disable_progressbar: true - shared_resources: true + shared_resources: "test" shared_cutouts: true @@ -17,7 +17,7 @@ scenario: clusters: - 5 sector_opts: - - CO2L0-24H-T-H-B-I-A-dist1 + - CO2L0-24h-T-H-B-I-A-dist1 planning_horizons: - 2030 diff --git a/config/test/config.perfect.yaml b/config/test/config.perfect.yaml index f20a2c9f..6eb9113e 100644 --- a/config/test/config.perfect.yaml +++ b/config/test/config.perfect.yaml @@ -7,7 +7,7 @@ tutorial: true run: name: "test-sector-perfect" disable_progressbar: true - shared_resources: true + shared_resources: "test" shared_cutouts: true foresight: perfect diff --git a/test.sh b/test.sh new file mode 100755 index 00000000..a40276b8 --- /dev/null +++ b/test.sh @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: : 2021-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime && \ +snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime && \ +snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime && \ +snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime From 0f80e2d089088e0c65f635516cac160954ee27e2 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 17:07:01 +0100 Subject: [PATCH 332/497] plot: fix params and groupby deprecation warning --- rules/postprocess.smk | 3 +++ scripts/plot_power_network.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 59f9ead7..c1dd24c0 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -31,6 +31,7 @@ if config["foresight"] != "perfect": rule plot_power_network: params: plotting=config["plotting"], + foresight=config["foresight"], input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -54,6 +55,7 @@ if config["foresight"] != "perfect": rule plot_hydrogen_network: params: plotting=config["plotting"], + foresight=config["foresight"], input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -77,6 +79,7 @@ if config["foresight"] != "perfect": rule plot_gas_network: params: plotting=config["plotting"], + foresight=config["foresight"], input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/scripts/plot_power_network.py b/scripts/plot_power_network.py index 271e638d..0e13e497 100644 --- a/scripts/plot_power_network.py +++ b/scripts/plot_power_network.py @@ -98,7 +98,7 @@ def plot_map( logger.debug(f"{comp}, {costs}") - costs = costs.groupby(costs.columns, axis=1).sum() + costs = costs.T.groupby(costs.columns).sum().T costs.drop(list(costs.columns[(costs == 0.0).all()]), axis=1, inplace=True) From 46d8ce8f1f8293c127602e9c1a87eb58fcccf1ec Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 17:10:08 +0100 Subject: [PATCH 333/497] address deprecation warnings --- scripts/add_electricity.py | 12 +++++++----- scripts/add_existing_baseyear.py | 2 +- scripts/base_network.py | 8 +++++--- scripts/build_biomass_potentials.py | 6 +++--- scripts/build_gas_network.py | 20 ++++++++------------ scripts/build_line_rating.py | 2 +- scripts/build_population_layouts.py | 3 ++- scripts/build_retro_cost.py | 8 ++++---- scripts/cluster_network.py | 4 +++- scripts/prepare_network.py | 4 ++-- scripts/solve_network.py | 8 ++++---- 11 files changed, 40 insertions(+), 37 deletions(-) diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index c9e5abca..a57edd11 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -327,7 +327,9 @@ def attach_load(n, regions, load, nuts3_shapes, ua_md_gdp, countries, scaling=1. axis=1, ) - n.madd("Load", substation_lv_i, bus=substation_lv_i, p_set=load) + n.madd( + "Load", substation_lv_i, bus=substation_lv_i, p_set=load + ) # carrier="electricity" def update_transmission_costs(n, costs, length_factor=1.0): @@ -504,8 +506,8 @@ def attach_conventional_generators( snakemake.input[f"conventional_{carrier}_{attr}"], index_col=0 ).iloc[:, 0] bus_values = n.buses.country.map(values) - n.generators[attr].update( - n.generators.loc[idx].bus.map(bus_values).dropna() + n.generators.update( + {attr: n.generators.loc[idx].bus.map(bus_values).dropna()} ) else: # Single value affecting all generators of technology k indiscriminantely of country @@ -749,8 +751,8 @@ def attach_OPSD_renewables(n: pypsa.Network, tech_map: Dict[str, List[str]]) -> caps = caps.groupby(["bus"]).Capacity.sum() caps = caps / gens_per_bus.reindex(caps.index, fill_value=1) - n.generators.p_nom.update(gens.bus.map(caps).dropna()) - n.generators.p_nom_min.update(gens.bus.map(caps).dropna()) + n.generators.update({"p_nom": gens.bus.map(caps).dropna()}) + n.generators.update({"p_nom_min": gens.bus.map(caps).dropna()}) def estimate_renewable_capacities( diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 46d4bc31..0235a4d7 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -48,7 +48,7 @@ def add_build_year_to_new_assets(n, baseyear): "series" ) & n.component_attrs[c.name].status.str.contains("Input") for attr in n.component_attrs[c.name].index[selection]: - c.pnl[attr].rename(columns=rename, inplace=True) + c.pnl[attr] = c.pnl[attr].rename(columns=rename) def add_existing_renewables(df_agg): diff --git a/scripts/base_network.py b/scripts/base_network.py index 2fa31f98..1de3ef96 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -138,7 +138,9 @@ def _load_buses_from_eg(eg_buses, europe_shape, config_elec): ) buses["carrier"] = buses.pop("dc").map({True: "DC", False: "AC"}) - buses["under_construction"] = buses["under_construction"].fillna(False).astype(bool) + buses["under_construction"] = buses.under_construction.where( + lambda s: s.notnull(), False + ).astype(bool) # remove all buses outside of all countries including exclusive economic zones (offshore) europe_shape = gpd.read_file(europe_shape).loc[0, "geometry"] @@ -525,9 +527,9 @@ def _set_countries_and_substations(n, config, country_shapes, offshore_shapes): gb = buses.loc[substation_b].groupby( ["x", "y"], as_index=False, group_keys=False, sort=False ) - bus_map_low = gb.apply(prefer_voltage, "min") + bus_map_low = gb.apply(prefer_voltage, "min", include_groups=False) lv_b = (bus_map_low == bus_map_low.index).reindex(buses.index, fill_value=False) - bus_map_high = gb.apply(prefer_voltage, "max") + bus_map_high = gb.apply(prefer_voltage, "max", include_groups=False) hv_b = (bus_map_high == bus_map_high.index).reindex(buses.index, fill_value=False) onshore_b = pd.Series(False, buses.index) diff --git a/scripts/build_biomass_potentials.py b/scripts/build_biomass_potentials.py index b6cbbfbf..6b5cb147 100644 --- a/scripts/build_biomass_potentials.py +++ b/scripts/build_biomass_potentials.py @@ -132,14 +132,14 @@ def disaggregate_nuts0(bio): pop = build_nuts_population_data() # get population in nuts2 - pop_nuts2 = pop.loc[pop.index.str.len() == 4] + pop_nuts2 = pop.loc[pop.index.str.len() == 4].copy() by_country = pop_nuts2.total.groupby(pop_nuts2.ct).sum() - pop_nuts2.loc[:, "fraction"] = pop_nuts2.total / pop_nuts2.ct.map(by_country) + pop_nuts2["fraction"] = pop_nuts2.total / pop_nuts2.ct.map(by_country) # distribute nuts0 data to nuts2 by population bio_nodal = bio.loc[pop_nuts2.ct] bio_nodal.index = pop_nuts2.index - bio_nodal = bio_nodal.mul(pop_nuts2.fraction, axis=0) + bio_nodal = bio_nodal.mul(pop_nuts2.fraction, axis=0).astype(float) # update inplace bio.update(bio_nodal) diff --git a/scripts/build_gas_network.py b/scripts/build_gas_network.py index 8df7744d..13cd75ba 100644 --- a/scripts/build_gas_network.py +++ b/scripts/build_gas_network.py @@ -114,12 +114,10 @@ def prepare_dataset( df["p_nom_diameter"] = df.diameter_mm.apply(diameter_to_capacity) ratio = df.p_nom / df.p_nom_diameter not_nordstream = df.max_pressure_bar < 220 - df.p_nom.update( - df.p_nom_diameter.where( - (df.p_nom <= 500) - | ((ratio > correction_threshold_p_nom) & not_nordstream) - | ((ratio < 1 / correction_threshold_p_nom) & not_nordstream) - ) + df["p_nom"] = df.p_nom_diameter.where( + (df.p_nom <= 500) + | ((ratio > correction_threshold_p_nom) & not_nordstream) + | ((ratio < 1 / correction_threshold_p_nom) & not_nordstream) ) # lines which have way too discrepant line lengths @@ -130,12 +128,10 @@ def prepare_dataset( axis=1, ) ratio = df.eval("length / length_haversine") - df["length"].update( - df.length_haversine.where( - (df["length"] < 20) - | (ratio > correction_threshold_length) - | (ratio < 1 / correction_threshold_length) - ) + df["length"] = df.length_haversine.where( + (df["length"] < 20) + | (ratio > correction_threshold_length) + | (ratio < 1 / correction_threshold_length) ) return df diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py index 5b4cd6b3..522f08cf 100755 --- a/scripts/build_line_rating.py +++ b/scripts/build_line_rating.py @@ -98,7 +98,7 @@ def calculate_line_rating(n, cutout): ------- xarray DataArray object with maximal power. """ - relevant_lines = n.lines[~n.lines["underground"]] + relevant_lines = n.lines[~n.lines["underground"]].copy() buses = relevant_lines[["bus0", "bus1"]].values x = n.buses.x y = n.buses.y diff --git a/scripts/build_population_layouts.py b/scripts/build_population_layouts.py index e215e6c0..cb63c27e 100644 --- a/scripts/build_population_layouts.py +++ b/scripts/build_population_layouts.py @@ -83,7 +83,8 @@ if __name__ == "__main__": # correct for imprecision of Iinv*I pop_ct = nuts3.loc[nuts3.country == ct, "pop"].sum() - pop_cells_ct *= pop_ct / pop_cells_ct.sum() + if pop_cells_ct.sum() != 0: + pop_cells_ct *= pop_ct / pop_cells_ct.sum() # The first low density grid cells to reach rural fraction are rural asc_density_i = density_cells_ct.sort_values().index diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index bd285e18..60d74afa 100755 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -297,8 +297,8 @@ def prepare_building_stock_data(): errors="ignore", ) - u_values.subsector.replace(rename_sectors, inplace=True) - u_values.btype.replace(rename_sectors, inplace=True) + u_values["subsector"] = u_values.subsector.replace(rename_sectors) + u_values["btype"] = u_values.btype.replace(rename_sectors) # for missing weighting of surfaces of building types assume MFH u_values["assumed_subsector"] = u_values.subsector @@ -306,8 +306,8 @@ def prepare_building_stock_data(): ~u_values.subsector.isin(rename_sectors.values()), "assumed_subsector" ] = "MFH" - u_values.country_code.replace({"UK": "GB"}, inplace=True) - u_values.bage.replace({"Berfore 1945": "Before 1945"}, inplace=True) + u_values["country_code"] = u_values.country_code.replace({"UK": "GB"}) + u_values["bage"] = u_values.bage.replace({"Berfore 1945": "Before 1945"}) u_values = u_values[~u_values.bage.isna()] u_values.set_index(["country_code", "subsector", "bage", "type"], inplace=True) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 39b6ad96..34a138cd 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -488,7 +488,9 @@ if __name__ == "__main__": gens.efficiency, bins=[0, low, high, 1], labels=labels ).astype(str) carriers += [f"{c} {label} efficiency" for label in labels] - n.generators.carrier.update(gens.carrier + " " + suffix + " efficiency") + n.generators.update( + {"carrier": gens.carrier + " " + suffix + " efficiency"} + ) aggregate_carriers = carriers if n_clusters == len(n.buses): diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 5652dc6e..e358c05e 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -269,8 +269,8 @@ def set_line_nom_max( hvdc = n.links.index[n.links.carrier == "DC"] n.links.loc[hvdc, "p_nom_max"] = n.links.loc[hvdc, "p_nom"] + p_nom_max_ext - n.lines.s_nom_max.clip(upper=s_nom_max_set, inplace=True) - n.links.p_nom_max.clip(upper=p_nom_max_set, inplace=True) + n.lines["s_nom_max"] = n.lines.s_nom_max.clip(upper=s_nom_max_set) + n.links["p_nom_max"] = n.links.p_nom_max.clip(upper=p_nom_max_set) if __name__ == "__main__": diff --git a/scripts/solve_network.py b/scripts/solve_network.py index a1d790a7..551222c0 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -418,7 +418,7 @@ def add_CCL_constraints(n, config): Example ------- scenario: - opts: [Co2L-CCL-24H] + opts: [Co2L-CCL-24h] electricity: agg_p_nom_limits: data/agg_p_nom_minmax.csv """ @@ -463,7 +463,7 @@ def add_EQ_constraints(n, o, scaling=1e-1): Example ------- scenario: - opts: [Co2L-EQ0.7-24H] + opts: [Co2L-EQ0.7-24h] Require each country or node to on average produce a minimal share of its total electricity consumption itself. Example: EQ0.7c demands each country @@ -527,7 +527,7 @@ def add_BAU_constraints(n, config): Example ------- scenario: - opts: [Co2L-BAU-24H] + opts: [Co2L-BAU-24h] electricity: BAU_mincapacities: solar: 0 @@ -564,7 +564,7 @@ def add_SAFE_constraints(n, config): config.yaml requires to specify opts: scenario: - opts: [Co2L-SAFE-24H] + opts: [Co2L-SAFE-24h] electricity: SAFE_reservemargin: 0.1 Which sets a reserve margin of 10% above the peak demand. From c60e1c5b73ac23dc7d53ad88be3e30cab3924e1b Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 31 Jan 2024 17:12:36 +0100 Subject: [PATCH 334/497] update release notes --- doc/release_notes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 6fa88738..44ccdff5 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -64,6 +64,9 @@ Upcoming Release * The ``highs`` solver was added to the default environment file. +* It is now possible to determine the directory for shared resources by setting `shared_resources` to a string. + +* A ``test.sh`` script was added to the repository to run the tests locally. PyPSA-Eur 0.9.0 (5th January 2024) From 550e6f07940399b3c4ee6ee3cf0c274981d4aecf Mon Sep 17 00:00:00 2001 From: JulianGeis Date: Thu, 1 Feb 2024 14:23:04 +0100 Subject: [PATCH 335/497] deleted code to include kernnetz as it is no longer needed --- scripts/prepare_sector_network.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 42def055..03cba48b 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1319,22 +1319,6 @@ def add_storage_and_grids(n, costs): n, "H2 pipeline ", carriers=["DC", "gas pipeline"] ) - h2_pipes["p_nom"] = 0.0 - - if snakemake.input.get("custom_h2_pipelines"): - fn = snakemake.input.custom_h2_pipelines - custom_pipes = pd.read_csv(fn, index_col=0) - - h2_pipes = pd.concat([h2_pipes, custom_pipes]) - - # drop duplicates according to buses (order can be different) and keep pipe with highest p_nom - h2_pipes["buses_sorted"] = h2_pipes[["bus0", "bus1"]].apply(sorted, axis=1) - h2_pipes = ( - h2_pipes.sort_values("p_nom") - .drop_duplicates(subset=["buses_sorted"], keep="last") - .drop(columns="buses_sorted") - ) - # TODO Add efficiency losses n.madd( "Link", @@ -1343,7 +1327,6 @@ def add_storage_and_grids(n, costs): bus1=h2_pipes.bus1.values + " H2", p_min_pu=-1, p_nom_extendable=True, - p_nom_min=h2_pipes.p_nom.values, length=h2_pipes.length.values, capital_cost=costs.at["H2 (g) pipeline", "fixed"] * h2_pipes.length.values, carrier="H2 pipeline", From 4c0491341cd1242e0295e1e3ac47e403c934719b Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 31 Jan 2024 12:45:45 +0000 Subject: [PATCH 336/497] 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 337/497] 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 338/497] 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 339/497] 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 340/497] 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) From cc77456195b5264db4b8a823499b83d180b4a88e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 2 Feb 2024 10:11:59 +0100 Subject: [PATCH 341/497] env: add pre-commit --- envs/environment.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/envs/environment.yaml b/envs/environment.yaml index 26e18f0d..88e394fa 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -48,6 +48,7 @@ dependencies: - tabula-py - pyxlsb - graphviz +- pre-commit # Keep in conda environment when calling ipython - ipython From 6d40ff1340898bc2b5b61c5630cebe9ae72f9b0a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 2 Feb 2024 11:52:01 +0100 Subject: [PATCH 342/497] config: add sensible defaults for HVC recycling and reuse --- config/config.default.yaml | 31 ++++++++++++++++++++++++++++--- doc/release_notes.rst | 6 ++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 51080862..5afc6f8e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -606,9 +606,34 @@ industry: MWh_NH3_per_MWh_H2_cracker: 1.46 # https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv NH3_process_emissions: 24.5 petrochemical_process_emissions: 25.5 - HVC_primary_fraction: 1. - HVC_mechanical_recycling_fraction: 0. - HVC_chemical_recycling_fraction: 0. + #HVC primary/recycling based on values used in Neumann et al https://doi.org/10.1016/j.joule.2023.06.016, linearly interpolated between 2020 and 2050 + #2020 recycling rates based on Agora https://static.agora-energiewende.de/fileadmin/Projekte/2021/2021_02_EU_CEAP/A-EW_254_Mobilising-circular-economy_study_WEB.pdf + #fractions refer to the total primary HVC production in 2020 + #assumes 6.7 Mtplastics produced from recycling in 2020 + HVC_primary_fraction: + 2020: 1.0 + 2025: 0.9 + 2030: 0.8 + 2035: 0.7 + 2040: 0.6 + 2045: 0.5 + 2050: 0.4 + HVC_mechanical_recycling_fraction: + 2020: 0.12 + 2025: 0.15 + 2030: 0.18 + 2035: 0.21 + 2040: 0.24 + 2045: 0.27 + 2050: 0.30 + HVC_chemical_recycling_fraction: + 2020: 0.0 + 2025: 0.0 + 2030: 0.04 + 2035: 0.08 + 2040: 0.12 + 2045: 0.16 + 2050: 0.20 HVC_production_today: 52. MWh_elec_per_tHVC_mechanical_recycling: 0.547 MWh_elec_per_tHVC_chemical_recycling: 6.9 diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 6fa88738..a3331748 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -64,6 +64,12 @@ Upcoming Release * The ``highs`` solver was added to the default environment file. +* Default settings for recycling rates and primary product shares of high-value + chemicals have been set in accordance with the values used in `Neumann et al. + (2023) `_ linearly interpolated + between 2020 and 2050. The recycling rates are based on data from `Agora + Energiewende (2021) + `_. PyPSA-Eur 0.9.0 (5th January 2024) From 0006f6e5a90b548d80cc448711edab145470917e Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Fri, 2 Feb 2024 12:19:08 +0000 Subject: [PATCH 343/497] Fix gas input for existing heat gas boilers --- scripts/add_existing_baseyear.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 46d4bc31..ca11a747 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -482,7 +482,7 @@ def add_heating_capacities_installed_before_baseyear( "Link", nodes, suffix=f" {name} gas boiler-{grouping_year}", - bus0=spatial.gas.nodes, + bus0="EU gas" if "EU gas" in spatial.gas.nodes else nodes + " gas", bus1=nodes + " " + name + " heat", bus2="co2 atmosphere", carrier=name + " gas boiler", From 344989d76b4f81bea5e3c1555021a767d3b3bd9b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 5 Feb 2024 08:21:26 +0100 Subject: [PATCH 344/497] Apply suggestions from code review --- rules/postprocess.smk | 3 --- 1 file changed, 3 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index c1dd24c0..59f9ead7 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -31,7 +31,6 @@ if config["foresight"] != "perfect": rule plot_power_network: params: plotting=config["plotting"], - foresight=config["foresight"], input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -55,7 +54,6 @@ if config["foresight"] != "perfect": rule plot_hydrogen_network: params: plotting=config["plotting"], - foresight=config["foresight"], input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -79,7 +77,6 @@ if config["foresight"] != "perfect": rule plot_gas_network: params: plotting=config["plotting"], - foresight=config["foresight"], input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", From e76749ab31e543733a671c37968c548f3386037a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 5 Feb 2024 08:37:19 +0100 Subject: [PATCH 345/497] plot_hydrogen_network: add foresight params back in --- rules/postprocess.smk | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 59f9ead7..3045d0da 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -54,6 +54,7 @@ if config["foresight"] != "perfect": rule plot_hydrogen_network: params: plotting=config["plotting"], + foresight=config["foresight"], input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", From a834ff222acac9175b66285077b35baf7ceeb037 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 5 Feb 2024 12:10:35 +0100 Subject: [PATCH 346/497] streamline code for year-dependent technologies (turbines/panels) --- config/config.default.yaml | 17 ++---- doc/configtables/offwind-ac.csv | 2 +- doc/configtables/offwind-dc.csv | 2 +- doc/configtables/onwind.csv | 2 +- doc/configtables/solar.csv | 2 +- doc/release_notes.rst | 6 ++ rules/build_electricity.smk | 1 - rules/solve_myopic.smk | 3 + scripts/add_brownfield.py | 73 ++++++++-------------- scripts/add_electricity.py | 4 ++ scripts/build_renewable_profiles.py | 95 ++++++++++++----------------- scripts/prepare_sector_network.py | 5 ++ 12 files changed, 90 insertions(+), 122 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index bdbc046e..bc420b36 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -164,14 +164,11 @@ atlite: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#renewable renewable: - year: 2020 onwind: cutout: europe-2013-era5 resource: method: wind - turbine: - 2020: Vestas_V112_3MW - 2030: NREL_ReferenceTurbine_2020ATB_5.5MW + turbine: Vestas_V112_3MW add_cutout_windspeed: true capacity_per_sqkm: 3 # correction_factor: 0.93 @@ -190,9 +187,7 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: - 2020: NREL_ReferenceTurbine_5MW_offshore.yaml - 2030: NREL_ReferenceTurbine_2020ATB_15MW_offshore + turbine: NREL_ReferenceTurbine_5MW_offshore add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 @@ -208,10 +203,7 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: - 2020: Vestas_V164_7MW_offshore - 2025: NREL_ReferenceTurbine_2020ATB_15MW_offshore - 2030: NREL_ReferenceTurbine_2020ATB_18MW_offshore + turbine: Vestas_V164_7MW_offshore add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 @@ -227,8 +219,7 @@ renewable: cutout: europe-2013-sarah resource: method: pv - panel: - 2020: CSi + panel: CSi orientation: slope: 35. azimuth: 180. diff --git a/doc/configtables/offwind-ac.csv b/doc/configtables/offwind-ac.csv index 9dc0614c..b2533f04 100644 --- a/doc/configtables/offwind-ac.csv +++ b/doc/configtables/offwind-ac.csv @@ -2,7 +2,7 @@ cutout,--,"Should be a folder listed in the configuration ``atlite: cutouts:`` (e.g. 'europe-2013-era5') or reference an existing folder in the directory ``cutouts``. Source module must be ERA5.","Specifies the directory where the relevant weather data ist stored." resource,,, -- method,--,"Must be 'wind'","A superordinate technology type." --- turbine,--,"One of turbine types included in `atlite `_","Specifies the turbine type and its characteristic power curve." +-- turbine,--,"One of turbine types included in `atlite `_. Can be a string or a dictionary with years as keys which denote the year another turbine model becomes available.","Specifies the turbine type and its characteristic power curve." capacity_per_sqkm,:math:`MW/km^2`,float,"Allowable density of wind turbine placement." correction_factor,--,float,"Correction factor for capacity factor time series." excluder_resolution,m,float,"Resolution on which to perform geographical elibility analysis." diff --git a/doc/configtables/offwind-dc.csv b/doc/configtables/offwind-dc.csv index c947f358..7c537543 100644 --- a/doc/configtables/offwind-dc.csv +++ b/doc/configtables/offwind-dc.csv @@ -2,7 +2,7 @@ cutout,--,"Should be a folder listed in the configuration ``atlite: cutouts:`` (e.g. 'europe-2013-era5') or reference an existing folder in the directory ``cutouts``. Source module must be ERA5.","Specifies the directory where the relevant weather data ist stored." resource,,, -- method,--,"Must be 'wind'","A superordinate technology type." --- turbine,--,"One of turbine types included in `atlite `__","Specifies the turbine type and its characteristic power curve." +-- turbine,--,"One of turbine types included in `atlite `_. Can be a string or a dictionary with years as keys which denote the year another turbine model becomes available.","Specifies the turbine type and its characteristic power curve." capacity_per_sqkm,:math:`MW/km^2`,float,"Allowable density of wind turbine placement." correction_factor,--,float,"Correction factor for capacity factor time series." excluder_resolution,m,float,"Resolution on which to perform geographical elibility analysis." diff --git a/doc/configtables/onwind.csv b/doc/configtables/onwind.csv index f6b36e5d..3b09214b 100644 --- a/doc/configtables/onwind.csv +++ b/doc/configtables/onwind.csv @@ -2,7 +2,7 @@ cutout,--,"Should be a folder listed in the configuration ``atlite: cutouts:`` (e.g. 'europe-2013-era5') or reference an existing folder in the directory ``cutouts``. Source module must be ERA5.","Specifies the directory where the relevant weather data ist stored." resource,,, -- method,--,"Must be 'wind'","A superordinate technology type." --- turbine,--,"One of turbine types included in `atlite `__","Specifies the turbine type and its characteristic power curve." +-- turbine,--,"One of turbine types included in `atlite `_. Can be a string or a dictionary with years as keys which denote the year another turbine model becomes available.","Specifies the turbine type and its characteristic power curve." capacity_per_sqkm,:math:`MW/km^2`,float,"Allowable density of wind turbine placement." corine,,, -- grid_codes,--,"Any subset of the `CORINE Land Cover code list `_","Specifies areas according to CORINE Land Cover codes which are generally eligible for wind turbine placement." diff --git a/doc/configtables/solar.csv b/doc/configtables/solar.csv index 8328d342..18587694 100644 --- a/doc/configtables/solar.csv +++ b/doc/configtables/solar.csv @@ -2,7 +2,7 @@ cutout,--,"Should be a folder listed in the configuration ``atlite: cutouts:`` (e.g. 'europe-2013-era5') or reference an existing folder in the directory ``cutouts``. Source module can be ERA5 or SARAH-2.","Specifies the directory where the relevant weather data ist stored that is specified at ``atlite/cutouts`` configuration. Both ``sarah`` and ``era5`` work." resource,,, -- method,--,"Must be 'pv'","A superordinate technology type." --- panel,--,"One of {'Csi', 'CdTe', 'KANENA'} as defined in `atlite `__","Specifies the solar panel technology and its characteristic attributes." +-- panel,--,"One of {'Csi', 'CdTe', 'KANENA'} as defined in `atlite `_ . Can be a string or a dictionary with years as keys which denote the year another turbine model becomes available.","Specifies the solar panel technology and its characteristic attributes." -- orientation,,, -- -- slope,°,"Realistically any angle in [0., 90.]","Specifies the tilt angle (or slope) of the solar panel. A slope of zero corresponds to the face of the panel aiming directly overhead. A positive tilt angle steers the panel towards the equator." -- -- azimuth,°,"Any angle in [0., 360.]","Specifies the `azimuth `_ orientation of the solar panel. South corresponds to 180.°." diff --git a/doc/release_notes.rst b/doc/release_notes.rst index a3331748..6bf78fcd 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -71,6 +71,12 @@ Upcoming Release Energiewende (2021) `_. +* Added option to specify turbine and solar panel models for specific years as a + dictionary (e.g. ``renewable: onwind: resource: turbine:``). The years will be + interpreted as years from when the the corresponding turbine model substitutes + the previous model for new installations. This will only have an effect on + workflows with foresight "myopic" and still needs to be added foresight option + "perfect". PyPSA-Eur 0.9.0 (5th January 2024) ================================== diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 5846dd9d..6b092638 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -261,7 +261,6 @@ rule build_renewable_profiles: params: snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, renewable=config["renewable"], - foresight=config["foresight"], input: **opt, base_network=RESOURCES + "networks/base.nc", diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index a5f2b12b..49df9d1e 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -85,10 +85,13 @@ rule add_brownfield: 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"], + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, + carriers=config["electricity"]["renewable_carriers"], input: **{ f"profile_{tech}": RESOURCES + f"profile_{tech}.nc" for tech in config["electricity"]["renewable_carriers"] + if tech != "hydro" }, simplify_busmap=RESOURCES + "busmap_elec_s{simpl}.csv", cluster_busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 912b01ae..3b77c437 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -145,78 +145,53 @@ def disable_grid_expansion_if_LV_limit_hit(n): n.global_constraints.drop("lv_limit", inplace=True) -def adjust_renewable_profiles(n, input_profiles, config, year): +def adjust_renewable_profiles(n, input_profiles, params, year): """ - Adjusts renewable profiles according to the renewable technology specified. - - If the planning horizon is not available, the closest year is used - instead. + Adjusts renewable profiles according to the renewable technology specified, + using the latest year below or equal to the selected year. """ + # spatial clustering cluster_busmap = pd.read_csv(snakemake.input.cluster_busmap, index_col=0).squeeze() simplify_busmap = pd.read_csv( snakemake.input.simplify_busmap, index_col=0 ).squeeze() clustermaps = simplify_busmap.map(cluster_busmap) clustermaps.index = clustermaps.index.astype(str) - dr = pd.date_range(**config["snapshots"], freq="H") + + # temporal clustering + dr = pd.date_range(**params["snapshots"], freq="h") snapshotmaps = ( pd.Series(dr, index=dr).where(lambda x: x.isin(n.snapshots), pd.NA).ffill() ) - for carrier in config["electricity"]["renewable_carriers"]: - if carrier == "hydro": - continue - - clustermaps.index = clustermaps.index.astype(str) - dr = pd.date_range(**config["snapshots"], freq="H") - snapshotmaps = ( - pd.Series(dr, index=dr).where(lambda x: x.isin(n.snapshots), pd.NA).ffill() - ) - for carrier in config["electricity"]["renewable_carriers"]: + for carrier in params["carriers"]: if carrier == "hydro": continue with xr.open_dataset(getattr(input_profiles, "profile_" + carrier)) as ds: if ds.indexes["bus"].empty or "year" not in ds.indexes: continue - if year in ds.indexes["year"]: - p_max_pu = ( - ds["year_profiles"] - .sel(year=year) - .transpose("time", "bus") - .to_pandas() - ) - else: - available_previous_years = [ - available_year - for available_year in ds.indexes["year"] - if available_year < year - ] - available_following_years = [ - available_year - for available_year in ds.indexes["year"] - if available_year > year - ] - if available_previous_years: - closest_year = max(available_previous_years) - if available_following_years: - closest_year = min(available_following_years) - logging.warning( - f"Planning horizon {year} not in {carrier} profiles. Using closest year {closest_year} instead." - ) - p_max_pu = ( - ds["year_profiles"] - .sel(year=closest_year) - .transpose("time", "bus") - .to_pandas() - ) + + closest_year = max( + (y for y in ds.year.values if y <= year), default=min(ds.year.values) + ) + + p_max_pu = ( + ds["profile"] + .sel(year=closest_year) + .transpose("time", "bus") + .to_pandas() + ) + # spatial clustering - weight = ds["weight"].to_pandas() + weight = ds["weight"].sel(year=closest_year).to_pandas() weight = weight.groupby(clustermaps).transform(normed_or_uniform) p_max_pu = (p_max_pu * weight).T.groupby(clustermaps).sum().T p_max_pu.columns = p_max_pu.columns + f" {carrier}" + # temporal_clustering p_max_pu = p_max_pu.groupby(snapshotmaps).mean() + # replace renewable time series n.generators_t.p_max_pu.loc[:, p_max_pu.columns] = p_max_pu @@ -245,7 +220,7 @@ if __name__ == "__main__": n = pypsa.Network(snakemake.input.network) - adjust_renewable_profiles(n, snakemake.input, snakemake.config, year) + adjust_renewable_profiles(n, snakemake.input, snakemake.params, year) add_build_year_to_new_assets(n, year) diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index c9e5abca..431f1cfa 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -374,6 +374,10 @@ def attach_wind_and_solar( if ds.indexes["bus"].empty: continue + # if-statement for compatibility with old profiles + if "year" in ds.indexes: + ds = ds.sel(year=ds.year.min(), drop=True) + supcar = car.split("-", 2)[0] if supcar == "offwind": underwater_fraction = ds["underwater_fraction"].to_pandas() diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 66c888e6..99b177a8 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -200,24 +200,20 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_renewable_profiles", technology="onwind") + snakemake = mock_snakemake("build_renewable_profiles", technology="offwind-dc") configure_logging(snakemake) nprocesses = int(snakemake.threads) noprogress = snakemake.config["run"].get("disable_progressbar", True) noprogress = noprogress or not snakemake.config["atlite"]["show_progress"] - year = snakemake.params.renewable["year"] - foresight = snakemake.params.foresight params = snakemake.params.renewable[snakemake.wildcards.technology] resource = params["resource"] # pv panel params / wind turbine params - year_dependent_techs = { - k: resource.get(k) - for k in ["panel", "turbine"] - if isinstance(resource.get(k), dict) - } - for key, techs in year_dependent_techs.items(): - resource[key] = resource[key][year] + tech = next(t for t in ["panel", "turbine"] if t in resource) + models = resource[tech] + if not isinstance(models, dict): + models = {0: models} + resource[tech] = models[next(iter(models))] correction_factor = params.get("correction_factor", 1.0) capacity_per_sqkm = params["capacity_per_sqkm"] @@ -334,45 +330,40 @@ if __name__ == "__main__": duration = time.time() - start logger.info(f"Completed average capacity factor calculation ({duration:2.2f}s)") - logger.info("Calculate weighted capacity factor time series...") - start = time.time() + profiles = [] + capacities = [] + for year, model in models.items(): - profile, capacities = func( - matrix=availability.stack(spatial=["y", "x"]), - layout=layout, - index=buses, - per_unit=True, - return_capacity=True, - **resource, - ) + logger.info( + f"Calculate weighted capacity factor time series for model {model}..." + ) + start = time.time() - if year_dependent_techs and foresight != "overnight": - for key, techs in year_dependent_techs.items(): - year_profiles = list() - tech_profiles = dict() - tech_profiles[resource[key]] = profile - for year, tech in techs.items(): - resource[key] = tech - if tech not in tech_profiles: - tech_profiles[tech] = func( - matrix=availability.stack(spatial=["y", "x"]), - layout=layout, - index=buses, - per_unit=True, - return_capacity=False, - **resource, - ) - year_profile = tech_profiles[tech] - year_profile = year_profile.expand_dims({"year": [year]}).rename( - "year_profiles" - ) - year_profiles.append(year_profile) - year_profiles = xr.merge(year_profiles) + resource[tech] = model - duration = time.time() - start - logger.info( - f"Completed weighted capacity factor time series calculation ({duration:2.2f}s)" - ) + profile, capacity = func( + matrix=availability.stack(spatial=["y", "x"]), + layout=layout, + index=buses, + per_unit=True, + return_capacity=True, + **resource, + ) + + dim = {"year": [year]} + profile = profile.expand_dims(dim) + capacity = capacity.expand_dims(dim) + + profiles.append(profile.rename("profile")) + capacities.append(capacity.rename("weight")) + + duration = time.time() - start + logger.info( + f"Completed weighted capacity factor time series calculation for model {model} ({duration:2.2f}s)" + ) + + profiles = xr.merge(profiles) + capacities = xr.merge(capacities) logger.info("Calculating maximal capacity per bus") p_nom_max = capacity_per_sqkm * availability @ area @@ -399,17 +390,14 @@ if __name__ == "__main__": ds = xr.merge( [ - (correction_factor * profile).rename("profile"), - capacities.rename("weight"), + correction_factor * profiles, + capacities, p_nom_max.rename("p_nom_max"), potential.rename("potential"), average_distance.rename("average_distance"), ] ) - if year_dependent_techs: - ds = xr.merge([ds, year_profiles * correction_factor]) - if snakemake.wildcards.technology.startswith("offwind"): logger.info("Calculate underwater fraction of connections.") offshore_shape = gpd.read_file(snakemake.input["offshore_shapes"]).unary_union @@ -425,7 +413,7 @@ if __name__ == "__main__": # select only buses with some capacity and minimal capacity factor ds = ds.sel( bus=( - (ds["profile"].mean("time") > params.get("min_p_max_pu", 0.0)) + (ds["profile"].mean("time").max("year") > params.get("min_p_max_pu", 0.0)) & (ds["p_nom_max"] > params.get("min_p_nom_max", 0.0)) ) ) @@ -433,9 +421,6 @@ if __name__ == "__main__": if "clip_p_max_pu" in params: min_p_max_pu = params["clip_p_max_pu"] ds["profile"] = ds["profile"].where(ds["profile"] >= min_p_max_pu, 0) - ds["year_profiles"] = ds["year_profiles"].where( - ds["year_profiles"] >= min_p_max_pu, 0 - ) ds.to_netcdf(snakemake.output.profile) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 03cba48b..59184b79 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -421,6 +421,11 @@ def update_wind_solar_costs(n, costs): tech = "offwind-" + connection profile = snakemake.input["profile_offwind_" + connection] with xr.open_dataset(profile) as ds: + + # if-statement for compatibility with old profiles + if "year" in ds.indexes: + ds = ds.sel(year=ds.year.min(), drop=True) + underwater_fraction = ds["underwater_fraction"].to_pandas() connection_cost = ( snakemake.params.length_factor From 76872fa0f1547bc0b7de9592ce5c77060959c687 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 5 Feb 2024 16:16:34 +0100 Subject: [PATCH 347/497] add sanitize_locations function and apply it address some deprecation warnings --- config/test/config.perfect.yaml | 2 +- scripts/add_electricity.py | 9 +++++++++ scripts/add_extra_components.py | 8 ++++---- scripts/make_summary.py | 12 +++++++++--- scripts/make_summary_perfect.py | 24 ++++++++++++++++-------- scripts/plot_hydrogen_network.py | 4 +++- scripts/prepare_perfect_foresight.py | 2 +- scripts/prepare_sector_network.py | 16 ++++++++++++++-- 8 files changed, 57 insertions(+), 20 deletions(-) diff --git a/config/test/config.perfect.yaml b/config/test/config.perfect.yaml index 6eb9113e..2e716066 100644 --- a/config/test/config.perfect.yaml +++ b/config/test/config.perfect.yaml @@ -18,7 +18,7 @@ scenario: clusters: - 5 sector_opts: - - 8760H-T-H-B-I-A-dist1 + - 8760h-T-H-B-I-A-dist1 planning_horizons: - 2030 - 2040 diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 6c63abda..d67e2fa2 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -178,6 +178,15 @@ def sanitize_carriers(n, config): n.carriers["color"] = n.carriers.color.where(n.carriers.color != "", colors) +def sanitize_locations(n): + n.buses["x"] = n.buses.x.where(n.buses.x != 0, n.buses.location.map(n.buses.x)) + n.buses["y"] = n.buses.y.where(n.buses.y != 0, n.buses.location.map(n.buses.y)) + n.buses["country"] = n.buses.country.where( + n.buses.country.ne("") & n.buses.country.notnull(), + n.buses.location.map(n.buses.country), + ) + + def add_co2_emissions(n, costs, carriers): """ Add CO2 emissions to the network's carriers attribute. diff --git a/scripts/add_extra_components.py b/scripts/add_extra_components.py index e00e1e5f..731e36be 100644 --- a/scripts/add_extra_components.py +++ b/scripts/add_extra_components.py @@ -56,7 +56,7 @@ import numpy as np import pandas as pd import pypsa from _helpers import configure_logging -from add_electricity import load_costs, sanitize_carriers +from add_electricity import load_costs, sanitize_carriers, sanitize_locations idx = pd.IndexSlice @@ -100,10 +100,9 @@ def attach_stores(n, costs, extendable_carriers): n.madd("Carrier", carriers) buses_i = n.buses.index - bus_sub_dict = {k: n.buses[k].values for k in ["x", "y", "country"]} if "H2" in carriers: - h2_buses_i = n.madd("Bus", buses_i + " H2", carrier="H2", **bus_sub_dict) + h2_buses_i = n.madd("Bus", buses_i + " H2", carrier="H2", location=buses_i) n.madd( "Store", @@ -143,7 +142,7 @@ def attach_stores(n, costs, extendable_carriers): if "battery" in carriers: b_buses_i = n.madd( - "Bus", buses_i + " battery", carrier="battery", **bus_sub_dict + "Bus", buses_i + " battery", carrier="battery", location=buses_i ) n.madd( @@ -246,6 +245,7 @@ if __name__ == "__main__": attach_hydrogen_pipelines(n, costs, extendable_carriers) sanitize_carriers(n, snakemake.config) + sanitize_locations(n) n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) n.export_to_netcdf(snakemake.output[0]) diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 0fab5367..76d8099c 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -507,7 +507,7 @@ def calculate_weighted_prices(n, label, weighted_prices): if carrier in ["H2", "gas"]: load = pd.DataFrame(index=n.snapshots, columns=buses, data=0.0) else: - load = n.loads_t.p_set[buses] + load = n.loads_t.p_set[buses.intersection(n.loads.index)] for tech in value: names = n.links.index[n.links.index.to_series().str[-len(tech) :] == tech] @@ -560,7 +560,10 @@ def calculate_market_values(n, label, market_values): ) revenue = dispatch * n.buses_t.marginal_price[buses] - market_values.at[tech, label] = revenue.sum().sum() / dispatch.sum().sum() + if total_dispatch := dispatch.sum().sum(): + market_values.at[tech, label] = revenue.sum().sum() / total_dispatch + else: + market_values.at[tech, label] = np.nan ## Now do market value of links ## @@ -583,7 +586,10 @@ def calculate_market_values(n, label, market_values): revenue = dispatch * n.buses_t.marginal_price[buses] - market_values.at[tech, label] = revenue.sum().sum() / dispatch.sum().sum() + if total_dispatch := dispatch.sum().sum(): + market_values.at[tech, label] = revenue.sum().sum() / total_dispatch + else: + market_values.at[tech, label] = np.nan return market_values diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index 555e5da5..d401b28e 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -265,7 +265,7 @@ def calculate_energy(n, label, energy): totals[no_bus] = float( n.component_attrs[c.name].loc["p" + port, "default"] ) - c_energies -= totals.groupby(c.df.carrier, axis=1).sum() + c_energies -= totals.T.groupby(c.df.carrier).sum().T c_energies = pd.concat([c_energies.T], keys=[c.list_name]) @@ -376,9 +376,8 @@ def calculate_supply_energy(n, label, supply_energy): .groupby(level=0) .sum() .multiply(c.df.loc[items, "sign"]) - .groupby(c.df.loc[items, "carrier"], axis=1) + .T.groupby(c.df.loc[items, "carrier"]) .sum() - .T ) s = pd.concat([s], keys=[c.list_name]) s = pd.concat([s], keys=[i]) @@ -525,9 +524,12 @@ def calculate_weighted_prices(n, label, weighted_prices): # stores[stores > 0.] = 0. # load += -stores - weighted_prices.loc[carrier, label] = ( - load * n.buses_t.marginal_price[buses] - ).sum().sum() / load.sum().sum() + if total_load := load.sum().sum(): + weighted_prices.loc[carrier, label] = ( + load * n.buses_t.marginal_price[buses] + ).sum().sum() / total_load + else: + weighted_prices.loc[carrier, label] = np.nan if carrier[:5] == "space": print(load * n.buses_t.marginal_price[buses]) @@ -562,7 +564,10 @@ def calculate_market_values(n, label, market_values): revenue = dispatch * n.buses_t.marginal_price[buses] - market_values.at[tech, label] = revenue.sum().sum() / dispatch.sum().sum() + if total_dispatch := dispatch.sum().sum(): + market_values.at[tech, label] = revenue.sum().sum() / total_dispatch + else: + market_values.at[tech, label] = np.nan ## Now do market value of links ## @@ -585,7 +590,10 @@ def calculate_market_values(n, label, market_values): revenue = dispatch * n.buses_t.marginal_price[buses] - market_values.at[tech, label] = revenue.sum().sum() / dispatch.sum().sum() + if total_dispatch := dispatch.sum().sum(): + market_values.at[tech, label] = revenue.sum().sum() / total_dispatch + else: + market_values.at[tech, label] = np.nan return market_values diff --git a/scripts/plot_hydrogen_network.py b/scripts/plot_hydrogen_network.py index a1183311..95741170 100644 --- a/scripts/plot_hydrogen_network.py +++ b/scripts/plot_hydrogen_network.py @@ -36,7 +36,9 @@ def group_pipes(df, drop_direction=False): lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", axis=1, ) - return df.groupby(level=0).agg({"p_nom_opt": sum, "bus0": "first", "bus1": "first"}) + return df.groupby(level=0).agg( + {"p_nom_opt": "sum", "bus0": "first", "bus1": "first"} + ) def plot_h2_map(n, regions): diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index 278472f6..3d72cd8c 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -221,7 +221,7 @@ def concat_networks(years): # set investment periods n.investment_periods = n.snapshots.levels[0] # weighting of the investment period -> assuming last period same weighting as the period before - time_w = n.investment_periods.to_series().diff().shift(-1).fillna(method="ffill") + time_w = n.investment_periods.to_series().diff().shift(-1).ffill() n.investment_period_weightings["years"] = time_w # set objective weightings objective_w = get_investment_weighting( diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index f7e91605..5abd2ce6 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -19,7 +19,7 @@ import pandas as pd import pypsa import xarray as xr from _helpers import update_config_with_sector_opts -from add_electricity import calculate_annuity, sanitize_carriers +from add_electricity import calculate_annuity, sanitize_carriers, sanitize_locations from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement from networkx.algorithms.connectivity.edge_augmentation import k_edge_augmentation @@ -546,6 +546,14 @@ def patch_electricity_network(n): n.loads_t.p_set.rename(lambda x: x.strip(), axis=1, inplace=True) +def add_eu_bus(n, x=-5.5, y=46): + """ + Add EU bus to the network. + """ + n.add("Bus", "EU", location="EU", x=x, y=y, carrier="none") + n.add("Carrier", "none") + + def add_co2_tracking(n, costs, options): # minus sign because opposite to how fossil fuels used: # CH4 burning puts CH4 down, atmosphere up @@ -1005,6 +1013,7 @@ def insert_electricity_distribution_grid(n, costs): "Store", nodes + " home battery", bus=nodes + " home battery", + location=nodes, e_cyclic=True, e_nom_extendable=True, carrier="home battery", @@ -3527,8 +3536,8 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): rev_links["reversed"] = True rev_links.index = rev_links.index.map(lambda x: x + "-reversed") + n.links["reversed"] = False n.links = pd.concat([n.links, rev_links], sort=False) - n.links["reversed"] = n.links["reversed"].fillna(False) n.links["length_original"] = n.links["length_original"].fillna(n.links.length) # do compression losses after concatenation to take electricity consumption at bus0 in either direction @@ -3594,6 +3603,8 @@ if __name__ == "__main__": for carrier in conventional: add_carrier_buses(n, carrier) + add_eu_bus(n) + add_co2_tracking(n, costs, options) add_generation(n, costs) @@ -3733,5 +3744,6 @@ if __name__ == "__main__": n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) sanitize_carriers(n, snakemake.config) + sanitize_locations(n) n.export_to_netcdf(snakemake.output[0]) From 32451f6ca8e45ca6f3c292f29c324104499e9276 Mon Sep 17 00:00:00 2001 From: Fabian Hofmann Date: Mon, 5 Feb 2024 19:13:42 +0100 Subject: [PATCH 348/497] Update scripts/prepare_sector_network.py Co-authored-by: Fabian Neumann --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 5abd2ce6..8eb38d69 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3536,8 +3536,8 @@ def lossy_bidirectional_links(n, carrier, efficiencies={}): rev_links["reversed"] = True rev_links.index = rev_links.index.map(lambda x: x + "-reversed") - n.links["reversed"] = False n.links = pd.concat([n.links, rev_links], sort=False) + n.links["reversed"] = n.links["reversed"].fillna(False) n.links["length_original"] = n.links["length_original"].fillna(n.links.length) # do compression losses after concatenation to take electricity consumption at bus0 in either direction From 2a01ed3d48f75b03e0ed0193304fa810e81b84a7 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 5 Feb 2024 19:15:55 +0100 Subject: [PATCH 349/497] prepare_sector: add description of eu bus --- scripts/prepare_sector_network.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8eb38d69..4948d451 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -549,6 +549,9 @@ def patch_electricity_network(n): def add_eu_bus(n, x=-5.5, y=46): """ Add EU bus to the network. + + This cosmetic bus serves as a reference point for the location of + the EU buses in the plots and summaries. """ n.add("Bus", "EU", location="EU", x=x, y=y, carrier="none") n.add("Carrier", "none") From 0553108e3d2e722d13e91cac65b7f823b81dc1cd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 18:23:30 +0000 Subject: [PATCH 350/497] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/snakemake/snakefmt: v0.9.0 → v0.10.0](https://github.com/snakemake/snakefmt/compare/v0.9.0...v0.10.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d90f5cb9..5c41e781 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -74,7 +74,7 @@ repos: # Format Snakemake rule / workflow files - repo: https://github.com/snakemake/snakefmt - rev: v0.9.0 + rev: v0.10.0 hooks: - id: snakefmt From 39890630efc3bc1b2356ef274faf9fbebf92ce82 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 18:23:48 +0000 Subject: [PATCH 351/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_electricity.smk | 16 +++++++----- rules/build_sector.smk | 49 +++++++++++++++++++++---------------- rules/collect.smk | 14 +++++------ rules/postprocess.smk | 40 +++++++++++++++++------------- rules/retrieve.smk | 8 +++--- 5 files changed, 73 insertions(+), 54 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 6b092638..89f4f736 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -401,18 +401,22 @@ rule add_electricity: if str(fn).startswith("data/") }, base_network=RESOURCES + "networks/base.nc", - line_rating=RESOURCES + "networks/line_rating.nc" - if config["lines"]["dynamic_line_rating"]["activate"] - else RESOURCES + "networks/base.nc", + line_rating=( + RESOURCES + "networks/line_rating.nc" + if config["lines"]["dynamic_line_rating"]["activate"] + else RESOURCES + "networks/base.nc" + ), tech_costs=COSTS, regions=RESOURCES + "regions_onshore.geojson", powerplants=RESOURCES + "powerplants.csv", hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), geth_hydro_capacities="data/geth2015_hydro_capacities.csv", unit_commitment="data/unit_commitment.csv", - fuel_price=RESOURCES + "monthly_fuel_price.csv" - if config["conventional"]["dynamic_fuel_price"] - else [], + fuel_price=( + RESOURCES + "monthly_fuel_price.csv" + if config["conventional"]["dynamic_fuel_price"] + else [] + ), load=RESOURCES + "load.csv", nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", ua_md_gdp="data/GDP_PPP_30arcsec_v3_mapped_default.csv", diff --git a/rules/build_sector.smk b/rules/build_sector.smk index a8f419c3..c25c8673 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -797,15 +797,19 @@ rule prepare_sector_network: dsm_profile=RESOURCES + "dsm_profile_s{simpl}_{clusters}.csv", co2_totals_name=RESOURCES + "co2_totals.csv", co2="data/bundle-sector/eea/UNFCCC_v23.csv", - biomass_potentials=RESOURCES - + "biomass_potentials_s{simpl}_{clusters}_" - + "{}.csv".format(config["biomass"]["year"]) - if config["foresight"] == "overnight" - else RESOURCES - + "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv", - costs="data/costs_{}.csv".format(config["costs"]["year"]) - if config["foresight"] == "overnight" - else "data/costs_{planning_horizons}.csv", + biomass_potentials=( + RESOURCES + + "biomass_potentials_s{simpl}_{clusters}_" + + "{}.csv".format(config["biomass"]["year"]) + if config["foresight"] == "overnight" + else RESOURCES + + "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv" + ), + costs=( + "data/costs_{}.csv".format(config["costs"]["year"]) + if config["foresight"] == "overnight" + else "data/costs_{planning_horizons}.csv" + ), profile_offwind_ac=RESOURCES + "profile_offwind-ac.nc", profile_offwind_dc=RESOURCES + "profile_offwind-dc.nc", h2_cavern=RESOURCES + "salt_cavern_potentials_s{simpl}_{clusters}.csv", @@ -831,18 +835,21 @@ rule prepare_sector_network: cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", cop_air_rural=RESOURCES + "cop_air_rural_elec_s{simpl}_{clusters}.nc", cop_air_urban=RESOURCES + "cop_air_urban_elec_s{simpl}_{clusters}.nc", - solar_thermal_total=RESOURCES - + "solar_thermal_total_elec_s{simpl}_{clusters}.nc" - if config["sector"]["solar_thermal"] - else [], - solar_thermal_urban=RESOURCES - + "solar_thermal_urban_elec_s{simpl}_{clusters}.nc" - if config["sector"]["solar_thermal"] - else [], - solar_thermal_rural=RESOURCES - + "solar_thermal_rural_elec_s{simpl}_{clusters}.nc" - if config["sector"]["solar_thermal"] - else [], + solar_thermal_total=( + RESOURCES + "solar_thermal_total_elec_s{simpl}_{clusters}.nc" + if config["sector"]["solar_thermal"] + else [] + ), + solar_thermal_urban=( + RESOURCES + "solar_thermal_urban_elec_s{simpl}_{clusters}.nc" + if config["sector"]["solar_thermal"] + else [] + ), + solar_thermal_rural=( + RESOURCES + "solar_thermal_rural_elec_s{simpl}_{clusters}.nc" + if config["sector"]["solar_thermal"] + else [] + ), output: RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/rules/collect.smk b/rules/collect.smk index 1d977da1..dc0a94cc 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -29,7 +29,7 @@ rule prepare_elec_networks: input: expand( RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - **config["scenario"] + **config["scenario"], ), @@ -38,7 +38,7 @@ rule prepare_sector_networks: expand( RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - **config["scenario"] + **config["scenario"], ), @@ -46,7 +46,7 @@ rule solve_elec_networks: input: expand( RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", - **config["scenario"] + **config["scenario"], ), @@ -55,7 +55,7 @@ rule solve_sector_networks: expand( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - **config["scenario"] + **config["scenario"], ), @@ -64,7 +64,7 @@ rule solve_sector_networks_perfect: expand( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", - **config["scenario"] + **config["scenario"], ), @@ -73,11 +73,11 @@ rule validate_elec_networks: expand( RESULTS + "figures/.statistics_plots_elec_s{simpl}_{clusters}_ec_l{ll}_{opts}", - **config["scenario"] + **config["scenario"], ), expand( RESULTS + "figures/.validation_{kind}_plots_elec_s{simpl}_{clusters}_ec_l{ll}_{opts}", **config["scenario"], - kind=["production", "prices", "cross_border"] + kind=["production", "prices", "cross_border"], ), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 3045d0da..2e90d233 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -153,38 +153,44 @@ rule make_summary: input: expand( RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", - **config["scenario"] + **config["scenario"], ), networks=expand( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - **config["scenario"] + **config["scenario"], + ), + costs=( + "data/costs_{}.csv".format(config["costs"]["year"]) + if config["foresight"] == "overnight" + else "data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]) ), - costs="data/costs_{}.csv".format(config["costs"]["year"]) - if config["foresight"] == "overnight" - else "data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), ac_plot=expand( RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", - **config["scenario"] + **config["scenario"], ), costs_plot=expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", - **config["scenario"] + **config["scenario"], ), h2_plot=expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf" - if config["sector"]["H2_network"] - else [], - **config["scenario"] + ( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf" + if config["sector"]["H2_network"] + else [] + ), + **config["scenario"], ), ch4_plot=expand( - RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf" - if config["sector"]["gas_network"] - else [], - **config["scenario"] + ( + RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf" + if config["sector"]["gas_network"] + else [] + ), + **config["scenario"], ), output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 05bbefd8..2980583f 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -191,9 +191,11 @@ if config["enable"]["retrieve"]: input: HTTP.remote( "data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv".format( - version="2019-06-05" - if config["snapshots"]["end"] < "2019" - else "2020-10-06" + version=( + "2019-06-05" + if config["snapshots"]["end"] < "2019" + else "2020-10-06" + ) ), keep_local=True, static=True, From 7fbb6051340eaf038133a7058f3ea7c43d1daf69 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Fri, 2 Feb 2024 10:41:05 +0000 Subject: [PATCH 352/497] Address FutureWarnings in `make_summary_perfect` related to groupby --- scripts/make_summary_perfect.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index d401b28e..d68ac628 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -246,8 +246,9 @@ def calculate_energy(n, label, energy): .groupby(level=0) .sum() .multiply(c.df.sign) - .groupby(c.df.carrier, axis=1) + .T.groupby(c.df.carrier) .sum() + .T ) else: c_energies = pd.DataFrame( @@ -394,16 +395,9 @@ def calculate_supply_energy(n, label, supply_energy): if len(items) == 0: continue - s = ( - (-1) - * c.pnl["p" + end] - .reindex(items, axis=1) - .multiply(n.snapshot_weightings.objective, axis=0) - .groupby(level=0) - .sum() - .groupby(c.df.loc[items, "carrier"], axis=1) - .sum() - ).T + s = (-1) * c.pnl["p" + end].reindex(items, axis=1).multiply( + n.snapshot_weightings.objective, axis=0 + ).groupby(level=0).sum().T.groupby(c.df.loc[items, "carrier"]).sum() s.index = s.index + end s = pd.concat([s], keys=[c.list_name]) s = pd.concat([s], keys=[i]) @@ -514,9 +508,7 @@ def calculate_weighted_prices(n, label, weighted_prices): if names.empty: continue - load += ( - n.links_t.p0[names].groupby(n.links.loc[names, "bus0"], axis=1).sum() - ) + load += n.links_t.p0[names].T.groupby(n.links.loc[names, "bus0"]).sum() # Add H2 Store when charging # if carrier == "H2": @@ -557,9 +549,9 @@ def calculate_market_values(n, label, market_values): dispatch = ( n.generators_t.p[gens] - .groupby(n.generators.loc[gens, "bus"], axis=1) + .T.groupby(n.generators.loc[gens, "bus"]) .sum() - .reindex(columns=buses, fill_value=0.0) + .T.reindex(columns=buses, fill_value=0.0) ) revenue = dispatch * n.buses_t.marginal_price[buses] @@ -583,9 +575,9 @@ def calculate_market_values(n, label, market_values): dispatch = ( n.links_t["p" + i][links] - .groupby(n.links.loc[links, "bus" + i], axis=1) + .T.groupby(n.links.loc[links, "bus" + i]) .sum() - .reindex(columns=buses, fill_value=0.0) + .T.reindex(columns=buses, fill_value=0.0) ) revenue = dispatch * n.buses_t.marginal_price[buses] @@ -652,7 +644,7 @@ def calculate_co2_emissions(n, label, df): emitted = n.generators_t.p[gens.index].mul(em_pu) emitted_grouped = ( - emitted.groupby(level=0).sum().groupby(n.generators.carrier, axis=1).sum().T + emitted.groupby(level=0).sum().T.groupby(n.generators.carrier).sum().T ) df = df.reindex(emitted_grouped.index.union(df.index)) From 73b80ebab38cf275d3410fb5918e37061df452e4 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Tue, 6 Feb 2024 09:39:11 +0000 Subject: [PATCH 353/497] Address pandas deprecation warnings in `prepare_perfect_foresight` --- scripts/prepare_perfect_foresight.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index 3d72cd8c..467682a9 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -56,7 +56,9 @@ def get_investment_weighting(time_weighting, r=0.01): end = time_weighting.cumsum() start = time_weighting.cumsum().shift().fillna(0) return pd.concat([start, end], axis=1).apply( - lambda x: sum(get_social_discount(t, r) for t in range(int(x[0]), int(x[1]))), + lambda x: sum( + get_social_discount(t, r) for t in range(int(x.iloc[0]), int(x.iloc[1])) + ), axis=1, ) @@ -188,7 +190,7 @@ def concat_networks(years): pnl = getattr(n, component.list_name + "_t") for k in iterkeys(component.pnl): pnl_year = component.pnl[k].copy().reindex(snapshots, level=1) - if pnl_year.empty and ~(component.name == "Load" and k == "p_set"): + if pnl_year.empty and (not (component.name == "Load" and k == "p_set")): continue if component.name == "Load": static_load = network.loads.loc[network.loads.p_set != 0] @@ -398,7 +400,7 @@ def add_H2_boilers(n): c = "Link" logger.info("Add H2 boilers.") # existing gas boilers - mask = n.links.carrier.str.contains("gas boiler") & ~n.links.p_nom_extendable + mask = n.links.carrier.str.contains("gas boiler") & (not n.links.p_nom_extendable) gas_i = n.links[mask].index df = n.links.loc[gas_i] # adjust bus 0 From 1f482f3c9259fcfab94280a85bf38fcea9609562 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Tue, 6 Feb 2024 11:45:20 +0100 Subject: [PATCH 354/497] Revert mistaken deprecation "fix" --- scripts/prepare_perfect_foresight.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index 467682a9..cf013577 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -400,7 +400,7 @@ def add_H2_boilers(n): c = "Link" logger.info("Add H2 boilers.") # existing gas boilers - mask = n.links.carrier.str.contains("gas boiler") & (not n.links.p_nom_extendable) + mask = n.links.carrier.str.contains("gas boiler") & ~n.links.p_nom_extendable gas_i = n.links[mask].index df = n.links.loc[gas_i] # adjust bus 0 From 3e6394b23c3e5361eb8e97bf5ce4e8d62727a666 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 6 Feb 2024 13:55:27 +0100 Subject: [PATCH 355/497] revert to previous offshore wind turbine models --- config/config.default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index bc420b36..5afc6f8e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -187,7 +187,7 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: NREL_ReferenceTurbine_5MW_offshore + turbine: NREL_ReferenceTurbine_2020ATB_5.5MW add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 @@ -203,7 +203,7 @@ renewable: cutout: europe-2013-era5 resource: method: wind - turbine: Vestas_V164_7MW_offshore + turbine: NREL_ReferenceTurbine_2020ATB_5.5MW add_cutout_windspeed: true capacity_per_sqkm: 2 correction_factor: 0.8855 From ba409c2f1e1943c57ddc3b63460cd21ba2cd308c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 6 Feb 2024 13:55:51 +0100 Subject: [PATCH 356/497] backwards compatibility with old profile_{tech}.nc files --- scripts/build_renewable_profiles.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index 99b177a8..a24045a8 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -411,9 +411,13 @@ if __name__ == "__main__": ds["underwater_fraction"] = xr.DataArray(underwater_fraction, [buses]) # select only buses with some capacity and minimal capacity factor + mean_profile = ds["profile"].mean("time") + if "year" in ds.indexes: + mean_profile.max("year") + ds = ds.sel( bus=( - (ds["profile"].mean("time").max("year") > params.get("min_p_max_pu", 0.0)) + (mean_profile > params.get("min_p_max_pu", 0.0)) & (ds["p_nom_max"] > params.get("min_p_nom_max", 0.0)) ) ) From c8e18298803fa9c2dd838008902fa6f41b5857d0 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 6 Feb 2024 18:38:53 +0100 Subject: [PATCH 357/497] fix to backwards compatibility with old profile_{tech}.nc files --- scripts/build_renewable_profiles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index a24045a8..a075450d 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -413,7 +413,7 @@ if __name__ == "__main__": # select only buses with some capacity and minimal capacity factor mean_profile = ds["profile"].mean("time") if "year" in ds.indexes: - mean_profile.max("year") + mean_profile = mean_profile.max("year") ds = ds.sel( bus=( From 823765b353991918cbd7e0bd6432b210b1e146f2 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 7 Feb 2024 09:52:30 +0100 Subject: [PATCH 358/497] update technology-data to 0.7.0 by default --- config/config.default.yaml | 2 +- doc/release_notes.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 5afc6f8e..b13bed4e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -650,7 +650,7 @@ industry: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs costs: year: 2030 - version: v0.6.2 + version: v0.7.0 rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) social_discountrate: 0.02 fill_values: diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 976d727e..bf9860c6 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,8 @@ Release Notes Upcoming Release ================ +* Upgrade techno-economic assumptions to ``technology-data`` v0.7.0. + * Bugfix: Correct technology keys for the electricity production plotting to work out the box. * New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). From c3d3b5f415342d526a3283f9bf422604c9f89b0b Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Wed, 7 Feb 2024 10:55:44 +0100 Subject: [PATCH 359/497] Fixes to `calculated_weighted_prices` --- scripts/make_summary_perfect.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index d68ac628..064db454 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -492,7 +492,7 @@ def calculate_weighted_prices(n, label, weighted_prices): else: suffix = " " + carrier - buses = n.buses.index[n.buses.index.str[2:] == suffix] + buses = n.buses.index[n.buses.index.str[5:] == suffix] if buses.empty: continue @@ -503,12 +503,14 @@ def calculate_weighted_prices(n, label, weighted_prices): else n.loads_t.p_set.reindex(buses, axis=1) ) for tech in value: - names = n.links.index[n.links.index.to_series().str[-len(tech) :] == tech] + names = n.links.index[ + n.links.index.to_series().str[-len(tech) - 5 : -5] == tech + ] if names.empty: continue - load += n.links_t.p0[names].T.groupby(n.links.loc[names, "bus0"]).sum() + load += n.links_t.p0[names].T.groupby(n.links.loc[names, "bus0"]).sum().T # Add H2 Store when charging # if carrier == "H2": @@ -644,7 +646,7 @@ def calculate_co2_emissions(n, label, df): emitted = n.generators_t.p[gens.index].mul(em_pu) emitted_grouped = ( - emitted.groupby(level=0).sum().T.groupby(n.generators.carrier).sum().T + emitted.groupby(level=0).sum().T.groupby(n.generators.carrier).sum() ) df = df.reindex(emitted_grouped.index.union(df.index)) From bf073000108e37e9b948185dcb84321c4fe1bcaf Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 7 Feb 2024 11:03:48 +0100 Subject: [PATCH 360/497] add_electricity: Remove long-deprecated function attach_extendable_generators --- doc/release_notes.rst | 2 ++ scripts/add_electricity.py | 71 -------------------------------------- 2 files changed, 2 insertions(+), 71 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index bf9860c6..685f8502 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,8 @@ Release Notes Upcoming Release ================ +* Remove long-deprecated function ``attach_extendable_generators`` in :mod:`add_electricity`. + * Upgrade techno-economic assumptions to ``technology-data`` v0.7.0. * Bugfix: Correct technology keys for the electricity production plotting to work out the box. diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 9fd7e4a5..ab97dcd0 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -662,77 +662,6 @@ def attach_hydro(n, costs, ppl, profile_hydro, hydro_capacities, carriers, **par ) -def attach_extendable_generators(n, costs, ppl, carriers): - logger.warning( - "The function `attach_extendable_generators` is deprecated in v0.5.0." - ) - add_missing_carriers(n, carriers) - add_co2_emissions(n, costs, carriers) - - for tech in carriers: - if tech.startswith("OCGT"): - ocgt = ( - ppl.query("carrier in ['OCGT', 'CCGT']") - .groupby("bus", as_index=False) - .first() - ) - n.madd( - "Generator", - ocgt.index, - suffix=" OCGT", - bus=ocgt["bus"], - carrier=tech, - p_nom_extendable=True, - p_nom=0.0, - capital_cost=costs.at["OCGT", "capital_cost"], - marginal_cost=costs.at["OCGT", "marginal_cost"], - efficiency=costs.at["OCGT", "efficiency"], - ) - - elif tech.startswith("CCGT"): - ccgt = ( - ppl.query("carrier in ['OCGT', 'CCGT']") - .groupby("bus", as_index=False) - .first() - ) - n.madd( - "Generator", - ccgt.index, - suffix=" CCGT", - bus=ccgt["bus"], - carrier=tech, - p_nom_extendable=True, - p_nom=0.0, - capital_cost=costs.at["CCGT", "capital_cost"], - marginal_cost=costs.at["CCGT", "marginal_cost"], - efficiency=costs.at["CCGT", "efficiency"], - ) - - elif tech.startswith("nuclear"): - nuclear = ( - ppl.query("carrier == 'nuclear'").groupby("bus", as_index=False).first() - ) - n.madd( - "Generator", - nuclear.index, - suffix=" nuclear", - bus=nuclear["bus"], - carrier=tech, - p_nom_extendable=True, - p_nom=0.0, - capital_cost=costs.at["nuclear", "capital_cost"], - marginal_cost=costs.at["nuclear", "marginal_cost"], - efficiency=costs.at["nuclear", "efficiency"], - ) - - else: - raise NotImplementedError( - "Adding extendable generators for carrier " - "'{tech}' is not implemented, yet. " - "Only OCGT, CCGT and nuclear are allowed at the moment." - ) - - def attach_OPSD_renewables(n: pypsa.Network, tech_map: Dict[str, List[str]]) -> None: """ Attach renewable capacities from the OPSD dataset to the network. From 5902be199f1f1f9e43f437eb32d9ef47a33918bc Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 7 Feb 2024 11:20:05 +0100 Subject: [PATCH 361/497] powerplants_filter: phase-out status 2023 (incl. nuclear in DE) --- config/config.default.yaml | 2 +- doc/release_notes.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index b13bed4e..93b0568e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -114,7 +114,7 @@ electricity: Store: [battery, H2] Link: [] # H2 pipeline - powerplants_filter: (DateOut >= 2022 or DateOut != DateOut) + powerplants_filter: (DateOut >= 2023 or DateOut != DateOut) and not (Country == 'Germany' and Fueltype == 'Nuclear') custom_powerplants: false everywhere_powerplants: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 685f8502..b1511dd7 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -12,6 +12,8 @@ Upcoming Release * Remove long-deprecated function ``attach_extendable_generators`` in :mod:`add_electricity`. +* The filtering of power plants in the ``config.default.yaml`` has been updated regarding phased-out power plants in 2023. + * Upgrade techno-economic assumptions to ``technology-data`` v0.7.0. * Bugfix: Correct technology keys for the electricity production plotting to work out the box. From f38681f13462187dc83eb78c093bd0ccfa5899fb Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 29 Jan 2024 10:02:05 +0100 Subject: [PATCH 362/497] correctly source the existing heating technologies for buildings The source URL has changed. It represents the year 2012 and is only for buildings, not district heating. So the capacities for urban central are now set to zero from this source. --- doc/configtables/licenses-sector.csv | 2 +- scripts/add_existing_baseyear.py | 12 +++------ .../build_existing_heating_distribution.py | 27 +++++++++++-------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/doc/configtables/licenses-sector.csv b/doc/configtables/licenses-sector.csv index a297b2f6..7f20b5a6 100644 --- a/doc/configtables/licenses-sector.csv +++ b/doc/configtables/licenses-sector.csv @@ -10,7 +10,7 @@ BASt emobility statistics,emobility/,unknown,http://www.bast.de/DE/Verkehrstechn BDEW heating profile,heat_load_profile_BDEW.csv,unknown,https://github.com/oemof/demandlib heating profiles for Aarhus,heat_load_profile_DK_AdamJensen.csv,unknown,Adam Jensen MA thesis at Aarhus University co2 budgets,co2_budget.csv,CC BY 4.0,https://arxiv.org/abs/2004.11009 -existing heating potentials,existing_infrastructure/existing_heating_raw.csv,unknown,https://ec.europa.eu/energy/studies/mapping-and-analyses-current-and-future-2020-2030-heatingcooling-fuel-deployment_en?redir=1 +existing heating potentials,existing_infrastructure/existing_heating_raw.csv,unknown,https://energy.ec.europa.eu/publications/mapping-and-analyses-current-and-future-2020-2030-heatingcooling-fuel-deployment-fossilrenewables-1_en IRENA existing VRE capacities,existing_infrastructure/{solar|onwind|offwind}_capcity_IRENA.csv,unknown,https://www.irena.org/Statistics/Download-Data USGS ammonia production,myb1-2017-nitro.xls,unknown,https://www.usgs.gov/centers/nmic/nitrogen-statistics-and-information hydrogen salt cavern potentials,h2_salt_caverns_GWh_per_sqkm.geojson,CC BY 4.0,https://doi.org/10.1016/j.ijhydene.2019.12.161 https://doi.org/10.20944/preprints201910.0187.v1 diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 4f476b4d..3934079e 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -402,16 +402,10 @@ def add_heating_capacities_installed_before_baseyear( """ logger.debug(f"Adding heating capacities installed before {baseyear}") - # Add existing heating capacities, data comes from the study - # "Mapping and analyses of the current and future (2020 - 2030) - # heating/cooling fuel deployment (fossil/renewables) " - # https://ec.europa.eu/energy/studies/mapping-and-analyses-current-and-future-2020-2030-heatingcooling-fuel-deployment_en?redir=1 - # file: "WP2_DataAnnex_1_BuildingTechs_ForPublication_201603.xls" -> "existing_heating_raw.csv". - # TODO start from original file + existing_heating = pd.read_csv(snakemake.input.existing_heating_distribution, + header=[0,1], + index_col=0) - existing_heating = pd.read_csv( - snakemake.input.existing_heating_distribution, header=[0, 1], index_col=0 - ) techs = existing_heating.columns.get_level_values(1).unique() diff --git a/scripts/build_existing_heating_distribution.py b/scripts/build_existing_heating_distribution.py index 67993c29..12bfd4da 100644 --- a/scripts/build_existing_heating_distribution.py +++ b/scripts/build_existing_heating_distribution.py @@ -16,9 +16,17 @@ cc = coco.CountryConverter() def build_existing_heating(): # retrieve existing heating capacities - existing_heating = pd.read_csv( - snakemake.input.existing_heating, index_col=0, header=0 - ) + # Add existing heating capacities, data comes from the study + # "Mapping and analyses of the current and future (2020 - 2030) + # heating/cooling fuel deployment (fossil/renewables) " + # https://energy.ec.europa.eu/publications/mapping-and-analyses-current-and-future-2020-2030-heatingcooling-fuel-deployment-fossilrenewables-1_en + # file: "WP2_DataAnnex_1_BuildingTechs_ForPublication_201603.xls" -> "existing_heating_raw.csv". + # data is for buildings only (i.e. NOT district heating) and represents the year 2012 + # TODO start from original file + + existing_heating = pd.read_csv(snakemake.input.existing_heating, + index_col=0, + header=0) # data for Albania, Montenegro and Macedonia not included in database existing_heating.loc["Albania"] = np.nan @@ -67,17 +75,14 @@ def build_existing_heating(): nodal_sectoral_totals.sum(axis=1), axis=0 ) - nodal_heat_name_fraction = pd.DataFrame(dtype=float) + nodal_heat_name_fraction = pd.DataFrame(index=district_heat_info.index, + dtype=float) - nodal_heat_name_fraction["urban central"] = dist_fraction + nodal_heat_name_fraction["urban central"] = 0. for sector in sectors: - nodal_heat_name_fraction[f"{sector} rural"] = nodal_sectoral_fraction[ - sector - ] * (1 - urban_fraction) - nodal_heat_name_fraction[f"{sector} urban decentral"] = nodal_sectoral_fraction[ - sector - ] * (urban_fraction - dist_fraction) + nodal_heat_name_fraction[f"{sector} rural"] = nodal_sectoral_fraction[sector]*(1 - urban_fraction) + nodal_heat_name_fraction[f"{sector} urban decentral"] = nodal_sectoral_fraction[sector]*urban_fraction nodal_heat_name_tech = pd.concat( { From d7f3f16a9bf5a8228b7d28157f292260c3aaff40 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 7 Feb 2024 17:15:08 +0100 Subject: [PATCH 363/497] autoformat --- scripts/add_existing_baseyear.py | 7 +++---- .../build_existing_heating_distribution.py | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 3934079e..e8683e16 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -402,10 +402,9 @@ def add_heating_capacities_installed_before_baseyear( """ logger.debug(f"Adding heating capacities installed before {baseyear}") - existing_heating = pd.read_csv(snakemake.input.existing_heating_distribution, - header=[0,1], - index_col=0) - + existing_heating = pd.read_csv( + snakemake.input.existing_heating_distribution, header=[0, 1], index_col=0 + ) techs = existing_heating.columns.get_level_values(1).unique() diff --git a/scripts/build_existing_heating_distribution.py b/scripts/build_existing_heating_distribution.py index 12bfd4da..78518597 100644 --- a/scripts/build_existing_heating_distribution.py +++ b/scripts/build_existing_heating_distribution.py @@ -24,9 +24,9 @@ def build_existing_heating(): # data is for buildings only (i.e. NOT district heating) and represents the year 2012 # TODO start from original file - existing_heating = pd.read_csv(snakemake.input.existing_heating, - index_col=0, - header=0) + existing_heating = pd.read_csv( + snakemake.input.existing_heating, index_col=0, header=0 + ) # data for Albania, Montenegro and Macedonia not included in database existing_heating.loc["Albania"] = np.nan @@ -75,14 +75,17 @@ def build_existing_heating(): nodal_sectoral_totals.sum(axis=1), axis=0 ) - nodal_heat_name_fraction = pd.DataFrame(index=district_heat_info.index, - dtype=float) + nodal_heat_name_fraction = pd.DataFrame(index=district_heat_info.index, dtype=float) - nodal_heat_name_fraction["urban central"] = 0. + nodal_heat_name_fraction["urban central"] = 0.0 for sector in sectors: - nodal_heat_name_fraction[f"{sector} rural"] = nodal_sectoral_fraction[sector]*(1 - urban_fraction) - nodal_heat_name_fraction[f"{sector} urban decentral"] = nodal_sectoral_fraction[sector]*urban_fraction + nodal_heat_name_fraction[f"{sector} rural"] = nodal_sectoral_fraction[ + sector + ] * (1 - urban_fraction) + nodal_heat_name_fraction[f"{sector} urban decentral"] = ( + nodal_sectoral_fraction[sector] * urban_fraction + ) nodal_heat_name_tech = pd.concat( { From 6d94439bbb9b650dc6d3c8d1da3064ee5affd813 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 29 Jan 2024 11:25:09 +0100 Subject: [PATCH 364/497] for existing heating use new default_heating_lifetime This is because old costs default (25) is longer than all heating technologies (20). Script was distributing across 25 years, then throwing out boilers older than 20 years, an inconsistent behaviour. Now existing boilers are smoothly distributed across 20 years. --- config/config.default.yaml | 1 + scripts/add_existing_baseyear.py | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 93b0568e..633bed70 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -357,6 +357,7 @@ existing_capacities: grouping_years_power: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030] grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # these should not extend 2020 threshold_capacity: 10 + default_heating_lifetime: 20 conventional_carriers: - lignite - coal diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index e8683e16..13527fad 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -429,7 +429,7 @@ def add_heating_capacities_installed_before_baseyear( if int(grouping_year) + default_lifetime <= int(baseyear): continue - # installation is assumed to be linear for the past 25 years (default lifetime) + # installation is assumed to be linear for the past default_lifetime years ratio = (int(grouping_year) - int(grouping_years[i - 1])) / default_lifetime n.madd( @@ -536,12 +536,6 @@ def add_heating_capacities_installed_before_baseyear( ], ) - # drop assets which are at the end of their lifetime - links_i = n.links[(n.links.build_year + n.links.lifetime <= baseyear)].index - logger.info("Removing following links because at end of their lifetime:") - logger.info(links_i) - n.mremove("Link", links_i) - if __name__ == "__main__": if "snakemake" not in globals(): @@ -598,7 +592,7 @@ if __name__ == "__main__": .to_pandas() .reindex(index=n.snapshots) ) - default_lifetime = snakemake.params.costs["fill_values"]["lifetime"] + default_lifetime = snakemake.params.existing_capacities["default_heating_lifetime"] add_heating_capacities_installed_before_baseyear( n, baseyear, From 92d00a0c83d6ec912d7c34eeffea8da67bee18ea Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 29 Jan 2024 12:22:54 +0100 Subject: [PATCH 365/497] add new default to overdimension heating in individual buildings This allows them to cover heat demand peaks e.g. 10% higher than those in the data. The disadvantage of manipulating the costs is that the capacity is then not quite right. This way at least the costs are right. Doing it properly would require introducing artificial peaks, but this creates new problems (e.g. what is going on with wind/solar/other demand). --- config/config.default.yaml | 1 + scripts/add_existing_baseyear.py | 4 +++- scripts/prepare_sector_network.py | 22 ++++++++++++++++------ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 633bed70..b24f2ceb 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -483,6 +483,7 @@ sector: resistive_heaters: true oil_boilers: false biomass_boiler: true + overdimension_individual_heating: 1.1 #to cover demand peaks bigger than data chp: true micro_chp: false solar_thermal: true diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 13527fad..c0d37a5b 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -592,7 +592,9 @@ if __name__ == "__main__": .to_pandas() .reindex(index=n.snapshots) ) - default_lifetime = snakemake.params.existing_capacities["default_heating_lifetime"] + default_lifetime = snakemake.params.existing_capacities[ + "default_heating_lifetime" + ] add_heating_capacities_installed_before_baseyear( n, baseyear, diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 394a67f8..eb24d9cf 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1680,6 +1680,8 @@ def add_heat(n, costs): heat_demand = build_heat_demand(n) + overdim_factor = options["overdimension_individual_heating"] + district_heat_info = pd.read_csv(snakemake.input.district_heat_share, index_col=0) dist_fraction = district_heat_info["district fraction of node"] urban_fraction = district_heat_info["urban fraction"] @@ -1814,7 +1816,8 @@ def add_heat(n, costs): carrier=f"{name} {heat_pump_type} heat pump", efficiency=efficiency, capital_cost=costs.at[costs_name, "efficiency"] - * costs.at[costs_name, "fixed"], + * costs.at[costs_name, "fixed"] + * overdim_factor, p_nom_extendable=True, lifetime=costs.at[costs_name, "lifetime"], ) @@ -1883,7 +1886,9 @@ def add_heat(n, costs): bus1=nodes + f" {name} heat", carrier=name + " resistive heater", efficiency=costs.at[key, "efficiency"], - capital_cost=costs.at[key, "efficiency"] * costs.at[key, "fixed"], + capital_cost=costs.at[key, "efficiency"] + * costs.at[key, "fixed"] + * overdim_factor, p_nom_extendable=True, lifetime=costs.at[key, "lifetime"], ) @@ -1901,7 +1906,9 @@ def add_heat(n, costs): carrier=name + " gas boiler", efficiency=costs.at[key, "efficiency"], efficiency2=costs.at["gas", "CO2 intensity"], - capital_cost=costs.at[key, "efficiency"] * costs.at[key, "fixed"], + capital_cost=costs.at[key, "efficiency"] + * costs.at[key, "fixed"] + * overdim_factor, lifetime=costs.at[key, "lifetime"], ) @@ -1915,7 +1922,8 @@ def add_heat(n, costs): bus=nodes + f" {name} heat", carrier=name + " solar thermal", p_nom_extendable=True, - capital_cost=costs.at[name_type + " solar thermal", "fixed"], + capital_cost=costs.at[name_type + " solar thermal", "fixed"] + * overdim_factor, p_max_pu=solar_thermal[nodes], lifetime=costs.at[name_type + " solar thermal", "lifetime"], ) @@ -2348,7 +2356,8 @@ def add_biomass(n, costs): carrier=name + " biomass boiler", efficiency=costs.at["biomass boiler", "efficiency"], capital_cost=costs.at["biomass boiler", "efficiency"] - * costs.at["biomass boiler", "fixed"], + * costs.at["biomass boiler", "fixed"] + * options["overdimension_individual_heating"], marginal_cost=costs.at["biomass boiler", "pelletizing cost"], lifetime=costs.at["biomass boiler", "lifetime"], ) @@ -2806,7 +2815,8 @@ def add_industry(n, costs): efficiency=costs.at["decentral oil boiler", "efficiency"], efficiency2=costs.at["oil", "CO2 intensity"], capital_cost=costs.at["decentral oil boiler", "efficiency"] - * costs.at["decentral oil boiler", "fixed"], + * costs.at["decentral oil boiler", "fixed"] + * options["overdimension_individual_heating"], lifetime=costs.at["decentral oil boiler", "lifetime"], ) From 7ad5dcc3eea0bed4bcc66acae6f8a6c3bb5ed5bd Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 7 Feb 2024 17:25:09 +0100 Subject: [PATCH 366/497] add release notes and documentation --- doc/configtables/existing_capacities.csv | 1 + doc/configtables/sector.csv | 1 + doc/release_notes.rst | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/doc/configtables/existing_capacities.csv b/doc/configtables/existing_capacities.csv index 87519193..eacae35b 100644 --- a/doc/configtables/existing_capacities.csv +++ b/doc/configtables/existing_capacities.csv @@ -3,4 +3,5 @@ grouping_years_power ,--,A list of years,Intervals to group existing capacities grouping_years_heat ,--,A list of years below 2020,Intervals to group existing capacities for heat threshold_capacity ,MW,float,Capacities generators and links of below threshold are removed during add_existing_capacities +default_heating_lifetime ,years,int,Default lifetime for heating technologies conventional_carriers ,--,"Any subset of {uranium, coal, lignite, oil} ",List of conventional power plants to include in the sectoral network diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 338cf34e..d8cc3288 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -66,6 +66,7 @@ boilers,--,"{true, false}",Add option for transforming gas into heat using gas b resistive_heaters,--,"{true, false}",Add option for transforming electricity into heat using resistive heaters (independently from gas boilers) oil_boilers,--,"{true, false}",Add option for transforming oil into heat using boilers biomass_boiler,--,"{true, false}",Add option for transforming biomass into heat using boilers +overdimension_individual_heating,--,"float",Add option for overdimensioning individual heating systems by a certain factor. This allows them to cover heat demand peaks e.g. 10% higher than those in the data with a setting of 1.1. chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP) micro_chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP) for decentral areas. solar_thermal,--,"{true, false}",Add option for using solar thermal to generate heat. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index b1511dd7..fea45d74 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,19 @@ Release Notes Upcoming Release ================ +* Add new default to overdimension heating in individual buildings. This allows + them to cover heat demand peaks e.g. 10% higher than those in the data. The + disadvantage of manipulating the costs is that the capacity is then not quite + right. This way at least the costs are right. + +* Add option to specify to set a default heating lifetime for existing heating + (``existing_capacities: default_heating_lifetime:``). + +* Correctly source the existing heating technologies for buildings since the + source URL has changed. It represents the year 2012 and is only for + buildings, not district heating. So the capacities for urban central are now + set to zero from this source. + * Remove long-deprecated function ``attach_extendable_generators`` in :mod:`add_electricity`. * The filtering of power plants in the ``config.default.yaml`` has been updated regarding phased-out power plants in 2023. From 3e411fe79d9a8d707053ae9b37fd6c17cd81ee0d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 16:27:18 +0000 Subject: [PATCH 367/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index fea45d74..ee7bd64b 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -16,7 +16,7 @@ Upcoming Release right. This way at least the costs are right. * Add option to specify to set a default heating lifetime for existing heating - (``existing_capacities: default_heating_lifetime:``). + (``existing_capacities: default_heating_lifetime:``). * Correctly source the existing heating technologies for buildings since the source URL has changed. It represents the year 2012 and is only for From b9c71c3c151662d51334c5ec66fd6136b733cfad Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 7 Feb 2024 17:53:10 +0100 Subject: [PATCH 368/497] add logs to plot_*_network rules --- rules/postprocess.smk | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 2e90d233..18d65c16 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -41,6 +41,11 @@ if config["foresight"] != "perfect": threads: 2 resources: mem_mb=10000, + log: + ( + LOGS + + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ) benchmark: ( BENCHMARKS @@ -65,6 +70,11 @@ if config["foresight"] != "perfect": threads: 2 resources: mem_mb=10000, + log: + ( + LOGS + + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ) benchmark: ( BENCHMARKS @@ -88,6 +98,11 @@ if config["foresight"] != "perfect": threads: 2 resources: mem_mb=10000, + log: + ( + LOGS + + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ) benchmark: ( BENCHMARKS From e0dafc50b34ee4e62a624fd3b3c09ddc8c65a9b5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 9 Feb 2024 10:15:11 +0100 Subject: [PATCH 369/497] add missing heat pump colors --- config/config.default.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index b24f2ceb..1033d49d 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -1001,9 +1001,11 @@ plotting: air heat pump: '#36eb41' residential urban decentral air heat pump: '#48f74f' services urban decentral air heat pump: '#5af95d' + services rural air heat pump: '#5af95d' urban central air heat pump: '#6cfb6b' ground heat pump: '#2fb537' residential rural ground heat pump: '#48f74f' + residential rural air heat pump: '#48f74f' services rural ground heat pump: '#5af95d' Ambient: '#98eb9d' CHP: '#8a5751' From 3691f9f4c16fd2149fdc255e8e3669ce7117077c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 9 Feb 2024 13:59:15 +0100 Subject: [PATCH 370/497] update version compatibility handling --- rules/postprocess.smk | 6 +++--- scripts/_helpers.py | 8 +++----- scripts/base_network.py | 8 ++++++-- scripts/build_industrial_distribution_key.py | 8 +------- scripts/cluster_gas_network.py | 10 +++------- scripts/cluster_network.py | 7 ++++++- scripts/prepare_sector_network.py | 18 +++--------------- 7 files changed, 25 insertions(+), 40 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 18d65c16..98b90fd1 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -45,7 +45,7 @@ if config["foresight"] != "perfect": ( LOGS + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ) + ), benchmark: ( BENCHMARKS @@ -74,7 +74,7 @@ if config["foresight"] != "perfect": ( LOGS + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ) + ), benchmark: ( BENCHMARKS @@ -102,7 +102,7 @@ if config["foresight"] != "perfect": ( LOGS + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ) + ), benchmark: ( BENCHMARKS diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 3173671d..3de23c9f 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -264,7 +264,6 @@ def mock_snakemake( import os import snakemake as sm - from packaging.version import Version, parse from pypsa.descriptors import Dict from snakemake.script import Snakemake @@ -290,13 +289,12 @@ def mock_snakemake( if os.path.exists(p): snakefile = p break - kwargs = ( - dict(rerun_triggers=[]) if parse(sm.__version__) > Version("7.7.0") else {} - ) if isinstance(configfiles, str): configfiles = [configfiles] - workflow = sm.Workflow(snakefile, overwrite_configfiles=configfiles, **kwargs) + workflow = sm.Workflow( + snakefile, overwrite_configfiles=configfiles, rerun_triggers=[] + ) workflow.include(snakefile) if configfiles: diff --git a/scripts/base_network.py b/scripts/base_network.py index 1de3ef96..2bfee9d7 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -78,10 +78,13 @@ import shapely.prepared import shapely.wkt import yaml from _helpers import configure_logging +from packaging.version import Version, parse from scipy import spatial from scipy.sparse import csgraph from shapely.geometry import LineString, Point +PD_GE_2_2 = parse(pd.__version__) >= Version("2.2") + logger = logging.getLogger(__name__) @@ -524,12 +527,13 @@ def _set_countries_and_substations(n, config, country_shapes, offshore_shapes): ) return pd.Series(key, index) + compat_kws = dict(include_groups=False) if PD_GE_2_2 else {} gb = buses.loc[substation_b].groupby( ["x", "y"], as_index=False, group_keys=False, sort=False ) - bus_map_low = gb.apply(prefer_voltage, "min", include_groups=False) + bus_map_low = gb.apply(prefer_voltage, "min", **compat_kws) lv_b = (bus_map_low == bus_map_low.index).reindex(buses.index, fill_value=False) - bus_map_high = gb.apply(prefer_voltage, "max", include_groups=False) + bus_map_high = gb.apply(prefer_voltage, "max", **compat_kws) hv_b = (bus_map_high == bus_map_high.index).reindex(buses.index, fill_value=False) onshore_b = pd.Series(False, buses.index) diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index fe7cf0c1..9b234e29 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -13,7 +13,6 @@ from itertools import product import country_converter as coco import geopandas as gpd import pandas as pd -from packaging.version import Version, parse logger = logging.getLogger(__name__) cc = coco.CountryConverter() @@ -84,12 +83,7 @@ def prepare_hotmaps_database(regions): gdf = gpd.GeoDataFrame(df, geometry="coordinates", crs="EPSG:4326") - kws = ( - dict(op="within") - if parse(gpd.__version__) < Version("0.10") - else dict(predicate="within") - ) - gdf = gpd.sjoin(gdf, regions, how="inner", **kws) + gdf = gpd.sjoin(gdf, regions, how="inner", predicate="within") gdf.rename(columns={"index_right": "bus"}, inplace=True) gdf["country"] = gdf.bus.str[:2] diff --git a/scripts/cluster_gas_network.py b/scripts/cluster_gas_network.py index bc4a6e14..e709d772 100755 --- a/scripts/cluster_gas_network.py +++ b/scripts/cluster_gas_network.py @@ -10,7 +10,6 @@ import logging import geopandas as gpd import pandas as pd -from packaging.version import Version, parse from pypsa.geo import haversine_pts from shapely import wkt @@ -41,12 +40,9 @@ def build_clustered_gas_network(df, bus_regions, length_factor=1.25): for i in [0, 1]: gdf = gpd.GeoDataFrame(geometry=df[f"point{i}"], crs="EPSG:4326") - kws = ( - dict(op="within") - if parse(gpd.__version__) < Version("0.10") - else dict(predicate="within") - ) - bus_mapping = gpd.sjoin(gdf, bus_regions, how="left", **kws).index_right + bus_mapping = gpd.sjoin( + gdf, bus_regions, how="left", predicate="within" + ).index_right bus_mapping = bus_mapping.groupby(bus_mapping.index).first() df[f"bus{i}"] = bus_mapping diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 34a138cd..fe74ac38 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -135,6 +135,7 @@ import pypsa import seaborn as sns from _helpers import configure_logging, update_p_nom_max from add_electricity import load_costs +from packaging.version import Version, parse from pypsa.clustering.spatial import ( busmap_by_greedy_modularity, busmap_by_hac, @@ -142,6 +143,8 @@ from pypsa.clustering.spatial import ( get_clustering_from_busmap, ) +PD_GE_2_2 = parse(pd.__version__) >= Version("2.2") + warnings.filterwarnings(action="ignore", category=UserWarning) idx = pd.IndexSlice logger = logging.getLogger(__name__) @@ -362,9 +365,11 @@ def busmap_for_n_clusters( f"`algorithm` must be one of 'kmeans' or 'hac'. Is {algorithm}." ) + compat_kws = dict(include_groups=False) if PD_GE_2_2 else {} + return ( n.buses.groupby(["country", "sub_network"], group_keys=False) - .apply(busmap_for_country, include_groups=False) + .apply(busmap_for_country, **compat_kws) .squeeze() .rename("busmap") ) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index eb24d9cf..be8aea53 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -23,15 +23,12 @@ from add_electricity import calculate_annuity, sanitize_carriers, sanitize_locat from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement from networkx.algorithms.connectivity.edge_augmentation import k_edge_augmentation -from packaging.version import Version, parse from pypsa.geo import haversine_pts from pypsa.io import import_components_from_dataframe from scipy.stats import beta spatial = SimpleNamespace() logger = logging.getLogger(__name__) -pd_version = parse(pd.__version__) -agg_group_kwargs = dict(numeric_only=False) if pd_version >= Version("1.3") else {} def define_spatial(nodes, options): @@ -1853,16 +1850,7 @@ def add_heat(n, costs): p_nom_extendable=True, ) - if isinstance(options["tes_tau"], dict): - tes_time_constant_days = options["tes_tau"][name_type] - else: - logger.warning( - "Deprecated: a future version will require you to specify 'tes_tau' ", - "for 'decentral' and 'central' separately.", - ) - tes_time_constant_days = ( - options["tes_tau"] if name_type == "decentral" else 180.0 - ) + tes_time_constant_days = options["tes_tau"][name_type] n.madd( "Store", @@ -3404,7 +3392,7 @@ def cluster_heat_buses(n): # cluster heat nodes # static dataframe agg = define_clustering(df.columns, aggregate_dict) - df = df.groupby(level=0).agg(agg, **agg_group_kwargs) + df = df.groupby(level=0).agg(agg, numeric_only=False) # time-varying data pnl = c.pnl agg = define_clustering(pd.Index(pnl.keys()), aggregate_dict) @@ -3413,7 +3401,7 @@ def cluster_heat_buses(n): def renamer(s): return s.replace("residential ", "").replace("services ", "") - pnl[k] = pnl[k].T.groupby(renamer).agg(agg[k], **agg_group_kwargs).T + pnl[k] = pnl[k].T.groupby(renamer).agg(agg[k], numeric_only=False).T # remove unclustered assets of service/residential to_drop = c.df.index.difference(df.index) From 4b6199de42d8547c35b4b35dec482ab23ffb55b3 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 9 Feb 2024 15:43:27 +0100 Subject: [PATCH 371/497] create a bus for every unique coordinate, not only substations (closes #699) --- rules/postprocess.smk | 6 +++--- scripts/base_network.py | 1 + scripts/build_bus_regions.py | 8 +++++++- scripts/simplify_network.py | 1 + 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 18d65c16..98b90fd1 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -45,7 +45,7 @@ if config["foresight"] != "perfect": ( LOGS + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ) + ), benchmark: ( BENCHMARKS @@ -74,7 +74,7 @@ if config["foresight"] != "perfect": ( LOGS + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ) + ), benchmark: ( BENCHMARKS @@ -102,7 +102,7 @@ if config["foresight"] != "perfect": ( LOGS + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ) + ), benchmark: ( BENCHMARKS diff --git a/scripts/base_network.py b/scripts/base_network.py index 1de3ef96..684ca613 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -555,6 +555,7 @@ def _set_countries_and_substations(n, config, country_shapes, offshore_shapes): for b, df in product(("bus0", "bus1"), (n.lines, n.links)): has_connections_b |= ~df.groupby(b).under_construction.min() + buses["onshore_bus"] = onshore_b buses["substation_lv"] = ( lv_b & onshore_b & (~buses["under_construction"]) & has_connections_b ) diff --git a/scripts/build_bus_regions.py b/scripts/build_bus_regions.py index a6500bb0..f9bf287e 100644 --- a/scripts/build_bus_regions.py +++ b/scripts/build_bus_regions.py @@ -135,7 +135,13 @@ if __name__ == "__main__": c_b = n.buses.country == country onshore_shape = country_shapes[country] - onshore_locs = n.buses.loc[c_b & n.buses.substation_lv, ["x", "y"]] + onshore_locs = ( + n.buses.loc[c_b & n.buses.onshore_bus] + .sort_values( + by="substation_lv", ascending=False + ) # preference for substations + .drop_duplicates(subset=["x", "y"], keep="first")[["x", "y"]] + ) onshore_regions.append( gpd.GeoDataFrame( { diff --git a/scripts/simplify_network.py b/scripts/simplify_network.py index 31bc8f4e..cc4ff4f6 100644 --- a/scripts/simplify_network.py +++ b/scripts/simplify_network.py @@ -611,6 +611,7 @@ if __name__ == "__main__": "symbol", "tags", "under_construction", + "onshore_bus", "substation_lv", "substation_off", "geometry", From 201d0ddcfe00796d92ca33fcea6728cbeeb3a409 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 9 Feb 2024 15:48:54 +0100 Subject: [PATCH 372/497] build_shapes: handle europe_shape multipolygon with shapely>=2 (closes #852) --- scripts/build_shapes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_shapes.py b/scripts/build_shapes.py index 35bae147..c5faf597 100644 --- a/scripts/build_shapes.py +++ b/scripts/build_shapes.py @@ -158,7 +158,7 @@ def country_cover(country_shapes, eez_shapes=None): shapes = pd.concat([shapes, eez_shapes]) europe_shape = shapes.unary_union if isinstance(europe_shape, MultiPolygon): - europe_shape = max(europe_shape, key=attrgetter("area")) + europe_shape = max(europe_shape.geoms, key=attrgetter("area")) return Polygon(shell=europe_shape.exterior) From e838b63ded1eb2084964639c132b24c91f1bc123 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 10 Feb 2024 16:22:36 +0000 Subject: [PATCH 373/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_electricity.smk | 27 ++++++++++------- rules/build_sector.smk | 42 ++++++++++++++++++--------- rules/collect.smk | 18 ++++++------ rules/postprocess.smk | 10 +++---- rules/solve_myopic.smk | 6 ++-- scripts/cluster_network.py | 2 +- scripts/prepare_sector_network.py | 2 +- scripts/retrieve_sector_databundle.py | 2 +- scripts/solve_network.py | 2 +- 9 files changed, 67 insertions(+), 44 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index fd925d1f..4c6650bc 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -20,7 +20,7 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider countries=config_provider("countries"), load=config_provider("load"), input: @@ -62,7 +62,7 @@ rule build_powerplants: rule base_network: params: countries=config_provider("countries"), - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider lines=config_provider("lines"), links=config_provider("links"), transformers=config_provider("transformers"), @@ -145,7 +145,7 @@ if config["enable"].get("build_cutout", False): rule build_cutout: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider cutouts=config_provider("atlite", "cutouts"), input: regions_onshore=resources("regions_onshore.geojson"), @@ -259,7 +259,7 @@ else: rule build_renewable_profiles: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider renewable=config_provider("renewable"), input: **opt, @@ -401,18 +401,22 @@ rule add_electricity: if str(fn).startswith("data/") }, base_network=resources("networks/base.nc"), - line_rating=resources("networks/line_rating.nc") - if config["lines"]["dynamic_line_rating"]["activate"] - else resources("networks/base.nc"), + line_rating=( + resources("networks/line_rating.nc") + if config["lines"]["dynamic_line_rating"]["activate"] + else resources("networks/base.nc") + ), tech_costs=COSTS, regions=resources("regions_onshore.geojson"), powerplants=resources("powerplants.csv"), hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), geth_hydro_capacities="data/geth2015_hydro_capacities.csv", unit_commitment="data/unit_commitment.csv", - fuel_price=resources("monthly_fuel_price.csv") - if config["conventional"]["dynamic_fuel_price"] - else [], + fuel_price=( + resources("monthly_fuel_price.csv") + if config["conventional"]["dynamic_fuel_price"] + else [] + ), load=resources("load.csv"), nuts3_shapes=resources("nuts3_shapes.geojson"), ua_md_gdp="data/GDP_PPP_30arcsec_v3_mapped_default.csv", @@ -540,7 +544,8 @@ rule prepare_network: snapshots={ "resolution": config["snapshots"].get("resolution", False), "segmentation": config["snapshots"].get("segmentation", False), - }, # TODO: use config provider + }, + # TODO: use config provider links=config_provider("links"), lines=config_provider("lines"), co2base=config_provider("electricity", "co2base"), diff --git a/rules/build_sector.smk b/rules/build_sector.smk index f0081d32..aea16519 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -94,7 +94,9 @@ rule build_gas_input_locations: regions_offshore=resources("regions_offshore_elec_s{simpl}_{clusters}.geojson"), output: gas_input_nodes=resources("gas_input_locations_s{simpl}_{clusters}.geojson"), - gas_input_nodes_simplified=resources("gas_input_locations_s{simpl}_{clusters}_simplified.csv"), + gas_input_nodes_simplified=resources( + "gas_input_locations_s{simpl}_{clusters}_simplified.csv" + ), resources: mem_mb=2000, log: @@ -124,7 +126,7 @@ rule cluster_gas_network: rule build_daily_heat_demand: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -167,7 +169,7 @@ rule build_hourly_heat_demand: rule build_temperature_profiles: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -219,7 +221,7 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO use config_provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO use config_provider solar_thermal=config_provider("solar_thermal"), input: pop_layout=resources("pop_layout_{scope}.nc"), @@ -287,7 +289,9 @@ rule build_biomass_potentials: biomass_potentials_all=resources( "biomass_potentials_all_s{simpl}_{clusters}_{planning_horizons}.csv" ), - biomass_potentials=resources("biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv"), + biomass_potentials=resources( + "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv" + ), threads: 1 resources: mem_mb=1000, @@ -707,7 +711,7 @@ rule build_shipping_demand: rule build_transport_demand: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider sector=config_provider("sector"), input: clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), @@ -814,7 +818,9 @@ rule prepare_sector_network: network=resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), energy_totals_name=resources("energy_totals.csv"), eurostat=input_eurostat, - pop_weighted_energy_totals=resources("pop_weighted_energy_totals_s{simpl}_{clusters}.csv"), + pop_weighted_energy_totals=resources( + "pop_weighted_energy_totals_s{simpl}_{clusters}.csv" + ), shipping_demand=resources("shipping_demand_s{simpl}_{clusters}.csv"), transport_demand=resources("transport_demand_s{simpl}_{clusters}.csv"), transport_data=resources("transport_data_s{simpl}_{clusters}.csv"), @@ -823,10 +829,14 @@ rule prepare_sector_network: co2_totals_name=resources("co2_totals.csv"), co2="data/bundle-sector/eea/UNFCCC_v23.csv", biomass_potentials=( - resources("biomass_potentials_s{simpl}_{clusters}_" - + "{}.csv".format(config["biomass"]["year"])) + resources( + "biomass_potentials_s{simpl}_{clusters}_" + + "{}.csv".format(config["biomass"]["year"]) + ) if config["foresight"] == "overnight" - else resources("biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv") + else resources( + "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv" + ) ), costs=( "data/costs_{}.csv".format(config["costs"]["year"]) @@ -840,9 +850,15 @@ rule prepare_sector_network: busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), simplified_pop_layout=resources("pop_layout_elec_s{simpl}.csv"), - industrial_demand=resources("industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv"), - hourly_heat_demand_total=resources("hourly_heat_demand_total_elec_s{simpl}_{clusters}.nc"), - district_heat_share=resources("district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv"), + industrial_demand=resources( + "industrial_energy_demand_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), + hourly_heat_demand_total=resources( + "hourly_heat_demand_total_elec_s{simpl}_{clusters}.nc" + ), + district_heat_share=resources( + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), temp_soil_total=resources("temp_soil_total_elec_s{simpl}_{clusters}.nc"), temp_soil_rural=resources("temp_soil_rural_elec_s{simpl}_{clusters}.nc"), temp_soil_urban=resources("temp_soil_urban_elec_s{simpl}_{clusters}.nc"), diff --git a/rules/collect.smk b/rules/collect.smk index 0fb19165..8a451d7a 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -24,7 +24,7 @@ rule cluster_networks: expand( resources("networks/elec_s{simpl}_{clusters}.nc"), **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), @@ -33,7 +33,7 @@ rule extra_components_networks: expand( resources("networks/elec_s{simpl}_{clusters}_ec.nc"), **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), @@ -42,7 +42,7 @@ rule prepare_elec_networks: expand( resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), @@ -52,7 +52,7 @@ rule prepare_sector_networks: RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), @@ -61,7 +61,7 @@ rule solve_elec_networks: expand( RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), @@ -71,7 +71,7 @@ rule solve_sector_networks: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), @@ -81,7 +81,7 @@ rule solve_sector_networks_perfect: RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), @@ -91,12 +91,12 @@ rule validate_elec_networks: RESULTS + "figures/.statistics_plots_elec_s{simpl}_{clusters}_ec_l{ll}_{opts}", **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), expand( RESULTS + "figures/.validation_{kind}_plots_elec_s{simpl}_{clusters}_ec_l{ll}_{opts}", **config["scenario"], run=config["run"]["name"], - kind=["production", "prices", "cross_border"] + kind=["production", "prices", "cross_border"], ), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 19dc34be..7e269688 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -162,7 +162,7 @@ rule make_summary: params: foresight=config_provider("foresight"), costs=config_provider("costs"), - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider scenario=config_provider("scenario"), RDIR=RDIR, input: @@ -174,7 +174,7 @@ rule make_summary: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), costs=( "data/costs_{}.csv".format(config["costs"]["year"]) @@ -189,7 +189,7 @@ rule make_summary: RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), h2_plot=expand( ( @@ -199,7 +199,7 @@ rule make_summary: else [] ), **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), ch4_plot=expand( ( @@ -209,7 +209,7 @@ rule make_summary: else [] ), **config["scenario"], - run=config["run"]["name"] + run=config["run"]["name"], ), output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index fac58456..7035f1c1 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -21,7 +21,9 @@ rule add_existing_baseyear: ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), - existing_heating_distribution=resources("existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv"), + existing_heating_distribution=resources( + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv", existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv", existing_offwind="data/existing_infrastructure/offwind_capacity_IRENA.csv", @@ -54,7 +56,7 @@ rule add_brownfield: "sector", "H2_retrofit_capacity_per_CH4" ), threshold_capacity=config_provider("existing_capacities", " threshold_capacity"), - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider carriers=config_provider("electricity", "renewable_carriers"), input: **{ diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 44b83e99..bd00a258 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -133,7 +133,7 @@ import numpy as np import pandas as pd import pypsa import seaborn as sns -from _helpers import configure_logging, update_p_nom_max, set_scenario_config +from _helpers import configure_logging, set_scenario_config, update_p_nom_max from add_electricity import load_costs from packaging.version import Version, parse from pypsa.clustering.spatial import ( diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 06aea9ec..b1161c19 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -18,7 +18,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts, set_scenario_config +from _helpers import set_scenario_config, update_config_with_sector_opts from add_electricity import calculate_annuity, sanitize_carriers, sanitize_locations from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index defc806c..f95986b4 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -13,8 +13,8 @@ from pathlib import Path from _helpers import ( configure_logging, progress_retrieve, - validate_checksum, set_scenario_config, + validate_checksum, ) logger = logging.getLogger(__name__) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 5ca0ec82..b828bbd2 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -40,8 +40,8 @@ from _benchmark import memory_logger from _helpers import ( configure_logging, get_opt, - update_config_with_sector_opts, set_scenario_config, + update_config_with_sector_opts, ) from pypsa.descriptors import get_activity_mask from pypsa.descriptors import get_switchable_as_dense as get_as_dense From a9dad3f34ece29af49481738b1d0b6ddd43d67d1 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 10 Feb 2024 18:09:23 +0100 Subject: [PATCH 374/497] add new resources(), logs(), benchmarks(), config_providers() --- Snakefile | 2 +- rules/build_electricity.smk | 63 +++++++++++++------------- rules/build_sector.smk | 90 ++++++++++++++++--------------------- rules/collect.smk | 6 --- rules/common.smk | 10 ++--- rules/postprocess.smk | 68 ++++++++++------------------ rules/retrieve.smk | 4 +- rules/solve_electricity.smk | 18 +++----- rules/solve_myopic.smk | 37 +++++---------- rules/solve_overnight.smk | 5 +-- rules/solve_perfect.smk | 84 +++++++++++++++------------------- rules/validate.smk | 14 +++--- 12 files changed, 163 insertions(+), 238 deletions(-) diff --git a/Snakefile b/Snakefile index e0949ed9..7df61162 100644 --- a/Snakefile +++ b/Snakefile @@ -91,7 +91,7 @@ if config["foresight"] == "perfect": rule all: input: - RESULTS + "graphs/costs.pdf", + expand(RESULTS + "graphs/costs.pdf", run=config["run"]["name"]), default_target: True diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 4c6650bc..951d3331 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -20,7 +20,7 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, countries=config_provider("countries"), load=config_provider("load"), input: @@ -62,7 +62,7 @@ rule build_powerplants: rule base_network: params: countries=config_provider("countries"), - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, lines=config_provider("lines"), links=config_provider("links"), transformers=config_provider("transformers"), @@ -145,7 +145,7 @@ if config["enable"].get("build_cutout", False): rule build_cutout: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, cutouts=config_provider("atlite", "cutouts"), input: regions_onshore=resources("regions_onshore.geojson"), @@ -170,7 +170,7 @@ if config["enable"].get("build_natura_raster", False): rule build_natura_raster: input: natura=ancient("data/bundle/natura/Natura2000_end2015.shp"), - cutouts=expand("cutouts/" + CDIR + "{cutouts}.nc", **config["atlite"]), + cutouts=expand("cutouts/" + CDIR + "{cutouts}.nc", **config_provider("atlite")), output: resources("natura.tiff"), resources: @@ -189,8 +189,8 @@ rule build_ship_raster: cutouts=expand( "cutouts/" + CDIR + "{cutout}.nc", cutout=[ - config["renewable"][k]["cutout"] - for k in config["electricity"]["renewable_carriers"] + config_provider("renewable", k, "cutout") + for k in config_provider("electricity", "renewable_carriers") ], ), output: @@ -214,30 +214,30 @@ rule determine_availability_matrix_MD_UA: wdpa_marine="data/WDPA_WDOECM_marine.gpkg", gebco=lambda w: ( "data/bundle/GEBCO_2014_2D.nc" - if "max_depth" in config["renewable"][w.technology].keys() + if config_provider("renewable", w.technology)(w).get("max_depth") else [] ), ship_density=lambda w: ( - RESOURCES + "shipdensity_raster.tif" - if "ship_threshold" in config["renewable"][w.technology].keys() + resources("shipdensity_raster.tif") + if "ship_threshold" in config_provider("renewable", w.technology)(w).keys() else [] ), - country_shapes=RESOURCES + "country_shapes.geojson", - offshore_shapes=RESOURCES + "offshore_shapes.geojson", + country_shapes=resources("country_shapes.geojson"), + offshore_shapes=resources("offshore_shapes.geojson"), regions=lambda w: ( - RESOURCES + "regions_onshore.geojson" + resources("regions_onshore.geojson") if w.technology in ("onwind", "solar") - else RESOURCES + "regions_offshore.geojson" + else resources("regions_offshore.geojson") ), cutout=lambda w: "cutouts/" + CDIR - + config["renewable"][w.technology]["cutout"] + + config_provider("renewable", w.technology, "cutout")(w) + ".nc", output: - availability_matrix=RESOURCES + "availability_matrix_MD-UA_{technology}.nc", - availability_map=RESOURCES + "availability_matrix_MD-UA_{technology}.png", + availability_matrix=resources("availability_matrix_MD-UA_{technology}.nc"), + availability_map=resources("availability_matrix_MD-UA_{technology}.png"), log: - LOGS + "determine_availability_matrix_MD_UA_{technology}.log", + logs("determine_availability_matrix_MD_UA_{technology}.log"), threads: ATLITE_NPROCESSES resources: mem_mb=ATLITE_NPROCESSES * 5000, @@ -250,8 +250,7 @@ rule determine_availability_matrix_MD_UA: # Optional input when having Ukraine (UA) or Moldova (MD) in the countries list if {"UA", "MD"}.intersection(set(config["countries"])): opt = { - "availability_matrix_MD_UA": RESOURCES - + "availability_matrix_MD-UA_{technology}.nc" + "availability_matrix_MD_UA": resources("availability_matrix_MD-UA_{technology}.nc") } else: opt = {} @@ -259,7 +258,7 @@ else: rule build_renewable_profiles: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, renewable=config_provider("renewable"), input: **opt, @@ -272,7 +271,7 @@ rule build_renewable_profiles: ), luisa=lambda w: ( "data/LUISA_basemap_020321_50m.tif" - if config["renewable"][w.technology].get("luisa") + if config_provider("renewable", w.technology, "luisa")(w) else [] ), gebco=ancient( @@ -340,7 +339,7 @@ rule build_hydro_profile: input: country_shapes=resources("country_shapes.geojson"), eia_hydro_generation="data/eia_hydro_annual_generation.csv", - cutout=f"cutouts/" + CDIR + config["renewable"]["hydro"]["cutout"] + ".nc", + cutout=f"cutouts/" + CDIR + config_provider("renewable", "hydro", "cutout") + ".nc", output: resources("profile_hydro.nc"), log: @@ -357,12 +356,12 @@ if config["lines"]["dynamic_line_rating"]["activate"]: rule build_line_rating: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, input: base_network=resources("networks/base.nc"), cutout="cutouts/" + CDIR - + config["lines"]["dynamic_line_rating"]["cutout"] + + config_provider("lines", "dynamic_line_rating", "cutout") + ".nc", output: output=resources("networks/line_rating.nc"), @@ -391,19 +390,19 @@ rule add_electricity: input: **{ f"profile_{tech}": resources(f"profile_{tech}.nc") - for tech in config["electricity"]["renewable_carriers"] + for tech in config_provider("electricity", "renewable_carriers") }, **{ f"conventional_{carrier}_{attr}": fn for carrier, d in config.get("conventional", {None: {}}).items() - if carrier in config["electricity"]["conventional_carriers"] + if carrier in config_provider("electricity", "conventional_carriers") for attr, fn in d.items() if str(fn).startswith("data/") }, base_network=resources("networks/base.nc"), line_rating=( resources("networks/line_rating.nc") - if config["lines"]["dynamic_line_rating"]["activate"] + if config_provider("lines", "dynamic_line_rating", "activate") else resources("networks/base.nc") ), tech_costs=COSTS, @@ -414,7 +413,7 @@ rule add_electricity: unit_commitment="data/unit_commitment.csv", fuel_price=( resources("monthly_fuel_price.csv") - if config["conventional"]["dynamic_fuel_price"] + if config_provider("conventional", "dynamic_fuel_price") else [] ), load=resources("load.csv"), @@ -493,7 +492,7 @@ rule cluster_network: busmap=ancient(resources("busmap_elec_s{simpl}.csv")), custom_busmap=( "data/custom_busmap_elec_s{simpl}_{clusters}.csv" - if config["enable"].get("custom_busmap", False) + if config_provider("enable", "custom_busmap", default=False) else [] ), tech_costs=COSTS, @@ -542,10 +541,10 @@ rule add_extra_components: rule prepare_network: params: snapshots={ - "resolution": config["snapshots"].get("resolution", False), - "segmentation": config["snapshots"].get("segmentation", False), + "resolution": config_provider("snapshots", "resolution", default=False), + "segmentation": config_provider("snapshots", "segmentation", default=False), }, - # TODO: use config provider + links=config_provider("links"), lines=config_provider("lines"), co2base=config_provider("electricity", "co2base"), diff --git a/rules/build_sector.smk b/rules/build_sector.smk index aea16519..a26efaf4 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -7,7 +7,7 @@ rule build_population_layouts: input: nuts3_shapes=resources("nuts3_shapes.geojson"), urban_percent="data/urban_percent.csv", - cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", + cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", output: pop_layout_total=resources("pop_layout_total.nc"), pop_layout_urban=resources("pop_layout_urban.nc"), @@ -31,7 +31,7 @@ rule build_clustered_population_layouts: pop_layout_urban=resources("pop_layout_urban.nc"), pop_layout_rural=resources("pop_layout_rural.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", + cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", output: clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), log: @@ -52,7 +52,7 @@ rule build_simplified_population_layouts: pop_layout_urban=resources("pop_layout_urban.nc"), pop_layout_rural=resources("pop_layout_rural.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"), - cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", + cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", output: clustered_pop_layout=resources("pop_layout_elec_s{simpl}.csv"), resources: @@ -126,11 +126,11 @@ rule cluster_gas_network: rule build_daily_heat_demand: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", + cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", output: heat_demand=resources("daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc"), resources: @@ -148,19 +148,19 @@ rule build_daily_heat_demand: rule build_hourly_heat_demand: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, input: heat_profile="data/heat_load_profile_BDEW.csv", - heat_demand=RESOURCES + "daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", + heat_demand=resources("daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc"), output: - heat_demand=RESOURCES + "hourly_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc", + heat_demand=resources("hourly_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc"), resources: mem_mb=2000, threads: 8 log: - LOGS + "build_hourly_heat_demand_{scope}_{simpl}_{clusters}.loc", + logs("build_hourly_heat_demand_{scope}_{simpl}_{clusters}.loc"), benchmark: - BENCHMARKS + "build_hourly_heat_demand/{scope}_s{simpl}_{clusters}" + benchmarks("build_hourly_heat_demand/{scope}_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -169,11 +169,11 @@ rule build_hourly_heat_demand: rule build_temperature_profiles: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", + cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", output: temp_soil=resources("temp_soil_{scope}_elec_s{simpl}_{clusters}.nc"), temp_air=resources("temp_air_{scope}_elec_s{simpl}_{clusters}.nc"), @@ -221,12 +221,12 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO use config_provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, # TODO use config_provider solar_thermal=config_provider("solar_thermal"), input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config["atlite"]["default_cutout"] + ".nc", + cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", output: solar_thermal=resources("solar_thermal_{scope}_elec_s{simpl}_{clusters}.nc"), resources: @@ -711,7 +711,7 @@ rule build_shipping_demand: rule build_transport_demand: params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, sector=config_provider("sector"), input: clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), @@ -740,18 +740,17 @@ rule build_transport_demand: rule build_district_heat_share: params: - sector=config["sector"], + sector=config_provider("sector"), input: - district_heat_share=RESOURCES + "district_heat_share.csv", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", + district_heat_share=resources("district_heat_share.csv"), + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), output: - district_heat_share=RESOURCES - + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + district_heat_share=resources("district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv"), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_district_heat_share_s{simpl}_{clusters}_{planning_horizons}.log", + logs("build_district_heat_share_s{simpl}_{clusters}_{planning_horizons}.log"), conda: "../envs/environment.yaml" script: @@ -760,32 +759,25 @@ rule build_district_heat_share: rule build_existing_heating_distribution: params: - baseyear=config["scenario"]["planning_horizons"][0], - sector=config["sector"], - existing_capacities=config["existing_capacities"], + baseyear=config_provider("scenario", "planning_horizons", 0), + sector=config_provider("sector"), + existing_capacities=config_provider("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", + 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", + 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 + planning_horizons=config_provider("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", + logs("build_existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.log"), benchmark: - ( - BENCHMARKS - + "build_existing_heating_distribution/elec_s{simpl}_{clusters}_{planning_horizons}" - ) + benchmarks("build_existing_heating_distribution/elec_s{simpl}_{clusters}_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -831,16 +823,16 @@ rule prepare_sector_network: biomass_potentials=( resources( "biomass_potentials_s{simpl}_{clusters}_" - + "{}.csv".format(config["biomass"]["year"]) + + "{}.csv".format(config_provider("biomass", "year")) ) - if config["foresight"] == "overnight" + if config_provider("foresight") == "overnight" else resources( "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv" ) ), costs=( - "data/costs_{}.csv".format(config["costs"]["year"]) - if config["foresight"] == "overnight" + "data/costs_{}.csv".format(config_provider("costs", "year")) + if config_provider("foresight") == "overnight" else "data/costs_{planning_horizons}.csv" ), profile_offwind_ac=resources("profile_offwind-ac.nc"), @@ -873,17 +865,17 @@ rule prepare_sector_network: cop_air_urban=resources("cop_air_urban_elec_s{simpl}_{clusters}.nc"), solar_thermal_total=( resources("solar_thermal_total_elec_s{simpl}_{clusters}.nc") - if config["sector"]["solar_thermal"] + if config_provider("sector", "solar_thermal") else [] ), solar_thermal_urban=( resources("solar_thermal_urban_elec_s{simpl}_{clusters}.nc") - if config["sector"]["solar_thermal"] + if config_provider("sector", "solar_thermal") else [] ), solar_thermal_rural=( resources("solar_thermal_rural_elec_s{simpl}_{clusters}.nc") - if config["sector"]["solar_thermal"] + if config_provider("sector", "solar_thermal") else [] ), output: @@ -893,13 +885,9 @@ rule prepare_sector_network: resources: mem_mb=2000, log: - LOGS - + "prepare_sector_network_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", + logs("prepare_sector_network_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), benchmark: - ( - BENCHMARKS - + "prepare_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("prepare_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: diff --git a/rules/collect.smk b/rules/collect.smk index 8a451d7a..9be12f25 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -13,12 +13,6 @@ localrules: solve_sector_networks, -rule all: - input: - expand(RESULTS + "graphs/costs.pdf", run=config["run"]["name"]), - default_target: True - - rule cluster_networks: input: expand( diff --git a/rules/common.smk b/rules/common.smk index b6c0f734..af991be7 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -78,8 +78,8 @@ def config_provider(*keys, default=None): def solver_threads(w): - solver_options = config["solving"]["solver_options"] - option_set = config["solving"]["solver"]["options"] + solver_options = config_provider("solving", "solver_options") + option_set = config_provider("solving", "solver", "options") threads = solver_options[option_set].get("threads", 4) return threads @@ -105,7 +105,7 @@ def memory(w): def input_custom_extra_functionality(w): - path = config["solving"]["options"].get("custom_extra_functionality", False) + path = config_provider("solving", "options", "custom_extra_functionality", default=False) if path: return os.path.join(os.path.dirname(workflow.snakefile), path) return [] @@ -129,12 +129,12 @@ def has_internet_access(url="www.zenodo.org") -> bool: def input_eurostat(w): # 2016 includes BA, 2017 does not - report_year = config["energy"]["eurostat_report_year"] + report_year = config_provider("energy", "eurostat_report_year") return f"data/bundle-sector/eurostat-energy_balances-june_{report_year}_edition" def solved_previous_horizon(wildcards): - planning_horizons = config["scenario"]["planning_horizons"] + planning_horizons = config_provider("scenario", "planning_horizons") i = planning_horizons.index(int(wildcards.planning_horizons)) planning_horizon_p = str(planning_horizons[i - 1]) return ( diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 7e269688..98399cde 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -13,16 +13,15 @@ if config_provider("foresight") != "perfect": params: plotting=config_provider("plotting"), input: - network=RESOURCES + "networks/elec_s{simpl}_{clusters}.nc", - regions_onshore=RESOURCES - + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + network=resources("networks/elec_s{simpl}_{clusters}.nc"), + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), output: map=RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", threads: 1 resources: mem_mb=4000, benchmark: - BENCHMARKS + "plot_power_network_clustered/elec_s{simpl}_{clusters}" + benchmarks("plot_power_network_clustered/elec_s{simpl}_{clusters}") conda: "../envs/environment.yaml" script: @@ -34,7 +33,7 @@ if config_provider("foresight") != "perfect": input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), output: map=RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", @@ -42,15 +41,9 @@ if config_provider("foresight") != "perfect": resources: mem_mb=10000, log: - ( - LOGS - + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + logs("plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log") benchmark: - ( - BENCHMARKS - + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -63,7 +56,7 @@ if config_provider("foresight") != "perfect": input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), output: map=RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf", @@ -71,15 +64,9 @@ if config_provider("foresight") != "perfect": resources: mem_mb=10000, log: - ( - LOGS - + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + logs("plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), benchmark: - ( - BENCHMARKS - + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -91,7 +78,7 @@ if config_provider("foresight") != "perfect": input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), output: map=RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf", @@ -99,15 +86,9 @@ if config_provider("foresight") != "perfect": resources: mem_mb=10000, log: - ( - LOGS - + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + logs("plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), benchmark: - ( - BENCHMARKS - + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -122,7 +103,7 @@ if config_provider("foresight") == "perfect": input: network=RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", - regions=RESOURCES + "regions_onshore_elec_s{simpl}_{clusters}.geojson", + regions=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), output: **{ f"map_{year}": RESULTS @@ -134,8 +115,7 @@ if config_provider("foresight") == "perfect": resources: mem_mb=10000, benchmark: - BENCHMARKS - +"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_benchmark" + benchmarks("postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_benchmark") conda: "../envs/environment.yaml" script: @@ -151,7 +131,7 @@ rule copy_config: resources: mem_mb=1000, benchmark: - BENCHMARKS + "copy_config" + benchmarks("copy_config") conda: "../envs/environment.yaml" script: @@ -162,7 +142,7 @@ rule make_summary: params: foresight=config_provider("foresight"), costs=config_provider("costs"), - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, scenario=config_provider("scenario"), RDIR=RDIR, input: @@ -177,9 +157,9 @@ rule make_summary: run=config["run"]["name"], ), costs=( - "data/costs_{}.csv".format(config["costs"]["year"]) + "data/costs_{}.csv".format(config_provider("costs", "year")) if config_provider("foresight") == "overnight" - else "data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]) + else "data/costs_{}.csv".format(config_provider("scenario", "planning_horizons", 0)) ), ac_plot=expand( RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", @@ -195,7 +175,7 @@ rule make_summary: ( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf" - if config["sector"]["H2_network"] + if config_provider("sector", "H2_network") else [] ), **config["scenario"], @@ -205,7 +185,7 @@ rule make_summary: ( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf" - if config["sector"]["gas_network"] + if config_provider("sector", "gas_network") else [] ), **config["scenario"], @@ -231,9 +211,9 @@ rule make_summary: resources: mem_mb=10000, log: - LOGS + "make_summary.log", + logs("make_summary.log"), benchmark: - BENCHMARKS + "make_summary" + benchmarks("make_summary") conda: "../envs/environment.yaml" script: @@ -263,9 +243,9 @@ rule plot_summary: resources: mem_mb=10000, log: - LOGS + "plot_summary.log", + logs("plot_summary.log"), benchmark: - BENCHMARKS + "plot_summary" + benchmarks("plot_summary") conda: "../envs/environment.yaml" script: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 46741830..a0647e57 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -50,7 +50,7 @@ if config["enable"].get("retrieve_irena"): onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv", solar="data/existing_infrastructure/solar_capacity_IRENA.csv", log: - LOGS + "retrieve_irena.log", + logs("retrieve_irena.log"), resources: mem_mb=1000, retries: 2 @@ -86,7 +86,7 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_cost_data", T input: HTTP.remote( "raw.githubusercontent.com/PyPSA/technology-data/{}/outputs/".format( - config["costs"]["version"] + config_provider("costs", "version") ) + "costs_{year}.csv", keep_local=True, diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index fc8e8cea..4ff94bf2 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -19,12 +19,11 @@ rule solve_network: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", log: solver=normpath( - LOGS + "solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_solver.log" + logs("solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_solver.log") ), - python=LOGS - + "solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_python.log", + python=logs("solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_python.log"), benchmark: - BENCHMARKS + "solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}" + benchmarks("solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}") threads: solver_threads resources: mem_mb=memory, @@ -46,16 +45,11 @@ rule solve_operations_network: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op.nc", log: solver=normpath( - LOGS - + "solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_solver.log" + logs("solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_solver.log") ), - python=LOGS - + "solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_python.log", + python=logs("solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_python.log"), benchmark: - ( - BENCHMARKS - + "solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}" - ) + benchmarks("solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}") threads: 4 resources: mem_mb=(lambda w: 10000 + 372 * int(w.clusters)), diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 7035f1c1..260837b7 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -36,13 +36,9 @@ rule add_existing_baseyear: resources: mem_mb=2000, log: - LOGS - + "add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", + logs("add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), benchmark: - ( - BENCHMARKS - + "add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -56,16 +52,16 @@ rule add_brownfield: "sector", "H2_retrofit_capacity_per_CH4" ), threshold_capacity=config_provider("existing_capacities", " threshold_capacity"), - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, # TODO: use config_provider + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, carriers=config_provider("electricity", "renewable_carriers"), input: **{ - f"profile_{tech}": RESOURCES + f"profile_{tech}.nc" - for tech in config["electricity"]["renewable_carriers"] + f"profile_{tech}": resources(f"profile_{tech}.nc") + for tech in config_provider("electricity", "renewable_carriers") if tech != "hydro" }, - simplify_busmap=RESOURCES + "busmap_elec_s{simpl}.csv", - cluster_busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", + simplify_busmap=resources("busmap_elec_s{simpl}.csv"), + cluster_busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), 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 @@ -79,13 +75,9 @@ rule add_brownfield: resources: mem_mb=10000, log: - LOGS - + "add_brownfield_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.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}" - ) + benchmarks("add_brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -115,19 +107,14 @@ rule solve_sector_network_myopic: shadow: "shallow" log: - solver=LOGS - + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log", - python=LOGS - + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", + solver=logs("elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log"), + python=logs("elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log"), threads: solver_threads resources: mem_mb=config_provider("solving", "mem"), walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: - ( - BENCHMARKS - + "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 76621012..7811efe3 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -33,10 +33,7 @@ rule solve_sector_network: mem_mb=config_provider("solving", "mem"), walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: - ( - BENCHMARKS - + "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 9e164a16..85f87d9b 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -3,22 +3,21 @@ # SPDX-License-Identifier: MIT rule add_existing_baseyear: params: - baseyear=config["scenario"]["planning_horizons"][0], - sector=config["sector"], - existing_capacities=config["existing_capacities"], - costs=config["costs"], + baseyear=config_provider("scenario", "planning_horizons", 0), + sector=config_provider("sector"), + existing_capacities=config_provider("existing_capacities"), + costs=config_provider("costs"), input: network=RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - powerplants=RESOURCES + "powerplants.csv", - busmap_s=RESOURCES + "busmap_elec_s{simpl}.csv", - busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", - clustered_pop_layout=RESOURCES + "pop_layout_elec_s{simpl}_{clusters}.csv", - costs="data/costs_{}.csv".format(config["scenario"]["planning_horizons"][0]), - cop_soil_total=RESOURCES + "cop_soil_total_elec_s{simpl}_{clusters}.nc", - cop_air_total=RESOURCES + "cop_air_total_elec_s{simpl}_{clusters}.nc", - existing_heating_distribution=RESOURCES - + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv", + powerplants=resources("powerplants.csv"), + busmap_s=resources("busmap_elec_s{simpl}.csv"), + busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), + costs="data/costs_{}.csv".format(config_provider("scenario", "planning_horizons", 0)), + cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), + cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), + existing_heating_distribution=resources("existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv"), existing_heating="data/existing_infrastructure/existing_heating_raw.csv", existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv", existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv", @@ -27,18 +26,14 @@ rule add_existing_baseyear: RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", wildcard_constraints: - planning_horizons=config["scenario"]["planning_horizons"][0], #only applies to baseyear + planning_horizons=config_provider("scenario", "planning_horizons", 0), #only applies to baseyear threads: 1 resources: mem_mb=2000, log: - LOGS - + "add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", + logs("add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), benchmark: - ( - BENCHMARKS - + "add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" - ) + benchmarks("add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -51,13 +46,13 @@ rule prepare_perfect_foresight: f"network_{year}": RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_" + f"{year}.nc" - for year in config["scenario"]["planning_horizons"][1:] + for year in config_provider("scenario", "planning_horizons")[1:] }, brownfield_network=lambda w: ( RESULTS + "prenetworks-brownfield/" + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_" - + "{}.nc".format(str(config["scenario"]["planning_horizons"][0])) + + "{}.nc".format(str(config_provider("scenario", "planning_horizons", 0))) ), output: RESULTS @@ -66,13 +61,9 @@ rule prepare_perfect_foresight: resources: mem_mb=10000, log: - LOGS - + "prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}.log", + logs("prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}.log"), benchmark: - ( - BENCHMARKS - + "prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}" - ) + benchmarks("prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}") conda: "../envs/environment.yaml" script: @@ -81,13 +72,11 @@ rule prepare_perfect_foresight: rule solve_sector_network_perfect: params: - solving=config["solving"], - foresight=config["foresight"], - sector=config["sector"], - planning_horizons=config["scenario"]["planning_horizons"], - co2_sequestration_potential=config["sector"].get( - "co2_sequestration_potential", 200 - ), + solving=config_provider("solving"), + foresight=config_provider("foresight"), + sector=config_provider("sector"), + planning_horizons=config_provider("scenario", "planning_horizons"), + co2_sequestration_potential=config_provider("sector", "co2_sequestration_potential", 200), custom_extra_functionality=input_custom_extra_functionality, input: network=RESULTS @@ -99,7 +88,7 @@ rule solve_sector_network_perfect: + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", threads: solver_threads resources: - mem_mb=config["solving"]["mem"], + mem_mb=config_provider("solving", "mem"), shadow: "shallow" log: @@ -110,10 +99,7 @@ rule solve_sector_network_perfect: memory=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_memory.log", benchmark: - ( - BENCHMARKS - + "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years}" - ) + benchmarks("solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years}") conda: "../envs/environment.yaml" script: @@ -124,13 +110,13 @@ rule make_summary_perfect: input: **{ f"networks_{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}": RESULTS - + f"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc" - for simpl in config["scenario"]["simpl"] - for clusters in config["scenario"]["clusters"] - for opts in config["scenario"]["opts"] - for sector_opts in config["scenario"]["sector_opts"] - for ll in config["scenario"]["ll"] - }, + + f"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc" + for simpl in config_provider("scenario", "simpl") + for clusters in config_provider("scenario", "clusters") + for opts in config_provider("scenario", "opts") + for sector_opts in config_provider("scenario", "sector_opts") + for ll in config_provider("scenario", "ll") + }, costs="data/costs_2020.csv", output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", @@ -153,9 +139,9 @@ rule make_summary_perfect: resources: mem_mb=10000, log: - LOGS + "make_summary_perfect.log", + logs("make_summary_perfect.log"), benchmark: - (BENCHMARKS + "make_summary_perfect") + benchmarks("make_summary_perfect") conda: "../envs/environment.yaml" script: diff --git a/rules/validate.smk b/rules/validate.smk index fefb6ba6..f8ebea5d 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -17,8 +17,8 @@ rule build_electricity_production: The data is used for validation of the optimization results. """ params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, - countries=config["countries"], + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + countries=config_provider("countries"), output: resources("historical_electricity_production.csv"), log: @@ -35,8 +35,8 @@ rule build_cross_border_flows: The data is used for validation of the optimization results. """ params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, - countries=config["countries"], + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + countries=config_provider("countries"), input: network=resources("networks/base.nc"), output: @@ -55,8 +55,8 @@ rule build_electricity_prices: The data is used for validation of the optimization results. """ params: - snapshots={k: config["snapshots"][k] for k in ["start", "end", "inclusive"]}, - countries=config["countries"], + snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + countries=config_provider("countries"), output: resources("historical_electricity_prices.csv"), log: @@ -85,7 +85,7 @@ rule plot_validation_electricity_production: rule plot_validation_cross_border_flows: params: - countries=config["countries"], + countries=config_provider("countries"), input: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", cross_border_flows=resources("historical_cross_border_flows.csv"), From 4ff06046fc72b316a7fbc01ad8295d2546db322f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 10 Feb 2024 17:09:46 +0000 Subject: [PATCH 375/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_electricity.smk | 40 +++++++++++++++++++++------- rules/build_sector.smk | 52 +++++++++++++++++++++++++++---------- rules/common.smk | 4 ++- rules/postprocess.smk | 40 +++++++++++++++++++++------- rules/solve_electricity.smk | 8 ++++-- rules/solve_myopic.smk | 32 +++++++++++++++++------ rules/solve_overnight.smk | 4 ++- rules/solve_perfect.smk | 46 +++++++++++++++++++++----------- rules/validate.smk | 12 ++++++--- 9 files changed, 175 insertions(+), 63 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 951d3331..bdae24d1 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -20,7 +20,9 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, countries=config_provider("countries"), load=config_provider("load"), input: @@ -62,7 +64,9 @@ rule build_powerplants: rule base_network: params: countries=config_provider("countries"), - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, lines=config_provider("lines"), links=config_provider("links"), transformers=config_provider("transformers"), @@ -145,7 +149,10 @@ if config["enable"].get("build_cutout", False): rule build_cutout: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) + for k in ["start", "end", "inclusive"] + }, cutouts=config_provider("atlite", "cutouts"), input: regions_onshore=resources("regions_onshore.geojson"), @@ -170,7 +177,9 @@ if config["enable"].get("build_natura_raster", False): rule build_natura_raster: input: natura=ancient("data/bundle/natura/Natura2000_end2015.shp"), - cutouts=expand("cutouts/" + CDIR + "{cutouts}.nc", **config_provider("atlite")), + cutouts=expand( + "cutouts/" + CDIR + "{cutouts}.nc", **config_provider("atlite") + ), output: resources("natura.tiff"), resources: @@ -250,7 +259,9 @@ rule determine_availability_matrix_MD_UA: # Optional input when having Ukraine (UA) or Moldova (MD) in the countries list if {"UA", "MD"}.intersection(set(config["countries"])): opt = { - "availability_matrix_MD_UA": resources("availability_matrix_MD-UA_{technology}.nc") + "availability_matrix_MD_UA": resources( + "availability_matrix_MD-UA_{technology}.nc" + ) } else: opt = {} @@ -258,7 +269,9 @@ else: rule build_renewable_profiles: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, renewable=config_provider("renewable"), input: **opt, @@ -339,7 +352,10 @@ rule build_hydro_profile: input: country_shapes=resources("country_shapes.geojson"), eia_hydro_generation="data/eia_hydro_annual_generation.csv", - cutout=f"cutouts/" + CDIR + config_provider("renewable", "hydro", "cutout") + ".nc", + cutout=f"cutouts/" + + CDIR + + config_provider("renewable", "hydro", "cutout") + + ".nc", output: resources("profile_hydro.nc"), log: @@ -356,7 +372,10 @@ if config["lines"]["dynamic_line_rating"]["activate"]: rule build_line_rating: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) + for k in ["start", "end", "inclusive"] + }, input: base_network=resources("networks/base.nc"), cutout="cutouts/" @@ -542,9 +561,10 @@ rule prepare_network: params: snapshots={ "resolution": config_provider("snapshots", "resolution", default=False), - "segmentation": config_provider("snapshots", "segmentation", default=False), + "segmentation": config_provider( + "snapshots", "segmentation", default=False + ), }, - links=config_provider("links"), lines=config_provider("lines"), co2base=config_provider("electricity", "co2base"), diff --git a/rules/build_sector.smk b/rules/build_sector.smk index a26efaf4..268113f9 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -126,7 +126,9 @@ rule cluster_gas_network: rule build_daily_heat_demand: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -148,7 +150,9 @@ rule build_daily_heat_demand: rule build_hourly_heat_demand: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, input: heat_profile="data/heat_load_profile_BDEW.csv", heat_demand=resources("daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc"), @@ -169,7 +173,9 @@ rule build_hourly_heat_demand: rule build_temperature_profiles: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -221,7 +227,9 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, # TODO use config_provider + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, # TODO use config_provider solar_thermal=config_provider("solar_thermal"), input: pop_layout=resources("pop_layout_{scope}.nc"), @@ -711,7 +719,9 @@ rule build_shipping_demand: rule build_transport_demand: params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, sector=config_provider("sector"), input: clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), @@ -745,7 +755,9 @@ rule build_district_heat_share: district_heat_share=resources("district_heat_share.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), output: - district_heat_share=resources("district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv"), + district_heat_share=resources( + "district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), threads: 1 resources: mem_mb=1000, @@ -765,19 +777,29 @@ rule build_existing_heating_distribution: 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"), + 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"), + existing_heating_distribution=resources( + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), wildcard_constraints: planning_horizons=config_provider("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"), + logs( + "build_existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.log" + ), benchmark: - benchmarks("build_existing_heating_distribution/elec_s{simpl}_{clusters}_{planning_horizons}") + benchmarks( + "build_existing_heating_distribution/elec_s{simpl}_{clusters}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: @@ -885,9 +907,13 @@ rule prepare_sector_network: resources: mem_mb=2000, log: - logs("prepare_sector_network_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), + logs( + "prepare_sector_network_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ), benchmark: - benchmarks("prepare_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "prepare_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: diff --git a/rules/common.smk b/rules/common.smk index af991be7..bf5e0894 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -105,7 +105,9 @@ def memory(w): def input_custom_extra_functionality(w): - path = config_provider("solving", "options", "custom_extra_functionality", default=False) + path = config_provider( + "solving", "options", "custom_extra_functionality", default=False + ) if path: return os.path.join(os.path.dirname(workflow.snakefile), path) return [] diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 98399cde..cf0ef6cd 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -14,7 +14,9 @@ if config_provider("foresight") != "perfect": plotting=config_provider("plotting"), input: network=resources("networks/elec_s{simpl}_{clusters}.nc"), - regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), + regions_onshore=resources( + "regions_onshore_elec_s{simpl}_{clusters}.geojson" + ), output: map=RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", threads: 1 @@ -41,9 +43,13 @@ if config_provider("foresight") != "perfect": resources: mem_mb=10000, log: - logs("plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log") + logs( + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ), benchmark: - benchmarks("plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: @@ -64,9 +70,13 @@ if config_provider("foresight") != "perfect": resources: mem_mb=10000, log: - logs("plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), + logs( + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ), benchmark: - benchmarks("plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: @@ -86,9 +96,13 @@ if config_provider("foresight") != "perfect": resources: mem_mb=10000, log: - logs("plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), + logs( + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ), benchmark: - benchmarks("plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: @@ -115,7 +129,9 @@ if config_provider("foresight") == "perfect": resources: mem_mb=10000, benchmark: - benchmarks("postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_benchmark") + benchmarks( + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_benchmark" + ) conda: "../envs/environment.yaml" script: @@ -142,7 +158,9 @@ rule make_summary: params: foresight=config_provider("foresight"), costs=config_provider("costs"), - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, scenario=config_provider("scenario"), RDIR=RDIR, input: @@ -159,7 +177,9 @@ rule make_summary: costs=( "data/costs_{}.csv".format(config_provider("costs", "year")) if config_provider("foresight") == "overnight" - else "data/costs_{}.csv".format(config_provider("scenario", "planning_horizons", 0)) + else "data/costs_{}.csv".format( + config_provider("scenario", "planning_horizons", 0) + ) ), ac_plot=expand( RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index 4ff94bf2..d3aa8d4c 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -45,9 +45,13 @@ rule solve_operations_network: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op.nc", log: solver=normpath( - logs("solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_solver.log") + logs( + "solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_solver.log" + ) + ), + python=logs( + "solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_python.log" ), - python=logs("solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_python.log"), benchmark: benchmarks("solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}") threads: 4 diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 260837b7..a6313cac 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -36,9 +36,13 @@ rule add_existing_baseyear: resources: mem_mb=2000, log: - logs("add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), + logs( + "add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ), benchmark: - benchmarks("add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: @@ -52,7 +56,9 @@ rule add_brownfield: "sector", "H2_retrofit_capacity_per_CH4" ), threshold_capacity=config_provider("existing_capacities", " threshold_capacity"), - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, carriers=config_provider("electricity", "renewable_carriers"), input: **{ @@ -75,9 +81,13 @@ rule add_brownfield: resources: mem_mb=10000, log: - logs("add_brownfield_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.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}") + benchmarks( + "add_brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: @@ -107,14 +117,20 @@ rule solve_sector_network_myopic: shadow: "shallow" log: - solver=logs("elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log"), - python=logs("elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log"), + solver=logs( + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log" + ), + python=logs( + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log" + ), threads: solver_threads resources: mem_mb=config_provider("solving", "mem"), walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: - benchmarks("solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 7811efe3..64ad007c 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -33,7 +33,9 @@ rule solve_sector_network: mem_mb=config_provider("solving", "mem"), walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: - benchmarks("solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 85f87d9b..ee16a201 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -14,10 +14,14 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs="data/costs_{}.csv".format(config_provider("scenario", "planning_horizons", 0)), + costs="data/costs_{}.csv".format( + config_provider("scenario", "planning_horizons", 0) + ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), - existing_heating_distribution=resources("existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv"), + existing_heating_distribution=resources( + "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv" + ), existing_heating="data/existing_infrastructure/existing_heating_raw.csv", existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv", existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv", @@ -31,9 +35,13 @@ rule add_existing_baseyear: resources: mem_mb=2000, log: - logs("add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log"), + logs( + "add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" + ), benchmark: - benchmarks("add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}") + benchmarks( + "add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ) conda: "../envs/environment.yaml" script: @@ -61,9 +69,13 @@ rule prepare_perfect_foresight: resources: mem_mb=10000, log: - logs("prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}.log"), + logs( + "prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}.log" + ), benchmark: - benchmarks("prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}") + benchmarks( + "prepare_perfect_foresight{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}" + ) conda: "../envs/environment.yaml" script: @@ -76,7 +88,9 @@ rule solve_sector_network_perfect: foresight=config_provider("foresight"), sector=config_provider("sector"), planning_horizons=config_provider("scenario", "planning_horizons"), - co2_sequestration_potential=config_provider("sector", "co2_sequestration_potential", 200), + co2_sequestration_potential=config_provider( + "sector", "co2_sequestration_potential", 200 + ), custom_extra_functionality=input_custom_extra_functionality, input: network=RESULTS @@ -99,7 +113,9 @@ rule solve_sector_network_perfect: memory=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_memory.log", benchmark: - benchmarks("solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years}") + benchmarks( + "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years}" + ) conda: "../envs/environment.yaml" script: @@ -110,13 +126,13 @@ rule make_summary_perfect: input: **{ f"networks_{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}": RESULTS - + f"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc" - for simpl in config_provider("scenario", "simpl") - for clusters in config_provider("scenario", "clusters") - for opts in config_provider("scenario", "opts") - for sector_opts in config_provider("scenario", "sector_opts") - for ll in config_provider("scenario", "ll") - }, + + f"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc" + for simpl in config_provider("scenario", "simpl") + for clusters in config_provider("scenario", "clusters") + for opts in config_provider("scenario", "opts") + for sector_opts in config_provider("scenario", "sector_opts") + for ll in config_provider("scenario", "ll") + }, costs="data/costs_2020.csv", output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", diff --git a/rules/validate.smk b/rules/validate.smk index f8ebea5d..3c42c5f0 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -17,7 +17,9 @@ rule build_electricity_production: The data is used for validation of the optimization results. """ params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, countries=config_provider("countries"), output: resources("historical_electricity_production.csv"), @@ -35,7 +37,9 @@ rule build_cross_border_flows: The data is used for validation of the optimization results. """ params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, countries=config_provider("countries"), input: network=resources("networks/base.nc"), @@ -55,7 +59,9 @@ rule build_electricity_prices: The data is used for validation of the optimization results. """ params: - snapshots={k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"]}, + snapshots={ + k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + }, countries=config_provider("countries"), output: resources("historical_electricity_prices.csv"), From 8781e690661b064432689511f215eaa48affa7bf Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 9 Feb 2024 18:36:16 +0100 Subject: [PATCH 376/497] bugfix: coal emissions for industry weren't tracked Also allow industrial coal demand to be regional (so we can include them in regional CO2 constraints). --- config/config.default.yaml | 1 + scripts/prepare_sector_network.py | 39 +++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 1033d49d..44b54148 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -501,6 +501,7 @@ sector: SMR_cc: true regional_methanol_demand: false regional_oil_demand: false + regional_coal_demand: false regional_co2_sequestration_potential: enable: false attribute: 'conservative estimate Mt' diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index be8aea53..18d1feb0 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -172,6 +172,13 @@ def define_spatial(nodes, options): spatial.coal.nodes = ["EU coal"] spatial.coal.locations = ["EU"] + if options["regional_coal_demand"]: + spatial.coal.demand_locations = nodes + spatial.coal.industry = nodes + " coal for industry" + else: + spatial.coal.demand_locations = ["EU"] + spatial.coal.industry = ["EU coal for industry"] + # lignite spatial.lignite = SimpleNamespace() spatial.lignite.nodes = ["EU lignite"] @@ -3048,19 +3055,41 @@ def add_industry(n, costs): mwh_coal_per_mwh_coke = 1.366 # from eurostat energy balance p_set = ( - industrial_demand["coal"].sum() - + mwh_coal_per_mwh_coke * industrial_demand["coke"].sum() + industrial_demand["coal"] + + mwh_coal_per_mwh_coke * industrial_demand["coke"] ) / nhours + if not options["regional_coal_demand"]: + p_set = p_set.sum() + + n.madd( + "Bus", + spatial.coal.industry, + location=spatial.coal.demand_locations, + carrier="coal for industry", + unit="MWh_LHV", + ) + n.madd( "Load", - spatial.coal.nodes, - suffix=" for industry", - bus=spatial.coal.nodes, + spatial.coal.industry, + bus=spatial.coal.industry, carrier="coal for industry", p_set=p_set, ) + n.madd( + "Link", + spatial.coal.industry, + bus0=spatial.coal.nodes, + bus1=spatial.coal.industry, + bus2="co2 atmosphere", + carrier="coal for industry", + p_nom_extendable=True, + efficiency2=costs.at["coal", "CO2 intensity"], + ) + + def add_waste_heat(n): # TODO options? From 17105b81256a5364739a4a2f4c3e865a3ba3fc95 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 10 Feb 2024 18:17:57 +0000 Subject: [PATCH 377/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 18d1feb0..5d5e271b 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3090,7 +3090,6 @@ def add_industry(n, costs): ) - def add_waste_heat(n): # TODO options? From 5c7bbcd94de57792d02af7c38cc4aa216ed2624a Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 11:41:48 +0200 Subject: [PATCH 378/497] retrieve electricity demand: use script in order to concat time-series --- rules/retrieve.smk | 16 ++--------- scripts/retrieve_electricity_demand.py | 37 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 scripts/retrieve_electricity_demand.py diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 2980583f..716b81c0 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -188,18 +188,6 @@ if config["enable"]["retrieve"]: if config["enable"]["retrieve"]: rule retrieve_electricity_demand: - input: - HTTP.remote( - "data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv".format( - version=( - "2019-06-05" - if config["snapshots"]["end"] < "2019" - else "2020-10-06" - ) - ), - keep_local=True, - static=True, - ), output: RESOURCES + "load_raw.csv", log: @@ -207,8 +195,8 @@ if config["enable"]["retrieve"]: resources: mem_mb=5000, retries: 2 - run: - move(input[0], output[0]) + script: + "../scripts/retrieve_electricity_demand.py" if config["enable"]["retrieve"]: diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py new file mode 100644 index 00000000..58615755 --- /dev/null +++ b/scripts/retrieve_electricity_demand.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Retrieve monthly fuel prices from Destatis. +""" + +import logging + +import pandas as pd + +logger = logging.getLogger(__name__) + +from pathlib import Path + +from _helpers import configure_logging, set_scenario_config + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("retrieve_eletricity_demand") + rootpath = ".." + else: + rootpath = "." + configure_logging(snakemake) + set_scenario_config(snakemake) + + versions = ["2019-06-05", "2020-10-06"] + url = "https://data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv" + + df1, df2 = [ + pd.read_csv(url.format(version=version), index_col=0) for version in versions + ] + res = pd.concat([df1, df2[df2.index > df1.index[-1]]], join="inner") + res.to_csv(snakemake.output[0]) From 2bd80210584921bffa9822fff215f02f2f4840e7 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 16 Aug 2023 11:47:27 +0200 Subject: [PATCH 379/497] retrieve electricity demand: make online version snakemake params --- rules/retrieve.smk | 2 ++ scripts/retrieve_electricity_demand.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 716b81c0..0fea03ac 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -188,6 +188,8 @@ if config["enable"]["retrieve"]: if config["enable"]["retrieve"]: rule retrieve_electricity_demand: + params: + versions=["2019-06-05", "2020-10-06"], output: RESOURCES + "load_raw.csv", log: diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py index 58615755..58511857 100644 --- a/scripts/retrieve_electricity_demand.py +++ b/scripts/retrieve_electricity_demand.py @@ -27,11 +27,11 @@ if __name__ == "__main__": configure_logging(snakemake) set_scenario_config(snakemake) - versions = ["2019-06-05", "2020-10-06"] url = "https://data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv" df1, df2 = [ - pd.read_csv(url.format(version=version), index_col=0) for version in versions + pd.read_csv(url.format(version=version), index_col=0) + for version in snakemake.params.versions ] res = pd.concat([df1, df2[df2.index > df1.index[-1]]], join="inner") res.to_csv(snakemake.output[0]) From 94f72d7276b2f53f5042117ccdfc5179689d9280 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 17 Aug 2023 10:17:12 +0200 Subject: [PATCH 380/497] electricity demand: remove powerstastics flag, merge sources in retrieve_electricity_demand --- doc/configtables/load.csv | 1 - doc/retrieve.rst | 2 +- rules/build_electricity.smk | 2 +- rules/retrieve.smk | 2 +- scripts/build_electricity_demand.py | 172 ++++++++++--------------- scripts/retrieve_electricity_demand.py | 16 ++- 6 files changed, 85 insertions(+), 110 deletions(-) diff --git a/doc/configtables/load.csv b/doc/configtables/load.csv index 6e98f881..ac666947 100644 --- a/doc/configtables/load.csv +++ b/doc/configtables/load.csv @@ -1,5 +1,4 @@ ,Unit,Values,Description -power_statistics,bool,"{true, false}",Whether to load the electricity consumption data of the ENTSOE power statistics (only for files from 2019 and before) or from the ENTSOE transparency data (only has load data from 2015 onwards). interpolate_limit,hours,integer,"Maximum gap size (consecutive nans) which interpolated linearly." time_shift_for_large_gaps,string,string,"Periods which are used for copying time-slices in order to fill large gaps of nans. Have to be valid ``pandas`` period strings." manual_adjustments,bool,"{true, false}","Whether to adjust the load data manually according to the function in :func:`manual_adjustment`." diff --git a/doc/retrieve.rst b/doc/retrieve.rst index 06a07441..e4800fd2 100644 --- a/doc/retrieve.rst +++ b/doc/retrieve.rst @@ -91,7 +91,7 @@ None. **Outputs** -- ``resources/load_raw.csv`` +- ``resources/electricity_demand.csv`` Rule ``retrieve_cost_data`` diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 89f4f736..ba11f060 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -24,7 +24,7 @@ rule build_electricity_demand: countries=config["countries"], load=config["load"], input: - ancient(RESOURCES + "load_raw.csv"), + ancient(RESOURCES + "electricity_demand.csv"), output: RESOURCES + "load.csv", log: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 0fea03ac..0821a6b7 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -191,7 +191,7 @@ if config["enable"]["retrieve"]: params: versions=["2019-06-05", "2020-10-06"], output: - RESOURCES + "load_raw.csv", + RESOURCES + "electricity_demand.csv", log: LOGS + "retrieve_electricity_demand.log", resources: diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index a08055ba..2810edfa 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -31,7 +31,7 @@ Relevant Settings Inputs ------ -- ``resources/load_raw.csv``: +- ``resources/electricity_demand.csv``: Outputs ------- @@ -49,7 +49,7 @@ from pandas import Timedelta as Delta logger = logging.getLogger(__name__) -def load_timeseries(fn, years, countries, powerstatistics=True): +def load_timeseries(fn, years, countries): """ Read load data from OPSD time-series package version 2020-10-06. @@ -62,10 +62,6 @@ def load_timeseries(fn, years, countries, powerstatistics=True): File name or url location (file format .csv) countries : listlike Countries for which to read load data. - powerstatistics: bool - Whether the electricity consumption data of the ENTSOE power - statistics (if true) or of the ENTSOE transparency map (if false) - should be parsed. Returns ------- @@ -74,17 +70,9 @@ def load_timeseries(fn, years, countries, powerstatistics=True): """ logger.info(f"Retrieving load data from '{fn}'.") - pattern = "power_statistics" if powerstatistics else "transparency" - pattern = f"_load_actual_entsoe_{pattern}" - - def rename(s): - return s[: -len(pattern)] - return ( pd.read_csv(fn, index_col=0, parse_dates=[0], date_format="%Y-%m-%dT%H:%M:%SZ") .tz_localize(None) - .filter(like=pattern) - .rename(columns=rename) .dropna(how="all", axis=0) .rename(columns={"GB_UKM": "GB"}) .filter(items=countries) @@ -149,17 +137,18 @@ def copy_timeslice(load, cntry, start, stop, delta, fn_load=None): ].values elif fn_load is not None: duration = pd.date_range(freq="h", start=start - delta, end=stop - delta) - load_raw = load_timeseries(fn_load, duration, [cntry], powerstatistics) + load_raw = load_timeseries(fn_load, duration, [cntry]) load.loc[start:stop, cntry] = load_raw.loc[ start - delta : stop - delta, cntry ].values -def manual_adjustment(load, fn_load, powerstatistics, countries): +def manual_adjustment(load, fn_load): """ Adjust gaps manual for load data from OPSD time-series package. - 1. For the ENTSOE power statistics load data (if powerstatistics is True) + 1. For years later than 2015 for which the load data is mainly taken from the + ENTSOE power statistics Kosovo (KV) and Albania (AL) do not exist in the data set. Kosovo gets the same load curve as Serbia and Albania the same as Macdedonia, both scaled @@ -167,7 +156,8 @@ def manual_adjustment(load, fn_load, powerstatistics, countries): IEA Data browser [0] for the year 2013. - 2. For the ENTSOE transparency load data (if powerstatistics is False) + 2. For years earlier than 2015 for which the load data is mainly taken from the + ENTSOE transparency platforms Albania (AL) and Macedonia (MK) do not exist in the data set. Both get the same load curve as Montenegro, scaled by the corresponding ratio of total energy @@ -183,9 +173,6 @@ def manual_adjustment(load, fn_load, powerstatistics, countries): ---------- load : pd.DataFrame Load time-series with UTC timestamps x ISO-2 countries - powerstatistics: bool - Whether argument load comprises the electricity consumption data of - the ENTSOE power statistics or of the ENTSOE transparency map load_fn: str File name or url location (file format .csv) @@ -195,88 +182,66 @@ def manual_adjustment(load, fn_load, powerstatistics, countries): Manual adjusted and interpolated load time-series with UTC timestamps x ISO-2 countries """ - if powerstatistics: - if "MK" in load.columns: - if "AL" not in load.columns or load.AL.isnull().values.all(): - load["AL"] = load["MK"] * (4.1 / 7.4) - if "RS" in load.columns: - if "KV" not in load.columns or load.KV.isnull().values.all(): - load["KV"] = load["RS"] * (4.8 / 27.0) + if "MK" in load: + if "AL" not in load or load.AL.isnull().values.all(): + load["AL"] = load["MK"] * (4.1 / 7.4) + if "RS" in load: + if "KV" not in load or load.KV.isnull().values.all(): + load["KV"] = load["RS"] * (4.8 / 27.0) + if "ME" in load: + if "AL" not in load and "AL" in countries: + load["AL"] = load.ME * (5.7 / 2.9) + if "MK" not in load and "MK" in countries: + load["MK"] = load.ME * (6.7 / 2.9) + if "BA" not in load and "BA" in countries: + load["BA"] = load.HR * (11.0 / 16.2) - copy_timeslice( - load, "GR", "2015-08-11 21:00", "2015-08-15 20:00", Delta(weeks=1) - ) - copy_timeslice( - load, "AT", "2018-12-31 22:00", "2019-01-01 22:00", Delta(days=2) - ) - copy_timeslice( - load, "CH", "2010-01-19 07:00", "2010-01-19 22:00", Delta(days=1) - ) - copy_timeslice( - load, "CH", "2010-03-28 00:00", "2010-03-28 21:00", Delta(days=1) - ) - # is a WE, so take WE before - copy_timeslice( - load, "CH", "2010-10-08 13:00", "2010-10-10 21:00", Delta(weeks=1) - ) - copy_timeslice( - load, "CH", "2010-11-04 04:00", "2010-11-04 22:00", Delta(days=1) - ) - copy_timeslice( - load, "NO", "2010-12-09 11:00", "2010-12-09 18:00", Delta(days=1) - ) - # whole january missing - copy_timeslice( - load, - "GB", - "2010-01-01 00:00", - "2010-01-31 23:00", - Delta(days=-365), - fn_load, - ) - # 1.1. at midnight gets special treatment - copy_timeslice( - load, - "IE", - "2016-01-01 00:00", - "2016-01-01 01:00", - Delta(days=-366), - fn_load, - ) - copy_timeslice( - load, - "PT", - "2016-01-01 00:00", - "2016-01-01 01:00", - Delta(days=-366), - fn_load, - ) - copy_timeslice( - load, - "GB", - "2016-01-01 00:00", - "2016-01-01 01:00", - Delta(days=-366), - fn_load, - ) + copy_timeslice(load, "GR", "2015-08-11 21:00", "2015-08-15 20:00", Delta(weeks=1)) + copy_timeslice(load, "AT", "2018-12-31 22:00", "2019-01-01 22:00", Delta(days=2)) + copy_timeslice(load, "CH", "2010-01-19 07:00", "2010-01-19 22:00", Delta(days=1)) + copy_timeslice(load, "CH", "2010-03-28 00:00", "2010-03-28 21:00", Delta(days=1)) + # is a WE, so take WE before + copy_timeslice(load, "CH", "2010-10-08 13:00", "2010-10-10 21:00", Delta(weeks=1)) + copy_timeslice(load, "CH", "2010-11-04 04:00", "2010-11-04 22:00", Delta(days=1)) + copy_timeslice(load, "NO", "2010-12-09 11:00", "2010-12-09 18:00", Delta(days=1)) + # whole january missing + copy_timeslice( + load, + "GB", + "2010-01-01 00:00", + "2010-01-31 23:00", + Delta(days=-365), + fn_load, + ) + # 1.1. at midnight gets special treatment + copy_timeslice( + load, + "IE", + "2016-01-01 00:00", + "2016-01-01 01:00", + Delta(days=-366), + fn_load, + ) + copy_timeslice( + load, + "PT", + "2016-01-01 00:00", + "2016-01-01 01:00", + Delta(days=-366), + fn_load, + ) + copy_timeslice( + load, + "GB", + "2016-01-01 00:00", + "2016-01-01 01:00", + Delta(days=-366), + fn_load, + ) - else: - if "ME" in load: - if "AL" not in load and "AL" in countries: - load["AL"] = load.ME * (5.7 / 2.9) - if "MK" not in load and "MK" in countries: - load["MK"] = load.ME * (6.7 / 2.9) - if "BA" not in load and "BA" in countries: - load["BA"] = load.HR * (11.0 / 16.2) - copy_timeslice( - load, "BG", "2018-10-27 21:00", "2018-10-28 22:00", Delta(weeks=1) - ) - copy_timeslice( - load, "LU", "2019-01-02 11:00", "2019-01-05 05:00", Delta(weeks=-1) - ) - copy_timeslice( - load, "LU", "2019-02-05 20:00", "2019-02-06 19:00", Delta(weeks=-1) - ) + copy_timeslice(load, "BG", "2018-10-27 21:00", "2018-10-28 22:00", Delta(weeks=1)) + copy_timeslice(load, "LU", "2019-01-02 11:00", "2019-01-05 05:00", Delta(weeks=-1)) + copy_timeslice(load, "LU", "2019-02-05 20:00", "2019-02-06 19:00", Delta(weeks=-1)) if "UA" in countries: copy_timeslice( @@ -297,14 +262,13 @@ if __name__ == "__main__": configure_logging(snakemake) - powerstatistics = snakemake.params.load["power_statistics"] interpolate_limit = snakemake.params.load["interpolate_limit"] countries = snakemake.params.countries snapshots = pd.date_range(freq="h", **snakemake.params.snapshots) years = slice(snapshots[0], snapshots[-1]) time_shift = snakemake.params.load["time_shift_for_large_gaps"] - load = load_timeseries(snakemake.input[0], years, countries, powerstatistics) + load = load_timeseries(snakemake.input[0], years, countries) if "UA" in countries: # attach load of UA (best data only for entsoe transparency) @@ -321,7 +285,7 @@ if __name__ == "__main__": load["MD"] = 6.2e6 * (load_ua / load_ua.sum()) if snakemake.params.load["manual_adjustments"]: - load = manual_adjustment(load, snakemake.input[0], powerstatistics, countries) + load = manual_adjustment(load, snakemake.input[0]) if load.empty: logger.warning("Build electricity demand time series is empty.") diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py index 58511857..01dc4aa8 100644 --- a/scripts/retrieve_electricity_demand.py +++ b/scripts/retrieve_electricity_demand.py @@ -20,7 +20,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("retrieve_eletricity_demand") + snakemake = mock_snakemake("retrieve_electricity_demand") rootpath = ".." else: rootpath = "." @@ -33,5 +33,17 @@ if __name__ == "__main__": pd.read_csv(url.format(version=version), index_col=0) for version in snakemake.params.versions ] - res = pd.concat([df1, df2[df2.index > df1.index[-1]]], join="inner") + combined = pd.concat([df1, df2[df2.index > df1.index[-1]]]) + + pattern = "_load_actual_entsoe_transparency" + transparency = combined.filter(like=pattern).rename( + columns=lambda x: x.replace(pattern, "") + ) + pattern = "_load_actual_entsoe_power_statistics" + powerstatistics = combined.filter(like=pattern).rename( + columns=lambda x: x.replace(pattern, "") + ) + + res = transparency.fillna(powerstatistics) + res.to_csv(snakemake.output[0]) From 49171901d787ff63ac4d3964e0b139579846b801 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 10:12:03 +0100 Subject: [PATCH 381/497] selective cherry-pick from 91eff472a7748dc617d19cd9ad788bf81144c356 --- scripts/build_electricity_demand.py | 32 ++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index 2810edfa..d708cf6f 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -68,8 +68,6 @@ def load_timeseries(fn, years, countries): load : pd.DataFrame Load time-series with UTC timestamps x ISO-2 countries """ - logger.info(f"Retrieving load data from '{fn}'.") - return ( pd.read_csv(fn, index_col=0, parse_dates=[0], date_format="%Y-%m-%dT%H:%M:%SZ") .tz_localize(None) @@ -182,20 +180,26 @@ def manual_adjustment(load, fn_load): Manual adjusted and interpolated load time-series with UTC timestamps x ISO-2 countries """ - if "MK" in load: - if "AL" not in load or load.AL.isnull().values.all(): - load["AL"] = load["MK"] * (4.1 / 7.4) - if "RS" in load: - if "KV" not in load or load.KV.isnull().values.all(): - load["KV"] = load["RS"] * (4.8 / 27.0) - if "ME" in load: - if "AL" not in load and "AL" in countries: + + if "AL" not in load and "AL" in countries: + if "ME" in load: load["AL"] = load.ME * (5.7 / 2.9) - if "MK" not in load and "MK" in countries: - load["MK"] = load.ME * (6.7 / 2.9) - if "BA" not in load and "BA" in countries: + elif "MK" in load: + load["AL"] = load["MK"] * (4.1 / 7.4) + + if "MK" in countries: + if "MK" not in load or load.MK.isnull().sum() > len(load) / 2: + if "ME" in load: + load["MK"] = load.ME * (6.7 / 2.9) + + if "BA" not in load and "BA" in countries: + if "ME" in load: load["BA"] = load.HR * (11.0 / 16.2) + if "KV" not in load or load.KV.isnull().values.all(): + if "RS" in load: + load["KV"] = load["RS"] * (4.8 / 27.0) + copy_timeslice(load, "GR", "2015-08-11 21:00", "2015-08-15 20:00", Delta(weeks=1)) copy_timeslice(load, "AT", "2018-12-31 22:00", "2019-01-01 22:00", Delta(days=2)) copy_timeslice(load, "CH", "2010-01-19 07:00", "2010-01-19 22:00", Delta(days=1)) @@ -258,7 +262,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_electricity_demand") + snakemake = mock_snakemake("build_electricity_demand", run="network2019") configure_logging(snakemake) From 09ada56bf1266a0a6b81e713e2c58d49ef779c57 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 10:49:45 +0100 Subject: [PATCH 382/497] finishing touches and release notes --- doc/release_notes.rst | 3 +++ rules/build_electricity.smk | 6 +++--- rules/retrieve.smk | 2 +- scripts/add_electricity.py | 2 +- scripts/build_electricity_demand.py | 26 +++++++++++--------------- scripts/retrieve_electricity_demand.py | 9 +++------ 6 files changed, 22 insertions(+), 26 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index ee7bd64b..fce4ae1b 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,9 @@ Release Notes Upcoming Release ================ +* Merged two OPSD time series data versions into such that the option ``load: + power_statistics:`` becomes superfluous and was hence removed. + * Add new default to overdimension heating in individual buildings. This allows them to cover heat demand peaks e.g. 10% higher than those in the data. The disadvantage of manipulating the costs is that the capacity is then not quite diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index ba11f060..f05e18c0 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -24,9 +24,9 @@ rule build_electricity_demand: countries=config["countries"], load=config["load"], input: - ancient(RESOURCES + "electricity_demand.csv"), + ancient("data/electricity_demand_raw.csv"), output: - RESOURCES + "load.csv", + RESOURCES + "electricity_demand.csv", log: LOGS + "build_electricity_demand.log", resources: @@ -417,7 +417,7 @@ rule add_electricity: if config["conventional"]["dynamic_fuel_price"] else [] ), - load=RESOURCES + "load.csv", + load=RESOURCES + "electricity_demand.csv", nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", ua_md_gdp="data/GDP_PPP_30arcsec_v3_mapped_default.csv", output: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 0821a6b7..acb8a1c1 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -191,7 +191,7 @@ if config["enable"]["retrieve"]: params: versions=["2019-06-05", "2020-10-06"], output: - RESOURCES + "electricity_demand.csv", + "data/electricity_demand_raw.csv", log: LOGS + "retrieve_electricity_demand.log", resources: diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index ab97dcd0..614e3330 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -52,7 +52,7 @@ Inputs :scale: 34 % - ``data/geth2015_hydro_capacities.csv``: alternative to capacities above; not currently used! -- ``resources/load.csv`` Hourly per-country load profiles. +- ``resources/electricity_demand.csv`` Hourly per-country electricity demand profiles. - ``resources/regions_onshore.geojson``: confer :ref:`busregions` - ``resources/nuts3_shapes.geojson``: confer :ref:`shapes` - ``resources/powerplants.csv``: confer :ref:`powerplants` diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index d708cf6f..5d013065 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -1,15 +1,13 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020 @JanFrederickUnnewehr, The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020 @JanFrederickUnnewehr, 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ -This rule downloads the load data from `Open Power System Data Time series. - +This rule downloads the load data from `Open Power System Data Time series `_. For all countries in -the network, the per country load timeseries with suffix -``_load_actual_entsoe_transparency`` are extracted from the dataset. After -filling small gaps linearly and large gaps by copying time-slice of a given -period, the load data is exported to a ``.csv`` file. +the network, the per country load timeseries are extracted from the dataset. +After filling small gaps linearly and large gaps by copying time-slice of a +given period, the load data is exported to a ``.csv`` file. Relevant Settings ----------------- @@ -19,9 +17,7 @@ Relevant Settings snapshots: load: - interpolate_limit: - time_shift_for_large_gaps: - manual_adjustments: + interpolate_limit: time_shift_for_large_gaps: manual_adjustments: .. seealso:: @@ -31,12 +27,12 @@ Relevant Settings Inputs ------ -- ``resources/electricity_demand.csv``: +- ``data/electricity_demand_raw.csv``: Outputs ------- -- ``resources/load.csv``: +- ``resources/electricity_demand.csv``: """ import logging @@ -141,7 +137,7 @@ def copy_timeslice(load, cntry, start, stop, delta, fn_load=None): ].values -def manual_adjustment(load, fn_load): +def manual_adjustment(load, fn_load, countries): """ Adjust gaps manual for load data from OPSD time-series package. @@ -262,7 +258,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_electricity_demand", run="network2019") + snakemake = mock_snakemake("build_electricity_demand") configure_logging(snakemake) @@ -289,7 +285,7 @@ if __name__ == "__main__": load["MD"] = 6.2e6 * (load_ua / load_ua.sum()) if snakemake.params.load["manual_adjustments"]: - load = manual_adjustment(load, snakemake.input[0]) + load = manual_adjustment(load, snakemake.input[0], countries) if load.empty: logger.warning("Build electricity demand time series is empty.") diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py index 01dc4aa8..a8a44b68 100644 --- a/scripts/retrieve_electricity_demand.py +++ b/scripts/retrieve_electricity_demand.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ -Retrieve monthly fuel prices from Destatis. +Retrieve electricity prices from OPSD. """ import logging @@ -12,9 +12,7 @@ import pandas as pd logger = logging.getLogger(__name__) -from pathlib import Path - -from _helpers import configure_logging, set_scenario_config +from _helpers import configure_logging if __name__ == "__main__": if "snakemake" not in globals(): @@ -25,7 +23,6 @@ if __name__ == "__main__": else: rootpath = "." configure_logging(snakemake) - set_scenario_config(snakemake) url = "https://data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv" From 1a883debb5170e754f83ace5c5cf598453041019 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 10:00:02 +0000 Subject: [PATCH 383/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_sector.smk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 268113f9..d7fbe638 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -229,7 +229,8 @@ rule build_solar_thermal_profiles: params: snapshots={ k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] - }, # TODO use config_provider + }, + # TODO use config_provider solar_thermal=config_provider("solar_thermal"), input: pop_layout=resources("pop_layout_{scope}.nc"), From bb7b65eebd9c1dce423b1ff3127ae9d7ce9d1264 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 11:52:07 +0100 Subject: [PATCH 384/497] move create_scenarios.py to config directory --- .gitignore | 1 + {scripts => config}/create_scenarios.py | 0 doc/configtables/run.csv | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) rename {scripts => config}/create_scenarios.py (100%) diff --git a/.gitignore b/.gitignore index 467ecd95..f5f88861 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ doc/_build /scripts/old /scripts/create_scenarios.py +/config/create_scenarios.py config.yaml config/scenarios.yaml diff --git a/scripts/create_scenarios.py b/config/create_scenarios.py similarity index 100% rename from scripts/create_scenarios.py rename to config/create_scenarios.py diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index 925c2dea..75f29928 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -2,7 +2,7 @@ name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenario: enable`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenario: file``." scenarios,,, -- enable,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``file``." --- file,str,,"Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``create_scenarios.py`` script in ``scripts``." +-- file,str,,"Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``config/create_scenarios.py`` script in ``scripts``." disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." shared_resources,bool/str/list,,"Switch to select whether resources should be shared across runs. If a string or list is passed, it is assumed to be wildcard(s) which indicates up to which set of wildcards the resource folder should be shared. If set to 'base', only resources before creating the elec.nc file are shared." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." From 40b27b4107713e00029ca2c7c88c86eed1ad94e5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 11:53:20 +0100 Subject: [PATCH 385/497] use set_scenario_config everywhere --- scripts/add_brownfield.py | 5 +++-- scripts/add_existing_baseyear.py | 5 +++-- scripts/build_ammonia_production.py | 4 ++++ scripts/build_biomass_potentials.py | 5 +++++ scripts/build_clustered_population_layouts.py | 4 ++++ scripts/build_cop_profiles.py | 4 ++++ scripts/build_daily_heat_demand.py | 2 ++ scripts/build_district_heat_share.py | 3 +++ scripts/build_energy_totals.py | 5 +++-- scripts/build_existing_heating_distribution.py | 2 ++ scripts/build_gas_input_locations.py | 4 +++- scripts/build_gas_network.py | 4 +++- scripts/build_hourly_heat_demand.py | 3 ++- scripts/build_industrial_distribution_key.py | 6 ++++-- .../build_industrial_energy_demand_per_country_today.py | 2 ++ scripts/build_industrial_energy_demand_per_node.py | 3 +++ scripts/build_industrial_energy_demand_per_node_today.py | 3 +++ scripts/build_industrial_production_per_country.py | 6 +++--- .../build_industrial_production_per_country_tomorrow.py | 3 +++ scripts/build_industrial_production_per_node.py | 2 ++ scripts/build_industry_sector_ratios.py | 3 ++- scripts/build_population_layouts.py | 5 ++++- scripts/build_population_weighted_energy_totals.py | 3 +++ scripts/build_retro_cost.py | 2 ++ scripts/build_salt_cavern_potentials.py | 3 +++ scripts/build_sequestration_potentials.py | 4 ++++ scripts/build_shipping_demand.py | 2 ++ scripts/build_solar_thermal_profiles.py | 3 +++ scripts/build_temperature_profiles.py | 2 ++ scripts/build_transport_demand.py | 3 ++- scripts/cluster_gas_network.py | 5 +++-- scripts/determine_availability_matrix_MD_UA.py | 3 ++- scripts/make_summary.py | 4 +++- scripts/make_summary_perfect.py | 2 ++ scripts/plot_gas_network.py | 3 ++- scripts/plot_hydrogen_network.py | 3 ++- scripts/plot_power_network.py | 3 ++- scripts/plot_power_network_clustered.py | 3 ++- scripts/plot_power_network_perfect.py | 3 ++- scripts/plot_summary.py | 4 +++- scripts/prepare_perfect_foresight.py | 4 +++- scripts/prepare_sector_network.py | 4 ++-- scripts/retrieve_databundle.py | 7 +++---- scripts/retrieve_electricity_demand.py | 3 ++- scripts/retrieve_gas_infrastructure_data.py | 4 +++- scripts/retrieve_irena.py | 3 ++- scripts/solve_network.py | 1 + 47 files changed, 127 insertions(+), 37 deletions(-) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 3b77c437..b0727b17 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -12,7 +12,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts +from _helpers import update_config_with_sector_opts, configure_logging, set_scenario_config from add_existing_baseyear import add_build_year_to_new_assets from pypsa.clustering.spatial import normed_or_uniform @@ -210,7 +210,8 @@ if __name__ == "__main__": planning_horizons=2030, ) - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index c0d37a5b..25e35edd 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -15,7 +15,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts +from _helpers import update_config_with_sector_opts, set_scenario_config, configure_logging from add_electricity import sanitize_carriers from prepare_sector_network import cluster_heat_buses, define_spatial, prepare_costs @@ -552,7 +552,8 @@ if __name__ == "__main__": planning_horizons=2020, ) - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) diff --git a/scripts/build_ammonia_production.py b/scripts/build_ammonia_production.py index 1bcdf9ae..47907cc9 100644 --- a/scripts/build_ammonia_production.py +++ b/scripts/build_ammonia_production.py @@ -9,6 +9,8 @@ Build historical annual ammonia production per country in ktonNH3/a. import country_converter as coco import pandas as pd +from _helpers import set_scenario_config + cc = coco.CountryConverter() @@ -18,6 +20,8 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_ammonia_production") + set_scenario_config(snakemake) + ammonia = pd.read_excel( snakemake.input.usgs, sheet_name="T12", diff --git a/scripts/build_biomass_potentials.py b/scripts/build_biomass_potentials.py index 6b5cb147..2fe6922c 100644 --- a/scripts/build_biomass_potentials.py +++ b/scripts/build_biomass_potentials.py @@ -16,6 +16,8 @@ import pandas as pd logger = logging.getLogger(__name__) AVAILABLE_BIOMASS_YEARS = [2010, 2020, 2030, 2040, 2050] +from _helpers import configure_logging, set_scenario_config + def build_nuts_population_data(year=2013): pop = pd.read_csv( @@ -220,6 +222,9 @@ if __name__ == "__main__": clusters="5", planning_horizons=2050, ) + + configure_logging(snakemake) + set_scenario_config(snakemake) overnight = snakemake.config["foresight"] == "overnight" params = snakemake.params.biomass diff --git a/scripts/build_clustered_population_layouts.py b/scripts/build_clustered_population_layouts.py index f1d386bd..4217baff 100644 --- a/scripts/build_clustered_population_layouts.py +++ b/scripts/build_clustered_population_layouts.py @@ -12,6 +12,8 @@ import geopandas as gpd import pandas as pd import xarray as xr +from _helpers import set_scenario_config + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -22,6 +24,8 @@ if __name__ == "__main__": clusters=48, ) + set_scenario_config(snakemake) + cutout = atlite.Cutout(snakemake.input.cutout) clustered_regions = ( diff --git a/scripts/build_cop_profiles.py b/scripts/build_cop_profiles.py index 4b1d952e..ee68dd0a 100644 --- a/scripts/build_cop_profiles.py +++ b/scripts/build_cop_profiles.py @@ -15,6 +15,8 @@ https://doi.org/10.1039/C2EE22653G. import xarray as xr +from _helpers import set_scenario_config + def coefficient_of_performance(delta_T, source="air"): if source == "air": @@ -35,6 +37,8 @@ if __name__ == "__main__": clusters=48, ) + set_scenario_config(snakemake) + for area in ["total", "urban", "rural"]: for source in ["air", "soil"]: source_T = xr.open_dataarray(snakemake.input[f"temp_{source}_{area}"]) diff --git a/scripts/build_daily_heat_demand.py b/scripts/build_daily_heat_demand.py index e334b1b3..03ba8c2e 100644 --- a/scripts/build_daily_heat_demand.py +++ b/scripts/build_daily_heat_demand.py @@ -12,6 +12,7 @@ import numpy as np import pandas as pd import xarray as xr from dask.distributed import Client, LocalCluster +from _helpers import set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -23,6 +24,7 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) nprocesses = int(snakemake.threads) cluster = LocalCluster(n_workers=nprocesses, threads_per_worker=1) diff --git a/scripts/build_district_heat_share.py b/scripts/build_district_heat_share.py index 86c42631..121e4663 100644 --- a/scripts/build_district_heat_share.py +++ b/scripts/build_district_heat_share.py @@ -10,6 +10,7 @@ import logging import pandas as pd from prepare_sector_network import get +from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) @@ -24,6 +25,8 @@ if __name__ == "__main__": clusters=48, planning_horizons="2050", ) + configure_logging(snakemake) + set_scenario_config(snakemake) investment_year = int(snakemake.wildcards.planning_horizons[-4:]) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index c67bb49d..f22ddc25 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -14,7 +14,7 @@ import country_converter as coco import geopandas as gpd import numpy as np import pandas as pd -from _helpers import mute_print +from _helpers import mute_print, configure_logging, set_scenario_config from tqdm import tqdm cc = coco.CountryConverter() @@ -743,7 +743,8 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_energy_totals") - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) params = snakemake.params.energy diff --git a/scripts/build_existing_heating_distribution.py b/scripts/build_existing_heating_distribution.py index 78518597..eb2361c2 100644 --- a/scripts/build_existing_heating_distribution.py +++ b/scripts/build_existing_heating_distribution.py @@ -9,6 +9,7 @@ horizon. import country_converter as coco import numpy as np import pandas as pd +from _helpers import set_scenario_config cc = coco.CountryConverter() @@ -126,5 +127,6 @@ if __name__ == "__main__": clusters=48, planning_horizons=2050, ) + set_scenario_config(snakemake) build_existing_heating() diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index 081f74b9..5aba46e5 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -12,6 +12,7 @@ import logging import geopandas as gpd import pandas as pd from cluster_gas_network import load_bus_regions +from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) @@ -134,7 +135,8 @@ if __name__ == "__main__": clusters="128", ) - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) regions = load_bus_regions( snakemake.input.regions_onshore, snakemake.input.regions_offshore diff --git a/scripts/build_gas_network.py b/scripts/build_gas_network.py index 13cd75ba..0febd43d 100644 --- a/scripts/build_gas_network.py +++ b/scripts/build_gas_network.py @@ -13,6 +13,7 @@ import geopandas as gpd import pandas as pd from pypsa.geo import haversine_pts from shapely.geometry import Point +from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) @@ -143,7 +144,8 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_gas_network") - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) gas_network = load_dataset(snakemake.input.gas_network) diff --git a/scripts/build_hourly_heat_demand.py b/scripts/build_hourly_heat_demand.py index c972da89..a3110e1f 100644 --- a/scripts/build_hourly_heat_demand.py +++ b/scripts/build_hourly_heat_demand.py @@ -10,7 +10,7 @@ from itertools import product import pandas as pd import xarray as xr -from _helpers import generate_periodic_profiles +from _helpers import generate_periodic_profiles, set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -22,6 +22,7 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) snapshots = pd.date_range(freq="h", **snakemake.params.snapshots) diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index 9b234e29..29b7538e 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -14,6 +14,8 @@ import country_converter as coco import geopandas as gpd import pandas as pd +from _helpers import configure_logging, set_scenario_config + logger = logging.getLogger(__name__) cc = coco.CountryConverter() @@ -148,8 +150,8 @@ if __name__ == "__main__": simpl="", clusters=128, ) - - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) countries = snakemake.params.countries diff --git a/scripts/build_industrial_energy_demand_per_country_today.py b/scripts/build_industrial_energy_demand_per_country_today.py index d1c672f1..99342b9e 100644 --- a/scripts/build_industrial_energy_demand_per_country_today.py +++ b/scripts/build_industrial_energy_demand_per_country_today.py @@ -12,6 +12,7 @@ from functools import partial import country_converter as coco import pandas as pd from tqdm import tqdm +from _helpers import set_scenario_config cc = coco.CountryConverter() @@ -175,6 +176,7 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake("build_industrial_energy_demand_per_country_today") + set_scenario_config(snakemake) params = snakemake.params.industry year = params.get("reference_year", 2015) diff --git a/scripts/build_industrial_energy_demand_per_node.py b/scripts/build_industrial_energy_demand_per_node.py index 55c10c5d..fcc0abd9 100644 --- a/scripts/build_industrial_energy_demand_per_node.py +++ b/scripts/build_industrial_energy_demand_per_node.py @@ -8,6 +8,8 @@ Build industrial energy demand per model region. import pandas as pd +from _helpers import set_scenario_config + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -18,6 +20,7 @@ if __name__ == "__main__": clusters=48, planning_horizons=2030, ) + set_scenario_config(snakemake) # import EU ratios df as csv fn = snakemake.input.industry_sector_ratios diff --git a/scripts/build_industrial_energy_demand_per_node_today.py b/scripts/build_industrial_energy_demand_per_node_today.py index d845e704..1b7aba83 100644 --- a/scripts/build_industrial_energy_demand_per_node_today.py +++ b/scripts/build_industrial_energy_demand_per_node_today.py @@ -11,6 +11,8 @@ from itertools import product import numpy as np import pandas as pd +from _helpers import set_scenario_config + # map JRC/our sectors to hotmaps sector, where mapping exist sector_mapping = { "Electric arc": "Iron and steel", @@ -75,5 +77,6 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) build_nodal_industrial_energy_demand() diff --git a/scripts/build_industrial_production_per_country.py b/scripts/build_industrial_production_per_country.py index 0aea4f15..d9ec9afd 100644 --- a/scripts/build_industrial_production_per_country.py +++ b/scripts/build_industrial_production_per_country.py @@ -13,7 +13,7 @@ from functools import partial import country_converter as coco import numpy as np import pandas as pd -from _helpers import mute_print +from _helpers import mute_print, set_scenario_config, configure_logging from tqdm import tqdm logger = logging.getLogger(__name__) @@ -274,8 +274,8 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake("build_industrial_production_per_country") - - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) countries = snakemake.params.countries diff --git a/scripts/build_industrial_production_per_country_tomorrow.py b/scripts/build_industrial_production_per_country_tomorrow.py index ffed5195..835a2687 100644 --- a/scripts/build_industrial_production_per_country_tomorrow.py +++ b/scripts/build_industrial_production_per_country_tomorrow.py @@ -9,11 +9,14 @@ Build future industrial production per country. import pandas as pd from prepare_sector_network import get +from _helpers import set_scenario_config + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake snakemake = mock_snakemake("build_industrial_production_per_country_tomorrow") + set_scenario_config(snakemake) params = snakemake.params.industry diff --git a/scripts/build_industrial_production_per_node.py b/scripts/build_industrial_production_per_node.py index 7b69948a..c84590b7 100644 --- a/scripts/build_industrial_production_per_node.py +++ b/scripts/build_industrial_production_per_node.py @@ -7,6 +7,7 @@ Build industrial production per model region. """ from itertools import product +from _helpers import set_scenario_config import pandas as pd @@ -72,5 +73,6 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) build_nodal_industrial_production() diff --git a/scripts/build_industry_sector_ratios.py b/scripts/build_industry_sector_ratios.py index 45705002..6014feee 100644 --- a/scripts/build_industry_sector_ratios.py +++ b/scripts/build_industry_sector_ratios.py @@ -7,7 +7,7 @@ Build specific energy consumption by carrier and industries. """ import pandas as pd -from _helpers import mute_print +from _helpers import mute_print, set_scenario_config # GWh/ktoe OR MWh/toe toe_to_MWh = 11.630 @@ -1464,6 +1464,7 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake("build_industry_sector_ratios") + set_scenario_config(snakemake) # TODO make params option year = 2015 diff --git a/scripts/build_population_layouts.py b/scripts/build_population_layouts.py index cb63c27e..db548140 100644 --- a/scripts/build_population_layouts.py +++ b/scripts/build_population_layouts.py @@ -14,6 +14,8 @@ import numpy as np import pandas as pd import xarray as xr +from _helpers import configure_logging, set_scenario_config + logger = logging.getLogger(__name__) if __name__ == "__main__": @@ -22,7 +24,8 @@ if __name__ == "__main__": snakemake = mock_snakemake("build_population_layouts") - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) cutout = atlite.Cutout(snakemake.input.cutout) diff --git a/scripts/build_population_weighted_energy_totals.py b/scripts/build_population_weighted_energy_totals.py index 879e3b9b..6ed32086 100644 --- a/scripts/build_population_weighted_energy_totals.py +++ b/scripts/build_population_weighted_energy_totals.py @@ -8,6 +8,8 @@ Distribute country-level energy demands by population. import pandas as pd +from _helpers import set_scenario_config + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -17,6 +19,7 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index 60d74afa..b6153a2d 100755 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -68,6 +68,7 @@ The script has the following structure: """ import pandas as pd import xarray as xr +from _helpers import set_scenario_config # (i) --- FIXED PARAMETER / STANDARD VALUES ----------------------------------- @@ -1053,6 +1054,7 @@ if __name__ == "__main__": ll="v1.0", sector_opts="Co2L0-168H-T-H-B-I-solar3-dist1", ) + set_scenario_config(snakemake) # ******** config ********************************************************* diff --git a/scripts/build_salt_cavern_potentials.py b/scripts/build_salt_cavern_potentials.py index ed039772..08071b22 100644 --- a/scripts/build_salt_cavern_potentials.py +++ b/scripts/build_salt_cavern_potentials.py @@ -24,6 +24,7 @@ onshore (>50km from sea), offshore (Figure 7). import geopandas as gpd import pandas as pd +from _helpers import set_scenario_config def concat_gdf(gdf_list, crs="EPSG:4326"): @@ -77,6 +78,8 @@ if __name__ == "__main__": "build_salt_cavern_potentials", simpl="", clusters="37" ) + set_scenario_config(snakemake) + fn_onshore = snakemake.input.regions_onshore fn_offshore = snakemake.input.regions_offshore diff --git a/scripts/build_sequestration_potentials.py b/scripts/build_sequestration_potentials.py index f6ad3526..9e7678bb 100644 --- a/scripts/build_sequestration_potentials.py +++ b/scripts/build_sequestration_potentials.py @@ -11,6 +11,8 @@ database_en>`_. import geopandas as gpd import pandas as pd +from _helpers import set_scenario_config + def area(gdf): """ @@ -39,6 +41,8 @@ if __name__ == "__main__": "build_sequestration_potentials", simpl="", clusters="181" ) + set_scenario_config(snakemake) + cf = snakemake.params.sequestration_potential gdf = gpd.read_file(snakemake.input.sequestration_potential[0]) diff --git a/scripts/build_shipping_demand.py b/scripts/build_shipping_demand.py index 8000c66c..0690e33d 100644 --- a/scripts/build_shipping_demand.py +++ b/scripts/build_shipping_demand.py @@ -11,6 +11,7 @@ import json import geopandas as gpd import pandas as pd +from _helpers import set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -21,6 +22,7 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) scope = gpd.read_file(snakemake.input.scope).geometry[0] regions = gpd.read_file(snakemake.input.regions).set_index("name") diff --git a/scripts/build_solar_thermal_profiles.py b/scripts/build_solar_thermal_profiles.py index ee6ed881..12826420 100644 --- a/scripts/build_solar_thermal_profiles.py +++ b/scripts/build_solar_thermal_profiles.py @@ -13,6 +13,8 @@ import pandas as pd import xarray as xr from dask.distributed import Client, LocalCluster +from _helpers import set_scenario_config + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -22,6 +24,7 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) nprocesses = int(snakemake.threads) cluster = LocalCluster(n_workers=nprocesses, threads_per_worker=1) diff --git a/scripts/build_temperature_profiles.py b/scripts/build_temperature_profiles.py index 02fa4a71..878ebc03 100644 --- a/scripts/build_temperature_profiles.py +++ b/scripts/build_temperature_profiles.py @@ -12,6 +12,7 @@ import numpy as np import pandas as pd import xarray as xr from dask.distributed import Client, LocalCluster +from _helpers import set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -22,6 +23,7 @@ if __name__ == "__main__": simpl="", clusters=48, ) + set_scenario_config(snakemake) nprocesses = int(snakemake.threads) cluster = LocalCluster(n_workers=nprocesses, threads_per_worker=1) diff --git a/scripts/build_transport_demand.py b/scripts/build_transport_demand.py index 33c8faae..671357dd 100644 --- a/scripts/build_transport_demand.py +++ b/scripts/build_transport_demand.py @@ -13,7 +13,7 @@ import logging import numpy as np import pandas as pd import xarray as xr -from _helpers import configure_logging, generate_periodic_profiles +from _helpers import configure_logging, generate_periodic_profiles, set_scenario_config logger = logging.getLogger(__name__) @@ -171,6 +171,7 @@ if __name__ == "__main__": clusters=48, ) configure_logging(snakemake) + set_scenario_config(snakemake) pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) diff --git a/scripts/cluster_gas_network.py b/scripts/cluster_gas_network.py index e709d772..567f4458 100755 --- a/scripts/cluster_gas_network.py +++ b/scripts/cluster_gas_network.py @@ -12,6 +12,7 @@ import geopandas as gpd import pandas as pd from pypsa.geo import haversine_pts from shapely import wkt +from _helpers import set_scenario_config, configure_logging logger = logging.getLogger(__name__) @@ -105,8 +106,8 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake("cluster_gas_network", simpl="", clusters="37") - - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) fn = snakemake.input.cleaned_gas_network df = pd.read_csv(fn, index_col=0) diff --git a/scripts/determine_availability_matrix_MD_UA.py b/scripts/determine_availability_matrix_MD_UA.py index efe9a712..84076383 100644 --- a/scripts/determine_availability_matrix_MD_UA.py +++ b/scripts/determine_availability_matrix_MD_UA.py @@ -15,7 +15,7 @@ import fiona import geopandas as gpd import matplotlib.pyplot as plt import numpy as np -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from atlite.gis import shape_availability from rasterio.plot import show @@ -38,6 +38,7 @@ if __name__ == "__main__": "determine_availability_matrix_MD_UA", technology="solar" ) configure_logging(snakemake) + set_scenario_config(snakemake) nprocesses = None # snakemake.config["atlite"].get("nprocesses") noprogress = not snakemake.config["atlite"].get("show_progress", True) diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 76d8099c..82ce2328 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -14,6 +14,7 @@ import numpy as np import pandas as pd import pypsa from prepare_sector_network import prepare_costs +from _helpers import set_scenario_config, configure_logging idx = pd.IndexSlice logger = logging.getLogger(__name__) @@ -673,7 +674,8 @@ if __name__ == "__main__": snakemake = mock_snakemake("make_summary") - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) networks_dict = { (cluster, ll, opt + sector_opt, planning_horizon): "results/" diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index 064db454..7c2e8d30 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -19,6 +19,7 @@ from make_summary import assign_carriers, assign_locations from prepare_sector_network import prepare_costs from pypsa.descriptors import get_active_assets from six import iteritems +from _helpers import set_scenario_config idx = pd.IndexSlice @@ -722,6 +723,7 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake("make_summary_perfect") + set_scenario_config(snakemake) run = snakemake.config["run"]["name"] if run != "": diff --git a/scripts/plot_gas_network.py b/scripts/plot_gas_network.py index e2953604..26186d51 100644 --- a/scripts/plot_gas_network.py +++ b/scripts/plot_gas_network.py @@ -13,7 +13,7 @@ import geopandas as gpd import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from plot_power_network import assign_location, load_projection from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches @@ -237,6 +237,7 @@ if __name__ == "__main__": ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) diff --git a/scripts/plot_hydrogen_network.py b/scripts/plot_hydrogen_network.py index 95741170..4cb58557 100644 --- a/scripts/plot_hydrogen_network.py +++ b/scripts/plot_hydrogen_network.py @@ -13,7 +13,7 @@ import geopandas as gpd import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from plot_power_network import assign_location, load_projection from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches @@ -254,6 +254,7 @@ if __name__ == "__main__": ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) diff --git a/scripts/plot_power_network.py b/scripts/plot_power_network.py index 0e13e497..6db53bcc 100644 --- a/scripts/plot_power_network.py +++ b/scripts/plot_power_network.py @@ -14,7 +14,7 @@ import geopandas as gpd import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from plot_summary import preferred_order, rename_techs from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches @@ -257,6 +257,7 @@ if __name__ == "__main__": ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) diff --git a/scripts/plot_power_network_clustered.py b/scripts/plot_power_network_clustered.py index 8217ac2e..43746039 100644 --- a/scripts/plot_power_network_clustered.py +++ b/scripts/plot_power_network_clustered.py @@ -6,13 +6,13 @@ Plot clustered electricity transmission network. """ -import cartopy.crs as ccrs import geopandas as gpd import matplotlib.pyplot as plt import pypsa from matplotlib.lines import Line2D from plot_power_network import load_projection from pypsa.plot import add_legend_lines +from _helpers import set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -23,6 +23,7 @@ if __name__ == "__main__": clusters=128, configfiles=["../../config/config.test.yaml"], ) + set_scenario_config(snakemake) lw_factor = 2e3 diff --git a/scripts/plot_power_network_perfect.py b/scripts/plot_power_network_perfect.py index ff576d33..f7506a00 100644 --- a/scripts/plot_power_network_perfect.py +++ b/scripts/plot_power_network_perfect.py @@ -13,7 +13,7 @@ import geopandas as gpd import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config from plot_power_network import assign_location, load_projection, rename_techs_tyndp from plot_summary import preferred_order from pypsa.plot import add_legend_circles, add_legend_lines @@ -184,6 +184,7 @@ if __name__ == "__main__": ) configure_logging(snakemake) + set_scenario_config(snakemake) n = pypsa.Network(snakemake.input.network) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index cfb32441..da077348 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -12,6 +12,7 @@ import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import pandas as pd from prepare_sector_network import co2_emissions_year +from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) plt.style.use("ggplot") @@ -572,7 +573,8 @@ if __name__ == "__main__": snakemake = mock_snakemake("plot_summary") - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) + set_scenario_config(snakemake) n_header = 4 diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index cf013577..de9932fd 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -12,7 +12,7 @@ import re import numpy as np import pandas as pd import pypsa -from _helpers import update_config_with_sector_opts +from _helpers import update_config_with_sector_opts, set_scenario_config, configure_logging from add_existing_baseyear import add_build_year_to_new_assets from pypsa.descriptors import expand_series from pypsa.io import import_components_from_dataframe @@ -514,6 +514,8 @@ if __name__ == "__main__": ll="v1.5", sector_opts="1p7-4380H-T-H-B-I-A-dist1", ) + configure_logging(snakemake) + set_scenario_config(snakemake) update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) # parameters ----------------------------------------------------------- diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b1161c19..bf9ed58f 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -18,7 +18,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import set_scenario_config, update_config_with_sector_opts +from _helpers import configure_logging, set_scenario_config, update_config_with_sector_opts from add_electricity import calculate_annuity, sanitize_carriers, sanitize_locations from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement @@ -3572,7 +3572,7 @@ if __name__ == "__main__": planning_horizons="2030", ) - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) set_scenario_config(snakemake) update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) diff --git a/scripts/retrieve_databundle.py b/scripts/retrieve_databundle.py index 25894063..b6a4d378 100644 --- a/scripts/retrieve_databundle.py +++ b/scripts/retrieve_databundle.py @@ -36,7 +36,7 @@ import logging import tarfile from pathlib import Path -from _helpers import configure_logging, progress_retrieve, validate_checksum +from _helpers import configure_logging, progress_retrieve, validate_checksum, set_scenario_config logger = logging.getLogger(__name__) @@ -49,9 +49,8 @@ if __name__ == "__main__": rootpath = ".." else: rootpath = "." - configure_logging( - snakemake - ) # TODO Make logging compatible with progressbar (see PR #102) + configure_logging(snakemake) + set_scenario_config(snakemake) if snakemake.config["tutorial"]: url = "https://zenodo.org/record/3517921/files/pypsa-eur-tutorial-data-bundle.tar.xz" diff --git a/scripts/retrieve_electricity_demand.py b/scripts/retrieve_electricity_demand.py index a8a44b68..94077fdf 100644 --- a/scripts/retrieve_electricity_demand.py +++ b/scripts/retrieve_electricity_demand.py @@ -12,7 +12,7 @@ import pandas as pd logger = logging.getLogger(__name__) -from _helpers import configure_logging +from _helpers import configure_logging, set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): @@ -23,6 +23,7 @@ if __name__ == "__main__": else: rootpath = "." configure_logging(snakemake) + set_scenario_config(snakemake) url = "https://data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv" diff --git a/scripts/retrieve_gas_infrastructure_data.py b/scripts/retrieve_gas_infrastructure_data.py index d984b9fe..7cc1c270 100644 --- a/scripts/retrieve_gas_infrastructure_data.py +++ b/scripts/retrieve_gas_infrastructure_data.py @@ -11,7 +11,7 @@ import logging import zipfile from pathlib import Path -from _helpers import progress_retrieve, validate_checksum +from _helpers import progress_retrieve, validate_checksum, set_scenario_config, configure_logging logger = logging.getLogger(__name__) @@ -24,6 +24,8 @@ if __name__ == "__main__": rootpath = ".." else: rootpath = "." + configure_logging(snakemake) + set_scenario_config(snakemake) url = "https://zenodo.org/record/4767098/files/IGGIELGN.zip" diff --git a/scripts/retrieve_irena.py b/scripts/retrieve_irena.py index 7b123475..dbd11129 100644 --- a/scripts/retrieve_irena.py +++ b/scripts/retrieve_irena.py @@ -26,7 +26,7 @@ This rule downloads the existing capacities from `IRENASTAT Date: Mon, 12 Feb 2024 11:53:37 +0100 Subject: [PATCH 386/497] do not use config_provider outside rule definitions --- rules/postprocess.smk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index cf0ef6cd..38e5f7d9 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -7,7 +7,7 @@ localrules: copy_config, -if config_provider("foresight") != "perfect": +if config["foresight"] != "perfect": rule plot_power_network_clustered: params: @@ -109,7 +109,7 @@ if config_provider("foresight") != "perfect": "../scripts/plot_gas_network.py" -if config_provider("foresight") == "perfect": +if config["foresight"] == "perfect": rule plot_power_network_perfect: params: From e0b6ebd174a9f5f55bb462c8650e0754a1121a9d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 10:54:13 +0000 Subject: [PATCH 387/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/add_brownfield.py | 6 +++++- scripts/add_existing_baseyear.py | 6 +++++- scripts/build_ammonia_production.py | 1 - scripts/build_biomass_potentials.py | 2 +- scripts/build_clustered_population_layouts.py | 1 - scripts/build_cop_profiles.py | 1 - scripts/build_daily_heat_demand.py | 2 +- scripts/build_district_heat_share.py | 2 +- scripts/build_energy_totals.py | 2 +- scripts/build_gas_input_locations.py | 2 +- scripts/build_gas_network.py | 2 +- scripts/build_industrial_distribution_key.py | 1 - .../build_industrial_energy_demand_per_country_today.py | 2 +- scripts/build_industrial_energy_demand_per_node.py | 1 - scripts/build_industrial_energy_demand_per_node_today.py | 1 - scripts/build_industrial_production_per_country.py | 2 +- .../build_industrial_production_per_country_tomorrow.py | 3 +-- scripts/build_industrial_production_per_node.py | 2 +- scripts/build_population_layouts.py | 1 - scripts/build_population_weighted_energy_totals.py | 1 - scripts/build_sequestration_potentials.py | 1 - scripts/build_solar_thermal_profiles.py | 3 +-- scripts/build_temperature_profiles.py | 2 +- scripts/cluster_gas_network.py | 2 +- scripts/make_summary.py | 2 +- scripts/make_summary_perfect.py | 2 +- scripts/plot_power_network_clustered.py | 2 +- scripts/plot_summary.py | 2 +- scripts/prepare_perfect_foresight.py | 6 +++++- scripts/prepare_sector_network.py | 6 +++++- scripts/retrieve_databundle.py | 7 ++++++- scripts/retrieve_gas_infrastructure_data.py | 7 ++++++- 32 files changed, 49 insertions(+), 34 deletions(-) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index b0727b17..d45742dd 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -12,7 +12,11 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts, configure_logging, set_scenario_config +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_with_sector_opts, +) from add_existing_baseyear import add_build_year_to_new_assets from pypsa.clustering.spatial import normed_or_uniform diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 25e35edd..780460a2 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -15,7 +15,11 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts, set_scenario_config, configure_logging +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_with_sector_opts, +) from add_electricity import sanitize_carriers from prepare_sector_network import cluster_heat_buses, define_spatial, prepare_costs diff --git a/scripts/build_ammonia_production.py b/scripts/build_ammonia_production.py index 47907cc9..a9cd907a 100644 --- a/scripts/build_ammonia_production.py +++ b/scripts/build_ammonia_production.py @@ -8,7 +8,6 @@ Build historical annual ammonia production per country in ktonNH3/a. import country_converter as coco import pandas as pd - from _helpers import set_scenario_config cc = coco.CountryConverter() diff --git a/scripts/build_biomass_potentials.py b/scripts/build_biomass_potentials.py index 2fe6922c..6291b03e 100644 --- a/scripts/build_biomass_potentials.py +++ b/scripts/build_biomass_potentials.py @@ -222,7 +222,7 @@ if __name__ == "__main__": clusters="5", planning_horizons=2050, ) - + configure_logging(snakemake) set_scenario_config(snakemake) diff --git a/scripts/build_clustered_population_layouts.py b/scripts/build_clustered_population_layouts.py index 4217baff..c923abf9 100644 --- a/scripts/build_clustered_population_layouts.py +++ b/scripts/build_clustered_population_layouts.py @@ -11,7 +11,6 @@ import atlite import geopandas as gpd import pandas as pd import xarray as xr - from _helpers import set_scenario_config if __name__ == "__main__": diff --git a/scripts/build_cop_profiles.py b/scripts/build_cop_profiles.py index ee68dd0a..54eac3a3 100644 --- a/scripts/build_cop_profiles.py +++ b/scripts/build_cop_profiles.py @@ -14,7 +14,6 @@ https://doi.org/10.1039/C2EE22653G. """ import xarray as xr - from _helpers import set_scenario_config diff --git a/scripts/build_daily_heat_demand.py b/scripts/build_daily_heat_demand.py index 03ba8c2e..4f1a3303 100644 --- a/scripts/build_daily_heat_demand.py +++ b/scripts/build_daily_heat_demand.py @@ -11,8 +11,8 @@ import geopandas as gpd import numpy as np import pandas as pd import xarray as xr -from dask.distributed import Client, LocalCluster from _helpers import set_scenario_config +from dask.distributed import Client, LocalCluster if __name__ == "__main__": if "snakemake" not in globals(): diff --git a/scripts/build_district_heat_share.py b/scripts/build_district_heat_share.py index 121e4663..46ada2f6 100644 --- a/scripts/build_district_heat_share.py +++ b/scripts/build_district_heat_share.py @@ -9,8 +9,8 @@ Build district heat shares at each node, depending on investment year. import logging import pandas as pd -from prepare_sector_network import get from _helpers import configure_logging, set_scenario_config +from prepare_sector_network import get logger = logging.getLogger(__name__) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index f22ddc25..2b4ebd19 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -14,7 +14,7 @@ import country_converter as coco import geopandas as gpd import numpy as np import pandas as pd -from _helpers import mute_print, configure_logging, set_scenario_config +from _helpers import configure_logging, mute_print, set_scenario_config from tqdm import tqdm cc = coco.CountryConverter() diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index 5aba46e5..b0aadce8 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -11,8 +11,8 @@ import logging import geopandas as gpd import pandas as pd -from cluster_gas_network import load_bus_regions from _helpers import configure_logging, set_scenario_config +from cluster_gas_network import load_bus_regions logger = logging.getLogger(__name__) diff --git a/scripts/build_gas_network.py b/scripts/build_gas_network.py index 0febd43d..52235cd1 100644 --- a/scripts/build_gas_network.py +++ b/scripts/build_gas_network.py @@ -11,9 +11,9 @@ import logging import geopandas as gpd import pandas as pd +from _helpers import configure_logging, set_scenario_config from pypsa.geo import haversine_pts from shapely.geometry import Point -from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index 29b7538e..90687b33 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -13,7 +13,6 @@ from itertools import product import country_converter as coco import geopandas as gpd import pandas as pd - from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) diff --git a/scripts/build_industrial_energy_demand_per_country_today.py b/scripts/build_industrial_energy_demand_per_country_today.py index 99342b9e..1ccae6c2 100644 --- a/scripts/build_industrial_energy_demand_per_country_today.py +++ b/scripts/build_industrial_energy_demand_per_country_today.py @@ -11,8 +11,8 @@ from functools import partial import country_converter as coco import pandas as pd -from tqdm import tqdm from _helpers import set_scenario_config +from tqdm import tqdm cc = coco.CountryConverter() diff --git a/scripts/build_industrial_energy_demand_per_node.py b/scripts/build_industrial_energy_demand_per_node.py index fcc0abd9..42df4250 100644 --- a/scripts/build_industrial_energy_demand_per_node.py +++ b/scripts/build_industrial_energy_demand_per_node.py @@ -7,7 +7,6 @@ Build industrial energy demand per model region. """ import pandas as pd - from _helpers import set_scenario_config if __name__ == "__main__": diff --git a/scripts/build_industrial_energy_demand_per_node_today.py b/scripts/build_industrial_energy_demand_per_node_today.py index 1b7aba83..ce8d971f 100644 --- a/scripts/build_industrial_energy_demand_per_node_today.py +++ b/scripts/build_industrial_energy_demand_per_node_today.py @@ -10,7 +10,6 @@ from itertools import product import numpy as np import pandas as pd - from _helpers import set_scenario_config # map JRC/our sectors to hotmaps sector, where mapping exist diff --git a/scripts/build_industrial_production_per_country.py b/scripts/build_industrial_production_per_country.py index d9ec9afd..44cb0752 100644 --- a/scripts/build_industrial_production_per_country.py +++ b/scripts/build_industrial_production_per_country.py @@ -13,7 +13,7 @@ from functools import partial import country_converter as coco import numpy as np import pandas as pd -from _helpers import mute_print, set_scenario_config, configure_logging +from _helpers import configure_logging, mute_print, set_scenario_config from tqdm import tqdm logger = logging.getLogger(__name__) diff --git a/scripts/build_industrial_production_per_country_tomorrow.py b/scripts/build_industrial_production_per_country_tomorrow.py index 835a2687..67557b17 100644 --- a/scripts/build_industrial_production_per_country_tomorrow.py +++ b/scripts/build_industrial_production_per_country_tomorrow.py @@ -7,9 +7,8 @@ Build future industrial production per country. """ import pandas as pd -from prepare_sector_network import get - from _helpers import set_scenario_config +from prepare_sector_network import get if __name__ == "__main__": if "snakemake" not in globals(): diff --git a/scripts/build_industrial_production_per_node.py b/scripts/build_industrial_production_per_node.py index c84590b7..7e074967 100644 --- a/scripts/build_industrial_production_per_node.py +++ b/scripts/build_industrial_production_per_node.py @@ -7,9 +7,9 @@ Build industrial production per model region. """ from itertools import product -from _helpers import set_scenario_config import pandas as pd +from _helpers import set_scenario_config # map JRC/our sectors to hotmaps sector, where mapping exist sector_mapping = { diff --git a/scripts/build_population_layouts.py b/scripts/build_population_layouts.py index db548140..bab2e9a4 100644 --- a/scripts/build_population_layouts.py +++ b/scripts/build_population_layouts.py @@ -13,7 +13,6 @@ import geopandas as gpd import numpy as np import pandas as pd import xarray as xr - from _helpers import configure_logging, set_scenario_config logger = logging.getLogger(__name__) diff --git a/scripts/build_population_weighted_energy_totals.py b/scripts/build_population_weighted_energy_totals.py index 6ed32086..60d66e56 100644 --- a/scripts/build_population_weighted_energy_totals.py +++ b/scripts/build_population_weighted_energy_totals.py @@ -7,7 +7,6 @@ Distribute country-level energy demands by population. """ import pandas as pd - from _helpers import set_scenario_config if __name__ == "__main__": diff --git a/scripts/build_sequestration_potentials.py b/scripts/build_sequestration_potentials.py index 9e7678bb..ac1f22e2 100644 --- a/scripts/build_sequestration_potentials.py +++ b/scripts/build_sequestration_potentials.py @@ -10,7 +10,6 @@ database_en>`_. import geopandas as gpd import pandas as pd - from _helpers import set_scenario_config diff --git a/scripts/build_solar_thermal_profiles.py b/scripts/build_solar_thermal_profiles.py index 12826420..eb4c6f8f 100644 --- a/scripts/build_solar_thermal_profiles.py +++ b/scripts/build_solar_thermal_profiles.py @@ -11,9 +11,8 @@ import geopandas as gpd import numpy as np import pandas as pd import xarray as xr -from dask.distributed import Client, LocalCluster - from _helpers import set_scenario_config +from dask.distributed import Client, LocalCluster if __name__ == "__main__": if "snakemake" not in globals(): diff --git a/scripts/build_temperature_profiles.py b/scripts/build_temperature_profiles.py index 878ebc03..eb005d3d 100644 --- a/scripts/build_temperature_profiles.py +++ b/scripts/build_temperature_profiles.py @@ -11,8 +11,8 @@ import geopandas as gpd import numpy as np import pandas as pd import xarray as xr -from dask.distributed import Client, LocalCluster from _helpers import set_scenario_config +from dask.distributed import Client, LocalCluster if __name__ == "__main__": if "snakemake" not in globals(): diff --git a/scripts/cluster_gas_network.py b/scripts/cluster_gas_network.py index 567f4458..1292cdc3 100755 --- a/scripts/cluster_gas_network.py +++ b/scripts/cluster_gas_network.py @@ -10,9 +10,9 @@ import logging import geopandas as gpd import pandas as pd +from _helpers import configure_logging, set_scenario_config from pypsa.geo import haversine_pts from shapely import wkt -from _helpers import set_scenario_config, configure_logging logger = logging.getLogger(__name__) diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 82ce2328..2dac717a 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -13,8 +13,8 @@ import sys import numpy as np import pandas as pd import pypsa +from _helpers import configure_logging, set_scenario_config from prepare_sector_network import prepare_costs -from _helpers import set_scenario_config, configure_logging idx = pd.IndexSlice logger = logging.getLogger(__name__) diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index 7c2e8d30..4a0b1556 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -12,6 +12,7 @@ other metrics. import numpy as np import pandas as pd import pypsa +from _helpers import set_scenario_config from make_summary import calculate_cfs # noqa: F401 from make_summary import calculate_nodal_cfs # noqa: F401 from make_summary import calculate_nodal_costs # noqa: F401 @@ -19,7 +20,6 @@ from make_summary import assign_carriers, assign_locations from prepare_sector_network import prepare_costs from pypsa.descriptors import get_active_assets from six import iteritems -from _helpers import set_scenario_config idx = pd.IndexSlice diff --git a/scripts/plot_power_network_clustered.py b/scripts/plot_power_network_clustered.py index 43746039..0c3dc635 100644 --- a/scripts/plot_power_network_clustered.py +++ b/scripts/plot_power_network_clustered.py @@ -9,10 +9,10 @@ Plot clustered electricity transmission network. import geopandas as gpd import matplotlib.pyplot as plt import pypsa +from _helpers import set_scenario_config from matplotlib.lines import Line2D from plot_power_network import load_projection from pypsa.plot import add_legend_lines -from _helpers import set_scenario_config if __name__ == "__main__": if "snakemake" not in globals(): diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index da077348..addb87ef 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -11,8 +11,8 @@ import logging import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import pandas as pd -from prepare_sector_network import co2_emissions_year from _helpers import configure_logging, set_scenario_config +from prepare_sector_network import co2_emissions_year logger = logging.getLogger(__name__) plt.style.use("ggplot") diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index de9932fd..97e5eeeb 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -12,7 +12,11 @@ import re import numpy as np import pandas as pd import pypsa -from _helpers import update_config_with_sector_opts, set_scenario_config, configure_logging +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_with_sector_opts, +) from add_existing_baseyear import add_build_year_to_new_assets from pypsa.descriptors import expand_series from pypsa.io import import_components_from_dataframe diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index bf9ed58f..90df5c93 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -18,7 +18,11 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import configure_logging, set_scenario_config, update_config_with_sector_opts +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_with_sector_opts, +) from add_electricity import calculate_annuity, sanitize_carriers, sanitize_locations from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement diff --git a/scripts/retrieve_databundle.py b/scripts/retrieve_databundle.py index b6a4d378..1d217a43 100644 --- a/scripts/retrieve_databundle.py +++ b/scripts/retrieve_databundle.py @@ -36,7 +36,12 @@ import logging import tarfile from pathlib import Path -from _helpers import configure_logging, progress_retrieve, validate_checksum, set_scenario_config +from _helpers import ( + configure_logging, + progress_retrieve, + set_scenario_config, + validate_checksum, +) logger = logging.getLogger(__name__) diff --git a/scripts/retrieve_gas_infrastructure_data.py b/scripts/retrieve_gas_infrastructure_data.py index 7cc1c270..64bd6dc2 100644 --- a/scripts/retrieve_gas_infrastructure_data.py +++ b/scripts/retrieve_gas_infrastructure_data.py @@ -11,7 +11,12 @@ import logging import zipfile from pathlib import Path -from _helpers import progress_retrieve, validate_checksum, set_scenario_config, configure_logging +from _helpers import ( + configure_logging, + progress_retrieve, + set_scenario_config, + validate_checksum, +) logger = logging.getLogger(__name__) From fe143ff8fef243d0fb78e420ee7a8274aac02b39 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 12:10:05 +0100 Subject: [PATCH 388/497] use default config as base configuration --- Snakefile | 11 +++-------- config/config.yaml | 7 +++++++ doc/configuration.rst | 2 +- doc/installation.rst | 13 ++++--------- doc/introduction.rst | 2 +- doc/release_notes.rst | 5 +++++ 6 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 config/config.yaml diff --git a/Snakefile b/Snakefile index 8391156c..ba60cbc9 100644 --- a/Snakefile +++ b/Snakefile @@ -2,8 +2,8 @@ # # SPDX-License-Identifier: MIT -from os.path import normpath, exists -from shutil import copyfile, move, rmtree +from os.path import normpath +from shutil import move, rmtree from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider @@ -13,12 +13,7 @@ from snakemake.utils import min_version min_version("7.7") -conf_file = os.path.join(workflow.current_basedir, "config/config.yaml") -conf_default_file = os.path.join(workflow.current_basedir, "config/config.default.yaml") -if not exists(conf_file) and exists(conf_default_file): - copyfile(conf_default_file, conf_file) - - +configfile: "config/config.default.yaml" configfile: "config/config.yaml" diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 00000000..6fa1862c --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: : 2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 +# add your own configuration overrides here, for instance + +# enable: +# retrieve: false \ No newline at end of file diff --git a/doc/configuration.rst b/doc/configuration.rst index 92ed269b..f65aa4c2 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -9,7 +9,7 @@ Configuration ########################################## -PyPSA-Eur has several configuration options which are documented in this section and are collected in a ``config/config.yaml`` file located in the root directory. Users should copy the provided default configuration (``config/config.default.yaml``) and amend their own modifications and assumptions in the user-specific configuration file (``config/config.yaml``); confer installation instructions at :ref:`defaultconfig`. +PyPSA-Eur has several configuration options which are documented in this section and are collected in a ``config/config.yaml`` file. This file defines deviations from the default configuration (``config/config.default.yaml``); confer installation instructions at :ref:`defaultconfig`. .. _toplevel_cf: diff --git a/doc/installation.rst b/doc/installation.rst index 01fdafeb..d2fdfb4e 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -118,11 +118,10 @@ Nevertheless, you can still use open-source solvers for smaller problems. Handling Configuration Files ============================ -PyPSA-Eur has several configuration options that must be specified in a -``config/config.yaml`` file located in the root directory. An example configuration -``config/config.default.yaml`` is maintained in the repository, which will be used to -automatically create your customisable ``config/config.yaml`` on first use. More -details on the configuration options are in :ref:`config`. +PyPSA-Eur has several configuration options that users can specify in a +``config/config.yaml`` file. The default configuration +``config/config.default.yaml`` is maintained in the repository. More details on +the configuration options are in :ref:`config`. You can also use ``snakemake`` to specify another file, e.g. ``config/config.mymodifications.yaml``, to update the settings of the ``config/config.yaml``. @@ -131,7 +130,3 @@ You can also use ``snakemake`` to specify another file, e.g. .../pypsa-eur % snakemake -call --configfile config/config.mymodifications.yaml -.. warning:: - Users are advised to regularly check their own ``config/config.yaml`` against changes - in the ``config/config.default.yaml`` when pulling a new version from the remote - repository. diff --git a/doc/introduction.rst b/doc/introduction.rst index 413db9d1..0047f0a7 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -74,7 +74,7 @@ what data to retrieve and what files to produce. Details are explained in :ref:`wildcards` and :ref:`scenario`. The model also has several further configuration options collected in the -``config/config.yaml`` file located in the root directory, which that are not part of +``config/config.default.yaml`` file located in the root directory, which that are not part of the scenarios. Options are explained in :ref:`config`. Folder Structure diff --git a/doc/release_notes.rst b/doc/release_notes.rst index fce4ae1b..cab8229a 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,11 @@ Release Notes Upcoming Release ================ +* The default configuration ``config/config.default.yaml`` is now automatically + used as a base configuration file and no longer copied to + ``config/config.yaml`` on first use. The file ``config/config.yaml`` should be + used to define deviations from the default configuration. + * Merged two OPSD time series data versions into such that the option ``load: power_statistics:`` becomes superfluous and was hence removed. From abe06a68fbc28c3d71c459eb66ed7daf5b8d42b0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:11:02 +0000 Subject: [PATCH 389/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Snakefile | 1 + config/config.yaml | 2 +- doc/installation.rst | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Snakefile b/Snakefile index ba60cbc9..ee24841a 100644 --- a/Snakefile +++ b/Snakefile @@ -13,6 +13,7 @@ from snakemake.utils import min_version min_version("7.7") + configfile: "config/config.default.yaml" configfile: "config/config.yaml" diff --git a/config/config.yaml b/config/config.yaml index 6fa1862c..6b8bdd77 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -4,4 +4,4 @@ # add your own configuration overrides here, for instance # enable: -# retrieve: false \ No newline at end of file +# retrieve: false diff --git a/doc/installation.rst b/doc/installation.rst index d2fdfb4e..4289b098 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -129,4 +129,3 @@ You can also use ``snakemake`` to specify another file, e.g. .. code:: bash .../pypsa-eur % snakemake -call --configfile config/config.mymodifications.yaml - From 5840a9aa11378a028504e09edd91322c53b0b2cb Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 12:17:13 +0100 Subject: [PATCH 390/497] remove inefficient _helper.py file search --- rules/common.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/common.smk b/rules/common.smk index 5aa7ae53..4c6cc7c2 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -4,7 +4,7 @@ import os, sys, glob -helper_source_path = [match for match in glob.glob("**/_helpers.py", recursive=True)] +helper_source_path = workflow.source_path("scripts/_helpers.py") for path in helper_source_path: path = os.path.dirname(os.path.abspath(path)) From 1e5163b66bc5cd3d67f3b7b84b7997ebf2d3a5be Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 13:45:42 +0100 Subject: [PATCH 391/497] alternative approach --- rules/common.smk | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 4c6cc7c2..50132f4b 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -4,11 +4,8 @@ import os, sys, glob -helper_source_path = workflow.source_path("scripts/_helpers.py") - -for path in helper_source_path: - path = os.path.dirname(os.path.abspath(path)) - sys.path.insert(0, os.path.abspath(path)) +for path in ["../scripts", "./scripts"]: + sys.path.insert(0, os.path.abspath(path) from _helpers import validate_checksum From fa931cc2b102ebd8a7241e0e0aba8bd8281e1eb5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 13:54:28 +0100 Subject: [PATCH 392/497] alternative approach 2 --- rules/common.smk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 50132f4b..598d3b98 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -4,8 +4,8 @@ import os, sys, glob -for path in ["../scripts", "./scripts"]: - sys.path.insert(0, os.path.abspath(path) +path = workflow.source_path("../scripts/_helpers.py") +sys.path.insert(0, os.path.dirname(path)) from _helpers import validate_checksum From 69e20e344864245039bb392089b9f2645799ba2a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 13:55:32 +0100 Subject: [PATCH 393/497] need at least one entry for config/config.yaml to read as yaml --- config/config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/config.yaml b/config/config.yaml index 6fa1862c..620a695c 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -3,5 +3,6 @@ # SPDX-License-Identifier: CC0-1.0 # add your own configuration overrides here, for instance +version: 0.9.0 # enable: # retrieve: false \ No newline at end of file From f024412301beed2f6a36c9df74b52aaeb13969f5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 16:49:15 +0100 Subject: [PATCH 394/497] simplify test cases --- config/scenarios.yaml | 38 +++++++------------ config/test/config.scenarios.electricity.yaml | 34 +---------------- config/test/scenarios.electricity.yaml | 3 -- 3 files changed, 16 insertions(+), 59 deletions(-) diff --git a/config/scenarios.yaml b/config/scenarios.yaml index c493311f..0eba9d75 100644 --- a/config/scenarios.yaml +++ b/config/scenarios.yaml @@ -11,28 +11,18 @@ # electricity: # renewable_carriers: [wind, solar] # override the list of renewable carriers +normal: + electricity: + renewable_carriers: + - solar + - onwind + - offwind-ac + - offwind-dc + - hydro -network2013: - snapshots: - start: "2013-01-01" - end: "2014-01-01" - inclusive: 'left' - - -network2019: - snapshots: - start: "2019-01-01" - end: "2020-01-01" - inclusive: 'left' - - renewable: - onwind: - cutout: europe-2019-era5 - offwind-ac: - cutout: europe-2019-era5 - offwind-dc: - cutout: europe-2019-era5 - solar: - cutout: europe-2019-era5 - hydro: - cutout: europe-2019-era5 +no-offwind: + electricity: + renewable_carriers: + - solar + - onwind + - hydro diff --git a/config/test/config.scenarios.electricity.yaml b/config/test/config.scenarios.electricity.yaml index 185dcda4..dde138ed 100644 --- a/config/test/config.scenarios.electricity.yaml +++ b/config/test/config.scenarios.electricity.yaml @@ -28,16 +28,10 @@ snapshots: end: "2013-03-08" electricity: - co2limit: 100.e+6 - extendable_carriers: Generator: [OCGT] - StorageUnit: [battery] - Store: [H2] - Link: [H2 pipeline] - - renewable_carriers: [solar, onwind, offwind-ac, offwind-dc] - + StorageUnit: [battery, H2] + Store: [] atlite: default_cutout: be-03-2013-era5 @@ -60,31 +54,7 @@ renewable: solar: cutout: be-03-2013-era5 - -clustering: - exclude_carriers: ["OCGT", "offwind-ac", "coal"] - -lines: - dynamic_line_rating: - activate: true - cutout: be-03-2013-era5 - max_line_rating: 1.3 - - solving: solver: name: glpk options: "glpk-default" - - -plotting: - map: - boundaries: - eu_node_location: - x: -5.5 - y: 46. - costs_max: 1000 - costs_threshold: 0.0000001 - energy_max: - energy_min: - energy_threshold: 0.000001 diff --git a/config/test/scenarios.electricity.yaml b/config/test/scenarios.electricity.yaml index e9893479..962cc91e 100644 --- a/config/test/scenarios.electricity.yaml +++ b/config/test/scenarios.electricity.yaml @@ -6,9 +6,6 @@ test-elec-no-offshore-wind: electricity: renewable_carriers: [solar, onwind] - test-elec-no-onshore-wind: electricity: - extendable_carriers: - Generator: [OCGT] renewable_carriers: [solar, offwind-ac, offwind-dc] From c83db4e84e17a94755ab3fa914553047c1e97365 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 16:54:33 +0100 Subject: [PATCH 395/497] add retrieve_cost_data.py script to handle config_provider and move to resources since dependent on config setting --- Snakefile | 2 +- doc/configtables/sector-opts.csv | 2 +- doc/costs.rst | 4 +-- rules/build_sector.smk | 8 +++--- rules/postprocess.smk | 8 +++--- rules/retrieve.smk | 16 ++++-------- rules/solve_myopic.smk | 6 ++--- rules/solve_perfect.smk | 12 +++------ scripts/retrieve_cost_data.py | 42 ++++++++++++++++++++++++++++++++ 9 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 scripts/retrieve_cost_data.py diff --git a/Snakefile b/Snakefile index 7df61162..4acba0c8 100644 --- a/Snakefile +++ b/Snakefile @@ -22,7 +22,7 @@ if not exists(conf_file) and exists(conf_default_file): configfile: "config/config.yaml" -COSTS = f"data/costs_{config['costs']['year']}.csv" +COSTS = f"resources/costs_{config['costs']['year']}.csv" ATLITE_NPROCESSES = config["atlite"].get("nprocesses", 4) run = config["run"] diff --git a/doc/configtables/sector-opts.csv b/doc/configtables/sector-opts.csv index ea39c3b0..fc9e8c10 100644 --- a/doc/configtables/sector-opts.csv +++ b/doc/configtables/sector-opts.csv @@ -7,5 +7,5 @@ Trigger, Description, Definition, Status ``B``,Add biomass,,In active use ``I``,Add industry sector,,In active use ``A``,Add agriculture sector,,In active use -``dist``+``n``,Add distribution grid with investment costs of ``n`` times costs in ``data/costs_{cost_year}.csv``,,In active use +``dist``+``n``,Add distribution grid with investment costs of ``n`` times costs in ``resources/costs_{cost_year}.csv``,,In active use ``seq``+``n``,Sets the CO2 sequestration potential to ``n`` Mt CO2 per year,,In active use diff --git a/doc/costs.rst b/doc/costs.rst index 5ddbb360..9a06fd16 100644 --- a/doc/costs.rst +++ b/doc/costs.rst @@ -9,7 +9,7 @@ Techno-Economic Assumptions The database of cost assumptions is retrieved from the repository `PyPSA/technology-data `_ and then -saved to a file ``data/costs_{year}.csv``. The ``config/config.yaml`` provides options +saved to a file ``resources/costs_{year}.csv``. The ``config/config.yaml`` provides options to choose a reference year and use a specific version of the repository. .. literalinclude:: ../config/config.default.yaml @@ -50,7 +50,7 @@ Modifying Assumptions Some cost assumptions (e.g. marginal cost and capital cost) can be directly set in the ``config/config.yaml`` (cf. Section :ref:`costs_cf` in :ref:`config`). To change cost assumptions in more detail, make a copy of -``data/costs_{year}.csv`` and reference the new cost file in the ``Snakefile``: +``resources/costs_{year}.csv`` and reference the new cost file in the ``Snakefile``: .. literalinclude:: ../Snakefile :start-at: COSTS diff --git a/rules/build_sector.smk b/rules/build_sector.smk index d7fbe638..62b69337 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -853,10 +853,10 @@ rule prepare_sector_network: "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv" ) ), - costs=( - "data/costs_{}.csv".format(config_provider("costs", "year")) - if config_provider("foresight") == "overnight" - else "data/costs_{planning_horizons}.csv" + costs=lambda w: ( + "resources/costs_{}.csv".format(config_provider("costs", "year")) + if config_provider("foresight")(w) == "overnight" + else "resources/costs_{planning_horizons}.csv" ), profile_offwind_ac=resources("profile_offwind-ac.nc"), profile_offwind_dc=resources("profile_offwind-dc.nc"), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 38e5f7d9..542c8d29 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -174,10 +174,10 @@ rule make_summary: **config["scenario"], run=config["run"]["name"], ), - costs=( - "data/costs_{}.csv".format(config_provider("costs", "year")) - if config_provider("foresight") == "overnight" - else "data/costs_{}.csv".format( + costs=lambda w: ( + "resources/costs_{}.csv".format(config_provider("costs", "year")) + if config_provider("foresight")(w) == "overnight" + else "resources/costs_{}.csv".format( config_provider("scenario", "planning_horizons", 0) ) ), diff --git a/rules/retrieve.smk b/rules/retrieve.smk index c9fd91aa..1b2513fb 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -83,23 +83,17 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_cutout", True if config["enable"]["retrieve"] and config["enable"].get("retrieve_cost_data", True): rule retrieve_cost_data: - input: - HTTP.remote( - "raw.githubusercontent.com/PyPSA/technology-data/{}/outputs/".format( - config_provider("costs", "version") - ) - + "costs_{year}.csv", - keep_local=True, - ), + params: + version=lambda w: config_provider("costs", "version")(w), output: - "data/costs_{year}.csv", + resources("costs_{year}.csv"), log: "logs/retrieve_cost_data_{year}.log", resources: mem_mb=1000, retries: 2 - run: - move(input[0], output[0]) + script: + "../scripts/retrieve_cost_data.py" if config["enable"]["retrieve"] and config["enable"].get( diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index a6313cac..bea6b6cc 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -16,7 +16,7 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs=lambda w: "data/costs_{}.csv".format( + costs=lambda w: "resources/costs_{}.csv".format( config_provider("scenario", "planning_horizons", 0)(w) ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), @@ -71,7 +71,7 @@ rule add_brownfield: 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", + costs="resources/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: @@ -109,7 +109,7 @@ rule solve_sector_network_myopic: input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - costs="data/costs_{planning_horizons}.csv", + costs="resources/costs_{planning_horizons}.csv", config=RESULTS + "config.yaml", output: RESULTS diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index ee16a201..d1a5f745 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -14,7 +14,7 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs="data/costs_{}.csv".format( + costs="resources/costs_{}.csv".format( config_provider("scenario", "planning_horizons", 0) ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), @@ -95,7 +95,7 @@ rule solve_sector_network_perfect: input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", - costs="data/costs_2030.csv", + costs="resources/costs_2030.csv", config=RESULTS + "config.yaml", output: RESULTS @@ -127,13 +127,7 @@ rule make_summary_perfect: **{ f"networks_{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}": RESULTS + f"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc" - for simpl in config_provider("scenario", "simpl") - for clusters in config_provider("scenario", "clusters") - for opts in config_provider("scenario", "opts") - for sector_opts in config_provider("scenario", "sector_opts") - for ll in config_provider("scenario", "ll") - }, - costs="data/costs_2020.csv", + costs="resources/costs_2020.csv", output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", nodal_capacities=RESULTS + "csvs/nodal_capacities.csv", diff --git a/scripts/retrieve_cost_data.py b/scripts/retrieve_cost_data.py new file mode 100644 index 00000000..ceae8bf9 --- /dev/null +++ b/scripts/retrieve_cost_data.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Retrieve cost data from ``technology-data``. +""" + +import logging +from pathlib import Path + +from _helpers import configure_logging, progress_retrieve, set_scenario_config + +logger = logging.getLogger(__name__) + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("retrieve_cost_data", year=2030) + rootpath = ".." + else: + rootpath = "." + configure_logging(snakemake) + set_scenario_config(snakemake) + + version = snakemake.params.version + baseurl = f"https://raw.githubusercontent.com/PyPSA/technology-data/{version}/outputs/" + filepath = Path(snakemake.output[0]) + url = baseurl + filepath.name + + print(url) + + to_fn = Path(rootpath) / filepath + + print(to_fn) + + logger.info(f"Downloading technology data from '{url}'.") + disable_progress = snakemake.config["run"].get("disable_progressbar", False) + progress_retrieve(url, to_fn, disable=disable_progress) + + logger.info(f"Technology data available at at {to_fn}") From c3feb0e283d19c7d7c963ed7cb479bb064fe7db5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 12 Feb 2024 16:56:00 +0100 Subject: [PATCH 396/497] handle complicated config-dependent inputs using unpack() with input functions --- Snakefile | 2 + doc/configtables/run.csv | 2 +- rules/build_electricity.smk | 71 +++++---- rules/build_sector.smk | 277 +++++++++++++++++++----------------- rules/common.smk | 8 +- rules/postprocess.smk | 20 +-- rules/solve_myopic.smk | 19 ++- rules/solve_perfect.smk | 31 ++-- rules/validate.smk | 15 +- 9 files changed, 247 insertions(+), 198 deletions(-) diff --git a/Snakefile b/Snakefile index 4acba0c8..826521c1 100644 --- a/Snakefile +++ b/Snakefile @@ -8,6 +8,8 @@ from pathlib import Path import yaml from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider from snakemake.utils import min_version + +# TODO: check if this works with mock_snakemake from scripts._helpers import path_provider min_version("7.7") diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index 75f29928..e2a81e0b 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -2,7 +2,7 @@ name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenario: enable`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenario: file``." scenarios,,, -- enable,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``file``." --- file,str,,"Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run:scenarios`` has to be set to ``true`` and ``run:name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combindation of settings, alter and use the ``config/create_scenarios.py`` script in ``scripts``." +-- file,str,,"Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run: scenarios`` has to be set to ``true`` and ``run: name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combination of settings, alter and use the ``config/create_scenarios.py`` script in the ``config`` directory." disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." shared_resources,bool/str/list,,"Switch to select whether resources should be shared across runs. If a string or list is passed, it is assumed to be wildcard(s) which indicates up to which set of wildcards the resource folder should be shared. If set to 'base', only resources before creating the elec.nc file are shared." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 4c83e0b0..8876c68e 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -20,8 +20,9 @@ if config["enable"].get("prepare_links_p_nom", False): rule build_electricity_demand: params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, countries=config_provider("countries"), load=config_provider("load"), @@ -64,8 +65,9 @@ rule build_powerplants: rule base_network: params: countries=config_provider("countries"), - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, lines=config_provider("lines"), links=config_provider("links"), @@ -177,8 +179,8 @@ if config["enable"].get("build_natura_raster", False): rule build_natura_raster: input: natura=ancient("data/bundle/natura/Natura2000_end2015.shp"), - cutouts=expand( - "cutouts/" + CDIR + "{cutouts}.nc", **config_provider("atlite") + cutouts=lambda w: expand( + "cutouts/" + CDIR + "{cutouts}.nc", **config_provider("atlite")(w) ), output: resources("natura.tiff"), @@ -195,11 +197,11 @@ if config["enable"].get("build_natura_raster", False): rule build_ship_raster: input: ship_density="data/shipdensity_global.zip", - cutouts=expand( + cutouts=lambda w: expand( "cutouts/" + CDIR + "{cutout}.nc", cutout=[ - config_provider("renewable", k, "cutout") - for k in config_provider("electricity", "renewable_carriers") + config_provider("renewable", k, "cutout")(w) + for k in config_provider("electricity", "renewable_carriers")(w) ], ), output: @@ -269,8 +271,9 @@ else: rule build_renewable_profiles: params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, renewable=config_provider("renewable"), input: @@ -352,9 +355,9 @@ rule build_hydro_profile: input: country_shapes=resources("country_shapes.geojson"), eia_hydro_generation="data/eia_hydro_annual_generation.csv", - cutout=f"cutouts/" + cutout=lambda w: f"cutouts/" + CDIR - + config_provider("renewable", "hydro", "cutout") + + config_provider("renewable", "hydro", "cutout")(w) + ".nc", output: resources("profile_hydro.nc"), @@ -397,6 +400,23 @@ if config["lines"]["dynamic_line_rating"]["activate"]: "../scripts/build_line_rating.py" +def input_profile_tech(w): + return { + f"profile_{tech}": resources(f"profile_{tech}.nc") + for tech in config_provider("electricity", "renewable_carriers")(w) + } + + +def input_conventional(w): + return { + f"conventional_{carrier}_{attr}": fn + for carrier, d in config_provider("conventional", default={None: {}})(w).items() + if carrier in config_provider("electricity", "conventional_carriers")(w) + for attr, fn in d.items() + if str(fn).startswith("data/") + } + + rule add_electricity: params: length_factor=config_provider("lines", "length_factor"), @@ -407,21 +427,12 @@ rule add_electricity: conventional=config_provider("conventional"), costs=config_provider("costs"), input: - **{ - f"profile_{tech}": resources(f"profile_{tech}.nc") - for tech in config_provider("electricity", "renewable_carriers") - }, - **{ - f"conventional_{carrier}_{attr}": fn - for carrier, d in config.get("conventional", {None: {}}).items() - if carrier in config_provider("electricity", "conventional_carriers") - for attr, fn in d.items() - if str(fn).startswith("data/") - }, + unpack(input_profile_tech), + unpack(input_conventional), base_network=resources("networks/base.nc"), - line_rating=( + line_rating=lambda w: ( resources("networks/line_rating.nc") - if config_provider("lines", "dynamic_line_rating", "activate") + if config_provider("lines", "dynamic_line_rating", "activate")(w) else resources("networks/base.nc") ), tech_costs=COSTS, @@ -430,9 +441,9 @@ rule add_electricity: hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), geth_hydro_capacities="data/geth2015_hydro_capacities.csv", unit_commitment="data/unit_commitment.csv", - fuel_price=( + fuel_price=lambda w: ( resources("monthly_fuel_price.csv") - if config_provider("conventional", "dynamic_fuel_price") + if config_provider("conventional", "dynamic_fuel_price")(w) else [] ), load=resources("electricity_demand.csv"), @@ -509,9 +520,9 @@ rule cluster_network: regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"), regions_offshore=resources("regions_offshore_elec_s{simpl}.geojson"), busmap=ancient(resources("busmap_elec_s{simpl}.csv")), - custom_busmap=( + custom_busmap=lambda w: ( "data/custom_busmap_elec_s{simpl}_{clusters}.csv" - if config_provider("enable", "custom_busmap", default=False) + if config_provider("enable", "custom_busmap", default=False)(w) else [] ), tech_costs=COSTS, diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 62b69337..cfd7191e 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -7,7 +7,10 @@ rule build_population_layouts: input: nuts3_shapes=resources("nuts3_shapes.geojson"), urban_percent="data/urban_percent.csv", - cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", + cutout=lambda w: "cutouts/" + + CDIR + + config_provider("atlite", "default_cutout")(w) + + ".nc", output: pop_layout_total=resources("pop_layout_total.nc"), pop_layout_urban=resources("pop_layout_urban.nc"), @@ -31,7 +34,10 @@ rule build_clustered_population_layouts: pop_layout_urban=resources("pop_layout_urban.nc"), pop_layout_rural=resources("pop_layout_rural.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", + cutout=lambda w: "cutouts/" + + CDIR + + config_provider("atlite", "default_cutout")(w) + + ".nc", output: clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), log: @@ -52,7 +58,10 @@ rule build_simplified_population_layouts: pop_layout_urban=resources("pop_layout_urban.nc"), pop_layout_rural=resources("pop_layout_rural.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"), - cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", + cutout=lambda w: "cutouts/" + + CDIR + + config_provider("atlite", "default_cutout")(w) + + ".nc", output: clustered_pop_layout=resources("pop_layout_elec_s{simpl}.csv"), resources: @@ -126,13 +135,17 @@ rule cluster_gas_network: rule build_daily_heat_demand: params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", + cutout=lambda w: "cutouts/" + + CDIR + + config_provider("atlite", "default_cutout")(w) + + ".nc", output: heat_demand=resources("daily_heat_demand_{scope}_elec_s{simpl}_{clusters}.nc"), resources: @@ -150,8 +163,9 @@ rule build_daily_heat_demand: rule build_hourly_heat_demand: params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, input: heat_profile="data/heat_load_profile_BDEW.csv", @@ -173,13 +187,17 @@ rule build_hourly_heat_demand: rule build_temperature_profiles: params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", + cutout=lambda w: "cutouts/" + + CDIR + + config_provider("atlite", "default_cutout")(w) + + ".nc", output: temp_soil=resources("temp_soil_{scope}_elec_s{simpl}_{clusters}.nc"), temp_air=resources("temp_air_{scope}_elec_s{simpl}_{clusters}.nc"), @@ -227,15 +245,18 @@ rule build_cop_profiles: rule build_solar_thermal_profiles: params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, - # TODO use config_provider solar_thermal=config_provider("solar_thermal"), input: pop_layout=resources("pop_layout_{scope}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), - cutout="cutouts/" + CDIR + config_provider("atlite", "default_cutout") + ".nc", + cutout=lambda w: "cutouts/" + + CDIR + + config_provider("atlite", "default_cutout")(w) + + ".nc", output: solar_thermal=resources("solar_thermal_{scope}_elec_s{simpl}_{clusters}.nc"), resources: @@ -314,76 +335,54 @@ rule build_biomass_potentials: "../scripts/build_biomass_potentials.py" -if config["sector"]["biomass_transport"] or config["sector"]["biomass_spatial"]: - - rule build_biomass_transport_costs: - input: - transport_cost_data=HTTP.remote( - "publications.jrc.ec.europa.eu/repository/bitstream/JRC98626/biomass potentials in europe_web rev.pdf", - keep_local=True, - ), - output: - biomass_transport_costs=resources("biomass_transport_costs.csv"), - threads: 1 - resources: - mem_mb=1000, - log: - logs("build_biomass_transport_costs.log"), - benchmark: - benchmarks("build_biomass_transport_costs") - conda: - "../envs/environment.yaml" - script: - "../scripts/build_biomass_transport_costs.py" - - build_biomass_transport_costs_output = rules.build_biomass_transport_costs.output +rule build_biomass_transport_costs: + input: + transport_cost_data=HTTP.remote( + "publications.jrc.ec.europa.eu/repository/bitstream/JRC98626/biomass potentials in europe_web rev.pdf", + keep_local=True, + ), + output: + biomass_transport_costs=resources("biomass_transport_costs.csv"), + threads: 1 + resources: + mem_mb=1000, + log: + logs("build_biomass_transport_costs.log"), + benchmark: + benchmarks("build_biomass_transport_costs") + conda: + "../envs/environment.yaml" + script: + "../scripts/build_biomass_transport_costs.py" -if not (config["sector"]["biomass_transport"] or config["sector"]["biomass_spatial"]): - # this is effecively an `else` statement which is however not liked by snakefmt - build_biomass_transport_costs_output = {} - - -if config["sector"]["regional_co2_sequestration_potential"]["enable"]: - - rule build_sequestration_potentials: - params: - sequestration_potential=config_provider( - "sector", "regional_co2_sequestration_potential" - ), - input: - sequestration_potential=HTTP.remote( - "https://raw.githubusercontent.com/ericzhou571/Co2Storage/main/resources/complete_map_2020_unit_Mt.geojson", - keep_local=True, - ), - regions_onshore=resources( - "regions_onshore_elec_s{simpl}_{clusters}.geojson" - ), - regions_offshore=resources( - "regions_offshore_elec_s{simpl}_{clusters}.geojson" - ), - output: - sequestration_potential=resources( - "co2_sequestration_potential_elec_s{simpl}_{clusters}.csv" - ), - threads: 1 - resources: - mem_mb=4000, - log: - logs("build_sequestration_potentials_s{simpl}_{clusters}.log"), - benchmark: - benchmarks("build_sequestration_potentials_s{simpl}_{clusters}") - conda: - "../envs/environment.yaml" - script: - "../scripts/build_sequestration_potentials.py" - - build_sequestration_potentials_output = rules.build_sequestration_potentials.output - - -if not config["sector"]["regional_co2_sequestration_potential"]["enable"]: - # this is effecively an `else` statement which is however not liked by snakefmt - build_sequestration_potentials_output = {} +rule build_sequestration_potentials: + params: + sequestration_potential=config_provider( + "sector", "regional_co2_sequestration_potential" + ), + input: + sequestration_potential=HTTP.remote( + "https://raw.githubusercontent.com/ericzhou571/Co2Storage/main/resources/complete_map_2020_unit_Mt.geojson", + keep_local=True, + ), + regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), + regions_offshore=resources("regions_offshore_elec_s{simpl}_{clusters}.geojson"), + output: + sequestration_potential=resources( + "co2_sequestration_potential_elec_s{simpl}_{clusters}.csv" + ), + threads: 1 + resources: + mem_mb=4000, + log: + logs("build_sequestration_potentials_s{simpl}_{clusters}.log"), + benchmark: + benchmarks("build_sequestration_potentials_s{simpl}_{clusters}") + conda: + "../envs/environment.yaml" + script: + "../scripts/build_sequestration_potentials.py" rule build_salt_cavern_potentials: @@ -643,43 +642,34 @@ rule build_industrial_energy_demand_per_node_today: "../scripts/build_industrial_energy_demand_per_node_today.py" -if config["sector"]["retrofitting"]["retro_endogen"]: - - rule build_retro_cost: - params: - retrofitting=config_provider("sector", "retrofitting"), - countries=config_provider("countries"), - input: - building_stock="data/retro/data_building_stock.csv", - data_tabula="data/bundle-sector/retro/tabula-calculator-calcsetbuilding.csv", - air_temperature=resources("temp_air_total_elec_s{simpl}_{clusters}.nc"), - u_values_PL="data/retro/u_values_poland.csv", - tax_w="data/retro/electricity_taxes_eu.csv", - construction_index="data/retro/comparative_level_investment.csv", - floor_area_missing="data/retro/floor_area_missing.csv", - clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - cost_germany="data/retro/retro_cost_germany.csv", - window_assumptions="data/retro/window_assumptions.csv", - output: - retro_cost=resources("retro_cost_elec_s{simpl}_{clusters}.csv"), - floor_area=resources("floor_area_elec_s{simpl}_{clusters}.csv"), - resources: - mem_mb=1000, - log: - logs("build_retro_cost_s{simpl}_{clusters}.log"), - benchmark: - benchmarks("build_retro_cost/s{simpl}_{clusters}") - conda: - "../envs/environment.yaml" - script: - "../scripts/build_retro_cost.py" - - build_retro_cost_output = rules.build_retro_cost.output - - -if not config["sector"]["retrofitting"]["retro_endogen"]: - # this is effecively an `else` statement which is however not liked by snakefmt - build_retro_cost_output = {} +rule build_retro_cost: + params: + retrofitting=config_provider("sector", "retrofitting"), + countries=config_provider("countries"), + input: + building_stock="data/retro/data_building_stock.csv", + data_tabula="data/bundle-sector/retro/tabula-calculator-calcsetbuilding.csv", + air_temperature=resources("temp_air_total_elec_s{simpl}_{clusters}.nc"), + u_values_PL="data/retro/u_values_poland.csv", + tax_w="data/retro/electricity_taxes_eu.csv", + construction_index="data/retro/comparative_level_investment.csv", + floor_area_missing="data/retro/floor_area_missing.csv", + clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), + cost_germany="data/retro/retro_cost_germany.csv", + window_assumptions="data/retro/window_assumptions.csv", + output: + retro_cost=resources("retro_cost_elec_s{simpl}_{clusters}.csv"), + floor_area=resources("floor_area_elec_s{simpl}_{clusters}.csv"), + resources: + mem_mb=1000, + log: + logs("build_retro_cost_s{simpl}_{clusters}.log"), + benchmark: + benchmarks("build_retro_cost/s{simpl}_{clusters}") + conda: + "../envs/environment.yaml" + script: + "../scripts/build_retro_cost.py" rule build_population_weighted_energy_totals: @@ -720,8 +710,9 @@ rule build_shipping_demand: rule build_transport_demand: params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, sector=config_provider("sector"), input: @@ -825,11 +816,31 @@ rule prepare_sector_network: eurostat_report_year=config_provider("energy", "eurostat_report_year"), RDIR=RDIR, input: - **build_retro_cost_output, - **build_biomass_transport_costs_output, **rules.cluster_gas_network.output, **rules.build_gas_input_locations.output, - **build_sequestration_potentials_output, + retro_cost=lambda w: ( + resources("retro_cost_elec_s{simpl}_{clusters}.csv") + if config_provider("sector", "retrofitting", "retro_endogen")(w) + else [] + ), + floor_area=lambda w: ( + resources("floor_area_elec_s{simpl}_{clusters}.csv") + if config_provider("sector", "retrofitting", "retro_endogen")(w) + else [] + ), + biomass_transport_costs=lambda w: ( + resources("biomass_transport_costs.csv") + if config_provider("sector", "biomass_transport")(w) + or config_provider("sector", "biomass_spatial")(w) + else [] + ), + sequestration_potential=lambda w: ( + resources("co2_sequestration_potential_elec_s{simpl}_{clusters}.csv") + if config_provider( + "sector", "regional_co2_sequestration_potential", "enable" + )(w) + else [] + ), network=resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), energy_totals_name=resources("energy_totals.csv"), eurostat=input_eurostat, @@ -843,12 +854,12 @@ rule prepare_sector_network: dsm_profile=resources("dsm_profile_s{simpl}_{clusters}.csv"), co2_totals_name=resources("co2_totals.csv"), co2="data/bundle-sector/eea/UNFCCC_v23.csv", - biomass_potentials=( + biomass_potentials=lambda w: ( resources( "biomass_potentials_s{simpl}_{clusters}_" + "{}.csv".format(config_provider("biomass", "year")) ) - if config_provider("foresight") == "overnight" + if config_provider("foresight")(w) == "overnight" else resources( "biomass_potentials_s{simpl}_{clusters}_{planning_horizons}.csv" ) @@ -886,19 +897,19 @@ rule prepare_sector_network: cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), cop_air_rural=resources("cop_air_rural_elec_s{simpl}_{clusters}.nc"), cop_air_urban=resources("cop_air_urban_elec_s{simpl}_{clusters}.nc"), - solar_thermal_total=( + solar_thermal_total=lambda w: ( resources("solar_thermal_total_elec_s{simpl}_{clusters}.nc") - if config_provider("sector", "solar_thermal") + if config_provider("sector", "solar_thermal")(w) else [] ), - solar_thermal_urban=( + solar_thermal_urban=lambda w: ( resources("solar_thermal_urban_elec_s{simpl}_{clusters}.nc") - if config_provider("sector", "solar_thermal") + if config_provider("sector", "solar_thermal")(w) else [] ), - solar_thermal_rural=( + solar_thermal_rural=lambda w: ( resources("solar_thermal_rural_elec_s{simpl}_{clusters}.nc") - if config_provider("sector", "solar_thermal") + if config_provider("sector", "solar_thermal")(w) else [] ), output: diff --git a/rules/common.smk b/rules/common.smk index bf5e0894..c352a3a9 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -78,8 +78,8 @@ def config_provider(*keys, default=None): def solver_threads(w): - solver_options = config_provider("solving", "solver_options") - option_set = config_provider("solving", "solver", "options") + solver_options = config_provider("solving", "solver_options")(w) + option_set = config_provider("solving", "solver", "options")(w) threads = solver_options[option_set].get("threads", 4) return threads @@ -107,7 +107,7 @@ def memory(w): def input_custom_extra_functionality(w): path = config_provider( "solving", "options", "custom_extra_functionality", default=False - ) + )(w) if path: return os.path.join(os.path.dirname(workflow.snakefile), path) return [] @@ -131,7 +131,7 @@ def has_internet_access(url="www.zenodo.org") -> bool: def input_eurostat(w): # 2016 includes BA, 2017 does not - report_year = config_provider("energy", "eurostat_report_year") + report_year = config_provider("energy", "eurostat_report_year")(w) return f"data/bundle-sector/eurostat-energy_balances-june_{report_year}_edition" diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 542c8d29..79634bf6 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -111,6 +111,14 @@ if config["foresight"] != "perfect": if config["foresight"] == "perfect": + def output_map_year(w): + return { + f"map_{year}": RESULTS + + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_" + + f"{year}.pdf" + for year in config_provider("scenario", "planning_horizons")(w) + } + rule plot_power_network_perfect: params: plotting=config_provider("plotting"), @@ -119,12 +127,7 @@ if config["foresight"] == "perfect": + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", regions=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), output: - **{ - f"map_{year}": RESULTS - + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_" - + f"{year}.pdf" - for year in config_provider("scenario", "planning_horizons") - }, + unpack(output_map_year), threads: 2 resources: mem_mb=10000, @@ -158,8 +161,9 @@ rule make_summary: params: foresight=config_provider("foresight"), costs=config_provider("costs"), - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, scenario=config_provider("scenario"), RDIR=RDIR, diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index bea6b6cc..a52f17c0 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -49,6 +49,14 @@ rule add_existing_baseyear: "../scripts/add_existing_baseyear.py" +def input_profile_tech_brownfield(w): + return { + f"profile_{tech}": resources(f"profile_{tech}.nc") + for tech in config_provider("electricity", "renewable_carriers")(w) + if tech != "hydro" + } + + rule add_brownfield: params: H2_retrofit=config_provider("sector", "H2_retrofit"), @@ -56,16 +64,13 @@ rule add_brownfield: "sector", "H2_retrofit_capacity_per_CH4" ), threshold_capacity=config_provider("existing_capacities", " threshold_capacity"), - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, carriers=config_provider("electricity", "renewable_carriers"), input: - **{ - f"profile_{tech}": resources(f"profile_{tech}.nc") - for tech in config_provider("electricity", "renewable_carriers") - if tech != "hydro" - }, + unpack(input_profile_tech_brownfield), simplify_busmap=resources("busmap_elec_s{simpl}.csv"), cluster_busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), network=RESULTS diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index d1a5f745..0d94ad9c 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -48,14 +48,17 @@ rule add_existing_baseyear: "../scripts/add_existing_baseyear.py" +def input_network_year(w): + return { + f"network_{year}": RESULTS + + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{year}.nc" + for year in config_provider("scenario", "planning_horizons")(w)[1:] + } + + rule prepare_perfect_foresight: input: - **{ - f"network_{year}": RESULTS - + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_" - + f"{year}.nc" - for year in config_provider("scenario", "planning_horizons")[1:] - }, + unpack(input_network_year), brownfield_network=lambda w: ( RESULTS + "prenetworks-brownfield/" @@ -122,11 +125,21 @@ rule solve_sector_network_perfect: "../scripts/solve_network.py" +def input_networks_make_summary_perfect(w): + return { + f"networks_{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}": RESULTS + + f"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc" + for simpl in config_provider("scenario", "simpl")(w) + for clusters in config_provider("scenario", "clusters")(w) + for opts in config_provider("scenario", "opts")(w) + for sector_opts in config_provider("scenario", "sector_opts")(w) + for ll in config_provider("scenario", "ll")(w) + } + + rule make_summary_perfect: input: - **{ - f"networks_{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}": RESULTS - + f"postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc" + unpack(input_networks_make_summary_perfect), costs="resources/costs_2020.csv", output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", diff --git a/rules/validate.smk b/rules/validate.smk index 3c42c5f0..66949335 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -17,8 +17,9 @@ rule build_electricity_production: The data is used for validation of the optimization results. """ params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, countries=config_provider("countries"), output: @@ -37,8 +38,9 @@ rule build_cross_border_flows: The data is used for validation of the optimization results. """ params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, countries=config_provider("countries"), input: @@ -59,8 +61,9 @@ rule build_electricity_prices: The data is used for validation of the optimization results. """ params: - snapshots={ - k: config_provider("snapshots", k) for k in ["start", "end", "inclusive"] + snapshots=lambda w: { + k: config_provider("snapshots", k)(w) + for k in ["start", "end", "inclusive"] }, countries=config_provider("countries"), output: From 78b184ad0f457b4ba3ef9dd44306802e9c22f670 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:57:45 +0000 Subject: [PATCH 397/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/retrieve_cost_data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/retrieve_cost_data.py b/scripts/retrieve_cost_data.py index ceae8bf9..eb1ef041 100644 --- a/scripts/retrieve_cost_data.py +++ b/scripts/retrieve_cost_data.py @@ -25,7 +25,9 @@ if __name__ == "__main__": set_scenario_config(snakemake) version = snakemake.params.version - baseurl = f"https://raw.githubusercontent.com/PyPSA/technology-data/{version}/outputs/" + baseurl = ( + f"https://raw.githubusercontent.com/PyPSA/technology-data/{version}/outputs/" + ) filepath = Path(snakemake.output[0]) url = baseurl + filepath.name From 9c592d9f73630d350447ba45c9c408f06456c7f8 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Wed, 14 Feb 2024 10:49:40 +0100 Subject: [PATCH 398/497] add config/config.yaml to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c9d2e171..6454616c 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ gurobi.log doc/_build config.yaml +config/config.yaml dconf /data/links_p_nom.csv From ecedea02d630d49ff14ad54c97c11b919211ea77 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 12 Feb 2024 18:17:53 +0100 Subject: [PATCH 399/497] bugfix: include all countries in ammonia production resource This is so that the full EU28 ammonia demand can be correctly subtracted in the build_industry_sector_ratios.py script. No other downstream scripts are affected by this change. --- scripts/build_ammonia_production.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/build_ammonia_production.py b/scripts/build_ammonia_production.py index 1bcdf9ae..bfcfaf02 100644 --- a/scripts/build_ammonia_production.py +++ b/scripts/build_ammonia_production.py @@ -8,6 +8,7 @@ Build historical annual ammonia production per country in ktonNH3/a. import country_converter as coco import pandas as pd +import numpy as np cc = coco.CountryConverter() @@ -30,8 +31,12 @@ if __name__ == "__main__": ammonia.index = cc.convert(ammonia.index, to="iso2") years = [str(i) for i in range(2013, 2018)] - countries = ammonia.index.intersection(snakemake.params.countries) - ammonia = ammonia.loc[countries, years].astype(float) + + ammonia = ammonia[years] + ammonia.replace("--", + np.nan, + inplace=True) + ammonia = ammonia.astype(float) # convert from ktonN to ktonNH3 ammonia *= 17 / 14 From c54626cc1a847ffded57e50cba2330f1f994a4ec Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 12 Feb 2024 18:19:25 +0100 Subject: [PATCH 400/497] bugfix: correct units of subtracted chlorine and methanol in build_industry_sector_ratios.py. In the config the units are Mt/a, they are multiplied by MWh/t, but what is desired is GWh/a. --- scripts/build_industry_sector_ratios.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/build_industry_sector_ratios.py b/scripts/build_industry_sector_ratios.py index 45705002..805cf3e7 100644 --- a/scripts/build_industry_sector_ratios.py +++ b/scripts/build_industry_sector_ratios.py @@ -408,15 +408,15 @@ def chemicals_industry(): df.loc["methane", sector] -= ammonia_total * params["MWh_CH4_per_tNH3_SMR"] df.loc["elec", sector] -= ammonia_total * params["MWh_elec_per_tNH3_SMR"] - # subtract chlorine demand + # subtract chlorine demand (in MtCl/a) chlorine_total = params["chlorine_production_today"] - df.loc["hydrogen", sector] -= chlorine_total * params["MWh_H2_per_tCl"] - df.loc["elec", sector] -= chlorine_total * params["MWh_elec_per_tCl"] + df.loc["hydrogen", sector] -= chlorine_total * params["MWh_H2_per_tCl"] * 1e3 + df.loc["elec", sector] -= chlorine_total * params["MWh_elec_per_tCl"] * 1e3 - # subtract methanol demand + # subtract methanol demand (in MtMeOH/a) methanol_total = params["methanol_production_today"] - df.loc["methane", sector] -= methanol_total * params["MWh_CH4_per_tMeOH"] - df.loc["elec", sector] -= methanol_total * params["MWh_elec_per_tMeOH"] + df.loc["methane", sector] -= methanol_total * params["MWh_CH4_per_tMeOH"] * 1e3 + df.loc["elec", sector] -= methanol_total * params["MWh_elec_per_tMeOH"] * 1e3 # MWh/t material df.loc[sources, sector] = df.loc[sources, sector] / s_out From cbf7ed0d38d059c60b8e220040be5be2e7ffa9ce Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Wed, 14 Feb 2024 10:09:13 +0100 Subject: [PATCH 401/497] for today's industry energy demand, separate MeOH, Cl and HVC I.e. split basic chemicals (without ammonia) into MeOH, Cl and HVC. This now agrees with scheme for industrial sectors tomorrow. --- config/config.default.yaml | 1 + ...ustrial_energy_demand_per_country_today.py | 50 +++++++++---------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 1033d49d..40dfb330 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -636,6 +636,7 @@ industry: 2040: 0.12 2045: 0.16 2050: 0.20 + basic_chemicals_without_NH3_energy_demand_today: 1138. #TWh/a HVC_production_today: 52. MWh_elec_per_tHVC_mechanical_recycling: 0.547 MWh_elec_per_tHVC_chemical_recycling: 6.9 diff --git a/scripts/build_industrial_energy_demand_per_country_today.py b/scripts/build_industrial_energy_demand_per_country_today.py index d1c672f1..696921de 100644 --- a/scripts/build_industrial_energy_demand_per_country_today.py +++ b/scripts/build_industrial_energy_demand_per_country_today.py @@ -73,7 +73,7 @@ def industrial_energy_demand_per_country(country, year, jrc_dir): def get_subsector_data(sheet): df = df_dict[sheet][year].groupby(fuels).sum() - df["ammonia"] = 0.0 + df["hydrogen"] = 0.0 df["other"] = df["all"] - df.loc[df.index != "all"].sum() @@ -94,36 +94,41 @@ def industrial_energy_demand_per_country(country, year, jrc_dir): return df -def add_ammonia_energy_demand(demand): +def separate_basic_chemicals(demand): # MtNH3/a fn = snakemake.input.ammonia_production ammonia = pd.read_csv(fn, index_col=0)[str(year)] / 1e3 - def get_ammonia_by_fuel(x): - fuels = { - "gas": params["MWh_CH4_per_tNH3_SMR"], - "electricity": params["MWh_elec_per_tNH3_SMR"], - } - - return pd.Series({k: x * v for k, v in fuels.items()}) - - ammonia_by_fuel = ammonia.apply(get_ammonia_by_fuel).T - ammonia_by_fuel = ammonia_by_fuel.unstack().reindex( - index=demand.index, fill_value=0.0 - ) - - ammonia = pd.DataFrame({"ammonia": ammonia * params["MWh_NH3_per_tNH3"]}).T + ammonia = pd.DataFrame({"gas": ammonia * params["MWh_CH4_per_tNH3_SMR"], + "electricity" : ammonia * params["MWh_elec_per_tNH3_SMR"]}).T demand["Ammonia"] = ammonia.unstack().reindex(index=demand.index, fill_value=0.0) demand["Basic chemicals (without ammonia)"] = ( - demand["Basic chemicals"] - ammonia_by_fuel + demand["Basic chemicals"] - demand["Ammonia"] ) - demand["Basic chemicals (without ammonia)"].clip(lower=0, inplace=True) - demand.drop(columns="Basic chemicals", inplace=True) + distribution = demand["Basic chemicals (without ammonia)"].groupby(level=0).sum()/params["basic_chemicals_without_NH3_energy_demand_today"] + + chlorine = pd.DataFrame({"hydrogen": distribution * params["chlorine_production_today"] * params["MWh_H2_per_tCl"], + "electricity" : distribution * params["chlorine_production_today"] * params["MWh_elec_per_tCl"]}).T + + methanol = pd.DataFrame({"gas": distribution * params["methanol_production_today"] * params["MWh_CH4_per_tMeOH"], + "electricity" : distribution * params["methanol_production_today"] * params["MWh_elec_per_tMeOH"]}).T + + demand["Chlorine"] = chlorine.unstack().reindex(index=demand.index, fill_value=0.0) + demand["Methanol"] = methanol.unstack().reindex(index=demand.index, fill_value=0.0) + + demand["HVC"] = ( + demand["Basic chemicals (without ammonia)"] -demand["Methanol"] - demand["Chlorine"] + ) + + demand.drop(columns="Basic chemicals (without ammonia)", inplace=True) + + demand["HVC"].clip(lower=0, inplace=True) + return demand @@ -135,11 +140,6 @@ def add_non_eu28_industrial_energy_demand(countries, demand): fn = snakemake.input.industrial_production_per_country production = pd.read_csv(fn, index_col=0) / 1e3 - # recombine HVC, Chlorine and Methanol to Basic chemicals (without ammonia) - chemicals = ["HVC", "Chlorine", "Methanol"] - production["Basic chemicals (without ammonia)"] = production[chemicals].sum(axis=1) - production.drop(columns=chemicals, inplace=True) - eu28_production = production.loc[countries.intersection(eu28)].sum() eu28_energy = demand.groupby(level=1).sum() eu28_averages = eu28_energy / eu28_production @@ -182,7 +182,7 @@ if __name__ == "__main__": demand = industrial_energy_demand(countries.intersection(eu28), year) - demand = add_ammonia_energy_demand(demand) + demand = separate_basic_chemicals(demand) demand = add_non_eu28_industrial_energy_demand(countries, demand) From cc57952402a80a785d16c4c1887d16d7c5aaed2b Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Wed, 14 Feb 2024 10:33:50 +0100 Subject: [PATCH 402/497] industrial prod: use EU28 total for denominator for distribution key This makes sure the distribution key is correct when only subsets of countries are used. This is then consistent with the HVC, MeOH and Cl totals being EU28 totals. Without this change, industry production is overestimated when using subsets of countries. Or the user has to adjust the totals for industrial production themselves. --- config/config.default.yaml | 1 + scripts/build_industrial_production_per_country.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 40dfb330..4245d926 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -637,6 +637,7 @@ industry: 2045: 0.16 2050: 0.20 basic_chemicals_without_NH3_energy_demand_today: 1138. #TWh/a + basic_chemicals_without_NH3_production_today: 69. #Mt/a HVC_production_today: 52. MWh_elec_per_tHVC_mechanical_recycling: 0.547 MWh_elec_per_tHVC_chemical_recycling: 6.9 diff --git a/scripts/build_industrial_production_per_country.py b/scripts/build_industrial_production_per_country.py index 0aea4f15..afbe4de7 100644 --- a/scripts/build_industrial_production_per_country.py +++ b/scripts/build_industrial_production_per_country.py @@ -261,7 +261,7 @@ def separate_basic_chemicals(demand, year): demand["Basic chemicals"].clip(lower=0.0, inplace=True) # assume HVC, methanol, chlorine production proportional to non-ammonia basic chemicals - distribution_key = demand["Basic chemicals"] / demand["Basic chemicals"].sum() + distribution_key = demand["Basic chemicals"] / params["basic_chemicals_without_NH3_production_today"] / 1e3 demand["HVC"] = params["HVC_production_today"] * 1e3 * distribution_key demand["Chlorine"] = params["chlorine_production_today"] * 1e3 * distribution_key demand["Methanol"] = params["methanol_production_today"] * 1e3 * distribution_key From 7f3ad792a9a7e36f09ce85c819834d29b247b558 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Wed, 14 Feb 2024 12:24:58 +0100 Subject: [PATCH 403/497] use production to determine today's energy demand for basic chemicals This uniformises how demand for basic chemicals is calculated. We also avoid unnecessary use of ammonia production separately. --- config/config.default.yaml | 3 +- rules/build_sector.smk | 1 - ...ustrial_energy_demand_per_country_today.py | 45 +++++++------------ 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 4245d926..79ca890d 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -636,8 +636,7 @@ industry: 2040: 0.12 2045: 0.16 2050: 0.20 - basic_chemicals_without_NH3_energy_demand_today: 1138. #TWh/a - basic_chemicals_without_NH3_production_today: 69. #Mt/a + basic_chemicals_without_NH3_production_today: 69. #Mt/a, = 86 Mtethylene-equiv - 17 MtNH3 HVC_production_today: 52. MWh_elec_per_tHVC_mechanical_recycling: 0.547 MWh_elec_per_tHVC_chemical_recycling: 6.9 diff --git a/rules/build_sector.smk b/rules/build_sector.smk index c25c8673..f50432d6 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -566,7 +566,6 @@ rule build_industrial_energy_demand_per_country_today: industry=config["industry"], input: jrc="data/bundle-sector/jrc-idees-2015", - ammonia_production=RESOURCES + "ammonia_production.csv", industrial_production_per_country=RESOURCES + "industrial_production_per_country.csv", output: diff --git a/scripts/build_industrial_energy_demand_per_country_today.py b/scripts/build_industrial_energy_demand_per_country_today.py index 696921de..65569b55 100644 --- a/scripts/build_industrial_energy_demand_per_country_today.py +++ b/scripts/build_industrial_energy_demand_per_country_today.py @@ -94,51 +94,34 @@ def industrial_energy_demand_per_country(country, year, jrc_dir): return df -def separate_basic_chemicals(demand): - # MtNH3/a - fn = snakemake.input.ammonia_production - ammonia = pd.read_csv(fn, index_col=0)[str(year)] / 1e3 +def separate_basic_chemicals(demand, production): - ammonia = pd.DataFrame({"gas": ammonia * params["MWh_CH4_per_tNH3_SMR"], - "electricity" : ammonia * params["MWh_elec_per_tNH3_SMR"]}).T + ammonia = pd.DataFrame({"hydrogen": production["Ammonia"] * params["MWh_H2_per_tNH3_electrolysis"], + "electricity" : production["Ammonia"] * params["MWh_elec_per_tNH3_electrolysis"]}).T + chlorine = pd.DataFrame({"hydrogen": production["Chlorine"] * params["MWh_H2_per_tCl"], + "electricity" : production["Chlorine"] * params["MWh_elec_per_tCl"]}).T + methanol = pd.DataFrame({"gas": production["Methanol"] * params["MWh_CH4_per_tMeOH"], + "electricity" : production["Methanol"] * params["MWh_elec_per_tMeOH"]}).T demand["Ammonia"] = ammonia.unstack().reindex(index=demand.index, fill_value=0.0) - - demand["Basic chemicals (without ammonia)"] = ( - demand["Basic chemicals"] - demand["Ammonia"] - ) - - demand.drop(columns="Basic chemicals", inplace=True) - - distribution = demand["Basic chemicals (without ammonia)"].groupby(level=0).sum()/params["basic_chemicals_without_NH3_energy_demand_today"] - - chlorine = pd.DataFrame({"hydrogen": distribution * params["chlorine_production_today"] * params["MWh_H2_per_tCl"], - "electricity" : distribution * params["chlorine_production_today"] * params["MWh_elec_per_tCl"]}).T - - methanol = pd.DataFrame({"gas": distribution * params["methanol_production_today"] * params["MWh_CH4_per_tMeOH"], - "electricity" : distribution * params["methanol_production_today"] * params["MWh_elec_per_tMeOH"]}).T - demand["Chlorine"] = chlorine.unstack().reindex(index=demand.index, fill_value=0.0) demand["Methanol"] = methanol.unstack().reindex(index=demand.index, fill_value=0.0) demand["HVC"] = ( - demand["Basic chemicals (without ammonia)"] -demand["Methanol"] - demand["Chlorine"] + demand["Basic chemicals"] - demand["Ammonia"] - demand["Methanol"] - demand["Chlorine"] ) - demand.drop(columns="Basic chemicals (without ammonia)", inplace=True) + demand.drop(columns="Basic chemicals", inplace=True) demand["HVC"].clip(lower=0, inplace=True) return demand -def add_non_eu28_industrial_energy_demand(countries, demand): +def add_non_eu28_industrial_energy_demand(countries, demand, production): non_eu28 = countries.difference(eu28) if non_eu28.empty: return demand - # output in MtMaterial/a - fn = snakemake.input.industrial_production_per_country - production = pd.read_csv(fn, index_col=0) / 1e3 eu28_production = production.loc[countries.intersection(eu28)].sum() eu28_energy = demand.groupby(level=1).sum() @@ -182,9 +165,13 @@ if __name__ == "__main__": demand = industrial_energy_demand(countries.intersection(eu28), year) - demand = separate_basic_chemicals(demand) + # output in MtMaterial/a + production = pd.read_csv(snakemake.input.industrial_production_per_country, + index_col=0) / 1e3 - demand = add_non_eu28_industrial_energy_demand(countries, demand) + demand = separate_basic_chemicals(demand, production) + + demand = add_non_eu28_industrial_energy_demand(countries, demand, production) # for format compatibility demand = demand.stack(dropna=False).unstack(level=[0, 2]) From e14bae345b5009cf65c49d573517176bda7d69f4 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Wed, 14 Feb 2024 18:15:18 +0100 Subject: [PATCH 404/497] new script to interpolate industry sector ratios today to tomorrow For each country we gradually switch industry processes from today's specific energy carrier usage per ton material output to the best-in-class energy consumption of tomorrow in the industry_sector_ratios.csv. This is done on a per-country basis. The ratio of today to tomorrow's energy consumption is set with the config["industry"]["sector_ratios_fraction_future"] parameter. --- config/config.default.yaml | 8 ++ rules/build_sector.smk | 26 ++++++- ...build_industrial_energy_demand_per_node.py | 21 +++-- ...ild_industry_sector_ratios_intermediate.py | 77 +++++++++++++++++++ 4 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 scripts/build_industry_sector_ratios_intermediate.py diff --git a/config/config.default.yaml b/config/config.default.yaml index 79ca890d..0f28ee93 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -636,6 +636,14 @@ industry: 2040: 0.12 2045: 0.16 2050: 0.20 + sector_ratios_fraction_future: + 2020: 0.0 + 2025: 0.1 + 2030: 0.3 + 2035: 0.5 + 2040: 0.7 + 2045: 0.9 + 2050: 1.0 basic_chemicals_without_NH3_production_today: 69. #Mt/a, = 86 Mtethylene-equiv - 17 MtNH3 HVC_production_today: 52. MWh_elec_per_tHVC_mechanical_recycling: 0.547 diff --git a/rules/build_sector.smk b/rules/build_sector.smk index f50432d6..bec9aa7a 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -433,6 +433,30 @@ rule build_industry_sector_ratios: "../scripts/build_industry_sector_ratios.py" +rule build_industry_sector_ratios_intermediate: + params: + industry=config["industry"], + input: + industry_sector_ratios=RESOURCES + "industry_sector_ratios.csv", + industrial_energy_demand_per_country_today=RESOURCES + + "industrial_energy_demand_per_country_today.csv", + industrial_production_per_country=RESOURCES + + "industrial_production_per_country.csv", + output: + industry_sector_ratios=RESOURCES + "industry_sector_ratios_{planning_horizons}.csv", + threads: 1 + resources: + mem_mb=1000, + log: + LOGS + "build_industry_sector_ratios_{planning_horizons}.log", + benchmark: + BENCHMARKS + "build_industry_sector_ratios_{planning_horizons}" + conda: + "../envs/environment.yaml" + script: + "../scripts/build_industry_sector_ratios_intermediate.py" + + rule build_industrial_production_per_country: params: industry=config["industry"], @@ -535,7 +559,7 @@ rule build_industrial_production_per_node: rule build_industrial_energy_demand_per_node: input: - industry_sector_ratios=RESOURCES + "industry_sector_ratios.csv", + industry_sector_ratios=RESOURCES + "industry_sector_ratios_{planning_horizons}.csv", industrial_production_per_node=RESOURCES + "industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv", industrial_energy_demand_per_node_today=RESOURCES diff --git a/scripts/build_industrial_energy_demand_per_node.py b/scripts/build_industrial_energy_demand_per_node.py index 55c10c5d..84f8679a 100644 --- a/scripts/build_industrial_energy_demand_per_node.py +++ b/scripts/build_industrial_energy_demand_per_node.py @@ -19,23 +19,28 @@ if __name__ == "__main__": planning_horizons=2030, ) - # import EU ratios df as csv + # import ratios fn = snakemake.input.industry_sector_ratios - industry_sector_ratios = pd.read_csv(fn, index_col=0) + sector_ratios = pd.read_csv(fn, + header=[0,1], + index_col=0) - # material demand per node and industry (kton/a) + # material demand per node and industry (Mton/a) fn = snakemake.input.industrial_production_per_node - nodal_production = pd.read_csv(fn, index_col=0) + nodal_production = pd.read_csv(fn, index_col=0) / 1e3 # energy demand today to get current electricity fn = snakemake.input.industrial_energy_demand_per_node_today nodal_today = pd.read_csv(fn, index_col=0) - # final energy consumption per node and industry (TWh/a) - nodal_df = nodal_production.dot(industry_sector_ratios.T) + nodal_sector_ratios = pd.concat({node: sector_ratios[node[:2]] for node in nodal_production.index}, + axis=1) - # convert GWh to TWh and ktCO2 to MtCO2 - nodal_df *= 0.001 + nodal_production_stacked = nodal_production.stack() + nodal_production_stacked.index.names = [None,None] + + # final energy consumption per node and industry (TWh/a) + nodal_df = (nodal_sector_ratios.multiply(nodal_production_stacked)).T.groupby(level=0).sum() rename_sectors = { "elec": "electricity", diff --git a/scripts/build_industry_sector_ratios_intermediate.py b/scripts/build_industry_sector_ratios_intermediate.py new file mode 100644 index 00000000..86f88218 --- /dev/null +++ b/scripts/build_industry_sector_ratios_intermediate.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Build specific energy consumption by carrier and industries and by country, +that interpolates between the current average energy consumption (from 2015-2020) +and the ideal future best-in-class consumption. +""" + +import pandas as pd + +from prepare_sector_network import get + +def build_industry_sector_ratios_intermediate(): + + # in TWh/a + demand = pd.read_csv(snakemake.input.industrial_energy_demand_per_country_today, + header=[0,1], + index_col=0) + + # in Mt/a + production = pd.read_csv(snakemake.input.industrial_production_per_country, + index_col=0) / 1e3 + production = production.unstack().swaplevel() + + # in MWh/t + future_sector_ratios = pd.read_csv(snakemake.input.industry_sector_ratios, + index_col=0) + + production.index.names = [None,None] + + today_sector_ratios = demand.div(production, axis=1) + + today_sector_ratios.drop(columns=today_sector_ratios.columns[today_sector_ratios.isna().all()], + inplace=True) + + rename = pd.Series(today_sector_ratios.index, + today_sector_ratios.index) + rename["waste"] = "biomass" + rename["electricity"] = "elec" + rename["solid"] = "coke" + rename["gas"] = "methane" + rename["other"] = "biomass" + rename["liquid"] = "naphtha" + + today_sector_ratios.rename(rename, + inplace=True) + + + fraction_future = get(params["sector_ratios_fraction_future"], year) + + intermediate_sector_ratios = {} + + for ct in today_sector_ratios.columns.unique(level=0): + + intermediate_sector_ratio = future_sector_ratios.copy() + + intermediate_sector_ratio.loc[today_sector_ratios[ct].index,today_sector_ratios[ct].columns] = (fraction_future*intermediate_sector_ratio.loc[today_sector_ratios[ct].index,today_sector_ratios[ct].columns] + + (1 - fraction_future)*today_sector_ratios[ct]) + intermediate_sector_ratios[ct] = intermediate_sector_ratio + + intermediate_sector_ratios = pd.concat(intermediate_sector_ratios, axis=1) + + intermediate_sector_ratios.to_csv(snakemake.output.industry_sector_ratios) + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("build_industry_sector_ratios_intermediate") + + year = int(snakemake.wildcards.planning_horizons[-4:]) + + params = snakemake.params.industry + + build_industry_sector_ratios_intermediate() From b45df1724bda1611c5792f0775b6496e36d88638 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 17:31:48 +0000 Subject: [PATCH 405/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_sector.smk | 6 ++- ...ustrial_energy_demand_per_country_today.py | 36 +++++++++---- ...build_industrial_energy_demand_per_node.py | 17 +++--- ...build_industrial_production_per_country.py | 6 ++- ...ild_industry_sector_ratios_intermediate.py | 52 ++++++++++++------- 5 files changed, 78 insertions(+), 39 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index bec9aa7a..0c53fdd1 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -443,7 +443,8 @@ rule build_industry_sector_ratios_intermediate: industrial_production_per_country=RESOURCES + "industrial_production_per_country.csv", output: - industry_sector_ratios=RESOURCES + "industry_sector_ratios_{planning_horizons}.csv", + industry_sector_ratios=RESOURCES + + "industry_sector_ratios_{planning_horizons}.csv", threads: 1 resources: mem_mb=1000, @@ -559,7 +560,8 @@ rule build_industrial_production_per_node: rule build_industrial_energy_demand_per_node: input: - industry_sector_ratios=RESOURCES + "industry_sector_ratios_{planning_horizons}.csv", + industry_sector_ratios=RESOURCES + + "industry_sector_ratios_{planning_horizons}.csv", industrial_production_per_node=RESOURCES + "industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv", industrial_energy_demand_per_node_today=RESOURCES diff --git a/scripts/build_industrial_energy_demand_per_country_today.py b/scripts/build_industrial_energy_demand_per_country_today.py index 65569b55..9105a790 100644 --- a/scripts/build_industrial_energy_demand_per_country_today.py +++ b/scripts/build_industrial_energy_demand_per_country_today.py @@ -96,19 +96,35 @@ def industrial_energy_demand_per_country(country, year, jrc_dir): def separate_basic_chemicals(demand, production): - ammonia = pd.DataFrame({"hydrogen": production["Ammonia"] * params["MWh_H2_per_tNH3_electrolysis"], - "electricity" : production["Ammonia"] * params["MWh_elec_per_tNH3_electrolysis"]}).T - chlorine = pd.DataFrame({"hydrogen": production["Chlorine"] * params["MWh_H2_per_tCl"], - "electricity" : production["Chlorine"] * params["MWh_elec_per_tCl"]}).T - methanol = pd.DataFrame({"gas": production["Methanol"] * params["MWh_CH4_per_tMeOH"], - "electricity" : production["Methanol"] * params["MWh_elec_per_tMeOH"]}).T + ammonia = pd.DataFrame( + { + "hydrogen": production["Ammonia"] * params["MWh_H2_per_tNH3_electrolysis"], + "electricity": production["Ammonia"] + * params["MWh_elec_per_tNH3_electrolysis"], + } + ).T + chlorine = pd.DataFrame( + { + "hydrogen": production["Chlorine"] * params["MWh_H2_per_tCl"], + "electricity": production["Chlorine"] * params["MWh_elec_per_tCl"], + } + ).T + methanol = pd.DataFrame( + { + "gas": production["Methanol"] * params["MWh_CH4_per_tMeOH"], + "electricity": production["Methanol"] * params["MWh_elec_per_tMeOH"], + } + ).T demand["Ammonia"] = ammonia.unstack().reindex(index=demand.index, fill_value=0.0) demand["Chlorine"] = chlorine.unstack().reindex(index=demand.index, fill_value=0.0) demand["Methanol"] = methanol.unstack().reindex(index=demand.index, fill_value=0.0) demand["HVC"] = ( - demand["Basic chemicals"] - demand["Ammonia"] - demand["Methanol"] - demand["Chlorine"] + demand["Basic chemicals"] + - demand["Ammonia"] + - demand["Methanol"] + - demand["Chlorine"] ) demand.drop(columns="Basic chemicals", inplace=True) @@ -166,8 +182,10 @@ if __name__ == "__main__": demand = industrial_energy_demand(countries.intersection(eu28), year) # output in MtMaterial/a - production = pd.read_csv(snakemake.input.industrial_production_per_country, - index_col=0) / 1e3 + production = ( + pd.read_csv(snakemake.input.industrial_production_per_country, index_col=0) + / 1e3 + ) demand = separate_basic_chemicals(demand, production) diff --git a/scripts/build_industrial_energy_demand_per_node.py b/scripts/build_industrial_energy_demand_per_node.py index 84f8679a..ec571c71 100644 --- a/scripts/build_industrial_energy_demand_per_node.py +++ b/scripts/build_industrial_energy_demand_per_node.py @@ -21,9 +21,7 @@ if __name__ == "__main__": # import ratios fn = snakemake.input.industry_sector_ratios - sector_ratios = pd.read_csv(fn, - header=[0,1], - index_col=0) + sector_ratios = pd.read_csv(fn, header=[0, 1], index_col=0) # material demand per node and industry (Mton/a) fn = snakemake.input.industrial_production_per_node @@ -33,14 +31,19 @@ if __name__ == "__main__": fn = snakemake.input.industrial_energy_demand_per_node_today nodal_today = pd.read_csv(fn, index_col=0) - nodal_sector_ratios = pd.concat({node: sector_ratios[node[:2]] for node in nodal_production.index}, - axis=1) + nodal_sector_ratios = pd.concat( + {node: sector_ratios[node[:2]] for node in nodal_production.index}, axis=1 + ) nodal_production_stacked = nodal_production.stack() - nodal_production_stacked.index.names = [None,None] + nodal_production_stacked.index.names = [None, None] # final energy consumption per node and industry (TWh/a) - nodal_df = (nodal_sector_ratios.multiply(nodal_production_stacked)).T.groupby(level=0).sum() + nodal_df = ( + (nodal_sector_ratios.multiply(nodal_production_stacked)) + .T.groupby(level=0) + .sum() + ) rename_sectors = { "elec": "electricity", diff --git a/scripts/build_industrial_production_per_country.py b/scripts/build_industrial_production_per_country.py index afbe4de7..afab1403 100644 --- a/scripts/build_industrial_production_per_country.py +++ b/scripts/build_industrial_production_per_country.py @@ -261,7 +261,11 @@ def separate_basic_chemicals(demand, year): demand["Basic chemicals"].clip(lower=0.0, inplace=True) # assume HVC, methanol, chlorine production proportional to non-ammonia basic chemicals - distribution_key = demand["Basic chemicals"] / params["basic_chemicals_without_NH3_production_today"] / 1e3 + distribution_key = ( + demand["Basic chemicals"] + / params["basic_chemicals_without_NH3_production_today"] + / 1e3 + ) demand["HVC"] = params["HVC_production_today"] * 1e3 * distribution_key demand["Chlorine"] = params["chlorine_production_today"] * 1e3 * distribution_key demand["Methanol"] = params["methanol_production_today"] * 1e3 * distribution_key diff --git a/scripts/build_industry_sector_ratios_intermediate.py b/scripts/build_industry_sector_ratios_intermediate.py index 86f88218..0cbdfa06 100644 --- a/scripts/build_industry_sector_ratios_intermediate.py +++ b/scripts/build_industry_sector_ratios_intermediate.py @@ -4,39 +4,45 @@ # SPDX-License-Identifier: MIT """ Build specific energy consumption by carrier and industries and by country, -that interpolates between the current average energy consumption (from 2015-2020) -and the ideal future best-in-class consumption. +that interpolates between the current average energy consumption (from +2015-2020) and the ideal future best-in-class consumption. """ import pandas as pd - from prepare_sector_network import get + def build_industry_sector_ratios_intermediate(): # in TWh/a - demand = pd.read_csv(snakemake.input.industrial_energy_demand_per_country_today, - header=[0,1], - index_col=0) + demand = pd.read_csv( + snakemake.input.industrial_energy_demand_per_country_today, + header=[0, 1], + index_col=0, + ) # in Mt/a - production = pd.read_csv(snakemake.input.industrial_production_per_country, - index_col=0) / 1e3 + production = ( + pd.read_csv(snakemake.input.industrial_production_per_country, index_col=0) + / 1e3 + ) production = production.unstack().swaplevel() # in MWh/t - future_sector_ratios = pd.read_csv(snakemake.input.industry_sector_ratios, - index_col=0) + future_sector_ratios = pd.read_csv( + snakemake.input.industry_sector_ratios, index_col=0 + ) - production.index.names = [None,None] + production.index.names = [None, None] today_sector_ratios = demand.div(production, axis=1) - today_sector_ratios.drop(columns=today_sector_ratios.columns[today_sector_ratios.isna().all()], - inplace=True) + today_sector_ratios.drop( + columns=today_sector_ratios.columns[today_sector_ratios.isna().all()], + inplace=True, + ) - rename = pd.Series(today_sector_ratios.index, - today_sector_ratios.index) + rename = pd.Series(today_sector_ratios.index, today_sector_ratios.index) rename["waste"] = "biomass" rename["electricity"] = "elec" rename["solid"] = "coke" @@ -44,9 +50,7 @@ def build_industry_sector_ratios_intermediate(): rename["other"] = "biomass" rename["liquid"] = "naphtha" - today_sector_ratios.rename(rename, - inplace=True) - + today_sector_ratios.rename(rename, inplace=True) fraction_future = get(params["sector_ratios_fraction_future"], year) @@ -56,14 +60,22 @@ def build_industry_sector_ratios_intermediate(): intermediate_sector_ratio = future_sector_ratios.copy() - intermediate_sector_ratio.loc[today_sector_ratios[ct].index,today_sector_ratios[ct].columns] = (fraction_future*intermediate_sector_ratio.loc[today_sector_ratios[ct].index,today_sector_ratios[ct].columns] - + (1 - fraction_future)*today_sector_ratios[ct]) + intermediate_sector_ratio.loc[ + today_sector_ratios[ct].index, today_sector_ratios[ct].columns + ] = ( + fraction_future + * intermediate_sector_ratio.loc[ + today_sector_ratios[ct].index, today_sector_ratios[ct].columns + ] + + (1 - fraction_future) * today_sector_ratios[ct] + ) intermediate_sector_ratios[ct] = intermediate_sector_ratio intermediate_sector_ratios = pd.concat(intermediate_sector_ratios, axis=1) intermediate_sector_ratios.to_csv(snakemake.output.industry_sector_ratios) + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake From 4fa504b0dbd60aa0b410d2bffba4c68e525159ff Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 17:32:20 +0000 Subject: [PATCH 406/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/build_ammonia_production.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/build_ammonia_production.py b/scripts/build_ammonia_production.py index bfcfaf02..77b33075 100644 --- a/scripts/build_ammonia_production.py +++ b/scripts/build_ammonia_production.py @@ -7,8 +7,8 @@ Build historical annual ammonia production per country in ktonNH3/a. """ import country_converter as coco -import pandas as pd import numpy as np +import pandas as pd cc = coco.CountryConverter() @@ -33,9 +33,7 @@ if __name__ == "__main__": years = [str(i) for i in range(2013, 2018)] ammonia = ammonia[years] - ammonia.replace("--", - np.nan, - inplace=True) + ammonia.replace("--", np.nan, inplace=True) ammonia = ammonia.astype(float) # convert from ktonN to ktonNH3 From 87ab0a55759507aa5eb4115a9b7fb98634fd40ea Mon Sep 17 00:00:00 2001 From: lisazeyen <35347358+lisazeyen@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:58:53 +0100 Subject: [PATCH 407/497] update h2 pipe losses --- config/config.default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 1033d49d..cfda5224 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -538,8 +538,8 @@ sector: efficiency_static: 0.98 efficiency_per_1000km: 0.977 H2 pipeline: - efficiency_per_1000km: 1 # 0.979 - compression_per_1000km: 0.019 + efficiency_per_1000km: 0.996 + compression_per_1000km: 0.018 gas pipeline: efficiency_per_1000km: 1 #0.977 compression_per_1000km: 0.01 From 8464415b356171c633e53fb0268660f9b9ee994d Mon Sep 17 00:00:00 2001 From: lisazeyen <35347358+lisazeyen@users.noreply.github.com> Date: Thu, 15 Feb 2024 15:14:32 +0100 Subject: [PATCH 408/497] update for 70 bars instead of 140 --- config/config.default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index cfda5224..97b0edb3 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -538,8 +538,8 @@ sector: efficiency_static: 0.98 efficiency_per_1000km: 0.977 H2 pipeline: - efficiency_per_1000km: 0.996 - compression_per_1000km: 0.018 + efficiency_per_1000km: 0.9905 + compression_per_1000km: 0.008 gas pipeline: efficiency_per_1000km: 1 #0.977 compression_per_1000km: 0.01 From 16955d24abec236e757c5f19cf0af003939defbb Mon Sep 17 00:00:00 2001 From: martacki Date: Thu, 15 Feb 2024 16:27:44 +0100 Subject: [PATCH 409/497] data: upload swiss energy totals data for all years --- data/switzerland-new_format-all_years.csv | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 data/switzerland-new_format-all_years.csv diff --git a/data/switzerland-new_format-all_years.csv b/data/switzerland-new_format-all_years.csv new file mode 100644 index 00000000..93123009 --- /dev/null +++ b/data/switzerland-new_format-all_years.csv @@ -0,0 +1,25 @@ +country,item,2010,2011,2012,2013,2014,2015 +CH,total residential,268.2,223.4,243.4,261.3,214.2,229.1 +CH,total residential space,192.2,149.0,168.1,185.5,139.7,154.4 +CH,total residential water,32.2,31.6,31.9,32.2,31.7,31.9 +CH,total residential cooking,9.3,9.3,9.3,9.4,9.5,9.6 +CH,electricity residential,67.9,63.7,65.7,67.6,63.0,64.4 +CH,electricity residential space,15.9,12.8,14.3,15.8,12.3,13.5 +CH,electricity residential water,8.8,8.5,8.5,8.6,8.5,8.6 +CH,electricity residential cooking,4.9,4.9,4.9,4.9,5.0,5.0 +CH,total services,145.9,127.4,136.7,144.0,124.5,132.5 +CH,total services space,80.0,62.2,70.8,77.4,58.3,64.3 +CH,total services water,10.1,10.0,10.1,10.1,10.0,10.0 +CH,total services cooking,2.5,2.4,2.3,2.3,2.4,2.3 +CH,electricity services,60.5,59.2,60.3,61.4,60.3,62.6 +CH,electricity services space,4.0,3.2,3.8,4.2,3.3,3.6 +CH,electricity services water,0.7,0.7,0.7,0.7,0.7,0.7 +CH,electricity services cooking,2.5,2.4,2.3,2.3,2.4,2.3 +CH,total rail,11.5,11.1,11.2,11.4,11.1,11.4 +CH,total road,199.4,200.4,200.4,201.2,202.0,203.1 +CH,electricity road,0.,0.,0.,0.,0.,0. +CH,electricity rail,11.5,11.1,11.2,11.4,11.1,11.4 +CH,total domestic aviation,3.3,3.2,3.4,3.4,3.5,3.5 +CH,total international aviation,58.0,62.0,63.5,64.2,64.5,66.8 +CH,total domestic navigation,1.6,1.6,1.6,1.6,1.6,1.6 +CH,total international navigation,0.,0.,0.,0.,0.,0. From a22b19dcc49639ce927d72ac1bb640c29059fcdf Mon Sep 17 00:00:00 2001 From: martacki Date: Thu, 15 Feb 2024 16:28:24 +0100 Subject: [PATCH 410/497] use new swiss data for building energy totals --- rules/build_sector.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index c25c8673..d99c39ae 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -248,7 +248,7 @@ rule build_energy_totals: input: nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", co2="data/bundle-sector/eea/UNFCCC_v23.csv", - swiss="data/bundle-sector/switzerland-sfoe/switzerland-new_format.csv", + swiss="data/switzerland-new_format-all_years.csv", idees="data/bundle-sector/jrc-idees-2015", district_heat_share="data/district_heat_share.csv", eurostat=input_eurostat, From 6196fd689283e25c0be0660bfc313a2fb4f07430 Mon Sep 17 00:00:00 2001 From: martacki Date: Thu, 15 Feb 2024 16:29:29 +0100 Subject: [PATCH 411/497] change default energy totals year to 2013 to comply with default weather year --- config/config.default.yaml | 2 +- doc/release_notes.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 1033d49d..ba99e3ba 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -314,7 +314,7 @@ pypsa_eur: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#energy energy: - energy_totals_year: 2011 + energy_totals_year: 2013 base_emissions_year: 1990 eurostat_report_year: 2016 emissions: CO2 diff --git a/doc/release_notes.rst b/doc/release_notes.rst index cab8229a..fde06f97 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -113,6 +113,8 @@ Upcoming Release workflows with foresight "myopic" and still needs to be added foresight option "perfect". +* Swiched the energy totals year from 2011 to 2013 to comply with the assumed default weather year. + PyPSA-Eur 0.9.0 (5th January 2024) ================================== From ccbf835976e2cf776f421a5f868158dbe9d42848 Mon Sep 17 00:00:00 2001 From: martacki Date: Fri, 16 Feb 2024 09:49:00 +0100 Subject: [PATCH 412/497] fix typo to make pre-commit.ci happy --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index fde06f97..e017b07d 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -113,7 +113,7 @@ Upcoming Release workflows with foresight "myopic" and still needs to be added foresight option "perfect". -* Swiched the energy totals year from 2011 to 2013 to comply with the assumed default weather year. +* Switched the energy totals year from 2011 to 2013 to comply with the assumed default weather year. PyPSA-Eur 0.9.0 (5th January 2024) From 16e42c8fe61fdb9441773dcaf35e82765a106d31 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 11:17:00 +0100 Subject: [PATCH 413/497] further progress and bugfixes --- .gitignore | 2 +- Snakefile | 20 +++++++++----------- config/config.default.yaml | 2 +- rules/build_electricity.smk | 34 +++++++++++++++++----------------- rules/build_sector.smk | 6 +++--- rules/postprocess.smk | 25 ++++++++----------------- rules/retrieve.smk | 6 +++++- rules/solve_electricity.smk | 1 - rules/solve_myopic.smk | 8 ++++---- rules/solve_perfect.smk | 8 ++++---- scripts/_helpers.py | 11 ++++++----- 11 files changed, 58 insertions(+), 65 deletions(-) diff --git a/.gitignore b/.gitignore index f5f88861..5dafb3ce 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ doc/_build /scripts/create_scenarios.py /config/create_scenarios.py -config.yaml +config/config.yaml config/scenarios.yaml diff --git a/Snakefile b/Snakefile index 2b4fd64e..2c342efc 100644 --- a/Snakefile +++ b/Snakefile @@ -20,9 +20,6 @@ configfile: "config/config.default.yaml" configfile: "config/config.yaml" -COSTS = f"resources/costs_{config['costs']['year']}.csv" -ATLITE_NPROCESSES = config["atlite"].get("nprocesses", 4) - run = config["run"] scenarios = run.get("scenarios", {}) if run["name"]: @@ -39,16 +36,17 @@ benchmarks = path_provider("benchmarks/", RDIR, run["shared_resources"]) resources = path_provider("resources/", RDIR, run["shared_resources"]) CDIR = "" if run["shared_cutouts"] else RDIR -LOGS = "logs/" + RDIR -BENCHMARKS = "benchmarks/" + RDIR -if not (shared_resources := run.get("shared_resources")): - RESOURCES = "resources/" + RDIR -elif isinstance(shared_resources, str): - RESOURCES = "resources/" + shared_resources + "/" -else: - RESOURCES = "resources/" RESULTS = "results/" + RDIR +# TODO: this needs to be aligned with new scenario management +# if not (shared_resources := run.get("shared_resources")): +# RESOURCES = "resources/" + RDIR +# elif isinstance(shared_resources, str): +# RESOURCES = "resources/" + shared_resources + "/" +# else: +# RESOURCES = "resources/" + + localrules: purge, diff --git a/config/config.default.yaml b/config/config.default.yaml index ccd3baf8..9e169a5d 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -25,7 +25,7 @@ run: enable: false file: config/scenarios.yaml disable_progressbar: false - shared_resources: false + shared_resources: false # TODO: splitting resources by wildcard does not work well, neither does true, only base works well shared_cutouts: true # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#foresight diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 8876c68e..e18ae5dc 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -162,12 +162,12 @@ if config["enable"].get("build_cutout", False): output: protected("cutouts/" + CDIR + "{cutout}.nc"), log: - "logs/" + CDIR + "build_cutout/{cutout}.log", + logs(CDIR + "build_cutout/{cutout}.log"), benchmark: "benchmarks/" + CDIR + "build_cutout_{cutout}" - threads: ATLITE_NPROCESSES + threads: config["atlite"].get("nprocesses", 4) resources: - mem_mb=ATLITE_NPROCESSES * 1000, + mem_mb=config["atlite"].get("nprocesses", 4) * 1000, conda: "../envs/environment.yaml" script: @@ -249,9 +249,9 @@ rule determine_availability_matrix_MD_UA: availability_map=resources("availability_matrix_MD-UA_{technology}.png"), log: logs("determine_availability_matrix_MD_UA_{technology}.log"), - threads: ATLITE_NPROCESSES + threads: config["atlite"].get("nprocesses", 4) resources: - mem_mb=ATLITE_NPROCESSES * 5000, + mem_mb=config["atlite"].get("nprocesses", 4) * 5000, conda: "../envs/environment.yaml" script: @@ -319,9 +319,9 @@ rule build_renewable_profiles: logs("build_renewable_profile_{technology}.log"), benchmark: benchmarks("build_renewable_profiles_{technology}") - threads: ATLITE_NPROCESSES + threads: config["atlite"].get("nprocesses", 4) resources: - mem_mb=ATLITE_NPROCESSES * 5000, + mem_mb=config["atlite"].get("nprocesses", 4) * 5000, wildcard_constraints: technology="(?!hydro).*", # Any technology other than hydro conda: @@ -391,9 +391,9 @@ if config["lines"]["dynamic_line_rating"]["activate"]: logs("build_line_rating.log"), benchmark: benchmarks("build_line_rating") - threads: ATLITE_NPROCESSES + threads: config["atlite"].get("nprocesses", 4) resources: - mem_mb=ATLITE_NPROCESSES * 1000, + mem_mb=config["atlite"].get("nprocesses", 4) * 1000, conda: "../envs/environment.yaml" script: @@ -435,7 +435,7 @@ rule add_electricity: if config_provider("lines", "dynamic_line_rating", "activate")(w) else resources("networks/base.nc") ), - tech_costs=COSTS, + tech_costs=resources(f"costs_{config['costs']['year']}.csv"), regions=resources("regions_onshore.geojson"), powerplants=resources("powerplants.csv"), hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), @@ -478,7 +478,7 @@ rule simplify_network: costs=config_provider("costs"), input: network=resources("networks/elec.nc"), - tech_costs=COSTS, + tech_costs=resources(f"costs_{config['costs']['year']}.csv"), regions_onshore=resources("regions_onshore.geojson"), regions_offshore=resources("regions_offshore.geojson"), output: @@ -525,7 +525,7 @@ rule cluster_network: if config_provider("enable", "custom_busmap", default=False)(w) else [] ), - tech_costs=COSTS, + tech_costs=resources(f"costs_{config['costs']['year']}.csv"), output: network=resources("networks/elec_s{simpl}_{clusters}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -552,7 +552,7 @@ rule add_extra_components: costs=config_provider("costs"), input: network=resources("networks/elec_s{simpl}_{clusters}.nc"), - tech_costs=COSTS, + tech_costs=resources(f"costs_{config['costs']['year']}.csv"), output: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), log: @@ -570,11 +570,11 @@ rule add_extra_components: rule prepare_network: params: - snapshots={ - "resolution": config_provider("snapshots", "resolution", default=False), + snapshots=lambda w: { + "resolution": config_provider("snapshots", "resolution", default=False)(w), "segmentation": config_provider( "snapshots", "segmentation", default=False - ), + )(w), }, links=config_provider("links"), lines=config_provider("lines"), @@ -588,7 +588,7 @@ rule prepare_network: autarky=config_provider("electricity", "autarky", default={}), input: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), - tech_costs=COSTS, + tech_costs=resources(f"costs_{config['costs']['year']}.csv"), co2_price=lambda w: resources("co2_price.csv") if "Ept" in w.opts else [], output: resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), diff --git a/rules/build_sector.smk b/rules/build_sector.smk index cfd7191e..ba56564e 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -857,7 +857,7 @@ rule prepare_sector_network: biomass_potentials=lambda w: ( resources( "biomass_potentials_s{simpl}_{clusters}_" - + "{}.csv".format(config_provider("biomass", "year")) + + "{}.csv".format(config_provider("biomass", "year")(w)) ) if config_provider("foresight")(w) == "overnight" else resources( @@ -865,9 +865,9 @@ rule prepare_sector_network: ) ), costs=lambda w: ( - "resources/costs_{}.csv".format(config_provider("costs", "year")) + resources("costs_{}.csv".format(config_provider("costs", "year")(w))) if config_provider("foresight")(w) == "overnight" - else "resources/costs_{planning_horizons}.csv" + else resources("costs_{planning_horizons}.csv") ), profile_offwind_ac=resources("profile_offwind-ac.nc"), profile_offwind_dc=resources("profile_offwind-dc.nc"), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 79634bf6..6302bb46 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -18,7 +18,7 @@ if config["foresight"] != "perfect": "regions_onshore_elec_s{simpl}_{clusters}.geojson" ), output: - map=RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", + map=resources("maps/power-network-s{simpl}-{clusters}.pdf"), threads: 1 resources: mem_mb=4000, @@ -149,8 +149,6 @@ rule copy_config: threads: 1 resources: mem_mb=1000, - benchmark: - benchmarks("copy_config") conda: "../envs/environment.yaml" script: @@ -168,10 +166,6 @@ rule make_summary: scenario=config_provider("scenario"), RDIR=RDIR, input: - expand( - RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", - **config["scenario"], - ), networks=expand( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", @@ -179,15 +173,16 @@ rule make_summary: run=config["run"]["name"], ), costs=lambda w: ( - "resources/costs_{}.csv".format(config_provider("costs", "year")) + resources("costs_{}.csv".format(config_provider("costs", "year")(w))) if config_provider("foresight")(w) == "overnight" - else "resources/costs_{}.csv".format( + else resources("costs_{}.csv".format( config_provider("scenario", "planning_horizons", 0) - ) + )) ), ac_plot=expand( - RESULTS + "maps/power-network-s{simpl}-{clusters}.pdf", + resources("maps/power-network-s{simpl}-{clusters}.pdf"), **config["scenario"], + run=config["run"]["name"], ), costs_plot=expand( RESULTS @@ -235,9 +230,7 @@ rule make_summary: resources: mem_mb=10000, log: - logs("make_summary.log"), - benchmark: - benchmarks("make_summary") + RESULTS + "logs/make_summary.log", conda: "../envs/environment.yaml" script: @@ -267,9 +260,7 @@ rule plot_summary: resources: mem_mb=10000, log: - logs("plot_summary.log"), - benchmark: - benchmarks("plot_summary") + RESULTS + "logs/plot_summary.log", conda: "../envs/environment.yaml" script: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 1b2513fb..9e9ff1f0 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -88,10 +88,12 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_cost_data", T output: resources("costs_{year}.csv"), log: - "logs/retrieve_cost_data_{year}.log", + logs("retrieve_cost_data_{year}.log"), resources: mem_mb=1000, retries: 2 + conda: + "../envs/retrieve.yaml" script: "../scripts/retrieve_cost_data.py" @@ -191,6 +193,8 @@ if config["enable"]["retrieve"]: resources: mem_mb=5000, retries: 2 + conda: + "../envs/retrieve.yaml" script: "../scripts/retrieve_electricity_demand.py" diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index d3aa8d4c..b6a7902e 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT - rule solve_network: params: solving=config_provider("solving"), diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index a52f17c0..8caf5201 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -16,9 +16,9 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs=lambda w: "resources/costs_{}.csv".format( + costs=lambda w: resources("costs_{}.csv".format( config_provider("scenario", "planning_horizons", 0)(w) - ), + )), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), existing_heating_distribution=resources( @@ -76,7 +76,7 @@ rule add_brownfield: 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="resources/costs_{planning_horizons}.csv", + costs=resources("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: @@ -114,7 +114,7 @@ rule solve_sector_network_myopic: input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - costs="resources/costs_{planning_horizons}.csv", + costs=resources("costs_{planning_horizons}.csv"), config=RESULTS + "config.yaml", output: RESULTS diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 0d94ad9c..af5e884c 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -14,9 +14,9 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs="resources/costs_{}.csv".format( + costs=resources("costs_{}.csv".format( config_provider("scenario", "planning_horizons", 0) - ), + )), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), existing_heating_distribution=resources( @@ -98,7 +98,7 @@ rule solve_sector_network_perfect: input: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years.nc", - costs="resources/costs_2030.csv", + costs=resources("costs_2030.csv"), config=RESULTS + "config.yaml", output: RESULTS @@ -140,7 +140,7 @@ def input_networks_make_summary_perfect(w): rule make_summary_perfect: input: unpack(input_networks_make_summary_perfect), - costs="resources/costs_2020.csv", + costs=resources("costs_2020.csv"), output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", nodal_capacities=RESULTS + "csvs/nodal_capacities.csv", diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 1aa90168..c33d39f6 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -52,15 +52,16 @@ def get_run_path(fn, dir, rdir, shared_resources): Notes ----- - Special case for "base" allows no wildcards other than - "technology" and excludes filenames starting with "networks/elec" or + Special case for "base" allows no wildcards other than "technology", "year" + and "scope" and excludes filenames starting with "networks/elec" or "add_electricity". """ pattern = r"\{([^{}]+)\}" - existing_wildcards = list(re.findall(pattern, fn)) + existing_wildcards = set(re.findall(pattern, fn)) if shared_resources == "base": # special case for shared "base" resources - no_relevant_wildcards = not len(set(existing_wildcards) - {"technology"}) + irrelevant_wildcards = {"technology", "year", "scope"} + no_relevant_wildcards = not len(existing_wildcards - irrelevant_wildcards) no_elec_rule = not fn.startswith("networks/elec") and not fn.startswith( "add_electricity" ) @@ -68,7 +69,7 @@ def get_run_path(fn, dir, rdir, shared_resources): elif isinstance(shared_resources, (str, list)): if isinstance(shared_resources, str): shared_resources = [shared_resources] - is_shared = set(existing_wildcards).issubset(shared_resources) + is_shared = (existing_wildcards).issubset(shared_resources) else: is_shared = shared_resources From c22e47cd58e46b98fb591e5d951652518257e61a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 12:07:37 +0100 Subject: [PATCH 414/497] add release note --- doc/release_notes.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index cab8229a..08ec9dd5 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,11 @@ Release Notes Upcoming Release ================ +* Regions are assigned to all buses with unique coordinates in the network with + a preference given to substations. Previously, only substations had assigned + regions, but this could lead to issues when a high spatial resolution was + applied. + * The default configuration ``config/config.default.yaml`` is now automatically used as a base configuration file and no longer copied to ``config/config.yaml`` on first use. The file ``config/config.yaml`` should be From 67484f9cf0428bf8d8c8e463730db9c0001e064d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 12:13:35 +0100 Subject: [PATCH 415/497] remove numpy import, add release ntoe --- doc/release_notes.rst | 4 ++++ rules/build_sector.smk | 2 -- scripts/build_ammonia_production.py | 4 +--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index cab8229a..fc58c899 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,10 @@ Release Notes Upcoming Release ================ +* Include all countries in ammonia production resource. This is so that the full + EU28 ammonia demand can be correctly subtracted in the rule + :mod:`build_industry_sector_ratios`. + * The default configuration ``config/config.default.yaml`` is now automatically used as a base configuration file and no longer copied to ``config/config.yaml`` on first use. The file ``config/config.yaml`` should be diff --git a/rules/build_sector.smk b/rules/build_sector.smk index c25c8673..35a59008 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -392,8 +392,6 @@ rule build_salt_cavern_potentials: rule build_ammonia_production: - params: - countries=config["countries"], input: usgs="data/bundle-sector/myb1-2017-nitro.xls", output: diff --git a/scripts/build_ammonia_production.py b/scripts/build_ammonia_production.py index 77b33075..e2cf6a7b 100644 --- a/scripts/build_ammonia_production.py +++ b/scripts/build_ammonia_production.py @@ -7,7 +7,6 @@ Build historical annual ammonia production per country in ktonNH3/a. """ import country_converter as coco -import numpy as np import pandas as pd cc = coco.CountryConverter() @@ -26,6 +25,7 @@ if __name__ == "__main__": header=0, index_col=0, skipfooter=19, + na_values=["--"], ) ammonia.index = cc.convert(ammonia.index, to="iso2") @@ -33,8 +33,6 @@ if __name__ == "__main__": years = [str(i) for i in range(2013, 2018)] ammonia = ammonia[years] - ammonia.replace("--", np.nan, inplace=True) - ammonia = ammonia.astype(float) # convert from ktonN to ktonNH3 ammonia *= 17 / 14 From 7e66c1428d5a538efd0917ed2ff8002e1e9fcfec Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 12:40:05 +0100 Subject: [PATCH 416/497] add release note --- doc/release_notes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index cab8229a..ffe1a794 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,9 @@ Release Notes Upcoming Release ================ +* Bugfix: Correct units of subtracted chlorine and methanol demand in + :mod:`build_industry_sector_ratios`. + * The default configuration ``config/config.default.yaml`` is now automatically used as a base configuration file and no longer copied to ``config/config.yaml`` on first use. The file ``config/config.yaml`` should be From 6d80b332e606c7569e180f8519204a3be30724a4 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 12:47:01 +0100 Subject: [PATCH 417/497] add release note --- doc/release_notes.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index ee7bd64b..ccb886e6 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,11 @@ Release Notes Upcoming Release ================ +* Bugfix: The industry coal emissions for industry were not properly tracked. + +* Allow industrial coal demand to be regional so its emissions can be included + in regional emission limits. + * Add new default to overdimension heating in individual buildings. This allows them to cover heat demand peaks e.g. 10% higher than those in the data. The disadvantage of manipulating the costs is that the capacity is then not quite From 472a09988101d280b434d5d26947a5408f54cceb Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 13:30:52 +0100 Subject: [PATCH 418/497] add_electricity: set locations and units of electricity buses --- scripts/add_electricity.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 614e3330..9ac3638d 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -903,5 +903,9 @@ if __name__ == "__main__": sanitize_carriers(n, snakemake.config) + # set locations and units of electricity buses + n.buses["location"] = n.buses.index + n.buses["unit"] = "MWh_el" + n.meta = snakemake.config n.export_to_netcdf(snakemake.output[0]) From 9e8ed7394d65fcf24d0f631f22656a2dc544d61e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 13:32:24 +0100 Subject: [PATCH 419/497] Update config/config.default.yaml --- config/config.default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 97b0edb3..48f2a78d 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -538,8 +538,8 @@ sector: efficiency_static: 0.98 efficiency_per_1000km: 0.977 H2 pipeline: - efficiency_per_1000km: 0.9905 - compression_per_1000km: 0.008 + efficiency_per_1000km: 1 # 0.982 + compression_per_1000km: 0.018 gas pipeline: efficiency_per_1000km: 1 #0.977 compression_per_1000km: 0.01 From 93bb4e5f54c09ae9f3e571e07e83444150c6f59b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 15:14:18 +0100 Subject: [PATCH 420/497] add release note, simplify build_industry_sector_ratios_intermediate script --- doc/configtables/industry.csv | 2 + doc/release_notes.rst | 9 +++ ...ild_industry_sector_ratios_intermediate.py | 60 ++++++++----------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/doc/configtables/industry.csv b/doc/configtables/industry.csv index fc1b3f0f..d1b560ed 100644 --- a/doc/configtables/industry.csv +++ b/doc/configtables/industry.csv @@ -17,6 +17,8 @@ HVC_primary_fraction,--,float,The fraction of high value chemicals (HVC) produce HVC_mechanical_recycling _fraction,--,float,The fraction of high value chemicals (HVC) produced using mechanical recycling HVC_chemical_recycling _fraction,--,float,The fraction of high value chemicals (HVC) produced using chemical recycling ,,, +sector_ratios_fraction_future,--,Dictionary with planning horizons as keys.,The fraction of total progress in fuel and process switching achieved in the industry sector. +basic_chemicals_without_NH3_production_today,Mt/a,float,"The amount of basic chemicals produced without ammonia (= 86 Mtethylene-equiv - 17 MtNH3)." HVC_production_today,MtHVC/a,float,"The amount of high value chemicals (HVC) produced. This includes ethylene, propylene and BTX. From `DECHEMA (2017) `_, Figure 16, page 107" Mwh_elec_per_tHVC _mechanical_recycling,MWh/tHVC,float,"The energy amount of electricity needed to produce a ton of high value chemical (HVC) using mechanical recycling. From SI of `Meys et al (2020) `_, Table S5, for HDPE, PP, PS, PET. LDPE would be 0.756." Mwh_elec_per_tHVC _chemical_recycling,MWh/tHVC,float,"The energy amount of electricity needed to produce a ton of high value chemical (HVC) using chemical recycling. The default value is based on pyrolysis and electric steam cracking. From `Material Economics (2019) `_, page 125" diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 1a7564d5..b4425308 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,15 @@ Release Notes Upcoming Release ================ +* Improved representation of industry transition pathways. A new script was + added to interpolate industry sector ratios from today's status quo to future + systems (i.e. specific emissions and demands for energy and feedstocks). For + each country we gradually switch industry processes from today's specific + energy carrier usage per ton material output to the best-in-class energy + consumption of tomorrow. This is done on a per-country basis. The ratio of + today to tomorrow's energy consumption is set with the ``industry: + sector_ratios_fraction_future:`` parameter. + * Bugfix: Correct units of subtracted chlorine and methanol demand in :mod:`build_industry_sector_ratios`. diff --git a/scripts/build_industry_sector_ratios_intermediate.py b/scripts/build_industry_sector_ratios_intermediate.py index 0cbdfa06..4b1a2d34 100644 --- a/scripts/build_industry_sector_ratios_intermediate.py +++ b/scripts/build_industry_sector_ratios_intermediate.py @@ -25,62 +25,52 @@ def build_industry_sector_ratios_intermediate(): production = ( pd.read_csv(snakemake.input.industrial_production_per_country, index_col=0) / 1e3 - ) - production = production.unstack().swaplevel() + ).stack() + production.index.names = [None, None] # in MWh/t future_sector_ratios = pd.read_csv( snakemake.input.industry_sector_ratios, index_col=0 ) - production.index.names = [None, None] - today_sector_ratios = demand.div(production, axis=1) - today_sector_ratios.drop( - columns=today_sector_ratios.columns[today_sector_ratios.isna().all()], - inplace=True, - ) + today_sector_ratios.dropna(how="all", axis=1, inplace=True) - rename = pd.Series(today_sector_ratios.index, today_sector_ratios.index) - rename["waste"] = "biomass" - rename["electricity"] = "elec" - rename["solid"] = "coke" - rename["gas"] = "methane" - rename["other"] = "biomass" - rename["liquid"] = "naphtha" - - today_sector_ratios.rename(rename, inplace=True) + rename = { + "waste": "biomass", + "electricity": "elec", + "solid": "coke", + "gas": "methane", + "other": "biomass", + "liquid": "naphtha", + } + today_sector_ratios = today_sector_ratios.rename(rename).groupby(level=0).sum() fraction_future = get(params["sector_ratios_fraction_future"], year) intermediate_sector_ratios = {} - - for ct in today_sector_ratios.columns.unique(level=0): - - intermediate_sector_ratio = future_sector_ratios.copy() - - intermediate_sector_ratio.loc[ - today_sector_ratios[ct].index, today_sector_ratios[ct].columns - ] = ( - fraction_future - * intermediate_sector_ratio.loc[ - today_sector_ratios[ct].index, today_sector_ratios[ct].columns - ] - + (1 - fraction_future) * today_sector_ratios[ct] + for ct, group in today_sector_ratios.T.groupby(level=0): + today_sector_ratios_ct = ( + group.droplevel(0) + .T.reindex_like(future_sector_ratios) + .fillna(future_sector_ratios) + ) + intermediate_sector_ratios[ct] = ( + today_sector_ratios_ct * (1 - fraction_future) + + future_sector_ratios * fraction_future ) - intermediate_sector_ratios[ct] = intermediate_sector_ratio - intermediate_sector_ratios = pd.concat(intermediate_sector_ratios, axis=1) - intermediate_sector_ratios.to_csv(snakemake.output.industry_sector_ratios) - if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_industry_sector_ratios_intermediate") + snakemake = mock_snakemake( + "build_industry_sector_ratios_intermediate", + planning_horizons="2030", + ) year = int(snakemake.wildcards.planning_horizons[-4:]) From 8ae0669b333f0c9387f1a1a8a8bb38f4fa01b82b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 15:31:17 +0100 Subject: [PATCH 421/497] Revert "add_electricity: set locations and units of electricity buses" This reverts commit 472a09988101d280b434d5d26947a5408f54cceb. --- scripts/add_electricity.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 9ac3638d..614e3330 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -903,9 +903,5 @@ if __name__ == "__main__": sanitize_carriers(n, snakemake.config) - # set locations and units of electricity buses - n.buses["location"] = n.buses.index - n.buses["unit"] = "MWh_el" - n.meta = snakemake.config n.export_to_netcdf(snakemake.output[0]) From 27f9fb8cbaf7b377f182fb126246bf8a08772ba6 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 16:18:31 +0100 Subject: [PATCH 422/497] add back in to_csv export (accidentally deleted) --- scripts/build_industry_sector_ratios_intermediate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/build_industry_sector_ratios_intermediate.py b/scripts/build_industry_sector_ratios_intermediate.py index 4b1a2d34..14e09505 100644 --- a/scripts/build_industry_sector_ratios_intermediate.py +++ b/scripts/build_industry_sector_ratios_intermediate.py @@ -62,6 +62,8 @@ def build_industry_sector_ratios_intermediate(): ) intermediate_sector_ratios = pd.concat(intermediate_sector_ratios, axis=1) + intermediate_sector_ratios.to_csv(snakemake.output.industry_sector_ratios) + if __name__ == "__main__": if "snakemake" not in globals(): From 7f1ff0c3240b545fc5d93eeb8fdef28ef328975a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 16 Feb 2024 16:41:21 +0100 Subject: [PATCH 423/497] Fix plotting of retrofitted hydrogen pipelines with pathway optimisation. --- doc/release_notes.rst | 2 ++ scripts/plot_hydrogen_network.py | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index b4425308..7feb4d72 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -19,6 +19,8 @@ Upcoming Release today to tomorrow's energy consumption is set with the ``industry: sector_ratios_fraction_future:`` parameter. +* Fix plotting of retrofitted hydrogen pipelines with pathway optimisation. + * Bugfix: Correct units of subtracted chlorine and methanol demand in :mod:`build_industry_sector_ratios`. diff --git a/scripts/plot_hydrogen_network.py b/scripts/plot_hydrogen_network.py index 95741170..c6b90ceb 100644 --- a/scripts/plot_hydrogen_network.py +++ b/scripts/plot_hydrogen_network.py @@ -24,6 +24,7 @@ def group_pipes(df, drop_direction=False): """ Group pipes which connect same buses and return overall capacity. """ + df = df.copy() if drop_direction: positive_order = df.bus0 < df.bus1 df_p = df[positive_order] @@ -32,12 +33,13 @@ def group_pipes(df, drop_direction=False): df = pd.concat([df_p, df_n]) # there are pipes for each investment period rename to AC buses name for plotting + df["index_orig"] = df.index df.index = df.apply( lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", axis=1, ) return df.groupby(level=0).agg( - {"p_nom_opt": "sum", "bus0": "first", "bus1": "first"} + {"p_nom_opt": "sum", "bus0": "first", "bus1": "first", "index_orig": "first"} ) @@ -95,17 +97,18 @@ def plot_h2_map(n, regions): ) if not h2_retro.empty: - positive_order = h2_retro.bus0 < h2_retro.bus1 - h2_retro_p = h2_retro[positive_order] - swap_buses = {"bus0": "bus1", "bus1": "bus0"} - h2_retro_n = h2_retro[~positive_order].rename(columns=swap_buses) - h2_retro = pd.concat([h2_retro_p, h2_retro_n]) + if snakemake.params.foresight != "myopic": + positive_order = h2_retro.bus0 < h2_retro.bus1 + h2_retro_p = h2_retro[positive_order] + swap_buses = {"bus0": "bus1", "bus1": "bus0"} + h2_retro_n = h2_retro[~positive_order].rename(columns=swap_buses) + h2_retro = pd.concat([h2_retro_p, h2_retro_n]) - h2_retro["index_orig"] = h2_retro.index - h2_retro.index = h2_retro.apply( - lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", - axis=1, - ) + h2_retro["index_orig"] = h2_retro.index + h2_retro.index = h2_retro.apply( + lambda x: f"H2 pipeline {x.bus0.replace(' H2', '')} -> {x.bus1.replace(' H2', '')}", + axis=1, + ) retro_w_new_i = h2_retro.index.intersection(h2_new.index) h2_retro_w_new = h2_retro.loc[retro_w_new_i] From dd2416a59e16560fbecd6eed383aa60a1c730632 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 11:57:16 +0100 Subject: [PATCH 424/497] handle all {opts} and {sector_opts} wildcard values in config --- config/config.default.yaml | 17 ++- doc/configtables/adjustments.csv | 8 + doc/configtables/clustering.csv | 3 + doc/configtables/sector.csv | 6 + doc/configtables/snapshots.csv | 2 - doc/configuration.rst | 15 ++ rules/build_electricity.smk | 16 +- rules/build_sector.smk | 13 +- rules/postprocess.smk | 5 +- rules/solve_myopic.smk | 2 +- rules/solve_perfect.smk | 2 + rules/validate.smk | 6 +- scripts/_helpers.py | 181 +++++++++++++++++++++- scripts/add_brownfield.py | 4 +- scripts/add_existing_baseyear.py | 7 +- scripts/plot_summary.py | 9 +- scripts/prepare_network.py | 109 +++++--------- scripts/prepare_perfect_foresight.py | 48 ++---- scripts/prepare_sector_network.py | 218 ++++++++------------------- scripts/solve_network.py | 49 ++---- scripts/solve_operations_network.py | 10 +- 21 files changed, 385 insertions(+), 345 deletions(-) create mode 100644 doc/configtables/adjustments.csv diff --git a/config/config.default.yaml b/config/config.default.yaml index 91f38b91..1b207f1e 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -59,9 +59,6 @@ snapshots: start: "2013-01-01" end: "2014-01-01" inclusive: 'left' - resolution: false - segmentation: false - #representative: false # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#enable enable: @@ -366,6 +363,11 @@ existing_capacities: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#sector sector: + transport: true + heating: true + biomass: true + industry: true + agriculture: true district_heating: potential: 0.6 progress: @@ -531,6 +533,7 @@ sector: use_methanation_waste_heat: true use_fuel_cell_waste_heat: true use_electrolysis_waste_heat: true + electricity_transmission_grid: true electricity_distribution_grid: true electricity_distribution_grid_cost_factor: 1.0 electricity_grid_connection: true @@ -712,6 +715,14 @@ clustering: committable: any ramp_limit_up: max ramp_limit_down: max + temporal: + resolution_elec: false + resolution_sector: false + +# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#adjustments +adjustments: + electricity: false + sector: false # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#solving solving: diff --git a/doc/configtables/adjustments.csv b/doc/configtables/adjustments.csv new file mode 100644 index 00000000..52617352 --- /dev/null +++ b/doc/configtables/adjustments.csv @@ -0,0 +1,8 @@ +,Unit,Values,Description +adjustments,,, +-- electricity,bool or dict,,"Parameter adjustments for capital cost, marginal cost, and maximum capacities of carriers. Applied in :mod:`prepare_network.`" +-- -- {attr},,,"Attribute can be ``e_nom_opt``, ``p_nom_opt``, ``marginal_cost`` or ``capital_cost``" +-- -- -- {carrier},float,per-unit,"Any carrier of the network to which parameter adjustment factor should be applied." +-- sector,bool or dict,,"Parameter adjustments for capital cost, marginal cost, and maximum capacities of carriers. Applied in :mod:`prepare_sector_network.`" +-- -- {attr},,,"Attribute can be ``e_nom_opt``, ``p_nom_opt``, ``marginal_cost`` or ``capital_cost``" +-- -- -- {carrier},float,per-unit,"Any carrier of the network to which parameter adjustment factor should be applied." diff --git a/doc/configtables/clustering.csv b/doc/configtables/clustering.csv index e831ca84..65411738 100644 --- a/doc/configtables/clustering.csv +++ b/doc/configtables/clustering.csv @@ -17,3 +17,6 @@ aggregation_strategies,,, -- -- {key},str,"{key} can be any of the component of the generator (str). It’s value can be any that can be converted to pandas.Series using getattr(). For example one of {min, max, sum}.","Aggregates the component according to the given strategy. For example, if sum, then all values within each cluster are summed to represent the new generator." -- buses,,, -- -- {key},str,"{key} can be any of the component of the bus (str). It’s value can be any that can be converted to pandas.Series using getattr(). For example one of {min, max, sum}.","Aggregates the component according to the given strategy. For example, if sum, then all values within each cluster are summed to represent the new bus." +temporal,,,Options for temporal resolution +-- resolution_elec,--,"{false,``nH``; i.e. ``2H``-``6H``}","Resample the time-resolution by averaging over every ``n`` snapshots in :mod:`prepare_network`. **Warning:** This option should currently only be used with electricity-only networks, not for sector-coupled networks." +-- resolution_sector,--,"{false,``nH``; i.e. ``2H``-``6H``}","Resample the time-resolution by averaging over every ``n`` snapshots in :mod:`prepare_sector_network`." diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index d8cc3288..1f8bb030 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -1,4 +1,9 @@ ,Unit,Values,Description +transport,--,"{true, false}",Flag to include transport sector. +heating,--,"{true, false}",Flag to include heating sector. +biomass,--,"{true, false}",Flag to include biomass sector. +industry,--,"{true, false}",Flag to include industry sector. +agriculture,--,"{true, false}",Flag to include agriculture sector. district_heating,--,,`prepare_sector_network.py `_ -- potential,--,float,maximum fraction of urban demand which can be supplied by district heating -- progress,--,Dictionary with planning horizons as keys., Increase of today's district heating demand to potential maximum district heating share. Progress = 0 means today's district heating share. Progress = 1 means maximum fraction of urban demand is supplied by district heating @@ -109,6 +114,7 @@ min_part_load _methanolisation,per unit of p_nom ,float,The minimum unit dispatc use_fischer_tropsch _waste_heat,--,"{true, false}",Add option for using waste heat of Fischer Tropsch in district heating networks use_fuel_cell_waste_heat,--,"{true, false}",Add option for using waste heat of fuel cells in district heating networks use_electrolysis_waste _heat,--,"{true, false}",Add option for using waste heat of electrolysis in district heating networks +electricity_transmission _grid,--,"{true, false}",Switch for enabling/disabling the electricity transmission grid. electricity_distribution _grid,--,"{true, false}",Add a simplified representation of the exchange capacity between transmission and distribution grid level through a link. electricity_distribution _grid_cost_factor,,,Multiplies the investment cost of the electricity distribution grid ,,, diff --git a/doc/configtables/snapshots.csv b/doc/configtables/snapshots.csv index 0226a9aa..4be0439b 100644 --- a/doc/configtables/snapshots.csv +++ b/doc/configtables/snapshots.csv @@ -2,5 +2,3 @@ start,--,str or datetime-like; e.g. YYYY-MM-DD,Left bound of date range end,--,str or datetime-like; e.g. YYYY-MM-DD,Right bound of date range inclusive,--,"One of {'neither', 'both', ‘left’, ‘right’}","Make the time interval closed to the ``left``, ``right``, or both sides ``both`` or neither side ``None``." -resolution ,--,"{false,``nH``; i.e. ``2H``-``6H``}","Resample the time-resolution by averaging over every ``n`` snapshots in :mod:`prepare_network`. **Warning:** This option should currently only be used with electricity-only networks, not for sector-coupled networks." -segmentation,--,"{false,``n``; e.g. ``4380``}","Apply time series segmentation with `tsam `_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load in :mod:`prepare_network`. **Warning:** This option should currently only be used with electricity-only networks, not for sector-coupled networks." diff --git a/doc/configuration.rst b/doc/configuration.rst index f65aa4c2..e8b0426a 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -561,6 +561,21 @@ The list of available biomass is given by the category in `ENSPRESO_BIOMASS 0: - return True, float(m[0]) + return True, float(m[0].replace("p", ".").replace("m", "-")) else: return True, None return False, None @@ -379,13 +380,177 @@ def parse(infix): return {infix.pop(0): parse(infix)} -def update_config_with_sector_opts(config, sector_opts): - from snakemake.utils import update_config +def update_config_from_wildcards(config, w): + """ + Parses configuration settings from wildcards and updates the config. - for o in sector_opts.split("-"): - if o.startswith("CF+"): - infix = o.split("+")[1:] - update_config(config, parse(infix)) + - TODO: Should be run inside config_provider function. + """ + + if w.get("opts"): + opts = w.opts.split("-") + + if nhours := get_opt(opts, r"^\d+(h|seg)$"): + config["clustering"]["temporal"]["resolution_elec"] = nhours + + co2l_enable, co2l_value = find_opt(opts, "Co2L") + if co2l_enable: + config["electricity"]["co2limit_enable"] = True + if co2l_value is not None: + config["electricity"]["co2limit"] = ( + co2l_value * config["electricity"]["co2base"] + ) + + gasl_enable, gasl_value = find_opt(opts, "CH4L") + if gasl_enable: + config["electricity"]["gaslimit_enable"] = True + if gasl_value is not None: + config["electricity"]["gaslimit"] = gasl_value * 1e6 + + if "Ept" in opts: + config["costs"]["emission_prices"]["co2_monthly_prices"] = True + + ep_enable, ep_value = find_opt(opts, "Ep") + if ep_enable: + config["costs"]["emission_prices"]["enable"] = True + if ep_value is not None: + config["costs"]["emission_prices"]["co2"] = ep_value + + if "ATK" in opts: + config["autarky"]["enable"] = True + if "ATKc" in opts: + config["autarky"]["by_country"] = True + + attr_lookup = { + "p": "p_nom_max", + "e": "e_nom_max", + "c": "capital_cost", + "m": "marginal_cost", + } + for o in opts: + flags = ["+e", "+p", "+m", "+c"] + if all(flag not in o for flag in flags): + continue + carrier, attr_factor = o.split("+") + attr = attr_lookup[attr_factor[0]] + factor = float(attr_factor[1:]) + if not isinstance(config["adjustments"]["electricity"], dict): + config["adjustments"]["electricity"] = dict() + update_config( + config["adjustments"]["electricity"], {attr: {carrier: factor}} + ) + + if w.get("sector_opts"): + opts = w.sector_opts.split("-") + + if "T" in opts: + config["sector"]["transport"] = True + + if "H" in opts: + config["sector"]["heating"] = True + + if "B" in opts: + config["sector"]["biomass"] = True + + if "I" in opts: + config["sector"]["industry"] = True + + if "A" in opts: + config["sector"]["agriculture"] = True + + if "CCL" in opts: + config["solving"]["constraints"]["CCL"] = True + + eq_value = get_opt(opts, r"^EQ+\d*\.?\d+(c|)") + for o in opts: + if eq_value is not None: + config["solving"]["constraints"]["EQ"] = eq_value + elif "EQ" in o: + config["solving"]["constraints"]["EQ"] = True + break + + if "BAU" in opts: + config["solving"]["constraints"]["BAU"] = True + + if "SAFE" in opts: + config["solving"]["constraints"]["SAFE"] = True + + if nhours := get_opt(opts, r"^\d+(h|sn|seg)$"): + config["clustering"]["temporal"]["resolution_sector"] = nhours + + if "decentral" in opts: + config["sector"]["electricity_transmission_grid"] = False + + if "noH2network" in opts: + config["sector"]["H2_network"] = False + + if "nowasteheat" in opts: + config["sector"]["use_fischer_tropsch_waste_heat"] = False + config["sector"]["use_methanolisation_waste_heat"] = False + config["sector"]["use_haber_bosch_waste_heat"] = False + config["sector"]["use_methanation_waste_heat"] = False + config["sector"]["use_fuel_cell_waste_heat"] = False + config["sector"]["use_electrolysis_waste_heat"] = False + + if "nodistrict" in opts: + config["sector"]["district_heating"]["progress"] = 0.0 + + dg_enable, dg_factor = find_opt(opts, "dist") + if dg_enable: + config["sector"]["electricity_distribution_grid"] = True + if dg_factor is not None: + config["sector"][ + "electricity_distribution_grid_cost_factor" + ] = dg_factor + + if "biomasstransport" in opts: + config["sector"]["biomass_transport"] = True + + _, maxext = find_opt(opts, "linemaxext") + if maxext is not None: + config["lines"]["max_extension"] = maxext * 1e3 + config["links"]["max_extension"] = maxext * 1e3 + + _, co2l_value = find_opt(opts, "Co2L") + if co2l_value is not None: + config["co2_budget"] = float(co2l_value) + + if co2_distribution := get_opt(opts, r"^(cb)\d+(\.\d+)?(ex|be)$"): + config["co2_budget"] = co2_distribution + + if co2_budget := get_opt(opts, r"^(cb)\d+(\.\d+)?$"): + config["co2_budget"] = float(co2_budget[2:]) + + attr_lookup = { + "p": "p_nom_max", + "e": "e_nom_max", + "c": "capital_cost", + "m": "marginal_cost", + } + for o in opts: + flags = ["+e", "+p", "+m", "+c"] + if all(flag not in o for flag in flags): + continue + carrier, attr_factor = o.split("+") + attr = attr_lookup[attr_factor[0]] + factor = float(attr_factor[1:]) + if not isinstance(config["adjustments"]["sector"], dict): + config["adjustments"]["sector"] = dict() + update_config(config["adjustments"]["sector"], {attr: {carrier: factor}}) + + _, sdr_value = find_opt(opts, "sdr") + if sdr_value is not None: + config["costs"]["social_discountrate"] = sdr_value / 100 + + _, seq_limit = find_opt(opts, "seq") + if seq_limit is not None: + config["sector"]["co2_sequestration_potential"] = seq_limit + + # any config option can be represented in wildcard + for o in opts: + if o.startswith("CF+"): + infix = o.split("+")[1:] + update_config(config, parse(infix)) def get_checksum_from_zenodo(file_url): diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 3b77c437..329bde4c 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -12,7 +12,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts +from _helpers import update_config_from_wildcards from add_existing_baseyear import add_build_year_to_new_assets from pypsa.clustering.spatial import normed_or_uniform @@ -212,7 +212,7 @@ if __name__ == "__main__": logging.basicConfig(level=snakemake.config["logging"]["level"]) - update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) + update_config_from_wildcards(snakemake.config, snakemake.wildcards) logger.info(f"Preparing brownfield from the file {snakemake.input.network_p}") diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index c0d37a5b..02711f59 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -15,7 +15,7 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts +from _helpers import update_config_from_wildcards from add_electricity import sanitize_carriers from prepare_sector_network import cluster_heat_buses, define_spatial, prepare_costs @@ -554,10 +554,9 @@ if __name__ == "__main__": logging.basicConfig(level=snakemake.config["logging"]["level"]) - update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) + update_config_from_wildcards(snakemake.config, snakemake.wildcards) options = snakemake.params.sector - opts = snakemake.wildcards.sector_opts.split("-") baseyear = snakemake.params.baseyear @@ -580,7 +579,7 @@ if __name__ == "__main__": n, grouping_years_power, costs, baseyear ) - if "H" in opts: + if options["heating"]: time_dep_hp_cop = options["time_dep_hp_cop"] ashp_cop = ( xr.open_dataarray(snakemake.input.cop_air_total) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index cfb32441..05ffa2d4 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -582,7 +582,8 @@ if __name__ == "__main__": plot_balances() - for sector_opts in snakemake.params.sector_opts: - opts = sector_opts.split("-") - if any("cb" in o for o in opts) or snakemake.config["foresight"] == "perfect": - plot_carbon_budget_distribution(snakemake.input.eurostat) + if ( + snakemake.params["co2_budget"].startswith("cb") + or snakemake.params["foresight"] == "perfect" + ): + plot_carbon_budget_distribution(snakemake.input.eurostat) diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index e358c05e..a9216d51 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -62,7 +62,7 @@ import logging import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging, find_opt, get_opt +from _helpers import configure_logging, update_config_from_wildcards from add_electricity import load_costs, update_transmission_costs from pypsa.descriptors import expand_series @@ -71,6 +71,28 @@ idx = pd.IndexSlice logger = logging.getLogger(__name__) +def maybe_adjust_costs_and_potentials(n, adjustments): + if not adjustments: + return + + for attr, carrier_factor in adjustments.items(): + for carrier, factor in carrier_factor.items(): + # beware if factor is 0 and p_nom_max is np.inf, 0*np.inf is nan + if carrier == "AC": # lines do not have carrier + n.lines[attr] *= factor + continue + comps = { + "p_nom_max": {"Generator", "Link", "StorageUnit"}, + "e_nom_max": {"Store"}, + "capital_cost": {"Generator", "Link", "StorageUnit", "Store"}, + "marginal_cost": {"Generator", "Link", "StorageUnit", "Store"}, + } + for c in n.iterate_components(comps[attr]): + sel = c.df.index[c.df.carrier == carrier] + c.df.loc[sel, attr] *= factor + logger.info(f"changing {attr} for {carrier} by factor {factor}") + + def add_co2limit(n, co2limit, Nyears=1.0): n.add( "GlobalConstraint", @@ -278,11 +300,10 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake( - "prepare_network", simpl="", clusters="37", ll="v1.0", opts="Ept" + "prepare_network", simpl="", clusters="37", ll="v1.0", opts="Co2L-4H" ) configure_logging(snakemake) - - opts = snakemake.wildcards.opts.split("-") + update_config_from_wildcards(snakemake.config, snakemake.wildcards) n = pypsa.Network(snakemake.input[0]) Nyears = n.snapshot_weightings.objective.sum() / 8760.0 @@ -296,81 +317,32 @@ if __name__ == "__main__": set_line_s_max_pu(n, snakemake.params.lines["s_max_pu"]) # temporal averaging - nhours_config = snakemake.params.snapshots.get("resolution", False) - nhours_wildcard = get_opt(opts, r"^\d+h$") - nhours = nhours_wildcard or nhours_config - if nhours: + if nhours := snakemake.params.time_resolution: n = average_every_nhours(n, nhours) # segments with package tsam - time_seg_config = snakemake.params.snapshots.get("segmentation", False) - time_seg_wildcard = get_opt(opts, r"^\d+seg$") - time_seg = time_seg_wildcard or time_seg_config - if time_seg: + if time_seg := snakemake.params.time_resolution: solver_name = snakemake.config["solving"]["solver"]["name"] n = apply_time_segmentation(n, time_seg.replace("seg", ""), solver_name) - Co2L_config = snakemake.params.co2limit_enable - Co2L_wildcard, co2limit_wildcard = find_opt(opts, "Co2L") - if Co2L_wildcard or Co2L_config: - if co2limit_wildcard is not None: - co2limit = co2limit_wildcard * snakemake.params.co2base - add_co2limit(n, co2limit, Nyears) - logger.info("Setting CO2 limit according to wildcard value.") - else: - add_co2limit(n, snakemake.params.co2limit, Nyears) - logger.info("Setting CO2 limit according to config value.") + if snakemake.params.co2limit_enable: + add_co2limit(n, snakemake.params.co2limit, Nyears) - CH4L_config = snakemake.params.gaslimit_enable - CH4L_wildcard, gaslimit_wildcard = find_opt(opts, "CH4L") - if CH4L_wildcard or CH4L_config: - if gaslimit_wildcard is not None: - gaslimit = gaslimit_wildcard * 1e6 - add_gaslimit(n, gaslimit, Nyears) - logger.info("Setting gas usage limit according to wildcard value.") - else: - add_gaslimit(n, snakemake.params.gaslimit, Nyears) - logger.info("Setting gas usage limit according to config value.") + if snakemake.params.gaslimit_enable: + add_gaslimit(n, snakemake.params.gaslimit, Nyears) - for o in opts: - if "+" not in o: - continue - oo = o.split("+") - suptechs = map(lambda c: c.split("-", 2)[0], n.carriers.index) - if oo[0].startswith(tuple(suptechs)): - carrier = oo[0] - # handles only p_nom_max as stores and lines have no potentials - attr_lookup = {"p": "p_nom_max", "c": "capital_cost", "m": "marginal_cost"} - attr = attr_lookup[oo[1][0]] - factor = float(oo[1][1:]) - if carrier == "AC": # lines do not have carrier - n.lines[attr] *= factor - else: - comps = {"Generator", "Link", "StorageUnit", "Store"} - for c in n.iterate_components(comps): - sel = c.df.carrier.str.contains(carrier) - c.df.loc[sel, attr] *= factor + maybe_adjust_costs_and_potentials(n, snakemake.params["adjustments"]) emission_prices = snakemake.params.costs["emission_prices"] - Ept_config = emission_prices.get("co2_monthly_prices", False) - Ept_wildcard = "Ept" in opts - Ep_config = emission_prices.get("enable", False) - Ep_wildcard, co2_wildcard = find_opt(opts, "Ep") - - if Ept_wildcard or Ept_config: + if emission_prices["co2_monthly_prices"]: logger.info( "Setting time dependent emission prices according spot market price" ) add_dynamic_emission_prices(n) - elif Ep_wildcard or Ep_config: - if co2_wildcard is not None: - logger.info("Setting CO2 prices according to wildcard value.") - add_emission_prices(n, dict(co2=co2_wildcard)) - else: - logger.info("Setting CO2 prices according to config value.") - add_emission_prices( - n, dict(co2=snakemake.params.costs["emission_prices"]["co2"]) - ) + elif emission_prices["enable"]: + add_emission_prices( + n, dict(co2=snakemake.params.costs["emission_prices"]["co2"]) + ) ll_type, factor = snakemake.wildcards.ll[0], snakemake.wildcards.ll[1:] set_transmission_limit(n, ll_type, factor, costs, Nyears) @@ -383,11 +355,8 @@ if __name__ == "__main__": p_nom_max_ext=snakemake.params.links.get("max_extension", np.inf), ) - autarky_config = snakemake.params.autarky - if "ATK" in opts or autarky_config.get("enable", False): - only_crossborder = False - if "ATKc" in opts or autarky_config.get("by_country", False): - only_crossborder = True + if snakemake.params.autarky["enable"]: + only_crossborder = snakemake.params.autarky["by_country"] enforce_autarky(n, only_crossborder=only_crossborder) n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index cf013577..54b2ecc0 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -12,7 +12,7 @@ import re import numpy as np import pandas as pd import pypsa -from _helpers import update_config_with_sector_opts +from _helpers import update_config_from_wildcards from add_existing_baseyear import add_build_year_to_new_assets from pypsa.descriptors import expand_series from pypsa.io import import_components_from_dataframe @@ -304,17 +304,14 @@ def set_all_phase_outs(n): n.mremove("Link", remove_i) -def set_carbon_constraints(n, opts): +def set_carbon_constraints(n): """ Add global constraints for carbon emissions. """ - budget = None - for o in opts: - # other budgets - m = re.match(r"^\d+p\d$", o, re.IGNORECASE) - if m is not None: - budget = snakemake.config["co2_budget"][m.group(0)] * 1e9 - if budget is not None: + budget = snakemake.config["co2_budget"] + if budget and isinstance(budget, float): + budget *= 1e9 # convert to t CO2 + logger.info(f"add carbon budget of {budget}") n.add( "GlobalConstraint", @@ -341,7 +338,7 @@ def set_carbon_constraints(n, opts): ) # set minimum CO2 emission constraint to avoid too fast reduction - if "co2min" in opts: + if "co2min" in snakemake.wildcards.sector_opts.split("-"): emissions_1990 = 4.53693 emissions_2019 = 3.344096 target_2030 = 0.45 * emissions_1990 @@ -487,21 +484,6 @@ def apply_time_segmentation_perfect( return n -def set_temporal_aggregation_SEG(n, opts, solver_name): - """ - Aggregate network temporally with tsam. - """ - for o in opts: - # segments with package tsam - m = re.match(r"^(\d+)seg$", o, re.IGNORECASE) - if m is not None: - segments = int(m[1]) - logger.info(f"Use temporal segmentation with {segments} segments") - n = apply_time_segmentation_perfect(n, segments, solver_name=solver_name) - break - return n - - if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -515,14 +497,10 @@ if __name__ == "__main__": sector_opts="1p7-4380H-T-H-B-I-A-dist1", ) - update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) + update_config_from_wildcards(snakemake.config, snakemake.wildcards) # parameters ----------------------------------------------------------- years = snakemake.config["scenario"]["planning_horizons"] - opts = snakemake.wildcards.sector_opts.split("-") - social_discountrate = snakemake.config["costs"]["social_discountrate"] - for o in opts: - if "sdr" in o: - social_discountrate = float(o.replace("sdr", "")) / 100 + social_discountrate = snakemake.params.costs["social_discountrate"] logger.info( f"Concat networks of investment period {years} with social discount rate of {social_discountrate * 100}%" @@ -532,9 +510,10 @@ if __name__ == "__main__": n = concat_networks(years) # temporal aggregate - opts = snakemake.wildcards.sector_opts.split("-") solver_name = snakemake.config["solving"]["solver"]["name"] - n = set_temporal_aggregation_SEG(n, opts, solver_name) + segments = snakemake.params["clustering"]["temporal"]["resolution_sector"] + if isinstance(segments, (int, float)): + n = apply_time_segmentation_perfect(n, segments, solver_name=solver_name) # adjust global constraints lv limit if the same for all years n = adjust_lvlimit(n) @@ -550,8 +529,7 @@ if __name__ == "__main__": add_H2_boilers(n) # set carbon constraints - opts = snakemake.wildcards.sector_opts.split("-") - n = set_carbon_constraints(n, opts) + n = set_carbon_constraints(n) # export network n.export_to_netcdf(snakemake.output[0]) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 5d5e271b..d9cce254 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -9,7 +9,6 @@ technologies for the buildings, transport and industry sectors. import logging import os -import re from itertools import product from types import SimpleNamespace @@ -18,11 +17,12 @@ import numpy as np import pandas as pd import pypsa import xarray as xr -from _helpers import update_config_with_sector_opts +from _helpers import configure_logging, update_config_from_wildcards from add_electricity import calculate_annuity, sanitize_carriers, sanitize_locations from build_energy_totals import build_co2_totals, build_eea_co2, build_eurostat_co2 from networkx.algorithms import complement from networkx.algorithms.connectivity.edge_augmentation import k_edge_augmentation +from prepare_network import maybe_adjust_costs_and_potentials from pypsa.geo import haversine_pts from pypsa.io import import_components_from_dataframe from scipy.stats import beta @@ -190,13 +190,13 @@ def define_spatial(nodes, options): spatial = SimpleNamespace() -def emission_sectors_from_opts(opts): +def determine_emission_sectors(options): sectors = ["electricity"] - if "T" in opts: + if options["transport"]: sectors += ["rail non-elec", "road non-elec"] - if "H" in opts: + if options["heating"]: sectors += ["residential non-elec", "services non-elec"] - if "I" in opts: + if options["industry"]: sectors += [ "industrial non-elec", "industrial processes", @@ -205,7 +205,7 @@ def emission_sectors_from_opts(opts): "domestic navigation", "international navigation", ] - if "A" in opts: + if options["agriculture"]: sectors += ["agriculture"] return sectors @@ -219,7 +219,7 @@ def get(item, investment_year=None): def co2_emissions_year( - countries, input_eurostat, opts, emissions_scope, report_year, input_co2, year + countries, input_eurostat, options, emissions_scope, report_year, input_co2, year ): """ Calculate CO2 emissions in one specific year (e.g. 1990 or 2018). @@ -237,7 +237,7 @@ def co2_emissions_year( co2_totals = build_co2_totals(countries, eea_co2, eurostat_co2) - sectors = emission_sectors_from_opts(opts) + sectors = determine_emission_sectors(options) co2_emissions = co2_totals.loc[countries, sectors].sum().sum() @@ -248,11 +248,12 @@ def co2_emissions_year( # TODO: move to own rule with sector-opts wildcard? -def build_carbon_budget(o, input_eurostat, fn, emissions_scope, report_year): +def build_carbon_budget( + o, input_eurostat, fn, emissions_scope, report_year, input_co2, options +): """ Distribute carbon budget following beta or exponential transition path. """ - # opts? if "be" in o: # beta decay @@ -268,7 +269,7 @@ def build_carbon_budget(o, input_eurostat, fn, emissions_scope, report_year): e_1990 = co2_emissions_year( countries, input_eurostat, - opts, + options, emissions_scope, report_year, input_co2, @@ -279,7 +280,7 @@ def build_carbon_budget(o, input_eurostat, fn, emissions_scope, report_year): e_0 = co2_emissions_year( countries, input_eurostat, - opts, + options, emissions_scope, report_year, input_co2, @@ -756,12 +757,12 @@ def add_dac(n, costs): ) -def add_co2limit(n, nyears=1.0, limit=0.0): +def add_co2limit(n, options, nyears=1.0, limit=0.0): logger.info(f"Adding CO2 budget limit as per unit of 1990 levels of {limit}") countries = snakemake.params.countries - sectors = emission_sectors_from_opts(opts) + sectors = determine_emission_sectors(options) # convert Mt to tCO2 co2_totals = 1e6 * pd.read_csv(snakemake.input.co2_totals_name, index_col=0) @@ -2000,13 +2001,6 @@ def add_heat(n, costs): if options["retrofitting"]["retro_endogen"]: logger.info("Add retrofitting endogenously") - # resample heat demand temporal 'heat_demand_r' depending on in config - # specified temporal resolution, to not overestimate retrofitting - hours = list(filter(re.compile(r"^\d+h$", re.IGNORECASE).search, opts)) - if len(hours) == 0: - hours = [n.snapshots[1] - n.snapshots[0]] - heat_demand_r = heat_demand.resample(hours[0]).mean() - # retrofitting data 'retro_data' with 'costs' [EUR/m^2] and heat # demand 'dE' [per unit of original heat demand] for each country and # different retrofitting strengths [additional insulation thickness in m] @@ -2024,12 +2018,12 @@ def add_heat(n, costs): # share of space heat demand 'w_space' of total heat demand w_space = {} for sector in sectors: - w_space[sector] = heat_demand_r[sector + " space"] / ( - heat_demand_r[sector + " space"] + heat_demand_r[sector + " water"] + w_space[sector] = heat_demand[sector + " space"] / ( + heat_demand[sector + " space"] + heat_demand[sector + " water"] ) w_space["tot"] = ( - heat_demand_r["services space"] + heat_demand_r["residential space"] - ) / heat_demand_r.T.groupby(level=[1]).sum().T + heat_demand["services space"] + heat_demand["residential space"] + ) / heat_demand.T.groupby(level=[1]).sum().T for name in n.loads[ n.loads.carrier.isin([x + " heat" for x in heat_systems]) @@ -2059,7 +2053,7 @@ def add_heat(n, costs): pop_layout.loc[node].fraction * floor_area.loc[ct, "value"] * 10**6 ).loc[sec] * f # total heat demand at node [MWh] - demand = n.loads_t.p_set[name].resample(hours[0]).mean() + demand = n.loads_t.p_set[name] # space heat demand at node [MWh] space_heat_demand = demand * w_space[sec][node] @@ -3292,52 +3286,6 @@ def remove_h2_network(n): n.stores.drop("EU H2 Store", inplace=True) -def maybe_adjust_costs_and_potentials(n, opts): - for o in opts: - flags = ["+e", "+p", "+m", "+c"] - if all(flag not in o for flag in flags): - continue - oo = o.split("+") - carrier_list = np.hstack( - ( - n.generators.carrier.unique(), - n.links.carrier.unique(), - n.stores.carrier.unique(), - n.storage_units.carrier.unique(), - ) - ) - suptechs = map(lambda c: c.split("-", 2)[0], carrier_list) - if oo[0].startswith(tuple(suptechs)): - carrier = oo[0] - attr_lookup = { - "p": "p_nom_max", - "e": "e_nom_max", - "c": "capital_cost", - "m": "marginal_cost", - } - attr = attr_lookup[oo[1][0]] - factor = float(oo[1][1:]) - # beware if factor is 0 and p_nom_max is np.inf, 0*np.inf is nan - if carrier == "AC": # lines do not have carrier - n.lines[attr] *= factor - else: - if attr == "p_nom_max": - comps = {"Generator", "Link", "StorageUnit"} - elif attr == "e_nom_max": - comps = {"Store"} - else: - comps = {"Generator", "Link", "StorageUnit", "Store"} - for c in n.iterate_components(comps): - if carrier == "solar": - sel = c.df.carrier.str.contains( - carrier - ) & ~c.df.carrier.str.contains("solar rooftop") - else: - sel = c.df.carrier.str.contains(carrier) - c.df.loc[sel, attr] *= factor - logger.info(f"changing {attr} for {carrier} by factor {factor}") - - def limit_individual_line_extension(n, maxext): logger.info(f"Limiting new HVAC and HVDC extensions to {maxext} MW") n.lines["s_nom_max"] = n.lines["s_nom"] + maxext @@ -3507,31 +3455,31 @@ def apply_time_segmentation( return n -def set_temporal_aggregation(n, opts, solver_name): +def set_temporal_aggregation(n, resolution, solver_name): """ Aggregate network temporally. """ - for o in opts: - # temporal averaging - m = re.match(r"^\d+h$", o, re.IGNORECASE) - if m is not None: - n = average_every_nhours(n, m.group(0)) - break - # representative snapshots - m = re.match(r"(^\d+)sn$", o, re.IGNORECASE) - if m is not None: - sn = int(m[1]) - logger.info(f"Use every {sn} snapshot as representative") - n.set_snapshots(n.snapshots[::sn]) - n.snapshot_weightings *= sn - break - # segments with package tsam - m = re.match(r"^(\d+)seg$", o, re.IGNORECASE) - if m is not None: - segments = int(m[1]) - logger.info(f"Use temporal segmentation with {segments} segments") - n = apply_time_segmentation(n, segments, solver_name=solver_name) - break + if not resolution: + return n + + # representative snapshots + if "sn" in resolution.lower(): + sn = int(resolution[:-2]) + logger.info("Use every %s snapshot as representative", sn) + n.set_snapshots(n.snapshots[::sn]) + n.snapshot_weightings *= sn + + # segments with package tsam + elif "seg" in resolution.lower(): + segments = int(resolution[:-3]) + logger.info("Use temporal segmentation with %s segments", segments) + n = apply_time_segmentation(n, segments, solver_name=solver_name) + + # temporal averaging + elif "h" in resolution.lower(): + logger.info("Aggregate to frequency %s", resolution) + n = average_every_nhours(n, resolution) + return n @@ -3600,14 +3548,12 @@ if __name__ == "__main__": planning_horizons="2030", ) - logging.basicConfig(level=snakemake.config["logging"]["level"]) + configure_logging(snakemake) - update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) + update_config_from_wildcards(snakemake.config, snakemake.wildcards) options = snakemake.params.sector - opts = snakemake.wildcards.sector_opts.split("-") - investment_year = int(snakemake.wildcards.planning_horizons[-4:]) n = pypsa.Network(snakemake.input.network) @@ -3645,56 +3591,34 @@ if __name__ == "__main__": add_storage_and_grids(n, costs) - # TODO merge with opts cost adjustment below - for o in opts: - if o[:4] == "dist": - options["electricity_distribution_grid"] = True - options["electricity_distribution_grid_cost_factor"] = float( - o[4:].replace("p", ".").replace("m", "-") - ) - if o == "biomasstransport": - options["biomass_transport"] = True - - if "nodistrict" in opts: - options["district_heating"]["progress"] = 0.0 - - if "nowasteheat" in opts: - logger.info("Disabling waste heat.") - options["use_fischer_tropsch_waste_heat"] = False - options["use_methanolisation_waste_heat"] = False - options["use_haber_bosch_waste_heat"] = False - options["use_methanation_waste_heat"] = False - options["use_fuel_cell_waste_heat"] = False - options["use_electrolysis_waste_heat"] = False - - if "T" in opts: + if options["transport"]: add_land_transport(n, costs) - if "H" in opts: + if options["heating"]: add_heat(n, costs) - if "B" in opts: + if options["biomass"]: add_biomass(n, costs) if options["ammonia"]: add_ammonia(n, costs) - if "I" in opts: + if options["industry"]: add_industry(n, costs) - if "H" in opts: + if options["heating"]: add_waste_heat(n) - if "A" in opts: # requires H and I + if options["agriculture"]: # requires H and I add_agriculture(n, costs) if options["dac"]: add_dac(n, costs) - if "decentral" in opts: + if not options["electricity_transmission_grid"]: decentral(n) - if "noH2network" in opts: + if not options["H2_network"]: remove_h2_network(n) if options["co2network"]: @@ -3704,51 +3628,39 @@ if __name__ == "__main__": add_allam(n, costs) solver_name = snakemake.config["solving"]["solver"]["name"] - n = set_temporal_aggregation(n, opts, solver_name) + resolution = snakemake.params.time_resolution + n = set_temporal_aggregation(n, resolution, solver_name) - limit_type = "config" - limit = get(snakemake.params.co2_budget, investment_year) - for o in opts: - if "cb" not in o: - continue - limit_type = "carbon budget" + co2_budget = snakemake.params.co2_budget + if isinstance(co2_budget, str) and co2_budget.startswith("cb"): fn = "results/" + snakemake.params.RDIR + "/csvs/carbon_budget_distribution.csv" if not os.path.exists(fn): emissions_scope = snakemake.params.emissions_scope report_year = snakemake.params.eurostat_report_year input_co2 = snakemake.input.co2 build_carbon_budget( - o, + co2_budget, snakemake.input.eurostat, fn, emissions_scope, report_year, input_co2, + options, ) co2_cap = pd.read_csv(fn, index_col=0).squeeze() limit = co2_cap.loc[investment_year] - break - for o in opts: - if "Co2L" not in o: - continue - limit_type = "wildcard" - limit = o[o.find("Co2L") + 4 :] - limit = float(limit.replace("p", ".").replace("m", "-")) - break - logger.info(f"Add CO2 limit from {limit_type}") - add_co2limit(n, nyears, limit) + else: + limit = get(co2_budget, investment_year) + add_co2limit(n, options, nyears, limit) - for o in opts: - if not o[:10] == "linemaxext": - continue - maxext = float(o[10:]) * 1e3 + maxext = snakemake.params["lines"]["max_extension"] + if maxext is not None: limit_individual_line_extension(n, maxext) - break if options["electricity_distribution_grid"]: insert_electricity_distribution_grid(n, costs) - maybe_adjust_costs_and_potentials(n, opts) + maybe_adjust_costs_and_potentials(n, snakemake.params["adjustments"]) if options["gas_distribution_grid"]: insert_gas_distribution_costs(n, costs) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 551222c0..278171bc 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -37,7 +37,7 @@ import pandas as pd import pypsa import xarray as xr from _benchmark import memory_logger -from _helpers import configure_logging, get_opt, update_config_with_sector_opts +from _helpers import configure_logging, update_config_from_wildcards from pypsa.descriptors import get_activity_mask from pypsa.descriptors import get_switchable_as_dense as get_as_dense @@ -178,16 +178,10 @@ def _add_land_use_constraint_m(n, planning_horizons, config): n.generators.p_nom_max.clip(lower=0, inplace=True) -def add_co2_sequestration_limit(n, config, limit=200): +def add_co2_sequestration_limit(n, limit=200): """ Add a global constraint on the amount of Mt CO2 that can be sequestered. """ - limit = limit * 1e6 - for o in opts: - if "seq" not in o: - continue - limit = float(o[o.find("seq") + 3 :]) * 1e6 - break if not n.investment_periods.empty: periods = n.investment_periods @@ -200,7 +194,7 @@ def add_co2_sequestration_limit(n, config, limit=200): "GlobalConstraint", names, sense=">=", - constant=-limit, + constant=-limit * 1e6, type="operational_limit", carrier_attribute="co2 sequestered", investment_period=periods, @@ -260,7 +254,7 @@ def add_carbon_budget_constraint(n, snapshots): n.model.add_constraints(lhs <= rhs, name=f"GlobalConstraint-{name}") -def add_max_growth(n, config): +def add_max_growth(n): """ Add maximum growth rates for different carriers. """ @@ -393,11 +387,11 @@ def prepare_network( if foresight == "perfect": n = add_land_use_constraint_perfect(n) if snakemake.params["sector"]["limit_max_growth"]["enable"]: - n = add_max_growth(n, config) + n = add_max_growth(n) if n.stores.carrier.eq("co2 sequestered").any(): limit = co2_sequestration_potential - add_co2_sequestration_limit(n, config, limit=limit) + add_co2_sequestration_limit(n, limit=limit) return n @@ -831,30 +825,20 @@ def extra_functionality(n, snapshots): location to add them. The arguments ``opts`` and ``snakemake.config`` are expected to be attached to the network. """ - opts = n.opts config = n.config constraints = config["solving"].get("constraints", {}) - if ( - "BAU" in opts or constraints.get("BAU", False) - ) and n.generators.p_nom_extendable.any(): + if constraints["BAU"] and n.generators.p_nom_extendable.any(): add_BAU_constraints(n, config) - if ( - "SAFE" in opts or constraints.get("SAFE", False) - ) and n.generators.p_nom_extendable.any(): + if constraints["SAFE"] and n.generators.p_nom_extendable.any(): add_SAFE_constraints(n, config) - if ( - "CCL" in opts or constraints.get("CCL", False) - ) and n.generators.p_nom_extendable.any(): + if constraints["CCL"] and n.generators.p_nom_extendable.any(): add_CCL_constraints(n, config) reserve = config["electricity"].get("operational_reserve", {}) if reserve.get("activate"): add_operational_reserve_margin(n, snapshots, config) - EQ_config = constraints.get("EQ", False) - EQ_wildcard = get_opt(opts, r"^EQ+[0-9]*\.?[0-9]+(c|)") - EQ_o = EQ_wildcard or EQ_config - if EQ_o: + if EQ_o := constraints["EQ"]: add_EQ_constraints(n, EQ_o.replace("EQ", "")) add_battery_constraints(n) @@ -877,7 +861,7 @@ def extra_functionality(n, snapshots): custom_extra_functionality(n, snapshots, snakemake) -def solve_network(n, config, solving, opts="", **kwargs): +def solve_network(n, config, solving, **kwargs): set_of_options = solving["solver"]["options"] cf_solving = solving["options"] @@ -905,7 +889,6 @@ def solve_network(n, config, solving, opts="", **kwargs): # add to network for extra_functionality n.config = config - n.opts = opts if rolling_horizon: kwargs["horizon"] = cf_solving.get("horizon", 365) @@ -950,15 +933,8 @@ if __name__ == "__main__": planning_horizons="2030", ) configure_logging(snakemake) - if "sector_opts" in snakemake.wildcards.keys(): - update_config_with_sector_opts( - snakemake.config, snakemake.wildcards.sector_opts - ) + update_config_from_wildcards(snakemake.config, snakemake.wildcards) - opts = snakemake.wildcards.opts - if "sector_opts" in snakemake.wildcards.keys(): - opts += "-" + snakemake.wildcards.sector_opts - opts = [o for o in opts.split("-") if o != ""] solve_opts = snakemake.params.solving["options"] np.random.seed(solve_opts.get("seed", 123)) @@ -981,7 +957,6 @@ if __name__ == "__main__": n, config=snakemake.config, solving=snakemake.params.solving, - opts=opts, log_fn=snakemake.log.solver, ) diff --git a/scripts/solve_operations_network.py b/scripts/solve_operations_network.py index dca49d02..ec0b3cc1 100644 --- a/scripts/solve_operations_network.py +++ b/scripts/solve_operations_network.py @@ -12,7 +12,7 @@ import logging import numpy as np import pypsa -from _helpers import configure_logging, update_config_with_sector_opts +from _helpers import configure_logging, update_config_from_wildcards from solve_network import prepare_network, solve_network logger = logging.getLogger(__name__) @@ -34,10 +34,8 @@ if __name__ == "__main__": ) configure_logging(snakemake) - update_config_with_sector_opts(snakemake.config, snakemake.wildcards.sector_opts) + update_config_from_wildcards(snakemake.config, snakemake.wildcards) - opts = f"{snakemake.wildcards.opts}-{snakemake.wildcards.sector_opts}".split("-") - opts = [o for o in opts if o != ""] solve_opts = snakemake.params.options np.random.seed(solve_opts.get("seed", 123)) @@ -46,9 +44,7 @@ if __name__ == "__main__": n.optimize.fix_optimal_capacities() n = prepare_network(n, solve_opts, config=snakemake.config) - n = solve_network( - n, config=snakemake.config, opts=opts, log_fn=snakemake.log.solver - ) + n = solve_network(n, config=snakemake.config, log_fn=snakemake.log.solver) n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards))) n.export_to_netcdf(snakemake.output[0]) From 89d0fa24b69f9e3ab572a65adbc73ca00f894160 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 17:38:46 +0100 Subject: [PATCH 425/497] further adjustments to latest master branch commits --- rules/build_electricity.smk | 75 ++++++++++++++++++------------------- rules/build_sector.smk | 27 +++++++------ rules/postprocess.smk | 8 ++-- rules/solve_electricity.smk | 1 + rules/solve_perfect.smk | 4 +- 5 files changed, 61 insertions(+), 54 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 5cf3c099..8a2148fc 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -250,14 +250,15 @@ rule determine_availability_matrix_MD_UA: # Optional input when having Ukraine (UA) or Moldova (MD) in the countries list -if {"UA", "MD"}.intersection(set(config["countries"])): - opt = { - "availability_matrix_MD_UA": resources( - "availability_matrix_MD-UA_{technology}.nc" - ) - } -else: - opt = {} +def input_ua_md_availability_matrix(w): + countries = set(config_provider("countries")(w)) + if {"UA", "MD"}.intersection(countries): + return { + "availability_matrix_MD_UA": resources( + "availability_matrix_MD-UA_{technology}.nc" + ) + } + return {} rule build_renewable_profiles: @@ -265,7 +266,7 @@ rule build_renewable_profiles: snapshots=config_provider("snapshots"), renewable=config_provider("renewable"), input: - **opt, + unpack(input_ua_md_availability_matrix), base_network=resources("networks/base.nc"), corine=ancient("data/bundle/corine/g250_clc06_V18_5.tif"), natura=lambda w: ( @@ -359,30 +360,28 @@ rule build_hydro_profile: "../scripts/build_hydro_profile.py" -if config["lines"]["dynamic_line_rating"]["activate"]: - - rule build_line_rating: - params: - snapshots=config_provider("snapshots"), - input: - base_network=resources("networks/base.nc"), - cutout="cutouts/" - + CDIR - + config_provider("lines", "dynamic_line_rating", "cutout") - + ".nc", - output: - output=resources("networks/line_rating.nc"), - log: - logs("build_line_rating.log"), - benchmark: - benchmarks("build_line_rating") - threads: config["atlite"].get("nprocesses", 4) - resources: - mem_mb=config["atlite"].get("nprocesses", 4) * 1000, - conda: - "../envs/environment.yaml" - script: - "../scripts/build_line_rating.py" +rule build_line_rating: + params: + snapshots=config_provider("snapshots"), + input: + base_network=resources("networks/base.nc"), + cutout="cutouts/" + + CDIR + + config_provider("lines", "dynamic_line_rating", "cutout") + + ".nc", + output: + output=resources("networks/line_rating.nc"), + log: + logs("build_line_rating.log"), + benchmark: + benchmarks("build_line_rating") + threads: config["atlite"].get("nprocesses", 4) + resources: + mem_mb=config["atlite"].get("nprocesses", 4) * 1000, + conda: + "../envs/environment.yaml" + script: + "../scripts/build_line_rating.py" def input_profile_tech(w): @@ -420,7 +419,7 @@ rule add_electricity: if config_provider("lines", "dynamic_line_rating", "activate")(w) else resources("networks/base.nc") ), - tech_costs=resources(f"costs_{config['costs']['year']}.csv"), + tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), regions=resources("regions_onshore.geojson"), powerplants=resources("powerplants.csv"), hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), @@ -463,7 +462,7 @@ rule simplify_network: costs=config_provider("costs"), input: network=resources("networks/elec.nc"), - tech_costs=resources(f"costs_{config['costs']['year']}.csv"), + tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), regions_onshore=resources("regions_onshore.geojson"), regions_offshore=resources("regions_offshore.geojson"), output: @@ -510,7 +509,7 @@ rule cluster_network: if config_provider("enable", "custom_busmap", default=False)(w) else [] ), - tech_costs=resources(f"costs_{config['costs']['year']}.csv"), + tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), output: network=resources("networks/elec_s{simpl}_{clusters}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -537,7 +536,7 @@ rule add_extra_components: costs=config_provider("costs"), input: network=resources("networks/elec_s{simpl}_{clusters}.nc"), - tech_costs=resources(f"costs_{config['costs']['year']}.csv"), + tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), output: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), log: @@ -569,7 +568,7 @@ rule prepare_network: autarky=config_provider("electricity", "autarky", default={}), input: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), - tech_costs=resources(f"costs_{config['costs']['year']}.csv"), + tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), co2_price=lambda w: resources("co2_price.csv") if "Ept" in w.opts else [], output: resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 1bbb626d..0c755834 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -435,23 +435,26 @@ rule build_industry_sector_ratios: rule build_industry_sector_ratios_intermediate: params: - industry=config["industry"], + industry=config_provider("industry"), input: - industry_sector_ratios=RESOURCES + "industry_sector_ratios.csv", - industrial_energy_demand_per_country_today=RESOURCES - + "industrial_energy_demand_per_country_today.csv", - industrial_production_per_country=RESOURCES - + "industrial_production_per_country.csv", + industry_sector_ratios=resources("industry_sector_ratios.csv"), + industrial_energy_demand_per_country_today=resources( + "industrial_energy_demand_per_country_today.csv" + ), + industrial_production_per_country=resources( + "industrial_production_per_country.csv" + ), output: - industry_sector_ratios=RESOURCES - + "industry_sector_ratios_{planning_horizons}.csv", + industry_sector_ratios=resources( + "industry_sector_ratios_{planning_horizons}.csv" + ), threads: 1 resources: mem_mb=1000, log: - LOGS + "build_industry_sector_ratios_{planning_horizons}.log", + logs("build_industry_sector_ratios_{planning_horizons}.log"), benchmark: - BENCHMARKS + "build_industry_sector_ratios_{planning_horizons}" + benchmarks("build_industry_sector_ratios_{planning_horizons}") conda: "../envs/environment.yaml" script: @@ -571,7 +574,9 @@ rule build_industrial_production_per_node: rule build_industrial_energy_demand_per_node: input: - industry_sector_ratios=resources("industry_sector_ratios_{planning_horizons}.csv"), + industry_sector_ratios=resources( + "industry_sector_ratios_{planning_horizons}.csv" + ), industrial_production_per_node=resources( "industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv" ), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index e274c502..dfcf9654 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -172,9 +172,11 @@ rule make_summary: costs=lambda w: ( resources("costs_{}.csv".format(config_provider("costs", "year")(w))) if config_provider("foresight")(w) == "overnight" - else resources("costs_{}.csv".format( - config_provider("scenario", "planning_horizons", 0) - )) + else resources( + "costs_{}.csv".format( + config_provider("scenario", "planning_horizons", 0)(w) + ) + ) ), ac_plot=expand( resources("maps/power-network-s{simpl}-{clusters}.pdf"), diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index b6a7902e..d3aa8d4c 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT + rule solve_network: params: solving=config_provider("solving"), diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index f9c5112a..723fd6a7 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -58,14 +58,14 @@ def input_network_year(w): rule prepare_perfect_foresight: params: - costs=config["costs"], + costs=config_provider("costs"), input: unpack(input_network_year), brownfield_network=lambda w: ( RESULTS + "prenetworks-brownfield/" + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_" - + "{}.nc".format(str(config_provider("scenario", "planning_horizons", 0))) + + "{}.nc".format(str(config_provider("scenario", "planning_horizons", 0)(w))) ), output: RESULTS From b8d57a6566c410e871fe4ca97096e75dc060fb0e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 16:39:10 +0000 Subject: [PATCH 426/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Snakefile | 1 - rules/solve_myopic.smk | 8 +++++--- rules/solve_perfect.smk | 10 ++++++---- scripts/prepare_network.py | 6 +++++- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Snakefile b/Snakefile index 2c342efc..a59025f9 100644 --- a/Snakefile +++ b/Snakefile @@ -47,7 +47,6 @@ RESULTS = "results/" + RDIR # RESOURCES = "resources/" - localrules: purge, diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 03cbb705..8574bbb8 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -16,9 +16,11 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs=lambda w: resources("costs_{}.csv".format( - config_provider("scenario", "planning_horizons", 0)(w) - )), + costs=lambda w: resources( + "costs_{}.csv".format( + config_provider("scenario", "planning_horizons", 0)(w) + ) + ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), existing_heating_distribution=resources( diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 723fd6a7..bba71b4d 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -14,9 +14,9 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs=resources("costs_{}.csv".format( - config_provider("scenario", "planning_horizons", 0) - )), + costs=resources( + "costs_{}.csv".format(config_provider("scenario", "planning_horizons", 0)) + ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), existing_heating_distribution=resources( @@ -65,7 +65,9 @@ rule prepare_perfect_foresight: RESULTS + "prenetworks-brownfield/" + "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_" - + "{}.nc".format(str(config_provider("scenario", "planning_horizons", 0)(w))) + + "{}.nc".format( + str(config_provider("scenario", "planning_horizons", 0)(w)) + ) ), output: RESULTS diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index e1b42243..6b782d44 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -62,7 +62,11 @@ import logging import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging, update_config_from_wildcards, set_scenario_config +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_from_wildcards, +) from add_electricity import load_costs, update_transmission_costs from pypsa.descriptors import expand_series From 709b831e06862214c1f7709406dbee91e8007310 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 17:51:26 +0100 Subject: [PATCH 427/497] further adjustments where config_provider needs to be called --- Snakefile | 1 - rules/solve_perfect.smk | 2 +- scripts/plot_summary.py | 6 +++--- scripts/prepare_network.py | 6 +++++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Snakefile b/Snakefile index 2c342efc..a59025f9 100644 --- a/Snakefile +++ b/Snakefile @@ -47,7 +47,6 @@ RESULTS = "results/" + RDIR # RESOURCES = "resources/" - localrules: purge, diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 723fd6a7..3bb006c5 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -15,7 +15,7 @@ rule add_existing_baseyear: busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), costs=resources("costs_{}.csv".format( - config_provider("scenario", "planning_horizons", 0) + config_provider("scenario", "planning_horizons", 0)(w) )), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index f0d80176..4119a811 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -584,8 +584,8 @@ if __name__ == "__main__": plot_balances() + co2_budget = snakemake.params["co2_budget"] if ( - snakemake.params["co2_budget"].startswith("cb") - or snakemake.params["foresight"] == "perfect" - ): + isinstance(co2_budget, str) and co2_budget.startswith("cb") + ) or snakemake.params["foresight"] == "perfect": plot_carbon_budget_distribution(snakemake.input.eurostat) diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index e1b42243..6b782d44 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -62,7 +62,11 @@ import logging import numpy as np import pandas as pd import pypsa -from _helpers import configure_logging, update_config_from_wildcards, set_scenario_config +from _helpers import ( + configure_logging, + set_scenario_config, + update_config_from_wildcards, +) from add_electricity import load_costs, update_transmission_costs from pypsa.descriptors import expand_series From de244414df2f36298ed5f3b36adab2b967940b1b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 16:56:01 +0000 Subject: [PATCH 428/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/solve_perfect.smk | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index a76dfb39..639bcae8 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -14,9 +14,11 @@ rule add_existing_baseyear: busmap_s=resources("busmap_elec_s{simpl}.csv"), busmap=resources("busmap_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), - costs=lambda w: resources("costs_{}.csv".format( - config_provider("scenario", "planning_horizons", 0)(w) - )), + costs=lambda w: resources( + "costs_{}.csv".format( + config_provider("scenario", "planning_horizons", 0)(w) + ) + ), cop_soil_total=resources("cop_soil_total_elec_s{simpl}_{clusters}.nc"), cop_air_total=resources("cop_air_total_elec_s{simpl}_{clusters}.nc"), existing_heating_distribution=resources( From db7c98395023e67097aecbabae0de3972a5e176b Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 18:14:18 +0100 Subject: [PATCH 429/497] mock_snakemake: remove dangeours empty list as default argument --- Snakefile | 9 --------- scripts/_helpers.py | 8 +++++--- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/Snakefile b/Snakefile index a59025f9..0bb1b665 100644 --- a/Snakefile +++ b/Snakefile @@ -30,7 +30,6 @@ if run["name"]: else: RDIR = "" -# for possibly shared resources logs = path_provider("logs/", RDIR, run["shared_resources"]) benchmarks = path_provider("benchmarks/", RDIR, run["shared_resources"]) resources = path_provider("resources/", RDIR, run["shared_resources"]) @@ -38,14 +37,6 @@ resources = path_provider("resources/", RDIR, run["shared_resources"]) CDIR = "" if run["shared_cutouts"] else RDIR RESULTS = "results/" + RDIR -# TODO: this needs to be aligned with new scenario management -# if not (shared_resources := run.get("shared_resources")): -# RESOURCES = "resources/" + RDIR -# elif isinstance(shared_resources, str): -# RESOURCES = "resources/" + shared_resources + "/" -# else: -# RESOURCES = "resources/" - localrules: purge, diff --git a/scripts/_helpers.py b/scripts/_helpers.py index f1c659ec..06e68325 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -321,7 +321,7 @@ def progress_retrieve(url, file, disable=False): def mock_snakemake( rulename, root_dir=None, - configfiles=[], + configfiles=None, submodule_dir="workflow/submodules/pypsa-eur", **wildcards, ): @@ -375,7 +375,9 @@ def mock_snakemake( if os.path.exists(p): snakefile = p break - if isinstance(configfiles, str): + if configfiles is None: + configfiles = [] + elif isinstance(configfiles, str): configfiles = [configfiles] workflow = sm.Workflow( @@ -397,7 +399,7 @@ def mock_snakemake( def make_accessable(*ios): for io in ios: - for i in range(len(io)): + for i, _ in enumerate(io): io[i] = os.path.abspath(io[i]) make_accessable(job.input, job.output, job.log) From 84c3852c2ea0a3c55d9df5f652afd8a3a5cb32d7 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 18:15:43 +0100 Subject: [PATCH 430/497] _helpers: remove resource folder separation by wildcard This was not working reliably as the number of input and output wildcards could vary, which the function did not acknowledge --- scripts/_helpers.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 06e68325..98e5aaae 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -39,10 +39,9 @@ def get_run_path(fn, dir, rdir, shared_resources): The base directory. rdir : str Relative directory for non-shared resources. - shared_resources : str, list, or bool + shared_resources : str or bool Specifies which resources should be shared. - - If string or list, assumed to be superset of wildcards for sharing. - - If "base", special handling for shared "base" resources. + - If string is "base", special handling for shared "base" resources (see notes). - If boolean, directly specifies if the resource is shared. Returns @@ -54,24 +53,23 @@ def get_run_path(fn, dir, rdir, shared_resources): ----- Special case for "base" allows no wildcards other than "technology", "year" and "scope" and excludes filenames starting with "networks/elec" or - "add_electricity". + "add_electricity". All other resources are shared. """ - pattern = r"\{([^{}]+)\}" - existing_wildcards = set(re.findall(pattern, fn)) if shared_resources == "base": - # special case for shared "base" resources + pattern = r"\{([^{}]+)\}" + existing_wildcards = set(re.findall(pattern, fn)) irrelevant_wildcards = {"technology", "year", "scope"} - no_relevant_wildcards = not len(existing_wildcards - irrelevant_wildcards) + no_relevant_wildcards = not (existing_wildcards - irrelevant_wildcards) no_elec_rule = not fn.startswith("networks/elec") and not fn.startswith( "add_electricity" ) is_shared = no_relevant_wildcards and no_elec_rule - elif isinstance(shared_resources, (str, list)): - if isinstance(shared_resources, str): - shared_resources = [shared_resources] - is_shared = (existing_wildcards).issubset(shared_resources) - else: + elif isinstance(shared_resources, bool): is_shared = shared_resources + else: + raise ValueError( + "shared_resources must be a boolean or 'base' for special handling." + ) if is_shared: return f"{dir}{fn}" From 95853bb59d492cba345d9faeda902949c4c2a48a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 18:27:59 +0100 Subject: [PATCH 431/497] _helpers: allow specifying dedicated shared_resources folder --- doc/configtables/run.csv | 2 +- scripts/_helpers.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index e2a81e0b..f619d8bf 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -4,5 +4,5 @@ scenarios,,, -- enable,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``file``." -- file,str,,"Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run: scenarios`` has to be set to ``true`` and ``run: name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combination of settings, alter and use the ``config/create_scenarios.py`` script in the ``config`` directory." disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." -shared_resources,bool/str/list,,"Switch to select whether resources should be shared across runs. If a string or list is passed, it is assumed to be wildcard(s) which indicates up to which set of wildcards the resource folder should be shared. If set to 'base', only resources before creating the elec.nc file are shared." +shared_resources,bool/str,,"Switch to select whether resources should be shared across runs. If a string is passed, this is used as a subdirectory name for shared resources. If set to 'base', only resources before creating the elec.nc file are shared." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 98e5aaae..b2b1b341 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -42,6 +42,7 @@ def get_run_path(fn, dir, rdir, shared_resources): shared_resources : str or bool Specifies which resources should be shared. - If string is "base", special handling for shared "base" resources (see notes). + - If random string other than "base", this folder is used instead of the `rdir` keyword. - If boolean, directly specifies if the resource is shared. Returns @@ -59,11 +60,14 @@ def get_run_path(fn, dir, rdir, shared_resources): pattern = r"\{([^{}]+)\}" existing_wildcards = set(re.findall(pattern, fn)) irrelevant_wildcards = {"technology", "year", "scope"} - no_relevant_wildcards = not (existing_wildcards - irrelevant_wildcards) + no_relevant_wildcards = not existing_wildcards - irrelevant_wildcards no_elec_rule = not fn.startswith("networks/elec") and not fn.startswith( "add_electricity" ) is_shared = no_relevant_wildcards and no_elec_rule + elif isinstance(shared_resources, str): + rdir = shared_resources + "/" + is_shared = True elif isinstance(shared_resources, bool): is_shared = shared_resources else: From e898781fda9fa45970a9c3df301a9cf5a5a4112e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 18:35:26 +0100 Subject: [PATCH 432/497] use wildcard input functions where applicable --- rules/build_electricity.smk | 18 +++++++++--------- rules/retrieve.smk | 2 +- scripts/_helpers.py | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 8a2148fc..f0338492 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -276,7 +276,7 @@ rule build_renewable_profiles: ), luisa=lambda w: ( "data/LUISA_basemap_020321_50m.tif" - if config_provider("renewable", w.technology, "luisa")(w) + if config_provider("renewable", w.technology, "luisa") else [] ), gebco=ancient( @@ -365,9 +365,9 @@ rule build_line_rating: snapshots=config_provider("snapshots"), input: base_network=resources("networks/base.nc"), - cutout="cutouts/" + cutout=lambda w: "cutouts/" + CDIR - + config_provider("lines", "dynamic_line_rating", "cutout") + + config_provider("lines", "dynamic_line_rating", "cutout")(w) + ".nc", output: output=resources("networks/line_rating.nc"), @@ -419,7 +419,7 @@ rule add_electricity: if config_provider("lines", "dynamic_line_rating", "activate")(w) else resources("networks/base.nc") ), - tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), regions=resources("regions_onshore.geojson"), powerplants=resources("powerplants.csv"), hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), @@ -462,7 +462,7 @@ rule simplify_network: costs=config_provider("costs"), input: network=resources("networks/elec.nc"), - tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), regions_onshore=resources("regions_onshore.geojson"), regions_offshore=resources("regions_offshore.geojson"), output: @@ -509,7 +509,7 @@ rule cluster_network: if config_provider("enable", "custom_busmap", default=False)(w) else [] ), - tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), output: network=resources("networks/elec_s{simpl}_{clusters}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -536,7 +536,7 @@ rule add_extra_components: costs=config_provider("costs"), input: network=resources("networks/elec_s{simpl}_{clusters}.nc"), - tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), output: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), log: @@ -564,11 +564,11 @@ rule prepare_network: gaslimit=config_provider("electricity", "gaslimit"), max_hours=config_provider("electricity", "max_hours"), costs=config_provider("costs"), - adjustments=config_provider("adjustments", "electricity", + adjustments=config_provider("adjustments", "electricity"), autarky=config_provider("electricity", "autarky", default={}), input: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), - tech_costs=resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), co2_price=lambda w: resources("co2_price.csv") if "Ept" in w.opts else [], output: resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 9e9ff1f0..d6fcbb26 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -84,7 +84,7 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_cost_data", T rule retrieve_cost_data: params: - version=lambda w: config_provider("costs", "version")(w), + version=config_provider("costs", "version"), output: resources("costs_{year}.csv"), log: diff --git a/scripts/_helpers.py b/scripts/_helpers.py index b2b1b341..5fb6a540 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -72,7 +72,7 @@ def get_run_path(fn, dir, rdir, shared_resources): is_shared = shared_resources else: raise ValueError( - "shared_resources must be a boolean or 'base' for special handling." + "shared_resources must be a boolean, str, or 'base' for special handling." ) if is_shared: From cc3d7a4cbb29d6ec1f3f70cfcaabfe8a053fd2ba Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 17:35:52 +0000 Subject: [PATCH 433/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/build_electricity.smk | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index f0338492..43be60fc 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -419,7 +419,9 @@ rule add_electricity: if config_provider("lines", "dynamic_line_rating", "activate")(w) else resources("networks/base.nc") ), - tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources( + f"costs_{config_provider('costs', 'year')(w)}.csv" + ), regions=resources("regions_onshore.geojson"), powerplants=resources("powerplants.csv"), hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), @@ -462,7 +464,9 @@ rule simplify_network: costs=config_provider("costs"), input: network=resources("networks/elec.nc"), - tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources( + f"costs_{config_provider('costs', 'year')(w)}.csv" + ), regions_onshore=resources("regions_onshore.geojson"), regions_offshore=resources("regions_offshore.geojson"), output: @@ -509,7 +513,9 @@ rule cluster_network: if config_provider("enable", "custom_busmap", default=False)(w) else [] ), - tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources( + f"costs_{config_provider('costs', 'year')(w)}.csv" + ), output: network=resources("networks/elec_s{simpl}_{clusters}.nc"), regions_onshore=resources("regions_onshore_elec_s{simpl}_{clusters}.geojson"), @@ -536,7 +542,9 @@ rule add_extra_components: costs=config_provider("costs"), input: network=resources("networks/elec_s{simpl}_{clusters}.nc"), - tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources( + f"costs_{config_provider('costs', 'year')(w)}.csv" + ), output: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), log: @@ -568,7 +576,9 @@ rule prepare_network: autarky=config_provider("electricity", "autarky", default={}), input: resources("networks/elec_s{simpl}_{clusters}_ec.nc"), - tech_costs=lambda w: resources(f"costs_{config_provider('costs', 'year')(w)}.csv"), + tech_costs=lambda w: resources( + f"costs_{config_provider('costs', 'year')(w)}.csv" + ), co2_price=lambda w: resources("co2_price.csv") if "Ept" in w.opts else [], output: resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), From 16793d1335f92b4b578e0f956aeac54add31c86d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 20:42:37 +0100 Subject: [PATCH 434/497] Snakefile: don't use {run} wildcard if just specifying a run name --- Snakefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Snakefile b/Snakefile index 0bb1b665..fb610c59 100644 --- a/Snakefile +++ b/Snakefile @@ -26,7 +26,9 @@ if run["name"]: if scenarios.get("enable"): fn = Path(scenarios["file"]) scenarios = yaml.safe_load(fn.read_text()) - RDIR = "{run}/" + RDIR = "{run}/" + else: + RDIR = run["name"] + "/" else: RDIR = "" From d335275e0fa32db9bea091a2b4966398dbfbbe50 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 20:43:11 +0100 Subject: [PATCH 435/497] build_electricity: add missing wildcard call --- rules/build_electricity.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 43be60fc..8e62259f 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -276,7 +276,7 @@ rule build_renewable_profiles: ), luisa=lambda w: ( "data/LUISA_basemap_020321_50m.tif" - if config_provider("renewable", w.technology, "luisa") + if config_provider("renewable", w.technology, "luisa")(w) else [] ), gebco=ancient( From 388ea658471c011e685069b1c36139a694b35c07 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 20:44:22 +0100 Subject: [PATCH 436/497] common.smk: use update_config to simplify merge_configs --- rules/common.smk | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 27f82364..a39c2d8d 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -10,7 +10,7 @@ import os, sys, glob path = workflow.source_path("../scripts/_helpers.py") sys.path.insert(0, os.path.dirname(path)) -from _helpers import validate_checksum +from snakemake.utils import update_config def get_config(config, keys, default=None): @@ -29,11 +29,7 @@ def get_config(config, keys, default=None): def merge_configs(base_config, scenario_config): """Merge base config with a specific scenario without modifying the original.""" merged = copy.deepcopy(base_config) - for key, value in scenario_config.items(): - if key in merged and isinstance(merged[key], dict): - merged[key] = merge_configs(merged[key], value) - else: - merged[key] = value + update_config(merged, scenario_config) return merged From 9f643ea429e8158e1220b5464ec8c9915eb42bf8 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 20:45:23 +0100 Subject: [PATCH 437/497] _helpers: add inplace keyword argument to update_config_from_wildcards --- rules/common.smk | 12 ++++++++++-- scripts/_helpers.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index a39c2d8d..ca339cec 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -10,6 +10,7 @@ import os, sys, glob path = workflow.source_path("../scripts/_helpers.py") sys.path.insert(0, os.path.dirname(path)) +from _helpers import validate_checksum, update_config_from_wildcards from snakemake.utils import update_config @@ -41,7 +42,10 @@ def scenario_config(scenario_name): def static_getter(wildcards, keys, default): """Getter function for static config values.""" - return get_config(config, keys, default) + config_with_wildcards = update_config_from_wildcards( + config, wildcards, inplace=False + ) + return get_config(config_with_wildcards, keys, default) def dynamic_getter(wildcards, keys, default): @@ -53,7 +57,11 @@ def dynamic_getter(wildcards, keys, default): raise ValueError( f"Scenario {scenario_name} not found in file {config['run']['scenario']['file']}." ) - return get_config(scenario_config(scenario_name), keys, default) + config_with_scenario = scenario_config(scenario_name) + config_with_wildcards = update_config_from_wildcards( + config_with_scenario, wildcards, inplace=False + ) + return get_config(config_with_wildcards, keys, default) def config_provider(*keys, default=None): diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 5fb6a540..ed60fb5b 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -8,6 +8,7 @@ import hashlib import logging import os import re +import copy import urllib from functools import partial from pathlib import Path @@ -469,13 +470,14 @@ def parse(infix): return {infix.pop(0): parse(infix)} -def update_config_from_wildcards(config, w): +def update_config_from_wildcards(config, w, inplace=True): """ Parses configuration settings from wildcards and updates the config. - - - TODO: Should be run inside config_provider function. """ + if not inplace: + config = copy.deepcopy(config) + if w.get("opts"): opts = w.opts.split("-") @@ -641,6 +643,9 @@ def update_config_from_wildcards(config, w): infix = o.split("+")[1:] update_config(config, parse(infix)) + if not inplace: + return config + def get_checksum_from_zenodo(file_url): parts = file_url.split("/") From 68f2e086c5c0f896de630d0327670d55ab4148e5 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 20:48:17 +0100 Subject: [PATCH 438/497] postprocess.smk: add missing wildcard call --- rules/postprocess.smk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index dfcf9654..fe5a8c62 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -189,21 +189,21 @@ rule make_summary: **config["scenario"], run=config["run"]["name"], ), - h2_plot=expand( + h2_plot=lambda w: expand( ( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-h2_network_{planning_horizons}.pdf" - if config_provider("sector", "H2_network") + if config_provider("sector", "H2_network")(w) else [] ), **config["scenario"], run=config["run"]["name"], ), - ch4_plot=expand( + ch4_plot=lambda w: expand( ( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-ch4_network_{planning_horizons}.pdf" - if config_provider("sector", "gas_network") + if config_provider("sector", "gas_network")(w) else [] ), **config["scenario"], From b543bf37c99bd757319869211cccf22b89b22154 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 20:48:46 +0100 Subject: [PATCH 439/497] retrieve.smk: do not protect gas network data --- rules/retrieve.smk | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index d6fcbb26..766e7cf9 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -169,9 +169,7 @@ if config["enable"]["retrieve"]: rule retrieve_gas_infrastructure_data: output: - protected( - expand("data/gas_network/scigrid-gas/data/{files}", files=datafiles) - ), + expand("data/gas_network/scigrid-gas/data/{files}", files=datafiles), log: "logs/retrieve_gas_infrastructure_data.log", retries: 2 From 945180f153055036bcc67f633f39042299c76aa8 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 23:36:46 +0100 Subject: [PATCH 440/497] allow_missing in collection rules, fixes for myopic, wildcard constraints without function --- config/config.default.yaml | 2 +- rules/build_sector.smk | 12 ++++---- rules/common.smk | 7 +++-- rules/postprocess.smk | 45 +++++++++++++--------------- rules/solve_electricity.smk | 23 +++++++------- rules/solve_myopic.smk | 40 +++++++++++++------------ rules/solve_overnight.smk | 5 ++-- rules/solve_perfect.smk | 13 ++++---- scripts/base_network.py | 2 +- scripts/build_electricity_demand.py | 2 +- scripts/prepare_perfect_foresight.py | 2 +- 11 files changed, 79 insertions(+), 74 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 403b7269..1e7c87ce 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -25,7 +25,7 @@ run: enable: false file: config/scenarios.yaml disable_progressbar: false - shared_resources: false # TODO: splitting resources by wildcard does not work well, neither does true, only base works well + shared_resources: false shared_cutouts: true # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#foresight diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 0c755834..9e8bcb90 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -791,8 +791,6 @@ rule build_existing_heating_distribution: existing_heating_distribution=resources( "existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv" ), - wildcard_constraints: - planning_horizons=config_provider("scenario", "planning_horizons", 0), #only applies to baseyear threads: 1 resources: mem_mb=2000, @@ -934,12 +932,12 @@ rule prepare_sector_network: resources: mem_mb=2000, log: - logs( - "prepare_sector_network_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + RESULTS + + "logs/prepare_sector_network_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", benchmark: - benchmarks( - "prepare_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ( + RESULTS + + "benchmarks/prepare_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" diff --git a/rules/common.smk b/rules/common.smk index ca339cec..9c41b57b 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -136,10 +136,11 @@ def input_eurostat(w): return f"data/bundle-sector/eurostat-energy_balances-june_{report_year}_edition" -def solved_previous_horizon(wildcards): - planning_horizons = config_provider("scenario", "planning_horizons") - i = planning_horizons.index(int(wildcards.planning_horizons)) +def solved_previous_horizon(w): + planning_horizons = config_provider("scenario", "planning_horizons")(w) + i = planning_horizons.index(int(w.planning_horizons)) planning_horizon_p = str(planning_horizons[i - 1]) + return ( RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_" diff --git a/rules/postprocess.smk b/rules/postprocess.smk index fe5a8c62..dc08699f 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -43,12 +43,12 @@ if config["foresight"] != "perfect": resources: mem_mb=10000, log: - logs( - "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + RESULTS + + "logs/plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", benchmark: - benchmarks( - "plot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ( + RESULTS + + "benchmarksplot_power_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" @@ -70,12 +70,12 @@ if config["foresight"] != "perfect": resources: mem_mb=10000, log: - logs( - "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + RESULTS + + "logs/plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", benchmark: - benchmarks( - "plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ( + RESULTS + + "benchmarks/plot_hydrogen_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" @@ -96,12 +96,12 @@ if config["foresight"] != "perfect": resources: mem_mb=10000, log: - logs( - "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + RESULTS + + "logs/plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", benchmark: - benchmarks( - "plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ( + RESULTS + + "benchmarks/plot_gas_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" @@ -131,10 +131,6 @@ if config["foresight"] == "perfect": threads: 2 resources: mem_mb=10000, - benchmark: - benchmarks( - "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_benchmark" - ) conda: "../envs/environment.yaml" script: @@ -167,7 +163,7 @@ rule make_summary: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", **config["scenario"], - run=config["run"]["name"], + allow_missing=True, ), costs=lambda w: ( resources("costs_{}.csv".format(config_provider("costs", "year")(w))) @@ -181,13 +177,13 @@ rule make_summary: ac_plot=expand( resources("maps/power-network-s{simpl}-{clusters}.pdf"), **config["scenario"], - run=config["run"]["name"], + allow_missing=True, ), costs_plot=expand( RESULTS + "maps/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", **config["scenario"], - run=config["run"]["name"], + allow_missing=True, ), h2_plot=lambda w: expand( ( @@ -197,7 +193,7 @@ rule make_summary: else [] ), **config["scenario"], - run=config["run"]["name"], + allow_missing=True, ), ch4_plot=lambda w: expand( ( @@ -207,7 +203,7 @@ rule make_summary: else [] ), **config["scenario"], - run=config["run"]["name"], + allow_missing=True, ), output: nodal_costs=RESULTS + "csvs/nodal_costs.csv", @@ -245,6 +241,7 @@ rule plot_summary: plotting=config_provider("plotting"), foresight=config_provider("foresight"), co2_budget=config_provider("co2_budget"), + sector=config_provider("sector"), RDIR=RDIR, input: costs=RESULTS + "csvs/costs.csv", diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index d3aa8d4c..6ddbc415 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -19,11 +19,13 @@ rule solve_network: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", log: solver=normpath( - logs("solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_solver.log") + RESULTS + + "logs/solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_solver.log" ), - python=logs("solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_python.log"), + python=RESULTS + + "logs/solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_python.log", benchmark: - benchmarks("solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}") + RESULTS + "benchmarks/solve_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}" threads: solver_threads resources: mem_mb=memory, @@ -45,15 +47,16 @@ rule solve_operations_network: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op.nc", log: solver=normpath( - logs( - "solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_solver.log" - ) - ), - python=logs( - "solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_python.log" + RESULTS + + "logs/solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_solver.log" ), + python=RESULTS + + "logs/solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}_op_python.log", benchmark: - benchmarks("solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}") + ( + RESULTS + + "benchmarks/solve_operations_network/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}" + ) threads: 4 resources: mem_mb=(lambda w: 10000 + 372 * int(w.clusters)), diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 8574bbb8..5eb30233 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -33,17 +33,20 @@ rule add_existing_baseyear: RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", wildcard_constraints: - planning_horizons=config_provider("scenario", "planning_horizons", 0), #only applies to baseyear + # TODO: The first planning_horizon needs to be aligned across scenarios + # snakemake does not support passing functions to wildcard_constraints + # reference: https://github.com/snakemake/snakemake/issues/2703 + planning_horizons=config["scenario"]["planning_horizons"][0], #only applies to baseyear threads: 1 resources: mem_mb=2000, log: - logs( - "add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + RESULTS + + "logs/add_existing_baseyear_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log", benchmark: - benchmarks( - "add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ( + RESULTS + + "benchmarks/add_existing_baseyear/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" @@ -85,12 +88,12 @@ rule add_brownfield: resources: mem_mb=10000, log: - logs( - "add_brownfield_elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.log" - ), + RESULTS + + "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}" + ( + RESULTS + + "benchmarks/add_brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" @@ -121,19 +124,18 @@ rule solve_sector_network_myopic: shadow: "shallow" log: - solver=logs( - "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log" - ), - python=logs( - "elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log" - ), + solver=RESULTS + + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log", + python=RESULTS + + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", threads: solver_threads resources: mem_mb=config_provider("solving", "mem"), walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: - benchmarks( - "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ( + RESULTS + + "benchmarks/solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index 64ad007c..69e2f364 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -33,8 +33,9 @@ rule solve_sector_network: mem_mb=config_provider("solving", "mem"), walltime=config_provider("solving", "walltime", default="12:00:00"), benchmark: - benchmarks( - "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" + ( + RESULTS + + "benchmarks/solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}" ) conda: "../envs/environment.yaml" diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 639bcae8..d3badcb0 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -32,7 +32,7 @@ rule add_existing_baseyear: RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", wildcard_constraints: - planning_horizons=config_provider("scenario", "planning_horizons", 0), #only applies to baseyear + planning_horizons=config["scenario"]["planning_horizons"][0], #only applies to baseyear threads: 1 resources: mem_mb=2000, @@ -53,7 +53,8 @@ rule add_existing_baseyear: def input_network_year(w): return { f"network_{year}": RESULTS - + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{year}.nc" + + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}" + + f"_{year}.nc" for year in config_provider("scenario", "planning_horizons")(w)[1:] } @@ -61,6 +62,7 @@ def input_network_year(w): rule prepare_perfect_foresight: params: costs=config_provider("costs"), + time_resolution=config_provider("clustering", "temporal", "sector"), input: unpack(input_network_year), brownfield_network=lambda w: ( @@ -98,7 +100,7 @@ rule solve_sector_network_perfect: sector=config_provider("sector"), planning_horizons=config_provider("scenario", "planning_horizons"), co2_sequestration_potential=config_provider( - "sector", "co2_sequestration_potential", 200 + "sector", "co2_sequestration_potential", default=200 ), custom_extra_functionality=input_custom_extra_functionality, input: @@ -122,8 +124,9 @@ rule solve_sector_network_perfect: memory=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years_memory.log", benchmark: - benchmarks( - "solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years}" + ( + RESULTS + + "benchmarks/solve_sector_network/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_brownfield_all_years}" ) conda: "../envs/environment.yaml" diff --git a/scripts/base_network.py b/scripts/base_network.py index d83e0588..515ae481 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -767,7 +767,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("base_network", run="network2019") + snakemake = mock_snakemake("base_network") configure_logging(snakemake) set_scenario_config(snakemake) diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index 4415c835..47befb8a 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -258,7 +258,7 @@ if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake - snakemake = mock_snakemake("build_electricity_demand", run="network2019") + snakemake = mock_snakemake("build_electricity_demand") configure_logging(snakemake) set_scenario_config(snakemake) diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index 2f2ff608..7f312a8f 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -517,7 +517,7 @@ if __name__ == "__main__": # temporal aggregate solver_name = snakemake.config["solving"]["solver"]["name"] - segments = snakemake.params["clustering"]["temporal"]["resolution_sector"] + segments = snakemake.params.time_resolution if isinstance(segments, (int, float)): n = apply_time_segmentation_perfect(n, segments, solver_name=solver_name) From 770d3526520ec1f3e814d7b694344d9d17888989 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 23:37:31 +0100 Subject: [PATCH 441/497] handle that time_resolution can be float --- scripts/prepare_network.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 6b782d44..72f4963a 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -291,7 +291,7 @@ def set_line_nom_max( n.lines["s_nom_max"] = n.lines["s_nom"] + s_nom_max_ext if np.isfinite(p_nom_max_ext) and p_nom_max_ext > 0: - logger.info(f"Limiting line extensions to {p_nom_max_ext} MW") + logger.info(f"Limiting link extensions to {p_nom_max_ext} MW") hvdc = n.links.index[n.links.carrier == "DC"] n.links.loc[hvdc, "p_nom_max"] = n.links.loc[hvdc, "p_nom"] + p_nom_max_ext @@ -322,13 +322,16 @@ if __name__ == "__main__": set_line_s_max_pu(n, snakemake.params.lines["s_max_pu"]) # temporal averaging - if nhours := snakemake.params.time_resolution: - n = average_every_nhours(n, nhours) + time_resolution = snakemake.params.time_resolution + is_string = isinstance(time_resolution, str) + if is_string and time_resolution.lower().endswith("h"): + n = average_every_nhours(n, time_resolution) # segments with package tsam - if time_seg := snakemake.params.time_resolution: + if is_string and time_resolution.lower().endswith("seg"): solver_name = snakemake.config["solving"]["solver"]["name"] - n = apply_time_segmentation(n, time_seg.replace("seg", ""), solver_name) + segments = int(time_resolution.replace("seg", "")) + n = apply_time_segmentation(n, segments, solver_name) if snakemake.params.co2limit_enable: add_co2limit(n, snakemake.params.co2limit, Nyears) From cf7018c8c44e56d0dfcfb295e5a50d1c5aeaf578 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 23:38:00 +0100 Subject: [PATCH 442/497] plot_summary: remove leftover references to opts wildcard --- scripts/plot_summary.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index 4119a811..82222620 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -428,13 +428,13 @@ def historical_emissions(countries): ) emissions = co2_totals.loc["electricity"] - if "T" in opts: + if options["transport"]: emissions += co2_totals.loc[[i + " non-elec" for i in ["rail", "road"]]].sum() - if "H" in opts: + if options["heating"]: emissions += co2_totals.loc[ [i + " non-elec" for i in ["residential", "services"]] ].sum() - if "I" in opts: + if options["industry"]: emissions += co2_totals.loc[ [ "industrial non-elec", @@ -448,7 +448,7 @@ def historical_emissions(countries): return emissions -def plot_carbon_budget_distribution(input_eurostat): +def plot_carbon_budget_distribution(input_eurostat, options): """ Plot historical carbon emissions in the EU and decarbonization path. """ @@ -470,7 +470,7 @@ def plot_carbon_budget_distribution(input_eurostat): e_1990 = co2_emissions_year( countries, input_eurostat, - opts, + options, emissions_scope, report_year, input_co2, @@ -588,4 +588,5 @@ if __name__ == "__main__": if ( isinstance(co2_budget, str) and co2_budget.startswith("cb") ) or snakemake.params["foresight"] == "perfect": - plot_carbon_budget_distribution(snakemake.input.eurostat) + options = snakemake.params.sector + plot_carbon_budget_distribution(snakemake.input.eurostat, options) From df0eb38a68a0fe1d93eab2d57ac7a8dd19cbf16d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 17 Feb 2024 23:38:59 +0100 Subject: [PATCH 443/497] _helpers: generalise regular expression in find_opt --- scripts/_helpers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index ed60fb5b..d30f205c 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -4,11 +4,11 @@ # SPDX-License-Identifier: MIT import contextlib +import copy import hashlib import logging import os import re -import copy import urllib from functools import partial from pathlib import Path @@ -117,9 +117,9 @@ def find_opt(opts, expr): """ for o in opts: if expr in o: - m = re.findall("^m?\d*(\.|p)?\d+$", o) + m = re.findall(r"m?\d+(?:[\.p]\d+)?", o) if len(m) > 0: - return True, float(m[0].replace("p", ".").replace("m", "-")) + return True, float(m[-1].replace("p", ".").replace("m", "-")) else: return True, None return False, None From d7935e1c065f8a0437190bb691e88a6a0e44272e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 09:45:37 +0100 Subject: [PATCH 444/497] revert part of #925 so that config.default.yaml is still copied and config.yaml remains untracked --- Snakefile | 10 +++++++--- config/config.yaml | 8 -------- 2 files changed, 7 insertions(+), 11 deletions(-) delete mode 100644 config/config.yaml diff --git a/Snakefile b/Snakefile index ee24841a..ca3e4c49 100644 --- a/Snakefile +++ b/Snakefile @@ -1,9 +1,9 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT -from os.path import normpath -from shutil import move, rmtree +from os.path import normpath, exists +from shutil import copyfile, move, rmtree from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider @@ -13,6 +13,10 @@ from snakemake.utils import min_version min_version("7.7") +conf_file = os.path.join(workflow.current_basedir, "config/config.yaml") +conf_default_file = os.path.join(workflow.current_basedir, "config/config.default.yaml") +if not exists(conf_file) and exists(conf_default_file): + copyfile(conf_default_file, conf_file) configfile: "config/config.default.yaml" configfile: "config/config.yaml" diff --git a/config/config.yaml b/config/config.yaml deleted file mode 100644 index efe2ccb2..00000000 --- a/config/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-FileCopyrightText: : 2024 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: CC0-1.0 -# add your own configuration overrides here, for instance - -version: 0.9.0 -# enable: -# retrieve: false From 3e612950c203f6c2774df7b4c71a185f8541d75d Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 09:45:37 +0100 Subject: [PATCH 445/497] revert part of #925 so that config.default.yaml is still copied and config.yaml remains untracked --- Snakefile | 10 +++++++--- config/config.yaml | 8 -------- doc/release_notes.rst | 3 +-- 3 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 config/config.yaml diff --git a/Snakefile b/Snakefile index ee24841a..ca3e4c49 100644 --- a/Snakefile +++ b/Snakefile @@ -1,9 +1,9 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT -from os.path import normpath -from shutil import move, rmtree +from os.path import normpath, exists +from shutil import copyfile, move, rmtree from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider @@ -13,6 +13,10 @@ from snakemake.utils import min_version min_version("7.7") +conf_file = os.path.join(workflow.current_basedir, "config/config.yaml") +conf_default_file = os.path.join(workflow.current_basedir, "config/config.default.yaml") +if not exists(conf_file) and exists(conf_default_file): + copyfile(conf_default_file, conf_file) configfile: "config/config.default.yaml" configfile: "config/config.yaml" diff --git a/config/config.yaml b/config/config.yaml deleted file mode 100644 index efe2ccb2..00000000 --- a/config/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-FileCopyrightText: : 2024 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: CC0-1.0 -# add your own configuration overrides here, for instance - -version: 0.9.0 -# enable: -# retrieve: false diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 7feb4d72..68148086 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -34,8 +34,7 @@ Upcoming Release applied. * The default configuration ``config/config.default.yaml`` is now automatically - used as a base configuration file and no longer copied to - ``config/config.yaml`` on first use. The file ``config/config.yaml`` should be + used as a base configuration file. The file ``config/config.yaml`` should be used to define deviations from the default configuration. * Merged two OPSD time series data versions into such that the option ``load: From 20e37c232fc156aa998954a8b76eecfaaec5c338 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 09:55:45 +0100 Subject: [PATCH 446/497] copy a scenarios.yaml from scenarios.template.yaml so it is not git tracked --- Snakefile | 13 +++++++++---- config/{scenarios.yaml => scenarios.template.yaml} | 0 2 files changed, 9 insertions(+), 4 deletions(-) rename config/{scenarios.yaml => scenarios.template.yaml} (100%) diff --git a/Snakefile b/Snakefile index 1c8e1323..4f35dd74 100644 --- a/Snakefile +++ b/Snakefile @@ -16,10 +16,15 @@ from scripts._helpers import path_provider min_version("7.7") HTTP = HTTPRemoteProvider() -conf_file = os.path.join(workflow.current_basedir, "config/config.yaml") -conf_default_file = os.path.join(workflow.current_basedir, "config/config.default.yaml") -if not exists(conf_file) and exists(conf_default_file): - copyfile(conf_default_file, conf_file) +default_files = { + "config/config.default.yaml": "config/config.yaml", + "config/scenarios.template.yaml": "config/scenarios.yaml", +} +for template, target in default_files.items(): + target = os.path.join(workflow.current_basedir, target) + template = os.path.join(workflow.current_basedir, template) + if not exists(target) and exists(template): + copyfile(template, target) configfile: "config/config.default.yaml" configfile: "config/config.yaml" diff --git a/config/scenarios.yaml b/config/scenarios.template.yaml similarity index 100% rename from config/scenarios.yaml rename to config/scenarios.template.yaml From 831f0779b3f0f333dc4527d473dc725c3d1c3bed Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 18 Feb 2024 08:57:24 +0000 Subject: [PATCH 447/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Snakefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Snakefile b/Snakefile index 4f35dd74..2ab6bdc7 100644 --- a/Snakefile +++ b/Snakefile @@ -26,6 +26,7 @@ for template, target in default_files.items(): if not exists(target) and exists(template): copyfile(template, target) + configfile: "config/config.default.yaml" configfile: "config/config.yaml" From 67acbbda8a015d981f09f9a8b7f61b103da028ae Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 10:24:26 +0100 Subject: [PATCH 448/497] run: name: all will collect all keys from scenarios.yaml if run: scenarios: enable: true --- Snakefile | 16 ++++++++-------- doc/configtables/run.csv | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Snakefile b/Snakefile index 4f35dd74..1f02b877 100644 --- a/Snakefile +++ b/Snakefile @@ -10,7 +10,6 @@ import yaml from snakemake.remote.HTTP import RemoteProvider as HTTPRemoteProvider from snakemake.utils import min_version -# TODO: check if this works with mock_snakemake from scripts._helpers import path_provider min_version("7.7") @@ -32,13 +31,14 @@ configfile: "config/config.yaml" run = config["run"] scenarios = run.get("scenarios", {}) -if run["name"]: - if scenarios.get("enable"): - fn = Path(scenarios["file"]) - scenarios = yaml.safe_load(fn.read_text()) - RDIR = "{run}/" - else: - RDIR = run["name"] + "/" +if run["name"] and scenarios.get("enable"): + fn = Path(scenarios["file"]) + scenarios = yaml.safe_load(fn.read_text()) + RDIR = "{run}/" + if run["name"] == "all": + config["run"]["name"] = list(scenarios.keys()) +elif run["name"]: + RDIR = run["name"] + "/" else: RDIR = "" diff --git a/doc/configtables/run.csv b/doc/configtables/run.csv index f619d8bf..2835a324 100644 --- a/doc/configtables/run.csv +++ b/doc/configtables/run.csv @@ -1,8 +1,8 @@ ,Unit,Values,Description -name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenario: enable`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenario: file``." +name,--,str/list,"Specify a name for your run. Results will be stored under this name. If ``scenario: enable:`` is set to ``true``, the name must contain a subset of scenario names defined in ``scenario: file:``. If the name is 'all', all defined scenarios will be run." scenarios,,, -- enable,bool,"{true, false}","Switch to select whether workflow should generate scenarios based on ``file``." -- file,str,,"Path to the scenario yaml file. The scenario file contains config overrides for each scenario. In order to be taken account, ``run: scenarios`` has to be set to ``true`` and ``run: name`` has to be a subset of top level keys given in the scenario file. In order to automatically create a `scenario.yaml` file based on a combination of settings, alter and use the ``config/create_scenarios.py`` script in the ``config`` directory." -disable_progrssbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." +disable_progressbar,bool,"{true, false}","Switch to select whether progressbar should be disabled." shared_resources,bool/str,,"Switch to select whether resources should be shared across runs. If a string is passed, this is used as a subdirectory name for shared resources. If set to 'base', only resources before creating the elec.nc file are shared." shared_cutouts,bool,"{true, false}","Switch to select whether cutouts should be shared across runs." From 83f1b5e41d0030083ea5b84d7f305549035cc752 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 10:40:44 +0100 Subject: [PATCH 449/497] Add rule create_scenarios that runs config/create_scenarios.py on request --- Snakefile | 7 +++++++ config/create_scenarios.py | 16 ++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Snakefile b/Snakefile index 1f02b877..344b0934 100644 --- a/Snakefile +++ b/Snakefile @@ -93,6 +93,13 @@ rule all: default_target: True +rule create_scenarios: + output: + config["run"]["scenarios"]["file"], + script: + "config/create_scenarios.py" + + rule purge: run: import builtins diff --git a/config/create_scenarios.py b/config/create_scenarios.py index 40a3c331..4c407058 100644 --- a/config/create_scenarios.py +++ b/config/create_scenarios.py @@ -1,11 +1,15 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT # This script helps to generate a scenarios.yaml file for PyPSA-Eur. # You can modify the template to your needs and define all possible combinations of config values that should be considered. +if "snakemake" in globals(): + filename = snakemake.output[0] +else: + filename = "../config/scenarios.yaml" import itertools @@ -14,23 +18,23 @@ import itertools template = """ scenario{scenario_number}: config_section: - config_value: {config_value} - + config_key: {config_value} config_section2: config_key2: {config_value2} """ # Define all possible combinations of config values. # This must define all config values that are used in the template. -config_values = dict(config_values=["true", "false"], config_values2=[1, 2, 3, 4, 5]) +config_values = dict( + config_value=["true", "false"], + config_value2=[1, 2, 3, 4] +) combinations = [ dict(zip(config_values.keys(), values)) for values in itertools.product(*config_values.values()) ] -# write the scenarios to a file -filename = "../config/scenarios.yaml" with open(filename, "w") as f: for i, config in enumerate(combinations): f.write(template.format(scenario_number=i, **config)) From 1fb90da743e54a096f2c193b615cdbc8f7a059d5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 18 Feb 2024 09:42:20 +0000 Subject: [PATCH 450/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- config/create_scenarios.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/config/create_scenarios.py b/config/create_scenarios.py index 4c407058..cccc29bc 100644 --- a/config/create_scenarios.py +++ b/config/create_scenarios.py @@ -25,10 +25,7 @@ scenario{scenario_number}: # Define all possible combinations of config values. # This must define all config values that are used in the template. -config_values = dict( - config_value=["true", "false"], - config_value2=[1, 2, 3, 4] -) +config_values = dict(config_value=["true", "false"], config_value2=[1, 2, 3, 4]) combinations = [ dict(zip(config_values.keys(), values)) From 8e04b7a1573f305b5065a6a83b605608e9f73f3c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 11:03:37 +0100 Subject: [PATCH 451/497] test.sh: add scenarios dry-run to test cases --- Snakefile | 2 ++ ...config.scenarios.electricity.yaml => config.scenarios.yaml} | 2 +- config/test/{scenarios.electricity.yaml => scenarios.yaml} | 0 test.sh | 3 ++- 4 files changed, 5 insertions(+), 2 deletions(-) rename config/test/{config.scenarios.electricity.yaml => config.scenarios.yaml} (95%) rename config/test/{scenarios.electricity.yaml => scenarios.yaml} (100%) diff --git a/Snakefile b/Snakefile index 7487b3d5..78a28373 100644 --- a/Snakefile +++ b/Snakefile @@ -97,6 +97,8 @@ rule all: rule create_scenarios: output: config["run"]["scenarios"]["file"], + conda: + "envs/retrieve.yaml" script: "config/create_scenarios.py" diff --git a/config/test/config.scenarios.electricity.yaml b/config/test/config.scenarios.yaml similarity index 95% rename from config/test/config.scenarios.electricity.yaml rename to config/test/config.scenarios.yaml index dde138ed..8ecbb91b 100644 --- a/config/test/config.scenarios.electricity.yaml +++ b/config/test/config.scenarios.yaml @@ -10,7 +10,7 @@ run: - test-elec-no-onshore-wind scenarios: enable: true - file: "config/test/scenarios.electricity.yaml" + file: "config/test/scenarios.yaml" disable_progressbar: true shared_resources: base shared_cutouts: true diff --git a/config/test/scenarios.electricity.yaml b/config/test/scenarios.yaml similarity index 100% rename from config/test/scenarios.electricity.yaml rename to config/test/scenarios.yaml diff --git a/test.sh b/test.sh index a40276b8..c36ce5cd 100755 --- a/test.sh +++ b/test.sh @@ -5,4 +5,5 @@ snakemake -call solve_elec_networks --configfile config/test/config.electricity.yaml --rerun-triggers=mtime && \ snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime && \ snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime && \ -snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime +snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime && \ +snakemake -call all --configfile config/test/config.scenarios.yaml --rerun-triggers=mtime -n && \ From 38c90155f1b7b3661335b9c722925e6e2c0d8c3e Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 11:48:55 +0100 Subject: [PATCH 452/497] add release notes --- doc/release_notes.rst | 71 +++++++++++++++++++++++++++++++++++++++---- rules/validate.smk | 5 +-- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index c216fd35..0e96f013 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,12 +10,71 @@ Release Notes Upcoming Release ================ -* PyPSA-EUR now supports the simultaneous execution of multiple scenarios. For - this purpose, a scenarios.yaml file has been introduced which contains - customizable scenario names with corresponding configuration overrides. To - enable it, set the ``run: scenarios:`` key to ``True`` and define the scenario - names to run under ``run: name:`` in the configuration file. The latter must - be a subset of toplevel keys in the scenario file. +* Added new scenario management that supports the simultaneous execution of + multiple scenarios with a single ``snakemake`` call. For this purpose, a + ``scenarios.yaml`` file is introduced which contains customizable scenario + names with configuration overrides. To enable it, set the ``run: scenarios: + true`` and define the list of scenario names to run under ``run: name:`` in + the configuration file. The latter must be a subset of toplevel keys in the + scenario file. + + - To get started, a scenarios template file ``config/scenarios.template.yaml`` + is included in the repository, which is copied to ``config/scenarios.yaml`` + on first use. + + - The scenario file can be changed via ``run: scenarios: file:``. + + - If scenario management is activated with ``run: scenarios: enable: true``, a + new wildcard ``{run}`` is introduced. This means that the configuration + settings may depend on the new ``{run}`` wildcard. Therefore, a new + ``config_provider()`` function is used in the ``Snakefile`` and ``.smk`` + files, which takes wildcard values into account. The calls to the ``config`` + object have been reduced in ``.smk`` files since there is no awareness of + wildcard values outside rule definitions. + + - The scenario files can also be programmatically created using the template + script ``config/create_scenarios.py``. This script can be run with + ``snakemake -j1 create_scenarios`` and creates the scenarios file referenced + under ``run: scenarios: file:``. + + - The setting ``run: name: all`` will run all scenarios in + ``config/scenarios.yaml``. Otherwise, it will run those passed as list in + ``run: name:`` as long as ``run: scenarios: enable: true``. + + - The setting ``run: shared_resources:`` indicates via a boolean whether the + resources should be encapsulated by the ``run: name:``. The special setting + ``run: shared_resources: base`` shares resources until ``add_electricity`` + that do not contain wildcards other than ``{"technology", "year", + "scope"}``. + + - Added new configuration options for all ``{opts}`` and ``{sector_opts}`` + wildcard values to create a unique configuration file (``config.yaml``) per + PyPSA network file. This is done with the help of a new function + ``update_config_from_wildcards()`` which parses configuration settings from + wildcards and updates the ``snakemake.config`` object. These updated + configuration settings are used in the scripts rather than directly parsed + values from ``snakemake.wildcards``. + + - The cost data was moved from ``data/costs_{year}.csv`` to + ``resources/costs_{year}.csv`` since it depends on configuration settings. + The ``retrieve_cost_data`` rule was changed to calling a Python script. + + - Moved time clustering settings to ``clustering: temporal:`` from + ``snapshots:`` so that the latter is only used to define the + ``pandas.DatetimeIndex`` which simplifies the scenario management. + + - Collection rules get a new wildcard ``run=config["run"]["name"]`` so they + can collect outputs across different scenarios. + + - **Warning:** One caveat remains for the scenario management with myopic or + perfect foresight pathway optimisation. The first investment period must be + shared across all scenarios. The reason is that the ``wildcard_constraints`` + defined for the rule ``add_existing_baseyear`` do not accept wildcard-aware + input functions (cf. + `https://github.com/snakemake/snakemake/issues/2703`_). + +* The outputs of the rule ``retrieve_gas_infrastructure_data`` no longer + marked as ``protected()`` as the download size is small. * Improved representation of industry transition pathways. A new script was added to interpolate industry sector ratios from today's status quo to future diff --git a/rules/validate.smk b/rules/validate.smk index ec2d87cb..60a6ca50 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -17,10 +17,7 @@ rule build_electricity_production: The data is used for validation of the optimization results. """ params: - snapshots=lambda w: { - k: config_provider("snapshots", k)(w) - for k in ["start", "end", "inclusive"] - }, + snapshots=config_provider("snapshots"), countries=config_provider("countries"), output: resources("historical_electricity_production.csv"), From d6e710e74ae0dde3ff16c158ec5d4b1bfe990854 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sun, 18 Feb 2024 11:51:46 +0100 Subject: [PATCH 453/497] test.sh: patch end-of-file --- test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test.sh b/test.sh index c36ce5cd..d6007750 100755 --- a/test.sh +++ b/test.sh @@ -6,4 +6,4 @@ snakemake -call solve_elec_networks --configfile config/test/config.electricity. snakemake -call all --configfile config/test/config.overnight.yaml --rerun-triggers=mtime && \ snakemake -call all --configfile config/test/config.myopic.yaml --rerun-triggers=mtime && \ snakemake -call all --configfile config/test/config.perfect.yaml --rerun-triggers=mtime && \ -snakemake -call all --configfile config/test/config.scenarios.yaml --rerun-triggers=mtime -n && \ +snakemake -call all --configfile config/test/config.scenarios.yaml --rerun-triggers=mtime -n From bbdcf0e055f12074422267f4342c12577cab532a Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 19 Feb 2024 16:20:28 +0100 Subject: [PATCH 454/497] bump technology-data version to 0.8.0 --- config/config.default.yaml | 2 +- doc/release_notes.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 91f38b91..b4d96b12 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -662,7 +662,7 @@ industry: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs costs: year: 2030 - version: v0.7.0 + version: v0.8.0 rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) social_discountrate: 0.02 fill_values: diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 68148086..e0e0d22b 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -61,7 +61,7 @@ Upcoming Release * The filtering of power plants in the ``config.default.yaml`` has been updated regarding phased-out power plants in 2023. -* Upgrade techno-economic assumptions to ``technology-data`` v0.7.0. +* Upgrade techno-economic assumptions to ``technology-data`` v0.8.0. * Bugfix: Correct technology keys for the electricity production plotting to work out the box. From 16e2286188d25e40056296fa979c59564ae45887 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 19 Feb 2024 16:21:48 +0100 Subject: [PATCH 455/497] update copyright years to 2024 --- .gitattributes | 2 +- .github/workflows/ci.yaml | 2 +- .gitignore | 2 +- .readthedocs.yml | 2 +- .reuse/dep5 | 16 ++++++++-------- .sync-send | 2 +- LICENSES/MIT.txt | 2 +- README.md | 2 +- config/config.default.yaml | 2 +- config/config.entsoe-all.yaml | 2 +- config/config.perfect.yaml | 2 +- config/config.validation.yaml | 2 +- config/test/config.electricity.yaml | 2 +- config/test/config.myopic.yaml | 2 +- config/test/config.overnight.yaml | 2 +- config/test/config.perfect.yaml | 2 +- doc/Makefile | 2 +- doc/configuration.rst | 2 +- doc/contributing.rst | 2 +- doc/costs.rst | 2 +- doc/foresight.rst | 2 +- doc/index.rst | 2 +- doc/installation.rst | 2 +- doc/introduction.rst | 2 +- doc/licenses.rst | 2 +- doc/limitations.rst | 2 +- doc/make.bat | 2 +- doc/plotting.rst | 2 +- doc/preparation.rst | 2 +- doc/publications.bib | 2 +- doc/publications.rst | 2 +- doc/release_notes.rst | 2 +- doc/requirements.txt | 2 +- doc/retrieve.rst | 2 +- doc/sector.rst | 2 +- doc/simplification.rst | 2 +- doc/solving.rst | 2 +- doc/spatial_resolution.rst | 2 +- doc/supply_demand.rst | 2 +- doc/support.rst | 2 +- doc/tutorial.rst | 2 +- doc/tutorial_sector.rst | 2 +- doc/validation.rst | 2 +- doc/wildcards.rst | 2 +- envs/environment.yaml | 2 +- matplotlibrc | 2 +- rules/build_electricity.smk | 2 +- rules/build_sector.smk | 2 +- rules/collect.smk | 2 +- rules/common.smk | 2 +- rules/retrieve.smk | 2 +- rules/solve_electricity.smk | 2 +- rules/solve_overnight.smk | 2 +- rules/solve_perfect.smk | 2 +- rules/validate.smk | 2 +- scripts/_benchmark.py | 2 +- scripts/_helpers.py | 2 +- scripts/add_brownfield.py | 2 +- scripts/add_electricity.py | 2 +- scripts/add_existing_baseyear.py | 2 +- scripts/add_extra_components.py | 2 +- scripts/base_network.py | 2 +- scripts/build_ammonia_production.py | 2 +- scripts/build_biomass_potentials.py | 2 +- scripts/build_biomass_transport_costs.py | 2 +- scripts/build_bus_regions.py | 2 +- scripts/build_clustered_population_layouts.py | 2 +- scripts/build_cop_profiles.py | 2 +- scripts/build_cross_border_flows.py | 2 +- scripts/build_cutout.py | 2 +- scripts/build_daily_heat_demand.py | 2 +- scripts/build_electricity_prices.py | 2 +- scripts/build_electricity_production.py | 2 +- scripts/build_energy_totals.py | 2 +- scripts/build_gas_input_locations.py | 2 +- scripts/build_gas_network.py | 2 +- scripts/build_hourly_heat_demand.py | 2 +- scripts/build_hydro_profile.py | 2 +- scripts/build_industrial_distribution_key.py | 2 +- ...industrial_energy_demand_per_country_today.py | 2 +- .../build_industrial_energy_demand_per_node.py | 2 +- ...ld_industrial_energy_demand_per_node_today.py | 2 +- .../build_industrial_production_per_country.py | 2 +- ...industrial_production_per_country_tomorrow.py | 2 +- scripts/build_industrial_production_per_node.py | 2 +- scripts/build_industry_sector_ratios.py | 2 +- scripts/build_monthly_prices.py | 2 +- scripts/build_natura_raster.py | 2 +- scripts/build_population_layouts.py | 2 +- .../build_population_weighted_energy_totals.py | 2 +- scripts/build_renewable_profiles.py | 2 +- scripts/build_retro_cost.py | 2 +- scripts/build_salt_cavern_potentials.py | 2 +- scripts/build_sequestration_potentials.py | 2 +- scripts/build_shapes.py | 2 +- scripts/build_shipping_demand.py | 2 +- scripts/build_solar_thermal_profiles.py | 2 +- scripts/build_temperature_profiles.py | 2 +- scripts/build_transport_demand.py | 2 +- scripts/cluster_gas_network.py | 2 +- scripts/cluster_network.py | 2 +- scripts/copy_config.py | 2 +- scripts/determine_availability_matrix_MD_UA.py | 2 +- scripts/make_summary.py | 2 +- scripts/make_summary_perfect.py | 2 +- scripts/plot_statistics.py | 2 +- scripts/plot_summary.py | 2 +- scripts/plot_validation_cross_border_flows.py | 2 +- scripts/plot_validation_electricity_prices.py | 2 +- .../plot_validation_electricity_production.py | 2 +- scripts/prepare_links_p_nom.py | 2 +- scripts/prepare_network.py | 2 +- scripts/prepare_perfect_foresight.py | 2 +- scripts/prepare_sector_network.py | 2 +- scripts/retrieve_databundle.py | 2 +- scripts/retrieve_gas_infrastructure_data.py | 2 +- scripts/retrieve_irena.py | 2 +- scripts/retrieve_monthly_fuel_prices.py | 2 +- scripts/retrieve_sector_databundle.py | 2 +- scripts/simplify_network.py | 2 +- scripts/solve_network.py | 2 +- scripts/solve_operations_network.py | 2 +- 122 files changed, 129 insertions(+), 129 deletions(-) diff --git a/.gitattributes b/.gitattributes index 3f5e771d..b82aaff1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1af8e733..bad6039f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2021-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/.gitignore b/.gitignore index 6454616c..e9eb7b09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/.readthedocs.yml b/.readthedocs.yml index 30684052..ca388d80 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/.reuse/dep5 b/.reuse/dep5 index cd8e2660..27edd808 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -4,33 +4,33 @@ Upstream-Contact: Tom Brown Source: https://github.com/pypsa/pypsa-eur Files: doc/img/* -Copyright: 2019-2023 The PyPSA-Eur Authors +Copyright: 2019-2024 The PyPSA-Eur Authors License: CC-BY-4.0 Files: doc/data.csv -Copyright: 2019-2023 The PyPSA-Eur Authors +Copyright: 2019-2024 The PyPSA-Eur Authors License: CC-BY-4.0 Files: doc/configtables/* -Copyright: 2019-2023 The PyPSA-Eur Authors +Copyright: 2019-2024 The PyPSA-Eur Authors License: CC-BY-4.0 Files: data/* -Copyright: 2017-2023 The PyPSA-Eur Authors +Copyright: 2017-2024 The PyPSA-Eur Authors License: CC-BY-4.0 Files: .github/* -Copyright: 2019-2023 The PyPSA-Eur Authors +Copyright: 2019-2024 The PyPSA-Eur Authors License: CC0-1.0 Files: matplotlibrc -Copyright: 2017-2023 The PyPSA-Eur Authors +Copyright: 2017-2024 The PyPSA-Eur Authors License: CC0-1.0 Files: borg-it -Copyright: 2017-2023 The PyPSA-Eur Authors +Copyright: 2017-2024 The PyPSA-Eur Authors License: CC0-1.0 Files: graphics/* -Copyright: 2017-2023 The PyPSA-Eur Authors +Copyright: 2017-2024 The PyPSA-Eur Authors License: CC-BY-4.0 diff --git a/.sync-send b/.sync-send index 72252956..483c7a99 100644 --- a/.sync-send +++ b/.sync-send @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2021-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt index 87f6d959..baf15333 100644 --- a/LICENSES/MIT.txt +++ b/LICENSES/MIT.txt @@ -1,6 +1,6 @@ MIT License -Copyright 2017-2023 The PyPSA-Eur Authors +Copyright 2017-2024 The PyPSA-Eur Authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/README.md b/README.md index 4a58d75c..b4c03574 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ diff --git a/config/config.default.yaml b/config/config.default.yaml index b4d96b12..6eacdcc9 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/config/config.entsoe-all.yaml b/config/config.entsoe-all.yaml index dd19d2c7..40e3c0a5 100644 --- a/config/config.entsoe-all.yaml +++ b/config/config.entsoe-all.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/config/config.perfect.yaml b/config/config.perfect.yaml index ff531303..7bfdbdd2 100644 --- a/config/config.perfect.yaml +++ b/config/config.perfect.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 run: diff --git a/config/config.validation.yaml b/config/config.validation.yaml index 5bcd5c31..c8fb2fa5 100644 --- a/config/config.validation.yaml +++ b/config/config.validation.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 run: diff --git a/config/test/config.electricity.yaml b/config/test/config.electricity.yaml index 22c8e8d3..57964415 100644 --- a/config/test/config.electricity.yaml +++ b/config/test/config.electricity.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/config/test/config.myopic.yaml b/config/test/config.myopic.yaml index 2e7b3e6e..5abae36d 100644 --- a/config/test/config.myopic.yaml +++ b/config/test/config.myopic.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/config/test/config.overnight.yaml b/config/test/config.overnight.yaml index 8b98fea9..7fb53e42 100644 --- a/config/test/config.overnight.yaml +++ b/config/test/config.overnight.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/config/test/config.perfect.yaml b/config/test/config.perfect.yaml index 2e716066..5d77c9c5 100644 --- a/config/test/config.perfect.yaml +++ b/config/test/config.perfect.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/doc/Makefile b/doc/Makefile index a2ae2428..9eea4532 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/doc/configuration.rst b/doc/configuration.rst index f65aa4c2..ab01ddd5 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/contributing.rst b/doc/contributing.rst index 30de4f7e..0bf969b6 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/costs.rst b/doc/costs.rst index 5ddbb360..fd2feb17 100644 --- a/doc/costs.rst +++ b/doc/costs.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/foresight.rst b/doc/foresight.rst index f8ea6108..c749c84c 100644 --- a/doc/foresight.rst +++ b/doc/foresight.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2021-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2021-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/index.rst b/doc/index.rst index 7eaffa01..acff820b 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/installation.rst b/doc/installation.rst index 4289b098..4aea5414 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/introduction.rst b/doc/introduction.rst index 0047f0a7..d271391c 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/licenses.rst b/doc/licenses.rst index beb6f5b8..74640ea5 100644 --- a/doc/licenses.rst +++ b/doc/licenses.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2023-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/limitations.rst b/doc/limitations.rst index a67fad0c..2aa8ecfe 100644 --- a/doc/limitations.rst +++ b/doc/limitations.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/make.bat b/doc/make.bat index 3037f934..d64ffdc8 100644 --- a/doc/make.bat +++ b/doc/make.bat @@ -1,4 +1,4 @@ -REM SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors +REM SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors REM SPDX-License-Identifier: MIT @ECHO OFF diff --git a/doc/plotting.rst b/doc/plotting.rst index 02748cf2..a5229d8d 100644 --- a/doc/plotting.rst +++ b/doc/plotting.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/preparation.rst b/doc/preparation.rst index d8f76839..bb55ba6b 100644 --- a/doc/preparation.rst +++ b/doc/preparation.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/publications.bib b/doc/publications.bib index 4be6676a..5e1ee364 100644 --- a/doc/publications.bib +++ b/doc/publications.bib @@ -1,5 +1,5 @@ @Comment{ -SPDX-FileCopyrightText: 2023 The PyPSA-Eur Authors +SPDX-FileCopyrightText: 2023-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC0-1.0 } diff --git a/doc/publications.rst b/doc/publications.rst index c824873e..f6d7986b 100644 --- a/doc/publications.rst +++ b/doc/publications.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2023-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/release_notes.rst b/doc/release_notes.rst index e0e0d22b..45e3de36 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/requirements.txt b/doc/requirements.txt index 3e760c81..a1cd0a5c 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2019-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2019-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 diff --git a/doc/retrieve.rst b/doc/retrieve.rst index e4800fd2..24b51371 100644 --- a/doc/retrieve.rst +++ b/doc/retrieve.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/sector.rst b/doc/sector.rst index 411bfd57..84a5fdc9 100644 --- a/doc/sector.rst +++ b/doc/sector.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2023-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/simplification.rst b/doc/simplification.rst index 21f61de7..2272505d 100644 --- a/doc/simplification.rst +++ b/doc/simplification.rst @@ -1,7 +1,7 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/solving.rst b/doc/solving.rst index 21cc5c25..a8020d29 100644 --- a/doc/solving.rst +++ b/doc/solving.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/spatial_resolution.rst b/doc/spatial_resolution.rst index c6e9c3de..a408f464 100644 --- a/doc/spatial_resolution.rst +++ b/doc/spatial_resolution.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2021-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2021-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/supply_demand.rst b/doc/supply_demand.rst index b043268b..8f6edcad 100644 --- a/doc/supply_demand.rst +++ b/doc/supply_demand.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2021-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2021-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/support.rst b/doc/support.rst index 1d512d59..1a3e6d08 100644 --- a/doc/support.rst +++ b/doc/support.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/tutorial.rst b/doc/tutorial.rst index e58ad123..542263e5 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/tutorial_sector.rst b/doc/tutorial_sector.rst index 53a60353..25690bf7 100644 --- a/doc/tutorial_sector.rst +++ b/doc/tutorial_sector.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2023-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/validation.rst b/doc/validation.rst index 7049e3de..e538717c 100644 --- a/doc/validation.rst +++ b/doc/validation.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/doc/wildcards.rst b/doc/wildcards.rst index 75eec192..f86ff311 100644 --- a/doc/wildcards.rst +++ b/doc/wildcards.rst @@ -1,5 +1,5 @@ .. - SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + SPDX-FileCopyrightText: 2019-2024 The PyPSA-Eur Authors SPDX-License-Identifier: CC-BY-4.0 diff --git a/envs/environment.yaml b/envs/environment.yaml index 88e394fa..0e82ddc3 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/matplotlibrc b/matplotlibrc index f00ed5cd..bf667fb1 100644 --- a/matplotlibrc +++ b/matplotlibrc @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 font.family: sans-serif diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index f05e18c0..827b4278 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 65000512..acdc3203 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/rules/collect.smk b/rules/collect.smk index dc0a94cc..a857ac64 100644 --- a/rules/collect.smk +++ b/rules/collect.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/rules/common.smk b/rules/common.smk index 598d3b98..32b94211 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/rules/retrieve.smk b/rules/retrieve.smk index acb8a1c1..9fb38b36 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index ac433cf9..b022cd30 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index aa08b8c3..c4c77992 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 9e164a16..4ce5c081 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT rule add_existing_baseyear: diff --git a/rules/validate.smk b/rules/validate.smk index 0fa1f607..75cb73a9 100644 --- a/rules/validate.smk +++ b/rules/validate.smk @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/_benchmark.py b/scripts/_benchmark.py index ced102ba..58fc3d39 100644 --- a/scripts/_benchmark.py +++ b/scripts/_benchmark.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 3de23c9f..b87870a1 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 3b77c437..a82b0c29 100644 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 614e3330..49e69f62 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index c0d37a5b..91b8a822 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/add_extra_components.py b/scripts/add_extra_components.py index 731e36be..20f66a9f 100644 --- a/scripts/add_extra_components.py +++ b/scripts/add_extra_components.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/base_network.py b/scripts/base_network.py index 81db4074..8b976875 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/build_ammonia_production.py b/scripts/build_ammonia_production.py index e2cf6a7b..51ad25ec 100644 --- a/scripts/build_ammonia_production.py +++ b/scripts/build_ammonia_production.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_biomass_potentials.py b/scripts/build_biomass_potentials.py index 6b5cb147..cf048685 100644 --- a/scripts/build_biomass_potentials.py +++ b/scripts/build_biomass_potentials.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2021-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_biomass_transport_costs.py b/scripts/build_biomass_transport_costs.py index 05b64519..9c825c47 100644 --- a/scripts/build_biomass_transport_costs.py +++ b/scripts/build_biomass_transport_costs.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_bus_regions.py b/scripts/build_bus_regions.py index f9bf287e..60bc7ac3 100644 --- a/scripts/build_bus_regions.py +++ b/scripts/build_bus_regions.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_clustered_population_layouts.py b/scripts/build_clustered_population_layouts.py index f1d386bd..2697e448 100644 --- a/scripts/build_clustered_population_layouts.py +++ b/scripts/build_clustered_population_layouts.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_cop_profiles.py b/scripts/build_cop_profiles.py index 4b1d952e..4e4f52a9 100644 --- a/scripts/build_cop_profiles.py +++ b/scripts/build_cop_profiles.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_cross_border_flows.py b/scripts/build_cross_border_flows.py index b9fc3fe8..2f3a411f 100644 --- a/scripts/build_cross_border_flows.py +++ b/scripts/build_cross_border_flows.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/build_cutout.py b/scripts/build_cutout.py index 9a7f9e00..60b2c244 100644 --- a/scripts/build_cutout.py +++ b/scripts/build_cutout.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_daily_heat_demand.py b/scripts/build_daily_heat_demand.py index e334b1b3..edbdfebf 100644 --- a/scripts/build_daily_heat_demand.py +++ b/scripts/build_daily_heat_demand.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_electricity_prices.py b/scripts/build_electricity_prices.py index 353ea7e3..4733098e 100644 --- a/scripts/build_electricity_prices.py +++ b/scripts/build_electricity_prices.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/build_electricity_production.py b/scripts/build_electricity_production.py index e89ad78b..741f1c61 100644 --- a/scripts/build_electricity_production.py +++ b/scripts/build_electricity_production.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index c67bb49d..dd27e019 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_gas_input_locations.py b/scripts/build_gas_input_locations.py index 081f74b9..a2fc335c 100644 --- a/scripts/build_gas_input_locations.py +++ b/scripts/build_gas_input_locations.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2021-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_gas_network.py b/scripts/build_gas_network.py index 13cd75ba..70f1f168 100644 --- a/scripts/build_gas_network.py +++ b/scripts/build_gas_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_hourly_heat_demand.py b/scripts/build_hourly_heat_demand.py index c972da89..ead125af 100644 --- a/scripts/build_hourly_heat_demand.py +++ b/scripts/build_hourly_heat_demand.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_hydro_profile.py b/scripts/build_hydro_profile.py index 65cc22b7..70b6662c 100644 --- a/scripts/build_hydro_profile.py +++ b/scripts/build_hydro_profile.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industrial_distribution_key.py b/scripts/build_industrial_distribution_key.py index 9b234e29..d80dff5a 100644 --- a/scripts/build_industrial_distribution_key.py +++ b/scripts/build_industrial_distribution_key.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industrial_energy_demand_per_country_today.py b/scripts/build_industrial_energy_demand_per_country_today.py index 9105a790..1c9a8c15 100644 --- a/scripts/build_industrial_energy_demand_per_country_today.py +++ b/scripts/build_industrial_energy_demand_per_country_today.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industrial_energy_demand_per_node.py b/scripts/build_industrial_energy_demand_per_node.py index ec571c71..8a3b1831 100644 --- a/scripts/build_industrial_energy_demand_per_node.py +++ b/scripts/build_industrial_energy_demand_per_node.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industrial_energy_demand_per_node_today.py b/scripts/build_industrial_energy_demand_per_node_today.py index d845e704..0bce5c5c 100644 --- a/scripts/build_industrial_energy_demand_per_node_today.py +++ b/scripts/build_industrial_energy_demand_per_node_today.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industrial_production_per_country.py b/scripts/build_industrial_production_per_country.py index afab1403..70af1d48 100644 --- a/scripts/build_industrial_production_per_country.py +++ b/scripts/build_industrial_production_per_country.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industrial_production_per_country_tomorrow.py b/scripts/build_industrial_production_per_country_tomorrow.py index ffed5195..a95bca89 100644 --- a/scripts/build_industrial_production_per_country_tomorrow.py +++ b/scripts/build_industrial_production_per_country_tomorrow.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industrial_production_per_node.py b/scripts/build_industrial_production_per_node.py index 7b69948a..46262180 100644 --- a/scripts/build_industrial_production_per_node.py +++ b/scripts/build_industrial_production_per_node.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_industry_sector_ratios.py b/scripts/build_industry_sector_ratios.py index 805cf3e7..88e5f180 100644 --- a/scripts/build_industry_sector_ratios.py +++ b/scripts/build_industry_sector_ratios.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_monthly_prices.py b/scripts/build_monthly_prices.py index 1c6d461b..f6edaf12 100644 --- a/scripts/build_monthly_prices.py +++ b/scripts/build_monthly_prices.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/build_natura_raster.py b/scripts/build_natura_raster.py index 8fdb4ea3..4f992297 100644 --- a/scripts/build_natura_raster.py +++ b/scripts/build_natura_raster.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_population_layouts.py b/scripts/build_population_layouts.py index cb63c27e..b455df78 100644 --- a/scripts/build_population_layouts.py +++ b/scripts/build_population_layouts.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_population_weighted_energy_totals.py b/scripts/build_population_weighted_energy_totals.py index 879e3b9b..6ac4e946 100644 --- a/scripts/build_population_weighted_energy_totals.py +++ b/scripts/build_population_weighted_energy_totals.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index a075450d..c9b0da0c 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_retro_cost.py b/scripts/build_retro_cost.py index 60d74afa..39f6b965 100755 --- a/scripts/build_retro_cost.py +++ b/scripts/build_retro_cost.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_salt_cavern_potentials.py b/scripts/build_salt_cavern_potentials.py index ed039772..64266291 100644 --- a/scripts/build_salt_cavern_potentials.py +++ b/scripts/build_salt_cavern_potentials.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_sequestration_potentials.py b/scripts/build_sequestration_potentials.py index f6ad3526..c7a0089b 100644 --- a/scripts/build_sequestration_potentials.py +++ b/scripts/build_sequestration_potentials.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_shapes.py b/scripts/build_shapes.py index c5faf597..7f5effe1 100644 --- a/scripts/build_shapes.py +++ b/scripts/build_shapes.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_shipping_demand.py b/scripts/build_shipping_demand.py index 8000c66c..b8e5fbb1 100644 --- a/scripts/build_shipping_demand.py +++ b/scripts/build_shipping_demand.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_solar_thermal_profiles.py b/scripts/build_solar_thermal_profiles.py index ee6ed881..331725eb 100644 --- a/scripts/build_solar_thermal_profiles.py +++ b/scripts/build_solar_thermal_profiles.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_temperature_profiles.py b/scripts/build_temperature_profiles.py index 02fa4a71..0403a7be 100644 --- a/scripts/build_temperature_profiles.py +++ b/scripts/build_temperature_profiles.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/build_transport_demand.py b/scripts/build_transport_demand.py index 33c8faae..74fe2242 100644 --- a/scripts/build_transport_demand.py +++ b/scripts/build_transport_demand.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/cluster_gas_network.py b/scripts/cluster_gas_network.py index e709d772..e3b0f7d9 100755 --- a/scripts/cluster_gas_network.py +++ b/scripts/cluster_gas_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index fe74ac38..9aea9826 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/copy_config.py b/scripts/copy_config.py index 3dbee6a4..9bba7383 100644 --- a/scripts/copy_config.py +++ b/scripts/copy_config.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/determine_availability_matrix_MD_UA.py b/scripts/determine_availability_matrix_MD_UA.py index efe9a712..72bd0f76 100644 --- a/scripts/determine_availability_matrix_MD_UA.py +++ b/scripts/determine_availability_matrix_MD_UA.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 76d8099c..1f106fe7 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/make_summary_perfect.py b/scripts/make_summary_perfect.py index 064db454..1aec89c4 100644 --- a/scripts/make_summary_perfect.py +++ b/scripts/make_summary_perfect.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/plot_statistics.py b/scripts/plot_statistics.py index b2728931..b6b8620b 100644 --- a/scripts/plot_statistics.py +++ b/scripts/plot_statistics.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index cfb32441..7af0ba79 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/plot_validation_cross_border_flows.py b/scripts/plot_validation_cross_border_flows.py index 65f4f8c7..d062bdf1 100644 --- a/scripts/plot_validation_cross_border_flows.py +++ b/scripts/plot_validation_cross_border_flows.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/plot_validation_electricity_prices.py b/scripts/plot_validation_electricity_prices.py index 38c9fe96..86217096 100644 --- a/scripts/plot_validation_electricity_prices.py +++ b/scripts/plot_validation_electricity_prices.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/plot_validation_electricity_production.py b/scripts/plot_validation_electricity_production.py index e95a8126..8e9ced16 100644 --- a/scripts/plot_validation_electricity_production.py +++ b/scripts/plot_validation_electricity_production.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/prepare_links_p_nom.py b/scripts/prepare_links_p_nom.py index 4b915d22..35f3a2fd 100644 --- a/scripts/prepare_links_p_nom.py +++ b/scripts/prepare_links_p_nom.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index e358c05e..8936afef 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/prepare_perfect_foresight.py b/scripts/prepare_perfect_foresight.py index cf013577..7cc95f33 100644 --- a/scripts/prepare_perfect_foresight.py +++ b/scripts/prepare_perfect_foresight.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 5d5e271b..b1351089 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/retrieve_databundle.py b/scripts/retrieve_databundle.py index 25894063..fcfa8ff4 100644 --- a/scripts/retrieve_databundle.py +++ b/scripts/retrieve_databundle.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # Copyright 2019-2022 Fabian Hofmann (TUB, FIAS) -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/retrieve_gas_infrastructure_data.py b/scripts/retrieve_gas_infrastructure_data.py index d984b9fe..be5908a6 100644 --- a/scripts/retrieve_gas_infrastructure_data.py +++ b/scripts/retrieve_gas_infrastructure_data.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2021-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/retrieve_irena.py b/scripts/retrieve_irena.py index 7b123475..6f42b371 100644 --- a/scripts/retrieve_irena.py +++ b/scripts/retrieve_irena.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # Copyright 2023 Thomas Gilon (Climact) -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/retrieve_monthly_fuel_prices.py b/scripts/retrieve_monthly_fuel_prices.py index e64066cb..e3a3eea8 100644 --- a/scripts/retrieve_monthly_fuel_prices.py +++ b/scripts/retrieve_monthly_fuel_prices.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2023-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index 5baf2c56..e20664c7 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2021-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/simplify_network.py b/scripts/simplify_network.py index cc4ff4f6..47635189 100644 --- a/scripts/simplify_network.py +++ b/scripts/simplify_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 551222c0..5d3982a3 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ diff --git a/scripts/solve_operations_network.py b/scripts/solve_operations_network.py index dca49d02..73590d68 100644 --- a/scripts/solve_operations_network.py +++ b/scripts/solve_operations_network.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ From 2bb4e81dbdaf41105c2b4431c317e10b6d603543 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 19 Feb 2024 16:58:18 +0100 Subject: [PATCH 456/497] prepare release notes --- doc/release_notes.rst | 259 ++++++++++++++++++++++++++++-------------- 1 file changed, 171 insertions(+), 88 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 45e3de36..6716ebcf 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,8 +7,14 @@ Release Notes ########################################## -Upcoming Release -================ +.. Upcoming Release +.. ================ +.. + +PyPSA-Eur 0.10.0 (19th February 2024) +===================================== + +**New Features** * Improved representation of industry transition pathways. A new script was added to interpolate industry sector ratios from today's status quo to future @@ -17,113 +23,80 @@ Upcoming Release energy carrier usage per ton material output to the best-in-class energy consumption of tomorrow. This is done on a per-country basis. The ratio of today to tomorrow's energy consumption is set with the ``industry: - sector_ratios_fraction_future:`` parameter. - -* Fix plotting of retrofitted hydrogen pipelines with pathway optimisation. - -* Bugfix: Correct units of subtracted chlorine and methanol demand in - :mod:`build_industry_sector_ratios`. - -* Include all countries in ammonia production resource. This is so that the full - EU28 ammonia demand can be correctly subtracted in the rule - :mod:`build_industry_sector_ratios`. - -* Regions are assigned to all buses with unique coordinates in the network with - a preference given to substations. Previously, only substations had assigned - regions, but this could lead to issues when a high spatial resolution was - applied. - -* The default configuration ``config/config.default.yaml`` is now automatically - used as a base configuration file. The file ``config/config.yaml`` should be - used to define deviations from the default configuration. - -* Merged two OPSD time series data versions into such that the option ``load: - power_statistics:`` becomes superfluous and was hence removed. -* Bugfix: The industry coal emissions for industry were not properly tracked. - -* Allow industrial coal demand to be regional so its emissions can be included - in regional emission limits. + sector_ratios_fraction_future:`` parameter + (https://github.com/PyPSA/pypsa-eur/pull/929). * Add new default to overdimension heating in individual buildings. This allows them to cover heat demand peaks e.g. 10% higher than those in the data. The disadvantage of manipulating the costs is that the capacity is then not quite - right. This way at least the costs are right. + right. This way at least the costs are right + (https://github.com/PyPSA/pypsa-eur/pull/918). + +* Allow industrial coal demand to be regional so its emissions can be included + in regional emission limits (https://github.com/PyPSA/pypsa-eur/pull/923). * Add option to specify to set a default heating lifetime for existing heating - (``existing_capacities: default_heating_lifetime:``). + (``existing_capacities: default_heating_lifetime:``) + (https://github.com/PyPSA/pypsa-eur/pull/918). -* Correctly source the existing heating technologies for buildings since the - source URL has changed. It represents the year 2012 and is only for - buildings, not district heating. So the capacities for urban central are now - set to zero from this source. +* Added option to specify turbine and solar panel models for specific years as a + dictionary (e.g. ``renewable: onwind: resource: turbine:``). The years will be + interpreted as years from when the the corresponding turbine model substitutes + the previous model for new installations. This will only have an effect on + workflows with foresight ``"myopic"`` and still needs to be added foresight + option ``"perfect"`` (https://github.com/PyPSA/pypsa-eur/pull/912). -* Remove long-deprecated function ``attach_extendable_generators`` in :mod:`add_electricity`. +* New configuration option ``everywhere_powerplants`` to build conventional + powerplants everywhere, irrespective of existing powerplants locations, in the + network (https://github.com/PyPSA/pypsa-eur/pull/850). -* The filtering of power plants in the ``config.default.yaml`` has been updated regarding phased-out power plants in 2023. +* Add the option to customise map projection in plotting config under + ``plotting: projection: name`` (https://github.com/PyPSA/pypsa-eur/pull/898). -* Upgrade techno-economic assumptions to ``technology-data`` v0.8.0. +* Add support for the linopy ``io_api`` option under ``solving: options: + io_api:``. Set to ``"direct"`` to increase model reading and writing + performance for the highs and gurobi solvers on slow file systems + (https://github.com/PyPSA/pypsa-eur/pull/892). -* Bugfix: Correct technology keys for the electricity production plotting to work out the box. +* It is now possible to determine the directory for shared resources by setting + `shared_resources` to a string (https://github.com/PyPSA/pypsa-eur/pull/906). -* New configuration option ``everywhere_powerplants`` to build conventional powerplants everywhere, irrespective of existing powerplants locations, in the network (https://github.com/PyPSA/pypsa-eur/pull/850). + +**Breaking Changes** + +* Remove long-deprecated function ``attach_extendable_generators`` in + :mod:`add_electricity`. * Remove option for wave energy as technology data is not maintained. -* Define global constraint for CO2 emissions on the final state of charge of the - CO2 atmosphere store. This gives a more sparse constraint that should improve - the performance of the solving process. +* The order of buses (bus0, bus1, ...) for DAC components has changed to meet + the convention of the other components. Therefore, `bus0` refers to the + electricity bus (input), `bus1` to the heat bus (input), 'bus2' to the CO2 + atmosphere bus (input), and `bus3` to the CO2 storage bus (output) + (https://github.com/PyPSA/pypsa-eur/pull/901). -* Bugfix: Assure entering of code block which corrects Norwegian heat demand. +**Changes** -* Add warning when BEV availability weekly profile has negative values in `build_transport_demand`. +* Upgrade default techno-economic assumptions to ``technology-data`` v0.8.0. -* Stacktrace of uncaught exceptions should now be correctly included inside log files (via `configure_logging(..)`). - -* Cluster residential and services heat buses by default. Can be disabled with ``cluster_heat_buses: false``. - -* Bugfix: Do not reduce district heat share when building population-weighted - energy statistics. Previously the district heating share was being multiplied - by the population weighting, reducing the DH share with multiple nodes. +* Update hydrogen pipeline losses to latest data from Danish Energy Agency + (https://github.com/PyPSA/pypsa-eur/pull/933). * Move building of daily heat profile to its own rule - :mod:`build_hourly_heat_demand` from :mod:`prepare_sector_network`. + :mod:`build_hourly_heat_demand` from :mod:`prepare_sector_network` + (https://github.com/PyPSA/pypsa-eur/pull/884). * In :mod:`build_energy_totals`, district heating shares are now reported in a - separate file. + separate file (https://github.com/PyPSA/pypsa-eur/pull/884). * Move calculation of district heating share to its own rule - :mod:`build_district_heat_share`. + :mod:`build_district_heat_share` + (https://github.com/PyPSA/pypsa-eur/pull/884). * Move building of distribution of existing heating to own rule :mod:`build_existing_heating_distribution`. This makes the distribution of existing heating to urban/rural, residential/services and spatially more - transparent. - -* Bugfix: Correctly read out number of solver threads from configuration file. - -* Air-sourced heat pumps can now also be built in rural areas. Previously, only - ground-sourced heat pumps were considered for this category. - -* Bugfix: Correctly read out number of solver threads from configuration file. - -* Add support for the linopy ``io_api`` option; set to ``"direct"`` to increase model reading and writing performance for the highs and gurobi solvers. - -* Add the option to customise map projection in plotting config. - -* The order of buses (bus0, bus1, ...) for DAC components has changed to meet the convention of the other components. Therefore, `bus0` refers to the electricity bus (input), `bus1` to the heat bus (input), 'bus2' to the CO2 atmosphere bus (input), and `bus3` to the CO2 storage bus (output). - -* The rule ``plot_network`` has been split into separate rules for plotting - electricity, hydrogen and gas networks. - -* To determine the optimal topology to meet the number of clusters, the workflow used pyomo in combination with ``ipopt`` or ``gurobi``. This dependency has been replaced by using ``linopy`` in combination with ``scipopt`` or ``gurobi``. The environment file has been updated accordingly. - -* 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. - -* It is now possible to determine the directory for shared resources by setting `shared_resources` to a string. - -* A ``test.sh`` script was added to the repository to run the tests locally. + transparent (https://github.com/PyPSA/pypsa-eur/pull/884). * Default settings for recycling rates and primary product shares of high-value chemicals have been set in accordance with the values used in `Neumann et al. @@ -132,14 +105,124 @@ Upcoming Release Energiewende (2021) `_. -* Added option to specify turbine and solar panel models for specific years as a - dictionary (e.g. ``renewable: onwind: resource: turbine:``). The years will be - interpreted as years from when the the corresponding turbine model substitutes - the previous model for new installations. This will only have an effect on - workflows with foresight "myopic" and still needs to be added foresight option - "perfect". +* Air-sourced heat pumps can now also be built in rural areas. Previously, only + ground-sourced heat pumps were considered for this category + (https://github.com/PyPSA/pypsa-eur/pull/890). -* Switched the energy totals year from 2011 to 2013 to comply with the assumed default weather year. +* The default configuration ``config/config.default.yaml`` is now automatically + used as a base configuration file. The file ``config/config.yaml`` can now be + used to only define deviations from the default configuration. The + ``config/config.default.yaml`` is still copied into ``config/config.yaml`` on + first usage (https://github.com/PyPSA/pypsa-eur/pull/925). + +* Regions are assigned to all buses with unique coordinates in the network with + a preference given to substations. Previously, only substations had assigned + regions, but this could lead to issues when a high spatial resolution was + applied (https://github.com/PyPSA/pypsa-eur/pull/922). + +* Define global constraint for CO2 emissions on the final state of charge of the + CO2 atmosphere store. This gives a more sparse constraint that should improve + the performance of the solving process + (https://github.com/PyPSA/pypsa-eur/pull/862). + +* Switched the energy totals year from 2011 to 2013 to comply with the assumed + default weather year (https://github.com/PyPSA/pypsa-eur/pull/934). + +* Cluster residential and services heat buses by default. Can be disabled with + ``cluster_heat_buses: false`` (https://github.com/PyPSA/pypsa-eur/pull/877). + +* The rule ``plot_network`` has been split into separate rules for plotting + electricity, hydrogen and gas networks + (https://github.com/PyPSA/pypsa-eur/pull/900). + +* To determine the optimal topology to meet the number of clusters, the workflow + used pyomo in combination with ``ipopt`` or ``gurobi``. This dependency has + been replaced by using ``linopy`` in combination with ``scipopt`` or + ``gurobi``. The environment file has been updated accordingly + (https://github.com/PyPSA/pypsa-eur/pull/903). + +* The ``highs`` solver was added to the default environment file. + +* New default solver settings for COPT solver + (https://github.com/PyPSA/pypsa-eur/pull/882). + +* Data retrieval rules now use their own minimal conda environment. This can + avoid unnecessary reruns of the workflow + (https://github.com/PyPSA/pypsa-eur/pull/888). + +* Merged two OPSD time series data versions into such that the option ``load: + power_statistics:`` becomes superfluous and was hence removed + (https://github.com/PyPSA/pypsa-eur/pull/924). + +* The filtering of power plants in the ``config.default.yaml`` has been updated + regarding phased-out power plants in 2023. + +* Include all countries in ammonia production resource. This is so that the full + EU28 ammonia demand can be correctly subtracted in the rule + :mod:`build_industry_sector_ratios` + (https://github.com/PyPSA/pypsa-eur/pull/931). + +* Correctly source the existing heating technologies for buildings since the + source URL has changed. It represents the year 2012 and is only for buildings, + not district heating (https://github.com/PyPSA/pypsa-eur/pull/918). + +* Add warning when BEV availability weekly profile has negative values in + `build_transport_demand` (https://github.com/PyPSA/pypsa-eur/pull/858). + +* Time series clipping for very small values was added for Links + (https://github.com/PyPSA/pypsa-eur/pull/870). + +* A ``test.sh`` script was added to the repository to run the tests locally. + +* The CI now tests additionally against ``master`` versions of PyPSA, atlite and + powerplantmatching (https://github.com/PyPSA/pypsa-eur/pull/904). + +* A function ``sanitize_locations()`` was added to improve the coverage of the + ``location`` attribute of network components. + +**Bugs and Compatibility** + +* Bugfix: Do not reduce district heat share when building population-weighted + energy statistics. Previously the district heating share was being multiplied + by the population weighting, reducing the DH share with multiple nodes + (https://github.com/PyPSA/pypsa-eur/pull/884). + +* Bugfix: The industry coal emissions for industry were not properly tracked + (https://github.com/PyPSA/pypsa-eur/pull/923). + +* Bugfix: Correct units of subtracted chlorine and methanol demand in + :mod:`build_industry_sector_ratios` + (https://github.com/PyPSA/pypsa-eur/pull/930). + +* Various minor bugfixes to the perfect foresight workflow, though perfect + foresight must still be considered experimental + (https://github.com/PyPSA/pypsa-eur/pull/910). + +* Fix plotting of retrofitted hydrogen pipelines with myopic pathway + optimisation (https://github.com/PyPSA/pypsa-eur/pull/937). + +* Bugfix: Correct technology keys for the electricity production plotting to + work out the box. + +* Bugfix: Assure entering of code block which corrects Norwegian heat demand + (https://github.com/PyPSA/pypsa-eur/pull/870). + +* Stacktrace of uncaught exceptions should now be correctly included inside log + files (via `configure_logging(..)`) + (https://github.com/PyPSA/pypsa-eur/pull/875). + +* Bugfix: Correctly read out number of solver threads from configuration file + (https://github.com/PyPSA/pypsa-eur/pull/889). + +* Made copying default config file compatible with snakemake module + (https://github.com/PyPSA/pypsa-eur/pull/894). + +* Compatibility with ``pandas=2.2`` + (https://github.com/PyPSA/pypsa-eur/pull/861). + +Special thanks for this release to Koen van Greevenbroek (`@koen-vg +`_) for various new features, bugfixes and taking +care of deprecations. PyPSA-Eur 0.9.0 (5th January 2024) From 43159e15e97f963e1555100fc809ed6b57f62987 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 19 Feb 2024 17:15:20 +0100 Subject: [PATCH 457/497] update workflow charts --- CITATION.cff | 2 +- config/config.default.yaml | 2 +- doc/conf.py | 6 +- doc/installation.rst | 28 +- doc/release_notes.rst | 2 + doc/tutorial.rst | 158 +++--- doc/tutorial_sector.rst | 1043 +++++++++++++++++++++++------------- graphics/workflow.png | Bin 651103 -> 680340 bytes 8 files changed, 768 insertions(+), 473 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index f8b28b5f..af26fd53 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,7 +6,7 @@ cff-version: 1.1.0 message: "If you use this package, please cite it in the following way." title: "PyPSA-Eur: An open sector-coupled optimisation model of the European energy system" repository: https://github.com/pypsa/pypsa-eur -version: 0.9.0 +version: 0.10.0 license: MIT authors: - family-names: Brown diff --git a/config/config.default.yaml b/config/config.default.yaml index 6eacdcc9..09d2f151 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: CC0-1.0 # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#top-level-configuration -version: 0.9.0 +version: 0.10.0 tutorial: false logging: diff --git a/doc/conf.py b/doc/conf.py index fe577ac7..afa01d3a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -72,7 +72,7 @@ master_doc = "index" # General information about the project. project = "PyPSA-Eur" -copyright = "2017-2023 Tom Brown (KIT, TUB, FIAS), Jonas Hoersch (KIT, FIAS), Fabian Hofmann (TUB, FIAS), Fabian Neumann (TUB, KIT), Marta Victoria (Aarhus University), Lisa Zeyen (KIT, TUB)" +copyright = "2017-2024 Tom Brown (KIT, TUB, FIAS), Jonas Hoersch (KIT, FIAS), Fabian Hofmann (TUB, FIAS), Fabian Neumann (TUB, KIT), Marta Victoria (Aarhus University), Lisa Zeyen (KIT, TUB)" author = "Tom Brown (KIT, TUB, FIAS), Jonas Hoersch (KIT, FIAS), Fabian Hofmann (TUB, FIAS), Fabian Neumann (TUB, KIT), Marta Victoria (Aarhus University), Lisa Zeyen (KIT, TUB)" # The version info for the project you're documenting, acts as replacement for @@ -80,9 +80,9 @@ author = "Tom Brown (KIT, TUB, FIAS), Jonas Hoersch (KIT, FIAS), Fabian Hofmann # built documents. # # The short X.Y version. -version = "0.9" +version = "0.10" # The full version, including alpha/beta/rc tags. -release = "0.9.0" +release = "0.10.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/installation.rst b/doc/installation.rst index 4aea5414..b07fd290 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -79,31 +79,9 @@ Nevertheless, you can still use open-source solvers for smaller problems. `Instructions how to install a solver in the documentation of PyPSA `_ .. note:: - The rules :mod:`cluster_network` and :mod:`simplify_network` solve a quadratic optimisation problem for clustering. - The open-source solvers Cbc and GlPK cannot handle this. A fallback to Ipopt is implemented in this case, but requires - it to be installed. For an open-source solver setup install in your ``conda`` environment on OSX/Linux - - .. code:: bash - - mamba activate pypsa-eur - mamba install -c conda-forge ipopt coincbc - - and on Windows - - .. code:: bash - - mamba activate pypsa-eur - mamba install -c conda-forge ipopt glpk - - For HiGHS, run - - .. code:: bash - - mamba activate pypsa-eur - mamba install -c conda-forge ipopt - pip install highspy - - For Gurobi, run + The rules :mod:`cluster_network` and :mod:`simplify_network` solve a mixed-integer quadratic optimisation problem for clustering. + The open-source solvers HiGHS, Cbc and GlPK cannot handle this. A fallback to SCIP is implemented in this case. + For an open-source solver setup install in your ``conda`` environment on OSX/Linux. To install the default solver Gurobi, run .. code:: bash diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 6716ebcf..02c686f6 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -61,6 +61,8 @@ PyPSA-Eur 0.10.0 (19th February 2024) * It is now possible to determine the directory for shared resources by setting `shared_resources` to a string (https://github.com/PyPSA/pypsa-eur/pull/906). +* Improve ``mock_snakemake()`` for usage in Snakemake modules + (https://github.com/PyPSA/pypsa-eur/pull/869). **Breaking Changes** diff --git a/doc/tutorial.rst b/doc/tutorial.rst index 542263e5..4f272292 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -133,82 +133,89 @@ This triggers a workflow of multiple preceding jobs that depend on each rule's i graph[bgcolor=white, margin=0]; node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2]; edge[penwidth=2, color=grey]; - 0[label = "solve_network", color = "0.33 0.6 0.85", style="rounded"]; - 1[label = "prepare_network\nll: copt\nopts: Co2L-24H", color = "0.03 0.6 0.85", style="rounded"]; - 2[label = "add_extra_components", color = "0.45 0.6 0.85", style="rounded"]; - 3[label = "cluster_network\nclusters: 6", color = "0.46 0.6 0.85", style="rounded"]; - 4[label = "simplify_network\nsimpl: ", color = "0.52 0.6 0.85", style="rounded"]; - 5[label = "add_electricity", color = "0.55 0.6 0.85", style="rounded"]; - 6[label = "build_renewable_profiles\ntechnology: solar", color = "0.15 0.6 0.85", style="rounded"]; - 7[label = "base_network", color = "0.37 0.6 0.85", style="rounded,dashed"]; - 8[label = "build_shapes", color = "0.07 0.6 0.85", style="rounded,dashed"]; - 9[label = "retrieve_databundle", color = "0.60 0.6 0.85", style="rounded"]; - 10[label = "retrieve_natura_raster", color = "0.42 0.6 0.85", style="rounded"]; - 11[label = "build_bus_regions", color = "0.09 0.6 0.85", style="rounded,dashed"]; - 12[label = "build_renewable_profiles\ntechnology: onwind", color = "0.15 0.6 0.85", style="rounded"]; - 13[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.15 0.6 0.85", style="rounded"]; - 14[label = "build_ship_raster", color = "0.02 0.6 0.85", style="rounded"]; - 15[label = "retrieve_ship_raster", color = "0.40 0.6 0.85", style="rounded"]; - 16[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.15 0.6 0.85", style="rounded"]; - 17[label = "build_line_rating", color = "0.32 0.6 0.85", style="rounded"]; - 18[label = "retrieve_cost_data\nyear: 2030", color = "0.50 0.6 0.85", style="rounded"]; - 19[label = "build_powerplants", color = "0.64 0.6 0.85", style="rounded,dashed"]; - 20[label = "build_electricity_demand", color = "0.13 0.6 0.85", style="rounded,dashed"]; - 21[label = "retrieve_electricity_demand", color = "0.31 0.6 0.85", style="rounded"]; - 22[label = "copy_config", color = "0.23 0.6 0.85", style="rounded"]; + 0[label = "solve_network", color = "0.39 0.6 0.85", style="rounded"]; + 1[label = "prepare_network\nll: copt\nopts: Co2L-24H", color = "0.29 0.6 0.85", style="rounded"]; + 2[label = "add_extra_components", color = "0.28 0.6 0.85", style="rounded"]; + 3[label = "cluster_network\nclusters: 6", color = "0.19 0.6 0.85", style="rounded"]; + 4[label = "simplify_network\nsimpl: ", color = "0.01 0.6 0.85", style="rounded"]; + 5[label = "add_electricity", color = "0.49 0.6 0.85", style="rounded"]; + 6[label = "build_renewable_profiles\ntechnology: solar", color = "0.21 0.6 0.85", style="rounded"]; + 7[label = "base_network", color = "0.27 0.6 0.85", style="rounded"]; + 8[label = "build_shapes", color = "0.26 0.6 0.85", style="rounded"]; + 9[label = "retrieve_databundle", color = "0.59 0.6 0.85", style="rounded"]; + 10[label = "retrieve_natura_raster", color = "0.47 0.6 0.85", style="rounded"]; + 11[label = "build_bus_regions", color = "0.13 0.6 0.85", style="rounded"]; + 12[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.36 0.6 0.85", style="rounded,dashed"]; + 13[label = "build_renewable_profiles\ntechnology: onwind", color = "0.21 0.6 0.85", style="rounded"]; + 14[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.21 0.6 0.85", style="rounded"]; + 15[label = "build_ship_raster", color = "0.00 0.6 0.85", style="rounded"]; + 16[label = "retrieve_ship_raster", color = "0.51 0.6 0.85", style="rounded,dashed"]; + 17[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.21 0.6 0.85", style="rounded"]; + 18[label = "build_line_rating", color = "0.05 0.6 0.85", style="rounded"]; + 19[label = "retrieve_cost_data\nyear: 2030", color = "0.15 0.6 0.85", style="rounded"]; + 20[label = "build_powerplants", color = "0.54 0.6 0.85", style="rounded"]; + 21[label = "build_electricity_demand", color = "0.52 0.6 0.85", style="rounded"]; + 22[label = "retrieve_electricity_demand", color = "0.22 0.6 0.85", style="rounded"]; + 23[label = "copy_config", color = "0.44 0.6 0.85", style="rounded"]; 1 -> 0 - 22 -> 0 + 23 -> 0 2 -> 1 - 18 -> 1 + 19 -> 1 3 -> 2 - 18 -> 2 + 19 -> 2 4 -> 3 - 18 -> 3 + 19 -> 3 5 -> 4 - 18 -> 4 + 19 -> 4 11 -> 4 6 -> 5 - 12 -> 5 13 -> 5 - 16 -> 5 - 7 -> 5 + 14 -> 5 17 -> 5 + 7 -> 5 18 -> 5 - 11 -> 5 19 -> 5 - 9 -> 5 + 11 -> 5 20 -> 5 + 9 -> 5 + 21 -> 5 8 -> 5 7 -> 6 9 -> 6 10 -> 6 8 -> 6 11 -> 6 + 12 -> 6 8 -> 7 9 -> 8 8 -> 11 7 -> 11 - 7 -> 12 - 9 -> 12 - 10 -> 12 - 8 -> 12 - 11 -> 12 7 -> 13 9 -> 13 10 -> 13 - 14 -> 13 8 -> 13 11 -> 13 + 12 -> 13 + 7 -> 14 + 9 -> 14 + 10 -> 14 15 -> 14 - 7 -> 16 - 9 -> 16 - 10 -> 16 - 14 -> 16 - 8 -> 16 - 11 -> 16 + 8 -> 14 + 11 -> 14 + 12 -> 14 + 16 -> 15 + 12 -> 15 7 -> 17 - 7 -> 19 - 21 -> 20 + 9 -> 17 + 10 -> 17 + 15 -> 17 + 8 -> 17 + 11 -> 17 + 12 -> 17 + 7 -> 18 + 12 -> 18 + 7 -> 20 + 22 -> 21 } | @@ -218,26 +225,29 @@ In the terminal, this will show up as a list of jobs to be run: .. code:: bash Building DAG of jobs... - job count min threads max threads - ------------------------ ------- ------------- ------------- - add_electricity 1 1 1 - add_extra_components 1 1 1 - base_network 1 1 1 - build_bus_regions 1 1 1 - build_hydro_profile 1 1 1 - build_electricity_demand 1 1 1 - build_powerplants 1 1 1 - build_renewable_profiles 4 1 1 - build_shapes 1 1 1 - build_ship_raster 1 1 1 - cluster_network 1 1 1 - prepare_network 1 1 1 - retrieve_cost_data 1 1 1 - retrieve_databundle 1 1 1 - retrieve_natura_raster 1 1 1 - simplify_network 1 1 1 - solve_network 1 1 1 - total 20 1 1 + Job stats: + job count + --------------------------- ------- + add_electricity 1 + add_extra_components 1 + base_network 1 + build_bus_regions 1 + build_electricity_demand 1 + build_line_rating 1 + build_powerplants 1 + build_renewable_profiles 4 + build_shapes 1 + build_ship_raster 1 + cluster_network 1 + copy_config 1 + prepare_network 1 + retrieve_cost_data 1 + retrieve_databundle 1 + retrieve_electricity_demand 1 + retrieve_natura_raster 1 + simplify_network 1 + solve_network 1 + total 22 ``snakemake`` then runs these jobs in the correct order. @@ -246,16 +256,16 @@ A job (here ``simplify_network``) will display its attributes and normally some .. code:: bash - [Mon Jan 1 00:00:00 2023] + [Mon Feb 19 17:06:17 2024] rule simplify_network: - input: networks/elec.nc, resources/costs.csv, resources/regions_onshore.geojson, resources/regions_offshore.geojson - output: networks/elec_s.nc, resources/regions_onshore_elec_s.geojson, resources/regions_offshore_elec_s.geojson, resources/busmap_elec_s.csv, resources/connection_costs_s.csv - log: logs/simplify_network/elec_s.log + input: resources/test/networks/elec.nc, data/costs_2030.csv, resources/test/regions_onshore.geojson, resources/test/regions_offshore.geojson + output: resources/test/networks/elec_s.nc, resources/test/regions_onshore_elec_s.geojson, resources/test/regions_offshore_elec_s.geojson, resources/test/busmap_elec_s.csv, resources/test/connection_costs_s.csv + log: logs/test-elec/simplify_network/elec_s.log jobid: 4 - benchmark: benchmarks/simplify_network/elec_s - reason: Missing output files: resources/busmap_elec_s.csv, resources/regions_onshore_elec_s.geojson, networks/elec_s.nc, resources/regions_offshore_elec_s.geojson; Input files updated by another job: resources/regions_offshore.geojson, resources/regions_onshore.geojson, resources/costs.csv, networks/elec.nc + benchmark: benchmarks/test-elec/simplify_network/elec_s + reason: Missing output files: resources/test/regions_offshore_elec_s.geojson, resources/test/busmap_elec_s.csv, resources/test/regions_onshore_elec_s.geojson, resources/test/networks/elec_s.nc; Input files updated by another job: resources/test/regions_offshore.geojson, resources/test/networks/elec.nc, resources/test/regions_onshore.geojson, data/costs_2030.csv wildcards: simpl= - resources: tmpdir=/tmp, mem_mb=4000, mem_mib=3815 + resources: tmpdir=/tmp, mem_mb=12000, mem_mib=11445 Once the whole worktree is finished, it should state so in the terminal. diff --git a/doc/tutorial_sector.rst b/doc/tutorial_sector.rst index 25690bf7..3598cdfb 100644 --- a/doc/tutorial_sector.rst +++ b/doc/tutorial_sector.rst @@ -61,46 +61,69 @@ To run an overnight / greenfiled scenario with the specifications above, run snakemake -call all --configfile config/test/config.overnight.yaml -which will result in the following *additional* jobs ``snakemake`` wants to run -on top of those already included in the electricity-only tutorial: +which will result in the following jobs ``snakemake`` wants to run, some of +which were already included in the electricity-only tutorial: .. code:: bash - job count min threads max threads - ------------------------------------------------ ------- ------------- ------------- - all 1 1 1 - build_ammonia_production 1 1 1 - build_biomass_potentials 1 1 1 - build_clustered_population_layouts 1 1 1 - build_cop_profiles 1 1 1 - build_gas_input_locations 1 1 1 - build_gas_network 1 1 1 - build_heat_demands 3 1 1 - build_industrial_distribution_key 1 1 1 - build_industrial_energy_demand_per_country_today 1 1 1 - build_industrial_energy_demand_per_node 1 1 1 - build_industrial_energy_demand_per_node_today 1 1 1 - build_industrial_production_per_country 1 1 1 - build_industrial_production_per_country_tomorrow 1 1 1 - build_industrial_production_per_node 1 1 1 - build_industry_sector_ratios 1 1 1 - build_population_weighted_energy_totals 1 1 1 - build_salt_cavern_potentials 1 1 1 - build_shipping_demand 1 1 1 - build_simplified_population_layouts 1 1 1 - build_solar_thermal_profiles 3 1 1 - build_temperature_profiles 3 1 1 - build_transport_demand 1 1 1 - cluster_gas_network 1 1 1 - cluster_network 1 1 1 - copy_config 1 1 1 - make_summary 1 1 1 - plot_network 1 1 1 - plot_summary 1 1 1 - prepare_sector_network 1 1 1 - retrieve_gas_infrastructure_data 1 1 1 - retrieve_sector_databundle 1 1 1 - solve_sector_network 1 1 1 + job count + ------------------------------------------------ ------- + add_electricity 1 + add_extra_components 1 + all 1 + base_network 1 + build_ammonia_production 1 + build_biomass_potentials 1 + build_bus_regions 1 + build_clustered_population_layouts 1 + build_cop_profiles 1 + build_daily_heat_demand 1 + build_district_heat_share 1 + build_electricity_demand 1 + build_energy_totals 1 + build_gas_input_locations 1 + build_gas_network 1 + build_hourly_heat_demand 1 + build_industrial_distribution_key 1 + build_industrial_energy_demand_per_country_today 1 + build_industrial_energy_demand_per_node 1 + build_industrial_energy_demand_per_node_today 1 + build_industrial_production_per_country 1 + build_industrial_production_per_country_tomorrow 1 + build_industrial_production_per_node 1 + build_industry_sector_ratios 1 + build_industry_sector_ratios_intermediate 1 + build_population_layouts 1 + build_population_weighted_energy_totals 1 + build_powerplants 1 + build_renewable_profiles 4 + build_salt_cavern_potentials 1 + build_shapes 1 + build_ship_raster 1 + build_shipping_demand 1 + build_simplified_population_layouts 1 + build_temperature_profiles 3 + build_transport_demand 1 + cluster_gas_network 1 + cluster_network 1 + copy_config 1 + make_summary 1 + plot_gas_network 1 + plot_hydrogen_network 1 + plot_power_network 1 + plot_power_network_clustered 1 + plot_summary 1 + prepare_network 1 + prepare_sector_network 1 + retrieve_cost_data 1 + retrieve_databundle 1 + retrieve_electricity_demand 1 + retrieve_gas_infrastructure_data 1 + retrieve_natura_raster 1 + retrieve_sector_databundle 1 + simplify_network 1 + solve_sector_network 1 + total 60 This covers the retrieval of additional raw data from online resources and preprocessing data about the transport, industry, and heating sectors as well as @@ -119,162 +142,235 @@ successfully. graph[bgcolor=white, margin=0]; node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2]; edge[penwidth=2, color=grey]; - 0[label = "all", color = "0.51 0.6 0.85", style="rounded"]; - 1[label = "plot_summary", color = "0.54 0.6 0.85", style="rounded"]; - 2[label = "make_summary", color = "0.44 0.6 0.85", style="rounded"]; - 3[label = "solve_sector_network", color = "0.46 0.6 0.85", style="rounded"]; - 4[label = "prepare_sector_network", color = "0.09 0.6 0.85", style="rounded"]; - 5[label = "cluster_gas_network", color = "0.38 0.6 0.85", style="rounded"]; - 6[label = "build_gas_network", color = "0.00 0.6 0.85", style="rounded"]; - 7[label = "retrieve_gas_infrastructure_data", color = "0.33 0.6 0.85", style="rounded"]; - 8[label = "cluster_network", color = "0.26 0.6 0.85", style="rounded"]; - 9[label = "simplify_network", color = "0.03 0.6 0.85", style="rounded"]; - 10[label = "add_electricity", color = "0.25 0.6 0.85", style="rounded"]; - 11[label = "build_renewable_profiles", color = "0.07 0.6 0.85", style="rounded"]; - 12[label = "base_network", color = "0.16 0.6 0.85", style="rounded"]; - 13[label = "build_shapes", color = "0.65 0.6 0.85", style="rounded"]; - 14[label = "retrieve_databundle", color = "0.20 0.6 0.85", style="rounded"]; - 15[label = "retrieve_natura_raster", color = "0.10 0.6 0.85", style="rounded"]; - 16[label = "build_bus_regions", color = "0.11 0.6 0.85", style="rounded"]; - 17[label = "build_ship_raster", color = "0.56 0.6 0.85", style="rounded"]; - 18[label = "retrieve_ship_raster", color = "0.15 0.6 0.85", style="rounded"]; - 19[label = "retrieve_cost_data", color = "0.50 0.6 0.85", style="rounded"]; - 20[label = "build_powerplants", color = "0.49 0.6 0.85", style="rounded"]; - 21[label = "build_electricity_demand", color = "0.39 0.6 0.85", style="rounded"]; - 22[label = "retrieve_electricity_demand", color = "0.05 0.6 0.85", style="rounded"]; - 23[label = "build_gas_input_locations", color = "0.45 0.6 0.85", style="rounded"]; - 24[label = "prepare_network", color = "0.31 0.6 0.85", style="rounded"]; - 25[label = "add_extra_components", color = "0.23 0.6 0.85", style="rounded"]; - 26[label = "build_energy_totals", color = "0.19 0.6 0.85", style="rounded"]; - 27[label = "build_population_weighted_energy_totals", color = "0.27 0.6 0.85", style="rounded"]; - 28[label = "build_clustered_population_layouts", color = "0.64 0.6 0.85", style="rounded"]; - 29[label = "build_population_layouts", color = "0.43 0.6 0.85", style="rounded"]; - 30[label = "build_shipping_demand", color = "0.57 0.6 0.85", style="rounded"]; - 31[label = "build_transport_demand", color = "0.53 0.6 0.85", style="rounded"]; - 32[label = "build_temperature_profiles", color = "0.58 0.6 0.85", style="rounded"]; - 33[label = "build_biomass_potentials", color = "0.30 0.6 0.85", style="rounded"]; - 34[label = "build_salt_cavern_potentials", color = "0.47 0.6 0.85", style="rounded"]; - 35[label = "build_simplified_population_layouts", color = "0.32 0.6 0.85", style="rounded"]; - 36[label = "build_industrial_energy_demand_per_node", color = "0.14 0.6 0.85", style="rounded"]; - 37[label = "build_industry_sector_ratios", color = "0.18 0.6 0.85", style="rounded"]; - 38[label = "build_ammonia_production", color = "0.48 0.6 0.85", style="rounded"]; - 39[label = "build_industrial_production_per_node", color = "0.12 0.6 0.85", style="rounded"]; - 40[label = "build_industrial_distribution_key", color = "0.61 0.6 0.85", style="rounded"]; - 41[label = "build_industrial_production_per_country_tomorrow", color = "0.22 0.6 0.85", style="rounded"]; - 42[label = "build_industrial_production_per_country", color = "0.59 0.6 0.85", style="rounded"]; - 43[label = "build_industrial_energy_demand_per_node_today", color = "0.62 0.6 0.85", style="rounded"]; - 44[label = "build_industrial_energy_demand_per_country_today", color = "0.41 0.6 0.85", style="rounded"]; - 45[label = "build_heat_demands", color = "0.08 0.6 0.85", style="rounded"]; - 46[label = "build_cop_profiles", color = "0.52 0.6 0.85", style="rounded"]; - 47[label = "build_solar_thermal_profiles", color = "0.17 0.6 0.85", style="rounded"]; - 48[label = "copy_config", color = "0.40 0.6 0.85", style="rounded"]; - 49[label = "plot_network", color = "0.60 0.6 0.85", style="rounded"]; - 1 -> 0 - 2 -> 1 - 49 -> 2 - 19 -> 2 - 3 -> 2 - 48 -> 3 - 4 -> 3 - 19 -> 3 - 9 -> 4 - 11 -> 4 - 45 -> 4 - 36 -> 4 - 47 -> 4 - 26 -> 4 - 27 -> 4 - 8 -> 4 - 33 -> 4 - 24 -> 4 - 35 -> 4 - 5 -> 4 - 23 -> 4 - 34 -> 4 - 19 -> 4 - 31 -> 4 - 46 -> 4 - 30 -> 4 - 32 -> 4 - 28 -> 4 - 6 -> 5 - 8 -> 5 - 7 -> 6 - 19 -> 8 - 9 -> 8 - 19 -> 9 - 10 -> 9 - 16 -> 9 - 14 -> 10 - 21 -> 10 - 20 -> 10 - 19 -> 10 - 11 -> 10 - 16 -> 10 - 13 -> 10 - 12 -> 10 - 14 -> 11 - 17 -> 11 - 15 -> 11 - 16 -> 11 - 12 -> 11 - 13 -> 11 - 13 -> 12 - 14 -> 13 - 12 -> 16 - 13 -> 16 - 18 -> 17 - 12 -> 20 - 22 -> 21 - 8 -> 23 - 7 -> 23 - 25 -> 24 - 19 -> 24 - 19 -> 25 - 8 -> 25 - 13 -> 26 - 28 -> 27 - 26 -> 27 - 8 -> 28 - 29 -> 28 - 13 -> 29 - 13 -> 30 - 8 -> 30 - 26 -> 30 - 32 -> 31 - 28 -> 31 - 27 -> 31 - 26 -> 31 - 8 -> 32 - 29 -> 32 - 13 -> 33 - 14 -> 33 - 8 -> 33 - 8 -> 34 - 9 -> 35 - 29 -> 35 - 37 -> 36 - 39 -> 36 - 43 -> 36 - 38 -> 37 - 41 -> 39 - 40 -> 39 - 28 -> 40 - 8 -> 40 - 42 -> 41 - 38 -> 42 - 44 -> 43 - 40 -> 43 - 38 -> 44 - 42 -> 44 - 8 -> 45 - 29 -> 45 - 32 -> 46 - 8 -> 47 - 29 -> 47 - 8 -> 49 - 3 -> 49 - } + 0[label = "all", color = "0.55 0.6 0.85", style="rounded"]; + 1[label = "plot_summary", color = "0.31 0.6 0.85", style="rounded"]; + 2[label = "make_summary", color = "0.37 0.6 0.85", style="rounded"]; + 3[label = "plot_power_network_clustered", color = "0.50 0.6 0.85", style="rounded"]; + 4[label = "cluster_network\nclusters: 5", color = "0.62 0.6 0.85", style="rounded"]; + 5[label = "simplify_network\nsimpl: ", color = "0.18 0.6 0.85", style="rounded"]; + 6[label = "add_electricity", color = "0.33 0.6 0.85", style="rounded"]; + 7[label = "build_renewable_profiles\ntechnology: solar", color = "0.20 0.6 0.85", style="rounded"]; + 8[label = "base_network", color = "0.31 0.6 0.85", style="rounded"]; + 9[label = "build_shapes", color = "0.36 0.6 0.85", style="rounded"]; + 10[label = "retrieve_databundle", color = "0.29 0.6 0.85", style="rounded"]; + 11[label = "retrieve_natura_raster", color = "0.01 0.6 0.85", style="rounded"]; + 12[label = "build_bus_regions", color = "0.10 0.6 0.85", style="rounded"]; + 13[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.37 0.6 0.85", style="rounded,dashed"]; + 14[label = "build_renewable_profiles\ntechnology: onwind", color = "0.20 0.6 0.85", style="rounded"]; + 15[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.20 0.6 0.85", style="rounded"]; + 16[label = "build_ship_raster", color = "0.64 0.6 0.85", style="rounded"]; + 17[label = "retrieve_ship_raster", color = "0.64 0.6 0.85", style="rounded,dashed"]; + 18[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.20 0.6 0.85", style="rounded"]; + 19[label = "retrieve_cost_data\nyear: 2030", color = "0.12 0.6 0.85", style="rounded"]; + 20[label = "build_powerplants", color = "0.23 0.6 0.85", style="rounded"]; + 21[label = "build_electricity_demand", color = "0.54 0.6 0.85", style="rounded"]; + 22[label = "retrieve_electricity_demand", color = "0.07 0.6 0.85", style="rounded"]; + 23[label = "solve_sector_network", color = "0.41 0.6 0.85", style="rounded"]; + 24[label = "prepare_sector_network\nsector_opts: CO2L0-24h-T-H-B-I-A-dist1", color = "0.22 0.6 0.85", style="rounded"]; + 25[label = "cluster_gas_network", color = "0.24 0.6 0.85", style="rounded"]; + 26[label = "build_gas_network", color = "0.10 0.6 0.85", style="rounded"]; + 27[label = "retrieve_gas_infrastructure_data", color = "0.17 0.6 0.85", style="rounded"]; + 28[label = "build_gas_input_locations", color = "0.16 0.6 0.85", style="rounded"]; + 29[label = "prepare_network\nll: v1.5\nopts: ", color = "0.49 0.6 0.85", style="rounded"]; + 30[label = "add_extra_components", color = "0.14 0.6 0.85", style="rounded"]; + 31[label = "build_energy_totals", color = "0.39 0.6 0.85", style="rounded"]; + 32[label = "retrieve_sector_databundle", color = "0.58 0.6 0.85", style="rounded"]; + 33[label = "build_population_weighted_energy_totals", color = "0.56 0.6 0.85", style="rounded"]; + 34[label = "build_clustered_population_layouts", color = "0.49 0.6 0.85", style="rounded"]; + 35[label = "build_population_layouts", color = "0.06 0.6 0.85", style="rounded"]; + 36[label = "build_shipping_demand", color = "0.47 0.6 0.85", style="rounded"]; + 37[label = "build_transport_demand", color = "0.45 0.6 0.85", style="rounded"]; + 38[label = "build_temperature_profiles\nscope: total", color = "0.04 0.6 0.85", style="rounded"]; + 39[label = "build_biomass_potentials\nplanning_horizons: 2030", color = "0.11 0.6 0.85", style="rounded"]; + 40[label = "build_salt_cavern_potentials", color = "0.15 0.6 0.85", style="rounded"]; + 41[label = "build_simplified_population_layouts", color = "0.46 0.6 0.85", style="rounded"]; + 42[label = "build_industrial_energy_demand_per_node", color = "0.63 0.6 0.85", style="rounded"]; + 43[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2030", color = "0.07 0.6 0.85", style="rounded"]; + 44[label = "build_industry_sector_ratios", color = "0.59 0.6 0.85", style="rounded"]; + 45[label = "build_ammonia_production", color = "0.04 0.6 0.85", style="rounded"]; + 46[label = "build_industrial_energy_demand_per_country_today", color = "0.44 0.6 0.85", style="rounded"]; + 47[label = "build_industrial_production_per_country", color = "0.34 0.6 0.85", style="rounded"]; + 48[label = "build_industrial_production_per_node", color = "0.26 0.6 0.85", style="rounded"]; + 49[label = "build_industrial_distribution_key", color = "0.13 0.6 0.85", style="rounded"]; + 50[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2030", color = "0.32 0.6 0.85", style="rounded"]; + 51[label = "build_industrial_energy_demand_per_node_today", color = "0.48 0.6 0.85", style="rounded"]; + 52[label = "build_hourly_heat_demand", color = "0.28 0.6 0.85", style="rounded"]; + 53[label = "build_daily_heat_demand\nscope: total", color = "0.28 0.6 0.85", style="rounded"]; + 54[label = "build_district_heat_share\nplanning_horizons: 2030", color = "0.52 0.6 0.85", style="rounded"]; + 55[label = "build_temperature_profiles\nscope: rural", color = "0.04 0.6 0.85", style="rounded"]; + 56[label = "build_temperature_profiles\nscope: urban", color = "0.04 0.6 0.85", style="rounded"]; + 57[label = "build_cop_profiles", color = "0.38 0.6 0.85", style="rounded"]; + 58[label = "copy_config", color = "0.19 0.6 0.85", style="rounded"]; + 59[label = "plot_power_network", color = "0.60 0.6 0.85", style="rounded"]; + 60[label = "plot_hydrogen_network", color = "0.27 0.6 0.85", style="rounded"]; + 61[label = "plot_gas_network", color = "0.08 0.6 0.85", style="rounded"]; + 1 -> 0 + 2 -> 1 + 32 -> 1 + 3 -> 2 + 23 -> 2 + 19 -> 2 + 59 -> 2 + 60 -> 2 + 61 -> 2 + 4 -> 3 + 5 -> 4 + 19 -> 4 + 6 -> 5 + 19 -> 5 + 12 -> 5 + 7 -> 6 + 14 -> 6 + 15 -> 6 + 18 -> 6 + 8 -> 6 + 19 -> 6 + 12 -> 6 + 20 -> 6 + 10 -> 6 + 21 -> 6 + 9 -> 6 + 8 -> 7 + 10 -> 7 + 11 -> 7 + 9 -> 7 + 12 -> 7 + 13 -> 7 + 9 -> 8 + 10 -> 9 + 9 -> 12 + 8 -> 12 + 8 -> 14 + 10 -> 14 + 11 -> 14 + 9 -> 14 + 12 -> 14 + 13 -> 14 + 8 -> 15 + 10 -> 15 + 11 -> 15 + 16 -> 15 + 9 -> 15 + 12 -> 15 + 13 -> 15 + 17 -> 16 + 13 -> 16 + 8 -> 18 + 10 -> 18 + 11 -> 18 + 16 -> 18 + 9 -> 18 + 12 -> 18 + 13 -> 18 + 8 -> 20 + 22 -> 21 + 24 -> 23 + 58 -> 23 + 25 -> 24 + 28 -> 24 + 29 -> 24 + 31 -> 24 + 32 -> 24 + 33 -> 24 + 36 -> 24 + 37 -> 24 + 39 -> 24 + 19 -> 24 + 15 -> 24 + 18 -> 24 + 40 -> 24 + 5 -> 24 + 4 -> 24 + 34 -> 24 + 41 -> 24 + 42 -> 24 + 52 -> 24 + 54 -> 24 + 38 -> 24 + 55 -> 24 + 56 -> 24 + 57 -> 24 + 26 -> 25 + 4 -> 25 + 27 -> 26 + 27 -> 28 + 4 -> 28 + 30 -> 29 + 19 -> 29 + 4 -> 30 + 19 -> 30 + 9 -> 31 + 32 -> 31 + 31 -> 33 + 34 -> 33 + 35 -> 34 + 4 -> 34 + 13 -> 34 + 9 -> 35 + 13 -> 35 + 9 -> 36 + 4 -> 36 + 31 -> 36 + 34 -> 37 + 33 -> 37 + 31 -> 37 + 32 -> 37 + 38 -> 37 + 35 -> 38 + 4 -> 38 + 13 -> 38 + 32 -> 39 + 4 -> 39 + 10 -> 39 + 9 -> 39 + 32 -> 40 + 4 -> 40 + 35 -> 41 + 5 -> 41 + 13 -> 41 + 43 -> 42 + 48 -> 42 + 51 -> 42 + 44 -> 43 + 46 -> 43 + 47 -> 43 + 45 -> 44 + 32 -> 44 + 32 -> 45 + 32 -> 46 + 47 -> 46 + 45 -> 47 + 32 -> 47 + 49 -> 48 + 50 -> 48 + 4 -> 49 + 34 -> 49 + 32 -> 49 + 47 -> 50 + 49 -> 51 + 46 -> 51 + 53 -> 52 + 35 -> 53 + 4 -> 53 + 13 -> 53 + 31 -> 54 + 34 -> 54 + 35 -> 55 + 4 -> 55 + 13 -> 55 + 35 -> 56 + 4 -> 56 + 13 -> 56 + 38 -> 57 + 55 -> 57 + 56 -> 57 + 23 -> 59 + 4 -> 59 + 23 -> 60 + 4 -> 60 + 23 -> 61 + 4 -> 61 + } | @@ -320,23 +416,10 @@ To run a myopic foresight scenario with the specifications above, run snakemake -call all --configfile config/test/config.myopic.yaml -which will result in the following *additional* jobs ``snakemake`` wants to run: - -.. code:: bash - - job count min threads max threads - ------------------------------------------------ ------- ------------- ------------- - all 1 1 1 - add_brownfield 2 1 1 - add_existing_baseyear 1 1 1 - plot_network 3 1 1 - plot_summary 1 1 1 - prepare_sector_network 3 1 1 - solve_sector_network_myopic 3 1 1 - -which translates to the following workflow diagram which nicely outlines -how the sequential pathway optimisation with myopic foresight is -implemented in the workflow: +which will result in additional jobs ``snakemake`` wants to run, which +translates to the following workflow diagram which nicely outlines how the +sequential pathway optimisation with myopic foresight is implemented in the +workflow: .. graphviz:: :class: full-width @@ -346,165 +429,387 @@ implemented in the workflow: graph[bgcolor=white, margin=0]; node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2]; edge[penwidth=2, color=grey]; - 0[label = "all", color = "0.38 0.6 0.85", style="rounded"]; - 1[label = "plot_summary", color = "0.61 0.6 0.85", style="rounded"]; - 2[label = "make_summary", color = "0.51 0.6 0.85", style="rounded"]; - 3[label = "solve_sector_network_myopic", color = "0.32 0.6 0.85", style="rounded"]; - 4[label = "add_existing_baseyear", color = "0.20 0.6 0.85", style="rounded"]; - 5[label = "prepare_sector_network", color = "0.14 0.6 0.85", style="rounded"]; - 6[label = "prepare_network", color = "0.06 0.6 0.85", style="rounded"]; - 7[label = "add_extra_components", color = "0.00 0.6 0.85", style="rounded"]; - 8[label = "cluster_network", color = "0.18 0.6 0.85", style="rounded"]; - 9[label = "simplify_network", color = "0.30 0.6 0.85", style="rounded"]; - 10[label = "add_electricity", color = "0.24 0.6 0.85", style="rounded"]; - 11[label = "build_renewable_profiles", color = "0.40 0.6 0.85", style="rounded"]; - 12[label = "base_network", color = "0.11 0.6 0.85", style="rounded"]; - 13[label = "build_shapes", color = "0.29 0.6 0.85", style="rounded"]; - 14[label = "retrieve_databundle", color = "0.58 0.6 0.85", style="rounded"]; - 15[label = "retrieve_natura_raster", color = "0.39 0.6 0.85", style="rounded"]; - 16[label = "build_bus_regions", color = "0.60 0.6 0.85", style="rounded"]; - 17[label = "build_ship_raster", color = "0.65 0.6 0.85", style="rounded"]; - 18[label = "retrieve_ship_raster", color = "0.09 0.6 0.85", style="rounded"]; - 19[label = "retrieve_cost_data", color = "0.04 0.6 0.85", style="rounded"]; - 20[label = "build_powerplants", color = "0.28 0.6 0.85", style="rounded"]; - 21[label = "build_electricity_demand", color = "0.46 0.6 0.85", style="rounded"]; - 22[label = "retrieve_electricity_demand", color = "0.44 0.6 0.85", style="rounded"]; - 23[label = "build_energy_totals", color = "0.53 0.6 0.85", style="rounded"]; - 24[label = "build_population_weighted_energy_totals", color = "0.03 0.6 0.85", style="rounded"]; - 25[label = "build_clustered_population_layouts", color = "0.34 0.6 0.85", style="rounded"]; - 26[label = "build_population_layouts", color = "0.63 0.6 0.85", style="rounded"]; - 27[label = "build_shipping_demand", color = "0.05 0.6 0.85", style="rounded"]; - 28[label = "build_transport_demand", color = "0.52 0.6 0.85", style="rounded"]; - 29[label = "build_temperature_profiles", color = "0.16 0.6 0.85", style="rounded"]; - 30[label = "build_biomass_potentials", color = "0.47 0.6 0.85", style="rounded"]; - 31[label = "build_salt_cavern_potentials", color = "0.48 0.6 0.85", style="rounded"]; - 32[label = "build_simplified_population_layouts", color = "0.08 0.6 0.85", style="rounded"]; - 33[label = "build_industrial_energy_demand_per_node", color = "0.22 0.6 0.85", style="rounded"]; - 34[label = "build_industry_sector_ratios", color = "0.56 0.6 0.85", style="rounded"]; - 35[label = "build_ammonia_production", color = "0.57 0.6 0.85", style="rounded"]; - 36[label = "build_industrial_production_per_node", color = "0.66 0.6 0.85", style="rounded"]; - 37[label = "build_industrial_distribution_key", color = "0.41 0.6 0.85", style="rounded"]; - 38[label = "build_industrial_production_per_country_tomorrow", color = "0.54 0.6 0.85", style="rounded"]; - 39[label = "build_industrial_production_per_country", color = "0.10 0.6 0.85", style="rounded"]; - 40[label = "build_industrial_energy_demand_per_node_today", color = "0.55 0.6 0.85", style="rounded"]; - 41[label = "build_industrial_energy_demand_per_country_today", color = "0.35 0.6 0.85", style="rounded"]; - 42[label = "build_heat_demands", color = "0.49 0.6 0.85", style="rounded"]; - 43[label = "build_cop_profiles", color = "0.01 0.6 0.85", style="rounded"]; - 44[label = "build_solar_thermal_profiles", color = "0.45 0.6 0.85", style="rounded"]; - 45[label = "copy_config", color = "0.33 0.6 0.85", style="rounded"]; - 46[label = "add_brownfield", color = "0.59 0.6 0.85", style="rounded"]; - 47[label = "plot_network", color = "0.15 0.6 0.85", style="rounded"]; - 1 -> 0 - 2 -> 1 - 3 -> 2 - 19 -> 2 - 47 -> 2 - 46 -> 3 - 19 -> 3 - 4 -> 3 - 45 -> 3 - 43 -> 4 - 19 -> 4 - 20 -> 4 - 9 -> 4 - 5 -> 4 - 25 -> 4 - 8 -> 4 - 28 -> 5 - 23 -> 5 - 11 -> 5 - 33 -> 5 - 24 -> 5 - 43 -> 5 - 19 -> 5 - 27 -> 5 - 6 -> 5 - 31 -> 5 - 32 -> 5 - 44 -> 5 - 9 -> 5 - 30 -> 5 - 25 -> 5 - 29 -> 5 - 42 -> 5 - 8 -> 5 - 7 -> 6 - 19 -> 6 - 19 -> 7 - 8 -> 7 - 9 -> 8 - 19 -> 8 - 10 -> 9 - 19 -> 9 - 16 -> 9 - 11 -> 10 - 19 -> 10 - 14 -> 10 - 20 -> 10 - 12 -> 10 - 21 -> 10 - 16 -> 10 - 13 -> 10 - 15 -> 11 - 14 -> 11 - 13 -> 11 - 12 -> 11 - 16 -> 11 - 17 -> 11 - 13 -> 12 - 14 -> 13 - 13 -> 16 - 12 -> 16 - 18 -> 17 - 12 -> 20 - 22 -> 21 - 13 -> 23 - 25 -> 24 - 23 -> 24 - 8 -> 25 - 26 -> 25 - 13 -> 26 - 13 -> 27 - 23 -> 27 - 8 -> 27 - 24 -> 28 - 25 -> 28 - 29 -> 28 - 23 -> 28 - 8 -> 29 - 26 -> 29 - 13 -> 30 - 14 -> 30 - 8 -> 30 - 8 -> 31 - 9 -> 32 - 26 -> 32 - 34 -> 33 - 36 -> 33 - 40 -> 33 - 35 -> 34 - 37 -> 36 - 38 -> 36 - 25 -> 37 - 8 -> 37 - 39 -> 38 - 35 -> 39 - 41 -> 40 - 37 -> 40 - 39 -> 41 - 35 -> 41 - 8 -> 42 - 26 -> 42 - 29 -> 43 - 8 -> 44 - 26 -> 44 - 3 -> 46 - 19 -> 46 - 5 -> 46 - 43 -> 46 - 3 -> 47 - 8 -> 47 - } + 0[label = "all", color = "0.46 0.6 0.85", style="rounded"]; + 1[label = "plot_summary", color = "0.40 0.6 0.85", style="rounded"]; + 2[label = "make_summary", color = "0.59 0.6 0.85", style="rounded"]; + 3[label = "plot_power_network_clustered", color = "0.17 0.6 0.85", style="rounded"]; + 4[label = "cluster_network\nclusters: 5", color = "0.49 0.6 0.85", style="rounded"]; + 5[label = "simplify_network\nsimpl: ", color = "0.16 0.6 0.85", style="rounded"]; + 6[label = "add_electricity", color = "0.32 0.6 0.85", style="rounded"]; + 7[label = "build_renewable_profiles\ntechnology: solar", color = "0.63 0.6 0.85", style="rounded"]; + 8[label = "base_network", color = "0.12 0.6 0.85", style="rounded"]; + 9[label = "build_shapes", color = "0.23 0.6 0.85", style="rounded"]; + 10[label = "retrieve_databundle", color = "0.61 0.6 0.85", style="rounded"]; + 11[label = "retrieve_natura_raster", color = "0.50 0.6 0.85", style="rounded"]; + 12[label = "build_bus_regions", color = "0.51 0.6 0.85", style="rounded"]; + 13[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.37 0.6 0.85", style="rounded,dashed"]; + 14[label = "build_renewable_profiles\ntechnology: onwind", color = "0.63 0.6 0.85", style="rounded"]; + 15[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.63 0.6 0.85", style="rounded"]; + 16[label = "build_ship_raster", color = "0.24 0.6 0.85", style="rounded"]; + 17[label = "retrieve_ship_raster", color = "0.14 0.6 0.85", style="rounded,dashed"]; + 18[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.63 0.6 0.85", style="rounded"]; + 19[label = "retrieve_cost_data\nyear: 2030", color = "0.04 0.6 0.85", style="rounded"]; + 20[label = "build_powerplants", color = "0.58 0.6 0.85", style="rounded"]; + 21[label = "build_electricity_demand", color = "0.04 0.6 0.85", style="rounded"]; + 22[label = "retrieve_electricity_demand", color = "0.62 0.6 0.85", style="rounded"]; + 23[label = "solve_sector_network_myopic", color = "0.30 0.6 0.85", style="rounded"]; + 24[label = "add_existing_baseyear", color = "0.34 0.6 0.85", style="rounded"]; + 25[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.42 0.6 0.85", style="rounded"]; + 26[label = "cluster_gas_network", color = "0.39 0.6 0.85", style="rounded"]; + 27[label = "build_gas_network", color = "0.59 0.6 0.85", style="rounded"]; + 28[label = "retrieve_gas_infrastructure_data", color = "0.15 0.6 0.85", style="rounded"]; + 29[label = "build_gas_input_locations", color = "0.07 0.6 0.85", style="rounded"]; + 30[label = "prepare_network\nll: v1.5\nopts: ", color = "0.56 0.6 0.85", style="rounded"]; + 31[label = "add_extra_components", color = "0.11 0.6 0.85", style="rounded"]; + 32[label = "build_energy_totals", color = "0.18 0.6 0.85", style="rounded"]; + 33[label = "retrieve_sector_databundle", color = "0.06 0.6 0.85", style="rounded"]; + 34[label = "build_population_weighted_energy_totals", color = "0.03 0.6 0.85", style="rounded"]; + 35[label = "build_clustered_population_layouts", color = "0.25 0.6 0.85", style="rounded"]; + 36[label = "build_population_layouts", color = "0.57 0.6 0.85", style="rounded"]; + 37[label = "build_shipping_demand", color = "0.45 0.6 0.85", style="rounded"]; + 38[label = "build_transport_demand", color = "0.18 0.6 0.85", style="rounded"]; + 39[label = "build_temperature_profiles\nscope: total", color = "0.54 0.6 0.85", style="rounded"]; + 40[label = "build_biomass_potentials\nplanning_horizons: 2030", color = "0.41 0.6 0.85", style="rounded"]; + 41[label = "build_salt_cavern_potentials", color = "0.02 0.6 0.85", style="rounded"]; + 42[label = "build_simplified_population_layouts", color = "0.15 0.6 0.85", style="rounded"]; + 43[label = "build_industrial_energy_demand_per_node", color = "0.47 0.6 0.85", style="rounded"]; + 44[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2030", color = "0.31 0.6 0.85", style="rounded"]; + 45[label = "build_industry_sector_ratios", color = "0.48 0.6 0.85", style="rounded"]; + 46[label = "build_ammonia_production", color = "0.00 0.6 0.85", style="rounded"]; + 47[label = "build_industrial_energy_demand_per_country_today", color = "0.32 0.6 0.85", style="rounded"]; + 48[label = "build_industrial_production_per_country", color = "0.60 0.6 0.85", style="rounded"]; + 49[label = "build_industrial_production_per_node", color = "0.05 0.6 0.85", style="rounded"]; + 50[label = "build_industrial_distribution_key", color = "0.21 0.6 0.85", style="rounded"]; + 51[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2030", color = "0.33 0.6 0.85", style="rounded"]; + 52[label = "build_industrial_energy_demand_per_node_today", color = "0.62 0.6 0.85", style="rounded"]; + 53[label = "build_hourly_heat_demand", color = "0.28 0.6 0.85", style="rounded"]; + 54[label = "build_daily_heat_demand\nscope: total", color = "0.22 0.6 0.85", style="rounded"]; + 55[label = "build_district_heat_share\nplanning_horizons: 2030", color = "0.21 0.6 0.85", style="rounded"]; + 56[label = "build_temperature_profiles\nscope: rural", color = "0.54 0.6 0.85", style="rounded"]; + 57[label = "build_temperature_profiles\nscope: urban", color = "0.54 0.6 0.85", style="rounded"]; + 58[label = "build_cop_profiles", color = "0.52 0.6 0.85", style="rounded"]; + 59[label = "build_existing_heating_distribution", color = "0.09 0.6 0.85", style="rounded"]; + 60[label = "copy_config", color = "0.42 0.6 0.85", style="rounded"]; + 61[label = "solve_sector_network_myopic", color = "0.30 0.6 0.85", style="rounded"]; + 62[label = "add_brownfield", color = "0.10 0.6 0.85", style="rounded"]; + 63[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.42 0.6 0.85", style="rounded"]; + 64[label = "build_biomass_potentials\nplanning_horizons: 2040", color = "0.41 0.6 0.85", style="rounded"]; + 65[label = "retrieve_cost_data\nyear: 2040", color = "0.04 0.6 0.85", style="rounded"]; + 66[label = "build_industrial_energy_demand_per_node", color = "0.47 0.6 0.85", style="rounded"]; + 67[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2040", color = "0.31 0.6 0.85", style="rounded"]; + 68[label = "build_industrial_production_per_node", color = "0.05 0.6 0.85", style="rounded"]; + 69[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2040", color = "0.33 0.6 0.85", style="rounded"]; + 70[label = "build_district_heat_share\nplanning_horizons: 2040", color = "0.21 0.6 0.85", style="rounded"]; + 71[label = "solve_sector_network_myopic", color = "0.30 0.6 0.85", style="rounded"]; + 72[label = "add_brownfield", color = "0.10 0.6 0.85", style="rounded"]; + 73[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.42 0.6 0.85", style="rounded"]; + 74[label = "build_biomass_potentials\nplanning_horizons: 2050", color = "0.41 0.6 0.85", style="rounded"]; + 75[label = "retrieve_cost_data\nyear: 2050", color = "0.04 0.6 0.85", style="rounded"]; + 76[label = "build_industrial_energy_demand_per_node", color = "0.47 0.6 0.85", style="rounded"]; + 77[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2050", color = "0.31 0.6 0.85", style="rounded"]; + 78[label = "build_industrial_production_per_node", color = "0.05 0.6 0.85", style="rounded"]; + 79[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2050", color = "0.33 0.6 0.85", style="rounded"]; + 80[label = "build_district_heat_share\nplanning_horizons: 2050", color = "0.21 0.6 0.85", style="rounded"]; + 81[label = "plot_power_network", color = "0.48 0.6 0.85", style="rounded"]; + 82[label = "plot_power_network", color = "0.48 0.6 0.85", style="rounded"]; + 83[label = "plot_power_network", color = "0.48 0.6 0.85", style="rounded"]; + 84[label = "plot_hydrogen_network", color = "0.37 0.6 0.85", style="rounded"]; + 85[label = "plot_hydrogen_network", color = "0.37 0.6 0.85", style="rounded"]; + 86[label = "plot_hydrogen_network", color = "0.37 0.6 0.85", style="rounded"]; + 1 -> 0 + 2 -> 1 + 33 -> 1 + 3 -> 2 + 23 -> 2 + 61 -> 2 + 71 -> 2 + 19 -> 2 + 81 -> 2 + 82 -> 2 + 83 -> 2 + 84 -> 2 + 85 -> 2 + 86 -> 2 + 4 -> 3 + 5 -> 4 + 19 -> 4 + 6 -> 5 + 19 -> 5 + 12 -> 5 + 7 -> 6 + 14 -> 6 + 15 -> 6 + 18 -> 6 + 8 -> 6 + 19 -> 6 + 12 -> 6 + 20 -> 6 + 10 -> 6 + 21 -> 6 + 9 -> 6 + 8 -> 7 + 10 -> 7 + 11 -> 7 + 9 -> 7 + 12 -> 7 + 13 -> 7 + 9 -> 8 + 10 -> 9 + 9 -> 12 + 8 -> 12 + 8 -> 14 + 10 -> 14 + 11 -> 14 + 9 -> 14 + 12 -> 14 + 13 -> 14 + 8 -> 15 + 10 -> 15 + 11 -> 15 + 16 -> 15 + 9 -> 15 + 12 -> 15 + 13 -> 15 + 17 -> 16 + 13 -> 16 + 8 -> 18 + 10 -> 18 + 11 -> 18 + 16 -> 18 + 9 -> 18 + 12 -> 18 + 13 -> 18 + 8 -> 20 + 22 -> 21 + 24 -> 23 + 19 -> 23 + 60 -> 23 + 25 -> 24 + 20 -> 24 + 5 -> 24 + 4 -> 24 + 35 -> 24 + 19 -> 24 + 58 -> 24 + 59 -> 24 + 26 -> 25 + 29 -> 25 + 30 -> 25 + 32 -> 25 + 33 -> 25 + 34 -> 25 + 37 -> 25 + 38 -> 25 + 40 -> 25 + 19 -> 25 + 15 -> 25 + 18 -> 25 + 41 -> 25 + 5 -> 25 + 4 -> 25 + 35 -> 25 + 42 -> 25 + 43 -> 25 + 53 -> 25 + 55 -> 25 + 39 -> 25 + 56 -> 25 + 57 -> 25 + 58 -> 25 + 27 -> 26 + 4 -> 26 + 28 -> 27 + 28 -> 29 + 4 -> 29 + 31 -> 30 + 19 -> 30 + 4 -> 31 + 19 -> 31 + 9 -> 32 + 33 -> 32 + 32 -> 34 + 35 -> 34 + 36 -> 35 + 4 -> 35 + 13 -> 35 + 9 -> 36 + 13 -> 36 + 9 -> 37 + 4 -> 37 + 32 -> 37 + 35 -> 38 + 34 -> 38 + 32 -> 38 + 33 -> 38 + 39 -> 38 + 36 -> 39 + 4 -> 39 + 13 -> 39 + 33 -> 40 + 4 -> 40 + 10 -> 40 + 9 -> 40 + 33 -> 41 + 4 -> 41 + 36 -> 42 + 5 -> 42 + 13 -> 42 + 44 -> 43 + 49 -> 43 + 52 -> 43 + 45 -> 44 + 47 -> 44 + 48 -> 44 + 46 -> 45 + 33 -> 45 + 33 -> 46 + 33 -> 47 + 48 -> 47 + 46 -> 48 + 33 -> 48 + 50 -> 49 + 51 -> 49 + 4 -> 50 + 35 -> 50 + 33 -> 50 + 48 -> 51 + 50 -> 52 + 47 -> 52 + 54 -> 53 + 36 -> 54 + 4 -> 54 + 13 -> 54 + 32 -> 55 + 35 -> 55 + 36 -> 56 + 4 -> 56 + 13 -> 56 + 36 -> 57 + 4 -> 57 + 13 -> 57 + 39 -> 58 + 56 -> 58 + 57 -> 58 + 35 -> 59 + 34 -> 59 + 55 -> 59 + 62 -> 61 + 65 -> 61 + 60 -> 61 + 7 -> 62 + 14 -> 62 + 15 -> 62 + 18 -> 62 + 5 -> 62 + 4 -> 62 + 63 -> 62 + 23 -> 62 + 65 -> 62 + 58 -> 62 + 26 -> 63 + 29 -> 63 + 30 -> 63 + 32 -> 63 + 33 -> 63 + 34 -> 63 + 37 -> 63 + 38 -> 63 + 64 -> 63 + 65 -> 63 + 15 -> 63 + 18 -> 63 + 41 -> 63 + 5 -> 63 + 4 -> 63 + 35 -> 63 + 42 -> 63 + 66 -> 63 + 53 -> 63 + 70 -> 63 + 39 -> 63 + 56 -> 63 + 57 -> 63 + 58 -> 63 + 33 -> 64 + 4 -> 64 + 10 -> 64 + 9 -> 64 + 67 -> 66 + 68 -> 66 + 52 -> 66 + 45 -> 67 + 47 -> 67 + 48 -> 67 + 50 -> 68 + 69 -> 68 + 48 -> 69 + 32 -> 70 + 35 -> 70 + 72 -> 71 + 75 -> 71 + 60 -> 71 + 7 -> 72 + 14 -> 72 + 15 -> 72 + 18 -> 72 + 5 -> 72 + 4 -> 72 + 73 -> 72 + 61 -> 72 + 75 -> 72 + 58 -> 72 + 26 -> 73 + 29 -> 73 + 30 -> 73 + 32 -> 73 + 33 -> 73 + 34 -> 73 + 37 -> 73 + 38 -> 73 + 74 -> 73 + 75 -> 73 + 15 -> 73 + 18 -> 73 + 41 -> 73 + 5 -> 73 + 4 -> 73 + 35 -> 73 + 42 -> 73 + 76 -> 73 + 53 -> 73 + 80 -> 73 + 39 -> 73 + 56 -> 73 + 57 -> 73 + 58 -> 73 + 33 -> 74 + 4 -> 74 + 10 -> 74 + 9 -> 74 + 77 -> 76 + 78 -> 76 + 52 -> 76 + 45 -> 77 + 47 -> 77 + 48 -> 77 + 50 -> 78 + 79 -> 78 + 48 -> 79 + 32 -> 80 + 35 -> 80 + 23 -> 81 + 4 -> 81 + 61 -> 82 + 4 -> 82 + 71 -> 83 + 4 -> 83 + 23 -> 84 + 4 -> 84 + 61 -> 85 + 4 -> 85 + 71 -> 86 + 4 -> 86 + } | diff --git a/graphics/workflow.png b/graphics/workflow.png index a43f240ddd2433dbe5b735f97a59e63b667c66c7..a7fbc5add57498182dab3094d70fb0edd1b3fb75 100644 GIT binary patch literal 680340 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 z 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

=m&%-X( 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

~eS~@=~cU9TDl;Qm-j}{abrC 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

T*!(Uf9VZ<@xBqKx?v@1v)?oi7u&?c1*k}y4VAs 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%0DQ6MgBl4)-R6pyB63%@DZ>;CY8uuQ;IxAX;r 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

4;?8|R644r_RUGzE8ywfgpNuIuPvbc+N{X#;8 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 literal 651103 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%0A>oPOA;^#&ExE1b4C?#5gurd^EK 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 ?7H&&^XhVrsSe`O`}WIwPuUGfycq>K-S%uWKrd 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%0D^4(TvuZ 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

-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 Ivgh>w0~}DO-v9sr From f4422f13614757ea3c68f5b378fdaa47b7bfd346 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:17:30 +0000 Subject: [PATCH 458/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Snakefile | 1 + doc/release_notes.rst | 2 +- doc/tutorial_sector.rst | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Snakefile b/Snakefile index ca3e4c49..a44f49ae 100644 --- a/Snakefile +++ b/Snakefile @@ -18,6 +18,7 @@ conf_default_file = os.path.join(workflow.current_basedir, "config/config.defaul if not exists(conf_file) and exists(conf_default_file): copyfile(conf_default_file, conf_file) + configfile: "config/config.default.yaml" configfile: "config/config.yaml" diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 02c686f6..bc1cd2c6 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -9,7 +9,7 @@ Release Notes .. Upcoming Release .. ================ -.. +.. PyPSA-Eur 0.10.0 (19th February 2024) ===================================== diff --git a/doc/tutorial_sector.rst b/doc/tutorial_sector.rst index 3598cdfb..a1556150 100644 --- a/doc/tutorial_sector.rst +++ b/doc/tutorial_sector.rst @@ -370,7 +370,7 @@ successfully. 4 -> 60 23 -> 61 4 -> 61 - } + } | @@ -809,7 +809,7 @@ workflow: 4 -> 85 71 -> 86 4 -> 86 - } + } | From f39fd1441a548d57d3f28e164f8251cf9a586f89 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Mon, 19 Feb 2024 17:23:41 +0100 Subject: [PATCH 459/497] update fixed versions environment.yaml --- envs/environment.fixed.yaml | 928 +++++++++++++++++------------------- 1 file changed, 439 insertions(+), 489 deletions(-) diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index 31a58835..cde0b801 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -4,493 +4,443 @@ name: pypsa-eur channels: -- bioconda -- gurobi -- http://conda.anaconda.org/gurobi -- conda-forge -- defaults + - bioconda + - http://conda.anaconda.org/gurobi + - conda-forge + - defaults dependencies: -- _libgcc_mutex=0.1 -- _openmp_mutex=4.5 -- affine=2.4.0 -- alsa-lib=1.2.10 -- ampl-mp=3.1.0 -- amply=0.1.6 -- anyio=4.2.0 -- appdirs=1.4.4 -- argon2-cffi=23.1.0 -- argon2-cffi-bindings=21.2.0 -- arrow=1.3.0 -- asttokens=2.4.1 -- async-lru=2.0.4 -- atk-1.0=2.38.0 -- atlite=0.2.12 -- attr=2.5.1 -- attrs=23.2.0 -- aws-c-auth=0.7.8 -- aws-c-cal=0.6.9 -- aws-c-common=0.9.10 -- aws-c-compression=0.2.17 -- aws-c-event-stream=0.3.2 -- aws-c-http=0.7.15 -- aws-c-io=0.13.36 -- aws-c-mqtt=0.10.0 -- aws-c-s3=0.4.7 -- aws-c-sdkutils=0.1.13 -- aws-checksums=0.1.17 -- aws-crt-cpp=0.25.1 -- aws-sdk-cpp=1.11.210 -- babel=2.14.0 -- beautifulsoup4=4.12.2 -- bleach=6.1.0 -- blosc=1.21.5 -- bokeh=3.3.2 -- bottleneck=1.3.7 -- branca=0.7.0 -- brotli=1.1.0 -- brotli-bin=1.1.0 -- brotli-python=1.1.0 -- bzip2=1.0.8 -- c-ares=1.24.0 -- c-blosc2=2.12.0 -- ca-certificates=2023.11.17 -- cached-property=1.5.2 -- cached_property=1.5.2 -- cairo=1.18.0 -- cartopy=0.22.0 -- cdsapi=0.6.1 -- certifi=2023.11.17 -- cffi=1.16.0 -- cfitsio=4.3.1 -- cftime=1.6.3 -- charset-normalizer=3.3.2 -- click=8.1.7 -- click-plugins=1.1.1 -- cligj=0.7.2 -- cloudpickle=3.0.0 -- coin-or-cbc=2.10.10 -- coin-or-cgl=0.60.7 -- coin-or-clp=1.17.8 -- coin-or-osi=0.108.8 -- coin-or-utils=2.11.9 -- coincbc=2.10.10 -- colorama=0.4.6 -- comm=0.1.4 -- configargparse=1.7 -- connection_pool=0.0.3 -- contourpy=1.2.0 -- country_converter=1.2 -- cycler=0.12.1 -- cytoolz=0.12.2 -- dask=2023.12.1 -- dask-core=2023.12.1 -- datrie=0.8.2 -- dbus=1.13.6 -- debugpy=1.8.0 -- decorator=5.1.1 -- defusedxml=0.7.1 -- deprecation=2.1.0 -- descartes=1.1.0 -- distributed=2023.12.1 -- distro=1.8.0 -- docutils=0.20.1 -- dpath=2.1.6 -- entrypoints=0.4 -- entsoe-py=0.6.1 -- et_xmlfile=1.1.0 -- exceptiongroup=1.2.0 -- executing=2.0.1 -- expat=2.5.0 -- fiona=1.9.5 -- folium=0.15.1 -- font-ttf-dejavu-sans-mono=2.37 -- font-ttf-inconsolata=3.000 -- font-ttf-source-code-pro=2.038 -- font-ttf-ubuntu=0.83 -- fontconfig=2.14.2 -- fonts-conda-ecosystem=1 -- fonts-conda-forge=1 -- fonttools=4.47.0 -- fqdn=1.5.1 -- freetype=2.12.1 -- freexl=2.0.0 -- fribidi=1.0.10 -- fsspec=2023.12.2 -- gdal=3.7.3 -- gdk-pixbuf=2.42.10 -- geographiclib=1.52 -- geojson-rewind=1.1.0 -- geopandas=0.14.1 -- geopandas-base=0.14.1 -- geopy=2.4.1 -- geos=3.12.1 -- geotiff=1.7.1 -- gettext=0.21.1 -- gflags=2.2.2 -- giflib=5.2.1 -- gitdb=4.0.11 -- gitpython=3.1.40 -- glib=2.78.3 -- glib-tools=2.78.3 -- glog=0.6.0 -- glpk=5.0 -- gmp=6.3.0 -- graphite2=1.3.13 -- graphviz=9.0.0 -- gst-plugins-base=1.22.8 -- gstreamer=1.22.8 -- gtk2=2.24.33 -- gts=0.7.6 -- gurobi=11.0.0 -- harfbuzz=8.3.0 -- hdf4=4.2.15 -- hdf5=1.14.3 -- humanfriendly=10.0 -- icu=73.2 -- idna=3.6 -- importlib-metadata=7.0.1 -- importlib_metadata=7.0.1 -- importlib_resources=6.1.1 -- iniconfig=2.0.0 -- ipopt=3.14.13 -- ipykernel=6.28.0 -- ipython=8.19.0 -- ipywidgets=8.1.1 -- isoduration=20.11.0 -- jedi=0.19.1 -- jinja2=3.1.2 -- joblib=1.3.2 -- json-c=0.17 -- json5=0.9.14 -- jsonpointer=2.4 -- jsonschema=4.20.0 -- jsonschema-specifications=2023.12.1 -- jsonschema-with-format-nongpl=4.20.0 -- jupyter=1.0.0 -- jupyter-lsp=2.2.1 -- jupyter_client=8.6.0 -- jupyter_console=6.6.3 -- jupyter_core=5.6.1 -- jupyter_events=0.9.0 -- jupyter_server=2.12.1 -- jupyter_server_terminals=0.5.1 -- jupyterlab=4.0.10 -- jupyterlab_pygments=0.3.0 -- jupyterlab_server=2.25.2 -- jupyterlab_widgets=3.0.9 -- kealib=1.5.3 -- keyutils=1.6.1 -- kiwisolver=1.4.5 -- krb5=1.21.2 -- lame=3.100 -- lcms2=2.16 -- ld_impl_linux-64=2.40 -- lerc=4.0.0 -- libabseil=20230802.1 -- libaec=1.1.2 -- libarchive=3.7.2 -- libarrow=14.0.2 -- libarrow-acero=14.0.2 -- libarrow-dataset=14.0.2 -- libarrow-flight=14.0.2 -- libarrow-flight-sql=14.0.2 -- libarrow-gandiva=14.0.2 -- libarrow-substrait=14.0.2 -- libblas=3.9.0 -- libboost-headers=1.84.0 -- libbrotlicommon=1.1.0 -- libbrotlidec=1.1.0 -- libbrotlienc=1.1.0 -- libcap=2.69 -- libcblas=3.9.0 -- libclang=15.0.7 -- libclang13=15.0.7 -- libcrc32c=1.1.2 -- libcups=2.3.3 -- libcurl=8.5.0 -- libdeflate=1.19 -- libedit=3.1.20191231 -- libev=4.33 -- libevent=2.1.12 -- libexpat=2.5.0 -- libffi=3.4.2 -- libflac=1.4.3 -- libgcc-ng=13.2.0 -- libgcrypt=1.10.3 -- libgd=2.3.3 -- libgdal=3.7.3 -- libgfortran-ng=13.2.0 -- libgfortran5=13.2.0 -- libglib=2.78.3 -- libgomp=13.2.0 -- libgoogle-cloud=2.12.0 -- libgpg-error=1.47 -- libgrpc=1.59.3 -- libhwloc=2.9.1 -- libiconv=1.17 -- libjpeg-turbo=3.0.0 -- libkml=1.3.0 -- liblapack=3.9.0 -- liblapacke=3.9.0 -- libllvm15=15.0.7 -- libnetcdf=4.9.2 -- libnghttp2=1.58.0 -- libnl=3.9.0 -- libnsl=2.0.1 -- libnuma=2.0.16 -- libogg=1.3.4 -- libopenblas=0.3.25 -- libopus=1.3.1 -- libparquet=14.0.2 -- libpng=1.6.39 -- libpq=16.1 -- libprotobuf=4.24.4 -- libre2-11=2023.06.02 -- librsvg=2.56.3 -- librttopo=1.1.0 -- libsndfile=1.2.2 -- libsodium=1.0.18 -- libspatialindex=1.9.3 -- libspatialite=5.1.0 -- libspral=2023.08.02 -- libsqlite=3.44.2 -- libssh2=1.11.0 -- libstdcxx-ng=13.2.0 -- libsystemd0=255 -- libthrift=0.19.0 -- libtiff=4.6.0 -- libutf8proc=2.8.0 -- libuuid=2.38.1 -- libvorbis=1.3.7 -- libwebp=1.3.2 -- libwebp-base=1.3.2 -- libxcb=1.15 -- libxcrypt=4.4.36 -- libxkbcommon=1.6.0 -- libxml2=2.11.6 -- libxslt=1.1.37 -- libzip=1.10.1 -- libzlib=1.2.13 -- linopy=0.3.2 -- locket=1.0.0 -- lxml=4.9.3 -- lz4=4.3.2 -- lz4-c=1.9.4 -- lzo=2.10 -- mapclassify=2.6.1 -- markupsafe=2.1.3 -- matplotlib=3.8.2 -- matplotlib-base=3.8.2 -- matplotlib-inline=0.1.6 -- memory_profiler=0.61.0 -- metis=5.1.0 -- minizip=4.0.4 -- mistune=3.0.2 -- mpg123=1.32.3 -- msgpack-python=1.0.7 -- mumps-include=5.2.1 -- mumps-seq=5.2.1 -- munch=4.0.0 -- munkres=1.1.4 -- mysql-common=8.0.33 -- mysql-libs=8.0.33 -- nbclient=0.8.0 -- nbconvert=7.14.0 -- nbconvert-core=7.14.0 -- nbconvert-pandoc=7.14.0 -- nbformat=5.9.2 -- ncurses=6.4 -- nest-asyncio=1.5.8 -- netcdf4=1.6.5 -- networkx=3.2.1 -- nomkl=1.0 -- notebook=7.0.6 -- notebook-shim=0.2.3 -- nspr=4.35 -- nss=3.96 -- numexpr=2.8.8 -- numpy=1.26.2 -- openjdk=21.0.1 -- openjpeg=2.5.0 -- openpyxl=3.1.2 -- openssl=3.2.0 -- orc=1.9.2 -- overrides=7.4.0 -- packaging=23.2 -- pandas=2.1.4 -- pandoc=3.1.3 -- pandocfilters=1.5.0 -- pango=1.50.14 -- parso=0.8.3 -- partd=1.4.1 -- patsy=0.5.5 -- pcre2=10.42 -- pexpect=4.8.0 -- pickleshare=0.7.5 -- pillow=10.2.0 -- pip=23.3.2 -- pixman=0.42.2 -- pkgutil-resolve-name=1.3.10 -- plac=1.4.2 -- platformdirs=4.1.0 -- pluggy=1.3.0 -- ply=3.11 -- poppler=23.12.0 -- poppler-data=0.4.12 -- postgresql=16.1 -- powerplantmatching=0.5.8 -- progressbar2=4.3.2 -- proj=9.3.0 -- prometheus_client=0.19.0 -- prompt-toolkit=3.0.42 -- prompt_toolkit=3.0.42 -- psutil=5.9.7 -- pthread-stubs=0.4 -- ptyprocess=0.7.0 -- pulp=2.7.0 -- pulseaudio-client=16.1 -- pure_eval=0.2.2 -- py-cpuinfo=9.0.0 -- pyarrow=14.0.2 -- pyarrow-hotfix=0.6 -- pycountry=22.3.5 -- pycparser=2.21 -- pygments=2.17.2 -- pyomo=6.6.1 -- pyparsing=3.1.1 -- pyproj=3.6.1 -- pypsa=0.26.2 -- pyqt=5.15.9 -- pyqt5-sip=12.12.2 -- pyshp=2.3.1 -- pysocks=1.7.1 -- pytables=3.9.2 -- pytest=7.4.4 -- python=3.11.7 -- python-dateutil=2.8.2 -- python-fastjsonschema=2.19.1 -- python-json-logger=2.0.7 -- python-tzdata=2023.4 -- python-utils=3.8.1 -- python_abi=3.11 -- pytz=2023.3.post1 -- pyxlsb=1.0.10 -- pyyaml=6.0.1 -- pyzmq=25.1.2 -- qt-main=5.15.8 -- qtconsole-base=5.5.1 -- qtpy=2.4.1 -- rasterio=1.3.9 -- rdma-core=49.0 -- re2=2023.06.02 -- readline=8.2 -- referencing=0.32.0 -- requests=2.31.0 -- reretry=0.11.8 -- rfc3339-validator=0.1.4 -- rfc3986-validator=0.1.1 -- rioxarray=0.15.0 -- rpds-py=0.16.2 -- rtree=1.1.0 -- s2n=1.4.1 -- scikit-learn=1.3.2 -- scipy=1.11.4 -- scotch=6.0.9 -- seaborn=0.13.0 -- seaborn-base=0.13.0 -- send2trash=1.8.2 -- setuptools=69.0.3 -- setuptools-scm=8.0.4 -- setuptools_scm=8.0.4 -- shapely=2.0.2 -- sip=6.7.12 -- six=1.16.0 -- smart_open=6.4.0 -- smmap=5.0.0 -- snakemake-minimal=7.32.4 -- snappy=1.1.10 -- sniffio=1.3.0 -- snuggs=1.4.7 -- sortedcontainers=2.4.0 -- soupsieve=2.5 -- sqlite=3.44.2 -- stack_data=0.6.2 -- statsmodels=0.14.1 -- stopit=1.1.2 -- tabula-py=2.7.0 -- tabulate=0.9.0 -- tblib=3.0.0 -- terminado=0.18.0 -- threadpoolctl=3.2.0 -- throttler=1.2.2 -- tiledb=2.18.2 -- tinycss2=1.2.1 -- tk=8.6.13 -- toml=0.10.2 -- tomli=2.0.1 -- toolz=0.12.0 -- toposort=1.10 -- tornado=6.3.3 -- tqdm=4.66.1 -- traitlets=5.14.1 -- types-python-dateutil=2.8.19.14 -- typing-extensions=4.9.0 -- typing_extensions=4.9.0 -- typing_utils=0.1.0 -- tzcode=2023d -- tzdata=2023d -- ucx=1.15.0 -- unidecode=1.3.7 -- unixodbc=2.3.12 -- uri-template=1.3.0 -- uriparser=0.9.7 -- urllib3=2.1.0 -- validators=0.22.0 -- wcwidth=0.2.12 -- webcolors=1.13 -- webencodings=0.5.1 -- websocket-client=1.7.0 -- wheel=0.42.0 -- widgetsnbextension=4.0.9 -- wrapt=1.16.0 -- xarray=2023.12.0 -- xcb-util=0.4.0 -- xcb-util-image=0.4.0 -- xcb-util-keysyms=0.4.0 -- xcb-util-renderutil=0.3.9 -- xcb-util-wm=0.4.1 -- xerces-c=3.2.5 -- xkeyboard-config=2.40 -- xlrd=2.0.1 -- xorg-fixesproto=5.0 -- xorg-inputproto=2.3.2 -- xorg-kbproto=1.0.7 -- xorg-libice=1.1.1 -- xorg-libsm=1.2.4 -- xorg-libx11=1.8.7 -- xorg-libxau=1.0.11 -- xorg-libxdmcp=1.1.3 -- xorg-libxext=1.3.4 -- xorg-libxfixes=5.0.3 -- xorg-libxi=1.7.10 -- xorg-libxrender=0.9.11 -- xorg-libxt=1.3.0 -- xorg-libxtst=1.2.3 -- xorg-recordproto=1.14.2 -- xorg-renderproto=0.11.1 -- xorg-xextproto=7.3.0 -- xorg-xf86vidmodeproto=2.3.1 -- xorg-xproto=7.0.31 -- xyzservices=2023.10.1 -- xz=5.2.6 -- yaml=0.2.5 -- yte=1.5.4 -- zeromq=4.3.5 -- zict=3.0.0 -- zipp=3.17.0 -- zlib=1.2.13 -- zlib-ng=2.0.7 -- zstd=1.5.5 -- pip: - - highspy==1.5.3 - - tsam==2.3.1 + - _libgcc_mutex=0.1 + - _openmp_mutex=4.5 + - affine=2.4.0 + - alsa-lib=1.2.10 + - ampl-mp=3.1.0 + - amply=0.1.6 + - appdirs=1.4.4 + - asttokens=2.4.1 + - atk-1.0=2.38.0 + - atlite=0.2.12 + - attr=2.5.1 + - attrs=23.2.0 + - aws-c-auth=0.7.15 + - aws-c-cal=0.6.9 + - aws-c-common=0.9.12 + - aws-c-compression=0.2.17 + - aws-c-event-stream=0.4.1 + - aws-c-http=0.8.0 + - aws-c-io=0.14.3 + - aws-c-mqtt=0.10.1 + - aws-c-s3=0.5.0 + - aws-c-sdkutils=0.1.14 + - aws-checksums=0.1.17 + - aws-crt-cpp=0.26.1 + - aws-sdk-cpp=1.11.242 + - azure-core-cpp=1.10.3 + - azure-storage-blobs-cpp=12.10.0 + - azure-storage-common-cpp=12.5.0 + - beautifulsoup4=4.12.3 + - blosc=1.21.5 + - bokeh=3.3.4 + - bottleneck=1.3.7 + - branca=0.7.1 + - brotli=1.1.0 + - brotli-bin=1.1.0 + - brotli-python=1.1.0 + - bzip2=1.0.8 + - c-ares=1.26.0 + - c-blosc2=2.13.2 + - ca-certificates=2024.2.2 + - cairo=1.18.0 + - cartopy=0.22.0 + - cdsapi=0.6.1 + - certifi=2024.2.2 + - cffi=1.16.0 + - cfgv=3.3.1 + - cfitsio=4.3.1 + - cftime=1.6.3 + - charset-normalizer=3.3.2 + - click=8.1.7 + - click-plugins=1.1.1 + - cligj=0.7.2 + - cloudpickle=3.0.0 + - coin-or-cbc=2.10.10 + - coin-or-cgl=0.60.7 + - coin-or-clp=1.17.8 + - coin-or-osi=0.108.8 + - coin-or-utils=2.11.9 + - coincbc=2.10.10 + - colorama=0.4.6 + - configargparse=1.7 + - connection_pool=0.0.3 + - contourpy=1.2.0 + - country_converter=1.2 + - cppad=20240000.2 + - cycler=0.12.1 + - cytoolz=0.12.3 + - dask=2024.2.0 + - dask-core=2024.2.0 + - datrie=0.8.2 + - dbus=1.13.6 + - decorator=5.1.1 + - deprecation=2.1.0 + - descartes=1.1.0 + - distlib=0.3.8 + - distributed=2024.2.0 + - distro=1.9.0 + - docutils=0.20.1 + - dpath=2.1.6 + - entsoe-py=0.6.6 + - et_xmlfile=1.1.0 + - exceptiongroup=1.2.0 + - executing=2.0.1 + - expat=2.5.0 + - filelock=3.13.1 + - fiona=1.9.5 + - folium=0.15.1 + - font-ttf-dejavu-sans-mono=2.37 + - font-ttf-inconsolata=3.000 + - font-ttf-source-code-pro=2.038 + - font-ttf-ubuntu=0.83 + - fontconfig=2.14.2 + - fonts-conda-ecosystem=1 + - fonts-conda-forge=1 + - fonttools=4.49.0 + - freetype=2.12.1 + - freexl=2.0.0 + - fribidi=1.0.10 + - fsspec=2024.2.0 + - gdal=3.8.4 + - gdk-pixbuf=2.42.10 + - geographiclib=1.52 + - geojson-rewind=1.1.0 + - geopandas=0.14.3 + - geopandas-base=0.14.3 + - geopy=2.4.1 + - geos=3.12.1 + - geotiff=1.7.1 + - gettext=0.21.1 + - gflags=2.2.2 + - giflib=5.2.1 + - gitdb=4.0.11 + - gitpython=3.1.42 + - glib=2.78.4 + - glib-tools=2.78.4 + - glog=0.6.0 + - glpk=5.0 + - gmp=6.3.0 + - graphite2=1.3.13 + - graphviz=9.0.0 + - gst-plugins-base=1.22.9 + - gstreamer=1.22.9 + - gtk2=2.24.33 + - gts=0.7.6 + - harfbuzz=8.3.0 + - hdf4=4.2.15 + - hdf5=1.14.3 + - humanfriendly=10.0 + - icu=73.2 + - identify=2.5.35 + - idna=3.6 + - importlib-metadata=7.0.1 + - importlib_metadata=7.0.1 + - importlib_resources=6.1.1 + - iniconfig=2.0.0 + - ipopt=3.14.14 + - ipython=8.21.0 + - jedi=0.19.1 + - jinja2=3.1.3 + - joblib=1.3.2 + - json-c=0.17 + - jsonschema=4.21.1 + - jsonschema-specifications=2023.12.1 + - jupyter_core=5.7.1 + - kealib=1.5.3 + - keyutils=1.6.1 + - kiwisolver=1.4.5 + - krb5=1.21.2 + - lame=3.100 + - lcms2=2.16 + - ld_impl_linux-64=2.40 + - lerc=4.0.0 + - libabseil=20230802.1 + - libaec=1.1.2 + - libarchive=3.7.2 + - libarrow=15.0.0 + - libarrow-acero=15.0.0 + - libarrow-dataset=15.0.0 + - libarrow-flight=15.0.0 + - libarrow-flight-sql=15.0.0 + - libarrow-gandiva=15.0.0 + - libarrow-substrait=15.0.0 + - libblas=3.9.0 + - libboost-headers=1.84.0 + - libbrotlicommon=1.1.0 + - libbrotlidec=1.1.0 + - libbrotlienc=1.1.0 + - libcap=2.69 + - libcblas=3.9.0 + - libclang=15.0.7 + - libclang13=15.0.7 + - libcrc32c=1.1.2 + - libcups=2.3.3 + - libcurl=8.5.0 + - libdeflate=1.19 + - libedit=3.1.20191231 + - libev=4.33 + - libevent=2.1.12 + - libexpat=2.5.0 + - libffi=3.4.2 + - libflac=1.4.3 + - libgcc-ng=13.2.0 + - libgcrypt=1.10.3 + - libgd=2.3.3 + - libgdal=3.8.4 + - libgfortran-ng=13.2.0 + - libgfortran5=13.2.0 + - libglib=2.78.4 + - libgomp=13.2.0 + - libgoogle-cloud=2.12.0 + - libgpg-error=1.47 + - libgrpc=1.60.1 + - libhwloc=2.9.3 + - libiconv=1.17 + - libjpeg-turbo=3.0.0 + - libkml=1.3.0 + - liblapack=3.9.0 + - liblapacke=3.9.0 + - libllvm15=15.0.7 + - libnetcdf=4.9.2 + - libnghttp2=1.58.0 + - libnl=3.9.0 + - libnsl=2.0.1 + - libnuma=2.0.16 + - libogg=1.3.4 + - libopenblas=0.3.26 + - libopus=1.3.1 + - libparquet=15.0.0 + - libpng=1.6.42 + - libpq=16.2 + - libprotobuf=4.25.1 + - libre2-11=2023.06.02 + - librsvg=2.56.3 + - librttopo=1.1.0 + - libscotch=7.0.4 + - libsndfile=1.2.2 + - libspatialindex=1.9.3 + - libspatialite=5.1.0 + - libspral=2023.09.07 + - libsqlite=3.45.1 + - libssh2=1.11.0 + - libstdcxx-ng=13.2.0 + - libsystemd0=255 + - libthrift=0.19.0 + - libtiff=4.6.0 + - libutf8proc=2.8.0 + - libuuid=2.38.1 + - libvorbis=1.3.7 + - libwebp=1.3.2 + - libwebp-base=1.3.2 + - libxcb=1.15 + - libxcrypt=4.4.36 + - libxkbcommon=1.6.0 + - libxml2=2.12.5 + - libxslt=1.1.39 + - libzip=1.10.1 + - libzlib=1.2.13 + - linopy=0.3.4 + - locket=1.0.0 + - lxml=5.1.0 + - lz4=4.3.3 + - lz4-c=1.9.4 + - lzo=2.10 + - mapclassify=2.6.1 + - markupsafe=2.1.5 + - matplotlib=3.8.3 + - matplotlib-base=3.8.3 + - matplotlib-inline=0.1.6 + - memory_profiler=0.61.0 + - metis=5.1.0 + - minizip=4.0.4 + - mpg123=1.32.4 + - msgpack-python=1.0.7 + - mumps-include=5.6.2 + - mumps-seq=5.6.2 + - munkres=1.1.4 + - mysql-common=8.0.33 + - mysql-libs=8.0.33 + - nbformat=5.9.2 + - ncurses=6.4 + - netcdf4=1.6.5 + - networkx=3.2.1 + - nodeenv=1.8.0 + - nomkl=1.0 + - nspr=4.35 + - nss=3.98 + - numexpr=2.9.0 + - numpy=1.26.4 + - openjdk=21.0.2 + - openjpeg=2.5.0 + - openpyxl=3.1.2 + - openssl=3.2.1 + - orc=1.9.2 + - packaging=23.2 + - pandas=2.2.0 + - pango=1.50.14 + - parso=0.8.3 + - partd=1.4.1 + - patsy=0.5.6 + - pcre2=10.42 + - pexpect=4.9.0 + - pickleshare=0.7.5 + - pillow=10.2.0 + - pip=24.0 + - pixman=0.43.2 + - pkgutil-resolve-name=1.3.10 + - plac=1.4.2 + - platformdirs=4.2.0 + - pluggy=1.4.0 + - ply=3.11 + - poppler=24.02.0 + - poppler-data=0.4.12 + - postgresql=16.2 + - powerplantmatching=0.5.11 + - pre-commit=3.6.2 + - progressbar2=4.3.2 + - proj=9.3.1 + - prompt-toolkit=3.0.42 + - psutil=5.9.8 + - pthread-stubs=0.4 + - ptyprocess=0.7.0 + - pulp=2.7.0 + - pulseaudio-client=16.1 + - pure_eval=0.2.2 + - py-cpuinfo=9.0.0 + - pyarrow=15.0.0 + - pyarrow-hotfix=0.6 + - pycountry=22.3.5 + - pycparser=2.21 + - pygments=2.17.2 + - pyomo=6.6.1 + - pyparsing=3.1.1 + - pyproj=3.6.1 + - pypsa=0.27.0 + - pyqt=5.15.9 + - pyqt5-sip=12.12.2 + - pyscipopt=4.4.0 + - pyshp=2.3.1 + - pysocks=1.7.1 + - pytables=3.9.2 + - pytest=8.0.0 + - python=3.11.8 + - python-dateutil=2.8.2 + - python-fastjsonschema=2.19.1 + - python-tzdata=2024.1 + - python-utils=3.8.2 + - python_abi=3.11 + - pytz=2024.1 + - pyxlsb=1.0.10 + - pyyaml=6.0.1 + - qt-main=5.15.8 + - rasterio=1.3.9 + - rdma-core=50.0 + - re2=2023.06.02 + - readline=8.2 + - referencing=0.33.0 + - requests=2.31.0 + - reretry=0.11.8 + - rioxarray=0.15.1 + - rpds-py=0.18.0 + - rtree=1.2.0 + - s2n=1.4.3 + - scikit-learn=1.4.1.post1 + - scip=8.1.0 + - scipy=1.12.0 + - scotch=7.0.4 + - seaborn=0.13.2 + - seaborn-base=0.13.2 + - setuptools=69.1.0 + - setuptools-scm=8.0.4 + - setuptools_scm=8.0.4 + - shapely=2.0.2 + - sip=6.7.12 + - six=1.16.0 + - smart_open=6.4.0 + - smmap=5.0.0 + - snakemake-minimal=7.32.4 + - snappy=1.1.10 + - snuggs=1.4.7 + - sortedcontainers=2.4.0 + - soupsieve=2.5 + - sqlite=3.45.1 + - stack_data=0.6.2 + - statsmodels=0.14.1 + - stopit=1.1.2 + - tabula-py=2.7.0 + - tabulate=0.9.0 + - tbb=2021.11.0 + - tblib=3.0.0 + - threadpoolctl=3.3.0 + - throttler=1.2.2 + - tiledb=2.20.0 + - tk=8.6.13 + - toml=0.10.2 + - tomli=2.0.1 + - toolz=0.12.1 + - toposort=1.10 + - tornado=6.3.3 + - tqdm=4.66.2 + - traitlets=5.14.1 + - typing-extensions=4.9.0 + - typing_extensions=4.9.0 + - tzcode=2024a + - tzdata=2024a + - ucx=1.15.0 + - ukkonen=1.0.1 + - unidecode=1.3.8 + - unixodbc=2.3.12 + - uriparser=0.9.7 + - urllib3=2.2.1 + - validators=0.22.0 + - virtualenv=20.25.0 + - wcwidth=0.2.13 + - wheel=0.42.0 + - wrapt=1.16.0 + - xarray=2024.2.0 + - xcb-util=0.4.0 + - xcb-util-image=0.4.0 + - xcb-util-keysyms=0.4.0 + - xcb-util-renderutil=0.3.9 + - xcb-util-wm=0.4.1 + - xerces-c=3.2.5 + - xkeyboard-config=2.41 + - xlrd=2.0.1 + - xorg-fixesproto=5.0 + - xorg-inputproto=2.3.2 + - xorg-kbproto=1.0.7 + - xorg-libice=1.1.1 + - xorg-libsm=1.2.4 + - xorg-libx11=1.8.7 + - xorg-libxau=1.0.11 + - xorg-libxdmcp=1.1.3 + - xorg-libxext=1.3.4 + - xorg-libxfixes=5.0.3 + - xorg-libxi=1.7.10 + - xorg-libxrender=0.9.11 + - xorg-libxt=1.3.0 + - xorg-libxtst=1.2.3 + - xorg-recordproto=1.14.2 + - xorg-renderproto=0.11.1 + - xorg-xextproto=7.3.0 + - xorg-xf86vidmodeproto=2.3.1 + - xorg-xproto=7.0.31 + - xyzservices=2023.10.1 + - xz=5.2.6 + - yaml=0.2.5 + - yte=1.5.4 + - zict=3.0.0 + - zipp=3.17.0 + - zlib=1.2.13 + - zlib-ng=2.0.7 + - zstd=1.5.5 + - pip: + - highspy==1.5.3 + - tsam==2.3.1 From 479bc707277b09182409ae5f4ec54879384eb5e4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:36:18 +0000 Subject: [PATCH 460/497] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 24.1.1 → 24.2.0](https://github.com/psf/black-pre-commit-mirror/compare/24.1.1...24.2.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5c41e781..28d0278a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: # Formatting with "black" coding style - repo: https://github.com/psf/black-pre-commit-mirror - rev: 24.1.1 + rev: 24.2.0 hooks: # Format Python files - id: black From e68743ffa6601bcbdf02025372841211e58bac2e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:36:37 +0000 Subject: [PATCH 461/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- envs/environment.fixed.yaml | 878 ++++++++++++++++++------------------ 1 file changed, 439 insertions(+), 439 deletions(-) diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index cde0b801..8bbd70bf 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -4,443 +4,443 @@ name: pypsa-eur channels: - - bioconda - - http://conda.anaconda.org/gurobi - - conda-forge - - defaults +- bioconda +- http://conda.anaconda.org/gurobi +- conda-forge +- defaults dependencies: - - _libgcc_mutex=0.1 - - _openmp_mutex=4.5 - - affine=2.4.0 - - alsa-lib=1.2.10 - - ampl-mp=3.1.0 - - amply=0.1.6 - - appdirs=1.4.4 - - asttokens=2.4.1 - - atk-1.0=2.38.0 - - atlite=0.2.12 - - attr=2.5.1 - - attrs=23.2.0 - - aws-c-auth=0.7.15 - - aws-c-cal=0.6.9 - - aws-c-common=0.9.12 - - aws-c-compression=0.2.17 - - aws-c-event-stream=0.4.1 - - aws-c-http=0.8.0 - - aws-c-io=0.14.3 - - aws-c-mqtt=0.10.1 - - aws-c-s3=0.5.0 - - aws-c-sdkutils=0.1.14 - - aws-checksums=0.1.17 - - aws-crt-cpp=0.26.1 - - aws-sdk-cpp=1.11.242 - - azure-core-cpp=1.10.3 - - azure-storage-blobs-cpp=12.10.0 - - azure-storage-common-cpp=12.5.0 - - beautifulsoup4=4.12.3 - - blosc=1.21.5 - - bokeh=3.3.4 - - bottleneck=1.3.7 - - branca=0.7.1 - - brotli=1.1.0 - - brotli-bin=1.1.0 - - brotli-python=1.1.0 - - bzip2=1.0.8 - - c-ares=1.26.0 - - c-blosc2=2.13.2 - - ca-certificates=2024.2.2 - - cairo=1.18.0 - - cartopy=0.22.0 - - cdsapi=0.6.1 - - certifi=2024.2.2 - - cffi=1.16.0 - - cfgv=3.3.1 - - cfitsio=4.3.1 - - cftime=1.6.3 - - charset-normalizer=3.3.2 - - click=8.1.7 - - click-plugins=1.1.1 - - cligj=0.7.2 - - cloudpickle=3.0.0 - - coin-or-cbc=2.10.10 - - coin-or-cgl=0.60.7 - - coin-or-clp=1.17.8 - - coin-or-osi=0.108.8 - - coin-or-utils=2.11.9 - - coincbc=2.10.10 - - colorama=0.4.6 - - configargparse=1.7 - - connection_pool=0.0.3 - - contourpy=1.2.0 - - country_converter=1.2 - - cppad=20240000.2 - - cycler=0.12.1 - - cytoolz=0.12.3 - - dask=2024.2.0 - - dask-core=2024.2.0 - - datrie=0.8.2 - - dbus=1.13.6 - - decorator=5.1.1 - - deprecation=2.1.0 - - descartes=1.1.0 - - distlib=0.3.8 - - distributed=2024.2.0 - - distro=1.9.0 - - docutils=0.20.1 - - dpath=2.1.6 - - entsoe-py=0.6.6 - - et_xmlfile=1.1.0 - - exceptiongroup=1.2.0 - - executing=2.0.1 - - expat=2.5.0 - - filelock=3.13.1 - - fiona=1.9.5 - - folium=0.15.1 - - font-ttf-dejavu-sans-mono=2.37 - - font-ttf-inconsolata=3.000 - - font-ttf-source-code-pro=2.038 - - font-ttf-ubuntu=0.83 - - fontconfig=2.14.2 - - fonts-conda-ecosystem=1 - - fonts-conda-forge=1 - - fonttools=4.49.0 - - freetype=2.12.1 - - freexl=2.0.0 - - fribidi=1.0.10 - - fsspec=2024.2.0 - - gdal=3.8.4 - - gdk-pixbuf=2.42.10 - - geographiclib=1.52 - - geojson-rewind=1.1.0 - - geopandas=0.14.3 - - geopandas-base=0.14.3 - - geopy=2.4.1 - - geos=3.12.1 - - geotiff=1.7.1 - - gettext=0.21.1 - - gflags=2.2.2 - - giflib=5.2.1 - - gitdb=4.0.11 - - gitpython=3.1.42 - - glib=2.78.4 - - glib-tools=2.78.4 - - glog=0.6.0 - - glpk=5.0 - - gmp=6.3.0 - - graphite2=1.3.13 - - graphviz=9.0.0 - - gst-plugins-base=1.22.9 - - gstreamer=1.22.9 - - gtk2=2.24.33 - - gts=0.7.6 - - harfbuzz=8.3.0 - - hdf4=4.2.15 - - hdf5=1.14.3 - - humanfriendly=10.0 - - icu=73.2 - - identify=2.5.35 - - idna=3.6 - - importlib-metadata=7.0.1 - - importlib_metadata=7.0.1 - - importlib_resources=6.1.1 - - iniconfig=2.0.0 - - ipopt=3.14.14 - - ipython=8.21.0 - - jedi=0.19.1 - - jinja2=3.1.3 - - joblib=1.3.2 - - json-c=0.17 - - jsonschema=4.21.1 - - jsonschema-specifications=2023.12.1 - - jupyter_core=5.7.1 - - kealib=1.5.3 - - keyutils=1.6.1 - - kiwisolver=1.4.5 - - krb5=1.21.2 - - lame=3.100 - - lcms2=2.16 - - ld_impl_linux-64=2.40 - - lerc=4.0.0 - - libabseil=20230802.1 - - libaec=1.1.2 - - libarchive=3.7.2 - - libarrow=15.0.0 - - libarrow-acero=15.0.0 - - libarrow-dataset=15.0.0 - - libarrow-flight=15.0.0 - - libarrow-flight-sql=15.0.0 - - libarrow-gandiva=15.0.0 - - libarrow-substrait=15.0.0 - - libblas=3.9.0 - - libboost-headers=1.84.0 - - libbrotlicommon=1.1.0 - - libbrotlidec=1.1.0 - - libbrotlienc=1.1.0 - - libcap=2.69 - - libcblas=3.9.0 - - libclang=15.0.7 - - libclang13=15.0.7 - - libcrc32c=1.1.2 - - libcups=2.3.3 - - libcurl=8.5.0 - - libdeflate=1.19 - - libedit=3.1.20191231 - - libev=4.33 - - libevent=2.1.12 - - libexpat=2.5.0 - - libffi=3.4.2 - - libflac=1.4.3 - - libgcc-ng=13.2.0 - - libgcrypt=1.10.3 - - libgd=2.3.3 - - libgdal=3.8.4 - - libgfortran-ng=13.2.0 - - libgfortran5=13.2.0 - - libglib=2.78.4 - - libgomp=13.2.0 - - libgoogle-cloud=2.12.0 - - libgpg-error=1.47 - - libgrpc=1.60.1 - - libhwloc=2.9.3 - - libiconv=1.17 - - libjpeg-turbo=3.0.0 - - libkml=1.3.0 - - liblapack=3.9.0 - - liblapacke=3.9.0 - - libllvm15=15.0.7 - - libnetcdf=4.9.2 - - libnghttp2=1.58.0 - - libnl=3.9.0 - - libnsl=2.0.1 - - libnuma=2.0.16 - - libogg=1.3.4 - - libopenblas=0.3.26 - - libopus=1.3.1 - - libparquet=15.0.0 - - libpng=1.6.42 - - libpq=16.2 - - libprotobuf=4.25.1 - - libre2-11=2023.06.02 - - librsvg=2.56.3 - - librttopo=1.1.0 - - libscotch=7.0.4 - - libsndfile=1.2.2 - - libspatialindex=1.9.3 - - libspatialite=5.1.0 - - libspral=2023.09.07 - - libsqlite=3.45.1 - - libssh2=1.11.0 - - libstdcxx-ng=13.2.0 - - libsystemd0=255 - - libthrift=0.19.0 - - libtiff=4.6.0 - - libutf8proc=2.8.0 - - libuuid=2.38.1 - - libvorbis=1.3.7 - - libwebp=1.3.2 - - libwebp-base=1.3.2 - - libxcb=1.15 - - libxcrypt=4.4.36 - - libxkbcommon=1.6.0 - - libxml2=2.12.5 - - libxslt=1.1.39 - - libzip=1.10.1 - - libzlib=1.2.13 - - linopy=0.3.4 - - locket=1.0.0 - - lxml=5.1.0 - - lz4=4.3.3 - - lz4-c=1.9.4 - - lzo=2.10 - - mapclassify=2.6.1 - - markupsafe=2.1.5 - - matplotlib=3.8.3 - - matplotlib-base=3.8.3 - - matplotlib-inline=0.1.6 - - memory_profiler=0.61.0 - - metis=5.1.0 - - minizip=4.0.4 - - mpg123=1.32.4 - - msgpack-python=1.0.7 - - mumps-include=5.6.2 - - mumps-seq=5.6.2 - - munkres=1.1.4 - - mysql-common=8.0.33 - - mysql-libs=8.0.33 - - nbformat=5.9.2 - - ncurses=6.4 - - netcdf4=1.6.5 - - networkx=3.2.1 - - nodeenv=1.8.0 - - nomkl=1.0 - - nspr=4.35 - - nss=3.98 - - numexpr=2.9.0 - - numpy=1.26.4 - - openjdk=21.0.2 - - openjpeg=2.5.0 - - openpyxl=3.1.2 - - openssl=3.2.1 - - orc=1.9.2 - - packaging=23.2 - - pandas=2.2.0 - - pango=1.50.14 - - parso=0.8.3 - - partd=1.4.1 - - patsy=0.5.6 - - pcre2=10.42 - - pexpect=4.9.0 - - pickleshare=0.7.5 - - pillow=10.2.0 - - pip=24.0 - - pixman=0.43.2 - - pkgutil-resolve-name=1.3.10 - - plac=1.4.2 - - platformdirs=4.2.0 - - pluggy=1.4.0 - - ply=3.11 - - poppler=24.02.0 - - poppler-data=0.4.12 - - postgresql=16.2 - - powerplantmatching=0.5.11 - - pre-commit=3.6.2 - - progressbar2=4.3.2 - - proj=9.3.1 - - prompt-toolkit=3.0.42 - - psutil=5.9.8 - - pthread-stubs=0.4 - - ptyprocess=0.7.0 - - pulp=2.7.0 - - pulseaudio-client=16.1 - - pure_eval=0.2.2 - - py-cpuinfo=9.0.0 - - pyarrow=15.0.0 - - pyarrow-hotfix=0.6 - - pycountry=22.3.5 - - pycparser=2.21 - - pygments=2.17.2 - - pyomo=6.6.1 - - pyparsing=3.1.1 - - pyproj=3.6.1 - - pypsa=0.27.0 - - pyqt=5.15.9 - - pyqt5-sip=12.12.2 - - pyscipopt=4.4.0 - - pyshp=2.3.1 - - pysocks=1.7.1 - - pytables=3.9.2 - - pytest=8.0.0 - - python=3.11.8 - - python-dateutil=2.8.2 - - python-fastjsonschema=2.19.1 - - python-tzdata=2024.1 - - python-utils=3.8.2 - - python_abi=3.11 - - pytz=2024.1 - - pyxlsb=1.0.10 - - pyyaml=6.0.1 - - qt-main=5.15.8 - - rasterio=1.3.9 - - rdma-core=50.0 - - re2=2023.06.02 - - readline=8.2 - - referencing=0.33.0 - - requests=2.31.0 - - reretry=0.11.8 - - rioxarray=0.15.1 - - rpds-py=0.18.0 - - rtree=1.2.0 - - s2n=1.4.3 - - scikit-learn=1.4.1.post1 - - scip=8.1.0 - - scipy=1.12.0 - - scotch=7.0.4 - - seaborn=0.13.2 - - seaborn-base=0.13.2 - - setuptools=69.1.0 - - setuptools-scm=8.0.4 - - setuptools_scm=8.0.4 - - shapely=2.0.2 - - sip=6.7.12 - - six=1.16.0 - - smart_open=6.4.0 - - smmap=5.0.0 - - snakemake-minimal=7.32.4 - - snappy=1.1.10 - - snuggs=1.4.7 - - sortedcontainers=2.4.0 - - soupsieve=2.5 - - sqlite=3.45.1 - - stack_data=0.6.2 - - statsmodels=0.14.1 - - stopit=1.1.2 - - tabula-py=2.7.0 - - tabulate=0.9.0 - - tbb=2021.11.0 - - tblib=3.0.0 - - threadpoolctl=3.3.0 - - throttler=1.2.2 - - tiledb=2.20.0 - - tk=8.6.13 - - toml=0.10.2 - - tomli=2.0.1 - - toolz=0.12.1 - - toposort=1.10 - - tornado=6.3.3 - - tqdm=4.66.2 - - traitlets=5.14.1 - - typing-extensions=4.9.0 - - typing_extensions=4.9.0 - - tzcode=2024a - - tzdata=2024a - - ucx=1.15.0 - - ukkonen=1.0.1 - - unidecode=1.3.8 - - unixodbc=2.3.12 - - uriparser=0.9.7 - - urllib3=2.2.1 - - validators=0.22.0 - - virtualenv=20.25.0 - - wcwidth=0.2.13 - - wheel=0.42.0 - - wrapt=1.16.0 - - xarray=2024.2.0 - - xcb-util=0.4.0 - - xcb-util-image=0.4.0 - - xcb-util-keysyms=0.4.0 - - xcb-util-renderutil=0.3.9 - - xcb-util-wm=0.4.1 - - xerces-c=3.2.5 - - xkeyboard-config=2.41 - - xlrd=2.0.1 - - xorg-fixesproto=5.0 - - xorg-inputproto=2.3.2 - - xorg-kbproto=1.0.7 - - xorg-libice=1.1.1 - - xorg-libsm=1.2.4 - - xorg-libx11=1.8.7 - - xorg-libxau=1.0.11 - - xorg-libxdmcp=1.1.3 - - xorg-libxext=1.3.4 - - xorg-libxfixes=5.0.3 - - xorg-libxi=1.7.10 - - xorg-libxrender=0.9.11 - - xorg-libxt=1.3.0 - - xorg-libxtst=1.2.3 - - xorg-recordproto=1.14.2 - - xorg-renderproto=0.11.1 - - xorg-xextproto=7.3.0 - - xorg-xf86vidmodeproto=2.3.1 - - xorg-xproto=7.0.31 - - xyzservices=2023.10.1 - - xz=5.2.6 - - yaml=0.2.5 - - yte=1.5.4 - - zict=3.0.0 - - zipp=3.17.0 - - zlib=1.2.13 - - zlib-ng=2.0.7 - - zstd=1.5.5 - - pip: - - highspy==1.5.3 - - tsam==2.3.1 +- _libgcc_mutex=0.1 +- _openmp_mutex=4.5 +- affine=2.4.0 +- alsa-lib=1.2.10 +- ampl-mp=3.1.0 +- amply=0.1.6 +- appdirs=1.4.4 +- asttokens=2.4.1 +- atk-1.0=2.38.0 +- atlite=0.2.12 +- attr=2.5.1 +- attrs=23.2.0 +- aws-c-auth=0.7.15 +- aws-c-cal=0.6.9 +- aws-c-common=0.9.12 +- aws-c-compression=0.2.17 +- aws-c-event-stream=0.4.1 +- aws-c-http=0.8.0 +- aws-c-io=0.14.3 +- aws-c-mqtt=0.10.1 +- aws-c-s3=0.5.0 +- aws-c-sdkutils=0.1.14 +- aws-checksums=0.1.17 +- aws-crt-cpp=0.26.1 +- aws-sdk-cpp=1.11.242 +- azure-core-cpp=1.10.3 +- azure-storage-blobs-cpp=12.10.0 +- azure-storage-common-cpp=12.5.0 +- beautifulsoup4=4.12.3 +- blosc=1.21.5 +- bokeh=3.3.4 +- bottleneck=1.3.7 +- branca=0.7.1 +- brotli=1.1.0 +- brotli-bin=1.1.0 +- brotli-python=1.1.0 +- bzip2=1.0.8 +- c-ares=1.26.0 +- c-blosc2=2.13.2 +- ca-certificates=2024.2.2 +- cairo=1.18.0 +- cartopy=0.22.0 +- cdsapi=0.6.1 +- certifi=2024.2.2 +- cffi=1.16.0 +- cfgv=3.3.1 +- cfitsio=4.3.1 +- cftime=1.6.3 +- charset-normalizer=3.3.2 +- click=8.1.7 +- click-plugins=1.1.1 +- cligj=0.7.2 +- cloudpickle=3.0.0 +- coin-or-cbc=2.10.10 +- coin-or-cgl=0.60.7 +- coin-or-clp=1.17.8 +- coin-or-osi=0.108.8 +- coin-or-utils=2.11.9 +- coincbc=2.10.10 +- colorama=0.4.6 +- configargparse=1.7 +- connection_pool=0.0.3 +- contourpy=1.2.0 +- country_converter=1.2 +- cppad=20240000.2 +- cycler=0.12.1 +- cytoolz=0.12.3 +- dask=2024.2.0 +- dask-core=2024.2.0 +- datrie=0.8.2 +- dbus=1.13.6 +- decorator=5.1.1 +- deprecation=2.1.0 +- descartes=1.1.0 +- distlib=0.3.8 +- distributed=2024.2.0 +- distro=1.9.0 +- docutils=0.20.1 +- dpath=2.1.6 +- entsoe-py=0.6.6 +- et_xmlfile=1.1.0 +- exceptiongroup=1.2.0 +- executing=2.0.1 +- expat=2.5.0 +- filelock=3.13.1 +- fiona=1.9.5 +- folium=0.15.1 +- font-ttf-dejavu-sans-mono=2.37 +- font-ttf-inconsolata=3.000 +- font-ttf-source-code-pro=2.038 +- font-ttf-ubuntu=0.83 +- fontconfig=2.14.2 +- fonts-conda-ecosystem=1 +- fonts-conda-forge=1 +- fonttools=4.49.0 +- freetype=2.12.1 +- freexl=2.0.0 +- fribidi=1.0.10 +- fsspec=2024.2.0 +- gdal=3.8.4 +- gdk-pixbuf=2.42.10 +- geographiclib=1.52 +- geojson-rewind=1.1.0 +- geopandas=0.14.3 +- geopandas-base=0.14.3 +- geopy=2.4.1 +- geos=3.12.1 +- geotiff=1.7.1 +- gettext=0.21.1 +- gflags=2.2.2 +- giflib=5.2.1 +- gitdb=4.0.11 +- gitpython=3.1.42 +- glib=2.78.4 +- glib-tools=2.78.4 +- glog=0.6.0 +- glpk=5.0 +- gmp=6.3.0 +- graphite2=1.3.13 +- graphviz=9.0.0 +- gst-plugins-base=1.22.9 +- gstreamer=1.22.9 +- gtk2=2.24.33 +- gts=0.7.6 +- harfbuzz=8.3.0 +- hdf4=4.2.15 +- hdf5=1.14.3 +- humanfriendly=10.0 +- icu=73.2 +- identify=2.5.35 +- idna=3.6 +- importlib-metadata=7.0.1 +- importlib_metadata=7.0.1 +- importlib_resources=6.1.1 +- iniconfig=2.0.0 +- ipopt=3.14.14 +- ipython=8.21.0 +- jedi=0.19.1 +- jinja2=3.1.3 +- joblib=1.3.2 +- json-c=0.17 +- jsonschema=4.21.1 +- jsonschema-specifications=2023.12.1 +- jupyter_core=5.7.1 +- kealib=1.5.3 +- keyutils=1.6.1 +- kiwisolver=1.4.5 +- krb5=1.21.2 +- lame=3.100 +- lcms2=2.16 +- ld_impl_linux-64=2.40 +- lerc=4.0.0 +- libabseil=20230802.1 +- libaec=1.1.2 +- libarchive=3.7.2 +- libarrow=15.0.0 +- libarrow-acero=15.0.0 +- libarrow-dataset=15.0.0 +- libarrow-flight=15.0.0 +- libarrow-flight-sql=15.0.0 +- libarrow-gandiva=15.0.0 +- libarrow-substrait=15.0.0 +- libblas=3.9.0 +- libboost-headers=1.84.0 +- libbrotlicommon=1.1.0 +- libbrotlidec=1.1.0 +- libbrotlienc=1.1.0 +- libcap=2.69 +- libcblas=3.9.0 +- libclang=15.0.7 +- libclang13=15.0.7 +- libcrc32c=1.1.2 +- libcups=2.3.3 +- libcurl=8.5.0 +- libdeflate=1.19 +- libedit=3.1.20191231 +- libev=4.33 +- libevent=2.1.12 +- libexpat=2.5.0 +- libffi=3.4.2 +- libflac=1.4.3 +- libgcc-ng=13.2.0 +- libgcrypt=1.10.3 +- libgd=2.3.3 +- libgdal=3.8.4 +- libgfortran-ng=13.2.0 +- libgfortran5=13.2.0 +- libglib=2.78.4 +- libgomp=13.2.0 +- libgoogle-cloud=2.12.0 +- libgpg-error=1.47 +- libgrpc=1.60.1 +- libhwloc=2.9.3 +- libiconv=1.17 +- libjpeg-turbo=3.0.0 +- libkml=1.3.0 +- liblapack=3.9.0 +- liblapacke=3.9.0 +- libllvm15=15.0.7 +- libnetcdf=4.9.2 +- libnghttp2=1.58.0 +- libnl=3.9.0 +- libnsl=2.0.1 +- libnuma=2.0.16 +- libogg=1.3.4 +- libopenblas=0.3.26 +- libopus=1.3.1 +- libparquet=15.0.0 +- libpng=1.6.42 +- libpq=16.2 +- libprotobuf=4.25.1 +- libre2-11=2023.06.02 +- librsvg=2.56.3 +- librttopo=1.1.0 +- libscotch=7.0.4 +- libsndfile=1.2.2 +- libspatialindex=1.9.3 +- libspatialite=5.1.0 +- libspral=2023.09.07 +- libsqlite=3.45.1 +- libssh2=1.11.0 +- libstdcxx-ng=13.2.0 +- libsystemd0=255 +- libthrift=0.19.0 +- libtiff=4.6.0 +- libutf8proc=2.8.0 +- libuuid=2.38.1 +- libvorbis=1.3.7 +- libwebp=1.3.2 +- libwebp-base=1.3.2 +- libxcb=1.15 +- libxcrypt=4.4.36 +- libxkbcommon=1.6.0 +- libxml2=2.12.5 +- libxslt=1.1.39 +- libzip=1.10.1 +- libzlib=1.2.13 +- linopy=0.3.4 +- locket=1.0.0 +- lxml=5.1.0 +- lz4=4.3.3 +- lz4-c=1.9.4 +- lzo=2.10 +- mapclassify=2.6.1 +- markupsafe=2.1.5 +- matplotlib=3.8.3 +- matplotlib-base=3.8.3 +- matplotlib-inline=0.1.6 +- memory_profiler=0.61.0 +- metis=5.1.0 +- minizip=4.0.4 +- mpg123=1.32.4 +- msgpack-python=1.0.7 +- mumps-include=5.6.2 +- mumps-seq=5.6.2 +- munkres=1.1.4 +- mysql-common=8.0.33 +- mysql-libs=8.0.33 +- nbformat=5.9.2 +- ncurses=6.4 +- netcdf4=1.6.5 +- networkx=3.2.1 +- nodeenv=1.8.0 +- nomkl=1.0 +- nspr=4.35 +- nss=3.98 +- numexpr=2.9.0 +- numpy=1.26.4 +- openjdk=21.0.2 +- openjpeg=2.5.0 +- openpyxl=3.1.2 +- openssl=3.2.1 +- orc=1.9.2 +- packaging=23.2 +- pandas=2.2.0 +- pango=1.50.14 +- parso=0.8.3 +- partd=1.4.1 +- patsy=0.5.6 +- pcre2=10.42 +- pexpect=4.9.0 +- pickleshare=0.7.5 +- pillow=10.2.0 +- pip=24.0 +- pixman=0.43.2 +- pkgutil-resolve-name=1.3.10 +- plac=1.4.2 +- platformdirs=4.2.0 +- pluggy=1.4.0 +- ply=3.11 +- poppler=24.02.0 +- poppler-data=0.4.12 +- postgresql=16.2 +- powerplantmatching=0.5.11 +- pre-commit=3.6.2 +- progressbar2=4.3.2 +- proj=9.3.1 +- prompt-toolkit=3.0.42 +- psutil=5.9.8 +- pthread-stubs=0.4 +- ptyprocess=0.7.0 +- pulp=2.7.0 +- pulseaudio-client=16.1 +- pure_eval=0.2.2 +- py-cpuinfo=9.0.0 +- pyarrow=15.0.0 +- pyarrow-hotfix=0.6 +- pycountry=22.3.5 +- pycparser=2.21 +- pygments=2.17.2 +- pyomo=6.6.1 +- pyparsing=3.1.1 +- pyproj=3.6.1 +- pypsa=0.27.0 +- pyqt=5.15.9 +- pyqt5-sip=12.12.2 +- pyscipopt=4.4.0 +- pyshp=2.3.1 +- pysocks=1.7.1 +- pytables=3.9.2 +- pytest=8.0.0 +- python=3.11.8 +- python-dateutil=2.8.2 +- python-fastjsonschema=2.19.1 +- python-tzdata=2024.1 +- python-utils=3.8.2 +- python_abi=3.11 +- pytz=2024.1 +- pyxlsb=1.0.10 +- pyyaml=6.0.1 +- qt-main=5.15.8 +- rasterio=1.3.9 +- rdma-core=50.0 +- re2=2023.06.02 +- readline=8.2 +- referencing=0.33.0 +- requests=2.31.0 +- reretry=0.11.8 +- rioxarray=0.15.1 +- rpds-py=0.18.0 +- rtree=1.2.0 +- s2n=1.4.3 +- scikit-learn=1.4.1.post1 +- scip=8.1.0 +- scipy=1.12.0 +- scotch=7.0.4 +- seaborn=0.13.2 +- seaborn-base=0.13.2 +- setuptools=69.1.0 +- setuptools-scm=8.0.4 +- setuptools_scm=8.0.4 +- shapely=2.0.2 +- sip=6.7.12 +- six=1.16.0 +- smart_open=6.4.0 +- smmap=5.0.0 +- snakemake-minimal=7.32.4 +- snappy=1.1.10 +- snuggs=1.4.7 +- sortedcontainers=2.4.0 +- soupsieve=2.5 +- sqlite=3.45.1 +- stack_data=0.6.2 +- statsmodels=0.14.1 +- stopit=1.1.2 +- tabula-py=2.7.0 +- tabulate=0.9.0 +- tbb=2021.11.0 +- tblib=3.0.0 +- threadpoolctl=3.3.0 +- throttler=1.2.2 +- tiledb=2.20.0 +- tk=8.6.13 +- toml=0.10.2 +- tomli=2.0.1 +- toolz=0.12.1 +- toposort=1.10 +- tornado=6.3.3 +- tqdm=4.66.2 +- traitlets=5.14.1 +- typing-extensions=4.9.0 +- typing_extensions=4.9.0 +- tzcode=2024a +- tzdata=2024a +- ucx=1.15.0 +- ukkonen=1.0.1 +- unidecode=1.3.8 +- unixodbc=2.3.12 +- uriparser=0.9.7 +- urllib3=2.2.1 +- validators=0.22.0 +- virtualenv=20.25.0 +- wcwidth=0.2.13 +- wheel=0.42.0 +- wrapt=1.16.0 +- xarray=2024.2.0 +- xcb-util=0.4.0 +- xcb-util-image=0.4.0 +- xcb-util-keysyms=0.4.0 +- xcb-util-renderutil=0.3.9 +- xcb-util-wm=0.4.1 +- xerces-c=3.2.5 +- xkeyboard-config=2.41 +- xlrd=2.0.1 +- xorg-fixesproto=5.0 +- xorg-inputproto=2.3.2 +- xorg-kbproto=1.0.7 +- xorg-libice=1.1.1 +- xorg-libsm=1.2.4 +- xorg-libx11=1.8.7 +- xorg-libxau=1.0.11 +- xorg-libxdmcp=1.1.3 +- xorg-libxext=1.3.4 +- xorg-libxfixes=5.0.3 +- xorg-libxi=1.7.10 +- xorg-libxrender=0.9.11 +- xorg-libxt=1.3.0 +- xorg-libxtst=1.2.3 +- xorg-recordproto=1.14.2 +- xorg-renderproto=0.11.1 +- xorg-xextproto=7.3.0 +- xorg-xf86vidmodeproto=2.3.1 +- xorg-xproto=7.0.31 +- xyzservices=2023.10.1 +- xz=5.2.6 +- yaml=0.2.5 +- yte=1.5.4 +- zict=3.0.0 +- zipp=3.17.0 +- zlib=1.2.13 +- zlib-ng=2.0.7 +- zstd=1.5.5 +- pip: + - highspy==1.5.3 + - tsam==2.3.1 From ccb43a5612010d13db0b000dfabab673cd900aeb Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Mon, 19 Feb 2024 22:45:17 +0100 Subject: [PATCH 462/497] Allow absence of offshore wind from sector-coupled networks --- rules/build_sector.smk | 7 +++++-- scripts/prepare_sector_network.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index acdc3203..ff25af0e 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -808,6 +808,11 @@ rule prepare_sector_network: **rules.cluster_gas_network.output, **rules.build_gas_input_locations.output, **build_sequestration_potentials_output, + **{ + f"profile_offwind_{tech}": RESOURCES + f"profile_offwind-{tech}.nc" + for tech in ["ac", "dc"] + if (f"offwind-{tech}" in config["electricity"]["renewable_carriers"]) + }, network=RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", energy_totals_name=RESOURCES + "energy_totals.csv", eurostat=input_eurostat, @@ -833,8 +838,6 @@ rule prepare_sector_network: if config["foresight"] == "overnight" else "data/costs_{planning_horizons}.csv" ), - profile_offwind_ac=RESOURCES + "profile_offwind-ac.nc", - profile_offwind_dc=RESOURCES + "profile_offwind-dc.nc", h2_cavern=RESOURCES + "salt_cavern_potentials_s{simpl}_{clusters}.csv", busmap_s=RESOURCES + "busmap_elec_s{simpl}.csv", busmap=RESOURCES + "busmap_elec_s{simpl}_{clusters}.csv", diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b1351089..21728f7c 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -423,6 +423,8 @@ def update_wind_solar_costs(n, costs): # code adapted from pypsa-eur/scripts/add_electricity.py for connection in ["dc", "ac"]: tech = "offwind-" + connection + if tech not in n.generators.carrier.values: + continue profile = snakemake.input["profile_offwind_" + connection] with xr.open_dataset(profile) as ds: From 4f91c6c43d706b49a2749f924ea7b89cdfa7bdd3 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 9 Feb 2024 19:03:39 +0100 Subject: [PATCH 463/497] bugfix: make sure coal demand is there with regional demand --- scripts/prepare_sector_network.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b1351089..810257c0 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3059,6 +3059,9 @@ def add_industry(n, costs): + mwh_coal_per_mwh_coke * industrial_demand["coke"] ) / nhours + p_set.rename(lambda x: x + " coal for industry", + inplace=True) + if not options["regional_coal_demand"]: p_set = p_set.sum() From 3466027482b61d3c71a65144cbb07b00f49aea97 Mon Sep 17 00:00:00 2001 From: lumbric Date: Mon, 19 Feb 2024 18:58:23 +0100 Subject: [PATCH 464/497] Fix broken link to mamba installation guide in docs --- doc/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/installation.rst b/doc/installation.rst index b07fd290..fbabfd15 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -31,7 +31,7 @@ Install Python Dependencies PyPSA-Eur relies on a set of other Python packages to function. We recommend using the package manager `mamba `_ to install them and manage your environments. -For instructions for your operating system follow the ``mamba`` `installation guide `_. +For instructions for your operating system follow the ``mamba`` `installation guide `_. You can also use ``conda`` equivalently. The package requirements are curated in the `envs/environment.yaml `_ file. From ac2322cd16eff8f9d056f7021329d9e6b40b324d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 17:59:11 +0000 Subject: [PATCH 465/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- envs/environment.fixed.yaml | 878 ++++++++++++++++++------------------ 1 file changed, 439 insertions(+), 439 deletions(-) diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index cde0b801..8bbd70bf 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -4,443 +4,443 @@ name: pypsa-eur channels: - - bioconda - - http://conda.anaconda.org/gurobi - - conda-forge - - defaults +- bioconda +- http://conda.anaconda.org/gurobi +- conda-forge +- defaults dependencies: - - _libgcc_mutex=0.1 - - _openmp_mutex=4.5 - - affine=2.4.0 - - alsa-lib=1.2.10 - - ampl-mp=3.1.0 - - amply=0.1.6 - - appdirs=1.4.4 - - asttokens=2.4.1 - - atk-1.0=2.38.0 - - atlite=0.2.12 - - attr=2.5.1 - - attrs=23.2.0 - - aws-c-auth=0.7.15 - - aws-c-cal=0.6.9 - - aws-c-common=0.9.12 - - aws-c-compression=0.2.17 - - aws-c-event-stream=0.4.1 - - aws-c-http=0.8.0 - - aws-c-io=0.14.3 - - aws-c-mqtt=0.10.1 - - aws-c-s3=0.5.0 - - aws-c-sdkutils=0.1.14 - - aws-checksums=0.1.17 - - aws-crt-cpp=0.26.1 - - aws-sdk-cpp=1.11.242 - - azure-core-cpp=1.10.3 - - azure-storage-blobs-cpp=12.10.0 - - azure-storage-common-cpp=12.5.0 - - beautifulsoup4=4.12.3 - - blosc=1.21.5 - - bokeh=3.3.4 - - bottleneck=1.3.7 - - branca=0.7.1 - - brotli=1.1.0 - - brotli-bin=1.1.0 - - brotli-python=1.1.0 - - bzip2=1.0.8 - - c-ares=1.26.0 - - c-blosc2=2.13.2 - - ca-certificates=2024.2.2 - - cairo=1.18.0 - - cartopy=0.22.0 - - cdsapi=0.6.1 - - certifi=2024.2.2 - - cffi=1.16.0 - - cfgv=3.3.1 - - cfitsio=4.3.1 - - cftime=1.6.3 - - charset-normalizer=3.3.2 - - click=8.1.7 - - click-plugins=1.1.1 - - cligj=0.7.2 - - cloudpickle=3.0.0 - - coin-or-cbc=2.10.10 - - coin-or-cgl=0.60.7 - - coin-or-clp=1.17.8 - - coin-or-osi=0.108.8 - - coin-or-utils=2.11.9 - - coincbc=2.10.10 - - colorama=0.4.6 - - configargparse=1.7 - - connection_pool=0.0.3 - - contourpy=1.2.0 - - country_converter=1.2 - - cppad=20240000.2 - - cycler=0.12.1 - - cytoolz=0.12.3 - - dask=2024.2.0 - - dask-core=2024.2.0 - - datrie=0.8.2 - - dbus=1.13.6 - - decorator=5.1.1 - - deprecation=2.1.0 - - descartes=1.1.0 - - distlib=0.3.8 - - distributed=2024.2.0 - - distro=1.9.0 - - docutils=0.20.1 - - dpath=2.1.6 - - entsoe-py=0.6.6 - - et_xmlfile=1.1.0 - - exceptiongroup=1.2.0 - - executing=2.0.1 - - expat=2.5.0 - - filelock=3.13.1 - - fiona=1.9.5 - - folium=0.15.1 - - font-ttf-dejavu-sans-mono=2.37 - - font-ttf-inconsolata=3.000 - - font-ttf-source-code-pro=2.038 - - font-ttf-ubuntu=0.83 - - fontconfig=2.14.2 - - fonts-conda-ecosystem=1 - - fonts-conda-forge=1 - - fonttools=4.49.0 - - freetype=2.12.1 - - freexl=2.0.0 - - fribidi=1.0.10 - - fsspec=2024.2.0 - - gdal=3.8.4 - - gdk-pixbuf=2.42.10 - - geographiclib=1.52 - - geojson-rewind=1.1.0 - - geopandas=0.14.3 - - geopandas-base=0.14.3 - - geopy=2.4.1 - - geos=3.12.1 - - geotiff=1.7.1 - - gettext=0.21.1 - - gflags=2.2.2 - - giflib=5.2.1 - - gitdb=4.0.11 - - gitpython=3.1.42 - - glib=2.78.4 - - glib-tools=2.78.4 - - glog=0.6.0 - - glpk=5.0 - - gmp=6.3.0 - - graphite2=1.3.13 - - graphviz=9.0.0 - - gst-plugins-base=1.22.9 - - gstreamer=1.22.9 - - gtk2=2.24.33 - - gts=0.7.6 - - harfbuzz=8.3.0 - - hdf4=4.2.15 - - hdf5=1.14.3 - - humanfriendly=10.0 - - icu=73.2 - - identify=2.5.35 - - idna=3.6 - - importlib-metadata=7.0.1 - - importlib_metadata=7.0.1 - - importlib_resources=6.1.1 - - iniconfig=2.0.0 - - ipopt=3.14.14 - - ipython=8.21.0 - - jedi=0.19.1 - - jinja2=3.1.3 - - joblib=1.3.2 - - json-c=0.17 - - jsonschema=4.21.1 - - jsonschema-specifications=2023.12.1 - - jupyter_core=5.7.1 - - kealib=1.5.3 - - keyutils=1.6.1 - - kiwisolver=1.4.5 - - krb5=1.21.2 - - lame=3.100 - - lcms2=2.16 - - ld_impl_linux-64=2.40 - - lerc=4.0.0 - - libabseil=20230802.1 - - libaec=1.1.2 - - libarchive=3.7.2 - - libarrow=15.0.0 - - libarrow-acero=15.0.0 - - libarrow-dataset=15.0.0 - - libarrow-flight=15.0.0 - - libarrow-flight-sql=15.0.0 - - libarrow-gandiva=15.0.0 - - libarrow-substrait=15.0.0 - - libblas=3.9.0 - - libboost-headers=1.84.0 - - libbrotlicommon=1.1.0 - - libbrotlidec=1.1.0 - - libbrotlienc=1.1.0 - - libcap=2.69 - - libcblas=3.9.0 - - libclang=15.0.7 - - libclang13=15.0.7 - - libcrc32c=1.1.2 - - libcups=2.3.3 - - libcurl=8.5.0 - - libdeflate=1.19 - - libedit=3.1.20191231 - - libev=4.33 - - libevent=2.1.12 - - libexpat=2.5.0 - - libffi=3.4.2 - - libflac=1.4.3 - - libgcc-ng=13.2.0 - - libgcrypt=1.10.3 - - libgd=2.3.3 - - libgdal=3.8.4 - - libgfortran-ng=13.2.0 - - libgfortran5=13.2.0 - - libglib=2.78.4 - - libgomp=13.2.0 - - libgoogle-cloud=2.12.0 - - libgpg-error=1.47 - - libgrpc=1.60.1 - - libhwloc=2.9.3 - - libiconv=1.17 - - libjpeg-turbo=3.0.0 - - libkml=1.3.0 - - liblapack=3.9.0 - - liblapacke=3.9.0 - - libllvm15=15.0.7 - - libnetcdf=4.9.2 - - libnghttp2=1.58.0 - - libnl=3.9.0 - - libnsl=2.0.1 - - libnuma=2.0.16 - - libogg=1.3.4 - - libopenblas=0.3.26 - - libopus=1.3.1 - - libparquet=15.0.0 - - libpng=1.6.42 - - libpq=16.2 - - libprotobuf=4.25.1 - - libre2-11=2023.06.02 - - librsvg=2.56.3 - - librttopo=1.1.0 - - libscotch=7.0.4 - - libsndfile=1.2.2 - - libspatialindex=1.9.3 - - libspatialite=5.1.0 - - libspral=2023.09.07 - - libsqlite=3.45.1 - - libssh2=1.11.0 - - libstdcxx-ng=13.2.0 - - libsystemd0=255 - - libthrift=0.19.0 - - libtiff=4.6.0 - - libutf8proc=2.8.0 - - libuuid=2.38.1 - - libvorbis=1.3.7 - - libwebp=1.3.2 - - libwebp-base=1.3.2 - - libxcb=1.15 - - libxcrypt=4.4.36 - - libxkbcommon=1.6.0 - - libxml2=2.12.5 - - libxslt=1.1.39 - - libzip=1.10.1 - - libzlib=1.2.13 - - linopy=0.3.4 - - locket=1.0.0 - - lxml=5.1.0 - - lz4=4.3.3 - - lz4-c=1.9.4 - - lzo=2.10 - - mapclassify=2.6.1 - - markupsafe=2.1.5 - - matplotlib=3.8.3 - - matplotlib-base=3.8.3 - - matplotlib-inline=0.1.6 - - memory_profiler=0.61.0 - - metis=5.1.0 - - minizip=4.0.4 - - mpg123=1.32.4 - - msgpack-python=1.0.7 - - mumps-include=5.6.2 - - mumps-seq=5.6.2 - - munkres=1.1.4 - - mysql-common=8.0.33 - - mysql-libs=8.0.33 - - nbformat=5.9.2 - - ncurses=6.4 - - netcdf4=1.6.5 - - networkx=3.2.1 - - nodeenv=1.8.0 - - nomkl=1.0 - - nspr=4.35 - - nss=3.98 - - numexpr=2.9.0 - - numpy=1.26.4 - - openjdk=21.0.2 - - openjpeg=2.5.0 - - openpyxl=3.1.2 - - openssl=3.2.1 - - orc=1.9.2 - - packaging=23.2 - - pandas=2.2.0 - - pango=1.50.14 - - parso=0.8.3 - - partd=1.4.1 - - patsy=0.5.6 - - pcre2=10.42 - - pexpect=4.9.0 - - pickleshare=0.7.5 - - pillow=10.2.0 - - pip=24.0 - - pixman=0.43.2 - - pkgutil-resolve-name=1.3.10 - - plac=1.4.2 - - platformdirs=4.2.0 - - pluggy=1.4.0 - - ply=3.11 - - poppler=24.02.0 - - poppler-data=0.4.12 - - postgresql=16.2 - - powerplantmatching=0.5.11 - - pre-commit=3.6.2 - - progressbar2=4.3.2 - - proj=9.3.1 - - prompt-toolkit=3.0.42 - - psutil=5.9.8 - - pthread-stubs=0.4 - - ptyprocess=0.7.0 - - pulp=2.7.0 - - pulseaudio-client=16.1 - - pure_eval=0.2.2 - - py-cpuinfo=9.0.0 - - pyarrow=15.0.0 - - pyarrow-hotfix=0.6 - - pycountry=22.3.5 - - pycparser=2.21 - - pygments=2.17.2 - - pyomo=6.6.1 - - pyparsing=3.1.1 - - pyproj=3.6.1 - - pypsa=0.27.0 - - pyqt=5.15.9 - - pyqt5-sip=12.12.2 - - pyscipopt=4.4.0 - - pyshp=2.3.1 - - pysocks=1.7.1 - - pytables=3.9.2 - - pytest=8.0.0 - - python=3.11.8 - - python-dateutil=2.8.2 - - python-fastjsonschema=2.19.1 - - python-tzdata=2024.1 - - python-utils=3.8.2 - - python_abi=3.11 - - pytz=2024.1 - - pyxlsb=1.0.10 - - pyyaml=6.0.1 - - qt-main=5.15.8 - - rasterio=1.3.9 - - rdma-core=50.0 - - re2=2023.06.02 - - readline=8.2 - - referencing=0.33.0 - - requests=2.31.0 - - reretry=0.11.8 - - rioxarray=0.15.1 - - rpds-py=0.18.0 - - rtree=1.2.0 - - s2n=1.4.3 - - scikit-learn=1.4.1.post1 - - scip=8.1.0 - - scipy=1.12.0 - - scotch=7.0.4 - - seaborn=0.13.2 - - seaborn-base=0.13.2 - - setuptools=69.1.0 - - setuptools-scm=8.0.4 - - setuptools_scm=8.0.4 - - shapely=2.0.2 - - sip=6.7.12 - - six=1.16.0 - - smart_open=6.4.0 - - smmap=5.0.0 - - snakemake-minimal=7.32.4 - - snappy=1.1.10 - - snuggs=1.4.7 - - sortedcontainers=2.4.0 - - soupsieve=2.5 - - sqlite=3.45.1 - - stack_data=0.6.2 - - statsmodels=0.14.1 - - stopit=1.1.2 - - tabula-py=2.7.0 - - tabulate=0.9.0 - - tbb=2021.11.0 - - tblib=3.0.0 - - threadpoolctl=3.3.0 - - throttler=1.2.2 - - tiledb=2.20.0 - - tk=8.6.13 - - toml=0.10.2 - - tomli=2.0.1 - - toolz=0.12.1 - - toposort=1.10 - - tornado=6.3.3 - - tqdm=4.66.2 - - traitlets=5.14.1 - - typing-extensions=4.9.0 - - typing_extensions=4.9.0 - - tzcode=2024a - - tzdata=2024a - - ucx=1.15.0 - - ukkonen=1.0.1 - - unidecode=1.3.8 - - unixodbc=2.3.12 - - uriparser=0.9.7 - - urllib3=2.2.1 - - validators=0.22.0 - - virtualenv=20.25.0 - - wcwidth=0.2.13 - - wheel=0.42.0 - - wrapt=1.16.0 - - xarray=2024.2.0 - - xcb-util=0.4.0 - - xcb-util-image=0.4.0 - - xcb-util-keysyms=0.4.0 - - xcb-util-renderutil=0.3.9 - - xcb-util-wm=0.4.1 - - xerces-c=3.2.5 - - xkeyboard-config=2.41 - - xlrd=2.0.1 - - xorg-fixesproto=5.0 - - xorg-inputproto=2.3.2 - - xorg-kbproto=1.0.7 - - xorg-libice=1.1.1 - - xorg-libsm=1.2.4 - - xorg-libx11=1.8.7 - - xorg-libxau=1.0.11 - - xorg-libxdmcp=1.1.3 - - xorg-libxext=1.3.4 - - xorg-libxfixes=5.0.3 - - xorg-libxi=1.7.10 - - xorg-libxrender=0.9.11 - - xorg-libxt=1.3.0 - - xorg-libxtst=1.2.3 - - xorg-recordproto=1.14.2 - - xorg-renderproto=0.11.1 - - xorg-xextproto=7.3.0 - - xorg-xf86vidmodeproto=2.3.1 - - xorg-xproto=7.0.31 - - xyzservices=2023.10.1 - - xz=5.2.6 - - yaml=0.2.5 - - yte=1.5.4 - - zict=3.0.0 - - zipp=3.17.0 - - zlib=1.2.13 - - zlib-ng=2.0.7 - - zstd=1.5.5 - - pip: - - highspy==1.5.3 - - tsam==2.3.1 +- _libgcc_mutex=0.1 +- _openmp_mutex=4.5 +- affine=2.4.0 +- alsa-lib=1.2.10 +- ampl-mp=3.1.0 +- amply=0.1.6 +- appdirs=1.4.4 +- asttokens=2.4.1 +- atk-1.0=2.38.0 +- atlite=0.2.12 +- attr=2.5.1 +- attrs=23.2.0 +- aws-c-auth=0.7.15 +- aws-c-cal=0.6.9 +- aws-c-common=0.9.12 +- aws-c-compression=0.2.17 +- aws-c-event-stream=0.4.1 +- aws-c-http=0.8.0 +- aws-c-io=0.14.3 +- aws-c-mqtt=0.10.1 +- aws-c-s3=0.5.0 +- aws-c-sdkutils=0.1.14 +- aws-checksums=0.1.17 +- aws-crt-cpp=0.26.1 +- aws-sdk-cpp=1.11.242 +- azure-core-cpp=1.10.3 +- azure-storage-blobs-cpp=12.10.0 +- azure-storage-common-cpp=12.5.0 +- beautifulsoup4=4.12.3 +- blosc=1.21.5 +- bokeh=3.3.4 +- bottleneck=1.3.7 +- branca=0.7.1 +- brotli=1.1.0 +- brotli-bin=1.1.0 +- brotli-python=1.1.0 +- bzip2=1.0.8 +- c-ares=1.26.0 +- c-blosc2=2.13.2 +- ca-certificates=2024.2.2 +- cairo=1.18.0 +- cartopy=0.22.0 +- cdsapi=0.6.1 +- certifi=2024.2.2 +- cffi=1.16.0 +- cfgv=3.3.1 +- cfitsio=4.3.1 +- cftime=1.6.3 +- charset-normalizer=3.3.2 +- click=8.1.7 +- click-plugins=1.1.1 +- cligj=0.7.2 +- cloudpickle=3.0.0 +- coin-or-cbc=2.10.10 +- coin-or-cgl=0.60.7 +- coin-or-clp=1.17.8 +- coin-or-osi=0.108.8 +- coin-or-utils=2.11.9 +- coincbc=2.10.10 +- colorama=0.4.6 +- configargparse=1.7 +- connection_pool=0.0.3 +- contourpy=1.2.0 +- country_converter=1.2 +- cppad=20240000.2 +- cycler=0.12.1 +- cytoolz=0.12.3 +- dask=2024.2.0 +- dask-core=2024.2.0 +- datrie=0.8.2 +- dbus=1.13.6 +- decorator=5.1.1 +- deprecation=2.1.0 +- descartes=1.1.0 +- distlib=0.3.8 +- distributed=2024.2.0 +- distro=1.9.0 +- docutils=0.20.1 +- dpath=2.1.6 +- entsoe-py=0.6.6 +- et_xmlfile=1.1.0 +- exceptiongroup=1.2.0 +- executing=2.0.1 +- expat=2.5.0 +- filelock=3.13.1 +- fiona=1.9.5 +- folium=0.15.1 +- font-ttf-dejavu-sans-mono=2.37 +- font-ttf-inconsolata=3.000 +- font-ttf-source-code-pro=2.038 +- font-ttf-ubuntu=0.83 +- fontconfig=2.14.2 +- fonts-conda-ecosystem=1 +- fonts-conda-forge=1 +- fonttools=4.49.0 +- freetype=2.12.1 +- freexl=2.0.0 +- fribidi=1.0.10 +- fsspec=2024.2.0 +- gdal=3.8.4 +- gdk-pixbuf=2.42.10 +- geographiclib=1.52 +- geojson-rewind=1.1.0 +- geopandas=0.14.3 +- geopandas-base=0.14.3 +- geopy=2.4.1 +- geos=3.12.1 +- geotiff=1.7.1 +- gettext=0.21.1 +- gflags=2.2.2 +- giflib=5.2.1 +- gitdb=4.0.11 +- gitpython=3.1.42 +- glib=2.78.4 +- glib-tools=2.78.4 +- glog=0.6.0 +- glpk=5.0 +- gmp=6.3.0 +- graphite2=1.3.13 +- graphviz=9.0.0 +- gst-plugins-base=1.22.9 +- gstreamer=1.22.9 +- gtk2=2.24.33 +- gts=0.7.6 +- harfbuzz=8.3.0 +- hdf4=4.2.15 +- hdf5=1.14.3 +- humanfriendly=10.0 +- icu=73.2 +- identify=2.5.35 +- idna=3.6 +- importlib-metadata=7.0.1 +- importlib_metadata=7.0.1 +- importlib_resources=6.1.1 +- iniconfig=2.0.0 +- ipopt=3.14.14 +- ipython=8.21.0 +- jedi=0.19.1 +- jinja2=3.1.3 +- joblib=1.3.2 +- json-c=0.17 +- jsonschema=4.21.1 +- jsonschema-specifications=2023.12.1 +- jupyter_core=5.7.1 +- kealib=1.5.3 +- keyutils=1.6.1 +- kiwisolver=1.4.5 +- krb5=1.21.2 +- lame=3.100 +- lcms2=2.16 +- ld_impl_linux-64=2.40 +- lerc=4.0.0 +- libabseil=20230802.1 +- libaec=1.1.2 +- libarchive=3.7.2 +- libarrow=15.0.0 +- libarrow-acero=15.0.0 +- libarrow-dataset=15.0.0 +- libarrow-flight=15.0.0 +- libarrow-flight-sql=15.0.0 +- libarrow-gandiva=15.0.0 +- libarrow-substrait=15.0.0 +- libblas=3.9.0 +- libboost-headers=1.84.0 +- libbrotlicommon=1.1.0 +- libbrotlidec=1.1.0 +- libbrotlienc=1.1.0 +- libcap=2.69 +- libcblas=3.9.0 +- libclang=15.0.7 +- libclang13=15.0.7 +- libcrc32c=1.1.2 +- libcups=2.3.3 +- libcurl=8.5.0 +- libdeflate=1.19 +- libedit=3.1.20191231 +- libev=4.33 +- libevent=2.1.12 +- libexpat=2.5.0 +- libffi=3.4.2 +- libflac=1.4.3 +- libgcc-ng=13.2.0 +- libgcrypt=1.10.3 +- libgd=2.3.3 +- libgdal=3.8.4 +- libgfortran-ng=13.2.0 +- libgfortran5=13.2.0 +- libglib=2.78.4 +- libgomp=13.2.0 +- libgoogle-cloud=2.12.0 +- libgpg-error=1.47 +- libgrpc=1.60.1 +- libhwloc=2.9.3 +- libiconv=1.17 +- libjpeg-turbo=3.0.0 +- libkml=1.3.0 +- liblapack=3.9.0 +- liblapacke=3.9.0 +- libllvm15=15.0.7 +- libnetcdf=4.9.2 +- libnghttp2=1.58.0 +- libnl=3.9.0 +- libnsl=2.0.1 +- libnuma=2.0.16 +- libogg=1.3.4 +- libopenblas=0.3.26 +- libopus=1.3.1 +- libparquet=15.0.0 +- libpng=1.6.42 +- libpq=16.2 +- libprotobuf=4.25.1 +- libre2-11=2023.06.02 +- librsvg=2.56.3 +- librttopo=1.1.0 +- libscotch=7.0.4 +- libsndfile=1.2.2 +- libspatialindex=1.9.3 +- libspatialite=5.1.0 +- libspral=2023.09.07 +- libsqlite=3.45.1 +- libssh2=1.11.0 +- libstdcxx-ng=13.2.0 +- libsystemd0=255 +- libthrift=0.19.0 +- libtiff=4.6.0 +- libutf8proc=2.8.0 +- libuuid=2.38.1 +- libvorbis=1.3.7 +- libwebp=1.3.2 +- libwebp-base=1.3.2 +- libxcb=1.15 +- libxcrypt=4.4.36 +- libxkbcommon=1.6.0 +- libxml2=2.12.5 +- libxslt=1.1.39 +- libzip=1.10.1 +- libzlib=1.2.13 +- linopy=0.3.4 +- locket=1.0.0 +- lxml=5.1.0 +- lz4=4.3.3 +- lz4-c=1.9.4 +- lzo=2.10 +- mapclassify=2.6.1 +- markupsafe=2.1.5 +- matplotlib=3.8.3 +- matplotlib-base=3.8.3 +- matplotlib-inline=0.1.6 +- memory_profiler=0.61.0 +- metis=5.1.0 +- minizip=4.0.4 +- mpg123=1.32.4 +- msgpack-python=1.0.7 +- mumps-include=5.6.2 +- mumps-seq=5.6.2 +- munkres=1.1.4 +- mysql-common=8.0.33 +- mysql-libs=8.0.33 +- nbformat=5.9.2 +- ncurses=6.4 +- netcdf4=1.6.5 +- networkx=3.2.1 +- nodeenv=1.8.0 +- nomkl=1.0 +- nspr=4.35 +- nss=3.98 +- numexpr=2.9.0 +- numpy=1.26.4 +- openjdk=21.0.2 +- openjpeg=2.5.0 +- openpyxl=3.1.2 +- openssl=3.2.1 +- orc=1.9.2 +- packaging=23.2 +- pandas=2.2.0 +- pango=1.50.14 +- parso=0.8.3 +- partd=1.4.1 +- patsy=0.5.6 +- pcre2=10.42 +- pexpect=4.9.0 +- pickleshare=0.7.5 +- pillow=10.2.0 +- pip=24.0 +- pixman=0.43.2 +- pkgutil-resolve-name=1.3.10 +- plac=1.4.2 +- platformdirs=4.2.0 +- pluggy=1.4.0 +- ply=3.11 +- poppler=24.02.0 +- poppler-data=0.4.12 +- postgresql=16.2 +- powerplantmatching=0.5.11 +- pre-commit=3.6.2 +- progressbar2=4.3.2 +- proj=9.3.1 +- prompt-toolkit=3.0.42 +- psutil=5.9.8 +- pthread-stubs=0.4 +- ptyprocess=0.7.0 +- pulp=2.7.0 +- pulseaudio-client=16.1 +- pure_eval=0.2.2 +- py-cpuinfo=9.0.0 +- pyarrow=15.0.0 +- pyarrow-hotfix=0.6 +- pycountry=22.3.5 +- pycparser=2.21 +- pygments=2.17.2 +- pyomo=6.6.1 +- pyparsing=3.1.1 +- pyproj=3.6.1 +- pypsa=0.27.0 +- pyqt=5.15.9 +- pyqt5-sip=12.12.2 +- pyscipopt=4.4.0 +- pyshp=2.3.1 +- pysocks=1.7.1 +- pytables=3.9.2 +- pytest=8.0.0 +- python=3.11.8 +- python-dateutil=2.8.2 +- python-fastjsonschema=2.19.1 +- python-tzdata=2024.1 +- python-utils=3.8.2 +- python_abi=3.11 +- pytz=2024.1 +- pyxlsb=1.0.10 +- pyyaml=6.0.1 +- qt-main=5.15.8 +- rasterio=1.3.9 +- rdma-core=50.0 +- re2=2023.06.02 +- readline=8.2 +- referencing=0.33.0 +- requests=2.31.0 +- reretry=0.11.8 +- rioxarray=0.15.1 +- rpds-py=0.18.0 +- rtree=1.2.0 +- s2n=1.4.3 +- scikit-learn=1.4.1.post1 +- scip=8.1.0 +- scipy=1.12.0 +- scotch=7.0.4 +- seaborn=0.13.2 +- seaborn-base=0.13.2 +- setuptools=69.1.0 +- setuptools-scm=8.0.4 +- setuptools_scm=8.0.4 +- shapely=2.0.2 +- sip=6.7.12 +- six=1.16.0 +- smart_open=6.4.0 +- smmap=5.0.0 +- snakemake-minimal=7.32.4 +- snappy=1.1.10 +- snuggs=1.4.7 +- sortedcontainers=2.4.0 +- soupsieve=2.5 +- sqlite=3.45.1 +- stack_data=0.6.2 +- statsmodels=0.14.1 +- stopit=1.1.2 +- tabula-py=2.7.0 +- tabulate=0.9.0 +- tbb=2021.11.0 +- tblib=3.0.0 +- threadpoolctl=3.3.0 +- throttler=1.2.2 +- tiledb=2.20.0 +- tk=8.6.13 +- toml=0.10.2 +- tomli=2.0.1 +- toolz=0.12.1 +- toposort=1.10 +- tornado=6.3.3 +- tqdm=4.66.2 +- traitlets=5.14.1 +- typing-extensions=4.9.0 +- typing_extensions=4.9.0 +- tzcode=2024a +- tzdata=2024a +- ucx=1.15.0 +- ukkonen=1.0.1 +- unidecode=1.3.8 +- unixodbc=2.3.12 +- uriparser=0.9.7 +- urllib3=2.2.1 +- validators=0.22.0 +- virtualenv=20.25.0 +- wcwidth=0.2.13 +- wheel=0.42.0 +- wrapt=1.16.0 +- xarray=2024.2.0 +- xcb-util=0.4.0 +- xcb-util-image=0.4.0 +- xcb-util-keysyms=0.4.0 +- xcb-util-renderutil=0.3.9 +- xcb-util-wm=0.4.1 +- xerces-c=3.2.5 +- xkeyboard-config=2.41 +- xlrd=2.0.1 +- xorg-fixesproto=5.0 +- xorg-inputproto=2.3.2 +- xorg-kbproto=1.0.7 +- xorg-libice=1.1.1 +- xorg-libsm=1.2.4 +- xorg-libx11=1.8.7 +- xorg-libxau=1.0.11 +- xorg-libxdmcp=1.1.3 +- xorg-libxext=1.3.4 +- xorg-libxfixes=5.0.3 +- xorg-libxi=1.7.10 +- xorg-libxrender=0.9.11 +- xorg-libxt=1.3.0 +- xorg-libxtst=1.2.3 +- xorg-recordproto=1.14.2 +- xorg-renderproto=0.11.1 +- xorg-xextproto=7.3.0 +- xorg-xf86vidmodeproto=2.3.1 +- xorg-xproto=7.0.31 +- xyzservices=2023.10.1 +- xz=5.2.6 +- yaml=0.2.5 +- yte=1.5.4 +- zict=3.0.0 +- zipp=3.17.0 +- zlib=1.2.13 +- zlib-ng=2.0.7 +- zstd=1.5.5 +- pip: + - highspy==1.5.3 + - tsam==2.3.1 From d713e3c52b2e77b30816a3b829faee3fc3ebd381 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 Feb 2024 09:03:54 +0000 Subject: [PATCH 466/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 810257c0..f5e6604b 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3059,8 +3059,7 @@ def add_industry(n, costs): + mwh_coal_per_mwh_coke * industrial_demand["coke"] ) / nhours - p_set.rename(lambda x: x + " coal for industry", - inplace=True) + p_set.rename(lambda x: x + " coal for industry", inplace=True) if not options["regional_coal_demand"]: p_set = p_set.sum() From 26b202f46399efe53a10b5a1342e9059ffe8c867 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 20 Feb 2024 12:34:19 +0100 Subject: [PATCH 467/497] prepare_sector: automatically interpolate in config get() function --- doc/release_notes.rst | 8 +++++--- scripts/prepare_sector_network.py | 27 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index bc1cd2c6..15814036 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,9 +7,11 @@ Release Notes ########################################## -.. Upcoming Release -.. ================ -.. +Upcoming Release +================ + +* Linearly interpolate missing investment periods in year-dependent + configuration options. PyPSA-Eur 0.10.0 (19th February 2024) ===================================== diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index f5e6604b..3438e3d8 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -215,7 +215,32 @@ def get(item, investment_year=None): """ Check whether item depends on investment year. """ - return item[investment_year] if isinstance(item, dict) else item + if not isinstance(item, dict): + return item + elif investment_year in item.keys(): + return item[investment_year] + else: + logger.warning( + f"Investment key {investment_year} not found in dictionary {item}." + ) + keys = sorted(item.keys()) + if investment_year < keys[0]: + logger.warning(f"Lower than minimum key. Taking minimum key {keys[0]}") + return item[keys[0]] + elif investment_year > keys[-1]: + logger.warning(f"Higher than maximum key. Taking maximum key {keys[0]}") + return item[keys[-1]] + else: + logger.warning( + "Interpolate linearly between the next lower and next higher year." + ) + lower_key = max(k for k in keys if k < investment_year) + higher_key = min(k for k in keys if k > investment_year) + lower = item[lower_key] + higher = item[higher_key] + return lower + (higher - lower) * (investment_year - lower_key) / ( + higher_key - lower_key + ) def co2_emissions_year( From 66d078e4074986800c61e1df66d33b804a04782c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 20 Feb 2024 14:24:23 +0100 Subject: [PATCH 468/497] reorder release notes --- Snakefile | 1 - doc/release_notes.rst | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Snakefile b/Snakefile index b3d2735c..78a28373 100644 --- a/Snakefile +++ b/Snakefile @@ -26,7 +26,6 @@ for template, target in default_files.items(): copyfile(template, target) - configfile: "config/config.default.yaml" configfile: "config/config.yaml" diff --git a/doc/release_notes.rst b/doc/release_notes.rst index fee8186b..e60f4f95 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -13,11 +13,6 @@ Upcoming Release * Linearly interpolate missing investment periods in year-dependent configuration options. -PyPSA-Eur 0.10.0 (19th February 2024) -===================================== - -**New Features** - * Added new scenario management that supports the simultaneous execution of multiple scenarios with a single ``snakemake`` call. For this purpose, a ``scenarios.yaml`` file is introduced which contains customizable scenario @@ -84,6 +79,11 @@ PyPSA-Eur 0.10.0 (19th February 2024) * The outputs of the rule ``retrieve_gas_infrastructure_data`` no longer marked as ``protected()`` as the download size is small. +PyPSA-Eur 0.10.0 (19th February 2024) +===================================== + +**New Features** + * Improved representation of industry transition pathways. A new script was added to interpolate industry sector ratios from today's status quo to future systems (i.e. specific emissions and demands for energy and feedstocks). For From ef29be714ba96807bb6825066bb81dcf198b7b07 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Tue, 20 Feb 2024 14:43:10 +0100 Subject: [PATCH 469/497] 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 e60f4f95..d6072d7d 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -79,6 +79,8 @@ Upcoming Release * The outputs of the rule ``retrieve_gas_infrastructure_data`` no longer marked as ``protected()`` as the download size is small. +* Bugfix: allow modelling sector-coupled landlocked regions. (Fixed handling of offshore wind.) + PyPSA-Eur 0.10.0 (19th February 2024) ===================================== From 1c9845afff70f9e5e461dac0864e355a851c071b Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Tue, 20 Feb 2024 17:52:57 +0100 Subject: [PATCH 470/497] Adapt offwind solution to new config management --- rules/build_sector.smk | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index c7c4662d..466d1713 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -808,6 +808,14 @@ rule build_existing_heating_distribution: "../scripts/build_existing_heating_distribution.py" +def input_profile_offwind(w): + return { + f"profile_{tech}": resources(f"profile_{tech}.nc") + for tech in ["offwind-ac", "offwind-dc"] + if (tech in config_provider("electricity", "renewable_carriers")(w)) + } + + rule prepare_sector_network: params: time_resolution=config_provider("clustering", "temporal", "resolution_sector"), @@ -829,13 +837,9 @@ rule prepare_sector_network: eurostat_report_year=config_provider("energy", "eurostat_report_year"), RDIR=RDIR, input: + unpack(input_profile_offwind), **rules.cluster_gas_network.output, **rules.build_gas_input_locations.output, - **{ - f"profile_offwind_{tech}": RESOURCES + f"profile_offwind-{tech}.nc" - for tech in ["ac", "dc"] - if (f"offwind-{tech}" in config["electricity"]["renewable_carriers"]) - }, retro_cost=lambda w: ( resources("retro_cost_elec_s{simpl}_{clusters}.csv") if config_provider("sector", "retrofitting", "retro_endogen")(w) From db9f234faddecb45f2b11498010f40ea084a6f75 Mon Sep 17 00:00:00 2001 From: Koen van Greevenbroek Date: Tue, 20 Feb 2024 18:38:21 +0100 Subject: [PATCH 471/497] Fix typo in snakemake input --- scripts/prepare_sector_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 6128b873..9a9db36f 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -455,7 +455,7 @@ def update_wind_solar_costs(n, costs): tech = "offwind-" + connection if tech not in n.generators.carrier.values: continue - profile = snakemake.input["profile_offwind_" + connection] + profile = snakemake.input["profile_offwind-" + connection] with xr.open_dataset(profile) as ds: # if-statement for compatibility with old profiles From 3298572cedf955392359b04933471671edf2d6c3 Mon Sep 17 00:00:00 2001 From: toniseibold Date: Fri, 23 Feb 2024 13:53:28 +0100 Subject: [PATCH 472/497] new energy totals from eurostat 2023 report scaling JRC IDEES data from 2015 --- config/config.default.yaml | 4 +- data/switzerland-new_format-all_years.csv | 50 ++-- rules/common.smk | 9 +- scripts/build_energy_totals.py | 309 ++++++++++++++++++---- 4 files changed, 293 insertions(+), 79 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index ca2d1ba3..093b1aad 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -314,9 +314,9 @@ pypsa_eur: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#energy energy: - energy_totals_year: 2013 + energy_totals_year: 2019 base_emissions_year: 1990 - eurostat_report_year: 2016 + eurostat_report_year: 2023 emissions: CO2 # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#biomass diff --git a/data/switzerland-new_format-all_years.csv b/data/switzerland-new_format-all_years.csv index 93123009..d083e8a8 100644 --- a/data/switzerland-new_format-all_years.csv +++ b/data/switzerland-new_format-all_years.csv @@ -1,25 +1,25 @@ -country,item,2010,2011,2012,2013,2014,2015 -CH,total residential,268.2,223.4,243.4,261.3,214.2,229.1 -CH,total residential space,192.2,149.0,168.1,185.5,139.7,154.4 -CH,total residential water,32.2,31.6,31.9,32.2,31.7,31.9 -CH,total residential cooking,9.3,9.3,9.3,9.4,9.5,9.6 -CH,electricity residential,67.9,63.7,65.7,67.6,63.0,64.4 -CH,electricity residential space,15.9,12.8,14.3,15.8,12.3,13.5 -CH,electricity residential water,8.8,8.5,8.5,8.6,8.5,8.6 -CH,electricity residential cooking,4.9,4.9,4.9,4.9,5.0,5.0 -CH,total services,145.9,127.4,136.7,144.0,124.5,132.5 -CH,total services space,80.0,62.2,70.8,77.4,58.3,64.3 -CH,total services water,10.1,10.0,10.1,10.1,10.0,10.0 -CH,total services cooking,2.5,2.4,2.3,2.3,2.4,2.3 -CH,electricity services,60.5,59.2,60.3,61.4,60.3,62.6 -CH,electricity services space,4.0,3.2,3.8,4.2,3.3,3.6 -CH,electricity services water,0.7,0.7,0.7,0.7,0.7,0.7 -CH,electricity services cooking,2.5,2.4,2.3,2.3,2.4,2.3 -CH,total rail,11.5,11.1,11.2,11.4,11.1,11.4 -CH,total road,199.4,200.4,200.4,201.2,202.0,203.1 -CH,electricity road,0.,0.,0.,0.,0.,0. -CH,electricity rail,11.5,11.1,11.2,11.4,11.1,11.4 -CH,total domestic aviation,3.3,3.2,3.4,3.4,3.5,3.5 -CH,total international aviation,58.0,62.0,63.5,64.2,64.5,66.8 -CH,total domestic navigation,1.6,1.6,1.6,1.6,1.6,1.6 -CH,total international navigation,0.,0.,0.,0.,0.,0. +country,item,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022 +CH,total residential,268.2,223.4,243.4,261.3,214.2,229.1,241.2,236.5,223.7,226.5,219.1,241.2,211.3 +CH,total residential space,192.2,149,168.1,185.5,139.7,154.4,167.3,161.5,147.2,150.4,140.2,166.2,131.9 +CH,total residential water,32.2,31.6,31.9,32.2,31.7,31.9,31.8,31.8,31.8,31.7,33.3,32.5,32.5 +CH,total residential cooking,9.3,9.3,9.3,9.4,9.5,9.6,9.9,10,10.1,10.2,10.5,10.3,10.3 +CH,electricity residential,67.9,63.7,65.7,67.6,63,64.4,69.7,69.2,67.7,68.1,68.7,70.8,66.8 +CH,electricity residential space,15.9,12.8,14.3,15.8,12.3,13.5,15.8,15.6,14.7,15.3,14.8,17.8,14.8 +CH,electricity residential water,8.8,8.5,8.5,8.6,8.5,8.6,8.9,9,9.2,9.3,9.7,9.5,9.5 +CH,electricity residential cooking,4.9,4.9,4.9,4.9,5,5,5,5.1,5.1,5.1,5.4,5.2,5.3 +CH,total services,145.9,127.4,136.7,144,124.5,132.5,150.5,147.7,141.5,143.1,129.7,144.2,122.5 +CH,total services space,80,62.2,70.8,77.4,58.3,64.3,77,74.4,68.2,69.8,64.3,75.7,58.7 +CH,total services water,10.1,10,10.1,10.1,10,10,11.4,11.3,11.2,11.1,9.7,10.4,12 +CH,total services cooking,2.5,2.4,2.3,2.3,2.4,2.3,3.1,3.1,3.2,3.3,2.1,2.6,3.2 +CH,electricity services,60.5,59.2,60.3,61.4,60.3,62.6,65.9,65.7,65.5,65.6,58.8,61.6,61.6 +CH,electricity services space,4,3.2,3.8,4.2,3.3,3.6,2.7,2.5,2.3,2.3,2.2,2.5,2.5 +CH,electricity services water,0.7,0.7,0.7,0.7,0.7,0.7,1.2,1.1,1.1,1.1,0.9,1,1 +CH,electricity services cooking,2.5,2.4,2.3,2.3,2.4,2.3,3.1,3.1,3.1,3.2,3.3,2.1,3.2 +CH,total rail,11.5,11.1,11.2,11.4,11.1,11.4,11.6,11.4,11.2,11,10.2,10.6,10.8 +CH,total road,199.4,200.4,200.4,201.2,202,203.1,203.9,203.7,202.6,200.5,182.6,188.3,193.3 +CH,electricity road,0,0,0,0,0,0,0.1,0.2,0.3,0.4,0.5,0.8,1.3 +CH,electricity rail,11.5,11.1,11.2,11.4,11.1,11.4,11.5,11.3,11.1,11,10.1,10.6,10.7 +CH,total domestic aviation,3.3,3.2,3.4,3.4,3.5,3.5,3.6,3.1,3.1,2.9,2.5,2.8,3 +CH,total international aviation,58,62,63.5,64.2,64.5,66.8,70.6,72.8,77.2,78.2,28.2,31.2,56.8 +CH,total domestic navigation,1.6,1.6,1.6,1.6,1.6,1.6,1.4,1.4,1.4,1.4,1.4,1.4,1.4 +CH,total international navigation,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/rules/common.smk b/rules/common.smk index 618d746b..c3ce845c 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -131,10 +131,11 @@ def has_internet_access(url="www.zenodo.org") -> bool: def input_eurostat(w): - # 2016 includes BA, 2017 does not - report_year = config_provider("energy", "eurostat_report_year")(w) - return f"data/bundle-sector/eurostat-energy_balances-june_{report_year}_edition" - + if config["energy"]["eurostat_report_year"] != 2023: + report_year = config["energy"]["eurostat_report_year"] + return f"data/bundle-sector/eurostat-energy_balances-june_{report_year}_edition" + else: + return "data/bundle-sector/eurostat-energy_balances-april_2023_edition" def solved_previous_horizon(w): planning_horizons = config_provider("scenario", "planning_horizons")(w) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 960d1bbe..13a8c30d 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -16,6 +16,7 @@ import numpy as np import pandas as pd from _helpers import configure_logging, mute_print, set_scenario_config from tqdm import tqdm +import os cc = coco.CountryConverter() logger = logging.getLogger(__name__) @@ -120,36 +121,93 @@ def build_eurostat(input_eurostat, countries, report_year, year): """ Return multi-index for all countries' energy data in TWh/a. """ - filenames = { + if report_year != 2023: + filenames = { 2016: f"/{year}-Energy-Balances-June2016edition.xlsx", 2017: f"/{year}-ENERGY-BALANCES-June2017edition.xlsx", } - with mute_print(): - dfs = pd.read_excel( - input_eurostat + filenames[report_year], - sheet_name=None, - skiprows=1, - index_col=list(range(4)), - ) + with mute_print(): + dfs = pd.read_excel( + input_eurostat + filenames[report_year], + sheet_name=None, + skiprows=1, + index_col=list(range(4)), + ) - # sorted_index necessary for slicing - lookup = eurostat_codes - labelled_dfs = { - lookup[df.columns[0]]: df - for df in dfs.values() - if lookup[df.columns[0]] in countries - } - df = pd.concat(labelled_dfs, sort=True).sort_index() + # sorted_index necessary for slicing + lookup = eurostat_codes + labelled_dfs = { + lookup[df.columns[0]]: df + for df in dfs.values() + if lookup[df.columns[0]] in countries + } + df = pd.concat(labelled_dfs, sort=True).sort_index() + # drop non-numeric and country columns + non_numeric_cols = df.columns[df.dtypes != float] + country_cols = df.columns.intersection(lookup.keys()) + to_drop = non_numeric_cols.union(country_cols) + df.drop(to_drop, axis=1, inplace=True) - # drop non-numeric and country columns - non_numeric_cols = df.columns[df.dtypes != float] - country_cols = df.columns.intersection(lookup.keys()) - to_drop = non_numeric_cols.union(country_cols) - df.drop(to_drop, axis=1, inplace=True) + # convert ktoe/a to TWh/a + df *= 11.63 / 1e3 + + else: + # read in every country file in countries + eurostat = pd.DataFrame() + countries = [country if country != 'GB' else 'UK' for country in countries] + countries = [country if country != 'GR' else 'EL' for country in countries] + for country in countries: + filename = f"/{country}-Energy-balance-sheets-April-2023-edition.xlsb" + if os.path.exists(input_eurostat + filename): + df = pd.read_excel( + input_eurostat + filename, + engine='pyxlsb', + sheet_name=str(year), + skiprows=4, + index_col=list(range(4))) + # replace entry 'Z' with 0 + df.replace('Z', 0, inplace=True) + # write 'International aviation' to the 2nd level of the multiindex + index_number = (df.index.get_level_values(1) == 'International aviation').argmax() + new_index = ('-', 'International aviation', 'International aviation', 'ktoe') + modified_index = list(df.index) + modified_index[index_number] = new_index + df.index = pd.MultiIndex.from_tuples(modified_index, names=df.index.names) + # drop the annoying subhead line + df.drop(df[df[year] == year].index, inplace=True) + # replace 'Z' with 0 + df = df.replace('Z', 0) + # add country to the multiindex + new_tuple = [(country, *idx) for idx in df.index] + new_mindex = pd.MultiIndex.from_tuples(new_tuple, names=['country', None, 'name', None, 'unit']) + df.index = new_mindex + # make numeric values where possible + df = df.apply(pd.to_numeric, errors='coerce') + # drop non-numeric columns + non_numeric_cols = df.columns[df.dtypes != float] + df.drop(non_numeric_cols, axis=1, inplace=True) + # concatenate the dataframes + eurostat = pd.concat([eurostat, df], axis=0) + + eurostat.drop(["Unnamed: 4", year, "Unnamed: 6"], axis=1, inplace=True) + # Renaming some indices + rename = { + 'Households': 'Residential', + 'Commercial & public services': 'Services', + 'Domestic navigation': 'Domestic Navigation' + } + for name, rename in rename.items(): + eurostat.index = eurostat.index.set_levels( + eurostat.index.levels[3].where(eurostat.index.levels[3] != name, rename), + level=3) + new_index = eurostat.index.set_levels(eurostat.index.levels[2].where(eurostat.index.levels[2] != 'International maritime bunkers', 'Bunkers'), level=2) + eurostat.index = new_index - # convert ktoe/a to TWh/a - df *= 11.63 / 1e3 + eurostat.rename(columns={'Total': 'Total all products'}, inplace=True) + eurostat.index = eurostat.index.set_levels(eurostat.index.levels[0].where(eurostat.index.levels[0] != 'UK', 'GB'), level=0) + + df = eurostat * 11.63 / 1e3 return df @@ -669,31 +727,49 @@ def build_eurostat_co2(input_eurostat, countries, report_year, year=1990): return eurostat.multiply(specific_emissions).sum(axis=1) -def build_co2_totals(countries, eea_co2, eurostat_co2): +def build_co2_totals(countries, eea_co2, eurostat_co2, report_year): co2 = eea_co2.reindex(countries) for ct in pd.Index(countries).intersection(["BA", "RS", "AL", "ME", "MK"]): - mappings = { - "electricity": ( - ct, - "+", - "Conventional Thermal Power Stations", - "of which From Coal", - ), - "residential non-elec": (ct, "+", "+", "Residential"), - "services non-elec": (ct, "+", "+", "Services"), - "road non-elec": (ct, "+", "+", "Road"), - "rail non-elec": (ct, "+", "+", "Rail"), - "domestic navigation": (ct, "+", "+", "Domestic Navigation"), - "international navigation": (ct, "-", "Bunkers"), - "domestic aviation": (ct, "+", "+", "Domestic aviation"), - "international aviation": (ct, "+", "+", "International aviation"), - # does not include industrial process emissions or fuel processing/refining - "industrial non-elec": (ct, "+", "Industry"), - # does not include non-energy emissions - "agriculture": (eurostat_co2.index.get_level_values(0) == ct) - & eurostat_co2.index.isin(["Agriculture / Forestry", "Fishing"], level=3), - } + if report_year != 2023: + mappings = { + "electricity": ( + ct, + "+", + "Conventional Thermal Power Stations", + "of which From Coal", + ), + "residential non-elec": (ct, "+", "+", "Residential"), + "services non-elec": (ct, "+", "+", "Services"), + "road non-elec": (ct, "+", "+", "Road"), + "rail non-elec": (ct, "+", "+", "Rail"), + "domestic navigation": (ct, "+", "+", "Domestic Navigation"), + "international navigation": (ct, "-", "Bunkers"), + "domestic aviation": (ct, "+", "+", "Domestic aviation"), + "international aviation": (ct, "+", "+", "International aviation"), + # does not include industrial process emissions or fuel processing/refining + "industrial non-elec": (ct, "+", "Industry"), + # does not include non-energy emissions + "agriculture": (eurostat_co2.index.get_level_values(0) == ct) + & eurostat_co2.index.isin(["Agriculture / Forestry", "Fishing"], level=3), + } + else: + mappings = { + "electricity": (ct, "+", "Electricity & heat generation", np.nan), + "residential non-elec": (ct, "+", "+", "Residential"), + "services non-elec": (ct, "+", "+", "Services"), + "road non-elec": (ct, "+", "+", "Road"), + "rail non-elec": (ct, "+", "+", "Rail"), + "domestic navigation": (ct, "+", "+", "Domestic Navigation"), + "international navigation": (ct, "-", "Bunkers"), + "domestic aviation": (ct, "+", "+", "Domestic aviation"), + "international aviation": (ct, "-", "International aviation"), + # does not include industrial process emissions or fuel processing/refining + "industrial non-elec": (ct, "+", "Industry sector"), + # does not include non-energy emissions + "agriculture": (eurostat_co2.index.get_level_values(0) == ct) + & eurostat_co2.index.isin(["Agriculture & forestry", "Fishing"], level=3), + } for i, mi in mappings.items(): co2.at[ct, i] = eurostat_co2.loc[mi].sum() @@ -736,6 +812,133 @@ def build_transport_data(countries, population, idees): return transport_data +def rescale(idees_countries, energy, eurostat): + ''' + Takes JRC IDEES data from 2015 and rescales it by the ratio of the + eurostat data and the 2015 eurostat data. + missing data: ['passenger car efficiency', 'passenger cars'] + ''' + # read in the eurostat data for 2015 + eurostat_2015 = build_eurostat(input_eurostat, countries, 2023, 2015)[["Total all products", "Electricity"]] + # eurostat_2015 = eurostat_2015.rename(index={'GB': 'UK'}, level=0) + eurostat_year = eurostat[["Total all products", "Electricity"]] + # calculate the ratio of the two data sets + ratio = eurostat_year / eurostat_2015 + ratio = ratio.droplevel([1,4]) + ratio.rename(columns={"Total all products": "total", "Electricity": "ele"}, inplace=True) + ratio = ratio.rename(index={"GB": "UK"}, level=0) + + residential_total = [ + "total residential space", + "total residential water", + "total residential cooking", + "total residential", + "derived heat residential", + "thermal uses residential", + ] + residential_ele = [ + "electricity residential space", + "electricity residential water", + "electricity residential cooking", + "electricity residential", + ] + + service_total = [ + "total services space", + "total services water", + "total services cooking", + "total services", + "derived heat services", + "thermal uses services", + ] + service_ele = [ + "electricity services space", + "electricity services water", + "electricity services cooking", + "electricity services", + ] + + agri_total = [ + "total agriculture heat", + "total agriculture machinery", + "total agriculture", + ] + agri_ele = [ + "total agriculture electricity", + ] + + road_total = [ + "total road", + "total passenger cars", + "total other road passenger", + "total light duty road freight", + ] + road_ele = [ + "electricity road", + "electricity passenger cars", + "electricity other road passenger", + "electricity light duty road freight", + ] + + rail_total = [ + "total rail", + "total rail passenger", + "total rail freight", + ] + rail_ele = [ + "electricity rail", + "electricity rail passenger", + "electricity rail freight", + ] + + avia_inter = [ + 'total aviation passenger', + 'total aviation freight', + 'total international aviation passenger', + 'total international aviation freight', + 'total international aviation' + ] + avia_domestic = [ + 'total domestic aviation passenger', + 'total domestic aviation freight', + 'total domestic aviation', + ] + navigation = [ + "total domestic navigation", + ] + + idees_countries = idees_countries.repalce({'GB': 'UK', 'GR': 'EL'}) + + for country in idees_countries: + res = ratio.loc[(country, slice(None), 'Residential')] + energy.loc[country, residential_total] *= res[['total']].iloc[0,0] + energy.loc[country, residential_ele] *= res[['ele']].iloc[0,0] + + ser = ratio.loc[(country, slice(None), 'Services')] + energy.loc[country, service_total] *= ser[['total']].iloc[0,0] + energy.loc[country, service_ele] *= ser[['ele']].iloc[0,0] + + agri = ratio.loc[(country, slice(None), 'Agriculture & forestry')] + energy.loc[country, agri_total] *= agri[['total']].iloc[0,0] + energy.loc[country, agri_ele] *= agri[['ele']].iloc[0,0] + + road = ratio.loc[(country, slice(None), 'Road')] + energy.loc[country, road_total] *= road[['total']].iloc[0,0] + energy.loc[country, road_ele] *= road[['ele']].iloc[0,0] + + rail = ratio.loc[(country, slice(None), 'Rail')] + energy.loc[country, rail_total] *= rail[['total']].iloc[0,0] + energy.loc[country, rail_ele] *= rail[['ele']].iloc[0,0] + + avi_d = ratio.loc[(country, slice(None), 'Domestic aviation')] + avi_i = ratio.loc[(country, 'International aviation', slice(None))] + energy.loc[country, avia_inter] *= avi_i[['total']].iloc[0,0] + energy.loc[country, avia_domestic] *= avi_d[['total']].iloc[0,0] + + nav = ratio.loc[(country, slice(None), 'Domestic Navigation')] + energy.loc[country, navigation] *= nav[['total']].iloc[0,0] + + return energy if __name__ == "__main__": if "snakemake" not in globals(): @@ -759,12 +962,22 @@ if __name__ == "__main__": input_eurostat = snakemake.input.eurostat eurostat = build_eurostat(input_eurostat, countries, report_year, data_year) swiss = build_swiss(data_year) - idees = build_idees(idees_countries, data_year) + # data from idees only exists for 2015 + if data_year > 2015: + # read in latest data and rescale later + idees = build_idees(idees_countries, 2015) + else: + idees = build_idees(idees_countries, data_year) energy = build_energy_totals(countries, eurostat, swiss, idees) + + if data_year > 2015: + energy = rescale(idees_countries, energy, eurostat) + energy.to_csv(snakemake.output.energy_name) - district_heat_share = build_district_heat_share(countries, idees) + # use rescaled idees data to calculate district heat share + district_heat_share = build_district_heat_share(countries, energy.loc[idees_countries]) district_heat_share.to_csv(snakemake.output.district_heat_share) base_year_emissions = params["base_emissions_year"] @@ -774,7 +987,7 @@ if __name__ == "__main__": input_eurostat, countries, report_year, base_year_emissions ) - co2 = build_co2_totals(countries, eea_co2, eurostat_co2) + co2 = build_co2_totals(countries, eea_co2, eurostat_co2, report_year) co2.to_csv(snakemake.output.co2_name) transport = build_transport_data(countries, population, idees) From ace51b9e5547ec9c23730c832f4d9a7b5212d5a2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 12:56:43 +0000 Subject: [PATCH 473/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/common.smk | 1 + scripts/build_energy_totals.py | 174 ++++++++++++++++++++------------- 2 files changed, 106 insertions(+), 69 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index c3ce845c..3484c207 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -137,6 +137,7 @@ def input_eurostat(w): else: return "data/bundle-sector/eurostat-energy_balances-april_2023_edition" + def solved_previous_horizon(w): planning_horizons = config_provider("scenario", "planning_horizons")(w) i = planning_horizons.index(int(w.planning_horizons)) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 13a8c30d..a1772143 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -8,6 +8,7 @@ Build total energy demands per country using JRC IDEES, eurostat, and EEA data. import logging import multiprocessing as mp +import os from functools import partial import country_converter as coco @@ -16,7 +17,6 @@ import numpy as np import pandas as pd from _helpers import configure_logging, mute_print, set_scenario_config from tqdm import tqdm -import os cc = coco.CountryConverter() logger = logging.getLogger(__name__) @@ -123,9 +123,9 @@ def build_eurostat(input_eurostat, countries, report_year, year): """ if report_year != 2023: filenames = { - 2016: f"/{year}-Energy-Balances-June2016edition.xlsx", - 2017: f"/{year}-ENERGY-BALANCES-June2017edition.xlsx", - } + 2016: f"/{year}-Energy-Balances-June2016edition.xlsx", + 2017: f"/{year}-ENERGY-BALANCES-June2017edition.xlsx", + } with mute_print(): dfs = pd.read_excel( @@ -151,62 +151,85 @@ def build_eurostat(input_eurostat, countries, report_year, year): # convert ktoe/a to TWh/a df *= 11.63 / 1e3 - + else: # read in every country file in countries eurostat = pd.DataFrame() - countries = [country if country != 'GB' else 'UK' for country in countries] - countries = [country if country != 'GR' else 'EL' for country in countries] + countries = [country if country != "GB" else "UK" for country in countries] + countries = [country if country != "GR" else "EL" for country in countries] for country in countries: filename = f"/{country}-Energy-balance-sheets-April-2023-edition.xlsb" if os.path.exists(input_eurostat + filename): df = pd.read_excel( input_eurostat + filename, - engine='pyxlsb', + engine="pyxlsb", sheet_name=str(year), skiprows=4, - index_col=list(range(4))) + index_col=list(range(4)), + ) # replace entry 'Z' with 0 - df.replace('Z', 0, inplace=True) + df.replace("Z", 0, inplace=True) # write 'International aviation' to the 2nd level of the multiindex - index_number = (df.index.get_level_values(1) == 'International aviation').argmax() - new_index = ('-', 'International aviation', 'International aviation', 'ktoe') + index_number = ( + df.index.get_level_values(1) == "International aviation" + ).argmax() + new_index = ( + "-", + "International aviation", + "International aviation", + "ktoe", + ) modified_index = list(df.index) modified_index[index_number] = new_index - df.index = pd.MultiIndex.from_tuples(modified_index, names=df.index.names) + df.index = pd.MultiIndex.from_tuples( + modified_index, names=df.index.names + ) # drop the annoying subhead line df.drop(df[df[year] == year].index, inplace=True) # replace 'Z' with 0 - df = df.replace('Z', 0) + df = df.replace("Z", 0) # add country to the multiindex new_tuple = [(country, *idx) for idx in df.index] - new_mindex = pd.MultiIndex.from_tuples(new_tuple, names=['country', None, 'name', None, 'unit']) + new_mindex = pd.MultiIndex.from_tuples( + new_tuple, names=["country", None, "name", None, "unit"] + ) df.index = new_mindex # make numeric values where possible - df = df.apply(pd.to_numeric, errors='coerce') + df = df.apply(pd.to_numeric, errors="coerce") # drop non-numeric columns non_numeric_cols = df.columns[df.dtypes != float] df.drop(non_numeric_cols, axis=1, inplace=True) # concatenate the dataframes eurostat = pd.concat([eurostat, df], axis=0) - + eurostat.drop(["Unnamed: 4", year, "Unnamed: 6"], axis=1, inplace=True) # Renaming some indices rename = { - 'Households': 'Residential', - 'Commercial & public services': 'Services', - 'Domestic navigation': 'Domestic Navigation' + "Households": "Residential", + "Commercial & public services": "Services", + "Domestic navigation": "Domestic Navigation", } for name, rename in rename.items(): eurostat.index = eurostat.index.set_levels( - eurostat.index.levels[3].where(eurostat.index.levels[3] != name, rename), - level=3) - new_index = eurostat.index.set_levels(eurostat.index.levels[2].where(eurostat.index.levels[2] != 'International maritime bunkers', 'Bunkers'), level=2) + eurostat.index.levels[3].where( + eurostat.index.levels[3] != name, rename + ), + level=3, + ) + new_index = eurostat.index.set_levels( + eurostat.index.levels[2].where( + eurostat.index.levels[2] != "International maritime bunkers", "Bunkers" + ), + level=2, + ) eurostat.index = new_index - eurostat.rename(columns={'Total': 'Total all products'}, inplace=True) - eurostat.index = eurostat.index.set_levels(eurostat.index.levels[0].where(eurostat.index.levels[0] != 'UK', 'GB'), level=0) - + eurostat.rename(columns={"Total": "Total all products"}, inplace=True) + eurostat.index = eurostat.index.set_levels( + eurostat.index.levels[0].where(eurostat.index.levels[0] != "UK", "GB"), + level=0, + ) + df = eurostat * 11.63 / 1e3 return df @@ -751,7 +774,9 @@ def build_co2_totals(countries, eea_co2, eurostat_co2, report_year): "industrial non-elec": (ct, "+", "Industry"), # does not include non-energy emissions "agriculture": (eurostat_co2.index.get_level_values(0) == ct) - & eurostat_co2.index.isin(["Agriculture / Forestry", "Fishing"], level=3), + & eurostat_co2.index.isin( + ["Agriculture / Forestry", "Fishing"], level=3 + ), } else: mappings = { @@ -768,7 +793,9 @@ def build_co2_totals(countries, eea_co2, eurostat_co2, report_year): "industrial non-elec": (ct, "+", "Industry sector"), # does not include non-energy emissions "agriculture": (eurostat_co2.index.get_level_values(0) == ct) - & eurostat_co2.index.isin(["Agriculture & forestry", "Fishing"], level=3), + & eurostat_co2.index.isin( + ["Agriculture & forestry", "Fishing"], level=3 + ), } for i, mi in mappings.items(): @@ -812,20 +839,26 @@ def build_transport_data(countries, population, idees): return transport_data + def rescale(idees_countries, energy, eurostat): - ''' - Takes JRC IDEES data from 2015 and rescales it by the ratio of the - eurostat data and the 2015 eurostat data. + """ + Takes JRC IDEES data from 2015 and rescales it by the ratio of the eurostat + data and the 2015 eurostat data. + missing data: ['passenger car efficiency', 'passenger cars'] - ''' + """ # read in the eurostat data for 2015 - eurostat_2015 = build_eurostat(input_eurostat, countries, 2023, 2015)[["Total all products", "Electricity"]] + eurostat_2015 = build_eurostat(input_eurostat, countries, 2023, 2015)[ + ["Total all products", "Electricity"] + ] # eurostat_2015 = eurostat_2015.rename(index={'GB': 'UK'}, level=0) eurostat_year = eurostat[["Total all products", "Electricity"]] # calculate the ratio of the two data sets ratio = eurostat_year / eurostat_2015 - ratio = ratio.droplevel([1,4]) - ratio.rename(columns={"Total all products": "total", "Electricity": "ele"}, inplace=True) + ratio = ratio.droplevel([1, 4]) + ratio.rename( + columns={"Total all products": "total", "Electricity": "ele"}, inplace=True + ) ratio = ratio.rename(index={"GB": "UK"}, level=0) residential_total = [ @@ -892,54 +925,55 @@ def rescale(idees_countries, energy, eurostat): ] avia_inter = [ - 'total aviation passenger', - 'total aviation freight', - 'total international aviation passenger', - 'total international aviation freight', - 'total international aviation' + "total aviation passenger", + "total aviation freight", + "total international aviation passenger", + "total international aviation freight", + "total international aviation", ] avia_domestic = [ - 'total domestic aviation passenger', - 'total domestic aviation freight', - 'total domestic aviation', + "total domestic aviation passenger", + "total domestic aviation freight", + "total domestic aviation", ] navigation = [ "total domestic navigation", ] - - idees_countries = idees_countries.repalce({'GB': 'UK', 'GR': 'EL'}) + + idees_countries = idees_countries.repalce({"GB": "UK", "GR": "EL"}) for country in idees_countries: - res = ratio.loc[(country, slice(None), 'Residential')] - energy.loc[country, residential_total] *= res[['total']].iloc[0,0] - energy.loc[country, residential_ele] *= res[['ele']].iloc[0,0] + res = ratio.loc[(country, slice(None), "Residential")] + energy.loc[country, residential_total] *= res[["total"]].iloc[0, 0] + energy.loc[country, residential_ele] *= res[["ele"]].iloc[0, 0] - ser = ratio.loc[(country, slice(None), 'Services')] - energy.loc[country, service_total] *= ser[['total']].iloc[0,0] - energy.loc[country, service_ele] *= ser[['ele']].iloc[0,0] + ser = ratio.loc[(country, slice(None), "Services")] + energy.loc[country, service_total] *= ser[["total"]].iloc[0, 0] + energy.loc[country, service_ele] *= ser[["ele"]].iloc[0, 0] - agri = ratio.loc[(country, slice(None), 'Agriculture & forestry')] - energy.loc[country, agri_total] *= agri[['total']].iloc[0,0] - energy.loc[country, agri_ele] *= agri[['ele']].iloc[0,0] + agri = ratio.loc[(country, slice(None), "Agriculture & forestry")] + energy.loc[country, agri_total] *= agri[["total"]].iloc[0, 0] + energy.loc[country, agri_ele] *= agri[["ele"]].iloc[0, 0] - road = ratio.loc[(country, slice(None), 'Road')] - energy.loc[country, road_total] *= road[['total']].iloc[0,0] - energy.loc[country, road_ele] *= road[['ele']].iloc[0,0] + road = ratio.loc[(country, slice(None), "Road")] + energy.loc[country, road_total] *= road[["total"]].iloc[0, 0] + energy.loc[country, road_ele] *= road[["ele"]].iloc[0, 0] - rail = ratio.loc[(country, slice(None), 'Rail')] - energy.loc[country, rail_total] *= rail[['total']].iloc[0,0] - energy.loc[country, rail_ele] *= rail[['ele']].iloc[0,0] + rail = ratio.loc[(country, slice(None), "Rail")] + energy.loc[country, rail_total] *= rail[["total"]].iloc[0, 0] + energy.loc[country, rail_ele] *= rail[["ele"]].iloc[0, 0] - avi_d = ratio.loc[(country, slice(None), 'Domestic aviation')] - avi_i = ratio.loc[(country, 'International aviation', slice(None))] - energy.loc[country, avia_inter] *= avi_i[['total']].iloc[0,0] - energy.loc[country, avia_domestic] *= avi_d[['total']].iloc[0,0] + avi_d = ratio.loc[(country, slice(None), "Domestic aviation")] + avi_i = ratio.loc[(country, "International aviation", slice(None))] + energy.loc[country, avia_inter] *= avi_i[["total"]].iloc[0, 0] + energy.loc[country, avia_domestic] *= avi_d[["total"]].iloc[0, 0] - nav = ratio.loc[(country, slice(None), 'Domestic Navigation')] - energy.loc[country, navigation] *= nav[['total']].iloc[0,0] + nav = ratio.loc[(country, slice(None), "Domestic Navigation")] + energy.loc[country, navigation] *= nav[["total"]].iloc[0, 0] return energy + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -970,14 +1004,16 @@ if __name__ == "__main__": idees = build_idees(idees_countries, data_year) energy = build_energy_totals(countries, eurostat, swiss, idees) - + if data_year > 2015: energy = rescale(idees_countries, energy, eurostat) - + energy.to_csv(snakemake.output.energy_name) # use rescaled idees data to calculate district heat share - district_heat_share = build_district_heat_share(countries, energy.loc[idees_countries]) + district_heat_share = build_district_heat_share( + countries, energy.loc[idees_countries] + ) district_heat_share.to_csv(snakemake.output.district_heat_share) base_year_emissions = params["base_emissions_year"] From c6ed36df625a382cf4451ddf0ef57448d5f8dd75 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Fri, 23 Feb 2024 15:23:55 +0100 Subject: [PATCH 474/497] adjust AC bus to low voltage --- scripts/add_existing_baseyear.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 750ab22f..d6f1802c 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -416,6 +416,11 @@ def add_heating_capacities_installed_before_baseyear( name_type = "central" if name == "urban central" else "decentral" nodes = pd.Index(n.buses.location[n.buses.index.str.contains(f"{name} heat")]) + + if (name_type != "central") and options["electricity_distribution_grid"]: + nodes_elec = nodes + " low voltage" + else: + nodes_elec = nodes heat_pump_type = "air" if "urban" in name else "ground" @@ -440,7 +445,7 @@ def add_heating_capacities_installed_before_baseyear( "Link", nodes, suffix=f" {name} {heat_pump_type} heat pump-{grouping_year}", - bus0=nodes, + bus0=nodes_elec, bus1=nodes + " " + name + " heat", carrier=f"{name} {heat_pump_type} heat pump", efficiency=efficiency, @@ -458,7 +463,7 @@ def add_heating_capacities_installed_before_baseyear( "Link", nodes, suffix=f" {name} resistive heater-{grouping_year}", - bus0=nodes, + bus0=nodes_elec, bus1=nodes + " " + name + " heat", carrier=name + " resistive heater", efficiency=costs.at[f"{name_type} resistive heater", "efficiency"], @@ -540,7 +545,7 @@ def add_heating_capacities_installed_before_baseyear( ], ) - +#%% if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -552,7 +557,7 @@ if __name__ == "__main__": clusters="37", ll="v1.0", opts="", - sector_opts="1p7-4380H-T-H-B-I-A-dist1", + sector_opts="8760-T-H-B-I-A-dist1", planning_horizons=2020, ) From 60653de9f628e911a50c06400614d72e4c527045 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:27:17 +0000 Subject: [PATCH 475/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/add_existing_baseyear.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index d6f1802c..44c9b20e 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -416,7 +416,7 @@ def add_heating_capacities_installed_before_baseyear( name_type = "central" if name == "urban central" else "decentral" nodes = pd.Index(n.buses.location[n.buses.index.str.contains(f"{name} heat")]) - + if (name_type != "central") and options["electricity_distribution_grid"]: nodes_elec = nodes + " low voltage" else: @@ -545,7 +545,8 @@ def add_heating_capacities_installed_before_baseyear( ], ) -#%% + +# %% if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake From 1db30ae63b0b9b1372d4174f11636d5770793af4 Mon Sep 17 00:00:00 2001 From: Adrian Odenweller Date: Sat, 24 Feb 2024 12:10:08 +0100 Subject: [PATCH 476/497] Allow CPELX for MIQP in cluster_network --- scripts/cluster_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index be315a63..95f36bb4 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -267,7 +267,7 @@ def distribute_clusters(n, n_clusters, focus_weights=None, solver_name="scip"): m.objective = (clusters * clusters - 2 * clusters * L * n_clusters).sum() if solver_name == "gurobi": logging.getLogger("gurobipy").propagate = False - elif solver_name != "scip": + elif solver_name != "scip" and solver_name != "cplex": logger.info( f"The configured solver `{solver_name}` does not support quadratic objectives. Falling back to `scip`." ) From 58bcef4625f3d3e8aeaba4715d205e883e68a8c4 Mon Sep 17 00:00:00 2001 From: Fabian Hofmann Date: Tue, 27 Feb 2024 11:39:26 +0100 Subject: [PATCH 477/497] cluster_network: update solver_name if clause style --- scripts/cluster_network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 95f36bb4..757184b2 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -267,7 +267,7 @@ def distribute_clusters(n, n_clusters, focus_weights=None, solver_name="scip"): m.objective = (clusters * clusters - 2 * clusters * L * n_clusters).sum() if solver_name == "gurobi": logging.getLogger("gurobipy").propagate = False - elif solver_name != "scip" and solver_name != "cplex": + elif solver_name not in ["scip", "cplex"]: logger.info( f"The configured solver `{solver_name}` does not support quadratic objectives. Falling back to `scip`." ) From d363aeb57dac2370199b1a260e7c31c1014c074d Mon Sep 17 00:00:00 2001 From: toniseibold Date: Tue, 27 Feb 2024 12:04:07 +0100 Subject: [PATCH 478/497] removing old eurostat data reports as an option, cleaning up code --- config/config.default.yaml | 1 - rules/build_sector.smk | 4 +- rules/common.smk | 8 - rules/postprocess.smk | 2 +- rules/retrieve.smk | 3 + scripts/build_energy_totals.py | 354 ++++++++++---------------- scripts/retrieve_sector_databundle.py | 14 + 7 files changed, 152 insertions(+), 234 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 093b1aad..b2828a44 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -316,7 +316,6 @@ pypsa_eur: energy: energy_totals_year: 2019 base_emissions_year: 1990 - eurostat_report_year: 2023 emissions: CO2 # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#biomass diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 466d1713..6c542f4e 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -270,7 +270,7 @@ rule build_energy_totals: swiss="data/switzerland-new_format-all_years.csv", idees="data/bundle-sector/jrc-idees-2015", district_heat_share="data/district_heat_share.csv", - eurostat=input_eurostat, + eurostat="data/bundle-sector/eurostat-energy_balances-april_2023_edition", output: energy_name=resources("energy_totals.csv"), co2_name=resources("co2_totals.csv"), @@ -865,7 +865,7 @@ rule prepare_sector_network: ), network=resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), energy_totals_name=resources("energy_totals.csv"), - eurostat=input_eurostat, + eurostat="data/bundle-sector/eurostat-energy_balances-april_2023_edition", pop_weighted_energy_totals=resources( "pop_weighted_energy_totals_s{simpl}_{clusters}.csv" ), diff --git a/rules/common.smk b/rules/common.smk index c3ce845c..8e0e1e66 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -129,14 +129,6 @@ def has_internet_access(url="www.zenodo.org") -> bool: finally: conn.close() - -def input_eurostat(w): - if config["energy"]["eurostat_report_year"] != 2023: - report_year = config["energy"]["eurostat_report_year"] - return f"data/bundle-sector/eurostat-energy_balances-june_{report_year}_edition" - else: - return "data/bundle-sector/eurostat-energy_balances-april_2023_edition" - def solved_previous_horizon(w): planning_horizons = config_provider("scenario", "planning_horizons")(w) i = planning_horizons.index(int(w.planning_horizons)) diff --git a/rules/postprocess.smk b/rules/postprocess.smk index dc08699f..5f93540f 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -247,7 +247,7 @@ rule plot_summary: costs=RESULTS + "csvs/costs.csv", energy=RESULTS + "csvs/energy.csv", balances=RESULTS + "csvs/supply_energy.csv", - eurostat=input_eurostat, + eurostat="data/bundle-sector/eurostat-energy_balances-april_2023_edition", co2="data/bundle-sector/eea/UNFCCC_v23.csv", output: costs=RESULTS + "graphs/costs.pdf", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 29d050ab..8ef373d1 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -142,6 +142,9 @@ if config["enable"]["retrieve"] and config["enable"].get( protected( directory("data/bundle-sector/eurostat-energy_balances-may_2018_edition") ), + protected( + directory("data/bundle-sector/eurostat-energy_balances-april_2023_edition") + ), protected(directory("data/bundle-sector/jrc-idees-2015")), ] diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 13a8c30d..16c99d8f 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -117,97 +117,65 @@ to_ipcc = { } -def build_eurostat(input_eurostat, countries, report_year, year): +def build_eurostat(input_eurostat, countries, year): """ Return multi-index for all countries' energy data in TWh/a. """ - if report_year != 2023: - filenames = { - 2016: f"/{year}-Energy-Balances-June2016edition.xlsx", - 2017: f"/{year}-ENERGY-BALANCES-June2017edition.xlsx", - } - - with mute_print(): - dfs = pd.read_excel( - input_eurostat + filenames[report_year], - sheet_name=None, - skiprows=1, - index_col=list(range(4)), - ) - - # sorted_index necessary for slicing - lookup = eurostat_codes - labelled_dfs = { - lookup[df.columns[0]]: df - for df in dfs.values() - if lookup[df.columns[0]] in countries - } - df = pd.concat(labelled_dfs, sort=True).sort_index() - # drop non-numeric and country columns - non_numeric_cols = df.columns[df.dtypes != float] - country_cols = df.columns.intersection(lookup.keys()) - to_drop = non_numeric_cols.union(country_cols) - df.drop(to_drop, axis=1, inplace=True) - - # convert ktoe/a to TWh/a - df *= 11.63 / 1e3 + # read in every country file in countries + eurostat = pd.DataFrame() + countries = [country if country != 'GB' else 'UK' for country in countries] + countries = [country if country != 'GR' else 'EL' for country in countries] + for country in countries: + filename = f"/{country}-Energy-balance-sheets-April-2023-edition.xlsb" + if os.path.exists(input_eurostat + filename): + df = pd.read_excel( + input_eurostat + filename, + engine='pyxlsb', + sheet_name=str(year), + skiprows=4, + index_col=list(range(4))) + # replace entry 'Z' with 0 + df.replace('Z', 0, inplace=True) + # write 'International aviation' to the 2nd level of the multiindex + index_number = (df.index.get_level_values(1) == 'International aviation').argmax() + new_index = ('-', 'International aviation', 'International aviation', 'ktoe') + modified_index = list(df.index) + modified_index[index_number] = new_index + df.index = pd.MultiIndex.from_tuples(modified_index, names=df.index.names) + # drop the annoying subhead line + df.drop(df[df[year] == year].index, inplace=True) + # replace 'Z' with 0 + df = df.replace('Z', 0) + # add country to the multiindex + new_tuple = [(country, *idx) for idx in df.index] + new_mindex = pd.MultiIndex.from_tuples(new_tuple, names=['country', None, 'name', None, 'unit']) + df.index = new_mindex + # make numeric values where possible + df = df.apply(pd.to_numeric, errors='coerce') + # drop non-numeric columns + non_numeric_cols = df.columns[df.dtypes != float] + df.drop(non_numeric_cols, axis=1, inplace=True) + # concatenate the dataframes + eurostat = pd.concat([eurostat, df], axis=0) - else: - # read in every country file in countries - eurostat = pd.DataFrame() - countries = [country if country != 'GB' else 'UK' for country in countries] - countries = [country if country != 'GR' else 'EL' for country in countries] - for country in countries: - filename = f"/{country}-Energy-balance-sheets-April-2023-edition.xlsb" - if os.path.exists(input_eurostat + filename): - df = pd.read_excel( - input_eurostat + filename, - engine='pyxlsb', - sheet_name=str(year), - skiprows=4, - index_col=list(range(4))) - # replace entry 'Z' with 0 - df.replace('Z', 0, inplace=True) - # write 'International aviation' to the 2nd level of the multiindex - index_number = (df.index.get_level_values(1) == 'International aviation').argmax() - new_index = ('-', 'International aviation', 'International aviation', 'ktoe') - modified_index = list(df.index) - modified_index[index_number] = new_index - df.index = pd.MultiIndex.from_tuples(modified_index, names=df.index.names) - # drop the annoying subhead line - df.drop(df[df[year] == year].index, inplace=True) - # replace 'Z' with 0 - df = df.replace('Z', 0) - # add country to the multiindex - new_tuple = [(country, *idx) for idx in df.index] - new_mindex = pd.MultiIndex.from_tuples(new_tuple, names=['country', None, 'name', None, 'unit']) - df.index = new_mindex - # make numeric values where possible - df = df.apply(pd.to_numeric, errors='coerce') - # drop non-numeric columns - non_numeric_cols = df.columns[df.dtypes != float] - df.drop(non_numeric_cols, axis=1, inplace=True) - # concatenate the dataframes - eurostat = pd.concat([eurostat, df], axis=0) - - eurostat.drop(["Unnamed: 4", year, "Unnamed: 6"], axis=1, inplace=True) - # Renaming some indices - rename = { - 'Households': 'Residential', - 'Commercial & public services': 'Services', - 'Domestic navigation': 'Domestic Navigation' - } - for name, rename in rename.items(): - eurostat.index = eurostat.index.set_levels( - eurostat.index.levels[3].where(eurostat.index.levels[3] != name, rename), - level=3) - new_index = eurostat.index.set_levels(eurostat.index.levels[2].where(eurostat.index.levels[2] != 'International maritime bunkers', 'Bunkers'), level=2) - eurostat.index = new_index + eurostat.drop(["Unnamed: 4", year, "Unnamed: 6"], axis=1, inplace=True) + # Renaming some indices + rename = { + 'Households': 'Residential', + 'Commercial & public services': 'Services', + 'Domestic navigation': 'Domestic Navigation' + } + for name, rename in rename.items(): + eurostat.index = eurostat.index.set_levels( + eurostat.index.levels[3].where(eurostat.index.levels[3] != name, rename), + level=3) + new_index = eurostat.index.set_levels(eurostat.index.levels[2].where(eurostat.index.levels[2] != 'International maritime bunkers', 'Bunkers'), level=2) + eurostat.index = new_index - eurostat.rename(columns={'Total': 'Total all products'}, inplace=True) - eurostat.index = eurostat.index.set_levels(eurostat.index.levels[0].where(eurostat.index.levels[0] != 'UK', 'GB'), level=0) - - df = eurostat * 11.63 / 1e3 + eurostat.rename(columns={'Total': 'Total all products'}, inplace=True) + eurostat.index = eurostat.index.set_levels(eurostat.index.levels[0].where(eurostat.index.levels[0] != 'UK', 'GB'), level=0) + + df = eurostat * 11.63 / 1e3 return df @@ -709,8 +677,8 @@ def build_eea_co2(input_co2, year=1990, emissions_scope="CO2"): return emissions / 1e3 -def build_eurostat_co2(input_eurostat, countries, report_year, year=1990): - eurostat = build_eurostat(input_eurostat, countries, report_year, year) +def build_eurostat_co2(input_eurostat, countries, year=1990): + eurostat = build_eurostat(input_eurostat, countries, year) specific_emissions = pd.Series(index=eurostat.columns, dtype=float) @@ -727,49 +695,26 @@ def build_eurostat_co2(input_eurostat, countries, report_year, year=1990): return eurostat.multiply(specific_emissions).sum(axis=1) -def build_co2_totals(countries, eea_co2, eurostat_co2, report_year): +def build_co2_totals(countries, eea_co2, eurostat_co2): co2 = eea_co2.reindex(countries) for ct in pd.Index(countries).intersection(["BA", "RS", "AL", "ME", "MK"]): - if report_year != 2023: - mappings = { - "electricity": ( - ct, - "+", - "Conventional Thermal Power Stations", - "of which From Coal", - ), - "residential non-elec": (ct, "+", "+", "Residential"), - "services non-elec": (ct, "+", "+", "Services"), - "road non-elec": (ct, "+", "+", "Road"), - "rail non-elec": (ct, "+", "+", "Rail"), - "domestic navigation": (ct, "+", "+", "Domestic Navigation"), - "international navigation": (ct, "-", "Bunkers"), - "domestic aviation": (ct, "+", "+", "Domestic aviation"), - "international aviation": (ct, "+", "+", "International aviation"), - # does not include industrial process emissions or fuel processing/refining - "industrial non-elec": (ct, "+", "Industry"), - # does not include non-energy emissions - "agriculture": (eurostat_co2.index.get_level_values(0) == ct) - & eurostat_co2.index.isin(["Agriculture / Forestry", "Fishing"], level=3), - } - else: - mappings = { - "electricity": (ct, "+", "Electricity & heat generation", np.nan), - "residential non-elec": (ct, "+", "+", "Residential"), - "services non-elec": (ct, "+", "+", "Services"), - "road non-elec": (ct, "+", "+", "Road"), - "rail non-elec": (ct, "+", "+", "Rail"), - "domestic navigation": (ct, "+", "+", "Domestic Navigation"), - "international navigation": (ct, "-", "Bunkers"), - "domestic aviation": (ct, "+", "+", "Domestic aviation"), - "international aviation": (ct, "-", "International aviation"), - # does not include industrial process emissions or fuel processing/refining - "industrial non-elec": (ct, "+", "Industry sector"), - # does not include non-energy emissions - "agriculture": (eurostat_co2.index.get_level_values(0) == ct) - & eurostat_co2.index.isin(["Agriculture & forestry", "Fishing"], level=3), - } + mappings = { + "electricity": (ct, "+", "Electricity & heat generation", np.nan), + "residential non-elec": (ct, "+", "+", "Residential"), + "services non-elec": (ct, "+", "+", "Services"), + "road non-elec": (ct, "+", "+", "Road"), + "rail non-elec": (ct, "+", "+", "Rail"), + "domestic navigation": (ct, "+", "+", "Domestic Navigation"), + "international navigation": (ct, "-", "Bunkers"), + "domestic aviation": (ct, "+", "+", "Domestic aviation"), + "international aviation": (ct, "-", "International aviation"), + # does not include industrial process emissions or fuel processing/refining + "industrial non-elec": (ct, "+", "Industry sector"), + # does not include non-energy emissions + "agriculture": (eurostat_co2.index.get_level_values(0) == ct) + & eurostat_co2.index.isin(["Agriculture & forestry", "Fishing"], level=3), + } for i, mi in mappings.items(): co2.at[ct, i] = eurostat_co2.loc[mi].sum() @@ -820,83 +765,65 @@ def rescale(idees_countries, energy, eurostat): ''' # read in the eurostat data for 2015 eurostat_2015 = build_eurostat(input_eurostat, countries, 2023, 2015)[["Total all products", "Electricity"]] - # eurostat_2015 = eurostat_2015.rename(index={'GB': 'UK'}, level=0) eurostat_year = eurostat[["Total all products", "Electricity"]] # calculate the ratio of the two data sets ratio = eurostat_year / eurostat_2015 ratio = ratio.droplevel([1,4]) ratio.rename(columns={"Total all products": "total", "Electricity": "ele"}, inplace=True) - ratio = ratio.rename(index={"GB": "UK"}, level=0) + ratio = ratio.rename(index={"EL": "GR"}, level=0) - residential_total = [ - "total residential space", - "total residential water", - "total residential cooking", - "total residential", - "derived heat residential", - "thermal uses residential", - ] - residential_ele = [ - "electricity residential space", - "electricity residential water", - "electricity residential cooking", - "electricity residential", - ] - - service_total = [ - "total services space", - "total services water", - "total services cooking", - "total services", - "derived heat services", - "thermal uses services", - ] - service_ele = [ - "electricity services space", - "electricity services water", - "electricity services cooking", - "electricity services", - ] - - agri_total = [ - "total agriculture heat", - "total agriculture machinery", - "total agriculture", - ] - agri_ele = [ - "total agriculture electricity", - ] - - road_total = [ - "total road", - "total passenger cars", - "total other road passenger", - "total light duty road freight", - ] - road_ele = [ - "electricity road", - "electricity passenger cars", - "electricity other road passenger", - "electricity light duty road freight", - ] - - rail_total = [ - "total rail", - "total rail passenger", - "total rail freight", - ] - rail_ele = [ - "electricity rail", - "electricity rail passenger", - "electricity rail freight", - ] + mappings = { + "Residential": { + "total": ["total residential space", + "total residential water", + "total residential cooking", + "total residential", + "derived heat residential", + "thermal uses residential",], + "elec": ["electricity residential space", + "electricity residential water", + "electricity residential cooking", + "electricity residential",]}, + "Services": { + "total": ["total services space", + "total services water", + "total services cooking", + "total services", + "derived heat services", + "thermal uses services",], + "elec": ["electricity services space", + "electricity services water", + "electricity services cooking", + "electricity services",]}, + "Agriculture & forestry": { + "total": ["total agriculture heat", + "total agriculture machinery", + "total agriculture",], + "elec": ["total agriculture electricity",]}, + "Road": { + "total": ["total road", + "total passenger cars", + "total other road passenger", + "total light duty road freight",], + "elec": ["electricity road", + "electricity passenger cars", + "electricity other road passenger", + "electricity light duty road freight",]}, + "Rail": { + "total": ["total rail", + "total rail passenger", + "total rail freight",], + "elec": ["electricity rail", + "electricity rail passenger", + "electricity rail freight",]}, + } avia_inter = [ - 'total aviation passenger', - 'total aviation freight', - 'total international aviation passenger', - 'total international aviation freight', - 'total international aviation' + 'total aviation passenger', + 'total aviation freight', + 'total international aviation passenger', + 'total international aviation freight', + 'total international aviation' ] avia_domestic = [ 'total domestic aviation passenger', @@ -906,30 +833,14 @@ def rescale(idees_countries, energy, eurostat): navigation = [ "total domestic navigation", ] - - idees_countries = idees_countries.repalce({'GB': 'UK', 'GR': 'EL'}) for country in idees_countries: - res = ratio.loc[(country, slice(None), 'Residential')] - energy.loc[country, residential_total] *= res[['total']].iloc[0,0] - energy.loc[country, residential_ele] *= res[['ele']].iloc[0,0] - - ser = ratio.loc[(country, slice(None), 'Services')] - energy.loc[country, service_total] *= ser[['total']].iloc[0,0] - energy.loc[country, service_ele] *= ser[['ele']].iloc[0,0] - - agri = ratio.loc[(country, slice(None), 'Agriculture & forestry')] - energy.loc[country, agri_total] *= agri[['total']].iloc[0,0] - energy.loc[country, agri_ele] *= agri[['ele']].iloc[0,0] - - road = ratio.loc[(country, slice(None), 'Road')] - energy.loc[country, road_total] *= road[['total']].iloc[0,0] - energy.loc[country, road_ele] *= road[['ele']].iloc[0,0] - - rail = ratio.loc[(country, slice(None), 'Rail')] - energy.loc[country, rail_total] *= rail[['total']].iloc[0,0] - energy.loc[country, rail_ele] *= rail[['ele']].iloc[0,0] + for sector, mapping in mappings.items(): + sector_ratio = ratio.loc[(country, slice(None), sector)] + energy.loc[country, mapping["total"]] *= sector_ratio[['total']].iloc[0,0] + energy.loc[country, mapping["elec"]] *= sector_ratio[['ele']].iloc[0,0] + avi_d = ratio.loc[(country, slice(None), 'Domestic aviation')] avi_i = ratio.loc[(country, 'International aviation', slice(None))] energy.loc[country, avia_inter] *= avi_i[['total']].iloc[0,0] @@ -958,9 +869,8 @@ if __name__ == "__main__": idees_countries = pd.Index(countries).intersection(eu28) data_year = params["energy_totals_year"] - report_year = snakemake.params.energy["eurostat_report_year"] input_eurostat = snakemake.input.eurostat - eurostat = build_eurostat(input_eurostat, countries, report_year, data_year) + eurostat = build_eurostat(input_eurostat, countries, data_year) swiss = build_swiss(data_year) # data from idees only exists for 2015 if data_year > 2015: @@ -984,10 +894,10 @@ if __name__ == "__main__": emissions_scope = snakemake.params.energy["emissions"] eea_co2 = build_eea_co2(snakemake.input.co2, base_year_emissions, emissions_scope) eurostat_co2 = build_eurostat_co2( - input_eurostat, countries, report_year, base_year_emissions + input_eurostat, countries, base_year_emissions ) - co2 = build_co2_totals(countries, eea_co2, eurostat_co2, report_year) + co2 = build_co2_totals(countries, eea_co2, eurostat_co2) co2.to_csv(snakemake.output.co2_name) transport = build_transport_data(countries, population, idees) diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index 3b825da2..a075119e 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -8,6 +8,7 @@ Retrieve and extract data bundle for sector-coupled studies. import logging import tarfile +import zipfile from pathlib import Path from _helpers import ( @@ -47,3 +48,16 @@ if __name__ == "__main__": tarball_fn.unlink() logger.info(f"Databundle available in '{to_fn}'.") + + url_eurostat = "https://ec.europa.eu/eurostat/documents/38154/4956218/Balances-December2022.zip/f7cf0d19-5c0f-60ad-4e48-098a5ddd6e48?t=1671184070589" + tarball_fn = Path(f"{rootpath}/data/bundle-sector/eurostat_2023.zip") + to_fn = Path(f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/") + + logger.info(f"Downloading Eurostat data from '{url_eurostat}'.") + progress_retrieve(url_eurostat, tarball_fn, disable=disable_progress) + + logger.info("Extracting Eurostat data.") + with zipfile.ZipFile(tarball_fn, 'r') as zip_ref: + zip_ref.extractall(to_fn) + + logger.info(f"Eurostat data available in '{to_fn}'.") \ No newline at end of file From 9182d6d667df59f435cd7d5d9c9f651665cd3df8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 12:14:41 +0000 Subject: [PATCH 479/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/common.smk | 1 + scripts/build_energy_totals.py | 197 ++++++++++++++++---------- scripts/retrieve_sector_databundle.py | 8 +- 3 files changed, 127 insertions(+), 79 deletions(-) diff --git a/rules/common.smk b/rules/common.smk index 8e0e1e66..2b8495e1 100644 --- a/rules/common.smk +++ b/rules/common.smk @@ -129,6 +129,7 @@ def has_internet_access(url="www.zenodo.org") -> bool: finally: conn.close() + def solved_previous_horizon(w): planning_horizons = config_provider("scenario", "planning_horizons")(w) i = planning_horizons.index(int(w.planning_horizons)) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index 24e41451..d6c63f00 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -123,58 +123,76 @@ def build_eurostat(input_eurostat, countries, year): """ # read in every country file in countries eurostat = pd.DataFrame() - countries = [country if country != 'GB' else 'UK' for country in countries] - countries = [country if country != 'GR' else 'EL' for country in countries] + countries = [country if country != "GB" else "UK" for country in countries] + countries = [country if country != "GR" else "EL" for country in countries] for country in countries: filename = f"/{country}-Energy-balance-sheets-April-2023-edition.xlsb" if os.path.exists(input_eurostat + filename): df = pd.read_excel( input_eurostat + filename, - engine='pyxlsb', + engine="pyxlsb", sheet_name=str(year), skiprows=4, - index_col=list(range(4))) + index_col=list(range(4)), + ) # replace entry 'Z' with 0 - df.replace('Z', 0, inplace=True) + df.replace("Z", 0, inplace=True) # write 'International aviation' to the 2nd level of the multiindex - index_number = (df.index.get_level_values(1) == 'International aviation').argmax() - new_index = ('-', 'International aviation', 'International aviation', 'ktoe') + index_number = ( + df.index.get_level_values(1) == "International aviation" + ).argmax() + new_index = ( + "-", + "International aviation", + "International aviation", + "ktoe", + ) modified_index = list(df.index) modified_index[index_number] = new_index df.index = pd.MultiIndex.from_tuples(modified_index, names=df.index.names) # drop the annoying subhead line df.drop(df[df[year] == year].index, inplace=True) # replace 'Z' with 0 - df = df.replace('Z', 0) + df = df.replace("Z", 0) # add country to the multiindex new_tuple = [(country, *idx) for idx in df.index] - new_mindex = pd.MultiIndex.from_tuples(new_tuple, names=['country', None, 'name', None, 'unit']) + new_mindex = pd.MultiIndex.from_tuples( + new_tuple, names=["country", None, "name", None, "unit"] + ) df.index = new_mindex # make numeric values where possible - df = df.apply(pd.to_numeric, errors='coerce') + df = df.apply(pd.to_numeric, errors="coerce") # drop non-numeric columns non_numeric_cols = df.columns[df.dtypes != float] df.drop(non_numeric_cols, axis=1, inplace=True) # concatenate the dataframes eurostat = pd.concat([eurostat, df], axis=0) - + eurostat.drop(["Unnamed: 4", year, "Unnamed: 6"], axis=1, inplace=True) # Renaming some indices rename = { - 'Households': 'Residential', - 'Commercial & public services': 'Services', - 'Domestic navigation': 'Domestic Navigation' + "Households": "Residential", + "Commercial & public services": "Services", + "Domestic navigation": "Domestic Navigation", } for name, rename in rename.items(): eurostat.index = eurostat.index.set_levels( - eurostat.index.levels[3].where(eurostat.index.levels[3] != name, rename), - level=3) - new_index = eurostat.index.set_levels(eurostat.index.levels[2].where(eurostat.index.levels[2] != 'International maritime bunkers', 'Bunkers'), level=2) + eurostat.index.levels[3].where(eurostat.index.levels[3] != name, rename), + level=3, + ) + new_index = eurostat.index.set_levels( + eurostat.index.levels[2].where( + eurostat.index.levels[2] != "International maritime bunkers", "Bunkers" + ), + level=2, + ) eurostat.index = new_index - eurostat.rename(columns={'Total': 'Total all products'}, inplace=True) - eurostat.index = eurostat.index.set_levels(eurostat.index.levels[0].where(eurostat.index.levels[0] != 'UK', 'GB'), level=0) - + eurostat.rename(columns={"Total": "Total all products"}, inplace=True) + eurostat.index = eurostat.index.set_levels( + eurostat.index.levels[0].where(eurostat.index.levels[0] != "UK", "GB"), level=0 + ) + df = eurostat * 11.63 / 1e3 return df @@ -766,66 +784,95 @@ def rescale(idees_countries, energy, eurostat): missing data: ['passenger car efficiency', 'passenger cars'] """ # read in the eurostat data for 2015 - eurostat_2015 = build_eurostat(input_eurostat, countries, 2023, 2015)[["Total all products", "Electricity"]] + eurostat_2015 = build_eurostat(input_eurostat, countries, 2023, 2015)[ + ["Total all products", "Electricity"] + ] eurostat_year = eurostat[["Total all products", "Electricity"]] # calculate the ratio of the two data sets ratio = eurostat_year / eurostat_2015 - ratio = ratio.droplevel([1,4]) - ratio.rename(columns={"Total all products": "total", "Electricity": "ele"}, inplace=True) + ratio = ratio.droplevel([1, 4]) + ratio.rename( + columns={"Total all products": "total", "Electricity": "ele"}, inplace=True + ) ratio = ratio.rename(index={"EL": "GR"}, level=0) mappings = { "Residential": { - "total": ["total residential space", - "total residential water", - "total residential cooking", - "total residential", - "derived heat residential", - "thermal uses residential",], - "elec": ["electricity residential space", - "electricity residential water", - "electricity residential cooking", - "electricity residential",]}, + "total": [ + "total residential space", + "total residential water", + "total residential cooking", + "total residential", + "derived heat residential", + "thermal uses residential", + ], + "elec": [ + "electricity residential space", + "electricity residential water", + "electricity residential cooking", + "electricity residential", + ], + }, "Services": { - "total": ["total services space", - "total services water", - "total services cooking", - "total services", - "derived heat services", - "thermal uses services",], - "elec": ["electricity services space", - "electricity services water", - "electricity services cooking", - "electricity services",]}, + "total": [ + "total services space", + "total services water", + "total services cooking", + "total services", + "derived heat services", + "thermal uses services", + ], + "elec": [ + "electricity services space", + "electricity services water", + "electricity services cooking", + "electricity services", + ], + }, "Agriculture & forestry": { - "total": ["total agriculture heat", - "total agriculture machinery", - "total agriculture",], - "elec": ["total agriculture electricity",]}, + "total": [ + "total agriculture heat", + "total agriculture machinery", + "total agriculture", + ], + "elec": [ + "total agriculture electricity", + ], + }, "Road": { - "total": ["total road", - "total passenger cars", - "total other road passenger", - "total light duty road freight",], - "elec": ["electricity road", - "electricity passenger cars", - "electricity other road passenger", - "electricity light duty road freight",]}, + "total": [ + "total road", + "total passenger cars", + "total other road passenger", + "total light duty road freight", + ], + "elec": [ + "electricity road", + "electricity passenger cars", + "electricity other road passenger", + "electricity light duty road freight", + ], + }, "Rail": { - "total": ["total rail", - "total rail passenger", - "total rail freight",], - "elec": ["electricity rail", - "electricity rail passenger", - "electricity rail freight",]}, + "total": [ + "total rail", + "total rail passenger", + "total rail freight", + ], + "elec": [ + "electricity rail", + "electricity rail passenger", + "electricity rail freight", + ], + }, } avia_inter = [ - 'total aviation passenger', - 'total aviation freight', - 'total international aviation passenger', - 'total international aviation freight', - 'total international aviation' + "total aviation passenger", + "total aviation freight", + "total international aviation passenger", + "total international aviation freight", + "total international aviation", ] avia_domestic = [ "total domestic aviation passenger", @@ -840,13 +887,13 @@ def rescale(idees_countries, energy, eurostat): for sector, mapping in mappings.items(): sector_ratio = ratio.loc[(country, slice(None), sector)] - energy.loc[country, mapping["total"]] *= sector_ratio[['total']].iloc[0,0] - energy.loc[country, mapping["elec"]] *= sector_ratio[['ele']].iloc[0,0] - - avi_d = ratio.loc[(country, slice(None), 'Domestic aviation')] - avi_i = ratio.loc[(country, 'International aviation', slice(None))] - energy.loc[country, avia_inter] *= avi_i[['total']].iloc[0,0] - energy.loc[country, avia_domestic] *= avi_d[['total']].iloc[0,0] + energy.loc[country, mapping["total"]] *= sector_ratio[["total"]].iloc[0, 0] + energy.loc[country, mapping["elec"]] *= sector_ratio[["ele"]].iloc[0, 0] + + avi_d = ratio.loc[(country, slice(None), "Domestic aviation")] + avi_i = ratio.loc[(country, "International aviation", slice(None))] + energy.loc[country, avia_inter] *= avi_i[["total"]].iloc[0, 0] + energy.loc[country, avia_domestic] *= avi_d[["total"]].iloc[0, 0] nav = ratio.loc[(country, slice(None), "Domestic Navigation")] energy.loc[country, navigation] *= nav[["total"]].iloc[0, 0] @@ -898,9 +945,7 @@ if __name__ == "__main__": base_year_emissions = params["base_emissions_year"] emissions_scope = snakemake.params.energy["emissions"] eea_co2 = build_eea_co2(snakemake.input.co2, base_year_emissions, emissions_scope) - eurostat_co2 = build_eurostat_co2( - input_eurostat, countries, base_year_emissions - ) + eurostat_co2 = build_eurostat_co2(input_eurostat, countries, base_year_emissions) co2 = build_co2_totals(countries, eea_co2, eurostat_co2) co2.to_csv(snakemake.output.co2_name) diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index a075119e..2c9fea92 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -51,13 +51,15 @@ if __name__ == "__main__": url_eurostat = "https://ec.europa.eu/eurostat/documents/38154/4956218/Balances-December2022.zip/f7cf0d19-5c0f-60ad-4e48-098a5ddd6e48?t=1671184070589" tarball_fn = Path(f"{rootpath}/data/bundle-sector/eurostat_2023.zip") - to_fn = Path(f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/") + to_fn = Path( + f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/" + ) logger.info(f"Downloading Eurostat data from '{url_eurostat}'.") progress_retrieve(url_eurostat, tarball_fn, disable=disable_progress) logger.info("Extracting Eurostat data.") - with zipfile.ZipFile(tarball_fn, 'r') as zip_ref: + with zipfile.ZipFile(tarball_fn, "r") as zip_ref: zip_ref.extractall(to_fn) - logger.info(f"Eurostat data available in '{to_fn}'.") \ No newline at end of file + logger.info(f"Eurostat data available in '{to_fn}'.") From 5bcecc62c6abcfa78df6c2833bb22b0e40aab88a Mon Sep 17 00:00:00 2001 From: toniseibold Date: Tue, 27 Feb 2024 13:32:07 +0100 Subject: [PATCH 480/497] retrieve eurostat data is now outside of retrieve_sector_databundle --- rules/retrieve.smk | 13 ++++++-- scripts/retrieve_eurostat_data.py | 45 +++++++++++++++++++++++++++ scripts/retrieve_sector_databundle.py | 16 +--------- 3 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 scripts/retrieve_eurostat_data.py diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 8ef373d1..9250e745 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -142,9 +142,6 @@ if config["enable"]["retrieve"] and config["enable"].get( protected( directory("data/bundle-sector/eurostat-energy_balances-may_2018_edition") ), - protected( - directory("data/bundle-sector/eurostat-energy_balances-april_2023_edition") - ), protected(directory("data/bundle-sector/jrc-idees-2015")), ] @@ -160,6 +157,16 @@ if config["enable"]["retrieve"] and config["enable"].get( script: "../scripts/retrieve_sector_databundle.py" + rule retrieve_eurostat_data: + output: + protected( + directory("data/bundle-sector/eurostat-energy_balances-april_2023_edition") + ), + log: + "logs/retrieve_eurostat_data.log", + retries: 2 + script: + "../scripts/retrieve_eurostat_data.py" if config["enable"]["retrieve"]: datafiles = [ diff --git a/scripts/retrieve_eurostat_data.py b/scripts/retrieve_eurostat_data.py new file mode 100644 index 00000000..aedc43c9 --- /dev/null +++ b/scripts/retrieve_eurostat_data.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2024- The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Retrieve and extract eurostat energy balances data. +""" + + +import logging +import zipfile +from pathlib import Path + +from _helpers import ( + configure_logging, + progress_retrieve, + set_scenario_config, +) + +logger = logging.getLogger(__name__) + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("retrieve_eurostat_data") + rootpath = ".." + else: + rootpath = "." + configure_logging(snakemake) + set_scenario_config(snakemake) + + disable_progress = snakemake.config["run"].get("disable_progressbar", False) + url_eurostat = "https://ec.europa.eu/eurostat/documents/38154/4956218/Balances-December2022.zip/f7cf0d19-5c0f-60ad-4e48-098a5ddd6e48?t=1671184070589" + tarball_fn = Path(f"{rootpath}/data/bundle-sector/eurostat_2023.zip") + to_fn = Path(f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/") + + logger.info(f"Downloading Eurostat data from '{url_eurostat}'.") + progress_retrieve(url_eurostat, tarball_fn, disable=disable_progress) + + logger.info("Extracting Eurostat data.") + with zipfile.ZipFile(tarball_fn, 'r') as zip_ref: + zip_ref.extractall(to_fn) + + logger.info(f"Eurostat data available in '{to_fn}'.") \ No newline at end of file diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index a075119e..d311dac7 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -8,7 +8,6 @@ Retrieve and extract data bundle for sector-coupled studies. import logging import tarfile -import zipfile from pathlib import Path from _helpers import ( @@ -47,17 +46,4 @@ if __name__ == "__main__": tarball_fn.unlink() - logger.info(f"Databundle available in '{to_fn}'.") - - url_eurostat = "https://ec.europa.eu/eurostat/documents/38154/4956218/Balances-December2022.zip/f7cf0d19-5c0f-60ad-4e48-098a5ddd6e48?t=1671184070589" - tarball_fn = Path(f"{rootpath}/data/bundle-sector/eurostat_2023.zip") - to_fn = Path(f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/") - - logger.info(f"Downloading Eurostat data from '{url_eurostat}'.") - progress_retrieve(url_eurostat, tarball_fn, disable=disable_progress) - - logger.info("Extracting Eurostat data.") - with zipfile.ZipFile(tarball_fn, 'r') as zip_ref: - zip_ref.extractall(to_fn) - - logger.info(f"Eurostat data available in '{to_fn}'.") \ No newline at end of file + logger.info(f"Databundle available in '{to_fn}'.") \ No newline at end of file From 8dfab454537fa3892cce1a939625e671aca3091e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 12:35:55 +0000 Subject: [PATCH 481/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- rules/retrieve.smk | 7 +++++-- scripts/retrieve_eurostat_data.py | 14 ++++++-------- scripts/retrieve_sector_databundle.py | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 9250e745..cfe698fc 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -160,14 +160,17 @@ if config["enable"]["retrieve"] and config["enable"].get( rule retrieve_eurostat_data: output: protected( - directory("data/bundle-sector/eurostat-energy_balances-april_2023_edition") - ), + directory( + "data/bundle-sector/eurostat-energy_balances-april_2023_edition" + ) + ), log: "logs/retrieve_eurostat_data.log", retries: 2 script: "../scripts/retrieve_eurostat_data.py" + if config["enable"]["retrieve"]: datafiles = [ "IGGIELGN_LNGs.geojson", diff --git a/scripts/retrieve_eurostat_data.py b/scripts/retrieve_eurostat_data.py index aedc43c9..daee4fc4 100644 --- a/scripts/retrieve_eurostat_data.py +++ b/scripts/retrieve_eurostat_data.py @@ -11,11 +11,7 @@ import logging import zipfile from pathlib import Path -from _helpers import ( - configure_logging, - progress_retrieve, - set_scenario_config, -) +from _helpers import configure_logging, progress_retrieve, set_scenario_config logger = logging.getLogger(__name__) @@ -33,13 +29,15 @@ if __name__ == "__main__": disable_progress = snakemake.config["run"].get("disable_progressbar", False) url_eurostat = "https://ec.europa.eu/eurostat/documents/38154/4956218/Balances-December2022.zip/f7cf0d19-5c0f-60ad-4e48-098a5ddd6e48?t=1671184070589" tarball_fn = Path(f"{rootpath}/data/bundle-sector/eurostat_2023.zip") - to_fn = Path(f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/") + to_fn = Path( + f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/" + ) logger.info(f"Downloading Eurostat data from '{url_eurostat}'.") progress_retrieve(url_eurostat, tarball_fn, disable=disable_progress) logger.info("Extracting Eurostat data.") - with zipfile.ZipFile(tarball_fn, 'r') as zip_ref: + with zipfile.ZipFile(tarball_fn, "r") as zip_ref: zip_ref.extractall(to_fn) - logger.info(f"Eurostat data available in '{to_fn}'.") \ No newline at end of file + logger.info(f"Eurostat data available in '{to_fn}'.") diff --git a/scripts/retrieve_sector_databundle.py b/scripts/retrieve_sector_databundle.py index d311dac7..3b825da2 100644 --- a/scripts/retrieve_sector_databundle.py +++ b/scripts/retrieve_sector_databundle.py @@ -46,4 +46,4 @@ if __name__ == "__main__": tarball_fn.unlink() - logger.info(f"Databundle available in '{to_fn}'.") \ No newline at end of file + logger.info(f"Databundle available in '{to_fn}'.") From bd0880c02255e6214ba94a4b2ba2b8da7519c75e Mon Sep 17 00:00:00 2001 From: toniseibold Date: Tue, 27 Feb 2024 14:32:09 +0100 Subject: [PATCH 482/497] correcting misleading comment --- scripts/build_energy_totals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index d6c63f00..c114b707 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -922,7 +922,7 @@ if __name__ == "__main__": input_eurostat = snakemake.input.eurostat eurostat = build_eurostat(input_eurostat, countries, data_year) swiss = build_swiss(data_year) - # data from idees only exists for 2015 + # data from idees only exists from 2000-2015 if data_year > 2015: # read in latest data and rescale later idees = build_idees(idees_countries, 2015) From f08c6fe77239ee0c60f25cca41179cbbb2c09d97 Mon Sep 17 00:00:00 2001 From: lisazeyen <35347358+lisazeyen@users.noreply.github.com> Date: Wed, 28 Feb 2024 16:13:36 +0100 Subject: [PATCH 483/497] change technology data version to 0.8.1 --- config/config.default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index ca2d1ba3..ad4144d5 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -668,7 +668,7 @@ industry: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs costs: year: 2030 - version: v0.8.0 + version: v0.8.1 rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) social_discountrate: 0.02 fill_values: From e933acd9e866e55c607eb480d8e4fa5b7d59b6d4 Mon Sep 17 00:00:00 2001 From: lisazeyen <35347358+lisazeyen@users.noreply.github.com> Date: Wed, 28 Feb 2024 16:15:43 +0100 Subject: [PATCH 484/497] update release_notes.rst --- doc/release_notes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index d6072d7d..8167f6dd 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -9,6 +9,7 @@ Release Notes Upcoming Release ================ +* Upgrade default techno-economic assumptions to ``technology-data`` v0.8.1. * Linearly interpolate missing investment periods in year-dependent configuration options. From 7f5f0ee45eee98d99d425e6e2e927f99087f97b9 Mon Sep 17 00:00:00 2001 From: Michael Lindner Date: Tue, 5 Mar 2024 12:00:50 +0100 Subject: [PATCH 485/497] compute lifetime after grouping DateIn --- scripts/add_existing_baseyear.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 44c9b20e..eea1b3cf 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -171,9 +171,7 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas phased_out = df_agg[df_agg["DateOut"] < baseyear].index df_agg.drop(phased_out, inplace=True) - # calculate remaining lifetime before phase-out (+1 because assuming - # phase out date at the end of the year) - df_agg["lifetime"] = df_agg.DateOut - df_agg.DateIn + 1 + # assign clustered bus busmap_s = pd.read_csv(snakemake.input.busmap_s, index_col=0).squeeze() @@ -195,6 +193,10 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas grouping_years, np.digitize(df_agg.DateIn, grouping_years, right=True) ) + # calculate (adjusted) remaining lifetime before phase-out (+1 because assuming + # phase out date at the end of the year) + df_agg["lifetime"] = df_agg.DateOut - df_agg["grouping_year"] + 1 + df = df_agg.pivot_table( index=["grouping_year", "Fueltype"], columns="cluster_bus", From 8c465dbe3cbadb54a61336b9f75b94d454fdea97 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 12:49:33 +0000 Subject: [PATCH 486/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/add_existing_baseyear.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index eea1b3cf..0bbe19f0 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -171,8 +171,6 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas phased_out = df_agg[df_agg["DateOut"] < baseyear].index df_agg.drop(phased_out, inplace=True) - - # assign clustered bus busmap_s = pd.read_csv(snakemake.input.busmap_s, index_col=0).squeeze() busmap = pd.read_csv(snakemake.input.busmap, index_col=0).squeeze() @@ -195,7 +193,7 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas # calculate (adjusted) remaining lifetime before phase-out (+1 because assuming # phase out date at the end of the year) - df_agg["lifetime"] = df_agg.DateOut - df_agg["grouping_year"] + 1 + df_agg["lifetime"] = df_agg.DateOut - df_agg["grouping_year"] + 1 df = df_agg.pivot_table( index=["grouping_year", "Fueltype"], From 3c24ae9204df81cfba9abd08181c919fe11a27c0 Mon Sep 17 00:00:00 2001 From: Michael Lindner Date: Tue, 5 Mar 2024 13:51:24 +0100 Subject: [PATCH 487/497] 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 8167f6dd..3471c0b0 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -9,6 +9,8 @@ Release Notes Upcoming Release ================ +* Corrected a bug leading to power plants operating after their DateOut (https://github.com/PyPSA/pypsa-eur/pull/958). + * Upgrade default techno-economic assumptions to ``technology-data`` v0.8.1. * Linearly interpolate missing investment periods in year-dependent From 1e25f3adafd4f14cedd960b72151e5b4022a6f2f Mon Sep 17 00:00:00 2001 From: Michael Lindner Date: Tue, 5 Mar 2024 14:07:46 +0100 Subject: [PATCH 488/497] add grouping years 1960-1975 --- config/config.default.yaml | 2 +- doc/release_notes.rst | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index ad4144d5..b0b389b8 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -354,7 +354,7 @@ solar_thermal: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#existing-capacities existing_capacities: - grouping_years_power: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030] + grouping_years_power: [1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030] grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # these should not extend 2020 threshold_capacity: 10 default_heating_lifetime: 20 diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 3471c0b0..b1234da1 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -9,7 +9,9 @@ Release Notes Upcoming Release ================ -* Corrected a bug leading to power plants operating after their DateOut (https://github.com/PyPSA/pypsa-eur/pull/958). +* Corrected a bug leading to power plants operating after their DateOut + (https://github.com/PyPSA/pypsa-eur/pull/958). Added additional grouping years + before 1980. * Upgrade default techno-economic assumptions to ``technology-data`` v0.8.1. From 3da649c13fbd48ed9d7d7c602bb0bf436eba35e2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 13:08:14 +0000 Subject: [PATCH 489/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index b1234da1..3ae2d09d 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -9,7 +9,7 @@ Release Notes Upcoming Release ================ -* Corrected a bug leading to power plants operating after their DateOut +* Corrected a bug leading to power plants operating after their DateOut (https://github.com/PyPSA/pypsa-eur/pull/958). Added additional grouping years before 1980. From 41f23f9589669147f5dfef96e42fe68bceabd595 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 5 Mar 2024 18:40:06 +0100 Subject: [PATCH 490/497] change eurostat year in build_industrial_production_per_country --- rules/build_sector.smk | 2 +- ...build_industrial_production_per_country.py | 50 +++++++------------ 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 6c542f4e..5e19a4bb 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -468,7 +468,7 @@ rule build_industrial_production_per_country: input: ammonia_production=resources("ammonia_production.csv"), jrc="data/bundle-sector/jrc-idees-2015", - eurostat="data/bundle-sector/eurostat-energy_balances-may_2018_edition", + eurostat="data/eurostat/eurostat-energy_balances-april_2023_edition", output: industrial_production_per_country=resources( "industrial_production_per_country.csv" diff --git a/scripts/build_industrial_production_per_country.py b/scripts/build_industrial_production_per_country.py index 2ad37d3f..5c14b065 100644 --- a/scripts/build_industrial_production_per_country.py +++ b/scripts/build_industrial_production_per_country.py @@ -97,33 +97,18 @@ fields = { "Other Industrial Sectors": "Physical output (index)", } -eb_names = { - "NO": "Norway", - "AL": "Albania", - "BA": "Bosnia and Herzegovina", - "MK": "FYR of Macedonia", - "GE": "Georgia", - "IS": "Iceland", - "KO": "Kosovo", - "MD": "Moldova", - "ME": "Montenegro", - "RS": "Serbia", - "UA": "Ukraine", - "TR": "Turkey", -} - eb_sectors = { - "Iron & steel industry": "Iron and steel", - "Chemical and Petrochemical industry": "Chemicals Industry", - "Non-ferrous metal industry": "Non-metallic mineral products", - "Paper, Pulp and Print": "Pulp, paper and printing", - "Food and Tabacco": "Food, beverages and tobacco", - "Non-metallic Minerals (Glass, pottery & building mat. Industry)": "Non Ferrous Metals", - "Transport Equipment": "Transport Equipment", + "Iron & steel": "Iron and steel", + "Chemical & petrochemical": "Chemicals Industry", + "Non-ferrous metals": "Non-metallic mineral products", + "Paper, pulp & printing": "Pulp, paper and printing", + "Food, beverages & tobacco": "Food, beverages and tobacco", + "Non-metallic minerals": "Non Ferrous Metals", + "Transport equipment": "Transport Equipment", "Machinery": "Machinery Equipment", - "Textile and Leather": "Textiles and leather", - "Wood and Wood Products": "Wood and wood products", - "Non-specified (Industry)": "Other Industrial Sectors", + "Textile & leather": "Textiles and leather", + "Wood & wood products": "Wood and wood products", + "Not elsewhere specified (industry)": "Other Industrial Sectors", } # TODO: this should go in a csv in `data` @@ -160,12 +145,15 @@ def get_energy_ratio(country, eurostat_dir, jrc_dir, year): e_country = e_switzerland * tj_to_ktoe else: # estimate physical output, energy consumption in the sector and country - fn = f"{eurostat_dir}/{eb_names[country]}.XLSX" - with mute_print(): - df = pd.read_excel( - fn, sheet_name="2016", index_col=2, header=0, skiprows=1 - ).squeeze("columns") - e_country = df.loc[eb_sectors.keys(), "Total all products"].rename(eb_sectors) + fn = f"{eurostat_dir}/{country}-Energy-balance-sheets-April-2023-edition.xlsb" + df = pd.read_excel( + fn, + sheet_name=str(min(2021, year)), + index_col=2, + header=0, + skiprows=4, + ) + e_country = df.loc[eb_sectors.keys(), "Total"].rename(eb_sectors) fn = f"{jrc_dir}/JRC-IDEES-2015_Industry_EU28.xlsx" From 5b513f81db7b52d79eb4f316df08d7bbe232ec9c Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 5 Mar 2024 18:42:15 +0100 Subject: [PATCH 491/497] move eurostat into data/eurostat subdirectory from sector-bundle --- doc/configtables/energy.csv | 3 --- rules/build_sector.smk | 4 ++-- rules/postprocess.smk | 2 +- rules/retrieve.smk | 18 ++---------------- scripts/retrieve_eurostat_data.py | 4 ++-- 5 files changed, 7 insertions(+), 24 deletions(-) diff --git a/doc/configtables/energy.csv b/doc/configtables/energy.csv index 8718d75e..3d13b9c3 100644 --- a/doc/configtables/energy.csv +++ b/doc/configtables/energy.csv @@ -1,7 +1,4 @@ ,Unit,Values,Description energy_totals_year ,--,"{1990,1995,2000,2005,2010,2011,…} ",The year for the sector energy use. The year must be avaliable in the Eurostat report base_emissions_year ,--,"YYYY; e.g. 1990","The base year for the sector emissions. See `European Environment Agency (EEA) `_." - -eurostat_report_year ,--,"{2016,2017,2018}","The publication year of the Eurostat report. 2016 includes Bosnia and Herzegovina, 2017 does not" - emissions ,--,"{CO2, All greenhouse gases - (CO2 equivalent)}","Specify which sectoral emissions are taken into account. Data derived from EEA. Currently only CO2 is implemented." diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 5e19a4bb..2ca0d9a4 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -270,7 +270,7 @@ rule build_energy_totals: swiss="data/switzerland-new_format-all_years.csv", idees="data/bundle-sector/jrc-idees-2015", district_heat_share="data/district_heat_share.csv", - eurostat="data/bundle-sector/eurostat-energy_balances-april_2023_edition", + eurostat="data/eurostat/eurostat-energy_balances-april_2023_edition", output: energy_name=resources("energy_totals.csv"), co2_name=resources("co2_totals.csv"), @@ -865,7 +865,7 @@ rule prepare_sector_network: ), network=resources("networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc"), energy_totals_name=resources("energy_totals.csv"), - eurostat="data/bundle-sector/eurostat-energy_balances-april_2023_edition", + eurostat="data/eurostat/eurostat-energy_balances-april_2023_edition", pop_weighted_energy_totals=resources( "pop_weighted_energy_totals_s{simpl}_{clusters}.csv" ), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index 5f93540f..ecfc5b74 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -247,7 +247,7 @@ rule plot_summary: costs=RESULTS + "csvs/costs.csv", energy=RESULTS + "csvs/energy.csv", balances=RESULTS + "csvs/supply_energy.csv", - eurostat="data/bundle-sector/eurostat-energy_balances-april_2023_edition", + eurostat="data/eurostat/eurostat-energy_balances-april_2023_edition", co2="data/bundle-sector/eea/UNFCCC_v23.csv", output: costs=RESULTS + "graphs/costs.pdf", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index cfe698fc..b516a0cd 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -135,20 +135,10 @@ if config["enable"]["retrieve"] and config["enable"].get( "h2_salt_caverns_GWh_per_sqkm.geojson", ] - datafolders = [ - protected( - directory("data/bundle-sector/eurostat-energy_balances-june_2016_edition") - ), - protected( - directory("data/bundle-sector/eurostat-energy_balances-may_2018_edition") - ), - protected(directory("data/bundle-sector/jrc-idees-2015")), - ] - rule retrieve_sector_databundle: output: protected(expand("data/bundle-sector/{files}", files=datafiles)), - *datafolders, + protected(directory("data/bundle-sector/jrc-idees-2015")), log: "logs/retrieve_sector_databundle.log", retries: 2 @@ -159,11 +149,7 @@ if config["enable"]["retrieve"] and config["enable"].get( rule retrieve_eurostat_data: output: - protected( - directory( - "data/bundle-sector/eurostat-energy_balances-april_2023_edition" - ) - ), + directory("data/eurostat/eurostat-energy_balances-april_2023_edition"), log: "logs/retrieve_eurostat_data.log", retries: 2 diff --git a/scripts/retrieve_eurostat_data.py b/scripts/retrieve_eurostat_data.py index daee4fc4..4b4cea4a 100644 --- a/scripts/retrieve_eurostat_data.py +++ b/scripts/retrieve_eurostat_data.py @@ -28,9 +28,9 @@ if __name__ == "__main__": disable_progress = snakemake.config["run"].get("disable_progressbar", False) url_eurostat = "https://ec.europa.eu/eurostat/documents/38154/4956218/Balances-December2022.zip/f7cf0d19-5c0f-60ad-4e48-098a5ddd6e48?t=1671184070589" - tarball_fn = Path(f"{rootpath}/data/bundle-sector/eurostat_2023.zip") + tarball_fn = Path(f"{rootpath}/data/eurostat/eurostat_2023.zip") to_fn = Path( - f"{rootpath}/data/bundle-sector/eurostat-energy_balances-april_2023_edition/" + f"{rootpath}/data/eurostat/eurostat-energy_balances-april_2023_edition/" ) logger.info(f"Downloading Eurostat data from '{url_eurostat}'.") From bf60da973b0370dcce3b5b7d7fd166cd73839351 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 5 Mar 2024 18:43:24 +0100 Subject: [PATCH 492/497] build_energy_totals: revision of eurostat report upgrade --- scripts/build_energy_totals.py | 200 +++++++++++---------------------- 1 file changed, 63 insertions(+), 137 deletions(-) diff --git a/scripts/build_energy_totals.py b/scripts/build_energy_totals.py index c114b707..1ffc4ae2 100644 --- a/scripts/build_energy_totals.py +++ b/scripts/build_energy_totals.py @@ -37,54 +37,6 @@ def reverse(dictionary): return {v: k for k, v in dictionary.items()} -eurostat_codes = { - "EU28": "EU", - "EA19": "EA", - "Belgium": "BE", - "Bulgaria": "BG", - "Czech Republic": "CZ", - "Denmark": "DK", - "Germany": "DE", - "Estonia": "EE", - "Ireland": "IE", - "Greece": "GR", - "Spain": "ES", - "France": "FR", - "Croatia": "HR", - "Italy": "IT", - "Cyprus": "CY", - "Latvia": "LV", - "Lithuania": "LT", - "Luxembourg": "LU", - "Hungary": "HU", - "Malta": "MA", - "Netherlands": "NL", - "Austria": "AT", - "Poland": "PL", - "Portugal": "PT", - "Romania": "RO", - "Slovenia": "SI", - "Slovakia": "SK", - "Finland": "FI", - "Sweden": "SE", - "United Kingdom": "GB", - "Iceland": "IS", - "Norway": "NO", - "Montenegro": "ME", - "FYR of Macedonia": "MK", - "Albania": "AL", - "Serbia": "RS", - "Turkey": "TU", - "Bosnia and Herzegovina": "BA", - "Kosovo\n(UNSCR 1244/99)": "KO", # 2017 version - # 2016 version - "Kosovo\n(under United Nations Security Council Resolution 1244/99)": "KO", - "Moldova": "MO", - "Ukraine": "UK", - "Switzerland": "CH", -} - - idees_rename = {"GR": "EL", "GB": "UK"} eu28 = cc.EU28as("ISO2").ISO2.tolist() @@ -121,79 +73,54 @@ def build_eurostat(input_eurostat, countries, year): """ Return multi-index for all countries' energy data in TWh/a. """ - # read in every country file in countries - eurostat = pd.DataFrame() - countries = [country if country != "GB" else "UK" for country in countries] - countries = [country if country != "GR" else "EL" for country in countries] + df = {} + countries = {idees_rename.get(country, country) for country in countries} - {"CH"} for country in countries: - filename = f"/{country}-Energy-balance-sheets-April-2023-edition.xlsb" - if os.path.exists(input_eurostat + filename): - df = pd.read_excel( - input_eurostat + filename, - engine="pyxlsb", - sheet_name=str(year), - skiprows=4, - index_col=list(range(4)), - ) - # replace entry 'Z' with 0 - df.replace("Z", 0, inplace=True) - # write 'International aviation' to the 2nd level of the multiindex - index_number = ( - df.index.get_level_values(1) == "International aviation" - ).argmax() - new_index = ( - "-", - "International aviation", - "International aviation", - "ktoe", - ) - modified_index = list(df.index) - modified_index[index_number] = new_index - df.index = pd.MultiIndex.from_tuples(modified_index, names=df.index.names) - # drop the annoying subhead line - df.drop(df[df[year] == year].index, inplace=True) - # replace 'Z' with 0 - df = df.replace("Z", 0) - # add country to the multiindex - new_tuple = [(country, *idx) for idx in df.index] - new_mindex = pd.MultiIndex.from_tuples( - new_tuple, names=["country", None, "name", None, "unit"] - ) - df.index = new_mindex - # make numeric values where possible - df = df.apply(pd.to_numeric, errors="coerce") - # drop non-numeric columns - non_numeric_cols = df.columns[df.dtypes != float] - df.drop(non_numeric_cols, axis=1, inplace=True) - # concatenate the dataframes - eurostat = pd.concat([eurostat, df], axis=0) + filename = ( + f"{input_eurostat}/{country}-Energy-balance-sheets-April-2023-edition.xlsb" + ) + sheet = pd.read_excel( + filename, + engine="pyxlsb", + sheet_name=str(year), + skiprows=4, + index_col=list(range(4)), + ) + df[country] = sheet + df = pd.concat(df, axis=0) + + # drop columns with all NaNs + unnamed_cols = df.columns[df.columns.astype(str).str.startswith("Unnamed")] + df.drop(unnamed_cols, axis=1, inplace=True) + df.drop(year, axis=1, inplace=True) + + # make numeric values where possible + df.replace("Z", 0, inplace=True) + df = df.apply(pd.to_numeric, errors="coerce") + df = df.select_dtypes(include=[np.number]) + + # write 'International aviation' to the 2nd level of the multiindex + int_avia = df.index.get_level_values(2) == "International aviation" + temp = df.loc[int_avia] + temp.index = pd.MultiIndex.from_frame( + temp.index.to_frame().fillna("International aviation") + ) + df = pd.concat([temp, df.loc[~int_avia]]) - eurostat.drop(["Unnamed: 4", year, "Unnamed: 6"], axis=1, inplace=True) # Renaming some indices - rename = { + index_rename = { "Households": "Residential", "Commercial & public services": "Services", "Domestic navigation": "Domestic Navigation", + "International maritime bunkers": "Bunkers", } - for name, rename in rename.items(): - eurostat.index = eurostat.index.set_levels( - eurostat.index.levels[3].where(eurostat.index.levels[3] != name, rename), - level=3, - ) - new_index = eurostat.index.set_levels( - eurostat.index.levels[2].where( - eurostat.index.levels[2] != "International maritime bunkers", "Bunkers" - ), - level=2, - ) - eurostat.index = new_index + columns_rename = {"Total": "Total all products", "UK": "GB"} + df.rename(index=index_rename, columns=columns_rename, inplace=True) + df.sort_index(inplace=True) + df.index.names = [None] * len(df.index.names) - eurostat.rename(columns={"Total": "Total all products"}, inplace=True) - eurostat.index = eurostat.index.set_levels( - eurostat.index.levels[0].where(eurostat.index.levels[0] != "UK", "GB"), level=0 - ) - - df = eurostat * 11.63 / 1e3 + # convert to TWh/a from ktoe/a + df *= 11.63 / 1e3 return df @@ -776,25 +703,25 @@ def build_transport_data(countries, population, idees): return transport_data -def rescale(idees_countries, energy, eurostat): +def rescale_idees_from_eurostat( + idees_countries, energy, eurostat, input_eurostat, countries +): """ Takes JRC IDEES data from 2015 and rescales it by the ratio of the eurostat data and the 2015 eurostat data. missing data: ['passenger car efficiency', 'passenger cars'] """ + main_cols = ["Total all products", "Electricity"] # read in the eurostat data for 2015 - eurostat_2015 = build_eurostat(input_eurostat, countries, 2023, 2015)[ - ["Total all products", "Electricity"] - ] - eurostat_year = eurostat[["Total all products", "Electricity"]] + eurostat_2015 = build_eurostat(input_eurostat, countries, 2015)[main_cols] + eurostat_year = eurostat[main_cols] # calculate the ratio of the two data sets ratio = eurostat_year / eurostat_2015 ratio = ratio.droplevel([1, 4]) - ratio.rename( - columns={"Total all products": "total", "Electricity": "ele"}, inplace=True - ) - ratio = ratio.rename(index={"EL": "GR"}, level=0) + cols_rename = {"Total all products": "total", "Electricity": "ele"} + index_rename = {v: k for k, v in idees_rename.items()} + ratio.rename(columns=cols_rename, index=index_rename, inplace=True) mappings = { "Residential": { @@ -887,16 +814,16 @@ def rescale(idees_countries, energy, eurostat): for sector, mapping in mappings.items(): sector_ratio = ratio.loc[(country, slice(None), sector)] - energy.loc[country, mapping["total"]] *= sector_ratio[["total"]].iloc[0, 0] - energy.loc[country, mapping["elec"]] *= sector_ratio[["ele"]].iloc[0, 0] + energy.loc[country, mapping["total"]] *= sector_ratio["total"].iloc[0] + energy.loc[country, mapping["elec"]] *= sector_ratio["ele"].iloc[0] - avi_d = ratio.loc[(country, slice(None), "Domestic aviation")] - avi_i = ratio.loc[(country, "International aviation", slice(None))] - energy.loc[country, avia_inter] *= avi_i[["total"]].iloc[0, 0] - energy.loc[country, avia_domestic] *= avi_d[["total"]].iloc[0, 0] + avi_d = ratio.loc[(country, slice(None), "Domestic aviation"), "total"] + avi_i = ratio.loc[(country, "International aviation", slice(None)), "total"] + energy.loc[country, avia_inter] *= avi_i.iloc[0] + energy.loc[country, avia_domestic] *= avi_d.iloc[0] - nav = ratio.loc[(country, slice(None), "Domestic Navigation")] - energy.loc[country, navigation] *= nav[["total"]].iloc[0, 0] + nav = ratio.loc[(country, slice(None), "Domestic Navigation"), "total"] + energy.loc[country, navigation] *= nav.iloc[0] return energy @@ -922,17 +849,16 @@ if __name__ == "__main__": input_eurostat = snakemake.input.eurostat eurostat = build_eurostat(input_eurostat, countries, data_year) swiss = build_swiss(data_year) - # data from idees only exists from 2000-2015 - if data_year > 2015: - # read in latest data and rescale later - idees = build_idees(idees_countries, 2015) - else: - idees = build_idees(idees_countries, data_year) + # data from idees only exists from 2000-2015. read in latest data and rescale later + idees = build_idees(idees_countries, min(2015, data_year)) energy = build_energy_totals(countries, eurostat, swiss, idees) if data_year > 2015: - energy = rescale(idees_countries, energy, eurostat) + logger.info("Data year is after 2015. Rescaling IDEES data based on eurostat.") + energy = rescale_idees_from_eurostat( + idees_countries, energy, eurostat, input_eurostat, countries + ) energy.to_csv(snakemake.output.energy_name) From c13e0b83cff1f8a7ac2d6c9cd07ba01bd2b235f8 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 5 Mar 2024 18:55:59 +0100 Subject: [PATCH 493/497] remove remaining references of eurostat report year --- rules/build_sector.smk | 1 - rules/postprocess.smk | 1 - scripts/plot_summary.py | 2 -- scripts/prepare_sector_network.py | 14 ++++---------- 4 files changed, 4 insertions(+), 14 deletions(-) diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 2ca0d9a4..9147a623 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -834,7 +834,6 @@ rule prepare_sector_network: countries=config_provider("countries"), adjustments=config_provider("adjustments", "sector"), emissions_scope=config_provider("energy", "emissions"), - eurostat_report_year=config_provider("energy", "eurostat_report_year"), RDIR=RDIR, input: unpack(input_profile_offwind), diff --git a/rules/postprocess.smk b/rules/postprocess.smk index ecfc5b74..1b188829 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -237,7 +237,6 @@ rule plot_summary: countries=config_provider("countries"), planning_horizons=config_provider("scenario", "planning_horizons"), emissions_scope=config_provider("energy", "emissions"), - eurostat_report_year=config_provider("energy", "eurostat_report_year"), plotting=config_provider("plotting"), foresight=config_provider("foresight"), co2_budget=config_provider("co2_budget"), diff --git a/scripts/plot_summary.py b/scripts/plot_summary.py index c2fd7e04..bfe9995f 100644 --- a/scripts/plot_summary.py +++ b/scripts/plot_summary.py @@ -462,7 +462,6 @@ def plot_carbon_budget_distribution(input_eurostat, options): plt.rcParams["ytick.labelsize"] = 20 emissions_scope = snakemake.params.emissions_scope - report_year = snakemake.params.eurostat_report_year input_co2 = snakemake.input.co2 # historic emissions @@ -472,7 +471,6 @@ def plot_carbon_budget_distribution(input_eurostat, options): input_eurostat, options, emissions_scope, - report_year, input_co2, year=1990, ) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 9a9db36f..8b001da3 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -248,7 +248,7 @@ def get(item, investment_year=None): def co2_emissions_year( - countries, input_eurostat, options, emissions_scope, report_year, input_co2, year + countries, input_eurostat, options, emissions_scope, input_co2, year ): """ Calculate CO2 emissions in one specific year (e.g. 1990 or 2018). @@ -258,11 +258,9 @@ def co2_emissions_year( # TODO: read Eurostat data from year > 2014 # this only affects the estimation of CO2 emissions for BA, RS, AL, ME, MK if year > 2014: - eurostat_co2 = build_eurostat_co2( - input_eurostat, countries, report_year, year=2014 - ) + eurostat_co2 = build_eurostat_co2(input_eurostat, countries, 2014) else: - eurostat_co2 = build_eurostat_co2(input_eurostat, countries, report_year, year) + eurostat_co2 = build_eurostat_co2(input_eurostat, countries, year) co2_totals = build_co2_totals(countries, eea_co2, eurostat_co2) @@ -278,7 +276,7 @@ def co2_emissions_year( # TODO: move to own rule with sector-opts wildcard? def build_carbon_budget( - o, input_eurostat, fn, emissions_scope, report_year, input_co2, options + o, input_eurostat, fn, emissions_scope, input_co2, options ): """ Distribute carbon budget following beta or exponential transition path. @@ -300,7 +298,6 @@ def build_carbon_budget( input_eurostat, options, emissions_scope, - report_year, input_co2, year=1990, ) @@ -311,7 +308,6 @@ def build_carbon_budget( input_eurostat, options, emissions_scope, - report_year, input_co2, year=2018, ) @@ -3669,14 +3665,12 @@ if __name__ == "__main__": fn = "results/" + snakemake.params.RDIR + "/csvs/carbon_budget_distribution.csv" if not os.path.exists(fn): emissions_scope = snakemake.params.emissions_scope - report_year = snakemake.params.eurostat_report_year input_co2 = snakemake.input.co2 build_carbon_budget( co2_budget, snakemake.input.eurostat, fn, emissions_scope, - report_year, input_co2, options, ) From ca91c02bf77e5d33c787d2e4b78f65e2c694dfce Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:56:39 +0000 Subject: [PATCH 494/497] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 8b001da3..2e8bf6fd 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -275,9 +275,7 @@ def co2_emissions_year( # TODO: move to own rule with sector-opts wildcard? -def build_carbon_budget( - o, input_eurostat, fn, emissions_scope, input_co2, options -): +def build_carbon_budget(o, input_eurostat, fn, emissions_scope, input_co2, options): """ Distribute carbon budget following beta or exponential transition path. """ From 85ceb9ad54875f84fd52ea643fd0f0f333d19ed1 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 5 Mar 2024 19:03:48 +0100 Subject: [PATCH 495/497] add release notes --- doc/release_notes.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 8167f6dd..de08873d 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -9,6 +9,19 @@ Release Notes Upcoming Release ================ + +* The Eurostat data was updated to the 2023 version in :mod:`build_energy_totals`. + +* The latest `Swiss energy totals + `_ + have been updated to the 2023 version. + +* The JRC-IDEES data is only available until 2015. For energy totals years (``energy: energy_totals_year``) after + 2015, the data scaled using the ratio of Eurostat data reported for the energy + totals year and 2015. + +* The default energy totals year (``energy: energy_totals_year``) was updated to 2019. + * Upgrade default techno-economic assumptions to ``technology-data`` v0.8.1. * Linearly interpolate missing investment periods in year-dependent From da8119e47ee2e686fe063d31ac9ff3e79b2f6508 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 5 Mar 2024 19:08:22 +0100 Subject: [PATCH 496/497] reset CI data cache --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bad6039f..c17c0425 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -19,7 +19,7 @@ on: - cron: "0 5 * * TUE" env: - DATA_CACHE_NUMBER: 2 + DATA_CACHE_NUMBER: 1 jobs: build: From 09502cfbfa6034023505403449ff9db8135a7de7 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Fri, 8 Mar 2024 11:26:00 +0100 Subject: [PATCH 497/497] add memory logger to solve_sector_network_myopic rule --- rules/solve_myopic.smk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index 5eb30233..a081fbe6 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -126,6 +126,8 @@ rule solve_sector_network_myopic: log: solver=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_solver.log", + memory=RESULTS + + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_memory.log", python=RESULTS + "logs/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}_python.log", threads: solver_threads

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%0Ap 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
-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 z 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

na(>N8qd`b0~VwMSG>E;JpD|ccrZsWm{(P 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�(2I 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°)h)dFt$!j)chl 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%0Ap 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
-K5It2ZcP04QP&X)%4GU%~kf8D`HMSvRaCJA?|Uz{4prIAWc zFE=Qr-#T{g^4(&g%uXQ{zbzf7AZ58`OO00v9v{Vw2|)dK?yS;^{~L4{HZ_$#)OcuP zv6(r&nFFryfIJ{0!1)ot=T(CTLK%R!K??Mzk*uy|#9*zt5h);Lz{i2X3M`;d(tG#% z$BQ!FjQ#$Jf`Z;l-D>~cpp*X2j<>AilEtT!neLsjZAu^-zEN{m`mrc2%gl0$!JHzi z_YKqOIIy}N|NWksaysSfgEvIqBtw!hNsX^VXYiX47BR93olZfB>|yeWrdO|C-RNQw z5bLA}*0u9%rg!b*ggWo}kk|L(?Q{xXaN|5>?k-5D$4yKzQ2%s$jmP)bg0>Co@MFFg z(zVOdoRI6>2~E{1C58oGHe~C9HwR3uzybxhr>FAowRnFF-R+C;0s0j7A};&LC-zc?vp6I3^rjnWqqkkqnVDB(q?JiB zubx45LTpaqBH1UpX@BH1z+}%oYI)60^+_O3rVfME?$NYqX_)EDi$io7@lT%L zLRpWrI!D}QHe7zBMjQ+hS1ocd^9eZNR4;mCn`QPC_Qt2ZH*%i5Eu$I36M`F3ZTzDq zx0^WaeA!MUDmAC>!_r0lKD@Ckwi=nac)Yp56GI*r@i20)JoyF}e(M`hk7!s2K8wvh z)@YpQ8nclQm{mUQtEgaq>gCn3b%?xl^jpwn9y2cyRjsn|au8;|aGMYaXxLIR75|VU zvBj?JB*+#;s})*`gDEA9+4q82B=U~Zd$~yUgp$O)FE#g?g$4PDxp5fWeaNK( z1^2KdP2Wil9Cj@9WwHw1`CwXrlFfpWSW|)+Y!}?ef+5TAcfZ32Wav@5P9$DTU-KJk z1z-l_oN#^GJx|`MUG=zTF}1bbkdPx|L@5I2oOclvNPK zCaGv6Q&N7iaVaRydqgD}%x97xvO^X~;iz&!lpr6fpNH-hc-vXx94Rxz^YyL3Uh(>} z9BF2@7irQ2sF@vql&&LYF55P*G*o~A)mX&+I_CFNC_{-B@ozICD55El&w|m z)m~bNHPO9W#2NWYZ>q;ybob6xY50ky$Q~ZcBHn)1yf6Q^H^f^!6zyAwFtSKUk{P!b zfT5DrJdPPWD!?%SwlhG!qXG%A2CVJus?IMffkq+eKKs00rZ4mW95hTM5yYA}h6tKrGXHjk~YsLuQ@<(t>jPEyVA z;peXuVlA~#fw>I?$t~_|zD0u9{5muQ;mXmrMeiXcHz%h>UK1Ka807Kdh5>)&1#XcVq4@=FcX-KvPo$NOx`$LsIyYIB*8&WTq}yS}R# zDk(~DMrHCIq4fSFtga`MJSX{MrBoz9BJ=*{VI?4%ebVu7`LWget=qviNZP#jO;M}@ zJT_4BbYovS-%rf-Zda>&QG4q4ubxH$ow@euilHk(YSb5v)hUefJ=I=nL()Qo>9}=g z#;pSH!VfdfkV6*AdNHb!@mj}jHF{Ox6K4W@!7Zija-C8EdNs{ZNlYhVob8^fa{QHy zro=A|jBW`KTR=&b%9v#QMy{qAy*2U9ZjIU3^H-xzQnAi9gt-4bx}jkombAv(dZOY) znWQZme^KU=VbG+$asV2b1^8HS4l*la>U%KY*->vjx%RNM3>~R9HZV{;lesbChQkC- z6*!4cPgg3=;8+7rFi=RqumOY|H=8scpXCoRZoM)&SrxZVkrw;KmtVrCLL9x&^|9W3 zQl$Uays^96ZSn8pN5{9K71YNh&T?fOcO3XKD)>lyd;YCVzvu~{N_6yMp`c<{u5u#9 z*P@nAaw0_(rg6Awb!h6pNhQ{Q&zBie%;ct-hiLB#EV&YEZ~J0S!56j=u*kYMBOZE0&8Ib{TI5n_VEA=><7y$k{wQMhX>0T`#x*wbjb3LCA zwBlw;opx4+M*M~^(k^mmYGNYgnH(-?YCxs|3Mko1gRXUtj?Dw4CI2=6bAjN6RW*eJ z9;U~RA{s9_zMgE}TggTp`gYPiiG{x^m(h&r5&P3HyrEadkL)VoLh9b~`oBKYCalG~ zCnhh}`m@W|9E`NB*WgISHK*`-rP(1diSodVxwMp?zycD|>3X{h0+F1Avc5*84kY{S zZI8N6(;kW_DJk6(8%&r94Gr~rh{i=;p^D*Uc8j_^G5FALxlXeq@HbofE5^RV3fH@L zFmbl)&CkLfTm7|%VmZ^vd_I>tNClpt|D#UWrQW)m(fP*+#sv`X136?L7hIrl2BIeT zu8O(bBXvpvw-m{vQqT!3%)GY3F8=2uenX@|Slik%^6QCHNI6aX0)DZZa}DFVLlyCk zAqxXi1W_3&U+P#G0rR+|P<|doyQ>|#MN!jGoM{B56sNOnw(5Lh*VYggJ1JXi=$L)D zW_ed*6qSF^15C~Su{2@L z{p0%i)Vp1A&b$Qbx--e1Rx7p#88WQ5pIx&eBh9Y=e=fi~De-s=SMEm!gb`_!*hmpM_O9}aC;%8UF=wDqB!KSLqM>I{-56>N<9%S0w zgkFHa5>5};k3m+8`Ju@=)oHAlM={D1S#TER?smudBvQO@C7T{aQ5umFb?0n**U4Uw zEIutw5FLuk`_%N@)Rm)on&~W^9Q~PZ>nz`YneZH*bum&|gA< zb)E%n=kD{?(jgF6e?FpnQy}5#{5%k2lsW1qD$fn_&Q@0IdR) zZS}L$Z%QZLX!Je&`F|_t){dbf>9&bO_h$uyc!vVwk>RIHjr@*VP)y=Y`B|f*x!i)EK| z=6lg(i0?BE+NJAV_l8BVl2UdNbbBXjT#hneuT4aDD*8Us#h+^dmloI|HE_Hf?{|2Oz7< z@@6K9sBAXwV`JA8)(Sz3lRU=!(MTI*_C_Ivk&39;if|H9F23sHzpwB~@R(s9w=qlS zE%%pWoVMJ0!~kO8E2Dkv)-t&;`s7Z?h$xEMxtRGp-s{>y`V`_8QJITTZmO?zZP67% zL0F5(OA zG;+Q>oFtQBgkI6NN{qP@w&zy(Avat&q zY{W3ixP^d;yP}KB``}_lrM9`q#~Mc#-?!G<^wdhHUk!G%JV75w7q#vq(N4wA2)|uD z9;kjk|MQuNd$(j1-lljchGLu~@#Dewp_&|52^;v5CkW0#MsREa@?bxy-4O7{z@#h= z>Yb|=D22fMPewmc3~^&p05&BsS-uj3%wRyofH&6tg?*%7cz3J9ZntLJ>Pifo34IX924l)gLQ>zv5g#e8Sd}#(sGU-2(L>ADS1U7r4${c0I&w*e`RR|HN*T&S*mNctTpL z3S-;wiS`qT!bb;gBL$(J#WWvM!p!~cHc%9dB|SbY;(2ZCgD?J{#Wp&S48fXqY@h_X zI$ZD%s0!eMC`1?4PhEpc*@NNp1)*L(?BF`8Q|7>_F$-T&R4HVS#`Vk7omn@drKn38?Rrd@-blQ;xpGoqZu$`&#B^La2*q#;N#d;mX zTsq4t>=@Xtxh;kn;HMnb6ZN?1nzTdhD7g^?l}jflFGyZGG#J0Dsv38>l=D&DQ_~^Y z10M(4TF$OzH*-%2*e6qK9EdbsYz8 zcX?w4Wd$brZ1x5e=Ra7bN+aV*;O2DXs;=-7Xj5q7_o|6=Zj6Dix;E8Xwc@|FBir!& zoOiI|YRY4-D`7@kYF1UETLH4J$7fGxT?<<1CZmE*&s}sA%V9$+>wur5qHVPHJVX#yQ3q!#S zl}-dRLQWnYDZ`Qv<(jQ#z2FdmB>qSAA&Jce&$S=z^{;0((JM)d1-qZ{7C#ACJW;_f zP(w-6L7Sb6lFjCBengSc9BnAu9yOwIk@f6;I)}vmPNvB1tCpah&bE`YtD05Yx|qsJ zF2-7XRAjB%zN33kAu6+^!90{e!F_2F!W#S~>E>OI`y3}fSM4kXeZ5jj_mk?Od*?`e z72!ZUl0XW_e*Cw)R@!O<V@9axxwWf+_Z^Std)iq+ zNBs%9=rK0@$c)5EOl|a(X5?;LtnGQMmo@mWX#y}Rw4};v&X%sGf^b?lubOsRfI|%W zeT-sPVE#|f&-?2mc{R>`0p|_naUx)Jf^J06hz=u96C>zi^_2R6#ACl}dSO99Fb55B zvHtjKeOo^L{QMkBVMH+4!Pr{oxhN*E4W2x@9~RVCP(1nUUb*()Fs+i_#|LUY7Syhr z<8!;|vB|WdhMbXUX~b-LC7>$Z-{+&o>wTdls9ZHACr+y*PD_XR3LXrwVE1YLk-{k| z+339|WfPR}nxOUANrw$TCUat??ZYL}_3+hQx3B9mYw)`qDUd1|vrq1v90aUEULAg$ z04{;b{ja}ELv2gn=ga%yL=pvT=~3YioGeVPng5IgqD8homplQpHP@q;oKUXIp=JyO z?sH*P<{8Q5geRVBE+q@NWOgen7iK$#jt`3B=J z)lb9+YvBe$r3lxZg_fNUd?#K1ZJfTg5bfoGsg?h@U8fi|%N zuFd4G!^ZB^h1w@xO*0fbM6wOxM9CrpWRlQhH*6J17sV4K%wSv{KJNM%;J!2ED3~J* zS?kkPKt6^Cx67q*@%)fIYrG)LCq8sp|3ldIY0%K}g7>P-H63;YU!Xn*de9*m>BV`_ zR=A8*D9cumcdQO}-hzwJM|9>tPH+&%EgJx;-eeDjvc)b5<1GfBZ>K#gqE@`y6!%B!l2SGw9-qG$gANvc zr)txWFR{Pg5mf(EZt!*)=7y#B;=qRjO#GGOi(J&+PIOLAlFqDx-qH%p6~=n+X`UsJ zfVK>(gI@9C-c2*cfg1|~;BLdyb^3&VzqQSSDC*^7R{lClFuLwwSCvTBn zbgpzXvassw*)E^oJSnlyTN4)+9tq?~dD|`d(n20f$9Ac!TH~AoCn<Fe*bFJXVBmT8l&%Di^q3(0S~??y*7zO3KZX?MNL zdh+NH^_S-5>|(h(_vWGuZCiEtUL`y4Z4pDA*F_#DCi+Q1QJP#5uoP@5A|pB)@YL4G zc!z>;Hu5zJAuCQ(ODjd4MFlt4f*e3;=)^}?CX@;nTvlOdg~BUJc965{UKMkFPB-Y& zxFFrAX7#b8$M$b$X%@ktHpW!1tydA2=B+LPfG@@=mFVs=@eHzctZ}^HJRF?F2=Xtic;WP};9R?ui)}tm}uT zVi$Vbm%;qZHv2|TPTgJ&m3)!RV=<*J=}}w7z8W~Y^_fq;M<**xCxN(cn7S36%Ib6lQyB!96a1VEyjWMJLH0yu;3&SPOwAMY%t-Mi7D z6JW+a5lY=y)2j&Yc8CE?a{oQbQ`}eQ;6kRvF*p?WryTqk_0-PTl4fj@n@^Uc z!3>M5`S_*dG%ZHJ5S~U?yvGs&-|b>4N=ikX)&W#AVrlI*?9J$-WT;9{WXULWqM&u}XgwQ`N zyZKntc%|iu9?da#M^HLiMr|~n@d`a(x-0SYJFbTT-jku#XZP}1;yE#LjN^PODYl*i z_ZWYQO*fV4X7lh6A;FF)x<`_@3f2G}2jb3xbCo06*5#3x-bn66`>ppK~?JzkqmRACQm(|7J^lg_Sj zXebKsbA%Ic`fj(_e_)y~%;H=pB1d21vN@p^QRWL<_=((H{CvLaIUg@>HKAyT;z9%y zKikx1GS}QFk*&$s0e9T^=cIv2=xPi!q+z1*eD9J+Hfvg1)ViPRON)p=y=~1$Q9AyM zXPzCY-Ch8E9RO36dD{vZYjQm*Vi6_Y)G?Z*8Y>y9_d(%^qA=az}Ri*Gg zvTp;K#)R)eufH8Wd5TeIeW#o8>v|UZKS)0%-i}TyK9mZ0`0ba#(ebfL>q`JFVU+Yj z$xE}zv)+5p}Zv zE9MYOAZD(AZHMlws-T=C1GVPWl_X^X9a#xX((c~9OFTo^I=9W3tkF1p-fk%(m<|c437KYRbe-3CEB~((U&e!Y28OhkbrnW)_V&b1tO$!H8-c<>!dO< zr1b*~ifeih;yGqTPjG|XsFsB?sX)<4fQkf9-?n$o{KG_?P`9cbtif6oOSN^+R-Xdd zrkmcN#*nEoZp9o8ILR=(h3oBvXo@HL`toaow?4;zX?!nUAg0OGI5+tkK zalcyL!QCghy|A@(Bdz+luxN)+eAY06&IAU-%UsC5se!;d2_u<2&!n9&r}z z+PTr$e(St2NmXWYd-_yw{ z5bAI}GSOy9fcJ|}Cs}A9_N*}gyC!JB&Dy93+U)+%=^F~{$Lkz~&}--B=QC0!r1pY( z&k(XmR-->N%2v@Og1uSv;f)Tk)8|X2p>FDl|#=&$5s*&WjEt|et_3rf8 z_S)+jk3Y4CADL8OACTKjzq)rUW_)z5?_yk;IZUI43#Av7TW~FTWDP)n3zv^LUZzcq zTv^w0A@Tz2jouv2r=z1I`awR(+MV4NgvQCf2rFV=8u|goVs-F*GZHSlc?;CkxB}?+ zC=(1HJt{+{9ngL`#NuwjpEG1dJ7nEe%L&gX>{@WE9UEr53myW*NsZS9HV&}(;E9C7 zPwHY9B{MVA{-7SCw5@68fuH9<*VwkV4kszFbK$^_>Jhqm89WT1{HQN{t$2HIeDU1^ z30-b(Zn9!k`>FAlo#Q(s*kj~-FJQO`8_rrC+qepNNsf&X_B*hjBOGOSKSC>e0mjKU z%T}D0^|a2hA=a@08*W77oQ8)_`XH2Ca5k4FlOSM)z~rGvh;1MPMsSSt+!?9>-1Kc8 z$m^R{=mQZ3o(0tMaV+>os@KExoP#T{RKZY?jvf;kT1q%kd71VxF?LKsXTl{NPI5lo@Yc`?CU@A5Jreb5G;J9~jxf5{}66vW&O zw=^OJUJzUnvPfh0>CXC24V02WSMk6y1ZPbZ!dQ$oW*_P@m48S zCj%JPw(c~}^D&_$d-1^4oK0tApv=aDYECiwH~KFBLA9|TNjQ$r>F&nN_R71vfBN~; zXU1J675y*1XUwO&jZdgyPIgMghl`T9`dRpu!Q20g_#=!fuT~7Nw@igTTpdqdH~zZz zV?S1@3`$K9OU1cfkic zx<%UL_UIN3#xM`GFWSOg^=>JGR;{is4E8ruZVVZM>ZT@@V|0=M6m!08UNAO-4gof4 z?-mW5=2y7CB~_YmF1eZ0xG{54VZsd$Lh!-+>hXP{y18wigN~P_cm(Mp2s;FM0ccIQ$q~^sYNe$+AW2$f}(A?^Eb7 zbV%UzfZhOo9}VP9kOuKrj1`f%svH=?_XvK*pY81;Q|>e?IM!iz0V75$>X~r`7%amM z4{~084hFb$k*{0L@MGkW;Q|&7NJcfw)69~%wX3FT>gwb?;y@hh>q|kKWcT$>$vkSL z1r(3qy2lY|?z$ z-TnPo?xJ(Ev!PHfL9mAWa7OG~xV5sd1K^O^j1$FuS@LcH->(YuD_XX^GxEqLeR-8U zHaj}l3g;FTnPe!NtU$>kcG8vmOvhwmt^xZST^tJyO-^!tqT8k7FmbVDg0}@ zuTBuyThOprlwfOJcLjo2HoGMSp@uRx*^wxUasRf0EfKKD) z z97sS+x>{_N-3QR5L{GD|Mn*IMqnf;%taz4d(Bt6nJ@xcA7gC?irp6-My~E7O>I{D&kLZe%Nyi*h`B*&{2brilj{NjdE3d}nkMX9lBmFr zOX}W%i8To5m6a!O*lS-tun_gP77s*c?;rP4e;R52yF&ncO5Atx{5hH#JA}VR&e)*( zeXH};TKuxue-=3t}M zoc9Hmr6MbGF4|L_){iDtmv$WoD6z^5B`@*)R_nl_8a4W*qXWq?ZPQVb^>R z>-oa5kj|L{eJCGaX)U+Lg!S3+_Ji&#e*m`jpdco2LxS9GEpr9NdO!O@BVM;?Y#l0} z@1?gY3L8DpW_MSd`AIjWvfa}&nHgUu?*EVpag_ ztFA`qQq>+fx>uFWB6=CHngC80ZfOzdviu@FDuP9K&J2AjY|eLX=Fg!`0BQj~WOp2M zy49%r!6rYqtW0}Nhzw>`Q0p3wZbvZ1Y`@S8U=s}V#F}#6{chMx%zp7Aly43X z4m5%*?n2Y7ZbL_9#-X$0_WULeV>Sh?m+3?IIPt~qdFB_U$hLz$Xe*8l!jYtm46l$5 z*iHNr+<}U1Gsroj1CRrM2r~;yXpAg5Cbi0OO#Qvpc*=0fYwTxo)l==EtSNs9gI}rjIparTLU8s})y9#Y@3O&x5p4 z0Y#SU9?CzS$&{@Z{A6EH|BN&SG#o1O;`#IL#n)C_hL2f_$8H-*C-C*Z&(CCT9*_dj zE6D7BD_0|xTT!*BXYI)rG|D(e$Ho#yAHbKNi!xYjiM;BdV6ZHVfFkTwD=_@M7oNo< zOn%X4B7z%%x=_O6IO&iOWy1TS2GaBdA`uEHz02h}EU&mMkEx`z_TfrAz&w>gBNY@B zh_Wc%FUtohvhBlx8l0uK*GbaBj5Ush9MXyJ&PAZT;pXJ2dA7_u{6;NI>21zOtsfFK z!w&m6aWCM@&Pjdd0`?#k_tp6hBuUUMKKO#nfuABBlzz=9U)i^O`Jp8n>O97;wAbGK z`m*B%zPiuP{eXuM{GO_@NhT()dddOy#>XCD+&`K+)c?%D(g7z(l%Dbf$9qPMe6k3aH|MGTP|GF;q<|&M7gN5X}=E&4q7_8x%Z87tM@IO*mE1xvgz~_3@L}C2cC%shQ@4vGhdD=` zh2z+CdYRv2s>@c}*t=77R07+^?!i)oDVt*KKBNHP64&*$fDsKbGTmjZ=r9Dy0E-W;(_q` zQy$x*!1~8!c+`nRt~tEQ&#gI}&RtsUIw(nt5ZYKtmQzrm7C4p#9%De~Il|4q?E*M} z_!Apb{a^oNwJt7AbE&554Vl+=P3{xof z9N;e>E$W^#gI>YF^=tf0S)FX>che2j$=I_I`$|jgscYoWH zs;-3s8!-B-rvISi$ASRq2q512KVVfPrKH&G-fwQ+Q(W197#f7+YBgR{l(f<*E-$W& zwzjtKQb9wQJ2^3J^)`I~)X9YTdv=l!bV&D*94$oEA9J8aMhQIl>ldR;3ue7^KP#Ml zr3=JbRwnnbE!RNMz|b(Mcj5qw3bb~x*XE5nNQIS6vFM{j!R7WKd3-As%nkJvd3WyH zk(b#nfFzI$m*TXku2q~Vc|D7;vCh8VyAFh^J)CE5nR}&s#7EQ|L-bJdJ}gde7_Jx} zAOAE$BN@!2SdW6hKyWLzbz+OebW#vSwU}~xTkC2slhIp;q#mP7d&iOJA8dUDAMIAm zu|g77G}=z>L#~nfQU3@v@0VpJF*LApO79naV7g1iGbyaKgAuPF2u2}tlx z4ya%5e+8KXdHc4|1f=8Dp^5<4;mwD@!Gq~TD0q>GAd(T=E=C@zNQ^|d zFErvCeJpy(MS9QEwkudUg4BW4{mU*0*cwJqRBqT_xE> z{BO>MhtrM!WJMtT0yT??+n>BV{c{>Q3-mWpPt7eRom#^~;D7wOYwA@f1A4+AghI8v zET+M}Ti}O`cC4BfgT9hfCpI`BVYsA(Q)1kqrPzRut4Hzn!6koWHDCxqG(xum$Ykx+ zwdWv8*@M89hRMjS8tdIDmsvinkSf>!luZC_l@wsZ%{wB~SG%MCF?dv+cc}$e!pgx= zj~|9>nPM2obolV)e*kfQ9BQ-{9|WhMFTYqdhRR1Jh0OCtNtzBR@2+424vm5!Gfxf3 zDnu_<)uZgVu>lF>$Lyf$Kw4(U#5NlBw9s=eR5V4NQ4hCwt0}1$bu`hgZekEfeu_{C zN)Y%2p&LOKVFslq=pA61ivGi{340d~XDelQ@Nm#VY-ZTNEde(!02ZQBz(OkZ?wY~{ z4v(deP3xxkS>2tZ-Q9sA-~KzIY|sF?+w5nXeE)*6B#Pny$EW9B@HL07PKQb;*uS8V z-)WFc3QNpqFceVykclE5a0P3t_ucM}iTPcJ+;8K~KA-lhSOjN@GCZJ~8xAr2x%iwy zfvaO1h*^{h&P97)`JF)C{9C(rT60G=>`QFfl{BiXkP1o^R7zz(t6Lb6(iy41jP2m% z0|WBr&6_?uNs!bs;nfU+4PlNW0v3jRW*Q3g!1>!K9Y&HjHq_gMk1EsRJ?aKje)Y9R^U?jS|4Kf_M#4r6bGz%D70-#o171P>Kp}Q9_Ad}* zpdcxN0V6Q|ywy;JVzhp=s**aS5NT=diSr-@*tV?N(B0T^;~3tDaiI)u*-oUJ6 zMxg#Zb4ZPt8%;?;u9x2dr~niXV6fSV1eyg^sosJoiSA_Clb7vRL%VO|L|-d(E($^| zf~t#Mq-)9<9RAl@(+b!RFhTtt;0yy9I-K5?r9U7-Xm;sRz~?i%1b_Tn8uwUc9V11s zC3Q^^h5o0bpt6RCEn&nF39-Hb``q*A&k^|PK#|?LwHu=Oynd`Ezfc6(vx7g58XZj5 z&uo9CS4E?s9Kl#$X^uIoBTc(;fH?N-!B0%?u`$1NX&WeD6cc}OYUE*>6I4UKg?a*a zhfu=d0?vY->1_;YnwvGY83Yg7eDVQ9%%IEa<8U6k!RGplGl47m)4gZoGS6ggt5RMi zPg#rQelW?RCCdkL1Pjs?{)DPuHEfP+Y7l4r^0IbX@+&rY`qFPf1jo$%@H(ZP;4J#p zS#H~LY=fqa1+2UK0zh1cFQ`_qb=WC^)ru4gbZnAGS!pPJ6tSYD^+)F15S%voY9x%R z-s~BWq=l&)A{kx~@1ijr3_?-hu@kJL&fYimJNPy$5Fo`8|VKaAzIZAFO^m)+VcP$;ZE1GFOQ!u6^6ac;m0}hX-~{ zY^kw_{R-$2NDq1m?gdDxJ4`j4fN_U_OalW&1qFY27e0o|!!ftEwsz-B6G~@GOCM%F zz3HHzC17&2OE-01$GAm2{ih;;;0gW}cp`phvyFFDJ&0}MBTk`nQSPf(N@WKn&6y&hMRN%PnTP^rriJVng-!RmKJ{PdPk^h|;=3#Qf9T&3opeb@CI=-AxcZQHJBX!)eRv8={J6hYy-@yv}>10C35!bZgqqyjw-z$fjS<@K+4qJ(LuX3*j`=Bq&}QcU^~USOlg`N%k1;zMYx z!!6uS1msQzvXhIED#%SKr4n*7xU(NW9*SLRz-wU+gqIG}aLqaUEm9^su-)RbmvMrs zuD>jkx`T1B7^w=k75LSxQGUjH@1(}2S21%FDl=R`a~hi+P=Yg$GnDQreMeP;j@R4h0o3@c9FZJbWA8 zZB%iiA4W$K#5vE-)dJtFQd{vODk80q(H9X?g?{rjz1=hp46 zUw1uViN6-v{2B%CN)vDrem9oA|39A}zdABLM2HXwxc!yBbfB8C?Y?~dT7eob!+eL2 z0}6IwD9fm^;e2G$mF3nr60|nG^1n>a5SygAZFS3oSF8&*Aj`l;LY$A;rAt0q{R?am zDXIZn1lNuPaAptHcF3-j910ykF`mM_P8Fa4f5!5?xGGHiMIrn(lr1$7O% z|1W(OAU01xVZhLuK|ASq6zk?LCTx5O7OYz_Hv$P?Y(b5U4U?C#0Q+%Rh8@^IxeYtG z^*shCRX;?Aa~Gre)cKvYcw5PLo}KX7k4{N>5h#M!A6m3PxvfSLeaC)P=2$}^TAv6-V?#j1J ztEW=nN?=tL-9z)DaneO9xtb?W`8L@@K4DTsP32`VLNg>vU|Cr{a@y+G4e0E_Rhw76 zRIx#j@v(qK7~dVd`x0RbY_Nssc4QUMh7fJ@I%SUd!$wh?42KqO%bQkd(ewJ;A!Vj( zwXJ$8r}Z)o9%v zjuWo0tuTJc=U-G0(|K{m{|Ser@O_*oq;b4Qy6I9$^nda(^t|5mk6W!0Y7ebH|y2D*#gl8nY+`A{}#j z_cKefOm_mt83~=^IKBy#F+qC~WEwJXQO|pL%Lzd)aG5{iSTZJLWDWVR6Cp#Td zJ#(PPz65F(p54o^% zDn<*NLDv0`{8bLHW2h>h-3cQn6f2?zZN6rY+W)-_sxpVYfBQtXDY@dXfq;9Ea?|L4 zWi7lt$+wA0v1Sl($>zb&#azLYK2s7GzuT0`&8qBrm8ZPU{b=JH)S%9V;sl0|ptWG~ z*)WVDhM@fn-%9VFZs-z-{daID*IjN}Weac`eow*%B~L5a=5?lxdl>Vg@@x3n#b_j8 zw$JbpTmx4Qykko?5$s&oTTC$8R(TkKzDfjdA18(0MZKP@{VEgcn|E$~9`^S3L+kh( zPbu0_YJ&S> zn?SrkFV?LLibLj7W_4#Ygab{?p}K&BS5RIP=W!rvp3%@HWAKy)8Ia zlMgQTHmh4laQz0#6IfI9l@@D_Mq~>itaY4>xF&*92wez1ir4~(GZxvs*5dZ=?ho49 z^pK9^xqe){bz40QztIj?{pIW>Z@yp(pp?+~%}>-2p#Zo6i)=LaaCOGZb1#eykCoeZ z-+6+0l)>+1RQ!yyYwGK%oSmJ?$OsVxBji3sOY87?L$SwWdgvIl;Z1I{5@xJG7V2DR zQ@O)fe*KowB}u9Zt3XDTd0PFc;7}3TL)2UEXm! zEhg!9lBX}tIW^JqIt=@LMA=Z<5|IP|0KvqI3#}DZW+JFuDZCY+@MTcZ9{h+)N#@kt=MH<7UXS;&*uI6{mh9|C2 z{6)x59k0WDh}{%UBi~3BK$=Y>X+;G*J8hqjR8ckja-(?=6xWTSo@+fqn;wq7KKJ5$ zkcs_k{dM#8>(ie}FJ!|<=K;=UV27Z?MTkv+hxyfpd8=uS#2=|9g;VgOhBb8t*B z1V9G{Y~fX}n4T6ws>Zv2e_V#javXgzFf|}dVc$R=ORnbTfdF>#_U+s6j(!6cwY1z~ zmFETqxlvjpIdrffBhcm4P6&&Q;ZWB?)hyCR)xkjq1?~7t>m+wtD~9pn1>pk;3JJ+B zjxcE}D|JrHW4mLoZ)IPcPpNu@0EufOg7{C9BK+?LkhbZ@!LHl9mHj%|=oa|;DbHj& zX{Mye5L|2kX>TYFBOEw5a}JG2+L)R6Hc{6mh>)ssu>ti3d^GtstA~M(t2>D6`~LEZ zAy40@gI9#JB}S9>lO4IfjCzb_MBFVddNR8N^Rwf8;EvxN#ka@7q?6o(><08n%&xEy zEeFc+m_Cj&1CC)>IzU_yn;wd9fv<85F-s05k=g(bCiS&z*M7x4rN@&6ki9c^&J+ap z2m{bg(P=?u!bGby2cj-EHdgy)cGCB~;0^aRh~gOiSel>kZ&~=A{o=~%Skn{k`U6{; zbWfAQk(H3Co@Ooq)AB#XePI>AeCT&0zxz&~%6e%_B<_nYpy5|u4ddP67l8XDP{E*D zJ0Q#TdCIxY>H~(CpjYHiA&YWEL|tmH;ZGqmbyRiexjM{RtL*#I5#hFAu13h9UC$Bnt5i@4 zWN=uhYG8;Nq4wq<{dMfZw_n9GEXKx+(6xn^t79sSH0~$K%m~d4@|pdkXz=qtFF-?J zjb!k$*$Y@DP)cHfwnnR$Y@#YGsOH!5yP!c~AwvEw5~&3CGJq(DzZRGon4E01V;H+h zjaPJ}RhQJ}3vbKptO$MxUwD%Ldj^=B2=Az~v&v(7Tugy6CORas*4eG~zkv1_bWgL? zFV8WKs>e3nm$3atQx(`XCGPCvV(;vHzq(pkk|Wrj&Qb7JAZg}n_vO=LwgP%E;EA^; zow9^zBPOpLF$x0XhIEjt%$ko~GgwDLWp{Q{Bo)%?GG6iS*_LJ?2y0)+kP{g?K0zdF zUzodEKa?an;!|mg84Gu%O3!3Mc>;=NMU{G2zE8`o8Pq$-#CwmaK+JY{)Ng5u7$YqI z>20B3LHTdJdLZIUjMqnN`72i0r!(NQs&%_08uQ&{{Sn@We&#;_->|{q%~E)m+tUS# z_T!)2mwx$ws&*?e2BY}EO+P|Cxoxa(Xo%w7;*tgWt2b0~m;L`k^KZJQ2%bjcMa8q( z7+SK^JBthS#6k-o575IQL!d{4W-ZUVRF}vcjyaSvMzxM-I!0 z`p*3uA^IR`K#({z$VHB|X&fHvy zkq~TLJ8qnhAf#R~eDHRgq%^M>7 z54-jVz<*?ww|Sbb{^-Q_@089(@qTW$;r9|DpigvU+dDXT!MQ+&XM;izRBv>_wY`=r zzo><614sc%`kl9TkKF8B|C8op1D57MQ&%!x^y!SP6p!l7!3g05=NjOcw~pOV3)41~ z+wOG-W(@qm|Ft2kXtu>xe9f2*SA$tF5C#w7ua=^vh>|;$n_FF~dk1TUbOM~-mdlea#3G@ytWTC;%;SnTJ%qBYUw!^J1Qa~TNuq|${0B9x)}&Kz z$3$pLn_2FMg0>w%hT1fQc&RCb;uQRG`NfA6XCl3R1N{zYO3BH|wfAu1=WZ8(&WBF` zg$;R>TPqZ*cu>SBiYS8@pU)qYlcmsD$Sb;W9hqXbbp{Z9PPRErB_%W~k~0QQR&F!6 zz4XEl4@la`>w|P8`gG8(BNSEl_IZ!ZuBiHSE-H9iQ5nOV*lEoSAO*htr69aqyV65Z zA>XAb{8!AM1dkHjk-#4Wd&5mHl8 zQBhf@UayHR^(R>ES8eBIU}{y0JiA>;_*)r&y(5J}!Bp3h7fNx^oJiELZFfu%;}<0) z7JTIO3bSR>y7%BL+H<_g&nL*lmQlhx2KVE~c?KVc6OzH+Xq|v*9**(U(@E7HE>GL9 z_9Gm@gv+5fAZVQJ0(2sCbm`bwTk_N8N_(RGf+(kcMs|PyCa}oH#@JPar#)s6N%~u< z2Q_+l2|8YBV1wM<^iH2;6z_0A+%U7f^p6YdnV70HCj$=R#exH2n6_CmKU88oQ|Cv5 z8n)BFN`BXwKAE+KIT_r*mcF#4T)21DZ3USL5w7|_U~91; z3&8v(wwpqJ`~rR*lGlpo`n#plwlUD5G%~7)*>Ix28=UinYk>5#hff04SgObFYAy!-ytT`|_Nf2`|r!ohIW=*sSrBO7;e?`56 zg}wj?h~-0T++k3=knnCu@8~N&83Ug2+>4NNq)%60*M31``HSpu6fr+YW_5vH>H?4A zJRzzD<{K<3(R3ZhDB^c61C;M2TqxIj6`=( z5}LJ@q0x+w3&h_hh0r#<1eS0S_)?;2Ej5|zpvQ4UHCHtfCLT;f7mG@w6j;7+I9pmA z|1ay$BO|f6m~Zyy@JYgG=f(Bp+=~Gm6W6ts#c=b20S*EvJWYkP4MgWc1dCJ zU=Ze#RA{b1;RkCwdsnLazT~G5w(2s%{VCQbiwYddCly+G-iPWYaR0|C_EDd$!*2P1 zym$as=vX$(mEk-}c0Y5=663N^1Y&)Gf%^2g z?4R%qA!!affD?x>Uyj5~z-unF0iXug%u-t1 zLnE;$m59+qDs}xh@pJ-m9Z*OOYWDwGpx7P5bgrHPJzl)yM5Y>Jk>w-HE2E)o-o!>8 zgXHu-%Noi9&Ja2#J>y9Oi5Cz&yZKn)AVLELx}G=M9k;%n+3qEOPx;-Vneukem?o0k7u^#gZ~Z7%@a5CfuvkxFSNXmXj-vH75Y{po?&^r*VYMkiwMnP+J)--C4nd>$6) zB=Bi)inNTX+h2fL!0e~z*#^Ut6bpg;dKrwU_VK&b<<_hBp9)NF?6~O`np`bY$^#AN+XP$r89X<4{`cciG zn@dSYO4Guv-9!0_+j%A3V*3=IiHodO&jwQ+H2rf)3z4^rTut1v9Na&mCxz&qBD5d8 zT^MLV)UK>g#$R&e?tJw6>_Ewa%Ff!%r*GTakFU#_S=m$-yV$rGx^3ScWB<1@-p)L`ubI3R`whihkYH>%Wv!a@bvM3bwkY=PBYPyzvwz!E~7L&=HS z0?7qqtnkcz{Fr)`jcqsQ2`5LGA9F}a?SKDT6afIJOiD{=!uBzjU$wa;pIC-#!}EPL zo^AV_+Hfzg}5XDu#D747j?f(=5nnt>s&zPfr#rX#p3{mt_9j!I>{HJzQE zwdblP=Fu1sC}!3|SQp^G#-4=*4L;L9X!W|3mT-ceLVV_Rr!{rVUiX9V&xqG=x<3A? z#Py+H7}p3LDoCia_Z0VmbH-&glwR+uBH*1uoIu+m^*_9lf;-7=w&)|0;G=`m& ztZp65?ytlw?q6lkfhz>C{`QU`df|l}o5lr_KV;|@q5#5jv68j!cU6k z$rw$bG{8Ie^|d`<$iM;~3GD_phc~Spgw!rM&{9A zN`Tma4fM~_{6Q$C_zmCYQW&a=cmio|4|5y};67*|6xCopO2bhDZ=XDPA0SW0Y6jhr zi-!w3HZ4i1g;goVhY#&b8or=AB6*ju#vTVvvyWen&sL6q+bNjw2|*fwABu?=S09cX zTmY$AofNY)Fd0!7U&=$>+kb`bO4=3i*n)xr*0IA`r!#UOLH;x9;6=9PoGivl6X70* zYvAb4o;{16DR7j?cx{{?^|9ywtSlY@ltErZOASsn8nA?-%$p+uhc1(-Bkp!G>INj& z#_a)>@#W}Upl9?n!efNCMst|zsq5@K>Yfhrw1Lmbah&RrCWdoeJgg={ZzkwK<8YYu zf!KX6W7Wj;T3OmBg`y0iFX7%#?)KcGCA zIB38xF_CW|_}p+knQ9ht2)qeD=0>&2@?T4=&+c8%%}I=Mc7X>#DuV14*2;Q zrWy$yi8=zh2xpW(#E;8w6zz%juCBG?X#l?MdrQ4gapR*PK?5%4MG9K7aGGuIAcu*u@(!&Y17g$nRSHSCOUAzyl9vO0m=$ zksV_W?}fQ!mnppiumytx;HoZIco7E&RUuh^e4KZAUxex}Pgr&!yI!9 z7rpMI_Z6N1&?F#h!Dr`;HgxTzn3bp;;7S-(S6U=n_1xRh(b4CY@PbJy7_$LS@a{}{ zy;sC(X;t=oW|LxNlyb%BT>sM2<3b^!BEOw~mj8^--$Y}8y@yATR{CaL#!#(v0Bbw~ zd`)IWO@3kzcb4Hl2d9P{5Kukv#jOm8e#X4yRGu1xU)FE9hecH7?q^u3-|X&6UT(2 z)FKovOg_R+!{!A1frXKX+dC`CHG&6oUcXlMVmA{+#7EGZ{0&&$q(^C{g^C{EVk1uPg%{ux2C>yP5myJJ;a?%5)CDMrs-{L_EGL*>+(rDIWwxX_v-Vne0v!U z@%mPIk>w#tZ(|1-9dKaS4B(=rj%j&$mdSB9GAf7q zAKI^O)-k*c%VSE1uZivH!OeU#5kl%av$C@6z+TOW7~a{wa=}7MuvVYMNN0n3ahJn4 zj~Aw)BROp&Ki+5`58?W@yYP>Acpc{JJ~0w%>F&1riZp}o70i(iNej{*sq;i5O=Xto zucA0Xd=L~PFce5pMQf&Ap}WQh*CWbokef=HQj?lvuwVd2ml(@U^_Q}{t>Ml$G``&4 zf$C}4A?D~+whl6_^tN1;LxDS^_ECDd3I%c}!`uKWWzl^tLG9bc!?-j64@zr3PN|Uv z5iCr0z-G9Ep`aP4Yj^mbl#_PVZb$8Dh_$2M&(>uq7rtatO* z7pQ*hN+)49f3pNgXGlw(KKmX(&0Y@XGqiyM!`!ZJ7lhS!7Rf=yDtIv!=C}s@IlcQ5 zL^^PS;3$x%(YCAAe6n_Uct5)M?{s-sy0}Csu~d13KRnaLMo9sVDqV)#iz^|ycV-aH z*H2ZxVf@RjTd@NMWth-Wg?TS%<`+h2H4uFN*jAIeGiXo2^=O6OnFcO~;hpHd;X7xo zPG5E7A+-gH89SavJ{eCSY52~cV(tKL9G+b&-{!vScnqH z0d*o`7i?o+dV3R>m3Al;OKkPt1S|%OV@eyj=$_C-haVsv4|CUj#73BOkq|nq*M=87 z8!on+lb>3&UtHlL5D6;{m-@%NH!)&Am+Q^r_P_TRwzSyRY~K}J+cLCwaFS*u?0@XNV5J#5t49cNRn9cedNaF9f1>805yxY6{9sA1< zYufZxqDLk@1t}{SRew4Ry>~$qccg~pkVx>L!Jwi5`+nofA1g?+p%?pO;247O@WIdm zW{zP`linz6#sl3T5Gp1ee!~aBJ@4q(p6*mA4u@GWRRg?`!p6)u3lT>tZ5S6+tD-0r ziaGJ4+pe+|8bifHen>LT4jIaX>Bli}i_Pd;(8pNLMIO`RQQ+JF4`&B!=*Zqda9R5^ zNO$${TV8aB1B4*mljRpy5-m1D0j>|x`JOPkX(c|2htlj##zrTG>A)qNe~2Cz4@(Y* z9@>gS3d;|g3cPvMq0U##l&#CYKG$xlN9ueK;3~_TY@`TlIenn7AZNs}lo1ChKD)r0 zL8!KH=iq4SO}YPo^u`VsW~fjE>T7?2^Dmgu#rYMH+ailsU6az41%CI$^~FSDvv0Un zCt=xuHqeQ|A3d?WpmWJ?2hv|s{=pNHjq(ckD5y!5rvk0q}fC&eH1@jpYEk>-4cj7{4_n#$75e{vU4u$U7 zi=1}Lx8E2D5`m!5Xfo~;Jw@&$&1lgGv`}ktH2z^c!*n$n3?$$H)!L4Ex$dZRivfiQ zC6H@D-HbVO&jAo#aC?23i^F38s&5&+w*F?Gx91*N2{EAwZbUw;UbAA4k(y(eP{}P?gUg5Szd{I(FzgekSyu_NxE| zsIbsFN4#PE_uMV&ksAA}HH^!@vS$XYK|M$b6Z-JL-l6m)Ra5&qbEsb-d%kN${iyJ}|iw z`W|p09tnN`!am#!O*i^qVrzjb@$bC}~S81bGs;4dTLam9<5p0W>O zPGh-IdK+O#6!wfaO-dE4h?v=(KusqR#GWunYrFh-bVrD}>o<27&JxN~nVh?VOW$8f zaFq({#b8iqqX>L9O;663)T7v=seRhkzc z8yWR8+&*v?skm!!ZV_n72M-N1b3V$e3Q2;7(BtTzVCY2k#D)Pp$3G`_riA^{{M1pA$-^$3e*Zeh@ZV-B`8sL7B+&Xz@~q$o&o zKzvg~L%zKVGsPyWfSQ8xM%Mj)=+bddP5K5+ z_>Z6(HzaPp1N|6C|0uTy5Ap{*WJDtvd_5bz)Zd(FelBmm(=eRO?swKsxPq5uihM|^ z@L6r|L4VSAGs1FaaQ^%Wd=b9zO)YcJf1uEQf?9igJfP52_wX^u+*VUmdm&+D6N(2`{gl?6376_Hbn%DPSLGF!ma2dsTv}SH z?LNXBC=%+xMgJ%DX`3kbF-BW!Yr=sYUYA357D5>o+$x7zp&%wsROPi_twzFXj*Hr_ z4jW8$;_Ws6`T6-6r__jk$>2gh98jc70OCiiQ}Z`@Y+PU39gJ-PO#?%esk!;)@{4x$ ziTAjeH!uFdX9z}3iM$Q$_qoMokNI&%QwMkJ*I*Y|pH`5EGY=5==pLWV_(0G(Yw{Ig^pT``tf;X^-_HQ8aX zMRA9t1vG~lTR=9jOdt}4*WDuqT(xnI=!fcPETZ9F_5*!{!)+gve)$ONME8*TFZz}CwaWNB>FWOYG z@Nl3Rn&s9?zvJ7v9c1PBvn7g3T2_aJvZC7U{V2md%UYDeU4)ZKiWs+A*jBqGwvr`M zqdMS3jX&>jS03Xh9_DR^AI=Iy8gRcd&PFF1S-wIs+#kcb&8RLO7wVz=<%dj*bfZ(z z1r#wrwNOG(VH7g8xU_NTB;2#@ z?Mx_QaRJ6b-jafXJEQ=8K~4Hy76yHS0o-6Wz~aT8q&xOLAu$ny!BF%{0A&M-I8YyPRlk=NQAkjKHL<%ZTuXux2QVw5yQa zQKmt^_;tPaT2;>6_&aH>Dw&Deng~;ov^drXpGSjl*qD>$F2(j=AN{9FcE?baP@zug z9@MKq?4Ta7*VmWJ){hO4k#%#1fA2oV>E?O<#hFkwUV}MYfw$Yp$f$2=iRe1ND}OPq zis$9|@Y5M9!v#Jv`NE7;bj$!&SAirDl(GAljxzvp!wh~zkGmfG8kN4a_^s^D48^1; z(X_K^*j?D`bZ)j*JVR;Bp{mCCyS*2M%PJR+ zc3=d2S@_jfW^4A&I1rqK#{!rd@z|-RUPlHu(3c7W)k;FHG5Os4ytq6uHW`o(qctjx z>V__H=jcgOG**B3D6nXm_$qj`+!-})?JVJ8c= zQ4J9-lDe{7l^`-0^%wX2PftZK|^#T8ggaWSA zW$M8Z^#>|E7`7~de{Xc*0@4l8%gW+tBEBD-0g1oq6NAv-1PYVjD21W`Vq;uSf-FBk z+xNNTHTp@|gS4(xQREiXZgHv%&P7F3$czGUXOhFuPos0XGgpL_9g8JMBR=910j%87xZ zi6Q&!^)J7(3y*Wi?eTO!C-iS+qG9kDjmxpy*DP97IZRkfg?dX57Dw39$(>c9r#Pc2 z)7^K4GhPA}$FdD`iNZTE#D1Q#pdxaOKIh&iyt9LUuO9$Kh_4QOhqsOBhb~RfZUJ^p zR&%d>8wQlJ<4utI2=s(T=)mgS8e3Q>{xJvV>Zx0-D?a zu^`Y155Em}z4g~6h-QJj$Fzqs{m@tbs3r7TJ1`Mqe4UiHt0UgDV{CD(BO$h+ZotyJ zu$wH{WqZ$^j2(BG&5>yxZq*#_u^lR1nFljt&W| zg5qMZ4i^int~75VI-O^3ukVKLJU$Lvec;G@Y8VWj=N_`VCA&;)eNF!ZxOCUlEf)$= zegCeRU>Jvx`vc#Yh$BVA$_$YQ&vkctCGr1GE3<~d@t)`;sAQ20Ho0JMBpCS_V~it#-uqnrf=28|6B(Ye*UDb z-%gYF2|>MK4oCocnWsPUy{9xY`dOeu%9#M)ClobN;`{msd_l-UTs!@_;H}0s0pA_Q z%SR6HGHlSOquV&AGf_*!;7N3S=XF{rnBn8%`p3eP9Jm%9f$P_@2h1IzT6vXVDlsC3 z5F0XDdMIWe(HwhE<@GLL*AQ<6rs<$>BfSle8pcdC5}fQ@wSnJ>ikPMalO{y039q+c zcJoI$yrRWGFaZxkI0I8FAtB+|#r7vjMHX}&vaU=^h}bX8E+cf>*30fKrfZ^=6)J@y zI}eYK^B)ksUmYdvmatN=64&1mS{>n%??%lx^$nJkAF%mv+q>6>GWASm485a41V8l= z-~2r;9EfXkU|^hQ)yIk5AcI9%CTnIoONb(oB4EzSdj{Jj^r&MY>Fm<4uV!&5uK;5UR}?1Be3T$QqLYx>b82o(z^DKt z?dUl7ZE&#r07`spv+Aw>{%BRe833aNa8>hO5Ks;V^}pkBivpvK1ONY2V=hNwC(lvs z1Ab#7lcyJTD(MP^1_uVnapx0)6sFMiP}ri)O)x)3BlTJ7#bzkye`W`_T`LAzMvPd| zbE7sB2Tj+ws-2{B5e@w#JE}h6l(g*B#e^>(sY~&3akyburhpGNY+~BWmG4k2bJ3v1 z{)8WHJ7SI^8mr04P@Q7NVz2cDDQharyiR7Tz0q3?zI+Vd(i|D?-+Ph9ny}*p4 zsROoEInPQrrl{srpULa2YHe-p4&Y~^+H$Z~4zrWEDDma~{2ZpnL-i`}d*%D*>X23* z!J;!#HTvu{R~x~FvSdH=!VIT8GQ-UErW1E6Dgl5~A`Y7Sw4<#M3_~c4j=(yD4Ccr zYcUh<&(vFv6!7)tb;4uc=TLarMp-k6FyG+*AZ+?!|Ry)D7qj;QRL< z$pv-a%DY5$!jQ#~cM1@?sUov|+#p}Q@68$Lzwc0UTz%c_(cNT|kM>y@L;xdz{=g-W z-Imbqz-2Q~g|>RX65{sb2cc-tI4tF*5!>`zi2O1F6x!6m1_IV1%cEB_$<=ay1OLAscPzRuhlV5OP&kRg)>Crt+#)|d7B#qiI==m715tfjUP}%^yB7MWw8v99uwkd)pTFlUV~KICk;n}QhC zz4Sa z1=Hc2cR#1+`@1SbgzMKZ!yE#1O;x_O0(X7gk1+1;{2TlaeL^{EL=M!$a{;a#OrP^@ zs8?uR1%Luw8L^oMg5;(9fhByye2`Ev+!fIkD!pG`$%FQ*mQCbiU$h&^0ebNA{FMgk zuCpkAU<|2I?Urb1ZYCZdL}g5tB`g6%m)>6_m9 zzZgBhLer+UEeaP4iH2QdQf>#&2dMS212K$M*OA;SnoN7U0A$`=)cUyiB1oR=-2iv^ z`_Va&xXiXdLM^hg^mz&(2N}xUWH=pm@+LH)KF zxKdcYfQ}(H_texT*4}%yQ_fK79k0+l93l2T>PiG6l$Iz0`D)r=9__wQhacrJP_#7VTO-ZfDxs z)U?B&(e12L_dGsGNTkt}9&JU`S< zKpjz0QOMvZ=1of7%i(@x9*~@zTLg;;J5I~3>gvj@eK=ZxI!(vU?yP!=yn(hIP*^CL ziAex0qcLCb^|3H19;FJ5SAv@5pH9O219%`lHpc5==K3yHWam71;C6`Bo>;mza_^!ADTe`CT!Cywwk(tEScDq$CKwyS*cs zgwfxJYwGMrU7t3k{lY!M9kQXI4> zY7SWnM*KMnrUsAQ@iB)GsWfm>d<6tQ%A&z z)iu?@gEB36?0ul)5!Ie}L~-%e<~$+#`wRpLXyRIH7u<_F5!+*MR#S$Lh#SHtrDSAT z+1ct!QmTm4BfL~(@O(g0)Z=6l5k?7$I+ZN{=sy^UuE)us&<%}_lS%ih^_#-PaFo`B zcG`WQrR`XJv)?lB(S46m=WGGCo$W9oSY)WyXnHs$W^4!^$-QoHRHzW$+H)0zffrRY`9#N*Bj zOFw#}07P&^ZkBw@yzqpPs@m_FgTVu+!ZlRFzQW;EgR@W2VaObK{OulpQt#H_K{)B4 zhyZ9|3J02TQF@Vezda$2@it~6;2Kfoqm6XKA8{Y9d3e&S8B)8ev^`fh$eXdy>&Tiw z@*vTHPpgBl%dIF3>G{+@299#Q+@%fFRA|I`Y(3N`9B0KezRIr}*0779<>fqAT!{Hl?cPAr|dDp}W) zSU(+dnEM4@07I5S&+RST{&jx-C_V;8yp;S&;Z+xG?jYF9u;y|K5jXso4LuFy-;IQ7 z99Cev!$PEL)cuToH&lYoa3JdjRq#vyn#XQNd4bgVWeRSm%VN^-z0MI%SM+NX0afe( zqlka?e~5Yyc&`8Udt9Y5A|a%bBrDk?G7H&-NM=T|_a;iEkc6ykLRMCGD3QIgG9qMz zs3ZybpLd_%{r%sM?$t+md%d2|Yn*egb2W^kXhIg2IJ36qDY1;cM1WzRu3ft!FbM@I zQJnE(Xm|lkfv5&x2!lX^K3Fa9SIDfFd*UQl9c2(l%;Slag9m9rLs8?0BmV%r2ls+N zWDsL`G`iy{#A>`Ee4Z@lPzq9e zwC@F(h;c(49K?HM72ulp8%-!#xY`qBZOz*a+jKT2Vers16bYDC;mRhK^yFIG^J#SoBWXu7bcqz;s`_kGV{J- zA2I}pg6-FUjgOP;MD0;~b0d(jMXm zsYvfyM~=$AIvv1VIKEZEnu*DgbE&b->x;*WroVl4+Sxv_v0ODE4G|p`u}R*_xJ$*U z9N!=kmjq^>Ba|gm9cJ4nChdSw0m!%jA`^frTq=un3ANT5At_08!3dflcpJZ1X@I|F zfAGSM^N0#7xh!v#;;w=ch2OOoj zbq2yWO}m5NSs?1aYG=z#<>|fxntwmuBknJ1s2WVN-f5eDTK}94y6^Qn!c)$*;ZLbL z*fAvrH8C(G+!|y)D1quWtMIP22&2iSMVmitc+R$I1YLN@w>T-I{sgc)9i&O(?6|Z# z+$ZR{N=NM2+JQ^|r#*1#E&7K-U`%SV03)EN4VX#lOCp+yi!3EhrePN6!^lWF>Gng| zp+dxX4_HKQ?kPGr87}<(_4P15Yg*5o0c|l}3IH+?tr22zXyE`dpjPUrxz>ce8Y5o` zfFfYUZ{Mh3-c=7rAc!qt&G(M1oFLwoI)-j=bbCLE=|DJ53eIKw*BYaOT@`M_m9Jhk zpfUq#jyPg)MBo1)at2oZ5g39dR7VK-1Y$7kn6&2YgGEn(+TpYSM}b4I+0C0bXGX6c zqrQl~7$LjzqUnJKm&fE3x5_=j?y6o>K=!l|VT*`L(gVIla>9+aNc>_O!X#9e5d77g6S#BZqA{$B>Z27peLFzb?g2tOL{fhsDpOjYA6;qLT6J$<+ zd2Q1mmp_QV_(v6E_yJ|*Bgu;ZrU?pppgOc0Cmx6fPMw)499dqwDy8B6qz2-6)JGCb zH`W^lI};%@w%P2)NDeoh)v;t*7y>}>)oP#2Fa{@x~xGb0-Z%z6R&-P~NK0r6&$7Fb#;jDP@OUFS34 z1pF`{z|eQYbq7MStW6~n(;}3K1n}3p2GznpsE-LUU+8Dcm7y1LJoD^1xvG>CDX|GEzd zEFc5dZ(H5Ci2{Fb@+ncrP=$1S`ekAB09|W@NSDOC!38{ObPZ`7rhE+l$rXTNU^@I& ztCBN(St=O}&VBx$7T|`lv2m}L&pR|jkTR)WW)-E(@}`_T2_Xr%tQ{2{2Qj$|9rBd` zA|lLTWoUYJakr!1wvww;M}4WV{~|Q%6mZt9%oPKkK|psfnumx6cjUUQUn9B37b944 zMu^H+-gu4ewFvTIQ63(mOP(Oz4=qPPEGyZ)0Jmeuz|X^7aCU{@cOs*_WI!L*bfYX} zu`qo`zv5CWjx~NXBoFm0!ICsh&;`Y9182~N0K@v_cjvetDV!6LaS+Jyp^KJv+}Yu= z3=%`|n4^n$B4HSWU_1++80!^Q7p`E@di%|$S`^#3EkKV^NrQHTzcP%nQSlOBrjJWL z^{3%A10yF6S`d^6NQfb5y79Lfuv^oAVl2!8LpvbRCAc>kN(9Id5P>m08P-%%C=aB5 z4Ie`vv|^Ia5=IUh`(tgJ_P}Wq#$w`|AhS!riTu7t|x+(@3;PV%6r#e_k(yk$aXG0 zPr{guRGvux6cDV2QsB{@cD>&Leqblrje=CjKq0%ri5d4aZ_r1G zLS#atuDcR4IN*ix@#vMG8(UA}6R5&E9~o0Gvdr9{kngE5$6QPUD?U`a20&g&IMI3v z^e}%bPx*ngjVbbjEvi0F(Ot7ctL1bWt;pEa8q_N1OZ93zk|ErI)skCrycU%21a=s) z5)I@e#F2=B|E58hkkAE}6`o-!8(}&nIr+r@y^gndvsJcuJ$v>$JSR`6!3_QxWTlO`I4@`PDd!QD;zUtWDKPpXI zV@QOr6MDS#3~uhDbk|zfPFGD4b_0I-@+J4MM=MV%3RXmAOocT*&SrRslPZP20DUW* z^yK*bukc|KEA|rL*lzIvT`mG03u-T1FVD;HJfd}7g;NkVSxHMbEiEk_4h{BHL8#~9 z<;6@q(`Y78n(<}9p3i4yO%8c|wSXT)sUC2DrE6z*p^|}_2U^F?uIdH7V#lsA|m3JNc;b7fa}spyPyoDuR;syIMtbt@=uW4AeC-EL|>68h`tWh z3HNBxeP$yvAO&G2dsR`?Pu>TvXEF|9OFis26q49Oc%fn-mStG*_FAi*rM(-H_S&!jT9brWVMcxBLm^+dBKUw;b7BO!6uEMQQ29Dc^l<%Q ziQ4t2(<{lpJ3}+Q=OGE38XL_PrA6$y)Nd?if&Y#05j698kC`)xFj4s55c9tRs?xxo zwJ90iS^q|3#5D`t>G7CABOr+ZiuSHir+ATxhWris+pB)>uJL`sZg1NAY)0+C9OApM zBF8zLZDuEgGo^YR4fj!`qR}Nx!LB`hD2at$sNg`4t?Wr>8DoSH2o)aC74W-2>nA>a z`Xpa)Ty$s;5!M&1_S4+e$yXr})1W5iCqQ@qF@6tHiZ62&ea?Y4!cqZ~)TqP3pG-T~ zcu~plDDNHfdv7NY_n$riYL56?df9fekM=PKn|GAk7hq4RxnP})$jcQug#2>@F)2uc6h4?&3gW^8P1l|HmqL5iO8nU45S_79jLBe|$yytJD4yaEnzg6TvP-R2C923~XI%4!43anZ$q^`wqDoV!P1Va8FLF*J=oDo=wb-&QIgIeLKohQJ}z=OD-` z7X=8ic}2W9lyQg_7=_>KqW|N&Hy;B*pHEmC-DN`Eph^QfQY?Za*@<-xqa6-FY0+0D zkHP|1pa;$|cUsK7H{Kkek>~lKhI)G`yGtHYS$Nr-9zU>^@cl8vFaG}@K?y!g-9Srt zjKjlNY=Nl~D08_xHUHI5=n4Sg9HYI^+8IrRHVk~qn*9{}Uqp2R&X{)_`#j&^U+1Q8 z2d$yl1?ovuk(jj%(t_tsEcs`)9Y9790HJX4QRHR&r@)o4(f{Yqbzwk*^=YyLSXShI z)H~=qv7|M`l@zjO!>m8gTh5hapTulOQG+y+`AY`&=a5DqJaXSUF%IM!75Wb7=o31} zSh{&e>e^_&l|!3=!+|G9NalA&58VSKVQbs{+3z;03S2YvAp|OnmW=2YxF1j)QBemm zs~ktsUTMJd4_!jlhh=5}Pf+y{DC^#x-A#zj(C^?6qSD5AHDTa9d6N=&AM^$)(Flk- ztRtA|g<>9A8Z8Z`bICqYH5>+;f%X*}q5`0Ca24-Jh(z}WMhrhNoViC2nn)^OzYG*4 z74 zkgj3l9s8{rR2?aTbiX+yY#=m&sS#bHh=h^`uLd8n*#-X-Z8r`VgaDu<8>PmfO$dNe z&?3SN=7gBG)Vp$kH*@6cqxOmN^71c7)Y=JJ1{f|+J9m6!EWt6yhk4V4`3~q@x#`Gh z)FUqW6+wmk|G)q!o`K}XzMa=XR?WPDTEc~sCF%OoSF08GTgQ!HPi4~LO;AW*)4fDG zy64LD&N!3XCjWL6zeZ#yU`p<1VGL8kP8S9*fwyA|HDpfs$Y2an&j3Q{60u&&P&BC&Vs_vCsT;q;364?=zRXY21}V)r_hS1^gB zBEC&}`ueQOdacQ9Tb9v9zcH64-z(R$feiIq53QP%tNdHVg(;!rtwT+KdzSNaug9c; z&h-Dgl1%j1o`lO^M9gU4sNXESACN;??nz_1Ryo7jWTq1kR{=(N@tpsU3eb7!LoarL z-FPW!8?VHr0J10AQ>+h;g9E_n8tphsfa2xcEK0l@?3{JtEvUP)U>i3%8PHK_eCO38 z=9!qmic6He@NO{E%h}8P;0q>iG2@9}K*7<~*u)zAv)a8T5Qi8D@xzBrR)&3(FnWq$ zML7m(xs~6;3{Yn1%pV4g;m@JKowZ+5R6X`DnYFh^14E3D52k8(R-~7Y!^i8q98Z{+ zCb%vJvs7P1l~SP!7clWM-W?dx1I`L38N6Lk6UdrgKfENmO2#j8(58*I-u1ftV)OD| z15>|na*}_g>s8Dy0f05ZtHmF|E?5)C{ripLN~>U#_Zlp8gOIu z^f^bAE*ZhgrlsU$gLUcT+PMD(*mOgSg%5=bhzAA=sIaJrKk{QIvOb}`f`u3quaLF< zZ)m8}pqFVZm*CQj^N5hd7J0kF!sojeVY?Fu2z2lNHmuB~{gws z(lQbl@+8edsgFJabQ3bgZHVeEg{t@rTksH(S3ylc<>i@l0kjL6y`we{?!f~YbR54@YJB-d(`~Of7n+MFMDs9eStl`$L;#kXhVc+TVQd=0br2fe z%WD_@w$fMb=r&usiJ>hZqAu|lPd<>Bdyx&XI|ejWg$TB~V3!saY|w+E=K{)t;&Rjf z*OEj<_=d#q&2lFiQAHwF&;2cN6YY-b9dl)qrQBx=O8g>4hg!v7bWB|4if?6VvFFt8 z++aK0Rv_wdQoG>mpngl|IdEqr>d2+?(R<5Bl%(I^iUdd7u$&QM4*Z9lK z9iRQ=sQ8$uc|6M+;`@}1`+K@S)=haOVK{zqk^AGvk7;C+Y#7OG%ZYY#b>-vZyY!Zh zG?Xx}ar7b(?XQpzC=@w*^eDzl^+e73Y2_#C?~z-x+)?g+)@YjT)_a!`{j3JL z5$Z~~cI#}aUKuziE2a@XXLcp|`FfR__8!5IMwZ~T2loO4nEQl*+j!Z@RU%)fUn(s z@NOt%0$=9m;c&q(EPM|ph0)hhznnO6LP%7!#Afit=>wm7-oLN^yR{+av2^6$)lJieEK@aw8Kvdrxoa08Dp?>)yG#q3ITM>4jNX$ZJTI)HLH6wZ z30AEe%@$29^fTepLdv_sR_>-#7g97av34`I`l}vGtUoA!KaC+=MThojk1~_cun6n0 zjFTpJ^c{{l3LDOFQxx(7!d=qF>^%+9=R*oiVf$rX zj(o=pR%vr_m+))$5vrWBMxCSULG>SdeSgl<@%K|xFQ1;{JUu36g|*lo7TrQU&q^nR z-Ft_Gn$_Dh3<66}KQFlaMwyjb_2R``GnS~}hTh&@S9kaK0|W2+`e++X;g`5uPhUTG zJ>u?3T%P& z0`7U{$DbfMN5OFN=>B1k?}tw}IWFjQ3f02p%+!|=G- zb(s{apA!tCpOCcfXazpl#`TV*Ug3lCR19o9A3l6YG_6b#>KYm~EkqvD6!h*dM#q1J z7~Jc~>K}F#|9e)?pe|U)MpolVe2(52VN+#>w(j6K5z^n%Ss(2rH|x6}V}toZ@aau^Ofq08>!jH~UE1 zGv>1_i3vlCk~p)bNBK7T@z=R#XZKD_C8#E*J`?)Ia$c6|?&`dV`;V)GSry~HPYgsZ zh{V@SCua=ODMfhBrQWv|P&gYW)fCi7AE#`5O`mPx0I|u)7wh4+U8n2bQLfx}vtv(G z7nGD#W2VxLzNV7Zn>}?J#y5-LXAL(F*sDcfSGaJY|C&yy!rM=u@IkZQou*;b7Kr=Y z9w#_2IgDsH7!|8+xlfB+%+Hafy(O1ZxwwMfp7yhs zmm2ZC>p$*GeCOrg)&T5AG^lo0J9-PMm&LJ~YWuzS0Ekukt`~cUepy&ZM^E}Lzsd)R zX1Ks`~ntJBuoGE1|pIg;u5Q&bya-rxeb!>*Z4@JzTNn4AxA$ ztQ^tSHA*X#+durRO8S29chV&`OK2!R(ppvueJIxaC=k>3QG5F72m+9`Oh%6-AwaO9 z!5gyG$J|`{T+n49AT<k|beF%Z zdSB5#P^)KpkGbGp(v0(ut?PAzih2frM2>ii?osQtOFB&w(9Q6}Ioi|Yc4PgK9~7i< zd-B%4J)iY(oFBZxiHC$kcC&ZW@1E`rgPX__F0-A`so!$`G~e9~*eLzq#gIy#?aS7h zAN9f;la!PcwvQ?dj~JpJ_dnZSml%4QJn0Eh*!hdOT49Z>Gd|X*uRIRQ3~uNC%=sj` z!0OnyxZgDwJr8~Bzww4N)f?o%G2d@HP&w!8wAHMQ`Dl$puIREfDn^8|?L&=^$LXh4 zCm%2?Pq6vbB_jy$j6cTBYMYn;l0=DWAXk^0Cs)&}x>4{_61NWRZn!G+q+bwqlU+xS zLt#a9KdHqdazW3g+a{oY{sXx1x@d4A*)8*0!%l$=f?}&%k%IW*0yzt{O;-1&Lnz_f!zXQT(SLkBZlJFn4$(PJW}Hj{N0a6 zvto0&%EgOej4~`F@z+m<8pF}s8I@oP|GS}(j5B|S3L-im=G66C9X)e2`L#v$u}BT> z%ny{#m7J3;9zpMn(sf^r?R60NnpU#4Eti%1cNS}e0j5+Ms8f^~{8@SLUvM8Hs8w&= z4vgWO7Ab;=w4=&uF$aDuAT3=t=`PGjf%op};Zaa&_x-0APuI=F$p~ibSU*-UMN^S? zp~t3i@{Ea3MAXjjKX=njI#8?E-cQ?Or}$FTKiYoH;dqYb*wZu)&>Voza4~eb6%fzA zPKlnd{Gov7gqTF}+;3;OwRkeq^n%Mci-vMe-Gb=q57MR+M@pF*QcDL5-7xbPpPNEk z`M9#h3cmNx;+!G64~EmG~55FoHIx15UaZ`rQ_?rPWUg= zz6Z}taGg$ziM^Gxj-B|u@Gzqj>_BeRPv7?&K1ZA-s+I_1(|@(UvD#gV!P$dV)z$Kv z@3;VxAkRKuiH9U$Yhx|M>{MPHcUyv_PqgQ&1PP~8?QcjWvoZ#Fo#z2qSH zJ!lu@BT8MTSov?}HJndqc~rB!R(uoIc-T4pXfJUpeH$|C*c@mY&Es2Lth7G-KP>>S z?GBZx-S!7ry?!lTb=z8$TpK+>b~*3u(>ok!QNJuNk2hqJ#b@vfnv>@iMbRB6Jy(iA zBYfD4n@(%*ar;In`$~oY-C?j|(S0MBTx;+IU5L|6`=ONDoq^OD+}m!yw#|gJUUYNr z*gxX2BJIUgpL%eYNI>CHPL53$zo4x14m7+`yL#0aCAZ_3wMNY<-F^*K57(ygAq%+a*pq+x_0yyzwkSQLk1w;cgC0Gigm?-n zkMqBHNp|9`BiY7iXN+j}RX4VQnMhn^RT4LNbaB#YJIqo} z{*j%M#t&`?zJLZ;`FGR4GKAnDlt!+d* zbkx$jCh7L=9T+e(l;mabN&Nmv`guP)MU_R>X!2V#fAbShIY}r^>67r)d^C7q44quaMHEbi~CxQ?S-O3!iE(|%(2m|DVRe~)H?hUDLWA7?%_jz2g?wtcJo zZC7rcmGIK1$g%N^605?%uhhh{A0$?W`2Pz3Jh~aT5cGY&7}GRA^!DKc{>#Q(QL%}M z*KKVVGq-K5tWvYG;GkBvv}FqvA~-z!fbe=oqp8XE-z^r|yh0w8JMu6zCCKg<9Lfp@ zFPLt=&6O?vV_u@xG|S|^(kunZpayZ;?xc;zoy$g5wSKeRl;r+Dt{zj{^Znz;95fFo zcP@pTJ1Xv~m@iY~%H2Qh?DXmN?Wd(Kr*t_VXl`Wi-u$AXa?F4$s!#q5tg2Klvr^gX zaL@v~Cjybw6E}1Yb@XlLCS~F#vU+E5&)AHrqC$?o^<{ZEKwTwP>NbHJvg_WlSo$Z& zf*nE#5^u4Y2-|e7Mg#KDUNFasgv_ig4O*zJENyIZTiplEQe!{yW+mU?qTlm6zx?~L zv;I-W?o6+r^$b=Zc=QF|l|w(yeq@8>;8go(dQL8ZWwsZS{b%R+$6npqeo@A&gi;?5 z1^}D920#-uo)SzKKknAl>C)qtq6eidB`l`GFE@`W&safArD$;#cTB^NO*ZN_pF@*lAuI{B% z4$y;&i;I6KcQ}@xpFg*nX3XB#sl!;e@BZ6);nJ+E8*g*P^0nD~?zMd3)#7R-vJ{}` z?p^gaDVM&>8np7p{iKp!yIQr=2PU@2YULsZg=oPB8V56bM!5p09sEzfYidG|0Jk|b zD1?#ZM0LQX_(ph3z5V_29v-5AgHgx<)xi8PWI!$En#)!WS8h5>nqRdrF}V#{W{bI= z_VrtF-&RxuYgIA??sl!7T3qrxlAHZ^XAp7ffUDlA(`6e)v40+9bTOaWU3|~W^vi+K zvb{aF>F`h1WeryZtQwn?G&5XkqpGHcWw>C(p?24jN@Zmn9yySZLktWlrKJbK z#hi`rWKLLl^=(vdR+nub zx?fw=bO?C!QlR#%Y2DP6?n`yH_a``-+h^ZhZSLZ;takVqbq8sa^8Ot;mekILE0AF! zT7tm>X&?UbI}d=1!29?6SxwZlB6sbje6X%+Vwjnk*;jcU!ya$$>}@poME7emh;Mw$ z>p^RGcfk?2@4pM&x(6+C?B3q3HWjw2^e+#s)uFk;_MSGFY^7)C2^uS=QM2;}`2}tf z=iC4}qSBqJzyufGky1p3^K`Ix7a};1lYgl?4zqP?SW;3_)E$oNSLtM*jL4i+*>|hM z0xll|74qjw|1~CsJvfy}eCT^=CV&vXj zK=*U#M=?)Zsuv{3(p;=65`U7G49ads@weI7MY6Dp$c}Fb%@CHss%Mp?8pkk?Lgoo9 z2)~UV4LC}F@ECeLb0;Sa!)JN@)>aM?Y|B4hxY0B<_wo^Ax$1Lzz5GM>w@k z!}?s8+xhFTFwxWa_$zt8IFzWt89_k;wicBpERErEFuP*snF1{jD2L*T3f#4-uM9FA ze_?sZE^S>BeRPbsyXVJ(qW1GW$4T_BM!vaF@>R<8i%D<>@jcVKuJ!?RBX<-vw+w9t zQCL%lH37{AHvI10JBDM&ZlJIQqr(GWj+k*#>^VZ z)ST~Po7GlQz8VP$>kfW5s9}ON({d2g3Vo{s5zMxMKu;-uqKNJt8+$bJH8VZ^PG_e&{0W|> ziY9mQwk^iPU!Rp4%PRQJo`vy}DqAFqQY@^^*(J@j<6Lms^9_Sg*fnyuX}29=P5)Lp zl+5>(bMNr7pvRA7asPuQnNn<{yJeprqb{s&xoxKMGX2vZgeKNB%M>Q3omCon}=E>F|E2$tf%1Lm}T1sUCK%T>7EHa6;|Z z$;mWtI~xawCVOM!h|GRsJ$E;^Y|=9Wm`S7|Ax1eNs%@xfu23nk=0S*4R@l8UUW#~U>RY>&$*sZYH;k~1vDHFYgsZ01SVEZ{6cQa^jP4LG}* znb~|LYoa=@$~V%%l1Mmbz<+LTX~|-?GZD`Wg#h4<7t3o{d(mSlW(8s~FXXdJdfX}B zn@jP{&6X!A!pgS`By8&n20BpRJ-5-xzqi+J?T5)ccaUa;%yC7%PRC|}m)Tz#g0>Tq z?KdyNiZw7brcwPKwuGOuMnevj6Pwu*5p$ z$V{hzTd1dfw=#9!J3l%#MC6sxtSi#obkrv|VnG|mh2K4Ob#+s8xg$C(@W!$7w(77V z_D&&Jz_4F~7SaS%L2fm-tT?ejz`E30SXo{}M7Spy>W(k2?{U423IIUn9{MF1_t0Ci z#z_OBtcCQ!1uGjH$V?-YGcM7}tMLJTvKg%^jbtT-LorVb!8VA444Dnlqw{!uG=v)j z6=`rW_e2;SEOesybxd~BS0#}hP6x#oQgXKck@j|8o? zaC*J4Xgb8V+GA01^WeI5Fg?Ae-;Bd!&eZUin+i=+FXP?qTWcX7X1smXCOzGXo}Stv zomnuP$)fugk(%B}RatJ2<$pyA&>nn%*bWQfB9+ujm*}_XA?&25$K(U#DBztkSsh;7 z035nHukB`F5W%`<&z^Y!&g5=gR5v%elC+!X2rS&(+;gYgyP*-hT${7YU60$N2Q_a_ z&=@g|o!ZG!PMvP_c0!8WA&jm0Anl9J>xaI@S-J$Rj_Bijo{zqc9-x>zcTH0#HwsRq zjOF$=6}imHSEJ*SlJ>OH_@$kj7+_VR2AR-Y44eCue7l>GYUj2-D2F^IHc6j$7AxH> zh0VShJA9cSZ-FKPSkaX$^e|OGxegIf1S`%_w016pSLno%A#cmv0$@d`MH@}=JEb%> z*#5Jzg|nS~IjyGVrgnjeg+-vPhzevR*rN)S6&wn*L<;0M+XiR+&KYr<_RV>vEeu-q zh}s`yk);yp@>3Cw5nLfAcdBn>we#L9`EH(DDu-B8hf5Qd%h{T8E>>5GL_aY%v8)rC?Ue?Z_Ey0 z&I@BzLfHXtA3Y6G)EtVemR43)AGnL6WLjI-E2tHr?SLevOe)n0n+JJ}YujPbR$Q9} zBPqaj`zR@K-wyw(K4rUK-)hs@+xsan{~GWjFvO97I+~()wY;W zXSE$T!5Xow!F3Y>&(~t2oUU$9 zlFLOL+xf{&LOEtbGqY&p?pwM}c%cu|6d>g~M)FV6`_ zA%oYS^BML93U~P1J)x)bZ@=FnNF*`ud3W4(+gfb|ehA%`+vp}?wU4+c z?nm0e_@cvOfqiA1C6+ggQ(}J0@YgWY@VA>}D7qM{$J8PR-j()Q(V9=*+x=^J(7%?O z7T$v4Kcp7jOT{CA4lb;M{6a+lsb(67wRXnP&{c5D(5R&MR4lm*J%tLNP=k>r0#!ul zdaycNU)56F-rP)rKAs338=Z+Pl?^(->d%Jwdgdp*T<+OL>9;Zwszk=t7v1U_an|nmO9JuWSta za>&h5qYu7>idsfRCFH5Aj0P<_p&+?)TUwPQS8%uMCkpkxlI!ZEVrw8O-=dM_1kTL& z2Lcy@sBksr=I7JW)2CkKJOVb))1q0)HCrG&em*|cDR)0o$>QdQ-VX^>>Q#X#>8APfGapLHq9zW$Z2WOAT?ooDJ)*COYK8izr#w#xe~b%RXAuwHZ42q zvvAY0+(C_ZYHU; ztPxoPVSBLBd$?qTqMA%z?-$2v`CC6NDy%I0&yFULUH87}rQwr72CwXTca*ocoTIa> zKYA)gJW~(2f(BMN1?M|LmCZr#xA#=#@1I|Kp{x*&Tz@aU=X|AvPm%7c>&(7Iy5_#V zM=&IM@#21|S3q>JBo~!PEeFi6lYy4!X%6OCCwA8sUeV%USWND;zXyE-} zHG4b9ZroDH`P1tioe5&+rIOjHNUrfQ%=5@-K&$L94&$tE=b;RS6ahm_f!T$RXKrDkpcViLPKEEf0AeZuUqUd62^rjtl>YLiW0&NbBPb#_ z{<&8mBHOMUy%*7wh2d=cJ$9X*znV@^A~F}m3(#fr%WWd zMt3)7?w4;;-R_)Wy6THfdFvzG%-o~COnGrA95&N&X+o!7wnTJ&@HA6Y--mEpVnOKi>mb=rZe zA5q^7%&#Pkf4cM8>b-N|RQQ$OFIQ+RmmTel!aV4Vf6uW8UG(;+x7ro?3VsVhQbA3x z>bkVFwn=y2^Pu;ySYjrOfvRT#ZOpl?U!FF&0GUu)Nl7GhA{G`FeN9&)PQnob^KwYa z&#RsKt)Vd@a3L;d{~s69s(DVEz$WM0Tk|mhf=pJFsBPT({g!0iv{JWyR%+&*Dedx_ z&f59~317#PO5*G;n_DEwQj2oA2X3b1TYeFL3~Yugs^0X#it=H*#)Fwr^9J<;mr3gp z%2D;^v)iLa_v4BS*fDCq7HF~2Z(R!U*LCt+T%u>Aa-yPsao7B6Eza9x%#$&=(Elbo z3Ss?)L1q2VpF&WSVK8Py>Q~2a4*84(x2-Gj%d&O1X^wyeGTg3RCy@?K%1C+QdD=ZS zNA?L38v1<{6iy&sAnL?nMJBBx55O`x6b%9b0y|%0;0fYPAz|VEit8Q_&SR*yy|a_h z9Vn#7SKV?uiR$gm8(GwXadB}b_V$!lqwzzis;dJVJFl;Q7(f_>q3}g2>wM57=kHTG zA?2eK!dgARmlh1 zNBm{;uPa%VFg-NVQo!S9T;{C~aNw4l&u5fbod+m;b< zW90D96cKpf48Us3OK>9vK=g?Vk1n6CP|^tIZt&l6OJnxk)bHO_<(wqv;*1tj`oD9O zgvW5wrpsw&SsEQzlHs5=_4W1DjskMe4sTEE!q52;SH@ZssZGcRagm{Y2u=fGY(p(~ z^>Xkg%U>QMdqcrv9uhCV*dY{uP(Gq}HcXspV!HX1TnN8V&yswxMvg%Y?xHraezI7iIvT!e$f_h|17<=6FD5Nco*0MciX8wc1jU<|D{L> zAW^ykF(H~3d)(5ZgllhQXP1$lZlKr_ly&G_oi2W6_=7?%^9-aOIZ?qVgDJ=^*bazm&3KpI3H0wFmKgY zV~f-Xk(Cv5ckuO1NKH*;EVK5Zx-MQ;lp#9ZXsR*#j69$)|8ntnnacSA3t030qvERn zoR!!34J8v{2O=z|-Opk-W+qn@jAj*Ci|21bbBIzkPbc%0w(v`>Y$u|h5z+T;O?&d0 zNo>q|pPsS)I+fUPkj;gho0hs_wLjm$qGSjW(A3Z))Q5u zy5(Ga3<>0)+~z`VKU!e*3m2NyXi~v%;MxEmL=F3MZEety4~UUAIv(l4E73QuQuqoo z3|m=KPf64d3&s86XRL0S&Q#3kOyS5lt8-I7w^cW*$8xk!9v-uqIob(RaUrzRVbp6w z$7IuzIw=CWe@i?H6Fls7=$7J-xB7cD;AjE#668(p*wW9RKZCci8VKkVN@k#@kRF%n zK|V;qKX7F~xNi6AMDQ&_j5XPRW-TgWE6*vb@A~#&YlqO}5vV2#?QwV;+QP38{pRy> ze;dG2z$Q)HYIc1?K8+gHg7(Pr?=yo^jO?!>{yg3oI3#CPK7x7=6p=ujLD`Jm$*B5W zSZIo?i*gcF5UM*QA-n~+2!b3Xzy~4&-X8de1Y};kY3jQtL?^a$gRFgFz%GA#dWB}O zDlLwb7r<=h+|8;pk;kJ>bzP7w9(=^1P;t}O_xTYy(r**}&!8v@U}IzJ^9gKy8s>P$ z;EFtNSx$TaM-1i95alQOBkxmMe5H5;ICjf^(BYDO0u6UeoA%Ve6YXM0guUZ!0*ICH zTQ91vhPh^faaufSwe?tLFKMU1%v&>vbxnL zqK(Fsp5*!(wzvP_-&)F927N#%k$8+=k-VOp;{eC_qIwZCk2Ul4DcBX!-mZF{_!w4+ zUwWW^~8&B`Pqo=%&2qAj14Lb7w z%8DR$j|~G)spK#y*b(k;%cQVr8xotG%^75FHLwrV57 z%Mz};@(TnITci@j6JTxgbqing#-9Vs4{9_;v&~99^z)e~y}P|a1?p!V*LDXK7W4pXBlLD zc(eBNr;caZGgM;w{FjGHvg`+5ksV%`R8`nocdR2x8&Mb6+vj=IJD{k(xa)SIFe-H6 zNAPrkPW$yx$&DR&8&l2UCrWL{qS?7L?9EgJ2WOot0~cITcjRfaQvbsp<@;7&>Q+(9 zk%G^ILo`T5IB7r*IAn$mpvyTd*X4y6r%|5*402!mAgdUk`Rob(-_^sSbzE8ac~z2I za{o#s?sxd$hZKly2Z;7~dq7$V-`XvP!5nWqLBcBn0jr^b7-5IPY5e1V`DF&YJZnMeMoCEGcp6KNJISBQ`en z(ylx5R2j^+k1~`v7QXxmZ!<2)>^Gk;Fj2XipJJudZO$WIb6oZbM4j_pp-ggdEm3v; z5ziWJ7xV4Rh)qI@pZ;k%7+_8=Yc6&{BFV(mG(eXdAqL~i1O<0|PAz$V|NHl8I_+qQ z;+f>c5?6MmL<#+5T#)WbWF|S6J}0_L#eJ8Aj;^^y?BUaS==YsrJLAD z0xt3Hd&;J_@9SOX-n&1v7RJWjyHR4pU&jdMDgo3%mxcb)99WQJ#jCPss2BS=VN?cM zv3$hv%2a_UWb}~3VkYhq(PbUK>KBV!<4@G9ERJHeVEv$OG z5lJSh7uf8m1loC}Ac`ZTabcFI#z^%ADX?QhvX-2U83+S#bKgKK!Y- zmod9GLV~nj$E44&u1rlW%;o!Jqucm4mP8zosU+p53#pp(1{trJ{W5za?BEp9nU|D5 z|K+$#!uEzH1)bLmUi()~g7_SsV@3#4gz*k_J# z3@L!;r`vny78djeL_>gZR5;%D7{3{VB?9r(nge&vrM~|5t&mX$UeGAHfZd+!N4!u_ zQ0S9#MU;oegCHLSy39gE8A4a1-tgO2)ZVAkC~0RyZ~WP4HroW{$E;wYwFbQ}55(?l z%h4zAFE>5es-Qc1D(_=x6cQO#*{-Y6{qbR$nQXRYf5;hKt3N{Zj;9Sw7ZbSgOz9l0 zhWjZ&z(Tiyg}RXL@3Bo%4Sj37&aV*4p?R95{tqPI)YN2TSFcaqv2kA>Q$u9`2Lx4m zuX0rbs`<7x77Aqnl$v0SfHR;anw!sAww;A&8Q&LO^;=>M9kA@c-xlDG(Fl!#&MtQ7 z&k>T|nidhHfF1|4cc&%|eRZciD&7Fp3-th!AR^{aoxlHE9ue$1CV)i~6DB~D(Vyaf zKr#!gJZ8tLFyM{8K(?LtwE|v?PLpv)DUdj`P%D zQ;1MRcHrp)WjjM>{@hU1$&n7j?y0^{>`*1C4}LI|ltC$!kwvYeR^FBk;5RUv+*JT6GxMR{G&WcU`D6>`qV(EAl@ow3+Y z(e)Q*9cx%SC-9pdZ7H1WKX^IBXlYpoq#ki9Q6u@diW{!3zT0!>HaZ&dvuDvHfmU{V zB#rfGl9C-*cxtGfrJA9caMnZJuj0qiB=7ZAYEDPS%WZsHs8b>rOM_t8N?1#B;?k-iu|l(zo+Qw@~x!f zr_~EgvN83ad;3-4rfy$#wbg?4qn6Mn)6=%J~?8W4?`r%V^R-WE*m{K9MZ^G+nRYv+WacU zg&co;RwBSP9JHDRVt7gD8kXv|{V?S)cukUD(86G=;uqV zmDg>3<$7tc@L_T4`_JBsEhM@=n%n>P)BfMR(p$a4 z%ipJCjA#0<7#sGNfjId+vERR9{%d}t^)Dy(@16k~&C>D#A~|79 zLG>>z!9{DhCf!S2jb20$Ta<829;un`?9rDO9*gOCuW0wt(qqN&`SdT*DM@{AyRqkS z(XF1tAM>v3F57H7Y=5nDTAlAdYj0EPlB-hgQJy30e^x@G9V1#-RzLKYl^b=EANG1U zurfy4_OateAyfJIbNl}LdSR`;!wTB>Fdh`s)(F8g^vt~Aljc?jPqkdh(W=G&hX%Nh zn^T>YdV(-p-~=1PwwX)2O=`Hb)lb=kKu@)6*DgfFOXQ})T5fi(#!ET_f`NJ;b1N?G z2SO08NDPMwFRk#5j5j|Zfs7w|X?MLb?q<NZK&PJb1Sr6+hZ=@-J@4-e<~=>W}zqWabL-wim+j<9jSLP`8TjZ;6D z2OtoD<w!j7TA?hz80oWQOdWkR(N@jLc*uJ7jO(<9eR||NXr0^SSTmdG2!O z=eoY%^E}SuIL`C@H(53%bn;{=Ph-cm0-_xb9sDR7rt)hy=VzAP(M-%`mP)!evLNFV?Y`8TfJ z)hWo)D_YlH&GKK&kHFvtUS3{Qj{+hhpYUxO6lrBXB`Eq6bu%1h1)Z6)o=Nnio%QIT zL8jL*y7jJgugnvtTN7O;sF(-s-tU}$>(T#xA zm=)A?TZW#w-%i#CUzd=XZ*)4sqUd3z3h+x}MMd1|R7G6*-9^5g#I7WSftiifDJOJe zpi&g$mHdtGgvp8z8np|ZGAoqD~cseO;N?e+b2`dSCD z&k>lKRK%35;qjAjW*V1HM}~%mewYu5|JbHADh(*^oDkmF@o7&{Ji;Wpau-~?+J#yTUIHBnLD={8*$=6n~*ZTY>dK}_mC z6>E{3ABh)x^5u|?@hX$?+V2DS(@{F_&Ka8L@z{mB0nvFjiEaHM>W88& z-Jus`Ym48{^TO1MZ>&Svb)rTg^+$K!%ifi?VhP7TRGTyWn;$QD&g=zW%WI!<0-4%) zxlV_mJM~@+y|9e!2Y>{T#O95vU8iD2i`8=p6G?X2m(SDpuJ$ZK{=N#pXI&QY-X8uf zWlfjq&j(yblOr+00#rb(+t{%nR+)6xP>daqVcYoU|8A!4MEy^<40Ci7x3+s_tdrZU zxbt{y+Ao%BI~h#Pt)XRVdTqAhKR*N|n>$@!M2#gb_1Z-52CwQ?dt9?yjOp@Fv0vi>r#t;sxZ&Ru<29mz2erMnmgyj6KdpxMc|~E`j@v!c z)2*1fhLs9%y1T@27E;#y9}BFwIAvJx2|*GsRWaBcaHsG>A}FBWjG6+&UB$bL#dcs3cl)^3 zfty$+0L%qpH_iH4bZ*h-ft#rE30VLgJiBs34nIOPBk&raq;`h0Vm2^2F>51{`>N23 z(#hE!U0vFY6<@CvSbuPY@b^pL|sDYrg)p#;siFr`rReR{NaZB}kmIQ9HX91*;o zd@(ILNEOs_@5Vy0D|(4qhKY&KqL`%w&_yCT>^v6=;%;I)5U3sgcmKBV zm(T5istmg1(!^rVz3A(@CxRhsn_ z{~nm~OXM~vaolz#0zvBHURu$7`M+8_k{R5x0>y??b>?GmsW5$Mdf8oizU30Ic!AUK zdFNlFotAN2dmiyHr>+c%S73D@;%7L%R9IH_J6wbqY=L>i|LQB&>g6TXrhypbh<*hE zDb#qasS-;Pfk||3G&E1Z=YV9`yZrr*gx7}j`uci(wUGADnwLL~c<3cP*CdFa4LJrZ zCccaa8xUCk>r5q#el2hCGB&2!Hg_v)LToi^GvfB5HFBR;?r|IE&D72~8F6zUujFO8 zQA4wbR@ub(@QtdiJaE+IYpr33U2*-mw#%nxBxx6r4vFJjO1O-mQ#f z5Eu5K)NN{R%hrv_I~DZ}UK>te696mO*7_)+!lDzE&si#x-*`yBcZHs9wWCJ+7n?kX zQ}B{%dx`e2`G}6|OCLw$Hi)RjT{khB?7!{JK~20Y{`6u&iQHqq*`TOjU)0E{?m49W z*!+jyGL)VSw;&1C_IAk??cuQGnxXSG=AsQ1)1pWj={31XBy5{YH6WaOTm}L~E1tAC^Kps<4E_=>&~FyrIFOcB3lmBED!g!_l`n!@{?u@M4Zee*=_uovA(g zA}Xr%dbU09)aSFrD?mtd84TCK{1C9YaAxSdTgVz(y<0W_;;v|H>LVhOLwj6!mo1z2 z``DZznX=Yl)AIJACok$_8Vt7d2@coX97*>w@{(F3m#?%Px!Sn!Aw70B(B9pr!F@;= zPiy-36aJnSTH=x0fWd0HdJkn&j{D#VYq?S8-X#h+T#CECiNBxTB|D#XA+2T_y;J>& z!-Q!CcFOlyI-22>aiYj_bYbCdXVs&h$V7)YHrU?fGFdXb1UOLr z^(!?9N`gA#_gb!p&jNIO0CcgkGJV^606^D;PRrH_KHD6gdLqBPn`>4>>n>EHq-?3T z(;dGii?DKaW+>X8xVXROjDBVB(#bIzOiPXZO|*5Dlw2`9Z4hX_RX|Lv`o{&iZDEbI5+f594W~(+_lyIL>$| zEYHMjD)Ls`)Y0;==VC?wvX+NzZ_3w%Ga;|C`)6FFPlsUTh32rye`;3-kpCE7lhbbB zaWVjYaaajcHp<{|g({Z!M*cP71^M#jVU$FVS)K!WMN0Kn58uevX{dgftkw}#=)RKc zq}5Pzsp9YL^=zs6*2$LkvP+w@b_>PLHu^T3o7x^(5OvSLJo)*($6yI9EN4WjMVXH6 zDdc^`M)BaanE3z4kH6y>wbt=H1{jx-E1=! z<)0;o>KCUUG817M=lD0Y(|BnMf5n>6)Vo<4qVYE>*#gEo;uO`hN&(sshcsUL^}?sU z7k&wq%}%X-pZbT$RzsLV_&ukexG$FVmYYkVC(dhQ*z3Ff=7Rlfvl{U7r(mled_6R^JcMH^{5aL88+6~VX<1t zMVWe;MV_gdwOQT#tJ@zxe*6#X6FH9^+m5MLG0oA(FL z$n20VF*XV?aWBkfn0iS*_AxA`L3)J8sQemuU`q9$oJ{J+3t--B?XIkn~jc z;|00(t@6SZUAd;@VmCVEi89%Xr zvb-MdOy%W;LZbleSXY#AEc(X%>qC06k>CW8Z`eRgg)^#AwI!OaD;=rpced4#>eN$Kg<9p#on44jP6A3l9j z@_q1ttWn}5_wnP2)n7PwW0l?sHA5ZgJ?~qN1cZNFu$%Ov$$sZ@M(Jwf)$<)^=k+m#V9)q_wrR zJk_bYccrv)VKVyi{X1%^nFGYznfO`cg5+@hJp>oxsrz6=10ztV@Ti3r7UBFXyx#G~ zmKkTsVfLH&0K#)6Dkzdw^%$e@wZ3}(3MITr?QDZbS^C9HVO<@rwfJPY*MA)O8Y{zm z^nA<*eD$-42$k`A-A-#88_E`cERrDJJg7I4ys0U>kxTzJlyA&)u^{U{LZQUqIsyA0 zX`%|?=I5^&`W7vCci~3qg{tHp@YlI6(`IkW%4k>b*6zEQ7B-nRr{l+B3;v15rY-Z- z&6|R@I=0>J2!u<3hI5`3fGBu%~hJjA0j-=gE4t1yt>{RY`pYQRD&K7+U3NKU}~ga%cz1W@vy zotEM~E}Uo8)S6mbMdf>7 zCoS!iqoa`Q$_VGa{rgP^>%v{Iv~|AjT4q*>1BmKhH)~j0I^LI-GNDzCXbqd0oejou z@mO6T#(s3Xy_sb66H}eMV1H?p9M%n`N zR{BETdokioK8uPvJMPeyd8MQ9`d<9RysY)-igq556u;5oEo##ipP5OGt1UvjRY|9z zJ{*Wj1jqYlLXWV^$@N|>r!Aso{Qcn`Iq_^f>h~X<)7gb5QUYnk;UcKrAyZEuhY53n$ zueB;Gmh0mm!wgb>wl$x`ScpSMF2n}Bdnb*icM@Lp>MJ^yNk%r%3$n!ysm%brdv zeYhIa3tjf(wQImt7l$i+Ou4=IY~LWr5@3cXtPsub?_w4^bmGKLS65e;&Gkh=*O{v; zo_|8(5-jUtJY#Vdaa!VrR`C(YiAn+hiCW&gZ~AXR!_TYssyeBIddi+HpR20KiMUsI z{l~MA5QV_wMKdB|VjOaEY{U>)3yZ;cx9bt{+8H;|H#~Oe8J5@mdV7=SB5zeX1}qaQ zLQn=K2tOAv-Qu+JNr3s%cz$IYpFx{-^^8c-hRC94b=|em6|dYPZTJC+(-XCcwvp+X zdVX^>w$2q`vJ4G@y9#Tpt!28rXu}2Fu&PO92N$T}bLRpod&g9gFnatGrqJX(3P{=^ zM1^9Ri})L(DVYA+_>tcnZRYyfgKY+FzXdWsU>3z*Bg|7bza0R^j zZ=Ut_nGnBssV!e9!KUzq32}zqR~u;`P1DBRJat>XU?2qhfVIVoLn58!j~z} zMX8y8RkWe``9i-(N6(CnjZv}tf{oh4$aqF}V`+da9~Sw&_vGaf6{y(ByUwn5RRDJT z)Sc8dd|q0SyzXODLfv|zeU9K8)$P+gH=gTu^1$+;8lwZX6@e zE_T1w*LKXCqZhn52>NvWrKHnmEiU_z{ajLC#^)&|Q}eKJCL~7E$?yA3%qPhyp-$oE z;dwP9Dk9RMcQ9$+fdiMWSO~qy`phT>YvvbBB>9qOUSs9@lvU;|V3bN-U7g>&%vTeM zEux~LZVlh@1vhw`pP_U2ReZd6#4sil!iDxzkH_z2Q+K!e@#Dw8fNGjw*~DatT8K4| zba{?ob7@q4YiH+~!N%{=jMR6lG#B_WF?Yhzi2r)0;^VX0&k{rSD;*hl!}=2~4UZl_ z=75;&7UzYye2Zlj#e9hC?9iykCKl_2I*+&EvA>Y@IJu06JbLG+=pW34RlD!wGv5qU zvdOXcXy`4clmF`lIDZ&FJ>Ci|Xxrl&j^bySdr$g;z*Ko=1Hj7vQ+0I+7<`3?DYo!u zeF0&9-Ycn$W&?lr85I>j&5~US;Sn)O|ly?+p#1DI$5~~^Tg~TLVW1{6WY|z>VNzQ zy{xUx6c$OhZn+LxgzJLz^r!d=X6j3WO+$hQ^J$CN7)o=*Hi0R}!YAs&Pkh2+bWDnF z?q#yEQOwjY4!Y5id#|OnH8?j{;5aS2?=P^GZqDxk5%wH7pbCNbkp}mx)f8X4kgzZ% zlq42&MtWm<3(qcbo%oU#vj0`|z}+BIFN62)FW!@98J(8dJ$8+XW_^@QE zsd?dgK$BnfzV5q>8MJ((tC6Oy=~`Ej*5{_!JeTgZB_x}_NW0z7Vd>%`@p6$>#_iSz z*9pXc+PICmqbtREZfs}Sgp|A(G0yaigM)x85SL`+&D@Qv4{_8(aBgUqezlZ6t)I2Y z^n5G3Gh!jUazdXF?FAKS^3CDWcf_#NublC!qisv6>V*v?0_g}Ax4Sh2|k*RRUBVm;aP?V0wF{eN<} zPCSgFUjLf-{(bECLG?h7_8l0;0HkFK?1}b{1tBP*YPM9~~d_h{1?>rqd%XK%tCJ#>hK8K>2IUZ^nNkEXkiZ^Eo5ECINi(thXHP0IB2biaKb zBk=y5R##UBvL&e>_Q%+^aHo}MyV6HSy{M$n4X9vY!R5KJYut9 zBe@s#Yc+rkElC0lVt#(U1GrLz!M-Q_??2$({R3>Os;Qww{%5<~*3xqM@R1{18Vg&| zszJGChl3bnA?oawgA)KP^|P zlAm6)u;};NTxHt;A%(K}$BoV#59ANYU%a?y-dk5o%i@maKI~$)^3c}O8dc8C6Teli z^HX0&Z!gNikr6AHoE%kvQAFF$s7I9o@=8iue-8|dc4!+K1_G}# zt650GKL<=m_ehB(vO5{|hkTNypb9^x5W^bvrJv3QH)eAK z=%+45!-59$3?+`^5v)TWW$HLsQsnFBXExT7HfP^0vz5{u+$B?7&SH!Ro zlubm1M>MypMerm{{K3p#Kn(I;&sE-U^%~{qWhcrrf|p2??AT%Z>KsIE&U;U_hrYku zdFRd@5)*Bec=xT)D@`R7M4hDzDq(#Uxy1kJ)2E%wU*qKB-Vh_a@m#NavDL|73csM! z(7DVj1r#MEB_z;ZWyo3qZk80@h$MYr_CBM}9F5JA6Sda;da?Z>9uh0}B4DyMfwDX| zg*W&$N>t5$O#rY@_stDP0)v%vOZ9pzvOo{Pf%CKNdXoT(W&i&D#PU5jhw>~NSV>V- zW?Wocpk^M4KCWY6_x1PxVUxZ7RXbPkr);&AqWNRH!y@MMm0TX1LI-8s_7P#ts{yYE zWgSUmR$Z-H=+eYT(+U!ttzHDF+5EaD~79QS|cM0IUQA?mTNDsl?2D3HJEU(tT zH>unL!zifUJ*0oIC9rdGeg6B<%b@<&K%jW@IG)K?N=ozJpB~}4CF18o`QrG!K|}xf zkA{N$d<|V)ta>Kw73_x(Z>^8uWsV;(-}zV59)N*y_wL=#g)DY7|M;peXh)O-E+%E`&OWxdR06k7UYcDMyo zCs2x%H+;R$kJVLfS-UJTU>RpVZO=Qq_h`~@;QpeqQYmmbwzTwQ0Gk{um^JR8gOUp2 zf2i1x3=SVpowUaS98Ggc`J@0H4Gr(fNjrDMjpyR_tOx}J6PQ$9&H|}K1!WL?NvO6# zUW^jlw;7Nj`3%+*vNnqO6opIXNBwW5QClbKar!h>xtNyRrId5TWL+YvV_}33C9R`2 zP3r@jxTXg-Y~}ra%>U-wjRydCPhGuw*vMmEt6;ETKZ?#dx(9Uk!FffypU>vX&dzSp zFyf2snqZ(EVb;X-fKH7N8=q`Ji(9uuoJ-?HQ@+;LnpTHV`;jRqC_Dq`8_vOA9{A-$ z44EG@;~29G3I@OLE%FPyVeWVf+mto6v>t%{8$jl8qx_4g`0(LF`D@pX?Ag1Q_o91| z7)*;eafb{)pTV4c0VNxoaql9o1Gjo-30aFMb%{59`t)gm^cbGt(~XE9#oyl#1WC=c zt(Dr`xb$4l#|sbf;p4|20kUtxD?nTU(OgMKn^9w(^+mdK;aPHeoOP%Yh@+4GwB%JW zkZkg1W*m6a)RSZ*-!D+N>VuLa7Nv`B$w%T{ucE#2nZL{>AaW5%wO zHdxm>*=1JfJJK30sjYoYBrEM^e{!Ueg0=N=*`+>m%u1sNx`zP^V*)u6=2EBSz8z#peL zX*5vA34UbaK>+*ZfxH1*n}8&rDR@vomTxYSSYX7xZ)~Dq$JQ-?jssxg6fu3Ft&MEi zsWQw!kGd%97-f{i)nn8VPy-7nL*WeU?8FmJN zwo#}_#^fN~Ots47bL+iX>s<<~c7suI32y{a<5ZQEK@)F5d~NJ3;1h^+@dg4Gz%-FxYDV%y0x#pG(X zANw9Dwd^dXcarulDlBYVz`icZ_(wGO9PyT?card>|Ni~+&dK5L-X|PpRQ7t{Vl2vU zW>hRhXocMwZdHO>JwM|V{=?vNKJqqL`u>roBnhxS`2__{Xu1aDH-KMx`1Gl&h6Wux zImC}iE4%dJYAik{1bw$Sw93#fz5IW}l=b;?tNx2}KgrKvB{S3z^XdS`nAvu-^akn_ zceC?sFJX5@Iqzz=O3?rrh`D5V8#_EOWMFmUhOb_h zin{tYlKsPl`*w$!vhI&teL!BtZ!!p9qh?}e*3{SEi6Ie1dVwn|ZjeAw+aMo24%N}2 zFfXKIV0eh+O!(Y!c=5Rj$>!q4i+>#hgb7b2_<)$07!4gAO8omDKPrq}f7ZWLSX6}O zCo+6BIgK{)vokS0{_sJ*On8lI#|~ucZRje3VnMfmzr`IPEIeNQh=prc_idMrlarUs zh8}w1`Unc~&zR^%NaH+L^0#VfY55Ed4iEc>h3&h6IZ9vh$^F{<^tS!}7A-yi;fDxp zWL9BQtZpOhNscxwz0`hrf~_I>C`1WVK^S%LspdO0m`8&qnc83-CpWR&NLuYun_b!>cDGXz>8T97s-7PZb zYA5^q??oE9ZD$s@`vhwaC68h0KJ=_ytEaMB;4yL=$MeL`EeF3{UfFnl zayaiQk8mrWB5x|6!I%fP#}|h6@hqaI%=w=H_uOsqrmJUGQKVVcVr-faqmA&T^-9g& zZ$kn71~v9socdXNFRE4Be{k6R?MQnmzvk1YzA9R|PoQD~AXBpte14DntooBbAhOs9 zkO3;Cx%7w1h%lx3fP&YSEnBcp3JFOiFb*#rT*z)#RvOsy*js~f!;rlpGJh3%CBhX+ zuU12&===v`o^g^OOTAQ4V%_0a*O2UP5X)>6_!6-7)5`pK9*9Z;eRkwqJn3}RE&KL% z$TI64QJk&JT_>v%46_sx~XLi$omt_Al=O#Wuy^XL%%3ateo zB?O~%Mc9fp@f>jhToA<&FixF1HTSpT%^Ujg@Nf}1G!{ZiD|0ws?Qjry4AlJ#GA?sn z0n3eT4*D64bw5I!H#OS)+Ke_WQNcmO-14+0X$CFdMC%C=HK1dXyt`O4*ikkM9gIVw zWiqJ(8Jp>vl$v@JR|Jm;+WKvPU_nb7?fc(GR3uAP!WRDa2UnU1_+hzFvL9P%6N~DW zb(!E!W=L}J?eH9_0C0dZ+f7eTfrplu$U%xy7s-m0Fh?nv7#~j>92}f0z{b|70_oMo zsnmAx%gQ%y@Bo!KRP7S)Yfe@Z`OQiqq&@;*rOpk7sU8pK0G+Z>kn?`!vF9+Bh2E1F zFgca>AR{K?S$Oz^mr{3rmyT!qJbg+_eB%QL{4tzU(_V6R_&+(x0VklmP>-Lx6cjEw zgfZ@8#}eW^Ksdz=GG_9f>+WsdFg;(A86K;)o~fI+#h-@dBYFe;khTkEo_JG&M~xtK2n*7;x)-S4+#)h>O(@1AqUXJMbAq%5BMN@~En9 z6BH9x2K<;Th3dz=F6 zXM4N2yeS5*2&}-KdXO;qVKM`S*Is&hzu&+AvwwBF^UN_+gacLj-v{!4)6=Ka z)pz~s?q&}^J3q9gv$M0K{BCjV9iwcUxyt8)<`l5^UuY-xT}ZgiajzR44>yBp0X433 zE_(^@=gXZG8Bd=-XFxgLPpGwt%1=mE3mmA4gQKI>7H#Qy^?bo)p-FqM_qD(`XtYC> z+WX1?x$9v-z$b9<{5N{uxqhiOQdG_u$qvjH__>Vw;Pq@F5DGdC=zgTAlgGO*5Cw~74okX@hq zK^7P7ws>V_&028yO75#1>WGT}ClHp}RDfC|ylp5Q$OLj}N7`Pp7utw-_cEQdEZWDn zC~%}~@`@44g~`%!KDYNawG60u`UeISU+&Ppd|Bh=cBjVHsz#L~bzi?8oGZqtL;{8r zRG{1{R!i|? zf&;z;XsHPei^Y(};%RFm>+!1TwAZiWSB_x5+qH(HfH;adsC_e!cUk!VG16ZW! zqs8s330ehi01)~K@$vEv+~0NGoazcdSn%i-QlT>!xPIjCUnRU5(l-jT+qcE=hszpx ztDiBxIXX>28Dr64m`_wme_BP!jo#(E@g~wP0z?^>guZJxFp0t z0emd)=5~_sET9&|yh2WBxZn~UoSX`ZTa&c#UV2Is1R@C!Hx-cR`negC7Qu^$Mil^z@jBhmDlG z2F>SnMutyl=yHuV>R~ptk=}!zPXqWR;XD==d$ir6KBE7E*UDb3D0qS>uB4(871nj} zT(~VbAM!CDw1q+hCxRj29w%#5vOI`96T~KWK76q~^NJ7NY|NWW=g-p^7#PeYT1S~p z{wfifxpw}1kn+6DWw@==?#r8)#2aS&Mz)teDPTIQ?{od?>_YQvh{jx z%D{`Yll7@T4jth{B&-j?c=s^b_q^gkGyZc?8~O-7!^fa^@k8x}pzy}pwNO|8Hm~9+ zWy<7g-H99%SPY*_IvqjC@VBp6r>B+v=dG;iOHKUHro<3a*xGYFR&TFO*n3ssS`l`D zb1#Ipp^Ask=<+>lNK-J8a2`>QdNq75M9>Xe&xm8BrM3UR$p5cn;J0e4RfZ(>z++Xx z8xIZ`eE_+C6PVcL5{Nf|Ah&Vz5BcgkS3Iki z38?jim_S&6F@Xt7#jD7W6{H z0l$l?sCA`o|NVgZ?>=#!E8AIFS*@(B2t!mr+wKD;e)scEqHsE3S2iI=6pC=E0fe1G zOd$%Af+_RNwUj!`TBoEZk{*pH1W`!V;I2!{4KZ$(j~s1hT#2H-#cW@Z!&3=aP6>S}6f@rC+ieSvU zm;cLOe&GNcu-_b(jlO(s;jmNIJz8vjGZ&5~ zZ zo*CukVa$Bq*_vb3!YxqQcc*xgGH^fPTR3X;dOJX4O;_kPZ!HZ} zfvA_ny3NqQKma%pFKg709|bF3DcmKx$=gv`+2vq`l+h9l;bFE4J1Mie1szT|5)!(A=VVa6SlHxIVExqjazAAy zr2y+~I(TZ}sX@3@qJbY!QzZQyP|Mi(IA#d+V{GAGi>nk>v5-d;pmd|SJQP_^kXFH` z`=+Mk%xJw4Rr^poh)cru0P3r)0&{e@ucwn0GUxu_#1v@ zd&{wJ2kb9om^%yOC1Q_ELmjmr@6E9FdZLtTRRpc>$m+~HGFl!G+oMJz$@SilkX(L# zZs5-!U-$+%czCFN=}?rJq4CQLKguY#6@8-sx@~Vr9 z^YjM~2Eflp*2vutNWm^4(eX$4^+o5ztaT}pciCMI>0jT3T^OkIbkFVgH8V3Ci4Egy zY`Mv>LyOXP3%~CYUti25AWUVTcn{Di%`dm{td3IW6EB5Tm6S}DX9f@X9y)oFiD-$b z4q|x%ImRvJ02|wd#qy$dlsH7H!^B8BRA8_~5nl;a{m9D`)DdxfSp7$}bEmK?t$99( zPg9^yxQS7YRbo@YL-hLvL`X_WF{7SDK1`|G^r=l;U4Fd(MBnJ>cEmq|UVjTQuWx*u z_^wH#MGk2NOG_?5?z)Bx2@B+x7Uxl_lsb?1jg9TVTa{iJNpgXMkGih8A}eq=8yi8< zSijPM`U+%@2i%WDXAAL0Mr3Y{{w=2-&6z4O z>AgWE`EHnD;fcRLC3+C3*fD}oL07jUcS44Ba*2`U__23eV|DxP$_(H7FAoGxZRELG zx-8Ebwmp09<0YO-&;YTw1C{-80`gw9w1f?V%zK$gw0TPBAtK{wj7$_G8gsC-S0=g* z|MaKE-UhM&W^tNmFIm#5u)UWCB$nc!4u!@K}7Y zy0(zR<`lQhX|>K|Iod5Q+M1x2n(xdG_FOa=<0T_qUHyLVX{h*cp@C#mDJAJt{4B#^ z7xjTKKcqi&oFtu1C;Fvg$)n&1J|rxR{<=K?LRAsG`h5cfKA_5)M72@BOicY8$9Lt? z%_YIlj3TWPLJ=atBm8U6r4KOi$Qc68kmD_eqE@>LNdpHDix~t!5Ul}`SI@WG^xP#F zZUqHw+TM?WT)UZ=tTpH-hQW~%XDUsx60OblI2qtu3Tx-|-q`mBMH+kJ8+`Rf+X8Wf zj>futH0dTq-MoRQ2@nLh^BGAyJ@tuD*h$RPI(7E!4)As~82{((O(Ha6pyVUtU;f9d z$pjcV`F_<7We8lzoH&ZGDL?J;^iI3o_*r9FJ-p%9aEjORw+SCaaB%08_z2%?-`>q# z>0#k5=Aq2FLk1}{9fuy7wO zovp3TpCVqEvSFUD!8?~=roW{nCGZA#e2R?|_KU09#xgRZSy`{{y^ZmGO!ITSNHX$v zzLYlWlo^pb>$MiPRu2<0H+N+X;-d<9ZMeGy{T>>kfK*7_^_KpiE4+k?Tw&tdmO*${R}zpx%w0c|-H-m{{?rm(#e@D4hsqxxj(6Pd8yeLk%XdoM`e z!;>W}%_J2S$+r%cqxu>?hkgjtT=3=1FOnd6-@m^FZgBEOp2vSb>&Ihm20&wic1Hi$ z*xCJ76OT|T#;2rEkOTm~%QR_P&!o3+pR>NgYKf<(EqRmnD^LNw?NWJ(Bam8mzs=xI=N4?SBDlm4Af)IH9I!Nh z#6Z0(DBr8Ixf$+c5tW0;IP|WxEHrw06~3>W#Yu<6tWOviyp^oVyF*}e@L|+T(m;?X zamZzj-@8jf^`1uW6ZLBO!58mk1&^n1P?4ypbtyExM^AI5NWfqU@rZchxYd$jNwGUy znVUFs?nOH>98s#Uv$;t<0}>%AA;I*+FwD8EP1O?y4Bsq@!}`+;fH?sM2v-CyRLqao zV$VlEjeDK0YwGt;9-1m?3YhFM2b!@|^&HC2a}&1y<4om5Q#szmPg^gOS!uhO4odv&ge-Y%Y`B;5%7 z>3cfTVehf8mNug=4{31r2=7(<7%TAd0|orbM6c0@VU+hvs21(XA7!(o)XCodt4o-w z39H7gR|T}$&McB=y?#}A$$=mCo^cGk!lrK)qAwc6FXvCc};h7Ga7U( znTlE;cJy7A8kk>AluRx`r+wCYKIS0lU8eRnT>3MEY1)5f69i+s+%D|nAb&yg^Yp1Z z4Z;8|1JzfuBjtXHZ4Ih}O|a?LFKYR{zGv?ARDTU-BybG$CUin(DPy=Rb;f@T0u#zF zz8L^fV=Rw`mew|O0aaJ4$TX}aZG$xeFqdx2;f#?)P6}=q>Fxq$Ebc3 zIfCUe*cx;>-~wlxlpX{-H0!{+415SxfELs`{Jvd!B7VDZO#eqS07)|HfoZ0Mq}15h zxZAd`D-IeLRJ){{99n$0hmRha&Yq?45j4ZPJfG~y(2$Tu_=A%`SFe8{I-0&kiE39I zFt-Bd-}I${jEwAW`BkFV15r${Zx&2Mr+k!6y%k?sGPTZ2wA1VaA1+jX+Nb}yl9G}< z#A1AC6q(>sj&Qn43MIM5_|=7UK$Xjk;<8n zlY3{j5w(d=HfNwR+pT>nPMsx=S>sN87G9;Ik5e3~Vw-wZhs3QOp z3iGZ~`>hj4j-tu{O%j@r4dn;COubF}>uAfGW9X7=0=o7?6>7 znZj!znaF90(4UZ!;&=SI|APmCrQaeUOuGN8r1bGjed!Q%Eugi*Avh%DKEdeV84_YF z)Xix$uo_-sEbK^JOA)v%2c6VqV|jQQSlb-sNsGClNgPfW_!THf0o=~x*m?X@W6!E``}6#~yxlNaBgr4~jmHmID!HkQ(M7h2)C~xw&+Rmv}aX1T_W~7@v9{Jw5ST&?bPwQE4RE#o9HzZnZ`mePTkw zJr%{)&-L{?@%t?TZB73}p1@cM@&uL__`q#>>3u3qbU)#J1wn@MXq+MlD_8-D9u1r% zVw4A9CDB@?zit$e&`(7(b&yPrqwwU8q>{gA&N@kSlKz8)(2qR%>8ad?RqH!O&b^r2 z8Nev)cbu%Xy`2-Dpf}z6|nx|FP#=+bQmSK|h6inhb7d8;qZ18nvB)XZ$xjbYLPX(Y`V|%vlZ~q>vDQ zK2o)GcQUf>nKRo1&u=9WDO`mH1rfncL)`*rhT3h88lu}aNXEEnA2==x1#pC))zsBJ z9mfXb01z(mr}MCn>8`&PS)WXF&q81hbYNj-w%Om631%BC0P(Q1v+XYbq|@EoWkW4| zBgjr^--~nA0o;t#epQEpPmd^FeRTrV^YQVC3G6RnoVLh6g2g<aa>AowFcM{5fLG(P!ydg z`Q8-0rLGoz0N)Vmw)5xD6C@@cnWpA$cn?)GH6wB5j=*UL!>mGr25~uYtRM;Sq=y7z z?D4Bu@70PjaKI2fL6^!VvP?K|foH=ZKIDr)^0Z?Zo3aD~1aJOU!aPY@@NYQWgxQat z-{@;k&20+ytvKY~*K$H9*wH^2iURmmN{SgcG~DZ=A_;0Kc4_H@&d$!LL-E-ZU0mK8 zN>rE!*b!o9}~7pHj!ckA%s!wk-AWBvVPC~=ikRf!%`d_?>u z^n%*k)0Y^x&6EJj*`HA&z!9>u=H<&u&bsJ%4u1ap%R)9|Rh>g-eTUxD%03nFO1m~* zIgi=y!XqNWxt|{e$U5A`Al=mY1yYymHEMyxxtW>#1QBWqA5)ow-wIsuz7bqbQJn&( ziIMkOVtQMbY&ElwjIj?}?tE8Xo`+V&=w!Ame9+u)?wkziZ1|uAT`2Z!K8Su)NLNPNsv`Ws^7>cd7^Dx6(5HL)v_|1##i_7+1aMRb7?l`&QP6FR3yh>TDpS= zzXl-8grJ@za!r2z9$z{L1xN-Q($c@$60i8e|3n-H7>(kQi2!g3%f>9LHF;q${bw^l z3@)T_pMsMDt9x-CgVM=u;5Y6M$b@f%R`cCEvF|^+YkAeD9KgP)3;CG&A zWD)`H5Ksvn4RstQ7+1c%Igsf_yOCo)cUp$h+~6)m(VO+W#nda^8Z|c|Ice(rs)1-TvDtla$3#c%>U^&T z?pA#J!m9=o8vHCoC(zx?z+oug#MCT*BCaAILGWb}QLw-cJCxG+3)INk`Z}UB33b!$ z+Y)tzog5(vHhv9cohu$$^$zY!6*S$}qWv+~B-$))WLYxbiZ<-?wmcr>cQ%ExscG6-i0 z>dF&TVlWy|%NTFiS2K58FF%_#7hp(=whKS_bG}Tfcca=U>pCNh zyAXID_BP*$J@oV{vdfJd znY*~m0xthD6sd0Sb{yJgEz-=j`Ykvhdgl`po2koMT1}GjaKyI`s}UsL{Jb)Hq0vqZ z9yi01vbvAvZWM!CFn3Xp2DWIKzakKF`I1D)#q&sQOYYys%h2!b9g@qnb%$5<>qo0U z{bSgCDjB*TuKpY;np`rw;Nt44smSs`;a+p|MP{{Er)(HXP40;K(xAs9lJ!w$S9emkNg-_R7m*p+a1^qqt{4QVf6<^kLN!L9a_GW zelkJhj4jVDpxC*MlYG;z3RK%Tg=e;#I{du*uCvgV=Wu0F>UPr<<{#( z?wHhQUdTE5BgS&OtHKi1JO4q}o{DTI{nar)E-#!2hpT$4V`L;*#g29|5jTXfYdPr5 z@QdB|ctL^$&8tU7uVwrfeF6Rv<9kd^ z*>NQkG`KU5kXOmRe*L;pIG&LDgyXO3o{KN8?kg?O*>;^)YJkP|Va@^>$@jeU(%S;7 z>VQ628lf1%|(vcR+j~%loPQuE$Dt*fn;2Rs=T~+ zU~(QS;#12PZ1&W**mHP~Th&0j)lIJQb0tBQCe(p@u8@}p-QF%Tqt>-&|Nd>rBP6UW z*?D-+qd=}^22JZ-gD8T|twjm$5xjQpioX66xG8Zk1qbM>UxR^V01&wKHzO-c`O1|S zfywy?5$&&Dy{eH!NTRS?3HxhlD`2N6jtu%xE78vgL*NtS+Ldx-5`t$%QO=HG51yW$ zVqt9?V79i!yAF@2Y(Z=a@_(WxQa%|T-f^DJPqFdGsy>^e^P_wTHbZ~Ppg;ez^X5sSxkV|b+1&?n(dezQVKB(eZi_ReG z?AH%>?9V?z@}`P(pmM27@?%&Vmo8J~Qr2g?v%%n2P`omQzfOURJh3a!WJQ<%qDb zzCX30XnIivO)homU_a4t49lalGgA#MYDoZiHwu1gzY-z=oq<3WZ1F)DWSrYAckqvwrA|I;YSK~QicCeE`qCli>}iCo~_o2Z$82BFGf zE08U^Nq5N$n=)kAKFosLlgKOyOPFHNj%xB}V+oJGX!F{i3QaVB%^}1Ppn1+N^~mGr z&yLC`>c0(47Nmv;7=5W}{-4l;E2BuQPbAp*_(LS7s^}mZF;=PLQ14Md5IqNG=H{aY z$^eFt$0Q{sUuR`m1j{id-N)xcMEtRgL6Fs`?p6P)#A$GU^4-3-Zz5~DlrOXvIe<7M z%xYpnXtR5E`Y@8I66i5vM3qh?PBT0MHLuQu3II5QW0d-}(x5kT(x%Z(o;cx;aD(~2 zo0CX}-L8jxU4<-lDcH~6avmll#XMlA+u_6WU2U8j>js;gb2xvG2dm_Cm45Hg*h5hz zI6897_hOdh>a_C(;c1)d(-yFPwUEuBgCz5fW%N+6QclCI!7E%uDqxt{x3DisKdUoC z&FO;Bv`zh^+ZU4CxeQCHZnF__LF87=*XQin35Y`@^QX68gJc*8Wks{|B`gsr7J(IP zjzi?3BqnAc7@)_H@PXj0yERE;L<=#O1NRBi90e?>@O`{XaTN0NJ9k9U$SBsxOHEzf zd8AyUx`>^(&c`V3*m!=z;Q$+TQ+3+XL8kJ&Lhd`vYE=R%hK4Mqr6LWfkS&!G6O>8f z6z~V$dk!!#H)KUUNt_JQ2k2Se)ftmc(?ZlVj{I=(e%ZHsyUu&`&oS0OMK!Os3VVWbsjl93>YhQ_mu(*s zl>)aQyy8a`a2{(Rs}B3A7y_%~wR5!&E`UAom#BmvhNT{kq2%3Ni^QYBFLAQh4LTw~ z{7}E-cO6QahMwMI6hVovU!QKM5=73#@=vhZgnoEA_7!(bYFu zFH;kiiV!gToUO(r&gHE83-Ag4Wk%FeQn5}{NxytNW1=(YCXM1-CvH;Tt>G)Dwa&4> zAY77l{Xt1{Zt3l>Ov^3=sGf{jj_ML=I!K4o)_PH0*-*pa_Kk|3Nj1K|q9- z1J@%llmR;B-*YwJ(O3Tg(-f{Z(gGGC#5NX~QJ8ZFY`>-A;w_AidgkaWnHzl4dJ-|4 zT^(|wJ@tMe0s-uywXbO^h=Kmo1ODr=xUzG4UJg>{4N~)?-6yCrBQ6%>0I&9HVO!}mDIApht{3ik0EWtq{!SCLEit_;$;}G*; zAjN-u9nt>}f{qE%bsYrB^f6ImCNsV8Cqbt@cI;S-l{x|o+T>jWMHR3e2(6mLXc7>X zz?>sR6^OZnfDPgr^MbB_ND!(L0bw;4Wt$?*5EPixApOsUX?SZ$M7PG?l0YCW5h~62 zlEGQy&EHiG!){MzF*kWmZ_%V(bNj+K3exK{Y-4)wbMr)~{RSF4^#k5yJCR5i+W!w% z?*WeW|GtfD(~zQML?SC8I~gT}jBLq>Y_iFwQnFgejtC)SWfMXYl5{88$=*BbIqyEd z-~WF+&vD$}MK=Sch{ zlHOCFS<8CHh7%B?73A4upPflU!rLNvw2k{|tt$_8CEc@fv+X25k0^a?cX;z2$tR?m zV`Sw}mUoPJG|M!NeZOavoY66GmdEuU`B%jM{HaT9L-|vIxe}kU;DZVXL=S=a3=gLw z%3krckdl+9Dw}T$HInuA7DsjEfQ>pRL&wiCnErTy{t`9yg_l=JzQmdTyy<&0#3qkz zWjo2=@STQnH&lmZchtF5h-ha!d==;ZcBJj%()9Zq1!}sw3d8i+p-uSE>5pAEg5T_{ zt&^3RkNq-|4c||a81$3m$Gs1kZ<=ZUR|{~1S5^RU*OMl}AS1|`$ul*^kt2Tm&>^AS zvGUSmz-55U-qVj&;Uc5z7>yMCz;;tRmU3SGp}vPi&VHXvOvB9a=em?wLj>@%eHqmQ zP4};YBR|kDy1Uo72UzGJn4s2_+WW~woY zVo0?xhIWf9+7u8X2xeks;%BDE!_IyI8>>T4s~C=JiQPuCiZm^N64!pjsIqk{|8`pL)5%fq-m0{vh&tWIf$w^;NszhU z?v>SVvo>BV@yz!cr@dS5F;pjI%4R+u?;Ex5+g7#Jv(Epr%A>z`-nzQVN-=poY{5<~ zBCtk^bXHfe@N-dRFMU(ej}_g%?wt0F3|b|ne_r-0df(j+X=o1NicU;;l~NOTFMj=c z_-JrS@aZ)#?2W#``w>f+R(=vH>+$Pt7F4m#X6w;r`SRFMiNE9p<-eHcQi$})wxR=; zYw_9RSfcVaH`jsH#H-ZuEyeH^yUy|Q+NU?On$QldJ*7w?k%*Tj`^cieByBjZ_|hLbPwkGG8D3yG7tV|Q zt$Z2e+f?+iAbG=X$voxO=Bt_Y3Ie--F#}%~UzNk$84^YI_2!R;i3uks@HenFaNA_) zFfi-v>@>=E+dPc__KnV{4U?#1T|C5Iq&YA*)IS4+k0sTk5Zw8K001vt8sWvBy53oVa@OM^8_x1}Du{6`U(+ zLmii=^oesq@Lu6gx!&v2)~QGk2u0ZC&XFZ`cq&z$P-AR6O_#!7b*1oo_b`2%q*dW@ zwP@e%ew`Cc^y{~KSFMqWkF|!UCEUv9lgYJbUdZp=if>UKAY2tZcbjs+n?BXIiIine zg`v^=!XHCN0-NCdifxSBf41^iTU%SiEEyQKC+VzoUS0E6x;#ucy!9l8m9p$U#X#`i ztcB@3^{zdAr+avEM`EgGrbi2Rt|;`e-EkEeSw384<}Y%eLMkqGevNJGJ!!1(xf$)5 zYrWzt$AarZ_)DKYg@L1d4%|A$+-CfoMGq8Q3M{hg71~X;KpEC3&3o)OD0nPnG&C|b zy^lo7Z*H2U6>P%S`1h|UmWQ3ik`{VK#^p(Ot14B^2<*WpCnxt?a-YG$iQYXW6~`8Q zt>1jh>%3gr_>A?|$%|R5KAtQ|w>Q35$>)bzByf0{_B0I?E54hQ0W||bSlL#W%suh!tC^6XH&{7VsDY40Ql1*60)Z-w9m`9FZ(9{Hisq#XsAEJ6QZ|`_#(OWjZ zV-#6o{(0rf6|YHa!$Ewru!G>v`D;bXz#!Dq`uNeK(sEj+4>EkQzx->rwvm+f{N`Pf zY_~B;SZ0{Djmg@-=dv%gz8wh#`NmpQbIYGCy|UYgf)4sa#0maTu&WFu4DSL{_BN=K49}p*qMQcEiq2WsH;?+dcX>H`Zit z5a7p{msbNtQ=~R)b}3J@NAdZg-8ZIRwdAbN-(=x;S@iO(_-N<-tFlt$7Av#ZX^&P^ zbfGbyu=*K}aw$H(GO8gLkB7<*>IyshQvWerufwa=$KJQ9`^=|F*X4y37Y83W1i%G* zq!fO&=lC~d7pUDgg2rK{OG80GT_)O|c6mseVoB}3##s|?NrCG{ffA`vwd4*HLi`L;gOY_0C{l$3% zO{I1~;pJ|#cSA!DJZt(*fW+~Z*{mN- zi#gXKBNXZ^DzPNC%%gQvlzffF>h$HT%6q8<4sC|PMK7{2d4uHv1cpcVer!qSclvNM z(68+Cza+WQVwj`Dl~+`>r{Mg6Ybui=^}VU{CZBp!Ql7sSd}Q%%ZokJ=(urkJsq!qn zRi^8+hO(Dssy{S8t-9ZEwtdnx@XDX%HMF@v=CRkaI)Qo$-Zx&G{` z)}68!r%Gh^F?|?z)A9Ml)39|=LqjoY@P`#FYs@^3(8|T7X>iJv{9@Se z1QLgTE0jf=!*6LHTeRX=8=*Fr3iGo1hplWmh7R%gV6-wN!gf6qT?1o0pN8jQs(e*5 z0$P;5z7ymPWxZmpq7T?#YreB)`?h#=tF*W}>dgDs&AyK^k4i0+*<^m+I<|J4`2tNY z`ONKlpY3Ul--jY9&X;v7XLevoRH7yAqDO`GvO2yQ9j@I4(;a2*hT5DFA(obKMl~;` z4QevY@5Cx$bgz&+6zU$Zpq^noeq1$&FzZplcUD7>28))72cF}4mR9c`4qQZ7!OKz? z!*RIVwuM9euqu&-gp+(84Shl*P`&9OdIh(3Ezrj#X z$ev7@XW<(Y2N{P~J$uDcQ{LsAm0YH-^%`8d5UG92AVn*4cA}HtS--)AFSoorr1^Wi z$2B};&WNN=8@0?1m<>iOFRSAS_b3R(V(s}Ct3q7FC)v#23In!mhD0gMZuEq?Lu5+EK$a{<5=>ma8waF%)(JEhk&)>(?2)dVRReT zNCNZ89Q}T4p1iI}FnfbwTOyle(`peZxsE0qo3_I= zKA}oB`C_52sf7h;aNSqLLF?bdBYfqdnyR9k*z#*FVas=F7P_HQ{asOtP!*DKl*C?in1*pRr`Oupvcf=k$*S8{n4h2EBoNiM0RYgBG)I# zr?rD4UG{i18`b^Gv1PVm?h>uXJ!$^Njjzo0lga*B)lPa9s11tBb^8b^n~Xl^=Ud?y zc6BAa@9})t9mdh0F<#$!eY$wB5A7MTpeNiu_a=*fAga!Es#jc#$={7Sy8ciVwD$7^)LoUPyRb#a(P|ZC%#j|KeEk8LPA4I&h(E_S3+?Nvwp| zH@LR!9MkGwYlLha;#4e~d?zF0!g*4ibPW^|^b8CzafNR@?1?LH8FzZyP=_hXxxIQKI5?_`Eg!GBwm>|ba#pxnWiQ-mrc7I;N{rM z=x+9wo%Mw#dE1>(-8f0^H-m!bX^M97%KtEUXl-8f;x{Tczurc%#8km;I`)r7liRXwe1vEZV1ai`s>_+rWRrV7wK&y$_~37oxJ&`xM_5+D zdEj5>pCZxcj1UnOP3o{Z%gcKrb~$O9BM9qeUg~jU9TidrR3qy?zP%`#JSvdj1`)X% zZ{+Iy<&?X|PSvuL4elQf6#FLoej}>D1ruB9`9wt6rVwaUwRF*YfcAMs3zqhm8kk!y#>dKj~YWrCB`6?D3s-29gF|MrK z5<(MX>GH^_s-eD(M>YG_jvH!kKJVWWtKFQsFCaY)EaRJ%;HM$Jj0~dJuk^|3!s#Og zyI1m-8B{o1*)vYHBO` zsWN(H%_MfxGDJB)vP$T0FW-2{vVozeon7mX<^9m~D=Aehd$eBRi~fy1T_ASS;|NTM zFu{#?jZ;5;m1()nJNypaSp^iYpIS~=w)Eiii&nGNQ7&=lI+j^XV zVf*9*G9-U}1J&s#6e(_}LuK!2aPBHF{86E|z+|98jOZX(lMHf_+4o}GAi*)Cv9B-j zY)qM2I=nA>#&xs5kYDb88=#ZPpxPeut$?-n^yJLt`h5-!RC9&x^DkC& zb`G)%t?&qX92~pe+bG#D+}_L7X`_x?z8P1GVsjy`|Z3n-h_cfPXjiTctwH z8V~0Y4&mVjZVLLgb^&A$_zid;f8|`FC;Q|K>Uc|C?H;EdEs2ETk&%bZ%}VHsG1h2) zH!NPh1Y9LtGp^X@1)vXm^ytwSfl#YLIHgCGt315oq`Abi#vx5M85nNRdO1qTHly%> zbH#mP!LsEqHQQC7d+tKRs~@UV!HTcTjh*#nH1}y(U;jP76*L&O6{ffp``YUKhy`C~ zpuf)pxfOh|(=e5_q#Yk0MG!h6JfJjd1%b_r)=@LxuRK5iHSJ{86L8o z+hN2#wkXS6nsZoJ0n+OSWwy`ML>RmH4S6&w0UkFQNPGru$1T>9u+AMhfAJ7+10)?C>%uNM@nsX?$|cCI<~SBm7L6sIDziTUL<>{@6{rjJhRF09>{c@i=7mX~f)qKe{{=|xld2mA=I^v=NpOF6AfPXD;KXxt; ze`U(Z7F_L~U|Vnh>>X43cQxUJfAQC&`pN5|Gs01CZ?k>7O%v11+Pg7z8>yB3-#q+} zh(;RUziGY-6$TCc_A^6pN%&eN`5pjDqgj5GA}i6iX3J!j`jR1!MAnu$DC4vi*8Gc=Z z(6l(mVDlJ3dw5_yFpsR5cDQZS8G3Iyw-~IlIf) z<#c>{s<_2kvd*}T=lG#O>-xdXC;cCLKUj$;EZo=Fi_e^gT zB2i?#jh$F8-r||3yu()wZq^(MZaB&$v7=4;$dEQ-X&s>HGk8$thst-!t%JcYjEiDcW*@Jw ze~8?n(@fwg=-~l^49rC%QhC$$dE{GxVk=vkdZs*weXv)EC)x& z?eB@k7l7srnvHX32I}@Dc6&?jP5T>0JYH16bsvYj^xM-?Q?p$f5|nRe>2U|7T4GfU zj759OPKV2!%^#s1+Oy}++0(4bx-wR}^J34r{Hv37Eu#u-d1~!5p)2oaHBV3GRMW81 z{QPTPaaQ=G;c(hL!)kK}7f*TWPyc+rLq~56IhLG0ScR4_>ft#7fo~DyvgjWLVwLF0 z1H??0w}mzOW8j-M6aWj#D}4fvD$K=jer$`bi#i5Xrm*jQdG%w|u{YzQI8k@*Y>QJi zFN$1NhGiclIU1a%icfC|#p<7rntIbeGxG!p3IaE3PjkHOEG=Mq>gwvBo0|c=w5GTR z7wf^E4NdTkU)H1!G})gvO{q zqr1u-lzzuJJFbi1q7x9f+b5*6-|+qPW?x0xKu~6r2_N2(e2NdYE?aY6#hmBxC$ttBJslMp&oKyH*0b?>pg;UQ-{}IXB@1&APSB!j& zRwM^@Eblc-DM};kv|;{5v(8lh{Di5XN_xb`x{BzYy{vl8C+;me)I?lok9vJ=E^@Bo zJ_VuciFXhq>87TS$;fb^sF_=@d5>0R9m@8QQGd8oi>uNBMsr_Z$vtGjAKT2u&Ap^y z|I#p8krm%NX4qzD9pG3G-aes>RU7<`kR zO`EeLwwXw4U~j0tK{SQkQHHm3mu~N-+1JV5A@KFSS?i>kn+>N@R#5^6cl%6Y1ml{T zpW#ZIkwld1O`*mf7oM(PzgQxhwn6^xk;>t5Ic@3^!37puzu3HcV_8*~Y=hYyMu89l z;6Qtp;^-4#fJ@sZ8o&LsnUjk1`>}WM!f`C2$6T0k?#J)nj{<5Di_AF=yd=M$u`egU z*RT60Syv&Yap?XdSr;$)mM}+9*jbC*VtQ8iR{VS7#7OA9jk@q1p6dO3f|#kqI5`Z1 zlQMV7FddC!{-LC8N4cPcv;=63DYjV+Ubqc|k(*CwNOz)4*^MCz z=b^-;{EJ*K%Qo>HVI_i*jZMhLhWDe#kK0`0^|%|bEb%|L@P%6=iVx9w;$!9N>{n`c z`@6t_L+9N^!FgK9n!37dcyf(=ifQ;oE5JWMSm$vDurd< z>$E?*chSGtPOiPJ@&dDHm~n&gQeQ!6ze~$tL8x9|Mx7>H4YA_mY*0CW^nS1z!+cM_ z`UmECRDIB{Fid*&{92~%TSG~fu1~7pJ<=Z3Wa!#=&=;Rp789gyi8&s&IojJzRdCf+ ztE^axNxCZcw2+vY@XdFJ{>0~p{P@embwhK)i+81#_&=)aG~^l9EaN<{U+<#*xn@Xt zq&cKy>isW!!`TqIUsQ7qdzu9Oam)2f?W1pXw zgo;E0V5~inO{R*k7tk{3ZLC=f(AwD898>!Kazhk3@yUi#o3P?uFPEMs?cs`WD^BY@ znoD6Wc_~MSJZ_I4SF+%8TT(qcpG5mI$)M`bXV=WT4Mt{M7B_vqHOgJcKC=NoUfRM~ z*RqXYR^8ZS41}V-^PQQaw29?4mT}7`DV4c>QMwhxtiX4n0aVonF(Py=a15U0rd~BTMDSme*9NcIgvPfkZMSp|B{>ogA=q zFP>6~KM)6m0ySW0=$5mn5*%&Z+@e4mbgol-Te`Y}%&6Jil!!?sB3H00{Og+03BVLU zu$cQCmf1msVG&c08L9g_j|wU=$2LDxPD98Qh~-f^k>525IdVs|KH zpa0bY=*e%rjS}A}#&~GP>)T|Cp1XC4;9N6hh7uhk*Ve~~xF~xX1~$eWla0z&O|qvL zlb#(kD%3?eK-5M1RK;~X+&Anjiroh-(IUT@3Yepb(-h90seL_FTFSRr$a5KVy9T4cp z7E2wTM>P$FT(ySiRW04#-u^}$+wOZ8ckkJ=X0^2ly#xBFK^o*VB4Gs3q_mumsVBa{ z=uh&wgN)5CMVomyt*wJ~-jE5b20NYk^XJv*!;yoF9`X2@gUdy>-D90j_w7X#IU~0J zq&(J8Ute0D)Wgc8;P9Yn2zy%r+AVtMr#6EZ=ovi_27Ll|_NyYecEbL`ePxEJG&{ef zB(Q6;etgl@(^9IOg`S);R2JtIxs^fE=W}=2ZHE#){p(@4j+urVL%hp-Hz9YHDdA|5v-322C#6`?19l5X&XPiq~5G%cC_41M=v6~vAS~JUU zoSi+3zllEt;BwHKOtJ4_mGM zP-M-ziD8ny+<*s*5oias(9==p#a+_fxpJf~r>deYUfCI|@1I;dvo z8U0+dI`PkGC-j3E1Mkmo<%|Lf&V7+RHo9J)Y>W8$_-f!v*On+4t%xfc+GkW@zy?uz za2@R7RyKT++thM)8{*r6dd}QR1&Arm%rjA5rWRGWh>nbqT2!^-D{*m`kt(kM12I@J zg{3LjRFa{I#?o{LEIrSD@Q&-~zBY?+3jv7V@is9<`33#C zCLTV>znh{%uo9<=GgO65G?8mc*TA+C;-u34-8_?Pdoc1?cQPYGjq51S;>MKookvvf z4G#EJC17dbQ$<#6^1|pb4m^l0koVw?4xpGwDb`zvXbDeNeliE;+eoQTcGwS|Fv7TC z&;`2C-Dodxl-?E;EGX{@jSr-cCo702&rLf=PqfQZj4OXYB?FyAUR9M!W(QKi(k;?! zq)Y}W{I{q_Mr)fhFQi@#GDywHXk%BPy-xJs3gac};fpfX7ubl0$ia=q-mf%%`C3UTP$XxW()Y6aLi3e!;@~YdA zlP3^QoHAxEh)+)3ISw@WN>1t2bA=Rbp_nx;NL_ZGsxaU&$f1sHb|nL;^)MKvq{YN= zRI}Oh$jCB}gYj}KKYslZ$Zm2ii?6GbfjMdEJ64D1jV33L?LWMKcbiMMMP9f<3OEvy z`fKWZ(I3!i&98>=e>8BP{%pc0hMv_T2G9^nTbva6cz=pvIf4r@3VJ{4?7U|Aj`eSS zPtOa7`jPon%*>z>x-qC_}h-c$%srM&xl;`D)riWox5g7I>dLz9tbN9I76`Pr6yV zy+q?3&CLVsMLq*&Qk*C=h6OTCotW1Og$k<>bgqUc#lS5N;va6+lJFjZ*b4gIyG?J;80Lvb4Lav zq_Z4;Dz4#R3t0v(6%#}kQ2Sra(sG~a+XgMmRJ!cNG`4uiX#auV6|+vr{tgmtWK(kd zmzn%my#6siHal6*_csdf>gc!8si2Hma1#?hFLQ;IsYg?c!Q9i6&cbjF$-i`|{Ea2; z`Sa&de+}NOzVYOGk*)lX)Bx{yjcO%&tcWa)CL!KYEx*y2HsSrj7?#KbiEq=?1SY}C z@R*L#sYLHrsmqlm{`+`emU#FLm!r-0YJxg**BB6EoCJLXy!J9Z) zfMjl1S%E(ogtnXFnfMKVSvIjmWklltMg;*+z>P*%G}!P!%G8nwgog=$-mo z4<;cf397Me1(&8vv-yRDh&(YJ;A*7EP)k}oI|Mnff9qeJSCxwh%Jy^4q?O71+gNeQ zkcCRQ_v89u(U53-Djp+e1dARJCqB_?iOdepvemfao?cJw0eI5@JbJLFG)j(P*6e78;VVF;0Nu$W*|iO5Eqo zv|A_;_3MnEdP&$RM&WGOt;e-0pQAf=%x!elkd)~|lXAc}h{=fH!jlbFcu*I0h5k!G zgN`LEZ@B%7kD{>(%@>eSEp{0{T7Bc~X=}U_AT^&!yE%fuu@H~1{JJQ8RX$`?6EIhJsYM-3emh(qUC+mfvO}&|`H;o|LH+OW82==a-v)#-JHjv!LL^#@aGe zSrrxH$@yUv6;QmPn7O8}e+u&exE>25hfq$BMxQVZ=$&quURKW`5Iah!3}SD^D_fz@ zefg3JcJqJ#7%7zZEG!5hI^%1ruHN=k?zdWxFY+sn*oboW_}`TKPUmGFD5t3lJ<8!l z!HhqQL<@4?;-vp4%zkk1?x)oRnE)~rFo1C2FaZyOOUT6F)Qj!KxbLbUU zWD^|jiRIL%PkYh#1L>ldLOBvC(fhxs*3Ns?FUk@QSKI_;3c1?*wzjAACS*+6{_Vr` ze5M-%8k`aQYXx(5XFQ%NCY5`U2i!w(51j^zn0o(Dimdm*2$n^0{!9EJ^$fVe@Hh$` z{cs*{3BeQrO2^;&W5R=P_!0Rc;63|~LN=nfc5YxfR#`?P0Q@K~CtwEgP6SrFx`ngWd)zsXb zIHSKUZFwhc=!3SMLMT5iX=mnMTu39E=!8n$9rSJL)X`Boou)&w5*JICZd>D0h9RGgiA3l2h`XGSc!()fVVF>21wsZ^6 zLs24um}@CH&OGla^DgX~B*qgVAz9Wi9G9ofW_Mhx|KMC8p7F)c?R~481#T2XXLnFjGy27gsim(yfv~1GHLW96d#-S*az1`K(K4p3WHH~j5@CC7 zV=m^1-6;yvK4;N%txRH}%+JqEHzxJ4lHe}1=hcZn+mF-JAFFy16*V%T;O|zU{P1hP zz1+P-ZoKLJ2M(MS5b#g6M0tvXJL>$C{W%gE3a)`!5%hr;yNP9TrG^(%P?G)pA0-s2 zC>BRbTkz2_*oW!TW$vHnkN2UbsSj_|7Eeep2x}kxFuq7j$!f}(O(9i&ZCLCL|Ft}) z?#XWt%aw;?JU#MWDJ~t6diYNIh2(F{SXJ5{F$8e37wm?mQexiQkUJ^TKD_%jtQ=SK;^b(~{8pXAu zF~%J(EkDWBqnxHiegicq_Iq;Yj0EqyF9j%8K#4i5kpj}LidQebd1{U%jpLYf+8kAC zN1ZMb-(t&y*kXVk%1AZ{JZw~Z&!Y9fPej^;rip0#z>#s3cvcY8|A&%Cu0{!9tf)UG z19{?|`&NYtVhqD8D?dgQ+oP2&i@HFshCF(t5Sb!@*@6#f8339AH{y#f4-ZgEXf>xw z{WHIMg(GiN@#W6wulC*e5NIB*h{l_t#lzCSj0}W!Coiwh*ubDo{tZ$pV6e~+LEnO# zgky+;8nZq{kxTcF1j~FKU5LI^qfDqr<6`tHAnta6mV-BB9QkEs!5JB-rOtghEVWR9 z#6kRs)L>P@hz*7MbDyz~r?VfoD<5F2S_b@&6@0pn| zQRRXX5Ee+E#i-eS(VuyRVxo11es0I$(+`2{M$pL&R zkMZ`jN|3+C&Dw(fm^Q*K<0gZPpNHtHv>_ zvsWFHQPt7Y`whZKfc5~wBqVtHqui_?y3kdF2%VYfzl2&0(UI6b!ewOsqJqV3)qMfA zQ0d?|khTzB@f=ID>5g~AE3=_&=&_U|T@UE_!Sz z&i2YYqe$^vs;Gs^1RHJeN0|M!xQ@c~QUx+YQ0yrEN-H#&3^*uA(YSs<-ItMZ_;JHF z4{o_@nH?cDeYo&q({W}(vBUeWiw!B_oe=8u|E#a zL$7ViL+lFVVTP`ixlL{`Y2R0?!Vu5XvCXXQV=}Fx6;(`O?4GfN@w)LvzH{d+#h6cp z$={R;%pONTKm!6N(PBMr9FXc8S2w$Y2oRM0s_=|N226e;#PAp*A?VI7Yjza9@W2}b z7;?DpkkrE>$WWodB~?Jm!^}=bhR@Wnk5J;&q6cdG$hTHZ{>2`s7tV=^?UaZo{T@o2 z3+#{xY0mTH5Sj)ClH$(pyEH8B>){cjmTt0>^L(pi+Kz~S6CrXU^g`Ps@Em}n#98`N zk_SY`$49J@GI7g`#{c>Kd#A;o65C(JZ2&B1S2Z*R#{!8o^4g{z#*EasBP|Pckwns0 z-FD$_M&hFl64Dx?_c2N5jQp~QRb(aes3P(*$n)@Ml|nZxEF5~t5Zlc9R@*3~l_1iT9`GiOsr zOLr!qPlZ?w`41vPq)q&wWKSXN-!$^|O~5HeC9HaZWBKiXW>OnFavE|y~aihFj z*ARQ4hn4C}(4ih4zTz+~mLRRa-FV{A51ir*iY%IDUkSwRRUG`ibu3j%#Q) zAnFuCr(moS@)Le+eFOe^Bm_shGX|MXDkvIc{=W`ZoIz6)tw2AXetu_25<8H}!TICl zd+^8khBO{t`DRr}1WJ5h7{+71JBbHeFpYcqg%kFtYN`M;VOJE%;$<4 zKGdp^lL-Srt)n)@JAg%l_dD%L4e{xJfLNPAD6yDWpScw6$L67xcHNmxF1p#w9sBEh zcX7P*&N%|GRW=#j0b&ex8=0i~OG1a4w2zkjo| zSrl|NQ4OFkehfG8nU&d_2vYdLsP>3or_HlL1HMHu7F%UP~&pFoEpQnU6VrODduKozt5?Xwnf6pcGj9q^@XHTdx)jM z(O{Vu+oV;-seS-jE6EvECu*5hZWZd{lpv>*IT5S`5fYKAGdmPcQ1G&<$r(*8wp$2< zj6MUu>m}ivnz*D1>`)@%Am+*;l{LsInr>kLjKmjLS+B);{w-;k8NFewsv$O`W z)BtHk?&6)1YuX%goo%CUM8(CGP>|uCDRCjA0GvT>_#fc@)OJHK%pkG=0Eapki3tGZsgI{T9svfu z8xDBZgpbVL=%RwACY0!C5>QxL2M3Dos*JY`vn$&J85_t`z==dW;KUGo4o#B^-FT4F z&dLohJcb;Nin_|mV=~zo9=F>F-C3f#X}QVbfp(K9zKH(mBcsE0 z6jF&}w6s#~0)y_SF^NJ*`8TeIMORQ<&a7?x8w`08=WcircrVBps=dfFKz}jm5}I%` zR|kqeFmTLzomPbw0<@_9KKi_-koxlC#&=8mZZZYTHVtkpDcK0o0T+#Ia$yzWz)=}M za3&V;aq^uuLcm6O3cpJeToC&@ySoKb50~k2+xAw5HVu^)xID~+#D`ZvK)S*Jo50H* z$6PS71C62xJvrR5z{gEp@-MzoqSx|z+*O4Be*ko^N}{B~S|GOh7nZGmigN)>0!|J1 z0EUgw7+nOk526Rm3-eVhSwUf-ze)FyM}gqN%r5XC+sIzsX1#)H10OvmwPJQ2-14aNi|BvY zdR?>>Y1=6Pc?j9eGXOnwbaiV+oeh4{q6GmcZ9YaM6ry8e!)U2z4gNvA#A-d6hPm+PdKi@GVT7)G zWdo5nqH7PDe8e4ReYVJ^MwXdY;v-9GJ!)~Kzkni%8tC)jMd8DNA3uC>y1^G+?7b$m zJl&htY2)bS6+##{H8FYBb%k=E(BQ}`J$?NlvC??@7&+)TLM561# zzXae6(jbDI@4W({64Jogjo&Wq+!)D# zhETS8%AI-~dpVNW_u?A^dxs(k!6okyXAj6eR!}{U8$#D^McZ=vkFdpagr8vg6#PVy zHMG$O`j^8}hs7rsHUoix{rta00d)P1${&^61pvyAI@8Li9y@l7msP{SOf}c-d>UKg zk>I+by$jAYV)5dxa6)+h{=Ic8WwRM1tNc(x;v?aVlhn69^5?iup^Zf%qLkrYu@^)O za-#ohT5Cr0rg{7+D*6%XP-UOdaH)SF zs92>X>Yo?F?%_Yf))3Ky4}sMA_wNrY*MJF5OiksXRR=(gST4tM@*)pYOLa@jquHM! zvdMhME-#crRrIgC-;Qm?+}Ws^@jMp)e4q1&pRn#xvXY$H?OjTKP!^}kDAH=%azuxhg^M2oDI zc|UvnU*%@L{awO=eL7j_*P5cY$Q+J)E&bHxI%?Rpb4mbIc-JJzWJ4w#r2o{pM0L4@ z5FekhKyUf}nAF_-{7YO%`6d1=dR&8Y<$>Tp1s)Bg9xdPA#y0;E7IK&pqigy6`AO3d z&=4Ra%v|lA`vA2QdAv~Bp=&A+Z)-r)Eh@VGr>6k=jelT!>bNM8H>SP+K#J*K!=tIc zKdn8mwx2h~EI8l9{A&4EQ{@t3GX{tWhrpt$O^a zrJ{H5bgo@1c``jT>jwP}bi5^cl~0ng!A>~84!?VImK((S@>KWW{{w-b<{&n1clWhX z>TyS&eVPXptI>og=t6I0K6MHw5wr(DHtuC?KQO;?%ceJGq)MZApUdlA(!I1@);T|p zsNP=O>7uIQWRS_t$>}Ps9~Vn`B$tq<)Jyh+WKm&JN#WBUy_wb$7DZ;83*9R+6wj+4 zSTd_c^EU{~Mt7TdPRv8m4k`xd#{MBM=>vSPFMeuoSO1t7a)WoJ-C7`M=jwB3 zxO?KuIaVeUo7YSVvCX?H3?zSdC>||LKS%;n*yGj-W|ae~n3Wb~P&^CeCKwzrm)RTN z>P5yFbn-h9IE=SmZ&>a&cWt*D%<>`1%e*K<&1)cCvul z**}s5%(mfmUuxT|TU^B-K!Ru_aQbktL0s+auQ(*5`eoGl1nG9sc=DfH$)czWNl7DZ$|k2Gf&+7KJ~JctW2*)y#@WyL6wCRZxy>oj;!MaA2YyH*>V&-C=i<-pYoFHA_k1tlP65K`3Zi-8VS9Axw9%NY6q;JUO zD8ZIzo0w}QdiAh13WX*Fx(1myCL{Qa`_wXy|5#dDg6tA92IxVr4c-kvGZHH_I_oCO zD$Oe_ya(_d%ri)q>8hWxK;^LC-PGh4ddTlAC&L;~(1wzG%KKByC3#dlvMt)@7gJNd z$7Sy+k{Bs@*%vJGZ;}O+j`v<#T!?pQss}TRX0!a&iC%;+4Dnrx^+UwzU-YP+7qhjq>)hFn0W%%02Ux#% zv;f0i&Ww}0;+64c_uV~lfx^GCL1nVUYo}n`>RVpA;woyuQ8$XZI&&7hS(BxxWRU!i zMrqWBS>5zYv!~ya-}(9OvoVL~FS`6G_+Fro!F|5Qe>h$_0IQ4+R#YW4L(K0`ot?6O z_YO4hc)yZ12TbyCjuBWiGCL}l*SsWTqrnRx z4Ng6vtiU(tnSW>DSKd|epFh9GE$HZ9o`Qum!2C#-hq=&6QTmEcIF|e<_<_2d=@SE0 z5{t^;haAFqi?2a&GpucFGG&|OWxaWm*lClb#|=^Lz`_C*y6IYjqfD)QvCTFohXi(V z+}V6&iLV6}2m0kBK`1N1r(sJC-UeX6vFA(Mz&y=Pb_ufw-EC^RQrtZy>`T7%fW1R` z#7-&xXHxs<-%19iDyba8&0Dt)yu3;ZErOD$Qi>WVE|ls}Eou16Jy6K(Ft)WN$DXGr zEMy&4i)pb=?>EMCkQv)qkCQiil(^lIkU2l^MDl)U=oE`QipiQM+OqYH6BAtAJUmQ6 zCs7oE#}}2oo;K$k-g)Q#sSdwZC(50S`xZk!Ex!9HfclpyTJdB; z>!s&Im4RS&b|W~U|6+J-&Y8yjF>l>OF0aFCV{Rw1^1gf3Bozh+ajq&1S{WeP9B~%K zalvnd%C;9#^T;3G7tRs1U6rcydQq2Y)jQp+%V~+OqQ?Qs;YG6Cst!7~l0Y5+g|L!; zxmH^H#VoCxMvbz`v&Iz1SIj+fXr+*n-gZq=diI7>NTs5e{($f2d@mXZq|CdWHk(g! z@MBt9Tc0)!{a6D+hdRz8=IrXJ2!&mUryUuuQPL*0jl@ok1FPlY;<|x}WAtbG^O?2c z-#jv*ga_&YoyJQ_DTdctnXtv!VQ)xTfOU7jj~tpS_mX%FS0j?;>c42no?1TJeBlw> z45Y%Uyyxa$SNq2I62_knF!}GtrO_f8vKNuCX*Z{Jpbr3M>b16X0AB?HJ0|RdvKl|C z-wT)YS-+6h9vyTdg*Y8xX-S4XH)5@*Zt~^tjyZoSD?5)T1jR+|;Ou_)x-iu7xq;z# zPr&n%97AY!e+5HinMEFfN~74>uOumKzZI7b!Os-WtIIES0u^`1Hb3Aotn?dpN9#m- zmqe8cya9GBqaECy)_!in^cly?-KQ{o4V)#Ja*qZ8JV9;`hTthHB6I;%5Xyyt=xsk1To| zjdLl{W8R`?O;(BjiA;IzYMyRZ-qkIqZ-W_i#-sa`4@;3oi#=oMhbt}m$conKW!&t^ z+Lp@@pAaKo)?MhA1ZeB9aW}xro9`MxZ#bDqu!yZ5D~xW1%HQn;Ql(6;j!CEvt}R|D z=+VFeut~>GKk;kN9ejLRvLg`;5ZwdHIi+4;uG`+jE(;`kMOs$G)c!Ik19H#&KQ*j-O^W5cdcn@1wlD?N5{Je z%;`TqfChZypw2kb%MtX-~PoB_IHFn)yQkox!sO>3 z8=*a8LhHH}>esQLB-YnQ>RU|`g72@M9;xT1cy!nRyW_tKLH)X$T+d^!Cfpr}ZEfy8 z^YEU1QhmdZMIM3fz4!2kl$4a*y(&vF@$vW32?543xmG_pc?K~KYq;J<%GN`4WgIW9 zo=$b2os5ZD=~g%i366rX)V^f&;JFW!(BG*$-HQ$pj**u4(X^wmH8tH8D!T)~9;iL> zoNtX0W6pa8uZ}Kyu)RC<`d_7GQ)-f;=APRaD@xYfZ~yjczsR)wxU(qYIbPo%7F=b2 zJAY6{^+(SR`z<{+Hfzy%WuRG6&3~Tm{}q_@(6y|YRW9RkhyBY^6+ZSygXq=q($UFV zo@JlRM+Kvk^*uq#{22>Ts)(~Q>@^*(TbQVe#U$g4sN>Zr5Asngx@9Oor#G?UnQ7g4 z+0*!J&`0kSa#Jxgs2<_|J ztS5#YN!_TC0a@6g%02=2DsZ zvEYND{hQjH!M8`Rs&7!B5}VND!HnuvcFe&cR2y+_pZV>L%!~TTu_Qz--CrSP&g9TD zbZfQ!eoaF)sOE9Ga3df}fZ7O)P2Lt21;DT^_l(?}n;2GQ)dMy``N|n_H;G*b)>2Df zKOO_f3$)BgQYA~v+Bmp|jA>A1@-X>TWK>yo_C^u4T3gmIOPkiAMvJSpnh4Q%PavlL zo?oq;>PB9{3s)E4qfN$8@$QUoffgNBNAQb!?~7!Uj2ch;XokSC{S!(#gsRSp{nwu34oa&^7j?;$b(>WoOD^e9 z_-hBS+}X5zW|m*V!-YPr!N(37R%0`>-MADaQ&kE0sba0kIL;*hhpRV%rm~N|fKeow zGKCPjW|f45GGxv?r4l716bczLWR`GglrfQ+R4QXhNJ0q7%qwFhLnVCsssI1~ed}B6 zF6&)y<=*=|zvrBN_TJ~5t0Wz`?C`>OLs^WcyR+>o#WN<+Wg4MP2U4k)Ta_2(Gx$tr zy;jWnr%9pA7Y&Ws0M8J_N&@ykNkM*NQXHJ~P>?@((4OIG(24*pT24IPAEps*mIh5k zWB{ipzYqO)@i|OVTAA+2?T+d)+`x(&xn^q8cQ&^EpqLB9WGrGlJ`yobL8bNA9-9^5 zF>GF0+K23-h;48h}n>Vw~W@d?W~m6$mRNfogLB3U&o>%^;Lu8#qBvLt`WImtstLZBT1H#4*IU!8TcR_8jQ4Mm)+WEc;17=Y zE{*m;O1tB0_)AgjK-oYqDIzW^yhCXXFoA_tHmO*%-tBaharqqvFAY++p&u{JRmzHr z3Q6r_#oeVC#QITH7nVG*s60G8Dr6F97j1GVo~}>R0(&4myO4FoZxDXe_@nBy0&&y3 z#xj}5`(V*17{1!KxrVxx}W|!drpofUM;nnCx=AAeW3M`dL*~ z7)rq4w+%(gT4DUOl9C4+)nz=n@8TD@G0iPM>zoLaY<6+V;8tVTNLW3Fz~`a$gn1b* z86ddYrKv6(S#JHo^-{^^nH7=_3z}XsbO72e&0k(WA4e_J;_#!h|HzR1^)T^Uw{GDn zLo$ahwWXdw?U-vn>W*3!l=P>wX@aN;sD--DW1D`&X^EAEJSe!`OjA{TQO_fu&`zZ0fYi*5F_nzO2D2Nw6 zDOe2v^pk@({sQ!;hOm>1ndu4NCF#g3DxRsa!K2;xX|wb%q!(D8`ijx#WsU8KbFIV2QPA)0VHVbmkA^Lqq{FmdHoM7z9ym| za%YPJD_o-Ayp_PX1UK1nFG)AiCfMK6C#Ji!a$I(jxm#VERX5D}#p>fJsgi7Zr}%j+ z!~Ti2(mfnC2T}|$u#5}8fLS9!)&f{L^M~KOWN|lcc#uKPRd@|yBKLjItfpyFYPr$P zX2vkZY|sD}x43h3LR{ObsIwn8Xbi-FTp0XHyhNkn>~>MZvOq)TjrgW`0ZM^S0V(p# zswgAHRGI#l68*1(Z%#=qgrO61qLcay%>y~tsa-}U%j}&&=Yc}rW+W#g{M!!5$YjQ{`Uzvp&x$;6}|T#0W=aUKdS+`l)61fj;miIy9G=P1MIQy*Gc zh5zyNDBLO-i55{QsK%EgN=FdG--PqKq5-oK&R4ZH>AA$E|c^#+9;1vu=lhql$Gs6#%J_97Fr1^w=_M-ckBOTuH4<<5NHX6 zMsw9g!5*Z`$^5cjNj!1Lbcm{ekvVeSzZH>b;f5ocDZ0cV>?HTMd2?p^OH`$_o-2#- zm$^O);~aPc?9U4Oo7;VkiQfQW5rLLU@y~Zn$fVLq22i{xMw`?Q%gP+sx35mvU~TG$ zW^wl@_Eq%^4r+mo0ZD`nHI|#i0L&GYr@Sh_kioh{%%Du$Gf%?1(9>X87k{)MXd&4H zf}z*$0cm?xFa%{ARSSW|z+{=v`wKFiHKcb#f$`H@mTS^NDe=EG>K$rvpVYI7axeOK z_xW`>%Agz}{>WSD>rJ_XmUK}($-OfYC8R4_OC@xi*(L>Ze z>xHtnZPu%I)F7vhF19P)`RkZYdZ09hI#D;c<8tC1m8$>|G4Hv0|EJ|ZMaGB?c!A;q zErl13PrUsd_Ujnnvy&yNZLRtCR*eMejIPy}zEx`@S=|w=e!Dof%piFVrXhJs-^N3P zimcji8PN$n(K|TaL5U{T@>V=eMb^im?4)6C974%}vwZQn)!>0di+tXd_zd(5cdsq_ z@?uX}*9jeRsGW3_nRpmlFd&$#QMQ}oH3R)4qi9Wu=)>{P(L8fV8jIW!GveN96 zSG56ki@-m)#H!4W@sy(KI@WE9!d2zY5(1(Ap>U+UIS0DsMXn49=P~V2z$<78Z5PT> zAfJ*;-WsbJQ6-~hokb(IytIT1Lu?O@C%;%*gUkfL2vm&~mNU=ty>`}AR=x)PfWqbc zx2g{y2=T!n*Z}4!@wFO;i6LDYCmpSNvuI%EBdIRdJYSYp+<)P)aZ>dbTcnsyj`gvmLY$#E|%#DH!m*A z0{8^2T)J(TcF6dWJO%E<%sPBLMv*Mw(e~gCF&_{dLr&reHCi9nDK=dSSGlT~Kio(k zDJi@}`3JT$LA%yb2K5f3-#J7v1avVIr}7^7DX%TE<(6l6O!j!_KJhclFbc{PMMeWA zgNm-71C7+<$7KpMD}XI)vSR@chz}jGUmgbxWLN2RpF`mODd6M4wO=BzNEH;$r36^M30?Y{uO%^Tp>ve@^&#SgkR zpEH!@H|hSM$ll^mX51JNe;LOGQ5=GLg6;z}5+cfi{s#vEiWSA9u7>mB58D-vUL{v8 zYo}sQMvq<7zz_-A)V$(G)mj94n?xyODNLee@=JlW8Axd**SHse_TBefdfDK*aZ@N%l!qhVkEw zFnBF}Bxe}y0DvY0mPcTzucro!gUS)4Kw}ItD(0*ZlL0!X7o%CS^dhh-KxfXA*fq)r&;nw30z7K!=ZW9H;;6I5>X zMmhRk3MnG%P;~97bHG?JMw}7de+y^eP{8lkAxS7EXRan;uA)uN6?@hS6g7&IKDRdFnj~s5&HFE@wpRIx zg8Az!ca@ZMDDOj~^yDwS@Hb9RUO7Dx!8`^?cZibpwp#;N7q@``+R7LaQS~lLScj!z z&qKN60b(AEe^`~irbte@$v?D?W>#xV_LKjWFe(p_4|~X!o+s0Fn{R^}MrjP&-H!Ri zrk`*}!TDHlpdxxy9X5+i-8VjlRp`o%*X5OKvP3KcD84kvCgv$9L`@m!AjL_< z>F3X%r)8T)XGS9b!a4PS!coJN7E%tf1wTg&ibt4}SJ`}BWVlVR=TRGmHEi!o(H_Db5l!VME8k69UgfWG3++DEAO|KK$2Bi}D6NqSQ!o;uTx} zaNcikBuLLoS#h&C|4g4lpq&Tv&GNtC@`)0#? zT{QE%FkPt*i6vzZ;JX@}?cE1F)<+O1Bhhp;wB~>B#Rsx647zEn&$zWs(>l;cbXPS# z0TdPyOBf@7mW(AidXsdY&@P^q`Y8sOfUJs)CMzJ#N&j`#kUx}O8*&EnGfpm!rAr_h zI)W#B&?FRhKC#GHFxu9}=#fP}gFpQf81f`_5`8xl*aOG*{T4I8DkPd6q;jp@|LX;? zxGJPWg!bM=>2KdzrJ8;s&w;AIIaE$L^DmP@GJC;MuiP>{y{G`H0rEIvK7t*}ZamOp zdODicPz7;!S5^_e`nL)1%rz1nT3AS0y#g!a9Qz@39o_H0fa%97BU z;oFnG^SF1A=Q&=O=5Xa{+{iF;bh%3UTK{z!=q0^xc8x84qcx*3yacaDzi+E(&bQv4 zIfGF>Aj~kFR7z1X26|pa|Dm>Sp|Pr#ckhN;mDkk)2#|WG1>s1)41Eb^!8Y}3fuiETD%OfFwK4=nIuo)MH5H{7 z{d`;Yj9rMm|Yq9}Ki`F$luVC+Wc<~*mN zoQ_E)KZgEh7rDAwFPH#2)_4WZAgqi4_TwRbR$Uz~*^GMc=gQZb(&}o1iATlwjFv`^ zmN|bz^}}T6w;@14=f{?J;=b!~fY82l=_+84*Ico|6^!WL@zL_}@j^mw1ASAqhllYD zmOa|tO(wU)Fc;tA0LD2mPqwsg79|cs(&NCNw2&^qia;a;&J##6IDFHdBO6rN?XTj*JKMB?RYt$)&sp4}>tk7J)*hch-xLl~k&%(|)I&%iB%b z^QhNlNS-k|vyJvB0!2J2id`8c*$el*AutXK&{84(AWtIwAk`=>_KP)o8|7&8^73Yw ziK{YiluP(vTT1Wev$F*#hdb65$`QmIpcoKTwW|!%kP|?NfADzA2iOHhu$6}2hR)bY zh8t%YYqPf1U>djI-f#0(ktR6)|C9hE8Q8L||0ss~Z~RxGefM^AcMrz6f}ypug=XSF zaZ%iE{`|6y$BVm>gp79IN;^2<&a(+d^=v&DN3Pjxg99AFcnlzvKa*CrR>{%}G-6#} zbAP*LI*4T*1vv}{f@Cx9B(PlQwT+AS+U%s;4~=XG1_RuxUFFl2;`|$L2b}NT!Smbp zYZq5uL~Ml9lTR^zo*=LQt#O+(MISAfAK!&iACCed%=#a~^aCd;jmF4PdBz0ojZg-2 za&pj$g~yqIOGB@A@`bl_1xP#@Zn#7UF?Ko_!8}13%B&VHp4JL53#^x1D<jXw+bkr+x zZK*QN0#L;zO4in)zO@IJ0)A$^z)|6B+|m0lXEI6i{?=d>ieWcz$-~k$S0{YHNM!W7 zRR26Hq@z~RAKvchKTnK;#qp`OG+X?@rn@-J@Yc4pEtEzYK44bhiH*<-R`xdHt^#>+*elvKfHM%Vt+{=(_WUZfU#$CaI#uaE!rs z?R=>v(#0TZraz;@NsmGOx{L}8P1MG9OwMf4fCLKo0s3C}P2(f_)Ct%Qpi9;bpYkhb z;}Ep-I3~&Azxtc~yEhL34}*|o9m=8zQHowYCKH(KB~_x6_xyv+RXhzZ(eRX>1re+N zLfYH)!(esp!@Z5(%~H)%wX4=ED5WFhiu1asK}^p&&-2i3ggU6UqP#IW6BdxNZ=H3Q z(AFEG!XKo{{kptfr%?!eEmc zKosT&BVHlO?3mBfJmDHio<@~DAOQ>-@oTt6;P z1aRC34$kA&)_hRjxFUb^9Kw97)*k_?a1F`LjK?wn$00T$qJ2{u+@JCY3eN6u2%TL7ThCBD?T)vjTxn*Ojhrrj?Yxv zApHRd4}aiGP5L~EHc!!wKL6wQ274+q+goF?RU+#Z-sPVc#)$E9IRNU$O2Ai6D- z8EP7U7(nlxGYvOg*h7Z^3jAY0dpzV%j-T&o=2FND7uo>l6rwD}oT8P%yu&U5yJz@I ze~UkUT74z1^M9W}4dd5fE^ryyEfY#n29{J+#Uh%3Vn$5_czGHbKKi8%c!(0l3E;`U zJU0!L3uCsw%EhnXiVpL9bNn~DKoEoCx|R>;bPOX^!y{-L{NWZDO_);7uIpjKshoO~ z`{(2^(XLa>)DDgEkOgOiUja1X&I1*LSVhMBn}2@Y^}-;8_j68e^AGg*VI=e`a-4p{ zZ4RbnX+4wp`ETEtK@EoRm++52TT5>2!|g>6GOAlNA6Z&kXBX9l#%CBGPC8!bRZz5D z%Ut}1ZR|e5ghsQ}!G!OK-Kh-LxU5HImjuTS#GO1`BO_LLS@&+oB+7yyxJL>-VQ|9> z!JNpmu~>jp_T(Yu19d@6L)?gMCuyzACyMXjQe+r?DgS6dJ2~;)`&+|~Ko~}8(Q+sI zguC2tXWZmLhdk9LRpB30>v|JFq5&^;5IyX8aIFw<@tc9N*sW_Y-jMOR2@c>;<3`@RsYsNuIU^Hk{9t?5Fs64a< zgb08>+c;?Q6S!(@w5Wz z{BvQF6~m}|v$7{-xMR1iU+Z!T>zmaqwe(*Y^{NO+XP8k{OCqRD-yh-e<(Mx_U}M;Z zFw`}(Zx#c$hwy;0QQ$*~L4~wp9mIMG3B|v8wK(XTjyS|6zPN z(O)y@M@50h6!SRZ?YSWEpkA!AW)ZNX^HkvVDxAFd-0}B2SF$}9SVsy+NDmmP_^XNe z0W!pg4<9xaNBXlJyE(Y}v)JHBzL|KzWZRJyXW_)nD84a>L;tRSt7l%zF4$mE_k#=s z1&!2vBA=fYk0oAG+_7#I{UDR^bAuslUinzgg^g&nC?VKSvd)Ktv?pX8Jdem`a7Ypt z8E)B@P*G3uVufQD;{&vY(yAID-y@jj#r&d$ld>3a0IMw3L~8?nyhU3uD1vX#mrtOW zc~)6z$6AlP0CbtVbXgZx0{DmEV}WSh(GaV-^RH*Jwr60F=P14eFc2XSqawiProh^= z;jcC8n*7YQXh=MHHSw}}u9+J=jYDgmM+zU1?95OLB3_i{HX(@NK0(;`281rS{=_0* z-}Agom}rv}JNSX$S5afoVHN%1*qNmtR6Tzi46WRH`I$7(~sZZ*vWXh{vDsu*Jd z#h5}a3KBmicG%^~`6;F_O3a%LsvG++eMP;GUUiES8AoluySW{O*gj+#Z;~?LSZWzw zRcSNt_SPY%-X;~SV@(lP;Sm&UYR!EL>4 z5#^^PCEsQmn!H&wwgQ-tNmb`cuZc!WNhnLu zlseISMWv!&6W0MY8UV6}(bK_iCyLg$gi!^psJ(X`tUitI>bVVD=fiRP(ThM}H&o-O zjF9GIV`Gob_D)=Uez~T5_y5$+2Nl_m!+ef8-|@u0ehx! zZH5mQZ$*Uyb-*U27!ou32g63Quc12Qh=IRw$Y(9*KMv${oQNwmfkVEm^TeK@r%#_E zH$(WTzY>ngkvLt@yCJ4ce!f$Az?cm#ueafYV2q8gUX(WBqY*vG#{|z+cHYwTE?oAd zXBeFqNsd<~tZ0c%=_soEFLZ1n35>N64VniBz?J9Rzm@AQjUpGg3O$Kbj^N}osGOxO zaPq-~;H{~VPQAQnU_pyg53hP$niK90M;W+3cv_FS8CAW!;^Wg4lEk#%m0jZ{G8Dcg zfS%Oa<{C+mTgBZwIbsg}It%Q|rs4B_WMKT_OHlUR&DK{hI4O589$=5o|3N%A18vmM)Z#ClR~R<&V||NGzyW`BHWpKx@q1uYRCq|L=hi$>xIQ z#}@ey0+^+}QpKrclUo-2Q&j-|q1>Vrs_`s*V4&xxPoe!6AeFWOGV@Hv7eV=<)H!w& zMI8im+?2jO0GKEp@xsT3js&rxeZ|8mlI0nb?cD4vhL(M}A}HXBY6~|Dt4GmT2bBV4 zugcBwZOK>imZ9j;5%vWn{DTbx0S&j7c!E~~w1EDu-vOU9w;h1#j(n!*$bbLQG}%4+ zdZ-e!fe=?C26y<%2bkP%he6q7=W8)E@&F;=BSA+rj188*UI$+df)xxGvLAR=kr~sJ z12qvhaba=V{?7yf5^6Rgalfa#JEbZ!#pmwWU;foZbsnh1k^UK)v&yeM@FxE)!Qtg% z@H=o=W0Fl;3aL|1c*D>Ymwoy<0-=>p{?D!(`X>(pJa7?e&VMNnMTBQo3@xpXBg9g| zS~vh230fbT=4Hli=+mSaG-R8?vx~|PwZCXIl@2-HASZ2g1!V`J7@|EhKL$vX9)w#o zFCP+32tR%2uf05su&Wn*4M2DtD*9>|CW@Zd60oyv6a02o;IRMn)vRuZfRKFK0!x7Y z(KTq3jhhWku@SQ#kteX=U(aG9-K~L_BpR^;*Xz)!gZxSuQSn$BrU^@5)1%o&7uNIq z1X{A0g+M~(CO)A6C2qtTIhbUS)BD^`l#RRZlAUx_>LICMHDDkQt z$~NnettEe(v4zRbn-$*&c{p9N&bi2aoZ*N9&-K#kaElFO92{VClq-@(x#3#&$54bo zqeWdc?Do&=3vVjenCjMCQ99@$1hHLOs#?4wv@*j{h7N)b-i-nwhKo%@Rf_Y^WGlQ! zRyHo2#3hNrb_v?oCuF{$tyJ0`Vye%gBLmMF(a0!RR-?)N*8rZK0NWB^Te@Z zsz?PX*Or%;zmGR>`xGQ_Mu>+IMZhT7CsYMXOB`g7N#*6zlWg&?%v*T;RpWqzTeLIg$CM;Bre&?D-)#uA%>6!wIrxku#oRD zctx_~fzKBwtGGJ`8R+A)oyjd|MnHS=!Q=iix`gM;5`8XAY_}f+nVJei?_0eWNFl48 zYv6h>iGLjFSpNE9q*c*qG;*f%k0+UK+1WMXtjhc_m{DM?4lZ=B^M_X=YjQ5r0S;v} zZM2g-_%v<69K06vy#K=4mAFxl zVl;Np{^E7=mgb9F?$3v4hctJpcyNbUa*H4;d+v>%zwN*^tc0)@p^YQ0wT%021OyBS zFi@HrmiWdW|D%|I8z5K|JU^FVgt9U#&2#<)&`qpgr!U1_gCm;tbrcUU&H_&!@7F7d zT}~Qhy`lWH8)QZ9nLUotpaBVvZ1j&`4X@%+YYfHI5J`D76dVyzICJ6BC02MiEhT|% zOZkQRRd$ZrVWutu9CStCAwX+TU=)--ihxMKt0%XOKqU z+DQkG%5(gIuj_7xek4#Tfc@F+o6W`9Iewao=v900uDaRYtsA~QHJbJ!uB4=dLY28k z<}G#`T`A(5vp>{1>48DGLEvOx?B*Y1puVaKpC)1negaS9!{a~jE7OEu=fP~1-xWfb zt8ea4#<)NR^phWe%s6`hGgCNjXC2f+-PR#~t62cYrD_eNy~Xsmc8xF4zyAEGbp4&x zf1v?wNj(EGf~}^-0YF{bFMNZs{S}^192pn6K4uG@0c>8b#U2W{)pzgSje*Sq&C-wn z0XZPMX%4#1J3$055NLh%ib~c{cqf#CQ-Ogsu2kdLxzROKO$nhCP;Y2$-RF4VT(0iT z%IJ)c1dEw8UJL zfW!@#p7Q{R;9wrSH5e=!jT^aP{TJ9qK*eEjw`ZPk0nC0wg#}+Amb;ZKFCV(1^Ow3k z72IgUK+wo2_m~dKYc^`Z$O@SoR2EUe<65Fs$tG|$3`3Vd-ugGbNzN24sH;#oiEy*t zDZ7>t(La!LTH(zzUvceUn442t?E^OgBdB-?T`=N$dq+aUr!z6g1+GMOhy0M$G0CJD z&Z3r$UxnmR8(`cff0F4sns8B*-JwM?fk#R0Bi`}TH0LF-6s490#hgFIzI*@ajl=2( zjwG|<2MxJmeOmkO=n?kQh&lkFe;^e<_pF_S?u(Uv$UV=WZ@&8S8>NJ>-F%pu0L}0QFHDAZG`F*(f16W(^XVa1=JDZ%%T}UrrT=Pn|2CJ9Fb) zg)gJDSOl}0wP3Tf;#1hia|4W1QCrgx_WbXon~>+g1`*{}Rh7QTW4i(X3;$p9VV>o~ zK743!@4>L!a28j|6oYjcq3=RY{Puo+E9R=NPVeK6{W(9r1ueWi*`3a6pmO;@CnFvm zFI+M&PN`aNK>hbP${?Hkw-W(hkHEeFgE$lru|F+41=OC`dtIDIU$9 zpcELZLU@on{chq1gOBX!F6cDO8!47sd_`x}-rV`CO@_2PW@V=Bg=ZKfrQ4-T`;1h+ zWI$W!93uUa#rHthK&B`oTc%lVOCA{Z++jum*Vho$VEQHmMJxdPl;wMGCPnhVY=<}0 zrT82qLKyP?w~Y+>mEpl~5I-&9`jn-q4S47j5Wve3GhWwycp&1hYz2-Ag;9GpC&D&H zq=Y1zYBT7=5(Td+FycqaxCtM`-ZpFWOB7llqcKpRC+9R~HB9+5X@j;zIzFW@h&(j; z>(?9K=_G5@e1&s_&FaCjT{2-TD*xbDs*HO)))il#)jf@3ItHc}7#%<&5WYSa7ka`G z6AkMG%${%o$DvGujsTzmFOx~|@OIstj+%vKb>r7KSg-^(OnIu~BV4|`4SEWY5Q2Za zz0Z)F8Hq&|#`TU#|1O8%7ws@4$Xl%2pxFko3XMLPyoY3}%BCSVF2_laE@v+AaYL;z zDB=wInQlmo^V}E!UZS)%>$gLxrQ<#~Dm|xolht2FB0G2N*g=dWUy8;cQ?^&Q!4&*A zblWclG0)Ha%@qyzY_#Bo&oYiVYU9VNrKttaGg_}c%`WAy&w-%8MAcJey$`>)DSio< z!uh_Tq&?QZ_}Xl9?ojJI2(7A12s2Ou2NQiA6IhuCO*) z9fSc5Hh-pfPZOHB_>F%U0XJY~Z`c9hIC#J3=5|*HuA_G|1|CZEX@apQ`caR3e9XS(}VMVqN+5H92}uu8&NIUVP4jIftpE9M6{5!^|H5kx8cyWuFZu@b9O2?d32`*}&K*?@ z4(gEk;;>0z>@rXnp}StW8nOG6a3VHgqH2Q)cN22trAr&Ctm8oN&OF#UFOEP$m=1Bm zQ6____{VK3ex!^vMvMHnuj^}HQOc7^i&Y2x(?p}=?SHk$+5BaoLDXI|7s*7Sg&7S@p`PpJRDf*+VQ+y?k)poVf}9Tmw{ju@3k*HQH( zT3^@|c+WTJ?YutPqrRj=XOh>lrIUaBU;W0<%sKzIQ45U)@RLx?JpNXpJXq=}RLCJuGIHdma8}jap!f=_~8`IBHe9D_K(~0#{bBLE+o- zVBi@5W!weV$I@!TSp4(~alkuuy|A?dw%ZHkxyNV-$5{v%6yk0R{3@wSoLWPnz_5iK zj~NU@f;@~&_WEPXvfK>lT==H6Zdb=0Q%{xFx(QT&MgQ7M3DPKGIB|B)cNMpXE=M$C zgKSrDV5V4JcI(O>L36uPL!&l4BL#0ZQh>@jr_!oudN?Ul)ZjeFwY;Uq{9FND3Vi3z zFhsBuAbIPpDT(5Ni&kz z$=Au7o;m$d$@Ysi*?;xv=g#h{XZM@!=2Yf3*mD03)vW=hnsb|vd~A(8?v*jRP-o4}W&AH~z=$6v(`_tv4zr+}(|Y*qhaJS^jcx1Czd{+K3+0yHjd!a8CpPI`P|c*dc8`Fq~q z1W7DZA&e!RdHgFbPXIBLrz82wm1C13u6+E1KZEn!VjcEhE&3dqY2D2_zgwPSw0xUP z7aOlk<`%b483{8(q)qZol(AzJBE6Ivir;dg&#o)q^IT7}v8HP{m(gu`s(ocxYS&BW zRr+H4ZFl$fX_=%CW!DP^vqo zZC#>9Z0Yx(*9>;AbrU}(G+atkJ#LD@*lKIEsw2NX;%TM44Z z-OKCawiyoykv29Fy)Jy8UNlaNMTbBr1xt2${rR>Acg&oE9)Qiv3kQX3^inK+y}ZH^ z1diQAt1P@0gx#ejHOCT=9>;}3<$n7qXXh=)XNUY;Ln|X7Vn{3DRovvG7@S`l9X>Z=^zh`~ZyW@(76xX+}#Z1@KW$_M{u>3lhDGFf* z9q^B^KH_7ohBl!5U;FdR3*}`EzN_Bs7UW?cNstmx`6ezrf+ozt=_K zMGj~G+0o`ad;8Mbe#sYWiVHid<4EGtYxn)b*H0eOC^`}NYft5?{U_K5jRHDabsDow z)6)e!+v1}m%VT~9=HHUKsPN~g7TbDV*_PtDUuUAxjr#J`m;4sWIgy`v!Eb@Z(1U4P z`g3LirUD#>npIaplo!HbXrZ%{MmN=}*t`F}dxI~Dkn>@AW-|zd1}1*LG+=3T_lCS2 zYWt{Rt;ME+eELlZ;($Q3^8Unj$F;zvIVGh>kKS!xU+%0XoqggHWH;os)FUt0$R3++) z=LQVszyBJS$w!_endjB9ISv<{mc3>xFPKHB!_6CFk%{Ifnl`heFn6W#P3!{cmxO5r@kBYXa97>+GSiQmck zUxua0<}j%pRM#zP1)E}oj9;8)oH}Mwv}eS3zwt6VkK~%@3-fKk8_YL<&i!*`{jPe` z&%kL0lR{!p2>753qmtm=f2}9r0HR}Jj(y-1IKgh1H73spLexby+{!TP8q-h%s~DF2 zfpYKPK10)e`q90oukgGy{RFJS zH&40|Py6GgaYZUKnd584dLacfKR3%xZZbbNS&*Bo^1xqNUe$?xo6n&Tqt^^ajpEuW zR<$!Cr~6-jJKARX$Jor_oU%#U*{yN62Z9B>b!+leLUnZn%mle!d#nnL6^u|m+eyh8 zVqjTUy3$RtL*g>Ywc6K4~8adu~ZS6{DSJ(OJSH7ebeFK9>Ptm@T zp)N}{R%$(CYfAJe0}sKDMfu&S9n z!g>R~4u-Zl6KiWm2x?hVn8NtDyu3sAA!)*mCjuW30|GIGkCFo8bio+6_w;D9DkKiY z%71_NA)syLP46Y$47!tfF>U0U9YP=O(rapY(V3p&8=c!P^~IZOu7tNba?75=KO*70 zfiDMduDgnAn7tG}3J|KoUy_}PLXD8SN#xJ3b?~tuMZ?AyruK5J*huuFRYSm`9oXB1 zAt+!p-RH-20EA^^W!s%%NkTjg8PA_{QFvJiJ^-(Vaa-Q04VV-SP0h*ai()`dqV5C8 zZNO4+z#wNmjusQJJAnbAOSd^jb-{MkW6pk1PXI(Q&rf~yn)kk(c)|44eAYM0C``Od zL$rA?&flqMZW>iiC^F%_&uwf$tZE$GSu?XHm0skWAlNy688O1#xEAGaN|1W>F1f{mGKDl&LS-O`uXj} z<|p{|P|KkBfNv026I6nog8Id9IDVH_1yOE(_&^?xY`nmMr3(rQbby5XUdkUoetaq+ zA>e?CcfqIy(Pu!?RePHG@L{BVP~WVVE-Z~%uN`HmBKv9EU+47aWM+ow=l$oyw{z#t zByF9G78)AV_@vmlfg6bu2d$roNV>cR$x@pZe|C*jxrGj_9vV{rVtg{>YW;pS!St0Q zj{+WlaB_Um<(>BXc;y+tty+aOno?5@nSoU62iMuHY}^%fA9&tjOmqRiZ=r+LBxPAT zaSde-wU^*|p}qLrUq3U;BvV0IoAmL3 z7u;2akM>jI#(vd<*LMwU8LXJ~r4&)SF~uUoF-W`h$@FG{1L8IqTYOG-s;he>YgR+= zL}09TCsRcrmDWT}NELheeg3*t?ILZ8^%o1`ZvslE_iP&4K)v|$*%Hsg(8;5m!l5o{ zEbe@VtUAM)*q@BZPDt|YNV$yeztYE# zH-cMy^=d}@r!exUbp5a!VNL;()z?6fj>PIKGjnrQNshBpuWsW=VElD)?sY8BjSdf| ziBy-VQtX2b%i=uTw)~v*sY~3~M~y5k8(BmWd1Hjf^tRH4Ii5Qgj2`mNPBv8exVo5y zgiWuiY3;o4Fzhmu8Bb_oVQlpY?Kd!0Vt9Vtup33B(7dOI$Jj#UZ7bnh&BGW3dE--m zcu^=xC|}X)yxevVg_AV*ar860Y^t$IlYGr97pt4l;Q&)oVXn50L`=L@7JP^|boVML zT{99TrVS$;dU$y`XiWG$JvMJRqO-cL!Owl7MN`DNR`x|;h_2p^sHQtRM@T)z)!gTQ zeQmhZ%yg=KKjqP$XdB7TSL4h+2kRave0Edkdmj0(VxMMyW5HVqz532H^83+uXpk=s zfug+dN6q8MY#JIG&K9Avob-q+j|C-lnhf-_u9g45z7U*j;7Jvq;zT_87 z(6;!zBTfHR#neasDtc0x1M+;_>mwF%qa-fHbgnm=}k>0MvU=j_XGy<;x#-_+zrZ z>t|+ZaLj*y0-hC(G#k;LlM1@WYmz}VOT8m#r%Sk)R2=P&H%Swmcjwh1eoN_3 zpK{pS+ru0vDk>UewR>}TY zqT=GZ6>4U}VwmPTF;R9S6@&3{W6aYAhjGx*qKrm8Gx3&5yHgh(W|G#9pywQ4m;a`G zk(u~Dp7!@oG45XYMptKN+joOt>*BLrA^CZEMppNHAI0vmd(-#ZRbb&lMYUw$jwK6! zE*2s&dhwSU1+#nZhxNebm|f zR)&>Y;t*{UJ4-P0%DglGxH{(&ckKrGxnt@vl^cadI*Y}=Q^&$biw~V2grN(eGlWhD ziU*@?VI((;>#_WHLwl{2?;$cEYtu6u6yK20$hFHTR8=i(JL*wYZs6Rn(Z)T zH4OR$oJ-bxEjM~~06=uz^Pd6l%7N%Ayj6Tf^0duBJ zBGYRs7GhlfYoS#A~nsk-8u)td}SA8DtJ zPhM+2;!0V2ek~@{WuJh^8*}?|HSze-XRA!#G_1URCs%%|FYXs$ZwsCA_@>kSq>NjmICoJ)N4JB$fq@hQg> zOt8iPr3{A6KzN;TeSi_99T^GxK$H)UH6^090Rf_pe3*S$Fm#6Ed$oG7ib~T@F%Sm@ zbPu#iy3VKHxphXIIWlNd;oeew1}m^ObyzaZXDB6ld>v-9>slJ;nGJmzXce6YNfyY@Rzg-$V5&6ydv+K{m zpSPwYjD-!Vm>yo#&CV#$k&3ar?n!Q3`7|MBC;FTVKj*6U}?-6UO-w=$Wp z8KOTXHGY8Rh}+gZ$$WJ;9;7vUoH~Gl@D;Lls7}pbO?I^PBlHbm;&v1n&P_BWUwp14 zV!?-9Mvjh-K^Pc?4P|g4y&9G}apQ4rZj?o=kPe&yKp$`wq5PQP%LJ8@PxHGx50N(| zC54zrPGSjuc?tvCPp{~DaUl1MjM(B4#hxC-x8r)aFB}L;<%$;Hjo=O!&9X}<{4l*( z@X8NC@%V;L5xttAm42_P;{)Lqf5Q(0W1-OcmbG|l&DOoouExlp_NC{=S(#*7VwInZ zify?S{o}h(zp8FJiPUh?qUYLp{Fa*X*q7{^hm`4yM^mRHOsdORV(JkL>M^`O|Dr~W zB}_EE=MX4+UBbamv^bpju@68AWwM!tg+mwT8E9^hwvRYc+QwM5hZNjFzB)FNg}-;% z{{%mC`oo8`&;__-9keXY30AN+xI4PIsKY;m%0*7QnC^U@atC zCnqOqUKRn8R>2&bxR_YeDH5r#v%9-&N(R17EwcfEidz7wetwE4o=c!f%EN;Vq4S)% zf1~}ITAc;OHF^r8s3UFx^~#4EjT1xdI5trheF&gjKNu+D^3tCEfVD>Plu1&PV^|d+ z7CyNOe=Q5?sEFQ$2boza{HNH33|C!q3c`!9b$9Oh1dM^0X3L0p3{TqE${&nQ&dzwE zbW(yz=fF6Fg&Od zTz<9P>P_aTxmoV+uqpcGozDd+|Gbr^rHH3fe^xePJGSMrW+0tFMSsJSiBkfn8sfWy zHrH$p^n5=Q5`yFd1_JC1;2%ye5LqVm0Fi=dp^G8~;e|%SmR1ml;^N{)78WAJ0~Sy(Ymt+ninB6m!&U;!|3) z^XJ@AT)k=1!ZhmW2_&pz2YMBG7Thwya~ZxXVC8X!)S9eXfaM zi$Nh=*RS2fZdWXB#qBV`vvcAB95hdk!%*fTcf!JeUO3cl8z#jH&nDftVK2{3F1(wZ zj6X!V2E1%pcTa&urzr2?Lx@B#0i+OIh|Y7`ji}CFI9n8Uth^~5+P;CJQ&get_GN2i zFuTHoZ>?vHmux?EL};vUH1O3jzVB#w?gX+dT6Bo#T$D`>RG8)`T{PP1Q#YBe_c@VC z%+o_ybUJO3l+iP(u|Xvl=38W0&~WQ+}Wo9Wq$K%4pWsaLnvx{j}xt)M-k zC*Y8!;DaVRHHmo*c4_mAM`4u4hqrTyR*MW@1pzLezcJS z#&%?$g=F@%iheG4uwd>Hi*`Jn3Esw3`SQ_5*{+yL{&%OC2U0q%D5^n)0!;mRZ zajK-u$m$5%mhWkk)%YJ z>yF&@kmqqGyN&|mAGr%pg-5Zv*FnrpPfg{+y69J!4Lg1@qqvv}wlZu0y~7wsg73KG zD<4Lf!oE$frS7#Ip9Nd6o(6@2ozc?TWPZ5C7MvuS%wy~3ggqv-K0Na6IvZ23rUR!$ zDDHmGnHLW6Ew5R{&;Wrvj@?7;y}dg7yGUm-s11D~m@`gHJjFcJQ>Q4vsM(+^xbXSjpnRNMFYn~9>USCk2#0R}f=cT%d2t48xISP0C>z+w8R zPo|HkJ260TrhjK!oLE+lQol&EWH<3)(xX7!-aqU!9L8up0v$E(A;@#U4^{Q&&CB(8 zR=!M5z69Jxhd7=g>?Ld)7%*tstEheK7#GYSI65#Ls}tWU>2m{P-Eo~H6&LqbV%boMvAzAcoQ5t^!o34Pl*k7VjUT@*M{x!g3E<3OT%M|x z=)oeqsVHImtnas{mzE}wJk!K zz&0Spf@eW5*U2XjU(fZLUev^|26+pFWsyMU-WD1ki`g`2C7@6NlJI0s(0Au)$XnR8 zXAd}z3!G0w{?`j|3Yi&q93|yj5AV>dEI_z}2M-bu4%T6~?`&*#C@3hPC0CkvfU9oj zTb2$P@5ir)6^TNkJU(Zroaw(Yge05||0%>kg#N+`vc0%Y64E}nUOW+3 zYSte&1gr2r&?WOUfQl;CNxF74fv8G!A9QB-IbdcXJ_yR&+xPBaAStG|tK!W;CoIkM zZperiRw1_(8f0Bl7bHF$PCc&aKAvM!sGJByEH594mpy3jAPyBSC%#l^a|LB)<5?#m!G;zR4V_)Z>qPof7=(c$At}) zrwq4P6d6h6Bi8%jm;hg@@H1QfDD&QN$;amaCJjonowmiTMO-VGXJJlG8fa@%Sv__Z zK@6?XXV^uKiWI$pvl;c7g*%z$0Id!h3p4Wbx1bOM9|N)qdpT54j0%}JF+{g#sM?FDoNy@Ok``&Nwj zIc7CEI~nfYSd(+-&V}C>c%F%*jbsLl1eAxfN@!Q;rpZ3MlZ5qhJVE~^XLR|-Br z?-GotD4bD*i2+H90!eOG0wD7!+!^W;1xBWIVgm)+wrw2&GaP`UrBSQ^R_DymxoujY zt?n!8HbDWZ###7iTT!i&nlY0VK3flXeRhFEAv!f&6m8j}VR|YZinP5=OX3o4owA!K zIDZrlQMpfbC;b#8fn0#sKUgJ*LmoUUSr#c2feI1Ua`<`|LGpA=f}Jn(Ex@cT!W9#{ zLW!1W6?1d;y!`yKN45^TF^n2HyviLDZJitv_z3q|~E0^n;;31L5b*kBhIT#=P(#Q%m~z0e`7_|WnY%XH4eV4hi1 zvjY!0E|0#QL6|nl)|`ZeDt?u}*E_jxRH1Z5xr)m}$P#!0k;GoURE74AZ%5Qc3VP)F z5#ILz7K*|NCc=rO>KNg;DWWczKuMmS?L$k9@waY8APj@=L4AJrF|GG}3PApYK04laso1GI{~?hHt~r_4BuG3fnbk=;qADWzr{c!OEX7NdhtwMVrtH72 zrtH}`d(O4^*)vXuOOjjrY)jKCE0t!?WB#K&u_U_ufg2A~)*l@_WXypQNc&$~;$C&Wevl0F!o;hX$Q zva-}rOhzrnzK0G@zuV1hiVe;e#M}Kg|ISygz=ICKmgo@ZawFIO_!E9rA%F8mDnukC z8}MA7J30<_z6XbCY5vwb3{y}y;>JKbI4&CEk_YOA!pltX0a!G^JfI77ngHWj3JM8v zOjJXAxF_#U1&ZmE6!;~%4uP#|7uA)bOe8rb7M87qU$3-MfHprgdnmj%?`gulPm7_< zuNo~DcT(3ytz3EfcB@Y@Q=a9$e%7YV0+SLPHRU5UJMXQH$v!#0IzeLHvfE=puBHpNFa6TmnRj63*Bh`|1Z@9*sQT`3 zF8}uZw^6jrLS3Hhl?Y>{HYn<14o#*z=`rSgjYLWUdOGYJ?lAcb<$jFGA0;|3_ae(8G>+3V} zFsMJNMu=}u^? z?%Q)IJcE2xlFKSH%8|?dSGiwc5-tDw9ZCRaXsJ;ELsU>gSq4BU>+m-e)cdyj;Pdnnx>}CQ8@3o>DW=q(SGFp^RsLP-{E zYT0?a{jJgS>_S7^RtC-xF#jVg^f;Oa4k+PKnq*;>suy&&>xROguX^;wJ_n(gf3Sdc z_wI^t?^R1uxn;QA+mW}nMT1NpBbw$KgHE>18k$qQqN{_qk+e83kw@wfCa6Ey}iizb&o(5dseQf|w6t zLhta`G~Bk^uu z?3dIH2L53DLIm^iV*E54W3`C;U;dk|BVXp1c>?|D?l#j%{(J$RHY?A%41*#g1?t|S z`G0=+;pblzoK`Ma7XP#DZF;)DOt@P6r~3M@EiF~+sJBC54!>PRS#24H4D%CR^@ag| z|1}5j?W(u8D#|J;VcVFZ-FRWsaRbW}?X9J6Z93{VA9YB2`&h~s$Cp*go`i4nG&|c5 ztMMlVI{!WqAiGOMH$+x;{LLSCG)byP~G3ZejQzb8(Kt6(6snS`E{_46s)8l48!OcFM^am&}=I2+|iZWGl3IvV0_B@ zZtQ)n6#4AW_?;>xOQ(0JWqf_=kbuX@Q*p_!Nuj$+Q`T5&b-y8+K<^yK7B=B!enwZ45`P7DCc@%I>)$hwUSOb@r z-7u3$7xNCYigji9W2*_u0kf3}`e#h(&}!ieDf(HuBK3v7(*n1DYMA<4Q-NrT)HFTq z@b;TJI8%81L>YY%@R|F<1c5psjv=4{yTfEC@Y%CxT7fP<5YmB`%T8A@V#7-6<}h8h z#m#|Qdg1~+iMO@L^Pa9I5`e?pcOwE>#d$V%`H+H96{D^!8GfJZxkY>z0*kR}+*-Eo zgkG`JbD;|)hr+SkVi9yocvPmYy?0#ykZ;hMA=-vL$cEcS!s2`rL3~HmKxBRecQ#@{2uioDcd<#el9v{eEOf1R*6Fp z@p_mbnR!p<~u`#ksjcugEyv+vi9>tcAOrFQ)$N&ok~SwX?PD z*6aC@wNiF!ue5R9>o&=w>~*W_St}@*rttpCZ43IFQk1|L1aA^tb|-G*j<=3DOf zW`A`KY(wsFSzr>uA;P8boOn#KsOe1!WdA^%jrn#Q&DCC7?{bB;W(9b7_F?8;$>!4O z&@PeoRUq-!@7-EDIu;x2YwDi4Ms~t1+xvP0IX(_4Y}}Gvn{7tHSdQH-`>9_Q>D}C? z{v3PGH8bhG;f~P-uF9`SO`!^8y8w_jR)Xux-kPv2v$@EY z0Jy!^#>}Ue$MP_#>wh!*^|_STZJsx;Hgd(8<1b5rNGi>_;Pt*vq@+2NafcJv2N z)?XTuh_T$cfTyqv7w9;6ce!QjZa*Ynv>omoUW*Jm^1VMvpj+$AT6c@8Hg+kB@k=2Z zqFi~Q9QGX-0KnkMvu8gs(SG4Y!-i%aAN-Frl#k=$;>5>~yp+bdyeV@5&L#M)=MG{G z1;6;Q?C+_Cg%3aaP}fnpdsRQ~OdLZg z=RYivZC$4V7>QdM7 z?vo{d=3II_C281Y@3xwIvk8|jase7f=%OYSf)!$q?~P;GHyCUFajw-I>_Q*3k{&A^ zJs-atnTNV`-=YeaUlu^XIMWFno!Q*uaOv{*Jc1rT6eRezwK5_%HX7#lfA4?zNxEAwtp9#eQaHvGhFO0TZZsT6(0hG${9Sg~H_Ba+2mj4T?%ZgQ zrb53#vRG)rLI+;H`H}OQY7k3e14KYpB`*w+N80?$+5Zq9)CDAq?+kr@jy#g5#5EMv zUJ`I_e`I9jc9lpIq|3GiE8wPvJlU5ui`QGmGdgm$cCNUMuViIqrLQpQgu1+va1@QS zd1ZG~HgaiAf1v_~lb)0A91~?5UU)ryc*%wRVMnL>LWEOM37D_;F}L}1kX#32jO=?n z7xMEz&ix4}4N~?zmX#2qJXz4@#WQ+CV0}@I@8#X z0*xrgyymja$?kTAc+bT5n9dMEMs}*4f@Gn72``}WolRc6?Yk`n-EIeT5~OY)ohYQh z`?~T$%FwP6At>zVL^)2;h1I{YWmUj>gvwSO@%M%Vea%MQr22{=No*rRG?jn}s%vZnp`n^t15sw+E92}YBM zynN}Q8fwzS`xzZmr|+jxAb#8?{N4xpSRT!mI~ADXt7ASFX%DiHmA978i+jwbaS&tl ziIN2~BJo;RgocLoUYd**Xt){Xo$7kzg3~wQxl@n|QC9`>2|5u#@NU=s9RyELJ$YwH zHE=FfqKd&0#6?KZOh)ep5U?D!*n7h=zuom6(@PL3$s3;Y%(}4B5nfyF5VN!;hu7dx)|J==-jS zy4`PJ1%?LwhcF7|z!LWbJ@P>sMsukhZ4IG~sfr{-x$?_H7@^plH13+%zO2@st$bTwf>)&rI^#)3Y|=V$6%;p)L3VambceR=#$1L7RFyh1Qe0XYr%tRExfD z?^jh0f?*6-Ysi*j24YXdLE@kxtCe0z*gLK-STi1>%6=OqT8CZPmuHlayy*`yU**b9 zfI30oe+XAa|8z1)hmfVpD_s^OC8woPlr2^ZPlazRhGTxWpQFa0VcNNta3p|E$w@F* zjANj5_%>T+PwhN3a!^4Lc%V+AY!DtO%0SDSFjPBCF)=Z(pY1c|HnR~li*R&xl^Qyr zhxIhW2q;!UdiK?1rM232P7{4o)9rx&KsNqw&XsZQP#oRMng38H(lNZMXpM^j+@E#; zHb#9;vgk>guHGej$fSL4Ogd`(Q)v5w$%x6BL#S&atUCVeWed0R+Gz1y9MSdO3RVFI zR)CV6x1-c*`uX!NP)6CA&qo$lhZJZ@uILl&hnrHg`L!klS_R*7O4zhmB5wx7} zwm%`^TAEiOV$C0qCw~!Zn9W={ZHvbxNaeKNi%OkdE8~Uh%VYZ8-M9>1(;?>PuUw&q zl@jhj;c#lm+xKkv=^;Yz?w)=J?XGGiS~-8>kX$XRfrx$hSY8>s!p2e~*?X6@aZI1W zy=J*PZw);L-<6C6ZVnJP9JbZzaPLn0_;7`Fsg+Ln;-o!!vKi9Rnk(+V%E=5j{VncU z6CyrRr)z&G$^Pti6a$3|-R=%R$WaH8Nb)OfjeSWQOG(qjzZ|y|la~)emSgtx^c)@? zwP=J>rc?MS)6~Mgm3Lo@wC7j|x#IPe$r_Al(ZXZ61}gqt{zO-D)aW&>asffsOqbu) zcwf6Fc;Wr!j#1|YTa%|z7&$DXmq1p90@-uJv8&tSwo#Jr+_ftO#|lwE`l#)$?VDjq z5I8tED87P{KN#Gl^aBx-hSQBf|40n53zZ%h$0!E>93xg02w*jM8B%llV1$c-EZP(> zra_z97h8YBO-rT&BYI?!my=I{1-{)U$=PuTpfTD^m9z*sBRxG|a8CDh^xQUVRGME| zlP;jvcqZ`5$9gY{Bs6e{G(T9{5AmKOCX90`!S|1({D0%8E?ZS^Zv`OzH@s3Q+PYA{ zU=AfBDoPHF8;(v806}*cdir8}9oo(|Wlhpzt*X4Qok#!Pt2Q%8M1{+v*~Wfw80+`r zSUvx#168`5jUMzg%CqxI3E3T_CBul_B=jor(VI!<&YeRgN=7pEn66%2ZY`t1P!>7f z`Af-76o(ixkyS-nE6nGI=c}`$3QclAPIy^Y4W6N7r#*$4YwxB9%0*@gCK1DhC9~f& zF;e^BM=M{Oh~)&#`7ERQ@Fss&vEsXqj$SjpH5l_}4sxv54cBz%q-+OVaV_W#Yr3mBG8d!eD^BlnS1Xg|m7zEx0=CICMTp1WLz#bqwcQ-Yq zh=|CsplE4GR$*M3AbX1e_mwXyh{=S@Kj9-BBI>$shN^XguX_E4fsxVWF9W64wyjBZ z&V!f6SLS${FZDbRO;8iHng0@|Dq7|}D*ql&k$94AYjJ0DK2|fEfA;d~50&g2$xOPW ze!XmM+>TM`?`xA~K8Z03jX_hMm;XwH_OKg~&u?0iNysNwGg z*iv|a-TymJBsgTARDc`Dp657!5pPY8X7TQFYR#{~t5~d{^?Gq=avJ|dhv=;WdJ}Pr z_{3ADwwW(}c%l%llIDs&nAj9SpGJb=bNjcS%|zWWzu3>QAw}e7kWgNzYh+t4qMq{w zn)9HXs!EW@Kz|*gCq!BkC7w~MZ6*gR_d=Js>6>hyEhVBk(9J}vE(m6gME@@WQ7Ji)sQsWFTrfTV- zgjd&t$rH4v`}dj`mSBfjkUQ$g$Np)IWc=rD1DnS_0~PKuK?>QQUBd|JmCfAJ#lW7e zvyqK)w@?isdcnR~D^QubE?M6wtmn{yo%cT@RUC`}m4~1JDr+qNi7-_ z7HqRNJ96HBbPeh^RurN{?|%xY#?i_5jOZw-*j;~-NkmMxq_-`4N|GQWk@Duv+-uKZ zZ>l`zAwymnSpIE+bUo%?e~R|n7GC(0ei=)3zZW)V1?C=`B|9O zH_q640j+Rka)!w+BbMIXK5ZD=&|##^LC*e>Vf59vTwp{1N0dC-!%(jfeif zCA57fsHMLU)Xks%vU|+c!g?kzs~^U-M&jHZHZ0fH37pG$aP+6-^`1QbQ}J^DGFVv$&E&$CFCS{kT~VZn{q@c(asJv%?Im+{U<0t1`k zE}DH3flx?0TuC4C_!_)Mv4`+H9Mb)%kY)m`LmYYaZ06uJtR?9gn3{ezxV6Um!2g;u5)kkUm3 z-RObYI$bXY$sUg*>oW=)jOZ*5VX=r*HIZXvVrpu2AOzl#5?`fkv5^OY^~eNG)NmpG zkb)wQ7Ohc0$4?DkBbl0Mtt3lD(X7-|a!eO7&mpw?Zm~o83cLuA;h$8feZT;atUOFJ z9U>exKm>5cK$k%$L~#FF7g@2?1y58Q_FwSog<-k4og#Jr%+i_E`)6|+mbTowTo0Jx zI!Eh|AD2#Z9G55A3O}mpzxBfXZ(7YNiDn-CjreKlf47r?!r^l8_OZn3w>m-35%Oj?};Vjc#47-t)1 zJ9W87xhk3(8@GjJ30)F>1oBtC;6bwd$y%gskj$D=Gcqx%2Rw&&0y@SRpAJZ_pd6$X z7P{7WK&G+|(FYQ%;BsKa?_&@nzm5rINIJ$(TR>Dm-FzC+()jy^u5$piYr(01dxoEG zj05D06koF9^3nXCuGJk~=bI0V7#cNkD+|TGs(2b|$P0=+`}A??v(kwP+GysGBCTJD z1Jt*-pL%^?b2Bp)G&ZYV-T`Sxk088H&v)3p@>W&>82u~ zpCoEa!~>t7%6AmjMs&9n6xsF2%WkaBJpVf6Ts%FRoyWH-2e*aH=12C`Y!Hk@i8ntv zl;kbn`?kN2LL9JL($eS4fMCJFqTT0wu-k3y(0n@)^rh^7kx0Kj9muOX(kNSLxQg13 z!0a6Acw?>W<;jA=J2GO;g87p?9JS}_?WGc`%<_aE_dgt!=HoHK92C=jVwp_a1FBo7 zoGM#d489#$jd~2TAsR5fNaYOsZ6r(r(lluCE8E#!X1v`W6wMya4{lTrK?n&qqWuUh z*U>FwulJca_U(!z9m_Jf)a6kB#Cgq-$1Pkr->#*!N8_l+o15*m$Chp84ZJqWZ&MJ> zzj0DbO~3TGY!@Oq0YXjz2=ATht=!W8^N=TF{2ZChf;?a3)5a04$5C_ZhTlSYzb;G$wEU7ffxZs%Q`bC{p_ zGYSa`^wjiJk00)QVSZj}^{13+Dr{<&8Rj832K1@xneBANGO=>e>0UA%b5Q^!zvVo#=CR@49HIGLGL z$frm9Zh&`>^+E!Q6nq59oCmY2-}>R7&;fiDBloXP53G-3nuFs0)nRwoc7kY)7V0GV zpb*T?e#%Yd=0RYc)#P#5{Tx9dp@5qHK1tcys z%U5xSdJ$D&Hc@>b?>#vTS@beBWNHq7zoDg;3n_9`o)6>VeCwA?X-$FT&_8f17xgM6^Pve!I3JLwwG)Z1XiiV%&)Rco1XzV~oryTuNuyKnyW; z8_8H~$&|kXP=Oj4=5;;K5$}}(?+`p_21G@CTG&f`NfoKXI@sfFu*@Z(q;R?Up8-8> zU=SfA!6%>@=LrxVpgHI>5RaRMO+Ll62yi`@&Q1tW(wb{fe@ z992QX_z#X;8jS6ayPkX7K(N}xuH+8K`c&W+W_qm??`k%zYvS*H53&EqF9AHU?HpEj zkTLOP5R_H@7|bR${jCprwT)s7TO!hg86fLhW0q!Bzn2Jn)bY%jM9a zh|!4Yt*ve2V+z4tb2-hBF*QN#b++)&xygZkVI^w(Bj>E<%OtSHc8?HD4yt{ZYwDu- z$*K(R5W6n+VpftUp!~aRsYr-DeBva{TIW8gupOo!k1nG2kqS#w;jO!cc`8XtoY35ITCXVzBtr1P2~J(v#@gfs5F$G}?{TaRtNuBIL%7=2v&M$v z8dF_+jDh>jF&%5wx_f5QQ?flXbl&?_Ki|%+)A`|^+i_&DkVkZ%=!hG{8F^YmdhrL7 z8;#Elv-7<-)?bHNJ{yv1V0P#&T!Y?DOzJN2;CcTtCAB9gb5OElenvp*X{P`MV)}*M zgVYx<>?;SZymUv~3R5yv*$`nt+u-Z#n~+EiBR`-PVESM|0*vmCrYalmYPA?& zDNVd6A3gfe=|s-KzXp%pyaLFALlzB2I-kvyPQEI)me6ElDB_WA3~BxWu_on7Hi)7g zUb;5rrDbN0b1%zI)l}A#G;qEDC1kDhvkNMF>00kHr?j*mpRRl7)iA&N3cvlijpt>P zuVc>{l?u#X&Y3iKw(IqqE^XMe^t$!jE84{H)}>o-&W4&V#h7C?5OlK-ldBDrzXk>< zq3=ade#l4&u02Z)E@*Xb6BR<^S^>oqOS`@k?#J?0SdxZrh4-Iu*GXHHl&&}4$VrfV zz`W*OIyxuS)PL=+T$`#ROK!PzpJ%#qfiK7R<;!Ip5{=wXJ&RuLfR3HQqMyRCf)4B? zeIV!<9?Q*1Ol9jac^;cUW`nw*`AU21)ZVh`y@WU4RG`B4=LH(#wb zCxq^?eMpQiR@?K|_S{qH-uzh03&@}PM-K#|h}z!}uhKRiC_GPMFkA6K^U)(jsA zLPxy4lHpiJpxx7m5xy5#u)Pf|uZKnO$$cDsG;E_OWJk6f3Fr~{T=`Vel7r_#h*3uD(dmE z!|pvR?5>H-%&Y!tgA-lFXy1vy#V}uEuYj^11otDkuy?KbZ_le^YgNmJP~8#F@W+1gr#2NeMERW+<eQ?pi-hQ8i zIQeqW2sZXoGif5fO3TXb+!niYYju@wI_2_$BDRvQIJQBn5blXp5fRLoQM;~;7ho0* zl01PwW+`#S`u9sY1c$Va?b?>XcMA0lN>4HpWVpe>U{DonvQp5aH(ztnX|XR zYph_ZzHGIg#MkeT&^p83pQakFQc5M3+c+Ziajs%)`l8r7b&tt9`EM_0lFmC-t*A}@ zuw3jPP#}@kReRzWe^PIKCiDSEZhbj#V>zo)SXh{tAEi>#pGzE)n@1grDMhqKMwacw zt+vLm>E_|)p&r|0DLsCQ1@_E(|LyedA%-QOP~lQ_zH_=xNe_ zbX1V-rcM!%M$)l^Okjw@dOdMbQ6u0&75Q`6C_K10J=Loun4UmFWXH3E2q5(GaC;3z z#Cdi22esTR)0&6)Z~A!3`vrX`j->JOiVAI3m+Ifo&EjDh8+Kz z*W^Xn$^80^#g+F$E7Ebl$ELvrWWo{$>F#75Le~IH@X(T=@qx5_ih2|ULj6;Fy@n+d z1OZ6UXZ5LLBtpQcpFgXyJbt~o^;2@~gZ{$I(wcu7Ls&~Y#lDMk;0+3jUW5XuOM^_> z=T3J^8v7X*WEs$Ai#cF4yc%>50`O3Yh9BY1M#&wUDRNDV6jwGWzh7XaBr7qq6LhR^ zIGD<6&F=N0o|;p*zJL1H;vx$Prj%KC|1x~t!MK~sZ~wky8*@JQ9U!Uihr>-AE0~}l zJ#?427rM;}e!ldorI+4O2rJAjy-lx0Vib1^YHyWln%cIs!9<^^`19o!h0`AxPDTaHd{Ee zvSu+<25LL{Bj2sGb;gLKXC7=i<{l)Rh9dBh7WpuTb;Fm?Ap^DjS~KsQJK5bq(jJmu zkoG`a^GD$CS?lV#00~2aTQQ9u`j_tdfbLYR_fo9uSWdxtq>`k)1vL)zi3==cm~)>S zos9ZcST*;4EaLt9FJH7*N0QdFS}v&d-3pgu4>z|Ju^fGwly&R7h@+Vu{McHh zf{tC=_(Q7u9#z}p5CTQVo(fH%(!9IqB;@8krH{doPk>fCyPTWgut1>-X!3$kvCVjCUn0_m{k`spp%jD`$$XLb*l6p z)S{=CO<=aBWGni>w(H#;JMWba*Nrv8W?=e`um>3iQOrcx#HInJstPNw6eWh9N#@sfzEz#D~Dhz5A(-y=QP7?l=tv*19uvk(%%$2+B~)&u&JoQ#cipY z_Vw4t(7mYY(W*cTBAi|B1BM=$NT$<--@kE6U?+aMAL?Fs_)#8*dNBSE<%keG@$a6U z_i~fs^!dS(H@ZAGR_L{cH>kB^y+!<4`7GOW`dj&Db8t;*puP^Fu zP>qMHRq+!X z+rY}>TV{n(7*!3`UwdQLeq2&%%L7zAM;oh&i_E=WD>9G`0V!M*L2Q3%wiMxdbY|&k(A_d>bjde{_h3jIIov6Fp zGZHB4(?9;1Jj3UikhR`Qse1%MkTQ=kVty2?JcJJprYzE{=xis7DkxrQU!1o3&l&|D zSFhSUM#m7(aEk#0Z1y|uOTC4&`4S*xc!vLHb81@<-*7z%n#~sO?k2JdIHm#3BhgZV zq9cg;sb8N;(QO${+K+40EX{iB(}+szW%1to-2Z#C{Vv$c{I2% zf9CemdfZ=EsE1bv`BvOW=q;0o=nRo>=-ulVq-YHA(@~ehs2GS8N=1AT_W^uG0d-6y| zorCF7)u{+|Bf%K3qN>M&FR2njHRq6Wt}6`uj5<;*CL1DdnU<0DCKZbezUnmGBI)@d2GJR8ARs zSNrl5{(5BYmDF*g;1;BoQ#ejn6=02sivme_F=)gY3hB5oCr8n(NPjdl+P|IVD$H92eLbDa9pPhsGFx z{jbS^k|H$i0TF5fjCaZ8Kc(YDKlm#MCKXHh3oZ6vw=y9?0;R%El?Hr$;vq zRfjzgyA!E}HStXtfsT*c0Fs7bMrW}Ltx=v?Mm5DFS3FLmT+`c?y^zr%!zbUlwa|S* z2(=Wb+;00F3g2w&tC@CYFjf^o}e77#mB$i&fTbbCvf1k zhrBS~7B^Y;cYKL3WP>#f1qmA}zlVffaxCQEa>-_G?%Z`fsIqy3~#QQQwwPj(Nm>=Y0t;n6F}D_I?O2uR~J}MT$j3K17&(}V~GAd zp=XjgUYGH&tby`U)kvKtlBZkA`Zsc}zkQBHP$5Rch|9ChVr{12<7K$~lYmh5O za?3F(cmY3Itlc1c6Es*t7GodXeHmHBhA;mlI(vywDG^WHN$(ALq({)Xgk?{Cf9`l* zYD7kK*ZyuHoe|HdplfJRKX_geUg|KkGq=?wa)9|>`j3^VQboKmFS zdKNNpPgsRt)B<@DeOl6FUM|l-alU!Dvg3^s(J=j5 z=2h8uQ|3_jQ7B$TRH?uY^Se{=Ik+G=^dZwp&#a&w#d;y$9mr}elSg(0^D_ojHLb_v zVfIWW#r4&}^Z}$O$VeDw&$YCol>nM8%ieghR1z+rj4>L7A1v?>_?NM==U{ z;*}PsB@d1k#(YG2#o>c_5^Q`iLq+an_G;u1^`>4@WVOk?{kWYr|LW4foppI!+`@I5 zIMZFE7nj!WR(+*&M0z`pXpVc2yPIQ(f(C9VsGe$Itd!G}c`sqx{um8jw1icPpI|X@ zZS}~df17e5sIicuww(`JO%O^=n6=`Mdv;6yvCicy!Vwck6KzB?$cH5>?+em*TdvcM z-jQ-MrO0ZhrBBBFwfb~%bTWCxilff`_KF&Z#FyUj_QRB9)^TpJh-=s%( z(%UR#s&fbfK)rgDM-sjvbe#B`iwo%<0m$2>;ALHT-9GnLU)2#X_gn8yH~Nc3TYMgv3>4V z@<~af0R_0LuzTrC0$mo&6P|l_wVvUWfIFg+#_82C=m^7!xo>+NBI_~@v*9F?b=MJ4 zpxIdw_sjO!6n8* z+sPwA`-!p^!jvQn&Oun7P##ZK{&2X@xftFxv=1&uXk=i@u6yFDXf;}x>2&5(-*`UF zsAuT)nQ>{Sct}7bK2)VzA@BKfH73ob<#79xt9z-*1Fx(%_KJH`YW%yrJB4TIq~C<^ zd|&RFE~$0nMb@mqt3#`?jx0%Uaw>A349F-B{5C0Cs0vrG+)*;$1Luh*YYDR1D1Ls= zt`o?$T6C0nD*0Dl>Sf8^7`}~g2P3sG4z=y8D)|cs;b7FD-jm2z0ugo35k_P@U8$R@av>O7U!k6je;gpFFLoXnG8S? zVDks1aYd=nQNn+Ss0bHyP`hB$HhSZj+1_2Je1iq*u1G)D!F@$6!E1xng&sr8rc|zf z;|hzl~&1!I~AK(@VN0^&pfDZXrMuN52J!R ztj|mgbUI&p(zs}PhX|UKcT|^E#5d&KTV0_0`>y+t7gdZI6Y0gp72`ACTXy>19zKrz21^*!jVW8C`Fd5>Kph!=32ul`uQwK+(-gLqTHWxd&w+LOsw`maw)_ zOcD8h?#kdjKDaEx^EBC;t;wwZ6&sAnnny^(y5q3cj;v1Amp*K_!WyRG9U@^;etg>Q zg$9b>+Gv@BUQ{{!D{99(8Wp{9fdy4=3m>)nrEsxZ#pu^mPN(~#kyqSit-A^D^}{a| zx0NZFwH7;c4SSE5jSUPauS(HTCmfYPQCx{!41JHq4O*u6JBTj(AQLcrY`e)=N-JgP zRn*mO*?Q+g(-0KTs< z(Nv0{N{gm+Qs2DgXyd5$iP{s0&VAaCnnw~Ad88D5)&mBJGz=3c_(-55T%5MVvKGV} z^nH0AxuWitwC!XW)q>W{$s9xYOVGrBk@(xQ`G<>;#cXyCjPaR75J0zgQ1)~J1R-w`7K zQ0o(96dtOnGd6wngTg3gNhFx5wkt&Mm)>8L-Q zC|8LY?VzLa!8q%Jj>}#gl_CU<3I6H5JmbuA+H{m?_Y)El2(wtvFEG6QCly({Ty!8t z1Az+$8M=cm7;yjt0P7ZyA&85||9%Luum*c3grSh?Uo%U5>j}dbA)2Qe&Ysd{O+K90 zs+e-0=z2cP$YL-LSEHucI)r086%x=T76;`Sz0La8&F(pViom*HHbu{D}wpRis zBazVCLRq3`V_BcQ_6nX1F3#co0M$;V-rZgYX!B+y<1Vt&IKb(s(f(ZSzh#yXx19uk zM$74*duK0H#f@dVK3os~b%%X|cb%H!@rvj0RY;gTVz7C8*S$`Ga>0sYzu1g!N~ymm z&*tsxkH&Vqclx{Vi}ROv<0`e#8~W>RGEv-Ckxs5m-VYbOPg$6dd>Y$-h-7-MZH~=9 zqqXYl>^$E&O|Muh)_02?wxj4u1|65O6w8{?d_XlAUns@IQ#{}e01I7vG-!s|;7wEJf zj|I_{RF32abpEAhBX^onmI3D0Ra~aY3Z9}nw}NJ%!LmCds(H@uU_H&6aac6)l^-U$ zo|q{j=1?B@L8`CmkJu;1#gA-)&;1`f4_^Zb8X+~9$^IMBJ$&adq$~sQ{$M@E0>JXW z?vRgQgBBNL!x0xCHaKz8yT9Ic<;BJH zqg2CN*jU9m&VRp2b#@bPZB)I{<@&{tsO-X!q`;!Mui12-K>Nm7Q^qT!2g!15B@cynO#k?JU&xMY_O#Px6MFtb&5DgL3}} z@R=nKc8pHCq~vs&#>r)@cYkjnlS=VZoFVIca`fa^G}T-;*xue-VAx>#fXdYzq(H;EXvbVU(bzz z{j+P5jo2QDT#LRuvxQT+0b2@~m&-iHjOH+g{or9d`#!2)ZHu6b4h|O)9D;}O@dU03 zTf&*h%Rq%uCR8BR5+#A3IEK~8lbGb9I?|by?={Awg1aVWh`_L1e@KWtd|!l!9bR)} zdPoQjqbQy-9v09xaGHY8`mU{c=I5vXSCm8L>DGQUnP8}3_KG-ntc;x>Go7nfgBp12 z)V`y7`Pnfx_bK(RXi{Uytt|kW`1 z!+fgY%NKPvnn&a@8YdFO#^&6vemfX(2m)fDsiESvEkM{qFN)c$HC&P;Zr082=E(w$ z7>y2UVza!!n=*2L$2{s>De9be4w^A(=LVzxr)x34ZG1xg@4(*ynZv8*LEe6P1!cz4 z+2%FE%ia`QRl4`S_J0rmU=q|0A6$fOFe3aaTRjLCekn(*+8*rs(q zbVRVvBb()aYgX)R^Cwq0c6#%tae=cX2j7|QLWl6H$^3TM4~X(Sdgf%Y=+M`bJdH*n z*Sto1!_KE@z%zYU*Y;L$aF!5XOV%DAX~)W{7&gN>o}*Tmv4H z@VCT4fbE@Oc1$j>Vy(e$F*f8xI!ZF%eYNjWt_j9`z>)J=_pA=xD|sbH#Y_Xsh4b@o z&$Miw-Fp(rMo*rCKmsU$zaA?q%4QANR$@qh5obT`E2+i-T3i{n(gU5SLa{uBBV63| zq_1;ZB&P7!-jL2ef2Ys51icLl(Ye2WUmon1+H#8t5g3PBEGO@5PO5<*$VhdmE1Nm} ze0vSEdAs!i1|dX1gF517r3K3-L+yfyD<@7}oEiRWBb&QUx^{=gtc!sq;0OCa-xPV^ z!hxP@mv0+n+7opH`_}f94s5hGH4W@kY)C&T03J9(9txj|mj`iM0bZ7v0q9CoGJ6zt zofBf4*f(VnOg9kN*|MmqxV`djkk&t~CP?_HvoY;Xf#a4=Cftqu&Wi{*NewBUh|beN zzdbSG+b@L)6zr0}wl(j@+=hqG7DS1B4|9Cp&LSH*1tOS#S7!1{zIe z70TO{>Vw6FN$a%3@@=Xw$6D>{H}ZJn%iX(vsfOin|JZ+<(e?egqbh-y^PeT%j*Ii7 z7oG3Us+m&Y-%v<@x7NBdul?S}{;5~?&&IL7+D7NLhhsF`JBeitsA7AzqU(+vE=Moop3MMclBE{DlmAmOAnV z+D)M9Pg}>3MJ3`xgL8z4(aAqoZN{E2kM99UMe@Y%0wMuh?foo~hd(Zh?ZJ!z{}ZAv zE^SRIfl(V z`~RIH5S*a=CW+aVC??qG2&G<*h+nDNJWC5H7kERc$W%wx z)%eVr3vA%i z$6Ms){kG<;9L_PU%F{>(&`Z z3}Fxn5LwZ>!-upw4?uCgtNo=*D$YS0z!&SR7>bLD3A&O#Kb3Yna1BV2(7tNZYTe1{ zpPb~LbyDEuK_=uRgn>WK#Vr>?4G_i&wjYIgHh`9K`F#2|$u-MI;_My>zgSWGNlSkgv(D2_w1H}%jC;Dj5x4PzETBiQJ z!{~6@7R5ZV<8@8mMgxP>i9A@ZoBu@_WRp({zI_uH7bkU=BJ^Xl3iT`_9 zfHZ^%_vg>(pwrr{eJ>hg#)59;d2X&=CC_fKL@9|iDCAt=>88kKeY9^;m66VaS^^|) zc$oT_H+PJwJgy&>qv4eaKVY{KoiEp{tnNSO3$z{cqj}*+;r-XbkNj$~xw3iyM%&YJ zYT$$J+^W8}N%N$Lptaiu@4@y>%GMa@F_b0qv8- z3`6t@~op2dv^}EsalX$BP|(U?K!X>{-+o)OmrL5 zdciF1wD<3x8da^CpJK}*dHI#kzJ2xAP!xJZA`{Q`GbjkQKM?3LcKFYmnZDMT?S3fk zr`|m3IQjU7uM3#jDJOve5BJ$iHOwub$WI?}E=HS#2#s`aK~ekazlI(?Jxoj^#Ap&P z!IBz>@R63vL5AJ`$%?+TNfv)-D^r^y^#u;OP$KT1Zb}47Ba5jB!FPiJEzY!WMY6Ty zp^kBhw*>{&N76x&m!ais{C-6YVF|IVx)J8Sm^ECp(h>SH(t7^EMc#V@jXe6X7-@?4ywB_TKO$rfIge6P;jW{ZR;Xno*th`(Xad zYjEQ>i7dl*j~#PaXhBF1`&Vwxfy@V?1yjZgc^^^}BV=|e@;$)33&g~L2|rA_yg*#E zM8QyT{^TfK-KK~eoEeHK>|#6s*$)0u>9~Ro*7v`|E%K(A?-_>=vOizJ`a&Ab8s2{2MpA4mn7(*w)xPR!U)4@T4OPv^0un`z zgq?6xE1DO87;yJf9>4njIl2qr?fBBkJTm*Hq6Hoi3eheQz!|W{YzFfekbN-h&oa