cluster_network: Implement 'heuristic' potential clustering
This commit is contained in:
parent
9c6c89dfad
commit
495b6f8015
@ -136,17 +136,25 @@ def plot_busmap_for_n_clusters(n, n_clusters=50):
|
|||||||
n.plot(bus_colors=busmap.map(dict(zip(cs, cr))))
|
n.plot(bus_colors=busmap.map(dict(zip(cs, cr))))
|
||||||
del cs, cr
|
del cs, cr
|
||||||
|
|
||||||
def clustering_for_n_clusters(n, n_clusters, aggregate_renewables=True, line_length_factor=1.25):
|
def clustering_for_n_clusters(n, n_clusters, aggregate_carriers=None,
|
||||||
aggregate_generators_carriers = (None if aggregate_renewables
|
line_length_factor=1.25, potential_mode='conservative'):
|
||||||
else (pd.Index(n.generators.carrier.unique())
|
|
||||||
.difference(['onwind', 'offwind', 'solar'])))
|
if potential_mode == 'conservative':
|
||||||
|
p_nom_max_strategy = np.min
|
||||||
|
elif potential_mode == 'heuristic':
|
||||||
|
p_nom_max_strategy = np.sum
|
||||||
|
else:
|
||||||
|
raise AttributeError("potential_mode should be one of 'conservative' or 'heuristic', "
|
||||||
|
"but is '{}'".format(potential_mode))
|
||||||
|
|
||||||
clustering = get_clustering_from_busmap(
|
clustering = get_clustering_from_busmap(
|
||||||
n, busmap_for_n_clusters(n, n_clusters),
|
n, busmap_for_n_clusters(n, n_clusters),
|
||||||
bus_strategies=dict(country=_make_consense("Bus", "country")),
|
bus_strategies=dict(country=_make_consense("Bus", "country")),
|
||||||
aggregate_generators_weighted=True,
|
aggregate_generators_weighted=True,
|
||||||
aggregate_generators_carriers=aggregate_generators_carriers,
|
aggregate_generators_carriers=aggregate_carriers,
|
||||||
aggregate_one_ports=["Load", "StorageUnit"],
|
aggregate_one_ports=["Load", "StorageUnit"],
|
||||||
line_length_factor=line_length_factor
|
line_length_factor=line_length_factor,
|
||||||
|
generator_strategies={'p_nom_max': p_nom_max_strategy}
|
||||||
)
|
)
|
||||||
|
|
||||||
return clustering
|
return clustering
|
||||||
@ -193,12 +201,16 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
n = pypsa.Network(snakemake.input.network)
|
n = pypsa.Network(snakemake.input.network)
|
||||||
|
|
||||||
|
renewable_carriers = pd.Index([tech
|
||||||
|
for tech in n.generators.carrier.unique()
|
||||||
|
if tech.split('-', 2)[0] in snakemake.config['renewable']])
|
||||||
|
|
||||||
if snakemake.wildcards.clusters.endswith('m'):
|
if snakemake.wildcards.clusters.endswith('m'):
|
||||||
n_clusters = int(snakemake.wildcards.clusters[:-1])
|
n_clusters = int(snakemake.wildcards.clusters[:-1])
|
||||||
aggregate_renewables = False
|
aggregate_carriers = None # All
|
||||||
else:
|
else:
|
||||||
n_clusters = int(snakemake.wildcards.clusters)
|
n_clusters = int(snakemake.wildcards.clusters)
|
||||||
aggregate_renewables = True
|
aggregate_carriers = pd.Index(n.generators.carrier.unique()).difference(renewable_carriers)
|
||||||
|
|
||||||
if n_clusters == len(n.buses):
|
if n_clusters == len(n.buses):
|
||||||
# Fast-path if no clustering is necessary
|
# Fast-path if no clustering is necessary
|
||||||
@ -207,7 +219,18 @@ if __name__ == "__main__":
|
|||||||
clustering = pypsa.networkclustering.Clustering(n, busmap, linemap, linemap, pd.Series(dtype='O'))
|
clustering = pypsa.networkclustering.Clustering(n, busmap, linemap, linemap, pd.Series(dtype='O'))
|
||||||
else:
|
else:
|
||||||
line_length_factor = snakemake.config['lines']['length_factor']
|
line_length_factor = snakemake.config['lines']['length_factor']
|
||||||
clustering = clustering_for_n_clusters(n, n_clusters, aggregate_renewables, line_length_factor=line_length_factor)
|
|
||||||
|
def consense(x):
|
||||||
|
v = x.iat[0]
|
||||||
|
assert ((x == v).all() or x.isnull().all()), (
|
||||||
|
"The `potential` configuration option must agree for all renewable carriers, for now!"
|
||||||
|
)
|
||||||
|
return v
|
||||||
|
potential_mode = consense(pd.Series([snakemake.config['renewable'][tech]['potential']
|
||||||
|
for tech in renewable_carriers]))
|
||||||
|
clustering = clustering_for_n_clusters(n, n_clusters, aggregate_carriers,
|
||||||
|
line_length_factor=line_length_factor,
|
||||||
|
potential_mode=potential_mode)
|
||||||
|
|
||||||
clustering.network.export_to_netcdf(snakemake.output.network)
|
clustering.network.export_to_netcdf(snakemake.output.network)
|
||||||
with pd.HDFStore(snakemake.output.clustermaps, mode='w') as store:
|
with pd.HDFStore(snakemake.output.clustermaps, mode='w') as store:
|
||||||
|
@ -268,7 +268,19 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
if snakemake.wildcards.simpl:
|
if snakemake.wildcards.simpl:
|
||||||
n_clusters = int(snakemake.wildcards.simpl)
|
n_clusters = int(snakemake.wildcards.simpl)
|
||||||
clustering = clustering_for_n_clusters(n, n_clusters)
|
|
||||||
|
renewable_carriers = pd.Index([tech
|
||||||
|
for tech in n.generators.carrier.unique()
|
||||||
|
if tech.split('-', 2)[0] in snakemake.config['renewable']])
|
||||||
|
def consense(x):
|
||||||
|
v = x.iat[0]
|
||||||
|
assert ((x == v).all() or x.isnull().all()), (
|
||||||
|
"The `potential` configuration option must agree for all renewable carriers, for now!"
|
||||||
|
)
|
||||||
|
return v
|
||||||
|
potential_mode = consense(pd.Series([snakemake.config['renewable'][tech]['potential']
|
||||||
|
for tech in renewable_carriers]))
|
||||||
|
clustering = clustering_for_n_clusters(n, n_clusters, potential_mode=potential_mode)
|
||||||
|
|
||||||
n = clustering.network
|
n = clustering.network
|
||||||
busmaps.append(clustering.busmap)
|
busmaps.append(clustering.busmap)
|
||||||
|
Loading…
Reference in New Issue
Block a user