Skip to content

Commit 27b42be

Browse files
authored
Merge branch 'main' into other_ptdf_sum_fix
2 parents d3d7537 + c8193e4 commit 27b42be

13 files changed

Lines changed: 1168 additions & 44 deletions

File tree

data/crac/crac-io/crac-io-cim/src/main/java/com/powsybl/openrao/data/crac/io/cim/craccreator/HvdcRangeActionCreator.java

Lines changed: 72 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public class HvdcRangeActionCreator {
4848
private final Map<String, Boolean> isDirectionInverted = new HashMap<>();
4949
private final List<String> raSeriesIds = new ArrayList<>();
5050
private final Map<String, OpenRaoImportException> exceptions = new HashMap<>();
51+
boolean isAltered = false;
52+
String importStatusDetailifIsAltered = "";
5153

5254
public HvdcRangeActionCreator(Crac crac, Network network, List<Contingency> contingencies, List<String> invalidContingencies, Set<Cnec<?>> cnecs, Country sharedDomain, CimCracCreationParameters cimCracCreationParameters) {
5355
this.crac = crac;
@@ -84,20 +86,8 @@ public void addDirection(RemedialActionSeries remedialActionSeries) {
8486
}
8587
networkElementIds.add(networkElementId);
8688

87-
hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource));
88-
89-
boolean isRegisteredResourceInverted = readHvdcRange(
90-
networkElementId,
91-
registeredResource.getResourceCapacityMinimumCapacity().intValue(),
92-
registeredResource.getResourceCapacityMaximumCapacity().intValue(),
93-
registeredResource.getInAggregateNodeMRID().getValue(),
94-
registeredResource.getOutAggregateNodeMRID().getValue());
95-
96-
if (Objects.nonNull(isRemedialActionSeriesInverted) && !isRemedialActionSeriesInverted.equals(isRegisteredResourceInverted)) {
97-
throw new OpenRaoImportException(ImportStatus.INCONSISTENCY_IN_DATA, "HVDC registered resources reference lines in opposite directions");
98-
} else {
99-
isRemedialActionSeriesInverted = isRegisteredResourceInverted;
100-
}
89+
checkHvdcNetworkElementAndInitAdder(registeredResource, networkElementId);
90+
isRemedialActionSeriesInverted = readRangeAndCheckIfInverted(isRemedialActionSeriesInverted, registeredResource, networkElementId);
10191
}
10292

10393
Boolean finalIsRemedialActionSeriesInverted = isRemedialActionSeriesInverted;
@@ -111,6 +101,43 @@ public void addDirection(RemedialActionSeries remedialActionSeries) {
111101
}
112102
}
113103

104+
private Boolean readRangeAndCheckIfInverted(Boolean isRemedialActionSeriesInverted, RemedialActionRegisteredResource registeredResource, String networkElementId) {
105+
boolean isRegisteredResourceInverted = readHvdcRange(
106+
networkElementId,
107+
registeredResource.getResourceCapacityMinimumCapacity().intValue(),
108+
registeredResource.getResourceCapacityMaximumCapacity().intValue(),
109+
registeredResource.getInAggregateNodeMRID().getValue(),
110+
registeredResource.getOutAggregateNodeMRID().getValue());
111+
112+
if (Objects.nonNull(isRemedialActionSeriesInverted) && !isRemedialActionSeriesInverted.equals(isRegisteredResourceInverted)) {
113+
throw new OpenRaoImportException(ImportStatus.INCONSISTENCY_IN_DATA, "HVDC registered resources reference lines in opposite directions");
114+
} else {
115+
return isRegisteredResourceInverted;
116+
}
117+
}
118+
119+
private void checkHvdcNetworkElementAndInitAdder(RemedialActionRegisteredResource registeredResource, String networkElementId) {
120+
checkHvdcNetworkElement(networkElementId);
121+
HvdcLine hvdcLine = network.getHvdcLine(networkElementId);
122+
123+
boolean terminal1Connected = hvdcLine.getConverterStation1().getTerminal().isConnected();
124+
boolean terminal2Connected = hvdcLine.getConverterStation2().getTerminal().isConnected();
125+
if (terminal1Connected && terminal2Connected) {
126+
hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource));
127+
} else {
128+
isAltered = true;
129+
importStatusDetailifIsAltered = String.format("HVDC line %s has ", hvdcLine.getId());
130+
if (!terminal1Connected && !terminal2Connected) {
131+
importStatusDetailifIsAltered += "terminals 1 and 2 ";
132+
} else if (!terminal1Connected) {
133+
importStatusDetailifIsAltered += "terminal 1 ";
134+
} else if (!terminal2Connected) {
135+
importStatusDetailifIsAltered += "terminal 2 ";
136+
}
137+
importStatusDetailifIsAltered += "disconnected";
138+
}
139+
}
140+
114141
public Set<RemedialActionSeriesCreationContext> add() {
115142
if (raSeriesIds.size() != 2) {
116143
return raSeriesIds.stream().map(id ->
@@ -149,23 +176,29 @@ public Set<RemedialActionSeriesCreationContext> add() {
149176
).collect(Collectors.toSet());
150177
} catch (OpenRaoException e) {
151178
return raSeriesIds.stream().map(id ->
152-
RemedialActionSeriesCreationContext.notImported(id, ImportStatus.INCONSISTENCY_IN_DATA, e.getMessage())).collect(Collectors.toSet());
179+
RemedialActionSeriesCreationContext.notImported(id, ImportStatus.INCONSISTENCY_IN_DATA, e.getMessage())).collect(Collectors.toSet());
153180
}
154181
}
155182

156-
if (invalidContingencies.isEmpty()) {
157-
return raSeriesIds.stream().map(id -> RemedialActionSeriesCreationContext.importedHvdcRa(id, createdRaIds, false, isDirectionInverted.get(id), "")).collect(Collectors.toSet());
158-
} else {
159-
String contingencyList = StringUtils.join(invalidContingencies, ", ");
160-
return raSeriesIds.stream().map(id -> RemedialActionSeriesCreationContext.importedHvdcRa(id, createdRaIds, true, isDirectionInverted.get(id), String.format("Contingencies %s were not imported", contingencyList))).collect(Collectors.toSet());
183+
if (createdRaIds.isEmpty()) {
184+
return raSeriesIds.stream().map(id ->
185+
RemedialActionSeriesCreationContext.notImported(id, ImportStatus.INCONSISTENCY_IN_DATA, String.format("All terminals on HVDC lines are disconnected"))
186+
).collect(Collectors.toSet());
161187
}
162188

189+
if (!invalidContingencies.isEmpty()) {
190+
if (isAltered) {
191+
importStatusDetailifIsAltered += "; ";
192+
}
193+
String contingencyList = StringUtils.join(invalidContingencies, ", ");
194+
importStatusDetailifIsAltered += String.format("Contingencies %s were not imported", contingencyList);
195+
}
196+
return raSeriesIds.stream().map(id -> RemedialActionSeriesCreationContext.importedHvdcRa(id, createdRaIds, isAltered, isDirectionInverted.get(id), importStatusDetailifIsAltered)).collect(Collectors.toSet());
163197
}
164198

165199
private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredResource registeredResource) {
166200
HvdcRangeActionAdder hvdcRangeActionAdder = crac.newHvdcRangeAction();
167201
String hvdcId = registeredResource.getMRID().getValue();
168-
checkHvdcNetworkElement(hvdcId);
169202
hvdcRangeActionAdder.withNetworkElement(hvdcId);
170203

171204
// Speed
@@ -229,18 +262,15 @@ private void checkRegisteredResource(RemedialActionRegisteredResource registered
229262
* @param networkElement - HVDC line name
230263
* @param minCapacity
231264
* @param maxCapacity
232-
* @param inNode - The area of the related oriented border study where the energy flows INTO.
233-
* @param outNode - The area of the related oriented border study where the energy comes FROM.
265+
* @param inNode - The area of the related oriented border study where the energy flows INTO.
266+
* @param outNode - The area of the related oriented border study where the energy comes FROM.
234267
* @return - the boolean indicates whether the Hvdc line is inverted
235268
*/
236269
private boolean readHvdcRange(String networkElement, int minCapacity, int maxCapacity, String inNode, String outNode) {
237270
HvdcLine hvdcLine = network.getHvdcLine(networkElement);
238271
boolean isInverted;
239272
int min;
240273
int max;
241-
if (Objects.isNull(hvdcLine)) {
242-
throw new OpenRaoImportException(ImportStatus.ELEMENT_NOT_FOUND_IN_NETWORK, "Not a HVDC line");
243-
}
244274
String from = hvdcLine.getConverterStation1().getTerminal().getVoltageLevel().getId();
245275
String to = hvdcLine.getConverterStation2().getTerminal().getVoltageLevel().getId();
246276

@@ -259,21 +289,24 @@ private boolean readHvdcRange(String networkElement, int minCapacity, int maxCap
259289
throw new OpenRaoImportException(ImportStatus.INCONSISTENCY_IN_DATA, "Wrong HVDC inAggregateNode/outAggregateNode");
260290
}
261291

262-
if (rangeMin.containsKey(networkElement)) {
263-
rangeMin.get(networkElement).add(min);
264-
} else {
265-
List<Integer> list = new ArrayList<>();
266-
list.add(min);
267-
rangeMin.put(networkElement, list);
268-
}
292+
if (hvdcLine.getConverterStation1().getTerminal().isConnected() && hvdcLine.getConverterStation2().getTerminal().isConnected()) {
293+
if (rangeMin.containsKey(networkElement)) {
294+
rangeMin.get(networkElement).add(min);
295+
} else {
296+
List<Integer> list = new ArrayList<>();
297+
list.add(min);
298+
rangeMin.put(networkElement, list);
299+
}
269300

270-
if (rangeMax.containsKey(networkElement)) {
271-
rangeMax.get(networkElement).add(max);
272-
} else {
273-
List<Integer> list = new ArrayList<>();
274-
list.add(max);
275-
rangeMax.put(networkElement, list);
301+
if (rangeMax.containsKey(networkElement)) {
302+
rangeMax.get(networkElement).add(max);
303+
} else {
304+
List<Integer> list = new ArrayList<>();
305+
list.add(max);
306+
rangeMax.put(networkElement, list);
307+
}
276308
}
309+
277310
return isInverted;
278311
}
279312

data/crac/crac-io/crac-io-cim/src/main/java/com/powsybl/openrao/data/crac/io/cim/craccreator/RemedialActionSeriesCreator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ private void readRemedialAction(RemedialActionSeries remedialActionSeries, boole
214214
}
215215

216216
// --- Availability_MarketObjectStatus
217-
String availabilityMarketObjectStus = remedialActionSeries.getAvailabilityMarketObjectStatusStatus();
218-
if (!checkAvailabilityMarketObjectStatus(createdRemedialActionId, availabilityMarketObjectStus)) {
217+
String availabilityMarketObjectStatus = remedialActionSeries.getAvailabilityMarketObjectStatusStatus();
218+
if (!checkAvailabilityMarketObjectStatus(createdRemedialActionId, availabilityMarketObjectStatus)) {
219219
return;
220220
}
221221

@@ -542,8 +542,8 @@ private boolean checkAvailabilityMarketObjectStatus(String createdRemedialAction
542542
}
543543

544544
private void resetSeriesContingencies() {
545-
contingencies.clear();
546-
invalidContingencies.clear();
545+
this.contingencies = new ArrayList<>();
546+
this.invalidContingencies = new ArrayList<>();
547547
}
548548

549549
private boolean describesRemedialActionsToImport(Series series) {

0 commit comments

Comments
 (0)