Skip to content

Commit 284ada8

Browse files
bqth29Godelaine
andauthored
Allow import of HVDC RA in CIM for all instants(#1419)
* allow preventive HVDC RA in CIM * allow CIM curative HVDC range actions Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> Co-authored-by: Godelaine <godelaine.demontmorillon@rte-france.com>
1 parent 4fc696e commit 284ada8

6 files changed

Lines changed: 570 additions & 11 deletions

File tree

data/crac/crac-io/crac-io-cim/src/main/java/com/powsybl/openrao/data/crac/io/cim/craccreator/HvdcRangeActionCreator.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public HvdcRangeActionCreator(Crac crac, Network network, List<Contingency> cont
6262
this.cimCracCreationParameters = cimCracCreationParameters;
6363
}
6464

65-
public void addDirection(RemedialActionSeries remedialActionSeries) {
65+
public void addDirection(RemedialActionSeries remedialActionSeries, String applicationModeMarketObjectStatus) {
6666
raSeriesIds.add(remedialActionSeries.getMRID());
6767

6868
try {
@@ -87,7 +87,7 @@ public void addDirection(RemedialActionSeries remedialActionSeries) {
8787
}
8888
networkElementIds.add(networkElementId);
8989

90-
checkHvdcNetworkElementAndInitAdder(registeredResource, networkElementId);
90+
checkHvdcNetworkElementAndInitAdder(registeredResource, networkElementId, applicationModeMarketObjectStatus);
9191
isRemedialActionSeriesInverted = readRangeAndCheckIfInverted(isRemedialActionSeriesInverted, registeredResource, networkElementId);
9292
}
9393

@@ -117,14 +117,14 @@ private Boolean readRangeAndCheckIfInverted(Boolean isRemedialActionSeriesInvert
117117
}
118118
}
119119

120-
private void checkHvdcNetworkElementAndInitAdder(RemedialActionRegisteredResource registeredResource, String networkElementId) {
120+
private void checkHvdcNetworkElementAndInitAdder(RemedialActionRegisteredResource registeredResource, String networkElementId, String applicationModeMarketObjectStatus) {
121121
checkHvdcNetworkElement(networkElementId);
122122
HvdcLine hvdcLine = network.getHvdcLine(networkElementId);
123123

124124
boolean terminal1Connected = hvdcLine.getConverterStation1().getTerminal().isConnected();
125125
boolean terminal2Connected = hvdcLine.getConverterStation2().getTerminal().isConnected();
126126
if (terminal1Connected && terminal2Connected) {
127-
hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource));
127+
hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource, applicationModeMarketObjectStatus));
128128
} else {
129129
isAltered = true;
130130
importStatusDetailifIsAltered = String.format("HVDC line %s has ", hvdcLine.getId());
@@ -197,7 +197,7 @@ public Set<RemedialActionSeriesCreationContext> add() {
197197
return raSeriesIds.stream().map(id -> RemedialActionSeriesCreationContext.importedHvdcRa(id, createdRaIds, isAltered, isDirectionInverted.get(id), importStatusDetailifIsAltered)).collect(Collectors.toSet());
198198
}
199199

200-
private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredResource registeredResource) {
200+
private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredResource registeredResource, String applicationModeMarketObjectStatus) {
201201
HvdcRangeActionAdder hvdcRangeActionAdder = crac.newHvdcRangeAction();
202202
String hvdcId = registeredResource.getMRID().getValue();
203203
hvdcRangeActionAdder.withNetworkElement(hvdcId);
@@ -215,7 +215,7 @@ private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredRe
215215
}
216216

217217
// Usage rules
218-
RemedialActionSeriesCreator.addUsageRules(crac, CimConstants.ApplicationModeMarketObjectStatus.AUTO.getStatus(), hvdcRangeActionAdder, contingencies, invalidContingencies, cnecs, sharedDomain);
218+
RemedialActionSeriesCreator.addUsageRules(crac, applicationModeMarketObjectStatus, hvdcRangeActionAdder, contingencies, invalidContingencies, cnecs, sharedDomain);
219219

220220
return hvdcRangeActionAdder;
221221
}

data/crac/crac-io/crac-io-cim/src/main/java/com/powsybl/openrao/data/crac/io/cim/craccreator/RemedialActionSeriesCreator.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,16 +315,12 @@ private boolean identifyAndReadHvdcRangeAction(RemedialActionSeries remedialActi
315315
String applicationModeMarketObjectStatus = remedialActionSeries.getApplicationModeMarketObjectStatusStatus();
316316
for (RemedialActionRegisteredResource remedialActionRegisteredResource : remedialActionRegisteredResources) {
317317
if (remedialActionRegisteredResource.getPSRTypePsrType().equals(PsrType.HVDC.getStatus())) {
318-
if (!applicationModeMarketObjectStatus.equals(ApplicationModeMarketObjectStatus.AUTO.getStatus())) {
319-
remedialActionSeriesCreationContexts.add(RemedialActionSeriesCreationContext.notImported(remedialActionSeries.getMRID(), ImportStatus.INCONSISTENCY_IN_DATA, String.format("HVDC cannot be imported at instant %s", applicationModeMarketObjectStatus)));
320-
return true;
321-
}
322318
if (Objects.isNull(hvdcRangeActionCreator)) {
323319
hvdcRangeActionCreator = new HvdcRangeActionCreator(
324320
crac, network,
325321
contingencies, invalidContingencies, cnecs, sharedDomain, cimCracCreationParameters);
326322
}
327-
hvdcRangeActionCreator.addDirection(remedialActionSeries);
323+
hvdcRangeActionCreator.addDirection(remedialActionSeries, applicationModeMarketObjectStatus);
328324
return true;
329325
}
330326
}

data/crac/crac-io/crac-io-cim/src/test/java/com/powsybl/openrao/data/crac/io/cim/craccreator/CimCracCreatorTest.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.powsybl.openrao.data.crac.api.usagerule.OnContingencyState;
3131
import com.powsybl.openrao.data.crac.api.usagerule.OnFlowConstraintInCountry;
3232
import com.powsybl.openrao.data.crac.api.usagerule.OnInstant;
33+
import com.powsybl.openrao.data.crac.api.usagerule.UsageRule;
3334
import com.powsybl.openrao.data.crac.io.cim.parameters.CimCracCreationParameters;
3435
import com.powsybl.openrao.data.crac.io.cim.parameters.RangeActionSpeed;
3536
import com.powsybl.openrao.data.crac.io.cim.parameters.VoltageCnecsCreationParameters;
@@ -1237,4 +1238,83 @@ void testImportHvdcAutomatonWithPartiallyConnectedHvdc2AndInvalidContingencies()
12371238
assert cracCreationContext.getCreationReport().getReport().contains("[ALTERED] RemedialAction_Series \"HVDC-direction12\" was modified: HVDC line BBE2AA12 FFR3AA12 1 has terminals 1 and 2 disconnected; Contingencies Co-2 were not imported. ");
12381239
assert cracCreationContext.getCreationReport().getReport().contains("[ALTERED] RemedialAction_Series \"HVDC-direction11\" was modified: HVDC line BBE2AA12 FFR3AA12 1 has terminals 1 and 2 disconnected; Contingencies Co-2 were not imported. ");
12391240
}
1241+
1242+
@Test
1243+
void importCimCracWithPreventiveHvdcRa() throws IOException {
1244+
Network network = loadNetworkWithHvdc();
1245+
setUpWithSpeed("/cracs/CIM_with_preventive_HVDC.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
1246+
Crac crac = cracCreationContext.getCrac();
1247+
1248+
assertEquals(2, crac.getHvdcRangeActions().size());
1249+
1250+
HvdcRangeAction hvdcRangeAction1 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA11 FFR3AA11 1");
1251+
assertEquals(1, hvdcRangeAction1.getRanges().size());
1252+
assertEquals(-4000, hvdcRangeAction1.getRanges().iterator().next().getMin());
1253+
assertEquals(5000, hvdcRangeAction1.getRanges().iterator().next().getMax());
1254+
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction1.getGroupId());
1255+
assertEquals(1, hvdcRangeAction1.getUsageRules().size());
1256+
assertEquals("preventive", hvdcRangeAction1.getUsageRules().iterator().next().getInstant().getId());
1257+
1258+
HvdcRangeAction hvdcRangeAction2 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA12 FFR3AA12 1");
1259+
assertEquals(1, hvdcRangeAction2.getRanges().size());
1260+
assertEquals(-3000, hvdcRangeAction2.getRanges().iterator().next().getMin());
1261+
assertEquals(3500, hvdcRangeAction2.getRanges().iterator().next().getMax());
1262+
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction2.getGroupId());
1263+
assertEquals(1, hvdcRangeAction2.getUsageRules().size());
1264+
assertEquals("preventive", hvdcRangeAction2.getUsageRules().iterator().next().getInstant().getId());
1265+
}
1266+
1267+
@Test
1268+
void importCimCracWithCurativeHvdcRa() throws IOException {
1269+
Network network = loadNetworkWithHvdc();
1270+
setUpWithSpeed("/cracs/CIM_with_curative_HVDC.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
1271+
Crac crac = cracCreationContext.getCrac();
1272+
1273+
assertEquals(2, crac.getHvdcRangeActions().size());
1274+
1275+
HvdcRangeAction hvdcRangeAction1 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA11 FFR3AA11 1");
1276+
assertEquals(1, hvdcRangeAction1.getRanges().size());
1277+
assertEquals(-4000, hvdcRangeAction1.getRanges().iterator().next().getMin());
1278+
assertEquals(5000, hvdcRangeAction1.getRanges().iterator().next().getMax());
1279+
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction1.getGroupId());
1280+
assertEquals(1, hvdcRangeAction1.getUsageRules().size());
1281+
assertEquals("curative", hvdcRangeAction1.getUsageRules().iterator().next().getInstant().getId());
1282+
1283+
HvdcRangeAction hvdcRangeAction2 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA12 FFR3AA12 1");
1284+
assertEquals(1, hvdcRangeAction2.getRanges().size());
1285+
assertEquals(-3000, hvdcRangeAction2.getRanges().iterator().next().getMin());
1286+
assertEquals(3500, hvdcRangeAction2.getRanges().iterator().next().getMax());
1287+
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction2.getGroupId());
1288+
assertEquals(1, hvdcRangeAction2.getUsageRules().size());
1289+
assertEquals("curative", hvdcRangeAction2.getUsageRules().iterator().next().getInstant().getId());
1290+
}
1291+
1292+
@Test
1293+
void importCimCracWithPreventiveAndCurativeHvdcRa() throws IOException {
1294+
Network network = loadNetworkWithHvdc();
1295+
setUpWithSpeed("/cracs/CIM_with_preventive_and_curative_HVDC.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
1296+
Crac crac = cracCreationContext.getCrac();
1297+
1298+
assertEquals(2, crac.getHvdcRangeActions().size());
1299+
1300+
HvdcRangeAction hvdcRangeAction1 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA11 FFR3AA11 1");
1301+
assertEquals(1, hvdcRangeAction1.getRanges().size());
1302+
assertEquals(-4000, hvdcRangeAction1.getRanges().iterator().next().getMin());
1303+
assertEquals(5000, hvdcRangeAction1.getRanges().iterator().next().getMax());
1304+
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction1.getGroupId());
1305+
List<UsageRule> usageRules1 = hvdcRangeAction1.getUsageRules().stream().sorted(Comparator.comparing(ur -> ur.getInstant().getId())).toList();
1306+
assertEquals(2, usageRules1.size());
1307+
assertEquals("curative", usageRules1.getFirst().getInstant().getId());
1308+
assertEquals("preventive", usageRules1.getLast().getInstant().getId());
1309+
1310+
HvdcRangeAction hvdcRangeAction2 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA12 FFR3AA12 1");
1311+
assertEquals(1, hvdcRangeAction2.getRanges().size());
1312+
assertEquals(-3000, hvdcRangeAction2.getRanges().iterator().next().getMin());
1313+
assertEquals(3500, hvdcRangeAction2.getRanges().iterator().next().getMax());
1314+
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction2.getGroupId());
1315+
List<UsageRule> usageRules2 = hvdcRangeAction2.getUsageRules().stream().sorted(Comparator.comparing(ur -> ur.getInstant().getId())).toList();
1316+
assertEquals(2, usageRules2.size());
1317+
assertEquals("curative", usageRules2.getFirst().getInstant().getId());
1318+
assertEquals("preventive", usageRules2.getLast().getInstant().getId());
1319+
}
12401320
}

0 commit comments

Comments
 (0)