Skip to content

Commit

Permalink
Merge branch 'main' into fix/issue-when-open-branch-as-cnec-post-cont…
Browse files Browse the repository at this point in the history
…ingency
  • Loading branch information
Godelaine authored Feb 10, 2025
2 parents 227d190 + fa3935f commit 1beffb6
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,10 @@ private Object runScenario(PrePerimeterResult prePerimeterSensitivityOutput, boo
boolean autoStateSensiFailed = false;
if (automatonState.isPresent()) {
AutomatonPerimeterResultImpl automatonResult = automatonSimulator.simulateAutomatonState(automatonState.get(), curativeStates, networkClone, stateTree, automatonTreeParameters);
contingencyScenarioResults.put(automatonState.get(), automatonResult);
if (automatonResult.getComputationStatus() == ComputationStatus.FAILURE) {
autoStateSensiFailed = true;
contingencyScenarioResults.put(automatonState.get(), new SkippedOptimizationResultImpl(automatonState.get(), automatonResult.getActivatedNetworkActions(), automatonResult.getActivatedRangeActions(automatonState.get()), ComputationStatus.FAILURE, sensitivityFailureOvercost));
} else {
contingencyScenarioResults.put(automatonState.get(), automatonResult);
preCurativeResult = automatonResult.getPostAutomatonSensitivityAnalysisOutput();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,12 @@ static SystematicSensitivityResult runSensitivity(Network network,
sensitivityComputationParameters), state.getInstant().getOrder());
} catch (Exception e) {
TECHNICAL_LOGS.error(String.format("Systematic sensitivity analysis failed for state %s : %s", state.getId(), e.getMessage()));
result.completeDataWithFailingPerimeter(state.getInstant().getOrder(), optContingency.get().getId());
SensitivityAnalysisResult failedResult = new SensitivityAnalysisResult(
cnecSensitivityProvider.getContingencyFactors(network, contingencyList),
List.of(new SensitivityAnalysisResult.SensitivityContingencyStatus(optContingency.get().getId(), SensitivityAnalysisResult.Status.FAILURE)),
List.of()
);
result.completeData(failedResult, state.getInstant().getOrder());
}
counterForLogs++;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
public class SystematicSensitivityResult {

private static class StateResult {
private SensitivityComputationStatus status;
private SensitivityComputationStatus status = SensitivityComputationStatus.SUCCESS;
private final Map<String, Map<TwoSides, Double>> referenceFlows = new HashMap<>();
private final Map<String, Map<TwoSides, Double>> referenceIntensities = new HashMap<>();
private final Map<String, Map<String, Map<TwoSides, Double>>> flowSensitivities = new HashMap<>();
Expand All @@ -54,6 +54,10 @@ private Map<String, Map<String, Map<TwoSides, Double>>> getFlowSensitivities() {
private Map<String, Map<String, Map<TwoSides, Double>>> getIntensitySensitivities() {
return intensitySensitivities;
}

private boolean isEmpty() {
return referenceFlows.isEmpty() && referenceIntensities.isEmpty() && flowSensitivities.isEmpty() && intensitySensitivities.isEmpty();
}
}

public enum SensitivityComputationStatus {
Expand Down Expand Up @@ -98,24 +102,15 @@ public SystematicSensitivityResult completeData(SensitivityAnalysisResult result
);
postContingencyResults.get(instantOrder).put(contingencyStatus.getContingencyId(), contingencyStateResult);
}

nStateResult.status = this.status;

if (nStateResult.status != SensitivityComputationStatus.FAILURE && anyContingencyFailure) {
if (!results.getPreContingencyValues().isEmpty()) {
nStateResult.status = this.status;
}
if (nStateResult.status != SensitivityComputationStatus.FAILURE && anyContingencyFailure && !nStateResult.isEmpty()) {
this.status = SensitivityComputationStatus.PARTIAL_FAILURE;
}
return this;
}

public SystematicSensitivityResult completeDataWithFailingPerimeter(int instantOrder, String contingencyId) {
this.status = SensitivityComputationStatus.PARTIAL_FAILURE;
StateResult contingencyStateResult = new StateResult();
contingencyStateResult.status = SensitivityComputationStatus.FAILURE;
postContingencyResults.putIfAbsent(instantOrder, new HashMap<>());
postContingencyResults.get(instantOrder).put(contingencyId, contingencyStateResult);
return this;
}

public SystematicSensitivityResult postTreatIntensities() {
postTreatIntensitiesOnState(nStateResult);
postContingencyResults.values().forEach(map -> map.values().forEach(this::postTreatIntensitiesOnState));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ void testPostTreatHvdcInvert() {
}

@Test
// Test case where N succeeds and all N-1 fail
void testPartialContingencyFailures() {
setUpWith12Nodes();

Expand Down Expand Up @@ -373,20 +374,70 @@ void testCurativeResultAtOutageInstant() {
}

@Test
void testCompleteDataWithFailingPerimeter() {
void testCompleteDataWithFailingPerimeterIn2P() {

setUpWith12Nodes();
// When

// A first call to complete data with a sensitivity analysis N and N-1 succeed.
// Simulate the first call to completeData of the sensi computation pre 2P.
SensitivityAnalysisResult sensitivityAnalysisResult = SensitivityAnalysis.find().run(network,
rangeActionSensitivityProvider.getAllFactors(network),
rangeActionSensitivityProvider.getContingencies(network),
new ArrayList<>(),
SensitivityAnalysisParameters.load());

SystematicSensitivityResult result = new SystematicSensitivityResult().completeData(sensitivityAnalysisResult, outageInstantOrder);
assertEquals(SystematicSensitivityResult.SensitivityComputationStatus.SUCCESS, result.getStatus());

result.completeDataWithFailingPerimeter(outageInstantOrder, "Contingency FR1 FR3");
// after computation failure on contingency
// Simulate a second call to completeData during sensitivity computation pre 2P on a state with RAs that failed (a N-1 state fails).
Contingency contingency = new Contingency("contingency", new BranchContingency("branch"));

SensitivityFactor sensitivityFactor1 = new SensitivityFactor(
SensitivityFunctionType.BRANCH_ACTIVE_POWER_1,
"BBE2AA1 FFR3AA1 1",
SensitivityVariableType.TRANSFORMER_PHASE,
"BBE2AA1 BBE3AA1 1",
false,
new ContingencyContext(contingency.getId(), ContingencyContextType.SPECIFIC)
);

sensitivityAnalysisResult = new SensitivityAnalysisResult(
List.of(sensitivityFactor1),
List.of(new SensitivityAnalysisResult.SensitivityContingencyStatus(contingency.getId(), SensitivityAnalysisResult.Status.FAILURE)),
List.of()
);

result.completeData(sensitivityAnalysisResult, outageInstantOrder);

// success in n and a n-1 fails -> PARTIAL_FAILURE
assertEquals(SystematicSensitivityResult.SensitivityComputationStatus.PARTIAL_FAILURE, result.getStatus());
}

@Test
void testFailingCurativePerimeter() {
setUpWith12Nodes();
// Simulate a second call to completeData during sensitivity computation pre 2P on a state with RAs that failed (a N-1 state fails).
Contingency contingency = new Contingency("contingency", new BranchContingency("branch"));

SensitivityFactor sensitivityFactor1 = new SensitivityFactor(
SensitivityFunctionType.BRANCH_ACTIVE_POWER_1,
"BBE2AA1 FFR3AA1 1",
SensitivityVariableType.TRANSFORMER_PHASE,
"BBE2AA1 BBE3AA1 1",
false,
new ContingencyContext(contingency.getId(), ContingencyContextType.SPECIFIC)
);

SensitivityAnalysisResult sensitivityAnalysisResult = new SensitivityAnalysisResult(
List.of(sensitivityFactor1),
List.of(new SensitivityAnalysisResult.SensitivityContingencyStatus(contingency.getId(), SensitivityAnalysisResult.Status.FAILURE)),
List.of()
);

SystematicSensitivityResult result = new SystematicSensitivityResult();
result.completeData(sensitivityAnalysisResult, outageInstantOrder);

assertEquals(SystematicSensitivityResult.SensitivityComputationStatus.FAILURE, result.getStatus());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ Feature: US 12.15: export different reason per perimeter in SWE CNE
And the worst margin is -1419.4 A

@fast @rao @mock @ac @contingency-scenarios @second-preventive
# sensi pre 2P fails
# sensi pre 2P partially fails
Scenario: US 12.15.2.2: one contingency failing during 1st ARAO, with 2P
Given network file is "epic12/nordic32.xiidm"
Given crac file is "epic12/CIM_12_15_2.xml"
Expand All @@ -99,7 +99,7 @@ Feature: US 12.15: export different reason per perimeter in SWE CNE
And the worst margin is -1419.4 A

@fast @rao @mock @ac @contingency-scenarios @second-preventive
# sensi pre 2P fails
# sensi pre 2P partially fails
Scenario: US 12.15.2.3: one contingency failing during 1st ARAO, with global 2P
Given network file is "epic12/nordic32.xiidm"
Given crac file is "epic12/CIM_12_15_2.xml"
Expand Down

0 comments on commit 1beffb6

Please sign in to comment.