Skip to content

Commit

Permalink
Update PyPSA data iteratively, fixes #44
Browse files Browse the repository at this point in the history
  • Loading branch information
gplessm committed Sep 21, 2017
1 parent d6ff0d8 commit e1aee01
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 2 deletions.
7 changes: 6 additions & 1 deletion edisgo/grid/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,12 @@ def analyze(self, mode=None):
Translator to PyPSA data format
"""
self.pypsa = pypsa_io.to_pypsa(self, mode)
if self.results.equipment_changes.empty:
# Translate eDisGo grid topology representation to PyPSA format
self.pypsa = pypsa_io.to_pypsa(self, mode)
else:
# Update PyPSA data with equipment changes
pypsa_io.update_pypsa(self)

# run power flow analysis
self.pypsa.pf(self.pypsa.snapshots)
Expand Down
106 changes: 105 additions & 1 deletion edisgo/tools/pypsa_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
container.
"""

from edisgo.grid.components import Transformer, Line

import pandas as pd
from math import pi, sqrt, floor
Expand Down Expand Up @@ -1048,4 +1049,107 @@ def process_pfa_results(network, pypsa):
'lv': pfa_v_mag_pu[list(lv_station_mapping_sec.values()) +
list(lv_generators_mapping.values()) +
list(lv_branch_t_mapping.values()) +
list(lv_loads_mapping.values())]}, axis=1)
list(lv_loads_mapping.values())]}, axis=1)


def update_pypsa(network):
"""
Update equipment data of lines and transformers
During grid reinforcement (see ...) lines and transformers are replaced or
extended. The PyPSA grid topology representation is updated by this function
accordingly.
The equipment changes are recorded as 'added' and 'removed' components.
Parameters
----------
network : Network
eDisGo grid container
"""

# Filter equipment changes: take only last iteration step
equipment_changes = network.results.equipment_changes[
network.results.equipment_changes['iteration_step'] ==
network.results.equipment_changes['iteration_step'].max()]

# Step 1: Update transformers
transformers = equipment_changes[
equipment_changes['equipment'].apply(isinstance, args=(Transformer,))]
removed_transformers = [repr(_) for _ in
transformers[transformers['change'] == 'removed'][
'equipment'].tolist()]
added_transformers = transformers[transformers['change'] == 'added']

transformer = {'name': [],
'bus0': [],
'bus1': [],
'type': [],
'model': [],
'x': [],
'r': [],
's_nom': [],
'tap_ratio': []}

for idx, row in added_transformers.iterrows():
transformer['bus0'].append('_'.join(['Bus', idx.__repr__(side='mv')]))
transformer['bus1'].append('_'.join(['Bus', idx.__repr__(side='lv')]))
transformer['name'].append(repr(row['equipment']))
transformer['type'].append("")
transformer['model'].append('pi')
transformer['r'].append(row['equipment'].type.R)
transformer['x'].append(row['equipment'].type.X)
transformer['s_nom'].append(row['equipment'].type.S_nom / 1e3)
transformer['tap_ratio'].append(1)

network.pypsa.transformers.drop(removed_transformers, inplace=True)
network.pypsa.transformers = pd.concat([
network.pypsa.transformers,
pd.DataFrame(transformer).set_index('name')], axis=0)

# Step 2: Update lines
lines = equipment_changes[
equipment_changes['equipment'].apply(isinstance, args=(Line,))]
changed_lines = lines[lines['change'] == 'changed']

line = {'name': [],
'bus0': [],
'bus1': [],
'type': [],
'x': [],
'r': [],
's_nom': [],
'length': []}

lv_stations = network.mv_grid.graph.nodes_by_attribute('lv_station')

omega = 2 * pi * 50

for idx, row in changed_lines.iterrows():
# Update line parameters
network.pypsa.lines.loc[repr(idx), 'r'] = (
idx.type['R'] / idx.quantity * idx.length / 1e3)
network.pypsa.lines.loc[repr(idx), 'x'] = (
idx.type['L'] / 1e3 * omega / idx.quantity * idx.length / 1e3)
network.pypsa.lines.loc[repr(idx), 's_nom'] = (
sqrt(3) * idx.type['I_max_th'] * idx.type[
'U_n'] * idx.quantity / 1e3)

# Update buses line is connected to
adj_nodes = idx.grid.graph.nodes_from_line(idx)

if adj_nodes[0] in lv_stations:
bus0 = '_'.join(['Bus', adj_nodes[0].__repr__(side='mv')])
elif adj_nodes[0] is network.mv_grid.station:
bus0 = '_'.join(['Bus', adj_nodes[0].__repr__(side='lv')])
else:
bus0 = '_'.join(['Bus', repr(adj_nodes[0])])

if adj_nodes[1] in lv_stations:
bus1 = '_'.join(['Bus', adj_nodes[1].__repr__(side='mv')])
elif adj_nodes[1] is network.mv_grid.station:
bus1 = '_'.join(['Bus', adj_nodes[1].__repr__(side='lv')])
else:
bus1 = '_'.join(['Bus', repr(adj_nodes[1])])

network.pypsa.lines.loc[repr(idx), 'bus0'] = bus0
network.pypsa.lines.loc[repr(idx), 'bus1'] = bus1

0 comments on commit e1aee01

Please sign in to comment.