Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support of switch contingency in sensitivity analysis and refactoring #580

Merged
merged 30 commits into from
Sep 14, 2022
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
4b0c22c
Use breakers boolean for sensi.
annetill Jul 7, 2022
8ffa42c
Renaming.
annetill Jul 7, 2022
7ededd9
Unify.
annetill Jul 7, 2022
0a4d625
Introduce contingency propagation parameter.
annetill Jul 7, 2022
0137d82
Save work.
annetill Jul 7, 2022
c04c4e9
Adapt tests.
annetill Jul 8, 2022
023f897
Fix code smells and refactorings.
annetill Jul 8, 2022
cbf30ab
Revert "Introduce contingency propagation parameter."
annetill Aug 16, 2022
0c44bdb
Support of switch contingency in sensitivity analysis.
annetill Aug 16, 2022
742a34c
Merge.
annetill Aug 16, 2022
327fec0
Add unit test.
annetill Aug 17, 2022
421acd7
Merge branch 'main' into contingency-propagation-sensi
annetill Aug 18, 2022
ae5244f
Merge branch 'main' into contingency-propagation-sensi
annetill Sep 1, 2022
c48107d
Merge branch 'main' into contingency-propagation-sensi
annetill Sep 2, 2022
076a2f0
Merge.
annetill Sep 8, 2022
30dbae0
Clean.
annetill Sep 8, 2022
4403e36
Add unit test.
annetill Sep 8, 2022
87fe441
Fix.
annetill Sep 8, 2022
325487e
Trial.
annetill Sep 8, 2022
c9fcb09
Merge branch 'main' into contingency-propagation-sensi
annetill Sep 9, 2022
5077022
Refactor
geofjamg Sep 9, 2022
0854056
Fix.
annetill Sep 9, 2022
9087bf7
Merge branch 'contingency-propagation-sensi' of https://github.com/po…
annetill Sep 9, 2022
e0cc1b1
Add unit test.
annetill Sep 9, 2022
90abe52
Clean
geofjamg Sep 14, 2022
46e3af3
Merge branch 'main' into contingency-propagation-sensi
geofjamg Sep 14, 2022
686c244
Fix
geofjamg Sep 14, 2022
17d3ccc
Merge branch 'main' into contingency-propagation-sensi
annetill Sep 14, 2022
96cbec5
Refactoring.
annetill Sep 14, 2022
505c3ee
Try to fix code smells.
annetill Sep 14, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/main/java/com/powsybl/openloadflow/network/LfBus.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
import com.powsybl.openloadflow.util.Evaluable;
import com.powsybl.security.results.BusResult;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
Expand Down Expand Up @@ -151,7 +149,9 @@ default boolean isParticipating() {
return false;
}

BusResult createBusResult();
default List<BusResult> createBusResults() {
return Collections.emptyList();
}

/**
* Find bus + parallel branches neighbors.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import com.powsybl.openloadflow.network.*;
import com.powsybl.openloadflow.util.Evaluable;
import com.powsybl.openloadflow.util.PerUnit;
import com.powsybl.security.results.BusResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -542,11 +541,6 @@ public Evaluable getQ() {
return q;
}

@Override
public BusResult createBusResult() {
return new BusResult(getVoltageLevelId(), getId(), v, getAngle());
}

@Override
public Map<LfBus, List<LfBranch>> findNeighbors() {
Map<LfBus, List<LfBranch>> neighbors = new LinkedHashMap<>(branches.size());
Expand Down
24 changes: 21 additions & 3 deletions src/main/java/com/powsybl/openloadflow/network/impl/LfBusImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
import com.powsybl.iidm.network.Bus;
import com.powsybl.iidm.network.extensions.SlackTerminal;
import com.powsybl.openloadflow.network.LfNetwork;
import com.powsybl.security.results.BusResult;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
Expand All @@ -27,18 +30,23 @@ public class LfBusImpl extends AbstractLfBus {

private final boolean participating;

protected LfBusImpl(Bus bus, LfNetwork network, double v, double angle, boolean distributedOnConformLoad, boolean participating) {
private final boolean breakers;

protected LfBusImpl(Bus bus, LfNetwork network, double v, double angle, boolean distributedOnConformLoad,
boolean participating, boolean breakers) {
super(network, v, angle, distributedOnConformLoad);
this.bus = bus;
nominalV = bus.getVoltageLevel().getNominalV();
lowVoltageLimit = bus.getVoltageLevel().getLowVoltageLimit();
highVoltageLimit = bus.getVoltageLevel().getHighVoltageLimit();
this.participating = participating;
this.breakers = breakers;
}

public static LfBusImpl create(Bus bus, LfNetwork network, boolean distributedOnConformLoad, boolean participating) {
public static LfBusImpl create(Bus bus, LfNetwork network, boolean distributedOnConformLoad, boolean participating,
boolean breakers) {
Objects.requireNonNull(bus);
return new LfBusImpl(bus, network, bus.getV(), bus.getAngle(), distributedOnConformLoad, participating);
return new LfBusImpl(bus, network, bus.getV(), bus.getAngle(), distributedOnConformLoad, participating, breakers);
}

@Override
Expand Down Expand Up @@ -87,4 +95,14 @@ public void updateState(boolean reactiveLimits, boolean writeSlackBus, boolean d
public boolean isParticipating() {
return participating;
}

@Override
public List<BusResult> createBusResults() {
if (breakers) {
return List.of(new BusResult(getVoltageLevelId(), bus.getId(), v, getAngle()));
} else {
return bus.getVoltageLevel().getBusBreakerView().getBusesFromBusViewBusId(bus.getId())
.stream().map(b -> new BusResult(getVoltageLevelId(), b.getId(), v, getAngle())).collect(Collectors.toList());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ private static Bus getBus(Terminal terminal, boolean breakers) {

private static LfBusImpl createBus(Bus bus, LfNetworkParameters parameters, LfNetwork lfNetwork, LoadingContext loadingContext,
LfNetworkLoadingReport report, List<LfNetworkLoaderPostProcessor> postProcessors) {
LfBusImpl lfBus = LfBusImpl.create(bus, lfNetwork, parameters.isDistributedOnConformLoad(), participateToSlackDistribution(parameters, bus));
LfBusImpl lfBus = LfBusImpl.create(bus, lfNetwork, parameters.isDistributedOnConformLoad(), participateToSlackDistribution(parameters, bus), parameters.isBreakers());

List<ShuntCompensator> shuntCompensators = new ArrayList<>();

Expand Down
20 changes: 20 additions & 0 deletions src/main/java/com/powsybl/openloadflow/network/impl/Networks.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
Expand Down Expand Up @@ -111,4 +113,22 @@ public static List<LfNetwork> load(Network network, SlackBusSelector slackBusSel
public static List<LfNetwork> load(Network network, LfNetworkParameters parameters, Reporter reporter) {
return LfNetwork.load(network, new LfNetworkLoaderImpl(), parameters, reporter);
}

public static List<LfNetwork> load(Network network, LfNetworkParameters networkParameters,
Set<Switch> switchesToOpen, Reporter reporter) {
if (switchesToOpen.isEmpty()) {
return load(network, networkParameters, reporter);
} else {
String tmpVariantId = "olf-tmp-" + UUID.randomUUID();
network.getVariantManager().cloneVariant(network.getVariantManager().getWorkingVariantId(), tmpVariantId);
try {
network.getSwitchStream().filter(sw -> sw.getVoltageLevel().getTopologyKind() == TopologyKind.NODE_BREAKER)
.forEach(sw -> sw.setRetained(false));
switchesToOpen.forEach(sw -> sw.setRetained(true));
return load(network, networkParameters, reporter);
} finally {
network.getVariantManager().removeVariant(tmpVariantId);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -103,36 +103,23 @@ private static PowerShift getLoadPowerShift(Load load, boolean slackDistribution
load.getQ0() / PerUnit.SB);
}

public static List<PropagatedContingency> createListForSensitivityAnalysis(Network network, List<Contingency> contingencies,
boolean slackDistributionOnConformLoad, boolean hvdcAcEmulation) {
List<PropagatedContingency> propagatedContingencies = new ArrayList<>();
for (int index = 0; index < contingencies.size(); index++) {
Contingency contingency = contingencies.get(index);
PropagatedContingency propagatedContingency = PropagatedContingency.create(network, contingency, index, false, false,
slackDistributionOnConformLoad, hvdcAcEmulation, false);
propagatedContingencies.add(propagatedContingency);
}
return propagatedContingencies;
}

public static List<PropagatedContingency> createListForSecurityAnalysis(Network network, List<Contingency> contingencies,
Set<Switch> allSwitchesToOpen, boolean shuntCompensatorVoltageControlOn,
boolean slackDistributionOnConformLoad, boolean hvdcAcEmulation,
boolean contingencyPropagation) {
public static List<PropagatedContingency> createList(Network network, List<Contingency> contingencies,
Set<Switch> allSwitchesToOpen, boolean shuntCompensatorVoltageControlOn,
boolean slackDistributionOnConformLoad, boolean hvdcAcEmulation,
boolean contingencyPropagation) {
List<PropagatedContingency> propagatedContingencies = new ArrayList<>();
for (int index = 0; index < contingencies.size(); index++) {
Contingency contingency = contingencies.get(index);
PropagatedContingency propagatedContingency =
PropagatedContingency.create(network, contingency, index, shuntCompensatorVoltageControlOn, true, slackDistributionOnConformLoad, hvdcAcEmulation, contingencyPropagation);
PropagatedContingency.create(network, contingency, index, shuntCompensatorVoltageControlOn, slackDistributionOnConformLoad, hvdcAcEmulation, contingencyPropagation);
propagatedContingencies.add(propagatedContingency);
allSwitchesToOpen.addAll(propagatedContingency.switchesToOpen);
}
return propagatedContingencies;
}

private static PropagatedContingency create(Network network, Contingency contingency, int index, boolean shuntCompensatorVoltageControlOn,
boolean withBreakers, boolean slackDistributionOnConformLoad, boolean hvdcAcEmulation,
boolean contingencyPropagation) {
boolean slackDistributionOnConformLoad, boolean hvdcAcEmulation, boolean contingencyPropagation) {
Set<Switch> switchesToOpen = new HashSet<>();
Set<Terminal> terminalsToDisconnect = new HashSet<>();

Expand All @@ -148,6 +135,8 @@ private static PropagatedContingency create(Network network, Contingency conting
}
}

boolean breakers = !switchesToOpen.isEmpty();

Set<String> branchIdsToOpen = new LinkedHashSet<>();
Set<String> hvdcIdsToOpen = new HashSet<>();
Set<String> generatorIdsToLose = new HashSet<>();
Expand All @@ -170,7 +159,7 @@ private static PropagatedContingency create(Network network, Contingency conting

case LOAD:
Load load = (Load) connectable;
addPowerShift(load.getTerminal(), loadIdsToShift, getLoadPowerShift(load, slackDistributionOnConformLoad), withBreakers);
addPowerShift(load.getTerminal(), loadIdsToShift, getLoadPowerShift(load, slackDistributionOnConformLoad), breakers);
break;

case SHUNT_COMPENSATOR:
Expand All @@ -195,7 +184,7 @@ private static PropagatedContingency create(Network network, Contingency conting
LccConverterStation lcc = (LccConverterStation) connectable;
PowerShift lccPowerShift = new PowerShift(HvdcConverterStations.getConverterStationTargetP(lcc) / PerUnit.SB, 0,
HvdcConverterStations.getLccConverterStationLoadTargetQ(lcc) / PerUnit.SB);
addPowerShift(lcc.getTerminal(), loadIdsToShift, lccPowerShift, withBreakers);
addPowerShift(lcc.getTerminal(), loadIdsToShift, lccPowerShift, breakers);
}
break;

Expand All @@ -219,8 +208,8 @@ private static PropagatedContingency create(Network network, Contingency conting
generatorIdsToLose, loadIdsToShift, shuntIdsToShift);
}

private static void addPowerShift(Terminal terminal, Map<String, PowerShift> loadIdsToShift, PowerShift powerShift, boolean withBreakers) {
Bus bus = withBreakers ? terminal.getBusBreakerView().getBus() : terminal.getBusView().getBus();
private static void addPowerShift(Terminal terminal, Map<String, PowerShift> loadIdsToShift, PowerShift powerShift, boolean breakers) {
Bus bus = breakers ? terminal.getBusBreakerView().getBus() : terminal.getBusView().getBus();
if (bus != null) {
loadIdsToShift.computeIfAbsent(bus.getId(), k -> new PowerShift()).add(powerShift);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ protected void addResults(StateMonitor monitor, Consumer<LfBranch> branchConsume
network.getBuses().stream()
.filter(lfBus -> monitor.getVoltageLevelIds().contains(lfBus.getVoltageLevelId()))
.filter(lfBus -> !lfBus.isDisabled())
.forEach(lfBus -> busResults.add(lfBus.createBusResult()));
.forEach(lfBus -> busResults.addAll(lfBus.createBusResults()));
}

if (!monitor.getThreeWindingsTransformerIds().isEmpty()) {
Expand Down
34 changes: 10 additions & 24 deletions src/main/java/com/powsybl/openloadflow/sa/AcSecurityAnalysis.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import com.powsybl.contingency.Contingency;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.Switch;
import com.powsybl.iidm.network.TopologyKind;
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.math.matrix.MatrixFactory;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
Expand All @@ -39,6 +38,9 @@
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
*/
public class AcSecurityAnalysis extends AbstractSecurityAnalysis {

protected AcSecurityAnalysis(Network network, MatrixFactory matrixFactory, GraphConnectivityFactory<LfBus, LfBranch> connectivityFactory,
Expand Down Expand Up @@ -69,14 +71,16 @@ SecurityAnalysisReport runSync(String workingVariantId, SecurityAnalysisParamete

// try to find all switches impacted by at least one contingency and for each contingency the branches impacted
Set<Switch> allSwitchesToOpen = new HashSet<>();
List<PropagatedContingency> propagatedContingencies = PropagatedContingency.createListForSecurityAnalysis(network, contingencies, allSwitchesToOpen,
List<PropagatedContingency> propagatedContingencies = PropagatedContingency.createList(network, contingencies, allSwitchesToOpen,
lfParameters.isShuntCompensatorVoltageControlOn(), lfParameters.getBalanceType() == LoadFlowParameters.BalanceType.PROPORTIONAL_TO_CONFORM_LOAD,
lfParameters.isHvdcAcEmulation(), securityAnalysisParametersExt.isContingencyPropagation());

AcLoadFlowParameters acParameters = OpenLoadFlowParameters.createAcParameters(network, lfParameters, lfParametersExt, matrixFactory, connectivityFactory, saReporter, true, false);
boolean breakers = !allSwitchesToOpen.isEmpty();

AcLoadFlowParameters acParameters = OpenLoadFlowParameters.createAcParameters(network, lfParameters, lfParametersExt, matrixFactory, connectivityFactory, saReporter, breakers, false);

// create networks including all necessary switches
List<LfNetwork> lfNetworks = createNetworks(allSwitchesToOpen, acParameters.getNetworkParameters(), saReporter);
List<LfNetwork> lfNetworks = Networks.load(network, acParameters.getNetworkParameters(), allSwitchesToOpen, saReporter);

// run simulation on largest network
SecurityAnalysisResult result;
Expand All @@ -98,22 +102,6 @@ SecurityAnalysisReport runSync(String workingVariantId, SecurityAnalysisParamete
return new SecurityAnalysisReport(result);
}

List<LfNetwork> createNetworks(Set<Switch> allSwitchesToOpen, LfNetworkParameters networkParameters,
Reporter saReporter) {
List<LfNetwork> lfNetworks;
String tmpVariantId = "olf-tmp-" + UUID.randomUUID();
network.getVariantManager().cloneVariant(network.getVariantManager().getWorkingVariantId(), tmpVariantId);
try {
network.getSwitchStream().filter(sw -> sw.getVoltageLevel().getTopologyKind() == TopologyKind.NODE_BREAKER)
.forEach(sw -> sw.setRetained(false));
allSwitchesToOpen.forEach(sw -> sw.setRetained(true));
lfNetworks = Networks.load(network, networkParameters, saReporter);
} finally {
network.getVariantManager().removeVariant(tmpVariantId);
}
return lfNetworks;
}

public static void distributedMismatch(LfNetwork network, double mismatch, LoadFlowParameters loadFlowParameters,
OpenLoadFlowParameters openLoadFlowParameters) {
if (loadFlowParameters.isDistributedSlack() && Math.abs(mismatch) > 0) {
Expand Down Expand Up @@ -181,8 +169,7 @@ private SecurityAnalysisResult runSimulations(LfNetwork network, List<Propagated
}
}

return new SecurityAnalysisResult(new LimitViolationsResult(preContingencyComputationOk,
preContingencyLimitViolationManager.getLimitViolations()),
return new SecurityAnalysisResult(new LimitViolationsResult(preContingencyComputationOk, preContingencyLimitViolationManager.getLimitViolations()),
postContingencyResults,
preContingencyNetworkResult.getBranchResults(),
preContingencyNetworkResult.getBusResults(),
Expand Down Expand Up @@ -224,8 +211,7 @@ private PostContingencyResult runPostContingencySimulation(LfNetwork network, Ac
network, stopwatch.elapsed(TimeUnit.MILLISECONDS));

return new PostContingencyResult(contingency,
new LimitViolationsResult(postContingencyComputationOk,
postContingencyLimitViolationManager.getLimitViolations()),
new LimitViolationsResult(postContingencyComputationOk, postContingencyLimitViolationManager.getLimitViolations()),
postContingencyNetworkResult.getBranchResults(),
postContingencyNetworkResult.getBusResults(),
postContingencyNetworkResult.getThreeWindingsTransformerResults());
Expand Down
Loading