Skip to content

Commit

Permalink
use outerloop config
Browse files Browse the repository at this point in the history
Signed-off-by: vmouradian <valentin.mouradian@artelys.com>
  • Loading branch information
vmouradian committed Jan 27, 2025
1 parent b0f62a4 commit 9ad5082
Show file tree
Hide file tree
Showing 12 changed files with 158 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.ac.outerloop.*;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;
import com.powsybl.openloadflow.util.PerUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -27,17 +28,17 @@ public abstract class AbstractAcOuterLoopConfig implements AcOuterLoopConfig {
protected AbstractAcOuterLoopConfig() {
}

protected static Optional<AcOuterLoop> createDistributedSlackOuterLoop(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
if (parameters.isDistributedSlack()) {
return Optional.of(DistributedSlackOuterLoop.create(parameters.getBalanceType(), parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits(),
protected static Optional<AcOuterLoop> createDistributedSlackOuterLoop(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
if (contingencyParameters.isDistributedSlack(parameters)) {
return Optional.of(DistributedSlackOuterLoop.create(contingencyParameters.getBalanceType(parameters), parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits(),
parametersExt.getSlackBusPMaxMismatch()));
}
return Optional.empty();
}

protected static Optional<AcOuterLoop> createAreaInterchangeControlOuterLoop(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
if (parametersExt.isAreaInterchangeControl()) {
return Optional.of(AcAreaInterchangeControlOuterLoop.create(parameters.getBalanceType(), parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits(),
protected static Optional<AcOuterLoop> createAreaInterchangeControlOuterLoop(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
if (contingencyParameters.isAreaInterchangeControl(parametersExt)) {
return Optional.of(AcAreaInterchangeControlOuterLoop.create(contingencyParameters.getBalanceType(parameters), parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits(),
parametersExt.getSlackBusPMaxMismatch(), parametersExt.getAreaInterchangePMaxMismatch()));
}
return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.powsybl.openloadflow.dc.DcIncrementalPhaseControlOuterLoop;
import com.powsybl.openloadflow.dc.DcOuterLoop;
import com.powsybl.openloadflow.network.util.ActivePowerDistribution;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;

import java.util.Optional;

Expand All @@ -24,9 +25,9 @@ abstract class AbstractDcOuterLoopConfig implements DcOuterLoopConfig {
protected AbstractDcOuterLoopConfig() {
}

protected static Optional<DcOuterLoop> createAreaInterchangeControlOuterLoop(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
if (parametersExt.isAreaInterchangeControl()) {
ActivePowerDistribution activePowerDistribution = ActivePowerDistribution.create(parameters.getBalanceType(), parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits());
protected static Optional<DcOuterLoop> createAreaInterchangeControlOuterLoop(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
if (contingencyParameters.isAreaInterchangeControl(parametersExt)) {
ActivePowerDistribution activePowerDistribution = ActivePowerDistribution.create(contingencyParameters.getBalanceType(parameters), parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits());
return Optional.of(new DcAreaInterchangeControlOuterLoop(activePowerDistribution, parametersExt.getSlackBusPMaxMismatch(), parametersExt.getAreaInterchangePMaxMismatch()));
}
return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.ac.outerloop.*;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -21,11 +22,16 @@ public class DefaultAcOuterLoopConfig extends AbstractAcOuterLoopConfig {

@Override
public List<AcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
return configure(parameters, parametersExt, new ContingencyLoadFlowParameters());
}

@Override
public List<AcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
List<AcOuterLoop> outerLoops = new ArrayList<>(5);
// primary frequency control
createDistributedSlackOuterLoop(parameters, parametersExt).ifPresent(outerLoops::add);
createDistributedSlackOuterLoop(parameters, parametersExt, contingencyParameters).ifPresent(outerLoops::add);
// area interchange control
createAreaInterchangeControlOuterLoop(parameters, parametersExt).ifPresent(outerLoops::add);
createAreaInterchangeControlOuterLoop(parameters, parametersExt, contingencyParameters).ifPresent(outerLoops::add);
// secondary voltage control
createSecondaryVoltageControlOuterLoop(parametersExt).ifPresent(outerLoops::add);
// primary voltage control
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.dc.DcOuterLoop;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -21,11 +22,16 @@ public class DefaultDcOuterLoopConfig extends AbstractDcOuterLoopConfig {

@Override
public List<DcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
return configure(parameters, parametersExt, new ContingencyLoadFlowParameters());
}

@Override
public List<DcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
List<DcOuterLoop> outerLoops = new ArrayList<>(2);
// incremental phase control
createIncrementalPhaseControlOuterLoop(parameters).ifPresent(outerLoops::add);
// area interchange control
createAreaInterchangeControlOuterLoop(parameters, parametersExt).ifPresent(outerLoops::add);
createAreaInterchangeControlOuterLoop(parameters, parametersExt, contingencyParameters).ifPresent(outerLoops::add);
return outerLoops;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.powsybl.openloadflow.lf.outerloop.AbstractAreaInterchangeControlOuterLoop;
import com.powsybl.openloadflow.lf.outerloop.AbstractIncrementalPhaseControlOuterLoop;
import com.powsybl.openloadflow.lf.outerloop.OuterLoop;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;

import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -41,11 +42,11 @@ public class ExplicitAcOuterLoopConfig extends AbstractAcOuterLoopConfig {
IncrementalTransformerReactivePowerControlOuterLoop.NAME,
AbstractAreaInterchangeControlOuterLoop.NAME);

private static Optional<AcOuterLoop> createOuterLoop(String name, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
private static Optional<AcOuterLoop> createOuterLoop(String name, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
return switch (name) {
case AbstractIncrementalPhaseControlOuterLoop.NAME -> createPhaseControlOuterLoop(parameters,
OpenLoadFlowParameters.PhaseShifterControlMode.INCREMENTAL);
case DistributedSlackOuterLoop.NAME -> createDistributedSlackOuterLoop(parameters, parametersExt);
case DistributedSlackOuterLoop.NAME -> createDistributedSlackOuterLoop(parameters, parametersExt, contingencyParameters);
case IncrementalShuntVoltageControlOuterLoop.NAME -> createShuntVoltageControlOuterLoop(parameters,
OpenLoadFlowParameters.ShuntVoltageControlMode.INCREMENTAL_VOLTAGE_CONTROL);
case IncrementalTransformerVoltageControlOuterLoop.NAME -> createTransformerVoltageControlOuterLoop(parameters,
Expand All @@ -72,7 +73,7 @@ private static Optional<AcOuterLoop> createOuterLoop(String name, LoadFlowParame
parametersExt.getGeneratorVoltageControlMinNominalVoltage());
case AutomationSystemOuterLoop.NAME -> createAutomationSystemOuterLoop(parametersExt);
case IncrementalTransformerReactivePowerControlOuterLoop.NAME -> createTransformerReactivePowerControlOuterLoop(parametersExt);
case AbstractAreaInterchangeControlOuterLoop.NAME -> createAreaInterchangeControlOuterLoop(parameters, parametersExt);
case AbstractAreaInterchangeControlOuterLoop.NAME -> createAreaInterchangeControlOuterLoop(parameters, parametersExt, contingencyParameters);
default -> throw new PowsyblException("Unknown outer loop '" + name + "' for AC load flow");
};
}
Expand All @@ -90,8 +91,13 @@ private static void checkTypeUnicity(List<AcOuterLoop> outerLoops) {

@Override
public List<AcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
List<AcOuterLoop> outerLoops = Objects.requireNonNull(parametersExt.getOuterLoopNames()).stream()
.flatMap(name -> createOuterLoop(name, parameters, parametersExt).stream())
return configure(parameters, parametersExt, new ContingencyLoadFlowParameters());
}

@Override
public List<AcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
List<AcOuterLoop> outerLoops = Objects.requireNonNull(contingencyParameters.getOuterLoopNames(parametersExt)).stream()
.flatMap(name -> createOuterLoop(name, parameters, parametersExt, contingencyParameters).stream())
.toList();
checkTypeUnicity(outerLoops);
return filterInconsistentOuterLoops(outerLoops);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.powsybl.openloadflow.lf.outerloop.AbstractAreaInterchangeControlOuterLoop;
import com.powsybl.openloadflow.lf.outerloop.AbstractIncrementalPhaseControlOuterLoop;
import com.powsybl.openloadflow.dc.DcOuterLoop;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;

import java.util.List;
import java.util.Objects;
Expand All @@ -26,18 +27,23 @@ public class ExplicitDcOuterLoopConfig extends AbstractDcOuterLoopConfig {
public static final List<String> NAMES = List.of(AbstractIncrementalPhaseControlOuterLoop.NAME,
AbstractAreaInterchangeControlOuterLoop.NAME);

private static Optional<DcOuterLoop> createOuterLoop(String name, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
private static Optional<DcOuterLoop> createOuterLoop(String name, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
return switch (name) {
case AbstractIncrementalPhaseControlOuterLoop.NAME -> createIncrementalPhaseControlOuterLoop(parameters);
case AbstractAreaInterchangeControlOuterLoop.NAME -> createAreaInterchangeControlOuterLoop(parameters, parametersExt);
case AbstractAreaInterchangeControlOuterLoop.NAME -> createAreaInterchangeControlOuterLoop(parameters, parametersExt, contingencyParameters);
default -> throw new PowsyblException("Unknown outer loop '" + name + "' for DC load flow");
};
}

@Override
public List<DcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt) {
return configure(parameters, parametersExt, new ContingencyLoadFlowParameters());
}

@Override
public List<DcOuterLoop> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters) {
return Objects.requireNonNull(parametersExt.getOuterLoopNames()).stream()
.flatMap(name -> createOuterLoop(name, parameters, parametersExt).stream())
.flatMap(name -> createOuterLoop(name, parameters, parametersExt, contingencyParameters).stream())
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.lf.outerloop.OuterLoop;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;
import org.apache.commons.compress.utils.Lists;

import java.util.List;
Expand All @@ -25,6 +26,8 @@
public interface OuterLoopConfig<O extends OuterLoop<?, ?, ?, ?, ?>> {
List<O> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt);

List<O> configure(LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt, ContingencyLoadFlowParameters contingencyParameters);

static <C extends OuterLoopConfig<?>> Optional<C> findOuterLoopConfig(Class<C> configClass) {
List<C> outerLoopConfigs = Lists.newArrayList(ServiceLoader.load(configClass, configClass.getClassLoader()).iterator());
if (outerLoopConfigs.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -755,7 +755,7 @@ protected SecurityAnalysisResult runSimulations(LfNetwork lfNetwork, List<Propag
* Applies the custom parameters that are contained in the ContingencyLoadFlowParameters extension for a specific contingency.
* If the extension is present, modifies the ac/dcLoadFlowParameters contained in the LoadFlowContext accordingly.
*/
protected abstract void applyContingencyParameters(P parameters, ContingencyLoadFlowParameters contingencyLoadFlowParameters, LoadFlowParameters loadFlowParameters, OpenLoadFlowParameters parametersExt);
protected abstract void applyContingencyParameters(P parameters, ContingencyLoadFlowParameters contingencyParameters, LoadFlowParameters loadFlowParameters, OpenLoadFlowParameters openLoadFlowParameters);

private Optional<OperatorStrategyResult> runActionSimulation(LfNetwork network, C context, OperatorStrategy operatorStrategy,
LimitViolationManager preContingencyLimitViolationManager,
Expand Down
34 changes: 8 additions & 26 deletions src/main/java/com/powsybl/openloadflow/sa/AcSecurityAnalysis.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,26 @@
import com.powsybl.iidm.network.Network;
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.math.matrix.MatrixFactory;
import com.powsybl.openloadflow.AbstractAcOuterLoopConfig;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.ac.AcLoadFlowContext;
import com.powsybl.openloadflow.ac.AcLoadFlowParameters;
import com.powsybl.openloadflow.ac.AcLoadFlowResult;
import com.powsybl.openloadflow.ac.AcloadFlowEngine;
import com.powsybl.openloadflow.ac.equations.AcEquationType;
import com.powsybl.openloadflow.ac.equations.AcVariableType;
import com.powsybl.openloadflow.ac.outerloop.AcAreaInterchangeControlOuterLoop;
import com.powsybl.openloadflow.ac.outerloop.AcOuterLoop;
import com.powsybl.openloadflow.ac.outerloop.DistributedSlackOuterLoop;
import com.powsybl.openloadflow.graph.GraphConnectivityFactory;
import com.powsybl.openloadflow.lf.outerloop.OuterLoopStatus;
import com.powsybl.openloadflow.lf.outerloop.config.AcOuterLoopConfig;
import com.powsybl.openloadflow.lf.outerloop.config.DefaultAcOuterLoopConfig;
import com.powsybl.openloadflow.lf.outerloop.config.ExplicitAcOuterLoopConfig;
import com.powsybl.openloadflow.network.*;
import com.powsybl.openloadflow.network.util.PreviousValueVoltageInitializer;
import com.powsybl.openloadflow.sa.extensions.ContingencyLoadFlowParameters;
import com.powsybl.openloadflow.util.Reports;
import com.powsybl.security.PostContingencyComputationStatus;
import com.powsybl.security.monitor.StateMonitor;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

Expand Down Expand Up @@ -127,27 +126,10 @@ protected Consumer<AcLoadFlowParameters> createParametersResetter(AcLoadFlowPara
}

@Override
protected void applyContingencyParameters(AcLoadFlowParameters parameters, ContingencyLoadFlowParameters contingencyLoadFlowParameters, LoadFlowParameters loadFlowParameters, OpenLoadFlowParameters parametersExt) {
contingencyLoadFlowParameters.isAreaInterchangeControl().ifPresent(aic -> {
List<AcOuterLoop> newOuterLoops = new ArrayList<>(parameters.getOuterLoops().stream().filter(o -> !(o instanceof AcAreaInterchangeControlOuterLoop)).toList());
if (Boolean.TRUE.equals(aic)) {
LoadFlowParameters.BalanceType balanceType = contingencyLoadFlowParameters.getBalanceType(loadFlowParameters);
AcAreaInterchangeControlOuterLoop outerLoop = AcAreaInterchangeControlOuterLoop.create(balanceType, parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits(),
parametersExt.getSlackBusPMaxMismatch(), parametersExt.getAreaInterchangePMaxMismatch());
newOuterLoops.add(outerLoop);
}
parameters.setOuterLoops(newOuterLoops);
});
contingencyLoadFlowParameters.isDistributedSlack().ifPresent(distributedSlack -> {
List<AcOuterLoop> newOuterLoops = new ArrayList<>(parameters.getOuterLoops().stream().filter(o -> !(o instanceof DistributedSlackOuterLoop)).toList());
if (Boolean.TRUE.equals(distributedSlack)) {
LoadFlowParameters.BalanceType balanceType = contingencyLoadFlowParameters.getBalanceType(loadFlowParameters);
DistributedSlackOuterLoop outerLoop = DistributedSlackOuterLoop.create(balanceType, parametersExt.isLoadPowerFactorConstant(), parametersExt.isUseActiveLimits(),
parametersExt.getSlackBusPMaxMismatch());
newOuterLoops.add(outerLoop);
}
parameters.setOuterLoops(newOuterLoops);
});
parameters.setOuterLoops(AbstractAcOuterLoopConfig.filterInconsistentOuterLoops(parameters.getOuterLoops()));
protected void applyContingencyParameters(AcLoadFlowParameters parameters, ContingencyLoadFlowParameters contingencyParameters, LoadFlowParameters loadFlowParameters, OpenLoadFlowParameters openLoadFlowParameters) {
AcOuterLoopConfig outerLoopConfig = AcOuterLoopConfig.findOuterLoopConfig()
.orElseGet(() -> contingencyParameters.getOuterLoopNames().isPresent() ? new ExplicitAcOuterLoopConfig()
: new DefaultAcOuterLoopConfig());
parameters.setOuterLoops(outerLoopConfig.configure(loadFlowParameters, openLoadFlowParameters, contingencyParameters));
}
}
Loading

0 comments on commit 9ad5082

Please sign in to comment.