15
15
import com .powsybl .computation .ComputationManager ;
16
16
import com .powsybl .contingency .ContingenciesProvider ;
17
17
import com .powsybl .contingency .Contingency ;
18
+ import com .powsybl .contingency .ContingencyContext ;
18
19
import com .powsybl .iidm .network .Branch ;
19
20
import com .powsybl .iidm .network .Network ;
20
21
import com .powsybl .iidm .network .Switch ;
43
44
import com .powsybl .security .monitor .StateMonitorIndex ;
44
45
import com .powsybl .security .results .*;
45
46
import com .powsybl .security .strategy .ConditionalActions ;
47
+ import com .powsybl .security .strategy .OperationalLimitOverride ;
46
48
import com .powsybl .security .strategy .OperatorStrategy ;
47
49
import org .slf4j .Logger ;
48
50
import org .slf4j .LoggerFactory ;
@@ -90,13 +92,14 @@ protected static SecurityAnalysisResult createNoResult() {
90
92
91
93
public CompletableFuture <SecurityAnalysisReport > run (String workingVariantId , SecurityAnalysisParameters securityAnalysisParameters ,
92
94
ContingenciesProvider contingenciesProvider , ComputationManager computationManager ,
93
- List <OperatorStrategy > operatorStrategies , List <Action > actions , List <LimitReduction > limitReductions ) {
95
+ List <OperatorStrategy > operatorStrategies , List <Action > actions , List <LimitReduction > limitReductions ,
96
+ List <OperationalLimitOverride > limitsToOverride ) {
94
97
Objects .requireNonNull (workingVariantId );
95
98
Objects .requireNonNull (securityAnalysisParameters );
96
99
Objects .requireNonNull (contingenciesProvider );
97
100
return CompletableFutureTask .runAsync (() -> {
98
101
network .getVariantManager ().setWorkingVariant (workingVariantId );
99
- return runSync (securityAnalysisParameters , contingenciesProvider , operatorStrategies , actions , limitReductions );
102
+ return runSync (securityAnalysisParameters , contingenciesProvider , operatorStrategies , actions , limitReductions , limitsToOverride );
100
103
}, computationManager .getExecutor ());
101
104
}
102
105
@@ -107,7 +110,7 @@ public CompletableFuture<SecurityAnalysisReport> run(String workingVariantId, Se
107
110
protected abstract P createParameters (LoadFlowParameters lfParameters , OpenLoadFlowParameters lfParametersExt , boolean breakers );
108
111
109
112
SecurityAnalysisReport runSync (SecurityAnalysisParameters securityAnalysisParameters , ContingenciesProvider contingenciesProvider ,
110
- List <OperatorStrategy > operatorStrategies , List <Action > actions , List <LimitReduction > limitReductions ) {
113
+ List <OperatorStrategy > operatorStrategies , List <Action > actions , List <LimitReduction > limitReductions , List < OperationalLimitOverride > limitsToOverride ) {
111
114
var saReportNode = createSaRootReportNode ();
112
115
113
116
Stopwatch stopwatch = Stopwatch .createStarted ();
@@ -150,7 +153,7 @@ SecurityAnalysisReport runSync(SecurityAnalysisParameters securityAnalysisParame
150
153
try (LfNetworkList lfNetworks = Networks .load (network , parameters .getNetworkParameters (), topoConfig , saReportNode )) {
151
154
// run simulation on largest network
152
155
SecurityAnalysisResult result = lfNetworks .getLargest ().filter (n -> n .getValidity () == LfNetwork .Validity .VALID )
153
- .map (largestNetwork -> runSimulations (largestNetwork , propagatedContingencies , parameters , securityAnalysisParameters , operatorStrategies , actions , limitReductions ))
156
+ .map (largestNetwork -> runSimulations (largestNetwork , propagatedContingencies , parameters , securityAnalysisParameters , operatorStrategies , actions , limitReductions , limitsToOverride ))
154
157
.orElse (createNoResult ());
155
158
156
159
stopwatch .stop ();
@@ -396,7 +399,7 @@ protected void afterPreContingencySimulation(P acParameters) {
396
399
397
400
protected SecurityAnalysisResult runSimulations (LfNetwork lfNetwork , List <PropagatedContingency > propagatedContingencies , P acParameters ,
398
401
SecurityAnalysisParameters securityAnalysisParameters , List <OperatorStrategy > operatorStrategies ,
399
- List <Action > actions , List <LimitReduction > limitReductions ) {
402
+ List <Action > actions , List <LimitReduction > limitReductions , List < OperationalLimitOverride > limitsToOverride ) {
400
403
Map <String , Action > actionsById = indexActionsById (actions );
401
404
Set <Action > neededActions = new HashSet <>(actionsById .size ());
402
405
Map <String , List <OperatorStrategy >> operatorStrategiesByContingencyId = indexOperatorStrategiesByContingencyId (propagatedContingencies , operatorStrategies , actionsById , neededActions );
@@ -417,7 +420,8 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
417
420
.run ();
418
421
419
422
boolean preContingencyComputationOk = preContingencyLoadFlowResult .isSuccess ();
420
- var preContingencyLimitViolationManager = new LimitViolationManager (limitReductions );
423
+ var limitsToOverridePreContingency = limitsToOverride .stream ().filter (l -> l .getContingencyContext () == ContingencyContext .none ()).toList ();
424
+ var preContingencyLimitViolationManager = new LimitViolationManager (limitReductions , limitsToOverridePreContingency );
421
425
List <PostContingencyResult > postContingencyResults = new ArrayList <>();
422
426
var preContingencyNetworkResult = new PreContingencyNetworkResult (lfNetwork , monitorIndex , createResultExtension );
423
427
List <OperatorStrategyResult > operatorStrategyResults = new ArrayList <>();
@@ -451,7 +455,8 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
451
455
var postContingencyResult = runPostContingencySimulation (lfNetwork , context , propagatedContingency .getContingency (),
452
456
lfContingency , preContingencyLimitViolationManager ,
453
457
securityAnalysisParameters .getIncreasedViolationsParameters (),
454
- preContingencyNetworkResult , createResultExtension , limitReductions );
458
+ preContingencyNetworkResult , createResultExtension , limitReductions ,
459
+ limitsToOverride );
455
460
postContingencyResults .add (postContingencyResult );
456
461
457
462
List <OperatorStrategy > operatorStrategiesForThisContingency = operatorStrategiesByContingencyId .get (lfContingency .getId ());
@@ -468,7 +473,7 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
468
473
operatorStrategy , preContingencyLimitViolationManager ,
469
474
securityAnalysisParameters .getIncreasedViolationsParameters (), lfActionById ,
470
475
createResultExtension , lfContingency , postContingencyResult .getLimitViolationsResult (),
471
- acParameters .getNetworkParameters (), limitReductions )
476
+ acParameters .getNetworkParameters (), limitReductions , limitsToOverride )
472
477
.ifPresent (operatorStrategyResults ::add );
473
478
} else {
474
479
// multiple operator strategies, save post contingency state for later restoration after action
@@ -480,7 +485,7 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
480
485
operatorStrategy , preContingencyLimitViolationManager ,
481
486
securityAnalysisParameters .getIncreasedViolationsParameters (), lfActionById ,
482
487
createResultExtension , lfContingency , postContingencyResult .getLimitViolationsResult (),
483
- acParameters .getNetworkParameters (), limitReductions )
488
+ acParameters .getNetworkParameters (), limitReductions , limitsToOverride )
484
489
.ifPresent (result -> {
485
490
operatorStrategyResults .add (result );
486
491
postContingencyNetworkState .restore ();
@@ -512,13 +517,13 @@ private Optional<OperatorStrategyResult> runActionSimulation(LfNetwork network,
512
517
SecurityAnalysisParameters .IncreasedViolationsParameters violationsParameters ,
513
518
Map <String , LfAction > lfActionById , boolean createResultExtension , LfContingency contingency ,
514
519
LimitViolationsResult postContingencyLimitViolations , LfNetworkParameters networkParameters ,
515
- List <LimitReduction > limitReductions ) {
520
+ List <LimitReduction > limitReductions , List < OperationalLimitOverride > limitsToOverride ) {
516
521
OperatorStrategyResult operatorStrategyResult = null ;
517
522
518
523
List <String > actionIds = checkCondition (operatorStrategy , postContingencyLimitViolations );
519
524
if (!actionIds .isEmpty ()) {
520
525
operatorStrategyResult = runActionSimulation (network , context , operatorStrategy , actionIds , preContingencyLimitViolationManager ,
521
- violationsParameters , lfActionById , createResultExtension , contingency , networkParameters , limitReductions );
526
+ violationsParameters , lfActionById , createResultExtension , contingency , networkParameters , limitReductions , limitsToOverride );
522
527
}
523
528
524
529
return Optional .ofNullable (operatorStrategyResult );
@@ -528,7 +533,7 @@ protected PostContingencyResult runPostContingencySimulation(LfNetwork network,
528
533
LimitViolationManager preContingencyLimitViolationManager ,
529
534
SecurityAnalysisParameters .IncreasedViolationsParameters violationsParameters ,
530
535
PreContingencyNetworkResult preContingencyNetworkResult , boolean createResultExtension ,
531
- List <LimitReduction > limitReductions ) {
536
+ List <LimitReduction > limitReductions , List < OperationalLimitOverride > limitsToOverride ) {
532
537
LOGGER .info ("Start post contingency '{}' simulation on network {}" , lfContingency .getId (), network );
533
538
LOGGER .debug ("Contingency '{}' impact on network {}: remove {} buses, remove {} branches, remove {} generators, shift {} shunts, shift {} loads" ,
534
539
lfContingency .getId (), network , lfContingency .getDisabledNetwork ().getBuses (), lfContingency .getDisabledNetwork ().getBranchesStatus (),
@@ -538,7 +543,8 @@ protected PostContingencyResult runPostContingencySimulation(LfNetwork network,
538
543
539
544
// restart LF on post contingency equation system
540
545
PostContingencyComputationStatus status = runActionLoadFlow (context ); // FIXME: change name.
541
- var postContingencyLimitViolationManager = new LimitViolationManager (preContingencyLimitViolationManager , limitReductions , violationsParameters );
546
+ var limitsToOverridePostContingency = limitsToOverride .stream ().filter (l -> Objects .equals (l .getContingencyContext (), ContingencyContext .specificContingency (contingency .getId ())) && l .getConditionalActionsId ().isEmpty ()).toList ();
547
+ var postContingencyLimitViolationManager = new LimitViolationManager (preContingencyLimitViolationManager , limitReductions , limitsToOverridePostContingency , violationsParameters );
542
548
var postContingencyNetworkResult = new PostContingencyNetworkResult (network , monitorIndex , createResultExtension , preContingencyNetworkResult , contingency );
543
549
544
550
if (status .equals (PostContingencyComputationStatus .CONVERGED )) {
@@ -571,7 +577,8 @@ protected OperatorStrategyResult runActionSimulation(LfNetwork network, C contex
571
577
LimitViolationManager preContingencyLimitViolationManager ,
572
578
SecurityAnalysisParameters .IncreasedViolationsParameters violationsParameters ,
573
579
Map <String , LfAction > lfActionById , boolean createResultExtension , LfContingency contingency ,
574
- LfNetworkParameters networkParameters , List <LimitReduction > limitReductions ) {
580
+ LfNetworkParameters networkParameters , List <LimitReduction > limitReductions ,
581
+ List <OperationalLimitOverride > limitsToOverride ) {
575
582
LOGGER .info ("Start operator strategy {} after contingency '{}' simulation on network {}" , operatorStrategy .getId (),
576
583
operatorStrategy .getContingencyContext ().getContingencyId (), network );
577
584
@@ -589,7 +596,8 @@ protected OperatorStrategyResult runActionSimulation(LfNetwork network, C contex
589
596
590
597
// restart LF on post contingency and post actions equation system
591
598
PostContingencyComputationStatus status = runActionLoadFlow (context );
592
- var postActionsViolationManager = new LimitViolationManager (preContingencyLimitViolationManager , limitReductions , violationsParameters );
599
+ var limitsToOverridePostActions = limitsToOverride .stream ().filter (l -> Objects .equals (l .getContingencyContext (), ContingencyContext .specificContingency (contingency .getId ())) && l .getConditionalActionsId ().isPresent ()).toList ();
600
+ var postActionsViolationManager = new LimitViolationManager (preContingencyLimitViolationManager , limitReductions , limitsToOverridePostActions , violationsParameters );
593
601
var postActionsNetworkResult = new PreContingencyNetworkResult (network , monitorIndex , createResultExtension );
594
602
595
603
if (status .equals (PostContingencyComputationStatus .CONVERGED )) {
0 commit comments