Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -84,20 +84,8 @@ public void addDirection(RemedialActionSeries remedialActionSeries) {
}
networkElementIds.add(networkElementId);

hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource));

boolean isRegisteredResourceInverted = readHvdcRange(
networkElementId,
registeredResource.getResourceCapacityMinimumCapacity().intValue(),
registeredResource.getResourceCapacityMaximumCapacity().intValue(),
registeredResource.getInAggregateNodeMRID().getValue(),
registeredResource.getOutAggregateNodeMRID().getValue());

if (Objects.nonNull(isRemedialActionSeriesInverted) && !isRemedialActionSeriesInverted.equals(isRegisteredResourceInverted)) {
throw new OpenRaoImportException(ImportStatus.INCONSISTENCY_IN_DATA, "HVDC registered resources reference lines in opposite directions");
} else {
isRemedialActionSeriesInverted = isRegisteredResourceInverted;
}
checkHvdcNetworkElementAndInitAdder(registeredResource, networkElementId);
isRemedialActionSeriesInverted = readRangeAndCheckIfInverted(isRemedialActionSeriesInverted, registeredResource, networkElementId);
}

Boolean finalIsRemedialActionSeriesInverted = isRemedialActionSeriesInverted;
Expand All @@ -111,6 +99,30 @@ public void addDirection(RemedialActionSeries remedialActionSeries) {
}
}

private Boolean readRangeAndCheckIfInverted(Boolean isRemedialActionSeriesInverted, RemedialActionRegisteredResource registeredResource, String networkElementId) {
boolean isRegisteredResourceInverted = readHvdcRange(
networkElementId,
registeredResource.getResourceCapacityMinimumCapacity().intValue(),
registeredResource.getResourceCapacityMaximumCapacity().intValue(),
registeredResource.getInAggregateNodeMRID().getValue(),
registeredResource.getOutAggregateNodeMRID().getValue());

if (Objects.nonNull(isRemedialActionSeriesInverted) && !isRemedialActionSeriesInverted.equals(isRegisteredResourceInverted)) {
throw new OpenRaoImportException(ImportStatus.INCONSISTENCY_IN_DATA, "HVDC registered resources reference lines in opposite directions");
} else {
return isRegisteredResourceInverted;
}
}

private void checkHvdcNetworkElementAndInitAdder(RemedialActionRegisteredResource registeredResource, String networkElementId) {
checkHvdcNetworkElement(networkElementId);
HvdcLine hvdcLine = network.getHvdcLine(networkElementId);

if (hvdcLine.getConverterStation1().getTerminal().isConnected() && hvdcLine.getConverterStation2().getTerminal().isConnected()) {
hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource));
}
Comment thread
Godelaine marked this conversation as resolved.
}

public Set<RemedialActionSeriesCreationContext> add() {
if (raSeriesIds.size() != 2) {
return raSeriesIds.stream().map(id ->
Expand Down Expand Up @@ -165,7 +177,6 @@ public Set<RemedialActionSeriesCreationContext> add() {
private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredResource registeredResource) {
HvdcRangeActionAdder hvdcRangeActionAdder = crac.newHvdcRangeAction();
String hvdcId = registeredResource.getMRID().getValue();
checkHvdcNetworkElement(hvdcId);
hvdcRangeActionAdder.withNetworkElement(hvdcId);

// Speed
Expand Down Expand Up @@ -238,9 +249,6 @@ private boolean readHvdcRange(String networkElement, int minCapacity, int maxCap
boolean isInverted;
int min;
int max;
if (Objects.isNull(hvdcLine)) {
throw new OpenRaoImportException(ImportStatus.ELEMENT_NOT_FOUND_IN_NETWORK, "Not a HVDC line");
}
String from = hvdcLine.getConverterStation1().getTerminal().getVoltageLevel().getId();
String to = hvdcLine.getConverterStation2().getTerminal().getVoltageLevel().getId();

Expand All @@ -259,21 +267,24 @@ private boolean readHvdcRange(String networkElement, int minCapacity, int maxCap
throw new OpenRaoImportException(ImportStatus.INCONSISTENCY_IN_DATA, "Wrong HVDC inAggregateNode/outAggregateNode");
}

if (rangeMin.containsKey(networkElement)) {
rangeMin.get(networkElement).add(min);
} else {
List<Integer> list = new ArrayList<>();
list.add(min);
rangeMin.put(networkElement, list);
}
if (hvdcLine.getConverterStation1().getTerminal().isConnected() && hvdcLine.getConverterStation2().getTerminal().isConnected()) {
if (rangeMin.containsKey(networkElement)) {
rangeMin.get(networkElement).add(min);
} else {
List<Integer> list = new ArrayList<>();
list.add(min);
rangeMin.put(networkElement, list);
}

if (rangeMax.containsKey(networkElement)) {
rangeMax.get(networkElement).add(max);
} else {
List<Integer> list = new ArrayList<>();
list.add(max);
rangeMax.put(networkElement, list);
if (rangeMax.containsKey(networkElement)) {
rangeMax.get(networkElement).add(max);
} else {
List<Integer> list = new ArrayList<>();
list.add(max);
rangeMax.put(networkElement, list);
}
}

return isInverted;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,8 @@ private void readRemedialAction(RemedialActionSeries remedialActionSeries, boole
}

// --- Availability_MarketObjectStatus
String availabilityMarketObjectStus = remedialActionSeries.getAvailabilityMarketObjectStatusStatus();
if (!checkAvailabilityMarketObjectStatus(createdRemedialActionId, availabilityMarketObjectStus)) {
String availabilityMarketObjectStatus = remedialActionSeries.getAvailabilityMarketObjectStatusStatus();
if (!checkAvailabilityMarketObjectStatus(createdRemedialActionId, availabilityMarketObjectStatus)) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.powsybl.action.TerminalsConnectionAction;
import com.powsybl.contingency.ContingencyElement;
import com.powsybl.iidm.network.Country;
import com.powsybl.iidm.network.HvdcLine;
import com.powsybl.iidm.network.ImportConfig;
import com.powsybl.iidm.network.Network;
import com.powsybl.openrao.commons.Unit;
Expand All @@ -24,6 +25,7 @@
import com.powsybl.openrao.data.crac.api.RaUsageLimits;
import com.powsybl.openrao.data.crac.api.RemedialAction;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkAction;
import com.powsybl.openrao.data.crac.api.rangeaction.HvdcRangeAction;
import com.powsybl.openrao.data.crac.api.usagerule.OnConstraint;
import com.powsybl.openrao.data.crac.api.usagerule.OnContingencyState;
import com.powsybl.openrao.data.crac.api.usagerule.OnFlowConstraintInCountry;
Expand Down Expand Up @@ -86,9 +88,13 @@ public static void loadNetwork() {

@BeforeAll
public static void loadHvdcNetwork() {
hvdcNetwork = loadNetworkWithHvdc();
}

private static Network loadNetworkWithHvdc() {
Properties importParams = new Properties();
importParams.put("iidm.import.cgmes.source-for-iidm-id", "rdfID");
hvdcNetwork = Network.read(Paths.get(new File(CimCracCreatorTest.class.getResource("/networks/TestCase16NodesWith2Hvdc.xiidm").getFile()).toString()), LocalComputationManager.getDefault(), Suppliers.memoize(ImportConfig::load).get(), importParams);
return Network.read(Paths.get(new File(CimCracCreatorTest.class.getResource("/networks/TestCase16NodesWith2Hvdc.xiidm").getFile()).toString()), LocalComputationManager.getDefault(), Suppliers.memoize(ImportConfig::load).get(), importParams);
}

private void setUp(String fileName, Network network, CracCreationParameters cracCreationParameters) throws IOException {
Expand Down Expand Up @@ -1121,4 +1127,85 @@ void testPermissiveImports() throws IOException {
PstRangeAction auto1 = importedCrac.getPstRangeAction("AUTO_1");
assertEquals(4, auto1.getUsageRules().size());
}

@Test
void testImportHvdcAutomatonWithFullyConnectedHvdc() throws IOException {
Network network = loadNetworkWithHvdc();
setUpWithSpeed("/cracs/cim-hvdc.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
Crac crac = cracCreationContext.getCrac();

assertEquals(2, crac.getHvdcRangeActions().size());

HvdcRangeAction hvdcRangeAction1 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA11 FFR3AA11 1");
assertEquals(1, hvdcRangeAction1.getRanges().size());
assertEquals(-4000, hvdcRangeAction1.getRanges().iterator().next().getMin());
assertEquals(5000, hvdcRangeAction1.getRanges().iterator().next().getMax());
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction1.getGroupId());

HvdcRangeAction hvdcRangeAction2 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA12 FFR3AA12 1");
assertEquals(1, hvdcRangeAction2.getRanges().size());
assertEquals(-3000, hvdcRangeAction2.getRanges().iterator().next().getMin());
assertEquals(3500, hvdcRangeAction2.getRanges().iterator().next().getMax());
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction2.getGroupId());
}

private static void disconnectHvdcLine(HvdcLine hvdcLine) {
hvdcLine.getConverterStation1().getTerminal().disconnect();
hvdcLine.getConverterStation2().getTerminal().disconnect();
}

@Test
void testImportHvdcAutomatonWithPartiallyConnectedHvdc1() throws IOException {
Network network = loadNetworkWithHvdc();
disconnectHvdcLine(network.getHvdcLine("BBE2AA11 FFR3AA11 1"));
setUpWithSpeed("/cracs/cim-hvdc.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
Crac crac = cracCreationContext.getCrac();

assertEquals(1, crac.getHvdcRangeActions().size());

HvdcRangeAction hvdcRangeAction = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA12 FFR3AA12 1");
assertEquals(1, hvdcRangeAction.getRanges().size());
assertEquals(-3000, hvdcRangeAction.getRanges().iterator().next().getMin());
assertEquals(3500, hvdcRangeAction.getRanges().iterator().next().getMax());
assertEquals(Optional.of("BBE2AA12 FFR3AA12 1"), hvdcRangeAction.getGroupId());
}

@Test
void testImportHvdcAutomatonWithPartiallyConnectedHvdc2() throws IOException {
Network network = loadNetworkWithHvdc();
disconnectHvdcLine(network.getHvdcLine("BBE2AA12 FFR3AA12 1"));
setUpWithSpeed("/cracs/cim-hvdc.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
Crac crac = cracCreationContext.getCrac();

assertEquals(1, crac.getHvdcRangeActions().size());

HvdcRangeAction hvdcRangeAction = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA11 FFR3AA11 1");
assertEquals(1, hvdcRangeAction.getRanges().size());
assertEquals(-4000, hvdcRangeAction.getRanges().iterator().next().getMin());
assertEquals(5000, hvdcRangeAction.getRanges().iterator().next().getMax());
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1"), hvdcRangeAction.getGroupId());
}

@Test
void testImportHvdcAutomatonWithDisconnectedHvdc() throws IOException {
Network network = loadNetworkWithHvdc();
disconnectHvdcLine(network.getHvdcLine("BBE2AA11 FFR3AA11 1"));
disconnectHvdcLine(network.getHvdcLine("BBE2AA12 FFR3AA12 1"));
setUpWithSpeed("/cracs/cim-hvdc.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
Crac crac = cracCreationContext.getCrac();

assertTrue(crac.getHvdcRangeActions().isEmpty());
}

@Test
void testImportHvdcAutomatonWithErrorInCimFullyConnected() throws IOException {
// only one error in any of the in/out nodes in CIM CRAC leads to not importing nay HVDC RA
Network network = loadNetworkWithHvdc();
disconnectHvdcLine(network.getHvdcLine("BBE2AA11 FFR3AA11 1"));
disconnectHvdcLine(network.getHvdcLine("BBE2AA12 FFR3AA12 1"));
setUpWithSpeed("/cracs/cim-hvdc-error.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
Crac crac = cracCreationContext.getCrac();

assertTrue(crac.getHvdcRangeActions().isEmpty());
}
}
Loading