Skip to content

Commit 51666bf

Browse files
authored
Fix Infinite and NaN flowTransfer in security analysis results (#1367)
Signed-off-by: Damien Jeandemange <damien.jeandemange@artelys.com>
1 parent 05a1c62 commit 51666bf

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

src/main/java/com/powsybl/openloadflow/network/impl/AbstractImpedantLfBranch.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
*/
2727
public abstract class AbstractImpedantLfBranch extends AbstractLfBranch {
2828

29+
private static final double P_EPSILON_SI = 1e-6; // in MW
30+
2931
protected boolean connectedSide1;
3032

3133
protected boolean connectedSide2;
@@ -520,7 +522,12 @@ protected BranchResult buildBranchResult(LoadFlowModel loadFlowModel, Map<String
520522

521523
double flowTransfer = Double.NaN;
522524
if (!Double.isNaN(preContingencyBranchP1) && !Double.isNaN(preContingencyBranchOfContingencyP1)) {
523-
flowTransfer = (flowP1 - preContingencyBranchP1) / preContingencyBranchOfContingencyP1;
525+
double flowChange = flowP1 - preContingencyBranchP1;
526+
if (Math.abs(preContingencyBranchOfContingencyP1) > P_EPSILON_SI) {
527+
flowTransfer = flowChange / preContingencyBranchOfContingencyP1;
528+
} else {
529+
flowTransfer = 0.;
530+
}
524531
}
525532
return new BranchResult(getId(), flowP1, flowQ1, currentI1, flowP2, flowQ2, currentI2, flowTransfer);
526533
}

src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4931,7 +4931,7 @@ void testSaResultsWithZeroImpedanceModeAndT3wt() {
49314931
false, TWO, 0.336
49324932
true, TWO, 0.333
49334933
""")
4934-
void testContingencyDisconnectingZeroImpedanteBranchConnectedOneSide(boolean dc, TwoSides side, double expectedL12P1) {
4934+
void testContingencyDisconnectingZeroImpedanceBranchConnectedOneSide(boolean dc, TwoSides side, double expectedL12P1) {
49354935
Network network = FourBusNetworkFactory.create();
49364936

49374937
LoadFlowParameters loadFlowParameters = new LoadFlowParameters()
@@ -4952,4 +4952,27 @@ void testContingencyDisconnectingZeroImpedanteBranchConnectedOneSide(boolean dc,
49524952
assertEquals(expectedL12P1, result.getPreContingencyResult().getNetworkResult().getBranchResult("l12").getP1(), DELTA_POWER);
49534953
assertEquals(expectedL12P1, result.getPostContingencyResults().getFirst().getNetworkResult().getBranchResult("l12").getP1(), DELTA_POWER);
49544954
}
4955+
4956+
@ParameterizedTest(name = "DC = {0}")
4957+
@ValueSource(booleans = {false, true})
4958+
void testZeroFlowTransfer(boolean dc) {
4959+
Network network = FourBusNetworkFactory.create();
4960+
4961+
LoadFlowParameters loadFlowParameters = new LoadFlowParameters()
4962+
.setDc(dc);
4963+
OpenLoadFlowParameters.create(loadFlowParameters);
4964+
4965+
// disconnect l14 on side 2, used as contingency
4966+
Line l14 = network.getLine("l14");
4967+
l14.getTerminal2().disconnect();
4968+
4969+
List<Contingency> contingencies = List.of(Contingency.line("l14"));
4970+
List<StateMonitor> monitors = createAllBranchesMonitors(network);
4971+
4972+
SecurityAnalysisResult result = runSecurityAnalysis(network, contingencies, monitors, loadFlowParameters);
4973+
NetworkResult networkResult = result.getPostContingencyResults().getFirst().getNetworkResult();
4974+
assertEquals(4, networkResult.getBranchResults().size());
4975+
networkResult.getBranchResults()
4976+
.forEach(br -> assertEquals(0., br.getFlowTransfer(), DELTA_POWER));
4977+
}
49554978
}

0 commit comments

Comments
 (0)