From 103ad496715661c2a603fa0b8275859c90e6ed4d Mon Sep 17 00:00:00 2001 From: martavp Date: Mon, 5 Jul 2021 12:19:43 +0200 Subject: [PATCH 1/5] Enable use of lower generators clustering than network clustering --- scripts/add_existing_baseyear.py | 66 ++++++++++++++++++++++++++++++++ scripts/solve_network.py | 35 +++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 47c31c0e..bb9e4ff1 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -152,9 +152,20 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas df_agg.drop(df_agg.index[df_agg.Technology.isin(technology_to_drop)], inplace=True) df_agg.Fueltype = df_agg.Fueltype.map(rename_fuel) +<<<<<<< Updated upstream # assign clustered bus busmap_s = pd.read_csv(snakemake.input.busmap_s, index_col=0, squeeze=True) busmap = pd.read_csv(snakemake.input.busmap, index_col=0, squeeze=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() + + inv_busmap={} + for k,v in busmap.iteritems(): + inv_busmap[v]=inv_busmap.get(v,[]) + [k] + +>>>>>>> Stashed changes clustermaps = busmap_s.map(busmap) clustermaps.index = clustermaps.index.astype(int) @@ -192,6 +203,7 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas capacity = capacity[capacity > snakemake.config['existing_capacities']['threshold_capacity']] if generator in ['solar', 'onwind', 'offwind']: +<<<<<<< Updated upstream rename = {"offwind": "offwind-ac"} p_max_pu=n.generators_t.p_max_pu[capacity.index + ' ' + rename.get(generator, generator) + '-' + str(baseyear)] @@ -210,6 +222,43 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas lifetime=costs.at[generator, 'lifetime'] ) +======= + suffix='-ac' if generator=='offwind' else '' + if 'm' in snakemake.wildcards.clusters: + for ind in capacity.index: + # existing capacities are split evenly among regions in every country + inv_ind = [i for i in inv_busmap[ind]] + # for offshore the spliting only inludes coastal regions + inv_ind=[i for i in inv_ind if (i + ' ' + generator + suffix + '-' + str(baseyear)) in n.generators.index] + p_max_pu = n.generators_t.p_max_pu[[i + ' ' + generator + suffix + '-' + str(baseyear) for i in inv_ind ]] + p_max_pu.columns=[i + ' ' + generator + suffix + '-' + str(grouping_year) for i in inv_ind ] + + n.madd("Generator", + [i + ' ' + generator + suffix + '-' + str(grouping_year) for i in inv_ind ], + bus=ind, + carrier=generator, + p_nom=capacity[ind]/len(inv_ind), #split among regions in a country + marginal_cost=costs.at[generator,'VOM'], + capital_cost=costs.at[generator,'fixed'], + efficiency=costs.at[generator, 'efficiency'], + p_max_pu=p_max_pu, + build_year=grouping_year, + lifetime=costs.at[generator,'lifetime']) + else: + p_max_pu=n.generators_t.p_max_pu[capacity.index + ' ' + generator + suffix + '-' + str(baseyear)] + n.madd("Generator", + capacity.index, + suffix = ' ' + generator +"-"+ str(grouping_year), + bus=capacity.index, + carrier=generator, + p_nom=capacity, + marginal_cost=costs.at[generator,'VOM'], + capital_cost=costs.at[generator,'fixed'], + efficiency=costs.at[generator, 'efficiency'], + p_max_pu=p_max_pu.rename(columns=n.generators.bus), + build_year=grouping_year, + lifetime=costs.at[generator,'lifetime']) +>>>>>>> Stashed changes else: n.madd("Link", @@ -404,6 +453,7 @@ def add_heating_capacities_installed_before_baseyear(n, baseyear, grouping_years if __name__ == "__main__": if 'snakemake' not in globals(): +<<<<<<< Updated upstream from helper import mock_snakemake snakemake = mock_snakemake( 'add_existing_baseyear', @@ -412,6 +462,22 @@ if __name__ == "__main__": lv=1.0, sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1', planning_horizons=2020, +======= + from vresutils.snakemake import MockSnakemake + snakemake = MockSnakemake( + wildcards=dict(network='elec', simpl='148', clusters='37m', lv='1.0', + sector_opts='168H-T-H-B-I-solar+p3-dist1-cb36.7ex0', + planning_horizons='2020'), + input=dict(network='pypsa-eur-sec/results/version-36.7ex0-168H/prenetworks/elec_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc', + powerplants='pypsa-eur/resources/powerplants.csv', + busmap_s='pypsa-eur/resources/busmap_elec_s{simpl}.csv', + busmap='pypsa-eur/resources/busmap_elec_s{simpl}_{clusters}.csv', + costs='technology-data/outputs/costs_{planning_horizons}.csv', + cop_air_total="pypsa-eur-sec/resources/cop_air_total_elec_s{simpl}_{clusters}.nc", + cop_soil_total="pypsa-eur-sec/resources/cop_soil_total_elec_s{simpl}_{clusters}.nc", + clustered_pop_layout="pypsa-eur-sec/resources/pop_layout_elec_s{simpl}_{clusters}.csv",), + output=['pypsa-eur-sec/results/version-36.7ex0-168H/prenetworks_brownfield/elec_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc'], +>>>>>>> Stashed changes ) logging.basicConfig(level=snakemake.config['logging_level']) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 8c0313f1..ce8b65f9 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -136,6 +136,7 @@ def add_chp_constraints(n): rhs = n.links.loc[electric_fix, "p_nom"].values +<<<<<<< Updated upstream define_constraints(n, lhs, "<=", rhs, 'chplink', 'top_iso_fuel_line_fix') if not electric.empty: @@ -148,6 +149,28 @@ def add_chp_constraints(n): link_p[electric].values)) define_constraints(n, lhs, "<=", 0, 'chplink', 'backpressure') +======= +def add_land_use_constraint(n): + if 'm' in snakemake.wildcards.clusters: + # if generators clustering is lower than network clustering, land_use + # accounting is at generators clusters + for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: + existing_capacities = n.generators.loc[n.generators.carrier==carrier,"p_nom"] + ind=list(set([i.split(sep=" ")[0] + ' ' + i.split(sep=" ")[1] for i in existing_capacities.index])) + previous_years= [str(y) for y in + snakemake.config["scenario"]["planning_horizons"] + + snakemake.config["existing_capacities"]["grouping_years"] + if y < int(snakemake.wildcards.planning_horizons)] + for p_year in previous_years: + ind2 = [i for i in ind if i + " " + carrier + "-" + p_year in existing_capacities.index] + n.generators.loc[[i + " " + carrier + "-" + snakemake.wildcards.planning_horizons for i in ind2], "p_nom_max"] -= existing_capacities.loc[[i + " " + carrier + "-" + p_year for i in ind2]].rename(lambda x: x[:-4]+snakemake.wildcards.planning_horizons) + else: + #warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind' + for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: + existing_capacities = n.generators.loc[n.generators.carrier==carrier,"p_nom"].groupby(n.generators.bus.map(n.buses.location)).sum() + existing_capacities.index += " " + carrier + "-" + snakemake.wildcards.planning_horizons + n.generators.loc[existing_capacities.index,"p_nom_max"] -= existing_capacities +>>>>>>> Stashed changes def extra_functionality(n, snapshots): @@ -181,6 +204,7 @@ def solve_network(n, config, opts='', **kwargs): if __name__ == "__main__": if 'snakemake' not in globals(): +<<<<<<< Updated upstream from helper import mock_snakemake snakemake = mock_snakemake( 'solve_network', @@ -189,6 +213,17 @@ if __name__ == "__main__": lv=1.0, sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1', planning_horizons=2050, +======= + from vresutils.snakemake import MockSnakemake, Dict + snakemake = MockSnakemake( + wildcards=dict(network='elec', simpl='148', clusters='37m', lv='1.0', + sector_opts='168H-T-H-B-I-solar+p3-dist1-cb36.7ex0', + co2_budget_name='', planning_horizons='2020'), + input=dict(network="pypsa-eur-sec/results/version-36.7ex0-168H/prenetworks_brownfield/elec_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc"), + output=["results/networks/s{simpl}_{clusters}_lv{lv}_{sector_opts}_{co2_budget_name}_{planning_horizons}-test.nc"], + log=dict(gurobi="logs/elec_s{simpl}_{clusters}_lv{lv}_{sector_opts}_{co2_budget_name}_{planning_horizons}_gurobi-test.log", + python="logs/elec_s{simpl}_{clusters}_lv{lv}_{sector_opts}_{co2_budget_name}_{planning_horizons}_python-test.log") +>>>>>>> Stashed changes ) logging.basicConfig(filename=snakemake.log.python, From cc24859d7845e84da70b7dc011be0c424eec6c71 Mon Sep 17 00:00:00 2001 From: martavp Date: Mon, 5 Jul 2021 12:26:11 +0200 Subject: [PATCH 2/5] 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 bd99ce16..bac9c0c9 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,7 +7,7 @@ Future release .. note:: This unreleased version currently requires the master branches of PyPSA, PyPSA-Eur, and the technology-data repository. - +* The myopic option can now be used together with different clustering for the generators and the network. The existing renewable capacities are split evenly among the regions in every country. * Extended use of ``multiprocessing`` for much better performance (from up to 20 minutes to less than one minute). * Compatibility with ``atlite>=0.2``. Older versions of ``atlite`` will no longer work. From 195cabba0cb4b6a78890811452b57ba29f4e87bc Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Tue, 6 Jul 2021 09:55:41 +0200 Subject: [PATCH 3/5] merge master --- scripts/add_existing_baseyear.py | 113 +++++++++++-------------------- scripts/solve_network.py | 73 +++++++++----------- 2 files changed, 74 insertions(+), 112 deletions(-) diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index bb9e4ff1..4d838f60 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -152,20 +152,14 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas df_agg.drop(df_agg.index[df_agg.Technology.isin(technology_to_drop)], inplace=True) df_agg.Fueltype = df_agg.Fueltype.map(rename_fuel) -<<<<<<< Updated upstream # assign clustered bus busmap_s = pd.read_csv(snakemake.input.busmap_s, index_col=0, squeeze=True) busmap = pd.read_csv(snakemake.input.busmap, index_col=0, squeeze=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() - inv_busmap={} - for k,v in busmap.iteritems(): - inv_busmap[v]=inv_busmap.get(v,[]) + [k] + inv_busmap = {} + for k, v in busmap.iteritems(): + inv_busmap[v] = inv_busmap.get(v, []) + [k] ->>>>>>> Stashed changes clustermaps = busmap_s.map(busmap) clustermaps.index = clustermaps.index.astype(int) @@ -203,62 +197,54 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas capacity = capacity[capacity > snakemake.config['existing_capacities']['threshold_capacity']] if generator in ['solar', 'onwind', 'offwind']: -<<<<<<< Updated upstream - - rename = {"offwind": "offwind-ac"} - p_max_pu=n.generators_t.p_max_pu[capacity.index + ' ' + rename.get(generator, generator) + '-' + str(baseyear)] - - n.madd("Generator", - capacity.index, - suffix=' ' + generator +"-"+ str(grouping_year), - bus=capacity.index, - carrier=generator, - p_nom=capacity, - marginal_cost=costs.at[generator, 'VOM'], - capital_cost=costs.at[generator, 'fixed'], - efficiency=costs.at[generator, 'efficiency'], - p_max_pu=p_max_pu.rename(columns=n.generators.bus), - build_year=grouping_year, - lifetime=costs.at[generator, 'lifetime'] - ) -======= - suffix='-ac' if generator=='offwind' else '' + suffix = '-ac' if generator == 'offwind' else '' + name_suffix = f' {generator}{suffix}-{baseyear}' + if 'm' in snakemake.wildcards.clusters: + for ind in capacity.index: + # existing capacities are split evenly among regions in every country inv_ind = [i for i in inv_busmap[ind]] + # for offshore the spliting only inludes coastal regions - inv_ind=[i for i in inv_ind if (i + ' ' + generator + suffix + '-' + str(baseyear)) in n.generators.index] - p_max_pu = n.generators_t.p_max_pu[[i + ' ' + generator + suffix + '-' + str(baseyear) for i in inv_ind ]] - p_max_pu.columns=[i + ' ' + generator + suffix + '-' + str(grouping_year) for i in inv_ind ] + inv_ind = [i for i in inv_ind if (i + name_suffix) in n.generators.index] + + p_max_pu = n.generators_t.p_max_pu[[i + name_suffix for i in inv_ind]] + p_max_pu.columns=[i + name_suffix for i in inv_ind ] n.madd("Generator", - [i + ' ' + generator + suffix + '-' + str(grouping_year) for i in inv_ind ], - bus=ind, - carrier=generator, - p_nom=capacity[ind]/len(inv_ind), #split among regions in a country - marginal_cost=costs.at[generator,'VOM'], - capital_cost=costs.at[generator,'fixed'], - efficiency=costs.at[generator, 'efficiency'], - p_max_pu=p_max_pu, - build_year=grouping_year, - lifetime=costs.at[generator,'lifetime']) + [i + name_suffix for i in inv_ind], + bus=ind, + carrier=generator, + p_nom=capacity[ind] / len(inv_ind), # split among regions in a country + marginal_cost=costs.at[generator,'VOM'], + capital_cost=costs.at[generator,'fixed'], + efficiency=costs.at[generator, 'efficiency'], + p_max_pu=p_max_pu, + build_year=grouping_year, + lifetime=costs.at[generator,'lifetime'] + ) + else: - p_max_pu=n.generators_t.p_max_pu[capacity.index + ' ' + generator + suffix + '-' + str(baseyear)] + + p_max_pu = n.generators_t.p_max_pu[capacity.index + name_suffix] + n.madd("Generator", - capacity.index, - suffix = ' ' + generator +"-"+ str(grouping_year), - bus=capacity.index, - carrier=generator, - p_nom=capacity, - marginal_cost=costs.at[generator,'VOM'], - capital_cost=costs.at[generator,'fixed'], - efficiency=costs.at[generator, 'efficiency'], - p_max_pu=p_max_pu.rename(columns=n.generators.bus), - build_year=grouping_year, - lifetime=costs.at[generator,'lifetime']) ->>>>>>> Stashed changes + capacity.index, + suffix=' ' + generator +"-"+ str(grouping_year), + bus=capacity.index, + carrier=generator, + p_nom=capacity, + marginal_cost=costs.at[generator, 'VOM'], + capital_cost=costs.at[generator, 'fixed'], + efficiency=costs.at[generator, 'efficiency'], + p_max_pu=p_max_pu.rename(columns=n.generators.bus), + build_year=grouping_year, + lifetime=costs.at[generator, 'lifetime'] + ) + else: n.madd("Link", @@ -453,7 +439,6 @@ def add_heating_capacities_installed_before_baseyear(n, baseyear, grouping_years if __name__ == "__main__": if 'snakemake' not in globals(): -<<<<<<< Updated upstream from helper import mock_snakemake snakemake = mock_snakemake( 'add_existing_baseyear', @@ -462,22 +447,6 @@ if __name__ == "__main__": lv=1.0, sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1', planning_horizons=2020, -======= - from vresutils.snakemake import MockSnakemake - snakemake = MockSnakemake( - wildcards=dict(network='elec', simpl='148', clusters='37m', lv='1.0', - sector_opts='168H-T-H-B-I-solar+p3-dist1-cb36.7ex0', - planning_horizons='2020'), - input=dict(network='pypsa-eur-sec/results/version-36.7ex0-168H/prenetworks/elec_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc', - powerplants='pypsa-eur/resources/powerplants.csv', - busmap_s='pypsa-eur/resources/busmap_elec_s{simpl}.csv', - busmap='pypsa-eur/resources/busmap_elec_s{simpl}_{clusters}.csv', - costs='technology-data/outputs/costs_{planning_horizons}.csv', - cop_air_total="pypsa-eur-sec/resources/cop_air_total_elec_s{simpl}_{clusters}.nc", - cop_soil_total="pypsa-eur-sec/resources/cop_soil_total_elec_s{simpl}_{clusters}.nc", - clustered_pop_layout="pypsa-eur-sec/resources/pop_layout_elec_s{simpl}_{clusters}.csv",), - output=['pypsa-eur-sec/results/version-36.7ex0-168H/prenetworks_brownfield/elec_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc'], ->>>>>>> Stashed changes ) logging.basicConfig(level=snakemake.config['logging_level']) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index ce8b65f9..2b916471 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -19,15 +19,43 @@ pypsa.pf.logger.setLevel(logging.WARNING) def add_land_use_constraint(n): - #warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind' - for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: - existing = n.generators.loc[n.generators.carrier == carrier, "p_nom"].groupby(n.generators.bus.map(n.buses.location)).sum() - existing.index += " " + carrier + "-" + snakemake.wildcards.planning_horizons - n.generators.loc[existing.index, "p_nom_max"] -= existing + if 'm' in snakemake.wildcards.clusters: + add_land_use_constraint_m(n) + else: + #warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind' + for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: + existing = n.generators.loc[n.generators.carrier==carrier,"p_nom"].groupby(n.generators.bus.map(n.buses.location)).sum() + existing.index += " " + carrier + "-" + snakemake.wildcards.planning_horizons + n.generators.loc[existing.index,"p_nom_max"] -= existing n.generators.p_nom_max.clip(lower=0, inplace=True) +def add_land_use_constraint_m(n): + # if generators clustering is lower than network clustering, land_use accounting is at generators clusters + + planning_horizons = snakemake.config["scenario"]["planning_horizons"] + grouping_years = snakemake.config["existing_capacities"]["grouping_years"] + current_horizon = snakemake.wildcards.planning_horizons + + for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: + + existing = n.generators.loc[n.generators.carrier==carrier,"p_nom"] + ind = list(set([i.split(sep=" ")[0] + ' ' + i.split(sep=" ")[1] for i in existing.index])) + + previous_years = [ + str(y) for y in + planning_horizons + grouping_years + if y < int(snakemake.wildcards.planning_horizons) + ] + + for p_year in previous_years: + ind2 = [i for i in ind if i + " " + carrier + "-" + p_year in existing.index] + sel_current = [i + " " + carrier + "-" + current_horizon for i in ind2] + sel_p_year = [i + " " + carrier + "-" + p_year for i in ind2] + n.generators.loc[sel_current, "p_nom_max"] -= existing.loc[sel_p_year].rename(lambda x: x[:-4] + current_horizon) + + def prepare_network(n, solve_opts=None): if 'clip_p_max_pu' in solve_opts: @@ -136,7 +164,6 @@ def add_chp_constraints(n): rhs = n.links.loc[electric_fix, "p_nom"].values -<<<<<<< Updated upstream define_constraints(n, lhs, "<=", rhs, 'chplink', 'top_iso_fuel_line_fix') if not electric.empty: @@ -149,28 +176,6 @@ def add_chp_constraints(n): link_p[electric].values)) define_constraints(n, lhs, "<=", 0, 'chplink', 'backpressure') -======= -def add_land_use_constraint(n): - if 'm' in snakemake.wildcards.clusters: - # if generators clustering is lower than network clustering, land_use - # accounting is at generators clusters - for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: - existing_capacities = n.generators.loc[n.generators.carrier==carrier,"p_nom"] - ind=list(set([i.split(sep=" ")[0] + ' ' + i.split(sep=" ")[1] for i in existing_capacities.index])) - previous_years= [str(y) for y in - snakemake.config["scenario"]["planning_horizons"] - + snakemake.config["existing_capacities"]["grouping_years"] - if y < int(snakemake.wildcards.planning_horizons)] - for p_year in previous_years: - ind2 = [i for i in ind if i + " " + carrier + "-" + p_year in existing_capacities.index] - n.generators.loc[[i + " " + carrier + "-" + snakemake.wildcards.planning_horizons for i in ind2], "p_nom_max"] -= existing_capacities.loc[[i + " " + carrier + "-" + p_year for i in ind2]].rename(lambda x: x[:-4]+snakemake.wildcards.planning_horizons) - else: - #warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind' - for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: - existing_capacities = n.generators.loc[n.generators.carrier==carrier,"p_nom"].groupby(n.generators.bus.map(n.buses.location)).sum() - existing_capacities.index += " " + carrier + "-" + snakemake.wildcards.planning_horizons - n.generators.loc[existing_capacities.index,"p_nom_max"] -= existing_capacities ->>>>>>> Stashed changes def extra_functionality(n, snapshots): @@ -204,7 +209,6 @@ def solve_network(n, config, opts='', **kwargs): if __name__ == "__main__": if 'snakemake' not in globals(): -<<<<<<< Updated upstream from helper import mock_snakemake snakemake = mock_snakemake( 'solve_network', @@ -213,17 +217,6 @@ if __name__ == "__main__": lv=1.0, sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1', planning_horizons=2050, -======= - from vresutils.snakemake import MockSnakemake, Dict - snakemake = MockSnakemake( - wildcards=dict(network='elec', simpl='148', clusters='37m', lv='1.0', - sector_opts='168H-T-H-B-I-solar+p3-dist1-cb36.7ex0', - co2_budget_name='', planning_horizons='2020'), - input=dict(network="pypsa-eur-sec/results/version-36.7ex0-168H/prenetworks_brownfield/elec_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc"), - output=["results/networks/s{simpl}_{clusters}_lv{lv}_{sector_opts}_{co2_budget_name}_{planning_horizons}-test.nc"], - log=dict(gurobi="logs/elec_s{simpl}_{clusters}_lv{lv}_{sector_opts}_{co2_budget_name}_{planning_horizons}_gurobi-test.log", - python="logs/elec_s{simpl}_{clusters}_lv{lv}_{sector_opts}_{co2_budget_name}_{planning_horizons}_python-test.log") ->>>>>>> Stashed changes ) logging.basicConfig(filename=snakemake.log.python, From 4400658099523686a240fa6505535e49077e5ecc Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 2 Oct 2021 10:40:01 +0200 Subject: [PATCH 4/5] edit release note --- doc/release_notes.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index f0bf3caa..efc6ca1a 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,7 +7,7 @@ Future release .. note:: This unreleased version currently requires the master branches of PyPSA, PyPSA-Eur, and the technology-data repository. -* The myopic option can now be used together with different clustering for the generators and the network. The existing renewable capacities are split evenly among the regions in every country. + * With this release, we change the license from copyleft GPLv3 to the more liberal MIT license with the consent of all contributors. * Extended use of ``multiprocessing`` for much better performance @@ -88,6 +88,7 @@ Future release * Compatibility with ``xarray`` version 0.19. * Separate basic chemicals into HVC, chlorine, methanol and ammonia [`#166 `_]. * Add option to specify reuse, primary production, and mechanical and chemical recycling fraction of platics [`#166 `_]. +* The myopic option can now be used together with different clustering for the generators and the network. The existing renewable capacities are split evenly among the regions in every country [`#144 `_]. PyPSA-Eur-Sec 0.5.0 (21st May 2021) =================================== From 437508383875bcec72fe39f102ce7673d43a7155 Mon Sep 17 00:00:00 2001 From: Fabian Neumann Date: Sat, 2 Oct 2021 10:40:49 +0200 Subject: [PATCH 5/5] create parallel structures for land-use constraints w/wo m --- scripts/solve_network.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 673b7797..eac1f581 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -21,18 +21,23 @@ pypsa.pf.logger.setLevel(logging.WARNING) def add_land_use_constraint(n): if 'm' in snakemake.wildcards.clusters: - add_land_use_constraint_m(n) + _add_land_use_constraint_m(n) else: - #warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind' - for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: - existing = n.generators.loc[n.generators.carrier==carrier,"p_nom"].groupby(n.generators.bus.map(n.buses.location)).sum() - existing.index += " " + carrier + "-" + snakemake.wildcards.planning_horizons - n.generators.loc[existing.index,"p_nom_max"] -= existing + _add_land_use_constraint(n) + +def _add_land_use_constraint(n): + #warning: this will miss existing offwind which is not classed AC-DC and has carrier 'offwind' + + for carrier in ['solar', 'onwind', 'offwind-ac', 'offwind-dc']: + existing = n.generators.loc[n.generators.carrier==carrier,"p_nom"].groupby(n.generators.bus.map(n.buses.location)).sum() + existing.index += " " + carrier + "-" + snakemake.wildcards.planning_horizons + n.generators.loc[existing.index,"p_nom_max"] -= existing + n.generators.p_nom_max.clip(lower=0, inplace=True) -def add_land_use_constraint_m(n): +def _add_land_use_constraint_m(n): # if generators clustering is lower than network clustering, land_use accounting is at generators clusters planning_horizons = snakemake.config["scenario"]["planning_horizons"] @@ -55,6 +60,8 @@ def add_land_use_constraint_m(n): sel_current = [i + " " + carrier + "-" + current_horizon for i in ind2] sel_p_year = [i + " " + carrier + "-" + p_year for i in ind2] n.generators.loc[sel_current, "p_nom_max"] -= existing.loc[sel_p_year].rename(lambda x: x[:-4] + current_horizon) + + n.generators.p_nom_max.clip(lower=0, inplace=True) def prepare_network(n, solve_opts=None):