From 9178dde4a7517bdafb05cec33fc796719322e13d Mon Sep 17 00:00:00 2001 From: Fabian Hofmann Date: Mon, 23 Sep 2019 14:32:51 +0200 Subject: [PATCH 1/3] partially resolves #70 --- scripts/cluster_network.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index f1ffdfc4..e40fb6bb 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -8,24 +8,20 @@ logger = logging.getLogger(__name__) import os import numpy as np -import scipy as sp -from scipy.sparse.csgraph import connected_components -import xarray as xr import geopandas as gpd import shapely -import networkx as nx -from shutil import copyfile +import matplotlib.pyplot as plt +import seaborn as sns -from six import iteritems from six.moves import reduce import pyomo.environ as po import pypsa -from pypsa.io import import_components_from_dataframe, import_series_from_dataframe -from pypsa.networkclustering import (busmap_by_stubs, busmap_by_kmeans, - _make_consense, get_clustering_from_busmap, - aggregategenerators, aggregateoneport) +from pypsa.networkclustering import (busmap_by_kmeans, busmap_by_louvain, + busmap_by_spectral_clustering, + _make_consense, get_clustering_from_busmap) + def normed(x): return (x/x.sum()).fillna(0.) @@ -156,6 +152,12 @@ def clustering_for_n_clusters(n, n_clusters, aggregate_carriers=None, generator_strategies={'p_nom_max': p_nom_max_strategy} ) + nc = clustering.network + nc.links['underwater_fraction'] = (n.links.eval('underwater_fraction * length') + .div(nc.links.length).dropna()) +# nc.links['capital_cost'] += (costs.at['HVDC overhead', 'capital_cost'] * +# (nc.links.length - n.links.length) +# .dropna().clip(lower=0)) return clustering def save_to_geojson(s, fn): From 16ff2b51bdf66787b3e1d84a036042d1ee3abaa9 Mon Sep 17 00:00:00 2001 From: Fabian Hofmann Date: Mon, 23 Sep 2019 16:44:48 +0200 Subject: [PATCH 2/3] fix small issues --- Snakefile | 3 ++- scripts/cluster_network.py | 30 ++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Snakefile b/Snakefile index c24bd250..f685d505 100644 --- a/Snakefile +++ b/Snakefile @@ -175,7 +175,8 @@ rule cluster_network: network='networks/{network}_s{simpl}.nc', regions_onshore="resources/regions_onshore_{network}_s{simpl}.geojson", regions_offshore="resources/regions_offshore_{network}_s{simpl}.geojson", - clustermaps=ancient('resources/clustermaps_{network}_s{simpl}.h5') + clustermaps=ancient('resources/clustermaps_{network}_s{simpl}.h5'), + tech_costs=COSTS output: network='networks/{network}_s{simpl}_{clusters}.nc', regions_onshore="resources/regions_onshore_{network}_s{simpl}_{clusters}.geojson", diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index e40fb6bb..5f0cf90e 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -18,10 +18,11 @@ from six.moves import reduce import pyomo.environ as po import pypsa -from pypsa.networkclustering import (busmap_by_kmeans, busmap_by_louvain, - busmap_by_spectral_clustering, +from pypsa.networkclustering import (busmap_by_kmeans, busmap_by_spectral_clustering, _make_consense, get_clustering_from_busmap) +from add_electricity import load_costs + def normed(x): return (x/x.sum()).fillna(0.) @@ -132,7 +133,8 @@ def plot_busmap_for_n_clusters(n, n_clusters=50): def clustering_for_n_clusters(n, n_clusters, aggregate_carriers=None, line_length_factor=1.25, potential_mode='simple', - solver_name="cbc", algorithm="kmeans"): + solver_name="cbc", algorithm="kmeans", + extended_link_costs=0): if potential_mode == 'simple': p_nom_max_strategy = np.sum @@ -149,15 +151,15 @@ def clustering_for_n_clusters(n, n_clusters, aggregate_carriers=None, aggregate_generators_carriers=aggregate_carriers, aggregate_one_ports=["Load", "StorageUnit"], line_length_factor=line_length_factor, - generator_strategies={'p_nom_max': p_nom_max_strategy} - ) + generator_strategies={'p_nom_max': p_nom_max_strategy}, + scale_link_capital_costs=False) nc = clustering.network nc.links['underwater_fraction'] = (n.links.eval('underwater_fraction * length') .div(nc.links.length).dropna()) -# nc.links['capital_cost'] += (costs.at['HVDC overhead', 'capital_cost'] * -# (nc.links.length - n.links.length) -# .dropna().clip(lower=0)) + nc.links['capital_cost'] += (nc.links.length.sub(n.links.length).dropna() + .clip(lower=0) + .mul(extended_link_costs * line_length_factor)) return clustering def save_to_geojson(s, fn): @@ -190,7 +192,9 @@ if __name__ == "__main__": network='networks/{network}_s{simpl}.nc', regions_onshore='resources/regions_onshore_{network}_s{simpl}.geojson', regions_offshore='resources/regions_offshore_{network}_s{simpl}.geojson', - clustermaps='resources/clustermaps_{network}_s{simpl}.h5' + clustermaps='resources/clustermaps_{network}_s{simpl}.h5', + tech_costs='data/costs.csv', + ), output=Dict( network='networks/{network}_s{simpl}_{clusters}.nc', @@ -222,6 +226,11 @@ if __name__ == "__main__": clustering = pypsa.networkclustering.Clustering(n, busmap, linemap, linemap, pd.Series(dtype='O')) else: line_length_factor = snakemake.config['lines']['length_factor'] + overhead_cost = (load_costs(n.snapshot_weightings.sum()/8760, + tech_costs=snakemake.input.tech_costs, + config=snakemake.config['costs'], + elec_config=snakemake.config['electricity']) + .at['HVAC overhead', 'capital_cost']) def consense(x): v = x.iat[0] @@ -234,7 +243,8 @@ if __name__ == "__main__": clustering = clustering_for_n_clusters(n, n_clusters, aggregate_carriers, line_length_factor=line_length_factor, potential_mode=potential_mode, - solver_name=snakemake.config['solving']['solver']['name']) + solver_name=snakemake.config['solving']['solver']['name'], + extended_link_costs=overhead_cost) clustering.network.export_to_netcdf(snakemake.output.network) with pd.HDFStore(snakemake.output.clustermaps, mode='w') as store: From 142434b5295d582f94f35a39d85c6d6cbda2e280 Mon Sep 17 00:00:00 2001 From: Fabian Hofmann Date: Thu, 31 Oct 2019 10:37:49 +0100 Subject: [PATCH 3/3] incorporate suggestions --- scripts/cluster_network.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 5f0cf90e..46b1dadb 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -157,9 +157,10 @@ def clustering_for_n_clusters(n, n_clusters, aggregate_carriers=None, nc = clustering.network nc.links['underwater_fraction'] = (n.links.eval('underwater_fraction * length') .div(nc.links.length).dropna()) - nc.links['capital_cost'] += (nc.links.length.sub(n.links.length).dropna() - .clip(lower=0) - .mul(extended_link_costs * line_length_factor)) + nc.links['capital_cost'] = (nc.links['capital_cost'] + .add((nc.links.length - n.links.length) + .clip(lower=0).mul(extended_link_costs), + fill_value=0)) return clustering def save_to_geojson(s, fn): @@ -226,11 +227,11 @@ if __name__ == "__main__": clustering = pypsa.networkclustering.Clustering(n, busmap, linemap, linemap, pd.Series(dtype='O')) else: line_length_factor = snakemake.config['lines']['length_factor'] - overhead_cost = (load_costs(n.snapshot_weightings.sum()/8760, + hvac_overhead_cost = (load_costs(n.snapshot_weightings.sum()/8760, tech_costs=snakemake.input.tech_costs, config=snakemake.config['costs'], elec_config=snakemake.config['electricity']) - .at['HVAC overhead', 'capital_cost']) + .at['HVAC overhead', 'capital_cost']) def consense(x): v = x.iat[0] @@ -244,7 +245,7 @@ if __name__ == "__main__": line_length_factor=line_length_factor, potential_mode=potential_mode, solver_name=snakemake.config['solving']['solver']['name'], - extended_link_costs=overhead_cost) + extended_link_costs=hvac_overhead_cost) clustering.network.export_to_netcdf(snakemake.output.network) with pd.HDFStore(snakemake.output.clustermaps, mode='w') as store: