diff --git a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputation.java b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputation.java index 9a41b0265d..52309fadf8 100644 --- a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputation.java +++ b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputation.java @@ -26,10 +26,12 @@ public class AbsolutePtdfSumsComputation { private final ZonalData glskProvider; private final List zTozPtdfs; + private final double ptdfSumLowerBound; - public AbsolutePtdfSumsComputation(ZonalData glskProvider, List zTozPtdfs) { + public AbsolutePtdfSumsComputation(ZonalData glskProvider, List zTozPtdfs, double ptdfSumLowerBound) { this.glskProvider = glskProvider; this.zTozPtdfs = zTozPtdfs; + this.ptdfSumLowerBound = ptdfSumLowerBound; } public Map> computeAbsolutePtdfSums(Set flowCnecs, SystematicSensitivityResult sensitivityResult) { @@ -40,6 +42,7 @@ public Map> computeAbsolutePtdfSums(Set { Map ptdfMap = buildZoneToSlackPtdfMap(flowCnec, side, glskProvider, eiCodesInPtdfs, sensitivityResult); double sumOfZToZPtdf = zTozPtdfs.stream().mapToDouble(zToz -> Math.abs(computeZToZPtdf(zToz, ptdfMap))).sum(); + sumOfZToZPtdf = Math.max(sumOfZToZPtdf, ptdfSumLowerBound); ptdfSums.computeIfAbsent(flowCnec, k -> new EnumMap<>(TwoSides.class)).put(side, sumOfZToZPtdf); }); } diff --git a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/ToolProvider.java b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/ToolProvider.java index 2acda4cfb5..9918fa0e87 100644 --- a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/ToolProvider.java +++ b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/commons/ToolProvider.java @@ -21,6 +21,7 @@ import com.powsybl.openrao.raoapi.parameters.RaoParameters; import com.powsybl.openrao.raoapi.parameters.LoopFlowParameters; import com.powsybl.openrao.raoapi.parameters.RelativeMarginsParameters; +import com.powsybl.openrao.raoapi.parameters.extensions.OpenRaoSearchTreeParameters; import com.powsybl.openrao.sensitivityanalysis.AppliedRemedialActions; import com.powsybl.openrao.sensitivityanalysis.SystematicSensitivityInterface; import com.powsybl.glsk.commons.ZonalData; @@ -214,7 +215,8 @@ public static ToolProvider buildFromRaoInputAndParameters(RaoInput raoInput, Rao ) ); } - if (raoParameters.getObjectiveFunctionParameters().getType().relativePositiveMargins()) { + OpenRaoSearchTreeParameters searchTreeParameters = raoParameters.getExtension(OpenRaoSearchTreeParameters.class); + if (raoParameters.getObjectiveFunctionParameters().getType().relativePositiveMargins() && !Objects.isNull(searchTreeParameters)) { Optional optionalRelativeMarginsParameters = raoParameters.getRelativeMarginsParameters(); if (optionalRelativeMarginsParameters.isEmpty()) { throw new OpenRaoException("No relative margins parameters were defined with objective function " + raoParameters.getObjectiveFunctionParameters().getType()); @@ -223,7 +225,10 @@ public static ToolProvider buildFromRaoInputAndParameters(RaoInput raoInput, Rao raoInput.getGlskProvider(), new AbsolutePtdfSumsComputation( raoInput.getGlskProvider(), - optionalRelativeMarginsParameters.get().getPtdfBoundaries() + optionalRelativeMarginsParameters.get().getPtdfBoundaries(), + searchTreeParameters.getRelativeMarginsParameters() + .orElseThrow(() -> new OpenRaoException("No ptdf sum lower bound was defined with objective function " + raoParameters.getObjectiveFunctionParameters().getType())) + .getPtdfSumLowerBound() ) ); } diff --git a/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputationTest.java b/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputationTest.java index 0264fe4920..287e350b47 100644 --- a/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputationTest.java +++ b/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/AbsolutePtdfSumsComputationTest.java @@ -7,9 +7,13 @@ package com.powsybl.openrao.searchtreerao.commons; import com.powsybl.openrao.commons.EICode; +import com.powsybl.openrao.commons.Unit; import com.powsybl.openrao.data.crac.api.Crac; +import com.powsybl.openrao.data.crac.api.InstantKind; import com.powsybl.openrao.data.crac.api.cnec.FlowCnec; import com.powsybl.iidm.network.TwoSides; +import com.powsybl.openrao.data.crac.api.cnec.FlowCnecAdder; +import com.powsybl.openrao.data.crac.impl.CracImpl; import com.powsybl.openrao.data.crac.impl.utils.CommonCracCreation; import com.powsybl.openrao.data.crac.impl.utils.NetworkImportsUtil; import com.powsybl.openrao.raoapi.ZoneToZonePtdfDefinition; @@ -36,7 +40,7 @@ */ class AbsolutePtdfSumsComputationTest { private static final double DOUBLE_TOLERANCE = 0.001; - + private static final double PTDF_SUM_LOWER_BOUND = 0.01; private SystematicSensitivityResult systematicSensitivityResult; @BeforeEach @@ -64,6 +68,14 @@ public void setUp() { case "22Y201903144---9" -> 0.9; default -> 0.; }; + } else if (branchCnec.getId().contains("cnec3")) { + return switch (linearGlsk.getId().substring(0, EICode.EIC_LENGTH)) { + case "10YFR-RTE------C", "10YBE----------2" -> 0.0; + case "10YCB-GERMANY--8" -> 0.0; + case "22Y201903145---4" -> 0.0; + case "22Y201903144---9" -> 0.0; + default -> 0.; + }; } else { return 0.; } @@ -85,7 +97,7 @@ void testComputation() { new ZoneToZonePtdfDefinition("{BE}-{22Y201903144---9}-{DE}+{22Y201903145---4}")); // compute zToz PTDF sum - AbsolutePtdfSumsComputation absolutePtdfSumsComputation = new AbsolutePtdfSumsComputation(glskProvider, boundaries); + AbsolutePtdfSumsComputation absolutePtdfSumsComputation = new AbsolutePtdfSumsComputation(glskProvider, boundaries, PTDF_SUM_LOWER_BOUND); Map> ptdfSums = absolutePtdfSumsComputation.computeAbsolutePtdfSums(crac.getFlowCnecs(), systematicSensitivityResult); // test results @@ -110,11 +122,52 @@ void testIgnoreZtoZWithLessThan2ZtoS() { new ZoneToZonePtdfDefinition("{ES}-{DE}")); // ES doesn't exist in GLSK map, must be filtered // compute zToz PTDF sum - AbsolutePtdfSumsComputation absolutePtdfSumsComputation = new AbsolutePtdfSumsComputation(glskProvider, boundaries); + AbsolutePtdfSumsComputation absolutePtdfSumsComputation = new AbsolutePtdfSumsComputation(glskProvider, boundaries, PTDF_SUM_LOWER_BOUND); Map> ptdfSums = absolutePtdfSumsComputation.computeAbsolutePtdfSums(crac.getFlowCnecs(), systematicSensitivityResult); // Test that these 3 new boundaries are ignored (results should be the same as previous test) assertEquals(0.5, ptdfSums.get(crac.getFlowCnec("cnec1basecase")).get(TwoSides.TWO), DOUBLE_TOLERANCE); // abs(0.1 - 0.2) + abs(0.1 - 0.3) + abs(0.3 - 0.2) + abs(0.2 - 0.3) = 0.1 + 0.2 + 0.1 + 0.1 assertEquals(0.3, ptdfSums.get(crac.getFlowCnec("cnec2basecase")).get(TwoSides.ONE), DOUBLE_TOLERANCE); // abs(0.3 - 0.3) + abs(0.3 - 0.2) + abs(0.2 - 0.3) + abs(0.3 - 0.2) = 0 + 0.1 + 0.1 + 0.1 } + + @Test + void testWithNullPtdfSum() { + Network network = NetworkImportsUtil.import12NodesNetwork(); + ZonalData glskProvider = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/glsk/glsk_proportional_12nodes_with_alegro.xml")) + .getZonalGlsks(network, Instant.parse("2016-07-28T22:30:00Z")); + + // Crac + Set monitoredCnecSides = Set.of(TwoSides.ONE, TwoSides.TWO); + Crac crac = new CracImpl("test-crac") + .newInstant("preventive", InstantKind.PREVENTIVE) + .newInstant("outage", InstantKind.OUTAGE); + // Cnecs + FlowCnecAdder cnecAdder1 = crac.newFlowCnec() + .withId("cnec3basecase") + .withNetworkElement("BBE2AA1 FFR3AA1 1") + .withInstant("preventive") + .withOptimized(true) + .withOperator("operator1") + .withNominalVoltage(380.) + .withIMax(5000.); + monitoredCnecSides.forEach(side -> + cnecAdder1.newThreshold() + .withUnit(Unit.MEGAWATT) + .withSide(side) + .withMin(-1500.) + .withMax(1500.) + .add()); + cnecAdder1.add(); + + List boundaries = Arrays.asList( + new ZoneToZonePtdfDefinition("{FR}-{BE}"), + new ZoneToZonePtdfDefinition("{FR}-{DE}")); + + // compute zToz PTDF sum + AbsolutePtdfSumsComputation absolutePtdfSumsComputation = new AbsolutePtdfSumsComputation(glskProvider, boundaries, PTDF_SUM_LOWER_BOUND); + Map> ptdfSums = absolutePtdfSumsComputation.computeAbsolutePtdfSums(crac.getFlowCnecs(), systematicSensitivityResult); + + // Test that sum = PTDF_SUM_LOWER_BOUND + assertEquals(PTDF_SUM_LOWER_BOUND, ptdfSums.get(crac.getFlowCnec("cnec3basecase")).get(TwoSides.TWO), DOUBLE_TOLERANCE); + } } diff --git a/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/ToolProviderTest.java b/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/ToolProviderTest.java index 16bf5f9991..ee5c610d46 100644 --- a/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/ToolProviderTest.java +++ b/ra-optimisation/search-tree-rao/src/test/java/com/powsybl/openrao/searchtreerao/commons/ToolProviderTest.java @@ -8,9 +8,12 @@ package com.powsybl.openrao.searchtreerao.commons; import com.powsybl.openrao.commons.EICode; +import com.powsybl.openrao.data.crac.api.Crac; import com.powsybl.openrao.data.crac.api.Instant; import com.powsybl.openrao.data.crac.api.State; +import com.powsybl.openrao.raoapi.RaoInput; import com.powsybl.openrao.raoapi.parameters.LoopFlowParameters; +import com.powsybl.openrao.raoapi.parameters.ObjectiveFunctionParameters; import com.powsybl.openrao.raoapi.parameters.RelativeMarginsParameters; import com.powsybl.glsk.commons.ZonalData; import com.powsybl.openrao.data.crac.api.cnec.FlowCnec; @@ -20,6 +23,8 @@ import com.powsybl.openrao.data.refprog.referenceprogram.ReferenceProgram; import com.powsybl.openrao.loopflowcomputation.LoopFlowComputation; import com.powsybl.openrao.raoapi.parameters.RaoParameters; +import com.powsybl.openrao.raoapi.parameters.extensions.OpenRaoSearchTreeParameters; +import com.powsybl.openrao.raoapi.parameters.extensions.SearchTreeRaoRelativeMarginsParameters; import com.powsybl.openrao.sensitivityanalysis.SystematicSensitivityInterface; import com.powsybl.iidm.network.Country; import com.powsybl.iidm.network.Network; @@ -159,4 +164,27 @@ void testGetLoopFlowCnecs() { assertEquals(Set.of(cnec1), toolProvider.getLoopFlowCnecs(Set.of(cnec1, cnec2))); } + @Test + void testBuildWithoutRelativeMargin() { + RaoInput raoInput = RaoInput.build(network, Mockito.mock(Crac.class)).build(); + raoParameters.addExtension(OpenRaoSearchTreeParameters.class, new OpenRaoSearchTreeParameters()); + + ToolProvider toolProvider = ToolProvider.buildFromRaoInputAndParameters(raoInput, raoParameters); + assertNull(toolProvider.getAbsolutePtdfSumsComputation()); + } + + @Test + void testBuildWithRelativeMargin() { + RaoInput raoInput = RaoInput.build(network, Mockito.mock(Crac.class)).build(); + raoParameters.getObjectiveFunctionParameters().setType(ObjectiveFunctionParameters.ObjectiveFunctionType.MAX_MIN_RELATIVE_MARGIN); + raoParameters.setRelativeMarginsParameters(new RelativeMarginsParameters()); + + OpenRaoSearchTreeParameters openRaoSearchTreeParameters = new OpenRaoSearchTreeParameters(); + openRaoSearchTreeParameters.setRelativeMarginsParameters(new SearchTreeRaoRelativeMarginsParameters()); + raoParameters.addExtension(OpenRaoSearchTreeParameters.class, openRaoSearchTreeParameters); + + ToolProvider toolProvider = ToolProvider.buildFromRaoInputAndParameters(raoInput, raoParameters); + assertNotNull(toolProvider.getAbsolutePtdfSumsComputation()); + } + } diff --git a/tests/src/test/resources/com/powsybl/openrao/tests/features/epic10_relative_margin/US10_1.feature b/tests/src/test/resources/com/powsybl/openrao/tests/features/epic10_relative_margin/US10_1.feature index af6ef3be4f..f1d5fef611 100644 --- a/tests/src/test/resources/com/powsybl/openrao/tests/features/epic10_relative_margin/US10_1.feature +++ b/tests/src/test/resources/com/powsybl/openrao/tests/features/epic10_relative_margin/US10_1.feature @@ -33,3 +33,18 @@ Feature: US 10.1: Linear RAO with relative margin And the absolute PTDF sum on cnec "NNL2AA1 BBE3AA1 1 - preventive" initially should be 1.455 And the relative margin on cnec "FFR2AA1 DDE3AA1 1 - preventive" after PRA should be 2392.4 MW And the absolute PTDF sum on cnec "FFR2AA1 DDE3AA1 1 - preventive" initially should be 1.477 + + @fast @rao @mock @ac @preventive-only @relative + Scenario: US 10.1.3: secured case with open monitored branch + Given network file is "common/TestCase12NodesWithOpenBranch.uct" + Given crac file is "epic10/ls_relative_margin_with_open_branch.json" + Given configuration file is "epic10/RaoParameters_relMargin_megawatt.json" + Given loopflow glsk file is "common/glsk_proportional_12nodes.xml" + When I launch search_tree_rao + Then its security status should be "SECURED" + And the value of the objective function after CRA should be -2385.0 + And the tap of PstRangeAction "PRA_PST_BE" should be -3 in preventive + And the worst relative margin is 2383.0 MW on cnec "NNL2AA1 BBE3AA1 1 - preventive" + And the absolute PTDF sum on cnec "NNL2AA1 BBE3AA1 1 - preventive" initially should be 1.455 + And the relative margin on cnec "FFR2AA1 DDE3AA1 1 - preventive" after PRA should be 2392.4 MW + And the absolute PTDF sum on cnec "FFR2AA1 DDE3AA1 1 - preventive" initially should be 1.477 diff --git a/tests/src/test/resources/files/cases/common/TestCase12NodesWithOpenBranch.uct b/tests/src/test/resources/files/cases/common/TestCase12NodesWithOpenBranch.uct new file mode 100644 index 0000000000..9f1dbc2f51 --- /dev/null +++ b/tests/src/test/resources/files/cases/common/TestCase12NodesWithOpenBranch.uct @@ -0,0 +1,39 @@ +##C 2007.05.01 +##N +##ZBE +BBE1AA1 BE1 0 2 400.00 2500.00 0.00000 -1500.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +BBE2AA1 BE2 0 2 400.00 1000.00 0.00000 -3000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +BBE3AA1 BE3 0 2 400.00 1500.00 0.00000 -2500.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZDE +DDE1AA1 DE1 0 2 400.00 3500.00 0.00000 -2500.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +DDE2AA1 DE2 0 2 400.00 3000.00 0.00000 -2000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +DDE3AA1 DE3 0 2 400.00 2000.00 0.00000 -1500.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZFR +FFR1AA1 FR1 0 2 400.00 1000.00 0.00000 -2000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +FFR2AA1 FR2 0 2 400.00 3500.00 0.00000 -2000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +FFR3AA1 FR3 0 2 400.00 1500.00 0.00000 -3000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZNL +NNL1AA1 NL1 0 2 400.00 1000.00 0.00000 -1500.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +NNL2AA1 NL2 0 2 400.00 1000.00 0.00000 -500.00 0.00000 9000.00 -9000.0 9000.00 -9000.0 +NNL3AA1 NL3 0 2 400.00 2500.00 0.00000 -2000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##L +BBE1AA1 BBE2AA1 1 0 0.0000 10.000 0.000000 5000 +BBE1AA1 BBE3AA1 1 0 0.0000 10.000 0.000000 5000 +FFR1AA1 FFR2AA1 1 0 0.0000 10.000 0.000000 5000 +FFR1AA1 FFR2AA1 2 8 0.0000 10.000 0.000000 5000 +FFR1AA1 FFR3AA1 1 0 0.0000 10.000 0.000000 5000 +FFR2AA1 FFR3AA1 1 0 0.0000 10.000 0.000000 5000 +DDE1AA1 DDE2AA1 1 0 0.0000 10.000 0.000000 5000 +DDE1AA1 DDE3AA1 1 0 0.0000 10.000 0.000000 5000 +DDE2AA1 DDE3AA1 1 0 0.0000 10.000 0.000000 5000 +NNL1AA1 NNL2AA1 1 0 0.0000 10.000 0.000000 5000 +NNL1AA1 NNL3AA1 1 0 0.0000 10.000 0.000000 5000 +NNL2AA1 NNL3AA1 1 0 0.0000 10.000 0.000000 5000 +FFR2AA1 DDE3AA1 1 0 0.0000 10.000 0.000000 5000 +DDE2AA1 NNL3AA1 1 0 0.0000 10.000 0.000000 5000 +NNL2AA1 BBE3AA1 1 0 0.0000 10.000 0.000000 5000 +BBE2AA1 FFR3AA1 1 0 0.0000 10.000 0.000000 5000 +##T +BBE2AA1 BBE3AA1 1 0 400.0 400.0 1000. 0.0000 10.000 0.000000 0.0 5000 PST +##R +BBE2AA1 BBE3AA1 1 -0.68 90.00 16 0 SYMM \ No newline at end of file diff --git a/tests/src/test/resources/files/crac/epic10/ls_relative_margin_with_open_branch.json b/tests/src/test/resources/files/crac/epic10/ls_relative_margin_with_open_branch.json new file mode 100644 index 0000000000..3207f790bc --- /dev/null +++ b/tests/src/test/resources/files/crac/epic10/ls_relative_margin_with_open_branch.json @@ -0,0 +1,221 @@ +{ + "type" : "CRAC", + "version" : "1.3", + "info" : "Generated by FARAO http://farao-community.github.io", + "id" : "LS_parade_PST", + "name" : "LS_parade_PST", + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "Contingency FR1 FR3", + "networkElementsIds" : [ "FFR1AA1 FFR3AA1 1" ] + } ], + "flowCnecs" : [ { + "id" : "BBE2AA1 FFR3AA1 1 - preventive", + "name" : "BBE2AA1 FFR3AA1 1", + "networkElementId" : "BBE2AA1 FFR3AA1 1", + "operator" : null, + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5000.0, + "max" : 5000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "DDE2AA1 NNL3AA1 1 - preventive", + "name" : "DDE2AA1 NNL3AA1 1", + "networkElementId" : "DDE2AA1 NNL3AA1 1", + "operator" : null, + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5000.0, + "max" : 5000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "FFR1AA1 FFR2AA1 1 - preventive", + "name" : "FFR1AA1 FFR2AA1 1", + "networkElementId" : "FFR1AA1 FFR2AA1 1", + "operator" : null, + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -4000.0, + "max" : 4000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "FFR1AA1 FFR2AA1 2 - curative", + "name" : "FFR1AA1 FFR2AA1 2 - curative", + "networkElementId" : "FFR1AA1 FFR2AA1 2", + "operator" : null, + "instant" : "curative", + "contingencyId" : "Contingency FR1 FR3", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -4000.0, + "max" : 4000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "FFR1AA1 FFR2AA1 2 - preventive", + "name" : "FFR1AA1 FFR2AA1 2", + "networkElementId" : "FFR1AA1 FFR2AA1 2", + "operator" : null, + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -4000.0, + "max" : 4000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "FFR2AA1 DDE3AA1 1 - preventive", + "name" : "FFR2AA1 DDE3AA1 1", + "networkElementId" : "FFR2AA1 DDE3AA1 1", + "operator" : null, + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5000.0, + "max" : 5000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "NNL1AA1 NNL3AA1 1 - preventive", + "name" : "NNL1AA1 NNL3AA1 1", + "networkElementId" : "NNL1AA1 NNL3AA1 1", + "operator" : null, + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5000.0, + "max" : 5000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "NNL2AA1 BBE3AA1 1 - preventive", + "name" : "NNL2AA1 BBE3AA1 1", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5000.0, + "max" : 5000.0, + "rule" : "onLeftSide" + } ] + }, { + "id" : "NNL2AA1 NNL3AA1 1 - preventive", + "name" : "NNL2AA1 NNL3AA1 1", + "networkElementId" : "NNL2AA1 NNL3AA1 1", + "operator" : null, + "instant" : "preventive", + "optimized" : false, + "monitored" : true, + "frm" : 0.0, + "iMax" : [ 5000.0 ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5000.0, + "max" : 5000.0, + "rule" : "onLeftSide" + } ] + } ], + "pstRangeActions" : [ { + "id" : "PRA_PST_BE", + "name" : "PRA_PST_BE", + "operator" : "BE", + "freeToUseUsageRules" : [ { + "instant" : "preventive", + "usageMethod" : "available" + } ], + "networkElementId" : "BBE2AA1 BBE3AA1 1", + "initialTap" : 0, + "tapToAngleConversionMap" : { + "-1" : -0.3896097993971608, + "0" : 0.0, + "-2" : -0.7792105912934298, + "1" : 0.3896097993971608, + "-3" : -1.1687933694373345, + "2" : 0.7792105912934298, + "-4" : -1.5583491300758083, + "3" : 1.1687933694373345, + "-5" : -1.9478688732023104, + "4" : 1.5583491300758083, + "-6" : -2.337343603803646, + "5" : 1.9478688732023104, + "-7" : -2.7267643331050597, + "6" : 2.337343603803646, + "-8" : -3.1161220798131644, + "7" : 2.7267643331050597, + "-9" : -3.505407871356285, + "8" : 3.1161220798131644, + "-10" : -3.894612745121778, + "9" : 3.505407871356285, + "-11" : -4.283727749689918, + "10" : 3.894612745121778, + "-12" : -4.672743946063913, + "11" : 4.283727749689918, + "-13" : -5.061652408895631, + "12" : 4.672743946063913, + "-14" : -5.4504442277066305, + "13" : 5.061652408895631, + "-15" : -5.839110508104064, + "14" : 5.4504442277066305, + "-16" : -6.2276423729910535, + "15" : 5.839110508104064, + "16" : 6.2276423729910535 + }, + "ranges" : [ { + "min" : -16, + "max" : 16, + "rangeType" : "absolute" + } ] + } ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "networkActions" : [ ] +} \ No newline at end of file