Skip to content

Commit 3cf9f83

Browse files
committed
refactor contingency lf params reset
Signed-off-by: vmouradian <valentin.mouradian@artelys.com>
1 parent f7060d1 commit 3cf9f83

File tree

1 file changed

+59
-37
lines changed

1 file changed

+59
-37
lines changed

src/main/java/com/powsybl/openloadflow/sa/AbstractSecurityAnalysis.java

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,14 @@ protected static void findAllBranchesToClose(Network network, List<Action> actio
615615
}
616616

617617
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());
622626
activePowerDistribution.run(network, mismatch);
623627
}
624628
}
@@ -671,6 +675,9 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
671675
// save base state for later restoration after each contingency
672676
NetworkState networkState = NetworkState.save(lfNetwork);
673677

678+
// Create consumer to reset parameters if they are modified for a contingency
679+
Consumer<P> parametersResetter = createParametersResetter(acParameters);
680+
674681
// start a simulation for each of the contingency
675682
Iterator<PropagatedContingency> contingencyIt = propagatedContingencies.iterator();
676683
while (contingencyIt.hasNext() && !Thread.currentThread().isInterrupted()) {
@@ -681,7 +688,7 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
681688
lfNetwork.setReportNode(postContSimReportNode);
682689

683690
ContingencyLoadFlowParameters contingencyLoadFlowParameters = propagatedContingency.getContingency().getExtension(ContingencyLoadFlowParameters.class);
684-
Consumer<P> parametersResetter = applyContingencyParameters(context.getParameters(), contingencyLoadFlowParameters, openLoadFlowParameters);
691+
applyContingencyParameters(context.getParameters(), contingencyLoadFlowParameters, loadFlowParameters, openLoadFlowParameters);
685692

686693
lfContingency.apply(loadFlowParameters.getBalanceType());
687694

@@ -727,10 +734,13 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
727734
}
728735
}
729736
}
730-
parametersResetter.accept(context.getParameters());
731737
if (contingencyIt.hasNext()) {
732738
// restore base state
733739
networkState.restore();
740+
if (contingencyLoadFlowParameters != null) {
741+
// reset parameters
742+
parametersResetter.accept(context.getParameters());
743+
}
734744
}
735745
});
736746
}
@@ -746,53 +756,65 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
746756
}
747757
}
748758

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) {
750778
if (contingencyLoadFlowParameters != null) {
779+
LoadFlowParameters.BalanceType balanceType = contingencyLoadFlowParameters.getBalanceType().orElse(loadFlowParameters.getBalanceType());
751780
if (parameters instanceof DcLoadFlowParameters dcLoadFlowParameters) {
752-
return applyDcContingencyLoadFlowParameters(dcLoadFlowParameters, parametersExt, contingencyLoadFlowParameters);
781+
applyDcContingencyLoadFlowParameters(dcLoadFlowParameters, parametersExt, contingencyLoadFlowParameters, balanceType);
753782
} else if (parameters instanceof AcLoadFlowParameters acLoadFlowParameters) {
754-
return applyAcContingencyLoadFlowParameters(acLoadFlowParameters, parametersExt, contingencyLoadFlowParameters);
783+
applyAcContingencyLoadFlowParameters(acLoadFlowParameters, contingencyLoadFlowParameters, parametersExt, balanceType);
755784
} else {
756785
LOGGER.error("Unsupported load flow parameters type {} to apply contingency parameters", parameters.getClass());
757786
}
758787
}
759-
return p -> { };
760788
}
761789

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+
}
772803
newOuterLoops.add(outerLoop);
804+
acLoadFlowParameters.setOuterLoops(newOuterLoops);
773805
}
774-
775-
acLoadFlowParameters.setOuterLoops(newOuterLoops);
776-
return p -> ((AcLoadFlowParameters) p).setOuterLoops(oldOuterLoops);
777806
}
778807

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(),
786812
parametersExt.getSlackBusPMaxMismatch(), parametersExt.getAreaInterchangePMaxMismatch());
787813
newOuterLoops.add(outerLoop);
814+
dcLoadFlowParameters.setOuterLoops(newOuterLoops);
788815
}
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);
796818
}
797819

798820
private Optional<OperatorStrategyResult> runActionSimulation(LfNetwork network, C context, OperatorStrategy operatorStrategy,

0 commit comments

Comments
 (0)