From b2789960fc6171ac67da69b04878ba407c54b153 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Tue, 15 Sep 2020 17:44:27 +0200 Subject: [PATCH 1/4] add missing resistive heater and micro CHP to electricity distribution, add new electricity demand for industry to electricity distribution, restrict solar rooftop potential, change for testing mocksnakemake input for the costs to technology database --- scripts/prepare_sector_network.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index bdddd2cf..64cd1566 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -655,7 +655,7 @@ def insert_electricity_distribution_grid(network): lifetime=costs.at['electricity distribution grid','lifetime'], capital_cost=costs.at['electricity distribution grid','fixed']*snakemake.config["sector"]['electricity_distribution_grid_cost_factor']) - loads = network.loads.index[network.loads.carrier=="electricity"] + loads = network.loads.index[network.loads.carrier.str.contains("electricity")] network.loads.loc[loads,"bus"] += " low voltage" bevs = network.links.index[network.links.carrier == "BEV charger"] @@ -667,22 +667,33 @@ def insert_electricity_distribution_grid(network): hps = network.links.index[network.links.carrier.str.contains("heat pump")] network.links.loc[hps,"bus0"] += " low voltage" + rh = network.links.index[network.links.carrier.str.contains("resistive heater")] + network.links.loc[rh, "bus0"] += " low voltage" + + mchp = network.links.index[network.links.carrier.str.contains("micro gas")] + network.links.loc[mchp, "bus1"] += " low voltage" + #set existing solar to cost of utility cost rather the 50-50 rooftop-utility solar = network.generators.index[network.generators.carrier == "solar"] - network.generators.loc[solar,"capital_cost"] = costs.at['solar-utility','fixed'] + network.generators.loc[solar, "capital_cost"] = costs.at['solar-utility', + 'fixed'] + # add max solar rooftop potential assuming 1kW/person + potential = pd.concat([pop_layout.total.rename(index = lambda x: x + " solar"), + network.generators.loc[solar, "p_nom_max"]], + axis=1).min(axis=1) - network.madd("Generator", solar, + + network.madd("Generator", + solar, suffix=" rooftop", - bus=network.generators.loc[solar,"bus"] + " low voltage", + bus=network.generators.loc[solar, "bus"] + " low voltage", carrier="solar rooftop", p_nom_extendable=True, - p_nom_max=network.generators.loc[solar,"p_nom_max"], + p_nom_max=potential, marginal_cost=network.generators.loc[solar, 'marginal_cost'], - capital_cost=costs.at['solar-rooftop','fixed'], + capital_cost=costs.at['solar-rooftop', 'fixed'], efficiency=network.generators.loc[solar, 'efficiency'], - p_max_pu=network.generators_t.p_max_pu[solar], - lifetime=costs.at['solar-rooftop','lifetime']) - + p_max_pu=network.generators_t.p_max_pu[solar]) network.add("Carrier","home battery") @@ -1682,7 +1693,7 @@ if __name__ == "__main__": timezone_mappings='pypsa-eur-sec/data/timezone_mappings.csv', co2_budget='pypsa-eur-sec/data/co2_budget.csv', clustered_pop_layout='pypsa-eur-sec/resources/pop_layout_{network}_s{simpl}_{clusters}.csv', - costs='pypsa-eur-sec/data/costs/costs_{planning_horizons}.csv', + costs='technology-data/outputs/costs_{planning_horizons}.csv', profile_offwind_ac='pypsa-eur/resources/profile_offwind-ac.nc', profile_offwind_dc='pypsa-eur/resources/profile_offwind-dc.nc', clustermaps="pypsa-eur/resources/clustermaps_{network}_s{simpl}_{clusters}.h5", From 6d440499d52c4e7ba49935d74ead0903c9581e03 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Tue, 15 Sep 2020 18:03:33 +0200 Subject: [PATCH 2/4] add option to add costs for gas distribution. Caution, currently assuming same costs for gas distribution as the ones for electricity distribution --- config.default.yaml | 2 ++ config.myopic.yaml | 2 ++ scripts/prepare_sector_network.py | 16 ++++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/config.default.yaml b/config.default.yaml index 575d6c78..1dc8f2b6 100644 --- a/config.default.yaml +++ b/config.default.yaml @@ -98,6 +98,8 @@ sector: 'electricity_distribution_grid' : False 'electricity_distribution_grid_cost_factor' : 1.0 #multiplies cost in data/costs.csv 'electricity_grid_connection' : True # only applies to onshore wind and utility PV + 'gas_distribution_grid' : True + 'gas_distribution_grid_cost_factor' : 1.0 #multiplies cost in data/costs.csv costs: year: 2030 diff --git a/config.myopic.yaml b/config.myopic.yaml index 48f6cb62..1c5fc62b 100644 --- a/config.myopic.yaml +++ b/config.myopic.yaml @@ -98,6 +98,8 @@ sector: 'electricity_distribution_grid' : False 'electricity_distribution_grid_cost_factor' : 1.0 #multiplies cost in data/costs.csv 'electricity_grid_connection' : True # only applies to onshore wind and utility PV + 'gas_distribution_grid' : True + 'gas_distribution_grid_cost_factor' : 1.0 #multiplies cost in data/costs.csv costs: year: 2030 diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 64cd1566..afbbd0d5 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -732,6 +732,20 @@ def insert_electricity_distribution_grid(network): p_nom_extendable=True, lifetime=costs.at['battery inverter','lifetime']) + +def insert_gas_distribution_costs(network): + f_costs = options['gas_distribution_grid_cost_factor'] + print("Inserting gas distribution grid with investment cost\ + factor of", f_costs) + + # gas boilers + gas_b = network.links[network.links.carrier.str.contains("gas boiler") & + (~network.links.carrier.str.contains("urban central"))].index + network.links.loc[gas_b, "capital_cost"] += costs.loc['electricity distribution grid']["fixed"] + # micro CHPs + mchp = network.links.index[network.links.carrier.str.contains("micro gas")] + network.links.loc[mchp, "capital_cost"] += costs.loc['electricity distribution grid']["fixed"] + def add_electricity_grid_connection(network): carriers = ["onwind","solar"] @@ -1834,6 +1848,8 @@ if __name__ == "__main__": if snakemake.config["sector"]['electricity_distribution_grid']: insert_electricity_distribution_grid(n) + if snakemake.config["sector"]['gas_distribution_grid']: + insert_gas_distribution_costs(n) if snakemake.config["sector"]['electricity_grid_connection']: add_electricity_grid_connection(n) From 736c7166ac74e084a6c6a77dadc8c740c33e78f5 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Tue, 22 Sep 2020 09:18:28 +0200 Subject: [PATCH 3/4] add missing multiplication with gas distribution grid cost factor --- 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 afbbd0d5..6e2a15f2 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -741,10 +741,10 @@ def insert_gas_distribution_costs(network): # gas boilers gas_b = network.links[network.links.carrier.str.contains("gas boiler") & (~network.links.carrier.str.contains("urban central"))].index - network.links.loc[gas_b, "capital_cost"] += costs.loc['electricity distribution grid']["fixed"] + network.links.loc[gas_b, "capital_cost"] += costs.loc['electricity distribution grid']["fixed"] * f_costs # micro CHPs mchp = network.links.index[network.links.carrier.str.contains("micro gas")] - network.links.loc[mchp, "capital_cost"] += costs.loc['electricity distribution grid']["fixed"] + network.links.loc[mchp, "capital_cost"] += costs.loc['electricity distribution grid']["fixed"] * f_costs def add_electricity_grid_connection(network): From e1babafa35c4c3322a0390316a61f7bc2453a8ef Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Tue, 22 Sep 2020 09:24:30 +0200 Subject: [PATCH 4/4] remove taken the minimum of old solar p_nom_max and solar rooftop because no overlap between the potentials --- scripts/prepare_sector_network.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 6e2a15f2..09aeec02 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -678,10 +678,7 @@ def insert_electricity_distribution_grid(network): network.generators.loc[solar, "capital_cost"] = costs.at['solar-utility', 'fixed'] # add max solar rooftop potential assuming 1kW/person - potential = pd.concat([pop_layout.total.rename(index = lambda x: x + " solar"), - network.generators.loc[solar, "p_nom_max"]], - axis=1).min(axis=1) - + potential = pop_layout.total.rename(index = lambda x: x + " solar") network.madd("Generator", solar,