Skip to content

Commit a455e09

Browse files
authored
DC sensitivity analysis: remove factors in connectivity break analysis (#1073)
Signed-off-by: p-arvy <[email protected]>
1 parent c3d6ae7 commit a455e09

File tree

2 files changed

+22
-27
lines changed

2 files changed

+22
-27
lines changed

src/main/java/com/powsybl/openloadflow/sensi/ConnectivityBreakAnalysis.java

+10-20
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import com.powsybl.openloadflow.network.LfBus;
2424
import com.powsybl.openloadflow.network.LfNetwork;
2525
import com.powsybl.openloadflow.network.impl.PropagatedContingency;
26-
import com.powsybl.sensitivity.SensitivityAnalysisResult;
27-
import com.powsybl.sensitivity.SensitivityResultWriter;
2826
import org.slf4j.Logger;
2927
import org.slf4j.LoggerFactory;
3028

@@ -136,10 +134,9 @@ private static boolean isGroupOfElementsBreakingConnectivity(LfNetwork lfNetwork
136134
return false;
137135
}
138136

139-
private static List<ConnectivityAnalysisResult> computeConnectivityData(LfNetwork lfNetwork, AbstractSensitivityAnalysis.SensitivityFactorHolder<DcVariableType, DcEquationType> factorHolder,
140-
List<PropagatedContingency> potentiallyBreakingConnectivityContingencies, Map<String, ComputedContingencyElement> contingencyElementByBranch,
141-
List<PropagatedContingency> nonBreakingConnectivityContingencies,
142-
SensitivityResultWriter resultWriter) {
137+
private static List<ConnectivityAnalysisResult> computeConnectivityData(LfNetwork lfNetwork, List<PropagatedContingency> potentiallyBreakingConnectivityContingencies,
138+
Map<String, ComputedContingencyElement> contingencyElementByBranch,
139+
List<PropagatedContingency> nonBreakingConnectivityContingencies) {
143140
if (potentiallyBreakingConnectivityContingencies.isEmpty()) {
144141
return Collections.emptyList();
145142
}
@@ -165,16 +162,10 @@ private static List<ConnectivityAnalysisResult> computeConnectivityData(LfNetwor
165162
nonBreakingConnectivityContingencies.add(contingency);
166163
} else {
167164
// only compute for factors that have to be computed for this contingency lost
168-
List<AbstractSensitivityAnalysis.LfSensitivityFactor<DcVariableType, DcEquationType>> lfFactors = factorHolder.getFactorsForContingencies(List.of(contingency.getContingency().getId()));
169-
if (!lfFactors.isEmpty()) {
170-
Set<String> elementsToReconnect = computeElementsToReconnect(connectivity, breakingConnectivityElements);
171-
ConnectivityAnalysisResult connectivityAnalysisResult = new ConnectivityAnalysisResult(elementsToReconnect, connectivity, lfNetwork);
172-
connectivityAnalysisResult.setPropagatedContingency(contingency);
173-
connectivityAnalysisResults.add(connectivityAnalysisResult);
174-
} else {
175-
// write contingency status
176-
resultWriter.writeContingencyStatus(contingency.getIndex(), SensitivityAnalysisResult.Status.SUCCESS);
177-
}
165+
Set<String> elementsToReconnect = computeElementsToReconnect(connectivity, breakingConnectivityElements);
166+
ConnectivityAnalysisResult connectivityAnalysisResult = new ConnectivityAnalysisResult(elementsToReconnect, connectivity, lfNetwork);
167+
connectivityAnalysisResult.setPropagatedContingency(contingency);
168+
connectivityAnalysisResults.add(connectivityAnalysisResult);
178169
}
179170
} finally {
180171
connectivity.undoTemporaryChanges();
@@ -288,8 +279,7 @@ private static void fillRhsContingency(LfNetwork lfNetwork, EquationSystem<DcVar
288279
}
289280
}
290281

291-
public static ConnectivityBreakAnalysisResults run(DcLoadFlowContext loadFlowContext, AbstractSensitivityAnalysis.SensitivityFactorHolder<DcVariableType, DcEquationType> factorHolder,
292-
List<PropagatedContingency> contingencies, SensitivityResultWriter resultWriter) {
282+
public static ConnectivityBreakAnalysisResults run(DcLoadFlowContext loadFlowContext, List<PropagatedContingency> contingencies) {
293283
// index contingency elements by branch id
294284
Map<String, ComputedContingencyElement> contingencyElementByBranch = createContingencyElementsIndexByBranchId(contingencies, loadFlowContext.getNetwork(), loadFlowContext.getEquationSystem());
295285

@@ -311,8 +301,8 @@ public static ConnectivityBreakAnalysisResults run(DcLoadFlowContext loadFlowCon
311301

312302
// this second method process all contingencies that potentially break connectivity and using graph algorithms
313303
// find remaining contingencies that do not break connectivity
314-
List<ConnectivityAnalysisResult> connectivityAnalysisResults = computeConnectivityData(loadFlowContext.getNetwork(), factorHolder,
315-
potentiallyBreakingConnectivityContingencies, contingencyElementByBranch, nonBreakingConnectivityContingencies, resultWriter);
304+
List<ConnectivityAnalysisResult> connectivityAnalysisResults = computeConnectivityData(loadFlowContext.getNetwork(),
305+
potentiallyBreakingConnectivityContingencies, contingencyElementByBranch, nonBreakingConnectivityContingencies);
316306
LOGGER.info("After graph based connectivity analysis, {} contingencies do not break connectivity, {} contingencies break connectivity",
317307
nonBreakingConnectivityContingencies.size(), connectivityAnalysisResults.size());
318308

src/main/java/com/powsybl/openloadflow/sensi/DcSensitivityAnalysis.java

+12-7
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,6 @@ private void calculateSensitivityValuesForAContingency(DcLoadFlowContext loadFlo
244244
Set<LfBus> disabledBuses, List<ParticipatingElement> participatingElements, Set<String> elementsToReconnect,
245245
SensitivityResultWriter resultWriter, ReportNode reportNode, Set<LfBranch> partialDisabledBranches, boolean rhsChangedAfterConnectivityBreak) {
246246
List<LfSensitivityFactor<DcVariableType, DcEquationType>> factors = validFactorHolder.getFactorsForContingency(contingency.getContingency().getId());
247-
if (factors.isEmpty()) {
248-
// no factor no more computation
249-
resultWriter.writeContingencyStatus(contingency.getIndex(), SensitivityAnalysisResult.Status.SUCCESS);
250-
return;
251-
}
252-
253247
List<ComputedContingencyElement> contingencyElements = contingency.getBranchIdsToOpen().keySet().stream()
254248
.filter(element -> !elementsToReconnect.contains(element))
255249
.map(contingencyElementByBranch::get)
@@ -545,8 +539,19 @@ public void analyse(Network network, List<PropagatedContingency> contingencies,
545539
// calculate sensitivity values for pre-contingency network
546540
calculateSensitivityValues(validFactorHolder.getFactorsForBaseNetwork(), factorsStates, flowStates, null, resultWriter, new DisabledNetwork());
547541

542+
// filter contingencies without factors
543+
List<PropagatedContingency> contingenciesWithFactors = new ArrayList<>();
544+
contingencies.forEach(contingency -> {
545+
List<AbstractSensitivityAnalysis.LfSensitivityFactor<DcVariableType, DcEquationType>> lfFactors = validFactorHolder.getFactorsForContingencies(List.of(contingency.getContingency().getId()));
546+
if (!lfFactors.isEmpty()) {
547+
contingenciesWithFactors.add(contingency);
548+
} else {
549+
resultWriter.writeContingencyStatus(contingency.getIndex(), SensitivityAnalysisResult.Status.SUCCESS);
550+
}
551+
});
552+
548553
// compute states with +1 -1 to model the contingencies and run connectivity analysis
549-
ConnectivityBreakAnalysis.ConnectivityBreakAnalysisResults connectivityBreakAnalysisResults = ConnectivityBreakAnalysis.run(loadFlowContext, validFactorHolder, contingencies, resultWriter);
554+
ConnectivityBreakAnalysis.ConnectivityBreakAnalysisResults connectivityBreakAnalysisResults = ConnectivityBreakAnalysis.run(loadFlowContext, contingenciesWithFactors);
550555

551556
LOGGER.info("Processing contingencies with no connectivity break");
552557

0 commit comments

Comments
 (0)