Skip to content

Commit 4ee095b

Browse files
Return operationalLimitsGroupId with LimitViolation
Signed-off-by: Sylvestre Prabakaran <sylvestre.prabakaran@rte-france.com>
1 parent c9ad568 commit 4ee095b

7 files changed

Lines changed: 117 additions & 57 deletions

File tree

src/main/java/com/powsybl/openloadflow/network/LfBranch.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,17 @@ record LfBranchResults(double p1, double p2, double q1, double q2, double i1, do
4141

4242
class LfLimitsGroup {
4343

44-
private List<LfLimit> sortedLimits;
44+
private final List<LfLimit> sortedLimits;
4545

46-
public LfLimitsGroup(List<LfLimit> sortedLimits) {
46+
private final String operationalLimitsGroupId;
47+
48+
public LfLimitsGroup(List<LfLimit> sortedLimits, String operationalLimitsGroupId) {
4749
this.sortedLimits = sortedLimits;
50+
this.operationalLimitsGroupId = operationalLimitsGroupId;
51+
}
52+
53+
public String getOperationalLimitsGroupId() {
54+
return operationalLimitsGroupId;
4855
}
4956

5057
public List<LfLimit> getSortedLimits() {
@@ -65,7 +72,7 @@ private static double getScaleForLimitType(LimitType type, LfBus bus) {
6572
* The resulting list will contain the permanent limit
6673
* This list is returned in a LfLimitsGroup object
6774
*/
68-
public static LfLimitsGroup createSortedLimitsList(LoadingLimits loadingLimits, LfBus bus, double[] limitReductions) {
75+
public static LfLimitsGroup createSortedLimitsList(LoadingLimits loadingLimits, String operationalLimitsGroupId, LfBus bus, double[] limitReductions) {
6976
List<LfLimit> sortedLimits = new ArrayList<>(3);
7077
if (loadingLimits != null) {
7178
double toPerUnit = getScaleForLimitType(loadingLimits.getLimitType(), bus);
@@ -94,7 +101,7 @@ public static LfLimitsGroup createSortedLimitsList(LoadingLimits loadingLimits,
94101
}
95102
sortedLimits.get(0).setAcceptableDuration(0);
96103
}
97-
return new LfLimitsGroup(sortedLimits);
104+
return new LfLimitsGroup(sortedLimits, operationalLimitsGroupId);
98105
}
99106

100107
}

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

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,25 @@ private void setLimits1(LimitType type, List<LfLimitsGroup> limits) {
130130
}
131131
}
132132

133-
public <T extends LoadingLimits> List<LfLimitsGroup> getLimits1(LimitType type, Supplier<Collection<T>> loadingLimitsSupplier, LimitReductionManager limitReductionManager) {
133+
private <T extends LoadingLimits> List<LfLimitsGroup> createLimits(Supplier<Map<String, T>> loadingLimitsSupplier, LimitReductionManager limitReductionManager, TwoSides side) {
134+
// It is possible to apply the reductions here since the only supported ContingencyContext for LimitReduction is ALL.
135+
Map<String, T> allSelectedLoadingLimits = loadingLimitsSupplier.get(); // Map of all selected loading limits indexed by their operational limits group id
136+
List<LfLimitsGroup> limits = new ArrayList<>();
137+
for (Map.Entry<String, T> loadingLimitsEntry : allSelectedLoadingLimits.entrySet()) {
138+
T loadingLimits = loadingLimitsEntry.getValue();
139+
String operationalLimitsGroupId = loadingLimitsEntry.getKey();
140+
limits.add(LfLimitsGroup.createSortedLimitsList(loadingLimits,
141+
operationalLimitsGroupId,
142+
side == TwoSides.ONE ? bus1 : bus2,
143+
getLimitReductions(side, limitReductionManager, loadingLimits)));
144+
}
145+
return limits;
146+
}
147+
148+
public <T extends LoadingLimits> List<LfLimitsGroup> getLimits1(LimitType type, Supplier<Map<String, T>> loadingLimitsSupplier, LimitReductionManager limitReductionManager) {
134149
List<LfLimitsGroup> limits = getLimits1(type);
135150
if (limits == null) {
136-
// It is possible to apply the reductions here since the only supported ContingencyContext for LimitReduction is ALL.
137-
Collection<T> allSelectedLoadingLimits = loadingLimitsSupplier.get();
138-
limits = new ArrayList<>();
139-
for (T loadingLimits : allSelectedLoadingLimits) {
140-
limits.add(LfLimitsGroup.createSortedLimitsList(loadingLimits, bus1,
141-
getLimitReductions(TwoSides.ONE, limitReductionManager, loadingLimits)));
142-
}
151+
limits = createLimits(loadingLimitsSupplier, limitReductionManager, TwoSides.ONE);
143152
setLimits1(type, limits);
144153
}
145154
return limits;
@@ -169,16 +178,10 @@ private void setLimits2(LimitType type, List<LfLimitsGroup> limits) {
169178
}
170179
}
171180

172-
public <T extends LoadingLimits> List<LfLimitsGroup> getLimits2(LimitType type, Supplier<Collection<T>> loadingLimitsSupplier, LimitReductionManager limitReductionManager) {
181+
public <T extends LoadingLimits> List<LfLimitsGroup> getLimits2(LimitType type, Supplier<Map<String, T>> loadingLimitsSupplier, LimitReductionManager limitReductionManager) {
173182
var limits = getLimits2(type);
174183
if (limits == null) {
175-
// It is possible to apply the reductions here since the only supported ContingencyContext for LimitReduction is ALL.
176-
Collection<T> allSelectedLoadingLimits = loadingLimitsSupplier.get();
177-
limits = new ArrayList<>();
178-
for (T loadingLimits : allSelectedLoadingLimits) {
179-
limits.add(LfLimitsGroup.createSortedLimitsList(loadingLimits, bus2,
180-
getLimitReductions(TwoSides.TWO, limitReductionManager, loadingLimits)));
181-
}
184+
limits = createLimits(loadingLimitsSupplier, limitReductionManager, TwoSides.TWO);
182185
setLimits2(type, limits);
183186
}
184187
return limits;

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
*/
88
package com.powsybl.openloadflow.network.impl;
99

10-
import com.powsybl.iidm.network.BoundaryLine;
11-
import com.powsybl.iidm.network.LimitType;
12-
import com.powsybl.iidm.network.LoadingLimits;
13-
import com.powsybl.iidm.network.TwoSides;
10+
import com.powsybl.iidm.network.*;
1411
import com.powsybl.openloadflow.network.*;
1512
import com.powsybl.openloadflow.sa.LimitReductionManager;
1613
import com.powsybl.openloadflow.util.PerUnit;
@@ -19,6 +16,10 @@
1916
import java.util.List;
2017
import java.util.Map;
2118
import java.util.Objects;
19+
import java.util.Optional;
20+
import java.util.function.Function;
21+
import java.util.function.Supplier;
22+
import java.util.stream.Collectors;
2223

2324
/**
2425
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
@@ -80,15 +81,23 @@ public List<BranchResult> createBranchResult(double preContingencyBranchP1, doub
8081
return List.of(buildBranchResult(loadFlowModel, zeroImpedanceFlows, currentScale, currentScale, Double.NaN, Double.NaN));
8182
}
8283

84+
private <T extends LoadingLimits> Supplier<Map<String, T>> toMapIndexedByOperationalLimitsGroupId(Function<OperationalLimitsGroup, Optional<T>> limitsGetter) {
85+
return () -> getBoundaryLine()
86+
.getAllSelectedOperationalLimitsGroups()
87+
.stream()
88+
.filter(o -> limitsGetter.apply(o).isPresent())
89+
.collect(Collectors.toMap(OperationalLimitsGroup::getId, o -> limitsGetter.apply(o).orElseThrow()));
90+
}
91+
8392
@Override
8493
public List<LfLimitsGroup> getLimits1(final LimitType type, LimitReductionManager limitReductionManager) {
8594
switch (type) {
8695
case ACTIVE_POWER:
87-
return getLimits1(type, () -> getBoundaryLine().getAllSelectedActivePowerLimits(), limitReductionManager);
96+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getActivePowerLimits), limitReductionManager);
8897
case APPARENT_POWER:
89-
return getLimits1(type, () -> getBoundaryLine().getAllSelectedApparentPowerLimits(), limitReductionManager);
98+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getApparentPowerLimits), limitReductionManager);
9099
case CURRENT:
91-
return getLimits1(type, () -> getBoundaryLine().getAllSelectedCurrentLimits(), limitReductionManager);
100+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getCurrentLimits), limitReductionManager);
92101
case VOLTAGE:
93102
default:
94103
throw new UnsupportedOperationException(String.format("Getting %s limits is not supported.", type.name()));

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import org.slf4j.LoggerFactory;
1919

2020
import java.util.*;
21+
import java.util.function.Function;
22+
import java.util.function.Supplier;
23+
import java.util.stream.Collectors;
2124

2225
/**
2326
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
@@ -228,15 +231,23 @@ public List<BranchResult> createBranchResult(double preContingencyBranchP1, doub
228231
return List.of(branchResult);
229232
}
230233

234+
private <T extends LoadingLimits> Supplier<Map<String, T>> toMapIndexedByOperationalLimitsGroupId(Function<OperationalLimitsGroup, Optional<T>> limitsGetter, TwoSides side) {
235+
return () -> getBranch()
236+
.getAllSelectedOperationalLimitsGroups(side)
237+
.stream()
238+
.filter(o -> limitsGetter.apply(o).isPresent())
239+
.collect(Collectors.toMap(OperationalLimitsGroup::getId, o -> limitsGetter.apply(o).orElseThrow()));
240+
}
241+
231242
@Override
232243
public List<LfLimitsGroup> getLimits1(final LimitType type, LimitReductionManager limitReductionManager) {
233244
switch (type) {
234245
case ACTIVE_POWER:
235-
return getLimits1(type, () -> getBranch().getAllSelectedActivePowerLimits(TwoSides.ONE), limitReductionManager);
246+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getActivePowerLimits, TwoSides.ONE), limitReductionManager);
236247
case APPARENT_POWER:
237-
return getLimits1(type, () -> getBranch().getAllSelectedApparentPowerLimits(TwoSides.ONE), limitReductionManager);
248+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getApparentPowerLimits, TwoSides.ONE), limitReductionManager);
238249
case CURRENT:
239-
return getLimits1(type, () -> getBranch().getAllSelectedCurrentLimits(TwoSides.ONE), limitReductionManager);
250+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getCurrentLimits, TwoSides.ONE), limitReductionManager);
240251
case VOLTAGE:
241252
default:
242253
throw new UnsupportedOperationException(String.format("Getting %s limits is not supported.", type.name()));
@@ -247,11 +258,11 @@ public List<LfLimitsGroup> getLimits1(final LimitType type, LimitReductionManage
247258
public List<LfLimitsGroup> getLimits2(final LimitType type, LimitReductionManager limitReductionManager) {
248259
switch (type) {
249260
case ACTIVE_POWER:
250-
return getLimits2(type, () -> getBranch().getAllSelectedActivePowerLimits(TwoSides.TWO), limitReductionManager);
261+
return getLimits2(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getActivePowerLimits, TwoSides.TWO), limitReductionManager);
251262
case APPARENT_POWER:
252-
return getLimits2(type, () -> getBranch().getAllSelectedApparentPowerLimits(TwoSides.TWO), limitReductionManager);
263+
return getLimits2(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getApparentPowerLimits, TwoSides.TWO), limitReductionManager);
253264
case CURRENT:
254-
return getLimits2(type, () -> getBranch().getAllSelectedCurrentLimits(TwoSides.TWO), limitReductionManager);
265+
return getLimits2(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getCurrentLimits, TwoSides.TWO), limitReductionManager);
255266
case VOLTAGE:
256267
default:
257268
throw new UnsupportedOperationException(String.format("Getting %s limits is not supported.", type.name()));

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
import com.powsybl.security.results.ThreeWindingsTransformerResult;
1717

1818
import java.util.*;
19+
import java.util.function.Function;
20+
import java.util.function.Supplier;
21+
import java.util.stream.Collectors;
1922

2023
/**
2124
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
@@ -145,15 +148,23 @@ public List<BranchResult> createBranchResult(double preContingencyBranchP1, doub
145148
throw new PowsyblException("Unsupported type of branch for branch result: " + getId());
146149
}
147150

151+
private <T extends LoadingLimits> Supplier<Map<String, T>> toMapIndexedByOperationalLimitsGroupId(Function<OperationalLimitsGroup, Optional<T>> limitsGetter) {
152+
return () -> getLeg()
153+
.getAllSelectedOperationalLimitsGroups()
154+
.stream()
155+
.filter(o -> limitsGetter.apply(o).isPresent())
156+
.collect(Collectors.toMap(OperationalLimitsGroup::getId, o -> limitsGetter.apply(o).orElseThrow()));
157+
}
158+
148159
@Override
149160
public List<LfLimitsGroup> getLimits1(final LimitType type, LimitReductionManager limitReductionManager) {
150161
switch (type) {
151162
case ACTIVE_POWER:
152-
return getLimits1(type, () -> getLeg().getAllSelectedActivePowerLimits(), limitReductionManager);
163+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getActivePowerLimits), limitReductionManager);
153164
case APPARENT_POWER:
154-
return getLimits1(type, () -> getLeg().getAllSelectedApparentPowerLimits(), limitReductionManager);
165+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getApparentPowerLimits), limitReductionManager);
155166
case CURRENT:
156-
return getLimits1(type, () -> getLeg().getAllSelectedCurrentLimits(), limitReductionManager);
167+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getCurrentLimits), limitReductionManager);
157168
case VOLTAGE:
158169
default:
159170
throw new UnsupportedOperationException(String.format("Getting %s limits is not supported.", type.name()));

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
import java.util.List;
1717
import java.util.Map;
1818
import java.util.Objects;
19+
import java.util.Optional;
20+
import java.util.function.Function;
21+
import java.util.function.Supplier;
22+
import java.util.stream.Collectors;
1923

2024
/**
2125
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
@@ -99,15 +103,23 @@ public List<BranchResult> createBranchResult(double preContingencyBranchP1, doub
99103
return List.of(branchResult, half1Result, half2Result);
100104
}
101105

106+
private <T extends LoadingLimits> Supplier<Map<String, T>> toMapIndexedByOperationalLimitsGroupId(Function<OperationalLimitsGroup, Optional<T>> limitsGetter, TwoSides side) {
107+
return () -> (side == TwoSides.ONE ? getHalf1() : getHalf2())
108+
.getAllSelectedOperationalLimitsGroups()
109+
.stream()
110+
.filter(o -> limitsGetter.apply(o).isPresent())
111+
.collect(Collectors.toMap(OperationalLimitsGroup::getId, o -> limitsGetter.apply(o).orElseThrow()));
112+
}
113+
102114
@Override
103115
public List<LfLimitsGroup> getLimits1(final LimitType type, LimitReductionManager limitReductionManager) {
104116
switch (type) {
105117
case ACTIVE_POWER:
106-
return getLimits1(type, getHalf1()::getAllSelectedActivePowerLimits, limitReductionManager);
118+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getActivePowerLimits, TwoSides.ONE), limitReductionManager);
107119
case APPARENT_POWER:
108-
return getLimits1(type, getHalf1()::getAllSelectedApparentPowerLimits, limitReductionManager);
120+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getApparentPowerLimits, TwoSides.ONE), limitReductionManager);
109121
case CURRENT:
110-
return getLimits1(type, getHalf1()::getAllSelectedCurrentLimits, limitReductionManager);
122+
return getLimits1(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getCurrentLimits, TwoSides.ONE), limitReductionManager);
111123
case VOLTAGE:
112124
default:
113125
throw new UnsupportedOperationException(String.format("Getting %s limits is not supported.", type.name()));
@@ -118,11 +130,11 @@ public List<LfLimitsGroup> getLimits1(final LimitType type, LimitReductionManage
118130
public List<LfLimitsGroup> getLimits2(final LimitType type, LimitReductionManager limitReductionManager) {
119131
switch (type) {
120132
case ACTIVE_POWER:
121-
return getLimits2(type, getHalf2()::getAllSelectedActivePowerLimits, limitReductionManager);
133+
return getLimits2(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getActivePowerLimits, TwoSides.TWO), limitReductionManager);
122134
case APPARENT_POWER:
123-
return getLimits2(type, getHalf2()::getAllSelectedApparentPowerLimits, limitReductionManager);
135+
return getLimits2(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getApparentPowerLimits, TwoSides.TWO), limitReductionManager);
124136
case CURRENT:
125-
return getLimits2(type, getHalf2()::getAllSelectedCurrentLimits, limitReductionManager);
137+
return getLimits2(type, toMapIndexedByOperationalLimitsGroupId(OperationalLimitsGroup::getCurrentLimits, TwoSides.TWO), limitReductionManager);
126138
case VOLTAGE:
127139
default:
128140
throw new UnsupportedOperationException(String.format("Getting %s limits is not supported.", type.name()));

0 commit comments

Comments
 (0)