From 02e1058d3fbfad1d76bb493af9bde2de4f325bc3 Mon Sep 17 00:00:00 2001 From: Hugo SCHINDLER Date: Thu, 8 Sep 2022 16:16:19 +0200 Subject: [PATCH] Disable rescale if AC does not converge Signed-off-by: Hugo SCHINDLER --- .../DecomposedFlowsRescaler.java | 3 ++ .../flow_decomposition/RescalingTests.java | 34 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/flow-decomposition/src/main/java/com/powsybl/flow_decomposition/DecomposedFlowsRescaler.java b/flow-decomposition/src/main/java/com/powsybl/flow_decomposition/DecomposedFlowsRescaler.java index 6cce3b87..8b1f3aaa 100644 --- a/flow-decomposition/src/main/java/com/powsybl/flow_decomposition/DecomposedFlowsRescaler.java +++ b/flow-decomposition/src/main/java/com/powsybl/flow_decomposition/DecomposedFlowsRescaler.java @@ -41,6 +41,9 @@ DecomposedFlow rescale(DecomposedFlow decomposedFlow) { Country country1 = decomposedFlow.getCountry1(); Country country2 = decomposedFlow.getCountry2(); double internalFlow = decomposedFlow.getInternalFlow(); + if (Double.isNaN(acReferenceFlow)) { + return decomposedFlow; + } double deltaToRescale = acReferenceFlow * Math.signum(acReferenceFlow) - decomposedFlow.getTotalFlow(); double sumOfReLUFlows = reLU(allocatedFlow) + reLU(pstFlow) + loopFlows.values().stream().mapToDouble(this::reLU).sum() + reLU(internalFlow); Map rescaledLoopFlows = loopFlows.entrySet().stream() diff --git a/flow-decomposition/src/test/java/com/powsybl/flow_decomposition/RescalingTests.java b/flow-decomposition/src/test/java/com/powsybl/flow_decomposition/RescalingTests.java index 6833de16..dd0a907c 100644 --- a/flow-decomposition/src/test/java/com/powsybl/flow_decomposition/RescalingTests.java +++ b/flow-decomposition/src/test/java/com/powsybl/flow_decomposition/RescalingTests.java @@ -13,7 +13,7 @@ import java.util.Map; import java.util.TreeMap; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; /** * @author Sebastien Murgey {@literal } @@ -144,11 +144,11 @@ void testNoNormalizationWithFlowDecompositionResultsWithPstNetwork() { static void testNormalizationWithFlowDecompositionResults(String networkFileName, boolean enableRescaledResults) { Network network = AllocatedFlowTests.importNetwork(networkFileName); - FlowDecompositionParameters flowDecompositionParameters = new FlowDecompositionParameters(); - flowDecompositionParameters.setEnableLossesCompensation(FlowDecompositionParameters.ENABLE_LOSSES_COMPENSATION); - flowDecompositionParameters.setLossesCompensationEpsilon(FlowDecompositionParameters.DISABLE_LOSSES_COMPENSATION_EPSILON); - flowDecompositionParameters.setSensitivityEpsilon(FlowDecompositionParameters.DISABLE_SENSITIVITY_EPSILON); - flowDecompositionParameters.setRescaleEnabled(enableRescaledResults); + FlowDecompositionParameters flowDecompositionParameters = new FlowDecompositionParameters() + .setEnableLossesCompensation(FlowDecompositionParameters.ENABLE_LOSSES_COMPENSATION) + .setLossesCompensationEpsilon(FlowDecompositionParameters.DISABLE_LOSSES_COMPENSATION_EPSILON) + .setSensitivityEpsilon(FlowDecompositionParameters.DISABLE_SENSITIVITY_EPSILON) + .setRescaleEnabled(enableRescaledResults); FlowDecompositionComputer flowDecompositionComputer = new FlowDecompositionComputer(flowDecompositionParameters); FlowDecompositionResults flowDecompositionResults = flowDecompositionComputer.run(network); @@ -162,4 +162,26 @@ static void testNormalizationWithFlowDecompositionResults(String networkFileName } } } + + @Test + void testRescalingDoesNotOccurWhenAcDiverge() { + String networkFileName = "NETWORK_LOOP_FLOW_WITH_COUNTRIES.uct"; + Network network = AllocatedFlowTests.importNetwork(networkFileName); + + FlowDecompositionParameters flowDecompositionParameters = new FlowDecompositionParameters() + .setEnableLossesCompensation(FlowDecompositionParameters.ENABLE_LOSSES_COMPENSATION) + .setLossesCompensationEpsilon(FlowDecompositionParameters.DISABLE_LOSSES_COMPENSATION_EPSILON) + .setSensitivityEpsilon(FlowDecompositionParameters.DISABLE_SENSITIVITY_EPSILON) + .setRescaleEnabled(FlowDecompositionParameters.ENABLE_RESCALED_RESULTS); + + FlowDecompositionComputer flowDecompositionComputer = new FlowDecompositionComputer(flowDecompositionParameters); + FlowDecompositionResults flowDecompositionResults = flowDecompositionComputer.run(network); + + String xnecId = "BLOAD 11 FLOAD 11 1"; + assertTrue(Double.isNaN(flowDecompositionResults.getDecomposedFlowMapBeforeRescaling().get(xnecId).getAcReferenceFlow())); + assertFalse(Double.isNaN(flowDecompositionResults.getDecomposedFlowMapBeforeRescaling().get(xnecId).getAllocatedFlow())); + assertTrue(Double.isNaN(flowDecompositionResults.getDecomposedFlowMap().get(xnecId).getAcReferenceFlow())); + assertFalse(Double.isNaN(flowDecompositionResults.getDecomposedFlowMap().get(xnecId).getAllocatedFlow())); + + } }