@@ -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
0 commit comments