diff --git a/src/main/java/com/powsybl/openloadflow/network/action/LfActionUtils.java b/src/main/java/com/powsybl/openloadflow/network/action/LfActionUtils.java index b75dc8893e..94e6eadd5b 100644 --- a/src/main/java/com/powsybl/openloadflow/network/action/LfActionUtils.java +++ b/src/main/java/com/powsybl/openloadflow/network/action/LfActionUtils.java @@ -9,6 +9,7 @@ package com.powsybl.openloadflow.network.action; import com.powsybl.action.*; +import com.powsybl.commons.report.ReportNode; import com.powsybl.iidm.network.Network; import com.powsybl.openloadflow.graph.GraphConnectivity; import com.powsybl.openloadflow.network.*; @@ -28,6 +29,10 @@ public final class LfActionUtils { private static final Logger LOGGER = LoggerFactory.getLogger(LfActionUtils.class); + private static final String ACTION_ID = "actionId"; + + private static final String CONTINGENCY_ID = "contingencyId"; + private LfActionUtils() { } @@ -54,7 +59,7 @@ public static LfAction createLfAction(Action action, Network network, boolean br }; } - public static void applyListOfActions(List actions, LfNetwork network, LfContingency contingency, LfNetworkParameters networkParameters) { + public static void applyListOfActions(List actions, LfNetwork network, LfContingency contingency, LfNetworkParameters networkParameters, ReportNode node) { Objects.requireNonNull(actions); Objects.requireNonNull(network); @@ -62,19 +67,19 @@ public static void applyListOfActions(List actions, LfNetwork network, List branchActions = actions.stream() .filter(action -> action instanceof AbstractLfBranchAction) .toList(); - updateConnectivity(branchActions, network, contingency); + updateConnectivity(branchActions, network, contingency, node); // then process remaining changes of actions actions.stream() .filter(action -> !(action instanceof AbstractLfBranchAction)) .forEach(action -> { if (!action.apply(network, contingency, networkParameters)) { - LOGGER.warn("Action {}: may not have been applied successfully.", action.getId()); + reportActionApplicationFailure(action.getId(), contingency.getId(), node); } }); } - private static void updateConnectivity(List branchActions, LfNetwork network, LfContingency contingency) { + private static void updateConnectivity(List branchActions, LfNetwork network, LfContingency contingency, ReportNode node) { GraphConnectivity connectivity = network.getConnectivity(); // re-update connectivity according to post contingency state (revert after LfContingency apply) @@ -86,7 +91,7 @@ private static void updateConnectivity(List branchActions, LfNetwork n branchActions.forEach(action -> { if (!((AbstractLfBranchAction) action).applyOnConnectivity(network, connectivity)) { - LOGGER.warn("Action {}: may not have been applied successfully.", action.getId()); + reportActionApplicationFailure(action.getId(), contingency.getId(), node); } }); @@ -97,4 +102,12 @@ private static void updateConnectivity(List branchActions, LfNetwork n connectivity.undoTemporaryChanges(); } + private static void reportActionApplicationFailure(String actionId, String contingencyId, ReportNode node) { + node.newReportNode() + .withMessageTemplate("LfActionUtils", "Action '${actionId}': may not have been applied successfully on contingency '${contingencyId}'") + .withUntypedValue(ACTION_ID, actionId) + .withUntypedValue(CONTINGENCY_ID, contingencyId) + .add(); + } + } diff --git a/src/main/java/com/powsybl/openloadflow/sa/AbstractSecurityAnalysis.java b/src/main/java/com/powsybl/openloadflow/sa/AbstractSecurityAnalysis.java index a434cbfa1f..e5e37b814d 100644 --- a/src/main/java/com/powsybl/openloadflow/sa/AbstractSecurityAnalysis.java +++ b/src/main/java/com/powsybl/openloadflow/sa/AbstractSecurityAnalysis.java @@ -824,7 +824,7 @@ protected OperatorStrategyResult runActionSimulation(LfNetwork network, C contex .filter(Objects::nonNull) .toList(); - LfActionUtils.applyListOfActions(operatorStrategyLfActions, network, contingency, networkParameters); + LfActionUtils.applyListOfActions(operatorStrategyLfActions, network, contingency, networkParameters, reportNode); Stopwatch stopwatch = Stopwatch.createStarted(); diff --git a/src/main/java/com/powsybl/openloadflow/sa/WoodburyDcSecurityAnalysis.java b/src/main/java/com/powsybl/openloadflow/sa/WoodburyDcSecurityAnalysis.java index 66258effa5..64cbd290d4 100644 --- a/src/main/java/com/powsybl/openloadflow/sa/WoodburyDcSecurityAnalysis.java +++ b/src/main/java/com/powsybl/openloadflow/sa/WoodburyDcSecurityAnalysis.java @@ -266,7 +266,7 @@ private OperatorStrategyResult computeOperatorStrategyResultFromPostContingencyA // apply modifications to compute results lfContingency.apply(loadFlowContext.getParameters().getBalanceType()); - LfActionUtils.applyListOfActions(operatorStrategyLfActions, lfNetwork, lfContingency, loadFlowContext.getParameters().getNetworkParameters()); + LfActionUtils.applyListOfActions(operatorStrategyLfActions, lfNetwork, lfContingency, loadFlowContext.getParameters().getNetworkParameters(), reportNode); // update network result var postActionsNetworkResult = new PreContingencyNetworkResult(lfNetwork, monitorIndex, createResultExtension);