From 2c7f013e390b0b36a1effb58724b7fd9eea321d8 Mon Sep 17 00:00:00 2001 From: Jonas Hoersch Date: Tue, 19 Dec 2017 13:28:16 +0100 Subject: [PATCH] base_network: Remove clean-up code that moved directly into gridkit --- scripts/base_network.py | 100 +--------------------------------------- 1 file changed, 2 insertions(+), 98 deletions(-) diff --git a/scripts/base_network.py b/scripts/base_network.py index 15daf394..fa20f349 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -19,11 +19,6 @@ logger = logging.getLogger(__name__) import pypsa -def _find_closest_bus(buses, pos): - if (not hasattr(_find_closest_bus, 'kdtree')) or len(_find_closest_bus.kdtree.data) != len(buses.index): - _find_closest_bus.kdtree = sp.spatial.cKDTree(buses.loc[:,["x", "y"]].values) - return buses.index[_find_closest_bus.kdtree.query(pos)[1]] - def _load_buses_from_eg(): buses = (pd.read_csv(snakemake.input.eg_buses, quotechar="'", true_values='t', false_values='f', @@ -95,46 +90,6 @@ def _load_lines_from_eg(buses): return lines -def _split_aclines_with_several_voltages(buses, lines, transformers): - ## Split AC lines with multiple voltages - def namer(string, start=0): return (string.format(x) for x in count(start=start)) - busname = namer("M{:02}") - trafoname = namer("M{:02}") - linename = namer("M{:02}") - - def find_or_add_lower_v_nom_bus(bus, v_nom): - candidates = transformers.loc[(transformers.bus1 == bus) & - (transformers.bus0.map(buses.v_nom) == v_nom), - 'bus0'] - if len(candidates): - return candidates.iloc[0] - new_bus = next(busname) - buses.loc[new_bus] = pd.Series({'v_nom': v_nom, 'symbol': 'joint', 'carrier': 'AC', - 'x': buses.at[bus, 'x'], 'y': buses.at[bus, 'y'], - 'under_construction': buses.at[bus, 'under_construction']}) - - transformers.loc[next(trafoname)] = pd.Series({'bus0': new_bus, 'bus1': bus}) - return new_bus - - voltage_levels = lines.v_nom.unique() - - for line in lines.tags.str.extract(r'"text_"=>"\(?(\d+)\+(\d+).*?"', expand=True).dropna().itertuples(): - v_nom = int(line._2) - if lines.at[line.Index, 'num_parallel'] > 1: - lines.at[line.Index, 'num_parallel'] -= 1 - - if v_nom in voltage_levels: - bus0 = find_or_add_lower_v_nom_bus(lines.at[line.Index, 'bus0'], v_nom) - bus1 = find_or_add_lower_v_nom_bus(lines.at[line.Index, 'bus1'], v_nom) - lines.loc[next(linename)] = pd.Series( - dict(chain(iteritems({'bus0': bus0, 'bus1': bus1, 'v_nom': v_nom, 'circuits': 1}), - iteritems({k: lines.at[line.Index, k] - for k in ('underground', 'under_construction', - 'tags', 'geometry', 'length')}))) - ) - - return buses, lines, transformers - def _apply_parameter_corrections(n): with open(snakemake.input.parameter_corrections) as f: corrections = yaml.load(f) @@ -205,49 +160,6 @@ def _set_electrical_parameters_transformers(transformers): def _remove_dangling_branches(branches, buses): return pd.DataFrame(branches.loc[branches.bus0.isin(buses.index) & branches.bus1.isin(buses.index)]) -def _connect_close_buses(network, radius=1.): - adj = network.graph(["Line", "Transformer", "Link"]).adj - - n_lines_added = 0 - n_transformers_added = 0 - ac_buses = network.buses[network.buses.carrier == 'AC'] - - for i,u in enumerate(ac_buses.index): - - vs = ac_buses[["x","y"]].iloc[i+1:] - distance_km = pypsa.geo.haversine(vs, ac_buses.loc[u,["x","y"]]) - - for j,v in enumerate(vs.index): - km = distance_km[j,0] - - if km < radius: - if u in adj[v]: - continue - #print(u,v,ac_buses.at[u,"v_nom"], ac_buses.at[v,"v_nom"],km) - - if ac_buses.at[u,"v_nom"] != ac_buses.at[v,"v_nom"]: - network.add("Transformer","extra_trafo_{}_{}".format(u,v),s_nom=2000,bus0=u,bus1=v,x=0.1) - n_transformers_added += 1 - else: - network.add("Line","extra_line_{}_{}".format(u,v),s_nom=4000,bus0=u,bus1=v,x=0.1) - n_lines_added += 1 - - logger.info("Added {} lines and {} transformers to connect buses less than {} km apart." - .format(n_lines_added, n_transformers_added, radius)) - - return network - -def _remove_connected_components_smaller_than(network, min_size): - network.determine_network_topology() - - sub_network_sizes = network.buses.groupby('sub_network').size() - subs_to_remove = sub_network_sizes.index[sub_network_sizes < min_size] - - logger.info("Removing {} small sub_networks (synchronous zones) with less than {} buses. In total {} buses." - .format(len(subs_to_remove), min_size, network.buses.sub_network.isin(subs_to_remove).sum())) - - return network[~network.buses.sub_network.isin(subs_to_remove)] - def _remove_unconnected_components(network): _, labels = csgraph.connected_components(network.adjacency_matrix(), directed=False) component = pd.Series(labels, index=network.buses.index) @@ -289,18 +201,10 @@ def base_network(): if 'T' in snakemake.wildcards.opts.split('-'): raise NotImplemented - # n = _connect_close_buses(n, radius=1.) - n = _remove_unconnected_components(n) _apply_parameter_corrections(n) - # Workaround: import_components_from_dataframe does not preserve types of foreign columns - n.lines['underground'] = n.lines['underground'].astype(bool) - n.lines['under_construction'] = n.lines['under_construction'].astype(bool) - n.links['underground'] = n.links['underground'].astype(bool) - n.links['under_construction'] = n.links['under_construction'].astype(bool) - return n if __name__ == "__main__": @@ -322,9 +226,9 @@ if __name__ == "__main__": snakemake.wildcards = Dict(opts='LC') with open('../config.yaml') as f: snakemake.config = yaml.load(f) - snakemake.output = ['../networks/base_LC.h5'] + snakemake.output = ['../networks/base_LC.nc'] logger.setLevel(level=snakemake.config['logging_level']) n = base_network() - n.export_to_hdf5(snakemake.output[0]) + n.export_to_netcdf(snakemake.output[0])