Skip to content

Commit f699148

Browse files
cgmes: fix voltage regulating control defined at busbar section (#3666)
* fix voltage regulating control defined at busbar section * Improve the method. A more complex unit test * Apply the reviewer's comments Signed-off-by: marquesja1 <marquesja@aia.es>
1 parent f45409f commit f699148

File tree

5 files changed

+629
-6
lines changed

5 files changed

+629
-6
lines changed

cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/RegulatingTerminalMapper.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ public static Optional<Terminal> mapForVoltageControl(String cgmesTerminalId, Co
4242
.or(() -> new EquivalentTerminalFinderVoltageControl(cgmesTerminalId, context).find())
4343
// As a last resource, rely on the "find" method of terminal mapping:
4444
// Bus/branch models may define remote voltage controls that point to busbar sections
45-
// Busbar sections are not mapped to IIDM
45+
// Since busbar sections are not mapped to IIDM, we look for an equivalent IIDM terminal
46+
// that is connected to the busbar section via switches
4647
.or(() -> Optional.ofNullable(context.terminalMapping()
47-
.findFromTopologicalNode(context.terminalMapping().getTopologicalNode(cgmesTerminalId))));
48+
.findFromTopologicalNode(context.terminalMapping().getTopologicalNode(cgmesTerminalId)))
49+
.or(() -> findEquivalentTerminalForVoltageRegulatingTerminalDefinedAtBusbarSection(cgmesTerminalId, context)));
4850
}
4951

5052
public static Optional<TerminalAndSign> mapForFlowControl(String cgmesTerminalId, Context context) {
@@ -337,7 +339,7 @@ private Optional<Terminal> findNodeBreaker() {
337339

338340
private Optional<Terminal> findBusBranch() {
339341
Bus end1 = vl.getBusBreakerView().getBus1(sw.getId());
340-
List<Terminal> terminals = findTerminalsBusBranch(end1);
342+
List<Terminal> terminals = findTerminalsBusBranch(vl, end1);
341343
return best(terminals);
342344
}
343345

@@ -346,7 +348,7 @@ protected List<Terminal> findTerminalsNodeBreaker(int node) {
346348
return allTerminals(vl, nodes, t -> t.getNodeBreakerView().getNode());
347349
}
348350

349-
private List<Terminal> findTerminalsBusBranch(Bus end) {
351+
private static List<Terminal> findTerminalsBusBranch(VoltageLevel vl, Bus end) {
350352
Set<Bus> buses = allBusesReachableBySwitches(vl, end);
351353
return allTerminals(vl, buses, RegulatingTerminalMapper::getTerminalBus);
352354
}
@@ -399,6 +401,17 @@ private Optional<Terminal> findBusBranch() {
399401
}
400402
}
401403

404+
static Optional<Terminal> findEquivalentTerminalForVoltageRegulatingTerminalDefinedAtBusbarSection(String cgmesTerminalId, Context context) {
405+
CgmesTerminal busbarSectionCgmesTerminal = context.cgmes().terminal(cgmesTerminalId);
406+
if (busbarSectionCgmesTerminal == null) {
407+
return Optional.empty();
408+
}
409+
Bus busInBusBreakerView = context.network().getBusBreakerView().getBus(busbarSectionCgmesTerminal.topologicalNode());
410+
return busInBusBreakerView != null
411+
? EquivalentTerminalFinderVoltageControl.best(EquivalentTerminalFinderVoltageControl.findTerminalsBusBranch(busInBusBreakerView.getVoltageLevel(), busInBusBreakerView))
412+
: Optional.empty();
413+
}
414+
402415
private static Bus getTerminalBus(Terminal terminal) {
403416
return terminal.getBusBreakerView().getBus() != null ? terminal.getBusBreakerView().getBus()
404417
: terminal.getBusBreakerView().getConnectableBus();

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/RegulatingTerminalConversionTest.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@
1010

1111
import com.powsybl.cgmes.conformity.Cgmes3ModifiedCatalog;
1212
import com.powsybl.cgmes.conformity.CgmesConformity1ModifiedCatalog;
13+
import com.powsybl.cgmes.conversion.CgmesImport;
1314
import com.powsybl.cgmes.conversion.Conversion;
1415
import com.powsybl.cgmes.model.GridModelReference;
1516
import com.powsybl.iidm.network.*;
1617
import org.junit.jupiter.api.Test;
1718

18-
import static org.junit.jupiter.api.Assertions.assertEquals;
19-
import static org.junit.jupiter.api.Assertions.assertNotNull;
19+
import java.util.Properties;
20+
21+
import static com.powsybl.cgmes.conversion.test.ConversionUtil.readCgmesResources;
22+
import static org.junit.jupiter.api.Assertions.*;
2023

2124
/**
2225
* @author Luma Zamarreño {@literal <zamarrenolm at aia.es>}
@@ -86,6 +89,35 @@ void microGridBaseBECaseRegulatingTerminalsDefinedOnSwitches() {
8689
assertEquals(21.987, regulationValue, 0.0);
8790
}
8891

92+
@Test
93+
void voltageRegulatingTerminalAtBusbarSectionNodeBreakerTest() {
94+
Network network = readCgmesResources("/issues/voltage-regulating-terminal-at-busbar-section",
95+
"issue_3560_CGMES_EQ.xml",
96+
"issue_3560_CGMES_SSH.xml");
97+
98+
Generator generator = network.getGenerator("GEN");
99+
assertNotNull(generator);
100+
assertEquals("VL2_400_BBS1", generator.getRegulatingTerminal().getConnectable().getId());
101+
assertSame(IdentifiableType.BUSBAR_SECTION, generator.getRegulatingTerminal().getConnectable().getType());
102+
}
103+
104+
@Test
105+
void voltageRegulatingTerminalAtBusbarSectionBusBreakerTest() {
106+
Properties importParams = new Properties();
107+
importParams.put(CgmesImport.IMPORT_NODE_BREAKER_AS_BUS_BREAKER, "true");
108+
109+
Network network = readCgmesResources(importParams,
110+
"/issues/voltage-regulating-terminal-at-busbar-section",
111+
"issue_3560_CGMES_EQ.xml",
112+
"issue_3560_CGMES_SSH.xml",
113+
"issue_3560_CGMES_TP.xml");
114+
115+
Generator generator = network.getGenerator("GEN");
116+
assertNotNull(generator);
117+
assertEquals("LOAD", generator.getRegulatingTerminal().getConnectable().getId());
118+
assertSame(IdentifiableType.LOAD, generator.getRegulatingTerminal().getConnectable().getType());
119+
}
120+
89121
private Network networkModel(GridModelReference testGridModel, Conversion.Config config) {
90122
config.setConvertSvInjections(true);
91123
return ConversionUtil.networkModel(testGridModel, config);

0 commit comments

Comments
 (0)