Skip to content

Commit 5bcc0ce

Browse files
committed
Merged buses implementation (#163)
Signed-off-by: Slimane AMAR <[email protected]>
1 parent d42e9ca commit 5bcc0ce

File tree

4 files changed

+303
-233
lines changed

4 files changed

+303
-233
lines changed

network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/VoltageLevelBusViewImpl.java

+37-8
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,41 @@ class VoltageLevelBusViewImpl implements VoltageLevel.BusView {
2626

2727
private final Resource<VoltageLevelAttributes> voltageLevelResource;
2828

29+
private Map<String, Bus> calculatedBuses;
30+
2931
public VoltageLevelBusViewImpl(NetworkObjectIndex index, Resource<VoltageLevelAttributes> voltageLevelResource) {
3032
this.index = index;
3133
this.voltageLevelResource = voltageLevelResource;
3234
}
3335

34-
private Map<String, Bus> calculateBus() {
35-
if (voltageLevelResource.getAttributes().getTopologyKind() == TopologyKind.NODE_BREAKER) {
36-
return NodeBreakerTopology.INSTANCE.calculateBuses(index, voltageLevelResource);
37-
} else {
38-
return BusBreakerTopology.INSTANCE.calculateBuses(index, voltageLevelResource);
36+
private boolean isBusBeakerTopologyKind() {
37+
return voltageLevelResource.getAttributes().getTopologyKind() == TopologyKind.BUS_BREAKER;
38+
}
39+
40+
private boolean isNodeBeakerTopologyKind() {
41+
return voltageLevelResource.getAttributes().getTopologyKind() == TopologyKind.NODE_BREAKER;
42+
}
43+
44+
private <T> AbstractTopology<T> getTopologyInstance() {
45+
return isNodeBeakerTopologyKind() ?
46+
(AbstractTopology<T>) NodeBreakerTopology.INSTANCE : (AbstractTopology<T>) BusBreakerTopology.INSTANCE;
47+
}
48+
49+
private void calculateBus() {
50+
calculatedBuses = getTopologyInstance().calculateBuses(index, voltageLevelResource);
51+
}
52+
53+
private Map<String, Bus> getCalculateBus() {
54+
if (!voltageLevelResource.getAttributes().isCalculatedBusesValid()) {
55+
calculateBus();
3956
}
57+
58+
return calculatedBuses;
4059
}
4160

4261
@Override
4362
public List<Bus> getBuses() {
44-
return new ArrayList<>(calculateBus().values());
63+
return new ArrayList<>(getCalculateBus().values());
4564
}
4665

4766
@Override
@@ -51,11 +70,21 @@ public Stream<Bus> getBusStream() {
5170

5271
@Override
5372
public Bus getBus(String id) {
54-
return calculateBus().get(id);
73+
return getCalculateBus().get(id);
5574
}
5675

5776
@Override
5877
public Bus getMergedBus(String s) {
59-
throw new UnsupportedOperationException("TODO");
78+
List<Bus> buses = getBuses(); // To calculate the buses if not yet done
79+
80+
int busNum;
81+
if (isBusBeakerTopologyKind()) {
82+
busNum = voltageLevelResource.getAttributes().getBusToCalculatedBus().get(s);
83+
} else {
84+
int node = index.getBusbarSection(s).orElseThrow(AssertionError::new).getResource().getAttributes().getNode();
85+
busNum = voltageLevelResource.getAttributes().getNodeToCalculatedBus().get(node);
86+
}
87+
88+
return buses.get(busNum);
6089
}
6190
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
/**
2+
* Copyright (c) 2020, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package com.powsybl.network.store.iidm.impl;
8+
9+
import com.powsybl.iidm.network.*;
10+
11+
/**
12+
* @author Slimane Amar <slimane.amar at rte-france.com>
13+
*/
14+
public class CreateNetworksUtil {
15+
16+
static Network createBusBreakerNetwork() {
17+
Network network = Network.create("test", "test");
18+
Substation s = network.newSubstation()
19+
.setId("S")
20+
.setCountry(Country.FR)
21+
.add();
22+
VoltageLevel vl1 = s.newVoltageLevel()
23+
.setId("VL1")
24+
.setNominalV(400.0)
25+
.setTopologyKind(TopologyKind.BUS_BREAKER)
26+
.add();
27+
vl1.getBusBreakerView().newBus()
28+
.setId("B1")
29+
.add();
30+
vl1.newLoad()
31+
.setId("LD1")
32+
.setConnectableBus("B1")
33+
.setBus("B1")
34+
.setP0(1.0)
35+
.setQ0(1.0)
36+
.add();
37+
vl1.newGenerator()
38+
.setId("G")
39+
.setBus("B1")
40+
.setMaxP(100.0)
41+
.setMinP(50.0)
42+
.setTargetP(100.0)
43+
.setTargetV(400.0)
44+
.setVoltageRegulatorOn(true)
45+
.add();
46+
47+
return network;
48+
}
49+
50+
static Network createBusBreakerNetworkWithTwoBuses() {
51+
Network network = createBusBreakerNetwork();
52+
VoltageLevel vl1 = network.getVoltageLevel("VL1");
53+
network.getVoltageLevel("VL1").getBusBreakerView().newBus()
54+
.setId("B2")
55+
.add();
56+
vl1.getBusBreakerView().newSwitch()
57+
.setId("BR1")
58+
.setBus1("B2")
59+
.setBus2("B1")
60+
.setOpen(true)
61+
.add();
62+
vl1.newLoad()
63+
.setId("LD2")
64+
.setConnectableBus("B2")
65+
.setBus("B2")
66+
.setP0(1.0)
67+
.setQ0(1.0)
68+
.add();
69+
70+
return network;
71+
}
72+
73+
static Network createBusBreakerNetworkWithMultiBuses() {
74+
Network network = createBusBreakerNetworkWithTwoBuses();
75+
VoltageLevel vl1 = network.getVoltageLevel("VL1");
76+
network.getVoltageLevel("VL1").getBusBreakerView().newBus()
77+
.setId("B3")
78+
.add();
79+
vl1.getBusBreakerView().newSwitch()
80+
.setId("BR2")
81+
.setBus1("B3")
82+
.setBus2("B2")
83+
.setOpen(true)
84+
.add();
85+
vl1.newLoad()
86+
.setId("LD3")
87+
.setConnectableBus("B3")
88+
.setBus("B3")
89+
.setP0(1.0)
90+
.setQ0(1.0)
91+
.add();
92+
93+
return network;
94+
}
95+
96+
static Network createBusBreakerNetworkWithLine() {
97+
Network network = createBusBreakerNetworkWithMultiBuses();
98+
Substation s = network.getSubstation("S");
99+
VoltageLevel vl1 = network.getVoltageLevel("VL1");
100+
101+
VoltageLevel vl2 = s.newVoltageLevel()
102+
.setId("VL2")
103+
.setNominalV(400.0)
104+
.setTopologyKind(TopologyKind.BUS_BREAKER)
105+
.add();
106+
vl2.getBusBreakerView().newBus()
107+
.setId("B21")
108+
.add();
109+
vl2.newGenerator()
110+
.setId("G2")
111+
.setBus("B21")
112+
.setMaxP(100.0)
113+
.setMinP(50.0)
114+
.setTargetP(100.0)
115+
.setTargetV(400.0)
116+
.setVoltageRegulatorOn(true)
117+
.add();
118+
119+
network.newLine()
120+
.setId("L1")
121+
.setVoltageLevel1("VL1")
122+
.setBus1("B1")
123+
.setVoltageLevel2("VL2")
124+
.setBus2("B21")
125+
.setR(1.0)
126+
.setX(1.0)
127+
.setG1(0.0)
128+
.setB1(0.0)
129+
.setG2(0.0)
130+
.setB2(0.0)
131+
.add();
132+
133+
return network;
134+
}
135+
136+
static Network createNodeBreakerNetwork() {
137+
Network network = Network.create("test", "test");
138+
Substation s1 = network.newSubstation()
139+
.setId("S1")
140+
.setCountry(Country.FR)
141+
.add();
142+
VoltageLevel vl1 = s1.newVoltageLevel()
143+
.setId("VL1")
144+
.setNominalV(400.0)
145+
.setTopologyKind(TopologyKind.NODE_BREAKER)
146+
.add();
147+
vl1.getNodeBreakerView().newBusbarSection()
148+
.setId("BBS1")
149+
.setNode(0)
150+
.add();
151+
vl1.newGenerator()
152+
.setId("G")
153+
.setNode(4)
154+
.setMaxP(100.0)
155+
.setMinP(50.0)
156+
.setTargetP(100.0)
157+
.setTargetV(400.0)
158+
.setVoltageRegulatorOn(true)
159+
.add();
160+
vl1.getNodeBreakerView().newInternalConnection()
161+
.setNode1(1)
162+
.setNode2(4)
163+
.add();
164+
vl1.getNodeBreakerView().newDisconnector()
165+
.setId("BR1")
166+
.setNode1(0)
167+
.setNode2(1)
168+
.setOpen(false)
169+
.add();
170+
vl1.getNodeBreakerView().newDisconnector()
171+
.setId("D1")
172+
.setNode1(0)
173+
.setNode2(2)
174+
.setOpen(false)
175+
.add();
176+
vl1.getNodeBreakerView().newBreaker()
177+
.setId("BR2")
178+
.setNode1(2)
179+
.setNode2(3)
180+
.setOpen(false)
181+
.add();
182+
183+
Substation s2 = network.newSubstation()
184+
.setId("S2")
185+
.setCountry(Country.FR)
186+
.add();
187+
VoltageLevel vl2 = s2.newVoltageLevel()
188+
.setId("VL2")
189+
.setNominalV(400.0)
190+
.setTopologyKind(TopologyKind.NODE_BREAKER)
191+
.add();
192+
vl2.getNodeBreakerView().newBusbarSection()
193+
.setId("BBS2")
194+
.setNode(0)
195+
.add();
196+
vl2.newLoad()
197+
.setId("LD")
198+
.setNode(1)
199+
.setP0(1)
200+
.setQ0(1)
201+
.add();
202+
vl2.getNodeBreakerView().newDisconnector()
203+
.setId("BR3")
204+
.setNode1(0)
205+
.setNode2(1)
206+
.setOpen(false)
207+
.add();
208+
vl2.getNodeBreakerView().newDisconnector()
209+
.setId("D2")
210+
.setNode1(0)
211+
.setNode2(2)
212+
.setOpen(false)
213+
.add();
214+
vl2.getNodeBreakerView().newBreaker()
215+
.setId("BR4")
216+
.setNode1(2)
217+
.setNode2(3)
218+
.setOpen(false)
219+
.add();
220+
network.newLine()
221+
.setId("L1")
222+
.setVoltageLevel1("VL1")
223+
.setNode1(3)
224+
.setVoltageLevel2("VL2")
225+
.setNode2(3)
226+
.setR(1.0)
227+
.setX(1.0)
228+
.setG1(0.0)
229+
.setB1(0.0)
230+
.setG2(0.0)
231+
.setB2(0.0)
232+
.add();
233+
return network;
234+
}
235+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Copyright (c) 2020, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package com.powsybl.network.store.iidm.impl;
8+
9+
import com.powsybl.iidm.network.Network;
10+
import com.powsybl.iidm.network.VoltageLevel;
11+
import com.powsybl.iidm.network.tck.AbstractTopologyTraverserTest;
12+
import org.junit.Test;
13+
14+
/**
15+
* @author Slimane Amar <slimane.amar at rte-france.com>
16+
*/
17+
public class MergedBusTest extends AbstractTopologyTraverserTest {
18+
19+
@Test
20+
public void testCalculatedBuses() {
21+
Network network = CreateNetworksUtil.createBusBreakerNetworkWithLine();
22+
VoltageLevel vl1 = network.getVoltageLevel("VL1");
23+
vl1.getBusView().getMergedBus("B1");
24+
}
25+
26+
}

0 commit comments

Comments
 (0)