Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LfAction refactoring and area interchange target action support #1172

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Fix sonar issue and use apply return boolean to warn about potential …
…failure of applying an action.

Signed-off-by: Bertrand Rix <bertrand.rix@artelys.com>
obrix committed Jan 27, 2025
commit bc36fa5dc9c50b931cf2cca07a0d3b9e62d36e7f
Original file line number Diff line number Diff line change
@@ -12,6 +12,8 @@
import com.powsybl.iidm.network.Network;
import com.powsybl.openloadflow.graph.GraphConnectivity;
import com.powsybl.openloadflow.network.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

@@ -24,6 +26,8 @@
*/
public final class LfActionUtils {

private static final Logger LOGGER = LoggerFactory.getLogger(LfActionUtils.class);

private LfActionUtils() {
}

@@ -63,7 +67,11 @@ public static void applyListOfActions(List<LfAction> actions, LfNetwork network,
// then process remaining changes of actions
actions.stream()
.filter(action -> !(action instanceof AbstractLfBranchAction<?>))
.forEach(action -> action.apply(network, contingency, networkParameters));
.forEach(action -> {
if (!action.apply(network, contingency, networkParameters)) {
LOGGER.warn("Action {} : may not have been applied successfully.", action.getId());
}
});
}

private static void updateConnectivity(List<LfAction> branchActions, LfNetwork network, LfContingency contingency) {
@@ -76,7 +84,11 @@ private static void updateConnectivity(List<LfAction> branchActions, LfNetwork n
// update connectivity according to post action state
connectivity.startTemporaryChanges();

branchActions.forEach(action -> ((AbstractLfBranchAction<?>) action).applyOnConnectivity(network, connectivity));
branchActions.forEach(action -> {
if (((AbstractLfBranchAction<?>) action).applyOnConnectivity(network, connectivity)) {
LOGGER.warn("Action {} : may not have been applied successfully.", action.getId());
}
});

updateBusesAndBranchStatus(connectivity);

Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
*/
public class LfAreaInterchangeTargetAction extends AbstractLfAction<AreaInterchangeTargetAction> {

private static final Logger LOGGER = LoggerFactory.getLogger(AreaInterchangeTargetAction.class);
private static final Logger LOGGER = LoggerFactory.getLogger(LfAreaInterchangeTargetAction.class);

public LfAreaInterchangeTargetAction(String id, AreaInterchangeTargetAction action) {
super(id, action);
29 changes: 16 additions & 13 deletions src/test/java/com/powsybl/openloadflow/sa/LfActionTest.java
Original file line number Diff line number Diff line change
@@ -66,38 +66,39 @@ void test() {
AcLoadFlowParameters acParameters = OpenLoadFlowParameters.createAcParameters(network,
loadFlowParameters, new OpenLoadFlowParameters(), matrixFactory, new NaiveGraphConnectivityFactory<>(LfBus::getNum), true, false);
LfTopoConfig topoConfig = new LfTopoConfig();
LfNetworkParameters networkParameters = acParameters.getNetworkParameters();
topoConfig.getSwitchesToOpen().add(network.getSwitch("C"));
try (LfNetworkList lfNetworks = Networks.load(network, acParameters.getNetworkParameters(), topoConfig, ReportNode.NO_OP)) {
try (LfNetworkList lfNetworks = Networks.load(network, networkParameters, topoConfig, ReportNode.NO_OP)) {
LfNetwork lfNetwork = lfNetworks.getLargest().orElseThrow();
LfAction lfSwitchAction = LfActionUtils.createLfAction(switchAction, network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
LfAction lfSwitchAction = LfActionUtils.createLfAction(switchAction, network, networkParameters.isBreakers(), lfNetwork);
String loadId = "LOAD";
Contingency contingency = new Contingency(loadId, new LoadContingency("LD"));
PropagatedContingencyCreationParameters creationParameters = new PropagatedContingencyCreationParameters()
.setHvdcAcEmulation(false);
PropagatedContingency propagatedContingency = PropagatedContingency.createList(network,
Collections.singletonList(contingency), new LfTopoConfig(), creationParameters).get(0);
propagatedContingency.toLfContingency(lfNetwork).ifPresent(lfContingency -> {
lfSwitchAction.apply(lfNetwork, lfContingency, acParameters.getNetworkParameters());
lfSwitchAction.apply(lfNetwork, lfContingency, networkParameters);
assertTrue(lfNetwork.getBranchById("C").isDisabled());
assertEquals("C", ((LfSwitchAction) lfSwitchAction).getDisabledBranch().getId());
assertNull(((LfSwitchAction) lfSwitchAction).getEnabledBranch());
});

LfAction lfInvalidSwitchAction = LfActionUtils.createLfAction(new SwitchAction("switchAction", "S", true),
network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
network, networkParameters.isBreakers(), lfNetwork);
LfAction lfInvalidTerminalsConnectionAction = LfActionUtils.createLfAction(new TerminalsConnectionAction("A line action", "x", true),
network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
network, networkParameters.isBreakers(), lfNetwork);
LfAction lfInvalidPhaseTapChangerTapPositionAction = LfActionUtils.createLfAction(new PhaseTapChangerTapPositionAction("A phase tap change action", "y", false, 3),
network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
network, networkParameters.isBreakers(), lfNetwork);

assertFalse(lfInvalidSwitchAction.apply(lfNetwork, null, acParameters.getNetworkParameters()));
assertFalse(lfInvalidTerminalsConnectionAction.apply(lfNetwork, null, acParameters.getNetworkParameters()));
assertFalse(lfInvalidPhaseTapChangerTapPositionAction.apply(lfNetwork, null, acParameters.getNetworkParameters()));
assertFalse(lfInvalidSwitchAction.apply(lfNetwork, null, networkParameters));
assertFalse(lfInvalidTerminalsConnectionAction.apply(lfNetwork, null, networkParameters));
assertFalse(lfInvalidPhaseTapChangerTapPositionAction.apply(lfNetwork, null, networkParameters));

var lineAction = new TerminalsConnectionAction("A line action", "L1", ThreeSides.ONE, false);
LfAction lfTerminalAction = LfActionUtils.createLfAction(lineAction, network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
LfAction lfTerminalAction = LfActionUtils.createLfAction(lineAction, network, networkParameters.isBreakers(), lfNetwork);
assertEquals("Terminals connection action: only open or close branch at both sides is supported yet.",
assertThrows(UnsupportedOperationException.class, () -> lfTerminalAction.apply(lfNetwork, null, acParameters.getNetworkParameters())).getMessage());
assertThrows(UnsupportedOperationException.class, () -> lfTerminalAction.apply(lfNetwork, null, networkParameters)).getMessage());
}
}

@@ -113,10 +114,11 @@ void testUnsupportedGeneratorAction() {
var matrixFactory = new DenseMatrixFactory();
AcLoadFlowParameters acParameters = OpenLoadFlowParameters.createAcParameters(network,
new LoadFlowParameters(), new OpenLoadFlowParameters(), matrixFactory, new NaiveGraphConnectivityFactory<>(LfBus::getNum), true, false);
LfNetworkParameters networkParameters = acParameters.getNetworkParameters();
try (LfNetworkList lfNetworks = Networks.load(network, acParameters.getNetworkParameters(), new LfTopoConfig(), ReportNode.NO_OP)) {
LfNetwork lfNetwork = lfNetworks.getLargest().orElseThrow();
LfAction lfGeneratorAction = LfActionUtils.createLfAction(generatorAction, network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> lfGeneratorAction.apply(lfNetwork, null, acParameters.getNetworkParameters()));
UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> lfGeneratorAction.apply(lfNetwork, null, networkParameters));
assertEquals("Generator action on G : configuration not supported yet.", e.getMessage());
}
}
@@ -167,10 +169,11 @@ void testHvdcAction() {
var matrixFactory = new DenseMatrixFactory();
AcLoadFlowParameters acParameters = OpenLoadFlowParameters.createAcParameters(network,
new LoadFlowParameters(), new OpenLoadFlowParameters(), matrixFactory, new NaiveGraphConnectivityFactory<>(LfBus::getNum), true, false);
LfNetworkParameters networkParameters = acParameters.getNetworkParameters();
try (LfNetworkList lfNetworks = Networks.load(network, acParameters.getNetworkParameters(), new LfTopoConfig(), ReportNode.NO_OP)) {
LfNetwork lfNetwork = lfNetworks.getLargest().orElseThrow();
LfAction lfAction = LfActionUtils.createLfAction(hvdcAction, network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> lfAction.apply(lfNetwork, null, acParameters.getNetworkParameters()));
UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> lfAction.apply(lfNetwork, null, networkParameters));
assertEquals("Hvdc action: line is already in AC emulation, not supported yet.", e.getMessage());
}
}