Skip to content

Commit d3760d3

Browse files
author
Denis Bonnand
committed
Update DC opf with changes in DC dataframes
Signed-off-by: Denis Bonnand <[email protected]>
1 parent b3e1f20 commit d3760d3

File tree

12 files changed

+147
-74
lines changed

12 files changed

+147
-74
lines changed

java/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@
8181
<type>pom</type>
8282
<scope>import</scope>
8383
</dependency>
84+
<dependency>
85+
<groupId>com.powsybl</groupId>
86+
<artifactId>powsybl-open-loadflow</artifactId>
87+
<version>2.0.0-CUSTOM</version>
88+
</dependency>
8489
</dependencies>
8590
</dependencyManagement>
8691

pypowsybl/network/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@
4747
create_dc_detailed_lcc_bipole_ground_return_with_dc_line_segments_network,
4848
create_dc_detailed_lcc_bipole_metallic_return_network,
4949
create_dc_detailed_vsc_symmetrical_monopole_network,
50-
create_dc_detailed_vsc_asymmetrical_monopole_network
50+
create_dc_detailed_vsc_asymmetrical_monopole_network,
51+
create_ac_dc_bipolar_network,
52+
create_ac_dc_bipolar_network_with_metallic_return
5153
)
5254
from .impl.util import (
5355
get_extensions_names,

pypowsybl/network/impl/network_creation_util.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -292,13 +292,13 @@ def create_ac_dc_bipolar_network(allow_variant_multi_thread_access: bool = False
292292
n.create_dc_lines(id='dlGn', dc_node1_id='dnGn', dc_node2_id='dnGr', r=1000000)
293293
n.create_lines(id='l12', voltage_level1_id='vl1', bus1_id='b1', voltage_level2_id='vl2', bus2_id='b2', r=1, x=3)
294294
n.create_lines(id='l25', voltage_level1_id='vl2', bus1_id='b2', voltage_level2_id='vl5', bus2_id='b5', r=1, x=3)
295-
n.create_voltage_source_converter(id='conv23', voltage_level_id='vl2', dc_node1_id='dn3p', dc_node2_id='dn3n',
296-
bus_id='b2', voltage_regulator_on=0, control_mode='P_PCC', target_p=-50.0,
297-
target_q=0.0, idle_loss=0.5, switching_loss=1.0, resistive_loss=0.2,
295+
n.create_voltage_source_converters(id='conv23', voltage_level_id='vl2', dc_node1_id='dn3p', dc_node2_id='dn3n',
296+
bus1_id='b2', voltage_regulator_on=0, control_mode='P_PCC', target_p=-50.0,
297+
target_q=0.0, idle_loss=0.0, switching_loss=0.0, resistive_loss=0.0,
298298
dc_connected1=1, dc_connected2=1)
299-
n.create_voltage_source_converter(id='conv45', voltage_level_id='vl5', dc_node1_id='dn4p', dc_node2_id='dn4n',
300-
bus_id='b5', voltage_regulator_on=0, control_mode='V_DC', target_q=0.0,
301-
target_v_dc=400.0, idle_loss=0.5, switching_loss=1.0, resistive_loss=0.2,
299+
n.create_voltage_source_converters(id='conv45', voltage_level_id='vl5', dc_node1_id='dn4p', dc_node2_id='dn4n',
300+
bus1_id='b5', voltage_regulator_on=0, control_mode='V_DC', target_q=0.0,
301+
target_v_dc=400.0, idle_loss=0.0, switching_loss=0.0, resistive_loss=0.0,
302302
dc_connected1=1, dc_connected2=1)
303303
return n
304304

@@ -335,21 +335,21 @@ def create_ac_dc_bipolar_network_with_metallic_return(allow_variant_multi_thread
335335
n.create_dc_lines(id='dlG4r', dc_node1_id='dnGr', dc_node2_id='dn4r', r=0.1)
336336
n.create_lines(id='l12', voltage_level1_id='vl1', bus1_id='b1', voltage_level2_id='vl2', bus2_id='b2', r=1, x=3)
337337
n.create_lines(id='l25', voltage_level1_id='vl2', bus1_id='b2', voltage_level2_id='vl5', bus2_id='b5', r=1, x=3)
338-
n.create_voltage_source_converter(id='conv23p', voltage_level_id='vl2', dc_node1_id='dn3p', dc_node2_id='dn3r',
339-
bus_id='b2', voltage_regulator_on=0, control_mode='P_PCC', target_p=-25.0,
340-
target_q=0.0, idle_loss=0.5, switching_loss=1.0, resistive_loss=0.2,
338+
n.create_voltage_source_converters(id='conv23p', voltage_level_id='vl2', dc_node1_id='dn3p', dc_node2_id='dn3r',
339+
bus1_id='b2', voltage_regulator_on=0, control_mode='P_PCC', target_p=-25.0,
340+
target_q=0.0, idle_loss=0.0, switching_loss=0.0, resistive_loss=0.0,
341341
dc_connected1=1, dc_connected2=1)
342-
n.create_voltage_source_converter(id='conv23n', voltage_level_id='vl2', dc_node1_id='dn3n', dc_node2_id='dn3r',
343-
bus_id='b2', voltage_regulator_on=0, control_mode='P_PCC', target_p=-25.0,
344-
target_q=0.0, idle_loss=0.5, switching_loss=1.0, resistive_loss=0.2,
342+
n.create_voltage_source_converters(id='conv23n', voltage_level_id='vl2', dc_node1_id='dn3n', dc_node2_id='dn3r',
343+
bus1_id='b2', voltage_regulator_on=0, control_mode='P_PCC', target_p=-25.0,
344+
target_q=0.0, idle_loss=0.0, switching_loss=0.0, resistive_loss=0.0,
345345
dc_connected1=1, dc_connected2=1)
346-
n.create_voltage_source_converter(id='conv45p', voltage_level_id='vl5', dc_node1_id='dn4p', dc_node2_id='dn4r',
347-
bus_id='b5', voltage_regulator_on=0, control_mode='V_DC', target_q=0.0,
348-
target_v_dc=200.0, idle_loss=0.5, switching_loss=1.0, resistive_loss=0.2,
346+
n.create_voltage_source_converters(id='conv45p', voltage_level_id='vl5', dc_node1_id='dn4p', dc_node2_id='dn4r',
347+
bus1_id='b5', voltage_regulator_on=0, control_mode='V_DC', target_q=0.0,
348+
target_v_dc=200.0, idle_loss=0.0, switching_loss=0.0, resistive_loss=0.0,
349349
dc_connected1=1, dc_connected2=1)
350-
n.create_voltage_source_converter(id='conv45n', voltage_level_id='vl5', dc_node1_id='dn4n', dc_node2_id='dn4r',
351-
bus_id='b5', voltage_regulator_on=0, control_mode='V_DC', target_q=0.0,
352-
target_v_dc=-200.0, idle_loss=0.5, switching_loss=1.0, resistive_loss=0.2,
350+
n.create_voltage_source_converters(id='conv45n', voltage_level_id='vl5', dc_node1_id='dn4n', dc_node2_id='dn4r',
351+
bus1_id='b5', voltage_regulator_on=0, control_mode='V_DC', target_q=0.0,
352+
target_v_dc=-200.0, idle_loss=0.0, switching_loss=0.0, resistive_loss=0.0,
353353
dc_connected1=1, dc_connected2=1)
354354

355355
return n

pypowsybl/opf/impl/bounds/dc_line_current_bounds.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class DcLineCurrentBounds(VariableBounds):
1515
def add(self, parameters: ModelParameters, network_cache: NetworkCache,
1616
variable_context: VariableContext, model: ipopt.Model):
1717
for dc_line_num, row in enumerate(network_cache.dc_lines.itertuples()):
18-
i_bounds = Bounds(-100, 100)
18+
i_bounds = Bounds(-10, 10)
1919
logger.log(TRACE_LEVEL, f"Add current bounds {i_bounds} to dc line '{row.Index}' (num={dc_line_num})'")
2020
dc_line_index = variable_context.dc_line_num_2_index[dc_line_num]
2121
model.set_variable_bounds(variable_context.closed_dc_line_i1_vars[dc_line_index],

pypowsybl/opf/impl/constraints/dc_current_balance_constraints.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,6 @@ def create_dc_node_expr_list(cls, network_cache, variable_context):
5555
if row.dc_connected2:
5656
conv_index = variable_context.conv_num_2_index[conv_num]
5757
dc_node2_num = network_cache.dc_nodes.index.get_loc(dc_node2_id)
58-
dc_nodes_balance.i_out[dc_node2_num] = variable_context.conv_i_vars[conv_index]
58+
dc_nodes_balance.i_in[dc_node2_num].append(-variable_context.conv_i_vars[conv_index])
5959

6060
return dc_nodes_balance.to_expr()

pypowsybl/opf/impl/constraints/power_balance_constraints.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,10 @@ def create_bus_expr_list(cls, network_cache, variable_context):
170170

171171
# voltage source converters
172172
for conv_num, row in enumerate(network_cache.voltage_source_converters.itertuples(index=False)):
173-
bus_id = row.bus_id
174-
if bus_id:
173+
bus1_id = row.bus1_id
174+
if bus1_id:
175175
conv_index = variable_context.conv_num_2_index[conv_num]
176-
bus_num = network_cache.buses.index.get_loc(bus_id)
176+
bus_num = network_cache.buses.index.get_loc(bus1_id)
177177
buses_balance.p_load[bus_num]+= variable_context.conv_p_vars[conv_index]
178178
buses_balance.q_load[bus_num]+= variable_context.conv_q_vars[conv_index]
179179

pypowsybl/opf/impl/constraints/voltage_source_converter_constraints.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def add(self, parameters: ModelParameters, network_cache: NetworkCache, variable
1111
model: ipopt.Model) -> None:
1212
for converter_num, converter_row in enumerate(network_cache.voltage_source_converters.itertuples(index=False)):
1313
with nl.graph():
14-
dc_node1_id, dc_node2_id, bus_id = converter_row.dc_node1_id, converter_row.dc_node2_id, converter_row.bus_id
14+
dc_node1_id, dc_node2_id, bus1_id = converter_row.dc_node1_id, converter_row.dc_node2_id, converter_row.bus1_id
1515
voltage_regulator_on, control_mode = converter_row.voltage_regulator_on, converter_row.control_mode
1616
target_p, target_q, target_v_dc, target_v_ac = (converter_row.target_p, converter_row.target_q,
1717
converter_row.target_v_dc, converter_row.target_v_ac)
@@ -21,11 +21,11 @@ def add(self, parameters: ModelParameters, network_cache: NetworkCache, variable
2121

2222
dc_node1_num = network_cache.dc_nodes.index.get_loc(dc_node1_id)
2323
dc_node2_num = network_cache.dc_nodes.index.get_loc(dc_node2_id)
24-
bus_num = network_cache.buses.index.get_loc(bus_id)
24+
bus1_num = network_cache.buses.index.get_loc(bus1_id)
2525
v1_var = variable_context.v_dc_vars[dc_node1_num]
2626
v2_var = variable_context.v_dc_vars[dc_node2_num]
2727

28-
bus_v_var = variable_context.v_vars[bus_num]
28+
bus1_v_var = variable_context.v_vars[bus1_num]
2929
conv_q_var = variable_context.conv_q_vars[converter_num]
3030
conv_p_var = variable_context.conv_p_vars[converter_num]
3131
conv_i_var = variable_context.conv_i_vars[converter_num]
@@ -35,10 +35,13 @@ def add(self, parameters: ModelParameters, network_cache: NetworkCache, variable
3535
model.add_nl_constraint(p_ac_eq == 0.0)
3636

3737
# if control_mode == "V_DC", we let the opf determine the value of U
38+
# if control_mode == "V_DC":
39+
# v_dc_eq = v1_var - v2_var - target_v_dc
40+
# model.add_nl_constraint(v_dc_eq == 0.0)
3841

3942
if voltage_regulator_on:
40-
bus_v_eq = bus_v_var - target_v_ac
41-
model.add_nl_constraint(bus_v_eq == 0.0)
43+
bus1_v_eq = bus1_v_var - target_v_ac
44+
model.add_nl_constraint(bus1_v_eq == 0.0)
4245
else:
4346
q_ac_eq = conv_q_var - target_q
4447
model.add_nl_constraint(q_ac_eq == 0.0)

pypowsybl/opf/impl/model/network_cache.py

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ def __init__(self, network: Network) -> None:
2626
self._branches = self._build_branches(network, self.buses)
2727
self._dangling_lines = self._build_dangling_lines(network, self.buses)
2828
self._batteries = self._build_batteries(network, self.buses)
29-
self._current_limits1, self._current_limits2 = self._build_current_limits(network)
29+
# self._current_limits1, self._current_limits2 = self._build_current_limits(network)
3030
self._slack_terminal = self._build_stack_terminal(network, self.buses)
31-
self._slack_terminal = self._network.get_extensions('slackTerminal')
32-
self._dc_nodes = self._build_dc_nodes(network)
31+
self._dc_buses = self._build_dc_buses(network)
32+
self._dc_nodes = self._build_dc_nodes(network, self.dc_buses)
3333
self._dc_lines = self._build_dc_lines(network)
3434
self._voltage_source_converters = self._build_voltage_source_converters(network)
3535
self._dc_grounds = self._build_dc_grounds(network)
@@ -160,7 +160,8 @@ def _build_generators(network: Network, buses: DataFrame):
160160
@staticmethod
161161
def _build_buses(network: Network, voltage_levels: DataFrame):
162162
buses = network.get_buses(attributes=['voltage_level_id', 'connected_component', 'synchronous_component'])
163-
buses = buses[(buses['synchronous_component'] == 0) & (buses['connected_component'] == 0)]
163+
# buses = buses[(buses['synchronous_component'] == 0) & (buses['connected_component'] == 0)]
164+
buses = buses[buses['connected_component'] == 0]
164165
return pd.merge(buses, voltage_levels, left_on='voltage_level_id', right_index=True, how='left')
165166

166167
@staticmethod
@@ -196,20 +197,30 @@ def _build_stack_terminal(network, buses: DataFrame):
196197
slack_terminal = network.get_extensions('slackTerminal')
197198
return NetworkCache._filter_injections(slack_terminal, buses)
198199

200+
@staticmethod
201+
def _build_dc_buses(network: Network):
202+
dc_buses = network.get_dc_buses(attributes=['connected_component', 'dc_component'])
203+
return dc_buses[dc_buses['connected_component'] == 0]
204+
205+
@staticmethod
206+
def _build_dc_nodes(network: Network, dc_buses: DataFrame):
207+
dc_nodes = network.get_dc_nodes(attributes=['dc_bus_id', 'nominal_v'])
208+
return pd.merge(dc_nodes, dc_buses, left_on='bus_id', right_index=True, how='left')
209+
199210
@staticmethod
200211
def _build_dc_lines(network: Network):
201212
return network.get_dc_lines(attributes=['dc_node1_id', 'dc_node2_id', 'r'])
202213

203214
@staticmethod
204-
def _build_dc_nodes(network: Network):
205-
return network.get_dc_nodes(attributes=['nominal_v'])
215+
def _build_dc_nodes(network: Network, dc_buses: DataFrame):
216+
return network.get_dc_nodes(attributes=['dc_bus_id', 'nominal_v'])
206217

207218
@staticmethod
208219
def _build_voltage_source_converters(network: Network):
209-
return network.get_voltage_source_converters(attributes=['dc_node1_id', 'dc_node2_id', 'bus_id', 'voltage_regulator_on',
210-
'control_mode', 'target_p', 'target_q', 'target_v_dc', 'target_v_ac',
211-
'idle_loss', 'switching_loss', 'resistive_loss',
212-
'dc_connected1', 'dc_connected2'])
220+
return network.get_voltage_source_converters(attributes=['voltage_level_id', 'bus1_id', 'bus2_id', 'dc_node1_id', 'dc_node2_id',
221+
'dc_connected1', 'dc_connected2', 'pcc_terminal_id', 'voltage_regulator_on',
222+
'control_mode', 'target_v_dc', 'target_v_ac', 'target_p', 'target_q', 'idle_loss',
223+
'switching_loss', 'resistive_loss'])
213224

214225
@staticmethod
215226
def _build_dc_grounds(network: Network):
@@ -287,6 +298,10 @@ def current_limits2(self) -> DataFrame:
287298
def slack_terminal(self) -> DataFrame:
288299
return self._slack_terminal
289300

301+
@property
302+
def dc_buses(self) -> DataFrame:
303+
return self._dc_buses
304+
290305
@property
291306
def dc_lines(self) -> DataFrame:
292307
return self._dc_lines
@@ -500,3 +515,39 @@ def update_dangling_lines(self,
500515
angle=[math.nan] * len(disconnected_dl_ids))
501516

502517
self._dangling_lines = self._build_dangling_lines(self._network, self._buses)
518+
519+
def update_dc_nodes(self,
520+
dc_node_ids: list[str],
521+
dc_node_v: list[float]):
522+
self._network.update_dc_nodes(id=dc_node_ids, v=dc_node_v)
523+
self._dc_nodes = self._build_dc_nodes(self._network)
524+
525+
def update_dc_lines(self,
526+
dc_line_ids: list[str],
527+
dc_line_i1: list[float],
528+
dc_line_i2: list[float]):
529+
self._network.update_dc_lines(id=dc_line_ids,
530+
i1=dc_line_i1,
531+
i2=dc_line_i2)
532+
self._dc_lines = self._build_dc_lines(self._network)
533+
534+
def update_voltage_source_converters(self,
535+
conv_ids: list[str],
536+
conv_p: list[float],
537+
conv_q: list[float],
538+
conv_p_dc1: list[float],
539+
conv_p_dc2: list[float],
540+
conv_target_p: list[float],
541+
conv_target_q:list[float],
542+
conv_target_v_dc: list[float],
543+
conv_target_v_ac: list[float]):
544+
self._network.update_voltage_source_converters(id=conv_ids,
545+
p_ac=conv_p,
546+
q_ac=conv_q,
547+
p_dc1=conv_p_dc1,
548+
p_dc2=conv_p_dc2,
549+
target_p=conv_target_p,
550+
target_q=conv_target_q,
551+
target_v_dc=conv_target_v_dc,
552+
target_v_ac=conv_target_v_ac)
553+
self._voltage_source_converters = self._build_voltage_source_converters(self._network)

0 commit comments

Comments
 (0)