@@ -615,10 +615,14 @@ protected static void findAllBranchesToClose(Network network, List<Action> actio
615
615
}
616
616
617
617
protected static void distributedMismatch (LfNetwork network , double mismatch , LoadFlowParameters loadFlowParameters ,
618
- OpenLoadFlowParameters openLoadFlowParameters , ContingencyLoadFlowParameters contingencyParameters ) {
619
- ContingencyLoadFlowParameters parameters = Objects .requireNonNullElse (contingencyParameters , new ContingencyLoadFlowParameters (loadFlowParameters .isDistributedSlack (), openLoadFlowParameters .isAreaInterchangeControl (), loadFlowParameters .getBalanceType ()));
620
- if ((parameters .isDistributedSlack () || parameters .isAreaInterchangeControl ()) && Math .abs (mismatch ) > 0 ) {
621
- ActivePowerDistribution activePowerDistribution = ActivePowerDistribution .create (parameters .getBalanceType (), openLoadFlowParameters .isLoadPowerFactorConstant (), openLoadFlowParameters .isUseActiveLimits ());
618
+ OpenLoadFlowParameters openLoadFlowParameters , ContingencyLoadFlowParameters nullableContingencyLfParameters ) {
619
+ ContingencyLoadFlowParameters contingencyLfParameters = Objects .requireNonNullElse (nullableContingencyLfParameters , new ContingencyLoadFlowParameters ());
620
+ boolean distributedSlack = contingencyLfParameters .isDistributedSlack ().orElse (loadFlowParameters .isDistributedSlack ());
621
+ boolean areaInterchangeControl = contingencyLfParameters .isAreaInterchangeControl ().orElse (openLoadFlowParameters .isAreaInterchangeControl ());
622
+ LoadFlowParameters .BalanceType balanceType = contingencyLfParameters .getBalanceType ().orElse (loadFlowParameters .getBalanceType ());
623
+
624
+ if ((distributedSlack || areaInterchangeControl ) && Math .abs (mismatch ) > 0 ) {
625
+ ActivePowerDistribution activePowerDistribution = ActivePowerDistribution .create (balanceType , openLoadFlowParameters .isLoadPowerFactorConstant (), openLoadFlowParameters .isUseActiveLimits ());
622
626
activePowerDistribution .run (network , mismatch );
623
627
}
624
628
}
@@ -671,6 +675,9 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
671
675
// save base state for later restoration after each contingency
672
676
NetworkState networkState = NetworkState .save (lfNetwork );
673
677
678
+ // Create consumer to reset parameters if they are modified for a contingency
679
+ Consumer <P > parametersResetter = createParametersResetter (acParameters );
680
+
674
681
// start a simulation for each of the contingency
675
682
Iterator <PropagatedContingency > contingencyIt = propagatedContingencies .iterator ();
676
683
while (contingencyIt .hasNext () && !Thread .currentThread ().isInterrupted ()) {
@@ -681,7 +688,7 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
681
688
lfNetwork .setReportNode (postContSimReportNode );
682
689
683
690
ContingencyLoadFlowParameters contingencyLoadFlowParameters = propagatedContingency .getContingency ().getExtension (ContingencyLoadFlowParameters .class );
684
- Consumer < P > parametersResetter = applyContingencyParameters (context .getParameters (), contingencyLoadFlowParameters , openLoadFlowParameters );
691
+ applyContingencyParameters (context .getParameters (), contingencyLoadFlowParameters , loadFlowParameters , openLoadFlowParameters );
685
692
686
693
lfContingency .apply (loadFlowParameters .getBalanceType ());
687
694
@@ -727,10 +734,13 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
727
734
}
728
735
}
729
736
}
730
- parametersResetter .accept (context .getParameters ());
731
737
if (contingencyIt .hasNext ()) {
732
738
// restore base state
733
739
networkState .restore ();
740
+ if (contingencyLoadFlowParameters != null ) {
741
+ // reset parameters
742
+ parametersResetter .accept (context .getParameters ());
743
+ }
734
744
}
735
745
});
736
746
}
@@ -746,53 +756,65 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
746
756
}
747
757
}
748
758
749
- private Consumer <P > applyContingencyParameters (P parameters , ContingencyLoadFlowParameters contingencyLoadFlowParameters , OpenLoadFlowParameters parametersExt ) {
759
+ private Consumer <P > createParametersResetter (P parameters ) {
760
+ if (parameters instanceof DcLoadFlowParameters dcLoadFlowParameters ) {
761
+ boolean oldDistributedSlack = dcLoadFlowParameters .isDistributedSlack ();
762
+ LoadFlowParameters .BalanceType oldBalanceType = dcLoadFlowParameters .getBalanceType ();
763
+ List <DcOuterLoop > oldOuterLoops = new ArrayList <>(dcLoadFlowParameters .getOuterLoops ());
764
+ return p -> {
765
+ ((DcLoadFlowParameters ) p ).setDistributedSlack (oldDistributedSlack );
766
+ ((DcLoadFlowParameters ) p ).setBalanceType (oldBalanceType );
767
+ ((DcLoadFlowParameters ) p ).setOuterLoops (oldOuterLoops );
768
+ };
769
+ } else if (parameters instanceof AcLoadFlowParameters acLoadFlowParameters ) {
770
+ List <AcOuterLoop > oldOuterLoops = new ArrayList <>(acLoadFlowParameters .getOuterLoops ());
771
+ return p -> ((AcLoadFlowParameters ) p ).setOuterLoops (oldOuterLoops );
772
+ } else {
773
+ return p -> { };
774
+ }
775
+ }
776
+
777
+ private void applyContingencyParameters (P parameters , ContingencyLoadFlowParameters contingencyLoadFlowParameters , LoadFlowParameters loadFlowParameters , OpenLoadFlowParameters parametersExt ) {
750
778
if (contingencyLoadFlowParameters != null ) {
779
+ LoadFlowParameters .BalanceType balanceType = contingencyLoadFlowParameters .getBalanceType ().orElse (loadFlowParameters .getBalanceType ());
751
780
if (parameters instanceof DcLoadFlowParameters dcLoadFlowParameters ) {
752
- return applyDcContingencyLoadFlowParameters (dcLoadFlowParameters , parametersExt , contingencyLoadFlowParameters );
781
+ applyDcContingencyLoadFlowParameters (dcLoadFlowParameters , parametersExt , contingencyLoadFlowParameters , balanceType );
753
782
} else if (parameters instanceof AcLoadFlowParameters acLoadFlowParameters ) {
754
- return applyAcContingencyLoadFlowParameters (acLoadFlowParameters , parametersExt , contingencyLoadFlowParameters );
783
+ applyAcContingencyLoadFlowParameters (acLoadFlowParameters , contingencyLoadFlowParameters , parametersExt , balanceType );
755
784
} else {
756
785
LOGGER .error ("Unsupported load flow parameters type {} to apply contingency parameters" , parameters .getClass ());
757
786
}
758
787
}
759
- return p -> { };
760
788
}
761
789
762
- private Consumer <P > applyAcContingencyLoadFlowParameters (AcLoadFlowParameters acLoadFlowParameters , OpenLoadFlowParameters parametersExt , ContingencyLoadFlowParameters contingencyLoadFlowParameters ) {
763
- List <AcOuterLoop > oldOuterLoops = acLoadFlowParameters .getOuterLoops ();
764
- List <AcOuterLoop > newOuterLoops = new ArrayList <>(oldOuterLoops .stream ().filter (o -> !(o instanceof AcActivePowerDistributionOuterLoop )).toList ());
765
- if (contingencyLoadFlowParameters .isAreaInterchangeControl ()) {
766
- AcAreaInterchangeControlOuterLoop outerLoop = AcAreaInterchangeControlOuterLoop .create (contingencyLoadFlowParameters .getBalanceType (), parametersExt .isLoadPowerFactorConstant (), parametersExt .isUseActiveLimits (),
767
- parametersExt .getSlackBusPMaxMismatch (), parametersExt .getAreaInterchangePMaxMismatch ());
768
- newOuterLoops .add (outerLoop );
769
- } else if (contingencyLoadFlowParameters .isDistributedSlack ()) {
770
- DistributedSlackOuterLoop outerLoop = DistributedSlackOuterLoop .create (contingencyLoadFlowParameters .getBalanceType (), parametersExt .isLoadPowerFactorConstant (), parametersExt .isUseActiveLimits (),
771
- parametersExt .getSlackBusPMaxMismatch ());
790
+ private void applyAcContingencyLoadFlowParameters (AcLoadFlowParameters acLoadFlowParameters , ContingencyLoadFlowParameters contingencyLoadFlowParameters , OpenLoadFlowParameters parametersExt , LoadFlowParameters .BalanceType balanceType ) {
791
+ boolean createAreaInterchangeControl = contingencyLoadFlowParameters .isAreaInterchangeControl ().orElse (false );
792
+ boolean createDistributedSlack = contingencyLoadFlowParameters .isDistributedSlack ().orElse (false );
793
+ if (createAreaInterchangeControl || createDistributedSlack ) {
794
+ List <AcOuterLoop > newOuterLoops = new ArrayList <>(acLoadFlowParameters .getOuterLoops ().stream ().filter (o -> !(o instanceof AcActivePowerDistributionOuterLoop )).toList ());
795
+ AcOuterLoop outerLoop ;
796
+ if (createAreaInterchangeControl ) {
797
+ outerLoop = AcAreaInterchangeControlOuterLoop .create (balanceType , parametersExt .isLoadPowerFactorConstant (), parametersExt .isUseActiveLimits (),
798
+ parametersExt .getSlackBusPMaxMismatch (), parametersExt .getAreaInterchangePMaxMismatch ());
799
+ } else {
800
+ outerLoop = DistributedSlackOuterLoop .create (balanceType , parametersExt .isLoadPowerFactorConstant (), parametersExt .isUseActiveLimits (),
801
+ parametersExt .getSlackBusPMaxMismatch ());
802
+ }
772
803
newOuterLoops .add (outerLoop );
804
+ acLoadFlowParameters .setOuterLoops (newOuterLoops );
773
805
}
774
-
775
- acLoadFlowParameters .setOuterLoops (newOuterLoops );
776
- return p -> ((AcLoadFlowParameters ) p ).setOuterLoops (oldOuterLoops );
777
806
}
778
807
779
- private Consumer <P > applyDcContingencyLoadFlowParameters (DcLoadFlowParameters dcLoadFlowParameters , OpenLoadFlowParameters parametersExt , ContingencyLoadFlowParameters contingencyLoadFlowParameters ) {
780
- boolean oldDistributedSlack = dcLoadFlowParameters .isDistributedSlack ();
781
- List <DcOuterLoop > oldOuterLoops = dcLoadFlowParameters .getOuterLoops ();
782
-
783
- List <DcOuterLoop > newOuterLoops = new ArrayList <>(oldOuterLoops .stream ().filter (o -> !(o instanceof DcAreaInterchangeControlOuterLoop )).toList ());
784
- if (contingencyLoadFlowParameters .isAreaInterchangeControl ()) {
785
- DcAreaInterchangeControlOuterLoop outerLoop = DcAreaInterchangeControlOuterLoop .create (contingencyLoadFlowParameters .getBalanceType (), parametersExt .isLoadPowerFactorConstant (), parametersExt .isUseActiveLimits (),
808
+ private void applyDcContingencyLoadFlowParameters (DcLoadFlowParameters dcLoadFlowParameters , OpenLoadFlowParameters parametersExt , ContingencyLoadFlowParameters contingencyLoadFlowParameters , LoadFlowParameters .BalanceType balanceType ) {
809
+ if (contingencyLoadFlowParameters .isAreaInterchangeControl ().orElse (false )) {
810
+ List <DcOuterLoop > newOuterLoops = new ArrayList <>(dcLoadFlowParameters .getOuterLoops ().stream ().filter (o -> !(o instanceof DcAreaInterchangeControlOuterLoop )).toList ());
811
+ DcAreaInterchangeControlOuterLoop outerLoop = DcAreaInterchangeControlOuterLoop .create (balanceType , parametersExt .isLoadPowerFactorConstant (), parametersExt .isUseActiveLimits (),
786
812
parametersExt .getSlackBusPMaxMismatch (), parametersExt .getAreaInterchangePMaxMismatch ());
787
813
newOuterLoops .add (outerLoop );
814
+ dcLoadFlowParameters .setOuterLoops (newOuterLoops );
788
815
}
789
- dcLoadFlowParameters .setDistributedSlack (contingencyLoadFlowParameters .isDistributedSlack ());
790
- dcLoadFlowParameters .setBalanceType (contingencyLoadFlowParameters .getBalanceType ());
791
- dcLoadFlowParameters .setOuterLoops (newOuterLoops );
792
- return p -> {
793
- ((DcLoadFlowParameters ) p ).setDistributedSlack (oldDistributedSlack );
794
- ((DcLoadFlowParameters ) p ).setOuterLoops (oldOuterLoops );
795
- };
816
+ contingencyLoadFlowParameters .isDistributedSlack ().ifPresent (dcLoadFlowParameters ::setDistributedSlack );
817
+ dcLoadFlowParameters .setBalanceType (balanceType );
796
818
}
797
819
798
820
private Optional <OperatorStrategyResult > runActionSimulation (LfNetwork network , C context , OperatorStrategy operatorStrategy ,
0 commit comments