From c3c2d37a0f55def8b94c90b5940842e0839c7db6 Mon Sep 17 00:00:00 2001 From: Philippe Edwards Date: Mon, 17 Feb 2025 17:06:12 +0100 Subject: [PATCH 01/18] added a first version of a notebook to test things out Signed-off-by: Philippe Edwards --- data/rao/12_node_network.uct | 40 +++ data/rao/N_case_crac.json | 58 ++++ data/rao/N_case_crac_pst.json | 108 ++++++ data/rao/rao_parameters.json | 140 ++++++++ open_rao.ipynb | 606 ++++++++++++++++++++++++++++++++++ 5 files changed, 952 insertions(+) create mode 100644 data/rao/12_node_network.uct create mode 100644 data/rao/N_case_crac.json create mode 100644 data/rao/N_case_crac_pst.json create mode 100644 data/rao/rao_parameters.json create mode 100644 open_rao.ipynb diff --git a/data/rao/12_node_network.uct b/data/rao/12_node_network.uct new file mode 100644 index 0000000..8d3c457 --- /dev/null +++ b/data/rao/12_node_network.uct @@ -0,0 +1,40 @@ +##C 2007.05.01 +##N +##ZBE +BBE1AA1 BE1 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +BBE2AA1 BE2 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +BBE3AA1 BE3 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZDE +DDE1AA1 DE1 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +DDE2AA1 DE2 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +DDE3AA1 DE3 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZFR +FFR1AA1 FR1 0 2 400.00 1000.00 0.00000 00000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +FFR2AA1 FR2 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +FFR3AA1 FR3 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZNL +NNL1AA1 NL1 0 2 400.00 0000.00 0.00000 -1000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +NNL2AA1 NL2 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +NNL3AA1 NL3 0 2 400.00 0.00000 0.00000 0.00000 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 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 410 +NNL2AA1 BBE3AA1 2 8 0.0000 10.000 0.000000 410 +NNL2AA1 BBE3AA1 3 8 0.0000 10.000 0.000000 410 +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/data/rao/N_case_crac.json b/data/rao/N_case_crac.json new file mode 100644 index 0000000..a181693 --- /dev/null +++ b/data/rao/N_case_crac.json @@ -0,0 +1,58 @@ +{ + "type" : "CRAC", + "version" : "2.6", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "crac", + "name" : "crac", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ ], + "flowCnecs" : [ { + "id" : "NNL2AA1 BBE3AA1 1 - preventive", + "name" : "NNL2AA1 BBE3AA1 1 - preventive", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "border" : "", + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "iMax" : [ NaN ], + "nominalV" : [ 400 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -410.0, + "max" : 410.0, + "side" : 1 + } ] + } ], + "angleCnecs" : [ ], + "voltageCnecs" : [ ], + "pstRangeActions" : [ ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "close NL2 BE3 2", + "name" : "close NL2 BE3 2", + "operator" : null, + "onInstantUsageRules" : [ { + "instant" : "preventive", + "usageMethod" : "available" + } ], + "terminalsConnectionActions" : [ { + "networkElementId" : "NNL2AA1 BBE3AA1 2", + "actionType" : "close" + } ] + } ] +} \ No newline at end of file diff --git a/data/rao/N_case_crac_pst.json b/data/rao/N_case_crac_pst.json new file mode 100644 index 0000000..e2e0a83 --- /dev/null +++ b/data/rao/N_case_crac_pst.json @@ -0,0 +1,108 @@ +{ + "type" : "CRAC", + "version" : "2.6", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "crac", + "name" : "crac", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ ], + "flowCnecs" : [ { + "id" : "NNL2AA1 BBE3AA1 1 - preventive", + "name" : "NNL2AA1 BBE3AA1 1 - preventive", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "border" : "", + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "iMax" : [ NaN ], + "nominalV" : [ 400 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -410.0, + "max" : 410.0, + "side" : 1 + } ] + } ], + "angleCnecs" : [ ], + "voltageCnecs" : [ ], + "pstRangeActions" : [ { + "id" : "pst-range-action", + "name" : "pst-range-action", + "operator" : null, + "onInstantUsageRules" : [ { + "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" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "close NL2 BE3 2", + "name" : "close NL2 BE3 2", + "operator" : null, + "onInstantUsageRules" : [ { + "instant" : "preventive", + "usageMethod" : "available" + } ], + "terminalsConnectionActions" : [ { + "networkElementId" : "NNL2AA1 BBE3AA1 2", + "actionType" : "close" + } ] + } ] +} \ No newline at end of file diff --git a/data/rao/rao_parameters.json b/data/rao/rao_parameters.json new file mode 100644 index 0000000..c46ae5f --- /dev/null +++ b/data/rao/rao_parameters.json @@ -0,0 +1,140 @@ +{ + "version" : "3.0", + "objective-function" : { + "type" : "SECURE_FLOW", + "unit" : "MW" + }, + "range-actions-optimization" : { + "pst-ra-min-impact-threshold" : 0.01, + "hvdc-ra-min-impact-threshold" : 0.001, + "injection-ra-min-impact-threshold" : 0.001 + }, + "topological-actions-optimization" : { + "relative-minimum-impact-threshold" : 0.0, + "absolute-minimum-impact-threshold" : 0.0 + }, + "not-optimized-cnecs" : { + "do-not-optimize-curative-cnecs-for-tsos-without-cras" : false + }, + "extensions" : { + "open-rao-search-tree-parameters" : { + "objective-function" : { + "curative-min-obj-improvement" : 0.0 + }, + "range-actions-optimization" : { + "max-mip-iterations" : 5, + "pst-sensitivity-threshold" : 1.0E-6, + "pst-model" : "CONTINUOUS", + "hvdc-sensitivity-threshold" : 1.0E-6, + "injection-ra-sensitivity-threshold" : 1.0E-6, + "ra-range-shrinking" : "DISABLED", + "linear-optimization-solver" : { + "solver" : "XPRESS", + "relative-mip-gap" : 0.001, + "solver-specific-parameters" : null + } + }, + "topological-actions-optimization" : { + "max-preventive-search-tree-depth" : 5, + "max-auto-search-tree-depth" : 5, + "max-curative-search-tree-depth" : 5, + "predefined-combinations" : [ ], + "skip-actions-far-from-most-limiting-element" : false, + "max-number-of-boundaries-for-skipping-actions" : 0 + }, + "second-preventive-rao" : { + "execution-condition" : "DISABLED", + "re-optimize-curative-range-actions" : false, + "hint-from-first-preventive-rao" : false + }, + "load-flow-and-sensitivity-computation" : { + "load-flow-provider" : "OpenLoadFlow", + "sensitivity-provider" : "OpenLoadFlow", + "sensitivity-failure-overcost" : 10000.0, + "sensitivity-parameters" : { + "version" : "1.0", + "load-flow-parameters" : { + "version" : "1.9", + "voltageInitMode" : "UNIFORM_VALUES", + "transformerVoltageControlOn" : false, + "phaseShifterRegulationOn" : false, + "useReactiveLimits" : true, + "twtSplitShuntAdmittance" : true, + "shuntCompensatorVoltageControlOn" : false, + "readSlackBus" : false, + "writeSlackBus" : false, + "dc" : false, + "distributedSlack" : true, + "balanceType" : "PROPORTIONAL_TO_GENERATION_P", + "dcUseTransformerRatio" : false, + "countriesToBalance" : [ "GR", "BE", "SK", "TR", "CH", "RS", "PL", "UA", "BG", "ES", "ME", "CZ", "HR", "AL", "RO", "HU", "AT", "FR", "PT", "DE", "MK", "BA", "SI", "IT", "NL" ], + "connectedComponentMode" : "MAIN", + "hvdcAcEmulation" : true, + "dcPowerFactor" : 1.0, + "extensions" : { + "open-load-flow-parameters" : { + "slackBusSelectionMode" : "MOST_MESHED", + "slackBusesIds" : [ ], + "slackDistributionFailureBehavior" : "LEAVE_ON_SLACK_BUS", + "lowImpedanceBranchMode" : "REPLACE_BY_ZERO_IMPEDANCE_LINE", + "loadPowerFactorConstant" : false, + "plausibleActivePowerLimit" : 10000.0, + "newtonRaphsonStoppingCriteriaType" : "UNIFORM_CRITERIA", + "maxActivePowerMismatch" : 0.01, + "maxReactivePowerMismatch" : 0.01, + "maxVoltageMismatch" : 1.0E-4, + "maxAngleMismatch" : 1.0E-5, + "maxRatioMismatch" : 1.0E-5, + "maxSusceptanceMismatch" : 1.0E-4, + "slackBusPMaxMismatch" : 1.0, + "voltagePerReactivePowerControl" : false, + "maxNewtonRaphsonIterations" : 30, + "maxOuterLoopIterations" : 20, + "newtonRaphsonConvEpsPerEq" : 1.0E-4, + "voltageInitModeOverride" : "NONE", + "transformerVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", + "shuntVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", + "minPlausibleTargetVoltage" : 0.8, + "maxPlausibleTargetVoltage" : 1.2, + "minNominalVoltageTargetVoltageCheck" : 20.0, + "minRealisticVoltage" : 0.5, + "maxRealisticVoltage" : 1.5, + "lowImpedanceThreshold" : 1.0E-8, + "reactiveRangeCheckMode" : "MAX", + "networkCacheEnabled" : false, + "svcVoltageMonitoring" : true, + "stateVectorScalingMode" : "NONE", + "maxSlackBusCount" : 1, + "debugDir" : null, + "incrementalTransformerRatioTapControlOuterLoopMaxTapShift" : 3, + "secondaryVoltageControl" : false, + "reactiveLimitsMaxPqPvSwitch" : 3, + "phaseShifterControlMode" : "CONTINUOUS_WITH_DISCRETISATION", + "alwaysUpdateNetwork" : false, + "mostMeshedSlackBusSelectorMaxNominalVoltagePercentile" : 95.0, + "reportedFeatures" : [ ], + "slackBusCountryFilter" : [ ], + "actionableSwitchesIds" : [ ], + "asymmetrical" : false, + "reactivePowerDispatchMode" : "Q_EQUAL_PROPORTION", + "outerLoopNames" : null, + "useActiveLimits" : true, + "lineSearchStateVectorScalingMaxIteration" : 10, + "lineSearchStateVectorScalingStepFold" : 1.3333333333333333, + "maxVoltageChangeStateVectorScalingMaxDv" : 0.1, + "maxVoltageChangeStateVectorScalingMaxDphi" : 0.17453292519943295, + "linePerUnitMode" : "IMPEDANCE", + "useLoadModel" : false, + "dcApproximationType" : "IGNORE_R", + "simulateAutomationSystems" : false + } + } + } + } + }, + "multi-threading" : { + "available-cpus" : 4 + } + } + } +} \ No newline at end of file diff --git a/open_rao.ipynb b/open_rao.ipynb new file mode 100644 index 0000000..1df8557 --- /dev/null +++ b/open_rao.ipynb @@ -0,0 +1,606 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# OpenRAO in pyPowsybl " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook, you will learn how to use OpenRAO with pypowsybl to optimize a network situation given available remedial actions.\n", + "\n", + "The first step is to install pypowsybl and import the library." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:34.383197361Z", + "start_time": "2025-02-17T15:25:32.744427175Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pypowsybl in ./venv/lib/python3.8/site-packages (1.10.0)\r\n", + "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.8/site-packages (from pypowsybl) (3.11.0)\r\n", + "Requirement already satisfied: networkx in ./venv/lib/python3.8/site-packages (from pypowsybl) (3.1)\r\n", + "Requirement already satisfied: pandas>=2.0.3 in ./venv/lib/python3.8/site-packages (from pypowsybl) (2.0.3)\r\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (2.9.0.post0)\r\n", + "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (2025.1)\r\n", + "Requirement already satisfied: tzdata>=2022.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (2025.1)\r\n", + "Requirement already satisfied: numpy>=1.20.3 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (1.24.4)\r\n", + "Requirement already satisfied: wcwidth in ./venv/lib/python3.8/site-packages (from prettytable>=2.0.0->pypowsybl) (0.2.13)\r\n", + "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=2.0.3->pypowsybl) (1.17.0)\r\n", + "\r\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m23.2.1\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.0.1\u001B[0m\r\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "pip install pypowsybl" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:35.168881770Z", + "start_time": "2025-02-17T15:25:34.381240192Z" + } + }, + "outputs": [], + "source": [ + "import pypowsybl as pp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will consider a 12 bus example network in this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:35.184776118Z", + "start_time": "2025-02-17T15:25:35.157897144Z" + } + }, + "outputs": [], + "source": [ + "n12 = pp.network.load('./data/rao/12_node_network.uct')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By drawing the network area diagram, you can get a better understanding of the substations and branches in the network." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:35.225348206Z", + "start_time": "2025-02-17T15:25:35.218254615Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "", + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / °
\n
\n
kV / °
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n
\n
\n" + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n12.get_network_area_diagram()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 - Simple N case overload" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To check the initial situation we can just run a loadflow on the network and redraw the network." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:35.244360011Z", + "start_time": "2025-02-17T15:25:35.225516338Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "", + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.0°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.0°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 5.3°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n
\n
\n" + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pp.loadflow.run_dc(n12)\n", + "n12.get_network_area_diagram()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see the initial flow on the line NNL2AA1 and BBE3AA1 is 500MW. However the PATL is only 410 MW so there is an overload on this line.\n", + "To solve it we can for instance close one of the other lines between NNL2AA1 and BBE3AA1." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:35.261154030Z", + "start_time": "2025-02-17T15:25:35.244203832Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "", + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.4°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.2°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 0.8°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.4°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.2°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.3°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.1°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 4.5°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 2.5°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 2.6°
\n
\n
\n
\n
\n" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n12.connect(\"NNL2AA1 BBE3AA1 2\")\n", + "pp.loadflow.run_dc(n12)\n", + "n12.get_network_area_diagram()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, the new flow is 270MW, and the overload has been solved.\n", + "\n", + "This solution can be found by the RAO. For this we will need some input files: the network (which we already have), and a crac file which will contain information about available remedial actions, and CNECs (critical network elements and contingencies). For more information on the crac input, you can check this page: https://powsybl.readthedocs.io/projects/openrao/en/stable/input-data/crac/json.html" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:31:17.745462470Z", + "start_time": "2025-02-17T15:31:17.655012160Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-02-17 16:31:17,654 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,655 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,656 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,657 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,658 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,659 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,659 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,660 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,660 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,660 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,661 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,661 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,662 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,662 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,663 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,664 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,664 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-02-17 16:31:17,665 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-02-17 16:31:17,665 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-02-17 16:31:17,665 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-02-17 16:31:17,665 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-02-17 16:31:17,668 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", + "2025-02-17 16:31:17,668 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-02-17 16:31:17,669 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-02-17 16:31:17,669 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-02-17 16:31:17,670 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-02-17 16:31:17,670 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-02-17 16:31:17,670 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-02-17 16:31:17,671 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-02-17 16:31:17,671 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-02-17 16:31:17,671 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-02-17 16:31:17,672 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-02-17 16:31:17,672 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-02-17 16:31:17,672 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-02-17 16:31:17,673 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-02-17 16:31:17,673 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-02-17 16:31:17,673 - INFO - Linear optimization on root leaf\n", + "2025-02-17 16:31:17,708 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-02-17 16:31:17,708 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-02-17 16:31:17,709 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-02-17 16:31:17,709 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-02-17 16:31:17,710 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-02-17 16:31:17,710 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-02-17 16:31:17,711 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-02-17 16:31:17,711 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-02-17 16:31:17,712 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004236550663305749, distributedActivePower=0.0))\n", + "2025-02-17 16:31:17,713 - INFO - Iteration 1: better solution found with a cost of -83.86 (functional: -83.86)\n", + "2025-02-17 16:31:17,714 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-02-17 16:31:17,714 - INFO - Root leaf, 1 range action(s) activated, cost: -83.86 (functional: -83.86, virtual: 0.0)\n", + "2025-02-17 16:31:17,714 - INFO - range action(s): pst-range-action: -16\n", + "2025-02-17 16:31:17,714 - INFO - Limiting element #01: margin = 83.86 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-02-17 16:31:17,715 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 range action(s) activated : pst-range-action: -16, cost after preventive optimization = -83.86 (functional: -83.86, virtual: 0.0)\n", + "2025-02-17 16:31:17,715 - INFO - ----- Preventive perimeter optimization [end]\n" + ] + } + ], + "source": [ + "# prepare inputs\n", + "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(n12, \"./data/rao/N_case_crac_pst.json\")\n", + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", + "#run rao\n", + "raoResult = rao_runner.run(n12)\n", + "result_json = raoResult.to_json()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's examine the results of RAO." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:37.117341329Z", + "start_time": "2025-02-17T15:25:37.109069952Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO http://farao-community.github.io',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 90.0,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 201.67, 'side1': {'flow': 390.11}},\n 'megawatt': {'margin': 139.73, 'side1': {'flow': 270.27}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': []}" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result_json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we can look at the sensitivity matrix, which shows how the active power flow of the two lines changes when the generator's active power changes." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:37.238505497Z", + "start_time": "2025-02-17T15:25:37.109398774Z" + } + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'result' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[9], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43mresult\u001B[49m\u001B[38;5;241m.\u001B[39mget_sensitivity_matrix()\n", + "\u001B[0;31mNameError\u001B[0m: name 'result' is not defined" + ] + } + ], + "source": [ + "result.get_sensitivity_matrix()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An increase of 1 MW on generator `SE_G` has the effect of increasing the active power flow from side 1 to side 2 by 0.26 MW on the lines `S_SO_1` and `S_SO_2`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 - Zone to zone sensitivity: PTDF computation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This zone-to-zone sensitivity feature is also known as Power Transfer Distribution Factor, or PTDF for short.\n", + "\n", + "Now, imagine that the node `SE`, is in Italy and the other nodes are in France. \n", + "We can update the `TSO` and `country` field of the substations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.284112065Z" + } + }, + "outputs": [], + "source": [ + "n6b = pp.network.create_metrix_tutorial_six_buses_network()\n", + "n6b.update_substations(id=['SE'], TSO=['Terna'], country=['IT'])\n", + "n6b.update_substations(id=['NO', 'S', 'SO', 'N'], TSO=['RTE', 'RTE', 'RTE', 'RTE'], country=['FR', 'FR', 'FR', 'FR'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can run a load flow:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.284339887Z" + } + }, + "outputs": [], + "source": [ + "pp.loadflow.run_dc(n6b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the dataframe with the substation information, the `TSO` and `country` columns are now filled." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-02-17T15:25:37.294879117Z", + "start_time": "2025-02-17T15:25:37.284511135Z" + } + }, + "outputs": [], + "source": [ + "n6b.get_substations()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can create two zones for the sensitivity analysis: one for France and one for Italy:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.284677313Z" + } + }, + "outputs": [], + "source": [ + "zone_fr = pp.sensitivity.create_country_zone(n6b, 'FR')\n", + "zone_it = pp.sensitivity.create_country_zone(n6b, 'IT')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can examine the shift keys for the zone representing France. They're linked to the active power setpoint of the generators:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.284792986Z" + } + }, + "outputs": [], + "source": [ + "zone_fr.shift_keys_by_injections_ids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's create the analysis and set the zones to the two we previously declared." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.284946758Z" + } + }, + "outputs": [], + "source": [ + "params = pp.loadflow.Parameters(distributed_slack=False)\n", + "sa = pp.sensitivity.create_dc_analysis()\n", + "sa.set_zones([zone_fr, zone_it])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can create the factor matrix again. This time, we're looking at how changing the net position of the two zones, `FR` and `IT`, affects the active power flow of the lines `S_SE_1` and `S_SE_2`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.285090539Z" + } + }, + "outputs": [], + "source": [ + "sa.add_branch_flow_factor_matrix(branches_ids=['S_SE_1', 'S_SE_2'], variables_ids=['FR', 'IT'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can run the analysis and get the sensitivity matrix." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.285195904Z" + } + }, + "outputs": [], + "source": [ + "ptdf_results = sa.run(n6b, params)\n", + "m1 = ptdf_results.get_branch_flows_sensitivity_matrix()\n", + "m1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Transferring 1 MW of active power from the zone `FR` to the zone `IT` will cause a 0.3 MW shift on border line `S_SE_1`.\n", + "\n", + "Let’s obtain that directly. After running a sensitivity analysis to figure out the best zones, we can request a `FR` zone to slack sensitivity, a `FR` to `IT` zone to zone sensitivity, an `IT` to `FR` zone to zone sensitivity, and an `IT` zone to slack sensitivity on all the border lines `S_SE_1`, `S_SE_2`, `SE_NE_1` and `SE_NE_2`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.285407118Z" + } + }, + "outputs": [], + "source": [ + "sa = pp.sensitivity.create_dc_analysis()\n", + "sa.set_zones([zone_fr, zone_it])\n", + "sa.add_branch_flow_factor_matrix(branches_ids=['S_SE_1', 'S_SE_2', 'SE_NE_1', 'SE_NE_2'], variables_ids=['FR', ('FR', 'IT'), ('IT', 'FR'), 'IT'])\n", + "ptdf_result = sa.run(n6b, params)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2025-02-17T15:25:37.285521084Z" + } + }, + "outputs": [], + "source": [ + "m2 = ptdf_result.get_branch_flows_sensitivity_matrix()\n", + "m2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that:\n", + "- an increase of 1 MW on the `FR` zone net position leads to an increase of 0.2 MW on the flow of all the border lines.\n", + "- moving the flow of 1 MW from `FR` to `IT` leads to an increase of 0.3 MW on the flow of lines `S_SE_1` and `S_SE_2` and a decrease of 0.2 MW on the flow of lines `SE_NE_1` and `SE_NE_2`.\n", + "- moving the flow of 1 MW from `IT` to `FR` leads to a decrease of 0.3 MW on the flow of lines `S_SE_1` and `S_SE_2` and an increase of 0.2 MW on the flow of lines `SE_NE_1` and `SE_NE_2`.\n", + "- an increase of 1 MW on the `IT` zone net position leads to a decrease of 0.1 MW on the flow of lines `S_SE_1` and `S_SE_2` and an increase of 0.4 MW on the flow of lines `SE_NE_1` and `SE_NE_2`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 016d518180a4003b7be60ab01d325f5866f895b7 Mon Sep 17 00:00:00 2001 From: Philippe Edwards Date: Mon, 17 Feb 2025 17:24:52 +0100 Subject: [PATCH 02/18] cleaned up Signed-off-by: Philippe Edwards --- open_rao.ipynb | 268 ------------------------------------------------- 1 file changed, 268 deletions(-) diff --git a/open_rao.ipynb b/open_rao.ipynb index 1df8557..b03daf3 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -312,274 +312,6 @@ "source": [ "result_json" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we can look at the sensitivity matrix, which shows how the active power flow of the two lines changes when the generator's active power changes." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "ExecuteTime": { - "end_time": "2025-02-17T15:25:37.238505497Z", - "start_time": "2025-02-17T15:25:37.109398774Z" - } - }, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'result' is not defined", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[0;32mIn[9], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43mresult\u001B[49m\u001B[38;5;241m.\u001B[39mget_sensitivity_matrix()\n", - "\u001B[0;31mNameError\u001B[0m: name 'result' is not defined" - ] - } - ], - "source": [ - "result.get_sensitivity_matrix()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "An increase of 1 MW on generator `SE_G` has the effect of increasing the active power flow from side 1 to side 2 by 0.26 MW on the lines `S_SO_1` and `S_SO_2`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2 - Zone to zone sensitivity: PTDF computation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This zone-to-zone sensitivity feature is also known as Power Transfer Distribution Factor, or PTDF for short.\n", - "\n", - "Now, imagine that the node `SE`, is in Italy and the other nodes are in France. \n", - "We can update the `TSO` and `country` field of the substations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.284112065Z" - } - }, - "outputs": [], - "source": [ - "n6b = pp.network.create_metrix_tutorial_six_buses_network()\n", - "n6b.update_substations(id=['SE'], TSO=['Terna'], country=['IT'])\n", - "n6b.update_substations(id=['NO', 'S', 'SO', 'N'], TSO=['RTE', 'RTE', 'RTE', 'RTE'], country=['FR', 'FR', 'FR', 'FR'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can run a load flow:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.284339887Z" - } - }, - "outputs": [], - "source": [ - "pp.loadflow.run_dc(n6b)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the dataframe with the substation information, the `TSO` and `country` columns are now filled." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2025-02-17T15:25:37.294879117Z", - "start_time": "2025-02-17T15:25:37.284511135Z" - } - }, - "outputs": [], - "source": [ - "n6b.get_substations()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can create two zones for the sensitivity analysis: one for France and one for Italy:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.284677313Z" - } - }, - "outputs": [], - "source": [ - "zone_fr = pp.sensitivity.create_country_zone(n6b, 'FR')\n", - "zone_it = pp.sensitivity.create_country_zone(n6b, 'IT')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can examine the shift keys for the zone representing France. They're linked to the active power setpoint of the generators:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.284792986Z" - } - }, - "outputs": [], - "source": [ - "zone_fr.shift_keys_by_injections_ids" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's create the analysis and set the zones to the two we previously declared." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.284946758Z" - } - }, - "outputs": [], - "source": [ - "params = pp.loadflow.Parameters(distributed_slack=False)\n", - "sa = pp.sensitivity.create_dc_analysis()\n", - "sa.set_zones([zone_fr, zone_it])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can create the factor matrix again. This time, we're looking at how changing the net position of the two zones, `FR` and `IT`, affects the active power flow of the lines `S_SE_1` and `S_SE_2`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.285090539Z" - } - }, - "outputs": [], - "source": [ - "sa.add_branch_flow_factor_matrix(branches_ids=['S_SE_1', 'S_SE_2'], variables_ids=['FR', 'IT'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can run the analysis and get the sensitivity matrix." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.285195904Z" - } - }, - "outputs": [], - "source": [ - "ptdf_results = sa.run(n6b, params)\n", - "m1 = ptdf_results.get_branch_flows_sensitivity_matrix()\n", - "m1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Transferring 1 MW of active power from the zone `FR` to the zone `IT` will cause a 0.3 MW shift on border line `S_SE_1`.\n", - "\n", - "Let’s obtain that directly. After running a sensitivity analysis to figure out the best zones, we can request a `FR` zone to slack sensitivity, a `FR` to `IT` zone to zone sensitivity, an `IT` to `FR` zone to zone sensitivity, and an `IT` zone to slack sensitivity on all the border lines `S_SE_1`, `S_SE_2`, `SE_NE_1` and `SE_NE_2`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.285407118Z" - } - }, - "outputs": [], - "source": [ - "sa = pp.sensitivity.create_dc_analysis()\n", - "sa.set_zones([zone_fr, zone_it])\n", - "sa.add_branch_flow_factor_matrix(branches_ids=['S_SE_1', 'S_SE_2', 'SE_NE_1', 'SE_NE_2'], variables_ids=['FR', ('FR', 'IT'), ('IT', 'FR'), 'IT'])\n", - "ptdf_result = sa.run(n6b, params)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2025-02-17T15:25:37.285521084Z" - } - }, - "outputs": [], - "source": [ - "m2 = ptdf_result.get_branch_flows_sensitivity_matrix()\n", - "m2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that:\n", - "- an increase of 1 MW on the `FR` zone net position leads to an increase of 0.2 MW on the flow of all the border lines.\n", - "- moving the flow of 1 MW from `FR` to `IT` leads to an increase of 0.3 MW on the flow of lines `S_SE_1` and `S_SE_2` and a decrease of 0.2 MW on the flow of lines `SE_NE_1` and `SE_NE_2`.\n", - "- moving the flow of 1 MW from `IT` to `FR` leads to a decrease of 0.3 MW on the flow of lines `S_SE_1` and `S_SE_2` and an increase of 0.2 MW on the flow of lines `SE_NE_1` and `SE_NE_2`.\n", - "- an increase of 1 MW on the `IT` zone net position leads to a decrease of 0.1 MW on the flow of lines `S_SE_1` and `S_SE_2` and an increase of 0.4 MW on the flow of lines `SE_NE_1` and `SE_NE_2`." - ] } ], "metadata": { From 5edb3c01a60aee6244683fe0a6c0af60c4448cc3 Mon Sep 17 00:00:00 2001 From: Philippe Edwards Date: Fri, 14 Mar 2025 11:50:24 +0100 Subject: [PATCH 03/18] added extra cases Signed-off-by: Philippe Edwards --- data/rao/N-1_case_crac_curative.json | 148 +++ ...rac_pst.json => N-1_case_crac_outage.json} | 28 +- data/rao/rao_parameters.json | 2 +- open_rao.ipynb | 905 ++++++++++++++++-- 4 files changed, 989 insertions(+), 94 deletions(-) create mode 100644 data/rao/N-1_case_crac_curative.json rename data/rao/{N_case_crac_pst.json => N-1_case_crac_outage.json} (80%) diff --git a/data/rao/N-1_case_crac_curative.json b/data/rao/N-1_case_crac_curative.json new file mode 100644 index 0000000..5d6e7b3 --- /dev/null +++ b/data/rao/N-1_case_crac_curative.json @@ -0,0 +1,148 @@ +{ + "type" : "CRAC", + "version" : "2.6", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "crac", + "name" : "crac", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "Contingency DE2 DE3", + "networkElementsIds" : [ "DDE2AA1 DDE3AA1 1" ] + } ], + "flowCnecs" : [ { + "id" : "NNL2AA1 BBE3AA1 1 - preventive", + "name" : "NL2 BE3 1 - preventive", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "border" : "", + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "iMax" : [ NaN ], + "nominalV" : [ 400 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -410.0, + "max" : 410.0, + "side" : 1 + } ] + }, { + "id" : "NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage", + "name" : "NL2 BE3 1 - Contingency DE2 DE3 - outage", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "instant" : "outage", + "contingencyId" : "Contingency DE2 DE3", + "optimized" : true, + "monitored" : false, + "iMax" : [ NaN ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -450.0, + "max" : 450.0, + "side" : 1 + } ] + }, { + "id" : "BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative", + "name" : "BE1 BE2 1 - Contingency DE2 DE3 - curative", + "networkElementId" : "BBE1AA1 BBE2AA1 1", + "operator" : null, + "instant" : "curative", + "contingencyId" : "Contingency DE2 DE3", + "optimized" : true, + "monitored" : false, + "iMax" : [ NaN ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -300.0, + "max" : 300.0, + "side" : 1 + } ] + } ], + "angleCnecs" : [ ], + "voltageCnecs" : [ ], + "pstRangeActions" : [ { + "id" : "pst-range-action", + "name" : "pst-range-action", + "operator" : null, + "onInstantUsageRules" : [ { + "instant" : "preventive", + "usageMethod" : "available" + }, { + "instant" : "curative", + "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" : -10, + "max" : 10, + "rangeType" : "absolute" + } ] + } ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "close NL2 BE3 2", + "name" : "close NL2 BE3 2", + "operator" : null, + "onInstantUsageRules" : [ { + "instant" : "preventive", + "usageMethod" : "available" + } ], + "terminalsConnectionActions" : [ { + "networkElementId" : "NNL2AA1 BBE3AA1 2", + "actionType" : "close" + } ] + } ] +} \ No newline at end of file diff --git a/data/rao/N_case_crac_pst.json b/data/rao/N-1_case_crac_outage.json similarity index 80% rename from data/rao/N_case_crac_pst.json rename to data/rao/N-1_case_crac_outage.json index e2e0a83..0b0cbdf 100644 --- a/data/rao/N_case_crac_pst.json +++ b/data/rao/N-1_case_crac_outage.json @@ -16,10 +16,13 @@ } ], "ra-usage-limits-per-instant" : [ ], "networkElementsNamePerId" : { }, - "contingencies" : [ ], + "contingencies" : [ { + "id" : "Contingency DE2 DE3", + "networkElementsIds" : [ "DDE2AA1 DDE3AA1 1" ] + } ], "flowCnecs" : [ { "id" : "NNL2AA1 BBE3AA1 1 - preventive", - "name" : "NNL2AA1 BBE3AA1 1 - preventive", + "name" : "NL2 BE3 1 - preventive", "networkElementId" : "NNL2AA1 BBE3AA1 1", "operator" : null, "border" : "", @@ -35,6 +38,23 @@ "max" : 410.0, "side" : 1 } ] + }, { + "id" : "NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage", + "name" : "NL2 BE3 1 - Contingency DE2 DE3 - outage", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "instant" : "outage", + "contingencyId" : "Contingency DE2 DE3", + "optimized" : true, + "monitored" : false, + "iMax" : [ NaN ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -450.0, + "max" : 450.0, + "side" : 1 + } ] } ], "angleCnecs" : [ ], "voltageCnecs" : [ ], @@ -84,8 +104,8 @@ "16" : 6.2276423729910535 }, "ranges" : [ { - "min" : -16, - "max" : 16, + "min" : -10, + "max" : 10, "rangeType" : "absolute" } ] } ], diff --git a/data/rao/rao_parameters.json b/data/rao/rao_parameters.json index c46ae5f..ce70e39 100644 --- a/data/rao/rao_parameters.json +++ b/data/rao/rao_parameters.json @@ -29,7 +29,7 @@ "injection-ra-sensitivity-threshold" : 1.0E-6, "ra-range-shrinking" : "DISABLED", "linear-optimization-solver" : { - "solver" : "XPRESS", + "solver" : "CBC", "relative-mip-gap" : 0.001, "solver-specific-parameters" : null } diff --git a/open_rao.ipynb b/open_rao.ipynb index b03daf3..6b5c17f 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -18,11 +18,11 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 41, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:25:34.383197361Z", - "start_time": "2025-02-17T15:25:32.744427175Z" + "end_time": "2025-03-14T10:48:07.760981912Z", + "start_time": "2025-03-14T10:47:46.194805589Z" } }, "outputs": [ @@ -40,9 +40,6 @@ "Requirement already satisfied: numpy>=1.20.3 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (1.24.4)\r\n", "Requirement already satisfied: wcwidth in ./venv/lib/python3.8/site-packages (from prettytable>=2.0.0->pypowsybl) (0.2.13)\r\n", "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=2.0.3->pypowsybl) (1.17.0)\r\n", - "\r\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m23.2.1\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.0.1\u001B[0m\r\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -53,11 +50,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 42, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:25:35.168881770Z", - "start_time": "2025-02-17T15:25:34.381240192Z" + "end_time": "2025-03-14T10:48:07.764415546Z", + "start_time": "2025-03-14T10:48:07.760825740Z" } }, "outputs": [], @@ -74,14 +71,42 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 43, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:25:35.184776118Z", - "start_time": "2025-02-17T15:25:35.157897144Z" + "end_time": "2025-03-14T10:48:07.765410433Z", + "start_time": "2025-03-14T10:48:07.764315293Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-03-14 11:48:07,732 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,733 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,734 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,734 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,735 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,735 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,735 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,737 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,738 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,738 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,739 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,740 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,740 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,741 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,741 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,742 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,742 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,742 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-03-14 11:48:07,743 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-03-14 11:48:07,743 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-03-14 11:48:07,743 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n" + ] + } + ], "source": [ "n12 = pp.network.load('./data/rao/12_node_network.uct')" ] @@ -95,20 +120,29 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 44, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:25:35.225348206Z", - "start_time": "2025-02-17T15:25:35.218254615Z" + "end_time": "2025-03-14T10:48:07.817610701Z", + "start_time": "2025-03-14T10:48:07.769558501Z" } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-03-14 11:48:07,768 - INFO - Number of steps: 688\n", + "2025-03-14 11:48:07,769 - INFO - Elapsed time: 0.002464741\n", + "2025-03-14 11:48:07,769 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + ] + }, { "data": { - "text/plain": "", + "text/plain": "", "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / °
\n
\n
kV / °
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n
\n
\n" }, - "execution_count": 4, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -133,20 +167,132 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 45, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:25:35.244360011Z", - "start_time": "2025-02-17T15:25:35.225516338Z" + "end_time": "2025-03-14T10:48:07.829609046Z", + "start_time": "2025-03-14T10:48:07.794701819Z" } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-03-14 11:48:07,795 - INFO - loadflow provider used is : OpenLoadFlow\n", + "2025-03-14 11:48:07,796 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.14.1, gitVersion=092b42a34ce74e1a2fe7c58ce5b5422945218e8d, gitBranch=UNKNOWN, buildTimestamp=2024-12-18T10:01:21.754Z}\n", + "2025-03-14 11:48:07,803 - INFO - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ true │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-03-14 11:48:07,804 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,805 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,805 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-03-14 11:48:07,805 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,806 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,806 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-03-14 11:48:07,807 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", + "2025-03-14 11:48:07,807 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,811 - INFO - Load flow ran in 14 ms\n", + "2025-03-14 11:48:07,815 - INFO - Number of steps: 688\n", + "2025-03-14 11:48:07,816 - INFO - Elapsed time: 0.002483723\n", + "2025-03-14 11:48:07,816 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + ] + }, { "data": { - "text/plain": "", + "text/plain": "", "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.0°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.0°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 5.3°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n
\n
\n" }, - "execution_count": 5, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -166,20 +312,132 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 46, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:25:35.261154030Z", - "start_time": "2025-02-17T15:25:35.244203832Z" + "end_time": "2025-03-14T10:48:07.874558349Z", + "start_time": "2025-03-14T10:48:07.828976676Z" } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-03-14 11:48:07,827 - INFO - loadflow provider used is : OpenLoadFlow\n", + "2025-03-14 11:48:07,828 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.14.1, gitVersion=092b42a34ce74e1a2fe7c58ce5b5422945218e8d, gitBranch=UNKNOWN, buildTimestamp=2024-12-18T10:01:21.754Z}\n", + "2025-03-14 11:48:07,831 - INFO - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ true │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-03-14 11:48:07,832 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,832 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,833 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-03-14 11:48:07,833 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,834 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Network extension bus')\n", + "2025-03-14 11:48:07,834 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-03-14 11:48:07,835 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", + "2025-03-14 11:48:07,835 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,836 - INFO - Load flow ran in 7 ms\n", + "2025-03-14 11:48:07,844 - INFO - Number of steps: 688\n", + "2025-03-14 11:48:07,845 - INFO - Elapsed time: 0.007388002\n", + "2025-03-14 11:48:07,845 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + ] + }, { "data": { - "text/plain": "", + "text/plain": "", "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.4°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.2°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 0.8°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.4°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.2°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.3°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.1°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 4.5°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 2.5°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 2.6°
\n
\n
\n
\n
\n" }, - "execution_count": 6, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -201,11 +459,11 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 47, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:31:17.745462470Z", - "start_time": "2025-02-17T15:31:17.655012160Z" + "end_time": "2025-03-14T10:48:07.928632340Z", + "start_time": "2025-03-14T10:48:07.872361892Z" } }, "outputs": [ @@ -213,59 +471,75 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-02-17 16:31:17,654 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,655 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,656 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,657 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,658 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,659 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,659 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,660 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,660 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,660 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,661 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,661 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,662 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,662 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,663 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,664 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,664 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-02-17 16:31:17,665 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-02-17 16:31:17,665 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-02-17 16:31:17,665 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-02-17 16:31:17,665 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-02-17 16:31:17,668 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", - "2025-02-17 16:31:17,668 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-02-17 16:31:17,669 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-02-17 16:31:17,669 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-02-17 16:31:17,670 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-02-17 16:31:17,670 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-02-17 16:31:17,670 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-02-17 16:31:17,671 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-02-17 16:31:17,671 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-02-17 16:31:17,671 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-02-17 16:31:17,672 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-02-17 16:31:17,672 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-02-17 16:31:17,672 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-02-17 16:31:17,673 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-02-17 16:31:17,673 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-02-17 16:31:17,673 - INFO - Linear optimization on root leaf\n", - "2025-02-17 16:31:17,708 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-02-17 16:31:17,708 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-02-17 16:31:17,709 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-02-17 16:31:17,709 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-02-17 16:31:17,710 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-02-17 16:31:17,710 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-02-17 16:31:17,711 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-02-17 16:31:17,711 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-02-17 16:31:17,712 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004236550663305749, distributedActivePower=0.0))\n", - "2025-02-17 16:31:17,713 - INFO - Iteration 1: better solution found with a cost of -83.86 (functional: -83.86)\n", - "2025-02-17 16:31:17,714 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-02-17 16:31:17,714 - INFO - Root leaf, 1 range action(s) activated, cost: -83.86 (functional: -83.86, virtual: 0.0)\n", - "2025-02-17 16:31:17,714 - INFO - range action(s): pst-range-action: -16\n", - "2025-02-17 16:31:17,714 - INFO - Limiting element #01: margin = 83.86 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-02-17 16:31:17,715 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 range action(s) activated : pst-range-action: -16, cost after preventive optimization = -83.86 (functional: -83.86, virtual: 0.0)\n", - "2025-02-17 16:31:17,715 - INFO - ----- Preventive perimeter optimization [end]\n" + "2025-03-14 11:48:07,859 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,860 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,860 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,861 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,862 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,862 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,862 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,863 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,863 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,863 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,864 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,864 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,864 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,865 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,865 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,865 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,865 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,866 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-03-14 11:48:07,866 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-03-14 11:48:07,867 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-03-14 11:48:07,867 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-03-14 11:48:07,870 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", + "2025-03-14 11:48:07,871 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,871 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,872 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-03-14 11:48:07,872 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,873 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,873 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-03-14 11:48:07,873 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-03-14 11:48:07,874 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,874 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,875 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-03-14 11:48:07,875 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,875 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-03-14 11:48:07,875 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-03-14 11:48:07,876 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,876 - INFO - Linear optimization on root leaf\n", + "2025-03-14 11:48:07,876 - INFO - No range actions to optimize\n", + "2025-03-14 11:48:07,877 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-03-14 11:48:07,877 - INFO - No range actions activated\n", + "2025-03-14 11:48:07,877 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,878 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-03-14 11:48:07,878 - INFO - Search depth 1 [start]\n", + "2025-03-14 11:48:07,878 - INFO - Leaves to evaluate: 1\n", + "2025-03-14 11:48:07,879 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-03-14 11:48:07,879 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,880 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,880 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-03-14 11:48:07,881 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,881 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,882 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-03-14 11:48:07,883 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-03-14 11:48:07,883 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,884 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,885 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-03-14 11:48:07,885 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-03-14 11:48:07,886 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-03-14 11:48:07,886 - INFO - Remaining leaves to evaluate: 0\n", + "2025-03-14 11:48:07,887 - INFO - Search depth 1 [end]\n", + "2025-03-14 11:48:07,887 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-03-14 11:48:07,888 - INFO - Search depth 1 best leaf: No range actions activated\n", + "2025-03-14 11:48:07,888 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,889 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-03-14 11:48:07,889 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-03-14 11:48:07,890 - INFO - Best leaf: No range actions activated\n", + "2025-03-14 11:48:07,890 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,891 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-03-14 11:48:07,891 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-03-14 11:48:07,892 - INFO - ----- Preventive perimeter optimization [end]\n" ] } ], @@ -273,7 +547,7 @@ "# prepare inputs\n", "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", "rao_runner = pp.rao.create_rao()\n", - "rao_runner.set_crac_file_source(n12, \"./data/rao/N_case_crac_pst.json\")\n", + "rao_runner.set_crac_file_source(n12, \"./data/rao/N_case_crac.json\")\n", "# set up logging\n", "import logging\n", "logging.getLogger('powsybl').setLevel(logging.INFO)\n", @@ -292,11 +566,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 48, "metadata": { "ExecuteTime": { - "end_time": "2025-02-17T15:25:37.117341329Z", - "start_time": "2025-02-17T15:25:37.109069952Z" + "end_time": "2025-03-14T10:48:07.928990671Z", + "start_time": "2025-03-14T10:48:07.909267116Z" } }, "outputs": [ @@ -304,7 +578,7 @@ "data": { "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO http://farao-community.github.io',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 90.0,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 201.67, 'side1': {'flow': 390.11}},\n 'megawatt': {'margin': 139.73, 'side1': {'flow': 270.27}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': []}" }, - "execution_count": 8, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -312,6 +586,459 @@ "source": [ "result_json" ] + }, + { + "cell_type": "markdown", + "source": [ + "We can see that initially there was a cost of +90 (which corresponds to a worst margin of -90MW, ie a worst overload of 90MW). Then after preventive actions, a cost of -139.73 (ie a worst margin of +139.73MW).\n", + "Then we have the results per flow cnec. And finally we have the information of what actions were applied. Here we applied the action \"close NL2 BE3 2\" in the preventive state.\n", + "For more information about the RaoResult, you can check this page: https://powsybl.readthedocs.io/projects/openrao/en/stable/output-data/rao-result.html" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "markdown", + "source": [ + "## 2 - N-1 outage overload" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "markdown", + "source": [ + "In this next case we added a flow cnec which limits the flow on the line NNL2AA1 and BBE3AA1 to 450MW, after the loss of the line between DDE2AA1 and DDE3AA1, at the outage instant (ie before we have the time to apply any actions - for more information about instants in OpenRAO you can check this page: https://powsybl.readthedocs.io/projects/openrao/en/stable/castor/rao-steps.html).\n", + "This flow cnec will be overloaded even with the application of the topological action. Thankfully, we also added a preventive PST to solve the new constraint." + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 49, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-03-14 11:48:07,902 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,902 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,902 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,903 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,903 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,904 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,904 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,905 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,906 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,906 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,907 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,907 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,908 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,908 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,908 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,909 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,909 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,910 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-03-14 11:48:07,910 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-03-14 11:48:07,911 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-03-14 11:48:07,911 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-03-14 11:48:07,914 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", + "2025-03-14 11:48:07,915 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-03-14 11:48:07,916 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,916 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,917 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-03-14 11:48:07,918 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,918 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,919 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-03-14 11:48:07,919 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-03-14 11:48:07,920 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,921 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,921 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:07,921 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,922 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,923 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-03-14 11:48:07,923 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,923 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,924 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-03-14 11:48:07,924 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-03-14 11:48:07,924 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,925 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,925 - INFO - Linear optimization on root leaf\n", + "2025-03-14 11:48:07,927 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,927 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,928 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-03-14 11:48:07,928 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,929 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,929 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-03-14 11:48:07,929 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-03-14 11:48:07,930 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,930 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,931 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:07,931 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,931 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,932 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-03-14 11:48:07,933 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-03-14 11:48:07,934 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-03-14 11:48:07,934 - INFO - range action(s): pst-range-action: -10\n", + "2025-03-14 11:48:07,934 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,935 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,935 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-03-14 11:48:07,936 - INFO - Search depth 1 [start]\n", + "2025-03-14 11:48:07,936 - INFO - Leaves to evaluate: 1\n", + "2025-03-14 11:48:07,936 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-03-14 11:48:07,937 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,938 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,938 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-03-14 11:48:07,939 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,939 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,940 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-03-14 11:48:07,940 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-03-14 11:48:07,940 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,941 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,942 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:07,942 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,943 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,943 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,944 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,944 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-03-14 11:48:07,945 - INFO - Remaining leaves to evaluate: 0\n", + "2025-03-14 11:48:07,945 - INFO - Search depth 1 [end]\n", + "2025-03-14 11:48:07,946 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,946 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-03-14 11:48:07,947 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,947 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,948 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-03-14 11:48:07,948 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,949 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-03-14 11:48:07,949 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,950 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,950 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,951 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-03-14 11:48:07,951 - INFO - ----- Preventive perimeter optimization [end]\n" + ] + } + ], + "source": [ + "# prepare inputs\n", + "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(n12, \"./data/rao/N-1_case_crac_outage.json\")\n", + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", + "#run rao\n", + "raoResult = rao_runner.run(n12)\n", + "result_json = raoResult.to_json()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-03-14T10:48:08.006506582Z", + "start_time": "2025-03-14T10:48:07.909471398Z" + } + } + }, + { + "cell_type": "code", + "execution_count": 50, + "outputs": [ + { + "data": { + "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO http://farao-community.github.io',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778}]}]}" + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result_json" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-03-14T10:48:08.007061002Z", + "start_time": "2025-03-14T10:48:07.968699116Z" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "This time the initial worse overload was 133MW on the outage cnec. If you check the logs carefully (currently we cannot separate the OLF logs from the OpenRAO logs in pypowsybl which makes it a bit hard to read), you can see that we initially tried to solve the constraints with just the PST (root leaf), and still had an overload of 42MW.\n", + "Then we tried applying the topological action and reoptimized the pst, and ended up with a worst margin of 187MW! " + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "markdown", + "source": [ + "## 3 - N-1 curative overload" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "markdown", + "source": [ + "In this final case, we will also check the flow on line BE1 BE2, but this time at the curative instant. We will change the usage rule on the PST to be able to move it in curative to be able to solve the new constraint we have on the line." + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 51, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-03-14 11:48:07,965 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,965 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,966 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,966 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,966 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,967 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,967 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,967 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,967 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,968 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,968 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,968 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,969 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,969 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,969 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,970 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,970 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-03-14 11:48:07,970 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-03-14 11:48:07,970 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-03-14 11:48:07,970 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-03-14 11:48:07,971 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-03-14 11:48:07,973 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", + "2025-03-14 11:48:07,974 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,974 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,975 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-03-14 11:48:07,975 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,975 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,976 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-03-14 11:48:07,976 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-03-14 11:48:07,976 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,977 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,977 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:07,978 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,978 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,978 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-03-14 11:48:07,979 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,979 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,979 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-03-14 11:48:07,979 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-03-14 11:48:07,980 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,980 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,980 - INFO - Linear optimization on root leaf\n", + "2025-03-14 11:48:07,982 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,982 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-03-14 11:48:07,984 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-03-14 11:48:07,984 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,985 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,985 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:07,985 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,985 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,986 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-03-14 11:48:07,987 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-03-14 11:48:07,987 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-03-14 11:48:07,988 - INFO - range action(s): pst-range-action: -10\n", + "2025-03-14 11:48:07,988 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,989 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,989 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-03-14 11:48:07,989 - INFO - Search depth 1 [start]\n", + "2025-03-14 11:48:07,989 - INFO - Leaves to evaluate: 1\n", + "2025-03-14 11:48:07,990 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-03-14 11:48:07,990 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:07,991 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:07,991 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-03-14 11:48:07,991 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:07,992 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-03-14 11:48:07,992 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-03-14 11:48:07,992 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-03-14 11:48:07,992 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,993 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,993 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:07,994 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:07,994 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-03-14 11:48:07,994 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,995 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,995 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-03-14 11:48:07,995 - INFO - Remaining leaves to evaluate: 0\n", + "2025-03-14 11:48:07,996 - INFO - Search depth 1 [end]\n", + "2025-03-14 11:48:07,996 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,997 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-03-14 11:48:07,998 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:07,998 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:07,998 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-03-14 11:48:07,999 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:07,999 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-03-14 11:48:08,000 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:08,000 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:08,000 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-03-14 11:48:08,000 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-03-14 11:48:08,001 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-03-14 11:48:08,001 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-03-14 11:48:08,002 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:08,002 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:08,002 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-03-14 11:48:08,003 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:08,003 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-03-14 11:48:08,003 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-03-14 11:48:08,004 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-03-14 11:48:08,004 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:08,005 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-03-14 11:48:08,005 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:08,006 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:08,007 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-03-14 11:48:08,007 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-03-14 11:48:08,008 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-03-14 11:48:08,008 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:08,009 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-03-14 11:48:08,009 - INFO - Using base network '12_node_network' on variant 'ContingencyScenariob044c8e4-4814-4865-8a3a-a1d2a9985894'\n", + "2025-03-14 11:48:08,010 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-03-14 11:48:08,010 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-03-14 11:48:08,011 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-03-14 11:48:08,011 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-03-14 11:48:08,012 - INFO - Linear optimization on root leaf\n", + "2025-03-14 11:48:08,014 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-03-14 11:48:08,015 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-03-14 11:48:08,015 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-03-14 11:48:08,015 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-03-14 11:48:08,016 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-03-14 11:48:08,016 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-03-14 11:48:08,016 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-03-14 11:48:08,017 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:08,018 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", + "2025-03-14 11:48:08,019 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-03-14 11:48:08,019 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-03-14 11:48:08,020 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", + "2025-03-14 11:48:08,020 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-03-14 11:48:08,022 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-03-14 11:48:08,023 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-03-14 11:48:08,024 - INFO - range action(s): pst-range-action: 6\n", + "2025-03-14 11:48:08,025 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-03-14 11:48:08,026 - INFO - No network action available\n", + "2025-03-14 11:48:08,026 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-03-14 11:48:08,027 - INFO - Best leaf: Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-03-14 11:48:08,027 - INFO - Best leaf: range action(s): pst-range-action: 6\n", + "2025-03-14 11:48:08,028 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-03-14 11:48:08,028 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-03-14 11:48:08,029 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-03-14 11:48:08,029 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-03-14 11:48:08,030 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-03-14 11:48:08,030 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-03-14 11:48:08,030 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-03-14 11:48:08,031 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-03-14 11:48:08,031 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + ] + } + ], + "source": [ + "# prepare inputs\n", + "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(n12, \"./data/rao/N-1_case_crac_curative.json\")\n", + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", + "#run rao\n", + "raoResult = rao_runner.run(n12)\n", + "result_json = raoResult.to_json()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-03-14T10:48:08.104953692Z", + "start_time": "2025-03-14T10:48:07.968910608Z" + } + } + }, + { + "cell_type": "code", + "execution_count": 52, + "outputs": [ + { + "data": { + "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO http://farao-community.github.io',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778},\n {'instant': 'curative',\n 'contingency': 'Contingency DE2 DE3',\n 'setpoint': 2.337343603803646}]}]}" + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result_json" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-03-14T10:48:08.105264836Z", + "start_time": "2025-03-14T10:48:08.042663687Z" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "This time, after preventive actions, we still have a positive cost (ie an overload). And it's only after the curative actions the cost finally becomes negative.\n", + "More precisely, we can check the informations for the curative cnec we added:\n" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 53, + "outputs": [ + { + "data": { + "text/plain": "[{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}}]" + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x for x in result_json.get(\"flowCnecResults\") if x.get(\"flowCnecId\") == 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative']" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-03-14T10:48:08.105501595Z", + "start_time": "2025-03-14T10:48:08.042864962Z" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "As you can see, with no actions, there's actually a margin of 152MW on the line in curative! But by applying preventive actions (that aimed to solve the preventive and outage cnecs), we made the curative cnec unsecure, and we had to apply some curative action to make it secure again." + ], + "metadata": { + "collapsed": false + } } ], "metadata": { From ac2affe36d86f698264a6b1802b89c4a3344bea8 Mon Sep 17 00:00:00 2001 From: Philippe Edwards Date: Fri, 18 Apr 2025 11:33:55 +0200 Subject: [PATCH 04/18] updated crac files to new version Signed-off-by: Philippe Edwards --- data/rao/N-1_case_crac_curative.json | 38 +- data/rao/N-1_case_crac_outage.json | 38 +- data/rao/N_case_crac.json | 2 +- open_rao.ipynb | 880 ++++++++++++++------------- 4 files changed, 446 insertions(+), 512 deletions(-) diff --git a/data/rao/N-1_case_crac_curative.json b/data/rao/N-1_case_crac_curative.json index 5d6e7b3..cd2d66f 100644 --- a/data/rao/N-1_case_crac_curative.json +++ b/data/rao/N-1_case_crac_curative.json @@ -1,6 +1,6 @@ { "type" : "CRAC", - "version" : "2.6", + "version" : "2.7", "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", "id" : "crac", "name" : "crac", @@ -87,42 +87,6 @@ "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" : -10, "max" : 10, diff --git a/data/rao/N-1_case_crac_outage.json b/data/rao/N-1_case_crac_outage.json index 0b0cbdf..328440a 100644 --- a/data/rao/N-1_case_crac_outage.json +++ b/data/rao/N-1_case_crac_outage.json @@ -1,6 +1,6 @@ { "type" : "CRAC", - "version" : "2.6", + "version" : "2.7", "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", "id" : "crac", "name" : "crac", @@ -67,42 +67,6 @@ "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" : -10, "max" : 10, diff --git a/data/rao/N_case_crac.json b/data/rao/N_case_crac.json index a181693..11e97e7 100644 --- a/data/rao/N_case_crac.json +++ b/data/rao/N_case_crac.json @@ -1,6 +1,6 @@ { "type" : "CRAC", - "version" : "2.6", + "version" : "2.7", "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", "id" : "crac", "name" : "crac", diff --git a/open_rao.ipynb b/open_rao.ipynb index 6b5c17f..ab1f034 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -18,11 +18,11 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 24, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.760981912Z", - "start_time": "2025-03-14T10:47:46.194805589Z" + "end_time": "2025-04-18T09:32:33.528541896Z", + "start_time": "2025-04-18T09:32:32.442366605Z" } }, "outputs": [ @@ -30,31 +30,31 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: pypowsybl in ./venv/lib/python3.8/site-packages (1.10.0)\r\n", - "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.8/site-packages (from pypowsybl) (3.11.0)\r\n", - "Requirement already satisfied: networkx in ./venv/lib/python3.8/site-packages (from pypowsybl) (3.1)\r\n", - "Requirement already satisfied: pandas>=2.0.3 in ./venv/lib/python3.8/site-packages (from pypowsybl) (2.0.3)\r\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (2.9.0.post0)\r\n", - "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (2025.1)\r\n", - "Requirement already satisfied: tzdata>=2022.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (2025.1)\r\n", - "Requirement already satisfied: numpy>=1.20.3 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl) (1.24.4)\r\n", - "Requirement already satisfied: wcwidth in ./venv/lib/python3.8/site-packages (from prettytable>=2.0.0->pypowsybl) (0.2.13)\r\n", - "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=2.0.3->pypowsybl) (1.17.0)\r\n", + "Requirement already satisfied: pypowsybl==1.11.0 in ./venv/lib/python3.8/site-packages (1.11.0)\r\n", + "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.8/site-packages (from pypowsybl==1.11.0) (3.11.0)\r\n", + "Requirement already satisfied: networkx in ./venv/lib/python3.8/site-packages (from pypowsybl==1.11.0) (3.1)\r\n", + "Requirement already satisfied: pandas>=2.0.3 in ./venv/lib/python3.8/site-packages (from pypowsybl==1.11.0) (2.0.3)\r\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (2.9.0.post0)\r\n", + "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (2025.1)\r\n", + "Requirement already satisfied: tzdata>=2022.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (2025.1)\r\n", + "Requirement already satisfied: numpy>=1.20.3 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (1.24.4)\r\n", + "Requirement already satisfied: wcwidth in ./venv/lib/python3.8/site-packages (from prettytable>=2.0.0->pypowsybl==1.11.0) (0.2.13)\r\n", + "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=2.0.3->pypowsybl==1.11.0) (1.17.0)\r\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ - "pip install pypowsybl" + "pip install pypowsybl==1.11.0" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 25, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.764415546Z", - "start_time": "2025-03-14T10:48:07.760825740Z" + "end_time": "2025-04-18T09:32:33.533926615Z", + "start_time": "2025-04-18T09:32:33.529383014Z" } }, "outputs": [], @@ -71,11 +71,11 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 26, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.765410433Z", - "start_time": "2025-03-14T10:48:07.764315293Z" + "end_time": "2025-04-18T09:32:33.602976499Z", + "start_time": "2025-04-18T09:32:33.533823898Z" } }, "outputs": [ @@ -83,27 +83,27 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-03-14 11:48:07,732 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,733 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,734 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,734 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,735 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,735 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,735 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,737 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,738 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,738 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,739 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,740 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,740 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,741 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,741 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,742 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,742 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,742 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-03-14 11:48:07,743 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-03-14 11:48:07,743 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-03-14 11:48:07,743 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n" + "2025-04-18 11:32:33,533 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,534 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,535 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,535 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,536 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,537 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,537 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,538 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,538 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,539 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,540 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,540 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,541 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,541 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,542 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,543 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,543 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,544 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-04-18 11:32:33,544 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-04-18 11:32:33,545 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-04-18 11:32:33,546 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n" ] } ], @@ -120,11 +120,11 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 27, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.817610701Z", - "start_time": "2025-03-14T10:48:07.769558501Z" + "end_time": "2025-04-18T09:32:33.603648677Z", + "start_time": "2025-04-18T09:32:33.581987020Z" } }, "outputs": [ @@ -132,17 +132,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-03-14 11:48:07,768 - INFO - Number of steps: 688\n", - "2025-03-14 11:48:07,769 - INFO - Elapsed time: 0.002464741\n", - "2025-03-14 11:48:07,769 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + "2025-04-18 11:32:33,556 - INFO - Number of steps: 688\n", + "2025-04-18 11:32:33,557 - INFO - Elapsed time: 0.004712575\n", + "2025-04-18 11:32:33,558 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" ] }, { "data": { - "text/plain": "", - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / °
\n
\n
kV / °
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n
\n
\n" + "text/plain": "", + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / °
\n
\n
kV / °
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n
\n
\n" }, - "execution_count": 44, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -167,11 +167,11 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 28, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.829609046Z", - "start_time": "2025-03-14T10:48:07.794701819Z" + "end_time": "2025-04-18T09:32:33.606127251Z", + "start_time": "2025-04-18T09:32:33.582616646Z" } }, "outputs": [ @@ -179,9 +179,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-03-14 11:48:07,795 - INFO - loadflow provider used is : OpenLoadFlow\n", - "2025-03-14 11:48:07,796 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.14.1, gitVersion=092b42a34ce74e1a2fe7c58ce5b5422945218e8d, gitBranch=UNKNOWN, buildTimestamp=2024-12-18T10:01:21.754Z}\n", - "2025-03-14 11:48:07,803 - INFO - Parameters:\n", + "2025-04-18 11:32:33,574 - INFO - loadflow provider used is : OpenLoadFlow\n", + "2025-04-18 11:32:33,575 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.15.0, gitVersion=2e871e075f1748c0dfa7eac6fedb17fcde4219f8, gitBranch=UNKNOWN, buildTimestamp=2025-03-26T13:23:26.221Z}\n", + "2025-04-18 11:32:33,579 - INFO - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", @@ -194,7 +194,8 @@ "│ FastRestart │ actionableSwitchesIds │ [] │\n", "│ │ actionableTransformersIds │ [] │\n", "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", @@ -202,6 +203,7 @@ "│ │ svcVoltageMonitoring │ true │\n", "│ │ voltagePerReactivePowerControl │ false │\n", "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", "│ HVDC │ hvdcAcEmulation │ true │\n", "│ Model │ asymmetrical │ false │\n", "│ │ dc │ true │\n", @@ -219,12 +221,10 @@ "│ │ maxNewtonRaphsonIterations │ 15 │\n", "│ │ maxRatioMismatch │ 1.0E-5 │\n", "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", "│ │ stateVectorScalingMode │ NONE │\n", @@ -233,7 +233,8 @@ "│ Performance │ computedConnectedComponentScope │ MAIN │\n", "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ ReactivePowerControl │ forceTargetQInReactiveLimits │ false │\n", + "│ │ generatorReactivePowerRemoteControl │ false │\n", "│ │ transformerReactivePowerControl │ false │\n", "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", "│ │ writeReferenceTerminals │ true │\n", @@ -265,34 +266,36 @@ "│ │ transformerVoltageControlOn │ false │\n", "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", "│ │ secondaryVoltageControl │ false │\n", "│ │ useReactiveLimits │ true │\n", "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-03-14 11:48:07,804 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,805 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,805 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-03-14 11:48:07,805 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,806 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,806 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-03-14 11:48:07,807 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", - "2025-03-14 11:48:07,807 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,811 - INFO - Load flow ran in 14 ms\n", - "2025-03-14 11:48:07,815 - INFO - Number of steps: 688\n", - "2025-03-14 11:48:07,816 - INFO - Elapsed time: 0.002483723\n", - "2025-03-14 11:48:07,816 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + "2025-04-18 11:32:33,580 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,581 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,582 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-18 11:32:33,582 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,583 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,584 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-18 11:32:33,584 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", + "2025-04-18 11:32:33,585 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,586 - INFO - Load flow ran in 10 ms\n", + "2025-04-18 11:32:33,591 - INFO - Number of steps: 688\n", + "2025-04-18 11:32:33,591 - INFO - Elapsed time: 0.004040466\n", + "2025-04-18 11:32:33,592 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" ] }, { "data": { - "text/plain": "", - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.0°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.0°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 5.3°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n
\n
\n" + "text/plain": "", + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.0°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.0°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 5.3°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n
\n
\n" }, - "execution_count": 45, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -312,11 +315,11 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 29, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.874558349Z", - "start_time": "2025-03-14T10:48:07.828976676Z" + "end_time": "2025-04-18T09:32:33.701392845Z", + "start_time": "2025-04-18T09:32:33.605150158Z" } }, "outputs": [ @@ -324,9 +327,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-03-14 11:48:07,827 - INFO - loadflow provider used is : OpenLoadFlow\n", - "2025-03-14 11:48:07,828 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.14.1, gitVersion=092b42a34ce74e1a2fe7c58ce5b5422945218e8d, gitBranch=UNKNOWN, buildTimestamp=2024-12-18T10:01:21.754Z}\n", - "2025-03-14 11:48:07,831 - INFO - Parameters:\n", + "2025-04-18 11:32:33,603 - INFO - loadflow provider used is : OpenLoadFlow\n", + "2025-04-18 11:32:33,604 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.15.0, gitVersion=2e871e075f1748c0dfa7eac6fedb17fcde4219f8, gitBranch=UNKNOWN, buildTimestamp=2025-03-26T13:23:26.221Z}\n", + "2025-04-18 11:32:33,610 - INFO - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", @@ -339,7 +342,8 @@ "│ FastRestart │ actionableSwitchesIds │ [] │\n", "│ │ actionableTransformersIds │ [] │\n", "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", @@ -347,6 +351,7 @@ "│ │ svcVoltageMonitoring │ true │\n", "│ │ voltagePerReactivePowerControl │ false │\n", "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", "│ HVDC │ hvdcAcEmulation │ true │\n", "│ Model │ asymmetrical │ false │\n", "│ │ dc │ true │\n", @@ -364,12 +369,10 @@ "│ │ maxNewtonRaphsonIterations │ 15 │\n", "│ │ maxRatioMismatch │ 1.0E-5 │\n", "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", "│ │ stateVectorScalingMode │ NONE │\n", @@ -378,7 +381,8 @@ "│ Performance │ computedConnectedComponentScope │ MAIN │\n", "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ ReactivePowerControl │ forceTargetQInReactiveLimits │ false │\n", + "│ │ generatorReactivePowerRemoteControl │ false │\n", "│ │ transformerReactivePowerControl │ false │\n", "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", "│ │ writeReferenceTerminals │ true │\n", @@ -410,34 +414,36 @@ "│ │ transformerVoltageControlOn │ false │\n", "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", "│ │ secondaryVoltageControl │ false │\n", "│ │ useReactiveLimits │ true │\n", "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-03-14 11:48:07,832 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,832 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,833 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-03-14 11:48:07,833 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,834 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Network extension bus')\n", - "2025-03-14 11:48:07,834 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-03-14 11:48:07,835 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", - "2025-03-14 11:48:07,835 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,836 - INFO - Load flow ran in 7 ms\n", - "2025-03-14 11:48:07,844 - INFO - Number of steps: 688\n", - "2025-03-14 11:48:07,845 - INFO - Elapsed time: 0.007388002\n", - "2025-03-14 11:48:07,845 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + "2025-04-18 11:32:33,611 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,612 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,613 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-18 11:32:33,613 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,614 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Network extension bus')\n", + "2025-04-18 11:32:33,614 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-18 11:32:33,615 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", + "2025-04-18 11:32:33,616 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,617 - INFO - Load flow ran in 11 ms\n", + "2025-04-18 11:32:33,623 - INFO - Number of steps: 688\n", + "2025-04-18 11:32:33,623 - INFO - Elapsed time: 0.004942797\n", + "2025-04-18 11:32:33,624 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" ] }, { "data": { - "text/plain": "", - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.4°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.2°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 0.8°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.4°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.2°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.3°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.1°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 4.5°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 2.5°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 2.6°
\n
\n
\n
\n
\n" + "text/plain": "", + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.4°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.2°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 0.8°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.4°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.2°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.3°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.1°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 4.5°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 2.5°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 2.6°
\n
\n
\n
\n
\n" }, - "execution_count": 46, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -459,11 +465,11 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 30, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.928632340Z", - "start_time": "2025-03-14T10:48:07.872361892Z" + "end_time": "2025-04-18T09:32:33.714077978Z", + "start_time": "2025-04-18T09:32:33.637953858Z" } }, "outputs": [ @@ -471,75 +477,77 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-03-14 11:48:07,859 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,860 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,860 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,861 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,862 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,862 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,862 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,863 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,863 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,863 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,864 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,864 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,864 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,865 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,865 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,865 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,865 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,866 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-03-14 11:48:07,866 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-03-14 11:48:07,867 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-03-14 11:48:07,867 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-03-14 11:48:07,870 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", - "2025-03-14 11:48:07,871 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,871 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,872 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-03-14 11:48:07,872 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,873 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,873 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-03-14 11:48:07,873 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-03-14 11:48:07,874 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,874 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,875 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-03-14 11:48:07,875 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,875 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-03-14 11:48:07,875 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-03-14 11:48:07,876 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,876 - INFO - Linear optimization on root leaf\n", - "2025-03-14 11:48:07,876 - INFO - No range actions to optimize\n", - "2025-03-14 11:48:07,877 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-03-14 11:48:07,877 - INFO - No range actions activated\n", - "2025-03-14 11:48:07,877 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,878 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-03-14 11:48:07,878 - INFO - Search depth 1 [start]\n", - "2025-03-14 11:48:07,878 - INFO - Leaves to evaluate: 1\n", - "2025-03-14 11:48:07,879 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-03-14 11:48:07,879 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,880 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,880 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-03-14 11:48:07,881 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,881 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,882 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-03-14 11:48:07,883 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-03-14 11:48:07,883 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,884 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,885 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-03-14 11:48:07,885 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-03-14 11:48:07,886 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-03-14 11:48:07,886 - INFO - Remaining leaves to evaluate: 0\n", - "2025-03-14 11:48:07,887 - INFO - Search depth 1 [end]\n", - "2025-03-14 11:48:07,887 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-03-14 11:48:07,888 - INFO - Search depth 1 best leaf: No range actions activated\n", - "2025-03-14 11:48:07,888 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,889 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-03-14 11:48:07,889 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-03-14 11:48:07,890 - INFO - Best leaf: No range actions activated\n", - "2025-03-14 11:48:07,890 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,891 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-03-14 11:48:07,891 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-03-14 11:48:07,892 - INFO - ----- Preventive perimeter optimization [end]\n" + "2025-04-18 11:32:33,637 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,638 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,639 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,639 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,640 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,641 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,641 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,642 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,643 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,643 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,644 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,644 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,645 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,646 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,646 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,647 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,647 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,648 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-04-18 11:32:33,648 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-04-18 11:32:33,649 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-04-18 11:32:33,649 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-04-18 11:32:33,653 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", + "2025-04-18 11:32:33,654 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,655 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,656 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-18 11:32:33,656 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,657 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,657 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-18 11:32:33,658 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-04-18 11:32:33,659 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,660 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,661 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-04-18 11:32:33,661 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,662 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-04-18 11:32:33,662 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-04-18 11:32:33,663 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,663 - INFO - Linear optimization on root leaf\n", + "2025-04-18 11:32:33,663 - INFO - No range actions to optimize\n", + "2025-04-18 11:32:33,664 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-04-18 11:32:33,664 - INFO - No range actions activated\n", + "2025-04-18 11:32:33,665 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,665 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-04-18 11:32:33,665 - INFO - Search depth 1 [start]\n", + "2025-04-18 11:32:33,666 - INFO - Leaves to evaluate: 1\n", + "2025-04-18 11:32:33,666 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-18 11:32:33,667 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,668 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,669 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-18 11:32:33,669 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,670 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,670 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-18 11:32:33,671 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-04-18 11:32:33,671 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,673 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,673 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-18 11:32:33,674 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-18 11:32:33,674 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-04-18 11:32:33,675 - INFO - Remaining leaves to evaluate: 0\n", + "2025-04-18 11:32:33,675 - INFO - Search depth 1 [end]\n", + "2025-04-18 11:32:33,676 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-18 11:32:33,676 - INFO - Search depth 1 best leaf: No range actions activated\n", + "2025-04-18 11:32:33,676 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,677 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-04-18 11:32:33,677 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-18 11:32:33,677 - INFO - Best leaf: No range actions activated\n", + "2025-04-18 11:32:33,678 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,678 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-18 11:32:33,678 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-18 11:32:33,679 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-04-18 11:32:33,679 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,679 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" ] } ], @@ -566,19 +574,19 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 31, "metadata": { "ExecuteTime": { - "end_time": "2025-03-14T10:48:07.928990671Z", - "start_time": "2025-03-14T10:48:07.909267116Z" + "end_time": "2025-04-18T09:32:33.774154207Z", + "start_time": "2025-04-18T09:32:33.730185548Z" } }, "outputs": [ { "data": { - "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO http://farao-community.github.io',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 90.0,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 201.67, 'side1': {'flow': 390.11}},\n 'megawatt': {'margin': 139.73, 'side1': {'flow': 270.27}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': []}" + "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 90.0,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 201.67, 'side1': {'flow': 390.11}},\n 'megawatt': {'margin': 139.73, 'side1': {'flow': 270.27}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': []}" }, - "execution_count": 48, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -619,106 +627,109 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 32, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-03-14 11:48:07,902 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,902 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,902 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,903 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,903 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,904 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,904 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,905 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,906 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,906 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,907 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,907 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,908 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,908 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,908 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,909 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,909 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,910 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-03-14 11:48:07,910 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-03-14 11:48:07,911 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-03-14 11:48:07,911 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-03-14 11:48:07,914 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", - "2025-03-14 11:48:07,915 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-03-14 11:48:07,916 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,916 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,917 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-03-14 11:48:07,918 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,918 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,919 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-03-14 11:48:07,919 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-03-14 11:48:07,920 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,921 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,921 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:07,921 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,922 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,923 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-03-14 11:48:07,923 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,923 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,924 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-03-14 11:48:07,924 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-03-14 11:48:07,924 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,925 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,925 - INFO - Linear optimization on root leaf\n", - "2025-03-14 11:48:07,927 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,927 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,928 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-03-14 11:48:07,928 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,929 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,929 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-03-14 11:48:07,929 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-03-14 11:48:07,930 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,930 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,931 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:07,931 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,931 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,932 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-03-14 11:48:07,933 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-03-14 11:48:07,934 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-03-14 11:48:07,934 - INFO - range action(s): pst-range-action: -10\n", - "2025-03-14 11:48:07,934 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,935 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,935 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-03-14 11:48:07,936 - INFO - Search depth 1 [start]\n", - "2025-03-14 11:48:07,936 - INFO - Leaves to evaluate: 1\n", - "2025-03-14 11:48:07,936 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-03-14 11:48:07,937 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,938 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,938 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-03-14 11:48:07,939 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,939 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,940 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-03-14 11:48:07,940 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-03-14 11:48:07,940 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,941 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,942 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:07,942 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,943 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,943 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,944 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,944 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-03-14 11:48:07,945 - INFO - Remaining leaves to evaluate: 0\n", - "2025-03-14 11:48:07,945 - INFO - Search depth 1 [end]\n", - "2025-03-14 11:48:07,946 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,946 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-03-14 11:48:07,947 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,947 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,948 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-03-14 11:48:07,948 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,949 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-03-14 11:48:07,949 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,950 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,950 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,951 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-03-14 11:48:07,951 - INFO - ----- Preventive perimeter optimization [end]\n" + "2025-04-18 11:32:33,691 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,691 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,692 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,692 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,693 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,693 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,694 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,694 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,694 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,695 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,695 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,696 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,696 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,696 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,697 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,697 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,697 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,698 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-04-18 11:32:33,698 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-04-18 11:32:33,698 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-04-18 11:32:33,699 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-04-18 11:32:33,704 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", + "2025-04-18 11:32:33,704 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-04-18 11:32:33,706 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,706 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,707 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-18 11:32:33,708 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,709 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,710 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-18 11:32:33,710 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-18 11:32:33,711 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,712 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,713 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,724 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,725 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,726 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-18 11:32:33,727 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,727 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,728 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-04-18 11:32:33,729 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-18 11:32:33,729 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,730 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,731 - INFO - Linear optimization on root leaf\n", + "2025-04-18 11:32:33,734 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,735 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,736 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-18 11:32:33,737 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,738 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,739 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-18 11:32:33,740 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-18 11:32:33,741 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,742 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,743 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,744 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,744 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,745 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-04-18 11:32:33,747 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-18 11:32:33,748 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-04-18 11:32:33,749 - INFO - range action(s): pst-range-action: -10\n", + "2025-04-18 11:32:33,749 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,750 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,750 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-04-18 11:32:33,751 - INFO - Search depth 1 [start]\n", + "2025-04-18 11:32:33,751 - INFO - Leaves to evaluate: 1\n", + "2025-04-18 11:32:33,752 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-18 11:32:33,753 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,754 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,755 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-18 11:32:33,755 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,756 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,757 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-18 11:32:33,758 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-18 11:32:33,759 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,760 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,761 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,762 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,763 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,764 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,764 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,765 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-04-18 11:32:33,765 - INFO - Remaining leaves to evaluate: 0\n", + "2025-04-18 11:32:33,767 - INFO - Search depth 1 [end]\n", + "2025-04-18 11:32:33,767 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,768 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-04-18 11:32:33,768 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,769 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,770 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-04-18 11:32:33,770 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,770 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-04-18 11:32:33,771 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,772 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,772 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,773 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-18 11:32:33,773 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-04-18 11:32:33,774 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,775 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,775 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -738,20 +749,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-03-14T10:48:08.006506582Z", - "start_time": "2025-03-14T10:48:07.909471398Z" + "end_time": "2025-04-18T09:32:33.813368882Z", + "start_time": "2025-04-18T09:32:33.730476006Z" } } }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 33, "outputs": [ { "data": { - "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO http://farao-community.github.io',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778}]}]}" + "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778}]}]}" }, - "execution_count": 50, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -762,8 +773,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-03-14T10:48:08.007061002Z", - "start_time": "2025-03-14T10:48:07.968699116Z" + "end_time": "2025-04-18T09:32:33.875669459Z", + "start_time": "2025-04-18T09:32:33.826209594Z" } } }, @@ -797,158 +808,153 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 34, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-03-14 11:48:07,965 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,965 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,966 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,966 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,966 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,967 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,967 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,967 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,967 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,968 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,968 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,968 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,969 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,969 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,969 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,970 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,970 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-03-14 11:48:07,970 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-03-14 11:48:07,970 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-03-14 11:48:07,970 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-03-14 11:48:07,971 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-03-14 11:48:07,973 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", - "2025-03-14 11:48:07,974 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,974 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,975 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-03-14 11:48:07,975 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,975 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,976 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-03-14 11:48:07,976 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-03-14 11:48:07,976 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,977 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,977 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:07,978 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,978 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,978 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-03-14 11:48:07,979 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,979 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,979 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-03-14 11:48:07,979 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-03-14 11:48:07,980 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,980 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,980 - INFO - Linear optimization on root leaf\n", - "2025-03-14 11:48:07,982 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,982 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,983 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-03-14 11:48:07,984 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-03-14 11:48:07,984 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,985 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,985 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:07,985 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,985 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,986 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-03-14 11:48:07,987 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-03-14 11:48:07,987 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-03-14 11:48:07,988 - INFO - range action(s): pst-range-action: -10\n", - "2025-03-14 11:48:07,988 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,989 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,989 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-03-14 11:48:07,989 - INFO - Search depth 1 [start]\n", - "2025-03-14 11:48:07,989 - INFO - Leaves to evaluate: 1\n", - "2025-03-14 11:48:07,990 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-03-14 11:48:07,990 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:07,991 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:07,991 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-03-14 11:48:07,991 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:07,992 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-03-14 11:48:07,992 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-03-14 11:48:07,992 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-03-14 11:48:07,992 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,993 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,993 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:07,994 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:07,994 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-03-14 11:48:07,994 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,995 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,995 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-03-14 11:48:07,995 - INFO - Remaining leaves to evaluate: 0\n", - "2025-03-14 11:48:07,996 - INFO - Search depth 1 [end]\n", - "2025-03-14 11:48:07,996 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,997 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-03-14 11:48:07,998 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:07,998 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:07,998 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-03-14 11:48:07,999 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:07,999 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-03-14 11:48:08,000 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:08,000 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:08,000 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-03-14 11:48:08,000 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-03-14 11:48:08,001 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-03-14 11:48:08,001 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-03-14 11:48:08,002 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:08,002 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:08,002 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-03-14 11:48:08,003 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:08,003 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-03-14 11:48:08,003 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-03-14 11:48:08,004 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-03-14 11:48:08,004 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:08,005 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-03-14 11:48:08,005 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:08,006 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:08,007 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-03-14 11:48:08,007 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-03-14 11:48:08,008 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-03-14 11:48:08,008 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:08,009 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-03-14 11:48:08,009 - INFO - Using base network '12_node_network' on variant 'ContingencyScenariob044c8e4-4814-4865-8a3a-a1d2a9985894'\n", - "2025-03-14 11:48:08,010 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-03-14 11:48:08,010 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-03-14 11:48:08,011 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-03-14 11:48:08,011 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-03-14 11:48:08,012 - INFO - Linear optimization on root leaf\n", - "2025-03-14 11:48:08,014 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-03-14 11:48:08,015 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-03-14 11:48:08,015 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-03-14 11:48:08,015 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-03-14 11:48:08,016 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-03-14 11:48:08,016 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-03-14 11:48:08,016 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-03-14 11:48:08,017 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:08,018 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", - "2025-03-14 11:48:08,019 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-03-14 11:48:08,019 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-03-14 11:48:08,020 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", - "2025-03-14 11:48:08,020 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", - "2025-03-14 11:48:08,022 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-03-14 11:48:08,023 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-03-14 11:48:08,024 - INFO - range action(s): pst-range-action: 6\n", - "2025-03-14 11:48:08,025 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-03-14 11:48:08,026 - INFO - No network action available\n", - "2025-03-14 11:48:08,026 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-03-14 11:48:08,027 - INFO - Best leaf: Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-03-14 11:48:08,027 - INFO - Best leaf: range action(s): pst-range-action: 6\n", - "2025-03-14 11:48:08,028 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-03-14 11:48:08,028 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-03-14 11:48:08,029 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-03-14 11:48:08,029 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-03-14 11:48:08,030 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-03-14 11:48:08,030 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-03-14 11:48:08,030 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-03-14 11:48:08,031 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-03-14 11:48:08,031 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + "2025-04-18 11:32:33,786 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,787 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,787 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,788 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,788 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,789 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,789 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,790 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,790 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,791 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,791 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,791 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,791 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,792 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,793 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,793 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,793 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-18 11:32:33,794 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-04-18 11:32:33,794 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-04-18 11:32:33,795 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-04-18 11:32:33,795 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-04-18 11:32:33,799 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", + "2025-04-18 11:32:33,800 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,801 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,802 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-18 11:32:33,803 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,803 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,804 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-18 11:32:33,804 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-04-18 11:32:33,805 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,806 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,807 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,808 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,808 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,809 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-18 11:32:33,810 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,810 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,811 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-04-18 11:32:33,812 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-18 11:32:33,812 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,813 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,814 - INFO - Linear optimization on root leaf\n", + "2025-04-18 11:32:33,816 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,817 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,818 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-18 11:32:33,818 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,819 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,819 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-18 11:32:33,820 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-18 11:32:33,821 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,822 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,823 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,824 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,825 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,826 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-04-18 11:32:33,827 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-18 11:32:33,828 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-04-18 11:32:33,828 - INFO - range action(s): pst-range-action: -10\n", + "2025-04-18 11:32:33,829 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,830 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,830 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-04-18 11:32:33,831 - INFO - Search depth 1 [start]\n", + "2025-04-18 11:32:33,832 - INFO - Leaves to evaluate: 1\n", + "2025-04-18 11:32:33,832 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-18 11:32:33,833 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,834 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,834 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-18 11:32:33,835 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,836 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,836 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-18 11:32:33,837 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-18 11:32:33,837 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,838 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,839 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,839 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,840 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,840 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,841 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,841 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-04-18 11:32:33,841 - INFO - Remaining leaves to evaluate: 0\n", + "2025-04-18 11:32:33,842 - INFO - Search depth 1 [end]\n", + "2025-04-18 11:32:33,842 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,843 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-04-18 11:32:33,843 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,844 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,845 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-04-18 11:32:33,845 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,846 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-04-18 11:32:33,846 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,846 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,847 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-18 11:32:33,847 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-18 11:32:33,848 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-04-18 11:32:33,848 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-18 11:32:33,849 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,849 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,850 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-18 11:32:33,850 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,851 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,851 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-18 11:32:33,852 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-04-18 11:32:33,853 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,854 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,854 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,855 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,856 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,856 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-04-18 11:32:33,857 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-18 11:32:33,857 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,858 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-04-18 11:32:33,859 - INFO - Using base network '12_node_network' on variant 'ContingencyScenario1cbaf07d-943c-423c-9a4f-685f7e96acbd'\n", + "2025-04-18 11:32:33,859 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-04-18 11:32:33,860 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-04-18 11:32:33,861 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-04-18 11:32:33,861 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-18 11:32:33,862 - INFO - Linear optimization on root leaf\n", + "2025-04-18 11:32:33,864 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-18 11:32:33,864 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-04-18 11:32:33,865 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-18 11:32:33,866 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-18 11:32:33,866 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-18 11:32:33,867 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-18 11:32:33,867 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-04-18 11:32:33,868 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,869 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,870 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-18 11:32:33,871 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-18 11:32:33,872 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", + "2025-04-18 11:32:33,873 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-04-18 11:32:33,875 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-18 11:32:33,876 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-04-18 11:32:33,876 - INFO - range action(s): pst-range-action: 6\n", + "2025-04-18 11:32:33,877 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-18 11:32:33,878 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-04-18 11:32:33,878 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-04-18 11:32:33,879 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-04-18 11:32:33,880 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-04-18 11:32:33,880 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-18 11:32:33,881 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-18 11:32:33,881 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-18 11:32:33,881 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -968,20 +974,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-03-14T10:48:08.104953692Z", - "start_time": "2025-03-14T10:48:07.968910608Z" + "end_time": "2025-04-18T09:32:33.945532379Z", + "start_time": "2025-04-18T09:32:33.826558497Z" } } }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 35, "outputs": [ { "data": { - "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO http://farao-community.github.io',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778},\n {'instant': 'curative',\n 'contingency': 'Contingency DE2 DE3',\n 'setpoint': 2.337343603803646}]}]}" + "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778},\n {'instant': 'curative',\n 'contingency': 'Contingency DE2 DE3',\n 'setpoint': 2.337343603803646}]}]}" }, - "execution_count": 52, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -992,8 +998,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-03-14T10:48:08.105264836Z", - "start_time": "2025-03-14T10:48:08.042663687Z" + "end_time": "2025-04-18T09:32:33.945973385Z", + "start_time": "2025-04-18T09:32:33.914566490Z" } } }, @@ -1009,13 +1015,13 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 36, "outputs": [ { "data": { "text/plain": "[{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}}]" }, - "execution_count": 53, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1026,8 +1032,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-03-14T10:48:08.105501595Z", - "start_time": "2025-03-14T10:48:08.042864962Z" + "end_time": "2025-04-18T09:32:33.946185781Z", + "start_time": "2025-04-18T09:32:33.914958024Z" } } }, From e525790ba0ee98e7d3ad0a16dd857cf9ad04f6c4 Mon Sep 17 00:00:00 2001 From: Philippe Edwards Date: Wed, 23 Apr 2025 14:09:27 +0200 Subject: [PATCH 05/18] add costly example Signed-off-by: Philippe Edwards --- data/rao/12_node_network_redispatching.uct | 40 + .../N-1_case_crac_curative_redispatching.json | 163 +++ data/rao/rao_parameters_costly.json | 140 ++ open_rao.ipynb | 1212 ++++++++--------- 4 files changed, 925 insertions(+), 630 deletions(-) create mode 100644 data/rao/12_node_network_redispatching.uct create mode 100644 data/rao/N-1_case_crac_curative_redispatching.json create mode 100644 data/rao/rao_parameters_costly.json diff --git a/data/rao/12_node_network_redispatching.uct b/data/rao/12_node_network_redispatching.uct new file mode 100644 index 0000000..4e49e20 --- /dev/null +++ b/data/rao/12_node_network_redispatching.uct @@ -0,0 +1,40 @@ +##C 2007.05.01 +##N +##ZBE +BBE1AA1 BE1 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +BBE2AA1 BE2 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +BBE3AA1 BE3 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZDE +DDE1AA1 DE1 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +DDE2AA1 DE2 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +DDE3AA1 DE3 0 2 400.00 0.00000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZFR +FFR1AA1 FR1 0 2 400.00 1000.00 0.00000 00000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +FFR2AA1 FR2 0 2 400.00 500.000 0.00000 0.00000 0.00000 9000.00 -9000.0 9000.00 -9000.0 +FFR3AA1 FR3 0 2 400.00 1000.00 0.00000 -500.00 0.00000 9000.00 -9000.0 9000.00 -9000.0 +##ZNL +NNL1AA1 NL1 0 2 400.00 0000.00 0.00000 -1000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 +NNL2AA1 NL2 0 2 400.00 0.00000 0.00000 -500.00 0.00000 9000.00 -9000.0 9000.00 -9000.0 +NNL3AA1 NL3 0 2 400.00 500.000 0.00000 -1000.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 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 410 +NNL2AA1 BBE3AA1 2 8 0.0000 10.000 0.000000 410 +NNL2AA1 BBE3AA1 3 8 0.0000 10.000 0.000000 410 +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/data/rao/N-1_case_crac_curative_redispatching.json b/data/rao/N-1_case_crac_curative_redispatching.json new file mode 100644 index 0000000..9a01f6e --- /dev/null +++ b/data/rao/N-1_case_crac_curative_redispatching.json @@ -0,0 +1,163 @@ +{ + "type" : "CRAC", + "version" : "2.7", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "crac", + "name" : "crac", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "Contingency DE2 DE3", + "networkElementsIds" : [ "DDE2AA1 DDE3AA1 1" ] + } ], + "flowCnecs" : [ { + "id" : "NNL2AA1 BBE3AA1 1 - preventive", + "name" : "NL2 BE3 1 - preventive", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "border" : "", + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "iMax" : [ NaN ], + "nominalV" : [ 400 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -410.0, + "max" : 410.0, + "side" : 1 + } ] + }, { + "id" : "NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage", + "name" : "NL2 BE3 1 - Contingency DE2 DE3 - outage", + "networkElementId" : "NNL2AA1 BBE3AA1 1", + "operator" : null, + "instant" : "outage", + "contingencyId" : "Contingency DE2 DE3", + "optimized" : true, + "monitored" : false, + "iMax" : [ NaN ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -450.0, + "max" : 450.0, + "side" : 1 + } ] + }, { + "id" : "BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative", + "name" : "BE1 BE2 1 - Contingency DE2 DE3 - curative", + "networkElementId" : "BBE1AA1 BBE2AA1 1", + "operator" : null, + "instant" : "curative", + "contingencyId" : "Contingency DE2 DE3", + "optimized" : true, + "monitored" : false, + "iMax" : [ NaN ], + "nominalV" : [ 400.0 ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -300.0, + "max" : 300.0, + "side" : 1 + } ] + } ], + "angleCnecs" : [ ], + "voltageCnecs" : [ ], + "pstRangeActions" : [ { + "id" : "pst-range-action", + "name" : "pst-range-action", + "operator" : null, + "onInstantUsageRules" : [ { + "instant" : "preventive", + "usageMethod" : "available" + }, { + "instant" : "curative", + "usageMethod" : "available" + } ], + "networkElementId" : "BBE2AA1 BBE3AA1 1", + "ranges" : [ { + "min" : -10, + "max" : 10, + "rangeType" : "absolute" + } ] + } ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ + { + "id": "redispatchingActionFR", + "name": "redispatchingActionFR", + "operator": "FR", + "activationCost": 10.0, + "variationCosts": { + "up": 50.0, + "down": 50.0 + }, + "onInstantUsageRules": [ + { + "instant": "preventive", + "usageMethod": "available" + } + ], + "networkElementIdsAndKeys": { + "FFR3AA1 _generator": 1.0 + }, + "initialSetpoint": 500, + "ranges": [ + { + "min": 0.0, + "max": 1000.0 + } + ] + }, { + "id": "redispatchingActionNL", + "name": "redispatchingActionNL", + "operator": "NL", + "activationCost": 10.0, + "variationCosts": { + "up": 50.0, + "down": 50.0 + }, + "onInstantUsageRules": [ + { + "instant": "preventive", + "usageMethod": "available" + } + ], + "networkElementIdsAndKeys": { + "NNL3AA1 _generator": 1.0 + }, + "initialSetpoint": 1000, + "ranges": [ + { + "min": 500.0, + "max": 1500.0 + } + ] + } ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "close NL2 BE3 2", + "name" : "close NL2 BE3 2", + "operator" : null, + "onInstantUsageRules" : [ { + "instant" : "preventive", + "usageMethod" : "available" + } ], + "terminalsConnectionActions" : [ { + "networkElementId" : "NNL2AA1 BBE3AA1 2", + "actionType" : "close" + } ] + } ] +} \ No newline at end of file diff --git a/data/rao/rao_parameters_costly.json b/data/rao/rao_parameters_costly.json new file mode 100644 index 0000000..f794e9f --- /dev/null +++ b/data/rao/rao_parameters_costly.json @@ -0,0 +1,140 @@ +{ + "version" : "3.0", + "objective-function" : { + "type" : "MIN_COST", + "unit" : "MW" + }, + "range-actions-optimization" : { + "pst-ra-min-impact-threshold" : 0.01, + "hvdc-ra-min-impact-threshold" : 0.001, + "injection-ra-min-impact-threshold" : 0.001 + }, + "topological-actions-optimization" : { + "relative-minimum-impact-threshold" : 0.0, + "absolute-minimum-impact-threshold" : 0.0 + }, + "not-optimized-cnecs" : { + "do-not-optimize-curative-cnecs-for-tsos-without-cras" : false + }, + "extensions" : { + "open-rao-search-tree-parameters" : { + "objective-function" : { + "curative-min-obj-improvement" : 0.0 + }, + "range-actions-optimization" : { + "max-mip-iterations" : 5, + "pst-sensitivity-threshold" : 1.0E-6, + "pst-model" : "APPROXIMATED_INTEGERS", + "hvdc-sensitivity-threshold" : 1.0E-6, + "injection-ra-sensitivity-threshold" : 1.0E-6, + "ra-range-shrinking" : "DISABLED", + "linear-optimization-solver" : { + "solver" : "CBC", + "relative-mip-gap" : 0.001, + "solver-specific-parameters" : null + } + }, + "topological-actions-optimization" : { + "max-preventive-search-tree-depth" : 5, + "max-auto-search-tree-depth" : 5, + "max-curative-search-tree-depth" : 5, + "predefined-combinations" : [ ], + "skip-actions-far-from-most-limiting-element" : false, + "max-number-of-boundaries-for-skipping-actions" : 0 + }, + "second-preventive-rao" : { + "execution-condition" : "DISABLED", + "re-optimize-curative-range-actions" : false, + "hint-from-first-preventive-rao" : false + }, + "load-flow-and-sensitivity-computation" : { + "load-flow-provider" : "OpenLoadFlow", + "sensitivity-provider" : "OpenLoadFlow", + "sensitivity-failure-overcost" : 10000.0, + "sensitivity-parameters" : { + "version" : "1.0", + "load-flow-parameters" : { + "version" : "1.9", + "voltageInitMode" : "UNIFORM_VALUES", + "transformerVoltageControlOn" : false, + "phaseShifterRegulationOn" : false, + "useReactiveLimits" : true, + "twtSplitShuntAdmittance" : true, + "shuntCompensatorVoltageControlOn" : false, + "readSlackBus" : false, + "writeSlackBus" : false, + "dc" : false, + "distributedSlack" : true, + "balanceType" : "PROPORTIONAL_TO_GENERATION_P", + "dcUseTransformerRatio" : false, + "countriesToBalance" : [ "GR", "BE", "SK", "TR", "CH", "RS", "PL", "UA", "BG", "ES", "ME", "CZ", "HR", "AL", "RO", "HU", "AT", "FR", "PT", "DE", "MK", "BA", "SI", "IT", "NL" ], + "connectedComponentMode" : "MAIN", + "hvdcAcEmulation" : true, + "dcPowerFactor" : 1.0, + "extensions" : { + "open-load-flow-parameters" : { + "slackBusSelectionMode" : "MOST_MESHED", + "slackBusesIds" : [ ], + "slackDistributionFailureBehavior" : "LEAVE_ON_SLACK_BUS", + "lowImpedanceBranchMode" : "REPLACE_BY_ZERO_IMPEDANCE_LINE", + "loadPowerFactorConstant" : false, + "plausibleActivePowerLimit" : 10000.0, + "newtonRaphsonStoppingCriteriaType" : "UNIFORM_CRITERIA", + "maxActivePowerMismatch" : 0.01, + "maxReactivePowerMismatch" : 0.01, + "maxVoltageMismatch" : 1.0E-4, + "maxAngleMismatch" : 1.0E-5, + "maxRatioMismatch" : 1.0E-5, + "maxSusceptanceMismatch" : 1.0E-4, + "slackBusPMaxMismatch" : 1.0, + "voltagePerReactivePowerControl" : false, + "maxNewtonRaphsonIterations" : 30, + "maxOuterLoopIterations" : 20, + "newtonRaphsonConvEpsPerEq" : 1.0E-4, + "voltageInitModeOverride" : "NONE", + "transformerVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", + "shuntVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", + "minPlausibleTargetVoltage" : 0.8, + "maxPlausibleTargetVoltage" : 1.2, + "minNominalVoltageTargetVoltageCheck" : 20.0, + "minRealisticVoltage" : 0.5, + "maxRealisticVoltage" : 1.5, + "lowImpedanceThreshold" : 1.0E-8, + "reactiveRangeCheckMode" : "MAX", + "networkCacheEnabled" : false, + "svcVoltageMonitoring" : true, + "stateVectorScalingMode" : "NONE", + "maxSlackBusCount" : 1, + "debugDir" : null, + "incrementalTransformerRatioTapControlOuterLoopMaxTapShift" : 3, + "secondaryVoltageControl" : false, + "reactiveLimitsMaxPqPvSwitch" : 3, + "phaseShifterControlMode" : "CONTINUOUS_WITH_DISCRETISATION", + "alwaysUpdateNetwork" : false, + "mostMeshedSlackBusSelectorMaxNominalVoltagePercentile" : 95.0, + "reportedFeatures" : [ ], + "slackBusCountryFilter" : [ ], + "actionableSwitchesIds" : [ ], + "asymmetrical" : false, + "reactivePowerDispatchMode" : "Q_EQUAL_PROPORTION", + "outerLoopNames" : null, + "useActiveLimits" : true, + "lineSearchStateVectorScalingMaxIteration" : 10, + "lineSearchStateVectorScalingStepFold" : 1.3333333333333333, + "maxVoltageChangeStateVectorScalingMaxDv" : 0.1, + "maxVoltageChangeStateVectorScalingMaxDphi" : 0.17453292519943295, + "linePerUnitMode" : "IMPEDANCE", + "useLoadModel" : false, + "dcApproximationType" : "IGNORE_R", + "simulateAutomationSystems" : false + } + } + } + } + }, + "multi-threading" : { + "available-cpus" : 4 + } + } + } +} \ No newline at end of file diff --git a/open_rao.ipynb b/open_rao.ipynb index ab1f034..b594fd5 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -18,11 +18,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.528541896Z", - "start_time": "2025-04-18T09:32:32.442366605Z" + "end_time": "2025-04-23T07:57:01.735448807Z", + "start_time": "2025-04-23T07:57:00.724538390Z" } }, "outputs": [ @@ -50,16 +50,17 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.533926615Z", - "start_time": "2025-04-18T09:32:33.529383014Z" + "end_time": "2025-04-23T07:57:02.650470249Z", + "start_time": "2025-04-23T07:57:01.731845621Z" } }, "outputs": [], "source": [ - "import pypowsybl as pp" + "import pypowsybl as pp\n", + "from pypowsybl.rao import Parameters as RaoParameters" ] }, { @@ -71,42 +72,14 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.602976499Z", - "start_time": "2025-04-18T09:32:33.533823898Z" + "end_time": "2025-04-23T07:57:02.699114054Z", + "start_time": "2025-04-23T07:57:02.651663865Z" } }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-18 11:32:33,533 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,534 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,535 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,535 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,536 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,537 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,537 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,538 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,538 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,539 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,540 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,540 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,541 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,541 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,542 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,543 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,543 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,544 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-04-18 11:32:33,544 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-18 11:32:33,545 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-18 11:32:33,546 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n" - ] - } - ], + "outputs": [], "source": [ "n12 = pp.network.load('./data/rao/12_node_network.uct')" ] @@ -120,29 +93,20 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.603648677Z", - "start_time": "2025-04-18T09:32:33.581987020Z" + "end_time": "2025-04-23T07:57:02.737294008Z", + "start_time": "2025-04-23T07:57:02.729248779Z" } }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-18 11:32:33,556 - INFO - Number of steps: 688\n", - "2025-04-18 11:32:33,557 - INFO - Elapsed time: 0.004712575\n", - "2025-04-18 11:32:33,558 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" - ] - }, { "data": { - "text/plain": "", + "text/plain": "", "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / °
\n
\n
kV / °
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n
\n
\n" }, - "execution_count": 27, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -167,135 +131,20 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.606127251Z", - "start_time": "2025-04-18T09:32:33.582616646Z" + "end_time": "2025-04-23T07:57:02.758565839Z", + "start_time": "2025-04-23T07:57:02.733941011Z" } }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-18 11:32:33,574 - INFO - loadflow provider used is : OpenLoadFlow\n", - "2025-04-18 11:32:33,575 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.15.0, gitVersion=2e871e075f1748c0dfa7eac6fedb17fcde4219f8, gitBranch=UNKNOWN, buildTimestamp=2025-03-26T13:23:26.221Z}\n", - "2025-04-18 11:32:33,579 - INFO - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ true │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ true │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ false │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ forceTargetQInReactiveLimits │ false │\n", - "│ │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", - "│ │ countriesToBalance │ [] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ true │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ true │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-04-18 11:32:33,580 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,581 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,582 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-18 11:32:33,582 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,583 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,584 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-18 11:32:33,584 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", - "2025-04-18 11:32:33,585 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,586 - INFO - Load flow ran in 10 ms\n", - "2025-04-18 11:32:33,591 - INFO - Number of steps: 688\n", - "2025-04-18 11:32:33,591 - INFO - Elapsed time: 0.004040466\n", - "2025-04-18 11:32:33,592 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" - ] - }, { "data": { - "text/plain": "", + "text/plain": "", "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.0°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.0°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 5.3°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n
\n
\n" }, - "execution_count": 28, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -315,135 +164,20 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.701392845Z", - "start_time": "2025-04-18T09:32:33.605150158Z" + "end_time": "2025-04-23T07:57:02.774317900Z", + "start_time": "2025-04-23T07:57:02.753459041Z" } }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-18 11:32:33,603 - INFO - loadflow provider used is : OpenLoadFlow\n", - "2025-04-18 11:32:33,604 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.15.0, gitVersion=2e871e075f1748c0dfa7eac6fedb17fcde4219f8, gitBranch=UNKNOWN, buildTimestamp=2025-03-26T13:23:26.221Z}\n", - "2025-04-18 11:32:33,610 - INFO - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ true │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ true │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ false │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ forceTargetQInReactiveLimits │ false │\n", - "│ │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", - "│ │ countriesToBalance │ [] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ true │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ true │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-04-18 11:32:33,611 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,612 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,613 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-18 11:32:33,613 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,614 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Network extension bus')\n", - "2025-04-18 11:32:33,614 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-18 11:32:33,615 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", - "2025-04-18 11:32:33,616 - INFO - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,617 - INFO - Load flow ran in 11 ms\n", - "2025-04-18 11:32:33,623 - INFO - Number of steps: 688\n", - "2025-04-18 11:32:33,623 - INFO - Elapsed time: 0.004942797\n", - "2025-04-18 11:32:33,624 - WARNING - Base voltage configuration file '/home/edwardsphi/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" - ] - }, { "data": { - "text/plain": "", + "text/plain": "", "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.4°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.2°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 0.8°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.4°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.2°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.3°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.1°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 4.5°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 2.5°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 2.6°
\n
\n
\n
\n
\n" }, - "execution_count": 29, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -465,11 +199,11 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.714077978Z", - "start_time": "2025-04-18T09:32:33.637953858Z" + "end_time": "2025-04-23T07:57:02.871819332Z", + "start_time": "2025-04-23T07:57:02.773541463Z" } }, "outputs": [ @@ -477,77 +211,54 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-04-18 11:32:33,637 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,638 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,639 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,639 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,640 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,641 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,641 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,642 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,643 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,643 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,644 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,644 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,645 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,646 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,646 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,647 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,647 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,648 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-04-18 11:32:33,648 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-18 11:32:33,649 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-18 11:32:33,649 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-04-18 11:32:33,653 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", - "2025-04-18 11:32:33,654 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,655 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,656 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-18 11:32:33,656 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,657 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,657 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-18 11:32:33,658 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-04-18 11:32:33,659 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,660 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,661 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-18 11:32:33,661 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,662 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-18 11:32:33,662 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-18 11:32:33,663 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,663 - INFO - Linear optimization on root leaf\n", - "2025-04-18 11:32:33,663 - INFO - No range actions to optimize\n", - "2025-04-18 11:32:33,664 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-18 11:32:33,664 - INFO - No range actions activated\n", - "2025-04-18 11:32:33,665 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,665 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-18 11:32:33,665 - INFO - Search depth 1 [start]\n", - "2025-04-18 11:32:33,666 - INFO - Leaves to evaluate: 1\n", - "2025-04-18 11:32:33,666 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-18 11:32:33,667 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,668 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,669 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-18 11:32:33,669 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,670 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,670 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-18 11:32:33,671 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-04-18 11:32:33,671 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,673 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,673 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-18 11:32:33,674 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-18 11:32:33,674 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-18 11:32:33,675 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-18 11:32:33,675 - INFO - Search depth 1 [end]\n", - "2025-04-18 11:32:33,676 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-18 11:32:33,676 - INFO - Search depth 1 best leaf: No range actions activated\n", - "2025-04-18 11:32:33,676 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,677 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-18 11:32:33,677 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-18 11:32:33,677 - INFO - Best leaf: No range actions activated\n", - "2025-04-18 11:32:33,678 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,678 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-18 11:32:33,678 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-18 11:32:33,679 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-18 11:32:33,679 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,679 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" + "2025-04-23 09:57:02,786 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", + "2025-04-23 09:57:02,789 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,790 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-23 09:57:02,791 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,792 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,792 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-23 09:57:02,792 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-04-23 09:57:02,833 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,835 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,836 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-04-23 09:57:02,837 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,837 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-04-23 09:57:02,838 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-04-23 09:57:02,838 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,838 - INFO - Linear optimization on root leaf\n", + "2025-04-23 09:57:02,838 - INFO - No range actions to optimize\n", + "2025-04-23 09:57:02,839 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-04-23 09:57:02,839 - INFO - No range actions activated\n", + "2025-04-23 09:57:02,839 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,839 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-04-23 09:57:02,839 - INFO - Search depth 1 [start]\n", + "2025-04-23 09:57:02,840 - INFO - Leaves to evaluate: 1\n", + "2025-04-23 09:57:02,840 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 09:57:02,841 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,842 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 09:57:02,842 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,843 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,844 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 09:57:02,844 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-04-23 09:57:02,845 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,847 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,848 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-23 09:57:02,848 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-23 09:57:02,849 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-04-23 09:57:02,849 - INFO - Remaining leaves to evaluate: 0\n", + "2025-04-23 09:57:02,850 - INFO - Search depth 1 [end]\n", + "2025-04-23 09:57:02,850 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-23 09:57:02,851 - INFO - Search depth 1 best leaf: No range actions activated\n", + "2025-04-23 09:57:02,851 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,852 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-04-23 09:57:02,853 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-23 09:57:02,853 - INFO - Best leaf: No range actions activated\n", + "2025-04-23 09:57:02,854 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,854 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-04-23 09:57:02,855 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 09:57:02,855 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-04-23 09:57:02,856 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,857 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" ] } ], @@ -556,12 +267,14 @@ "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", "rao_runner = pp.rao.create_rao()\n", "rao_runner.set_crac_file_source(n12, \"./data/rao/N_case_crac.json\")\n", + "rao_parameters = RaoParameters()\n", + "rao_parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", "# set up logging\n", "import logging\n", "logging.getLogger('powsybl').setLevel(logging.INFO)\n", "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", "#run rao\n", - "raoResult = rao_runner.run(n12)\n", + "raoResult = rao_runner.run(n12, rao_parameters)\n", "result_json = raoResult.to_json()" ] }, @@ -574,11 +287,11 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.774154207Z", - "start_time": "2025-04-18T09:32:33.730185548Z" + "end_time": "2025-04-23T07:57:02.872215222Z", + "start_time": "2025-04-23T07:57:02.864567529Z" } }, "outputs": [ @@ -586,7 +299,7 @@ "data": { "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 90.0,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 201.67, 'side1': {'flow': 390.11}},\n 'megawatt': {'margin': 139.73, 'side1': {'flow': 270.27}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': []}" }, - "execution_count": 31, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -627,109 +340,106 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 10, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-04-18 11:32:33,691 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,691 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,692 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,692 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,693 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,693 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,694 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,694 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,694 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,695 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,695 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,696 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,696 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,696 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,697 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,697 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,697 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,698 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-04-18 11:32:33,698 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-18 11:32:33,698 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-18 11:32:33,699 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-04-18 11:32:33,704 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", - "2025-04-18 11:32:33,704 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-04-18 11:32:33,706 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,706 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,707 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-18 11:32:33,708 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,709 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,710 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-18 11:32:33,710 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-18 11:32:33,711 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,712 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,713 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,724 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,725 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,726 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-18 11:32:33,727 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,727 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,728 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-18 11:32:33,729 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-18 11:32:33,729 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,730 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,731 - INFO - Linear optimization on root leaf\n", - "2025-04-18 11:32:33,734 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,735 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,736 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-18 11:32:33,737 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,738 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,739 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-18 11:32:33,740 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-18 11:32:33,741 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,742 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,743 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,744 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,744 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,745 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-04-18 11:32:33,747 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-18 11:32:33,748 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-04-18 11:32:33,749 - INFO - range action(s): pst-range-action: -10\n", - "2025-04-18 11:32:33,749 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,750 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,750 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-18 11:32:33,751 - INFO - Search depth 1 [start]\n", - "2025-04-18 11:32:33,751 - INFO - Leaves to evaluate: 1\n", - "2025-04-18 11:32:33,752 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-18 11:32:33,753 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,754 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,755 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-18 11:32:33,755 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,756 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,757 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-18 11:32:33,758 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-18 11:32:33,759 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,760 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,761 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,762 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,763 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,764 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,764 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,765 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-18 11:32:33,765 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-18 11:32:33,767 - INFO - Search depth 1 [end]\n", - "2025-04-18 11:32:33,767 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,768 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-04-18 11:32:33,768 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,769 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,770 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-18 11:32:33,770 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,770 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-04-18 11:32:33,771 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,772 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,772 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,773 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-18 11:32:33,773 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-18 11:32:33,774 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,775 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,775 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + "2025-04-23 09:57:02,868 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,869 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,869 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,870 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,870 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,871 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,871 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,871 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,872 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,872 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,872 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,873 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,873 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,873 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,873 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,874 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,874 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,874 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-04-23 09:57:02,875 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-04-23 09:57:02,875 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-04-23 09:57:02,875 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-04-23 09:57:02,879 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", + "2025-04-23 09:57:02,880 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-04-23 09:57:02,880 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,880 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-23 09:57:02,881 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,881 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,881 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-23 09:57:02,882 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-23 09:57:02,882 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,883 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,883 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:02,884 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,884 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,884 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-23 09:57:02,885 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,885 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,885 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-04-23 09:57:02,886 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-23 09:57:02,886 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,886 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,887 - INFO - Linear optimization on root leaf\n", + "2025-04-23 09:57:02,923 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,924 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-23 09:57:02,924 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,925 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,925 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-23 09:57:02,926 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-23 09:57:02,926 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,927 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,928 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:02,928 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,929 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,929 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-04-23 09:57:02,931 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-23 09:57:02,931 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-04-23 09:57:02,932 - INFO - range action(s): pst-range-action: -10\n", + "2025-04-23 09:57:02,932 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,932 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,933 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-04-23 09:57:02,933 - INFO - Search depth 1 [start]\n", + "2025-04-23 09:57:02,933 - INFO - Leaves to evaluate: 1\n", + "2025-04-23 09:57:02,934 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 09:57:02,934 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,935 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 09:57:02,935 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,935 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,936 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 09:57:02,936 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-23 09:57:02,936 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,937 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,937 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:02,937 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,938 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,938 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,938 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,939 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-04-23 09:57:02,939 - INFO - Remaining leaves to evaluate: 0\n", + "2025-04-23 09:57:02,939 - INFO - Search depth 1 [end]\n", + "2025-04-23 09:57:02,940 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,940 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-04-23 09:57:02,940 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,940 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,941 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-04-23 09:57:02,941 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,941 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-04-23 09:57:02,942 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,942 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,942 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,943 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 09:57:02,943 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-04-23 09:57:02,943 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,943 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,944 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -738,31 +448,33 @@ "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", "rao_runner = pp.rao.create_rao()\n", "rao_runner.set_crac_file_source(n12, \"./data/rao/N-1_case_crac_outage.json\")\n", + "rao_parameters = RaoParameters()\n", + "rao_parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", "# set up logging\n", "import logging\n", "logging.getLogger('powsybl').setLevel(logging.INFO)\n", "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", "#run rao\n", - "raoResult = rao_runner.run(n12)\n", + "raoResult = rao_runner.run(n12, rao_parameters)\n", "result_json = raoResult.to_json()" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.813368882Z", - "start_time": "2025-04-18T09:32:33.730476006Z" + "end_time": "2025-04-23T07:57:02.964659663Z", + "start_time": "2025-04-23T07:57:02.868408103Z" } } }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 11, "outputs": [ { "data": { "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778}]}]}" }, - "execution_count": 33, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -773,8 +485,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.875669459Z", - "start_time": "2025-04-18T09:32:33.826209594Z" + "end_time": "2025-04-23T07:57:02.965364192Z", + "start_time": "2025-04-23T07:57:02.950974318Z" } } }, @@ -808,153 +520,147 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 12, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-04-18 11:32:33,786 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,787 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,787 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,788 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,788 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,789 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,789 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,790 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,790 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,791 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,791 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,791 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,791 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,792 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,793 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,793 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,793 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-18 11:32:33,794 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-04-18 11:32:33,794 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-18 11:32:33,795 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-18 11:32:33,795 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-04-18 11:32:33,799 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", - "2025-04-18 11:32:33,800 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,801 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,802 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-18 11:32:33,803 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,803 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,804 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-18 11:32:33,804 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-04-18 11:32:33,805 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,806 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,807 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,808 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,808 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,809 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-18 11:32:33,810 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,810 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,811 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-18 11:32:33,812 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-18 11:32:33,812 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,813 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,814 - INFO - Linear optimization on root leaf\n", - "2025-04-18 11:32:33,816 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,817 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,818 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-18 11:32:33,818 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,819 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,819 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-18 11:32:33,820 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-18 11:32:33,821 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,822 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,823 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,824 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,825 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,826 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-04-18 11:32:33,827 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-18 11:32:33,828 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-04-18 11:32:33,828 - INFO - range action(s): pst-range-action: -10\n", - "2025-04-18 11:32:33,829 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,830 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,830 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-18 11:32:33,831 - INFO - Search depth 1 [start]\n", - "2025-04-18 11:32:33,832 - INFO - Leaves to evaluate: 1\n", - "2025-04-18 11:32:33,832 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-18 11:32:33,833 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,834 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,834 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-18 11:32:33,835 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,836 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,836 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-18 11:32:33,837 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-18 11:32:33,837 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,838 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,839 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,839 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,840 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,840 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,841 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,841 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-18 11:32:33,841 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-18 11:32:33,842 - INFO - Search depth 1 [end]\n", - "2025-04-18 11:32:33,842 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,843 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-04-18 11:32:33,843 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,844 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,845 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-18 11:32:33,845 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,846 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-04-18 11:32:33,846 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,846 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,847 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-18 11:32:33,847 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-18 11:32:33,848 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-18 11:32:33,848 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-18 11:32:33,849 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,849 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,850 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-18 11:32:33,850 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,851 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,851 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-18 11:32:33,852 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-04-18 11:32:33,853 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,854 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,854 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,855 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,856 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,856 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-04-18 11:32:33,857 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-18 11:32:33,857 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,858 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-04-18 11:32:33,859 - INFO - Using base network '12_node_network' on variant 'ContingencyScenario1cbaf07d-943c-423c-9a4f-685f7e96acbd'\n", - "2025-04-18 11:32:33,859 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-04-18 11:32:33,860 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-04-18 11:32:33,861 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-04-18 11:32:33,861 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-18 11:32:33,862 - INFO - Linear optimization on root leaf\n", - "2025-04-18 11:32:33,864 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-18 11:32:33,864 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-18 11:32:33,865 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-18 11:32:33,866 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-18 11:32:33,866 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-18 11:32:33,867 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-18 11:32:33,867 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-04-18 11:32:33,868 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,869 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,870 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-18 11:32:33,871 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-18 11:32:33,872 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", - "2025-04-18 11:32:33,873 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", - "2025-04-18 11:32:33,875 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-18 11:32:33,876 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-04-18 11:32:33,876 - INFO - range action(s): pst-range-action: 6\n", - "2025-04-18 11:32:33,877 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-18 11:32:33,878 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-04-18 11:32:33,878 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-04-18 11:32:33,879 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-04-18 11:32:33,880 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-04-18 11:32:33,880 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-18 11:32:33,881 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-18 11:32:33,881 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-18 11:32:33,881 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + "2025-04-23 09:57:02,956 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,956 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,957 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,957 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,957 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,957 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,958 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,958 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,958 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,958 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,959 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,959 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,959 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,959 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,960 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,960 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,960 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 09:57:02,960 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-04-23 09:57:02,960 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-04-23 09:57:02,961 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-04-23 09:57:02,961 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-04-23 09:57:02,964 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", + "2025-04-23 09:57:02,965 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,965 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-23 09:57:02,966 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,966 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,966 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-23 09:57:02,967 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-04-23 09:57:02,967 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,967 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,968 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:02,968 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,968 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,969 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-23 09:57:02,969 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,969 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,969 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-04-23 09:57:02,970 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-04-23 09:57:02,970 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,970 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,971 - INFO - Linear optimization on root leaf\n", + "2025-04-23 09:57:02,972 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,973 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-23 09:57:02,973 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,973 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,974 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-23 09:57:02,974 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-23 09:57:02,974 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,975 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,976 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:02,976 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,977 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,977 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-04-23 09:57:02,978 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-23 09:57:02,979 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-04-23 09:57:02,979 - INFO - range action(s): pst-range-action: -10\n", + "2025-04-23 09:57:02,980 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,980 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,980 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-04-23 09:57:02,981 - INFO - Search depth 1 [start]\n", + "2025-04-23 09:57:02,981 - INFO - Leaves to evaluate: 1\n", + "2025-04-23 09:57:02,981 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 09:57:02,982 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,982 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 09:57:02,983 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,983 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,983 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 09:57:02,984 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-04-23 09:57:02,984 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,984 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,985 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:02,985 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,985 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,986 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,986 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,986 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-04-23 09:57:02,987 - INFO - Remaining leaves to evaluate: 0\n", + "2025-04-23 09:57:02,987 - INFO - Search depth 1 [end]\n", + "2025-04-23 09:57:02,987 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,987 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-04-23 09:57:02,988 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,988 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,988 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-04-23 09:57:02,989 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,989 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-04-23 09:57:02,989 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,990 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:02,990 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-04-23 09:57:02,990 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 09:57:02,990 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-04-23 09:57:02,991 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 09:57:02,991 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 09:57:02,993 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-04-23 09:57:02,993 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,993 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,994 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:02,994 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:02,994 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-04-23 09:57:02,995 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-04-23 09:57:02,995 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 09:57:02,995 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:02,996 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-04-23 09:57:02,999 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-04-23 09:57:02,999 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-04-23 09:57:03,000 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-04-23 09:57:03,001 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 09:57:03,001 - INFO - Linear optimization on root leaf\n", + "2025-04-23 09:57:03,003 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 09:57:03,003 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 09:57:03,004 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 09:57:03,004 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 09:57:03,004 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 09:57:03,005 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-04-23 09:57:03,005 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:03,005 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", + "2025-04-23 09:57:03,006 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 09:57:03,006 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 09:57:03,006 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", + "2025-04-23 09:57:03,007 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-04-23 09:57:03,008 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-23 09:57:03,009 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-04-23 09:57:03,009 - INFO - range action(s): pst-range-action: 6\n", + "2025-04-23 09:57:03,010 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 09:57:03,010 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-04-23 09:57:03,010 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-04-23 09:57:03,011 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-04-23 09:57:03,011 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-04-23 09:57:03,012 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 09:57:03,012 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 09:57:03,012 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 09:57:03,012 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -963,31 +669,33 @@ "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", "rao_runner = pp.rao.create_rao()\n", "rao_runner.set_crac_file_source(n12, \"./data/rao/N-1_case_crac_curative.json\")\n", + "rao_parameters = RaoParameters()\n", + "rao_parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", "# set up logging\n", "import logging\n", "logging.getLogger('powsybl').setLevel(logging.INFO)\n", "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", "#run rao\n", - "raoResult = rao_runner.run(n12)\n", + "raoResult = rao_runner.run(n12, rao_parameters)\n", "result_json = raoResult.to_json()" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.945532379Z", - "start_time": "2025-04-18T09:32:33.826558497Z" + "end_time": "2025-04-23T07:57:03.063042654Z", + "start_time": "2025-04-23T07:57:02.955246626Z" } } }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 13, "outputs": [ { "data": { "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778},\n {'instant': 'curative',\n 'contingency': 'Contingency DE2 DE3',\n 'setpoint': 2.337343603803646}]}]}" }, - "execution_count": 35, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -998,8 +706,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.945973385Z", - "start_time": "2025-04-18T09:32:33.914566490Z" + "end_time": "2025-04-23T07:57:03.063410591Z", + "start_time": "2025-04-23T07:57:03.035676789Z" } } }, @@ -1015,13 +723,13 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 14, "outputs": [ { "data": { "text/plain": "[{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}}]" }, - "execution_count": 36, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -1032,8 +740,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-18T09:32:33.946185781Z", - "start_time": "2025-04-18T09:32:33.914958024Z" + "end_time": "2025-04-23T07:57:03.063640711Z", + "start_time": "2025-04-23T07:57:03.035989995Z" } } }, @@ -1045,6 +753,250 @@ "metadata": { "collapsed": false } + }, + { + "cell_type": "markdown", + "source": [ + "## 4 - Costly Optimization" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "markdown", + "source": [ + "In this new case, the net generation in the Netherlands increased even more and the load in France increased too, increasing the initial overloads, and the actions we had until now are no longer sufficient to solve the problems. Fortunately, we have two generators, one in France and one in the Netherlands that can do redispatching. However this redispatching can be expensive, so we will change the objective function of the RAO: we no longer want to maximize the minimum margin, instead we want to secure the network at the minimum cost." + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 19, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-04-23 10:12:17,158 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,159 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,160 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,161 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,162 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,163 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,163 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,164 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,165 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,165 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,166 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,166 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,167 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,167 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,168 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,169 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,169 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-04-23 10:12:17,170 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-04-23 10:12:17,170 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-04-23 10:12:17,170 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-04-23 10:12:17,171 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-04-23 10:12:17,175 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", + "2025-04-23 10:12:17,176 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 10:12:17,177 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-23 10:12:17,177 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 10:12:17,178 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-23 10:12:17,178 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-23 10:12:17,179 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", + "2025-04-23 10:12:17,179 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,180 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-1.099476065746785E-9, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,180 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 10:12:17,181 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,181 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.589235492678199E-8, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,182 - INFO - Initial sensitivity analysis: cost = 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19})\n", + "2025-04-23 10:12:17,182 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,183 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 10:12:17,183 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-04-23 10:12:17,184 - INFO - Root leaf, cost: 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19})\n", + "2025-04-23 10:12:17,184 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,184 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 10:12:17,185 - INFO - Linear optimization on root leaf\n", + "2025-04-23 10:12:17,192 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 10:12:17,192 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-04-23 10:12:17,193 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 10:12:17,193 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-04-23 10:12:17,193 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-04-23 10:12:17,193 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-04-23 10:12:17,194 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,194 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.0026220928996290027, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,195 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 10:12:17,195 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,195 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-6.412581576853427E-9, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,196 - INFO - Iteration 1: better solution found with a cost of 3393964.30 (functional: 50020.00)\n", + "2025-04-23 10:12:17,202 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-23 10:12:17,203 - INFO - Root leaf, 3 range action(s) activated, cost: 3393964.3 (functional: 50020.0, virtual: 3343944.3 {min-margin-violation-evaluator=3343944.3})\n", + "2025-04-23 10:12:17,203 - INFO - range action(s): redispatchingActionFR: 1000, pst-range-action: -10, redispatchingActionNL: 500\n", + "2025-04-23 10:12:17,203 - INFO - Limiting element #01: margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,203 - INFO - Limiting element #02: margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 10:12:17,203 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 784.39 MW, threshold = 450.00 MW, margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,204 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 641.31 MW, threshold = 410.00 MW, margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", + "2025-04-23 10:12:17,204 - INFO - Using base network '12_node_network_redispatching' on variant 'PreventiveScenario'\n", + "2025-04-23 10:12:17,204 - INFO - Search depth 1 [start]\n", + "2025-04-23 10:12:17,204 - INFO - Leaves to evaluate: 1\n", + "2025-04-23 10:12:17,205 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 10:12:17,205 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 10:12:17,206 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 10:12:17,206 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 10:12:17,206 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 10:12:17,207 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 10:12:17,207 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-04-23 10:12:17,207 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,208 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.00889825060106375, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,208 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 10:12:17,209 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,209 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=2.4709123636057484E-10, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,209 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: 50020.0 (functional: 50020.0, virtual: 0.0)\n", + "2025-04-23 10:12:17,216 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 10:12:17,217 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 10:12:17,217 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 10:12:17,218 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 10:12:17,218 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 10:12:17,218 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-04-23 10:12:17,219 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,219 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,219 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 10:12:17,220 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,220 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,221 - INFO - Iteration 1: better solution found with a cost of 40589.89 (functional: 39820.00)\n", + "2025-04-23 10:12:17,227 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-23 10:12:17,228 - INFO - Optimized network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", + "2025-04-23 10:12:17,228 - INFO - Optimized network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,228 - INFO - Optimized network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 374.22 MW, threshold = 410.00 MW, margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", + "2025-04-23 10:12:17,229 - INFO - Remaining leaves to evaluate: 0\n", + "2025-04-23 10:12:17,229 - INFO - Search depth 1 [end]\n", + "2025-04-23 10:12:17,229 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", + "2025-04-23 10:12:17,230 - INFO - Search depth 1 best leaf: range action(s): redispatchingActionFR: 898, pst-range-action: -10, redispatchingActionNL: 602\n", + "2025-04-23 10:12:17,230 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,230 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 10:12:17,230 - INFO - Search depth 2 [start]\n", + "2025-04-23 10:12:17,231 - INFO - No more network action available\n", + "2025-04-23 10:12:17,231 - INFO - No better result found in search depth 2, exiting search tree\n", + "2025-04-23 10:12:17,231 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-04-23 10:12:17,231 - INFO - Best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", + "2025-04-23 10:12:17,232 - INFO - Best leaf: range action(s): redispatchingActionFR: 898, pst-range-action: -10, redispatchingActionNL: 602\n", + "2025-04-23 10:12:17,232 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,232 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 10:12:17,233 - INFO - Scenario \"preventive\": initial cost = 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19}), 1 network action(s) and 3 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602, cost after preventive optimization = 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", + "2025-04-23 10:12:17,233 - INFO - network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,233 - INFO - network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 374.22 MW, threshold = 410.00 MW, margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", + "2025-04-23 10:12:17,233 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 10:12:17,234 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-04-23 10:12:17,234 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-04-23 10:12:17,234 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 10:12:17,235 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 10:12:17,235 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 10:12:17,235 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 10:12:17,236 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 10:12:17,236 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", + "2025-04-23 10:12:17,236 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,237 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,237 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 10:12:17,237 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,238 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,238 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 3664369.8 (functional: 39820.0, virtual: 3624549.8 {min-margin-violation-evaluator=3624549.8})\n", + "2025-04-23 10:12:17,238 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 10:12:17,239 - INFO - Limiting element #02: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,239 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-04-23 10:12:17,242 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-04-23 10:12:17,243 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-04-23 10:12:17,243 - INFO - Root leaf, cost: 3624549.8 (functional: 0.0, virtual: 3624549.8 {min-margin-violation-evaluator=3624549.8})\n", + "2025-04-23 10:12:17,244 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 10:12:17,245 - INFO - Linear optimization on root leaf\n", + "2025-04-23 10:12:17,250 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-04-23 10:12:17,251 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-04-23 10:12:17,252 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-04-23 10:12:17,252 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-04-23 10:12:17,253 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-04-23 10:12:17,253 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-04-23 10:12:17,254 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,255 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.4915466934061214E-4, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,255 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-04-23 10:12:17,256 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-04-23 10:12:17,256 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.1015190415928373E-10, distributedActivePower=0.0))\n", + "2025-04-23 10:12:17,257 - INFO - Iteration 1: better solution found with a cost of 0.00 (functional: 0.00)\n", + "2025-04-23 10:12:17,264 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-04-23 10:12:17,264 - INFO - Root leaf, 1 range action(s) activated, cost: 0.0 (functional: 0.0, virtual: 0.0)\n", + "2025-04-23 10:12:17,265 - INFO - range action(s): pst-range-action: 1\n", + "2025-04-23 10:12:17,265 - INFO - Limiting element #01: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 10:12:17,265 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 3624549.8 (functional: 0.0, virtual: 3624549.8 {min-margin-violation-evaluator=3624549.8}), 1 range action(s) activated : pst-range-action: 1, cost after curative optimization = 0.0 (functional: 0.0, virtual: 0.0)\n", + "2025-04-23 10:12:17,266 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-04-23 10:12:17,266 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-04-23 10:12:17,266 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-04-23 10:12:17,267 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-04-23 10:12:17,267 - INFO - Limiting element #02: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-04-23 10:12:17,267 - INFO - Limiting element #03: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-04-23 10:12:17,268 - INFO - Cost before RAO = 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19}), cost after RAO = 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n" + ] + } + ], + "source": [ + "# prepare inputs\n", + "n12 = pp.network.load('./data/rao/12_node_network_redispatching.uct')\n", + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(n12, \"./data/rao/N-1_case_crac_curative_redispatching.json\")\n", + "rao_parameters = RaoParameters()\n", + "rao_parameters.load_from_file_source(\"./data/rao/rao_parameters_costly.json\")\n", + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", + "#run rao\n", + "raoResult = rao_runner.run(n12, rao_parameters)\n", + "result_json = raoResult.to_json()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-04-23T08:12:17.288972952Z", + "start_time": "2025-04-23T08:12:17.158532942Z" + } + } + }, + { + "cell_type": "code", + "execution_count": 20, + "outputs": [ + { + "data": { + "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 0.0,\n 'virtualCost': {'min-margin-violation-evaluator': 7165629.19,\n 'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': 39820.0,\n 'virtualCost': {'min-margin-violation-evaluator': 3624549.8,\n 'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': 39820.0,\n 'virtualCost': {'min-margin-violation-evaluator': 3624549.8,\n 'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': 39820.0,\n 'virtualCost': {'min-margin-violation-evaluator': 769.89,\n 'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': -128.4, 'side1': {'flow': 561.41}},\n 'megawatt': {'margin': -88.93, 'side1': {'flow': 388.93}}},\n 'preventive': {'ampere': {'margin': -523.36, 'side1': {'flow': 956.38}},\n 'megawatt': {'margin': -362.45, 'side1': {'flow': 662.45}}},\n 'curative': {'ampere': {'margin': 1.03, 'side1': {'flow': 431.98}},\n 'megawatt': {'margin': 0.73, 'side1': {'flow': 299.27}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -1035.39, 'side1': {'flow': 1684.91}},\n 'megawatt': {'margin': -716.56, 'side1': {'flow': 1166.56}}},\n 'preventive': {'ampere': {'margin': -0.18, 'side1': {'flow': 649.69}},\n 'megawatt': {'margin': -0.08, 'side1': {'flow': 450.08}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -852.3, 'side1': {'flow': 1444.08}},\n 'megawatt': {'margin': -590.0, 'side1': {'flow': 1000.0}}},\n 'preventive': {'ampere': {'margin': 51.6, 'side1': {'flow': 540.18}},\n 'megawatt': {'margin': 35.78, 'side1': {'flow': 374.22}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778},\n {'instant': 'curative',\n 'contingency': 'Contingency DE2 DE3',\n 'setpoint': 0.3896097993971608}]},\n {'rangeActionId': 'redispatchingActionFR',\n 'initialSetpoint': 500.0,\n 'activatedStates': [{'instant': 'preventive', 'setpoint': 898.0}]},\n {'rangeActionId': 'redispatchingActionNL',\n 'initialSetpoint': 1000.0,\n 'activatedStates': [{'instant': 'preventive', 'setpoint': 602.0}]}]}" + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result_json" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-04-23T08:12:48.729218503Z", + "start_time": "2025-04-23T08:12:48.681247654Z" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "If you check the initial cost in the result, you will notice the functional cost is now 0, and instead we have a virtual cost due to a \"min-margin-violation\". Indeed the new objective function is actually the cost of redispatching, and the overload has become a soft constraint.\n", + "And if you check the final result (after curative), then you will see the functional cost is 39820 and the virtual cost is only 769,89.\n", + "The 39820 value corresponds to the cost of the redispatching: 398 (up variation for FR action) * 50 (up variation cost) + 10 (activation cost) + 398 (down variation for NL action) * 50 (down variation cost) + 10 (activation cost). The costs for each action is defined in the crac file.\n", + "The 769,89 virtual cost is due to a remaining overload in the network. Currently you can not configure the cost of the overload, and you can not add a slight security margin which would be needed to avoid this slight overload (the sensitivity values we use in the optimization is an approximation of the reality). These new parameters should be available after the june release. " + ], + "metadata": { + "collapsed": false + } } ], "metadata": { From c04bea3ceb42dee8e354fa899d875a6bd321ac45 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Thu, 31 Jul 2025 08:49:32 +0200 Subject: [PATCH 06/18] update pypowsybl version + rao parameters version --- data/rao/rao_parameters.json | 3 +- data/rao/rao_parameters_costly.json | 6 +- open_rao.ipynb | 1204 ++++++++++++++------------- 3 files changed, 612 insertions(+), 601 deletions(-) diff --git a/data/rao/rao_parameters.json b/data/rao/rao_parameters.json index ce70e39..c2686a6 100644 --- a/data/rao/rao_parameters.json +++ b/data/rao/rao_parameters.json @@ -1,5 +1,5 @@ { - "version" : "3.0", + "version" : "3.1", "objective-function" : { "type" : "SECURE_FLOW", "unit" : "MW" @@ -36,7 +36,6 @@ }, "topological-actions-optimization" : { "max-preventive-search-tree-depth" : 5, - "max-auto-search-tree-depth" : 5, "max-curative-search-tree-depth" : 5, "predefined-combinations" : [ ], "skip-actions-far-from-most-limiting-element" : false, diff --git a/data/rao/rao_parameters_costly.json b/data/rao/rao_parameters_costly.json index f794e9f..9d9a804 100644 --- a/data/rao/rao_parameters_costly.json +++ b/data/rao/rao_parameters_costly.json @@ -1,5 +1,5 @@ { - "version" : "3.0", + "version" : "3.1", "objective-function" : { "type" : "MIN_COST", "unit" : "MW" @@ -36,7 +36,6 @@ }, "topological-actions-optimization" : { "max-preventive-search-tree-depth" : 5, - "max-auto-search-tree-depth" : 5, "max-curative-search-tree-depth" : 5, "predefined-combinations" : [ ], "skip-actions-far-from-most-limiting-element" : false, @@ -134,6 +133,9 @@ }, "multi-threading" : { "available-cpus" : 4 + }, + "costly-min-margin-parameters" : { + "shifted-violation-penalty" : 1000.0 } } } diff --git a/open_rao.ipynb b/open_rao.ipynb index b594fd5..8d3cf20 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -18,50 +18,49 @@ }, { "cell_type": "code", - "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:01.735448807Z", - "start_time": "2025-04-23T07:57:00.724538390Z" + "end_time": "2025-07-30T08:35:44.587970Z", + "start_time": "2025-07-30T08:35:43.517910Z" } }, + "source": "pip install pypowsybl==1.12.0", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: pypowsybl==1.11.0 in ./venv/lib/python3.8/site-packages (1.11.0)\r\n", - "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.8/site-packages (from pypowsybl==1.11.0) (3.11.0)\r\n", - "Requirement already satisfied: networkx in ./venv/lib/python3.8/site-packages (from pypowsybl==1.11.0) (3.1)\r\n", - "Requirement already satisfied: pandas>=2.0.3 in ./venv/lib/python3.8/site-packages (from pypowsybl==1.11.0) (2.0.3)\r\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (2.9.0.post0)\r\n", - "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (2025.1)\r\n", - "Requirement already satisfied: tzdata>=2022.1 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (2025.1)\r\n", - "Requirement already satisfied: numpy>=1.20.3 in ./venv/lib/python3.8/site-packages (from pandas>=2.0.3->pypowsybl==1.11.0) (1.24.4)\r\n", - "Requirement already satisfied: wcwidth in ./venv/lib/python3.8/site-packages (from prettytable>=2.0.0->pypowsybl==1.11.0) (0.2.13)\r\n", - "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=2.0.3->pypowsybl==1.11.0) (1.17.0)\r\n", + "Looking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\r\n", + "Requirement already satisfied: pypowsybl==1.12.0 in ./venv/lib/python3.11/site-packages (1.12.0)\r\n", + "Requirement already satisfied: pandas>=2.2.3 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (2.2.3)\r\n", + "Requirement already satisfied: networkx in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.5)\r\n", + "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.16.0)\r\n", + "Requirement already satisfied: tzdata>=2022.7 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", + "Requirement already satisfied: numpy>=1.23.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.2.6)\r\n", + "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.9.0.post0)\r\n", + "Requirement already satisfied: wcwidth in ./venv/lib/python3.11/site-packages (from prettytable>=2.0.0->pypowsybl==1.12.0) (0.2.13)\r\n", + "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.3->pypowsybl==1.12.0) (1.17.0)\r\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], - "source": [ - "pip install pypowsybl==1.11.0" - ] + "execution_count": 1 }, { "cell_type": "code", - "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.650470249Z", - "start_time": "2025-04-23T07:57:01.731845621Z" + "end_time": "2025-07-30T08:35:45.049299Z", + "start_time": "2025-07-30T08:35:44.614619Z" } }, - "outputs": [], "source": [ "import pypowsybl as pp\n", "from pypowsybl.rao import Parameters as RaoParameters" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -72,17 +71,17 @@ }, { "cell_type": "code", - "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.699114054Z", - "start_time": "2025-04-23T07:57:02.651663865Z" + "end_time": "2025-07-30T08:35:45.127988Z", + "start_time": "2025-07-30T08:35:45.122939Z" } }, - "outputs": [], "source": [ "n12 = pp.network.load('./data/rao/12_node_network.uct')" - ] + ], + "outputs": [], + "execution_count": 3 }, { "cell_type": "markdown", @@ -93,27 +92,29 @@ }, { "cell_type": "code", - "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.737294008Z", - "start_time": "2025-04-23T07:57:02.729248779Z" + "end_time": "2025-07-30T08:35:45.202716Z", + "start_time": "2025-07-30T08:35:45.178410Z" } }, + "source": [ + "n12.get_network_area_diagram()" + ], "outputs": [ { "data": { - "text/plain": "", - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / °
\n
\n
kV / °
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / °
\n
\n
\n
\n
\n" + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n kV / °
\n
\n
\n
BBE2AA1
\n
\n kV / °
\n
\n kV / °
\n
\n
\n
DDE1AA1
\n
\n kV / °
\n
\n
\n
DDE2AA1
\n
\n kV / °
\n
\n
\n
DDE3AA1
\n
\n kV / °
\n
\n
\n
FFR1AA1
\n
\n kV / °
\n
\n
\n
FFR2AA1
\n
\n kV / °
\n
\n
\n
FFR3AA1
\n
\n kV / °
\n
\n
\n
NNL1AA1
\n
\n kV / °
\n
\n
\n
NNL2AA1
\n
\n kV / °
\n
\n
\n
NNL3AA1
\n
\n kV / °
\n
\n
\n
\n
\n" }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n12.get_network_area_diagram()" - ] + "execution_count": 4 }, { "cell_type": "markdown", @@ -131,28 +132,30 @@ }, { "cell_type": "code", - "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.758565839Z", - "start_time": "2025-04-23T07:57:02.733941011Z" + "end_time": "2025-07-30T08:35:45.270604Z", + "start_time": "2025-07-30T08:35:45.253526Z" } }, + "source": [ + "pp.loadflow.run_dc(n12)\n", + "n12.get_network_area_diagram()" + ], "outputs": [ { "data": { - "text/plain": "", - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 1.3°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.0°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.0°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.0°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 5.3°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 3.3°
\n
\n
\n
\n
\n" + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n kV / 0.7°
\n
\n
\n
BBE2AA1
\n
\n kV / 0.0°
\n
\n kV / 1.3°
\n
\n
\n
DDE1AA1
\n
\n kV / 0.7°
\n
\n
\n
DDE2AA1
\n
\n kV / 1.3°
\n
\n
\n
DDE3AA1
\n
\n kV / -0.0°
\n
\n
\n
FFR1AA1
\n
\n kV / -4.0°
\n
\n
\n
FFR2AA1
\n
\n kV / -2.0°
\n
\n
\n
FFR3AA1
\n
\n kV / -2.0°
\n
\n
\n
NNL1AA1
\n
\n kV / 5.3°
\n
\n
\n
NNL2AA1
\n
\n kV / 3.3°
\n
\n
\n
NNL3AA1
\n
\n kV / 3.3°
\n
\n
\n
\n
\n" }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "pp.loadflow.run_dc(n12)\n", - "n12.get_network_area_diagram()" - ] + "execution_count": 5 }, { "cell_type": "markdown", @@ -164,29 +167,31 @@ }, { "cell_type": "code", - "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.774317900Z", - "start_time": "2025-04-23T07:57:02.753459041Z" + "end_time": "2025-07-30T08:35:45.332894Z", + "start_time": "2025-07-30T08:35:45.316518Z" } }, + "source": [ + "n12.connect(\"NNL2AA1 BBE3AA1 2\")\n", + "pp.loadflow.run_dc(n12)\n", + "n12.get_network_area_diagram()" + ], "outputs": [ { "data": { - "text/plain": "", - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
BBE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.7°
\n
\n
\n \n
\n
BBE2AA1
\n \n \n \n \n \n \n \n \n \n
\n
\n
kV / 0.0°
\n
\n
kV / 1.4°
\n
\n
\n \n
\n
DDE1AA1
\n \n \n \n \n \n
\n
\n
kV / 0.2°
\n
\n
\n \n
\n
DDE2AA1
\n \n \n \n \n \n
\n
\n
kV / 0.8°
\n
\n
\n \n
\n
DDE3AA1
\n \n \n \n \n \n
\n
\n
kV / -0.4°
\n
\n
\n \n
\n
FFR1AA1
\n \n \n \n \n \n
\n
\n
kV / -4.2°
\n
\n
\n \n
\n
FFR2AA1
\n \n \n \n \n \n
\n
\n
kV / -2.3°
\n
\n
\n \n
\n
FFR3AA1
\n \n \n \n \n \n
\n
\n
kV / -2.1°
\n
\n
\n \n
\n
NNL1AA1
\n \n \n \n \n \n
\n
\n
kV / 4.5°
\n
\n
\n \n
\n
NNL2AA1
\n \n \n \n \n \n
\n
\n
kV / 2.5°
\n
\n
\n \n
\n
NNL3AA1
\n \n \n \n \n \n
\n
\n
kV / 2.6°
\n
\n
\n
\n
\n" + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n kV / 0.7°
\n
\n
\n
BBE2AA1
\n
\n kV / 0.0°
\n
\n kV / 1.4°
\n
\n
\n
DDE1AA1
\n
\n kV / 0.2°
\n
\n
\n
DDE2AA1
\n
\n kV / 0.8°
\n
\n
\n
DDE3AA1
\n
\n kV / -0.4°
\n
\n
\n
FFR1AA1
\n
\n kV / -4.2°
\n
\n
\n
FFR2AA1
\n
\n kV / -2.3°
\n
\n
\n
FFR3AA1
\n
\n kV / -2.1°
\n
\n
\n
NNL1AA1
\n
\n kV / 4.5°
\n
\n
\n
NNL2AA1
\n
\n kV / 2.5°
\n
\n
\n
NNL3AA1
\n
\n kV / 2.6°
\n
\n
\n
\n
\n" }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n12.connect(\"NNL2AA1 BBE3AA1 2\")\n", - "pp.loadflow.run_dc(n12)\n", - "n12.get_network_area_diagram()" - ] + "execution_count": 6 }, { "cell_type": "markdown", @@ -199,69 +204,12 @@ }, { "cell_type": "code", - "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.871819332Z", - "start_time": "2025-04-23T07:57:02.773541463Z" + "end_time": "2025-07-30T08:35:45.449310Z", + "start_time": "2025-07-30T08:35:45.380952Z" } }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-23 09:57:02,786 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", - "2025-04-23 09:57:02,789 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,790 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-23 09:57:02,791 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,792 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,792 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-23 09:57:02,792 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-04-23 09:57:02,833 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,835 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,836 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-23 09:57:02,837 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,837 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-23 09:57:02,838 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-23 09:57:02,838 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,838 - INFO - Linear optimization on root leaf\n", - "2025-04-23 09:57:02,838 - INFO - No range actions to optimize\n", - "2025-04-23 09:57:02,839 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-23 09:57:02,839 - INFO - No range actions activated\n", - "2025-04-23 09:57:02,839 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,839 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-23 09:57:02,839 - INFO - Search depth 1 [start]\n", - "2025-04-23 09:57:02,840 - INFO - Leaves to evaluate: 1\n", - "2025-04-23 09:57:02,840 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 09:57:02,841 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,842 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 09:57:02,842 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,843 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,844 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 09:57:02,844 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-04-23 09:57:02,845 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,847 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,848 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-23 09:57:02,848 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-23 09:57:02,849 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-23 09:57:02,849 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-23 09:57:02,850 - INFO - Search depth 1 [end]\n", - "2025-04-23 09:57:02,850 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-23 09:57:02,851 - INFO - Search depth 1 best leaf: No range actions activated\n", - "2025-04-23 09:57:02,851 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,852 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-23 09:57:02,853 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-23 09:57:02,853 - INFO - Best leaf: No range actions activated\n", - "2025-04-23 09:57:02,854 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,854 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-23 09:57:02,855 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 09:57:02,855 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-23 09:57:02,856 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,857 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" - ] - } - ], "source": [ "# prepare inputs\n", "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", @@ -276,7 +224,66 @@ "#run rao\n", "raoResult = rao_runner.run(n12, rao_parameters)\n", "result_json = raoResult.to_json()" - ] + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-07-30 10:35:45,396 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-07-30 10:35:45,397 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,398 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,399 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-07-30 10:35:45,399 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,400 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,400 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-07-30 10:35:45,401 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-07-30 10:35:45,401 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,402 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,403 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-07-30 10:35:45,403 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,403 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-07-30 10:35:45,404 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-07-30 10:35:45,404 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,404 - INFO - Linear optimization on root leaf\n", + "2025-07-30 10:35:45,405 - INFO - No range actions to optimize\n", + "2025-07-30 10:35:45,405 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-07-30 10:35:45,405 - INFO - No range actions activated\n", + "2025-07-30 10:35:45,406 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,406 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-07-30 10:35:45,406 - INFO - Search depth 1 [start]\n", + "2025-07-30 10:35:45,407 - INFO - Leaves to evaluate: 1\n", + "2025-07-30 10:35:45,407 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-07-30 10:35:45,408 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,409 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,409 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-07-30 10:35:45,410 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,437 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,437 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-07-30 10:35:45,438 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-07-30 10:35:45,438 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,439 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,441 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-07-30 10:35:45,441 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-07-30 10:35:45,442 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-07-30 10:35:45,442 - INFO - Remaining leaves to evaluate: 0\n", + "2025-07-30 10:35:45,443 - INFO - Search depth 1 [end]\n", + "2025-07-30 10:35:45,443 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-07-30 10:35:45,444 - INFO - Search depth 1 best leaf: No range actions activated\n", + "2025-07-30 10:35:45,444 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,444 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-07-30 10:35:45,445 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-07-30 10:35:45,445 - INFO - Best leaf: No range actions activated\n", + "2025-07-30 10:35:45,445 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,446 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-07-30 10:35:45,446 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-07-30 10:35:45,446 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-07-30 10:35:45,447 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,447 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" + ] + } + ], + "execution_count": 7 }, { "cell_type": "markdown", @@ -287,26 +294,51 @@ }, { "cell_type": "code", - "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.872215222Z", - "start_time": "2025-04-23T07:57:02.864567529Z" + "end_time": "2025-07-30T08:35:45.499471Z", + "start_time": "2025-07-30T08:35:45.496433Z" } }, + "source": [ + "result_json" + ], "outputs": [ { "data": { - "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 90.0,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -139.73,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 201.67, 'side1': {'flow': 390.11}},\n 'megawatt': {'margin': 139.73, 'side1': {'flow': 270.27}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': []}" + "text/plain": [ + "{'type': 'RAO_RESULT',\n", + " 'version': '1.8',\n", + " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n", + " 'computationStatus': 'default',\n", + " 'executionDetails': 'The RAO only went through first preventive',\n", + " 'costResults': {'initial': {'functionalCost': 90.0,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'preventive': {'functionalCost': -139.73,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'outage': {'functionalCost': -139.73,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'curative': {'functionalCost': -139.73,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n", + " 'computationStatusMap': [],\n", + " 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n", + " 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n", + " 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n", + " 'preventive': {'ampere': {'margin': 201.67, 'side1': {'flow': 390.11}},\n", + " 'megawatt': {'margin': 139.73, 'side1': {'flow': 270.27}}}}],\n", + " 'angleCnecResults': [],\n", + " 'voltageCnecResults': [],\n", + " 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n", + " 'activatedStates': [{'instant': 'preventive'}]}],\n", + " 'rangeActionResults': []}" + ] }, - "execution_count": 9, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "result_json" - ] + "execution_count": 8 }, { "cell_type": "markdown", @@ -340,109 +372,6 @@ }, { "cell_type": "code", - "execution_count": 10, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-23 09:57:02,868 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,869 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,869 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,870 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,870 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,871 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,871 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,871 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,872 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,872 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,872 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,873 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,873 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,873 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,873 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,874 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,874 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,874 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-04-23 09:57:02,875 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-23 09:57:02,875 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-23 09:57:02,875 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-04-23 09:57:02,879 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", - "2025-04-23 09:57:02,880 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-04-23 09:57:02,880 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,880 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-23 09:57:02,881 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,881 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,881 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-23 09:57:02,882 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-23 09:57:02,882 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,883 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,883 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:02,884 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,884 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,884 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-23 09:57:02,885 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,885 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,885 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-23 09:57:02,886 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-23 09:57:02,886 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,886 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,887 - INFO - Linear optimization on root leaf\n", - "2025-04-23 09:57:02,923 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,924 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-23 09:57:02,924 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,925 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,925 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-23 09:57:02,926 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-23 09:57:02,926 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,927 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,928 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:02,928 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,929 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,929 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-04-23 09:57:02,931 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-23 09:57:02,931 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-04-23 09:57:02,932 - INFO - range action(s): pst-range-action: -10\n", - "2025-04-23 09:57:02,932 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,932 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,933 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-23 09:57:02,933 - INFO - Search depth 1 [start]\n", - "2025-04-23 09:57:02,933 - INFO - Leaves to evaluate: 1\n", - "2025-04-23 09:57:02,934 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 09:57:02,934 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,935 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 09:57:02,935 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,935 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,936 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 09:57:02,936 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-23 09:57:02,936 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,937 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,937 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:02,937 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,938 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,938 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,938 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,939 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-23 09:57:02,939 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-23 09:57:02,939 - INFO - Search depth 1 [end]\n", - "2025-04-23 09:57:02,940 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,940 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-04-23 09:57:02,940 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,940 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,941 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-23 09:57:02,941 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,941 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-04-23 09:57:02,942 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,942 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,942 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,943 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 09:57:02,943 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-23 09:57:02,943 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,943 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,944 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" - ] - } - ], "source": [ "# prepare inputs\n", "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", @@ -461,34 +390,172 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.964659663Z", - "start_time": "2025-04-23T07:57:02.868408103Z" + "end_time": "2025-07-30T08:35:45.593889Z", + "start_time": "2025-07-30T08:35:45.547161Z" } - } - }, - { - "cell_type": "code", - "execution_count": 11, + }, "outputs": [ { - "data": { - "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778}]}]}" - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-07-30 10:35:45,550 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,551 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,551 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,551 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,551 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,552 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,552 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,552 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,553 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,553 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,553 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,553 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,554 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,554 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,554 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,554 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,555 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,555 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-07-30 10:35:45,555 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-07-30 10:35:45,555 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-07-30 10:35:45,556 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-07-30 10:35:45,562 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-07-30 10:35:45,563 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-07-30 10:35:45,563 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,564 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,564 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-07-30 10:35:45,564 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,565 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,566 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-07-30 10:35:45,566 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-07-30 10:35:45,566 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,567 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,567 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,568 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,568 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,568 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-07-30 10:35:45,569 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,569 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,569 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-07-30 10:35:45,569 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-07-30 10:35:45,570 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,570 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,570 - INFO - Linear optimization on root leaf\n", + "2025-07-30 10:35:45,572 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,572 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,573 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-07-30 10:35:45,573 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,574 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,574 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-07-30 10:35:45,575 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-07-30 10:35:45,575 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,576 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,576 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,576 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,577 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,577 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-07-30 10:35:45,578 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-07-30 10:35:45,578 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-07-30 10:35:45,579 - INFO - range action(s): pst-range-action: -10\n", + "2025-07-30 10:35:45,579 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,579 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,580 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-07-30 10:35:45,580 - INFO - Search depth 1 [start]\n", + "2025-07-30 10:35:45,580 - INFO - Leaves to evaluate: 1\n", + "2025-07-30 10:35:45,580 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-07-30 10:35:45,581 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,582 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,582 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-07-30 10:35:45,583 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,583 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,583 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-07-30 10:35:45,584 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-07-30 10:35:45,584 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,585 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,585 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,585 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,586 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,586 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,587 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,587 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-07-30 10:35:45,587 - INFO - Remaining leaves to evaluate: 0\n", + "2025-07-30 10:35:45,588 - INFO - Search depth 1 [end]\n", + "2025-07-30 10:35:45,588 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,588 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-07-30 10:35:45,588 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,589 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,589 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-07-30 10:35:45,589 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,589 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-07-30 10:35:45,590 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,590 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,590 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,590 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-07-30 10:35:45,591 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-07-30 10:35:45,591 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,592 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,592 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + ] } ], + "execution_count": 9 + }, + { + "cell_type": "code", "source": [ "result_json" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-23T07:57:02.965364192Z", - "start_time": "2025-04-23T07:57:02.950974318Z" + "end_time": "2025-07-30T08:35:45.641696Z", + "start_time": "2025-07-30T08:35:45.638018Z" } - } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'type': 'RAO_RESULT',\n", + " 'version': '1.8',\n", + " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n", + " 'computationStatus': 'default',\n", + " 'executionDetails': 'The RAO only went through first preventive',\n", + " 'costResults': {'initial': {'functionalCost': 133.3,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'preventive': {'functionalCost': -187.22,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'outage': {'functionalCost': -187.22,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'curative': {'functionalCost': -187.22,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n", + " 'computationStatusMap': [],\n", + " 'flowCnecResults': [{'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n", + " 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n", + " 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n", + " 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n", + " 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n", + " {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n", + " 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n", + " 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n", + " 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n", + " 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n", + " 'angleCnecResults': [],\n", + " 'voltageCnecResults': [],\n", + " 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n", + " 'activatedStates': [{'instant': 'preventive'}]}],\n", + " 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n", + " 'initialTap': 0,\n", + " 'activatedStates': [{'instant': 'preventive', 'tap': -10}]}]}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 10 }, { "cell_type": "markdown", @@ -520,150 +587,6 @@ }, { "cell_type": "code", - "execution_count": 12, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-23 09:57:02,956 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,956 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,957 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,957 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,957 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,957 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,958 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,958 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,958 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,958 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,959 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,959 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,959 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,959 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,960 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,960 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,960 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 09:57:02,960 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-04-23 09:57:02,960 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-23 09:57:02,961 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-23 09:57:02,961 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-04-23 09:57:02,964 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", - "2025-04-23 09:57:02,965 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,965 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-23 09:57:02,966 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,966 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,966 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-23 09:57:02,967 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-04-23 09:57:02,967 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,967 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,968 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:02,968 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,968 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,969 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-23 09:57:02,969 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,969 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,969 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-23 09:57:02,970 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-23 09:57:02,970 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,970 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,971 - INFO - Linear optimization on root leaf\n", - "2025-04-23 09:57:02,972 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,973 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-23 09:57:02,973 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,973 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,974 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-23 09:57:02,974 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-23 09:57:02,974 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,975 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,976 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:02,976 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,977 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,977 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-04-23 09:57:02,978 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-23 09:57:02,979 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-04-23 09:57:02,979 - INFO - range action(s): pst-range-action: -10\n", - "2025-04-23 09:57:02,980 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,980 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,980 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-23 09:57:02,981 - INFO - Search depth 1 [start]\n", - "2025-04-23 09:57:02,981 - INFO - Leaves to evaluate: 1\n", - "2025-04-23 09:57:02,981 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 09:57:02,982 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,982 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 09:57:02,983 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,983 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,983 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 09:57:02,984 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-23 09:57:02,984 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,984 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,985 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:02,985 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,985 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,986 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,986 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,986 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-23 09:57:02,987 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-23 09:57:02,987 - INFO - Search depth 1 [end]\n", - "2025-04-23 09:57:02,987 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,987 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-04-23 09:57:02,988 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,988 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,988 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-23 09:57:02,989 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,989 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-04-23 09:57:02,989 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,990 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:02,990 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-23 09:57:02,990 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 09:57:02,990 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-23 09:57:02,991 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 09:57:02,991 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 09:57:02,992 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 09:57:02,993 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-04-23 09:57:02,993 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,993 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,994 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:02,994 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:02,994 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-04-23 09:57:02,995 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-04-23 09:57:02,995 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 09:57:02,995 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:02,996 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-04-23 09:57:02,999 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-04-23 09:57:02,999 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-04-23 09:57:03,000 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-04-23 09:57:03,001 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 09:57:03,001 - INFO - Linear optimization on root leaf\n", - "2025-04-23 09:57:03,003 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 09:57:03,003 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 09:57:03,004 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 09:57:03,004 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 09:57:03,004 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 09:57:03,005 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-04-23 09:57:03,005 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:03,005 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", - "2025-04-23 09:57:03,006 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 09:57:03,006 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 09:57:03,006 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", - "2025-04-23 09:57:03,007 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", - "2025-04-23 09:57:03,008 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-23 09:57:03,009 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-04-23 09:57:03,009 - INFO - range action(s): pst-range-action: 6\n", - "2025-04-23 09:57:03,010 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 09:57:03,010 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-04-23 09:57:03,010 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-04-23 09:57:03,011 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-04-23 09:57:03,011 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-04-23 09:57:03,012 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 09:57:03,012 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 09:57:03,012 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 09:57:03,012 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" - ] - } - ], "source": [ "# prepare inputs\n", "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", @@ -682,34 +605,224 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-23T07:57:03.063042654Z", - "start_time": "2025-04-23T07:57:02.955246626Z" + "end_time": "2025-07-30T08:35:45.762076Z", + "start_time": "2025-07-30T08:35:45.701006Z" } - } - }, - { - "cell_type": "code", - "execution_count": 13, + }, "outputs": [ { - "data": { - "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 133.3,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': 237.65,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': -187.22,\n 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778},\n {'instant': 'curative',\n 'contingency': 'Contingency DE2 DE3',\n 'setpoint': 2.337343603803646}]}]}" - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-07-30 10:35:45,703 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,704 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,704 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,704 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,705 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,705 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,705 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,705 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,706 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,706 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,706 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,706 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,706 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,707 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,707 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,707 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,707 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:35:45,708 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-07-30 10:35:45,708 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-07-30 10:35:45,708 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-07-30 10:35:45,708 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-07-30 10:35:45,713 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-07-30 10:35:45,714 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,714 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,715 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-07-30 10:35:45,715 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,716 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,716 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-07-30 10:35:45,716 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-07-30 10:35:45,717 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,717 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,717 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,718 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,718 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,718 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-07-30 10:35:45,719 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,719 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,719 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-07-30 10:35:45,720 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-07-30 10:35:45,720 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,720 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,720 - INFO - Linear optimization on root leaf\n", + "2025-07-30 10:35:45,722 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,723 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,723 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-07-30 10:35:45,723 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,723 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,724 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-07-30 10:35:45,724 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-07-30 10:35:45,724 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,725 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,725 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,725 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,726 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,726 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-07-30 10:35:45,727 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-07-30 10:35:45,728 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-07-30 10:35:45,728 - INFO - range action(s): pst-range-action: -10\n", + "2025-07-30 10:35:45,729 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,729 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,729 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-07-30 10:35:45,729 - INFO - Search depth 1 [start]\n", + "2025-07-30 10:35:45,730 - INFO - Leaves to evaluate: 1\n", + "2025-07-30 10:35:45,730 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-07-30 10:35:45,731 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,732 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,732 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-07-30 10:35:45,732 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,733 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,733 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-07-30 10:35:45,733 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-07-30 10:35:45,734 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,734 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,735 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,735 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,735 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,736 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,736 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,737 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-07-30 10:35:45,737 - INFO - Remaining leaves to evaluate: 0\n", + "2025-07-30 10:35:45,738 - INFO - Search depth 1 [end]\n", + "2025-07-30 10:35:45,738 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,738 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-07-30 10:35:45,738 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,739 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,739 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-07-30 10:35:45,739 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,739 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-07-30 10:35:45,739 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,740 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,740 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-07-30 10:35:45,740 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-07-30 10:35:45,740 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-07-30 10:35:45,741 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-07-30 10:35:45,741 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,742 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,742 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-07-30 10:35:45,742 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,743 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,743 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-07-30 10:35:45,743 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-07-30 10:35:45,744 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,744 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,744 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,745 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,745 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,746 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-07-30 10:35:45,746 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-07-30 10:35:45,746 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,746 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-07-30 10:35:45,747 - INFO - Using base network '12_node_network' on variant 'ContingencyScenario1d5c7599-a0cc-4463-90bc-c801dbc88b9a'\n", + "2025-07-30 10:35:45,747 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-07-30 10:35:45,747 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-07-30 10:35:45,748 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-07-30 10:35:45,748 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-07-30 10:35:45,749 - INFO - Linear optimization on root leaf\n", + "2025-07-30 10:35:45,751 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-07-30 10:35:45,751 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-07-30 10:35:45,751 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-07-30 10:35:45,752 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-07-30 10:35:45,752 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-07-30 10:35:45,752 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-07-30 10:35:45,753 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-07-30 10:35:45,753 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,754 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,754 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-07-30 10:35:45,754 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-07-30 10:35:45,755 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", + "2025-07-30 10:35:45,755 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-07-30 10:35:45,757 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-07-30 10:35:45,757 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-07-30 10:35:45,757 - INFO - range action(s): pst-range-action: 6\n", + "2025-07-30 10:35:45,758 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-07-30 10:35:45,758 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-07-30 10:35:45,758 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-07-30 10:35:45,759 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-07-30 10:35:45,759 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-07-30 10:35:45,759 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-07-30 10:35:45,760 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-07-30 10:35:45,760 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-07-30 10:35:45,760 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + ] } ], + "execution_count": 11 + }, + { + "cell_type": "code", "source": [ "result_json" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-23T07:57:03.063410591Z", - "start_time": "2025-04-23T07:57:03.035676789Z" + "end_time": "2025-07-30T08:35:45.810335Z", + "start_time": "2025-07-30T08:35:45.806226Z" } - } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'type': 'RAO_RESULT',\n", + " 'version': '1.8',\n", + " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n", + " 'computationStatus': 'default',\n", + " 'executionDetails': 'The RAO only went through first preventive',\n", + " 'costResults': {'initial': {'functionalCost': 133.3,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'preventive': {'functionalCost': 237.65,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'outage': {'functionalCost': 237.65,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}},\n", + " 'curative': {'functionalCost': -187.22,\n", + " 'virtualCost': {'sensitivity-failure-cost': 0.0}}},\n", + " 'computationStatusMap': [],\n", + " 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n", + " 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n", + " 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n", + " 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n", + " 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n", + " 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n", + " 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}},\n", + " {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n", + " 'initial': {'ampere': {'margin': -192.55, 'side1': {'flow': 842.07}},\n", + " 'megawatt': {'margin': -133.3, 'side1': {'flow': 583.3}}},\n", + " 'preventive': {'ampere': {'margin': 270.21, 'side1': {'flow': 379.3}},\n", + " 'megawatt': {'margin': 187.22, 'side1': {'flow': 262.78}}}},\n", + " {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n", + " 'initial': {'ampere': {'margin': -129.99, 'side1': {'flow': 721.77}},\n", + " 'megawatt': {'margin': -90.0, 'side1': {'flow': 500.0}}},\n", + " 'preventive': {'ampere': {'margin': 286.51, 'side1': {'flow': 305.28}},\n", + " 'megawatt': {'margin': 198.5, 'side1': {'flow': 211.5}}}}],\n", + " 'angleCnecResults': [],\n", + " 'voltageCnecResults': [],\n", + " 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n", + " 'activatedStates': [{'instant': 'preventive'}]}],\n", + " 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n", + " 'initialTap': 0,\n", + " 'activatedStates': [{'instant': 'preventive', 'tap': -10},\n", + " {'instant': 'curative', 'contingency': 'Contingency DE2 DE3', 'tap': 6}]}]}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 12 }, { "cell_type": "markdown", @@ -723,27 +836,35 @@ }, { "cell_type": "code", - "execution_count": 14, + "source": [ + "[x for x in result_json.get(\"flowCnecResults\") if x.get(\"flowCnecId\") == 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative']" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2025-07-30T08:35:45.863998Z", + "start_time": "2025-07-30T08:35:45.860531Z" + } + }, "outputs": [ { "data": { - "text/plain": "[{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}}]" + "text/plain": [ + "[{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n", + " 'initial': {'ampere': {'margin': 152.35, 'side1': {'flow': 280.66}},\n", + " 'megawatt': {'margin': 105.55, 'side1': {'flow': 194.45}}},\n", + " 'preventive': {'ampere': {'margin': -343.12, 'side1': {'flow': 776.14}},\n", + " 'megawatt': {'margin': -237.65, 'side1': {'flow': 537.65}}},\n", + " 'curative': {'ampere': {'margin': 419.7, 'side1': {'flow': 13.32}},\n", + " 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}}]" + ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "[x for x in result_json.get(\"flowCnecResults\") if x.get(\"flowCnecId\") == 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative']" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2025-04-23T07:57:03.063640711Z", - "start_time": "2025-04-23T07:57:03.035989995Z" - } - } + "execution_count": 13 }, { "cell_type": "markdown", @@ -774,171 +895,6 @@ }, { "cell_type": "code", - "execution_count": 19, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-23 10:12:17,158 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,159 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,160 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,161 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,162 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,163 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,163 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,164 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,165 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,165 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,166 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,166 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,167 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,167 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,168 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,169 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,169 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-23 10:12:17,170 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-04-23 10:12:17,170 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-23 10:12:17,170 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-23 10:12:17,171 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-04-23 10:12:17,175 - WARNING - Running RAO using Open RAO version 4.8.0 from git commit de884076e9d0cfa1f0975cb9adc227ac23c061b0.\n", - "2025-04-23 10:12:17,176 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 10:12:17,177 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-23 10:12:17,177 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 10:12:17,178 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-23 10:12:17,178 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-23 10:12:17,179 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", - "2025-04-23 10:12:17,179 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,180 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-1.099476065746785E-9, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,180 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 10:12:17,181 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,181 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.589235492678199E-8, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,182 - INFO - Initial sensitivity analysis: cost = 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19})\n", - "2025-04-23 10:12:17,182 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,183 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 10:12:17,183 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-23 10:12:17,184 - INFO - Root leaf, cost: 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19})\n", - "2025-04-23 10:12:17,184 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,184 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 10:12:17,185 - INFO - Linear optimization on root leaf\n", - "2025-04-23 10:12:17,192 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 10:12:17,192 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-23 10:12:17,193 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 10:12:17,193 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-23 10:12:17,193 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-23 10:12:17,193 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", - "2025-04-23 10:12:17,194 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,194 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.0026220928996290027, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,195 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 10:12:17,195 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,195 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-6.412581576853427E-9, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,196 - INFO - Iteration 1: better solution found with a cost of 3393964.30 (functional: 50020.00)\n", - "2025-04-23 10:12:17,202 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-23 10:12:17,203 - INFO - Root leaf, 3 range action(s) activated, cost: 3393964.3 (functional: 50020.0, virtual: 3343944.3 {min-margin-violation-evaluator=3343944.3})\n", - "2025-04-23 10:12:17,203 - INFO - range action(s): redispatchingActionFR: 1000, pst-range-action: -10, redispatchingActionNL: 500\n", - "2025-04-23 10:12:17,203 - INFO - Limiting element #01: margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,203 - INFO - Limiting element #02: margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 10:12:17,203 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 784.39 MW, threshold = 450.00 MW, margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,204 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 641.31 MW, threshold = 410.00 MW, margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", - "2025-04-23 10:12:17,204 - INFO - Using base network '12_node_network_redispatching' on variant 'PreventiveScenario'\n", - "2025-04-23 10:12:17,204 - INFO - Search depth 1 [start]\n", - "2025-04-23 10:12:17,204 - INFO - Leaves to evaluate: 1\n", - "2025-04-23 10:12:17,205 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 10:12:17,205 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 10:12:17,206 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 10:12:17,206 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 10:12:17,206 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 10:12:17,207 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 10:12:17,207 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", - "2025-04-23 10:12:17,207 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,208 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.00889825060106375, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,208 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 10:12:17,209 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,209 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=2.4709123636057484E-10, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,209 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: 50020.0 (functional: 50020.0, virtual: 0.0)\n", - "2025-04-23 10:12:17,216 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 10:12:17,217 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 10:12:17,217 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 10:12:17,218 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 10:12:17,218 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 10:12:17,218 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", - "2025-04-23 10:12:17,219 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,219 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,219 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 10:12:17,220 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,220 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,221 - INFO - Iteration 1: better solution found with a cost of 40589.89 (functional: 39820.00)\n", - "2025-04-23 10:12:17,227 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-23 10:12:17,228 - INFO - Optimized network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", - "2025-04-23 10:12:17,228 - INFO - Optimized network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,228 - INFO - Optimized network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 374.22 MW, threshold = 410.00 MW, margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", - "2025-04-23 10:12:17,229 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-23 10:12:17,229 - INFO - Search depth 1 [end]\n", - "2025-04-23 10:12:17,229 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", - "2025-04-23 10:12:17,230 - INFO - Search depth 1 best leaf: range action(s): redispatchingActionFR: 898, pst-range-action: -10, redispatchingActionNL: 602\n", - "2025-04-23 10:12:17,230 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,230 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 10:12:17,230 - INFO - Search depth 2 [start]\n", - "2025-04-23 10:12:17,231 - INFO - No more network action available\n", - "2025-04-23 10:12:17,231 - INFO - No better result found in search depth 2, exiting search tree\n", - "2025-04-23 10:12:17,231 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-23 10:12:17,231 - INFO - Best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", - "2025-04-23 10:12:17,232 - INFO - Best leaf: range action(s): redispatchingActionFR: 898, pst-range-action: -10, redispatchingActionNL: 602\n", - "2025-04-23 10:12:17,232 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,232 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 10:12:17,233 - INFO - Scenario \"preventive\": initial cost = 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19}), 1 network action(s) and 3 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602, cost after preventive optimization = 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n", - "2025-04-23 10:12:17,233 - INFO - network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,233 - INFO - network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 374.22 MW, threshold = 410.00 MW, margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", - "2025-04-23 10:12:17,233 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 10:12:17,234 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-23 10:12:17,234 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-23 10:12:17,234 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 10:12:17,235 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 10:12:17,235 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 10:12:17,235 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 10:12:17,236 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 10:12:17,236 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", - "2025-04-23 10:12:17,236 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,237 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,237 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 10:12:17,237 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,238 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,238 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 3664369.8 (functional: 39820.0, virtual: 3624549.8 {min-margin-violation-evaluator=3624549.8})\n", - "2025-04-23 10:12:17,238 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 10:12:17,239 - INFO - Limiting element #02: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,239 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-04-23 10:12:17,242 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-04-23 10:12:17,243 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-04-23 10:12:17,243 - INFO - Root leaf, cost: 3624549.8 (functional: 0.0, virtual: 3624549.8 {min-margin-violation-evaluator=3624549.8})\n", - "2025-04-23 10:12:17,244 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 10:12:17,245 - INFO - Linear optimization on root leaf\n", - "2025-04-23 10:12:17,250 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-23 10:12:17,251 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-23 10:12:17,252 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-04-23 10:12:17,252 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-23 10:12:17,253 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-23 10:12:17,253 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-04-23 10:12:17,254 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,255 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.4915466934061214E-4, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,255 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-23 10:12:17,256 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-23 10:12:17,256 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.1015190415928373E-10, distributedActivePower=0.0))\n", - "2025-04-23 10:12:17,257 - INFO - Iteration 1: better solution found with a cost of 0.00 (functional: 0.00)\n", - "2025-04-23 10:12:17,264 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-23 10:12:17,264 - INFO - Root leaf, 1 range action(s) activated, cost: 0.0 (functional: 0.0, virtual: 0.0)\n", - "2025-04-23 10:12:17,265 - INFO - range action(s): pst-range-action: 1\n", - "2025-04-23 10:12:17,265 - INFO - Limiting element #01: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 10:12:17,265 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 3624549.8 (functional: 0.0, virtual: 3624549.8 {min-margin-violation-evaluator=3624549.8}), 1 range action(s) activated : pst-range-action: 1, cost after curative optimization = 0.0 (functional: 0.0, virtual: 0.0)\n", - "2025-04-23 10:12:17,266 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-04-23 10:12:17,266 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-04-23 10:12:17,266 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-04-23 10:12:17,267 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-04-23 10:12:17,267 - INFO - Limiting element #02: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-04-23 10:12:17,267 - INFO - Limiting element #03: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-23 10:12:17,268 - INFO - Cost before RAO = 7165629.19 (functional: 0.0, virtual: 7165629.19 {min-margin-violation-evaluator=7165629.19}), cost after RAO = 40589.89 (functional: 39820.0, virtual: 769.89 {min-margin-violation-evaluator=769.89})\n" - ] - } - ], "source": [ "# prepare inputs\n", "n12 = pp.network.load('./data/rao/12_node_network_redispatching.uct')\n", @@ -957,34 +913,88 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-23T08:12:17.288972952Z", - "start_time": "2025-04-23T08:12:17.158532942Z" + "end_time": "2025-07-30T08:43:58.334641Z", + "start_time": "2025-07-30T08:43:58.318964Z" } - } - }, - { - "cell_type": "code", - "execution_count": 20, + }, "outputs": [ { - "data": { - "text/plain": "{'type': 'RAO_RESULT',\n 'version': '1.7',\n 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n 'computationStatus': 'default',\n 'executionDetails': 'The RAO only went through first preventive',\n 'costResults': {'initial': {'functionalCost': 0.0,\n 'virtualCost': {'min-margin-violation-evaluator': 7165629.19,\n 'sensitivity-failure-cost': 0.0}},\n 'preventive': {'functionalCost': 39820.0,\n 'virtualCost': {'min-margin-violation-evaluator': 3624549.8,\n 'sensitivity-failure-cost': 0.0}},\n 'outage': {'functionalCost': 39820.0,\n 'virtualCost': {'min-margin-violation-evaluator': 3624549.8,\n 'sensitivity-failure-cost': 0.0}},\n 'curative': {'functionalCost': 39820.0,\n 'virtualCost': {'min-margin-violation-evaluator': 769.89,\n 'sensitivity-failure-cost': 0.0}}},\n 'computationStatusMap': [],\n 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n 'initial': {'ampere': {'margin': -128.4, 'side1': {'flow': 561.41}},\n 'megawatt': {'margin': -88.93, 'side1': {'flow': 388.93}}},\n 'preventive': {'ampere': {'margin': -523.36, 'side1': {'flow': 956.38}},\n 'megawatt': {'margin': -362.45, 'side1': {'flow': 662.45}}},\n 'curative': {'ampere': {'margin': 1.03, 'side1': {'flow': 431.98}},\n 'megawatt': {'margin': 0.73, 'side1': {'flow': 299.27}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n 'initial': {'ampere': {'margin': -1035.39, 'side1': {'flow': 1684.91}},\n 'megawatt': {'margin': -716.56, 'side1': {'flow': 1166.56}}},\n 'preventive': {'ampere': {'margin': -0.18, 'side1': {'flow': 649.69}},\n 'megawatt': {'margin': -0.08, 'side1': {'flow': 450.08}}}},\n {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n 'initial': {'ampere': {'margin': -852.3, 'side1': {'flow': 1444.08}},\n 'megawatt': {'margin': -590.0, 'side1': {'flow': 1000.0}}},\n 'preventive': {'ampere': {'margin': 51.6, 'side1': {'flow': 540.18}},\n 'megawatt': {'margin': 35.78, 'side1': {'flow': 374.22}}}}],\n 'angleCnecResults': [],\n 'voltageCnecResults': [],\n 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n 'activatedStates': [{'instant': 'preventive'}]}],\n 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n 'initialSetpoint': 0.0,\n 'activatedStates': [{'instant': 'preventive',\n 'setpoint': -3.894612745121778},\n {'instant': 'curative',\n 'contingency': 'Contingency DE2 DE3',\n 'setpoint': 0.3896097993971608}]},\n {'rangeActionId': 'redispatchingActionFR',\n 'initialSetpoint': 500.0,\n 'activatedStates': [{'instant': 'preventive', 'setpoint': 898.0}]},\n {'rangeActionId': 'redispatchingActionNL',\n 'initialSetpoint': 1000.0,\n 'activatedStates': [{'instant': 'preventive', 'setpoint': 602.0}]}]}" - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-07-30 10:43:58,321 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,322 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,322 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,322 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,323 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,323 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,323 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,324 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,324 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,324 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,324 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,325 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,325 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,325 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,325 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,326 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,326 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-07-30 10:43:58,326 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-07-30 10:43:58,326 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-07-30 10:43:58,326 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-07-30 10:43:58,327 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-07-30 10:43:58,332 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-07-30 10:43:58,333 - ERROR - null \n", + " java.lang.NullPointerException\n", + "\tat com.powsybl.openrao.searchtreerao.commons.objectivefunction.InitialSensitivityAnalysisObjectiveFunctionCreator.getVirtualCostEvaluators(InitialSensitivityAnalysisObjectiveFunctionCreator.java:38)\n", + "\tat com.powsybl.openrao.searchtreerao.commons.objectivefunction.AbstractObjectiveFunctionCreator.create(AbstractObjectiveFunctionCreator.java:53)\n", + "\tat com.powsybl.openrao.searchtreerao.commons.objectivefunction.ObjectiveFunction.buildForInitialSensitivityComputation(ObjectiveFunction.java:50)\n", + "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.PrePerimeterSensitivityAnalysis.runInitialSensitivityAnalysis(PrePerimeterSensitivityAnalysis.java:62)\n", + "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.PrePerimeterSensitivityAnalysis.runInitialSensitivityAnalysis(PrePerimeterSensitivityAnalysis.java:48)\n", + "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.CastorFullOptimization.run(CastorFullOptimization.java:93)\n", + "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.Castor.run(Castor.java:78)\n", + "\tat com.powsybl.openrao.raoapi.Rao$Runner.run(Rao.java:95)\n", + "\tat com.powsybl.openrao.raoapi.Rao$Runner.run(Rao.java:108)\n", + "\tat com.powsybl.openrao.raoapi.Rao.run(Rao.java:205)\n", + "\tat com.powsybl.python.rao.RaoContext.run(RaoContext.java:53)\n", + "\tat com.powsybl.python.rao.RaoCFunctions.lambda$runRao$6(RaoCFunctions.java:136)\n", + "\tat com.powsybl.python.commons.Util.doCatch(Util.java:144)\n", + "\tat com.powsybl.python.rao.RaoCFunctions.runRao(RaoCFunctions.java:132)\n", + "\n" + ] } ], + "execution_count": 19 + }, + { + "cell_type": "code", "source": [ "result_json" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-23T08:12:48.729218503Z", - "start_time": "2025-04-23T08:12:48.681247654Z" + "end_time": "2025-07-30T08:43:40.506523Z", + "start_time": "2025-07-30T08:43:40.503443Z" } - } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'type': 'RAO_RESULT',\n", + " 'version': '1.8',\n", + " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n", + " 'computationStatus': 'failure',\n", + " 'executionDetails': 'RAO failed during initial sensitivity analysis : null'}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 18 }, { "cell_type": "markdown", From 1073ff62939a8fb291f8a56f11ce949e5f357d4c Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Mon, 25 Aug 2025 15:33:20 +0200 Subject: [PATCH 07/18] WIP - initiate monitoring notebook --- .../angle_monitoring/GlskB45MicroGridTest.xml | 73 ++++ data/angle_monitoring/GlskB45test.xml | 71 ++++ data/angle_monitoring/MicroGrid.zip | Bin 0 -> 121959 bytes .../angle_monitoring_crac.json | 87 +++++ ...nitoring_simple_case_with_injectionRa.json | 72 ++++ ...ngle_monitoring_simple_case_with_topo.json | 72 ++++ data/angle_monitoring/network.xiidm | 60 ++++ data/angle_monitoring/rao_glsk.xml | 86 +++++ open_rao.ipynb | 86 ++--- open_rao_monitoring.ipynb | 324 ++++++++++++++++++ 10 files changed, 870 insertions(+), 61 deletions(-) create mode 100644 data/angle_monitoring/GlskB45MicroGridTest.xml create mode 100644 data/angle_monitoring/GlskB45test.xml create mode 100644 data/angle_monitoring/MicroGrid.zip create mode 100644 data/angle_monitoring/angle_monitoring_crac.json create mode 100644 data/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json create mode 100644 data/angle_monitoring/angle_monitoring_simple_case_with_topo.json create mode 100644 data/angle_monitoring/network.xiidm create mode 100644 data/angle_monitoring/rao_glsk.xml create mode 100644 open_rao_monitoring.ipynb diff --git a/data/angle_monitoring/GlskB45MicroGridTest.xml b/data/angle_monitoring/GlskB45MicroGridTest.xml new file mode 100644 index 0000000..26ab0ee --- /dev/null +++ b/data/angle_monitoring/GlskB45MicroGridTest.xml @@ -0,0 +1,73 @@ + + + 10XES-REE------E-20170412-SWECCD2 + 1 + B22 + A48 + 10XES-REE------E + A04 + 22XCORESO------S + A36 + 2017-07-18T06:31:36Z + + 2017-04-12T02:00Z + 2027-04-12T03:00Z + + 10YCB-FR-ES-PT-S + + B45TestBE + 10YBE----------2 + A01 + + + 2021-04-02T05:00Z + 2021-04-02T06:00Z + + PT60M + + 1 + + B45 + A01 + A01 + MAW + 2 + + _550ebe0d-f2b2-48c1-991f-cebea43a21aa + FFR2AA1 _generator + 2002 + -402 + + + + + + + B45TestNL + 10YNL----------L + A01 + + + 2021-04-02T05:00Z + 2021-04-02T06:00Z + + PT60M + + 1 + + B45 + A01 + A01 + MAW + 1 + + _9c3b8f97-7972-477d-9dc8-87365cc0ad0e + FFR1AA1 _generator + 2001 + -401 + + + + + + diff --git a/data/angle_monitoring/GlskB45test.xml b/data/angle_monitoring/GlskB45test.xml new file mode 100644 index 0000000..81c70e7 --- /dev/null +++ b/data/angle_monitoring/GlskB45test.xml @@ -0,0 +1,71 @@ + + + 10XES-REE------E-20170412-SWECCD2 + 1 + B22 + A48 + 10XES-REE------E + A04 + 22XCORESO------S + A36 + 2017-07-18T06:31:36Z + + 2017-04-12T02:00Z + 2017-04-12T03:00Z + + 10YCB-FR-ES-PT-S + + B45TestFR + 10YFR-RTE------C + A01 + + + 2017-04-12T02:00Z + 2017-04-12T03:00Z + + PT60M + + 1 + + B45 + A01 + A01 + MAW + 1 + + FFR1AA1 _generator + FFR1AA1 _generator + 2001 + -401 + + + + B45 + A01 + A01 + MAW + 2 + + FFR2AA1 _generator + FFR2AA1 _generator + 2002 + -402 + + + + B45 + A01 + A01 + MAW + 3 + + FFR3AA1 _generator + FFR3AA1 _generator + 3003 + -403.0 + + + + + + diff --git a/data/angle_monitoring/MicroGrid.zip b/data/angle_monitoring/MicroGrid.zip new file mode 100644 index 0000000000000000000000000000000000000000..047d85122c0e937d7776abaeb3ff4249919f7e85 GIT binary patch literal 121959 zcmZ5{1xy@F)Gbh;xVyW%ySuwvS==28#ogWA-QA(MySucwI}~`!_y5Vudz-8zo6Oyr zIrrRiWtC*Vfun(ZJz8zd)&BeNzb`N#L?H5(04IA%CrcAXbv1a9?-~EdjZ1;guXk4u zSP)R~xq|`A|6Y{-TL%gR3MAe1|E`nW@EwHV|5=BHiG`Vog^62@nVXeK$Bd*Y4+8}C_SrDW0`(@Y@?J>Sd1J7@b!8cN2`{YAiFo)57+?b@& zK?&iL&X?g=&zP44m${$4pHH86PoIATdp=IrdRtfQ4Z1vE5C!{>{!-4YPuy1Yc)V=* zK96zQ^A6_zOU->R?e*1vQ|x{I#&z-`0q4#F0J=%EZ67!?6pwvk8%L$(Q%@$kNSpYuZ{iq8D_6eCnGanykuM3~AQ<{eSzoN_!kX3yirgXh8R~UU?r#Kl;6*CbnvRM1{AXcB?#`1m0 z>9x$o`aG7xcX=>Hc}= z>hGr<6q%`cRneoXr==Gl4=JS1Ye%JGLjCQxaxg2OUm$u*B zux3~5UaqtkJa8v`M5Gt=y4$zK9gVUEB6G<@!@CAky7u8TbLG$8DtzOua-RUtmlxt-R2ho5{*nl|Y2B;SB_*}lX zLw_fM_QR~uE2{L5dqu??hd{&kTSA{()9GRtW_Y<%WW6&ey@cefAKV4C_wl(Hm#mFH*)@-UnlaK7nroZ+#z^S3Y?EJ|9nq zCL%fWQjB%>!BV1x9{ux!(g?i2ecbBI>|9_JzfW))9zDLAKa&#vk@USj75_Zw?N*s5 zDAP?ix}3B2d2-fdd>Rq_#0q)NBJAEIJYslC{p<3gBd5L8iuQcqp7xu83vQZP>k^b> z47!cG1C*DC+ihPE=e%L;c=2Hdfqt=y>XqOeesyhWHUACQO>mQG&U`|il<)vwv{D-% z7y5>ub27EopoR4^QRb6eheN5s-ftDj$r66`8Ktv$S)b1-H%t3n{>?;sIIPDAi9A}; z0UGYF?z!uOz}Or^v*u=xq5}2;Sj~`DU~_)pNraZYI(|P*t5K_Gu3mI@e&^67$vG># z=^3j@1ZV^RZ+L_ddPQfa`{LAN#g4U(71Zezq2bafB@#L6QK}{zXh~0&+Cj>ymVT)o zGrbBS!3*#Cn=wl7qCxnUomVzX351?(ciZx60JXGGmD=c35~|~c)j8faz1vRz-&xa{ zHNR?Q=mBVv@fsg8y+{MS2@@eWVC;b%dxQzX>u|;oESGe;m^`)L*U7a)V}S5HA<$|l zOFbl<0rByuA=kkPP1v}^mH*n%#XdU|>30elPz2IN+dVnGPApz#ci1iWvU=z;x4*Fms&rN2`ijq5{@^$yL5Tz*%`$6mK#~)Vb+8KA7;j1B zzod}VA!3XUvMoz040cepCAq?1acog{>hyK=G?~oe%z~szlvD|EeB7Yzf>v2CU#7W7 zZHa?1Y7FZwo=hmTj;_N>Szev((OmevV*mRK`#KNiiAkjc=Y;w;PVs7sM{S)2!Y}UX znHd78hxkUlK8`mS1}iy#1xM7GWq@fsIt`}lnpF{w@A>3G@f!Uk(X0CCnhCv8H?xc55952=q{yUr;!+axC~10-PY( zP+ULA1P_2h_cufTYT9Ub8&A_fLm#q(Yk}lHn{paO?qY9!Zk`Zb7+T$XH+EOfRVr74 z!iP!p^qEp)%HC-$JJy#_awoLs*XAL;;4w~32>HGr4f=Qr8CHp%AtpyvJq!??$0p*K zvvc9+*azvs0(0YwaGW@(p8{=)e8NajSX%;Hx9xukSQCwWwQK#S^s9{bINajtk|kiH z?hS!sU>m&9$kL_yiMm4>rX_ZGh@DzJ0z4nJ440AL$%vy7$Z1z!Sni`^0OA#~Yky6S_XW@u5uCqk&a z#lOc8GT`!pa$ko-_Fdct za_bda_YpG;Gp4n{K4bAL%WuLf#E@J2fkmq79_z*W1tzV!H%Z}JTD8A>79AsECL^@= z9C;jz+wOY!DCQ-h=D?-4D!Xx_Z&brU%aBKKB)!M;2^J<#uNqbu){?XG!6)LxG>d5} zvquenI&y@!NOA!ow+~XHiiV3V;yMmH3O-h<>WafKZ1)K|2}E2*N)`O3{3-w}zC-$+l~A>;JN zgh`|NncDo2mB2(f9_5PHG)O0l1E@B(imBf^rh*ofeDbP(@zU_XtU-p?c(iLyD~%_Wz(SdScc0`t~fSs9?cHvf<2S8 zOsR)^d@dN0$x;asqbk>|+JMuGDo*|#=N1R2JZHpFXDh^GWL1BVCg+z-A&wcIr|cbQ z(eudr)*FmUBO(KQbV=g)-sIPv)1v^GPlX^4#B;yF-lgbEn;c~b)tKaSi_XgMqpqwkZCP!g1^};vggC4jV1?bG z1&b^iV*DZ}SyovO`xLn)-X7upDrhK_5cs4z4JI%s!i&Bp%EK;rErlRg3^CL1U6?=RtCfDSVW{F- zITFWZ>{1OAycbXwY&Gi_eCr(fuA7D12@8(~UlBegbeYh{tCl-5JK`iK(aaG(?>DRr z)@esXE)r&-XQHcvCXirluHmamZ=RqNsHkL%pBan2ki1@=G>I8n)U`DPjHBqPq%6s4 zt6)6PyH?1@47oI}omidkTZ|iZox3`TDmR-%N+`38ksb3_^tE0ZHR#0)`$?#oWzLlb zeh|@_q-@4X85Qw>~RIGt~fQ1)=#CMB~g|TD^^(H*bmVX z8Z{To{*0XEv$za*`3 z+;(L^9g=L+GH=7%+#I2i_uOi}emXZe{M;P4zm6)1s&2sSZFDi?jz}*3a_V+YM9w6FnT=hh#@9}TF`lKkwLr>BX4F=Y`p($ZfuS}- z8Ta8d4K}Veih3UZw53=mb{wddod(66&4G82U~=Huk8T=|a|rbm2t4u95h)Q^2?cKV*eu4}*yy*HHFP#hJ#I5w)F4^_WS_Akmnnou!AR`XSVHs_67dP1CUgqkkqPJp(C;wl~7J9t&F(HBPJZj-0`Xpb0|+BkE$eu(5q=qDK zj+5@PwR^W>L_50u<4O9}ROfQaoDB z(+Y1@I0>U`3=c^-xDlt0dxo0-)CaPgj-<>zmvw3j+^>2WKe#*Ex^!c1&37t$T{!Z= zC69;?$4Jr9U7m4t;=+|iSq@pSK};KwGMx$tB{^zn)M8yAhX)TGc>dcmcHi4yUPes^ z>0hqO$yI(D-Wy36yjV`zm(Fgzbuda9SVGdo^e-Ez{y*tYlZ3+?oHzQPB% zE2EU~nlgAsrins0*~$%f7jU^464*VW6gZdC7vut?nr%T+;k|LbDG8K1DTvpGT5KZb z+=5T>3os5a#}{Lmm*F@-&>qX$5I1>Fuw?_kjCB(5EnU@DOI=K%rwz}Pz|Z1@bh^CS zsJpjAz(Bl;pV2OfbFwIg_|6{pJ%+r8mwSRDd?{I-@=6K*3>%N5-p-aj$cP?oKv=W* zq}1G9Ht^~8j>Xr$I^@5tWHSeCyIWNGOB-K3RC-b%K7CA2wES@I?--bZ?%*{(f)p_S z$+_@+aP5%2!ok8a)YD15{ECmDQ%;$|Ye_H+&~-jjKQ49Gp2gzEkyl zysk4g(7JO#C!+>S-5b6A9`g5`Xe!N^=|U#IThH0xsr{X`_nk0537f)7XjI_rR(en+ z=0t8@>ct}uK#o@Dc1Zb@K9JUpEvMjHekS-pit~l>`Q~FuC=d%a@%cmNORjE!Q$6%< z&zUQF-&=;vJPlkr)ECxyyK8wF7}3rNxGBFBA`)zeF-=T%4<*IDS%XICFTq|>lca>A zhG3U9ilblTQ}K<}VEutf=C|7u?bIqzw3|ML>n`bf#QGKP?5MUCD_-9NbS^PFBh8Z0 zq6r(OA=`xL=yLo-FXBXgu6AYJNE{q_9Q&_*WsK_>75&6c z`z%k)%40%dmvVPti)RLvl^ur8K0s2(OH)==6lS#Hf}a{MFccS1m0mSIS9-M8y83-d za*)GfTnqMNGD3`vYtT_3MI+Q?@L36_DX!XyK9+beCBJhxiM|6BfSv(OTK_bL<>L%gy1zBMjj%mS60cHpV z1W=tnsyz2bK_g~JnNAev>z0)$f}~u=%?zfsEgj(;O)BjeID^IblB#HmS+H{Gsz#~3%$gMgA-+VCLG6(bGnW_060xdR zZcdZe>T|IsyZK*ATF@1yaYip7e7`nu~*(%YT4@vfL$C(kWbG zdhv&Y&_E&|;)$`AE@qpdhtGJG23#wvML29s#Q@ZKd3`dE>Q6YCmE2zV2h@f>mrViX7~YCVG$nrm-tB(AJ_5%#xVD70Ey#7k28H zQ7=3HRzrYSr*v3zMawA*#ei26q)>~9R+^U|D|s-kd|E!^H#Otbae`lxCMdN!EpVN; zzVb@8RJeI3I7@EX1> zxDU(LM5On>`i(S@_Sa_OZCcM$v&44M5yRY@kMsoc$oguIIu~w602?u(t?Wom*JZOS zHnd_4D1@s~nbGIoQO+&m%aJ?hugVcL=xdhP*K^l%8!921aJj@uOuu($Z<|YvzfiSO zf#&=o8|4SM3wQ3ro6ZoqPHvB_1t2QUt+!!mg?DgsjYvGTJ1bN*)jz7RG29K`D{ruj zgMx|7C`c?dFpq>(vF6zn7`eVGCkTL%*9$4QQxZH0B0?;zAEI8?%49aw<4(1$Ygn<& zIUChs|#IzqX&nVQv$HxrwReTdZ!F$@x@02&SQUt`n2> zP_u8bA0NU);E-p+iyE^seCDsxn$2o3VC6inc?GhkX%yI@Yvn_JSp)e8mgWv?gTFa~ zlSIUjs0lnT(aBm_hw9wwhf(Zf14|~)CBBa<9SfVCT~(}u4_k)Vp6CbKm^*;WY!YVK9~N^~onY3vEGGH+|v*>zLWsysf`5xSAF|=|EfBpXap2Ie8@s!YcAeOgYkaCm%%@z|d{!q>@nX`9J|aw#;*U=P3TWUB)-U zst2brqT`H`{-L({IPejS!xUaGTTKdp*MY7$$Dyh#*fik^nI_M64ihWt6BKfwR75P= zSXz-;=VD*{q3Y(AN$red94$&)RtDG`$12QuLvjZ>(~oi)=ar?FuNVC@KsjomSJ*+2*;FZ(KaksO$~ow!8Z1@sR}iRCQiR9H0-U} z-2D7}*zs_yG)W{RPXR&-QC%PIr%2;rX>PwDNe~rUsNN;@)Cxr=^&uqoK^Zr`KHoIN zb$E_cjQV%}O|||uJx7smd3CeDo+>fq)|R9HR$4&g z2Bo2jHplce(GKj?Jo4zGMnhWQ)N!MYEa$Re%u~%5F^j}ggW!6k`82B>;j@pz{;jO>;I+0Qt}V98-Ox(Pz?Dqaz@;m50!X(Eo%Xjo8#% z2iDYLFeR)I4GgPJb2ap|u3LjgP#}&`F2i$CP#w@W+p2LAWcX)+8gD?_h?iISVPae6 zpb@XrhWdX`v(xhm>Fjke1A5*hS3~pP8f3&)zgN3ZX7|Dz>gfD`51i*8ERXpH^3zIW zXx)gXcGxvi@_L2(=Avr8FIfbME}HBu^|Ll6-qMBN%W>q~T81(vr#eI>C%!1xSXrwG z+hLmdzGNf8_K%#5*Pyk$yYI>5SN`GEfUkQA7L6lJT`t@}*sL~*4|u}22^VD_ra)2? zwbqAP6%e<)a^Av#lO=PP@m5u-#gK)H185jW6;z#hLK-iunM#ur@HYB@0TXIkdZkh$ zP+3%}oNr13>RBD07*{?M*({alGR*lEq1N~=4WJcKoa;}l=$YGwwRgbq7_r1w^DC~8 zbr~KX#~2F1UM+%H2zyT<>eqAvFpYFxi?^dHb;FcgM-RhVVeI zt9l)RK==_hfhyqx|10y-gSq5VYgB}{O3c!z^WnxPhMaS*#V60b?Ku(k*bC*=niRf# zuEIyJ@dC#}gzl5$e242kX>b;CZ092RD~3a=P!8T1kovQ#t?(hOg|w_fT*elJ(V>>`s!+0c3%!iG|QbOf? z;cn2$9?32zQB`MvKeGT3xz%K>?qG{?4@qa*^d;qsP{?XvRnU5={570A79w0p^sWQb z+ZW}2uFCpSe%ocd3Zt$DTEKmUH*SJ}@3b>JByK!h>*?}PzV(N@W8Gh*#1IS7>tW&h z)7#aY{kO);Cvu7q$(ZScJC_aSmzp~Cb{_Ne{5&6x%R6*9-N-iouHW25TtXt;lT$wpJO()tl2D$xC0tLYF=N3ug6iRFd$WWpQL}#{){<) z=rwoAqsuUsq+!hD;2C@Vp+O&5x=N2}PK$5#)#zZ+zvpgL=Il-uVB-|SpPWPTAz4Un z-Xb8(6Zqmk4$NY?!T#{eb5uKx3P%g90QH@vc;Y@V-9hq^X0=D*n@ThZh(b;PlT z?kRr~7=qc2vYsSxFB!yfGg`fcWAA-sGP%GI=fJX9rGH47HK8e8lOT=ZA=t&ZHX7No zod4VadG}YaGWhZXkzUzPBO*YGEVS{Lt&WSt?%*x z+e)tZ$Eq-z!BT@ekrO6=+a8!diPRqI?rNH$ecsITA*u> ziKL)mxM?iMe?RFB8K!T3Nqt|#OgzYi({xhzu#O_v0kxPY@?fMPAMgb^UoG6$8XH$;d38_Htg48MWV*Ig?7xU6ed9)y{vB zq+a!mwAl*X<2+|qi{_0b${8VHqQ?{cVk){I34=?!_AIKXZSJ=!*2x_rQv(rKakkK~ z5(o0$KK~|ru!u-x%44cYJH9xm8l!!cs0UWs8f<1KbCIJr`k7PTDFx4Nrg(75wWzI2 z78bmoXpu^)%w%EDtFcAieF&G5l%z`#!8sh4JDHr%yU_6?SeMJ(D?a8F>REIVrq!vkm@oyOjs2 z$%Afq2MyxoOAfQvUmBac`_fMU>r_Z6Ml?&7AX#$i24!W_V$iXKVLQEzUciQdg}V`S zk9j~`bqHk-730IT2l`dB0++BX-afbY*0NW_=|pgZnGKTbq)N0=)r>zkz%ul;;|nEQ zC^X5V1XgJ8_ww_{pdCX_E0GYj&71GW{a^J^q3DKw3T&H2q?#pW1S$i^3<16~lG+E? zuiaJUoD3_`?5Z;Cl2G=g<*4zS0q(^vvwCVsr9%L?>^Ffrn^=8mNS?cWV?SwLW;*LF>#5mTbQuL4t#Ef3V*=l%Es= zn)w=T*1|3`_>aAhZ@T^^U1o#ArF2D$wL%MAEp($IP{20zSxuIpm{i8*$kr-vc`uyh z?`yM`ozuuV;ar(Kx{ z&|-wuiyqI=T%3*;KOLr#L^I=1I+qXO?r|l+!dmi+vX6k zx_utv1O;MWUhABc&^>#-adYacaqlqk$5b?zr`UyoST*+QqB+qC4_ZQ`V#sP>igtFh z5eb?ay9ro|(ykHaX!k5`$bY(!6|pEZeHBZ=UFPV$Xx*f4 z)QRgwvet1dV|2#%L{DK2qA|A`(4t@U0RpTjdp1o2f*9u1%o3N{kC|`G^7Ws3g<-|P zVKh%t%x`XfN;-j7W=bg4lRh>StTAq;Vkyon>*||Xm}Y1(jvITHIj$NElhGNOQSF^p z2bz!M;vCeyN4&!%|E*P-;AKZ&&8(EX1bL*ioK+e0>PR_GD<2z{t&pjwU8K?IeU+#p z1vOD2E34n93Xa?@$-opqz66)Og@KyLzShW?|b#ikKj8u)xbifHwfsGp}lOlthU;`U`M`1?-7B*eZZ5x~`zwlQnfjtX6lpD9fPw z)(1$*k54gL>{>V7rN|zC=U%RxXi8@cyKD?u^5T)IO@Bs_#mK*Es_MZbNcb31w~CGa zF!>l$^LDsj#^XJ)0E^QVW2yOCIyVajQ{Pvro<$>P*vX%alS*O0?|8%4~msa8OkXLd5S zi;UBQsXh|bG z(Se;ll8`|*0G&i2w%Gkivflg*6!8IWg^beDrK0lH=J=DKT@i9 zbkU+nIDpbuhWc#yztl8lB&elI3MG$s5V{?KgtuvQr7XdIIb&jmV4@%m?9KjN^j z{TNhoKcAd0F{1c)V^e2D>&lDb+DdeWUP?r~a;^9poGCQy@FOJ^vCo+hw@?C-2-{5( zf!eSZO$qn`Dh;WbKbp*Udp+5$Ae$(``5<$UwPcQ};^Pf7;)62T*w>OF6+2{B{Y&BM z)XN?EYc_x(EMM8Ei3uJNr zya63F%D9k6g)%wv1ie}_6|{nRJSh!Hg&sJ7WZghp6D(?tXzsTrHZUD&ugBWPw_YxP zv#Tq(RQJ}rRYNFrV>v!;Cnv5QTa(1MX@IwdgP%dDQla=z)YUO>2PL1?@L2qm<&+P? zr57}33cj`qB0tb-^ea61a8_;+9IsP^_{huIpfxK0Qzr=5#oC_xw=N^Sw|&5e>T>h` z^OD-FTT*MrB~cOufM%n;!f-j^zt+T^d<%x1o7$9_R4~orelAh#6E_kHPK;Ek8uVCC z{FJc}OzgqR@xA5Jf&1EsG7>5kK2FbnsOvobt(GVh%>fpDvNt?Y?#c1HoBCDpYg|Pf zLCYIQlEbsns?bmV1tZx1PZREye7+m7OM1jXQHV=UBv$B7%=JH-chO=7*tLw8Ea62xF*hae+r$#=6?r{~1> zn%vn9wGj6kI%sko){i8BO?`Qs$#hofx7ulfZDu!2aoLgwysRj&OlBEIZ6?TErFWKL zEp5i-ZI8>2%EgUfopyEd;rm(rfpJESl?5^sg?eRyCULv3wrr*j?CD$O3>qMKSig^# zCwbVfw^dmRC_)NOhyI9kGd&M#>xa!5Zr`Y}hekTXe7xk=~7w?Whz?`=}1`@MP&XH8`2w)Pv-B87J9&0L^iK0LlG;{b}K_ zjDAVhKzfA1r9IMC(ocG$9i8gcqA*8^pr`}do^sI#`}424iGbqOE;d&Wxd><#{2Q5` z1nQ1u3sDWxC6CI6<(h9C?+#09uy`_%c7>+7dZ9LfrQ_6tN(l6786d`*<(#m81*~>t zTa2iqy34nnq#6xkUFr$$AI+kH^I$@q;uTs^Zbg&eIvn1UR=lbu?(GC@7Z~iDAzR`h zRBIJ_*muA?o+Cn)VH{X{s>|WVOmlam_pf|3M}a~yfWH_+Una|Y802W3uNq!%fAyb=^pq&pM(hVzF>R&e2r z@iGif7W&6%epdMEAFdw@*KbX5Hf*#%$L?~NSnt$3Cf zMu~)}=Q%0)2jlno?)_{bLv7`iq2&RTG(^71LLv z_mR4l8PxokOf2S*P4Y()?=^pw`jM0^JC5(EcDyfhQH&eIz^ASH&tj1tSs}dA>jDWi zAE><>HqBViRF6w%wz>{jn{L~R-au2VuWUcR_Q29to+0&(PSpF*9bT)spY=t-S{C;b zwKH+Y*b!XPIW7@L5VHxK zhXuKdY;`APbgIEnJ#ez8GD5>Cei^k*3ftK8c>BQ|h3`ja5@0GhKhiqEg|(z9z%-M6 z=nyPq7GxRuPx@oq-?32hwdT>A*!ThdT{q+v>_L(!zd1=NX<#$!@y2G|yWWQAw^@fD zbBCK;zep8dLq&3=W{h$QUxF!c24+QAgQB7a`o89}3b3qCRm4gT$a*-ld5}bXfR%S0 zkHJu)!^EA(+T9LKscoFD*m0ow@mgG$->$jIfVZ}5EJjAfzr-6KB9JxxZHYgL3=;QnKu>=(ARDt<%d5<S6)>H2&(n^PAdT#-a-uV|sM-14!=&4c`XR2x_4O>R>uS~1f>@eOqP zF_PJ6q>bQ>VBQ63pm$pY>&AQ%9 z=3s|xJU?#Bju-w6d0061fAwxxjjgWdqDHA;SNGu$9g4dT2b`;hibEG;eY@DB(^x~A zNGQ)_m@b9M_{^^h35v)%AX*;=L{j%3pI57#4<7MN+9Bxlc*N!{Iy9wse|dKOyq)Ia z5Kl?r8?4AgYrKhzK#>ktVGUglH>Pm;Dqm`cHNEo)w$x}y_O1Z-0KQ=iC*Kv+9&T#VQaTm%5dFpp^bku~#w7&}~c)5gt= z*Bg6=bzH=1z!3~!B{o#cBFUY-u5QW+uxWk`8aY8!ZO27J?XxMd6v9!Bm*3Xgnbwm- z_Ug`Ajwfl9IS&1%;Owqj(sghKRM>JQGW4q)lI+ksq~f2{490H?yI~Z$cF$m0JUY(O z4eOv-G5wj4!mOLar={H+HtU{Xc0Ib5%J`c3>xLqTrapywn2STwC2%f#kvjp4i1lJt zRJL2Uu2cZ)YP--#-wNIs>KR@1DjOG(0+Sye1Rc62 z-P4L$c8`Y};+)ereEKAt79BRTj)TxIoIhIzH!vGdvtkCKf8)Qe+Q zpKyfe22f6CQJ6*~cx(}!4?T*Wq(xfya7c&l-6KlvX7<3TOouyJ?!3?^mF;zw_04b~ z-35-H(Iu2AhFVs?6$sFx!*M@V z$no^}<=p+0RJBE?#{_h)`!;9V7?q&IZlNJAw7(PO6(%eDEuE-8FzqnYxpxvZ>raq43>iMU#6=P!ZE1XOj*o{+cP4|=D_su?SwFK=8TB-pm;JJ=Le z4Tm5VC?b(d_RSM2UTJ3r!g2Qlm>%s+cgsi?kS+WG^5bJaAu6bQ1Fo|BQ#1EtA7J!o9SgmNE()O6 zm80;wL@<)NMnHnG?na#cCTB?1_>VvlfD<$zVkdsP3Q=Jf&-CHK-XCx}{~{-?@sP~p z5B+d@@CPf<_x8h%)QUetQxCepEs01i!-kr`CP@&K#WaXBS4MBIRF|UZ#hr!j~J99p8i{H$b(c%>z*Aw0!NSk}C&+^D8 zO>78JXMrra#Y!OnV3{(=cWBZ ztg%`Fdp?37$SlG6v@6DvV7AdGIAr>8xMs+Q@6PML5?BlP?Kh$6uF@l^`jjz*9JdQ2{C)JZ!zZ zSaDPdPAW1RP?Zx5Ekbk^+-|({OlOK8&VQ6R-M;3jZQLijBm8F8z=CUZIgeOR>|SUS zC8jk;1-{}DM?rXcp^zzOM9+efc!@4fUTP^!%Dx$g^EvSRTEy9zO~PmSHFmkc)wFt6 zQYoJ%>Ps^Fj=wFYNhE6Gc7NyZPgC0|>LmD`kN2OWa(LN5!h=cUmM#D|DBXXdJtNN4 zuN1u9Ii3R#kZO}fI*?^fH>e~FIG5&%w*}uuFL{hZAKJB+ zHPOozZSfZKNX6$>0&FS$|16y;L%C&AWw-TeH-tqa)&ur0^k}tNJw-Di$lAtrI1a<1 zO6sh<6fAx8TkLaT##L-4cNzf5rr!3O!5iYu*+mH>U6rS|SSvXfNV>L!&?Ckc+BoQC zOHq3M!)oPx7IHs!%~Yc2pB=$QKVGdx0!=z*CXE$&o z${Mqxd1iEjmkldpk6nIa`t4n$SbFFBx8DWo$P@ zfW|x$EfqwO4y1Kun+CZfmrK#gf1KlH<5gQksAs=LbE^65eNz(1&9VCYi+;kOeG}!s z3E%w?3bvJOA(&#(C!Cymr>k%eH+HvSz8yXt4`2o1!v^zA4>>Q-CMn7p$M7hYoDnxe ztynkUIP$eo0jnX>yUFdi=4`ddiE0J-UzDE4+L&&*DZI+pRCYuR%{4tN$bb$P!}3l#`sGlhMzaDp7v zW4`6f zXk@&Nw`LI3d>XDZQvglZTS;RVZF;< z6>-G>4kT3lUooAjArKxIcX*mf7=94`X8Tde=cW6vkpfgfb|L-sEdPlh5CIDd%Ybz-#A zI%Ca5Z$OOvjllV-C3FK7j1wq-0pNbX`Ib1w1v@1eHb4enpMZS*YO`;>{C+m82UOix zw*dM5<%eYz$=Z5Kuu|rQaIR$oWlMovt!*F&U~w;q3}un3;eroBg4fQihjRh3Z0G*3 z9=26>v`ZRo++q{mp@b|fi%{_jC<;=Dsxeyn#>xpZRfF`FV#Rl4mo%H3F%a-U1%L_B zzty-5T>f-O*9B&OeDFu}{na{_zneZH{6MkuZ&k@fbrQOZ_7s1E_bT35f@paq7Itbwtrs=2{bQ9IN8FNAqFy{sUNb zbUXSoB7yWy_5R2xmls7$vt|Tn&TMvj=YcgaOM0%KgO#!On==U`KBIRMR5k54-gI+c zy8L}nup3jAwEv#Ab(-WwBYb(^R=$NfqJy#_i*0=b&9x{1)5cC_aU8{2vg%<`V`TQw z`Ul1ezTnM$T&7k{3ln-Hy~E0}xOzXCY!4?n9$Qq0Wm%R`+|VFwnLB!h=T!4oNzHn5 z+nAkentq$U1qa|l-m$Ni~InPAkFbja=w2q#T2O&s@PcQIF4y zv{zgEQS*y#O(#Q{v1~<|$p$KJpq%S*JpL9{4Z(e8HDywDOM>up!e*whKbcji z{Sw+Ie^~3OAv3N(e{n)rRGXg)Uw73(Qtdl;u4t9gS%QugM8`N);mn^-dH#jtA5A~} zkpjjEPRX%w&T+_4AVEnjb2dxJmtocoxp?WV+x>9^`;0dmf!<>L8ymZ|Lt<(OviLZ_ zsSIq*%$rv}iawNVjj&>iAK0;}soj)^PVY0Z$pg*s2{W@l2{g>fhTnTR2n1~BI&+r3 zltfvHd$t5^Z+aYL!51RbMvKg_LSxZoYkIZT>6@5Wm(yEn;crlpyISJu{C!$tRO)!Y zZ)Eh179u-F`nEIJ))46=D&%VB3i_V55OGXIEN*I~Tgk@eu9{%$2c?azIvJTV`~+CM-`P0S?&&wSt3B;<|ZJ}x+dZOu=EZ7alKF5 zjcwaTW1}%PMw7<2+1R#iZqk^Wjcqk)%*JfeI8E~G_xHa4z@E?9Gxy9~n7MUyCS-B_ zWObNcW%=Tum`FpI&`&j_cAJxyaS0g7ggt#Bs+t!GmpOXaxJG;zWk^Xp_xs<~x;7NL zuoK0M-CWsoqC7pUywURaK1uu^((?Jp9t5*IN5ktCH2qh29aG~=<-6HD^%k{SJj{bJ zT`q z1)Gyq5!rZ+)D)PLmZ5Zi$4D;=K7YtWAGkM^V?laS9JN!Q<~FtLAZq@*Mc<0#MzXbC zceX6$yQB0TwsY_eRVaa3<&>`iSK}NJh!LR_gNPlw;8K;5Y*@27o$^&UY>2+LZkaI8 zqspb{w9vFRLa}O+m$=Rv0@Z~2mAe+ty?eh~Pgdg3J2GeUa4isg+st;h zLe=7{Vum-+uXbzbG?b=Y=4{dXM&MB9@v~n*!ykDIy$$J{I)KI5o4sp9{q?KtnkOHu zfs(ox(fb!EW9}-8+mf~w$P-KT307luw_?f(zKkKx?gLM}DpH>wsy+UD8k@c(J5AqA z(-(h6^dUuCYOI=8oYY2VM+Zgf^x^;6mc?k{WNeiD;|cRo zfs>j?u-p%!>BI-LWZ8N!t}5S}&j1FoaiWjr)?{y<27FBobyB#o3S{CHGME9)o})-lrKXWV+Dl_nXl{droHAnC-=mW20lY++4@X zM${W#lBGu;vechJY!OJ7@t)05xt9>OdAdD)TfiFj_T`iey}}Y`t$29u<)R9#fCT3* zPX>L-M)@Ao`D@ls0sdXD%JgFWQ=YBQP6VgLk(|;!LZe?P&B@9HreBfwn77`ij*SCf zMy$m@s^)s1G=^;DEOHq0f0{S*j?@>Sd$`JtI7`VBE_pL+%L`WNxmUwKLu|R#E42D- zezjN5cbInOh~MdC{QG_4!3<{*WrU_L^BvJYZ|FuWiMc zi!#pj1V;3slFWW^f<(WJ&_(+U(f6*zoHtqVSS_V7TZ;Q1ckx9HB^$jN7d|Q-QJDj# zUatbP4`}#aHe#{S8ou#AbUvd&i`Ny#h@4w{9;G|-*De3TfvZNl{FAx_ zGg5A>uDD=rT|vI?#SJ;ay(6S|&vBnx@Z^~q-_>V5darb5SyyK}H0j%doeSWvE41#3 zVs)bva4@&a6}+#I&R?IsNZbgh6r7sE6^qA-IAnN;OYWpUeksI@$&1kJz32+Y6H?$L zwl=Qlc*sxbGccnrLcZF7V@rT&JNOGW>>JO|XS56u4`FQRiX2)+3HaspGw!XP3Uq zlh)QoE;JIg`n^t5m7O7+T)@SxP*JS4))n%+Z(q*v%IYY$g-&J!5!nkAbW%4(+Za^W zmSQy!d(hBREOij6SY9QkzXJ}}+`0^N5W0*v*_%7q5S%-uoTQ3p;SxIh{51HP^#JCr zVZwA<_&}d{(!fuBlnV*jQ(A) z2XtNe##R(N9Y7qk;ryZ5>N;&BJT2X1A zdVe#LGtcev8_!n@nSZ_*9e7m!fubI$rQsq&%};-iqz4tX3y)KAnx8^bjrq9kM=v^vavR8IM9Tvw=U$r zSc}~;cnAbGIE}={%X7eU9`R{zYqytj=G>16SC88C#}e1l^LDDYn<;yZw3&-m6B&4E z7fsl7V;E8lAT+WkF>45EP9;?MooNH|e&Jj8_cuqx1Vh5TmpR&y7YSt24J>;2a z%H3*qPPT*NZ25PcS~kNL6d8%8Sp77ES&iuP0u_pc1xJFvbB(mx=MKhE@M21X@h-Hz z5Rmdh%vHh^6M?@g0z&038j+lvgt=n#jPPBJwXR!*ndgO1|B$)?@nQmEN2WIY z*EJDL<5V;TxxK(0B99yEml8s@$&Wk{PGOuU`Dn{>D4(ax0v|c$u14T`5BIALm<8i< zL*yp8wHgT~eb{pm>1dS#PFx98L)BJRJpT7lyv2{jVJaqnl%>*vP>g4Vq` zv1jchpsL&$&@d!@sl(m}kDj(PIpzE>4!)XyjW@%J@g9Xtn1mIcR1os!{*2Y>qO+|z zNV8#~jEPOD6j?^T9E@?&dH~k80<5DTQKF;5ailimhJXGYK}vVVd8{B@*v9hI1H3}+ z2BZ@lD7C$V)yNMRae>V(w6O{BS(M(}xqP5$WmA{T0^#>7Gfpl@vHp%AyyxE;@D7@G z^eU1$&gakdb_yr-!m7-6vo}B-&cF~8ii>2Ljzbmvx)PcRkeNfzw!rzL$n4t6M_F6Y zCGAk9Qq)Rqq!z#M$D-ot?QAFN-}wQ)z|CyXMP=b@ui_b+-SA3fSt(p7Y4Y3z-c?QM zx-cnezB;XN!GU7LqEEkkeU)97D!a$&YzIu_>Om)n8!|IYIbRas$*86vP9fjh@0wNP zbx~hRehZ|VQsQ}8%%uujs4US7u@^G$IMiOsI30Lw+klz4j3f}qi@&H3KXT)1b!p(N z43hqHLMEtuY_{ZRfmC%{@5ZZ(ipuloYF!Ge4q6&b{rqc5+$_P+f~g~ZXe~l4n`*`g z5x*yGFk`sF0;%ZktpPYe=33WM^TH$}86s5mHZBOS{^+wY*+P3m+K#j$0>oW=JB0*7&=BX2*8OJ-DVQK(8*kS z+YvQG*?LTNE?@=5HRsup3CKpM+XWlF9On#JU%jT(XX^)~(7vS4dL}xtTrcVRI%E0Q zQve)c7297&mvbX&gh9%m>*^>P$LT-XC<@AzW?t&Iz8hVrouzFqXFVEQ80c*)fNNXj zHqR|Gelg$`5xIN~W0A#}5dQ{#)-njrcBxMVo41!*DM%i*z=25I+pF2Bd@)}K2qlk= z*vS%v&7zePN#2t8Yhc(OzNVx8q<#^OLHX`m75A8|S~t(k!zJboFQv>b<>A=xvZu0! z+~*;1=6Lx)nKv8&Yh5Hbf8toDZ8FXL7sbWCzXIyMGEb++?5E)N7Mor9c5Tn3*^gqt zz&<$M1L*b(OZcKxAs+OTbmmX5)DJ{z=jag}MRBxlAgB$=3Ui1FH^a{~;A{8skMLRF2OUP$@UvbUiVVUR#T z__Iyl;rryxqT(i&u!H0Vb-m&>+|nyN7alUP=&586B}=zPl%JoY|59~b+TjWZSIk8q4Kelt)h>7jQ)OCF_73BvyFGYclUR3xwG_(sw z)CuzN?e0~IE9&b8$mgGxX-PSU=o>2v3u-~@3)s*E(*a}MQCBeS02$Mc;}3M7CFn*n zyO7U`$jd&$K`B_i&fdgU1~mh3ys7=rgPu878i!F#j!tN< zUIJ*}VL+0MhhBL(hdbrs z01>Ayqhf;%89d{LA&Ww`kh1`7`=;~k5!1kX#BGj>d!2)hYNP>Z3Jp#J7 zR+N^Ssn2@ICgU8Y?^kAP{iPXtWeC^i4v#%m;5!ZLW1DsoD0(av*!IbTO>!h0mumk{ zavXqrIiO0r+Fmo%*#Q)l6SO0JJRL+VFt*edvT#E1wL~xfMJntwNf*&ul{?x??zXf|jha{G0F#VdL6?fMM#qdHw?)Iec8MIqjwv;hmd0_=&RK ztju?+M>7pXd^n)c@k?mLVL-fj2JirYKS2BRBjSkEnp8T;QH?qz1yY+ZV7NQt#o+KxEM zQ2jQ+x}2)y&>{4;)BDEU8TQ&i?$ELcv+GrHhC1t4jvg2rKr-FeDDu8x9Pn{jG;?TT+=VZ=f(AA*Kiva1ZBVXwPL9w2t3fH_Q`v%y3jcJ6T#VnsG?3 z*?RB4xNe1p%Bugen%FBxdT~(6NCVQ!9vC!*J={k9eqW)ij?K0n$G+M8_=6T5nEIUl zXpw(vK7fv6)6fI|8)@PZz%N7AI7HuYsjPR*X+3(mY~p|hy4s8UVU*`jivvGLCxN;ZwIUQi7tX^1 z>`+2V#4XpTS6k%BlwLDpv_fE7#;&$gbhB0b6HUdpS65|JN}J>7$`)BP=p6d&Zn*n7 zsbiYO{aLk==auz!3vxVTJv5tqsCK6AQJIRcXLajucnOP#)x1LB$^8nZ0h-8F*p6&> z^b?`+MoQ+Rl#;BMvT66;>}@eD9RHGM)4w81R7H9c&P+4(bMOfXsTuPv>V*{iq;E># zt=#QWjE(0@_9;B#%gXn+2g+g1!z#r_-pZi|kz5C>Hu?0`&YsIq+ zSLr_kZFa|%t^O%}8StCmM-YgYLJN)?1!Pf@a!%LJ4qV9M$Cc?VLDN`?XT|Oy2P%;LAE`?-817(Z}Yz51fPUsnE~2NYgdNbkw#Ed#3BNu82`t5zF1@ zsdFB`zEyp$%Mm}^&)U*cAAUa$=J z4OV_|)rhc&9F+RpfFf4F{;S%gf~!-*$;4`?aLwyKh0W&+t&40sJ&tZ5%-6Haac10r zK7+8AD4{V{)Rn9l>&cD->~V5jL3~VF_%ADA4`w{G8zQs2&%?tz5-$661qMxx_Q08O z!uk9xKVDc*FQ?(D|y?P+%3 z68*+&@gW1A-XoIzg3f6y@tdUSpyx+1TlpKn&#`NJ(Ad>mNksy5QyOuQNr;8&!(Xb$ ztiJcl&wT|-Yjm%{JUB$#??atuAdv(12Q4>GLHFk5F_vT$#KYg#b5K=G(^xMRjw*7f zElA-kbUOh66DYM%5pUmL|I9^);v}+tDsKC)ZZD}QgxA=9ny1=z9A=va+q=J-Tz@X- z>}@F?Gb2}I(DAv_bNsF89f)|BimY~tDwv3_g?ztf*HL`DXq5xwwW{5dP%$ivsHCay zsM5zgGMChk$2m87@Y~6=Qi{Dz@;D+^ngPwM=E1U;p0F*ju&Xnak4<}de`|TeF%zO2 zer}o_;Z9`pt)1YXFE7g44B~S9R}}d6CjP#&4HJt|{r%^eD(S3d8S*j#Ki%VHlfHwR z8%9OVf%<1dwC}^LdAlo;6v|`;A@$eAdgF-{JHQvIxLWa7@DRq+szL;S<`rfu>Z-71 zNX~tkF0k-Ch<Ii<>I)<2B)Sx=UXV>gvd-FzNh=8;i)VMDG2{_-8y;GP<^~6 zV4=7COIq^fE9bXH&Fh1X=H^q!zUo7)EWM^|M!JQhoG_sfDnFWDntX*DXEnPQE8yak z*M94aR}inhJ;*c1{J8#J@GW~lJCI4OKzMn)sqb*#7eziNAD1zmXnf2rI*;UuwbVVX zail?q`s%-~#o+HEu|`uz>g#5x(`p`TWgpf)HG2X2>L#80c*R%N`l7rr>z;2%tWg0} zDiVwT!6nL52wW;DuIcs2Ic>g}zp(lg{-*GGO7qzojfvK)gB1v$#Z51qBAApzfQmd( zW@ucdkV^8&30xY!P2}Np zRohD=4J^_*>J`~^`(Cv-=IG^@t>ektE{&%_h;JHI(_)Kf9HM_m7_)lLW}RvKWVhrO zoR`;PgNtB^?A-Xai;EWH-s>Utj3srEyH`D_W$>xNt4)VzTIM$$f9OUw{&|wqkwR3r zUBpAnoPs{)yqMf9XS2k}ib3>RKGM2X#~2wB79EjwrK$HpV?VL%;G8fX`l($ALn7@D zf2WCm_0&r9e0JIh3m_ndJzSZ$`W(W>g7)gIIq$!t0 zf{!3JC?S8+J3NL&JYLCHayp$bPKnoFR^40{AkFX>hrAuMo`+}v8>Ny~%d_ZnMR>8@-9z9{&|bCSRu9{Y;Di9n zH#9^xK4mTxeSz>H+|5*gwo&4$>54=8BdN7tY$WjcU(=b!Rt|@?PcXAR%uwf28{5blKU#LP7>U^jIcTKnh>~qiCA|FagHm?`SDKrI{M!9M|N@neP^e9r; zWj1C=Pm=+4gjTie3e7D?=1OX$aM4uTz?aZK%d|mAAcm}l$MT|uR$6r&2}@-$1ki~C ztM4IOl;4Yj_TIYfX=Gyj6VIG9muf(aUd98OCX~5`a&*F&%=yWe6Aj9Uey_;LFOtgAjHzUJ9#m39Wy29f%a8$DWLWG_M3l%SN_DUNSmSvEC*)2ot$BQWkFc9jSN=p;{BX z?9-+Fv-n2_+-knP(7riCMce2&?~B7~EtaAOe7|PIb%qn7N1}Pxq5PTrK1Vpz$i92= z5_Y*dOn7{brgKR;KsX>N+cfRxI!yRQm5GEp0!?0DyKk-A<|3K-#`U%od0Q!tq}+ib zmcWzKP0f~k;t8sKS6lI)|0sw0QVq5f=szxGoqM zaJB1e9#|TM=OcROlS}4H_6RKKgl0Nq+LczXUy=uqUgXT>eYn#7;pFr{i>~}~LJ;x> z_miTIB7RqtlX1$jjkKB)f2e+X+n|E8T?c|yTJ2}Y>4BkC6B{DTqSJIy!>qkD6sjAx zHOEHlv>HU-zo-hA*Z?vT+#6dPZIp_wih^DQ)FvdSyztbxq-0Ail(kD!fwX6Ly}WKonRKo=P-3afC5(2gm$d>C~hx$8&B5HnSfJb%$hVLYnozj)@QcjXGI^s z`K@wmQZi5=efHJ*!TY?9)UDY)@P|2U%*aWYZzz6g6z(6oby^ADLamjZ3@lp5qgrUu zwKmBG>HuY-;$PK*BVu}eJkp|O5r#&2-z}C*q6O1Ja+e#Y3qXF?1z4MxEm5R)3GxLw z3EaB0s{_lKXpS2>6^I?Ph*vws;29STPP;c<5yGyGJ7BALyGHRsCQ(1%%KAli~jur}&mH?~EuitRg= z2UU%dMi;+;P)!?6Y1dHjNyYe*EXUhKSrJfMYNINiL&}(JykVJIBnu3&_}wh@vJZnw z(VFQeJcdV9VhiDnTS?S#38-P+@XAjC*l9*N3$C5kEa5cqHG;$n*^-#p%(P@ksUQQg zI-wQz8FUH=3~V6VkHQu{abWnNdhdPFp|OVq_=}g<^8kV9h<Z9;L1n>z62PoBZok}FH>`B~s~^lpi^reDtTA3K;Zp#ivo zli>C`2`AS*LRzl8DK91r7-ZLU|7mv5-d90|=LzKWH_?S;*-ygw6A_w| z4_|gN=I~eltWmQ$U)!>4NDPGP6VL)?h}IFR9KCSvfpne}ooFm{0p2YekfsRQQ4mk1 zZ0Mh=@EAPS0!SE79j1Y2!^;a2a!HP|r16J7C^aAnq{9BJ+x60hoe%t~E?Qw+ysG2y zCGQI8mbYf&SgNZ{BbhRk^i_o66dJ)9tf>mLJ~`B8ma3$KHrptCP}oxD7f=7dd!v50 ztSgzVnN0NOUxJUyGYB>A{AwL#S+WYruW3SO-0if97Nb?(v;evpr_{od$-8xnDlYXI z%$BE=f}h#XiVdP>QOZVnQ^}i}p^KW~oqcSboj8Of((9T2SH5 zvnm}1*1{Q6v04DG?K{RipnZ?+vh~m4au?tj=e}Z!(*QmMNcJ`ENVh=yQ+!Q{q{xb= zYX2_ik=$uBzELXf(o?02u+u5Z#W&TSJJ=jfB4bsVMNP|+912&!$Yj+^zJaYBESK-1 z%?mE@+aSx>?m%x`l2brc(aV)=Y_r9K2qzGV=UL%FKUBF7Lb#WJW*fnoB&(#B|7F%u zMj`~K@2C`PF2xNdXF?s*bVhm;QyS-@ZC|!U8Q6_{DT^F7a{=HHiHtzU`&W(7%^gwx zhtk!fNZfBhl7;r!=3WDTs=CV)4o2cX5A0}0gZ)q?qST?J@QVe{xmTn@-u^D;rpsQM zQC$`B4cC_fDIT0c4G(Ahb$W=ko5h{O+ixaR+Fxg=C~kpx%FLV7Yxz`{CoK|vEF1-9 z9p@39E3-*Kf1d}sIt~N7pS}Ps2sO(83sL6ABn)A4aGq=OYc%#6xk?*1RDuEbVQ&+n9>0@ z-!;j8g#;w6UD%CVUsA23oEEaQVj*2j{uXo}Y#ECo0%+)M@ZXBqt^|zB+RVcpjBp zVUeGqV~=qn-1o@X*<3#_N`GJtU6iV&XX{6Mq0DX2ME7K*iW8W<+&U=@vs552To+P{ z?^`mM7dfqHG}?S}ckw#3hxfP(_5GF9N=Zml4PW&{&hAU#{`sSoi0zv(v{C9ZyIY(P zi;Y&`3cY4=5ne>l+_3rO+Sv}VP$Aw6wyFysFwLECjMV4?l(Q=1{@3Erd+34)njICI|0HSmth=96wY>~TEjtkvHU%ByQ%_=>jmz4g`2OzjO0Z=j z3LU}tCdUdg%B2xAi#80_j|hE388?rxDMZ0X-b8Xi%7U-Rvy_E!d9jrND=;^`P+ z?_R_WFktiOeL-s0vl(R*Jr7^lPUUtfJy*N`-QsP!1?n*Bj5H*xcmSM!_061ut90(j zy2q+DE%(T3l|I>bBvh!zNIzfLEX(kDz^H6WY5*a}SQksT2o>I7pvdO1@zx98b9`d< zxyewpzQeXb9!)kD$@hSOM~))SUEsQXjioI0>RXTtiQAjqretK$tAa{0F+TB0wLGcd~cxxQ-&zPX)TJ3oYYtZEjJED zzmh?xtQ&|5bt$Efwl=7&^tkl3cEmrERI1LM6h%~uo-h7R-6Ii~-rF|s1}pA@II=?5 zT@n9dKf2hFW0eGyW)Yp_1hg8z3Y~)xw#NfD(@a^oC7x2-qZOg3KFTlp<7;nuPC0?7 zXL9#~dTLy-@@gfxblF4aWj{FvU4T3P;d;NUg_L8a7txWjG+ow%CzTKv-F2&8@b-TQ zd&y78_t0!7?P!!@VrX!%&u~4!_Qmy*2Y=z}CKy6jbkat_qi9;CW^;E|b6fwL{NBIx z{xFT7_pI;Ke%d=m<*Vl-!x0h5&|PT{Ldjqd+S_V+l#3IdcB zSEcnLHiMP)IiArUs;qUionRaQq~1Yocj+z*pCw09aM+<8h2AK&yx%VKHM==IL)4w% z_5mDxmHraO*44qKu%Hs5$C4{9ys|e@%N$v$gjAf)NiLEvm~Ld6(gMpsX*GjxkF7JT z|2iHD^NJM0(nmxlbOhjoa9z8Ep@MS<_!6r~kBYy)NioGIcfu?!m$Z1YU_B?(3ER&Y zEV`KtV_1_~d~-4%;IZ4>JwJU{MqN`x)Nc`lQJU!dEs`mpbCw)u5crU4pCe3)B5e*(SMJ9v%OsDf8X*Fz!xPDs?|Bco8wpcwm&(1FFIYs8l&-AJ!suREH7KX zh^!{k0LbQ7E*%Htf5orL|4&<%wr{nB%rU*2Jo&S+!X{jbtp9?MG# z5{VRh*qH4p5S>Q&-0t`zd#CM^swbURKH#FFfA73t8=JoO)htmro!mr zQ4xhOrrEU?oc=aMiqttI4J|%5bz1Utkrlb@;GV~1`+~nl?7g=2P?PC?iTR@PwncO4 z6b>Z3ffw40H6tRA4x}U({96j>hXf31`saB15^IdlyrZ2(5HPGwey%xlzlJ zZP|N)f}6k)I(9=yXeD4guTB6u`NZX_z5vcJrLZvNK1YZYmNwFKS!%0*9*i^#Lg|pI zF~X@wBzQH>GXUlVD@hOY2G@aU zceA7T2ju|uv(P`HU#&v>d!5M;vR)Ju(zt)g?aVp~h|F&av7wo_jwM%}=c|qo^4~CI zk|=NKk*Rlgu>H=+y}Yyl`r;_hmSu-Z+B8JpI#XxYwo6>|1of?D>xwPNh^aG_rbjdF z8X`@VaQ4SGWhHH<1~UuU2nA|MGaIMDKLx61K~C#9aw79WsbaNhW_79n$CtAr;!7s5 z=b%KiGg9Y494t9Bn;ebXh>b)&{zuZHuM9Kj7;p#&X%q>14jFqPJF{Cy9eNt(kNYRi z6T$i0i-TAHw(kDJCjI(5972_1eWhVj6ld&QPT?KhZq@saGY>j(3M-5b<(2%oZW`S9 zG2-~CVyNwb^?xjcn4p?iVC3sSCQZ##b{Bk&QJZXmUh8Jktl=w@LJ%laf6L@a?#`)A zF^H-C9F?K?2&G?|!DbB}S^KZ>+}dW_?_PXWlEALk{ZcAR=M>&HcsBS}0V&H8^Dwf`)L6gZ%rmQIij|G3FzJQtU4#gJ zr>!+p6TS25xdjJ3l4pdFx0q^cvFPynMb)7<-~u2MB_grcoLfSK3sXH*GHDKcyw}@c z3S?_Hw;-qi$d(2K3(*DAG>e;p=ZvS(nkB9w`kbD1O&L8{QueS7U&5?3WpjoT@V(M4~M4dso%sHFIbknI7WO9vG*fl z!nWg_{I(XZcq7z}Y}Evo`eXsMnl7Nw}`=jk2)$FLew6^XI~vXXMY_EYNPeH4OhvS@sJ zFIdm~%V9+chE>B(t-`Zth4#aTZaYMxSZ;Cr2Qq*1XIUMF^F=;G3jS*~(F5aSgHCDl z<$%KdV%WuzY*nN~yjgqkCBIR9uI*K~zZAGSmgt)x#2oGoO+eK!l#juBy5BHr-sUgu z6@)lLEb~}2rICCHc+d0h*{C;oZ`-hibWg~m;begJc{ZWTei&|->mt9aENd{}^>us2 z31dx{rn5JV@Y5me@>*3{JHfhgAPj|odUNI&{AjCdEqIYEaw z@;!(H_I{I}Jd4;>qcH}ZXrs95wnn1g3 zUILv{^&~U2HXeJEcSqV})7)%|{A^FQPG88o`&4p|T+S^fm*BqVnAJaEG+Kd;E;rpY zl-qW%0Sp?kZ=jqTa6`6TB|=R?K<3WKLg3YbvJX zTom?{4jj`3Q6`^ecT<`{FF8l!yKp`1@Au) zk3=W?8uWfN9JA&p0x}ilHE!kLsl)j<;R?cb2zIoc9r@yu$!zgy7Wuc!UfWk%PwbJu z6L*94zRX8hBEEmto=7=m7?lgK+&Dw8DrCD_3n2n;-fla5JTK4d-hyX#1B@@SwJ&1U zP#u6}KM}i=1(9^n?4)i!`Yod9TXB4RnPZ&XO81_G zGK+C8B*PURbLuf)Hq+J7oGLa@=pw@%`3PI7ACe@O0c)2KK7R60hjsTjn;B1Csl8@@?@U`9Q>6`|`rN@TWM}z1#J}((Of$Y5 zeou2i#Ok>C@J^EK-+ywlaI3s1{O``_$4%*TQv57iJJ>liT-U^^)BI=m@L5}vUx2hf zazC1o+-JU3w1)NzvJl#GAyoP^Orts3zBxenvV(6Be^U6QdXvO#{g=d<>3jYShD6ng zRcE@MQ?ucN@);}RAmLhZAeP}^)NZWC1QismtxPm@ov;*YUw|_Zc*!EAt zNdb1bRnX*;ia|kzu0edLzf%EccbSf+6t4latspfj7`)SDsl3+!j`>D@lKRUN5wj>m z-8=wcji&Q*~8jdkcMnJH7~T8NRoFLUVa zK~?l4>AgzuJt3c(!Q;5b8ms|oaw*5XPzRNbXtI5=W0!oaD{B|f>%Q9;F-un_u=aXD zrWHy~#Wb6CtjFusOb)d*O>P!#a~bcO1vTEBD6Yep#Nby5H0*9c7RF8Q3O1^ytFY^B z91R+pJGvvM;3&KPLPug_j;oVJs?LS*S#omm%~KJU;q+TdgdF-yv9blZeQCPIDa#S; z|Gbk{B?-h1j2RvkagGgG#c~v%cO?tqWdHg5-q~`F5>2QJ0=t{197W~sj#TliuU)H0 zZw2|{^a~;!RBCoBNTeWTUZ<#d;G2A6vGglVDr_{>&Xl7L-Tmp>t8AcNg!}GiivOq1)FO8hic~!BFV}*zl1=IKg_`+p~PW@tRc=M@9e!B zc}q~P^+r@?p(3k;?tT~5^|h``fH6~aT?_po6Qy;3-pE4iR-2%-#E#V1gI0}eJ8#Ir z_AWR8Fm;h%{)@yyw97Ue$uU;@@rph!m-znq{>*Qog8IN-?sx9cEd9(?4aC}&spm~M zMvnNo0)TMQIN>O$IGBF!aL!q2aj{S+C7$Hl*S!(h=ms}(Wm^p)9L)xZU8hYIL(NDj z7b|O^3W%bc?aa|V0V) z9A#KS@tL-&-l+t4HwC3X9lc)F-@x(3nteY9jpnvOh*x}&oCM)x54PCSLe_l9UBz<9 z)QgQ^bSbUo*fc8C6b;!ka6}*uHJ7}a#&dVREu65&h?01J2Cu1GC5*$wSc|BCb}~bh z_Nay;@uniIrgYK1ipaOyvGrDhDyWD6Hl}=u?VT?&e1H7Vzb!hW zfZPW9FX*M{Jq#giu68p0KMvL5I|X(#jV)I6DzeY_mG@F zeN4YtgU4FQ!*OkB;^9Lj_|)k)9GrzZCT~&iD9o?ZT^kmWE+8ETKyzpr0H7zQb^>dx z2fkgg#{(=$6CrTq*kn2dTqK^q#Mn?o1+}dh7_k$>OLp6oMyE~x7o7b`jyYM%Hu+~7 z>0TOo>vhnF{=ec05HjW~^Ys5CP5lf}A1d1`wi-~VE z^lOLx1-uakGmc=_do%uM(dB|$r5lBxt8?Baeb3}#2ZjtSO1RRR1>lBB13^<`tK^%- zc#xfZsn{mhS<_P!{9_Z^QX;*lr2Hh0@F&^g$r4i#&x8jA^K@rc4qIdo_R8ji^iR_E zffggT_E}%OxExi#l0raXElcPUQLB^(d@Ji{K%Tp?Gr~GV4TW;lB;x5frz3)wanQX| z3_x;}VUyK7c3KPOb7M~x2-(tyK@14d7z)NOjYwZcShiny2qyDd-gk2cTA{qx}8Sz^6k}A zjQ)DY%VStY2a9%S!bK<5clWjsR(j5CU()wLtE51V3r=qItjw*+b4d^$UvX zu+Ejv=6`7d@-sji9l~5pMJJ@xZN+!i&WtpCNQQ-EwS96~ICR%woFN*tL%7ZWwOu5R zl>i@@ZTFs6Fe48A@R>f$t=OlLRkpJ^S?No|jUIe>V__E0VR|s5=2T3r2ca%(?zLy& zM}ed^m~e-&AZWZtB~rL%(X8!LM*N0i-mgj3%9tX|$^)`z#=Xqj&F!)W8;5O~GDYdg z=n0uJRf)(sb_LHY<{dH!Uqnw&K9M0%<;Ys?HCsrds^LS?kZ`La(+Nqdv;!6$${e$* z!>F#A>3~V=*s7^}&~M?AOFpn@_K$CBz@A{mIZOnU^uk#td|z1A6pk8k9r>+H^H@BT zxpIvnzpt^H@=a7r`LTeujLIyZ&d_+ zGZ*I*;!?a(4A}*W81_M@m}w~H(tu{-VAW$ z203#<#^ASQ3yIt$QH*42R6U{DmwkZSW@KCG#Z9LD0We)8Jsx)6AVG0U>PWX_jxQQ> z*b{{7_#cA3=NV=MDXULRCx^ztgYH$hdFRUOua5sG=pa)UN!bIZGX!DaQ)QfP6pn|o z^~s&RqhDaM=u+(xlSE1Nx>C9VccqTg+&(wTxL0? zibGiL7PWOj1eq^ChGvPev>Loa^_Md47a87g;`lO2{{Z1!Hr$vj(?vGwnD6k#`3?(# z*=(wC>}`30?|-)^ow((`wy0bZp~x5znzM5Wq-p8)tPo~7Y5D7eML8DL11^S!D0xQ3 zBEmEt8{p_9(>4kX!n;m0f2<`?{L-FD0Ho_jvbuB4C+%u__S^x$u@HyLPqrBMFt!xv zd()~Pw6E_#p}%e0sjWT@D-eb!WiTPbED`JC;%l^fN5ZkM>}%jN8^~iBapKBn55n>= z<_N-|up`T^bGOcF+TO)16gpaHR_!nBxLeDl7=bx>28c4W-b%DfI`g4t1yy>r;2;hc zzP(FAvVdwweC)NtFj0?~4#ll~{S2eT&L!w>G&5LMjMqZbVtbuRNyRIr$IHH()HQan zXgtf|uX03*BEJdqF=SBWoV8z3F`G~#HSta6Uq!8e$z{wYW-hhEwV#_-s7HPmoKcjg zi#`=Fk*nHFKPlO1;Rnpd9CQWnHh_wcZk-k0ZvXjpKRF4T#n2F7k|74B!}Ep`Q zz^3hG7l5kKJ&V`t(cdsn=P6M_Wy!b^v8@bdHCvt&(H`1rDDiP~KLSSDIL9lXlQA}2 z!w_`@-!XaQ2r5&iMJu{>T?^5jQSPXyS+a8f6npL-?UyUuU{87v(Vf`iNbh|>l>hmG ze}{`gOPRF%X!;siakg=){e7WSJfTw#s)uK$akoqrEf!-HEZlN8pDaH-V8O$d>ks4$ z`8cBU;9Xk3_tIAz#tW!-{p|fyK|S@31p9;NRBT@Zz}HAe!T7k=Vd0gB#&5UdLetgi zMK=#AyAqxBO9ouZ5wo<#vU8M~H_+?vHgw71h=rAz>Oz7!eR15N`sKl8Sdc4>xfhXQ zW7!$%_paC~>a4^gil(W0lVye2I_q6NUf6(k7P|v|B)cCFX!^J>#qQ+>#rsWZ`2uw# z!nW1nE5Tm?N_7HvNe4gn6>yb!|HP38PK#d?vV4cx9^T!O<|W`tx7*|4@IOD5=P0pX z9NC~2O1e6AywEJ<>Vn7h3Z}}L{~5SkDuw)IU&*C~7ZoK+(tWMCf&{I77oXmp$DJ_h z`SfO}P%MCs^+6J0r8@Yr|Bi(J|7?=+`~Iu3|FI||_wzWzGVg;jdE_ED2?IywPKZ3T z&0lDyN?cD=v}cW3k70K3t&)ffr7&TI_Mab??FC!5`y113S|@?tu^-841=@DWM`;1{ zRzK9t8q*41?d_R+U$eyTu8F!E$4*W&-!Ki`$rhp|6qi?Vj^SmFU3trw2)Wz7HfTFM z+4^0WsqQn*_?Q-?4T=0cvD{?-Jvwiy*?jED)zE&6_(aR>9)P2Sw_0Ibl!gN7Q<(HU|Ee$&B_*8%ll(DsYt)ZQo z0p>}_#ldI|+UH9NVY4Jd8hkPk$Vvjk%lfNyKJ&EqBCWoVS%~Q?^9W3RTPZ?n00I+xbUtjpFRR;@9R?y((WTqL_U^iwjgpGzz@LStJ@TU#iSHVgr+PLyq?o)Gil zPd0^i?uWP$c_q=AgJ%+yxE4>cVjW32$LbFPn|89}AB!G*W65?xS6Q8PQI?`YTl!WgXx?#eI~dflk@SWC_*ZQRc!bV?YHr3&2*yWSlYVdVGtP;2WrS(K)^- zZ__2dTew7i%LB#5nR+`)t>YlK%laKgJJ$to;m4XZKwL*pW+nM8L*Hpu4TZgLAb)G{ z*1Tl&mc;as)8ry*(!p45Z_>b3QJgKghS~M_4V!+7g&N@nZn6d}v+Lwh@}33#>&$`? zr(y1@s9BP7H3_2*=|i3m@=3TA`=)s>&e?5R{`Q-m9y;h3@=^izBKrr+FMM-R4n1XK zwzJ;4Epm6%C5>umg}f3q%n-iPfBs8v=);|6JbH=V()#EsE|`OuOb__rg^f(EJCG-z zk50FN(7x9&`UbJMZS^Q3_nR3(N!TOiZ92PRjEaIeKZ;6^$GAng^?czIO zzPKtzujsl{5!*JzS0L6`ZTFR%AWbmpH?>rTN9f_~o|*I=;ZL@Zjzg=yx!v+sUls#4mvGRT3d&fG#n;_F7Ym7zfH$x;XMuwjZ2%bcL>g@%#%}9pONT166ni z_zAsrJbe9F?B7-Y|FQIqL6US`w{6=tr)}G|ZQHgnJ#E{zZEM=@p0;h=dfx9=MdhE$ zh>Se3dCppEe*hM8eqJhM0y0#5=Nn2i!Gy5x#1)i^@}6mej>f7G#W+2s897HNhR+Ln zC?Q;LO2p6UO?l~mOQ=KIIFz3dqcOi$if7fQ0y^X~Gll0|174nmorGJvfxkX&pAlP- zBQvs#>$baMj|iU$aj{SVsY(#e7i$=FbfWc|N7eFYmXy=V+xC6<=#_gmRb=l=;`bno@7okVOT4Px zP`mwf?(7lBkLieCb~o-S#{Y zKS0xu*gg_@NUpDgB4SFrqF3m5O1}PQmiEO5m3jAbDx`I-YeeysJ+uY{?yK>Vm#GXq zhdQu^8hq+Sh%82_sD`tsPE$F~T{aSAJAil0*j|!&z;M=Ry{Qlm$B;7^zr?xxwk*%f zv2fl$gvi%p`I2ObgaT$<0b(8Q_ZZI}j@DO}6_V*=?epoU?dosyHj!@;%mQ)kKmhNO zxEc0>zRN1{Ht%8y15i1OaZ#a(6^fzY=-WV|9v=w8^J29^8p_7g=P&3WWm%&6G^+Y} z$^T5p5&upgekUnu`m4@>e=cC0pqFyTg{|8ln9*66p$ua6EsMF|6SA_+!V=+YGh)2I z!xa5{p36tl9TE6@hCaXUm!%(|tb$8FW^HZ-BH1Fgh&f)Qq6}6qnq`t^K5&(}+c~(h z@|z{%&azjQQYka>(+o>4L|#kp5HU1KW#rxecvZPcZff?3_boTKbr!d-)Xczw^If`O&-?*0NC%> z&s$l*o5;s8;#c2Bz}wGzf$&2R0`_Ju|z$4F& zHs~@W4u1BqIc7CWLasItxtoTxf{Nf-iq6Hn7q8(JsY8H9wV?rPB-9!gB&R2Y>bHCw zMyUmSGQ)W0Fr{~(4C8GAOHG2}i2c4-LqCU_#X_B)u}LwHo?exm#A9o#57fhP=}tAU zvm7WM2CPi!+Usgi3ps_7Ib_Q)!j1>%=myX9IwL;thhYzj&F}6nIZc_U%0$wSCu&eH zyS>UTm4DR|Z7T+5E};R#DHudGC#J6KezvM{NGAxBi)Yhx9lo14##2{)=d_ zEFDZE_U1PdRPc&<=~q1ot;e${>pN@ZoU3^=-$99nrt~{D@z0MMBv*gh`eK&V;R`;X z;$jJ)5d~-#J&ap`|49d=T#1NB_*#uH+6%`H{8nJ$N*nxS3Z5)P|bNbZtTh7jz&Ue@d=>pIgoiu5}|2?WoBo($` z#EYmGXICLq5r4-D4%3U8?H;8UIt!BfH|JlFYB@K{%8DRoR1*Vt4dxse$y7?Dl@0l? z&CF|J4H?Z&OW?9_N&nGAzv4U|G?n-J9)*fHTO;dwXP{w#F_+`va;yFLn4SX zyYRJ7m#*_`m=;+V*21aFJ2=BX%(HI$R?q$J=4pN>Y1*giLjS!9to6dljt|J$A`#D| zqHpIi(BQ^mbldOE%eshcD=`U3lbWRy*4{smbXdgb9;5Ca3^5&76B~dfD>sL*Jxl_s zn8jtLI<+)_T~U|nQG-#bUKzK|*fyG>e&w{b>BRyFe_yu1{AUV!npG)R_sFN81>$+I z$$=h)Ek;Z$2kzQF;~DB`qvFCJw@^mxdMV53O+P*n~ z#Cr`?t^;#o)VXpopWkh-JsCSZ0$r*9Ch%)Bd-wUEw%BCm2sb8G$m2%#nAdD-Fv6L* zV=9JZenD0ty++Eh6EmiXM%Qc@#SG|63Q-*j+(>o=UY&1b#*8^E>ND^k8dKs%S*N?{ zBWCl4%-hPH3T(#QOr}et&C<5Xff0CpWPL8nKt(kKQIS|OQvI#tL2l1u!gnqOkF7Y? z?IA?>#zy!Y2aC67Bk9|4H^@)1OuHgD-yDe~I}5~7D`?##migeVxYgIZC`nst5Vons z9-M`Ev-Z$HXIK(Zze-~tC-nO0YFA1q)+Zs0Bc$P?m7n=i-x{ww5_jTRA#g55*QCM8 zZc1g zVe5hMO30{0A?pqpmFuvpx$p3mW^oxV9@v$#G2 zr&9FIh91AlJRSby4MF)Z;G8XMw`J|kl6Ic3`WaV5F-!qWM#I2M+DNj@dbGilw@r?a z4Jx-&KNTo|1=k{YMU#5t?QJu5U%9txyIE{h-{cCfDa0Xg{e>xK`$n%6Bc<9AnyeY5 zD$7K@&J~XQh@tPYeMx^);uz+PQ)m!&#Yik3Wr%zWfDDR6MN^`zd#%hn~_aOhoSPhARS@?V|C>rgwJC=HdO5`|dft>us!BKBU!6<}E;lJg zbHPtqbT5*=#8xh;^W50EUfKTk23YI(iwA-BkOW;Bu*Rc%>x0I$qtpKkb?CB|l-5mC zalH&fP7-}On!!>k0Mg(5I;q&@O0-Ln!(w7v-;kgMnEWZhG}!S<4dz6ATQ92fKcxpZ zB^I78k65AtP;2+L)s>rMjsE8JefwN0-a}QIMwp?1OUFDnXwr^>S32b{Uf!?!^e*pP ze}Q9wdki&;ykvl#0I9|&+;@{V^yLeF;72}?=s%@ug=K1IaQnO5#NzZVcT{ZKHyL_n zNebHsYZwDKQes-0Mb^|H!n?o5Aw1c?IWNJn|v<`IyK|J4)M~Xi9>I*nP}ii z4l>MO+X&UY4L14avzcAnGnO93OCv5|v?f;<5k^}K=`e7IhnvKNrf5ek#-*2uad)p= zt+p@wH+Mr@)>m`IiN>R_wc)`p@pBeV`+Rsb*RKByF2F0{`9&X``6ez2R@w^!$XvZZ z0G~(LU3EwN#g-kH5f8R=jew;x`0JSxKm8`Gr6)B#$(0J;;=;}?;j`X`rscc~PX0?- z-{yn?g$)@0}@#_i5E`jU#!^o|BoTqLWrX)9r-MCqRzL1^`tBAvC1#Fe5u0GimQfQ zK8COn95N}&iP^dtq6?ALm!mRSiD@(Ygq|N+2`j6^ z;t@!nr|`Pe2)7wPL+BIzB@;f|0+W8jY3h=M9KUw>5jKQgbK zuzardp`ny@8QYOWN>ckUMo{NYouQvMgqh_pXo4%J?Su5$Ory{Zv}-%ztPlaAe%cEcHN1HBJHB&Ed;QBs4K0P zneMxS%w~=*IEv=gY3IP8RX{mNB zriLV`#Ws|*7+31UsJFMM4 zwu(M|i&eP@rqMY)x1XT|Wl@+*m13Sj`__v|BiVkFT3mX5!DHJ24aEO1&f@-`ILqaz zYCY){F?qE|DgsAcZ@Nz^(ciVEpJ5!wc&T>N%GFRJK~IQ zInK$e74-8!yhV6ZGv;x!{{z17%h*;gVj#&O>jd>}m>#~^hzI69Ew8x%x>-6ABKwMs zlAG#k%8@d5GAYD5SRWtjT+;-)2|c5<8r0X4=gT`>NI>DW`;eI>0MlLUk6f}x0v%cZ zXJ>^)^iSSq#8+ESkUprVnv;t9(rzP1{i_n+F#>rRaOgG(8@mER9Ibavb&)QOrE5Q9 zmv-~Ign>Z18LlE-cEtI`3F?o*PSRC!%?!GIT@k^3lS{2EDSGO);9u3)vt`NK*iL;E z>qufR%uhNKq8lZjSTOpH1+qp(=8lRWWYgEnQtP1-rg;FI(phg3M;IP}$3=FY2VslT z(Hp$mW>rUcTMov8GLxhV?nmQcJwaE#wUB1@V5sN?WP%M1X#%!n;0igtUqc8Yao;W) zcsQ5-7XxEN{8S?@`@c0_;I9Vs3AVsvBd!R;JJYWtnCn7V^r{d(G_~y4LpXCdVGESjAcZ7WOF6!HMLrz<$CYo&3i^zMNY=i3!oRTUeVXwT*>$QB57Hooh3Np^m8rChwZFIf67 zM($6T;Lsz45W-F#$i}Gv@U@?^oIE9lK~THQT5*zV#mvRpP-M*@BOp|gQX;AnCG#cO z&46^w_V-x4Qi$Z00B4W!WyYoBI8M>St^YBWqNNnDqgJDCyMLa#pRz_8}L_r2F5W4E*;3mzRlhmDYmUebMG_@=%=UVpFT>l5;M=Sz65mH}e87a}!*7 z3JxcnMez1f4R#-jE4D|SGS8tJO=VZM?re#$WO6B z)fJmR#tHo5=K05NFp9nE_|gO^SPoGgJ#F^$DEV%O)F~`P`_*BZrbsQG@>j~-FaN2v zxIjj8GiYif?nU6=<6q=3rX6j&592vkq4Q9xQj^opkE+JyRN_AVeNX7hzdm2UZqoBq z+2pIg#jngs!;o8LHdM4qI4L|yswRV_X5xfD{X2oM$*!(ki$VSh=I$*oSezBBuV72?%E3Y&i`zXWkm;->%jQMMQVx;_E)E6RnRw7mn- z=hYsWv4=V1jzuh;h{?rN>g2poeS1iXZzh$0Pr68qOWb|GliQPNw6ZY4cFHcX1CaRw#MtR^{ zCO2p!x7>k)07@oAu+EFR*5p8Q6)9w?TYq&u9P?-`TRabOH?JE6GQ(fc1iv6>=>Kkk zzT*^RC5m~U+IM*UHkM2ZG?nT^^~u$vGh77G<+gG<$kg8?5ipF9E0<9g$q8+<^O2a5s{Ei$FadT_c+RU+5Ky?#XwQD!IvdX$5c+GEk z;lvE6WZ--{5U@;S0PETfc=;#r1vvToy0{5=MGi_>V0m+yp4X$MX~P@aQaq+Pm(@aM z4hL4&Az55n+b>y~2W4Lm?T<6R6&Py?1xua;k}e{;wcvKw(dCX(z$X24Es=UJU-jDb!ywfF$WS&cdP!m`Hm zn{e5fMKWnjqGd|`2GKhBxY`3dDs`6^GSn#$P@{J$21@OfxAw41&~6#S(e$gC z4gQkJasyx(tF+U@oak{!DjGP0uq=ytq@W^0OTxat_I$>>U>U6*>B z6v@P0qh`(cx%>Mq5crJfzT?Q6h7M?Ex5lbEF zK{!XQ-)(HvWxD|Y2^R`%79L&0=sVhzx2Z127xFNXsYl40cg+<1We1el9}^yRLm?%O z=y3eQ_oZI9&kD0^!l_&VZlpR_$feM)-3V*W*FL)0L-5A9WamWy>8cA!i6mwtzTiY-b>@-mlFx(sHg48+(6aG__MtVWKK%3* z40e5QD}z|h?`co_Tzk|*>nV5_nEV9<`izAWg-vBn*O>eC&&ag+zxa$p6ywWGoU+`W zPtQX<77~d8%JrT zDR7_>9oL_v*PvYosjw)Qxq-X~8nA|#;3lS1VG_uQ#5x#bUuZ>+J&UJ{v_~|Onb8Ro0v$Nt%cQQ`?>_V1xifPuH=o#}0Zho_C;byU^Ub z@Z;l`$E^bt_ZacQKd#_mcKb7`qPBVLcDILJNoZycdxu0g2N6juIV4JwG>s;=1m=690l#ac}loAw1 zgM2Z^@s`<1&Z9*NIypTfM;GzFj@Lv4^Ym^})6NnMU=v9?tFU<+P;92TqbvjnDW%DB zzHpn7tX{haxm+3kCHev9NTO6Z*<+#k&lnv`jj)3{ODsKK`@`oR`((#a0hg z!6~Tm0lm4c2Yei7_mWWQzMyIi&T#BpBM#Yg`cbi-s~)=y-4xRny8Xum8e@K@@pNl6 z1{{t7l2!ezmSoJ+s^b8VbmA5(=G54N8J<dETkv~R$=?(JQs0eCpz%XjJZO&ZIc z)z7VBUg}f29XR)084zM=f;cz8(3}*_VU)3{bNbyvvtF zHZ9HAC`0i!ign$|mfl0q0PillBZ9Kh7dUimV$RiC3p%Vyy^*htU~!fPwq*+-PPFW= zYaJ_wY}bH8m3$Zt)Lm3mGIZ$DumHf{S%w;kM)p)~$uyF;d3~UmXfK#FeV2rV z+<*?@d2$)c8yX?ICof06aR6VxS)hoz?Knozu_UOTJH`ifbB4yNruMGoC>#)GMqrO865_$!5y0nnut+}U zT=HOnJR3xR{DBih2;5V3w5K=W@TIfr*btgsYyER;d3DNc_4iosxy*+t=AJ}!%^vCx zN95vAc`W&%zEh1kZlsLcTLoMIs4?EQBO*~aKF!f{=1od_kMp@|{fUdboa30&D99~q z@RnxqT~~Uh$J#&_7cPcn*P?l=mMc#WkK-6xjVeUm&EcAaKvVpA9c~rM&JX6Jww5gs zg_6;8SY*ygcx9n*)~S4kuZad&?A|!VlFnOA( z;k^d^Fx%!`kV|$guO0l9)1^)dVS(>S#tW!RlD zPS8DY!?bCQNq|(SQNuxgMYUkO+ab~+9j^VA;l01z)-Z`_`^dYePNUeS8nKR4Xre4x z4LH)UphECCIp_nlWEY|)zO+uFQUnL5Dt=8pf-qkl=8-P)8%AXJZDbMQ#I{h_7Roj5 zb-xl6(R48=fqf(^W+Z^w zoH;E^lev09-;vIn^i@xf#n)t$FZMU$CH8^{)Oo(zd44Pd5*~r7uIIU>k)RlN*-Lko zAr(f>OQ=hzFaKi4E4vI0#)aHSNU&3=OjvU~mKiG83CRW|1k}2{&<5J?n!c@CU$VrIh*i>$VZw57Ehs~u^s|H50m@}zZ zWrx`&p=e;nQ^!=P04I0orSOpAhUz zAq`)Sb!SoLA|NI^nNm2U9RTmt0*5}o7rgT{^l0tac?<$7vgy_iWuJ2h0k>(h6qQL^ z!;dMWw$HZ!>2H;a$en@e4(lJp))}BUxE%@WWK5Eqdp(!lZpo)B9`hbSuKYFo<-^A^vjNU zCnWXY{>-*BIEPo92z6kkzkQ3t^Ym3UI_qZ($A0|Urb(@da-(u3_^?GtCN@vO3X&R~ zxLsPfoWx}Vw9kwwy{R=)H>M>u`goi}SWkPiMK7TbqSq=+)Ng&?=6phH88B*juKak9 zU$6A`8GQ|B1f4}znhEDDXwb-vV_dTjqC5Yx)}{gn1}V`ObP%>pVcZSETm646Kv{+H z!Wp5_eP8WhBN@Q-0#rI;p036hsR@ZKUG|RUYehXNC-nCn%GrbB zzK=3NPHt4Z-Defu@N8Ze{KfE#AEGTih3?$vi+wL1`m()Jbd7(^MXrOZKKKN}v@U`@$pTPZuUx_I2A$f#JNb* zfRrUcL5Vykn{*efiz+0+IYK$BC(k+$rHW6xS&^fn=<;?EIT`@vV-qeYc>b+FeG6Vl zgW!$maX{SQ1DNm(aJJs5AsTF}dXfpZK*(;4L)rk=AHt zp@>YtHFYpWJl(6RrI)n3jZMPH;>ya>|8zDM)#3nIGzJnUVvGW$fHP(a7O_0Yp~b_(vt*nttdvX z9&i>|5Kakcb>h;KQ$8meM)b6$)~qLsOo`~9H5VK?saDEn(}CBmCw zQr&5*x8SCi1OvLrtVGol7c@neo{pXNjdiqZR_+IX8XSO6{prprL{r$qqN7>Kdv5Da zuJIllupJJ71w~-uXkP%D}ASP$t#L ztA1>)z?|0Io*((`t5wLo{O{XOKVP>HU^#4Efk3c~5Ktw=tRwm9463$kp49twoOpMHoT&hf5ER5O)Ori!t zDk@@f!m?tb1}f?XT=brHwrZ;IK#(lA0(FW;aMOMcvp2s>2MzA*5AzV`2UUf&J4(Yje(^r*owNcenff ze6^(a{pse1*z>0?&+n(v;UuZ9uz$Hr`JgJmljZ5j;n99ezprNu(i5G(8W#8}px}Vae&(GuIxMp%@*Z+BBS6A=r zVDs(mW~ax$=LbvU8NH;>%j5TrpU=Zvm&fYELkq|We?-xB*Ocg`rYPRYAC1}Sj>&K3 z8-~`tdHb!(t&2~RcdYE+vkw|f{`wmyxj!Ea`h4E&AszsA!atiA90qy;RfGm4w*Lr+aiPknB3YRl_s%88F?ci|1>~!0B;l}rD@Omw9!|$7p+cT^ zzgeZ@=Tqh3xr={I{Gzb?&~Gh;;e^d8l@9{+A zTPv~Z$q@5Gs9y)hq3;bVGSag1d5azJS-)%5*V)yp;lu16$H7r|)pg*b2V47eynVH1 z@Z(*FbVGPu)64GGeBlQe^Gd4sp_xZezVY4iYTW1T@iUX9bGn-5{WJ0+9%A;xoru{OoIw z#%o7$L@fVQ9TR@eg~VL$`0pEU9qDcYjO}~-@6FpkOyC=0gT;R@pLeJ?Z~jgTL|zIIIxE(i7K--ZS=s1U)auX(mVcMbq)c^ z(tlY^&7Dh1fW!_DJtthvMiaDcA0>b78W_Jk!*_>K``-#|-7VDRdJ}&CTsVLcTs<$O z$u8ZInR{3r8~>*27*)kb9od*N#{b-t@ef!Y`pqwYr6u9Y%+|4mO5z+d4@RQB}dg9K|lOxjMN+oDPL9*S0EA`Zf4yvTL+-1J06Q8_XB zT*S_+RM*@v~rKkBYtrc^lC-18Fuv)Tdd`t8L z%@96CkeqBgthQSsJs}@obCiV_Oyb(4s3lf|SXu|fSW#q^{~K+GBlN%iBnFLJ)AE>NWkFnqL@(ldXL zpyY(IhXwvsf(w}e)#g#8_rp8{CB9w*+r!UF*&mcQKA*XqT_7G|P?e zfykq6SGux@!$vT4{G^NQ5#&q@rmdj@K`~kEhzUFoa?1+F*m`_c9J$%@(OvlG%UHim#g$VnlbtIlEWN7#M|Q<4cud zkvR;y@UK+}R%S4yK$vs{C;SB1tM;H}TNiY%1e+cO84=dikRzaGc0uoa1wO!3pmdp=Lww`3 zAOS?tU9WcN)n71~l6OFb0wX=`k)Eo5RUAE45kwHy{vdXV-a#+kTXhWA+l-94M1uRWPxA^oh(~Dd zQSWO7vSn1T-+S)ei57x}LYQauBP|BML-WE~vP_phP2iL+xd)!MCk*`iq6o!!xh=^a z>KbM;!7}{rxq86pSJu5XG=Y$#$G+~4=Kyk%*0s`+EWO8M46IA^{2s`rtZ^7 ztA{VhQ8EbB{ged4h7twZ!O6cITt+5%q9s3e|5c1xxFZ@|Wjpb_g!E7PRz8>#y9X4f zRKz^lo%+@86ntZlE1T3n@mTpNflj&q!u_-(Id>a~1zEaf#*rjHFRr&syIBHe~zDJ@IQjjB%(m`t4j?zp{51n5_n>z)=M&ub>o;PKy6YQVGw2>T6Ti zP32PSABQ!`Nm+mrN#~snZGS_~-vK4J!+>}bz5$`|gF|((knE4pG_Gr*(u@;x2NJV_ z?GUjnN=H)9-A(*Xgg$fulc+3>FxOF>QZMYJ@^_O{HOKxj0*qDY05YMN9|FUrc5KuQ z=B(j!JPZGhzMS1Wtp%(?AE)-W99h`;4FSzU^6NLiGT0oLYjAGfcGA8ir}B5_9HJ zZL{hwO0`t!EY_3&dO%&f3RU$TX{vveq*adq{|NI9q!yWABB$HPQ`ribBoZ#>ONiQr zBVlu{DK$fI!Vy*rVa-dHdCW@C^g3AHtlEx*?ooCMdIq3ic$!tst5S#Ic*$*P+CL`8b<-%iYR2Fl(t;J-GmkplR|MF_72(27<2bPTjXd%+_K`A@oTspXdHPJgK2X6gB8a^lIIMJSA9=oWP6N=n2~h6S zZj7PiBF>d?i3ON;DZAUftC0t`85#-syRoCJKanKQL zwLm3DM2ahU9e6tg8B+Yod5xWt^vzN-!ENlV7>g(Yf99*E;S4%dyBY)$3aEEM-R!Dj ze`_%dH}jz$GN=#iz$K|*wK}34#WKgj+m6kvOeGgX>{{5i-*i;^p6XazHWgz+$Ue)iqj z0_sGIcor>;GN6A9W|U3!IuiFh_)509OfzW~&!|0aofkWL=^&5|E{ik-net}Y1W_EKcGpGR(%n8#yLDHSLr<3D_-tCG5W^`qd!V;FM&Xi zTrx}}1BEAV%~;8|_K&u6q>-a4=w2s$0%e_DbpqL&fBi_|D89?)p}EaAItU71h^`>< z*LZi{WBCeHLpIu{ODrC!MW3~Iq)Q&Ie>$=URp-RIHZ+o#wmr796d2Sh5F%peQQx!a z%%q(;uSA)xn!x=$rai240Yr0w&3V*2$R1-+Cc`@AZn=ca`DUOT=-yZ#@GRol6trEO z#ieyILHJW-dp+UUq@b?n^s*eG`51%ST~seQdCCB?21S1!FAY#3W|vY>W8@8Og!cFM zd`42VcG2BE`DX!D!}n#y!a5>vG+&}f)m z6UCC9f7>nnp|FJ&e^jG#ByfBxQCcFhq{ZgkEx1i6KGIJV7;?7@8#r1fql%3}F!VqT zDK}*QkWw_BwOXZBn)X_1NihDh^b_8C7d^;rV{j51MZZ@F{__65fvYOfONPQ#=Cf0O z*C>dU=#;V=(1~KVTgy`NLv$5>AU%H3?$*64vW-XNyH<)DE|mJ-osIh^fHszh>kwX-1nM*c9K0^InGgOQ}l0`te1 zIwF=k>>Wup4pS#hkJLg;wx)1%$a^5c_4K}mn80&+4V0~kGf^&BHnoaC{=eumAxT^= zoI0pXf{_Cm$3USxbSUCIQufPd|7aC#_{=yq!~sMZqVt7r!xN3hoWdFN*zms4c*yeq z6i2dA4|x6EfGh}{S22zU7u{2wxvk65I;%%+J@$<3zl7A@DK=e2YoH7YbLMOqgD}uZ z5q2F`MC=z9! zm*exGrliQGqL9QOu)ZEsPRpxpQwFBQx>a0j6M24Ett}hjEmMGk*SEDKMX$mowtr`j zB9W9$R#_&mHPxL|YpFqK&vl~ptR6+PNiKf^e-Y3wLm>w)xLWDyC|^qt=DbZOvr|fQ zGX6@*idCf0wQHDI!ogbWiw1=#XIfQ-?b$1U_r$2RbJtjJ?t#4(m4Yd56o;;^nMK7e zWPRN>i;+QDhas=(i^tKMQyHLFuZb9J+Dz@>Gm$F4&`y*FsfL<=u&lV;-^ZvaBe!6* z=35BPH||w$zgNnd(U+Ep1pNi)@(4B#=f`#Gn0G$I#R=0&dT&9E2Qo8A{tTjzMe7E8 zZi2AV_@(v%BXl1%z;(ze1F9HhOIMsqU=ALl=(`!tSnOK9>0q+WcV2roeLJMa6wg5w*y9%DsBApY#-XfY#Ce&)%Re^)zv2kz z_7ARL&M%7k?z1$=$fg_~Y#>5lY@*sBJ!IWN%RhO3sI`IzD;J8SI&O7zTc+wK$h+MU zpF+RAui1>h`{n23dju`VW^nxBDMG* zHFNz@$G57;V?~^NsaLKe;_pMg%@6 zmQH~FsB!eb`#IOu>eP@vvFg+WQ6=Xw)SknmDwJ&xFFSpu+NBB!mdL<@Go7ErRE3?< zHMLF8vXp0mE4fwaa5&@q>yn+|%I=^%$q(NN{pADVEyr3?fLoN}8W z{ix=DJtOx0%wWzzujWDZf4l?$LI3WZl%P7t7O@%-KcVK?d;)4;nYjunx}&Px<8>KM z6G(1-U({mb!s;s-Cgq7DLLr#%2(Cx-UPAHKPBN)wEiZZP?T5<^entN)oDh2n2`Tlh zXvc8ahogWz(-Uw1k+8PGVmCvu7aAibQ49_xLb+1c`M%^5f_+&g5OSoZ9q8BJ^fwb` z+AV+Ju1+99-A{IcNVvrt3<(jpMiQl@es<|2>gg_3NFP+O%#Bl!etW222#q|ms^s`i zP~Tognapt}cVLKIGl@c&L&qd94l}%;EmlJJD8m_BSPE#iW@`7>G`o;AJ2S6%B%?{? zonk9(Yp0BniHI0&7mx_Igg2Y!C3ukIch9cS=w}}mUqg}6lNg8;4(nrB{LZ9=CmQ?R3cvypOUxs{h z9QMJ|0VL$Eh@bq-ky2tak#ArYM%iDCI-lo!(MZz7{0QP_&PoEg#0~eF8mUDjW7b zpJ%efRyiGte#@C(MR7y1V2vn!xl7HLPJtcHj_%GiCg>fKVqvaMOq>!-^bj)!;J+n z%|f)YL^L1U*W{O9_D+5!rlby9oQjIvw5jz~Oc7&h-yulh?)<*47=v@D)8UiL5Cdq^ z4UmpxJ1_Y*j5tvj44cn;%cUt7MgvHJd~b2zBdnu&)I@gWt#(M$`Rm#tb@%J+C{`%_ zoxFHZ5JV2cV*%|6Uj>HewHOA3TniyMpzo4LPDnfp$+-r^Tf#{PU`W~ryf#eqc1Y&% z^Ajsh0%ukD5Ix;hw{lkte+8! zCXr{v+__RDHW#>mT6OroZ9jdz9+N_%BCTR+pQg#_6=Ac0U&kO#il!Q?wr z>Uc{x?7XrMA81cB4FK5zs;XVUs7qe!M|oFR9qyJKI1Cpw^)aFW{xHYbT-WA{%)RLr z_496idMr0=RAn&jQtV_~quA3!U>DT>e~f)&aHqkyX6$5Q+qN;WZQHhO+qP}n_Aj z<|BDE95SppNQioH1$j3F_3oRD7F20--7@$#cW=-+9E~b-j47V6tVXLnl=bu}ME#3G z@kpvVC46JIIEczp=@%MyGWkeh8|;A29A>OivfASz1_P$HIFs>?y>8aKt_>rZAt8XY z&3Z;IVS^e|B+rmSy}Rn29C7P67q;D^6ct{M>*@U=IB4Ajkc$BJ&Wp-AIhNhd97_yz zh`DBvf3*ScNoNG%Vc9HUz)c3KlVy|@5C2_W7@BpoA=z|c>Zu(i#G(pt+veMHOzuKVJ@wmBt6Rum{4kSR;0hDl z=}3BRa$>RpbI?_?hl?NpiQc|1!Xm+=moZ8pk-pHX9WCsil+)$5VpxxRN?J~A34B3Dkx%NZ4Ij{|)uxF)#8Evp2!u>9m1sm{8H zLB*fHlWcA@H(r{(1TK&*Rz4n@5duB}ZQ*&@oKvhWGN8S&$YNH}keNm*g@2{3MwY=rbImIA)Mu0-OYeblaR0%mcFIy&TwZg)lUI#J!pEiuFki z2faVqrnQ`xSqyvQgrwr@F}7+<%1MSuB`#;M3eb>GyYL-i>`e&#v`< z9(7-}?;VE4H>;1tqLMe*Fg^X2-Q|VeoyHh_5`-Sb8CZ=?Kn=+ zT^T`gpxV%6O{b!tx(;Te526oX1wGIZ925gRy|$LAkB|H2rLJ3&VrcWR)#7)EdoL=@ zwMPYD7kfk9duE)SL`vUC7z+KB+)Wy5dMS<{o=ZwaUAB==VUCZYSwmVUx9^503egD2 zHD`~eZS$Qe|LBofn?_M5c6cFL^xS#|9d5kg&CE#?tJZ`rv<1|ypplNo%|F`U>AUtT z(rx<9H+fYA#Lou%BfLg`hz#c;G%I2vSHcS|Q3b8>Vman0ikK0hMTa8c5a&#Uox%8Xr}ZZg4CZ|mCxS(Vrg0}+<=Uz7CR5B8_!0Fw_dB5P3H!ZypD)!!93@! z3U+nIuPjM@78-5k*LMI8d$Hu5Nk)@X)w#>HK>G#q&|vzfqT^qm1nS1Bs^jct^Rt)B zaF5@$JKmZ!+Zg+3{c2G(du*05h#$fB;2ifa1g_(!3LyU#%;GR1LSSx7O|`Lq#vnW} zov!jEE#~O^`gt947ezcUq^M~<0s9{7#KvtWH~?a_35H5MFOK{*(btC&S1J1)#hWJI zdpG);`Lv$KU`CB<_+g|7&d7<;qJPTVw{elvkO{LI$=NzJ`b7bxHOMiXBYNVX{9P(H z+@-(nGCG8GXo*-nDpW~Y+05TRcdBZm<4KEo8Djrya`#;($J!J1^?cJ_24l7YZYr|w zeJpJ4rk{Q|3XZu;&F(9htr+&&6XLi=-9hi~H5Lz@4E$@C7fMtwRJlIltO+13qL!~V60?r*V5yZ@{eW9pI-51-9tO8Wn!Q&%rYO;RzTP&Lh zxiF)|&mE%alZ7nL(z5$GOR^rUB#Q$p6r9Bon}YjpIe;(RNvm+)5~5IsRrlN_V-FP_ zXLg`SJLw5H2|^#2D2L}p(D`{x{2KpG!XLGGddTQV^(Ab&Nw-}lL7E?P&8%qG=ekDe zQOnq>mL}N#*;2mN7-idvL{|D0O_Hv_(e0(m!wH&0or!1mVU87f?E)TWa(2zzJbZ8x zX}u~cSRiM0LI_0sx9)c#0t_#DAfwi%OwbSvjZ!nqZO_fCY($JfB7(fA?2VKEY0Ky| z3I<*LenxmGo&9ni%12z;RT1>5hH301+U->*JMqx_SAF*j*xM#v(aigxK$`h+1B z;v&onmo{DfwyR>Y_WId1I2WpHMPJ=jtJGr~qQV`}KZR4^@cOylHjpa~(G^i3rYWL`5w$JHgJ zw(S*3yy=b3_NIWeo;{f$^gJL{5d?uHLugy=ID;0Ksvs@JeRH{fY0WkkY4+&ql`IqB!O%>=dnkjBuX`;5l2yZ~Yh{ii#rA58Q$em$21-hS zI#?_IXAKv)lphN;Om*_F1W&=37F=w^49`ZYz8Fj0&u1lH^@=`4_8VfJ!fcvugkr}$ z8^xf6+PE$1x^rLkj1FN$MVz6lw(;6-BwNKtJVlxjM}+naHGYB z?-T6ZUfS#G(#}L07?&^t27?f!h>{Sg)H)1kWiLzrq6X206E)750zxqTHGdC+#%7G0 zsmRljF;-jyVa*UMy=Tg+PoI;K@DB0lRdg6&;wj*hDvtTZ6>U}qfI~U|dD!>?IAry3 zk=Ko=M72LIH0Sm~v4wU>Ihi&njNuLUsBE)!l`8r=8ehvlw2}}t(aFK69OU~N_VZ<5 zl1Yx7m>>Y{_I26%pmQXfeejxPrEdl%O?~Pq%yXW&mOkU4Bd751ln8D63%%tEa_Mi>^*Gr7Mv~OeAJu>=a)f`f0)(G6Ipe!vaccFnR5XI(#jIs?%+do}3 z{kq^WWw28{E%R7tG!+6@GIF@qv<@E$UI2uUK+kLnvp2nUWA&AjYaohb& z=z5_I!M->_havn)+s;C0_d<-=(!JO(ECfUz}I z-8s6ev5kD>-ax$8;uZa|9H(^O(~D>4ktJ=DslRu2X}C`}w1*O_r2q^!>&?x3 za}1n%()Ij^5bNq%3)t@FVxH5xQX&jLUw${<>Jm4(uB>6Z$;frA6d(qojWC5cYH;>L zEsV*Y#rG1K{2h%a-@x^j!&?uBnZF|U)sic0BN?BBytUMh$^dW=g=#@maxx^_!UU5= zBWm79+|KsqJ4J^&ns=pH=t2vI`g%MYT z41s*>d>>aJ$|W<6K$4rR#duyCF&aVlFasM!@V=3-BJ&Ym@~1s>8;&nMhN4@^5JQC8 z#N}aE-;}+%Z6huF&!I* z81v1%SXxHf6)tUW^V6*JeKRbCOwKHRU_bH5&A6rzoMC%MW>M_Zx%H89l{y23Q_iYb zIyQ#LjdEDZ;Tf=>il)(%kXxD;1d;8&v#W8pR?|u1qo5kx*Je97_M}9RxrLpU)uG_H z;bW)*){ub0O0-p>4C&f-9E3NS{E!7G$uB^zusjMY1@gIN#+JNVScOcnRyF z&!1GfysSaKjTRAI3w{s%kM-kR!TP6^Ov7)U5*~G)j%I{?7_eVFT&b6%*u^7LNj9st z_X9hC8d92#`;J~Wy1v=Q4b0y8CDP%4+^96Ke4`LTmh9kGkSyaam9v$~0ZB%-b@I_h ztK4bm6|je-m&@L^-pr0*#Akvhp>DA6j*Lo#L!KrerLUyd_kuc-tqnUV_ zd-UMVl5iIV@oT$ASEf1CBsQ&BZMp80lPGJY$7llB<%b=$sjn^v-DYld#$;9l@SQk_ zMfQGeDKN>de9b!5qUvLJuLG#*&nZX95Be-99$(?NYj8|YUh+Yyv`4cRiOMffq3o`9SI;hZVE5@jvPX^0o56YXp z989*(jA^w%pH1IJb!W$e-1Unoys(YnL1+{$`Uz;+F+sK|CZzTwOb*IHr1gpMX}ZS>Yk$M>QpYrn<@8M9>+3RcJ0q_&cj^K=#~GGmm( zfL$9Nlt?k`4qFrG0ZnmWjxHlT>n;i&VtvZtk5U?m&9dYioGFd(jM7Pn&L>#NnlG8e zjSPAGpY?1sV4tQ>5x7X*DmP6sd}5?&3C#XxV;1SQ#*nEleu>}qZqJ@0tOMmX$1`%U zg_mAUoi)%3iR-`m*6}uYmF%Odt8GZuSJ@lZR!;T+9; zJa{F(n-j00QLv;Hmwx^HxG)k5@Qk?UBND8zLdMvZJTfPgO{850JLm(t9c8g9t6IQU zIA2idTF_0I!{FV**I8}ZH8NY9&`FTnBEO#zHvd99ejcXkUjOQU+rjuI_z(U+2RUvh zgy9F_|AX@X|KtC$ia>xU{u}(ikf^?>;{Oczf77d(q$A#h|FNwliuEqatW0WzU(uHk zNSGzoO`1)-;A?*sdddV`Nv~4a+$8Zw7B*3>DBPc6bD$r*(;U8n2y(tASyR)Xt#wet zQx1+|d-(H_i1+LJ`|J116N{_6ymElD4@HQ7mPoWlP5B>K@3<39TP z-v|GPrP2@6vG3;@iO>7-^)$2JH-mmpwj96D+x13As-oxX^{g~TUhl_?H`xh6e}~VF zZ|-}VI+eshj^E3trR}(WdoweZf5stLUgcFA=f3NazW=A|Q#Dqu-0p8>s#0?${$;Iw zoWtw(WGWw23iGv_&9|h?NcFSi%7c*Nj+CF!tX+c+p%Gj&? zQyOPT{k-${a=UBgshyYN37q`GI&m`+0Ldx}nL#EHSJY&ZMaYw`WY;zd10E&j<~oZjc3 z(`WsWY7)-Mr}yy53x*@F_r>qe{BPK~xG`m)FaIBu{+OP8eA&9=I9hq%);Lw{cj016 z8HQ~9!P>Xa&et^_E&)Mqj$FJG4>!K>@3FCR6x@gQVwk%F+u^sTjr?!SBUT5pxdhwz zgpenmSXVzl-Phx1%*3~&k5b%xWViXvpA8Q$Hy5|O`Az z_^n|!)Gt3uWyhjI?Kr0GsX4to`Q3^B)X96MF2PN{@Jl0uav zFk)$fq7XV_LC-ff(_?pe(p5G^f z{>L@Z7Ge)NS_%?imE6chvt(VRnYpy!JvE{Pzps>GoDOiQ|L|>L%FPXos;A$}-F5j- zejdHQtt9)E-}n95dCmm=iQk(4{ZICu=g*sr`NvQDUvkw-G8lz_No|-lj|&7d>P+Fg z#2oyd+x!3BZebjbLOV_`#u|EDITR0`1HkwlR|z~>yUfZ*r-$G401vwv&kty2&|yWz zlxV7bsiV;~#>iTx$<_CD=)*b(_2g$2&vCE5v0VB+_t^f+a(i<7!#pYu(d zGo9n8!6;J@3^t-Q!N)ZqE)R7nW;zZzu^$Pa(^+6wKYTYAvSQk82$Tl4lu)ltpwSuf zYKeuOi_y*G0nT*mt?X>slehC$F2+tAnX#fY5Y3K#sna&o>K`^<&@6TCZs)+Mn&?Y! z^t2uyA($-+gPQ=tjs;Af?CznPkFO(^rBMFuYtuLFb_>@xzG$csBjPw#gBs*?fpq25 zThMx$2rV)b>R?{-MYHKnv=2-YM|`qPjWyI>?;aFR{qE9S10iK}6O1?+=_^}ALdC?9 zZENNwSBaR=ulw=*x9OgoMSEAa?K}e})L@mI=S>&+kDDitsIU|Fn{?^;fzX<%PKfPB zkgT)`6L42=0ZzS^>xz2gMcKNt1f`?}c5~S6oUwB}ttfT=m_;?ex|XhUvo~wlE}q|? z&j4$x*^BF2Y1n^V!*d*!vxk@3D}Aev>J9*U{|*KnQ?)@#G7|?%RO43=p{b$Lh1xJX z-$Q712u;lx7w6Npnx}`SV=#TZ@1U`pUlt<1MighT`;aD!)pZkJI}ti?L3|dA!GnRa zhlI8Hdmm4a>i)jH62RLBmEDh6JDqrb6W=iVFuL3_FXqCTVH6uYm0 zTP;Mw8s(rRs9-P##>CX5?W-}iM*?5!RUHRDt!wAxq&mLpzAjnLZtOGFm}7 zyVCDZw$=xKx6)hJS?Gp`Bo(`wi0y>RHyuN9W7n(IcL3}%@M>%^JAq#t(!A{af9;LZ zvRF6k#_(`v*3~*}un#$dzcvqjU-D6oQ0`<51?|FZ+L>Z_qYCYyEAmv4UYQ8s)bfCp zvSVqRC?)nsx2i_dnzG-1U8erMG#?J%{*?e(^Er|T8N=q2!Ta~}gLe3sjj!91RW-ke zLU5(92)Zx@NpUWtn_{h(UW-Ym-Wn-BPahITZ0)=CQ}on_#yZiy_T(9+zYuC0dOM*_ zL0IUJEfHnIT+0j?Ek$Bbd_$&ImRTo|1O4?ZI?=xmH>(}Mpy&7bU}aYv{a445Kc|1* z_TfW`kk8$W4+&4LR`_BH^8$3*LNNNI8iW6{<|!GNFGt=#BSE|8de!tsI97<_ zV;nnMlpRQD48OZ^?0Lw6PiHGC8uj99BP!?D9-v4&WrnYmHp-r55HHa&2SfAVGzinR z74Agn@a>I(0TZFtVNf zr{GNF+T*5V7AWqYw5t~Q8-(HxpDM?qN0_9jH&rEN1U7C*dy66jK|8jIh}A%f5KP4R zv;l`T(>|RnhqVBQN`|D>goYG*sfvlEXrvCx#hg&22AX+d##&;oGrE}k7+byMrHkT?3BMt$HsYeCNw=sB)`WUs?&k%1JS9JbIshDK zBFbH_nBxL*%aN#s#fKXTQlZ;|7t6$kq3vr#d&D0@9r|1qMo>ycwzxT0o{`+!A1gAo z9YJO@6O@|kvRn5{{DdOHM>TMW@zX{QBxE6c!(Kwq!60n4RyKEV3`^@kq~L@&Y>i_9 zVJ%`GrnpahEdMqBL3;I)ja%oeaCzqO$CM)AcN)+UK&IPKZ8WS<#My z+ln$~P;=OJQU2{%3!p@5iS$fuyx=lqzc3YctD`Q+{E+i|(LRw`H{Q>W;t6MpW=wOq z)&TAZDHnYK#8#q(2JZH2oz6%V!#94%JHonB5aJ#%hIz&CP#cdI%kT4xAfJco1UJIr z&Bax~=9wEFr&@92->n1Y-Xs^Eg19?|2-Ai&fpg_mXZHun5Cv`7He!B53EDWd!GgJk zkC6*=Z%V+hC!I}2#f`9H5$j1wdQ%4G8Wc7o>PcRN_*}R>2_N{)V@=T1kV!}$`z9&# zrTKwsb!DIx86*3_9V4GiCur;D;Ar>sGDSf;R!%>>rFS9n2TP?QLHO;hkw+i0a0hLR!9VT zi682UxI*mw;{q;st_;Wu{*utB&etZd!Ke_iuDT{} z>=&)*uh50w=*G4Yx0=Y|C;{d_s&SDYC@r`lbjg&wycTtV_>SC>n3y{sf=bji&%e4M z2`*g1xGqEtHJvkpj2u^zsHvqcl;3#&lJ&)-B!TGzPf>0`9)HNn9wR6 zkWs=rT<>k{n4b`5!~_WAjv{m9ltcP)QGg;f0K~!sR-bZtqbM| zt@AW8R4;p8Q_Bh9z=M@iW}U8$I7lWdNPNsigU0N-u=EeW#`pjYAl@yOl%8ux$d+GF z6;$AKmRWiOkr&NFm4e$+Z7AC~$AsSb$&1jE(m%SntUr^$mHQ1G{9D*eVH0j*j6M=z zhLz16y&{ZOYLO%9I4ctNR&yM2QL3+~B@nxvkaxt|BtPef+Y51}DIaBxE@ zXGAuJZ!hxperA6z6A_EXf)q=WYXqilzxH)cQnG^}-`(tTulULKR}H(YDqv)pgvdh9 zhAc+b6=;H>2r1Fb`Zog~*HmN$SBGl_=K zT~;fFQ6<+?TQbeKxyZ3P_W27~n(b~P6GEpuda9k19Z_it$dMLbts`Ru`CY$dvOO24 zm)G~bAU9{=#qG(w$UX;Rb0bj+R>5tB6g8romNc@X)m0(+hKUvx)Dh-szN-9Sg5XA) z-x#Jn2-!${e#6;tn}sU};qEV~d7hyxIYn)a30&A3(a!$+e`o0$isrvkk!MiPJaRgL zWy8Lb1%;PZNo7PEYg*eBA-^p_)5;WRbZqS3Y)N{WzY&`xGuWp+KzAB#d-3LO@4LbnBsbz5?=kb8&M25*1SxZ-8 zaK2n1y|USnu3lvZb+(O|(0lb&&dR67vYjeUX3;-M@V z<(FiXn3a7Ya}%(=B`DrY94tV-X&sV&f5D7WLxZ&{ozkfIAC%^jXdsjzObM;BAm3Ca zp*IRT{`GL6!4K=n&uUuHO^q2qfSIFk)2UPQ6^2OT4Js!$xk-GF+6Xl?G%pCD0EZw5 zwh#{}t>@BY<|)!@8b?_YDqWLnhrx?XMU-07h}U?Kys{b-h0~0<1vaj88Z=Q#l#X4) zsX|A>gnw1~sB^syaHl%pVOMwGqVvnxe}p5{z_exnZx2mR0+d@Kc`Fo|r|Y!oO3AJ4 zlM}9UAb4as1qi1basu_RvXN8ahLY9T;SHLnf=IOkd&;6sR*kyN0(+m)_+@GQ3=50_ zxfuw^)ZM>O+#De_l9579howi?CGK+@5xC2>{L6|Lio0nu0^VZOKfu)X_HyjMJ-q=H z%UUdm6LN^k9S~9HRS0*RU6QPvgCpASMb=<{fA{^lI$ys>%RB8GPISxH?-~1A?f>P& zw*|hl)Bo&kN`ck2d#bXlO-0rQcOSkk372xGV_5aohnC{qeW&?wL45V zT9XY;TQNkiMK2@|*imtw>&4I{N(k}TWpb#~AT)I}a=RF*Nj12iGsUiFNslG-p`O9- z>uc0+IwhJ4-(*U#jJHVU;JQnEfXWLqv#3^842Ptpe29{dmD^v+W2QR6hneZ|wmV}o zC7r>~?|$e1{jShdD%j{8f_2e6Jni#ZjCCXAmAxuvpaN|?jq0cN4iE0Jv#+1$*9F+c zl~MyC6^RV7u_V4SJ+9a&swu+?MU*g7gcF* zc8f)8&2-+Kc&W~gE~=CNmGyovkTde-x13G=+{MsYHd-XaOMtS}*T+X^PvCH%?s~UK zbj^iD9mo_O(RmA)gWzJb^ z_M4A0@OmPle??+(b*jY7b*1tH*?ce;|8#Lmp>R;z#nX*`OzpMp&@cDeevuXV!4 zR@gvCOuWTxmE}R|WiBGaah@sYGTS+r&@@AjJe&E-T40!`K(XO{|1=ZQNe)Cn=HbpZ zw@#kWg_sQr$Un9Q(!`8pvMTfhs;-T2 z!3&fX;OIMwDwq(PEl%ijpU&ISS(z^QySM)r7hJAq3R(Z}l$1Y8Fe`0c2UjrKbplUH zMiTnYXb6pfW8*?gMep0ClhP71@xJ}S3%Id6vzrPHFXgIs&qiaUzJVEy{O4J!!iBE;9(6%YYQOJVK_pt zoT`d+pgYzfHbx68QNP^}Or{%Ma)lylm|bE_cazWu5@pM&<0mdcm+VU;j*sUyJ+CH~ zX|aGy>8yd#as1r00)(>)TLl7^bYAsPbs!DVq&8}FPzotgqQtSLJ9SK_wG7m+8`OV> zWzKdQ1|E@(7%XTZfQXNwMVPs{bw^&BgvxD0S##=zNknwtU`G1y)g6WYBiOue5<{!q z;nGua;l^AsF~G^n8Z3lMA%{thwd5+WEWVTK6L;v*xhZVLW$;RAd2loykH#e;q0BC7 z#^KWY7_&sl6_eI}%P?#$@?A_*H0CAn)maTFXLtHKwc zOl7f4NDy6Og5Ac2an(T}VxrFf4FO>99@yNZY$z26Tf?s{xTLgh(OfK&)FoC@g4bYU z!?%x<1)s>Uml8Q^rK}YY84f%oi;rv7wCOO{(8h5-G19eq z-N^bgx|9)dn^dLZ)?dhd%UqcGeQx2c4%et}ku8`>_ohSY=joJkyUL@*QRUraCm>=U zwYqa^gqiWq#CvCkk@srX^l0W*7!Zl!dNQ!=YPVBm&^p)HEcNZ2<|*wZU>Qu}=W3=|E|FU&VUG`HX-09`?m0ghBW z@Rs&GP={$${{$4y9PF*Dl?slrc`(jH9jQ<>LA3Oo-UMNdiZD&7;y{)f&dJQm$2WCT zp@WKK_YC!&*JmyM_ViIQblhIt%#KH&ecSCyPrQ*ET_O#eE2U~F{W|fcg@lYsrF0H2 zLo+(8+qc~tJz{rEd{2TGD}~c7@ib9+jNV0~c2;JSm)T^g7nOH4qj^c3Sj@HVJ6)yWW zhd~VicFb{tnT5u+63gI|2p7JnM)|piha{z=j`*>vQA<2Q%r+X&H5%=yf|>L!5&<_@ zaVb<9CQ}Qk(WNdcs2YSl5<64O*|~e^nC?0hqDNniGOKAEqTay$U;dnY=R~2$Q;4*ZOrrm zT}hL|P+wbABzX+m98!|^un1VcNy$uOouj)S+t06cK}IsM&l$7bL`kcQ7{g$O%WRq@ ze?7L>=*yqxX^URXDk=56klS3_N0Q{u9LA)n-lDT4!Q#|Eb#N zZPu9stJqGUi|jRL)17Ofgh=dU>TqRbH_vDfZLe0GRxU`qMpng!kTZ9_ohN8cQC-Yb zMs%9a%o+{z4R3=M&_Y;-jcxCw7$LJJBJ1u#M9FyHh)i2-Dt~5LVWwZ&VmaSM;l02( zJ5x53&BJCfmMKhm{y>0mMri%Lz>qAG%thTF2U7; z7f=)UObxl|=+meoCg_&4fN;I(Tr9PXuYvFwh4(Ij;7-BadIE=vK@iS^XQI^!++sw+ zbWS0#KZVfDz4p*%?cGg3BEKv?f*=WCX^YrJ!i-yYl}u6=OJWX$q1 zFiG}yo{7dg9MReJO+6lp4ccCNYHoT|o|y)&8G53jvqX7cdS&X%n|2M9(A?Vv)XFSIqb;Q+(`k!K_;6>0}&sblqnYnNUR-5NF3?U`2ktC7_(M@Z_#1%;B^ zh!37>9hC|_r*TRLY*(H|7j-M>vIK4Ig-*4+GgntYcGm2cD0pCN9^}04Fb~xJ^e+%G z`e!!)c4s0tjgMLr2YI8@4sjJ+8j|MT+=o9K3$Q&4yo>m;h{Jy@(jNUt)_U6`vAMi> zeTtN>N>|bcqc8Z-`-sfl)vfd)~4@*VN`wmAupRM@rDOjnp1S9M<6{)oBgj zfXCf(f~-6kNAV1`|&mVKK= zdblE73;QQPZtYm+=bSO$}y#hIapiNE7RiL6Z8R)mhVR ziqDluL|`mF#6UIosaN(dI>Jp!19`<(2JeV3f!c`S;kfuNz+CJtKvmO4#Iq4iZn&mK z7D00UQ?p1Ix*aH^RI-xMo**Ug;Ka6HrpWJ}|NT2|qiOSZ!x9+5G7JDRX}(&sY=ScD zqoZ09V~y0M2C(AZopRu}(}cbL$r@6y4wNh@{Z!qT+M^6~lO$(cv9NHp(K$7hh3NXI zBq#25{gG53?g#dVJ|_lWW!FYxQh`4tRt>35Ziz-iE|yK{qFY1VKt8#u#}qPDZ${P7 z%FSQlav54jUiZ0N4I0{Kjd&Vv#oE;$6WZ1s^XW|_wy9bfZ7p3M55mZ0Y3zE6LR^`# zR+Qy@&xTmtgN|%u&tv1OoK5!Hel==QxA>`{uv5vSl#3|{dJ<8mnHDb1-de;$cSG?f z%1(e2(urRB8YUNDo0OqUjo?Z4;745DDa}(lO-3of=?yI+RbjY_O6tNomEu(_?TMp0 zOmLKTo56;kFs8-CxCUjS31`)g$apPiMJ*GhmW?dH19nE)e6sm@xL<|;-LYA>Zdgx? ziD24xJU*lv*II~Hi@U$@mtU~-P}IITSc{HpJ^?BIV0?*(s|B~KC5%~np`>VS^cwP?HL4u_P zy`kz#s~}p9W%SGlwGmSXkrG{&^g`L=0|(Ci{{*oo5Jyg40iy5s4%G?{RO8=m>_Y_b zQWChr;Ew&Agi=yepH9G31-2+MRyW?r>%*lzKV0VIqk#B?n_QeJSu>1F0u6@v^B^(| z(Q2rAZ5c#Ws>7bVqi7G(=i}`0)5oyyb&2Ust@;6cQVKJi=u_7r`BWfop{m!kq8e`9 zKGR{j<^0jGyuPDhf>T+45|+O2>kaJv>hZ^Q4PHJP?zItVne(%iTJhRh=9dSPrGtI0 zu`(Sho@ix?3>|C`2ww66b+%5ddn;y|<;358*ELV}_mk{CldGguxs)OWNUIYtjV?;H zH^k&LddX90)y*eijgR`c`*i4IH{Rpjy=gC9rZa4<29Sh*D%Aav63^k$X?Snc=sU;8 zx4sC@aE-6_f4@^>la@l7Rx7R+UqqGHF$71KY*)F$$EY;uQrMZLa8`?E>RUM<@_&f? zg!&H&K<|%lux<&=|Ankqol;YSanEme0aYr}kZC%B;l=hl8(pl@3I+1z<@VbrV>y4V z%>CZqdrefcfhrxK0N!1a9Y7RK!q3!CKa{QRU3tH#hU=?e?Fi_hjv|xqFaGC_-I@l0 z(IQoaKHa60F&wJB;8}C==&~D~tiNd@jm^MWE5)Q6a%i4zZC+IlI^S46WZ644q<`9W!5c^kBKD+0y|Y+3aCg{DR~^3fRjBxcN8-H*YnBy$NKy!caoc z%Y>Xcolw4J)o?7d-|@G=P?XlPtdxsg!M_|`)Z0Gj+(UL*3}7GUUoq_Tl3&5M%q`7Y zw(J^gm%g7Bm1g%Fa%sn=OEx%2t!aO=eJ#xC5Z zD=h;jyFbSnZ z8u`Svu8b^&2e#pE(8IGe;lCd97J1_RapiY$*NYpW<~KHs?sqnE?`O)|dt2|y-rjz^ z(q4ogKk$lTZGIVw@>kJ}S_JP$)rl&JkU*qKY)P^|%`SYcfZKwIZeA8IomaZDcX*( z)#A{&a`X)+xw%vW$NS(#w|CH=7jKVO*UY#PZDAoH(IideBGu<{Xgp6>{8?$IR%8Cb zPyDTDJGzlx)L32Sr3$+L)%x}75@RE`uhePA1uNCu_0ugj?<7mNp6N;&_8|Q6^-WpF zsFwY@FzqU8OOy|b`ben6fxL&EhhqPv{#hJh<>~pAorUPVVLZ1KjHj^8Ju&9NaK)-Re zt(+p=w2)$h8a3H_@XFYTp;fKm{qum}nc2Q1pO&7^d94xloe-DX>$;9+TAfxA7F0&f z*ou>=ia^|fUAP8zS(k4r=tOHQN^sub%{Q7qy=TC@rfwc3zgt+k%wt;0BQ8otvV*-& zlajQUVvein@!1}2;3P0x^+Muq4cf03c$?cQn6XsZgo1}R{v8?gbX|sBeMc5CtGT5Z z_)B4I`JUnCFy_XYq8DG+vrL0dErzjgg1^g8w+8pXE*cFq2QS~x0_r_=MVhf7&TYXehc}jygv+p;j97}u8j@y-r&_O4&D6RM z{P8(HZB+5>&I!8cG=1WN11Ho@tqwNzE;b1DCQopVoH?JKk|Ap$?W!jAbAI5IY$0p6 z6tw2sWt5&iKZiOrEo@%>`F{O;tJcz2z4WHP@aVKz|Hrcl@0nH%ZiPSv5;GEg;#dTx zE84EmpViL&SzRk%?I>q2Gm^)&d2gAUJJnVmFw5tmCM)NG!Mb| z5rMQjOc<;h+!NxGh+DMRk4G@OUloXDj3sNI<9HkFq z9fUEnOPacz4~q!uiZAsswwZ+FibWbrFV>CB zV7wLZduBXcu{+bzrL<)(hRySlI+_Zjo@+%a(p zqxSxI*-43W{q%Lie7)YS)WbbK!d>s}@b`Lqw!eG4xIf=JeSXQ_Z0YXr&6v4S_ysrs z3C0h?(D*y}F%?TnruF*Gl) z=C@t7mb=+v%MM-yYnmlNtn zEfq0F8eS;bwZxe~Mot(dv$K@jmeEPh@tR znz<{?_PUWUMBmyexin0vSG6tVVoWB}Uu|N6ukuU_m{myaew08`5qzHR{JnY}O%vw9Bpe%;UhokI-|nn_k((b@Q_UWhb?LDD{Y#JcC+O*I>C{;n$|)!? zG!Ku{41-twhtnB?Aku5a{q;X{?bBzUZmPzl`yX$r?mqq?O#VGQzH#*S^wIiitf}v= zr@!++pIhLjzqN0wg6!;yR?TAn*kLF;qzlkD_X7xmR$p6)x9NKB1%9yAHm zpNY6~YqYXEfzH(EfDz^nJQgvh3`lgJE=wL(kaV@nE5gEQRnX?fsFkEL0}RCkH2xQ3 z?-*WL6SND*wrx-BWHPaBYhq{O$;7s8?r>t;wryJz>)UzW_xwB8^_}0nx@&dSU3d3h zyP$m;Y4j7kl-x^E!l_bzDlZ8uvqZ>4+BFOe%~3BoHqv!MqnJ}&BHoUOMH&`Yms({V z9!AnTMYsvC^?rnCe&(n$ny4u3K@wJP3DUzCO?wtxp|TDY11~&KXbCX4F=v z#}8ZL?6a|}tVbKWvAsD1bL52%R}F>;=YOXNFL;)Mn21Q^9#t(?WS?^js{U!Q)A`&vhyo>qn*T-Cl1AIH=u{CJn)L(8#?s8BWs^rNh_dwk@YD5%7=Yr!_S+p>JxP zABQPgtiye~k@w{>Lom)BwU`V4f=37P-z=S9*zQxE5-TAm@A=z0mOmaAw{|-o&OE+j zub=m79x&Lx6BLH43biM)w=u54`ksp=#KWzfZE`PwG`8Ps={6ha7(kwgD-A;1c_F!T zZoNbV#G#nbQ(-4^R-z>q&b?N^Z}sTl_MDB6S?6_d_j~&k06p@TOpH?GKU(?wACU@0 z7lD=Lc&sEXDH6y?pd(^$6FYMZP!vwcMABu#bk-w~p=-c?07UR|Jk^u;eE&FkASjk@ zK(NvM#TrO?$(%4wCU+NUvltzP_7ekYJM7LuIV+v*hrt8!6-g%I-Wa6v+EgosFk~K} zk+01!K^F^10u)|^q7BbYw4mD_Aa!^I1!tqDnWc~;B$SCa?dO=rg?S0Om_;ycxCmD2 zFN<=6j^&CeX4WD5jl}Hb)-1{vI?rWs347z565|-v%F$x`jMRt8M;R19wpv_!5*+vr-@d*KS?FlPptqCODaV2Py}Ou@5y7-t0;PJ6SeCNr475d_V_ zXi+BQyZPlfjzMB}U6I^zJZ+lAKAU;E1B=^^%>9+?r0;L13!bhAMA==}bIc&J_eN9Ykb71V8teta=y`T=>MU^=xG1h(stwxt?fz zh%#ZO+NLr$tn4_$^rTDKw0I@i%4v{1w^@D9@B6163M}kP4Q|U^N!AcPop6dVg75_z zZ&{_feCQ~wtkG$|Bwmr~;GL}Bfs(bWVifLPT=)JudpPCofQl`KX$MafdEVBXB{Nje z<63`{zY`0XQ`Hdv2U)~^1Co?y#Lf3S`zzuUEh{BX{SMznJsj-aY=rWY!UszcrKqr% zq5AXbL*=3y9;B=#xQGyN#W+J~ZdJm`oPIk;DD7Y7M<=eL{=idP{Ei`=hpAK`+wvTo zj3N*|zD@>wjyL)hj1*GlMRU$Hjzui4UY(34WVN4t=@PFyX1f{N!K9GoWNtw*rvup_ z%712r;d7Vze1e$PGC&#G>9p!H@MLWX{N+Ics%I&H@XZc`Azd69o|TQ)y}B(Y$e&yP zXK>lFUE&J&6--xtBpf@qA`RSk?*xto5n6_kMmAHIP}V6Wb!jm@<4|EPkXD}Z&_YLa zK+xYht32vuO)b;EJ*?VB+v>cvaLnVRL@+K4h% z!tHASWRLN>4rVsa=^59VxY}4*qxTnh+M+hj32tp@d(9|~u8`y`B+Lg)F31MT#2_ew zX;=F@bB5|C82!)Abj0A1_E^>3tx+3OMz|*-mP=Jss=h3{kc02PM9nP(L+e}_j>tmTDfkvJ$9Yt=L zlyIXFhqeGqtqLwtB`FaXZ@r=j_gs0gqdp@$9S#8BNV8tl>LgeiHF$P^5N}tJ{52O* z5g*4k-qSGY{KqVm2*$8$fk`RzF1Qn9{GAk&3av*0B6scYwpBr{3OX>AJQsvsJRJxK z;y^kSCDy!DIE0V^!PV~bVon+hcV$UI9BU5Y7r18e+3>)8ZGdn}Lq=4CA61siA3sjpcU;Mz z==Ty5Oh&dBFT}3v+>lt22-v*CCl+9)YeHue>T7Vb7|wq}Y@HwGuD@I^Kpvz6S)~HT z`wUj>H);!b_^xj#(;^CFszrTN%i_PMpL}0Lg=3!^;P{0)|1H}oRXL&k`5$oAxe!Rj zVivU9OKJ=F13oGk~ zC$LJ(T>;F$rjwiafv2tYSvg7oK^io1jCrg%@M&j_#6YUtgHZ0Aw?;-SzX-*4OE^g6 zK8Mb`eZsnoQJk~3acq>-no*tAms*@8*wXq~UkodBS{>S2xlT^}9@jzJA3B>aK$mH% z5RlAs`R{mj^K!;^|DNrTXhtcanBU0vGPDJ?e9AsnP;TkH2snM3~ zOA~E=yA#)biBC~Cn_PEr_?-* z!eLMxZX=zr06c9bfD&CGQw{z`Ys6n^X#}vkrxUBwvDA^$@N(bgzTaV=5K+blj0CIo zz;F~WYI$A)wo-65z4YE-BqvKI=Nb#Qr~hJoDS&CErd1DpJc8$F;~ge74xrV${4;lU59a{?vNI$kZ7ps1KpiAP?0|J}3* zCE$h%YKONpHq@Vd&i41h2;2|4^>_So9`G3|x&Sk+ujYZ~+V`5E7z2eS?^d>Cvsw|YqNmi%lLIeaa_>0?ByPEs_uv1!Wvb_M78 zR)o?TgCu-M%;+INt)YJlFbWwrK^k{naFc=}*f`S#d9~B>Wt97$yocT~-TnXUHL#Ct zb%{!$5+k1nhX!+ozu+nIt12&?US*mV|2RD;jT?e!oTIztWxreYF3s}2ZU1RpRd11h zp2j(!d|=S59s@Kmk}!(LT9@hXI6jgew2D*a7&}s`<>PpwtmS_}&LbH9Lg~Xa>5X)1 zC9G154Aej!9GXk(6Okxl(1dO-Qq0 zCyIKehf6nBC5$$*3LUDmDiV%ty^UV^Pm7eeR*W661kAaG(V=%D8odQ-s}4UCV}M|y zrcCp6-J}XwTj%iF(UVup2Q9LitN9byd0CSdCbHebw~fU!e?o(@RDiIs7*<%0J-R?} zO}%aljr?THJg1lnd?qiIwk-D#i^axZ;czjfB|Rlwp&i@P{6D`mEEbiEQFE1YnlJ+Y z?Y2-F5z!R>eJn4x`^$U8?~lGtUk0XCae$7E;gDI^6~l@{fI!W-<dsEp0g`Z`t<`&eC>L2v3XEh-BIfqoXV%gOnCz5W+Bz z8n0}|y4)mad-bG(@(VF4Iux$JYACg4{tjy_HVSo629ZVIA8ghyH1PwBO|5@OO@cv~ zRECB0yGeNILZN5msL}$l`hwDbQ%}?F7&(>T)ade@;AwE`m{|vt!3)okQ!VqXNgx2K z=SIQ370S(LNzu*8MMbj+&t+VuR0rsKfFLxnSq8~b9MB^2KxIznqgFV+V#<*20792h zV68A@u|^t^id!*J*rYdrg^Kz#58>YyvGM(53gfSjxg1$iBEK?Ju_1jRRb{n%2FKYk zK#ov;H_OTlia9}>X`>wLz0NB0v*BjRGL^8|=9i}lUpQ-Pk{0BL-=ST+50Bz)qx@z@ z<~};D1qa#s!8XDOJ{m_tH;N1wpcroojf#@kFt3N4SIxJL0ES$0m@5%6JFl#`!r31? zIma`L5$h0O^Rsv-5$GiBmpA!Vl+7lA_nl#yvHz53-|03;8dp-&f_uLh?hr4uCD%>? z8+y8;Mo;u0>X(HqyMdBSA1UV}&N#bj1t`#VW1vgZQNn~}B~OJeixIke)Dvm1{DnV&k=?X2gDxc zUm~~?VXp-KaPYsn{@?2wPeNiVS%#v^^_8^dIMz9>RVuNyLPZC2Z#-OCA5`;|96DKk}xzZ5y7xD08M-(bv zV_-AiXs7pXpcFr0IVcNrXsI5};rHG6LtRto`fU|^w=1thV=Bt1}g{7~ee&fU+{)^TohCq}LTV$Y;jDzt`{WeuvfnIvb1Hh;u$<*Xr)uZ4D0SBJ1W&(Mc%Tz_X34Tj z?Kxe`(Z56`H>qcKIsYKkhm0|S)8Cczq8{l9h?NfWVX--m z>!5J21%LlOh?z(=zc(SZ;vq9CB)^cl!?J}W)+)RtoKssYe93%#EuqEe+$+W4YnD{Y z65ef~PpVrB@>HpXf(Z#=VtwN_KT^`grzIUz^xw2>*q|Pe?G!VhO9Cl=m8fu#qu`}E zvA*d!#v!%8G{>WviwD{n*ddA+L}R*04Ai1yhO8wWGF%gqt^sd@)b{a91UMv6L~z>Q zho>2fjrf=asDOgOY?RjkTAC)n-|tDXKt4{an8d{(5G$2z;>}yJjlvLeJ1C!R36WqD z0bT|Ttr+Pr>qmvZ>%knUq1skAw;b;ayYv)_;Pws~7UeNA0WT}n=pA?irlQZf=<-WI zPMUcp;d|0N79ToAwzB)F^gP}DET3YhBt=LFf*s?TN>!fi>`2E)Vr`fzD+A=41X)_1 zG6qJn=j93(_M_0?!Z40h8@9?t;JK`)e{6KA4GbPq0ianVIu!<<%$hJoG@9NO$b&=v z`62;GN@q(s<^6tU=Lvc%(*Wt!uOJ$pwm;4GmtVW@#RTpiOWv|0z(G8)4CUNfO^l8; zTuXFl^{-+*5yf0S1_rZM$T|w9#4W7~^CFKbX%F}M1C_|uQ?P%Y{1+uHhw0~z5%j>N zDHX0>5=ze@^ro7TxaQ;${A~%6ADiv~TfeUWNxyPVraAmCr-RTV%*=R%UA5@z@Q^Cn zr;#iWRdWV@3b(~8UH7&DU?$|to|2?ty`;5@225hrAJ$Ub5i$Tyl>!CXU}VAm)!vZG zwqBCqy&9SUflFg1UHMHq8*MNTp+VYeG@m3*F3g`KgZ}#jsE=|gEQ<|Opjih6akMQ> z+MoYT(ixqw?yL?2&l&mAPPy_1=Y zNsS$#n9ED3&rGH)HfiPfZDn#&lK`ljIa+;SkF7~ZXZt*{1#;!T@s51-yLuJj>&?!0 ziqBui33i5vF;;~vs;6q=LK=ig_XMU*^>#bsb8I7!WFT0j0_9X+sZ@X+8f1OPDZkP` zO{#JH`o3nm@=})RWBlGJJ*-CL4bM~}Qr8i&$I{{jULtx4egX4^!kiaZ=c1&fL|gL; zxdXR2SBeas%TCdC`JG-lg16>2o=}zy_04>c536tp#f%3-aE(G3B z@nLnuk6pzG8*e+i-0xp#9#3auJ&sncR>7r-=$7A47i6y&lu>3a{{>S_|JTw|>D@wA za8+g22U)U&h^Bg1O_Dz?mCFtBX}kMJ=GV^w#!MssDMV3NRU;ZD$7lv$Zl)3>WpU(? zIa>HSsKluFNe`3q6M`;Pu-Gby%ireZ;_tJZ{EE!W8?*>u_JguM&%opp!kk_Et*EV- zVten`X}f0Fbm;2U@a0lwYcO8;nZj;R^2?s!M)p9E$8NceJG4k7@T{!e;$}S0>*oq#;jv4y>VB8 zCUAKr)jH2FE-2G|Po%4zDQWK!R|RKG8Om;la z@+?eu{TWcX<0@iK*S`=zx>~o8++ru+X`-Ivq`d-W{S*FnbxPErw!M95Iq$XzsHw&^hSfU#H`p%FQ|It{cXLw3741RxOSW=upMXXHG_-X880STyWv2Wz=Ksjmq1C$~{- zsyVitRR|}yGT?tQb2@bvZ)?ZebiK;+`9fNFsF`uCC&6X06ZB>EvaFC*wYS{EKXL<6 zw@E@#1jz&I^Tg#JMzWQfG9pnHGg^sH9!|btw;4T%PH+99YuD<(Vk?(m-bPX-CdA^OE++bW9?Y$N->?1B7 z#3Rr-swavKcsLzR&zX~$TceXItFhx}Nv5?s4sv4KYM`Y3(^X}?DVj=F(;3^+*AkX@a_)vM%E?RKpllyeLVuADE8ncYL(2H(snk7Y1d%e*-Tcsy!xY&EqwRnpWo{8aVPfh31BrtSQ~(hWwE zqdTHTUw!ctW#}0WOoE#tvT;FG6w`Vvc8Jmiaroxp^UVt|NB*my@Sz)itc@i3(yAsR zDkGZGd1cC=tbYg-QYTA7_W!X?md={p`Y@{3Ru##93dC~y$*ZZM_0F<(U$;KOS_Fu@)<1x@ z5i1_u{`lyhHDswy3gqXMcfU8`aJFQ68S;#H%jXv|NfS4h8u@!3HMvut&*!U+D}92= z@~!HNQ!@wq5QSy=posbXKQ%t~<_+}QuAOV|hjtlb=O=wv-|#w)%}V*(o1Ch3i6)BX z@a8B8Wpf0kU0=3uVlr#Ke`g9IJgg`{cue+NGkaQHxJn_rZWaWovAI-K=4Pl$<$ zp&oLat$$Uy?8sqd!348_aHfth{S6v%X+u=Gxs7{Xv3dy8w>vp`$))D<$UN0)FmYtf zRrY}@Vxune=hBr$r{a|FZuWE=4BFlwgc3a*0UhJL?xFs} z0t;Y?e0Ct^(sfpShU8H5H`};LcdP7C!}d5tq3j5{`QVS5o0?O5x9&iK)m8D)ly`6k z9lfK^dx@=g`Q2I5$J4t(Uim5I#^>InPr^cxcKnVo>Xq$YglX3Y>H{MKm&(!3(^}p0 zhEVEMxmev_GW9#&ejYhHZSC8_(H-V<@@JJrpN|46E*dmKfUOwH!_sSmI$`$5pJu3M zg?q9I4KLTKqnVCBD{32bu1`~HS4fEEGFgkr>+kN4hvQ(@wX^C&dA5Bz1S5?I$a`J|m$;RO+P5l^No0Ln=TdRpNdPLNnCZu+= zp$vYK4M#D5r{e>T@xp@4dEALDdxZPv-+#I;Bsvpia@Mc+yri7ljoeprHBD}f=li;q zSyRRErHw=~$gVyOd=}cHRp!m>UM;XE;;EvUl`7YnEfr3T%YZ_Xc^jO1-eeZn7LJ0m_1l>LkrM5Yp-&1hE%FKFRt5ad zrkiG+@Fy=bM8&uTK>~p3)Q3rlqS~yN7FlnmWm9M0V;aq`1Qc1)vcU$KQ*WRlFMa#r z{oDRX)&{3 z+gv$xJL|6*OtSLJ6xW(H0o%G9Gu*LA#)*e)J`eT`TH5i!OSQYr?bV&RA!N4@zHQ9x zs-voa)(OA5?QFB5mR#u+;Tx<(PEh{_tmgh-b`!&!MDtzeJ;?W9z#h_I9;bsQ-kqY1y($hnq5x7!<#I?bcVI2xaSS+BlbdqWtR;~GB)~wB_@Us=3=1!T7 z+Qzu7yBx;Viu5x-TFR;79lkZK{NXsJW1}`FXV2hnTo@hEsc28$sydj7WfwRA$hdAn zK}qKT*a>K!VCa$%vI}8Nwuu@f*Gcgaf^lFG_R?65eRn!u3a78L#jp~<3Ob-MMSV+P z2}JGURYpme0%n%eLzl!w6jGgpyV&qD8&j9zP9-9OMP%3aVfr-?Fq-@=_?(z$MnYLo zKFfM6Y~=bga)s2wf!RpFg8%E!J2TCH|Bd5oh|;4#&TU61<~q?FA>QpsGYN12noMRS zSxX}F_?(pm6Z>bh*uwqy;(~;v1t=m5=sM=>75x#K#7A$*<+`-Ykd{@ zoa%XLs{R|=Ns5U31}n5IEGm{x93>a)uc(cI1t8Rij4A$SD8Pr8l9b)r zlNwJBdcZGelpPR?XJ7IU99f2+2rx7rKdG*AQl++q_dRqmjDLKEZY0XYA#@fQcCSRb z%6M3c8;ZUk0*-CLXHsmNloCJxmzdYZiNOvZ&4hjBzX7Q8-*4{rfp}urSJY zc3G2W(OJDCMOdbS2wxR#B(t|tC&8?UI{*m6w8s);rCic}s)IZtdL6Y7i-66U-79^! zo3I_Df8?VM)6KHx^*1%$%*SfM zj$#=oBIebR{v=46G?FAW6ADTbUKN~o5>XAN3qXsEXM{;!ht6d?YO))&o=aOF4Zo`P zgF1MQI*Cl7*PVuiK%Q@*px+L^-u8DKB+&p1(J>flpkxYMzgpNIk>phkgkq&dw)I_j!p&Lk~qbn}FSKEwH%(G-NDV^-QicPkNVNb_+ zsDhrNY!n*ColgD7QOz+QNn2a6v?P)2%Q%rzVznZ@p&>;arBZMG8AnF>E12h0TA_)sa+aoa0$UQZee=`)D}IIsBB4()-D0p^uN ztQBiHjWe6Aey3Isos{9is4zP<&*gmyG!D_{vE8N3Q{QDnQpbMGO-{HVV%&f7xLce& zm)UjhD!sp0eM#)XC{G?al?zlA35K5;sg@ZRv0#^GMQDoy5oWK%C5u%|CIkL=3|=A= zT04Lrb_REf?KU>pNBRzO-UX3zMU` zm44p=G+0C`kHg%2ozX}?YsCgp+>dMrF`DEzxsUL^Ca}bT%BM+ zK)!Bs|Mz>|pHUDHn*aZLs46Ow|Bn|vuMJ0C9>>Fu9RC@oI{Y2_oll7w5s4~oW4Hc# z^L#)W{1!K>U!W>cSxF^bqqv)Q><0Bs(AEG`byam(yl5OoX>aTiL8ccbQ8ca=6vRgYlXah;wTyzQRP6B%6PT&^yiUN@3QnZ&er!#J_jhL5gwLtVXQ zZqGypo=~`a9n0BWX6tW<8FO9Vd7dBCyx!U(>gvEF6Bx;6p9l2!H|>ZFbpM_iM?fXb zfl7BnFd7H1M?y;L8j&WzK2OiL4I&{{j3zrw-Otk$2;nL|w@k*!{rS7m<@tJ?Fl5)> z@vXh*;^po61#`=yw`@pS&vtjUj%&4)c;U~>KCzGI%lZDub5WMPLB*rJLg(7W?;W5Hs7ZfC{q!u07(}k`0I8KbzAQpAZyt+ z&-cl0x0~`W-R~D(omySk#vPVACuzuCwo6RIW9A!# z9v&$hm6cDcYCf$yRw3qM)mMxUOjAv}22;O%Uc6C8k(6H6p_C46#l0hix>xV?xP4DRW~dl_HtPd~ zq`g1*cX|CwgXV9%7Qt2(2VD}F?iz_H*ARHWem{YUb|YN>_z=1*HzG<{J3FQ5_OBBf z@yU<-DDl&fEoDzImW>$x;cG125=Vv|O=QIms!IpUj1OJNth2|XT9p#(0Wp;5*p|S>Cq>nJsv z{i%cX*_%x(rB%{WONJ2t4SU3xoVzITJJckkabR*{Kl(ttP(vIT45dF6En}IB%Vs7NR;jDbr4B)uH!s56SGywgSFG|(Tt6M zHUzGdb5l(i1Mu|vy8;ocPMDyFJ5h0p)9)yFI2hu)B!0=B9&w6m*alD$NZp3G`IfPh z92NYG-(Ec>^XB(8o_)&-dZqfN2BJMvw*coT3nyvJk+&jTADRP{IlsB8R$v1%Q+C|K z`AttL@YuRny$(aTJ+uS*mn^NDdX2Ir!mK64Qhea_GCRaW%YccqB+w@Q#>$8lPH9hQ1}JuZd{-%i-6%v9*_;LiZo+s^b%|3ZphyasL_2S_eLb zMlTMnQ&H8=hDF#YPm;n@Nl91u5|uz@lrSGc@!$`p;tOAhWiNIi3`IFgLGn+Di0eC4 zf`n-Mif}b7KMaju^b{=AQrSI)W`MV*g=w-q50Ihy`z8c(%7w~^kmvS%Q(gBRcupu4 z!am}v6k)?lY2K= z+<=Ot8YXF2vm_sJ4+~)Z+_*wMIMJMMd<)KiBu`F0Zv+V)UpufV5@@o^Q^4_kSY9Gk z$3I$G2Oh9;<#`kc6`?mW$V-!yAq02kvEVvZqoIcgOZSwkG9+Yk&9t%PQLcqNjFngg-JDWI{> zk7x!IAou|wDal2M&LezW5k)uMh=gof8YCJi}N?iSl8 z>R~x~OYbpjK%j^c+AVPdEh!SAn(->lhiHPa$Nd^?DdR~M_ho$Kl~gvPLz5W6X0oFO zfHJUlarzt2HV?{4jf<8L)$LDYOMyu|$J}q4(69dQ;2(PS$_i-$xezambI}3VJk_6r z@%&b*W8+N-+o{f7A}8N4y{gh8SSy*~6KPBPl4jKRZ&=-#d|+EBq%)=j5?Zqia-vk}eihDLw|^5jwL+$S7LrBSRV$ModuO1M*FxW+ zPAGh*b(nANKP;3>k-~ADJGsRRq@(_TmviOBF1De<1QtpH?)AW$$fds1XJp!QidgzK zR!QSYGP{mlnulDF+iWFjIkt+jE1Gi ze(-`4lP1YS@l~g#z?5N+I5)@pLIm3+`OEBMLwTpvtl&eEuhVP^+tNOE+J9Dma-}K^ z1TE}L;>N4^m#Ljx9o|?^S5VGqbOl`a#eJ3+PtLF%wR2l1Xg?o(2PNJ3e&$f@cKJWU zMat2-2d7ItkuH(l=U|9{0!R>~XU#PGzaVOLmFcyG4P9C%OkEFCLLo)XxnMDZ`XY9y z15~1R$Y4<*zJ(yW`tNv}jK36dxyp;`sL!pEA3&7SDjY0MOJkyxCv#gl2kEN%gX_6Q zJMWnOJ_Y$g3-hYsj2~Hn$B%7NR8q|`EEV`b)41RKKsxd;-@>g9E_>zoAs3;`V=n3s zikRq)|Ht}3)Xj3@Ew<&%^wjebyj{;qLRz>4-ryiQP)7eBxRqNns>y7ymZ@ggia}a< zcLszpDKohnz2jW+fnIu>d}<_v8i?4)A7e>c>aWP)KpJwpN9HmD6K(nIE>8OoC!e{9 zzl+=jB`+8&h(T(SJt#TN91ked(`vTDVrQU-v-Gh*N{}L3T`wvsOOu3Y_siZJQ-wVB z#|_uJ{9OeJ{Ry4Nm54IBsB&$!F;#f5XU6r3lnKs*ER{{*kG-Uyu= z<*Q=Nl;=t_kfFkx^)id}Cyg_i3&z^W@^n^tiIw_+TUPpHwDgo(@h&3 zB&#P07_&Sjm!%6xtyh~|{o6;qb_ zKEQbRoOOYlhzPdzDlVq%O#6qmy9^|zn*K-o)YQU5w@nXNdUd$Z-pX{mg6ooUxTnGv zHNC6R7T1Snubx+dy%oqDypB=Y&4twkYG|Fe zIkS$>n_ZhOZ?DF~izx7cOMZ=;7wht_b^*EbJ0-(zZV~;PFu|0|oAZmJ_VsN0NhVhT zBlnig>nQ)CoWy}LVK$Q&A!Xs}T06!4s$+V*s3oZ3xg4g&s@Ijk^7}(vdmk?)c?wYHAUN1O*9xNJo zwkbrsUue^1B;JSIYQvAcC^puE2wsEH;7=9bX}-NNr@{67L|Aym`I|i|Rkf#S`+^&3 z?(?<*?X`J-r-X?V%3Roc1|mKuNa9R~fn}st7>)L4W=d@~K9Jy*q7Zzp>N}#vg~rEH z8l<=ln-dm_nJ`s6h7RxjKvn0BwkMi!eW$oJY{pBHso&qr6o^FaG-MClkMFR$fNF4l zR&%szT5}ogfRXn(&UjD}Nn9&9?UiJD_tzw9KU7qrcnEK%*8YpS6zq)mggcEY_qsE0 zCu3^0NNpTtaQtQsvQ==agj|eL2{@g``*JEzE`ZL3=#O{4i7k;9e^ zq=J@JwJL2mOx1<=4B~UAb#*^vQRz_$Go*l)7bn~Yd+CK7xtG0`7mq>d=F;L*&Du^+ z$4rnC1M?SRmPhcpPk|i!Nhsj}<>16$sMRg@v&c!l@gmiuxPbV3{)SHlk-ku?;7I3U zTJZvKmhxE2kit_y?5_dPG^=iG<7r4aq6Hs`kc_^~A_Gfj9N>ZleNLY5`;>P2*AMC; z)|0K7r9!!8fTt$RSVXWf8WeMq*3F`=iI(-~q3UAz8mW2Xf!!n4_f z?Dn>c{l_Cs``9q_;@&)ic1)VK2#x%VrDC*^ ztuD8_l=5X--ld2sv$5{I7iJ7IvF94 zUg>^|&Yxh)u2L>^-I1HWV6S_T4F!Vfn_rcYhG&|qRDY~3coVTerpRD=h5;G<|YXjbk*bv#g{BbQd@6bwaZ=$z*RFYDT(B^@I7< zT_C`suC}KT8rMV=^A4Ya9iZm|8BVpJ&{U@U5k&VE%aDXolQcqQbjchV*lgGb{qxEa z#aiQCemDf@zZs(6YvVOw+hgK2)ouhCv=ntIBPH`)xK~#Dvd9ZV{vsC-Z%vWRR6ta6 zAhQgI(j9VzI>_r7Gr$}q;x&i`uNx892n`X`$}LSHX7`bJo60HYC>{C=&5r^KiP?q4 zRc{Of-fk!_pNxNeZd_iJYqW1wjuk^gDA#Jj+PDzucI{Ffkbts7puZk+F)ob)(<3(b zM>S~HHjp<~r|qVc;Yt-Yf4sfZgb<+^N@nFKt>{^Kxu&QGxODoYuXh2ed_^a4Cx}d zDKYG2UwWq#pc+PY8)(d>zTg3)rWl0l#Bh)CPl^esRw+9*Ykiq!duNz z9wEOH?&d*Ecs;imfEonkug50YCa{#k{?E9|Q*wmAD65V@g{m6(d>3EwtW~@cKs(E( z_!MH5!0#2Zfwp5!(LZFhI3-IQQBx*xH%sl^!an-&+w39CI#Y>ULKJQ5!_?n;#SoH~ zt6$=+%7YSfHh12&mf8PDf&<+`e_uZ9*5_)_<#8j+kl0fsEWQ zP|RH|kzJ;2KPVLA4e_pIUjHXvtWJ>y%^r>7C(e6#E5(8JMToSya*Jx2W$j6sRPD4w zvw>np1J;G|H^VrS#CfVm(59RdkfhbDK-}U?S90CFmINM|64}15 zu@!NgrG@vM^d~Wgd(FnEOqW4d>$9!8p?VE2e5Zna%P6Z&e!mNLsbUGLJ;9NC17Lya zs&h;7<_AN|!O))8%kNKPBZCtUK|3o=Y?Y-qQYhZ7UnK4s9rQ(9}6_thpH(L3S? z(M^%_xXU9He4Y9VcEp9!S*f`A(GXQ&xj^n1eTjub_D9K2r(wdHYI{;i)7?N+D+Awp z=3dSEC`!$qSTo@0qf_X{@}ajK#r`bQP}JYoyd&ithn_^Ru*;bAHO;os$7D~49(pJR z7L5Vn$B47{@XNZ&_iqdjRGdks^%IuYen8@etYyb86)t80 zF(j!Xj#2NU#&WszwG{D2evY@X%v8nxn8x$Ci2Sqf1V;FI*2=sl7PN!jZ>bb$gsg$8 zw5K@r>dy1qhaaF`g`Yh84`~&J@d!Ni-sAcPun&~rVq2msl$2cNg2X4@NHr}6tSK(O zxvxu+@7~*q$`I^0Y)9&z{QRB7hL>?4N3p>A7E4S$L9>6)sBO8sJFDeVJH~n}Fps`= zUKeW15kg|B39n^Uvx=kLd*~gz4*ovXt7AjU`AF{PWZ*8bA(4F3 zt?W;QmabWmGqX;63zU`jfyB+dAl53mHXT8*YNAN;sV7YnfUgNj^(g$*+DD?W?9cFqyCp4~_ZF`H zt;e=1^{h}5E!OZg{;E}k&(0d>l*+Ml3(3POqb?>E;xV_D#_nZ~Q2?!{5~`J9wIDe8IEIjZl|mD~ zi>XG6ylIrVFb3V4W7;azPBSLxpUNv@lGv(o05#(=F8}K7yq{S|4^-do{zN$yrhw@A zw-`S{6ex&tLaB`@ed3C~zjJ>u`90Shi4};una6l7RC%SQ6s7qgR7;^1m(jm1{Fq?3 z8-i+%9<7=Uf&BYQAB<#}YPy=|V~G2z^-Eu7AtU`4G&RrsK7Z*&KH^L2IdbDGOt6;O zGQk6z9BSb|Y@hOIijoIw8OO#+rF%*O9pW+03TM~H99g0sW|^Q_rg{x+zf1g8T{3u8 z&mdoI>u=*Mr^Y|!b&}Li`{eWEgtuwx0ni3{K)-Xm1D^{TI-p{ z@p#;xIPTO(e)%G0xc>|EeTVb_zH7@S2-}K6|WUQ5xiHY4#n+QtD<*fa);aymTt< zhh6;ns3E`%j^YR&!!HZENh5%5Z^F2DgQuudXXxDBKwW)M72yjkj5EK zw`kp7`TP;)&)_0ga!H!;^4Hs8?b5H1ilK}aytIsm#N6YSX<+JXfkd&5@%bAX$tx$# z*VRm|zI;6ENeR{%nAxjFO`aMqm~1s|^hiMg7q3%=rERV}5PT1fNCnKJ7FGH8BgOcw zJ9E{q*U+>38fvF0$rRwgiHd2f$|15I(g~?@IM+ytW}TN$e;*wM{r@O?#~?|*pwWBB zJGORgTRZmb*wbU%o*mn^Z5unbZEMH2b$kEM^W}|rBW~P??oVBvm6azmtLkK)^8-gc zDi;$U6qzaderKt;7F&Z zLM4(WAxqHy*T#Qi(-dYYu?R`_1h0sdUQ1|VMlE8X|Kfdl^Y03{O`)R{I|WLI9uU32 z_GfI{P=w6bmUcFcD3CVvkAUYNW(-RoR0P3%MaHQjIA*}b6cP^0fDXtTrJrpl3I3-5 zf4dQ-abWOhr>2z@F1lX*Vr!~O_N8H-cR1Pvp)I%l{NP*oWAsNzkT~xy!`(!Yu<$Y-!YG}(*F;b$90E) zm`6`uZ!^S+E?%pX1|S*CpmPExjc}Y>Yaecaup}G>)tlj#mM)|y5 zw9MMNJMr*(5($522z1XwyT-A*ecNaC_8%Qp;pWn0VsUk3=lvA7za6g8`3wmN;P;}` z{dze+He-(pcno901HLu>mZQ+k$%-0ZR%1FX2UR0L)64x{W&$k;-LIS10IR>W=w{jw zE#@Y9lQ?}b#;U^wJH;zv(j<(rN6VjcwmdBGA z|G^#b9sFZccdLWf)r+TWcphLvzoQ^wezo9cca^ny`4`mH*1Uf= zL8Kf)v`>aSr+7C($IH#;dUsz&z)z}+D}s{Y?&$G{UtdQ)pFTJHdY)s`U(;XjU#-h~ z0ZNyDZo^x;PUg*VzDSy=va&gN!@EC@Djq4W_GV{$_n+?xXM1OV7L(X`@*EKP@KfFh z^N?oCWqrKHFv$g|{teXk=pnW8u{F%fnmLFeFcJBT*^}VovOLai+B4moPY6h8a1#3B zv7Fys9&*k!CGfn>5mQY_n@ROZ!+*ypng7Yj`!dZ_chZ~4CwmgOo^_3N<8+hS9mT+B z$Wx|-pJoEwCbIvjgyP6Hy5wNTFf%*)#K`G7{K&Z?=C0{y4iBCP{-3!-4(caoPtM`# zgpa7X-qGj8AI2I4!wChCRqxt+BVKqpGIy0%`;vH&-SP~ zUyfFv4Z&DCUe;lGQ5*xbTx#vReT=oHFpAr!VaZ?TCOX|;T5xK-r3lOwUHg2pCRPv( z&BPKorwW|DbE1O~oqkh{_r>b`wi_fbw2xHvak?{jNbs19`F8){nm#>Lv26LcO!N5j z4fgJ%#^-1B0eVCA>Ol9`qi)yhpvpyq(hnoJ?;{P6wyD|}QGnV5S z1-Hxh{FE#|i5qGNe185pf0biM?rzS{K;-xNx){$Mr9JUk@_yXC+je`{wVj^3u$4o} zdcqbwpahW`K~h5ZWsap&h{&9Hwe@*A946TA;NF?^xSl+|DhO!JdtEZ9?mb>3d3?6rrCW_PL{!F_dwAU4n(DHCqb{Y#V4K!QALuWe3;Nmr+b0_ z<9@sXk)njvxXSp0Yku`&m?Fyj%eB2`@k*y)eXxa&41ie56}s49&^geSdW#

Fwz> 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 S-0Pi=d;zHe01YAq`RhMFWq_{$ literal 0 HcmV?d00001 diff --git a/data/angle_monitoring/angle_monitoring_crac.json b/data/angle_monitoring/angle_monitoring_crac.json new file mode 100644 index 0000000..e44555d --- /dev/null +++ b/data/angle_monitoring/angle_monitoring_crac.json @@ -0,0 +1,87 @@ +{ + "type" : "CRAC", + "version" : "2.8", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "complex_case", + "name" : "complex_case", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "auto", + "kind" : "AUTO" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "Co-1", + "name" : "Co-1-name", + "networkElementsIds" : [ "_ffbabc27-1ccd-4fdc-b037-e341706c8d29" ] + }, { + "id" : "Co-2", + "name" : "Co-2-name", + "networkElementsIds" : [ "_b18cd1aa-7808-49b9-a7cf-605eaf07b006 + _e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc" ] + } ], + "flowCnecs" : [ ], + "angleCnecs" : [ { + "id" : "AngleCnec1", + "name" : "AngleCnec1-name", + "exportingNetworkElementId" : "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", + "importingNetworkElementId" : "_d77b61ef-61aa-4b22-95f6-b56ca080788d", + "operator" : null, + "border" : "", + "instant" : "curative", + "contingencyId" : "Co-1", + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "degree", + "max" : 3.0 + } ] + }, { + "id" : "AngleCnec2", + "name" : "AngleCnec2-name", + "exportingNetworkElementId" : "_b7998ae6-0cc6-4dfe-8fec-0b549b07b6c3", + "importingNetworkElementId" : "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", + "operator" : null, + "border" : "", + "instant" : "curative", + "contingencyId" : "Co-2", + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "degree", + "max" : 47.0 + } ] + } ], + "voltageCnecs" : [ ], + "pstRangeActions" : [ ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "RA-1", + "name" : "Decrease Generation and open line", + "operator" : "RA", + "onConstraintUsageRules" : [ { + "instant" : "curative", + "cnecId" : "AngleCnec1", + "usageMethod" : "available" + } ], + "generatorActions" : [ { + "networkElementId" : "_1dc9afba-23b5-41a0-8540-b479ed8baf4b", + "activePowerValue" : 0.0 + }, { + "networkElementId" : "_550ebe0d-f2b2-48c1-991f-cebea43a21aa", + "activePowerValue" : 10.0 + } ] + } ] +} \ No newline at end of file diff --git a/data/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json b/data/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json new file mode 100644 index 0000000..e2f54c9 --- /dev/null +++ b/data/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json @@ -0,0 +1,72 @@ +{ + "type" : "CRAC", + "version" : "2.8", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "simple_case_with_injectionRa", + "name" : "simple_case_with_injectionRa", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "auto", + "kind" : "AUTO" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "coL1", + "name" : "coL1", + "networkElementsIds" : [ "L1" ] + }, { + "id" : "coL1L2", + "name" : "coL1L2", + "networkElementsIds" : [ "L1", "L2" ] + }, { + "id" : "coL2", + "name" : "coL2", + "networkElementsIds" : [ "L2" ] + } ], + "flowCnecs" : [ ], + "angleCnecs" : [ { + "id" : "acCur1", + "name" : "acCur1", + "exportingNetworkElementId" : "VL2", + "importingNetworkElementId" : "VL1", + "operator" : null, + "border" : "", + "instant" : "curative", + "contingencyId" : "coL1", + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "degree", + "min" : -6.0 + } ] + } ], + "voltageCnecs" : [ ], + "pstRangeActions" : [ ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "Injection L1 - 2", + "name" : "Injection L1 - 2", + "operator" : null, + "onConstraintUsageRules" : [ { + "instant" : "curative", + "cnecId" : "acCur1", + "usageMethod" : "available" + } ], + "loadActions" : [ { + "networkElementId" : "LD2", + "activePowerValue" : 50.0 + } ] + } ] +} \ No newline at end of file diff --git a/data/angle_monitoring/angle_monitoring_simple_case_with_topo.json b/data/angle_monitoring/angle_monitoring_simple_case_with_topo.json new file mode 100644 index 0000000..338da26 --- /dev/null +++ b/data/angle_monitoring/angle_monitoring_simple_case_with_topo.json @@ -0,0 +1,72 @@ +{ + "type" : "CRAC", + "version" : "2.8", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "simple_case_with_topo", + "name" : "simple_case_with_topo", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "auto", + "kind" : "AUTO" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "coL1", + "name" : "coL1", + "networkElementsIds" : [ "L1" ] + }, { + "id" : "coL1L2", + "name" : "coL1L2", + "networkElementsIds" : [ "L1", "L2" ] + }, { + "id" : "coL2", + "name" : "coL2", + "networkElementsIds" : [ "L2" ] + } ], + "flowCnecs" : [ ], + "angleCnecs" : [ { + "id" : "acCur1", + "name" : "acCur1", + "exportingNetworkElementId" : "VL2", + "importingNetworkElementId" : "VL1", + "operator" : null, + "border" : "", + "instant" : "curative", + "contingencyId" : "coL1", + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "degree", + "min" : -3.0 + } ] + } ], + "voltageCnecs" : [ ], + "pstRangeActions" : [ ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "Open L1 - 2", + "name" : "Open L1 - 2", + "operator" : null, + "onConstraintUsageRules" : [ { + "instant" : "curative", + "cnecId" : "acCur1", + "usageMethod" : "available" + } ], + "terminalsConnectionActions" : [ { + "networkElementId" : "L1", + "actionType" : "open" + } ] + } ] +} \ No newline at end of file diff --git a/data/angle_monitoring/network.xiidm b/data/angle_monitoring/network.xiidm new file mode 100644 index 0000000..cde6542 --- /dev/null +++ b/data/angle_monitoring/network.xiidm @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/angle_monitoring/rao_glsk.xml b/data/angle_monitoring/rao_glsk.xml new file mode 100644 index 0000000..a070ed6 --- /dev/null +++ b/data/angle_monitoring/rao_glsk.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/open_rao.ipynb b/open_rao.ipynb index 8d3cf20..c5f6391 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -20,8 +20,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:44.587970Z", - "start_time": "2025-07-30T08:35:43.517910Z" + "end_time": "2025-08-20T08:44:47.528196Z", + "start_time": "2025-08-20T08:44:39.151724Z" } }, "source": "pip install pypowsybl==1.12.0", @@ -30,28 +30,26 @@ "name": "stdout", "output_type": "stream", "text": [ - "Looking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\r\n", - "Requirement already satisfied: pypowsybl==1.12.0 in ./venv/lib/python3.11/site-packages (1.12.0)\r\n", - "Requirement already satisfied: pandas>=2.2.3 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (2.2.3)\r\n", - "Requirement already satisfied: networkx in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.5)\r\n", - "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.16.0)\r\n", - "Requirement already satisfied: tzdata>=2022.7 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", - "Requirement already satisfied: numpy>=1.23.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.2.6)\r\n", - "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.9.0.post0)\r\n", - "Requirement already satisfied: wcwidth in ./venv/lib/python3.11/site-packages (from prettytable>=2.0.0->pypowsybl==1.12.0) (0.2.13)\r\n", - "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.3->pypowsybl==1.12.0) (1.17.0)\r\n", - "Note: you may need to restart the kernel to use updated packages.\n" + "\u001B[33mWARNING: Ignoring invalid distribution -ypowsybl (/home/demontmorillongod/Workspace/POWSYBL/pypowsybl-notebooks/venv/lib/python3.11/site-packages)\u001B[0m\u001B[33m\r\n", + "\u001B[0mLooking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\r\n", + "\u001B[33mWARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", + "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", + "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", + "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", + "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", + "\u001B[0m\u001B[31mERROR: Could not find a version that satisfies the requirement pypowsybl==1.12.0 (from versions: none)\u001B[0m\u001B[31m\r\n", + "\u001B[0m\u001B[31mERROR: No matching distribution found for pypowsybl==1.12.0\u001B[0m\u001B[31m\r\n", + "\u001B[0mNote: you may need to restart the kernel to use updated packages.\n" ] } ], - "execution_count": 1 + "execution_count": 3 }, { "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.049299Z", + "end_time": "2025-08-20T08:39:28.441466623Z", "start_time": "2025-07-30T08:35:44.614619Z" } }, @@ -913,58 +911,24 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-07-30T08:43:58.334641Z", - "start_time": "2025-07-30T08:43:58.318964Z" + "end_time": "2025-08-20T08:39:28.445561250Z", + "start_time": "2025-08-20T08:30:44.894481Z" } }, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-07-30 10:43:58,321 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,322 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,322 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,322 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,323 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,323 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,323 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,324 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,324 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,324 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,324 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,325 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,325 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,325 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,325 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,326 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,326 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:43:58,326 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-07-30 10:43:58,326 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-07-30 10:43:58,326 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-07-30 10:43:58,327 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-07-30 10:43:58,332 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-07-30 10:43:58,333 - ERROR - null \n", - " java.lang.NullPointerException\n", - "\tat com.powsybl.openrao.searchtreerao.commons.objectivefunction.InitialSensitivityAnalysisObjectiveFunctionCreator.getVirtualCostEvaluators(InitialSensitivityAnalysisObjectiveFunctionCreator.java:38)\n", - "\tat com.powsybl.openrao.searchtreerao.commons.objectivefunction.AbstractObjectiveFunctionCreator.create(AbstractObjectiveFunctionCreator.java:53)\n", - "\tat com.powsybl.openrao.searchtreerao.commons.objectivefunction.ObjectiveFunction.buildForInitialSensitivityComputation(ObjectiveFunction.java:50)\n", - "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.PrePerimeterSensitivityAnalysis.runInitialSensitivityAnalysis(PrePerimeterSensitivityAnalysis.java:62)\n", - "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.PrePerimeterSensitivityAnalysis.runInitialSensitivityAnalysis(PrePerimeterSensitivityAnalysis.java:48)\n", - "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.CastorFullOptimization.run(CastorFullOptimization.java:93)\n", - "\tat com.powsybl.openrao.searchtreerao.castor.algorithm.Castor.run(Castor.java:78)\n", - "\tat com.powsybl.openrao.raoapi.Rao$Runner.run(Rao.java:95)\n", - "\tat com.powsybl.openrao.raoapi.Rao$Runner.run(Rao.java:108)\n", - "\tat com.powsybl.openrao.raoapi.Rao.run(Rao.java:205)\n", - "\tat com.powsybl.python.rao.RaoContext.run(RaoContext.java:53)\n", - "\tat com.powsybl.python.rao.RaoCFunctions.lambda$runRao$6(RaoCFunctions.java:136)\n", - "\tat com.powsybl.python.commons.Util.doCatch(Util.java:144)\n", - "\tat com.powsybl.python.rao.RaoCFunctions.runRao(RaoCFunctions.java:132)\n", - "\n" + "ename": "NameError", + "evalue": "name 'pp' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mNameError\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[1]\u001B[39m\u001B[32m, line 2\u001B[39m\n\u001B[32m 1\u001B[39m \u001B[38;5;66;03m# prepare inputs\u001B[39;00m\n\u001B[32m----> \u001B[39m\u001B[32m2\u001B[39m n12 = \u001B[43mpp\u001B[49m.network.load(\u001B[33m'\u001B[39m\u001B[33m./data/rao/12_node_network_redispatching.uct\u001B[39m\u001B[33m'\u001B[39m)\n\u001B[32m 3\u001B[39m rao_runner = pp.rao.create_rao()\n\u001B[32m 4\u001B[39m rao_runner.set_crac_file_source(n12, \u001B[33m\"\u001B[39m\u001B[33m./data/rao/N-1_case_crac_curative_redispatching.json\u001B[39m\u001B[33m\"\u001B[39m)\n", + "\u001B[31mNameError\u001B[39m: name 'pp' is not defined" ] } ], - "execution_count": 19 + "execution_count": 1 }, { "cell_type": "code", diff --git a/open_rao_monitoring.ipynb b/open_rao_monitoring.ipynb new file mode 100644 index 0000000..299b913 --- /dev/null +++ b/open_rao_monitoring.ipynb @@ -0,0 +1,324 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-08-22T12:32:17.831809Z", + "start_time": "2025-08-22T12:32:17.829502Z" + } + }, + "source": [ + "#pip install pypowsybl==1.12.0\n", + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')" + ], + "outputs": [], + "execution_count": 20 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-22T12:32:20.830216Z", + "start_time": "2025-08-22T12:32:20.828106Z" + } + }, + "cell_type": "code", + "source": [ + "import pypowsybl as pp\n", + "from pypowsybl.rao import Parameters as RaoParameters\n", + "\n", + "\n" + ], + "id": "4689861f15ffc23c", + "outputs": [], + "execution_count": 21 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": [ + "# # Simple case with GlskB45test\n", + "# 1) simple cse with topo\n", + "# 2) simple case with injection : solves angle cnecs constraints\n", + "# 3) micro grid case\n" + ], + "id": "e02c6f39998e2d2e" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "# MicroGrid case with GlskB45MicroGridTest", + "id": "36289c2d67cf8b64" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-22T15:28:19.314733Z", + "start_time": "2025-08-22T15:28:19.282584Z" + } + }, + "cell_type": "code", + "source": [ + "# Simple case\n", + "# import inputs\n", + "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "rao_runner = pp.rao.create_rao()\n", + "parameters = RaoParameters()\n", + "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", + "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")\n", + "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \n", + "rao_result = rao_runner.run(network, parameters)\n", + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" + ], + "id": "d485b05055727a18", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-22 17:28:19,291 - INFO - CIM GLSK importer could import this document.\n", + "2025-08-22 17:28:19,293 - ERROR - Multi (GSK+LSK) shift keys not supported yet...\n", + "com.powsybl.glsk.commons.GlskException: Multi (GSK+LSK) shift keys not supported yet...\n", + "\tat com.powsybl.glsk.api.util.converters.GlskPointLinearGlskConverter.convert(GlskPointLinearGlskConverter.java:56)\n", + "\tat com.powsybl.glsk.api.util.ZonalDataFromGlskDocument.addLinearDataFromList(ZonalDataFromGlskDocument.java:56)\n", + "\tat com.powsybl.glsk.api.util.ZonalDataFromGlskDocument.(ZonalDataFromGlskDocument.java:48)\n", + "\tat com.powsybl.glsk.api.GlskDocument.getZonalGlsks(GlskDocument.java:41)\n", + "\tat com.powsybl.python.rao.RaoContext.run(RaoContext.java:51)\n", + "\tat com.powsybl.python.rao.RaoCFunctions.lambda$runRao$6(RaoCFunctions.java:136)\n", + "\tat com.powsybl.python.commons.Util.doCatch(Util.java:144)\n", + "\tat com.powsybl.python.rao.RaoCFunctions.runRao(RaoCFunctions.java:132)\n", + "\n" + ] + }, + { + "ename": "PyPowsyblError", + "evalue": "Multi (GSK+LSK) shift keys not supported yet...", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mPyPowsyblError\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[27]\u001B[39m\u001B[32m, line 10\u001B[39m\n\u001B[32m 8\u001B[39m rao_runner.set_crac_file_source(network, \u001B[33m\"\u001B[39m\u001B[33m./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\u001B[39m\u001B[33m\"\u001B[39m)\n\u001B[32m 9\u001B[39m rao_runner.set_glsk_file_source(network, \u001B[33m\"\u001B[39m\u001B[33m./data/rao/angle_monitoring/GlskB45test.xml\u001B[39m\u001B[33m\"\u001B[39m) \n\u001B[32m---> \u001B[39m\u001B[32m10\u001B[39m rao_result = \u001B[43mrao_runner\u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnetwork\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 11\u001B[39m result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/Workspace/POWSYBL/pypowsybl2/venv/lib/python3.11/site-packages/pypowsybl/rao/impl/rao.py:48\u001B[39m, in \u001B[36mRao.run\u001B[39m\u001B[34m(self, network, parameters)\u001B[39m\n\u001B[32m 45\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m parameters \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m 46\u001B[39m parameters = RaoParameters()\n\u001B[32m---> \u001B[39m\u001B[32m48\u001B[39m rao_result = \u001B[43m_pypowsybl\u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun_rao\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnetwork\u001B[49m\u001B[43m=\u001B[49m\u001B[43mnetwork\u001B[49m\u001B[43m.\u001B[49m\u001B[43m_handle\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mrao_context\u001B[49m\u001B[43m=\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43m_handle\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m=\u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m.\u001B[49m\u001B[43m_to_c_parameters\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 49\u001B[39m crac_handle = _pypowsybl.get_crac(\u001B[38;5;28mself\u001B[39m._handle)\n\u001B[32m 50\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m RaoResult(rao_result, crac_handle)\n", + "\u001B[31mPyPowsyblError\u001B[39m: Multi (GSK+LSK) shift keys not supported yet..." + ] + } + ], + "execution_count": 27 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-22T08:50:16.118799Z", + "start_time": "2025-08-22T08:50:16.084204Z" + } + }, + "cell_type": "code", + "source": [ + "\n", + "# import inputs\n", + "network = pp.network.load(\"./data/rao/rao_network.uct\")\n", + "rao_runner = pp.rao.create_rao()\n", + "parameters = RaoParameters()\n", + "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", + "rao_runner.set_crac_file_source(network, \"./data/rao/rao_crac.json\")\n", + "rao_runner.set_glsk_file_source(network, \"./data/rao/rao_glsk.xml\") \n", + "rao_result = rao_runner.run(network, parameters)\n", + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)\n", + "result_with_voltage_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" + ], + "id": "401bfe71eca4e166", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-22 10:50:16,087 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,088 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,088 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,089 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,089 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,089 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,090 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,090 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,090 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,091 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,091 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,092 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,092 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,092 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,092 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-22 10:50:16,093 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-08-22 10:50:16,093 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-08-22 10:50:16,094 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-08-22 10:50:16,094 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-08-22 10:50:16,098 - WARNING - CRAC importer 2.8 might not be longer compatible with json CRAC version 1.3, consider updating your json CRAC file\n", + "2025-08-22 10:50:16,099 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-08-22 10:50:16,099 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-08-22 10:50:16,101 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-08-22 10:50:16,101 - WARNING - The initial tap is now read from the network so the value in the crac will not be read\n", + "2025-08-22 10:50:16,101 - WARNING - The tap to angle conversion map is now read from the network so the value in the crac will not be read\n", + "2025-08-22 10:50:16,102 - INFO - CIM GLSK importer could not import this document.\n", + "2025-08-22 10:50:16,103 - INFO - UCTE GLSK importer could import this document.\n", + "2025-08-22 10:50:16,104 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-08-22 10:50:16,104 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-08-22 10:50:16,104 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,104 - WARNING - A threshold for the flowCnec BBE2AA1 FFR3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec FFR1AA1 FFR2AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec FFR2AA1 DDE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec NNL1AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec NNL2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec DDE2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec BBE2AA1 FFR3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec FFR1AA1 FFR2AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec FFR2AA1 DDE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec NNL1AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec NNL2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec DDE2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-08-22 10:50:16,107 - WARNING - Contingency Contingency FR1 FR3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-08-22 10:50:16,108 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", + "2025-08-22 10:50:16,109 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-08-22 10:50:16,109 - INFO - Network {CC0 SC0} balance: active generation=24000.0 MW, active load=24000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-08-22 10:50:16,109 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-08-22 10:50:16,110 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-08-22 10:50:16,110 - INFO - Running AC sensitivity analysis with 14 factors and 0 contingencies\n", + "2025-08-22 10:50:16,110 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-08-22 10:50:16,111 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-6.497913318526116E-10, distributedActivePower=0.0))\n", + "2025-08-22 10:50:16,111 - INFO - Initial sensitivity analysis: cost = -2666.26 (functional: -2666.26, virtual: 0.0)\n", + "2025-08-22 10:50:16,112 - INFO - Limiting element #01: margin = 2666.26 MW, element FFR1AA1 FFR2AA1 1 at state preventive, CNEC ID = \"FFR1AA1 FFR2AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,112 - INFO - Limiting element #02: margin = 3499.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,112 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-08-22 10:50:16,112 - INFO - Stop criterion reached on Root leaf, cost: -2666.26 (functional: -2666.26, virtual: 0.0)\n", + "2025-08-22 10:50:16,113 - INFO - Limiting element #01: margin = 2666.26 MW, element FFR1AA1 FFR2AA1 1 at state preventive, CNEC ID = \"FFR1AA1 FFR2AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,113 - INFO - Limiting element #02: margin = 3499.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,113 - INFO - Limiting element #03: margin = 3500.22 MW, element FFR2AA1 DDE3AA1 1 at state preventive, CNEC ID = \"FFR2AA1 DDE3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,113 - INFO - Limiting element #04: margin = 3999.78 MW, element DDE2AA1 NNL3AA1 1 at state preventive, CNEC ID = \"DDE2AA1 NNL3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,113 - INFO - Limiting element #05: margin = 4333.2 MW, element NNL1AA1 NNL3AA1 1 at state preventive, CNEC ID = \"NNL1AA1 NNL3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,114 - INFO - Scenario \"preventive\": initial cost = -2666.26 (functional: -2666.26, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -2666.26 (functional: -2666.26, virtual: 0.0)\n", + "2025-08-22 10:50:16,114 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-08-22 10:50:16,114 - INFO - Limiting element #01: margin = 2666.26 MW, element FFR1AA1 FFR2AA1 1 at state preventive, CNEC ID = \"FFR1AA1 FFR2AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,114 - INFO - Limiting element #02: margin = 3499.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,114 - INFO - Limiting element #03: margin = 3500.22 MW, element FFR2AA1 DDE3AA1 1 at state preventive, CNEC ID = \"FFR2AA1 DDE3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,115 - INFO - Limiting element #04: margin = 3999.78 MW, element DDE2AA1 NNL3AA1 1 at state preventive, CNEC ID = \"DDE2AA1 NNL3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,115 - INFO - Limiting element #05: margin = 4333.2 MW, element NNL1AA1 NNL3AA1 1 at state preventive, CNEC ID = \"NNL1AA1 NNL3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,115 - INFO - Limiting element #06: margin = 4500.22 MW, element BBE2AA1 FFR3AA1 1 at state preventive, CNEC ID = \"BBE2AA1 FFR3AA1 1 - preventive\"\n", + "2025-08-22 10:50:16,115 - INFO - Cost before RAO = -2666.26 (functional: -2666.26, virtual: 0.0), cost after RAO = -2666.26 (functional: -2666.26, virtual: 0.0)\n", + "2025-08-22 10:50:16,116 - INFO - ----- ANGLE monitoring [start]\n", + "2025-08-22 10:50:16,116 - WARNING - No Cnecs of type 'ANGLE' defined.\n", + "2025-08-22 10:50:16,116 - INFO - ----- ANGLE monitoring [end]\n", + "2025-08-22 10:50:16,117 - INFO - ----- ANGLE monitoring [start]\n", + "2025-08-22 10:50:16,117 - WARNING - No Cnecs of type 'ANGLE' defined.\n", + "2025-08-22 10:50:16,117 - INFO - ----- ANGLE monitoring [end]\n" + ] + } + ], + "execution_count": 7 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Launch monitoring", + "id": "4d2a8003fc3963d7" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "fffb8abf917e0f7f" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "", + "id": "624e989b754dc4c6" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": [ + "# prepare inputs\n", + "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.run_angle_monitoring()\n", + "\n", + "\n", + "\n", + "rao_runner.set_crac_file_source(n12, \"./data/rao/N_case_crac.json\")\n", + "rao_parameters = RaoParameters()\n", + "rao_parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", + "#run rao\n", + "raoResult = rao_runner.run(n12, rao_parameters)\n", + "result_json = raoResult.to_json()" + ], + "id": "abee38543c99f812" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "f72e1a5e5daa7bc3" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "bb6b0a9f406cfc57" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "af10073ecc8db95a" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e03e5683d4d547b5b048be32ef8d001c555550a4 Mon Sep 17 00:00:00 2001 From: Thomas Bouquet Date: Wed, 27 Aug 2025 11:28:27 +0200 Subject: [PATCH 08/18] run angle monitoring successful --- .../angle_monitoring/GlskB45MicroGridTest.xml | 0 .../angle_monitoring/GlskB45test.xml | 0 data/{ => rao}/angle_monitoring/MicroGrid.zip | Bin .../angle_monitoring_crac.json | 2 +- ...nitoring_simple_case_with_injectionRa.json | 52 +- ...ngle_monitoring_simple_case_with_topo.json | 2 +- .../angle_monitoring/monitoring_network.xiidm | 1173 +++++++++++++++++ data/{ => rao}/angle_monitoring/network.xiidm | 0 data/{ => rao}/angle_monitoring/rao_glsk.xml | 0 open_rao_monitoring.ipynb | 795 ++++++++--- 10 files changed, 1856 insertions(+), 168 deletions(-) rename data/{ => rao}/angle_monitoring/GlskB45MicroGridTest.xml (100%) rename data/{ => rao}/angle_monitoring/GlskB45test.xml (100%) rename data/{ => rao}/angle_monitoring/MicroGrid.zip (100%) rename data/{ => rao}/angle_monitoring/angle_monitoring_crac.json (99%) rename data/{ => rao}/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json (59%) rename data/{ => rao}/angle_monitoring/angle_monitoring_simple_case_with_topo.json (98%) create mode 100644 data/rao/angle_monitoring/monitoring_network.xiidm rename data/{ => rao}/angle_monitoring/network.xiidm (100%) rename data/{ => rao}/angle_monitoring/rao_glsk.xml (100%) diff --git a/data/angle_monitoring/GlskB45MicroGridTest.xml b/data/rao/angle_monitoring/GlskB45MicroGridTest.xml similarity index 100% rename from data/angle_monitoring/GlskB45MicroGridTest.xml rename to data/rao/angle_monitoring/GlskB45MicroGridTest.xml diff --git a/data/angle_monitoring/GlskB45test.xml b/data/rao/angle_monitoring/GlskB45test.xml similarity index 100% rename from data/angle_monitoring/GlskB45test.xml rename to data/rao/angle_monitoring/GlskB45test.xml diff --git a/data/angle_monitoring/MicroGrid.zip b/data/rao/angle_monitoring/MicroGrid.zip similarity index 100% rename from data/angle_monitoring/MicroGrid.zip rename to data/rao/angle_monitoring/MicroGrid.zip diff --git a/data/angle_monitoring/angle_monitoring_crac.json b/data/rao/angle_monitoring/angle_monitoring_crac.json similarity index 99% rename from data/angle_monitoring/angle_monitoring_crac.json rename to data/rao/angle_monitoring/angle_monitoring_crac.json index e44555d..0b6a49d 100644 --- a/data/angle_monitoring/angle_monitoring_crac.json +++ b/data/rao/angle_monitoring/angle_monitoring_crac.json @@ -1,6 +1,6 @@ { "type" : "CRAC", - "version" : "2.8", + "version" : "2.7", "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", "id" : "complex_case", "name" : "complex_case", diff --git a/data/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json similarity index 59% rename from data/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json rename to data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json index e2f54c9..5c60e6f 100644 --- a/data/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json +++ b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json @@ -1,6 +1,6 @@ { "type" : "CRAC", - "version" : "2.8", + "version" : "2.7", "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", "id" : "simple_case_with_injectionRa", "name" : "simple_case_with_injectionRa", @@ -32,8 +32,40 @@ "name" : "coL2", "networkElementsIds" : [ "L2" ] } ], - "flowCnecs" : [ ], + "flowCnecs" : [{ + "id" : "fcPrev", + "name" : "fcPrev", + "networkElementId" : "L1", + "instant" : "preventive", + "contingencyId" : null, + "optimized" : true, + "monitored" : false, + "iMax" : [ 2000.0 ], + "nominalV" : [ 380.0 ], + "thresholds" : [ { + "unit" : "percent_imax", + "min" : -1, + "max" : 1, + "side" : 1 + } ] + } ], "angleCnecs" : [ { + "id" : "acPrev", + "name" : "acPrev", + "exportingNetworkElementId" : "VL2", + "importingNetworkElementId" : "VL3", + "operator" : null, + "border" : "", + "instant" : "preventive", + "contingencyId" : null, + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "degree", + "min" : -6.0 + } ] + }, { "id" : "acCur1", "name" : "acCur1", "exportingNetworkElementId" : "VL2", @@ -49,6 +81,22 @@ "unit" : "degree", "min" : -6.0 } ] + }, { + "id" : "acCur2", + "name" : "acCur2", + "exportingNetworkElementId" : "VL3", + "importingNetworkElementId" : "VL1", + "operator" : null, + "border" : "", + "instant" : "curative", + "contingencyId" : "coL1", + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "degree", + "min" : -6.0 + } ] } ], "voltageCnecs" : [ ], "pstRangeActions" : [ ], diff --git a/data/angle_monitoring/angle_monitoring_simple_case_with_topo.json b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json similarity index 98% rename from data/angle_monitoring/angle_monitoring_simple_case_with_topo.json rename to data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json index 338da26..52af5b9 100644 --- a/data/angle_monitoring/angle_monitoring_simple_case_with_topo.json +++ b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json @@ -1,6 +1,6 @@ { "type" : "CRAC", - "version" : "2.8", + "version" : "2.7", "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", "id" : "simple_case_with_topo", "name" : "simple_case_with_topo", diff --git a/data/rao/angle_monitoring/monitoring_network.xiidm b/data/rao/angle_monitoring/monitoring_network.xiidm new file mode 100644 index 0000000..f8e44c5 --- /dev/null +++ b/data/rao/angle_monitoring/monitoring_network.xiidm @@ -0,0 +1,1173 @@ + + + + + + + + + + + + + + _ad794c0e-b9ec-420b-ada1-97680e3dde05 + + + _800ada75-8c8c-4568-aec5-20f799e45f3c + + + _3c6d83a3-b5f9-41a2-a3d9-cf15d903ed0a + + + _b741ce25-3f99-4aa8-9b03-d9de0ba6e342 + _3fa4866b-1714-4be9-afab-3909ae092016 + + + _310c303a-b0ed-4e42-9854-628f34c53d2b + _678a3049-afc0-432f-8f53-b30aa71907b2 + + + _b6e23b90-9c48-4285-ac02-5b68d0c572a6 + _e57dd4ed-5ea0-4374-9b36-40a294a8e2be + + + _381fc1a6-63f7-4728-bb84-d4d7fe4f8794 + _e1e6f751-259f-4182-b4e1-12eba54a54ce + + + + + + + + + + + + + + + + + + + + + + + _b9376bea-c75d-49f3-94ca-6a71fa0086a5 + + + + _1ef0715a-d5a9-477b-b6e7-b635529ac140 + _70d962fb-a492-4c36-8cad-b5c584df53bd + + + + + + + + + + + + + + + _57ae9251-c022-4c67-a8eb-611ad54c963c + _5b2c65b0-68ce-4530-85b7-385346a3b5e1 + + + + + + + + + + + + + + + _67bb74f1-8620-4a32-9d7d-a44092d11d22 + + + + + + + + + + + + _a1b46f53-86f1-497e-bf57-c3b6268bcd6c + + + _b8bca219-a924-434f-8163-50aae6d486a7 + _4bbaf84d-2437-44e1-a56c-e79723370e77 + + + _61562178-c201-43c7-b56d-a300ab07c723 + _5245aa5c-9600-4632-95db-e981a19ed857 + + + _95f1d705-35fa-4102-ba5b-43dfe7a0e0cc + _9f5dbaf3-e384-4e86-9d49-f43c30b4e354 + + + + + + + + + + + + + + + + _cbdf1842-74ed-4fce-a5d4-0296c82cbc92 + + + + _d5e2e58e-ccf6-47d9-b3bb-3088eb7a9b6c + + + + + + + + _fa9e0f4d-8a2f-45e1-9e36-3611600d1c94 + + + _907dbcfe-2037-4f84-97f1-6e59f782168e + _345d8528-1a7e-4245-92d6-15db7a7e3c86 + + + _36fedfd8-280b-4ee4-b58a-cd2063e5d706 + _0cca0f16-c476-4a99-b289-d660ff57b891 + + + _a45d705f-46f6-4bde-8790-11a762da8c01 + _5c206db8-ef8c-4e53-b2b9-38b52b194c5a + + + _042688a6-140f-473c-98f9-94a3cfdc00d3 + _6811721b-252c-45fd-8474-6db1e7d5739e + + + + + + + + + + + + + + + + + + + _22af3121-1a66-4546-bd80-4371f417c644 + + + + + + + + + + + + _f9f29835-8a31-4310-9780-b1ad26f3cbb0 + _c14d2036-72ec-4df3-b1b7-75d8afd9a1fe + + + + + + + + + + + + + + + _f3b56334-4638-49d3-a6a0-3f417422b8f5 + _231a4cf8-5069-4d53-96e4-e839f073f1ea + + + + + + + + + + + + + + + _02a244ca-8bcb-4e25-8613-e948b8ba1f22 + _051d49ba-4360-4372-86bf-50eb8cf29778 + + + + + + + + + + + + + + + + + + _b3bf6cbd-abe8-42b6-95f4-20682475b484 + _f392d0d3-47cb-4ec1-925f-b3762d4a787c + + + + + + + + _4bb5407b-b4a5-416c-80ad-1a778ada2b9b + + + + + + + + + + + + _62fc0a4e-00aa-4bf7-b1a0-3a5b2c0b5492 + + + _302fe23a-f64d-41bd-8a81-78130433916d + + + _8f1c492f-a7cc-4160-9a14-54f1743e4850 + + + _756dff85-b2c8-4a06-9a4c-4dde854e668b + _3f8b7c82-ca57-401a-9e2d-b719f8c83030 + + + _fd2867a9-0c57-4cf2-acfb-439c4039b06b + _b501caa7-949f-49c6-b4d4-f50ef3625ede + + + _529a048e-7681-4e59-aba1-f7474a562cba + _68d47f87-1a1f-4c63-80ca-d3becb4a47f9 + + + + + + + + + + + + + + + + + + _a036b765-1669-4f64-acd3-1e8fbd513312 + + + + + + + _65b8c937-9b25-4b9e-addf-602dbc1337f9 + + + + + + + _beffa353-7d10-421d-9c08-036b744b1cee + + + + + + + + + + + + + + + _ab7ece75-d726-48c8-a924-b0a9325e6d51 + _3c59d1b0-1ee9-4ca3-9086-4fe102b51b21 + _36b83adb-3d45-4693-8967-96627b5f9ec9 + _4c19ace6-c825-4c5b-87d9-031e6e6a3379 + _ba56158e-0c51-448d-999b-44cb0b3cebf5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _2cd21c77-b8b1-4896-95fb-240f45b9ac89 + _63454a73-f439-45bb-951a-e7b193986571 + _bf76ac9d-0144-48f5-a24a-34ae15a455fb + _e22f3c30-63f5-47bf-a8c4-fee2483d426c + _c3774d3f-f48c-4954-a0cf-b4572eb714fd + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _ca7974cf-b25e-4898-9221-7154233e5eb2 + _35651e25-a77a-46a1-92f4-443d6acce90e + _1182d878-2eaa-4eec-91be-ce7b2b1e7f9a + _f58281c5-862a-465e-97ec-d809be6e24ab + _83cc66dd-8d93-4a2c-8103-f1f5a9cf7e2e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _76e9ca77-f805-40ea-8120-5a6d58416d34 + _53fd6693-57e6-482e-8fbe-dcf3531a7ce0 + _2e21d1ef-2287-434c-a767-1ca807cf2478 + _fe25f43a-7341-446e-a71a-8ab7119ba806 + _e1f661c0-971d-4ce5-ad39-0ec427f288ab + _ca0f7e2e-3442-4ada-a704-91f319c0ebe3 + _5f68a129-d5d8-4b71-9743-9ca2572ba26b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _a4d42d33-ae54-4fe9-ad59-f30da0dfb809 + _05a17350-55f5-4a00-9a50-8c0048a25495 + + + + + + + + + + + + + + _77f04391-aa23-49b6-b3e9-6089130bb5d5 + _699545b9-82b9-4331-bc80-538d73b4ba56 + + + + + + + + + + + + + + _8171fc34-6891-40e0-92d1-da9f4ba69e26 + _13dcec71-4b02-4c0c-93a7-8e16db4aa0b7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://iec.ch/TC57/ns/CIM/CoreEquipment-EU/3.0 + http://iec.ch/TC57/ns/CIM/Operation-EU/3.0 + http://iec.ch/TC57/ns/CIM/ShortCircuit-EU/3.0 + urn:uuid:2399cbd0-9a39-11e0-aa80-0800200c9a66 + + + http://iec.ch/TC57/ns/CIM/SteadyStateHypothesis-EU/3.0 + urn:uuid:9e7050a8-960b-4e1a-8e34-7f56bc2b2a7b + + + http://iec.ch/TC57/ns/CIM/GeographicalLocation-EU/3.0 + urn:uuid:9e7050a8-960b-4e1a-8e34-7f56bc2b2a7b + + + http://iec.ch/TC57/ns/CIM/EquipmentBoundary-EU/3.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _0f199d49-0093-4b51-b357-70371424d174 + + + _42800bad-5e47-42e6-b9b0-1fb8fc5831aa + + + + + + + + + _f04ec73d-b94a-4b7e-a3d6-b1234fc37385 + _9f984b04-1736-43d2-9122-3a17fc8aea5f + + + _e19e01f7-eb9b-4ce5-a6fe-4bb4ef0ce6c3 + _28797d21-df04-4be6-806b-3be26b040d6a + + + _3179d96c-7ecd-4f8a-b3f0-f24b62a16e87 + _7fae7c9d-952f-4321-830d-aa667d21969d + + + + + + + + + + + + + + + + + _ae4b7cbe-349a-41c8-ace2-25ec26f14a64 + + + + + + + + + _f04ecab5-1a12-4cc0-ba56-b157ebf11a42 + + + + + + + + + _faab7959-f9bf-421b-bc3f-d364e0c1388b + + + + + + + + + + + + _f937c4ac-b9fc-44a2-82a0-99cb34c89974 + _30aa2972-aafb-4c38-912d-a14867d47cec + + + _7a7fd92b-1aaf-49de-b609-1d640e63d49f + _790df530-60c7-40bc-be5f-f90e9c65bab4 + + + _85ceec9c-21a9-4ef2-b7b0-c2bb9552e799 + _41b735f7-da62-4bd3-ac98-fbdec24baeac + + + + + + + + + + + + + + + + + + _f461fd2d-1e41-4a3e-8213-7cc33c77a089 + + + + _6dad1a97-6874-4206-a5a5-837e495325f8 + + + + _a015f692-3fc5-4ec3-8d1d-977c7b499e7c + + + + + + _8f308117-8bbd-4798-b145-4e78f7d049e7 + _c557146e-dfc4-4020-9738-d592b188338b + + + + + + + + + + + + + + + + + + _6b1cd30c-19ba-44e1-9447-d01db6b1ef9d + _357e3e14-c38e-4a7e-9c95-b3dbe158f5f3 + + + + + + + + + + + + + + + + + + _757d4f50-707b-47a0-891c-cbaefd649631 + _ae588863-b154-451d-978a-7ab08ac50fb6 + + + + + + + + + + + + + + + + + + + + + _50f00b94-fe0f-48fd-887e-f0d4d59eee87 + + + _ecea10ff-e006-436b-a86a-beac4c2a30c1 + + + _8121d4c3-9cb2-47db-b40a-99678602bb2a + _5f40c3f7-9540-4e1b-aa97-6553d5524877 + + + _3c377e5e-65cc-45f1-ba12-e20034df7cb3 + _14f212ae-bcd8-46ae-9366-11dec9602a01 + + + _abc40269-5f9a-4b13-a5a5-8e3b3929eff5 + _c9dbf281-e788-4084-b268-3b5a9473ad72 + + + _74039a16-da9d-46dd-a4f1-dd65fbb09ec4 + _e12338f8-6e9e-4d06-a29a-e12bdd7bd4d7 + + + _eedefa27-de13-4e6f-91a3-42aa86b539d6 + _9fc1ca1a-bb62-4982-9358-fa9b4ac5564d + + + + + + + + + + + + + + + + + + + + + + + _fab54e9c-b12e-4e47-a9f2-fec4ef96c0c0 + + + + + _653bc4b8-518b-4adc-9d68-012fb641fb1d + _57979d14-d1d8-4311-ae53-aa8890423885 + + + + + + + + + + + + + + + + + + _5dfee914-a4fd-4bde-a5b4-c4caa6378d10 + _6aecb9ba-5835-4b70-89bc-96d687e45779 + + + + + + + + + + + + + + + + + + + _f3600241-63dc-485b-aefb-4ec24028f8b3 + _4f1c405f-07c9-4fb0-b64e-551896a29aa8 + _bd61b1f9-474d-424e-9709-42f75337c477 + _44b4277a-0f4b-43a8-ad93-6f7d6ef02061 + _4df90339-ae02-4da1-8e1e-69ab068df065 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _ee649b97-d2ec-47e1-976f-0f4d9f50fa11 + _1128e664-0653-448a-9068-e37f1a097c05 + _41ca9e70-1cb4-4971-b8e6-a97a15580b89 + _da232169-1c36-495a-8af6-a0d7d2b39f52 + _0dbed103-fc51-4df4-a6fa-0dee4c57f3a3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _e3e0c496-5837-4f0f-a596-cc421940f73f + _baa7aef1-afcd-4981-97c0-ccec7b5ad4e0 + _341327c4-9224-40bf-bc33-7a3bb0bae680 + _0dec3883-a2b6-4353-83cc-d4dd5df513a6 + _c614f321-2c88-4fa3-b98a-8ec3cde73db4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://iec.ch/TC57/ns/CIM/EquipmentBoundary-EU/3.0 + + + http://iec.ch/TC57/ns/CIM/CoreEquipment-EU/3.0 + http://iec.ch/TC57/ns/CIM/Operation-EU/3.0 + http://iec.ch/TC57/ns/CIM/ShortCircuit-EU/3.0 + urn:uuid:2399cbd0-9a39-11e0-aa80-0800200c9a66 + + + http://iec.ch/TC57/ns/CIM/Topology-EU/3.0 + urn:uuid:1e239780-b5f9-4ed1-ad73-041bc406bcfc + urn:uuid:3a2a0416-c6a8-49a9-9f23-b8ec7cb29bae + + + http://iec.ch/TC57/ns/CIM/StateVariables-EU/3.0 + urn:uuid:0ab8469f-4776-43fe-b1cb-2ceaf35c34f3 + + + http://iec.ch/TC57/ns/CIM/SteadyStateHypothesis-EU/3.0 + urn:uuid:4f4a3f29-6892-49ea-bfc1-92051973c799 + + + http://iec.ch/TC57/ns/CIM/DiagramLayout-EU/3.0 + urn:uuid:4f4a3f29-6892-49ea-bfc1-92051973c799 + + + http://iec.ch/TC57/ns/CIM/GeographicalLocation-EU/3.0 + urn:uuid:4f4a3f29-6892-49ea-bfc1-92051973c799 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/angle_monitoring/network.xiidm b/data/rao/angle_monitoring/network.xiidm similarity index 100% rename from data/angle_monitoring/network.xiidm rename to data/rao/angle_monitoring/network.xiidm diff --git a/data/angle_monitoring/rao_glsk.xml b/data/rao/angle_monitoring/rao_glsk.xml similarity index 100% rename from data/angle_monitoring/rao_glsk.xml rename to data/rao/angle_monitoring/rao_glsk.xml diff --git a/open_rao_monitoring.ipynb b/open_rao_monitoring.ipynb index 299b913..b940ae2 100644 --- a/open_rao_monitoring.ipynb +++ b/open_rao_monitoring.ipynb @@ -1,93 +1,468 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "2fdb50ba", + "metadata": {}, + "source": [ + "# Angle Monitoring in PowSyBl OpenRAO" + ] + }, + { + "cell_type": "markdown", + "id": "efa399e1", + "metadata": {}, + "source": [ + "PowSyBl OpenRAO main purpose is to determine an optimal combination of remedial actions to apply on a power grid in order to remove overloads on every line. This optimization is flow-oriented. However, OpenRAO also provides a **monitoring** module that is able to check **voltage and angle constraints** and activate remedial actions." + ] + }, { "cell_type": "code", + "execution_count": 2, "id": "initial_id", "metadata": { - "collapsed": true, "ExecuteTime": { "end_time": "2025-08-22T12:32:17.831809Z", "start_time": "2025-08-22T12:32:17.829502Z" - } + }, + "collapsed": true }, + "outputs": [], "source": [ "#pip install pypowsybl==1.12.0\n", "# set up logging\n", "import logging\n", - "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.getLogger('powsybl').setLevel(logging.DEBUG)\n", "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')" - ], - "outputs": [], - "execution_count": 20 + ] }, { + "cell_type": "code", + "execution_count": 3, + "id": "4689861f15ffc23c", "metadata": { "ExecuteTime": { "end_time": "2025-08-22T12:32:20.830216Z", "start_time": "2025-08-22T12:32:20.828106Z" } }, - "cell_type": "code", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-27 10:04:34,629 - DEBUG - Max heap is 8008 MB\n" + ] + } + ], "source": [ "import pypowsybl as pp\n", "from pypowsybl.rao import Parameters as RaoParameters\n", "\n", "\n" - ], - "id": "4689861f15ffc23c", - "outputs": [], - "execution_count": 21 + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": 4, + "id": "e02c6f39998e2d2e", + "metadata": {}, "outputs": [], - "execution_count": null, "source": [ "# # Simple case with GlskB45test\n", "# 1) simple cse with topo\n", "# 2) simple case with injection : solves angle cnecs constraints\n", "# 3) micro grid case\n" - ], - "id": "e02c6f39998e2d2e" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": 5, + "id": "36289c2d67cf8b64", + "metadata": {}, "outputs": [], - "execution_count": null, - "source": "# MicroGrid case with GlskB45MicroGridTest", - "id": "36289c2d67cf8b64" + "source": [ + "# MicroGrid case with GlskB45MicroGridTest" + ] }, { - "metadata": { - "ExecuteTime": { - "end_time": "2025-08-22T15:28:19.314733Z", - "start_time": "2025-08-22T15:28:19.282584Z" - } - }, "cell_type": "code", + "execution_count": 6, + "id": "52f199b7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-27 10:04:34,658 - INFO - Using platform configuration provider classic\n", + "2025-08-27 10:04:34,658 - INFO - Platform configuration defined by YAML file /home/bouquettho/.itools/config.yml\n", + "2025-08-27 10:04:34,661 - INFO - LocalComputationConfig [localDir=/tmp, availableCore=8]\n", + "2025-08-27 10:04:34,663 - INFO - Configuring StAX XMLInputFactory...\n", + "2025-08-27 10:04:34,664 - INFO - Some properties may not be supported by your implementation.\n", + "2025-08-27 10:04:34,665 - INFO - This may not be a problem because some are overlapping.\n", + "2025-08-27 10:04:34,666 - INFO - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/property/accessExternalStylesheet\n", + "2025-08-27 10:04:34,667 - INFO - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/feature/secure-processing\n", + "2025-08-27 10:04:34,672 - DEBUG - XIIDM import done in 3 ms\n", + "2025-08-27 10:04:34,673 - INFO - Loading component library from /DefaultLibrary...\n", + "2025-08-27 10:04:34,679 - DEBUG - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-08-27 10:04:34,680 - DEBUG - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-08-27 10:04:34,681 - DEBUG - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-08-27 10:04:34,682 - DEBUG - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-08-27 10:04:34,682 - DEBUG - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-08-27 10:04:34,683 - DEBUG - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-08-27 10:04:34,683 - DEBUG - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-08-27 10:04:34,684 - INFO - Loading component library from /DefaultLibrary...\n", + "2025-08-27 10:04:34,686 - DEBUG - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-08-27 10:04:34,686 - DEBUG - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-08-27 10:04:34,687 - DEBUG - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-08-27 10:04:34,688 - DEBUG - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-08-27 10:04:34,688 - DEBUG - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-08-27 10:04:34,689 - DEBUG - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-08-27 10:04:34,690 - DEBUG - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-08-27 10:04:34,690 - INFO - Number of steps: 139\n", + "2025-08-27 10:04:34,691 - INFO - Elapsed time: 1.47836E-4\n", + "2025-08-27 10:04:34,691 - WARNING - Base voltage configuration file '/home/bouquettho/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -50\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
VL1
\n", + "
\n", + " 400.0 kV / 0.0°
\n", + "
\n", + "
\n", + "
VL2
\n", + "
\n", + " 385.7 kV / -3.7°
\n", + "
\n", + "
\n", + "
VL3
\n", + "
\n", + " 392.6 kV / -1.8°
\n", + "
\n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Simple case\n", - "# import inputs\n", "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", - "rao_runner = pp.rao.create_rao()\n", + "network.get_network_area_diagram()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f8e14fd0", + "metadata": {}, + "outputs": [], + "source": [ "parameters = RaoParameters()\n", "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")\n", - "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \n", - "rao_result = rao_runner.run(network, parameters)\n", - "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "830592d3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-27 10:04:34,724 - INFO - CIM GLSK importer could import this document.\n" + ] + } ], - "id": "d485b05055727a18", + "source": [ + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0f76c1be", + "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-08-22 17:28:19,291 - INFO - CIM GLSK importer could import this document.\n", - "2025-08-22 17:28:19,293 - ERROR - Multi (GSK+LSK) shift keys not supported yet...\n", + "2025-08-27 10:04:34,732 - ERROR - Multi (GSK+LSK) shift keys not supported yet...\n", "com.powsybl.glsk.commons.GlskException: Multi (GSK+LSK) shift keys not supported yet...\n", "\tat com.powsybl.glsk.api.util.converters.GlskPointLinearGlskConverter.convert(GlskPointLinearGlskConverter.java:56)\n", "\tat com.powsybl.glsk.api.util.ZonalDataFromGlskDocument.addLinearDataFromList(ZonalDataFromGlskDocument.java:56)\n", @@ -105,160 +480,220 @@ "evalue": "Multi (GSK+LSK) shift keys not supported yet...", "output_type": "error", "traceback": [ - "\u001B[31m---------------------------------------------------------------------------\u001B[39m", - "\u001B[31mPyPowsyblError\u001B[39m Traceback (most recent call last)", - "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[27]\u001B[39m\u001B[32m, line 10\u001B[39m\n\u001B[32m 8\u001B[39m rao_runner.set_crac_file_source(network, \u001B[33m\"\u001B[39m\u001B[33m./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\u001B[39m\u001B[33m\"\u001B[39m)\n\u001B[32m 9\u001B[39m rao_runner.set_glsk_file_source(network, \u001B[33m\"\u001B[39m\u001B[33m./data/rao/angle_monitoring/GlskB45test.xml\u001B[39m\u001B[33m\"\u001B[39m) \n\u001B[32m---> \u001B[39m\u001B[32m10\u001B[39m rao_result = \u001B[43mrao_runner\u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnetwork\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 11\u001B[39m result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)\n", - "\u001B[36mFile \u001B[39m\u001B[32m~/Workspace/POWSYBL/pypowsybl2/venv/lib/python3.11/site-packages/pypowsybl/rao/impl/rao.py:48\u001B[39m, in \u001B[36mRao.run\u001B[39m\u001B[34m(self, network, parameters)\u001B[39m\n\u001B[32m 45\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m parameters \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m 46\u001B[39m parameters = RaoParameters()\n\u001B[32m---> \u001B[39m\u001B[32m48\u001B[39m rao_result = \u001B[43m_pypowsybl\u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun_rao\u001B[49m\u001B[43m(\u001B[49m\u001B[43mnetwork\u001B[49m\u001B[43m=\u001B[49m\u001B[43mnetwork\u001B[49m\u001B[43m.\u001B[49m\u001B[43m_handle\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mrao_context\u001B[49m\u001B[43m=\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43m_handle\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m=\u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m.\u001B[49m\u001B[43m_to_c_parameters\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 49\u001B[39m crac_handle = _pypowsybl.get_crac(\u001B[38;5;28mself\u001B[39m._handle)\n\u001B[32m 50\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m RaoResult(rao_result, crac_handle)\n", - "\u001B[31mPyPowsyblError\u001B[39m: Multi (GSK+LSK) shift keys not supported yet..." + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mPyPowsyblError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m rao_result \u001b[38;5;241m=\u001b[39m \u001b[43mrao_runner\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnetwork\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m rao_result\u001b[38;5;241m.\u001b[39mget_flow_cnec_results()\n", + "File \u001b[0;32m~/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/lib/python3.10/site-packages/pypowsybl/rao/impl/rao.py:48\u001b[0m, in \u001b[0;36mRao.run\u001b[0;34m(self, network, parameters)\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parameters \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 46\u001b[0m parameters \u001b[38;5;241m=\u001b[39m RaoParameters()\n\u001b[0;32m---> 48\u001b[0m rao_result \u001b[38;5;241m=\u001b[39m \u001b[43m_pypowsybl\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_rao\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnetwork\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnetwork\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_handle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrao_context\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_handle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_c_parameters\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 49\u001b[0m crac_handle \u001b[38;5;241m=\u001b[39m _pypowsybl\u001b[38;5;241m.\u001b[39mget_crac(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handle)\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m RaoResult(rao_result, crac_handle)\n", + "\u001b[0;31mPyPowsyblError\u001b[0m: Multi (GSK+LSK) shift keys not supported yet..." ] } ], - "execution_count": 27 + "source": [ + "rao_result = rao_runner.run(network, parameters)\n", + "rao_result.get_flow_cnec_results()" + ] }, { + "cell_type": "code", + "execution_count": null, + "id": "7abae46e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-27 10:02:55,929 - INFO - CIM GLSK importer could import this document.\n", + "2025-08-27 10:02:55,932 - INFO - ----- ANGLE monitoring [start]\n", + "2025-08-27 10:02:55,932 - INFO - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-08-27 10:02:55,933 - INFO - Load-flow computation [start]\n" + ] + } + ], + "source": [ + "# rao_runner = pp.rao.create_rao()\n", + "# rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")\n", + "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")\n", + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "result_with_angle_monitoring.get_angle_cnec_results()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d485b05055727a18", "metadata": { "ExecuteTime": { - "end_time": "2025-08-22T08:50:16.118799Z", - "start_time": "2025-08-22T08:50:16.084204Z" + "end_time": "2025-08-22T15:28:19.314733Z", + "start_time": "2025-08-22T15:28:19.282584Z" } }, - "cell_type": "code", + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'Rao' object has no attribute '_pypowsybl'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[41], line 10\u001b[0m\n\u001b[1;32m 8\u001b[0m rao_runner\u001b[38;5;241m.\u001b[39mset_crac_file_source(network, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mrao_runner\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pypowsybl\u001b[49m\u001b[38;5;241m.\u001b[39mget_crac(rao_runner\u001b[38;5;241m.\u001b[39m_handle))\n\u001b[1;32m 11\u001b[0m rao_result \u001b[38;5;241m=\u001b[39m rao_runner\u001b[38;5;241m.\u001b[39mrun(network, parameters)\n\u001b[1;32m 12\u001b[0m rao_result\n", + "\u001b[0;31mAttributeError\u001b[0m: 'Rao' object has no attribute '_pypowsybl'" + ] + } + ], "source": [ - "\n", + "# Simple case\n", "# import inputs\n", - "network = pp.network.load(\"./data/rao/rao_network.uct\")\n", + "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", "rao_runner = pp.rao.create_rao()\n", "parameters = RaoParameters()\n", "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/rao_crac.json\")\n", - "rao_runner.set_glsk_file_source(network, \"./data/rao/rao_glsk.xml\") \n", + "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")\n", + "# rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \n", + "print(rao_runner._pypowsybl.get_crac(rao_runner._handle))\n", "rao_result = rao_runner.run(network, parameters)\n", - "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)\n", - "result_with_voltage_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" - ], + "rao_result\n", + "# result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "401bfe71eca4e166", + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-22T08:50:16.118799Z", + "start_time": "2025-08-22T08:50:16.084204Z" + } + }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-08-22 10:50:16,087 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,088 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,088 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,089 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,089 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,089 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,090 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,090 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,090 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,091 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,091 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,092 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,092 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,092 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,092 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-22 10:50:16,093 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-08-22 10:50:16,093 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-08-22 10:50:16,094 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-08-22 10:50:16,094 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-08-22 10:50:16,098 - WARNING - CRAC importer 2.8 might not be longer compatible with json CRAC version 1.3, consider updating your json CRAC file\n", - "2025-08-22 10:50:16,099 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-08-22 10:50:16,099 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-08-22 10:50:16,100 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-08-22 10:50:16,101 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-08-22 10:50:16,101 - WARNING - The initial tap is now read from the network so the value in the crac will not be read\n", - "2025-08-22 10:50:16,101 - WARNING - The tap to angle conversion map is now read from the network so the value in the crac will not be read\n", - "2025-08-22 10:50:16,102 - INFO - CIM GLSK importer could not import this document.\n", - "2025-08-22 10:50:16,103 - INFO - UCTE GLSK importer could import this document.\n", - "2025-08-22 10:50:16,104 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-08-22 10:50:16,104 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-08-22 10:50:16,104 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,104 - WARNING - A threshold for the flowCnec BBE2AA1 FFR3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec FFR1AA1 FFR2AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec FFR2AA1 DDE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec NNL1AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec NNL2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec DDE2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,105 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec BBE2AA1 FFR3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec FFR1AA1 FFR2AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec FFR2AA1 DDE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec NNL1AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec NNL2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,106 - WARNING - A threshold for the flowCnec DDE2AA1 NNL3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-08-22 10:50:16,107 - WARNING - Contingency Contingency FR1 FR3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-08-22 10:50:16,108 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-08-22 10:50:16,109 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-08-22 10:50:16,109 - INFO - Network {CC0 SC0} balance: active generation=24000.0 MW, active load=24000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-08-22 10:50:16,109 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-08-22 10:50:16,110 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-08-22 10:50:16,110 - INFO - Running AC sensitivity analysis with 14 factors and 0 contingencies\n", - "2025-08-22 10:50:16,110 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-08-22 10:50:16,111 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-6.497913318526116E-10, distributedActivePower=0.0))\n", - "2025-08-22 10:50:16,111 - INFO - Initial sensitivity analysis: cost = -2666.26 (functional: -2666.26, virtual: 0.0)\n", - "2025-08-22 10:50:16,112 - INFO - Limiting element #01: margin = 2666.26 MW, element FFR1AA1 FFR2AA1 1 at state preventive, CNEC ID = \"FFR1AA1 FFR2AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,112 - INFO - Limiting element #02: margin = 3499.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,112 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-08-22 10:50:16,112 - INFO - Stop criterion reached on Root leaf, cost: -2666.26 (functional: -2666.26, virtual: 0.0)\n", - "2025-08-22 10:50:16,113 - INFO - Limiting element #01: margin = 2666.26 MW, element FFR1AA1 FFR2AA1 1 at state preventive, CNEC ID = \"FFR1AA1 FFR2AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,113 - INFO - Limiting element #02: margin = 3499.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,113 - INFO - Limiting element #03: margin = 3500.22 MW, element FFR2AA1 DDE3AA1 1 at state preventive, CNEC ID = \"FFR2AA1 DDE3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,113 - INFO - Limiting element #04: margin = 3999.78 MW, element DDE2AA1 NNL3AA1 1 at state preventive, CNEC ID = \"DDE2AA1 NNL3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,113 - INFO - Limiting element #05: margin = 4333.2 MW, element NNL1AA1 NNL3AA1 1 at state preventive, CNEC ID = \"NNL1AA1 NNL3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,114 - INFO - Scenario \"preventive\": initial cost = -2666.26 (functional: -2666.26, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -2666.26 (functional: -2666.26, virtual: 0.0)\n", - "2025-08-22 10:50:16,114 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-08-22 10:50:16,114 - INFO - Limiting element #01: margin = 2666.26 MW, element FFR1AA1 FFR2AA1 1 at state preventive, CNEC ID = \"FFR1AA1 FFR2AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,114 - INFO - Limiting element #02: margin = 3499.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,114 - INFO - Limiting element #03: margin = 3500.22 MW, element FFR2AA1 DDE3AA1 1 at state preventive, CNEC ID = \"FFR2AA1 DDE3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,115 - INFO - Limiting element #04: margin = 3999.78 MW, element DDE2AA1 NNL3AA1 1 at state preventive, CNEC ID = \"DDE2AA1 NNL3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,115 - INFO - Limiting element #05: margin = 4333.2 MW, element NNL1AA1 NNL3AA1 1 at state preventive, CNEC ID = \"NNL1AA1 NNL3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,115 - INFO - Limiting element #06: margin = 4500.22 MW, element BBE2AA1 FFR3AA1 1 at state preventive, CNEC ID = \"BBE2AA1 FFR3AA1 1 - preventive\"\n", - "2025-08-22 10:50:16,115 - INFO - Cost before RAO = -2666.26 (functional: -2666.26, virtual: 0.0), cost after RAO = -2666.26 (functional: -2666.26, virtual: 0.0)\n", - "2025-08-22 10:50:16,116 - INFO - ----- ANGLE monitoring [start]\n", - "2025-08-22 10:50:16,116 - WARNING - No Cnecs of type 'ANGLE' defined.\n", - "2025-08-22 10:50:16,116 - INFO - ----- ANGLE monitoring [end]\n", - "2025-08-22 10:50:16,117 - INFO - ----- ANGLE monitoring [start]\n", - "2025-08-22 10:50:16,117 - WARNING - No Cnecs of type 'ANGLE' defined.\n", - "2025-08-22 10:50:16,117 - INFO - ----- ANGLE monitoring [end]\n" + "2025-08-26 09:39:54,801 - ERROR - File ./data/rao/rao_network.uct does not exist\n", + "com.powsybl.commons.PowsyblException: File ./data/rao/rao_network.uct does not exist\n", + "\tat com.powsybl.commons.datasource.DataSource.fromPath(DataSource.java:38)\n", + "\tat com.powsybl.iidm.network.Network.read(Network.java:125)\n", + "\tat com.powsybl.iidm.network.Network.read(Network.java:135)\n", + "\tat com.powsybl.python.network.NetworkCFunctions.lambda$loadNetwork$9(NetworkCFunctions.java:199)\n", + "\tat com.powsybl.python.commons.Util.doCatch(Util.java:144)\n", + "\tat com.powsybl.python.network.NetworkCFunctions.loadNetwork(NetworkCFunctions.java:191)\n", + "\n" + ] + }, + { + "ename": "PyPowsyblError", + "evalue": "File ./data/rao/rao_network.uct does not exist", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mPyPowsyblError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[11], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# import inputs\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m network \u001b[38;5;241m=\u001b[39m \u001b[43mpp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnetwork\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m./data/rao/rao_network.uct\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m rao_runner \u001b[38;5;241m=\u001b[39m pp\u001b[38;5;241m.\u001b[39mrao\u001b[38;5;241m.\u001b[39mcreate_rao()\n\u001b[1;32m 4\u001b[0m parameters \u001b[38;5;241m=\u001b[39m RaoParameters()\n", + "File \u001b[0;32m~/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/lib/python3.10/site-packages/pypowsybl/network/impl/network_creation_util.py:242\u001b[0m, in \u001b[0;36mload\u001b[0;34m(file, parameters, post_processors, reporter, report_node, allow_variant_multi_thread_access)\u001b[0m\n\u001b[1;32m 240\u001b[0m report_node \u001b[38;5;241m=\u001b[39m reporter\n\u001b[1;32m 241\u001b[0m file \u001b[38;5;241m=\u001b[39m path_to_str(file)\n\u001b[0;32m--> 242\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m Network(\u001b[43m_pp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_network\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 243\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 244\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpost_processors\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpost_processors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 245\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mreport_node\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mreport_node\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_report_node\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# pylint: disable=protected-access\u001b[39;49;00m\n\u001b[1;32m 246\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_variant_multi_thread_access\u001b[49m\u001b[43m)\u001b[49m)\n", + "\u001b[0;31mPyPowsyblError\u001b[0m: File ./data/rao/rao_network.uct does not exist" ] } ], - "execution_count": 7 + "source": [ + "\n", + "# import inputs\n", + "network = pp.network.load(\"./data/rao/rao_network.uct\")\n", + "rao_runner = pp.rao.create_rao()\n", + "parameters = RaoParameters()\n", + "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", + "rao_runner.set_crac_file_source(network, \"./data/rao/rao_crac.json\")\n", + "rao_runner.set_glsk_file_source(network, \"./data/rao/rao_glsk.xml\") \n", + "rao_result = rao_runner.run(network, parameters)\n", + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)\n", + "result_with_voltage_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "Launch monitoring", - "id": "4d2a8003fc3963d7" + "id": "4d2a8003fc3963d7", + "metadata": {}, + "source": [ + "Launch monitoring" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "", - "id": "fffb8abf917e0f7f" + "id": "fffb8abf917e0f7f", + "metadata": {}, + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" + ] + } + ], + "source": [] }, { - "metadata": {}, "cell_type": "markdown", - "source": "", - "id": "624e989b754dc4c6" + "id": "624e989b754dc4c6", + "metadata": {}, + "source": [] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "abee38543c99f812", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-26 09:41:21,290 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,291 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,292 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,293 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,293 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,294 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,294 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,295 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,295 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,296 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,296 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,297 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,297 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,298 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,298 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,299 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,299 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-08-26 09:41:21,300 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-08-26 09:41:21,300 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-08-26 09:41:21,300 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-08-26 09:41:21,301 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'crac' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[14], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m n12 \u001b[38;5;241m=\u001b[39m pp\u001b[38;5;241m.\u001b[39mnetwork\u001b[38;5;241m.\u001b[39mload(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m./data/rao/12_node_network.uct\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 3\u001b[0m rao_runner \u001b[38;5;241m=\u001b[39m pp\u001b[38;5;241m.\u001b[39mrao\u001b[38;5;241m.\u001b[39mcreate_rao()\n\u001b[0;32m----> 4\u001b[0m rao_runner\u001b[38;5;241m.\u001b[39mrun_angle_monitoring(network, \u001b[43mcrac\u001b[49m)\n\u001b[1;32m 8\u001b[0m rao_runner\u001b[38;5;241m.\u001b[39mset_crac_file_source(n12, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m./data/rao/N_case_crac.json\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 9\u001b[0m rao_parameters \u001b[38;5;241m=\u001b[39m RaoParameters()\n", + "\u001b[0;31mNameError\u001b[0m: name 'crac' is not defined" + ] + } + ], "source": [ "# prepare inputs\n", "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", "rao_runner = pp.rao.create_rao()\n", - "rao_runner.run_angle_monitoring()\n", + "rao_runner.run_angle_monitoring(network, crac)\n", "\n", "\n", "\n", @@ -272,32 +707,64 @@ "#run rao\n", "raoResult = rao_runner.run(n12, rao_parameters)\n", "result_json = raoResult.to_json()" - ], - "id": "abee38543c99f812" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "", - "id": "f72e1a5e5daa7bc3" + "id": "f72e1a5e5daa7bc3", + "metadata": {}, + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" + ] + } + ], + "source": [] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "", - "id": "bb6b0a9f406cfc57" + "id": "bb6b0a9f406cfc57", + "metadata": {}, + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" + ] + } + ], + "source": [] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "", - "id": "af10073ecc8db95a" + "id": "af10073ecc8db95a", + "metadata": {}, + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", + "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", + "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" + ] + } + ], + "source": [] } ], "metadata": { @@ -309,14 +776,14 @@ "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.10.12" } }, "nbformat": 4, From ddce1d8fc3573d7cbb339f57bf2000b5586899f9 Mon Sep 17 00:00:00 2001 From: Thomas Bouquet Date: Wed, 27 Aug 2025 11:43:05 +0200 Subject: [PATCH 09/18] duplicate open rao angle test --- .../angle_monitoring_crac.json | 262 ++- open_rao_monitoring.ipynb | 1778 +++++++++++++++-- 2 files changed, 1825 insertions(+), 215 deletions(-) diff --git a/data/rao/angle_monitoring/angle_monitoring_crac.json b/data/rao/angle_monitoring/angle_monitoring_crac.json index 0b6a49d..70763d5 100644 --- a/data/rao/angle_monitoring/angle_monitoring_crac.json +++ b/data/rao/angle_monitoring/angle_monitoring_crac.json @@ -1,87 +1,181 @@ { - "type" : "CRAC", - "version" : "2.7", - "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", - "id" : "complex_case", - "name" : "complex_case", - "instants" : [ { - "id" : "preventive", - "kind" : "PREVENTIVE" - }, { - "id" : "outage", - "kind" : "OUTAGE" - }, { - "id" : "auto", - "kind" : "AUTO" - }, { - "id" : "curative", - "kind" : "CURATIVE" - } ], - "ra-usage-limits-per-instant" : [ ], - "networkElementsNamePerId" : { }, - "contingencies" : [ { - "id" : "Co-1", - "name" : "Co-1-name", - "networkElementsIds" : [ "_ffbabc27-1ccd-4fdc-b037-e341706c8d29" ] - }, { - "id" : "Co-2", - "name" : "Co-2-name", - "networkElementsIds" : [ "_b18cd1aa-7808-49b9-a7cf-605eaf07b006 + _e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc" ] - } ], - "flowCnecs" : [ ], - "angleCnecs" : [ { - "id" : "AngleCnec1", - "name" : "AngleCnec1-name", - "exportingNetworkElementId" : "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", - "importingNetworkElementId" : "_d77b61ef-61aa-4b22-95f6-b56ca080788d", - "operator" : null, - "border" : "", - "instant" : "curative", - "contingencyId" : "Co-1", - "optimized" : false, - "monitored" : true, - "reliabilityMargin" : 0.0, - "thresholds" : [ { - "unit" : "degree", - "max" : 3.0 - } ] - }, { - "id" : "AngleCnec2", - "name" : "AngleCnec2-name", - "exportingNetworkElementId" : "_b7998ae6-0cc6-4dfe-8fec-0b549b07b6c3", - "importingNetworkElementId" : "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", - "operator" : null, - "border" : "", - "instant" : "curative", - "contingencyId" : "Co-2", - "optimized" : false, - "monitored" : true, - "reliabilityMargin" : 0.0, - "thresholds" : [ { - "unit" : "degree", - "max" : 47.0 - } ] - } ], - "voltageCnecs" : [ ], - "pstRangeActions" : [ ], - "hvdcRangeActions" : [ ], - "injectionRangeActions" : [ ], - "counterTradeRangeActions" : [ ], - "networkActions" : [ { - "id" : "RA-1", - "name" : "Decrease Generation and open line", - "operator" : "RA", - "onConstraintUsageRules" : [ { - "instant" : "curative", - "cnecId" : "AngleCnec1", - "usageMethod" : "available" - } ], - "generatorActions" : [ { - "networkElementId" : "_1dc9afba-23b5-41a0-8540-b479ed8baf4b", - "activePowerValue" : 0.0 + "type": "CRAC", + "version": "2.7", + "info": "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id": "complex_case", + "name": "complex_case", + "instants": [ + { + "id": "preventive", + "kind": "PREVENTIVE" + }, + { + "id": "outage", + "kind": "OUTAGE" + }, + { + "id": "auto", + "kind": "AUTO" + }, + { + "id": "curative", + "kind": "CURATIVE" + } + ], + "ra-usage-limits-per-instant": [], + "networkElementsNamePerId": {}, + "contingencies": [ + { + "id": "Co-1", + "name": "Co-1-name", + "networkElementsIds": [ + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29" + ] + }, + { + "id": "Co-2", + "name": "Co-2-name", + "networkElementsIds": [ + "_b18cd1aa-7808-49b9-a7cf-605eaf07b006 + _e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc" + ] + } + ], + "flowCnecs": [ + { + "id": "FlowCnec", + "name": "FlowCnec", + "networkElementId": "_b58bf21a-096a-4dae-9a01-3f03b60c24c7", + "instant": "preventive", + "contingencyId": null, + "optimized": true, + "monitored": false, + "iMax": [ + 2000.0 + ], + "nominalV": [ + 380.0 + ], + "thresholds": [ + { + "unit": "percent_imax", + "min": -1, + "max": 1, + "side": 1 + } + ] }, { - "networkElementId" : "_550ebe0d-f2b2-48c1-991f-cebea43a21aa", - "activePowerValue" : 10.0 - } ] - } ] + "id": "FlowCnec - Co-1", + "name": "FlowCnec - Co-1", + "networkElementId": "_b58bf21a-096a-4dae-9a01-3f03b60c24c7", + "instant": "curative", + "contingencyId": "Co-1", + "optimized": true, + "monitored": false, + "iMax": [ + 2000.0 + ], + "nominalV": [ + 380.0 + ], + "thresholds": [ + { + "unit": "percent_imax", + "min": -1, + "max": 1, + "side": 1 + } + ] + }, { + "id": "FlowCnec - Co-2", + "name": "FlowCnec - Co-2", + "networkElementId": "_b58bf21a-096a-4dae-9a01-3f03b60c24c7", + "instant": "curative", + "contingencyId": "Co-2", + "optimized": true, + "monitored": false, + "iMax": [ + 2000.0 + ], + "nominalV": [ + 380.0 + ], + "thresholds": [ + { + "unit": "percent_imax", + "min": -1, + "max": 1, + "side": 1 + } + ] + } + ], + "angleCnecs": [ + { + "id": "AngleCnec1", + "name": "AngleCnec1-name", + "exportingNetworkElementId": "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", + "importingNetworkElementId": "_d77b61ef-61aa-4b22-95f6-b56ca080788d", + "operator": null, + "border": "", + "instant": "curative", + "contingencyId": "Co-1", + "optimized": false, + "monitored": true, + "reliabilityMargin": 0.0, + "thresholds": [ + { + "unit": "degree", + "max": 3.0 + } + ] + }, + { + "id": "AngleCnec2", + "name": "AngleCnec2-name", + "exportingNetworkElementId": "_b7998ae6-0cc6-4dfe-8fec-0b549b07b6c3", + "importingNetworkElementId": "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", + "operator": null, + "border": "", + "instant": "curative", + "contingencyId": "Co-2", + "optimized": false, + "monitored": true, + "reliabilityMargin": 0.0, + "thresholds": [ + { + "unit": "degree", + "max": 47.0 + } + ] + } + ], + "voltageCnecs": [], + "pstRangeActions": [], + "hvdcRangeActions": [], + "injectionRangeActions": [], + "counterTradeRangeActions": [], + "networkActions": [ + { + "id": "RA-1", + "name": "Decrease Generation and open line", + "operator": "RA", + "onConstraintUsageRules": [ + { + "instant": "curative", + "cnecId": "AngleCnec1", + "usageMethod": "available" + } + ], + "generatorActions": [ + { + "networkElementId": "_1dc9afba-23b5-41a0-8540-b479ed8baf4b", + "activePowerValue": 0.0 + }, + { + "networkElementId": "_550ebe0d-f2b2-48c1-991f-cebea43a21aa", + "activePowerValue": 10.0 + } + ] + } + ] } \ No newline at end of file diff --git a/open_rao_monitoring.ipynb b/open_rao_monitoring.ipynb index b940ae2..f4d01af 100644 --- a/open_rao_monitoring.ipynb +++ b/open_rao_monitoring.ipynb @@ -18,7 +18,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "initial_id", "metadata": { "ExecuteTime": { @@ -32,13 +32,13 @@ "#pip install pypowsybl==1.12.0\n", "# set up logging\n", "import logging\n", - "logging.getLogger('powsybl').setLevel(logging.DEBUG)\n", - "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')" + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "4689861f15ffc23c", "metadata": { "ExecuteTime": { @@ -46,15 +46,7 @@ "start_time": "2025-08-22T12:32:20.828106Z" } }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-27 10:04:34,629 - DEBUG - Max heap is 8008 MB\n" - ] - } - ], + "outputs": [], "source": [ "import pypowsybl as pp\n", "from pypowsybl.rao import Parameters as RaoParameters\n", @@ -64,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 14, "id": "e02c6f39998e2d2e", "metadata": {}, "outputs": [], @@ -77,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 15, "id": "36289c2d67cf8b64", "metadata": {}, "outputs": [], @@ -87,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 16, "id": "52f199b7", "metadata": {}, "outputs": [ @@ -95,34 +87,120 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-27 10:04:34,658 - INFO - Using platform configuration provider classic\n", - "2025-08-27 10:04:34,658 - INFO - Platform configuration defined by YAML file /home/bouquettho/.itools/config.yml\n", - "2025-08-27 10:04:34,661 - INFO - LocalComputationConfig [localDir=/tmp, availableCore=8]\n", - "2025-08-27 10:04:34,663 - INFO - Configuring StAX XMLInputFactory...\n", - "2025-08-27 10:04:34,664 - INFO - Some properties may not be supported by your implementation.\n", - "2025-08-27 10:04:34,665 - INFO - This may not be a problem because some are overlapping.\n", - "2025-08-27 10:04:34,666 - INFO - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/property/accessExternalStylesheet\n", - "2025-08-27 10:04:34,667 - INFO - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/feature/secure-processing\n", - "2025-08-27 10:04:34,672 - DEBUG - XIIDM import done in 3 ms\n", - "2025-08-27 10:04:34,673 - INFO - Loading component library from /DefaultLibrary...\n", - "2025-08-27 10:04:34,679 - DEBUG - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-08-27 10:04:34,680 - DEBUG - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-08-27 10:04:34,681 - DEBUG - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-08-27 10:04:34,682 - DEBUG - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-08-27 10:04:34,682 - DEBUG - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-08-27 10:04:34,683 - DEBUG - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-08-27 10:04:34,683 - DEBUG - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-08-27 10:04:34,684 - INFO - Loading component library from /DefaultLibrary...\n", - "2025-08-27 10:04:34,686 - DEBUG - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-08-27 10:04:34,686 - DEBUG - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-08-27 10:04:34,687 - DEBUG - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-08-27 10:04:34,688 - DEBUG - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-08-27 10:04:34,688 - DEBUG - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-08-27 10:04:34,689 - DEBUG - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-08-27 10:04:34,690 - DEBUG - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-08-27 10:04:34,690 - INFO - Number of steps: 139\n", - "2025-08-27 10:04:34,691 - INFO - Elapsed time: 1.47836E-4\n", - "2025-08-27 10:04:34,691 - WARNING - Base voltage configuration file '/home/bouquettho/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" + "2025-08-27 11:22:49,071 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-08-27 11:22:49,071 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-08-27 11:22:49,075 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ DC_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-08-27 11:22:49,076 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-08-27 11:22:49,077 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-08-27 11:22:49,078 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-08-27 11:22:49,078 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-08-27 11:22:49,079 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-08-27 11:22:49,079 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-08-27 11:22:49,080 - INFO - powsybl - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", + "2025-08-27 11:22:49,081 - INFO - powsybl - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=-0.0))\n", + "2025-08-27 11:22:49,081 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.16823832099825964, distributedActivePower=0.0))\n", + "2025-08-27 11:22:49,082 - INFO - powsybl - Load flow ran in 10 ms\n", + "2025-08-27 11:22:49,083 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-08-27 11:22:49,084 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-08-27 11:22:49,085 - INFO - powsybl - Number of steps: 139\n", + "2025-08-27 11:22:49,086 - INFO - powsybl - Elapsed time: 1.16123E-4\n", + "2025-08-27 11:22:49,086 - WARNING - powsybl - Base voltage configuration file '/home/bouquettho/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" ] }, { @@ -363,19 +441,19 @@ " \n", " \n", " \n", - " 50\n", + " 0\n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " -50\n", + " 0\n", " \n", " \n", " \n", @@ -408,45 +486,50 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "pp.loadflow.run_ac(network)\n", "network.get_network_area_diagram()" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "id": "f8e14fd0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Parameters(voltage_init_mode=UNIFORM_VALUES, transformer_voltage_control_on=False, use_reactive_limits=True, phase_shifter_regulation_on=False, twt_split_shunt_admittance=True, shunt_compensator_voltage_control_on=False, read_slack_bus=False, write_slack_bus=False, distributed_slack=True, balance_type=PROPORTIONAL_TO_GENERATION_P, dc_use_transformer_ratio=False, countries_to_balance=['BE', 'FR', 'TR', 'GR', 'UA', 'RS', 'NL', 'SK', 'ES', 'AL', 'SI', 'CZ', 'ME', 'BA', 'HU', 'BG', 'IT', 'PL', 'RO', 'PT', 'HR', 'DE', 'AT', 'MK', 'CH'], connected_component_mode=, hvdc_ac_emulation=True, dc_power_factor=1.0, provider_parameters={})" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "parameters = RaoParameters()\n", "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", + "load_flow_parameters" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 18, "id": "830592d3", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-27 10:04:34,724 - INFO - CIM GLSK importer could import this document.\n" - ] - } - ], + "outputs": [], "source": [ "rao_runner = pp.rao.create_rao()\n", "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")" @@ -454,7 +537,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 19, "id": "0f76c1be", "metadata": {}, "outputs": [ @@ -462,30 +545,150 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-27 10:04:34,732 - ERROR - Multi (GSK+LSK) shift keys not supported yet...\n", - "com.powsybl.glsk.commons.GlskException: Multi (GSK+LSK) shift keys not supported yet...\n", - "\tat com.powsybl.glsk.api.util.converters.GlskPointLinearGlskConverter.convert(GlskPointLinearGlskConverter.java:56)\n", - "\tat com.powsybl.glsk.api.util.ZonalDataFromGlskDocument.addLinearDataFromList(ZonalDataFromGlskDocument.java:56)\n", - "\tat com.powsybl.glsk.api.util.ZonalDataFromGlskDocument.(ZonalDataFromGlskDocument.java:48)\n", - "\tat com.powsybl.glsk.api.GlskDocument.getZonalGlsks(GlskDocument.java:41)\n", - "\tat com.powsybl.python.rao.RaoContext.run(RaoContext.java:51)\n", - "\tat com.powsybl.python.rao.RaoCFunctions.lambda$runRao$6(RaoCFunctions.java:136)\n", - "\tat com.powsybl.python.commons.Util.doCatch(Util.java:144)\n", - "\tat com.powsybl.python.rao.RaoCFunctions.runRao(RaoCFunctions.java:132)\n", - "\n" + "2025-08-27 11:22:49,113 - WARNING - powsybl - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-08-27 11:22:49,114 - WARNING - powsybl - Contingency coL1L2 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-08-27 11:22:49,114 - WARNING - powsybl - Contingency coL1 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-08-27 11:22:49,115 - WARNING - powsybl - Contingency coL2 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-08-27 11:22:49,116 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-08-27 11:22:49,116 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-08-27 11:22:49,117 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", + "2025-08-27 11:22:49,117 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-08-27 11:22:49,118 - INFO - powsybl - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-08-27 11:22:49,118 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-08-27 11:22:49,119 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-08-27 11:22:49,120 - INFO - powsybl - Initial sensitivity analysis: cost = -1266.27 (functional: -1266.27, virtual: 0.0)\n", + "2025-08-27 11:22:49,121 - INFO - powsybl - Limiting element #01: margin = 1266.27 MW, element L1 at state preventive, CNEC ID = \"fcPrev\"\n", + "2025-08-27 11:22:49,122 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-08-27 11:22:49,122 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -1266.27 (functional: -1266.27, virtual: 0.0)\n", + "2025-08-27 11:22:49,123 - INFO - powsybl - Limiting element #01: margin = 1266.27 MW, element L1 at state preventive, CNEC ID = \"fcPrev\"\n", + "2025-08-27 11:22:49,124 - INFO - powsybl - Scenario \"preventive\": initial cost = -1266.27 (functional: -1266.27, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -1266.27 (functional: -1266.27, virtual: 0.0)\n", + "2025-08-27 11:22:49,125 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-08-27 11:22:49,125 - INFO - powsybl - Limiting element #01: margin = 1266.27 MW, element L1 at state preventive, CNEC ID = \"fcPrev\"\n", + "2025-08-27 11:22:49,126 - INFO - powsybl - Cost before RAO = -1266.27 (functional: -1266.27, virtual: 0.0), cost after RAO = -1266.27 (functional: -1266.27, virtual: 0.0)\n" ] }, { - "ename": "PyPowsyblError", - "evalue": "Multi (GSK+LSK) shift keys not supported yet...", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mPyPowsyblError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m rao_result \u001b[38;5;241m=\u001b[39m \u001b[43mrao_runner\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnetwork\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m rao_result\u001b[38;5;241m.\u001b[39mget_flow_cnec_results()\n", - "File \u001b[0;32m~/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/lib/python3.10/site-packages/pypowsybl/rao/impl/rao.py:48\u001b[0m, in \u001b[0;36mRao.run\u001b[0;34m(self, network, parameters)\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parameters \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 46\u001b[0m parameters \u001b[38;5;241m=\u001b[39m RaoParameters()\n\u001b[0;32m---> 48\u001b[0m rao_result \u001b[38;5;241m=\u001b[39m \u001b[43m_pypowsybl\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_rao\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnetwork\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnetwork\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_handle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrao_context\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_handle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_c_parameters\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 49\u001b[0m crac_handle \u001b[38;5;241m=\u001b[39m _pypowsybl\u001b[38;5;241m.\u001b[39mget_crac(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handle)\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m RaoResult(rao_result, crac_handle)\n", - "\u001b[0;31mPyPowsyblError\u001b[0m: Multi (GSK+LSK) shift keys not supported yet..." - ] + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cnec_idoptimized_instantcontingencysideflowmarginrelative_margincommercial_flowloop_flowptdf_zonal_sum
index
4fcPrevinitialONE50.0894741266.26914NaNNaNNaNNaN
5fcPrevinitialTWO0.0000001266.26914NaNNaNNaNNaN
6fcPrevpreventiveONE50.0894741266.26914NaNNaNNaNNaN
7fcPrevpreventiveTWO0.0000001266.26914NaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " cnec_id optimized_instant contingency side flow margin \\\n", + "index \n", + "4 fcPrev initial ONE 50.089474 1266.26914 \n", + "5 fcPrev initial TWO 0.000000 1266.26914 \n", + "6 fcPrev preventive ONE 50.089474 1266.26914 \n", + "7 fcPrev preventive TWO 0.000000 1266.26914 \n", + "\n", + " relative_margin commercial_flow loop_flow ptdf_zonal_sum \n", + "index \n", + "4 NaN NaN NaN NaN \n", + "5 NaN NaN NaN NaN \n", + "6 NaN NaN NaN NaN \n", + "7 NaN NaN NaN NaN " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -495,7 +698,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "7abae46e", "metadata": {}, "outputs": [ @@ -503,10 +706,10 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-27 10:02:55,929 - INFO - CIM GLSK importer could import this document.\n", - "2025-08-27 10:02:55,932 - INFO - ----- ANGLE monitoring [start]\n", - "2025-08-27 10:02:55,932 - INFO - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", - "2025-08-27 10:02:55,933 - INFO - Load-flow computation [start]\n" + "2025-08-27 11:22:49,147 - INFO - powsybl - CIM GLSK importer could import this document.\n", + "2025-08-27 11:22:49,149 - INFO - powsybl - ----- ANGLE monitoring [start]\n", + "2025-08-27 11:22:49,149 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-08-27 11:22:49,150 - INFO - powsybl - Load-flow computation [start]\n" ] } ], @@ -530,15 +733,72 @@ }, "outputs": [ { - "ename": "AttributeError", - "evalue": "'Rao' object has no attribute '_pypowsybl'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[41], line 10\u001b[0m\n\u001b[1;32m 8\u001b[0m rao_runner\u001b[38;5;241m.\u001b[39mset_crac_file_source(network, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mrao_runner\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pypowsybl\u001b[49m\u001b[38;5;241m.\u001b[39mget_crac(rao_runner\u001b[38;5;241m.\u001b[39m_handle))\n\u001b[1;32m 11\u001b[0m rao_result \u001b[38;5;241m=\u001b[39m rao_runner\u001b[38;5;241m.\u001b[39mrun(network, parameters)\n\u001b[1;32m 12\u001b[0m rao_result\n", - "\u001b[0;31mAttributeError\u001b[0m: 'Rao' object has no attribute '_pypowsybl'" - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cnec_idoptimized_instantcontingencyanglemargin
index
2acCur2curativecoL1NaNNaN
3acCur1curativecoL1NaNNaN
\n", + "
" + ], + "text/plain": [ + " cnec_id optimized_instant contingency angle margin\n", + "index \n", + "2 acCur2 curative coL1 NaN NaN\n", + "3 acCur1 curative coL1 NaN NaN" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -550,11 +810,10 @@ "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")\n", - "# rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \n", - "print(rao_runner._pypowsybl.get_crac(rao_runner._handle))\n", "rao_result = rao_runner.run(network, parameters)\n", - "rao_result\n", - "# result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" + "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \n", + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "result_with_angle_monitoring.get_angle_cnec_results()" ] }, { @@ -568,21 +827,6 @@ } }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-26 09:39:54,801 - ERROR - File ./data/rao/rao_network.uct does not exist\n", - "com.powsybl.commons.PowsyblException: File ./data/rao/rao_network.uct does not exist\n", - "\tat com.powsybl.commons.datasource.DataSource.fromPath(DataSource.java:38)\n", - "\tat com.powsybl.iidm.network.Network.read(Network.java:125)\n", - "\tat com.powsybl.iidm.network.Network.read(Network.java:135)\n", - "\tat com.powsybl.python.network.NetworkCFunctions.lambda$loadNetwork$9(NetworkCFunctions.java:199)\n", - "\tat com.powsybl.python.commons.Util.doCatch(Util.java:144)\n", - "\tat com.powsybl.python.network.NetworkCFunctions.loadNetwork(NetworkCFunctions.java:191)\n", - "\n" - ] - }, { "ename": "PyPowsyblError", "evalue": "File ./data/rao/rao_network.uct does not exist", @@ -597,7 +841,6 @@ } ], "source": [ - "\n", "# import inputs\n", "network = pp.network.load(\"./data/rao/rao_network.uct\")\n", "rao_runner = pp.rao.create_rao()\n", @@ -605,10 +848,10 @@ "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", "rao_runner.set_crac_file_source(network, \"./data/rao/rao_crac.json\")\n", - "rao_runner.set_glsk_file_source(network, \"./data/rao/rao_glsk.xml\") \n", + "rao_runner.set_glsk_file_source(network, \"./data/rao/rao_glsk.xml\")\n", "rao_result = rao_runner.run(network, parameters)\n", "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)\n", - "result_with_voltage_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)" + "result_with_voltage_monitoring = rao_runner.run_voltage_monitoring(network, rao_result, load_flow_parameters)" ] }, { @@ -747,23 +990,1296 @@ ], "source": [] }, + { + "cell_type": "markdown", + "id": "78577c35", + "metadata": {}, + "source": [ + "## OpenRAO test" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "af10073ecc8db95a", "metadata": {}, "outputs": [ { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", - "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", - "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" - ] - } - ], + "data": { + "image/svg+xml": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 115\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -114\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 21\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -7\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 20\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -23\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 36\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -85\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 85\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -53\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 60\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -116\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 120\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -100\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 100\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -81\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 85\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -100\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 106\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -576\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 577\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -277\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 278\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -176\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 177\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -82\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -31\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 113\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
380.0
\n", + "
\n", + " 414.2 kV / 0.0°
\n", + "
\n", + "
\n", + "
10.5
\n", + "
\n", + " 10.4 kV / 3.7°
\n", + "
\n", + "
\n", + "
225.0
\n", + "
\n", + " 225.6 kV / 1.4°
\n", + "
\n", + " 222.7 kV / 5.0°
\n", + "
\n", + "
\n", + "
110.0
\n", + "
\n", + " 115.5 kV / 1.4°
\n", + "
\n", + "
\n", + "
15.8
\n", + "
\n", + " 16.0 kV / 19.6°
\n", + "
\n", + " 16.0 kV / 21.7°
\n", + "
\n", + "
\n", + "
21.0
\n", + "
\n", + " 22.0 kV / 1.2°
\n", + "
\n", + "
\n", + "
225.0
\n", + "
\n", + " 224.5 kV / 0.3°
\n", + "
\n", + "
\n", + "
400.0
\n", + "
\n", + " 410.6 kV / 0.2°
\n", + "
\n", + "
\n", + "
220.0
\n", + "
\n", + " 224.2 kV / 17.9°
\n", + "
\n", + "
\n", + "
\n", + "
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "network = pp.network.load(\"./data/rao/angle_monitoring/monitoring_network.xiidm\")\n", + "pp.loadflow.run_ac(network)\n", + "network.get_network_area_diagram()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74e054af", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namerxg1b1g2b2p1q1i1p2q2i2voltage_level1_idvoltage_level2_idbus1_idbus2_idconnected1connected2
id
_ffbabc27-1ccd-4fdc-b037-e341706c8d29BE-Line_65.20371.000000.0000600.0000100.0000600.000010-53.47770011.654010140.75960959.822208-7.948895156.451326_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_69ef0dbd-da79-4eef-a02f-690cb8a28361_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0_69ef0dbd-da79-4eef-a02f-690cb8a28361_0TrueTrue
_b58bf21a-096a-4dae-9a01-3f03b60c24c7BE-Line_21.93534.200000.0000340.0000210.0000340.000021-116.12846322.242985304.083434120.057195-14.573272313.531203_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_69ef0dbd-da79-4eef-a02f-690cb8a28361_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0_69ef0dbd-da79-4eef-a02f-690cb8a28361_0TrueTrue
_df16b3dd-c905-4a6f-84ee-f067be86f5daSER-RLC-12308229860.000-31.830990.0000000.0000000.0000000.000000-99.60410916.957373261.93767799.604109-23.509275261.937677_69ef0dbd-da79-4eef-a02f-690cb8a28361_69ef0dbd-da79-4eef-a02f-690cb8a28361_69ef0dbd-da79-4eef-a02f-690cb8a28361_0_69ef0dbd-da79-4eef-a02f-690cb8a28361_3TrueTrue
\n", + "
" + ], + "text/plain": [ + " name r x \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 BE-Line_6 5.203 71.00000 \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 BE-Line_2 1.935 34.20000 \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da SER-RLC-1230822986 0.000 -31.83099 \n", + "\n", + " g1 b1 g2 b2 \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 0.000060 0.000010 0.000060 0.000010 \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 0.000034 0.000021 0.000034 0.000021 \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da 0.000000 0.000000 0.000000 0.000000 \n", + "\n", + " p1 q1 i1 \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 -53.477700 11.654010 140.759609 \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 -116.128463 22.242985 304.083434 \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da -99.604109 16.957373 261.937677 \n", + "\n", + " p2 q2 i2 \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 59.822208 -7.948895 156.451326 \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 120.057195 -14.573272 313.531203 \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da 99.604109 -23.509275 261.937677 \n", + "\n", + " voltage_level1_id \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", + "\n", + " voltage_level2_id \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", + "\n", + " bus1_id \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0 \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0 \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361_0 \n", + "\n", + " bus2_id \\\n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _69ef0dbd-da79-4eef-a02f-690cb8a28361_0 \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _69ef0dbd-da79-4eef-a02f-690cb8a28361_0 \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361_3 \n", + "\n", + " connected1 connected2 \n", + "id \n", + "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 True True \n", + "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 True True \n", + "_df16b3dd-c905-4a6f-84ee-f067be86f5da True True " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "network.get_lines()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "de9936b5", + "metadata": {}, + "outputs": [], + "source": [ + "parameters = RaoParameters()\n", + "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c7e482ac", + "metadata": {}, + "outputs": [], + "source": [ + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_crac.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fd5a75b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cnec_idoptimized_instantcontingencysideflowmarginrelative_margincommercial_flowloop_flowptdf_zonal_sum
index
0FlowCnec - Co-1initialCo-1ONE-156.3685611159.990052NaNNaNNaNNaN
1FlowCnec - Co-1initialCo-1TWO0.0000001159.990052NaNNaNNaNNaN
2FlowCnec - Co-1curativeCo-1ONE-156.3685611159.990052NaNNaNNaNNaN
3FlowCnec - Co-1curativeCo-1TWO0.0000001159.990052NaNNaNNaNNaN
4FlowCnec - Co-2initialCo-2ONE-116.1645151200.194098NaNNaNNaNNaN
5FlowCnec - Co-2initialCo-2TWO0.0000001200.194098NaNNaNNaNNaN
6FlowCnec - Co-2curativeCo-2ONE-116.1645151200.194098NaNNaNNaNNaN
7FlowCnec - Co-2curativeCo-2TWO0.0000001200.194098NaNNaNNaNNaN
8FlowCnecinitialONE-116.1015491200.257065NaNNaNNaNNaN
9FlowCnecinitialTWO0.0000001200.257065NaNNaNNaNNaN
10FlowCnecpreventiveONE-116.1015491200.257065NaNNaNNaNNaN
11FlowCnecpreventiveTWO0.0000001200.257065NaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " cnec_id optimized_instant contingency side flow \\\n", + "index \n", + "0 FlowCnec - Co-1 initial Co-1 ONE -156.368561 \n", + "1 FlowCnec - Co-1 initial Co-1 TWO 0.000000 \n", + "2 FlowCnec - Co-1 curative Co-1 ONE -156.368561 \n", + "3 FlowCnec - Co-1 curative Co-1 TWO 0.000000 \n", + "4 FlowCnec - Co-2 initial Co-2 ONE -116.164515 \n", + "5 FlowCnec - Co-2 initial Co-2 TWO 0.000000 \n", + "6 FlowCnec - Co-2 curative Co-2 ONE -116.164515 \n", + "7 FlowCnec - Co-2 curative Co-2 TWO 0.000000 \n", + "8 FlowCnec initial ONE -116.101549 \n", + "9 FlowCnec initial TWO 0.000000 \n", + "10 FlowCnec preventive ONE -116.101549 \n", + "11 FlowCnec preventive TWO 0.000000 \n", + "\n", + " margin relative_margin commercial_flow loop_flow \\\n", + "index \n", + "0 1159.990052 NaN NaN NaN \n", + "1 1159.990052 NaN NaN NaN \n", + "2 1159.990052 NaN NaN NaN \n", + "3 1159.990052 NaN NaN NaN \n", + "4 1200.194098 NaN NaN NaN \n", + "5 1200.194098 NaN NaN NaN \n", + "6 1200.194098 NaN NaN NaN \n", + "7 1200.194098 NaN NaN NaN \n", + "8 1200.257065 NaN NaN NaN \n", + "9 1200.257065 NaN NaN NaN \n", + "10 1200.257065 NaN NaN NaN \n", + "11 1200.257065 NaN NaN NaN \n", + "\n", + " ptdf_zonal_sum \n", + "index \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN \n", + "5 NaN \n", + "6 NaN \n", + "7 NaN \n", + "8 NaN \n", + "9 NaN \n", + "10 NaN \n", + "11 NaN " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rao_result = rao_runner.run(network, parameters)\n", + "rao_result.get_flow_cnec_results()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "1f058966", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cnec_idoptimized_instantcontingencyanglemargin
index
0AngleCnec2curativeCo-2-19.31024366.310243
1AngleCnec1curativeCo-15.246296-2.246296
\n", + "
" + ], + "text/plain": [ + " cnec_id optimized_instant contingency angle margin\n", + "index \n", + "0 AngleCnec2 curative Co-2 -19.310243 66.310243\n", + "1 AngleCnec1 curative Co-1 5.246296 -2.246296" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45MicroGridTest.xml\")\n", + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "result_with_angle_monitoring.get_angle_cnec_results()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6470355e", + "metadata": {}, + "outputs": [], "source": [] } ], From 7d08c8ab58766abe80e9a2d236ac21d16992aee3 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Mon, 1 Sep 2025 15:10:27 +0200 Subject: [PATCH 10/18] 1 angle monitoring test --- ...nitoring_simple_case_with_RA_on_load.json} | 89 +- open_rao_monitoring.ipynb | 2349 +++-------------- 2 files changed, 338 insertions(+), 2100 deletions(-) rename data/rao/angle_monitoring/{angle_monitoring_simple_case_with_injectionRa.json => angle_monitoring_simple_case_with_RA_on_load.json} (57%) diff --git a/data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json similarity index 57% rename from data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json rename to data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json index 5c60e6f..93f085e 100644 --- a/data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json +++ b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json @@ -2,8 +2,8 @@ "type" : "CRAC", "version" : "2.7", "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", - "id" : "simple_case_with_injectionRa", - "name" : "simple_case_with_injectionRa", + "id" : "test-crac", + "name" : "test-crac", "instants" : [ { "id" : "preventive", "kind" : "PREVENTIVE" @@ -23,49 +23,46 @@ "id" : "coL1", "name" : "coL1", "networkElementsIds" : [ "L1" ] - }, { - "id" : "coL1L2", - "name" : "coL1L2", - "networkElementsIds" : [ "L1", "L2" ] - }, { - "id" : "coL2", - "name" : "coL2", - "networkElementsIds" : [ "L2" ] - } ], - "flowCnecs" : [{ - "id" : "fcPrev", - "name" : "fcPrev", + }], + "flowCnecs" : [ { + "id" : "cnec1 - preventive", + "name" : "cnec1 - preventive", "networkElementId" : "L1", - "instant" : "preventive", - "contingencyId" : null, - "optimized" : true, - "monitored" : false, - "iMax" : [ 2000.0 ], - "nominalV" : [ 380.0 ], - "thresholds" : [ { - "unit" : "percent_imax", - "min" : -1, - "max" : 1, - "side" : 1 - } ] - } ], - "angleCnecs" : [ { - "id" : "acPrev", - "name" : "acPrev", - "exportingNetworkElementId" : "VL2", - "importingNetworkElementId" : "VL3", "operator" : null, "border" : "", "instant" : "preventive", - "contingencyId" : null, - "optimized" : false, - "monitored" : true, + "optimized" : true, + "monitored" : false, "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], "thresholds" : [ { - "unit" : "degree", - "min" : -6.0 + "unit" : "megawatt", + "min" : -5.0, + "max" : 100.0, + "side" : 2 } ] - }, { + }, + { + "id" : "cnec1 - curative", + "name" : "cnec1 - curative", + "networkElementId" : "L1", + "contingencyId" : "coL1", + "operator" : null, + "border" : "", + "instant" : "curative", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5.0, + "max" : 5.0, + "side" : 2 + } ] + } + ], + "angleCnecs" : [ { "id" : "acCur1", "name" : "acCur1", "exportingNetworkElementId" : "VL2", @@ -81,22 +78,6 @@ "unit" : "degree", "min" : -6.0 } ] - }, { - "id" : "acCur2", - "name" : "acCur2", - "exportingNetworkElementId" : "VL3", - "importingNetworkElementId" : "VL1", - "operator" : null, - "border" : "", - "instant" : "curative", - "contingencyId" : "coL1", - "optimized" : false, - "monitored" : true, - "reliabilityMargin" : 0.0, - "thresholds" : [ { - "unit" : "degree", - "min" : -6.0 - } ] } ], "voltageCnecs" : [ ], "pstRangeActions" : [ ], diff --git a/open_rao_monitoring.ipynb b/open_rao_monitoring.ipynb index f4d01af..13c95ae 100644 --- a/open_rao_monitoring.ipynb +++ b/open_rao_monitoring.ipynb @@ -4,571 +4,227 @@ "cell_type": "markdown", "id": "2fdb50ba", "metadata": {}, - "source": [ - "# Angle Monitoring in PowSyBl OpenRAO" - ] + "source": "# OpenRAO monitoring in pyPowsybl" }, { "cell_type": "markdown", "id": "efa399e1", "metadata": {}, "source": [ - "PowSyBl OpenRAO main purpose is to determine an optimal combination of remedial actions to apply on a power grid in order to remove overloads on every line. This optimization is flow-oriented. However, OpenRAO also provides a **monitoring** module that is able to check **voltage and angle constraints** and activate remedial actions." + "In this notebook, we'll explore how OpenRao monitoring algorithms work. \n", + "For network situations with angle or voltage overloads, the monitoring module will try to relieve these constraints by applying remedial actions. \n", + "\n", + "The first step is to install pypowsybl and import the library." ] }, { - "cell_type": "code", - "execution_count": 1, - "id": "initial_id", "metadata": { "ExecuteTime": { - "end_time": "2025-08-22T12:32:17.831809Z", - "start_time": "2025-08-22T12:32:17.829502Z" - }, - "collapsed": true + "end_time": "2025-09-01T13:06:00.541083Z", + "start_time": "2025-09-01T13:05:59.808553Z" + } }, - "outputs": [], - "source": [ - "#pip install pypowsybl==1.12.0\n", - "# set up logging\n", - "import logging\n", - "logging.getLogger('powsybl').setLevel(logging.INFO)\n", - "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" - ] + "cell_type": "code", + "source": "pip install pypowsybl==1.12.0", + "id": "6657842d8b2d9845", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\r\n", + "Requirement already satisfied: pypowsybl==1.12.0 in ./venv/lib/python3.11/site-packages (1.12.0)\r\n", + "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.16.0)\r\n", + "Requirement already satisfied: pandas>=2.2.3 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (2.3.2)\r\n", + "Requirement already satisfied: networkx in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.5)\r\n", + "Requirement already satisfied: numpy>=1.23.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.3.2)\r\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.9.0.post0)\r\n", + "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", + "Requirement already satisfied: tzdata>=2022.7 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", + "Requirement already satisfied: wcwidth in ./venv/lib/python3.11/site-packages (from prettytable>=2.0.0->pypowsybl==1.12.0) (0.2.13)\r\n", + "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.3->pypowsybl==1.12.0) (1.17.0)\r\n", + "\r\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m25.1.1\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.2\u001B[0m\r\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "execution_count": 9 }, { - "cell_type": "code", - "execution_count": 1, - "id": "4689861f15ffc23c", "metadata": { "ExecuteTime": { - "end_time": "2025-08-22T12:32:20.830216Z", - "start_time": "2025-08-22T12:32:20.828106Z" + "end_time": "2025-09-01T13:06:00.555406Z", + "start_time": "2025-09-01T13:06:00.550188Z" } }, - "outputs": [], + "cell_type": "code", "source": [ "import pypowsybl as pp\n", - "from pypowsybl.rao import Parameters as RaoParameters\n", - "\n", - "\n" - ] + "from pypowsybl.rao import Parameters as RaoParameters" + ], + "id": "4ad9bbcf2f4f85bf", + "outputs": [], + "execution_count": 10 }, { - "cell_type": "code", - "execution_count": 14, - "id": "e02c6f39998e2d2e", "metadata": {}, - "outputs": [], - "source": [ - "# # Simple case with GlskB45test\n", - "# 1) simple cse with topo\n", - "# 2) simple case with injection : solves angle cnecs constraints\n", - "# 3) micro grid case\n" - ] + "cell_type": "markdown", + "source": "BUG : DO NOT LOAD LOGGING", + "id": "3f96a2304594b3ab" }, { "cell_type": "code", - "execution_count": 15, - "id": "36289c2d67cf8b64", - "metadata": {}, + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-01T13:06:00.607293Z", + "start_time": "2025-09-01T13:06:00.603704Z" + } + }, + "source": [ + "# set up logging\n", + "# import logging\n", + "# logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "# logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" + ], "outputs": [], + "execution_count": 11 + }, + { + "metadata": {}, + "cell_type": "markdown", "source": [ - "# MicroGrid case with GlskB45MicroGridTest" - ] + "## I) ANGLE MONITORING\n", + "\n", + "Let's load a simple 3 node network.\n", + "- VL1 voltage level contains a generator producing 100 MW.\n", + "- VL2 voltage level contains a load consuming 100 MW.\n", + "- VL1 and VL3 are connected by a PST.\n", + "- VL2 and VL3 are connected by 2 lines, one of with has infinite resistance : that's why it has no power flowing through it." + ], + "id": "eda73ac35599f2e5" }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:00.666418Z", + "start_time": "2025-09-01T13:06:00.656645Z" + } + }, "cell_type": "code", - "execution_count": 16, - "id": "52f199b7", - "metadata": {}, + "source": [ + "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "network.get_network_area_diagram()" + ], + "id": "d923fa57b4d80171", "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-27 11:22:49,071 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", - "2025-08-27 11:22:49,071 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-08-27 11:22:49,075 - INFO - powsybl - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ true │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ extrapolateReactiveLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ forceTargetQInReactiveLimits │ false │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ false │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ true │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", - "│ │ countriesToBalance │ [] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ true │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ true │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ DC_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-08-27 11:22:49,076 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-08-27 11:22:49,077 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-08-27 11:22:49,078 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-08-27 11:22:49,078 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-08-27 11:22:49,079 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-08-27 11:22:49,079 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-08-27 11:22:49,080 - INFO - powsybl - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", - "2025-08-27 11:22:49,081 - INFO - powsybl - DC loadflow complete on network {CC0 SC0} (result=DcLoadFlowResult(outerLoopIterations=0, solverSuccess=true, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0, distributedActivePower=-0.0))\n", - "2025-08-27 11:22:49,081 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.16823832099825964, distributedActivePower=0.0))\n", - "2025-08-27 11:22:49,082 - INFO - powsybl - Load flow ran in 10 ms\n", - "2025-08-27 11:22:49,083 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-08-27 11:22:49,084 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-08-27 11:22:49,085 - INFO - powsybl - Number of steps: 139\n", - "2025-08-27 11:22:49,086 - INFO - powsybl - Elapsed time: 1.16123E-4\n", - "2025-08-27 11:22:49,086 - WARNING - powsybl - Base voltage configuration file '/home/bouquettho/.itools/base-voltages.yml' not found, trying to load file 'base-voltages.yml' from resources\n" - ] - }, { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 50\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -50\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -50\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 50\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 50\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -50\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 0\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 0\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
VL1
\n", - "
\n", - " 400.0 kV / 0.0°
\n", - "
\n", - "
\n", - "
VL2
\n", - "
\n", - " 385.7 kV / -3.7°
\n", - "
\n", - "
\n", - "
VL3
\n", - "
\n", - " 392.6 kV / -1.8°
\n", - "
\n", - "
\n", - "
\n", - "
\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 16, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], + "execution_count": 12 + }, + { + "metadata": {}, + "cell_type": "markdown", "source": [ - "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", - "pp.loadflow.run_ac(network)\n", - "network.get_network_area_diagram()" - ] + "Now, let's run a loadflow on this network.\n", + "?? POURQUOI FLUX DEJA AFFICHES ?" + ], + "id": "ce005f42855370fb" }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:00.721797Z", + "start_time": "2025-09-01T13:06:00.712512Z" + } + }, "cell_type": "code", - "execution_count": 17, - "id": "f8e14fd0", - "metadata": {}, + "source": [ + "pp.loadflow.run_ac(network)\n", + "network.get_network_area_diagram()" + ], + "id": "e37a9b29dce42548", "outputs": [ { "data": { "text/plain": [ - "Parameters(voltage_init_mode=UNIFORM_VALUES, transformer_voltage_control_on=False, use_reactive_limits=True, phase_shifter_regulation_on=False, twt_split_shunt_admittance=True, shunt_compensator_voltage_control_on=False, read_slack_bus=False, write_slack_bus=False, distributed_slack=True, balance_type=PROPORTIONAL_TO_GENERATION_P, dc_use_transformer_ratio=False, countries_to_balance=['BE', 'FR', 'TR', 'GR', 'UA', 'RS', 'NL', 'SK', 'ES', 'AL', 'SI', 'CZ', 'ME', 'BA', 'HU', 'BG', 'IT', 'PL', 'RO', 'PT', 'HR', 'DE', 'AT', 'MK', 'CH'], connected_component_mode=, hvdc_ac_emulation=True, dc_power_factor=1.0, provider_parameters={})" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 17, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], + "execution_count": 13 + }, + { + "metadata": {}, + "cell_type": "markdown", "source": [ - "parameters = RaoParameters()\n", - "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", - "load_flow_parameters" - ] + "The monitoring algorithm is run after a RAO has been run, on a network on which are applied the remedial actions optimized during the RAO to optimize flow CNECs. \n", + "To relieve Angle/Voltage CNECs, we won't be optimizing remedial actions because modelling the impact of remedial actions on angle/voltage values is highly complex and non linear. Instead, we'll be checking application conditions and applying remedial actions until CNECs are relieved.\n", + "\n", + "To run a monitoring, we need to load the following inputs:" + ], + "id": "90a656ec77b5fff2" }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:00.785903Z", + "start_time": "2025-09-01T13:06:00.779812Z" + } + }, "cell_type": "code", - "execution_count": 18, - "id": "830592d3", - "metadata": {}, - "outputs": [], "source": [ - "rao_runner = pp.rao.create_rao()\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")" - ] + "parameters = RaoParameters()\n", + "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" + ], + "id": "2602f3b7325812ca", + "outputs": [], + "execution_count": 14 }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:00.858079Z", + "start_time": "2025-09-01T13:06:00.837794Z" + } + }, "cell_type": "code", - "execution_count": 19, - "id": "0f76c1be", - "metadata": {}, + "source": "", + "id": "62e8576fcdedacf8", "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "2025-08-27 11:22:49,113 - WARNING - powsybl - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-08-27 11:22:49,114 - WARNING - powsybl - Contingency coL1L2 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-08-27 11:22:49,114 - WARNING - powsybl - Contingency coL1 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-08-27 11:22:49,115 - WARNING - powsybl - Contingency coL2 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-08-27 11:22:49,116 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-08-27 11:22:49,116 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-08-27 11:22:49,117 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", - "2025-08-27 11:22:49,117 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-08-27 11:22:49,118 - INFO - powsybl - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-08-27 11:22:49,118 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-08-27 11:22:49,119 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-08-27 11:22:49,120 - INFO - powsybl - Initial sensitivity analysis: cost = -1266.27 (functional: -1266.27, virtual: 0.0)\n", - "2025-08-27 11:22:49,121 - INFO - powsybl - Limiting element #01: margin = 1266.27 MW, element L1 at state preventive, CNEC ID = \"fcPrev\"\n", - "2025-08-27 11:22:49,122 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", - "2025-08-27 11:22:49,122 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -1266.27 (functional: -1266.27, virtual: 0.0)\n", - "2025-08-27 11:22:49,123 - INFO - powsybl - Limiting element #01: margin = 1266.27 MW, element L1 at state preventive, CNEC ID = \"fcPrev\"\n", - "2025-08-27 11:22:49,124 - INFO - powsybl - Scenario \"preventive\": initial cost = -1266.27 (functional: -1266.27, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -1266.27 (functional: -1266.27, virtual: 0.0)\n", - "2025-08-27 11:22:49,125 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", - "2025-08-27 11:22:49,125 - INFO - powsybl - Limiting element #01: margin = 1266.27 MW, element L1 at state preventive, CNEC ID = \"fcPrev\"\n", - "2025-08-27 11:22:49,126 - INFO - powsybl - Cost before RAO = -1266.27 (functional: -1266.27, virtual: 0.0), cost after RAO = -1266.27 (functional: -1266.27, virtual: 0.0)\n" + "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'preventive': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'auto': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'curative': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [], 'rangeActionResults': []}\n" ] }, { "data": { + "text/plain": [ + " cnec_id angle margin\n", + "index \n", + "1 acCur1 -7.713852 -1.713852" + ], "text/html": [ "
\n", "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cnec_idoptimized_instantcontingencyanglemargin
index
2acCur2curativecoL1NaNNaN
3acCur1curativecoL1NaNNaN
\n", - "
" - ], - "text/plain": [ - " cnec_id optimized_instant contingency angle margin\n", - "index \n", - "2 acCur2 curative coL1 NaN NaN\n", - "3 acCur1 curative coL1 NaN NaN" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "cell_type": "code", "source": [ - "# Simple case\n", - "# import inputs\n", - "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", "rao_runner = pp.rao.create_rao()\n", - "parameters = RaoParameters()\n", - "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_injectionRa.json\")\n", - "rao_result = rao_runner.run(network, parameters)\n", - "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\") \n", - "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", - "result_with_angle_monitoring.get_angle_cnec_results()" - ] + "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json\")" + ], + "id": "4e5f0e41497f9f69", + "outputs": [], + "execution_count": 16 }, { - "cell_type": "code", - "execution_count": null, - "id": "401bfe71eca4e166", "metadata": { "ExecuteTime": { - "end_time": "2025-08-22T08:50:16.118799Z", - "start_time": "2025-08-22T08:50:16.084204Z" + "end_time": "2025-09-01T13:06:01.050907Z", + "start_time": "2025-09-01T13:06:01.045945Z" } }, - "outputs": [ - { - "ename": "PyPowsyblError", - "evalue": "File ./data/rao/rao_network.uct does not exist", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mPyPowsyblError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[11], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# import inputs\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m network \u001b[38;5;241m=\u001b[39m \u001b[43mpp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnetwork\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m./data/rao/rao_network.uct\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m rao_runner \u001b[38;5;241m=\u001b[39m pp\u001b[38;5;241m.\u001b[39mrao\u001b[38;5;241m.\u001b[39mcreate_rao()\n\u001b[1;32m 4\u001b[0m parameters \u001b[38;5;241m=\u001b[39m RaoParameters()\n", - "File \u001b[0;32m~/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/lib/python3.10/site-packages/pypowsybl/network/impl/network_creation_util.py:242\u001b[0m, in \u001b[0;36mload\u001b[0;34m(file, parameters, post_processors, reporter, report_node, allow_variant_multi_thread_access)\u001b[0m\n\u001b[1;32m 240\u001b[0m report_node \u001b[38;5;241m=\u001b[39m reporter\n\u001b[1;32m 241\u001b[0m file \u001b[38;5;241m=\u001b[39m path_to_str(file)\n\u001b[0;32m--> 242\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m Network(\u001b[43m_pp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_network\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 243\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 244\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpost_processors\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpost_processors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 245\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mreport_node\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mreport_node\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_report_node\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# pylint: disable=protected-access\u001b[39;49;00m\n\u001b[1;32m 246\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_variant_multi_thread_access\u001b[49m\u001b[43m)\u001b[49m)\n", - "\u001b[0;31mPyPowsyblError\u001b[0m: File ./data/rao/rao_network.uct does not exist" - ] - } - ], - "source": [ - "# import inputs\n", - "network = pp.network.load(\"./data/rao/rao_network.uct\")\n", - "rao_runner = pp.rao.create_rao()\n", - "parameters = RaoParameters()\n", - "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/rao_crac.json\")\n", - "rao_runner.set_glsk_file_source(network, \"./data/rao/rao_glsk.xml\")\n", - "rao_result = rao_runner.run(network, parameters)\n", - "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters)\n", - "result_with_voltage_monitoring = rao_runner.run_voltage_monitoring(network, rao_result, load_flow_parameters)" - ] + "cell_type": "code", + "source": "rao_result = rao_runner.run(network, parameters)", + "id": "979b8cf1fa67a46b", + "outputs": [], + "execution_count": 17 }, { - "cell_type": "markdown", - "id": "4d2a8003fc3963d7", "metadata": {}, - "source": [ - "Launch monitoring" - ] + "cell_type": "markdown", + "source": "In this case, no remedial actions were applied during the RAO, the network was already secure.", + "id": "d0a5624d1e9b3d7" }, { - "cell_type": "code", - "execution_count": null, - "id": "fffb8abf917e0f7f", "metadata": {}, - "outputs": [ - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", - "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", - "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" - ] - } - ], - "source": [] - }, - { "cell_type": "markdown", - "id": "624e989b754dc4c6", - "metadata": {}, - "source": [] + "source": "We'll also need a GLSK file to perform redispatching to balance the network following the application of remedial actions. Angle remedial actions are indeed injection actions on generators or loads. ", + "id": "ec951ddcb84a44b7" }, { - "cell_type": "code", - "execution_count": null, - "id": "abee38543c99f812", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-26 09:41:21,290 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,291 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,292 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,293 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,293 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,294 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,294 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,295 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,295 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,296 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,296 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,297 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,297 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,298 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,298 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,299 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,299 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-08-26 09:41:21,300 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-08-26 09:41:21,300 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-08-26 09:41:21,300 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-08-26 09:41:21,301 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n" - ] - }, - { - "ename": "NameError", - "evalue": "name 'crac' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[14], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m n12 \u001b[38;5;241m=\u001b[39m pp\u001b[38;5;241m.\u001b[39mnetwork\u001b[38;5;241m.\u001b[39mload(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m./data/rao/12_node_network.uct\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 3\u001b[0m rao_runner \u001b[38;5;241m=\u001b[39m pp\u001b[38;5;241m.\u001b[39mrao\u001b[38;5;241m.\u001b[39mcreate_rao()\n\u001b[0;32m----> 4\u001b[0m rao_runner\u001b[38;5;241m.\u001b[39mrun_angle_monitoring(network, \u001b[43mcrac\u001b[49m)\n\u001b[1;32m 8\u001b[0m rao_runner\u001b[38;5;241m.\u001b[39mset_crac_file_source(n12, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m./data/rao/N_case_crac.json\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 9\u001b[0m rao_parameters \u001b[38;5;241m=\u001b[39m RaoParameters()\n", - "\u001b[0;31mNameError\u001b[0m: name 'crac' is not defined" - ] + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:01.075421Z", + "start_time": "2025-09-01T13:06:01.073032Z" } - ], - "source": [ - "# prepare inputs\n", - "n12 = pp.network.load('./data/rao/12_node_network.uct')\n", - "rao_runner = pp.rao.create_rao()\n", - "rao_runner.run_angle_monitoring(network, crac)\n", - "\n", - "\n", - "\n", - "rao_runner.set_crac_file_source(n12, \"./data/rao/N_case_crac.json\")\n", - "rao_parameters = RaoParameters()\n", - "rao_parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "# set up logging\n", - "import logging\n", - "logging.getLogger('powsybl').setLevel(logging.INFO)\n", - "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')\n", - "#run rao\n", - "raoResult = rao_runner.run(n12, rao_parameters)\n", - "result_json = raoResult.to_json()" - ] - }, - { + }, "cell_type": "code", - "execution_count": null, - "id": "f72e1a5e5daa7bc3", - "metadata": {}, - "outputs": [ - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", - "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", - "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" - ] - } - ], - "source": [] + "source": "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")", + "id": "a8e68de35a37a9eb", + "outputs": [], + "execution_count": 18 }, { - "cell_type": "code", - "execution_count": null, - "id": "bb6b0a9f406cfc57", "metadata": {}, - "outputs": [ - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mRunning cells with 'venv (Python 3.10.12)' requires the ipykernel package.\n", - "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n", - "\u001b[1;31mCommand: '/home/bouquettho/WORKSPACE/POWSYBL/pypowsybl-notebooks/venv/bin/python -m pip install ipykernel -U --force-reinstall'" - ] - } - ], - "source": [] - }, - { "cell_type": "markdown", - "id": "78577c35", - "metadata": {}, - "source": [ - "## OpenRAO test" - ] + "source": "Before running the angle monitoring algorithm, let's look at the angle cnec's situation in the network. As you can see in the crac, AngleCnec acCru1 is defined between exporting element VL2 and importing element VL1, at curative instant after contingency coL1 that disconnects line L1. A minimum threshold is defined at -6°. Let's look at the network after disconnecting L1:", + "id": "126c2b1ed673c6fc" }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:01.123442Z", + "start_time": "2025-09-01T13:06:01.114632Z" + } + }, "cell_type": "code", - "execution_count": 2, - "id": "af10073ecc8db95a", - "metadata": {}, + "source": [ + "network.disconnect(\"L1\")\n", + "pp.loadflow.run_ac(network)\n", + "network.get_network_area_diagram()" + ], + "id": "eb94026815d908e7", "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 115\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -114\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 21\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -7\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -4\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 20\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -23\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 36\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -85\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 85\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -53\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 60\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -116\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 120\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -100\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 100\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -81\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 85\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -100\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 106\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -576\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 577\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -277\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 278\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -176\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 177\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -82\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -31\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 113\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0
\n", - "
\n", - " 414.2 kV / 0.0°
\n", - "
\n", - "
\n", - "
10.5
\n", - "
\n", - " 10.4 kV / 3.7°
\n", - "
\n", - "
\n", - "
225.0
\n", - "
\n", - " 225.6 kV / 1.4°
\n", - "
\n", - " 222.7 kV / 5.0°
\n", - "
\n", - "
\n", - "
110.0
\n", - "
\n", - " 115.5 kV / 1.4°
\n", - "
\n", - "
\n", - "
15.8
\n", - "
\n", - " 16.0 kV / 19.6°
\n", - "
\n", - " 16.0 kV / 21.7°
\n", - "
\n", - "
\n", - "
21.0
\n", - "
\n", - " 22.0 kV / 1.2°
\n", - "
\n", - "
\n", - "
225.0
\n", - "
\n", - " 224.5 kV / 0.3°
\n", - "
\n", - "
\n", - "
400.0
\n", - "
\n", - " 410.6 kV / 0.2°
\n", - "
\n", - "
\n", - "
220.0
\n", - "
\n", - " 224.2 kV / 17.9°
\n", - "
\n", - "
\n", - "
\n", - "
\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 383.2 kV / -3.7°
\n
\n
\n
\n
\n" }, - "execution_count": 2, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "network = pp.network.load(\"./data/rao/angle_monitoring/monitoring_network.xiidm\")\n", - "pp.loadflow.run_ac(network)\n", - "network.get_network_area_diagram()" - ] + "execution_count": 19 }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:01.168648Z", + "start_time": "2025-09-01T13:06:01.165303Z" + } + }, "cell_type": "code", - "execution_count": 3, - "id": "74e054af", - "metadata": {}, + "source": "network.connect(\"L1\")", + "id": "337c3b32db277f93", "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namerxg1b1g2b2p1q1i1p2q2i2voltage_level1_idvoltage_level2_idbus1_idbus2_idconnected1connected2
id
_ffbabc27-1ccd-4fdc-b037-e341706c8d29BE-Line_65.20371.000000.0000600.0000100.0000600.000010-53.47770011.654010140.75960959.822208-7.948895156.451326_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_69ef0dbd-da79-4eef-a02f-690cb8a28361_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0_69ef0dbd-da79-4eef-a02f-690cb8a28361_0TrueTrue
_b58bf21a-096a-4dae-9a01-3f03b60c24c7BE-Line_21.93534.200000.0000340.0000210.0000340.000021-116.12846322.242985304.083434120.057195-14.573272313.531203_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_69ef0dbd-da79-4eef-a02f-690cb8a28361_b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0_69ef0dbd-da79-4eef-a02f-690cb8a28361_0TrueTrue
_df16b3dd-c905-4a6f-84ee-f067be86f5daSER-RLC-12308229860.000-31.830990.0000000.0000000.0000000.000000-99.60410916.957373261.93767799.604109-23.509275261.937677_69ef0dbd-da79-4eef-a02f-690cb8a28361_69ef0dbd-da79-4eef-a02f-690cb8a28361_69ef0dbd-da79-4eef-a02f-690cb8a28361_0_69ef0dbd-da79-4eef-a02f-690cb8a28361_3TrueTrue
\n", - "
" - ], "text/plain": [ - " name r x \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 BE-Line_6 5.203 71.00000 \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 BE-Line_2 1.935 34.20000 \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da SER-RLC-1230822986 0.000 -31.83099 \n", - "\n", - " g1 b1 g2 b2 \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 0.000060 0.000010 0.000060 0.000010 \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 0.000034 0.000021 0.000034 0.000021 \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " p1 q1 i1 \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 -53.477700 11.654010 140.759609 \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 -116.128463 22.242985 304.083434 \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da -99.604109 16.957373 261.937677 \n", - "\n", - " p2 q2 i2 \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 59.822208 -7.948895 156.451326 \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 120.057195 -14.573272 313.531203 \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da 99.604109 -23.509275 261.937677 \n", - "\n", - " voltage_level1_id \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", - "\n", - " voltage_level2_id \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361 \n", - "\n", - " bus1_id \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0 \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _b10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0 \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361_0 \n", - "\n", - " bus2_id \\\n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 _69ef0dbd-da79-4eef-a02f-690cb8a28361_0 \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 _69ef0dbd-da79-4eef-a02f-690cb8a28361_0 \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da _69ef0dbd-da79-4eef-a02f-690cb8a28361_3 \n", - "\n", - " connected1 connected2 \n", - "id \n", - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29 True True \n", - "_b58bf21a-096a-4dae-9a01-3f03b60c24c7 True True \n", - "_df16b3dd-c905-4a6f-84ee-f067be86f5da True True " + "True" ] }, - "execution_count": 3, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "network.get_lines()" - ] + "execution_count": 20 }, { - "cell_type": "code", - "execution_count": 4, - "id": "de9936b5", "metadata": {}, - "outputs": [], + "cell_type": "markdown", "source": [ - "parameters = RaoParameters()\n", - "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" - ] + "AngleCnec is unsecure acCur1 is unsecure with an angle of -4 - 3.7 = -7.7 < -6°.\n", + "Now let's run the angle monitoring algorithm." + ], + "id": "308a0b8c33bc09de" }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:01.225967Z", + "start_time": "2025-09-01T13:06:01.217653Z" + } + }, "cell_type": "code", - "execution_count": 5, - "id": "c7e482ac", - "metadata": {}, - "outputs": [], "source": [ - "rao_runner = pp.rao.create_rao()\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_crac.json\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "fd5a75b5", - "metadata": {}, + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_angle_cnecs = result_with_angle_monitoring.get_angle_cnec_results()\n", + "df_angle_cnecs[['cnec_id', 'angle', 'margin']]" + ], + "id": "3a8f9fc4911af245", "outputs": [ { "data": { + "text/plain": [ + " cnec_id angle margin\n", + "index \n", + "2 acCur1 -3.783208 2.216792" + ], "text/html": [ "
\n", "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cnec_idoptimized_instantcontingencyanglemargin
index
0AngleCnec2curativeCo-2-19.31024366.310243
1AngleCnec1curativeCo-15.246296-2.246296
\n", - "
" - ], - "text/plain": [ - " cnec_id optimized_instant contingency angle margin\n", - "index \n", - "0 AngleCnec2 curative Co-2 -19.310243 66.310243\n", - "1 AngleCnec1 curative Co-1 5.246296 -2.246296" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:01.288224Z", + "start_time": "2025-09-01T13:06:01.286979Z" } - ], + }, + "cell_type": "code", "source": [ - "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45MicroGridTest.xml\")\n", - "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", - "result_with_angle_monitoring.get_angle_cnec_results()" - ] + "network_2 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "rao_runner_2 = pp.rao.create_rao()\n", + "rao_runner_2.set_crac_file_source(network_2, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json\")\n", + "rao_result_2 = rao_runner_2.run(network_2, parameters)\n", + "print(rao_result_2.to_json())\n", + "rao_runner_2.set_glsk_file_source(network_2, \"./data/rao/angle_monitoring/GlskB45test.xml\")\n", + "result_with_angle_monitoring_2 = rao_runner_2.run_angle_monitoring(network_2, rao_result_2, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_angle_cnecs_2 = result_with_angle_monitoring_2.get_angle_cnec_results()\n", + "df_angle_cnecs_2[['cnec_id', 'angle', 'margin']]" + ], + "id": "8ecc842841490184", + "outputs": [], + "execution_count": null }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:01.336241Z", + "start_time": "2025-09-01T13:06:01.333121Z" + } + }, "cell_type": "code", - "execution_count": null, - "id": "6470355e", + "source": "", + "id": "3caddf0e6ed1d7e0", + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "id": "78577c35", "metadata": {}, + "source": "## II) VOLTAGE MONITORING" + }, + { + "cell_type": "code", + "id": "74e054af", + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-01T13:06:01.456028Z", + "start_time": "2025-09-01T13:06:01.454394Z" + } + }, + "source": "", "outputs": [], - "source": [] + "execution_count": null } ], "metadata": { From eb3490c940a00145a30396c5f4093d5b5aa06129 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Tue, 2 Sep 2025 11:20:21 +0200 Subject: [PATCH 11/18] 1 dysfunctional voltage monitoring test --- ...tage_monitoring_simple_case_with_topo.json | 101 ++++++ open_rao_monitoring.ipynb | 288 ++++++++---------- 2 files changed, 230 insertions(+), 159 deletions(-) create mode 100644 data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json diff --git a/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json b/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json new file mode 100644 index 0000000..1ddc6f9 --- /dev/null +++ b/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json @@ -0,0 +1,101 @@ +{ + "type" : "CRAC", + "version" : "2.7", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "test-crac", + "name" : "test-crac", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "auto", + "kind" : "AUTO" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "coL1", + "name" : "coL1", + "networkElementsIds" : [ "L1" ] + }], + "flowCnecs" : [ { + "id" : "cnec1 - preventive", + "name" : "cnec1 - preventive", + "networkElementId" : "L1", + "operator" : null, + "border" : "", + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5.0, + "max" : 100.0, + "side" : 2 + } ] + }, + { + "id" : "cnec1 - curative", + "name" : "cnec1 - curative", + "networkElementId" : "L1", + "contingencyId" : "coL1", + "operator" : null, + "border" : "", + "instant" : "curative", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5.0, + "max" : 5.0, + "side" : 2 + } ] + } + ], + "angleCnecs" : [ ], + "voltageCnecs" : [ { + "id" : "vc", + "name" : "vc", + "networkElementId" : "VL2", + "operator" : null, + "border" : "", + "instant" : "curative", + "contingencyId" : "coL1", + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "kilovolt", + "min" : 340.0, + "max" : 350.0 + } ] + } ], + "pstRangeActions" : [ ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "Open L3 - 2", + "name" : "Open L3 - 2", + "operator" : null, + "onConstraintUsageRules" : [ { + "instant" : "curative", + "cnecId" : "vc", + "usageMethod" : "available" + } ], + "terminalsConnectionActions" : [ { + "networkElementId" : "L3", + "actionType" : "open" + } ] + } ] +} \ No newline at end of file diff --git a/open_rao_monitoring.ipynb b/open_rao_monitoring.ipynb index 13c95ae..02f6850 100644 --- a/open_rao_monitoring.ipynb +++ b/open_rao_monitoring.ipynb @@ -20,8 +20,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:00.541083Z", - "start_time": "2025-09-01T13:05:59.808553Z" + "end_time": "2025-09-02T07:04:52.852979Z", + "start_time": "2025-09-02T07:04:52.050264Z" } }, "cell_type": "code", @@ -50,13 +50,13 @@ ] } ], - "execution_count": 9 + "execution_count": 1 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:00.555406Z", - "start_time": "2025-09-01T13:06:00.550188Z" + "end_time": "2025-09-02T07:04:53.351210Z", + "start_time": "2025-09-02T07:04:52.863089Z" } }, "cell_type": "code", @@ -66,7 +66,7 @@ ], "id": "4ad9bbcf2f4f85bf", "outputs": [], - "execution_count": 10 + "execution_count": 2 }, { "metadata": {}, @@ -80,18 +80,18 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-09-01T13:06:00.607293Z", - "start_time": "2025-09-01T13:06:00.603704Z" + "end_time": "2025-09-02T07:04:53.457243Z", + "start_time": "2025-09-02T07:04:53.455724Z" } }, "source": [ "# set up logging\n", "# import logging\n", - "# logging.getLogger('powsybl').setLevel(logging.INFO)\n", - "# logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" + "# logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')\n", + "# logging.getLogger('powsybl').setLevel(logging.DEBUG)" ], "outputs": [], - "execution_count": 11 + "execution_count": 3 }, { "metadata": {}, @@ -110,8 +110,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:00.666418Z", - "start_time": "2025-09-01T13:06:00.656645Z" + "end_time": "2025-09-02T07:04:53.544748Z", + "start_time": "2025-09-02T07:04:53.515810Z" } }, "cell_type": "code", @@ -124,16 +124,16 @@ { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 12, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 12 + "execution_count": 4 }, { "metadata": {}, @@ -147,8 +147,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:00.721797Z", - "start_time": "2025-09-01T13:06:00.712512Z" + "end_time": "2025-09-02T07:04:53.586850Z", + "start_time": "2025-09-02T07:04:53.573792Z" } }, "cell_type": "code", @@ -161,16 +161,16 @@ { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 13 + "execution_count": 5 }, { "metadata": {}, @@ -186,8 +186,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:00.785903Z", - "start_time": "2025-09-01T13:06:00.779812Z" + "end_time": "2025-09-02T07:04:53.676701Z", + "start_time": "2025-09-02T07:04:53.667071Z" } }, "cell_type": "code", @@ -198,81 +198,20 @@ ], "id": "2602f3b7325812ca", "outputs": [], - "execution_count": 14 + "execution_count": 6 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:00.858079Z", - "start_time": "2025-09-01T13:06:00.837794Z" + "end_time": "2025-09-02T07:04:53.717725Z", + "start_time": "2025-09-02T07:04:53.715443Z" } }, "cell_type": "code", "source": "", "id": "62e8576fcdedacf8", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'preventive': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'auto': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'curative': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [], 'rangeActionResults': []}\n" - ] - }, - { - "data": { - "text/plain": [ - " cnec_id angle margin\n", - "index \n", - "1 acCur1 -7.713852 -1.713852" - ], - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cnec_idanglemargin
index
1acCur1-7.713852-1.713852
\n", - "
" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 15 + "outputs": [], + "execution_count": null }, { "metadata": {}, @@ -283,8 +222,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.006610Z", - "start_time": "2025-09-01T13:06:01.002935Z" + "end_time": "2025-09-02T07:04:53.772786Z", + "start_time": "2025-09-02T07:04:53.763191Z" } }, "cell_type": "code", @@ -294,20 +233,20 @@ ], "id": "4e5f0e41497f9f69", "outputs": [], - "execution_count": 16 + "execution_count": 7 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.050907Z", - "start_time": "2025-09-01T13:06:01.045945Z" + "end_time": "2025-09-02T07:04:53.824966Z", + "start_time": "2025-09-02T07:04:53.810997Z" } }, "cell_type": "code", "source": "rao_result = rao_runner.run(network, parameters)", "id": "979b8cf1fa67a46b", "outputs": [], - "execution_count": 17 + "execution_count": 8 }, { "metadata": {}, @@ -324,15 +263,15 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.075421Z", - "start_time": "2025-09-01T13:06:01.073032Z" + "end_time": "2025-09-02T07:04:53.862895Z", + "start_time": "2025-09-02T07:04:53.858960Z" } }, "cell_type": "code", "source": "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")", "id": "a8e68de35a37a9eb", "outputs": [], - "execution_count": 18 + "execution_count": 9 }, { "metadata": {}, @@ -343,8 +282,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.123442Z", - "start_time": "2025-09-01T13:06:01.114632Z" + "end_time": "2025-09-02T07:04:53.921332Z", + "start_time": "2025-09-02T07:04:53.911116Z" } }, "cell_type": "code", @@ -358,22 +297,22 @@ { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 383.2 kV / -3.7°
\n
\n
\n
\n
\n" }, - "execution_count": 19, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 19 + "execution_count": 10 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.168648Z", - "start_time": "2025-09-01T13:06:01.165303Z" + "end_time": "2025-09-02T07:04:53.975523Z", + "start_time": "2025-09-02T07:04:53.972004Z" } }, "cell_type": "code", @@ -386,12 +325,12 @@ "True" ] }, - "execution_count": 20, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 20 + "execution_count": 11 }, { "metadata": {}, @@ -405,24 +344,65 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.225967Z", - "start_time": "2025-09-01T13:06:01.217653Z" + "end_time": "2025-09-02T07:04:54.029802Z", + "start_time": "2025-09-02T07:04:54.027106Z" } }, "cell_type": "code", "source": [ - "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", - "df_angle_cnecs = result_with_angle_monitoring.get_angle_cnec_results()\n", - "df_angle_cnecs[['cnec_id', 'angle', 'margin']]" + "# result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "# df_angle_cnecs = result_with_angle_monitoring.get_angle_cnec_results()\n", + "# df_angle_cnecs[['cnec_id', 'angle', 'margin']]" ], "id": "3a8f9fc4911af245", + "outputs": [], + "execution_count": 12 + }, + { + "cell_type": "markdown", + "id": "624e989b754dc4c6", + "metadata": {}, + "source": [ + "During the monitoring algorithm, a network action was applied, setting load LD2's value to 50 MW. The monitoring algorithm tried to perform the opposite redispatching action to maintain network balance, but scaling failed in our case, most likely because the network is so small. Balance was achieved during load flow computation via slack redistribution. \n", + "Applied network action made AngleCnec acCur1 secure, by shifting its' angle from -7.7° to -3.8°.\n", + "\n", + "Only load actions and generator actions can be used to relieve angle cnecs. In the following example, a topological action is defined (open L3) but it isn't even considered to relieve AngleCnec acCur1." + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-02T07:04:54.102753Z", + "start_time": "2025-09-02T07:04:54.082020Z" + } + }, + "cell_type": "code", + "source": [ + "network_2 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "rao_runner_2 = pp.rao.create_rao()\n", + "rao_runner_2.set_crac_file_source(network_2, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json\")\n", + "rao_result_2 = rao_runner_2.run(network_2, parameters)\n", + "print(rao_result_2.to_json())\n", + "rao_runner_2.set_glsk_file_source(network_2, \"./data/rao/angle_monitoring/GlskB45test.xml\")\n", + "result_with_angle_monitoring_2 = rao_runner_2.run_angle_monitoring(network_2, rao_result_2, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_angle_cnecs_2 = result_with_angle_monitoring_2.get_angle_cnec_results()\n", + "df_angle_cnecs_2[['cnec_id', 'angle', 'margin']]" + ], + "id": "8ecc842841490184", "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'preventive': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'auto': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'curative': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [], 'rangeActionResults': []}\n" + ] + }, { "data": { "text/plain": [ " cnec_id angle margin\n", "index \n", - "2 acCur1 -3.783208 2.216792" + "0 acCur1 -7.713852 -1.713852" ], "text/html": [ "
\n", @@ -456,62 +436,28 @@ " \n", " \n", " \n", - " 2\n", + " 0\n", " acCur1\n", - " -3.783208\n", - " 2.216792\n", + " -7.713852\n", + " -1.713852\n", " \n", " \n", "\n", "
" ] }, - "execution_count": 21, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 21 - }, - { - "cell_type": "markdown", - "id": "624e989b754dc4c6", - "metadata": {}, - "source": [ - "During the monitoring algorithm, a network action was applied, setting load LD2's value to 50 MW. The monitoring algorithm tried to perform the opposite redispatching action to maintain network balance, but scaling failed in our case, most likely because the network is so small. Balance was achieved during load flow computation via slack redistribution. \n", - "Applied network action made AngleCnec acCur1 secure, by shifting its' angle from -7.7° to -3.8°.\n", - "\n", - "Only load actions and generator actions can be used to relieve angle cnecs. In the following example, a topological action is defined (open L3) but it isn't even considered to relieve AngleCnec acCur1." - ] - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.288224Z", - "start_time": "2025-09-01T13:06:01.286979Z" - } - }, - "cell_type": "code", - "source": [ - "network_2 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", - "rao_runner_2 = pp.rao.create_rao()\n", - "rao_runner_2.set_crac_file_source(network_2, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json\")\n", - "rao_result_2 = rao_runner_2.run(network_2, parameters)\n", - "print(rao_result_2.to_json())\n", - "rao_runner_2.set_glsk_file_source(network_2, \"./data/rao/angle_monitoring/GlskB45test.xml\")\n", - "result_with_angle_monitoring_2 = rao_runner_2.run_angle_monitoring(network_2, rao_result_2, load_flow_parameters, \"OpenLoadFlow\")\n", - "df_angle_cnecs_2 = result_with_angle_monitoring_2.get_angle_cnec_results()\n", - "df_angle_cnecs_2[['cnec_id', 'angle', 'margin']]" - ], - "id": "8ecc842841490184", - "outputs": [], - "execution_count": null + "execution_count": 13 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.336241Z", - "start_time": "2025-09-01T13:06:01.333121Z" + "end_time": "2025-09-02T07:04:54.157431Z", + "start_time": "2025-09-02T07:04:54.156196Z" } }, "cell_type": "code", @@ -531,13 +477,37 @@ "id": "74e054af", "metadata": { "ExecuteTime": { - "end_time": "2025-09-01T13:06:01.456028Z", - "start_time": "2025-09-01T13:06:01.454394Z" + "end_time": "2025-09-02T07:04:54.226527Z", + "start_time": "2025-09-02T07:04:54.206420Z" } }, - "source": "", - "outputs": [], - "execution_count": null + "source": [ + "# import logging\n", + "# logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')\n", + "# logging.getLogger('powsybl').setLevel(logging.DEBUG)\n", + "network_3 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "rao_runner_3 = pp.rao.create_rao()\n", + "rao_runner_3.set_crac_file_source(network_3, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json\")\n", + "rao_result_3 = rao_runner_3.run(network_3, parameters)\n", + "# print(rao_result_3.to_json())\n", + "result_with_voltage_monitoring = rao_runner_3.run_voltage_monitoring(network_3, rao_result_3, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_voltage_cnecs = result_with_voltage_monitoring.get_voltage_cnec_results()\n", + "print(df_voltage_cnecs[['cnec_id', 'min_voltage', 'max_voltage', 'margin']])\n", + "print(result_with_voltage_monitoring.to_json())" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empty DataFrame\n", + "Columns: [cnec_id, min_voltage, max_voltage, margin]\n", + "Index: []\n", + "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'preventive': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'auto': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'curative': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [{'networkActionId': 'Open L3 - 2', 'activatedStates': [{'instant': 'curative', 'contingency': 'coL1'}]}], 'rangeActionResults': []}\n" + ] + } + ], + "execution_count": 14 } ], "metadata": { From 3360ce659d549d1e2953d8924ff0db2d586e48f4 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Mon, 8 Sep 2025 09:22:14 +0200 Subject: [PATCH 12/18] open_rao updated notebook --- open_rao.ipynb | 937 ++++++++++++++++++++++++++++++------------------- 1 file changed, 576 insertions(+), 361 deletions(-) diff --git a/open_rao.ipynb b/open_rao.ipynb index c5f6391..7ea9a37 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -20,37 +20,20 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-08-20T08:44:47.528196Z", - "start_time": "2025-08-20T08:44:39.151724Z" + "end_time": "2025-09-08T07:21:12.035837Z", + "start_time": "2025-09-08T07:21:12.033567Z" } }, - "source": "pip install pypowsybl==1.12.0", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001B[33mWARNING: Ignoring invalid distribution -ypowsybl (/home/demontmorillongod/Workspace/POWSYBL/pypowsybl-notebooks/venv/lib/python3.11/site-packages)\u001B[0m\u001B[33m\r\n", - "\u001B[0mLooking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\r\n", - "\u001B[33mWARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", - "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", - "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", - "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", - "\u001B[0m\u001B[33mWARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')': /repository/pypi-all/simple/pypowsybl/\u001B[0m\u001B[33m\r\n", - "\u001B[0m\u001B[31mERROR: Could not find a version that satisfies the requirement pypowsybl==1.12.0 (from versions: none)\u001B[0m\u001B[31m\r\n", - "\u001B[0m\u001B[31mERROR: No matching distribution found for pypowsybl==1.12.0\u001B[0m\u001B[31m\r\n", - "\u001B[0mNote: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "execution_count": 3 + "source": "#pip install pypowsybl==1.12.0", + "outputs": [], + "execution_count": 1 }, { "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-08-20T08:39:28.441466623Z", - "start_time": "2025-07-30T08:35:44.614619Z" + "end_time": "2025-09-08T07:21:13.349030Z", + "start_time": "2025-09-08T07:21:12.080380Z" } }, "source": [ @@ -71,8 +54,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.127988Z", - "start_time": "2025-07-30T08:35:45.122939Z" + "end_time": "2025-09-08T07:21:13.428029Z", + "start_time": "2025-09-08T07:21:13.423106Z" } }, "source": [ @@ -92,8 +75,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.202716Z", - "start_time": "2025-07-30T08:35:45.178410Z" + "end_time": "2025-09-08T07:21:13.492793Z", + "start_time": "2025-09-08T07:21:13.473126Z" } }, "source": [ @@ -103,7 +86,7 @@ { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n kV / °
\n
\n
\n
BBE2AA1
\n
\n kV / °
\n
\n kV / °
\n
\n
\n
DDE1AA1
\n
\n kV / °
\n
\n
\n
DDE2AA1
\n
\n kV / °
\n
\n
\n
DDE3AA1
\n
\n kV / °
\n
\n
\n
FFR1AA1
\n
\n kV / °
\n
\n
\n
FFR2AA1
\n
\n kV / °
\n
\n
\n
FFR3AA1
\n
\n kV / °
\n
\n
\n
NNL1AA1
\n
\n kV / °
\n
\n
\n
NNL2AA1
\n
\n kV / °
\n
\n
\n
NNL3AA1
\n
\n kV / °
\n
\n
\n
\n
\n" }, @@ -132,21 +115,21 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.270604Z", - "start_time": "2025-07-30T08:35:45.253526Z" + "end_time": "2025-09-08T07:21:13.566760Z", + "start_time": "2025-09-08T07:21:13.549424Z" } }, "source": [ - "pp.loadflow.run_dc(n12)\n", + "pp.loadflow.run_ac(n12)\n", "n12.get_network_area_diagram()" ], "outputs": [ { "data": { "text/plain": [ - "" + "" ], - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n kV / 0.7°
\n
\n
\n
BBE2AA1
\n
\n kV / 0.0°
\n
\n kV / 1.3°
\n
\n
\n
DDE1AA1
\n
\n kV / 0.7°
\n
\n
\n
DDE2AA1
\n
\n kV / 1.3°
\n
\n
\n
DDE3AA1
\n
\n kV / -0.0°
\n
\n
\n
FFR1AA1
\n
\n kV / -4.0°
\n
\n
\n
FFR2AA1
\n
\n kV / -2.0°
\n
\n
\n
FFR3AA1
\n
\n kV / -2.0°
\n
\n
\n
NNL1AA1
\n
\n kV / 5.3°
\n
\n
\n
NNL2AA1
\n
\n kV / 3.3°
\n
\n
\n
NNL3AA1
\n
\n kV / 3.3°
\n
\n
\n
\n
\n" + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n 400.0 kV / 0.6°
\n
\n
\n
BBE2AA1
\n
\n 400.0 kV / 0.0°
\n
\n 400.0 kV / 1.2°
\n
\n
\n
DDE1AA1
\n
\n 400.0 kV / 0.6°
\n
\n
\n
DDE2AA1
\n
\n 400.0 kV / 1.2°
\n
\n
\n
DDE3AA1
\n
\n 400.0 kV / -0.0°
\n
\n
\n
FFR1AA1
\n
\n 400.0 kV / -3.6°
\n
\n
\n
FFR2AA1
\n
\n 400.0 kV / -1.8°
\n
\n
\n
FFR3AA1
\n
\n 400.0 kV / -1.8°
\n
\n
\n
NNL1AA1
\n
\n 400.0 kV / 4.8°
\n
\n
\n
NNL2AA1
\n
\n 400.0 kV / 3.0°
\n
\n
\n
NNL3AA1
\n
\n 400.0 kV / 3.0°
\n
\n
\n
\n
\n" }, "execution_count": 5, "metadata": {}, @@ -167,22 +150,22 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.332894Z", - "start_time": "2025-07-30T08:35:45.316518Z" + "end_time": "2025-09-08T07:21:13.632928Z", + "start_time": "2025-09-08T07:21:13.615870Z" } }, "source": [ "n12.connect(\"NNL2AA1 BBE3AA1 2\")\n", - "pp.loadflow.run_dc(n12)\n", + "pp.loadflow.run_ac(n12)\n", "n12.get_network_area_diagram()" ], "outputs": [ { "data": { "text/plain": [ - "" + "" ], - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n kV / 0.7°
\n
\n
\n
BBE2AA1
\n
\n kV / 0.0°
\n
\n kV / 1.4°
\n
\n
\n
DDE1AA1
\n
\n kV / 0.2°
\n
\n
\n
DDE2AA1
\n
\n kV / 0.8°
\n
\n
\n
DDE3AA1
\n
\n kV / -0.4°
\n
\n
\n
FFR1AA1
\n
\n kV / -4.2°
\n
\n
\n
FFR2AA1
\n
\n kV / -2.3°
\n
\n
\n
FFR3AA1
\n
\n kV / -2.1°
\n
\n
\n
NNL1AA1
\n
\n kV / 4.5°
\n
\n
\n
NNL2AA1
\n
\n kV / 2.5°
\n
\n
\n
NNL3AA1
\n
\n kV / 2.6°
\n
\n
\n
\n
\n" + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n 400.0 kV / 0.6°
\n
\n
\n
BBE2AA1
\n
\n 400.0 kV / 0.0°
\n
\n 400.0 kV / 1.3°
\n
\n
\n
DDE1AA1
\n
\n 400.0 kV / 0.2°
\n
\n
\n
DDE2AA1
\n
\n 400.0 kV / 0.7°
\n
\n
\n
DDE3AA1
\n
\n 400.0 kV / -0.4°
\n
\n
\n
FFR1AA1
\n
\n 400.0 kV / -3.8°
\n
\n
\n
FFR2AA1
\n
\n 400.0 kV / -2.0°
\n
\n
\n
FFR3AA1
\n
\n 400.0 kV / -1.9°
\n
\n
\n
NNL1AA1
\n
\n 400.0 kV / 4.1°
\n
\n
\n
NNL2AA1
\n
\n 400.0 kV / 2.3°
\n
\n
\n
NNL3AA1
\n
\n 400.0 kV / 2.4°
\n
\n
\n
\n
\n" }, "execution_count": 6, "metadata": {}, @@ -195,7 +178,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As we can see, the new flow is 270MW, and the overload has been solved.\n", + "As we can see, the new flow is 270MW, and **the overload has been solved**.\n", "\n", "This solution can be found by the RAO. For this we will need some input files: the network (which we already have), and a crac file which will contain information about available remedial actions, and CNECs (critical network elements and contingencies). For more information on the crac input, you can check this page: https://powsybl.readthedocs.io/projects/openrao/en/stable/input-data/crac/json.html" ] @@ -204,8 +187,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.449310Z", - "start_time": "2025-07-30T08:35:45.380952Z" + "end_time": "2025-09-08T07:21:13.748145Z", + "start_time": "2025-09-08T07:21:13.684874Z" } }, "source": [ @@ -228,56 +211,59 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-07-30 10:35:45,396 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-07-30 10:35:45,397 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,398 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,399 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-07-30 10:35:45,399 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,400 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,400 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-07-30 10:35:45,401 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-07-30 10:35:45,401 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,402 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,403 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-07-30 10:35:45,403 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,403 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-07-30 10:35:45,404 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-07-30 10:35:45,404 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,404 - INFO - Linear optimization on root leaf\n", - "2025-07-30 10:35:45,405 - INFO - No range actions to optimize\n", - "2025-07-30 10:35:45,405 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-07-30 10:35:45,405 - INFO - No range actions activated\n", - "2025-07-30 10:35:45,406 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,406 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-07-30 10:35:45,406 - INFO - Search depth 1 [start]\n", - "2025-07-30 10:35:45,407 - INFO - Leaves to evaluate: 1\n", - "2025-07-30 10:35:45,407 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-07-30 10:35:45,408 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,409 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,409 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-07-30 10:35:45,410 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,437 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,437 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-07-30 10:35:45,438 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-07-30 10:35:45,438 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,439 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,441 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-07-30 10:35:45,441 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-07-30 10:35:45,442 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-07-30 10:35:45,442 - INFO - Remaining leaves to evaluate: 0\n", - "2025-07-30 10:35:45,443 - INFO - Search depth 1 [end]\n", - "2025-07-30 10:35:45,443 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-07-30 10:35:45,444 - INFO - Search depth 1 best leaf: No range actions activated\n", - "2025-07-30 10:35:45,444 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,444 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-07-30 10:35:45,445 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-07-30 10:35:45,445 - INFO - Best leaf: No range actions activated\n", - "2025-07-30 10:35:45,445 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,446 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-07-30 10:35:45,446 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-07-30 10:35:45,446 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-07-30 10:35:45,447 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,447 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" + "2025-09-08 09:21:13,700 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 09:21:13,701 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 09:21:13,701 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:13,702 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:13,703 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:13,703 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 09:21:13,705 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-09-08 09:21:13,705 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,706 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,706 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-08 09:21:13,707 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,707 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 09:21:13,707 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-08 09:21:13,707 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,707 - INFO - Linear optimization on root leaf\n", + "2025-09-08 09:21:13,707 - INFO - No range actions to optimize\n", + "2025-09-08 09:21:13,708 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-08 09:21:13,708 - INFO - No range actions activated\n", + "2025-09-08 09:21:13,708 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,708 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 09:21:13,709 - INFO - Search depth 1 [start]\n", + "2025-09-08 09:21:13,709 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 09:21:13,709 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:13,710 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:13,710 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:13,711 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:13,711 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:13,737 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:13,737 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:13,738 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-09-08 09:21:13,739 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,739 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,740 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 09:21:13,741 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 09:21:13,742 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-08 09:21:13,742 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 09:21:13,743 - INFO - Search depth 1 [end]\n", + "2025-09-08 09:21:13,743 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 09:21:13,744 - INFO - Search depth 1 best leaf: No range actions activated\n", + "2025-09-08 09:21:13,744 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,744 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 09:21:13,745 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 09:21:13,745 - INFO - Best leaf: No range actions activated\n", + "2025-09-08 09:21:13,745 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,745 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 09:21:13,745 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:13,746 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 09:21:13,746 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,746 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" ] } ], @@ -294,8 +280,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.499471Z", - "start_time": "2025-07-30T08:35:45.496433Z" + "end_time": "2025-09-08T07:21:13.761777Z", + "start_time": "2025-09-08T07:21:13.758449Z" } }, "source": [ @@ -388,8 +374,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.593889Z", - "start_time": "2025-07-30T08:35:45.547161Z" + "end_time": "2025-09-08T07:21:13.868010Z", + "start_time": "2025-09-08T07:21:13.821177Z" } }, "outputs": [ @@ -397,103 +383,110 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-07-30 10:35:45,550 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,551 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,551 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,551 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,551 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,552 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,552 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,552 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,553 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,553 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,553 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,553 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,554 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,554 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,554 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,554 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,555 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,555 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-07-30 10:35:45,555 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-07-30 10:35:45,555 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-07-30 10:35:45,556 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-07-30 10:35:45,562 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-07-30 10:35:45,563 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-07-30 10:35:45,563 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,564 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,564 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-07-30 10:35:45,564 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,565 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,566 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-07-30 10:35:45,566 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-07-30 10:35:45,566 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,567 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,567 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,568 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,568 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,568 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-07-30 10:35:45,569 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,569 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,569 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-07-30 10:35:45,569 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-07-30 10:35:45,570 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,570 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,570 - INFO - Linear optimization on root leaf\n", - "2025-07-30 10:35:45,572 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,572 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,573 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-07-30 10:35:45,573 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,574 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,574 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-07-30 10:35:45,575 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-07-30 10:35:45,575 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,576 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,576 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,576 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,577 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,577 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-07-30 10:35:45,578 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-07-30 10:35:45,578 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-07-30 10:35:45,579 - INFO - range action(s): pst-range-action: -10\n", - "2025-07-30 10:35:45,579 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,579 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,580 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-07-30 10:35:45,580 - INFO - Search depth 1 [start]\n", - "2025-07-30 10:35:45,580 - INFO - Leaves to evaluate: 1\n", - "2025-07-30 10:35:45,580 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-07-30 10:35:45,581 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,582 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,582 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-07-30 10:35:45,583 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,583 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,583 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-07-30 10:35:45,584 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-07-30 10:35:45,584 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,585 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,585 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,585 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,586 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,586 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,587 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,587 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-07-30 10:35:45,587 - INFO - Remaining leaves to evaluate: 0\n", - "2025-07-30 10:35:45,588 - INFO - Search depth 1 [end]\n", - "2025-07-30 10:35:45,588 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,588 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-07-30 10:35:45,588 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,589 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,589 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-07-30 10:35:45,589 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,589 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-07-30 10:35:45,590 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,590 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,590 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,590 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-07-30 10:35:45,591 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-07-30 10:35:45,591 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,592 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,592 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + "2025-09-08 09:21:13,824 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,824 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,825 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,825 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,825 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,825 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,826 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,826 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,826 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,827 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,827 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,827 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,827 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,827 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,828 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,828 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,828 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,828 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-09-08 09:21:13,829 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-08 09:21:13,829 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-08 09:21:13,829 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-09-08 09:21:13,831 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:13,832 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:13,835 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 09:21:13,835 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 09:21:13,835 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:13,835 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:13,836 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:13,836 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:13,836 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-09-08 09:21:13,837 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:13,837 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:13,838 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 09:21:13,838 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:13,839 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 09:21:13,839 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 09:21:13,840 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 09:21:13,841 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,841 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,842 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:13,842 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,842 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,843 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 09:21:13,843 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:13,844 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,844 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 09:21:13,845 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 09:21:13,845 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:13,845 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,845 - INFO - Linear optimization on root leaf\n", + "2025-09-08 09:21:13,848 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:13,849 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:13,849 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 09:21:13,850 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:13,850 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 09:21:13,850 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 09:21:13,851 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 09:21:13,851 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,851 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,852 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:13,852 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,853 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,853 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-08 09:21:13,854 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 09:21:13,855 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-08 09:21:13,855 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-08 09:21:13,855 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:13,855 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,855 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 09:21:13,856 - INFO - Search depth 1 [start]\n", + "2025-09-08 09:21:13,856 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 09:21:13,856 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:13,857 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:13,857 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:13,858 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:13,858 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:13,858 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:13,859 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:13,859 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 09:21:13,859 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,860 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,860 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:13,860 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:13,861 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-09-08 09:21:13,861 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:13,861 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:13,862 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-08 09:21:13,862 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 09:21:13,863 - INFO - Search depth 1 [end]\n", + "2025-09-08 09:21:13,863 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:13,863 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 09:21:13,863 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:13,864 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,864 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 09:21:13,864 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:13,864 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 09:21:13,865 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:13,865 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,865 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:13,865 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:13,865 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 09:21:13,866 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:13,866 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:13,866 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -507,8 +500,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.641696Z", - "start_time": "2025-07-30T08:35:45.638018Z" + "end_time": "2025-09-08T07:21:13.926393Z", + "start_time": "2025-09-08T07:21:13.922210Z" } }, "outputs": [ @@ -603,8 +596,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.762076Z", - "start_time": "2025-07-30T08:35:45.701006Z" + "end_time": "2025-09-08T07:21:14.064313Z", + "start_time": "2025-09-08T07:21:13.996471Z" } }, "outputs": [ @@ -612,147 +605,156 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-07-30 10:35:45,703 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,704 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,704 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,704 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,705 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,705 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,705 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,705 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,706 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,706 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,706 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,706 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,706 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,707 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,707 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,707 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,707 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-07-30 10:35:45,708 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-07-30 10:35:45,708 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-07-30 10:35:45,708 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-07-30 10:35:45,708 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-07-30 10:35:45,713 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-07-30 10:35:45,714 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,714 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,715 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-07-30 10:35:45,715 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,716 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,716 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-07-30 10:35:45,716 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-07-30 10:35:45,717 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,717 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,717 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,718 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,718 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,718 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-07-30 10:35:45,719 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,719 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,719 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-07-30 10:35:45,720 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-07-30 10:35:45,720 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,720 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,720 - INFO - Linear optimization on root leaf\n", - "2025-07-30 10:35:45,722 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,723 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,723 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-07-30 10:35:45,723 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,723 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,724 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-07-30 10:35:45,724 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-07-30 10:35:45,724 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,725 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,725 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,725 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,726 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,726 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-07-30 10:35:45,727 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-07-30 10:35:45,728 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-07-30 10:35:45,728 - INFO - range action(s): pst-range-action: -10\n", - "2025-07-30 10:35:45,729 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,729 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,729 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-07-30 10:35:45,729 - INFO - Search depth 1 [start]\n", - "2025-07-30 10:35:45,730 - INFO - Leaves to evaluate: 1\n", - "2025-07-30 10:35:45,730 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-07-30 10:35:45,731 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,732 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,732 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-07-30 10:35:45,732 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,733 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,733 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-07-30 10:35:45,733 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-07-30 10:35:45,734 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,734 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,735 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,735 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,735 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,736 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,736 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,737 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-07-30 10:35:45,737 - INFO - Remaining leaves to evaluate: 0\n", - "2025-07-30 10:35:45,738 - INFO - Search depth 1 [end]\n", - "2025-07-30 10:35:45,738 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,738 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-07-30 10:35:45,738 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,739 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,739 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-07-30 10:35:45,739 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,739 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-07-30 10:35:45,739 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,740 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,740 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-07-30 10:35:45,740 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-07-30 10:35:45,740 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-07-30 10:35:45,741 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-07-30 10:35:45,741 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,742 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,742 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-07-30 10:35:45,742 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,743 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,743 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-07-30 10:35:45,743 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-07-30 10:35:45,744 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,744 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,744 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,745 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,745 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,746 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-07-30 10:35:45,746 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-07-30 10:35:45,746 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,746 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-07-30 10:35:45,747 - INFO - Using base network '12_node_network' on variant 'ContingencyScenario1d5c7599-a0cc-4463-90bc-c801dbc88b9a'\n", - "2025-07-30 10:35:45,747 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-07-30 10:35:45,747 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-07-30 10:35:45,748 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-07-30 10:35:45,748 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-07-30 10:35:45,749 - INFO - Linear optimization on root leaf\n", - "2025-07-30 10:35:45,751 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-07-30 10:35:45,751 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-07-30 10:35:45,751 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-07-30 10:35:45,752 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-07-30 10:35:45,752 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-07-30 10:35:45,752 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-07-30 10:35:45,753 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-07-30 10:35:45,753 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,754 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,754 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-07-30 10:35:45,754 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-07-30 10:35:45,755 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", - "2025-07-30 10:35:45,755 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", - "2025-07-30 10:35:45,757 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-07-30 10:35:45,757 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-07-30 10:35:45,757 - INFO - range action(s): pst-range-action: 6\n", - "2025-07-30 10:35:45,758 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-07-30 10:35:45,758 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-07-30 10:35:45,758 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-07-30 10:35:45,759 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-07-30 10:35:45,759 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-07-30 10:35:45,759 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-07-30 10:35:45,760 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-07-30 10:35:45,760 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-07-30 10:35:45,760 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + "2025-09-08 09:21:13,998 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,999 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,999 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:13,999 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,000 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,000 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,001 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,001 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,001 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,001 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,002 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,002 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,002 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,002 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,003 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,003 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,003 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,003 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-09-08 09:21:14,003 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-08 09:21:14,004 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-08 09:21:14,004 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-09-08 09:21:14,006 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:14,007 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:14,007 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:14,010 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 09:21:14,010 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,012 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,012 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,013 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,013 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 09:21:14,014 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,014 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,014 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 09:21:14,014 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-08 09:21:14,015 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,015 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,015 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,016 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,016 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,017 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 09:21:14,017 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,017 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,017 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 09:21:14,018 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 09:21:14,018 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,018 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,018 - INFO - Linear optimization on root leaf\n", + "2025-09-08 09:21:14,020 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,021 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,021 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 09:21:14,021 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,022 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,022 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 09:21:14,022 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 09:21:14,023 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,023 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,023 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,024 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,024 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,025 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-08 09:21:14,026 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 09:21:14,026 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-08 09:21:14,027 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-08 09:21:14,027 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,027 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,027 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 09:21:14,028 - INFO - Search depth 1 [start]\n", + "2025-09-08 09:21:14,028 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 09:21:14,028 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:14,029 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,030 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,030 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:14,030 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,031 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,031 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:14,031 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 09:21:14,032 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,032 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,032 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,033 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,033 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,033 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:14,034 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:14,034 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-08 09:21:14,035 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 09:21:14,035 - INFO - Search depth 1 [end]\n", + "2025-09-08 09:21:14,035 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:14,036 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 09:21:14,036 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,036 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,036 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 09:21:14,037 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:14,037 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 09:21:14,037 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,037 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,037 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 09:21:14,038 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:14,038 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 09:21:14,038 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:14,039 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,039 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,039 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:14,040 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,040 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,040 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:14,041 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-08 09:21:14,041 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,042 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,042 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,042 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,043 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,043 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-08 09:21:14,044 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,044 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,044 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 09:21:14,048 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-09-08 09:21:14,048 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-09-08 09:21:14,049 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-08 09:21:14,049 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,050 - INFO - Linear optimization on root leaf\n", + "2025-09-08 09:21:14,051 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,052 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,053 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:14,053 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,054 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,054 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:14,055 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-09-08 09:21:14,055 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,056 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,056 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,057 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,057 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,058 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-09-08 09:21:14,059 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 09:21:14,059 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-09-08 09:21:14,060 - INFO - range action(s): pst-range-action: 6\n", + "2025-09-08 09:21:14,060 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,060 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-09-08 09:21:14,060 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-09-08 09:21:14,061 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 09:21:14,061 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 09:21:14,062 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,062 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,062 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,062 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -766,8 +768,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.810335Z", - "start_time": "2025-07-30T08:35:45.806226Z" + "end_time": "2025-09-08T07:21:14.124196Z", + "start_time": "2025-09-08T07:21:14.119823Z" } }, "outputs": [ @@ -840,8 +842,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-07-30T08:35:45.863998Z", - "start_time": "2025-07-30T08:35:45.860531Z" + "end_time": "2025-09-08T07:21:14.187238Z", + "start_time": "2025-09-08T07:21:14.182433Z" } }, "outputs": [ @@ -911,24 +913,191 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-08-20T08:39:28.445561250Z", - "start_time": "2025-08-20T08:30:44.894481Z" + "end_time": "2025-09-08T07:21:14.359788Z", + "start_time": "2025-09-08T07:21:14.244906Z" } }, "outputs": [ { - "ename": "NameError", - "evalue": "name 'pp' is not defined", - "output_type": "error", - "traceback": [ - "\u001B[31m---------------------------------------------------------------------------\u001B[39m", - "\u001B[31mNameError\u001B[39m Traceback (most recent call last)", - "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[1]\u001B[39m\u001B[32m, line 2\u001B[39m\n\u001B[32m 1\u001B[39m \u001B[38;5;66;03m# prepare inputs\u001B[39;00m\n\u001B[32m----> \u001B[39m\u001B[32m2\u001B[39m n12 = \u001B[43mpp\u001B[49m.network.load(\u001B[33m'\u001B[39m\u001B[33m./data/rao/12_node_network_redispatching.uct\u001B[39m\u001B[33m'\u001B[39m)\n\u001B[32m 3\u001B[39m rao_runner = pp.rao.create_rao()\n\u001B[32m 4\u001B[39m rao_runner.set_crac_file_source(n12, \u001B[33m\"\u001B[39m\u001B[33m./data/rao/N-1_case_crac_curative_redispatching.json\u001B[39m\u001B[33m\"\u001B[39m)\n", - "\u001B[31mNameError\u001B[39m: name 'pp' is not defined" + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 09:21:14,246 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,247 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,247 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,247 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,247 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,248 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,248 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,248 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,248 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,249 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,249 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,249 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,249 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,250 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,250 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,250 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,250 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 09:21:14,250 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-09-08 09:21:14,250 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-08 09:21:14,251 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-08 09:21:14,251 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-09-08 09:21:14,253 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:14,254 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:14,254 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 09:21:14,254 - WARNING - The initial setpoint is now read from the network so the value in the crac will not be read\n", + "2025-09-08 09:21:14,254 - WARNING - The initial setpoint is now read from the network so the value in the crac will not be read\n", + "2025-09-08 09:21:14,258 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 09:21:14,258 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 09:21:14,258 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,260 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 09:21:14,261 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,261 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 09:21:14,263 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", + "2025-09-08 09:21:14,263 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,264 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-1.099476065746785E-9, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,264 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,265 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,265 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.589235492678199E-8, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,266 - INFO - Initial sensitivity analysis: cost = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92})\n", + "2025-09-08 09:21:14,266 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,266 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,266 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 09:21:14,267 - INFO - Root leaf, cost: 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92})\n", + "2025-09-08 09:21:14,267 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,268 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,268 - INFO - Linear optimization on root leaf\n", + "2025-09-08 09:21:14,277 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,278 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,278 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 09:21:14,278 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,279 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,279 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 09:21:14,279 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-09-08 09:21:14,279 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,280 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.0026220928996290027, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,280 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,281 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,281 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-6.412581576853427E-9, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,282 - INFO - Iteration 1: better solution found with a cost of 384414.43 (functional: 50020.00)\n", + "2025-09-08 09:21:14,290 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 09:21:14,291 - INFO - Root leaf, 3 range action(s) activated, cost: 384414.43 (functional: 50020.0, virtual: 334394.43 {min-margin-violation-evaluator=334394.43})\n", + "2025-09-08 09:21:14,291 - INFO - range action(s): pst-range-action: -10, redispatchingActionFR: 1000, redispatchingActionNL: 500\n", + "2025-09-08 09:21:14,291 - INFO - Limiting element #01: margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,291 - INFO - Limiting element #02: margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,291 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 784.39 MW, threshold = 450.00 MW, margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,292 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 641.31 MW, threshold = 410.00 MW, margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", + "2025-09-08 09:21:14,292 - INFO - Using base network '12_node_network_redispatching' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 09:21:14,292 - INFO - Search depth 1 [start]\n", + "2025-09-08 09:21:14,293 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 09:21:14,293 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:14,294 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,294 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,294 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:14,295 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,295 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,295 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:14,296 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-09-08 09:21:14,296 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,297 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.00889825060106375, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,297 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,298 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,298 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=2.4709123636057484E-10, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,299 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: 50020.0 (functional: 50020.0, virtual: 0.0)\n", + "2025-09-08 09:21:14,307 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,307 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,307 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:14,308 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,308 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,308 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:14,309 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-09-08 09:21:14,309 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,310 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,310 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,310 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,311 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,311 - INFO - Iteration 1: better solution found with a cost of 39896.99 (functional: 39820.00)\n", + "2025-09-08 09:21:14,318 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 09:21:14,318 - INFO - Optimized network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 09:21:14,318 - INFO - Optimized network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,319 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 09:21:14,319 - INFO - Search depth 1 [end]\n", + "2025-09-08 09:21:14,319 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 09:21:14,319 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602\n", + "2025-09-08 09:21:14,320 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,320 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,320 - INFO - Search depth 2 [start]\n", + "2025-09-08 09:21:14,320 - INFO - No more network action available\n", + "2025-09-08 09:21:14,320 - INFO - No better result found in search depth 2, exiting search tree\n", + "2025-09-08 09:21:14,321 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 09:21:14,321 - INFO - Best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 09:21:14,321 - INFO - Best leaf: range action(s): pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602\n", + "2025-09-08 09:21:14,321 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,322 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,322 - INFO - Scenario \"preventive\": initial cost = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92}), 1 network action(s) and 3 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602, cost after preventive optimization = 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 09:21:14,322 - INFO - network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,322 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:14,323 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 09:21:14,323 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 09:21:14,323 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,324 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,324 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:14,325 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,325 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,326 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:14,326 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", + "2025-09-08 09:21:14,326 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,327 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,328 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,328 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,328 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,329 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98})\n", + "2025-09-08 09:21:14,329 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,330 - INFO - Limiting element #02: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,330 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 09:21:14,333 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-09-08 09:21:14,333 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-09-08 09:21:14,334 - INFO - Root leaf, cost: 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98})\n", + "2025-09-08 09:21:14,334 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,334 - INFO - Linear optimization on root leaf\n", + "2025-09-08 09:21:14,340 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 09:21:14,341 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 09:21:14,341 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 09:21:14,342 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 09:21:14,342 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 09:21:14,342 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 09:21:14,343 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-09-08 09:21:14,343 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,344 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.4915466934061214E-4, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,344 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 09:21:14,345 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 09:21:14,345 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.1015190415928373E-10, distributedActivePower=0.0))\n", + "2025-09-08 09:21:14,346 - INFO - Iteration 1: better solution found with a cost of 0.00 (functional: 0.00)\n", + "2025-09-08 09:21:14,353 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 09:21:14,354 - INFO - Root leaf, 1 range action(s) activated, cost: 0.0 (functional: 0.0, virtual: 0.0)\n", + "2025-09-08 09:21:14,354 - INFO - range action(s): pst-range-action: 1\n", + "2025-09-08 09:21:14,354 - INFO - Limiting element #01: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,355 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98}), 1 range action(s) activated : pst-range-action: 1, cost after curative optimization = 0.0 (functional: 0.0, virtual: 0.0)\n", + "2025-09-08 09:21:14,355 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-09-08 09:21:14,356 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 09:21:14,356 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 09:21:14,357 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 09:21:14,357 - INFO - Limiting element #02: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 09:21:14,357 - INFO - Limiting element #03: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 09:21:14,357 - INFO - Cost before RAO = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92}), cost after RAO = 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n" ] } ], - "execution_count": 1 + "execution_count": 14 }, { "cell_type": "code", @@ -938,8 +1107,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-07-30T08:43:40.506523Z", - "start_time": "2025-07-30T08:43:40.503443Z" + "end_time": "2025-09-08T07:21:14.866640Z", + "start_time": "2025-09-08T07:21:14.862544Z" } }, "outputs": [ @@ -949,24 +1118,70 @@ "{'type': 'RAO_RESULT',\n", " 'version': '1.8',\n", " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\n", - " 'computationStatus': 'failure',\n", - " 'executionDetails': 'RAO failed during initial sensitivity analysis : null'}" + " 'computationStatus': 'default',\n", + " 'executionDetails': 'The RAO only went through first preventive',\n", + " 'costResults': {'initial': {'functionalCost': 0.0,\n", + " 'virtualCost': {'min-margin-violation-evaluator': 716562.92,\n", + " 'sensitivity-failure-cost': 0.0}},\n", + " 'preventive': {'functionalCost': 39820.0,\n", + " 'virtualCost': {'min-margin-violation-evaluator': 362454.98,\n", + " 'sensitivity-failure-cost': 0.0}},\n", + " 'outage': {'functionalCost': 39820.0,\n", + " 'virtualCost': {'min-margin-violation-evaluator': 362454.98,\n", + " 'sensitivity-failure-cost': 0.0}},\n", + " 'curative': {'functionalCost': 39820.0,\n", + " 'virtualCost': {'min-margin-violation-evaluator': 76.99,\n", + " 'sensitivity-failure-cost': 0.0}}},\n", + " 'computationStatusMap': [],\n", + " 'flowCnecResults': [{'flowCnecId': 'BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative',\n", + " 'initial': {'ampere': {'margin': -128.4, 'side1': {'flow': 561.41}},\n", + " 'megawatt': {'margin': -88.93, 'side1': {'flow': 388.93}}},\n", + " 'preventive': {'ampere': {'margin': -523.36, 'side1': {'flow': 956.38}},\n", + " 'megawatt': {'margin': -362.45, 'side1': {'flow': 662.45}}},\n", + " 'curative': {'ampere': {'margin': 1.03, 'side1': {'flow': 431.98}},\n", + " 'megawatt': {'margin': 0.73, 'side1': {'flow': 299.27}}}},\n", + " {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage',\n", + " 'initial': {'ampere': {'margin': -1035.39, 'side1': {'flow': 1684.91}},\n", + " 'megawatt': {'margin': -716.56, 'side1': {'flow': 1166.56}}},\n", + " 'preventive': {'ampere': {'margin': -0.18, 'side1': {'flow': 649.69}},\n", + " 'megawatt': {'margin': -0.08, 'side1': {'flow': 450.08}}}},\n", + " {'flowCnecId': 'NNL2AA1 BBE3AA1 1 - preventive',\n", + " 'initial': {'ampere': {'margin': -852.3, 'side1': {'flow': 1444.08}},\n", + " 'megawatt': {'margin': -590.0, 'side1': {'flow': 1000.0}}},\n", + " 'preventive': {'ampere': {'margin': 51.6, 'side1': {'flow': 540.18}},\n", + " 'megawatt': {'margin': 35.78, 'side1': {'flow': 374.22}}}}],\n", + " 'angleCnecResults': [],\n", + " 'voltageCnecResults': [],\n", + " 'networkActionResults': [{'networkActionId': 'close NL2 BE3 2',\n", + " 'activatedStates': [{'instant': 'preventive'}]}],\n", + " 'rangeActionResults': [{'rangeActionId': 'pst-range-action',\n", + " 'initialTap': 0,\n", + " 'activatedStates': [{'instant': 'preventive', 'tap': -10},\n", + " {'instant': 'curative', 'contingency': 'Contingency DE2 DE3', 'tap': 1}]},\n", + " {'rangeActionId': 'redispatchingActionFR',\n", + " 'initialSetpoint': 500.0,\n", + " 'activatedStates': [{'instant': 'preventive', 'setpoint': 898.0}]},\n", + " {'rangeActionId': 'redispatchingActionNL',\n", + " 'initialSetpoint': 1000.0,\n", + " 'activatedStates': [{'instant': 'preventive', 'setpoint': 602.0}]}]}" ] }, - "execution_count": 18, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 18 + "execution_count": 15 }, { "cell_type": "markdown", "source": [ "If you check the initial cost in the result, you will notice the functional cost is now 0, and instead we have a virtual cost due to a \"min-margin-violation\". Indeed the new objective function is actually the cost of redispatching, and the overload has become a soft constraint.\n", - "And if you check the final result (after curative), then you will see the functional cost is 39820 and the virtual cost is only 769,89.\n", + "And if you check the final result (after curative), then you will see the functional cost is 39820 and the virtual cost is only 76,99.\n", "The 39820 value corresponds to the cost of the redispatching: 398 (up variation for FR action) * 50 (up variation cost) + 10 (activation cost) + 398 (down variation for NL action) * 50 (down variation cost) + 10 (activation cost). The costs for each action is defined in the crac file.\n", - "The 769,89 virtual cost is due to a remaining overload in the network. Currently you can not configure the cost of the overload, and you can not add a slight security margin which would be needed to avoid this slight overload (the sensitivity values we use in the optimization is an approximation of the reality). These new parameters should be available after the june release. " + "The 76,99 virtual cost is due to a remaining overload in the network. The cost of the overload can be configured via the [min margin optional parameters](https://powsybl.readthedocs.io/projects/openrao/en/stable/parameters/implementation-specific-parameters.html#min-margin-optional-parameters):\n", + "- the shifted-violation-penalty parameter sets the penalty for each MW/A of overload in the min margin, with respect to the shifted-violation-threshold\n", + "- the shifted-violation-threshold shifts the security domain of the CNECs to be considered as in violation. That way, you can for instance choose to penalize cnecs under 5 MW rather than penalizing all overloaded CNECs." ], "metadata": { "collapsed": false From 8f9c73f9008bd096c7363a2e7f9a708da5052691 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Mon, 8 Sep 2025 16:21:46 +0200 Subject: [PATCH 13/18] open_rao_monitoring updated notebook --- open_rao_monitoring.ipynb | 1448 ++++++++++++++++++++++++++++++++----- 1 file changed, 1283 insertions(+), 165 deletions(-) diff --git a/open_rao_monitoring.ipynb b/open_rao_monitoring.ipynb index 02f6850..55017af 100644 --- a/open_rao_monitoring.ipynb +++ b/open_rao_monitoring.ipynb @@ -1,101 +1,81 @@ { "cells": [ { - "cell_type": "markdown", - "id": "2fdb50ba", "metadata": {}, - "source": "# OpenRAO monitoring in pyPowsybl" + "cell_type": "markdown", + "source": "# OpenRAO monitoring in pyPowsybl", + "id": "39034e89c83d500c" }, { - "cell_type": "markdown", - "id": "efa399e1", "metadata": {}, + "cell_type": "markdown", "source": [ "In this notebook, we'll explore how OpenRao monitoring algorithms work. \n", "For network situations with angle or voltage overloads, the monitoring module will try to relieve these constraints by applying remedial actions. \n", "\n", "The first step is to install pypowsybl and import the library." - ] + ], + "id": "86ce5a5ff1fe71aa" }, { + "cell_type": "code", + "id": "6cea1dbd7b6ce7f", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:52.852979Z", - "start_time": "2025-09-02T07:04:52.050264Z" + "end_time": "2025-09-08T14:21:05.454937Z", + "start_time": "2025-09-08T14:21:05.452802Z" } }, - "cell_type": "code", - "source": "pip install pypowsybl==1.12.0", - "id": "6657842d8b2d9845", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Looking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\r\n", - "Requirement already satisfied: pypowsybl==1.12.0 in ./venv/lib/python3.11/site-packages (1.12.0)\r\n", - "Requirement already satisfied: prettytable>=2.0.0 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.16.0)\r\n", - "Requirement already satisfied: pandas>=2.2.3 in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (2.3.2)\r\n", - "Requirement already satisfied: networkx in ./venv/lib/python3.11/site-packages (from pypowsybl==1.12.0) (3.5)\r\n", - "Requirement already satisfied: numpy>=1.23.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.3.2)\r\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2.9.0.post0)\r\n", - "Requirement already satisfied: pytz>=2020.1 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", - "Requirement already satisfied: tzdata>=2022.7 in ./venv/lib/python3.11/site-packages (from pandas>=2.2.3->pypowsybl==1.12.0) (2025.2)\r\n", - "Requirement already satisfied: wcwidth in ./venv/lib/python3.11/site-packages (from prettytable>=2.0.0->pypowsybl==1.12.0) (0.2.13)\r\n", - "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.3->pypowsybl==1.12.0) (1.17.0)\r\n", - "\r\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m25.1.1\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.2\u001B[0m\r\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } + "source": [ + "#pip install pypowsybl==1.12.0" ], + "outputs": [], "execution_count": 1 }, { + "cell_type": "code", + "id": "e3edbce5fc8fe4c6", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.351210Z", - "start_time": "2025-09-02T07:04:52.863089Z" + "end_time": "2025-09-08T14:21:06.220235Z", + "start_time": "2025-09-08T14:21:05.497122Z" } }, - "cell_type": "code", "source": [ "import pypowsybl as pp\n", "from pypowsybl.rao import Parameters as RaoParameters" ], - "id": "4ad9bbcf2f4f85bf", "outputs": [], "execution_count": 2 }, { "metadata": {}, "cell_type": "markdown", - "source": "BUG : DO NOT LOAD LOGGING", - "id": "3f96a2304594b3ab" + "source": "", + "id": "a0d6a6098210fa02" }, { - "cell_type": "code", - "id": "initial_id", "metadata": { - "collapsed": true, "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.457243Z", - "start_time": "2025-09-02T07:04:53.455724Z" + "end_time": "2025-09-08T14:21:06.325503Z", + "start_time": "2025-09-08T14:21:06.323042Z" } }, + "cell_type": "code", "source": [ "# set up logging\n", - "# import logging\n", - "# logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')\n", - "# logging.getLogger('powsybl').setLevel(logging.DEBUG)" + "import logging\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')\n", + "logging.getLogger('powsybl').setLevel(logging.DEBUG)" ], + "id": "a9a59bb03b3ad3ed", "outputs": [], "execution_count": 3 }, { - "metadata": {}, "cell_type": "markdown", + "id": "eda73ac35599f2e5", + "metadata": {}, "source": [ "## I) ANGLE MONITORING\n", "\n", @@ -104,27 +84,59 @@ "- VL2 voltage level contains a load consuming 100 MW.\n", "- VL1 and VL3 are connected by a PST.\n", "- VL2 and VL3 are connected by 2 lines, one of with has infinite resistance : that's why it has no power flowing through it." - ], - "id": "eda73ac35599f2e5" + ] }, { + "cell_type": "code", + "id": "d923fa57b4d80171", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.544748Z", - "start_time": "2025-09-02T07:04:53.515810Z" + "end_time": "2025-09-08T14:21:06.447969Z", + "start_time": "2025-09-08T14:21:06.373104Z" } }, - "cell_type": "code", "source": [ "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", "network.get_network_area_diagram()" ], - "id": "d923fa57b4d80171", "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:21:06,379 - INFO - powsybl - Using platform configuration provider classic\n", + "2025-09-08 16:21:06,382 - INFO - powsybl - Platform configuration defined by .properties files of directory /home/demontmorillongod/.itools\n", + "2025-09-08 16:21:06,394 - INFO - powsybl - LocalComputationConfig [localDir=/tmp, availableCore=1]\n", + "2025-09-08 16:21:06,405 - INFO - powsybl - Configuring StAX XMLInputFactory...\n", + "2025-09-08 16:21:06,405 - INFO - powsybl - Some properties may not be supported by your implementation.\n", + "2025-09-08 16:21:06,405 - INFO - powsybl - This may not be a problem because some are overlapping.\n", + "2025-09-08 16:21:06,408 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/property/accessExternalStylesheet\n", + "2025-09-08 16:21:06,408 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/feature/secure-processing\n", + "2025-09-08 16:21:06,414 - DEBUG - powsybl - XIIDM import done in 5 ms\n", + "2025-09-08 16:21:06,415 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:21:06,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 16:21:06,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 16:21:06,427 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 16:21:06,428 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 16:21:06,428 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 16:21:06,429 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 16:21:06,429 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 16:21:06,430 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:21:06,430 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 16:21:06,430 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 16:21:06,430 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 16:21:06,433 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 16:21:06,433 - INFO - powsybl - Elapsed time: 1.08263E-4\n" + ] + }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, @@ -136,32 +148,184 @@ "execution_count": 4 }, { - "metadata": {}, "cell_type": "markdown", + "id": "ce005f42855370fb", + "metadata": {}, "source": [ "Now, let's run a loadflow on this network.\n", - "?? POURQUOI FLUX DEJA AFFICHES ?" - ], - "id": "ce005f42855370fb" + "?? POURQUOI FLUX DEJA AFFICHES ? => c'est un iddm" + ] }, { + "cell_type": "code", + "id": "e37a9b29dce42548", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.586850Z", - "start_time": "2025-09-02T07:04:53.573792Z" + "end_time": "2025-09-08T14:21:06.520335Z", + "start_time": "2025-09-08T14:21:06.475871Z" } }, - "cell_type": "code", "source": [ "pp.loadflow.run_ac(network)\n", "network.get_network_area_diagram()" ], - "id": "e37a9b29dce42548", "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:21:06,479 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 16:21:06,480 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:21:06,485 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-09-08 16:21:06,486 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:21:06,487 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 16:21:06,487 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 16:21:06,492 - DEBUG - powsybl - LF networks created in 5 ms\n", + "2025-09-08 16:21:06,492 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:21:06,493 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:21:06,493 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:21:06,494 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:21:06,494 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:21:06,496 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 16:21:06,496 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 16:21:06,497 - DEBUG - powsybl - Equation vector updated in 251 us\n", + "2025-09-08 16:21:06,497 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 16:21:06,497 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:21:06,500 - DEBUG - powsybl - Jacobian matrix built in 2256 us\n", + "2025-09-08 16:21:06,501 - DEBUG - powsybl - Sparse LU decomposition done in 89 us\n", + "2025-09-08 16:21:06,501 - DEBUG - powsybl - LU decomposition done in 537 us\n", + "2025-09-08 16:21:06,502 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,502 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 16:21:06,502 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:21:06,503 - DEBUG - powsybl - Jacobian matrix values updated in 26 us\n", + "2025-09-08 16:21:06,503 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 18 us\n", + "2025-09-08 16:21:06,504 - DEBUG - powsybl - LU decomposition updated in 314 us\n", + "2025-09-08 16:21:06,504 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,504 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 16:21:06,505 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:21:06,505 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:21:06,507 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 16:21:06,507 - INFO - powsybl - Load flow ran in 25 ms\n", + "2025-09-08 16:21:06,508 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:21:06,509 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 16:21:06,509 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 16:21:06,511 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 16:21:06,511 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:21:06,511 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 16:21:06,513 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 16:21:06,513 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 16:21:06,513 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 16:21:06,514 - INFO - powsybl - Elapsed time: 1.0453E-4\n" + ] + }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, @@ -173,131 +337,408 @@ "execution_count": 5 }, { - "metadata": {}, "cell_type": "markdown", + "id": "90a656ec77b5fff2", + "metadata": {}, "source": [ "The monitoring algorithm is run after a RAO has been run, on a network on which are applied the remedial actions optimized during the RAO to optimize flow CNECs. \n", "To relieve Angle/Voltage CNECs, we won't be optimizing remedial actions because modelling the impact of remedial actions on angle/voltage values is highly complex and non linear. Instead, we'll be checking application conditions and applying remedial actions until CNECs are relieved.\n", "\n", "To run a monitoring, we need to load the following inputs:" - ], - "id": "90a656ec77b5fff2" + ] }, { + "cell_type": "code", + "id": "2602f3b7325812ca", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.676701Z", - "start_time": "2025-09-02T07:04:53.667071Z" + "end_time": "2025-09-08T14:21:06.572192Z", + "start_time": "2025-09-08T14:21:06.564565Z" } }, - "cell_type": "code", "source": [ "parameters = RaoParameters()\n", "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" ], - "id": "2602f3b7325812ca", "outputs": [], "execution_count": 6 }, { + "cell_type": "code", + "id": "62e8576fcdedacf8", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.717725Z", - "start_time": "2025-09-02T07:04:53.715443Z" + "end_time": "2025-09-08T14:21:06.620081Z", + "start_time": "2025-09-08T14:21:06.617790Z" } }, - "cell_type": "code", - "source": "", - "id": "62e8576fcdedacf8", + "source": [], "outputs": [], "execution_count": null }, { - "metadata": {}, "cell_type": "markdown", - "source": "As stated previously, first we'll run a rao and save the rao_result. This rao_result will be used to load activated remedial actions during the monitoring module.", - "id": "c8c25cdba7a37a83" + "id": "c8c25cdba7a37a83", + "metadata": {}, + "source": [ + "As stated previously, first we'll run a rao and save the rao_result. This rao_result will be used to load activated remedial actions during the monitoring module." + ] }, { + "cell_type": "code", + "id": "4e5f0e41497f9f69", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.772786Z", - "start_time": "2025-09-02T07:04:53.763191Z" + "end_time": "2025-09-08T14:21:06.685859Z", + "start_time": "2025-09-08T14:21:06.668054Z" } }, - "cell_type": "code", "source": [ "rao_runner = pp.rao.create_rao()\n", "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json\")" ], - "id": "4e5f0e41497f9f69", "outputs": [], "execution_count": 7 }, { + "cell_type": "code", + "id": "979b8cf1fa67a46b", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.824966Z", - "start_time": "2025-09-02T07:04:53.810997Z" + "end_time": "2025-09-08T14:21:06.783735Z", + "start_time": "2025-09-08T14:21:06.720290Z" } }, - "cell_type": "code", - "source": "rao_result = rao_runner.run(network, parameters)", - "id": "979b8cf1fa67a46b", - "outputs": [], + "source": [ + "rao_result = rao_runner.run(network, parameters)" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:21:06,745 - WARNING - powsybl - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-09-08 16:21:06,747 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", + "2025-09-08 16:21:06,748 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 16:21:06,748 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:21:06,748 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:21:06,749 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", + "2025-09-08 16:21:06,749 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:21:06,750 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 16:21:06,750 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:21:06,750 - DEBUG - powsybl - Equations index updated (7 columns)\n", + "2025-09-08 16:21:06,751 - DEBUG - powsybl - Variables index updated (7 rows)\n", + "2025-09-08 16:21:06,751 - DEBUG - powsybl - Equation vector updated in 7 us\n", + "2025-09-08 16:21:06,752 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 16:21:06,752 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:21:06,752 - DEBUG - powsybl - Jacobian matrix built in 14 us\n", + "2025-09-08 16:21:06,753 - DEBUG - powsybl - Sparse LU decomposition done in 26 us\n", + "2025-09-08 16:21:06,753 - DEBUG - powsybl - LU decomposition done in 379 us\n", + "2025-09-08 16:21:06,753 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 16:21:06,754 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 16:21:06,754 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:21:06,754 - DEBUG - powsybl - Jacobian matrix values updated in 9 us\n", + "2025-09-08 16:21:06,755 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 12 us\n", + "2025-09-08 16:21:06,755 - DEBUG - powsybl - LU decomposition updated in 357 us\n", + "2025-09-08 16:21:06,755 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,756 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 16:21:06,756 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:21:06,757 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:21:06,757 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", + "2025-09-08 16:21:06,757 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 8 us\n", + "2025-09-08 16:21:06,758 - DEBUG - powsybl - LU decomposition updated in 364 us\n", + "2025-09-08 16:21:06,758 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 16:21:06,759 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", + "2025-09-08 16:21:06,759 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:21:06,759 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,760 - DEBUG - powsybl - |f(x0)|=0.5589790207946416\n", + "2025-09-08 16:21:06,760 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:21:06,760 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", + "2025-09-08 16:21:06,761 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 0.0) in 12 us\n", + "2025-09-08 16:21:06,761 - DEBUG - powsybl - LU decomposition updated in 289 us\n", + "2025-09-08 16:21:06,761 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,762 - DEBUG - powsybl - |f(x)|=0.045758144886857484\n", + "2025-09-08 16:21:06,762 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:21:06,762 - DEBUG - powsybl - Jacobian matrix values updated in 9 us\n", + "2025-09-08 16:21:06,763 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01927928160698629, threshold is 1.0E-10) in 6 us\n", + "2025-09-08 16:21:06,763 - DEBUG - powsybl - LU decomposition updated in 374 us\n", + "2025-09-08 16:21:06,764 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,764 - DEBUG - powsybl - |f(x)|=4.383228928430377E-4\n", + "2025-09-08 16:21:06,764 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 16:21:06,765 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", + "2025-09-08 16:21:06,765 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019982805021482284, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 16:21:06,765 - DEBUG - powsybl - LU decomposition updated in 363 us\n", + "2025-09-08 16:21:06,766 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 16:21:06,766 - DEBUG - powsybl - |f(x)|=3.173654213673744E-8\n", + "2025-09-08 16:21:06,766 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:21:06,767 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", + "2025-09-08 16:21:06,767 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", + "2025-09-08 16:21:06,768 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01999167027640859, threshold is 1.0E-10) in 6 us\n", + "2025-09-08 16:21:06,768 - DEBUG - powsybl - LU decomposition updated in 403 us\n", + "2025-09-08 16:21:06,768 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", + "2025-09-08 16:21:06,769 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:21:06,770 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:21:06,770 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:21:06,770 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 16:21:06,771 - DEBUG - powsybl - Creating variants [InitialScenario]\n", + "2025-09-08 16:21:06,771 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 16:21:06,772 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", + "2025-09-08 16:21:06,773 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", + "2025-09-08 16:21:06,773 - DEBUG - powsybl - Evaluating root leaf\n", + "2025-09-08 16:21:06,773 - DEBUG - powsybl - Leaf has already been evaluated\n", + "2025-09-08 16:21:06,774 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:21:06,774 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:21:06,774 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:21:06,775 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 16:21:06,775 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 16:21:06,776 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:21:06,776 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:21:06,776 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:21:06,777 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 16:21:06,777 - DEBUG - powsybl - Creating variants [ContingencyScenario89419b62-9a4a-47a3-b529-7c6e8f73ab88]\n", + "2025-09-08 16:21:06,777 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario89419b62-9a4a-47a3-b529-7c6e8f73ab88'\n", + "2025-09-08 16:21:06,778 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 404e7ed6-41e8-4f32-bdb2-be3207ff9d70, OpenRaoNetworkPool working variant f29263d9-2cd3-4e65-aef7-7263707c6586]\n", + "2025-09-08 16:21:06,778 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant f29263d9-2cd3-4e65-aef7-7263707c6586]\n", + "2025-09-08 16:21:06,779 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 16:21:06,779 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 16:21:06,779 - DEBUG - powsybl - Remaining post-contingency scenarios to optimize: 0\n", + "2025-09-08 16:21:06,780 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant f29263d9-2cd3-4e65-aef7-7263707c6586'\n", + "2025-09-08 16:21:06,780 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool state save 404e7ed6-41e8-4f32-bdb2-be3207ff9d70'\n", + "2025-09-08 16:21:06,780 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 16:21:06,781 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 16:21:06,782 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:21:06,782 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:21:06,782 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n" + ] + } + ], "execution_count": 8 }, { - "metadata": {}, "cell_type": "markdown", - "source": "In this case, no remedial actions were applied during the RAO, the network was already secure.", - "id": "d0a5624d1e9b3d7" + "id": "d0a5624d1e9b3d7", + "metadata": {}, + "source": [ + "In this case, no remedial actions were applied during the RAO, the network was already secure." + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "We'll also need a GLSK file to perform redispatching to balance the network following the application of remedial actions. Angle remedial actions are indeed injection actions on generators or loads. ", - "id": "ec951ddcb84a44b7" + "id": "ec951ddcb84a44b7", + "metadata": {}, + "source": [ + "We'll also need a GLSK file to perform redispatching to balance the network following the application of remedial actions. Angle remedial actions are indeed injection actions on generators or loads. " + ] }, { + "cell_type": "code", + "id": "a8e68de35a37a9eb", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.862895Z", - "start_time": "2025-09-02T07:04:53.858960Z" + "end_time": "2025-09-08T14:21:06.831046Z", + "start_time": "2025-09-08T14:21:06.825671Z" } }, - "cell_type": "code", - "source": "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")", - "id": "a8e68de35a37a9eb", - "outputs": [], + "source": [ + "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:21:06,828 - INFO - powsybl - CIM GLSK importer could import this document.\n" + ] + } + ], "execution_count": 9 }, { - "metadata": {}, "cell_type": "markdown", - "source": "Before running the angle monitoring algorithm, let's look at the angle cnec's situation in the network. As you can see in the crac, AngleCnec acCru1 is defined between exporting element VL2 and importing element VL1, at curative instant after contingency coL1 that disconnects line L1. A minimum threshold is defined at -6°. Let's look at the network after disconnecting L1:", - "id": "126c2b1ed673c6fc" + "id": "126c2b1ed673c6fc", + "metadata": {}, + "source": [ + "Before running the angle monitoring algorithm, let's look at the angle cnec's situation in the network. As you can see in the crac, AngleCnec acCru1 is defined between exporting element VL2 and importing element VL1, at curative instant after contingency coL1 that disconnects line L1. A minimum threshold is defined at -6°. Let's look at the network after disconnecting L1:" + ] }, { + "cell_type": "code", + "id": "eb94026815d908e7", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.921332Z", - "start_time": "2025-09-02T07:04:53.911116Z" + "end_time": "2025-09-08T14:21:06.914990Z", + "start_time": "2025-09-08T14:21:06.878559Z" } }, - "cell_type": "code", "source": [ "network.disconnect(\"L1\")\n", "pp.loadflow.run_ac(network)\n", "network.get_network_area_diagram()" ], - "id": "eb94026815d908e7", "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:21:06,881 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 16:21:06,883 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:21:06,889 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-09-08 16:21:06,890 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:21:06,891 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 16:21:06,891 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 16:21:06,892 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 16:21:06,892 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 16:21:06,892 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:21:06,893 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", + "2025-09-08 16:21:06,893 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:21:06,894 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:21:06,894 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 16:21:06,894 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 16:21:06,895 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:21:06,895 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 16:21:06,895 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:21:06,896 - DEBUG - powsybl - Jacobian matrix built in 11 us\n", + "2025-09-08 16:21:06,896 - DEBUG - powsybl - Sparse LU decomposition done in 25 us\n", + "2025-09-08 16:21:06,897 - DEBUG - powsybl - LU decomposition done in 377 us\n", + "2025-09-08 16:21:06,897 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,897 - DEBUG - powsybl - |f(x)|=0.11000183389812845\n", + "2025-09-08 16:21:06,897 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:21:06,898 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", + "2025-09-08 16:21:06,898 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.017570936140841497, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 16:21:06,899 - DEBUG - powsybl - LU decomposition updated in 341 us\n", + "2025-09-08 16:21:06,899 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,899 - DEBUG - powsybl - |f(x)|=0.0012926250446475146\n", + "2025-09-08 16:21:06,900 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 16:21:06,900 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", + "2025-09-08 16:21:06,900 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01996280301305678, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 16:21:06,901 - DEBUG - powsybl - LU decomposition updated in 467 us\n", + "2025-09-08 16:21:06,901 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:21:06,901 - DEBUG - powsybl - |f(x)|=2.692707635455752E-7\n", + "2025-09-08 16:21:06,902 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:21:06,902 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689771093529304, distributedActivePower=0.0))\n", + "2025-09-08 16:21:06,903 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 16:21:06,903 - INFO - powsybl - Load flow ran in 19 ms\n", + "2025-09-08 16:21:06,904 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:21:06,904 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 16:21:06,906 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 16:21:06,906 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 16:21:06,906 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 16:21:06,908 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 16:21:06,908 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 16:21:06,908 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 16:21:06,908 - INFO - powsybl - Elapsed time: 9.8802E-5\n" + ] + }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 383.2 kV / -3.7°
\n
\n
\n
\n
\n" }, @@ -309,54 +750,57 @@ "execution_count": 10 }, { + "cell_type": "code", + "id": "337c3b32db277f93", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:53.975523Z", - "start_time": "2025-09-02T07:04:53.972004Z" + "end_time": "2025-09-08T14:21:06.964625Z", + "start_time": "2025-09-08T14:21:06.961758Z" } }, - "cell_type": "code", - "source": "network.connect(\"L1\")", - "id": "337c3b32db277f93", - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } + "source": [ + "# network.connect(\"L1\")" ], + "outputs": [], "execution_count": 11 }, { - "metadata": {}, "cell_type": "markdown", + "id": "308a0b8c33bc09de", + "metadata": {}, "source": [ - "AngleCnec is unsecure acCur1 is unsecure with an angle of -4 - 3.7 = -7.7 < -6°.\n", + "AngleCnec is unsecure acCur1 is unsecure with an angle of -7.7 < -6°.\n", "Now let's run the angle monitoring algorithm." - ], - "id": "308a0b8c33bc09de" + ] }, { + "cell_type": "code", + "id": "3a8f9fc4911af245", "metadata": { + "jupyter": { + "is_executing": true + }, "ExecuteTime": { - "end_time": "2025-09-02T07:04:54.029802Z", - "start_time": "2025-09-02T07:04:54.027106Z" + "start_time": "2025-09-08T14:21:07.009631Z" } }, - "cell_type": "code", "source": [ - "# result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", - "# df_angle_cnecs = result_with_angle_monitoring.get_angle_cnec_results()\n", - "# df_angle_cnecs[['cnec_id', 'angle', 'margin']]" + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_angle_cnecs = result_with_angle_monitoring.get_angle_cnec_results()\n", + "df_angle_cnecs[['cnec_id', 'angle', 'margin']]" ], - "id": "3a8f9fc4911af245", - "outputs": [], - "execution_count": 12 + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:21:07,013 - INFO - powsybl - ----- ANGLE monitoring [start]\n", + "2025-09-08 16:21:07,015 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 16:21:07,015 - INFO - powsybl - Load-flow computation [start]\n" + ] + } + ], + "execution_count": null }, { "cell_type": "markdown", @@ -370,13 +814,14 @@ ] }, { + "cell_type": "code", + "id": "8ecc842841490184", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:54.102753Z", - "start_time": "2025-09-02T07:04:54.082020Z" + "end_time": "2025-09-08T14:12:04.170010Z", + "start_time": "2025-09-08T14:12:04.028710Z" } }, - "cell_type": "code", "source": [ "network_2 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", "rao_runner_2 = pp.rao.create_rao()\n", @@ -388,8 +833,410 @@ "df_angle_cnecs_2 = result_with_angle_monitoring_2.get_angle_cnec_results()\n", "df_angle_cnecs_2[['cnec_id', 'angle', 'margin']]" ], - "id": "8ecc842841490184", "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:12:04,034 - DEBUG - powsybl - XIIDM import done in 2 ms\n", + "2025-09-08 16:12:04,039 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 16:12:04,040 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 16:12:04,040 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,041 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,041 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,042 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,042 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", + "2025-09-08 16:12:04,042 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 16:12:04,043 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 16:12:04,044 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 16:12:04,044 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:12:04,045 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:12:04,045 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:12:04,046 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:12:04,046 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 16:12:04,047 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:12:04,047 - DEBUG - powsybl - Equations index updated (7 columns)\n", + "2025-09-08 16:12:04,048 - DEBUG - powsybl - Variables index updated (7 rows)\n", + "2025-09-08 16:12:04,048 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,049 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 16:12:04,050 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:12:04,050 - DEBUG - powsybl - Jacobian matrix built in 14 us\n", + "2025-09-08 16:12:04,051 - DEBUG - powsybl - Sparse LU decomposition done in 27 us\n", + "2025-09-08 16:12:04,051 - DEBUG - powsybl - LU decomposition done in 573 us\n", + "2025-09-08 16:12:04,052 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 16:12:04,052 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 16:12:04,053 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:12:04,053 - DEBUG - powsybl - Jacobian matrix values updated in 11 us\n", + "2025-09-08 16:12:04,054 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 9 us\n", + "2025-09-08 16:12:04,054 - DEBUG - powsybl - LU decomposition updated in 585 us\n", + "2025-09-08 16:12:04,055 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 16:12:04,055 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 16:12:04,056 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:12:04,056 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:12:04,057 - DEBUG - powsybl - Jacobian matrix values updated in 11 us\n", + "2025-09-08 16:12:04,057 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 7 us\n", + "2025-09-08 16:12:04,058 - DEBUG - powsybl - LU decomposition updated in 565 us\n", + "2025-09-08 16:12:04,058 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 16:12:04,059 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", + "2025-09-08 16:12:04,060 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:12:04,060 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 16:12:04,061 - DEBUG - powsybl - |f(x0)|=0.5589790207946416\n", + "2025-09-08 16:12:04,061 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:12:04,062 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", + "2025-09-08 16:12:04,062 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 0.0) in 13 us\n", + "2025-09-08 16:12:04,063 - DEBUG - powsybl - LU decomposition updated in 556 us\n", + "2025-09-08 16:12:04,063 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 16:12:04,064 - DEBUG - powsybl - |f(x)|=0.045758144886857484\n", + "2025-09-08 16:12:04,065 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:12:04,066 - DEBUG - powsybl - Jacobian matrix values updated in 15 us\n", + "2025-09-08 16:12:04,066 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01927928160698629, threshold is 1.0E-10) in 8 us\n", + "2025-09-08 16:12:04,067 - DEBUG - powsybl - LU decomposition updated in 604 us\n", + "2025-09-08 16:12:04,067 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 16:12:04,068 - DEBUG - powsybl - |f(x)|=4.383228928430377E-4\n", + "2025-09-08 16:12:04,069 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 16:12:04,070 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", + "2025-09-08 16:12:04,070 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019982805021482284, threshold is 1.0E-10) in 10 us\n", + "2025-09-08 16:12:04,071 - DEBUG - powsybl - LU decomposition updated in 631 us\n", + "2025-09-08 16:12:04,072 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 16:12:04,072 - DEBUG - powsybl - |f(x)|=3.173654213673744E-8\n", + "2025-09-08 16:12:04,073 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:12:04,074 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", + "2025-09-08 16:12:04,074 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", + "2025-09-08 16:12:04,075 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01999167027640859, threshold is 1.0E-10) in 7 us\n", + "2025-09-08 16:12:04,075 - DEBUG - powsybl - LU decomposition updated in 459 us\n", + "2025-09-08 16:12:04,076 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", + "2025-09-08 16:12:04,076 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,077 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,077 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,077 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 16:12:04,078 - DEBUG - powsybl - Creating variants [InitialScenario]\n", + "2025-09-08 16:12:04,078 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 16:12:04,079 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", + "2025-09-08 16:12:04,079 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", + "2025-09-08 16:12:04,080 - DEBUG - powsybl - Evaluating root leaf\n", + "2025-09-08 16:12:04,080 - DEBUG - powsybl - Leaf has already been evaluated\n", + "2025-09-08 16:12:04,080 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:12:04,081 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,081 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:12:04,082 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 16:12:04,082 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 16:12:04,083 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,083 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,084 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,084 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 16:12:04,085 - DEBUG - powsybl - Creating variants [ContingencyScenario221b6988-6083-4d8a-be57-49c9ee9931f7]\n", + "2025-09-08 16:12:04,085 - DEBUG - powsybl - Filling network pool with 4 new copies of network phaseShifter on variant ContingencyScenario221b6988-6083-4d8a-be57-49c9ee9931f7\n", + "2025-09-08 16:12:04,085 - DEBUG - powsybl - Copy n°1\n", + "2025-09-08 16:12:04,086 - DEBUG - powsybl - Copy n°2\n", + "2025-09-08 16:12:04,087 - DEBUG - powsybl - Copy n°3\n", + "2025-09-08 16:12:04,088 - DEBUG - powsybl - Copy n°4\n", + "2025-09-08 16:12:04,088 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", + "2025-09-08 16:12:04,089 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", + "2025-09-08 16:12:04,090 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", + "2025-09-08 16:12:04,091 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", + "2025-09-08 16:12:04,092 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", + "2025-09-08 16:12:04,092 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 16:12:04,093 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 16:12:04,094 - DEBUG - powsybl - Remaining post-contingency scenarios to optimize: 0\n", + "2025-09-08 16:12:04,094 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611'\n", + "2025-09-08 16:12:04,095 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 16:12:04,095 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 16:12:04,096 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,096 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,097 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,100 - INFO - powsybl - CIM GLSK importer could import this document.\n", + "2025-09-08 16:12:04,102 - INFO - powsybl - ----- ANGLE monitoring [start]\n", + "2025-09-08 16:12:04,102 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 16:12:04,103 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:12:04,104 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:12:04,110 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:12:04,111 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:12:04,112 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 16:12:04,113 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 16:12:04,114 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 16:12:04,114 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:12:04,115 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:12:04,115 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:12:04,116 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:12:04,116 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:12:04,117 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 16:12:04,117 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 16:12:04,118 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,118 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 16:12:04,119 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:12:04,119 - DEBUG - powsybl - Jacobian matrix built in 19 us\n", + "2025-09-08 16:12:04,120 - DEBUG - powsybl - Sparse LU decomposition done in 35 us\n", + "2025-09-08 16:12:04,121 - DEBUG - powsybl - LU decomposition done in 984 us\n", + "2025-09-08 16:12:04,122 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,122 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 16:12:04,123 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:12:04,124 - DEBUG - powsybl - Jacobian matrix values updated in 14 us\n", + "2025-09-08 16:12:04,124 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 9 us\n", + "2025-09-08 16:12:04,125 - DEBUG - powsybl - LU decomposition updated in 491 us\n", + "2025-09-08 16:12:04,126 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,126 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 16:12:04,127 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:12:04,128 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:12:04,128 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 16:12:04,129 - INFO - powsybl - Load flow ran in 24 ms\n", + "2025-09-08 16:12:04,129 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:12:04,130 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 16:12:04,130 - INFO - powsybl - All ANGLE Cnecs are secure.\n", + "2025-09-08 16:12:04,130 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario221b6988-6083-4d8a-be57-49c9ee9931f7'\n", + "2025-09-08 16:12:04,131 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 35e0d8b2-ba1d-49c7-ace1-0e6a3b58c7af, OpenRaoNetworkPool working variant 78f1a179-b863-4e53-9d6f-e7648a85361d]\n", + "2025-09-08 16:12:04,131 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant 78f1a179-b863-4e53-9d6f-e7648a85361d]\n", + "2025-09-08 16:12:04,132 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", + "2025-09-08 16:12:04,132 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:12:04,133 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:12:04,138 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:12:04,139 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:12:04,139 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 16:12:04,140 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 16:12:04,141 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 16:12:04,141 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 16:12:04,142 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:12:04,143 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 16:12:04,143 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 16:12:04,143 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:12:04,144 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 16:12:04,145 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 16:12:04,146 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 16:12:04,146 - DEBUG - powsybl - |f(x0)|=1.5009230770104418\n", + "2025-09-08 16:12:04,147 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:12:04,147 - DEBUG - powsybl - Jacobian matrix built in 9 us\n", + "2025-09-08 16:12:04,148 - DEBUG - powsybl - Sparse LU decomposition done in 27 us\n", + "2025-09-08 16:12:04,148 - DEBUG - powsybl - LU decomposition done in 461 us\n", + "2025-09-08 16:12:04,149 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 16:12:04,149 - DEBUG - powsybl - |f(x)|=0.10925791776346036\n", + "2025-09-08 16:12:04,149 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:12:04,150 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", + "2025-09-08 16:12:04,151 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.0498038566424256, threshold is 1.0E-10) in 8 us\n", + "2025-09-08 16:12:04,151 - DEBUG - powsybl - LU decomposition updated in 470 us\n", + "2025-09-08 16:12:04,151 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:12:04,152 - DEBUG - powsybl - |f(x)|=0.0011152726117064607\n", + "2025-09-08 16:12:04,152 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 16:12:04,153 - DEBUG - powsybl - Jacobian matrix values updated in 5 us\n", + "2025-09-08 16:12:04,153 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.051579562453853936, threshold is 1.0E-10) in 6 us\n", + "2025-09-08 16:12:04,154 - DEBUG - powsybl - LU decomposition updated in 485 us\n", + "2025-09-08 16:12:04,154 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 16:12:04,154 - DEBUG - powsybl - |f(x)|=2.071601116602223E-7\n", + "2025-09-08 16:12:04,155 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:12:04,156 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", + "2025-09-08 16:12:04,157 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 16:12:04,157 - INFO - powsybl - Load flow ran in 23 ms\n", + "2025-09-08 16:12:04,158 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:12:04,158 - WARNING - powsybl - Remedial action Open L1 - 2 of AngleCnec acCur1 is ignored : it has an elementary action that's not an injection setpoint.\n", + "2025-09-08 16:12:04,159 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": \n", + "2025-09-08 16:12:04,159 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", + "2025-09-08 16:12:04,160 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", + "2025-09-08 16:12:04,160 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n", + "2025-09-08 16:12:04,161 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant 78f1a179-b863-4e53-9d6f-e7648a85361d'\n", + "2025-09-08 16:12:04,162 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool state save 35e0d8b2-ba1d-49c7-ace1-0e6a3b58c7af'\n", + "2025-09-08 16:12:04,162 - INFO - powsybl - ----- ANGLE monitoring [end]\n", + "2025-09-08 16:12:04,162 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", + "2025-09-08 16:12:04,163 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -402,7 +1249,7 @@ "text/plain": [ " cnec_id angle margin\n", "index \n", - "0 acCur1 -7.713852 -1.713852" + "1 acCur1 -7.713852 -4.713852" ], "text/html": [ "
\n", @@ -436,10 +1283,10 @@ " \n", " \n", " \n", - " 0\n", + " 1\n", " acCur1\n", " -7.713852\n", - " -1.713852\n", + " -4.713852\n", " \n", " \n", "\n", @@ -454,15 +1301,15 @@ "execution_count": 13 }, { + "cell_type": "code", + "id": "3caddf0e6ed1d7e0", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:54.157431Z", - "start_time": "2025-09-02T07:04:54.156196Z" + "end_time": "2025-09-08T14:12:04.255132Z", + "start_time": "2025-09-08T14:12:04.252805Z" } }, - "cell_type": "code", - "source": "", - "id": "3caddf0e6ed1d7e0", + "source": [], "outputs": [], "execution_count": null }, @@ -470,49 +1317,320 @@ "cell_type": "markdown", "id": "78577c35", "metadata": {}, - "source": "## II) VOLTAGE MONITORING" + "source": [ + "## II) VOLTAGE MONITORING\n", + "\n", + "TODO : blabla" + ] }, { "cell_type": "code", - "id": "74e054af", + "id": "5aac37d1e047ee89", "metadata": { "ExecuteTime": { - "end_time": "2025-09-02T07:04:54.226527Z", - "start_time": "2025-09-02T07:04:54.206420Z" + "end_time": "2025-09-08T14:12:04.365215Z", + "start_time": "2025-09-08T14:12:04.261578Z" } }, "source": [ - "# import logging\n", - "# logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')\n", - "# logging.getLogger('powsybl').setLevel(logging.DEBUG)\n", "network_3 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", "rao_runner_3 = pp.rao.create_rao()\n", - "rao_runner_3.set_crac_file_source(network_3, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json\")\n", + "rao_runner_3.set_crac_file_source(network_3, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_no_RA.json\")\n", "rao_result_3 = rao_runner_3.run(network_3, parameters)\n", - "# print(rao_result_3.to_json())\n", + "print(rao_result_3.to_json())\n", "result_with_voltage_monitoring = rao_runner_3.run_voltage_monitoring(network_3, rao_result_3, load_flow_parameters, \"OpenLoadFlow\")\n", "df_voltage_cnecs = result_with_voltage_monitoring.get_voltage_cnec_results()\n", "print(df_voltage_cnecs[['cnec_id', 'min_voltage', 'max_voltage', 'margin']])\n", "print(result_with_voltage_monitoring.to_json())" ], "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:12:04,266 - DEBUG - powsybl - XIIDM import done in 2 ms\n", + "2025-09-08 16:12:04,272 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 16:12:04,273 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 16:12:04,273 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,274 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,275 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,275 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:12:04,277 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", + "2025-09-08 16:12:04,277 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 16:12:04,278 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 16:12:04,279 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 16:12:04,280 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:12:04,280 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:12:04,281 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:12:04,282 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:12:04,283 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 16:12:04,284 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:12:04,285 - DEBUG - powsybl - Equations index updated (7 columns)\n", + "2025-09-08 16:12:04,285 - DEBUG - powsybl - Variables index updated (7 rows)\n", + "2025-09-08 16:12:04,286 - DEBUG - powsybl - Equation vector updated in 10 us\n", + "2025-09-08 16:12:04,287 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 16:12:04,288 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:12:04,288 - DEBUG - powsybl - Jacobian matrix built in 14 us\n", + "2025-09-08 16:12:04,289 - DEBUG - powsybl - Sparse LU decomposition done in 38 us\n", + "2025-09-08 16:12:04,289 - DEBUG - powsybl - LU decomposition done in 577 us\n", + "2025-09-08 16:12:04,290 - DEBUG - powsybl - Equation vector updated in 6 us\n", + "2025-09-08 16:12:04,291 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 16:12:04,291 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:12:04,292 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", + "2025-09-08 16:12:04,292 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 11 us\n", + "2025-09-08 16:12:04,293 - DEBUG - powsybl - LU decomposition updated in 552 us\n", + "2025-09-08 16:12:04,294 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,294 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 16:12:04,295 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:12:04,295 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:12:04,296 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", + "2025-09-08 16:12:04,297 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 9 us\n", + "2025-09-08 16:12:04,297 - DEBUG - powsybl - LU decomposition updated in 859 us\n", + "2025-09-08 16:12:04,298 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 16:12:04,299 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", + "2025-09-08 16:12:04,300 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:12:04,300 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 16:12:04,301 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 16:12:04,301 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,302 - DEBUG - powsybl - |f(x0)|=0.5691286538358685\n", + "2025-09-08 16:12:04,303 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:12:04,304 - DEBUG - powsybl - Jacobian matrix built in 19 us\n", + "2025-09-08 16:12:04,304 - DEBUG - powsybl - Sparse LU decomposition done in 27 us\n", + "2025-09-08 16:12:04,305 - DEBUG - powsybl - LU decomposition done in 644 us\n", + "2025-09-08 16:12:04,306 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,306 - DEBUG - powsybl - |f(x)|=0.05597916961358258\n", + "2025-09-08 16:12:04,307 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:12:04,308 - DEBUG - powsybl - Jacobian matrix values updated in 14 us\n", + "2025-09-08 16:12:04,308 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.022981714360819472, threshold is 1.0E-10) in 12 us\n", + "2025-09-08 16:12:04,309 - DEBUG - powsybl - LU decomposition updated in 602 us\n", + "2025-09-08 16:12:04,309 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 16:12:04,310 - DEBUG - powsybl - |f(x)|=9.088382225742943E-4\n", + "2025-09-08 16:12:04,311 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 16:12:04,311 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", + "2025-09-08 16:12:04,312 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.020041432758458495, threshold is 1.0E-10) in 8 us\n", + "2025-09-08 16:12:04,312 - DEBUG - powsybl - LU decomposition updated in 576 us\n", + "2025-09-08 16:12:04,313 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 16:12:04,313 - DEBUG - powsybl - |f(x)|=1.9847708852864974E-7\n", + "2025-09-08 16:12:04,314 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:12:04,315 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689675321228103, distributedActivePower=0.0))\n", + "2025-09-08 16:12:04,315 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", + "2025-09-08 16:12:04,316 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991681598489332, threshold is 1.0E-10) in 8 us\n", + "2025-09-08 16:12:04,316 - DEBUG - powsybl - LU decomposition updated in 580 us\n", + "2025-09-08 16:12:04,317 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", + "2025-09-08 16:12:04,317 - INFO - powsybl - Initial sensitivity analysis: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,318 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,318 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,318 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 16:12:04,319 - DEBUG - powsybl - Creating variants [InitialScenario]\n", + "2025-09-08 16:12:04,319 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 16:12:04,320 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", + "2025-09-08 16:12:04,320 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", + "2025-09-08 16:12:04,321 - DEBUG - powsybl - Evaluating root leaf\n", + "2025-09-08 16:12:04,321 - DEBUG - powsybl - Leaf has already been evaluated\n", + "2025-09-08 16:12:04,322 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,322 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,322 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,323 - INFO - powsybl - Linear optimization on root leaf\n", + "2025-09-08 16:12:04,323 - INFO - powsybl - No range actions to optimize\n", + "2025-09-08 16:12:04,323 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,323 - INFO - powsybl - No range actions activated\n", + "2025-09-08 16:12:04,324 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,324 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,324 - INFO - powsybl - No network action available\n", + "2025-09-08 16:12:04,325 - INFO - powsybl - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 16:12:04,325 - INFO - powsybl - Best leaf: Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,325 - INFO - powsybl - Best leaf: No range actions activated\n", + "2025-09-08 16:12:04,326 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,326 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,326 - INFO - powsybl - Scenario \"preventive\": initial cost = 95.0 (functional: 95.0, virtual: 0.0), no remedial actions activated, cost after preventive optimization = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,327 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 16:12:04,327 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:12:04,328 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:12:04,328 - INFO - powsybl - Cost before RAO = 95.0 (functional: 95.0, virtual: 0.0), cost after RAO = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 16:12:04,330 - INFO - powsybl - ----- VOLTAGE monitoring [start]\n", + "2025-09-08 16:12:04,330 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 16:12:04,331 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:12:04,331 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:12:04,336 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:12:04,338 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:12:04,338 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 16:12:04,339 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 16:12:04,340 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 16:12:04,340 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:12:04,341 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:12:04,342 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:12:04,342 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:12:04,343 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:12:04,343 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 16:12:04,344 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 16:12:04,344 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,345 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 16:12:04,346 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 16:12:04,346 - DEBUG - powsybl - Jacobian matrix built in 19 us\n", + "2025-09-08 16:12:04,347 - DEBUG - powsybl - Sparse LU decomposition done in 33 us\n", + "2025-09-08 16:12:04,347 - DEBUG - powsybl - LU decomposition done in 600 us\n", + "2025-09-08 16:12:04,348 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 16:12:04,348 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 16:12:04,349 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 16:12:04,350 - DEBUG - powsybl - Jacobian matrix values updated in 17 us\n", + "2025-09-08 16:12:04,350 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 9 us\n", + "2025-09-08 16:12:04,351 - DEBUG - powsybl - LU decomposition updated in 606 us\n", + "2025-09-08 16:12:04,352 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 16:12:04,353 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 16:12:04,353 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 16:12:04,354 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:12:04,354 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 16:12:04,355 - INFO - powsybl - Load flow ran in 23 ms\n", + "2025-09-08 16:12:04,355 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:12:04,356 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 16:12:04,356 - INFO - powsybl - All VOLTAGE Cnecs are secure.\n", + "2025-09-08 16:12:04,357 - INFO - powsybl - Using base network 'phaseShifter' on variant 'PreventiveScenario'\n", + "2025-09-08 16:12:04,357 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 59773d77-0a23-489b-9f0e-b8fa1461f002, OpenRaoNetworkPool working variant d3c75ad4-d95a-416e-ae36-f7026cc33bec]\n", + "2025-09-08 16:12:04,358 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant d3c75ad4-d95a-416e-ae36-f7026cc33bec]\n", + "2025-09-08 16:12:04,359 - INFO - powsybl - ----- VOLTAGE monitoring [end]\n", + "2025-09-08 16:12:04,359 - INFO - powsybl - VOLTAGE monitoring failed due to a load flow divergence or an inconsistency in the crac or in the parameters.\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Empty DataFrame\n", - "Columns: [cnec_id, min_voltage, max_voltage, margin]\n", - "Index: []\n", - "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'preventive': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'auto': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'curative': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [{'networkActionId': 'Open L3 - 2', 'activatedStates': [{'instant': 'curative', 'contingency': 'coL1'}]}], 'rangeActionResults': []}\n" + "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'auto': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'curative': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [], 'rangeActionResults': []}\n", + " cnec_id min_voltage max_voltage margin\n", + "index \n", + "0 vc NaN NaN NaN\n", + "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'failure', 'executionDetails': 'The RAO only went through first preventive'}\n" ] } ], "execution_count": 14 + }, + { + "cell_type": "code", + "id": "74e054af", + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:12:04.392871Z", + "start_time": "2025-09-08T14:12:04.390830Z" + } + }, + "source": [ + "# network_4 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "# rao_runner_4 = pp.rao.create_rao()\n", + "# rao_runner_4.set_crac_file_source(network_4, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json\")\n", + "# rao_result_4 = rao_runner_4.run(network_4, parameters)\n", + "# result_with_voltage_monitoring_2 = rao_runner_4.run_voltage_monitoring(network_4, rao_result_4, load_flow_parameters, \"OpenLoadFlow\")\n", + "# df_voltage_cnecs_2 = result_with_voltage_monitoring_2.get_voltage_cnec_results()\n", + "# print(df_voltage_cnecs_2[['cnec_id', 'min_voltage', 'max_voltage', 'margin']])\n", + "# print(result_with_voltage_monitoring_2.to_json())" + ], + "outputs": [], + "execution_count": 15 } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -526,7 +1644,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.11.0rc1" } }, "nbformat": 4, From fdcd6ad2d4148d76d1ff2ba27c28787e936c47b5 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Mon, 8 Sep 2025 16:55:02 +0200 Subject: [PATCH 14/18] angle monitoring updated notebook --- ...ngle_monitoring_simple_case_with_topo.json | 48 +- open_rao_angle_monitoring.ipynb | 1404 +++++++++++++++++ 2 files changed, 1442 insertions(+), 10 deletions(-) create mode 100644 open_rao_angle_monitoring.ipynb diff --git a/data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json index 52af5b9..3c30392 100644 --- a/data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json +++ b/data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json @@ -23,16 +23,44 @@ "id" : "coL1", "name" : "coL1", "networkElementsIds" : [ "L1" ] - }, { - "id" : "coL1L2", - "name" : "coL1L2", - "networkElementsIds" : [ "L1", "L2" ] - }, { - "id" : "coL2", - "name" : "coL2", - "networkElementsIds" : [ "L2" ] - } ], - "flowCnecs" : [ ], + }], + "flowCnecs" : [ { + "id" : "cnec1 - preventive", + "name" : "cnec1 - preventive", + "networkElementId" : "L1", + "operator" : null, + "border" : "", + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5.0, + "max" : 100.0, + "side" : 2 + } ] + }, + { + "id" : "cnec1 - curative", + "name" : "cnec1 - curative", + "networkElementId" : "L1", + "contingencyId" : "coL1", + "operator" : null, + "border" : "", + "instant" : "curative", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5.0, + "max" : 5.0, + "side" : 2 + } ] + } ], "angleCnecs" : [ { "id" : "acCur1", "name" : "acCur1", diff --git a/open_rao_angle_monitoring.ipynb b/open_rao_angle_monitoring.ipynb new file mode 100644 index 0000000..152d7bf --- /dev/null +++ b/open_rao_angle_monitoring.ipynb @@ -0,0 +1,1404 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2fdb50ba", + "metadata": {}, + "source": "# OpenRAO Angle Monitoring in pyPowsybl" + }, + { + "cell_type": "markdown", + "id": "efa399e1", + "metadata": {}, + "source": [ + "In this notebook, we'll explore how OpenRao monitoring algorithms work. \n", + "For network situations with angle or voltage overloads, the monitoring module will try to relieve these constraints by applying remedial actions. \n", + "\n", + "The first step is to install pypowsybl and import the library." + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.075231Z", + "start_time": "2025-09-08T14:53:13.073426Z" + } + }, + "cell_type": "code", + "source": "#pip install pypowsybl==1.12.0", + "id": "6657842d8b2d9845", + "outputs": [], + "execution_count": 37 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.121505Z", + "start_time": "2025-09-08T14:53:13.119747Z" + } + }, + "cell_type": "code", + "source": [ + "import pypowsybl as pp\n", + "from pypowsybl.rao import Parameters as RaoParameters" + ], + "id": "4ad9bbcf2f4f85bf", + "outputs": [], + "execution_count": 38 + }, + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.171206Z", + "start_time": "2025-09-08T14:53:13.168167Z" + } + }, + "source": [ + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.INFO)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" + ], + "outputs": [], + "execution_count": 39 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Let's load a simple 3 node network.\n", + "- VL1 voltage level contains a generator producing 100 MW.\n", + "- VL2 voltage level contains a load consuming 100 MW.\n", + "- VL1 and VL3 are connected by a PST.\n", + "- VL2 and VL3 are connected by 2 lines, one of with has infinite resistance : that's why it has no power flowing through it." + ], + "id": "eda73ac35599f2e5" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.227876Z", + "start_time": "2025-09-08T14:53:13.217054Z" + } + }, + "cell_type": "code", + "source": [ + "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "network.get_network_area_diagram()" + ], + "id": "d923fa57b4d80171", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:53:13,219 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:53:13,221 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:53:13,222 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 16:53:13,222 - INFO - powsybl - Elapsed time: 5.2887E-5\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 40 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Now, let's run a loadflow on this network. We'll then be able to assess which lines are overloaded.", + "id": "ce005f42855370fb" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.286565Z", + "start_time": "2025-09-08T14:53:13.271083Z" + } + }, + "cell_type": "code", + "source": [ + "pp.loadflow.run_ac(network)\n", + "network.get_network_area_diagram()" + ], + "id": "e37a9b29dce42548", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:53:13,272 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 16:53:13,273 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:53:13,276 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-09-08 16:53:13,276 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:53:13,277 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:53:13,277 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,278 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,278 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:53:13,278 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,279 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,279 - INFO - powsybl - Load flow ran in 5 ms\n", + "2025-09-08 16:53:13,280 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:53:13,280 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:53:13,281 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 16:53:13,282 - INFO - powsybl - Elapsed time: 6.7027E-5\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 41 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "The monitoring algorithm is run after a RAO has been run, on a network on which are applied the remedial actions optimized during the RAO to optimize flow CNECs. \n", + "To relieve Angle/Voltage CNECs, we won't be optimizing remedial actions because modelling the impact of remedial actions on angle/voltage values is highly complex and non linear. Instead, we'll be checking application conditions and applying remedial actions until CNECs are relieved.\n", + "\n", + "To run a monitoring, we need to load the following inputs:" + ], + "id": "90a656ec77b5fff2" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.409981Z", + "start_time": "2025-09-08T14:53:13.404792Z" + } + }, + "cell_type": "code", + "source": [ + "parameters = RaoParameters()\n", + "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" + ], + "id": "2602f3b7325812ca", + "outputs": [], + "execution_count": 42 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "As stated previously, first we'll run a rao and save the rao_result. This rao_result will be used to load activated remedial actions during the monitoring module.", + "id": "c8c25cdba7a37a83" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.455548Z", + "start_time": "2025-09-08T14:53:13.451935Z" + } + }, + "cell_type": "code", + "source": [ + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json\")" + ], + "id": "4e5f0e41497f9f69", + "outputs": [], + "execution_count": 43 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.516609Z", + "start_time": "2025-09-08T14:53:13.501282Z" + } + }, + "cell_type": "code", + "source": "rao_result = rao_runner.run(network, parameters)", + "id": "979b8cf1fa67a46b", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:53:13,502 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 16:53:13,503 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 16:53:13,503 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,504 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,504 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,504 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,505 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:53:13,506 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,506 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,506 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:53:13,507 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 16:53:13,507 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,507 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,508 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 16:53:13,508 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,508 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,509 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:53:13,509 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:53:13,510 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,510 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 16:53:13,510 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:53:13,511 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,511 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:53:13,511 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 16:53:13,511 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:53:13,512 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:53:13,512 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,512 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 16:53:13,513 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 16:53:13,514 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 16:53:13,514 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 16:53:13,514 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 16:53:13,515 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:53:13,515 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,515 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n" + ] + } + ], + "execution_count": 44 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "In this case, no remedial actions were applied during the RAO, the network was already secure.\n", + "\n", + "We'll also need a GLSK file to perform redispatching to balance the network following the application of remedial actions. Angle remedial actions are indeed injection actions on generators or loads. " + ], + "id": "ec951ddcb84a44b7" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.544110Z", + "start_time": "2025-09-08T14:53:13.541090Z" + } + }, + "cell_type": "code", + "source": "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")", + "id": "a8e68de35a37a9eb", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:53:13,542 - INFO - powsybl - CIM GLSK importer could import this document.\n" + ] + } + ], + "execution_count": 45 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Before running the angle monitoring algorithm, let's look at the angle cnec's situation in the network. As you can see in the crac, AngleCnec acCru1 is defined between exporting element VL2 and importing element VL1, at curative instant after contingency coL1 that disconnects line L1. A minimum threshold is defined at -6°. Let's look at the network after disconnecting L1:", + "id": "a5eb0941e07fc55d" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.605404Z", + "start_time": "2025-09-08T14:53:13.587743Z" + } + }, + "cell_type": "code", + "source": [ + "network.disconnect(\"L1\")\n", + "pp.loadflow.run_ac(network)\n", + "network.get_network_area_diagram()" + ], + "id": "3322416d5d560809", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:53:13,589 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 16:53:13,590 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:53:13,594 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-09-08 16:53:13,595 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:53:13,595 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 16:53:13,596 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,596 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", + "2025-09-08 16:53:13,597 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:53:13,597 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,598 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689771093529304, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,598 - INFO - powsybl - Load flow ran in 7 ms\n", + "2025-09-08 16:53:13,599 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:53:13,600 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 16:53:13,601 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 16:53:13,601 - INFO - powsybl - Elapsed time: 4.3579E-5\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 383.2 kV / -3.7°
\n
\n
\n
\n
\n" + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 46 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "AngleCnec is unsecure with an angle of -7.7 < -6°.\n", + "Now let's run the angle monitoring algorithm." + ], + "id": "61b2c799e8525e56" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.654008Z", + "start_time": "2025-09-08T14:53:13.652248Z" + } + }, + "cell_type": "code", + "source": "", + "id": "9b815cc7b92b8784", + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.736758Z", + "start_time": "2025-09-08T14:53:13.702868Z" + } + }, + "cell_type": "code", + "source": [ + "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_angle_cnecs = result_with_angle_monitoring.get_angle_cnec_results()\n", + "df_angle_cnecs[['cnec_id', 'angle', 'margin']]" + ], + "id": "3a8f9fc4911af245", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:53:13,704 - INFO - powsybl - ----- ANGLE monitoring [start]\n", + "2025-09-08 16:53:13,705 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 16:53:13,706 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:53:13,706 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:53:13,710 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:53:13,711 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:53:13,711 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 16:53:13,712 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,712 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,713 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 16:53:13,713 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,714 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,714 - INFO - powsybl - Load flow ran in 7 ms\n", + "2025-09-08 16:53:13,715 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:53:13,715 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 16:53:13,715 - INFO - powsybl - All ANGLE Cnecs are secure.\n", + "2025-09-08 16:53:13,715 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario2d94b19a-2a84-401d-82e7-5e0fbe022508'\n", + "2025-09-08 16:53:13,716 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", + "2025-09-08 16:53:13,716 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:53:13,717 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:53:13,719 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:53:13,719 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:53:13,720 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 16:53:13,720 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,721 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,721 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 16:53:13,721 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,722 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,722 - INFO - powsybl - Load flow ran in 5 ms\n", + "2025-09-08 16:53:13,722 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:53:13,723 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": Injection L1 - 2\n", + "2025-09-08 16:53:13,723 - INFO - powsybl - Redispatching -50.0 MW in FR [start]\n", + "2025-09-08 16:53:13,723 - WARNING - powsybl - Redispatching failed: asked=-50.0 MW, applied=0.0 MW\n", + "2025-09-08 16:53:13,724 - INFO - powsybl - Redispatching -50.0 MW in FR [end]\n", + "2025-09-08 16:53:13,724 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:53:13,724 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:53:13,727 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:53:13,727 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:53:13,728 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 16:53:13,728 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=50.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,728 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,729 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 16:53:13,729 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,730 - INFO - powsybl - Slack bus active power (-49.75370763087723 MW) distributed in 1 distribution iteration(s)\n", + "2025-09-08 16:53:13,730 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=1, newtonRaphsonIterations=5, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.10133730290569076, distributedActivePower=-49.75370763087723))\n", + "2025-09-08 16:53:13,730 - INFO - powsybl - Load flow ran in 5 ms\n", + "2025-09-08 16:53:13,731 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:53:13,731 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", + "2025-09-08 16:53:13,731 - INFO - powsybl - All ANGLE Cnecs are secure.\n", + "2025-09-08 16:53:13,732 - INFO - powsybl - ----- ANGLE monitoring [end]\n", + "2025-09-08 16:53:13,732 - INFO - powsybl - All ANGLE Cnecs are secure.\n" + ] + }, + { + "data": { + "text/plain": [ + " cnec_id angle margin\n", + "index \n", + "6 acCur1 -3.783208 2.216792" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cnec_idanglemargin
index
6acCur1-3.7832082.216792
\n", + "
" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 47 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "During the monitoring algorithm, a network action was applied, setting load LD2's value to 50 MW. The monitoring algorithm tried to perform the opposite redispatching action to maintain network balance, but scaling failed in our case, most likely because the network is so small. Balance was achieved during load flow computation via slack redistribution. \n", + "Applied network action made AngleCnec acCur1 secure, by shifting its' angle from -7.7° to -3.8°.\n", + "\n", + "Only load actions and generator actions can be used to relieve angle cnecs. In the following example, a topological action is defined (open L3) but it isn't even considered to relieve AngleCnec acCur1." + ], + "id": "308c5164b6845ca6" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T14:53:13.843531Z", + "start_time": "2025-09-08T14:53:13.797792Z" + } + }, + "cell_type": "code", + "source": [ + "network_2 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "rao_runner_2 = pp.rao.create_rao()\n", + "rao_runner_2.set_crac_file_source(network_2, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json\")\n", + "rao_result_2 = rao_runner_2.run(network_2, parameters)\n", + "print(rao_result_2.to_json())\n", + "rao_runner_2.set_glsk_file_source(network_2, \"./data/rao/angle_monitoring/GlskB45test.xml\")\n", + "result_with_angle_monitoring_2 = rao_runner_2.run_angle_monitoring(network_2, rao_result_2, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_angle_cnecs_2 = result_with_angle_monitoring_2.get_angle_cnec_results()\n", + "df_angle_cnecs_2[['cnec_id', 'angle', 'margin']]" + ], + "id": "5c4538b1174b6e8e", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 16:53:13,802 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 16:53:13,802 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 16:53:13,804 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:53:13,804 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,805 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,805 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:53:13,806 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 16:53:13,806 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,806 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,807 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 16:53:13,807 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,807 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,808 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:53:13,808 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:53:13,808 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,809 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 16:53:13,809 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:53:13,809 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,809 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 16:53:13,810 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 16:53:13,810 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:53:13,810 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:53:13,810 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,810 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 16:53:13,812 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 16:53:13,813 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 16:53:13,813 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 16:53:13,814 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 16:53:13,814 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 16:53:13,814 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 16:53:13,815 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 16:53:13,816 - INFO - powsybl - CIM GLSK importer could import this document.\n", + "2025-09-08 16:53:13,817 - INFO - powsybl - ----- ANGLE monitoring [start]\n", + "2025-09-08 16:53:13,817 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 16:53:13,817 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:53:13,817 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:53:13,822 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:53:13,822 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:53:13,823 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 16:53:13,824 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,824 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,824 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 16:53:13,825 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,825 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,826 - INFO - powsybl - Load flow ran in 8 ms\n", + "2025-09-08 16:53:13,826 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:53:13,827 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 16:53:13,827 - INFO - powsybl - All ANGLE Cnecs are secure.\n", + "2025-09-08 16:53:13,827 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario03826340-af2c-48fa-bbb3-b9ceec4637aa'\n", + "2025-09-08 16:53:13,827 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", + "2025-09-08 16:53:13,828 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 16:53:13,828 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 16:53:13,831 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 16:53:13,832 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 16:53:13,833 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 16:53:13,833 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 16:53:13,833 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 16:53:13,834 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 16:53:13,834 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 16:53:13,835 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", + "2025-09-08 16:53:13,835 - INFO - powsybl - Load flow ran in 6 ms\n", + "2025-09-08 16:53:13,836 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 16:53:13,836 - WARNING - powsybl - Remedial action Open L1 - 2 of AngleCnec acCur1 is ignored : it has an elementary action that's not an injection setpoint.\n", + "2025-09-08 16:53:13,836 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": \n", + "2025-09-08 16:53:13,837 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", + "2025-09-08 16:53:13,837 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", + "2025-09-08 16:53:13,838 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n", + "2025-09-08 16:53:13,838 - INFO - powsybl - ----- ANGLE monitoring [end]\n", + "2025-09-08 16:53:13,838 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", + "2025-09-08 16:53:13,838 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'preventive': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'auto': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'curative': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [], 'rangeActionResults': []}\n" + ] + }, + { + "data": { + "text/plain": [ + " cnec_id angle margin\n", + "index \n", + "7 acCur1 -7.713852 -4.713852" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cnec_idanglemargin
index
7acCur1-7.713852-4.713852
\n", + "
" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 48 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e1d69d3eae91be881d2c0851756446c9360907e0 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Mon, 8 Sep 2025 17:11:33 +0200 Subject: [PATCH 15/18] voltage monitoring updated notebook --- ...onitoring_simple_case_with_RA_on_load.json | 101 ++ open_rao_voltage_monitoring.ipynb | 1249 +++++++++++++++++ 2 files changed, 1350 insertions(+) create mode 100644 data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json create mode 100644 open_rao_voltage_monitoring.ipynb diff --git a/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json b/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json new file mode 100644 index 0000000..dad8829 --- /dev/null +++ b/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json @@ -0,0 +1,101 @@ +{ + "type" : "CRAC", + "version" : "2.7", + "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", + "id" : "test-crac", + "name" : "test-crac", + "instants" : [ { + "id" : "preventive", + "kind" : "PREVENTIVE" + }, { + "id" : "outage", + "kind" : "OUTAGE" + }, { + "id" : "auto", + "kind" : "AUTO" + }, { + "id" : "curative", + "kind" : "CURATIVE" + } ], + "ra-usage-limits-per-instant" : [ ], + "networkElementsNamePerId" : { }, + "contingencies" : [ { + "id" : "coL1", + "name" : "coL1", + "networkElementsIds" : [ "PS1" ] + }], + "flowCnecs" : [ { + "id" : "cnec1 - preventive", + "name" : "cnec1 - preventive", + "networkElementId" : "L1", + "operator" : null, + "border" : "", + "instant" : "preventive", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5.0, + "max" : 100.0, + "side" : 2 + } ] + }, + { + "id" : "cnec1 - curative", + "name" : "cnec1 - curative", + "networkElementId" : "L1", + "contingencyId" : "coL1", + "operator" : null, + "border" : "", + "instant" : "curative", + "optimized" : true, + "monitored" : false, + "reliabilityMargin" : 0.0, + "nominalV" : [ NaN ], + "thresholds" : [ { + "unit" : "megawatt", + "min" : -5.0, + "max" : 5.0, + "side" : 2 + } ] + } + ], + "angleCnecs" : [ ], + "voltageCnecs" : [ { + "id" : "vc", + "name" : "vc", + "networkElementId" : "VL2", + "operator" : null, + "border" : "", + "instant" : "curative", + "contingencyId" : "coL1", + "optimized" : false, + "monitored" : true, + "reliabilityMargin" : 0.0, + "thresholds" : [ { + "unit" : "kilovolt", + "min" : 340.0, + "max" : 350.0 + } ] + } ], + "pstRangeActions" : [ ], + "hvdcRangeActions" : [ ], + "injectionRangeActions" : [ ], + "counterTradeRangeActions" : [ ], + "networkActions" : [ { + "id" : "Injection L1 - 2", + "name" : "Injection L1 - 2", + "operator" : null, + "onConstraintUsageRules" : [ { + "instant" : "curative", + "cnecId" : "vc", + "usageMethod" : "available" + } ], + "loadActions" : [ { + "networkElementId" : "LD2", + "activePowerValue" : 140.0 + } ] + } ] +} \ No newline at end of file diff --git a/open_rao_voltage_monitoring.ipynb b/open_rao_voltage_monitoring.ipynb new file mode 100644 index 0000000..18bb173 --- /dev/null +++ b/open_rao_voltage_monitoring.ipynb @@ -0,0 +1,1249 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2fdb50ba", + "metadata": {}, + "source": "# OpenRAO Voltage Monitoring in pyPowsybl" + }, + { + "cell_type": "markdown", + "id": "efa399e1", + "metadata": {}, + "source": [ + "In this notebook, we'll explore how OpenRao monitoring algorithms work. \n", + "For network situations with angle or voltage overloads, the monitoring module will try to relieve these constraints by applying remedial actions. \n", + "\n", + "The first step is to install pypowsybl and import the library." + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:42.172616Z", + "start_time": "2025-09-08T15:08:42.170641Z" + } + }, + "cell_type": "code", + "source": "#pip install pypowsybl==1.12.0", + "id": "6657842d8b2d9845", + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:43.459107Z", + "start_time": "2025-09-08T15:08:42.219939Z" + } + }, + "cell_type": "code", + "source": [ + "import pypowsybl as pp\n", + "from pypowsybl.rao import Parameters as RaoParameters" + ], + "id": "4ad9bbcf2f4f85bf", + "outputs": [], + "execution_count": 2 + }, + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-08T15:08:43.538329Z", + "start_time": "2025-09-08T15:08:43.536229Z" + } + }, + "source": [ + "# set up logging\n", + "import logging\n", + "logging.getLogger('powsybl').setLevel(logging.DEBUG)\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" + ], + "outputs": [], + "execution_count": 3 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Let's load a simple 3 node network.\n", + "- VL1 voltage level contains a generator producing 100 MW.\n", + "- VL2 voltage level contains a load consuming 100 MW.\n", + "- VL1 and VL3 are connected by a PST.\n", + "- VL2 and VL3 are connected by 2 lines, one of with has infinite resistance : that's why it has no power flowing through it." + ], + "id": "eda73ac35599f2e5" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:43.609614Z", + "start_time": "2025-09-08T15:08:43.586107Z" + } + }, + "cell_type": "code", + "source": [ + "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "network.get_network_area_diagram()" + ], + "id": "d923fa57b4d80171", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 17:08:43,587 - INFO - powsybl - Using platform configuration provider classic\n", + "2025-09-08 17:08:43,587 - INFO - powsybl - Platform configuration defined by .properties files of directory /home/demontmorillongod/.itools\n", + "2025-09-08 17:08:43,589 - INFO - powsybl - LocalComputationConfig [localDir=/tmp, availableCore=1]\n", + "2025-09-08 17:08:43,591 - INFO - powsybl - Configuring StAX XMLInputFactory...\n", + "2025-09-08 17:08:43,591 - INFO - powsybl - Some properties may not be supported by your implementation.\n", + "2025-09-08 17:08:43,592 - INFO - powsybl - This may not be a problem because some are overlapping.\n", + "2025-09-08 17:08:43,592 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/property/accessExternalStylesheet\n", + "2025-09-08 17:08:43,593 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/feature/secure-processing\n", + "2025-09-08 17:08:43,594 - DEBUG - powsybl - XIIDM import done in 1 ms\n", + "2025-09-08 17:08:43,595 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:08:43,598 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:08:43,598 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:08:43,598 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:08:43,599 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:08:43,601 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:08:43,601 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:08:43,601 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:08:43,601 - INFO - powsybl - Elapsed time: 8.9488E-5\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Now, let's run a loadflow on this network. We'll then be able to assess which lines are overloaded.", + "id": "ce005f42855370fb" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:43.750149Z", + "start_time": "2025-09-08T15:08:43.720690Z" + } + }, + "cell_type": "code", + "source": [ + "pp.loadflow.run_ac(network)\n", + "network.get_network_area_diagram()" + ], + "id": "e37a9b29dce42548", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 17:08:43,722 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 17:08:43,722 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:08:43,727 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-09-08 17:08:43,728 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:08:43,728 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 17:08:43,729 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 17:08:43,730 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 17:08:43,730 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:08:43,731 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:08:43,731 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:08:43,731 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:08:43,731 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:08:43,732 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:08:43,732 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:08:43,732 - DEBUG - powsybl - Equation vector updated in 73 us\n", + "2025-09-08 17:08:43,733 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:08:43,733 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:43,735 - DEBUG - powsybl - Jacobian matrix built in 1337 us\n", + "2025-09-08 17:08:43,735 - DEBUG - powsybl - Sparse LU decomposition done in 51 us\n", + "2025-09-08 17:08:43,735 - DEBUG - powsybl - LU decomposition done in 307 us\n", + "2025-09-08 17:08:43,735 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:43,736 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 17:08:43,736 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:43,736 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", + "2025-09-08 17:08:43,736 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 12 us\n", + "2025-09-08 17:08:43,737 - DEBUG - powsybl - LU decomposition updated in 267 us\n", + "2025-09-08 17:08:43,737 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:43,737 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 17:08:43,737 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:43,738 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:08:43,738 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:08:43,739 - INFO - powsybl - Load flow ran in 15 ms\n", + "2025-09-08 17:08:43,739 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:08:43,740 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:08:43,740 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:08:43,740 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:08:43,742 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:08:43,742 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:08:43,743 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:08:43,743 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:08:43,743 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:08:43,744 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:08:43,744 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:08:43,744 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:08:43,745 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:08:43,745 - INFO - powsybl - Elapsed time: 8.5373E-5\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 5 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "The monitoring algorithm is run after a RAO has been run, on a network on which are applied the remedial actions optimized during the RAO to optimize flow CNECs. \n", + "To relieve Angle/Voltage CNECs, we won't be optimizing remedial actions because modelling the impact of remedial actions on angle/voltage values is highly complex and non linear. Instead, we'll be checking application conditions and applying remedial actions until CNECs are relieved.\n", + "\n", + "To run a monitoring, we need to load the following inputs:" + ], + "id": "90a656ec77b5fff2" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:43.965137Z", + "start_time": "2025-09-08T15:08:43.957089Z" + } + }, + "cell_type": "code", + "source": [ + "parameters = RaoParameters()\n", + "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" + ], + "id": "2602f3b7325812ca", + "outputs": [], + "execution_count": 6 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "As stated previously, first we'll run a rao and save the rao_result. This rao_result will be used to load activated remedial actions during the monitoring module.", + "id": "c8c25cdba7a37a83" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:44.018273Z", + "start_time": "2025-09-08T15:08:44.011795Z" + } + }, + "cell_type": "code", + "source": [ + "rao_runner = pp.rao.create_rao()\n", + "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json\")" + ], + "id": "4e5f0e41497f9f69", + "outputs": [], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:44.156469Z", + "start_time": "2025-09-08T15:08:44.074259Z" + } + }, + "cell_type": "code", + "source": "rao_result = rao_runner.run(network, parameters)", + "id": "979b8cf1fa67a46b", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 17:08:44,081 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:08:44,082 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 17:08:44,082 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:08:44,082 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:08:44,082 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:08:44,083 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:08:44,083 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", + "2025-09-08 17:08:44,083 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:08:44,084 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:08:44,084 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:08:44,084 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:08:44,085 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:08:44,085 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:08:44,085 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:08:44,086 - DEBUG - powsybl - Equations index updated (7 columns)\n", + "2025-09-08 17:08:44,086 - DEBUG - powsybl - Variables index updated (7 rows)\n", + "2025-09-08 17:08:44,086 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 17:08:44,086 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:08:44,087 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:44,087 - DEBUG - powsybl - Jacobian matrix built in 11 us\n", + "2025-09-08 17:08:44,087 - DEBUG - powsybl - Sparse LU decomposition done in 19 us\n", + "2025-09-08 17:08:44,087 - DEBUG - powsybl - LU decomposition done in 235 us\n", + "2025-09-08 17:08:44,088 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,088 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 17:08:44,088 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:44,089 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", + "2025-09-08 17:08:44,089 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 17:08:44,089 - DEBUG - powsybl - LU decomposition updated in 285 us\n", + "2025-09-08 17:08:44,090 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:08:44,090 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 17:08:44,090 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:44,090 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:08:44,091 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", + "2025-09-08 17:08:44,091 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 7 us\n", + "2025-09-08 17:08:44,092 - DEBUG - powsybl - LU decomposition updated in 420 us\n", + "2025-09-08 17:08:44,092 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 17:08:44,092 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", + "2025-09-08 17:08:44,093 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:08:44,093 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:08:44,093 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:08:44,094 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,094 - DEBUG - powsybl - |f(x0)|=0.5691286538358685\n", + "2025-09-08 17:08:44,094 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:44,095 - DEBUG - powsybl - Jacobian matrix built in 8 us\n", + "2025-09-08 17:08:44,095 - DEBUG - powsybl - Sparse LU decomposition done in 11 us\n", + "2025-09-08 17:08:44,095 - DEBUG - powsybl - LU decomposition done in 336 us\n", + "2025-09-08 17:08:44,096 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,096 - DEBUG - powsybl - |f(x)|=0.05597916961358258\n", + "2025-09-08 17:08:44,096 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:44,096 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", + "2025-09-08 17:08:44,097 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.022981714360819472, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:08:44,097 - DEBUG - powsybl - LU decomposition updated in 333 us\n", + "2025-09-08 17:08:44,097 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,098 - DEBUG - powsybl - |f(x)|=9.088382225742943E-4\n", + "2025-09-08 17:08:44,098 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:08:44,098 - DEBUG - powsybl - Jacobian matrix values updated in 5 us\n", + "2025-09-08 17:08:44,098 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.020041432758458495, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:08:44,098 - DEBUG - powsybl - LU decomposition updated in 231 us\n", + "2025-09-08 17:08:44,137 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,137 - DEBUG - powsybl - |f(x)|=1.9847708852864974E-7\n", + "2025-09-08 17:08:44,138 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:44,138 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689675321228103, distributedActivePower=0.0))\n", + "2025-09-08 17:08:44,138 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", + "2025-09-08 17:08:44,138 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991681598489332, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:08:44,139 - DEBUG - powsybl - LU decomposition updated in 256 us\n", + "2025-09-08 17:08:44,139 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", + "2025-09-08 17:08:44,139 - INFO - powsybl - Initial sensitivity analysis: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:08:44,140 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:08:44,140 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:08:44,140 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:08:44,140 - DEBUG - powsybl - Creating variants [InitialScenario]\n", + "2025-09-08 17:08:44,140 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 17:08:44,141 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", + "2025-09-08 17:08:44,141 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", + "2025-09-08 17:08:44,141 - DEBUG - powsybl - Evaluating root leaf\n", + "2025-09-08 17:08:44,141 - DEBUG - powsybl - Leaf has already been evaluated\n", + "2025-09-08 17:08:44,141 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:08:44,141 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:08:44,142 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:08:44,142 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:08:44,142 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 17:08:44,142 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:08:44,143 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:08:44,143 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:08:44,143 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 17:08:44,143 - DEBUG - powsybl - Creating variants [ContingencyScenario4f0b2e2f-8a7b-47cd-b082-157db7044d4d]\n", + "2025-09-08 17:08:44,144 - DEBUG - powsybl - Filling network pool with 4 new copies of network phaseShifter on variant ContingencyScenario4f0b2e2f-8a7b-47cd-b082-157db7044d4d\n", + "2025-09-08 17:08:44,144 - DEBUG - powsybl - Copy n°1\n", + "2025-09-08 17:08:44,144 - DEBUG - powsybl - Copy n°2\n", + "2025-09-08 17:08:44,145 - DEBUG - powsybl - Copy n°3\n", + "2025-09-08 17:08:44,146 - DEBUG - powsybl - Copy n°4\n", + "2025-09-08 17:08:44,147 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", + "2025-09-08 17:08:44,147 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", + "2025-09-08 17:08:44,147 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", + "2025-09-08 17:08:44,148 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", + "2025-09-08 17:08:44,148 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", + "2025-09-08 17:08:44,148 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 17:08:44,148 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 17:08:44,149 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", + "2025-09-08 17:08:44,149 - DEBUG - powsybl - Evaluating root leaf\n", + "2025-09-08 17:08:44,149 - DEBUG - powsybl - Leaf has already been evaluated\n", + "2025-09-08 17:08:44,150 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:08:44,150 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:08:44,150 - INFO - powsybl - Linear optimization on root leaf\n", + "2025-09-08 17:08:44,150 - INFO - powsybl - No range actions to optimize\n", + "2025-09-08 17:08:44,151 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:08:44,151 - INFO - powsybl - No range actions activated\n", + "2025-09-08 17:08:44,151 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:08:44,151 - INFO - powsybl - No network action available\n", + "2025-09-08 17:08:44,152 - INFO - powsybl - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 17:08:44,152 - INFO - powsybl - Best leaf: Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:08:44,152 - INFO - powsybl - Best leaf: No range actions activated\n", + "2025-09-08 17:08:44,152 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:08:44,153 - INFO - powsybl - Scenario \"coL1\": initial cost = 95.0 (functional: 95.0, virtual: 0.0), no remedial actions activated, cost after curative optimization = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:08:44,153 - INFO - powsybl - Curative state coL1 - curative has been optimized.\n", + "2025-09-08 17:08:44,153 - DEBUG - powsybl - Remaining post-contingency scenarios to optimize: 0\n", + "2025-09-08 17:08:44,153 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339'\n", + "2025-09-08 17:08:44,154 - DEBUG - powsybl - Removing variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 17:08:44,154 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 17:08:44,154 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 17:08:44,155 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:08:44,155 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:08:44,155 - INFO - powsybl - Cost before RAO = 95.0 (functional: 95.0, virtual: 0.0), cost after RAO = 95.0 (functional: 95.0, virtual: 0.0)\n" + ] + } + ], + "execution_count": 8 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "In this case, no remedial actions were applied during the RAO, the network was already secure.\n", + "\n" + ], + "id": "ec951ddcb84a44b7" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Before running the angle monitoring algorithm, let's look at the voltage cnec's situation in the network. As you can see in the crac, VoltageCnec vc is defined on VL2, at curative instant after contingency coL1 that disconnects PST PS1. A minimum threshold is defined at 340 kV, a maximum threshold at 350 kV. Let's look at the network after disconnecting PS1:", + "id": "a5eb0941e07fc55d" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:44.432037Z", + "start_time": "2025-09-08T15:08:44.406180Z" + } + }, + "cell_type": "code", + "source": [ + "network.disconnect(\"PS1\")\n", + "pp.loadflow.run_ac(network)\n", + "network.get_network_area_diagram()" + ], + "id": "3322416d5d560809", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 17:08:44,407 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 17:08:44,407 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:08:44,411 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ true │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ false │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", + "│ │ countriesToBalance │ [] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ true │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ true │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", + "2025-09-08 17:08:44,411 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:08:44,412 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 17:08:44,412 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 17:08:44,412 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:08:44,413 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:08:44,413 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:08:44,413 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", + "2025-09-08 17:08:44,414 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:08:44,414 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:08:44,414 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:08:44,414 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:08:44,415 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 17:08:44,415 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:08:44,415 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:44,416 - DEBUG - powsybl - Jacobian matrix built in 11 us\n", + "2025-09-08 17:08:44,416 - DEBUG - powsybl - Sparse LU decomposition done in 21 us\n", + "2025-09-08 17:08:44,416 - DEBUG - powsybl - LU decomposition done in 272 us\n", + "2025-09-08 17:08:44,417 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,417 - DEBUG - powsybl - |f(x)|=0.08500683913618383\n", + "2025-09-08 17:08:44,417 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:44,418 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", + "2025-09-08 17:08:44,418 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668633, threshold is 1.0E-10) in 8 us\n", + "2025-09-08 17:08:44,418 - DEBUG - powsybl - LU decomposition updated in 348 us\n", + "2025-09-08 17:08:44,419 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:08:44,419 - DEBUG - powsybl - |f(x)|=0.0010560775453428916\n", + "2025-09-08 17:08:44,419 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:08:44,420 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:08:44,420 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01999167090866865, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:08:44,420 - DEBUG - powsybl - LU decomposition updated in 316 us\n", + "2025-09-08 17:08:44,420 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,421 - DEBUG - powsybl - |f(x)|=1.857490290874069E-7\n", + "2025-09-08 17:08:44,421 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:44,421 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689711101421578, distributedActivePower=0.0))\n", + "2025-09-08 17:08:44,422 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:08:44,422 - INFO - powsybl - Load flow ran in 14 ms\n", + "2025-09-08 17:08:44,422 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:08:44,423 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:08:44,423 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:08:44,424 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:08:44,425 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:08:44,425 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:08:44,425 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:08:44,427 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:08:44,427 - INFO - powsybl - Elapsed time: 9.0005E-5\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 368.1 kV / -7.7°
\n
\n
\n
\n
\n" + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "VoltageCnec vc is unsecure with a voltage of 368 kV > 350 kV.\n", + "Now let's run the voltage monitoring algorithm." + ], + "id": "61b2c799e8525e56" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:44.480807Z", + "start_time": "2025-09-08T15:08:44.479550Z" + } + }, + "cell_type": "code", + "source": "", + "id": "9b815cc7b92b8784", + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:08:44.591232Z", + "start_time": "2025-09-08T15:08:44.529487Z" + } + }, + "cell_type": "code", + "source": [ + "result_with_voltage_monitoring = rao_runner.run_voltage_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", + "df_voltage_cnecs = result_with_voltage_monitoring.get_voltage_cnec_results()\n", + "print(df_voltage_cnecs[['cnec_id', 'min_voltage', 'max_voltage', 'margin']])\n", + "print(result_with_voltage_monitoring.to_json())" + ], + "id": "3a8f9fc4911af245", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-08 17:08:44,531 - INFO - powsybl - ----- VOLTAGE monitoring [start]\n", + "2025-09-08 17:08:44,532 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 17:08:44,532 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:08:44,532 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:08:44,538 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 17:08:44,539 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:08:44,539 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:08:44,540 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:08:44,540 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:08:44,540 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", + "2025-09-08 17:08:44,541 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", + "2025-09-08 17:08:44,541 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:08:44,541 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:08:44,541 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:08:44,542 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 17:08:44,542 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:08:44,542 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:44,543 - DEBUG - powsybl - Jacobian matrix built in 7 us\n", + "2025-09-08 17:08:44,543 - DEBUG - powsybl - Sparse LU decomposition done in 23 us\n", + "2025-09-08 17:08:44,543 - DEBUG - powsybl - LU decomposition done in 316 us\n", + "2025-09-08 17:08:44,544 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:08:44,544 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", + "2025-09-08 17:08:44,544 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:44,544 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", + "2025-09-08 17:08:44,545 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 17:08:44,545 - DEBUG - powsybl - LU decomposition updated in 344 us\n", + "2025-09-08 17:08:44,545 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,546 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", + "2025-09-08 17:08:44,546 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:08:44,546 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:08:44,546 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:08:44,547 - DEBUG - powsybl - LU decomposition updated in 295 us\n", + "2025-09-08 17:08:44,547 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,547 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", + "2025-09-08 17:08:44,548 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:44,548 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3667399372342284, distributedActivePower=0.0))\n", + "2025-09-08 17:08:44,548 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:08:44,548 - INFO - powsybl - Load flow ran in 16 ms\n", + "2025-09-08 17:08:44,549 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:08:44,549 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 17:08:44,549 - INFO - powsybl - All VOLTAGE Cnecs are secure.\n", + "2025-09-08 17:08:44,549 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario4f0b2e2f-8a7b-47cd-b082-157db7044d4d'\n", + "2025-09-08 17:08:44,550 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 0f94c867-d2d9-4a6d-977b-7284b13bc866, OpenRaoNetworkPool working variant fc7652c5-3222-4634-9b7d-588a905107c7]\n", + "2025-09-08 17:08:44,550 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant fc7652c5-3222-4634-9b7d-588a905107c7]\n", + "2025-09-08 17:08:44,551 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'coL1 - curative' [start]\n", + "2025-09-08 17:08:44,551 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:08:44,551 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:08:44,554 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 17:08:44,554 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:08:44,555 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 17:08:44,555 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 17:08:44,556 - DEBUG - powsybl - LF networks created in 1 ms\n", + "2025-09-08 17:08:44,556 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:08:44,556 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:08:44,557 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", + "2025-09-08 17:08:44,557 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", + "2025-09-08 17:08:44,557 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:08:44,558 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:08:44,558 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:08:44,559 - DEBUG - powsybl - Equation vector updated in 4 us\n", + "2025-09-08 17:08:44,559 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:08:44,559 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:44,560 - DEBUG - powsybl - Jacobian matrix built in 9 us\n", + "2025-09-08 17:08:44,560 - DEBUG - powsybl - Sparse LU decomposition done in 18 us\n", + "2025-09-08 17:08:44,560 - DEBUG - powsybl - LU decomposition done in 277 us\n", + "2025-09-08 17:08:44,560 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,561 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", + "2025-09-08 17:08:44,561 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:44,561 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", + "2025-09-08 17:08:44,562 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:08:44,562 - DEBUG - powsybl - LU decomposition updated in 268 us\n", + "2025-09-08 17:08:44,562 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,562 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", + "2025-09-08 17:08:44,563 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:08:44,563 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", + "2025-09-08 17:08:44,563 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:08:44,564 - DEBUG - powsybl - LU decomposition updated in 240 us\n", + "2025-09-08 17:08:44,564 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,564 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", + "2025-09-08 17:08:44,564 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:44,565 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3667399372342284, distributedActivePower=0.0))\n", + "2025-09-08 17:08:44,565 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:08:44,565 - INFO - powsybl - Load flow ran in 13 ms\n", + "2025-09-08 17:08:44,566 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:08:44,566 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"vc\": Injection L1 - 2\n", + "2025-09-08 17:08:44,566 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:08:44,567 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:08:44,569 - INFO - powsybl - Parameters:\n", + "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", + "│ Category │ Name │ Value │\n", + "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", + "│ Automation │ simulateAutomationSystems │ false │\n", + "│ DC │ dcApproximationType │ IGNORE_R │\n", + "│ │ dcPowerFactor │ 1.0 │\n", + "│ │ dcUseTransformerRatio │ false │\n", + "│ Debug │ alwaysUpdateNetwork │ false │\n", + "│ │ debugDir │ │\n", + "│ FastRestart │ actionableSwitchesIds │ [] │\n", + "│ │ actionableTransformersIds │ [] │\n", + "│ │ networkCacheEnabled │ false │\n", + "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", + "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", + "│ │ extrapolateReactiveLimits │ false │\n", + "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", + "│ │ forceTargetQInReactiveLimits │ false │\n", + "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", + "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", + "│ │ reactiveRangeCheckMode │ MAX │\n", + "│ │ svcVoltageMonitoring │ true │\n", + "│ │ voltagePerReactivePowerControl │ false │\n", + "│ │ voltageRemoteControl │ true │\n", + "│ │ voltageRemoteControlRobustMode │ true │\n", + "│ HVDC │ hvdcAcEmulation │ true │\n", + "│ Model │ asymmetrical │ false │\n", + "│ │ dc │ false │\n", + "│ │ linePerUnitMode │ IMPEDANCE │\n", + "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", + "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", + "│ │ twtSplitShuntAdmittance │ true │\n", + "│ │ useLoadModel │ false │\n", + "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", + "│ │ newtonKrylovLineSearch │ false │\n", + "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", + "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", + "│ │ maxActivePowerMismatch │ 0.01 │\n", + "│ │ maxAngleMismatch │ 1.0E-5 │\n", + "│ │ maxNewtonRaphsonIterations │ 15 │\n", + "│ │ maxRatioMismatch │ 1.0E-5 │\n", + "│ │ maxReactivePowerMismatch │ 0.01 │\n", + "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", + "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", + "│ │ maxVoltageMismatch │ 1.0E-4 │\n", + "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", + "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", + "│ │ stateVectorScalingMode │ NONE │\n", + "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", + "│ │ outerLoopNames │ │\n", + "│ Performance │ computedConnectedComponentScope │ MAIN │\n", + "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", + "│ │ phaseShifterRegulationOn │ false │\n", + "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", + "│ │ transformerReactivePowerControl │ false │\n", + "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", + "│ │ writeReferenceTerminals │ true │\n", + "│ Reporting │ reportedFeatures │ [] │\n", + "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", + "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ SlackDistribution │ areaInterchangeControl │ false │\n", + "│ │ areaInterchangeControlAreaType │ ControlArea │\n", + "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", + "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", + "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", + "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", + "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", + "│ │ │ GR, PT, PL, ME] │\n", + "│ │ distributedSlack │ true │\n", + "│ │ loadPowerFactorConstant │ false │\n", + "│ │ maxSlackBusCount │ 1 │\n", + "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", + "│ │ plausibleActivePowerLimit │ 5000.0 │\n", + "│ │ readSlackBus │ false │\n", + "│ │ slackBusCountryFilter │ [] │\n", + "│ │ slackBusPMaxMismatch │ 1.0 │\n", + "│ │ slackBusSelectionMode │ MOST_MESHED │\n", + "│ │ slackBusesIds │ [] │\n", + "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", + "│ │ useActiveLimits │ true │\n", + "│ │ writeSlackBus │ false │\n", + "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", + "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", + "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", + "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", + "│ │ transformerVoltageControlOn │ false │\n", + "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", + "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", + "│ │ maxRealisticVoltage │ 2.0 │\n", + "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", + "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", + "│ │ minPlausibleTargetVoltage │ 0.8 │\n", + "│ │ minRealisticVoltage │ 0.5 │\n", + "│ │ secondaryVoltageControl │ false │\n", + "│ │ useReactiveLimits │ true │\n", + "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", + "│ │ │ SHUNT] │\n", + "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", + "│ │ voltageInitModeOverride │ NONE │\n", + "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", + "2025-09-08 17:08:44,569 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:08:44,570 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:08:44,570 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:08:44,570 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=140.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:08:44,570 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", + "2025-09-08 17:08:44,571 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", + "2025-09-08 17:08:44,571 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:08:44,571 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:08:44,572 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:08:44,572 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:08:44,572 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:08:44,572 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:44,573 - DEBUG - powsybl - Jacobian matrix built in 5 us\n", + "2025-09-08 17:08:44,573 - DEBUG - powsybl - Sparse LU decomposition done in 15 us\n", + "2025-09-08 17:08:44,573 - DEBUG - powsybl - LU decomposition done in 274 us\n", + "2025-09-08 17:08:44,574 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,574 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", + "2025-09-08 17:08:44,574 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:44,574 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:08:44,575 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:08:44,575 - DEBUG - powsybl - LU decomposition updated in 328 us\n", + "2025-09-08 17:08:44,575 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,575 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", + "2025-09-08 17:08:44,576 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:08:44,576 - DEBUG - powsybl - Jacobian matrix values updated in 2 us\n", + "2025-09-08 17:08:44,576 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:08:44,576 - DEBUG - powsybl - LU decomposition updated in 253 us\n", + "2025-09-08 17:08:44,577 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,577 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", + "2025-09-08 17:08:44,577 - DEBUG - powsybl - 40.36673993723423 MW / 40.36673993723422 MW distributed at iteration 0 to 1 generators (0 at max power, 0 at min power)\n", + "2025-09-08 17:08:44,578 - INFO - powsybl - Slack bus active power (40.36673993723422 MW) distributed in 1 distribution iteration(s)\n", + "2025-09-08 17:08:44,578 - DEBUG - powsybl - Start outer loop 'DistributedSlack' iteration 0\n", + "2025-09-08 17:08:44,578 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,578 - DEBUG - powsybl - |f(x0)|=0.40366738305544736\n", + "2025-09-08 17:08:44,579 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:08:44,579 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:08:44,579 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:08:44,579 - DEBUG - powsybl - LU decomposition updated in 270 us\n", + "2025-09-08 17:08:44,580 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,580 - DEBUG - powsybl - |f(x)|=0.012804250496370755\n", + "2025-09-08 17:08:44,580 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:08:44,580 - DEBUG - powsybl - Jacobian matrix values updated in 2 us\n", + "2025-09-08 17:08:44,581 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:08:44,581 - DEBUG - powsybl - LU decomposition updated in 225 us\n", + "2025-09-08 17:08:44,581 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:08:44,581 - DEBUG - powsybl - |f(x)|=3.696679144198829E-5\n", + "2025-09-08 17:08:44,582 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:44,582 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:08:44,582 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=1, newtonRaphsonIterations=5, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3011552165879561, distributedActivePower=40.36673993723423))\n", + "2025-09-08 17:08:44,583 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:08:44,583 - INFO - powsybl - Load flow ran in 16 ms\n", + "2025-09-08 17:08:44,583 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:08:44,584 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'coL1 - curative' [end]\n", + "2025-09-08 17:08:44,584 - INFO - powsybl - Some VOLTAGE Cnecs are not secure:\n", + "2025-09-08 17:08:44,584 - INFO - powsybl - Network element VL2 at state coL1 - curative has a min voltage of 363.62 kV and a max voltage of 363.62 kV.\n", + "2025-09-08 17:08:44,584 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant fc7652c5-3222-4634-9b7d-588a905107c7'\n", + "2025-09-08 17:08:44,585 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool state save 0f94c867-d2d9-4a6d-977b-7284b13bc866'\n", + "2025-09-08 17:08:44,585 - INFO - powsybl - ----- VOLTAGE monitoring [end]\n", + "2025-09-08 17:08:44,585 - INFO - powsybl - Some VOLTAGE Cnecs are not secure:\n", + "2025-09-08 17:08:44,586 - INFO - powsybl - Network element VL2 at state coL1 - curative has a min voltage of 363.62 kV and a max voltage of 363.62 kV.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " cnec_id min_voltage max_voltage margin\n", + "index \n", + "0 vc 363.622121 363.622121 -13.622121\n", + "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'auto': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'curative': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [{'voltageCnecId': 'vc', 'curative': {'kilovolt': {'margin': -13.62}}}], 'networkActionResults': [{'networkActionId': 'Injection L1 - 2', 'activatedStates': [{'instant': 'curative', 'contingency': 'coL1'}]}], 'rangeActionResults': []}\n" + ] + } + ], + "execution_count": 10 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e835f06476a0e5a42c766bf018bdd930746ccce1 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Mon, 8 Sep 2025 17:19:53 +0200 Subject: [PATCH 16/18] final version --- .../angle_monitoring/GlskB45MicroGridTest.xml | 73 - data/rao/angle_monitoring/MicroGrid.zip | Bin 121959 -> 0 bytes .../angle_monitoring_crac.json | 181 --- .../angle_monitoring/monitoring_network.xiidm | 1173 ----------------- data/rao/angle_monitoring/rao_glsk.xml | 86 -- ...tage_monitoring_simple_case_with_topo.json | 101 -- .../angle_monitoring/GlskB45test.xml | 0 ...onitoring_simple_case_with_RA_on_load.json | 0 ...ngle_monitoring_simple_case_with_topo.json | 0 .../network.xiidm | 0 data/rao/monitoring/rao_parameters.json | 138 ++ ...onitoring_simple_case_with_RA_on_load.json | 0 open_rao.ipynb | 1036 ++++++++------- open_rao_angle_monitoring.ipynb | 517 ++++---- open_rao_voltage_monitoring.ipynb | 882 ++++++------- 15 files changed, 1363 insertions(+), 2824 deletions(-) delete mode 100644 data/rao/angle_monitoring/GlskB45MicroGridTest.xml delete mode 100644 data/rao/angle_monitoring/MicroGrid.zip delete mode 100644 data/rao/angle_monitoring/angle_monitoring_crac.json delete mode 100644 data/rao/angle_monitoring/monitoring_network.xiidm delete mode 100644 data/rao/angle_monitoring/rao_glsk.xml delete mode 100644 data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json rename data/rao/{ => monitoring}/angle_monitoring/GlskB45test.xml (100%) rename data/rao/{ => monitoring}/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json (100%) rename data/rao/{ => monitoring}/angle_monitoring/angle_monitoring_simple_case_with_topo.json (100%) rename data/rao/{angle_monitoring => monitoring}/network.xiidm (100%) create mode 100644 data/rao/monitoring/rao_parameters.json rename data/rao/{angle_monitoring => monitoring/voltage_monitoring}/voltage_monitoring_simple_case_with_RA_on_load.json (100%) diff --git a/data/rao/angle_monitoring/GlskB45MicroGridTest.xml b/data/rao/angle_monitoring/GlskB45MicroGridTest.xml deleted file mode 100644 index 26ab0ee..0000000 --- a/data/rao/angle_monitoring/GlskB45MicroGridTest.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - 10XES-REE------E-20170412-SWECCD2 - 1 - B22 - A48 - 10XES-REE------E - A04 - 22XCORESO------S - A36 - 2017-07-18T06:31:36Z - - 2017-04-12T02:00Z - 2027-04-12T03:00Z - - 10YCB-FR-ES-PT-S - - B45TestBE - 10YBE----------2 - A01 - - - 2021-04-02T05:00Z - 2021-04-02T06:00Z - - PT60M - - 1 - - B45 - A01 - A01 - MAW - 2 - - _550ebe0d-f2b2-48c1-991f-cebea43a21aa - FFR2AA1 _generator - 2002 - -402 - - - - - - - B45TestNL - 10YNL----------L - A01 - - - 2021-04-02T05:00Z - 2021-04-02T06:00Z - - PT60M - - 1 - - B45 - A01 - A01 - MAW - 1 - - _9c3b8f97-7972-477d-9dc8-87365cc0ad0e - FFR1AA1 _generator - 2001 - -401 - - - - - - diff --git a/data/rao/angle_monitoring/MicroGrid.zip b/data/rao/angle_monitoring/MicroGrid.zip deleted file mode 100644 index 047d85122c0e937d7776abaeb3ff4249919f7e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121959 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

Fwz> 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 S-0Pi=d;zHe01YAq`RhMFWq_{$ diff --git a/data/rao/angle_monitoring/angle_monitoring_crac.json b/data/rao/angle_monitoring/angle_monitoring_crac.json deleted file mode 100644 index 70763d5..0000000 --- a/data/rao/angle_monitoring/angle_monitoring_crac.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "type": "CRAC", - "version": "2.7", - "info": "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", - "id": "complex_case", - "name": "complex_case", - "instants": [ - { - "id": "preventive", - "kind": "PREVENTIVE" - }, - { - "id": "outage", - "kind": "OUTAGE" - }, - { - "id": "auto", - "kind": "AUTO" - }, - { - "id": "curative", - "kind": "CURATIVE" - } - ], - "ra-usage-limits-per-instant": [], - "networkElementsNamePerId": {}, - "contingencies": [ - { - "id": "Co-1", - "name": "Co-1-name", - "networkElementsIds": [ - "_ffbabc27-1ccd-4fdc-b037-e341706c8d29" - ] - }, - { - "id": "Co-2", - "name": "Co-2-name", - "networkElementsIds": [ - "_b18cd1aa-7808-49b9-a7cf-605eaf07b006 + _e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc" - ] - } - ], - "flowCnecs": [ - { - "id": "FlowCnec", - "name": "FlowCnec", - "networkElementId": "_b58bf21a-096a-4dae-9a01-3f03b60c24c7", - "instant": "preventive", - "contingencyId": null, - "optimized": true, - "monitored": false, - "iMax": [ - 2000.0 - ], - "nominalV": [ - 380.0 - ], - "thresholds": [ - { - "unit": "percent_imax", - "min": -1, - "max": 1, - "side": 1 - } - ] - }, { - "id": "FlowCnec - Co-1", - "name": "FlowCnec - Co-1", - "networkElementId": "_b58bf21a-096a-4dae-9a01-3f03b60c24c7", - "instant": "curative", - "contingencyId": "Co-1", - "optimized": true, - "monitored": false, - "iMax": [ - 2000.0 - ], - "nominalV": [ - 380.0 - ], - "thresholds": [ - { - "unit": "percent_imax", - "min": -1, - "max": 1, - "side": 1 - } - ] - }, { - "id": "FlowCnec - Co-2", - "name": "FlowCnec - Co-2", - "networkElementId": "_b58bf21a-096a-4dae-9a01-3f03b60c24c7", - "instant": "curative", - "contingencyId": "Co-2", - "optimized": true, - "monitored": false, - "iMax": [ - 2000.0 - ], - "nominalV": [ - 380.0 - ], - "thresholds": [ - { - "unit": "percent_imax", - "min": -1, - "max": 1, - "side": 1 - } - ] - } - ], - "angleCnecs": [ - { - "id": "AngleCnec1", - "name": "AngleCnec1-name", - "exportingNetworkElementId": "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", - "importingNetworkElementId": "_d77b61ef-61aa-4b22-95f6-b56ca080788d", - "operator": null, - "border": "", - "instant": "curative", - "contingencyId": "Co-1", - "optimized": false, - "monitored": true, - "reliabilityMargin": 0.0, - "thresholds": [ - { - "unit": "degree", - "max": 3.0 - } - ] - }, - { - "id": "AngleCnec2", - "name": "AngleCnec2-name", - "exportingNetworkElementId": "_b7998ae6-0cc6-4dfe-8fec-0b549b07b6c3", - "importingNetworkElementId": "_8d8a82ba-b5b0-4e94-861a-192af055f2b8", - "operator": null, - "border": "", - "instant": "curative", - "contingencyId": "Co-2", - "optimized": false, - "monitored": true, - "reliabilityMargin": 0.0, - "thresholds": [ - { - "unit": "degree", - "max": 47.0 - } - ] - } - ], - "voltageCnecs": [], - "pstRangeActions": [], - "hvdcRangeActions": [], - "injectionRangeActions": [], - "counterTradeRangeActions": [], - "networkActions": [ - { - "id": "RA-1", - "name": "Decrease Generation and open line", - "operator": "RA", - "onConstraintUsageRules": [ - { - "instant": "curative", - "cnecId": "AngleCnec1", - "usageMethod": "available" - } - ], - "generatorActions": [ - { - "networkElementId": "_1dc9afba-23b5-41a0-8540-b479ed8baf4b", - "activePowerValue": 0.0 - }, - { - "networkElementId": "_550ebe0d-f2b2-48c1-991f-cebea43a21aa", - "activePowerValue": 10.0 - } - ] - } - ] -} \ No newline at end of file diff --git a/data/rao/angle_monitoring/monitoring_network.xiidm b/data/rao/angle_monitoring/monitoring_network.xiidm deleted file mode 100644 index f8e44c5..0000000 --- a/data/rao/angle_monitoring/monitoring_network.xiidm +++ /dev/null @@ -1,1173 +0,0 @@ - - - - - - - - - - - - - - _ad794c0e-b9ec-420b-ada1-97680e3dde05 - - - _800ada75-8c8c-4568-aec5-20f799e45f3c - - - _3c6d83a3-b5f9-41a2-a3d9-cf15d903ed0a - - - _b741ce25-3f99-4aa8-9b03-d9de0ba6e342 - _3fa4866b-1714-4be9-afab-3909ae092016 - - - _310c303a-b0ed-4e42-9854-628f34c53d2b - _678a3049-afc0-432f-8f53-b30aa71907b2 - - - _b6e23b90-9c48-4285-ac02-5b68d0c572a6 - _e57dd4ed-5ea0-4374-9b36-40a294a8e2be - - - _381fc1a6-63f7-4728-bb84-d4d7fe4f8794 - _e1e6f751-259f-4182-b4e1-12eba54a54ce - - - - - - - - - - - - - - - - - - - - - - - _b9376bea-c75d-49f3-94ca-6a71fa0086a5 - - - - _1ef0715a-d5a9-477b-b6e7-b635529ac140 - _70d962fb-a492-4c36-8cad-b5c584df53bd - - - - - - - - - - - - - - - _57ae9251-c022-4c67-a8eb-611ad54c963c - _5b2c65b0-68ce-4530-85b7-385346a3b5e1 - - - - - - - - - - - - - - - _67bb74f1-8620-4a32-9d7d-a44092d11d22 - - - - - - - - - - - - _a1b46f53-86f1-497e-bf57-c3b6268bcd6c - - - _b8bca219-a924-434f-8163-50aae6d486a7 - _4bbaf84d-2437-44e1-a56c-e79723370e77 - - - _61562178-c201-43c7-b56d-a300ab07c723 - _5245aa5c-9600-4632-95db-e981a19ed857 - - - _95f1d705-35fa-4102-ba5b-43dfe7a0e0cc - _9f5dbaf3-e384-4e86-9d49-f43c30b4e354 - - - - - - - - - - - - - - - - _cbdf1842-74ed-4fce-a5d4-0296c82cbc92 - - - - _d5e2e58e-ccf6-47d9-b3bb-3088eb7a9b6c - - - - - - - - _fa9e0f4d-8a2f-45e1-9e36-3611600d1c94 - - - _907dbcfe-2037-4f84-97f1-6e59f782168e - _345d8528-1a7e-4245-92d6-15db7a7e3c86 - - - _36fedfd8-280b-4ee4-b58a-cd2063e5d706 - _0cca0f16-c476-4a99-b289-d660ff57b891 - - - _a45d705f-46f6-4bde-8790-11a762da8c01 - _5c206db8-ef8c-4e53-b2b9-38b52b194c5a - - - _042688a6-140f-473c-98f9-94a3cfdc00d3 - _6811721b-252c-45fd-8474-6db1e7d5739e - - - - - - - - - - - - - - - - - - - _22af3121-1a66-4546-bd80-4371f417c644 - - - - - - - - - - - - _f9f29835-8a31-4310-9780-b1ad26f3cbb0 - _c14d2036-72ec-4df3-b1b7-75d8afd9a1fe - - - - - - - - - - - - - - - _f3b56334-4638-49d3-a6a0-3f417422b8f5 - _231a4cf8-5069-4d53-96e4-e839f073f1ea - - - - - - - - - - - - - - - _02a244ca-8bcb-4e25-8613-e948b8ba1f22 - _051d49ba-4360-4372-86bf-50eb8cf29778 - - - - - - - - - - - - - - - - - - _b3bf6cbd-abe8-42b6-95f4-20682475b484 - _f392d0d3-47cb-4ec1-925f-b3762d4a787c - - - - - - - - _4bb5407b-b4a5-416c-80ad-1a778ada2b9b - - - - - - - - - - - - _62fc0a4e-00aa-4bf7-b1a0-3a5b2c0b5492 - - - _302fe23a-f64d-41bd-8a81-78130433916d - - - _8f1c492f-a7cc-4160-9a14-54f1743e4850 - - - _756dff85-b2c8-4a06-9a4c-4dde854e668b - _3f8b7c82-ca57-401a-9e2d-b719f8c83030 - - - _fd2867a9-0c57-4cf2-acfb-439c4039b06b - _b501caa7-949f-49c6-b4d4-f50ef3625ede - - - _529a048e-7681-4e59-aba1-f7474a562cba - _68d47f87-1a1f-4c63-80ca-d3becb4a47f9 - - - - - - - - - - - - - - - - - - _a036b765-1669-4f64-acd3-1e8fbd513312 - - - - - - - _65b8c937-9b25-4b9e-addf-602dbc1337f9 - - - - - - - _beffa353-7d10-421d-9c08-036b744b1cee - - - - - - - - - - - - - - - _ab7ece75-d726-48c8-a924-b0a9325e6d51 - _3c59d1b0-1ee9-4ca3-9086-4fe102b51b21 - _36b83adb-3d45-4693-8967-96627b5f9ec9 - _4c19ace6-c825-4c5b-87d9-031e6e6a3379 - _ba56158e-0c51-448d-999b-44cb0b3cebf5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _2cd21c77-b8b1-4896-95fb-240f45b9ac89 - _63454a73-f439-45bb-951a-e7b193986571 - _bf76ac9d-0144-48f5-a24a-34ae15a455fb - _e22f3c30-63f5-47bf-a8c4-fee2483d426c - _c3774d3f-f48c-4954-a0cf-b4572eb714fd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _ca7974cf-b25e-4898-9221-7154233e5eb2 - _35651e25-a77a-46a1-92f4-443d6acce90e - _1182d878-2eaa-4eec-91be-ce7b2b1e7f9a - _f58281c5-862a-465e-97ec-d809be6e24ab - _83cc66dd-8d93-4a2c-8103-f1f5a9cf7e2e - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _76e9ca77-f805-40ea-8120-5a6d58416d34 - _53fd6693-57e6-482e-8fbe-dcf3531a7ce0 - _2e21d1ef-2287-434c-a767-1ca807cf2478 - _fe25f43a-7341-446e-a71a-8ab7119ba806 - _e1f661c0-971d-4ce5-ad39-0ec427f288ab - _ca0f7e2e-3442-4ada-a704-91f319c0ebe3 - _5f68a129-d5d8-4b71-9743-9ca2572ba26b - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _a4d42d33-ae54-4fe9-ad59-f30da0dfb809 - _05a17350-55f5-4a00-9a50-8c0048a25495 - - - - - - - - - - - - - - _77f04391-aa23-49b6-b3e9-6089130bb5d5 - _699545b9-82b9-4331-bc80-538d73b4ba56 - - - - - - - - - - - - - - _8171fc34-6891-40e0-92d1-da9f4ba69e26 - _13dcec71-4b02-4c0c-93a7-8e16db4aa0b7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - http://iec.ch/TC57/ns/CIM/CoreEquipment-EU/3.0 - http://iec.ch/TC57/ns/CIM/Operation-EU/3.0 - http://iec.ch/TC57/ns/CIM/ShortCircuit-EU/3.0 - urn:uuid:2399cbd0-9a39-11e0-aa80-0800200c9a66 - - - http://iec.ch/TC57/ns/CIM/SteadyStateHypothesis-EU/3.0 - urn:uuid:9e7050a8-960b-4e1a-8e34-7f56bc2b2a7b - - - http://iec.ch/TC57/ns/CIM/GeographicalLocation-EU/3.0 - urn:uuid:9e7050a8-960b-4e1a-8e34-7f56bc2b2a7b - - - http://iec.ch/TC57/ns/CIM/EquipmentBoundary-EU/3.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _0f199d49-0093-4b51-b357-70371424d174 - - - _42800bad-5e47-42e6-b9b0-1fb8fc5831aa - - - - - - - - - _f04ec73d-b94a-4b7e-a3d6-b1234fc37385 - _9f984b04-1736-43d2-9122-3a17fc8aea5f - - - _e19e01f7-eb9b-4ce5-a6fe-4bb4ef0ce6c3 - _28797d21-df04-4be6-806b-3be26b040d6a - - - _3179d96c-7ecd-4f8a-b3f0-f24b62a16e87 - _7fae7c9d-952f-4321-830d-aa667d21969d - - - - - - - - - - - - - - - - - _ae4b7cbe-349a-41c8-ace2-25ec26f14a64 - - - - - - - - - _f04ecab5-1a12-4cc0-ba56-b157ebf11a42 - - - - - - - - - _faab7959-f9bf-421b-bc3f-d364e0c1388b - - - - - - - - - - - - _f937c4ac-b9fc-44a2-82a0-99cb34c89974 - _30aa2972-aafb-4c38-912d-a14867d47cec - - - _7a7fd92b-1aaf-49de-b609-1d640e63d49f - _790df530-60c7-40bc-be5f-f90e9c65bab4 - - - _85ceec9c-21a9-4ef2-b7b0-c2bb9552e799 - _41b735f7-da62-4bd3-ac98-fbdec24baeac - - - - - - - - - - - - - - - - - - _f461fd2d-1e41-4a3e-8213-7cc33c77a089 - - - - _6dad1a97-6874-4206-a5a5-837e495325f8 - - - - _a015f692-3fc5-4ec3-8d1d-977c7b499e7c - - - - - - _8f308117-8bbd-4798-b145-4e78f7d049e7 - _c557146e-dfc4-4020-9738-d592b188338b - - - - - - - - - - - - - - - - - - _6b1cd30c-19ba-44e1-9447-d01db6b1ef9d - _357e3e14-c38e-4a7e-9c95-b3dbe158f5f3 - - - - - - - - - - - - - - - - - - _757d4f50-707b-47a0-891c-cbaefd649631 - _ae588863-b154-451d-978a-7ab08ac50fb6 - - - - - - - - - - - - - - - - - - - - - _50f00b94-fe0f-48fd-887e-f0d4d59eee87 - - - _ecea10ff-e006-436b-a86a-beac4c2a30c1 - - - _8121d4c3-9cb2-47db-b40a-99678602bb2a - _5f40c3f7-9540-4e1b-aa97-6553d5524877 - - - _3c377e5e-65cc-45f1-ba12-e20034df7cb3 - _14f212ae-bcd8-46ae-9366-11dec9602a01 - - - _abc40269-5f9a-4b13-a5a5-8e3b3929eff5 - _c9dbf281-e788-4084-b268-3b5a9473ad72 - - - _74039a16-da9d-46dd-a4f1-dd65fbb09ec4 - _e12338f8-6e9e-4d06-a29a-e12bdd7bd4d7 - - - _eedefa27-de13-4e6f-91a3-42aa86b539d6 - _9fc1ca1a-bb62-4982-9358-fa9b4ac5564d - - - - - - - - - - - - - - - - - - - - - - - _fab54e9c-b12e-4e47-a9f2-fec4ef96c0c0 - - - - - _653bc4b8-518b-4adc-9d68-012fb641fb1d - _57979d14-d1d8-4311-ae53-aa8890423885 - - - - - - - - - - - - - - - - - - _5dfee914-a4fd-4bde-a5b4-c4caa6378d10 - _6aecb9ba-5835-4b70-89bc-96d687e45779 - - - - - - - - - - - - - - - - - - - _f3600241-63dc-485b-aefb-4ec24028f8b3 - _4f1c405f-07c9-4fb0-b64e-551896a29aa8 - _bd61b1f9-474d-424e-9709-42f75337c477 - _44b4277a-0f4b-43a8-ad93-6f7d6ef02061 - _4df90339-ae02-4da1-8e1e-69ab068df065 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _ee649b97-d2ec-47e1-976f-0f4d9f50fa11 - _1128e664-0653-448a-9068-e37f1a097c05 - _41ca9e70-1cb4-4971-b8e6-a97a15580b89 - _da232169-1c36-495a-8af6-a0d7d2b39f52 - _0dbed103-fc51-4df4-a6fa-0dee4c57f3a3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _e3e0c496-5837-4f0f-a596-cc421940f73f - _baa7aef1-afcd-4981-97c0-ccec7b5ad4e0 - _341327c4-9224-40bf-bc33-7a3bb0bae680 - _0dec3883-a2b6-4353-83cc-d4dd5df513a6 - _c614f321-2c88-4fa3-b98a-8ec3cde73db4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - http://iec.ch/TC57/ns/CIM/EquipmentBoundary-EU/3.0 - - - http://iec.ch/TC57/ns/CIM/CoreEquipment-EU/3.0 - http://iec.ch/TC57/ns/CIM/Operation-EU/3.0 - http://iec.ch/TC57/ns/CIM/ShortCircuit-EU/3.0 - urn:uuid:2399cbd0-9a39-11e0-aa80-0800200c9a66 - - - http://iec.ch/TC57/ns/CIM/Topology-EU/3.0 - urn:uuid:1e239780-b5f9-4ed1-ad73-041bc406bcfc - urn:uuid:3a2a0416-c6a8-49a9-9f23-b8ec7cb29bae - - - http://iec.ch/TC57/ns/CIM/StateVariables-EU/3.0 - urn:uuid:0ab8469f-4776-43fe-b1cb-2ceaf35c34f3 - - - http://iec.ch/TC57/ns/CIM/SteadyStateHypothesis-EU/3.0 - urn:uuid:4f4a3f29-6892-49ea-bfc1-92051973c799 - - - http://iec.ch/TC57/ns/CIM/DiagramLayout-EU/3.0 - urn:uuid:4f4a3f29-6892-49ea-bfc1-92051973c799 - - - http://iec.ch/TC57/ns/CIM/GeographicalLocation-EU/3.0 - urn:uuid:4f4a3f29-6892-49ea-bfc1-92051973c799 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/rao/angle_monitoring/rao_glsk.xml b/data/rao/angle_monitoring/rao_glsk.xml deleted file mode 100644 index a070ed6..0000000 --- a/data/rao/angle_monitoring/rao_glsk.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json b/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json deleted file mode 100644 index 1ddc6f9..0000000 --- a/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_topo.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "type" : "CRAC", - "version" : "2.7", - "info" : "Generated by PowSyBl OpenRAO https://powsybl.readthedocs.io/projects/openrao", - "id" : "test-crac", - "name" : "test-crac", - "instants" : [ { - "id" : "preventive", - "kind" : "PREVENTIVE" - }, { - "id" : "outage", - "kind" : "OUTAGE" - }, { - "id" : "auto", - "kind" : "AUTO" - }, { - "id" : "curative", - "kind" : "CURATIVE" - } ], - "ra-usage-limits-per-instant" : [ ], - "networkElementsNamePerId" : { }, - "contingencies" : [ { - "id" : "coL1", - "name" : "coL1", - "networkElementsIds" : [ "L1" ] - }], - "flowCnecs" : [ { - "id" : "cnec1 - preventive", - "name" : "cnec1 - preventive", - "networkElementId" : "L1", - "operator" : null, - "border" : "", - "instant" : "preventive", - "optimized" : true, - "monitored" : false, - "reliabilityMargin" : 0.0, - "nominalV" : [ NaN ], - "thresholds" : [ { - "unit" : "megawatt", - "min" : -5.0, - "max" : 100.0, - "side" : 2 - } ] - }, - { - "id" : "cnec1 - curative", - "name" : "cnec1 - curative", - "networkElementId" : "L1", - "contingencyId" : "coL1", - "operator" : null, - "border" : "", - "instant" : "curative", - "optimized" : true, - "monitored" : false, - "reliabilityMargin" : 0.0, - "nominalV" : [ NaN ], - "thresholds" : [ { - "unit" : "megawatt", - "min" : -5.0, - "max" : 5.0, - "side" : 2 - } ] - } - ], - "angleCnecs" : [ ], - "voltageCnecs" : [ { - "id" : "vc", - "name" : "vc", - "networkElementId" : "VL2", - "operator" : null, - "border" : "", - "instant" : "curative", - "contingencyId" : "coL1", - "optimized" : false, - "monitored" : true, - "reliabilityMargin" : 0.0, - "thresholds" : [ { - "unit" : "kilovolt", - "min" : 340.0, - "max" : 350.0 - } ] - } ], - "pstRangeActions" : [ ], - "hvdcRangeActions" : [ ], - "injectionRangeActions" : [ ], - "counterTradeRangeActions" : [ ], - "networkActions" : [ { - "id" : "Open L3 - 2", - "name" : "Open L3 - 2", - "operator" : null, - "onConstraintUsageRules" : [ { - "instant" : "curative", - "cnecId" : "vc", - "usageMethod" : "available" - } ], - "terminalsConnectionActions" : [ { - "networkElementId" : "L3", - "actionType" : "open" - } ] - } ] -} \ No newline at end of file diff --git a/data/rao/angle_monitoring/GlskB45test.xml b/data/rao/monitoring/angle_monitoring/GlskB45test.xml similarity index 100% rename from data/rao/angle_monitoring/GlskB45test.xml rename to data/rao/monitoring/angle_monitoring/GlskB45test.xml diff --git a/data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json b/data/rao/monitoring/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json similarity index 100% rename from data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json rename to data/rao/monitoring/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json diff --git a/data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json b/data/rao/monitoring/angle_monitoring/angle_monitoring_simple_case_with_topo.json similarity index 100% rename from data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json rename to data/rao/monitoring/angle_monitoring/angle_monitoring_simple_case_with_topo.json diff --git a/data/rao/angle_monitoring/network.xiidm b/data/rao/monitoring/network.xiidm similarity index 100% rename from data/rao/angle_monitoring/network.xiidm rename to data/rao/monitoring/network.xiidm diff --git a/data/rao/monitoring/rao_parameters.json b/data/rao/monitoring/rao_parameters.json new file mode 100644 index 0000000..7379763 --- /dev/null +++ b/data/rao/monitoring/rao_parameters.json @@ -0,0 +1,138 @@ +{ + "version" : "3.1", + "objective-function" : { + "type" : "SECURE_FLOW", + "unit" : "MW" + }, + "range-actions-optimization" : { + "pst-ra-min-impact-threshold" : 0.01, + "hvdc-ra-min-impact-threshold" : 0.001, + "injection-ra-min-impact-threshold" : 0.001 + }, + "topological-actions-optimization" : { + "relative-minimum-impact-threshold" : 0.0, + "absolute-minimum-impact-threshold" : 0.0 + }, + "not-optimized-cnecs" : { + "do-not-optimize-curative-cnecs-for-tsos-without-cras" : false + }, + "extensions" : { + "open-rao-search-tree-parameters" : { + "objective-function" : { + "curative-min-obj-improvement" : 0.0 + }, + "range-actions-optimization" : { + "max-mip-iterations" : 5, + "pst-sensitivity-threshold" : 1.0E-6, + "pst-model" : "CONTINUOUS", + "hvdc-sensitivity-threshold" : 1.0E-6, + "injection-ra-sensitivity-threshold" : 1.0E-6, + "ra-range-shrinking" : "DISABLED", + "linear-optimization-solver" : { + "solver" : "CBC", + "relative-mip-gap" : 0.001, + "solver-specific-parameters" : null + } + }, + "topological-actions-optimization" : { + "max-preventive-search-tree-depth" : 5, + "max-curative-search-tree-depth" : 5, + "predefined-combinations" : [ ], + "skip-actions-far-from-most-limiting-element" : false, + "max-number-of-boundaries-for-skipping-actions" : 0 + }, + "second-preventive-rao" : { + "execution-condition" : "DISABLED", + "hint-from-first-preventive-rao" : false + }, + "load-flow-and-sensitivity-computation" : { + "load-flow-provider" : "OpenLoadFlow", + "sensitivity-provider" : "OpenLoadFlow", + "sensitivity-failure-overcost" : 10000.0, + "sensitivity-parameters" : { + "version" : "1.0", + "load-flow-parameters" : { + "version" : "1.9", + "voltageInitMode" : "UNIFORM_VALUES", + "transformerVoltageControlOn" : false, + "phaseShifterRegulationOn" : false, + "useReactiveLimits" : true, + "twtSplitShuntAdmittance" : true, + "shuntCompensatorVoltageControlOn" : false, + "readSlackBus" : false, + "writeSlackBus" : false, + "dc" : false, + "distributedSlack" : true, + "balanceType" : "PROPORTIONAL_TO_GENERATION_P", + "dcUseTransformerRatio" : false, + "countriesToBalance" : [ "GR", "BE", "SK", "TR", "CH", "RS", "PL", "UA", "BG", "ES", "ME", "CZ", "HR", "AL", "RO", "HU", "AT", "FR", "PT", "DE", "MK", "BA", "SI", "IT", "NL" ], + "connectedComponentMode" : "MAIN", + "hvdcAcEmulation" : true, + "dcPowerFactor" : 1.0, + "extensions" : { + "open-load-flow-parameters" : { + "slackBusSelectionMode" : "MOST_MESHED", + "slackBusesIds" : [ ], + "slackDistributionFailureBehavior" : "LEAVE_ON_SLACK_BUS", + "lowImpedanceBranchMode" : "REPLACE_BY_ZERO_IMPEDANCE_LINE", + "loadPowerFactorConstant" : false, + "plausibleActivePowerLimit" : 10000.0, + "newtonRaphsonStoppingCriteriaType" : "UNIFORM_CRITERIA", + "maxActivePowerMismatch" : 0.01, + "maxReactivePowerMismatch" : 0.01, + "maxVoltageMismatch" : 1.0E-4, + "maxAngleMismatch" : 1.0E-5, + "maxRatioMismatch" : 1.0E-5, + "maxSusceptanceMismatch" : 1.0E-4, + "slackBusPMaxMismatch" : 1.0, + "voltagePerReactivePowerControl" : false, + "maxNewtonRaphsonIterations" : 30, + "maxOuterLoopIterations" : 20, + "newtonRaphsonConvEpsPerEq" : 1.0E-4, + "voltageInitModeOverride" : "NONE", + "transformerVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", + "shuntVoltageControlMode" : "WITH_GENERATOR_VOLTAGE_CONTROL", + "minPlausibleTargetVoltage" : 0.8, + "maxPlausibleTargetVoltage" : 1.2, + "minNominalVoltageTargetVoltageCheck" : 20.0, + "minRealisticVoltage" : 0.5, + "maxRealisticVoltage" : 1.5, + "lowImpedanceThreshold" : 1.0E-8, + "reactiveRangeCheckMode" : "MAX", + "networkCacheEnabled" : false, + "svcVoltageMonitoring" : true, + "stateVectorScalingMode" : "NONE", + "maxSlackBusCount" : 1, + "debugDir" : null, + "incrementalTransformerRatioTapControlOuterLoopMaxTapShift" : 3, + "secondaryVoltageControl" : false, + "reactiveLimitsMaxPqPvSwitch" : 3, + "phaseShifterControlMode" : "CONTINUOUS_WITH_DISCRETISATION", + "alwaysUpdateNetwork" : false, + "mostMeshedSlackBusSelectorMaxNominalVoltagePercentile" : 95.0, + "reportedFeatures" : [ ], + "slackBusCountryFilter" : [ ], + "actionableSwitchesIds" : [ ], + "asymmetrical" : false, + "reactivePowerDispatchMode" : "Q_EQUAL_PROPORTION", + "outerLoopNames" : null, + "useActiveLimits" : true, + "lineSearchStateVectorScalingMaxIteration" : 10, + "lineSearchStateVectorScalingStepFold" : 1.3333333333333333, + "maxVoltageChangeStateVectorScalingMaxDv" : 0.1, + "maxVoltageChangeStateVectorScalingMaxDphi" : 0.17453292519943295, + "linePerUnitMode" : "IMPEDANCE", + "useLoadModel" : false, + "dcApproximationType" : "IGNORE_R", + "simulateAutomationSystems" : false + } + } + } + } + }, + "multi-threading" : { + "available-cpus" : 4 + } + } + } +} \ No newline at end of file diff --git a/data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json b/data/rao/monitoring/voltage_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json similarity index 100% rename from data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json rename to data/rao/monitoring/voltage_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json diff --git a/open_rao.ipynb b/open_rao.ipynb index 7ea9a37..83558ca 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -16,12 +16,24 @@ "The first step is to install pypowsybl and import the library." ] }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:18:31.410165Z", + "start_time": "2025-09-08T15:18:31.408512Z" + } + }, + "cell_type": "code", + "source": "", + "outputs": [], + "execution_count": null + }, { "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:12.035837Z", - "start_time": "2025-09-08T07:21:12.033567Z" + "end_time": "2025-09-08T15:18:31.454890Z", + "start_time": "2025-09-08T15:18:31.452246Z" } }, "source": "#pip install pypowsybl==1.12.0", @@ -32,8 +44,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.349030Z", - "start_time": "2025-09-08T07:21:12.080380Z" + "end_time": "2025-09-08T15:18:32.780345Z", + "start_time": "2025-09-08T15:18:31.533266Z" } }, "source": [ @@ -54,8 +66,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.428029Z", - "start_time": "2025-09-08T07:21:13.423106Z" + "end_time": "2025-09-08T15:18:32.790608Z", + "start_time": "2025-09-08T15:18:32.785512Z" } }, "source": [ @@ -75,8 +87,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.492793Z", - "start_time": "2025-09-08T07:21:13.473126Z" + "end_time": "2025-09-08T15:18:32.851613Z", + "start_time": "2025-09-08T15:18:32.833333Z" } }, "source": [ @@ -86,7 +98,7 @@ { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n kV / °
\n
\n
\n
BBE2AA1
\n
\n kV / °
\n
\n kV / °
\n
\n
\n
DDE1AA1
\n
\n kV / °
\n
\n
\n
DDE2AA1
\n
\n kV / °
\n
\n
\n
DDE3AA1
\n
\n kV / °
\n
\n
\n
FFR1AA1
\n
\n kV / °
\n
\n
\n
FFR2AA1
\n
\n kV / °
\n
\n
\n
FFR3AA1
\n
\n kV / °
\n
\n
\n
NNL1AA1
\n
\n kV / °
\n
\n
\n
NNL2AA1
\n
\n kV / °
\n
\n
\n
NNL3AA1
\n
\n kV / °
\n
\n
\n
\n
\n" }, @@ -115,8 +127,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.566760Z", - "start_time": "2025-09-08T07:21:13.549424Z" + "end_time": "2025-09-08T15:18:32.911941Z", + "start_time": "2025-09-08T15:18:32.896517Z" } }, "source": [ @@ -127,7 +139,7 @@ { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 167\n \n \n \n \n \n \n \n \n \n \n \n -167\n \n \n \n \n \n \n \n \n \n \n \n \n \n 333\n \n \n \n \n \n \n \n \n \n \n \n -333\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 500\n \n \n \n \n \n \n \n \n \n \n \n -500\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n 400.0 kV / 0.6°
\n
\n
\n
BBE2AA1
\n
\n 400.0 kV / 0.0°
\n
\n 400.0 kV / 1.2°
\n
\n
\n
DDE1AA1
\n
\n 400.0 kV / 0.6°
\n
\n
\n
DDE2AA1
\n
\n 400.0 kV / 1.2°
\n
\n
\n
DDE3AA1
\n
\n 400.0 kV / -0.0°
\n
\n
\n
FFR1AA1
\n
\n 400.0 kV / -3.6°
\n
\n
\n
FFR2AA1
\n
\n 400.0 kV / -1.8°
\n
\n
\n
FFR3AA1
\n
\n 400.0 kV / -1.8°
\n
\n
\n
NNL1AA1
\n
\n 400.0 kV / 4.8°
\n
\n
\n
NNL2AA1
\n
\n 400.0 kV / 3.0°
\n
\n
\n
NNL3AA1
\n
\n 400.0 kV / 3.0°
\n
\n
\n
\n
\n" }, @@ -150,8 +162,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.632928Z", - "start_time": "2025-09-08T07:21:13.615870Z" + "end_time": "2025-09-08T15:18:32.974684Z", + "start_time": "2025-09-08T15:18:32.959677Z" } }, "source": [ @@ -163,7 +175,7 @@ { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n \n \n -180\n \n \n \n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n \n \n \n \n \n 541\n \n \n \n \n \n \n \n \n \n \n \n -541\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n 270\n \n \n \n \n \n \n \n \n \n \n \n -270\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 360\n \n \n \n \n \n \n \n \n \n \n \n -360\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 153\n \n \n \n \n \n \n \n \n \n \n \n -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 306\n \n \n \n \n \n \n \n \n \n \n \n -306\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -459\n \n \n \n \n \n \n \n \n \n \n \n 459\n \n \n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n 514\n \n \n \n \n \n \n \n \n \n \n \n -514\n \n \n \n \n \n \n \n \n \n \n \n \n \n 486\n \n \n \n \n \n \n \n \n \n \n \n -486\n \n \n \n \n \n \n \n \n \n \n \n \n \n -27\n \n \n \n \n \n \n \n \n \n \n \n 27\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BBE1AA1
\n
\n 400.0 kV / 0.6°
\n
\n
\n
BBE2AA1
\n
\n 400.0 kV / 0.0°
\n
\n 400.0 kV / 1.3°
\n
\n
\n
DDE1AA1
\n
\n 400.0 kV / 0.2°
\n
\n
\n
DDE2AA1
\n
\n 400.0 kV / 0.7°
\n
\n
\n
DDE3AA1
\n
\n 400.0 kV / -0.4°
\n
\n
\n
FFR1AA1
\n
\n 400.0 kV / -3.8°
\n
\n
\n
FFR2AA1
\n
\n 400.0 kV / -2.0°
\n
\n
\n
FFR3AA1
\n
\n 400.0 kV / -1.9°
\n
\n
\n
NNL1AA1
\n
\n 400.0 kV / 4.1°
\n
\n
\n
NNL2AA1
\n
\n 400.0 kV / 2.3°
\n
\n
\n
NNL3AA1
\n
\n 400.0 kV / 2.4°
\n
\n
\n
\n
\n" }, @@ -187,8 +199,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.748145Z", - "start_time": "2025-09-08T07:21:13.684874Z" + "end_time": "2025-09-08T15:18:33.051307Z", + "start_time": "2025-09-08T15:18:33.019705Z" } }, "source": [ @@ -211,59 +223,59 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 09:21:13,700 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 09:21:13,701 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 09:21:13,701 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:13,702 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:13,703 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:13,703 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-08 09:21:13,704 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-08 09:21:13,705 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-09-08 09:21:13,705 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,706 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,706 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-09-08 09:21:13,707 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,707 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 09:21:13,707 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-09-08 09:21:13,707 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,707 - INFO - Linear optimization on root leaf\n", - "2025-09-08 09:21:13,707 - INFO - No range actions to optimize\n", - "2025-09-08 09:21:13,708 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-09-08 09:21:13,708 - INFO - No range actions activated\n", - "2025-09-08 09:21:13,708 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,708 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-09-08 09:21:13,709 - INFO - Search depth 1 [start]\n", - "2025-09-08 09:21:13,709 - INFO - Leaves to evaluate: 1\n", - "2025-09-08 09:21:13,709 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:13,710 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:13,710 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:13,711 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:13,711 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:13,737 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:13,737 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:13,738 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-09-08 09:21:13,739 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,739 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,740 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-09-08 09:21:13,741 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-09-08 09:21:13,742 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-09-08 09:21:13,742 - INFO - Remaining leaves to evaluate: 0\n", - "2025-09-08 09:21:13,743 - INFO - Search depth 1 [end]\n", - "2025-09-08 09:21:13,743 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-09-08 09:21:13,744 - INFO - Search depth 1 best leaf: No range actions activated\n", - "2025-09-08 09:21:13,744 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,744 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-09-08 09:21:13,745 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-09-08 09:21:13,745 - INFO - Best leaf: No range actions activated\n", - "2025-09-08 09:21:13,745 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,745 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-09-08 09:21:13,745 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:13,746 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 09:21:13,746 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,746 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" + "2025-09-08 17:18:33,034 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:18:33,034 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 17:18:33,035 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,035 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,036 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,036 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,037 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 17:18:33,037 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,037 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,037 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 17:18:33,038 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-09-08 17:18:33,038 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,039 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,039 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-08 17:18:33,039 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,039 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:18:33,040 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-08 17:18:33,040 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,040 - INFO - Linear optimization on root leaf\n", + "2025-09-08 17:18:33,040 - INFO - No range actions to optimize\n", + "2025-09-08 17:18:33,040 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-08 17:18:33,041 - INFO - No range actions activated\n", + "2025-09-08 17:18:33,041 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,041 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 17:18:33,041 - INFO - Search depth 1 [start]\n", + "2025-09-08 17:18:33,041 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 17:18:33,042 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,042 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,043 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,043 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,044 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,044 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,044 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,044 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-09-08 17:18:33,045 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,045 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.2095159969713905E-4, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,045 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 17:18:33,046 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 17:18:33,046 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-08 17:18:33,046 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 17:18:33,047 - INFO - Search depth 1 [end]\n", + "2025-09-08 17:18:33,047 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 17:18:33,047 - INFO - Search depth 1 best leaf: No range actions activated\n", + "2025-09-08 17:18:33,047 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,048 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 17:18:33,048 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 17:18:33,048 - INFO - Best leaf: No range actions activated\n", + "2025-09-08 17:18:33,048 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,049 - INFO - Scenario \"preventive\": initial cost = 90.0 (functional: 90.0, virtual: 0.0), 1 network action(s) activated : close NL2 BE3 2, cost after preventive optimization = -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-08 17:18:33,049 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,049 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:18:33,049 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,049 - INFO - Cost before RAO = 90.0 (functional: 90.0, virtual: 0.0), cost after RAO = -139.73 (functional: -139.73, virtual: 0.0)\n" ] } ], @@ -280,8 +292,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.761777Z", - "start_time": "2025-09-08T07:21:13.758449Z" + "end_time": "2025-09-08T15:18:33.096145Z", + "start_time": "2025-09-08T15:18:33.092562Z" } }, "source": [ @@ -374,8 +386,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.868010Z", - "start_time": "2025-09-08T07:21:13.821177Z" + "end_time": "2025-09-08T15:18:33.206128Z", + "start_time": "2025-09-08T15:18:33.143239Z" } }, "outputs": [ @@ -383,110 +395,110 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 09:21:13,824 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,824 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,825 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,825 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,825 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,825 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,826 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,826 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,826 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,827 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,827 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,827 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,827 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,827 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,828 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,828 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,828 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,828 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-09-08 09:21:13,829 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-09-08 09:21:13,829 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-09-08 09:21:13,829 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-09-08 09:21:13,831 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:13,832 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:13,835 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 09:21:13,835 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 09:21:13,835 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:13,835 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:13,836 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:13,836 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:13,836 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-09-08 09:21:13,837 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:13,837 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:13,838 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-08 09:21:13,838 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:13,839 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-08 09:21:13,839 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-08 09:21:13,840 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 09:21:13,841 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,841 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,842 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:13,842 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,842 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,843 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-08 09:21:13,843 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:13,844 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,844 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 09:21:13,845 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-08 09:21:13,845 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:13,845 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,845 - INFO - Linear optimization on root leaf\n", - "2025-09-08 09:21:13,848 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:13,849 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:13,849 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-08 09:21:13,850 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:13,850 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-08 09:21:13,850 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-08 09:21:13,851 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 09:21:13,851 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,851 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,852 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:13,852 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,853 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,853 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-09-08 09:21:13,854 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-08 09:21:13,855 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-09-08 09:21:13,855 - INFO - range action(s): pst-range-action: -10\n", - "2025-09-08 09:21:13,855 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:13,855 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,855 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-09-08 09:21:13,856 - INFO - Search depth 1 [start]\n", - "2025-09-08 09:21:13,856 - INFO - Leaves to evaluate: 1\n", - "2025-09-08 09:21:13,856 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:13,857 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:13,857 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:13,858 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:13,858 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:13,858 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:13,859 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:13,859 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 09:21:13,859 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,860 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,860 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:13,860 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:13,861 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-09-08 09:21:13,861 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:13,861 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:13,862 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-09-08 09:21:13,862 - INFO - Remaining leaves to evaluate: 0\n", - "2025-09-08 09:21:13,863 - INFO - Search depth 1 [end]\n", - "2025-09-08 09:21:13,863 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:13,863 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-09-08 09:21:13,863 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:13,864 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,864 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-09-08 09:21:13,864 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:13,864 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-09-08 09:21:13,865 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:13,865 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,865 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:13,865 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:13,865 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 09:21:13,866 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:13,866 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:13,866 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + "2025-09-08 17:18:33,145 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,145 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,145 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,146 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,146 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,146 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,146 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,146 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,146 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,147 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,147 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,147 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,147 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,147 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,147 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,148 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,148 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,148 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-09-08 17:18:33,148 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-08 17:18:33,149 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-08 17:18:33,149 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-09-08 17:18:33,150 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,151 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,153 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:18:33,154 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 17:18:33,154 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,154 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,154 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,154 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,155 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-09-08 17:18:33,155 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,156 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,156 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 17:18:33,156 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,157 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,157 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 17:18:33,157 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:18:33,158 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,158 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,158 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,159 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,159 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,159 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 17:18:33,159 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,160 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,160 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:18:33,160 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 17:18:33,160 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,161 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,161 - INFO - Linear optimization on root leaf\n", + "2025-09-08 17:18:33,163 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,163 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,164 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 17:18:33,164 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,164 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,165 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 17:18:33,165 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:18:33,165 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,166 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,166 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,166 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,167 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,167 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-08 17:18:33,169 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 17:18:33,169 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-08 17:18:33,169 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-08 17:18:33,169 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,170 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,170 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 17:18:33,170 - INFO - Search depth 1 [start]\n", + "2025-09-08 17:18:33,171 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 17:18:33,172 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,172 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,172 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,173 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,173 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,173 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,174 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,197 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:18:33,197 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,198 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,199 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,199 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,199 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,200 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,200 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,200 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-08 17:18:33,201 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 17:18:33,201 - INFO - Search depth 1 [end]\n", + "2025-09-08 17:18:33,201 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,201 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 17:18:33,202 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,202 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,202 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 17:18:33,202 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,203 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 17:18:33,203 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,203 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,203 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,203 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,204 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:18:33,204 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,204 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,204 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -500,8 +512,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-08T07:21:13.926393Z", - "start_time": "2025-09-08T07:21:13.922210Z" + "end_time": "2025-09-08T15:18:33.252415Z", + "start_time": "2025-09-08T15:18:33.249038Z" } }, "outputs": [ @@ -596,8 +608,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-08T07:21:14.064313Z", - "start_time": "2025-09-08T07:21:13.996471Z" + "end_time": "2025-09-08T15:18:33.361139Z", + "start_time": "2025-09-08T15:18:33.303300Z" } }, "outputs": [ @@ -605,156 +617,156 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 09:21:13,998 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,999 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,999 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:13,999 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,000 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,000 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,001 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,001 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,001 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,001 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,002 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,002 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,002 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,002 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,003 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,003 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,003 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,003 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-09-08 09:21:14,003 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-09-08 09:21:14,004 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-09-08 09:21:14,004 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-09-08 09:21:14,006 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:14,007 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:14,007 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:14,010 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 09:21:14,010 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,011 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,012 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,012 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,013 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,013 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-08 09:21:14,014 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,014 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,014 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-08 09:21:14,014 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-09-08 09:21:14,015 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,015 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,015 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,016 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,016 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,017 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-08 09:21:14,017 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,017 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,017 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 09:21:14,018 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-08 09:21:14,018 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,018 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,018 - INFO - Linear optimization on root leaf\n", - "2025-09-08 09:21:14,020 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,021 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,021 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-08 09:21:14,021 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,022 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,022 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-08 09:21:14,022 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 09:21:14,023 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,023 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,023 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,024 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,024 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,025 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-09-08 09:21:14,026 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-08 09:21:14,026 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-09-08 09:21:14,027 - INFO - range action(s): pst-range-action: -10\n", - "2025-09-08 09:21:14,027 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,027 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,027 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-09-08 09:21:14,028 - INFO - Search depth 1 [start]\n", - "2025-09-08 09:21:14,028 - INFO - Leaves to evaluate: 1\n", - "2025-09-08 09:21:14,028 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:14,029 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,030 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,030 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:14,030 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,031 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,031 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:14,031 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 09:21:14,032 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,032 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,032 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,033 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,033 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,033 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:14,034 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:14,034 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-09-08 09:21:14,035 - INFO - Remaining leaves to evaluate: 0\n", - "2025-09-08 09:21:14,035 - INFO - Search depth 1 [end]\n", - "2025-09-08 09:21:14,035 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:14,036 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-09-08 09:21:14,036 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,036 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,036 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-09-08 09:21:14,037 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:14,037 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-09-08 09:21:14,037 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,037 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,037 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-08 09:21:14,038 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:14,038 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 09:21:14,038 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:14,039 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,039 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,039 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:14,040 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,040 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,040 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:14,041 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-09-08 09:21:14,041 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,042 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,042 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,042 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,043 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,043 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-09-08 09:21:14,044 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,044 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,044 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-08 09:21:14,048 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-09-08 09:21:14,048 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-09-08 09:21:14,049 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-09-08 09:21:14,049 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,050 - INFO - Linear optimization on root leaf\n", - "2025-09-08 09:21:14,051 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,052 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,053 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:14,053 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,054 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,054 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:14,055 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-09-08 09:21:14,055 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,056 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,056 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,057 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,057 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,058 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", - "2025-09-08 09:21:14,059 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-08 09:21:14,059 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-09-08 09:21:14,060 - INFO - range action(s): pst-range-action: 6\n", - "2025-09-08 09:21:14,060 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,060 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-09-08 09:21:14,060 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-09-08 09:21:14,061 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-08 09:21:14,061 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-09-08 09:21:14,062 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,062 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,062 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,062 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" + "2025-09-08 17:18:33,305 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,306 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,306 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,306 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,306 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,307 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,307 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,307 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,308 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,308 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,308 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,308 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,308 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,309 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,309 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,309 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,309 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,309 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-09-08 17:18:33,309 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-08 17:18:33,310 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-08 17:18:33,310 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-09-08 17:18:33,311 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,312 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,312 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,315 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:18:33,315 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 17:18:33,315 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,316 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,316 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,316 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,316 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,317 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,317 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,318 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,318 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 17:18:33,318 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,318 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,319 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 17:18:33,319 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-08 17:18:33,319 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,320 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002028186046532099, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,320 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,320 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,321 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.004776402772810329, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,321 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 17:18:33,321 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,321 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,321 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:18:33,322 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-08 17:18:33,322 - INFO - Limiting element #01: margin = -133.3 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,322 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,322 - INFO - Linear optimization on root leaf\n", + "2025-09-08 17:18:33,324 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,324 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,324 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 17:18:33,325 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,325 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,325 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 17:18:33,325 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:18:33,326 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,326 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=7.257322425457957E-4, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,326 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,327 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,327 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-4.960476474025199E-10, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,327 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-08 17:18:33,328 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 17:18:33,329 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-08 17:18:33,329 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-08 17:18:33,329 - INFO - Limiting element #01: margin = -42.72 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,329 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,330 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 17:18:33,330 - INFO - Search depth 1 [start]\n", + "2025-09-08 17:18:33,330 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 17:18:33,330 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,331 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,331 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,332 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,332 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,332 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,332 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,333 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:18:33,333 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,334 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,334 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,334 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,334 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,335 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,335 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,336 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-08 17:18:33,336 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 17:18:33,337 - INFO - Search depth 1 [end]\n", + "2025-09-08 17:18:33,337 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,337 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 17:18:33,337 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,337 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,338 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 17:18:33,338 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,338 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-08 17:18:33,338 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,338 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,339 - INFO - Scenario \"preventive\": initial cost = 133.3 (functional: 133.3, virtual: 0.0), 1 network action(s) and 1 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, cost after preventive optimization = -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-08 17:18:33,339 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,339 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:18:33,339 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,340 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,340 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,340 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,341 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,341 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,341 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,342 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-08 17:18:33,342 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,342 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.002408294433209335, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,343 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,343 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,343 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=4.3076653355456074E-11, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,344 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-08 17:18:33,344 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,344 - INFO - Limiting element #02: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,344 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 17:18:33,347 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-09-08 17:18:33,347 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-09-08 17:18:33,348 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-08 17:18:33,348 - INFO - Limiting element #01: margin = -237.65 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,348 - INFO - Linear optimization on root leaf\n", + "2025-09-08 17:18:33,350 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,350 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,350 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,351 - INFO - Network {CC0 SC0} balance: active generation=1000.0 MW, active load=1000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,351 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,351 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,352 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-09-08 17:18:33,352 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,353 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.001380331569489357, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,353 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,354 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,354 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=1, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.0011719159598300166, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,354 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-09-08 17:18:33,355 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 17:18:33,356 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-09-08 17:18:33,356 - INFO - range action(s): pst-range-action: 6\n", + "2025-09-08 17:18:33,357 - INFO - Limiting element #01: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,357 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 237.65 (functional: 237.65, virtual: 0.0), 1 range action(s) activated : pst-range-action: 6, cost after curative optimization = -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-09-08 17:18:33,357 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-09-08 17:18:33,358 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 17:18:33,358 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 17:18:33,358 - INFO - Limiting element #01: margin = 187.22 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,359 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,359 - INFO - Limiting element #03: margin = 290.77 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,359 - INFO - Cost before RAO = 133.3 (functional: 133.3, virtual: 0.0), cost after RAO = -187.22 (functional: -187.22, virtual: 0.0)\n" ] } ], @@ -768,8 +780,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-08T07:21:14.124196Z", - "start_time": "2025-09-08T07:21:14.119823Z" + "end_time": "2025-09-08T15:18:33.405351Z", + "start_time": "2025-09-08T15:18:33.400432Z" } }, "outputs": [ @@ -842,8 +854,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-08T07:21:14.187238Z", - "start_time": "2025-09-08T07:21:14.182433Z" + "end_time": "2025-09-08T15:18:33.453801Z", + "start_time": "2025-09-08T15:18:33.450163Z" } }, "outputs": [ @@ -913,8 +925,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-08T07:21:14.359788Z", - "start_time": "2025-09-08T07:21:14.244906Z" + "end_time": "2025-09-08T15:18:33.612158Z", + "start_time": "2025-09-08T15:18:33.501576Z" } }, "outputs": [ @@ -922,178 +934,178 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 09:21:14,246 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,247 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,247 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,247 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,247 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,248 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,248 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,248 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,248 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,249 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,249 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,249 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,249 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,250 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,250 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,250 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,250 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-08 09:21:14,250 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", - "2025-09-08 09:21:14,250 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-09-08 09:21:14,251 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-09-08 09:21:14,251 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", - "2025-09-08 09:21:14,253 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:14,254 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:14,254 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", - "2025-09-08 09:21:14,254 - WARNING - The initial setpoint is now read from the network so the value in the crac will not be read\n", - "2025-09-08 09:21:14,254 - WARNING - The initial setpoint is now read from the network so the value in the crac will not be read\n", - "2025-09-08 09:21:14,258 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 09:21:14,258 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 09:21:14,258 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,259 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,260 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 09:21:14,261 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,261 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,262 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-08 09:21:14,263 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", - "2025-09-08 09:21:14,263 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,264 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-1.099476065746785E-9, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,264 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,265 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,265 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.589235492678199E-8, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,266 - INFO - Initial sensitivity analysis: cost = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92})\n", - "2025-09-08 09:21:14,266 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,266 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,266 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 09:21:14,267 - INFO - Root leaf, cost: 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92})\n", - "2025-09-08 09:21:14,267 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,268 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,268 - INFO - Linear optimization on root leaf\n", - "2025-09-08 09:21:14,277 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,278 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,278 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-08 09:21:14,278 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,279 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,279 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-08 09:21:14,279 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", - "2025-09-08 09:21:14,279 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,280 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.0026220928996290027, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,280 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,281 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,281 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-6.412581576853427E-9, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,282 - INFO - Iteration 1: better solution found with a cost of 384414.43 (functional: 50020.00)\n", - "2025-09-08 09:21:14,290 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-08 09:21:14,291 - INFO - Root leaf, 3 range action(s) activated, cost: 384414.43 (functional: 50020.0, virtual: 334394.43 {min-margin-violation-evaluator=334394.43})\n", - "2025-09-08 09:21:14,291 - INFO - range action(s): pst-range-action: -10, redispatchingActionFR: 1000, redispatchingActionNL: 500\n", - "2025-09-08 09:21:14,291 - INFO - Limiting element #01: margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,291 - INFO - Limiting element #02: margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,291 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 784.39 MW, threshold = 450.00 MW, margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,292 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 641.31 MW, threshold = 410.00 MW, margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", - "2025-09-08 09:21:14,292 - INFO - Using base network '12_node_network_redispatching' on variant 'SearchTreeWorkingVariantId'\n", - "2025-09-08 09:21:14,292 - INFO - Search depth 1 [start]\n", - "2025-09-08 09:21:14,293 - INFO - Leaves to evaluate: 1\n", - "2025-09-08 09:21:14,293 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:14,294 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,294 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,294 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:14,295 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,295 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,295 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:14,296 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", - "2025-09-08 09:21:14,296 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,297 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.00889825060106375, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,297 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,298 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,298 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=2.4709123636057484E-10, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,299 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: 50020.0 (functional: 50020.0, virtual: 0.0)\n", - "2025-09-08 09:21:14,307 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,307 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,307 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:14,308 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,308 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,308 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:14,309 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", - "2025-09-08 09:21:14,309 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,310 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,310 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,310 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,311 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,311 - INFO - Iteration 1: better solution found with a cost of 39896.99 (functional: 39820.00)\n", - "2025-09-08 09:21:14,318 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-08 09:21:14,318 - INFO - Optimized network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", - "2025-09-08 09:21:14,318 - INFO - Optimized network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,319 - INFO - Remaining leaves to evaluate: 0\n", - "2025-09-08 09:21:14,319 - INFO - Search depth 1 [end]\n", - "2025-09-08 09:21:14,319 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", - "2025-09-08 09:21:14,319 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602\n", - "2025-09-08 09:21:14,320 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,320 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,320 - INFO - Search depth 2 [start]\n", - "2025-09-08 09:21:14,320 - INFO - No more network action available\n", - "2025-09-08 09:21:14,320 - INFO - No better result found in search depth 2, exiting search tree\n", - "2025-09-08 09:21:14,321 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-09-08 09:21:14,321 - INFO - Best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", - "2025-09-08 09:21:14,321 - INFO - Best leaf: range action(s): pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602\n", - "2025-09-08 09:21:14,321 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,322 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,322 - INFO - Scenario \"preventive\": initial cost = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92}), 1 network action(s) and 3 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602, cost after preventive optimization = 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", - "2025-09-08 09:21:14,322 - INFO - network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,322 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:14,323 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 09:21:14,323 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-08 09:21:14,323 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,324 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,324 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:14,325 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,325 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,326 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:14,326 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", - "2025-09-08 09:21:14,326 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,327 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,328 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,328 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,328 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,329 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98})\n", - "2025-09-08 09:21:14,329 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,330 - INFO - Limiting element #02: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,330 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-08 09:21:14,333 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-09-08 09:21:14,333 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-09-08 09:21:14,334 - INFO - Root leaf, cost: 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98})\n", - "2025-09-08 09:21:14,334 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,334 - INFO - Linear optimization on root leaf\n", - "2025-09-08 09:21:14,340 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-08 09:21:14,341 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-08 09:21:14,341 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-08 09:21:14,342 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", - "2025-09-08 09:21:14,342 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-08 09:21:14,342 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-08 09:21:14,343 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-09-08 09:21:14,343 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,344 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.4915466934061214E-4, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,344 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-08 09:21:14,345 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 09:21:14,345 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.1015190415928373E-10, distributedActivePower=0.0))\n", - "2025-09-08 09:21:14,346 - INFO - Iteration 1: better solution found with a cost of 0.00 (functional: 0.00)\n", - "2025-09-08 09:21:14,353 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-08 09:21:14,354 - INFO - Root leaf, 1 range action(s) activated, cost: 0.0 (functional: 0.0, virtual: 0.0)\n", - "2025-09-08 09:21:14,354 - INFO - range action(s): pst-range-action: 1\n", - "2025-09-08 09:21:14,354 - INFO - Limiting element #01: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,355 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98}), 1 range action(s) activated : pst-range-action: 1, cost after curative optimization = 0.0 (functional: 0.0, virtual: 0.0)\n", - "2025-09-08 09:21:14,355 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-09-08 09:21:14,356 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-08 09:21:14,356 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-09-08 09:21:14,357 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", - "2025-09-08 09:21:14,357 - INFO - Limiting element #02: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", - "2025-09-08 09:21:14,357 - INFO - Limiting element #03: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-08 09:21:14,357 - INFO - Cost before RAO = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92}), cost after RAO = 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n" + "2025-09-08 17:18:33,504 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,504 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,505 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,505 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,506 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,506 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,506 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,506 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,507 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,507 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,507 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,507 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,508 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,508 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,508 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,508 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,509 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-08 17:18:33,509 - ERROR - BBE2AA1 BBE3AA1 1 - Blank is not allowed, real transformer resistance must be greater than or equal to zero (0.0 ohm)\n", + "2025-09-08 17:18:33,509 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-08 17:18:33,509 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-08 17:18:33,509 - WARNING - BBE2AA1 BBE3AA1 1 - For LTCs, transformer angle regulation voltage per tap should not be zero. Its absolute value should not be above 6 % (-0.68 %)\n", + "2025-09-08 17:18:33,513 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,513 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,514 - WARNING - The iMax is now fetched in the network so the value in the CRAC will not be read.\n", + "2025-09-08 17:18:33,514 - WARNING - The initial setpoint is now read from the network so the value in the crac will not be read\n", + "2025-09-08 17:18:33,515 - WARNING - The initial setpoint is now read from the network so the value in the crac will not be read\n", + "2025-09-08 17:18:33,518 - WARNING - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:18:33,519 - WARNING - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 17:18:33,519 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,519 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,519 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,520 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,520 - WARNING - A threshold for the flowCnec NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,520 - WARNING - A threshold for the flowCnec BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:33,521 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,521 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,522 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 17:18:33,522 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,522 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,522 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 17:18:33,523 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", + "2025-09-08 17:18:33,523 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,524 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-1.099476065746785E-9, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,524 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,524 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,525 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.589235492678199E-8, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,525 - INFO - Initial sensitivity analysis: cost = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92})\n", + "2025-09-08 17:18:33,525 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,526 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,526 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:18:33,526 - INFO - Root leaf, cost: 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92})\n", + "2025-09-08 17:18:33,527 - INFO - Limiting element #01: margin = -716.56 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,527 - INFO - Limiting element #02: margin = -590.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,527 - INFO - Linear optimization on root leaf\n", + "2025-09-08 17:18:33,536 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,537 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,537 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-08 17:18:33,537 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,538 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,538 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-08 17:18:33,538 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-09-08 17:18:33,539 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,539 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.0026220928996290027, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,540 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,540 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,540 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-6.412581576853427E-9, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,541 - INFO - Iteration 1: better solution found with a cost of 384414.43 (functional: 50020.00)\n", + "2025-09-08 17:18:33,549 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 17:18:33,550 - INFO - Root leaf, 3 range action(s) activated, cost: 384414.43 (functional: 50020.0, virtual: 334394.43 {min-margin-violation-evaluator=334394.43})\n", + "2025-09-08 17:18:33,550 - INFO - range action(s): pst-range-action: -10, redispatchingActionFR: 1000, redispatchingActionNL: 500\n", + "2025-09-08 17:18:33,550 - INFO - Limiting element #01: margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,550 - INFO - Limiting element #02: margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,551 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 784.39 MW, threshold = 450.00 MW, margin = -334.39 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,551 - INFO - Root leaf, limiting \"min-margin-violation-evaluator\" constraint #02: flow = 641.31 MW, threshold = 410.00 MW, margin = -231.31 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\", CNEC name = \"NL2 BE3 1 - preventive\"\n", + "2025-09-08 17:18:33,551 - INFO - Using base network '12_node_network_redispatching' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 17:18:33,552 - INFO - Search depth 1 [start]\n", + "2025-09-08 17:18:33,552 - INFO - Leaves to evaluate: 1\n", + "2025-09-08 17:18:33,552 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,553 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,554 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,554 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,555 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,555 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,555 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,555 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-09-08 17:18:33,556 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,556 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.00889825060106375, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,557 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,557 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,557 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=2.4709123636057484E-10, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,558 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: 50020.0 (functional: 50020.0, virtual: 0.0)\n", + "2025-09-08 17:18:33,566 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,566 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,567 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,567 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,567 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,568 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,568 - INFO - Running AC sensitivity analysis with 8 factors and 1 contingencies\n", + "2025-09-08 17:18:33,568 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,569 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,569 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,569 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,570 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,570 - INFO - Iteration 1: better solution found with a cost of 39896.99 (functional: 39820.00)\n", + "2025-09-08 17:18:33,576 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 17:18:33,576 - INFO - Optimized network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 17:18:33,577 - INFO - Optimized network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,577 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-08 17:18:33,578 - INFO - Search depth 1 [end]\n", + "2025-09-08 17:18:33,578 - INFO - Search depth 1 best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 17:18:33,578 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602\n", + "2025-09-08 17:18:33,578 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,578 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,579 - INFO - Search depth 2 [start]\n", + "2025-09-08 17:18:33,579 - INFO - No more network action available\n", + "2025-09-08 17:18:33,579 - INFO - No better result found in search depth 2, exiting search tree\n", + "2025-09-08 17:18:33,579 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 17:18:33,579 - INFO - Best leaf: network action(s): close NL2 BE3 2, 3 range action(s) activated, cost: 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 17:18:33,579 - INFO - Best leaf: range action(s): pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602\n", + "2025-09-08 17:18:33,580 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,580 - INFO - Limiting element #02: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,580 - INFO - Scenario \"preventive\": initial cost = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92}), 1 network action(s) and 3 range action(s) activated : close NL2 BE3 2 and pst-range-action: -10, redispatchingActionFR: 898, redispatchingActionNL: 602, cost after preventive optimization = 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n", + "2025-09-08 17:18:33,580 - INFO - network action(s): close NL2 BE3 2, limiting \"min-margin-violation-evaluator\" constraint #01: flow = 450.08 MW, threshold = 450.00 MW, margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\", CNEC name = \"NL2 BE3 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,580 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,581 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:18:33,581 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-08 17:18:33,581 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,582 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,582 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,582 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,583 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,583 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,583 - INFO - Running AC sensitivity analysis with 12 factors and 1 contingencies\n", + "2025-09-08 17:18:33,583 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,584 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.010574641261840156, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,584 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,585 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,585 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=3.1885605267234496E-10, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,585 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98})\n", + "2025-09-08 17:18:33,586 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,586 - INFO - Limiting element #02: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,586 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 17:18:33,590 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-09-08 17:18:33,590 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-09-08 17:18:33,590 - INFO - Root leaf, cost: 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98})\n", + "2025-09-08 17:18:33,591 - INFO - Limiting element #01: margin = -362.45 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,591 - INFO - Linear optimization on root leaf\n", + "2025-09-08 17:18:33,596 - WARNING - Network {CC0 SC0}: 8 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-08 17:18:33,596 - WARNING - Network {CC0 SC0}: 4 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-08 17:18:33,597 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-08 17:18:33,597 - INFO - Network {CC0 SC0} balance: active generation=3000.0 MW, active load=3000.0 MW, reactive generation=0.0 MVar, reactive load=0.0 MVar\n", + "2025-09-08 17:18:33,597 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-08 17:18:33,597 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-08 17:18:33,598 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-09-08 17:18:33,598 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,599 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-2.4915466934061214E-4, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,599 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-08 17:18:33,599 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:33,599 - INFO - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-3.1015190415928373E-10, distributedActivePower=0.0))\n", + "2025-09-08 17:18:33,600 - INFO - Iteration 1: better solution found with a cost of 0.00 (functional: 0.00)\n", + "2025-09-08 17:18:33,606 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-08 17:18:33,606 - INFO - Root leaf, 1 range action(s) activated, cost: 0.0 (functional: 0.0, virtual: 0.0)\n", + "2025-09-08 17:18:33,607 - INFO - range action(s): pst-range-action: 1\n", + "2025-09-08 17:18:33,607 - INFO - Limiting element #01: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,608 - INFO - Scenario \"Contingency DE2 DE3\": initial cost = 362454.98 (functional: 0.0, virtual: 362454.98 {min-margin-violation-evaluator=362454.98}), 1 range action(s) activated : pst-range-action: 1, cost after curative optimization = 0.0 (functional: 0.0, virtual: 0.0)\n", + "2025-09-08 17:18:33,608 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-09-08 17:18:33,609 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 17:18:33,609 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 17:18:33,609 - INFO - Limiting element #01: margin = -0.08 MW, element NNL2AA1 BBE3AA1 1 at state Contingency DE2 DE3 - outage, CNEC ID = \"NNL2AA1 BBE3AA1 1 - Contingency DE2 DE3 - outage\"\n", + "2025-09-08 17:18:33,610 - INFO - Limiting element #02: margin = 0.73 MW, element BBE1AA1 BBE2AA1 1 at state Contingency DE2 DE3 - curative, CNEC ID = \"BBE1AA1 BBE2AA1 1 - Contingency DE2 DE3 - curative\"\n", + "2025-09-08 17:18:33,610 - INFO - Limiting element #03: margin = 35.78 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-08 17:18:33,610 - INFO - Cost before RAO = 716562.92 (functional: 0.0, virtual: 716562.92 {min-margin-violation-evaluator=716562.92}), cost after RAO = 39896.99 (functional: 39820.0, virtual: 76.99 {min-margin-violation-evaluator=76.99})\n" ] } ], @@ -1107,8 +1119,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-08T07:21:14.866640Z", - "start_time": "2025-09-08T07:21:14.862544Z" + "end_time": "2025-09-08T15:18:33.622711Z", + "start_time": "2025-09-08T15:18:33.619636Z" } }, "outputs": [ diff --git a/open_rao_angle_monitoring.ipynb b/open_rao_angle_monitoring.ipynb index 152d7bf..d749c60 100644 --- a/open_rao_angle_monitoring.ipynb +++ b/open_rao_angle_monitoring.ipynb @@ -20,21 +20,21 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.075231Z", - "start_time": "2025-09-08T14:53:13.073426Z" + "end_time": "2025-09-08T15:17:53.322979Z", + "start_time": "2025-09-08T15:17:53.321183Z" } }, "cell_type": "code", "source": "#pip install pypowsybl==1.12.0", "id": "6657842d8b2d9845", "outputs": [], - "execution_count": 37 + "execution_count": 30 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.121505Z", - "start_time": "2025-09-08T14:53:13.119747Z" + "end_time": "2025-09-08T15:17:53.373498Z", + "start_time": "2025-09-08T15:17:53.371569Z" } }, "cell_type": "code", @@ -44,7 +44,7 @@ ], "id": "4ad9bbcf2f4f85bf", "outputs": [], - "execution_count": 38 + "execution_count": 31 }, { "cell_type": "code", @@ -52,8 +52,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.171206Z", - "start_time": "2025-09-08T14:53:13.168167Z" + "end_time": "2025-09-08T15:17:53.422012Z", + "start_time": "2025-09-08T15:17:53.419904Z" } }, "source": [ @@ -63,7 +63,7 @@ "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" ], "outputs": [], - "execution_count": 39 + "execution_count": 32 }, { "metadata": {}, @@ -80,13 +80,13 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.227876Z", - "start_time": "2025-09-08T14:53:13.217054Z" + "end_time": "2025-09-08T15:17:53.479424Z", + "start_time": "2025-09-08T15:17:53.470182Z" } }, "cell_type": "code", "source": [ - "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "network = pp.network.load(\"data/rao/monitoring/network.xiidm\")\n", "network.get_network_area_diagram()" ], "id": "d923fa57b4d80171", @@ -95,25 +95,25 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 16:53:13,219 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:53:13,221 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:53:13,222 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 16:53:13,222 - INFO - powsybl - Elapsed time: 5.2887E-5\n" + "2025-09-08 17:17:53,472 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:17:53,473 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:17:53,474 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:17:53,475 - INFO - powsybl - Elapsed time: 8.7134E-5\n" ] }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 40, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 40 + "execution_count": 33 }, { "metadata": {}, @@ -124,8 +124,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.286565Z", - "start_time": "2025-09-08T14:53:13.271083Z" + "end_time": "2025-09-08T15:17:53.538278Z", + "start_time": "2025-09-08T15:17:53.521703Z" } }, "cell_type": "code", @@ -139,9 +139,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 16:53:13,272 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", - "2025-09-08 16:53:13,273 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:53:13,276 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:17:53,522 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 17:17:53,523 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:17:53,527 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", @@ -238,33 +238,33 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-09-08 16:53:13,276 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:53:13,277 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:53:13,277 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,278 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,278 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:53:13,278 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,279 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,279 - INFO - powsybl - Load flow ran in 5 ms\n", - "2025-09-08 16:53:13,280 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:53:13,280 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:53:13,281 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 16:53:13,282 - INFO - powsybl - Elapsed time: 6.7027E-5\n" + "2025-09-08 17:17:53,528 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:17:53,528 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:17:53,529 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:53,529 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:53,529 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:17:53,530 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:53,530 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:17:53,530 - INFO - powsybl - Load flow ran in 7 ms\n", + "2025-09-08 17:17:53,531 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:17:53,532 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:17:53,533 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:17:53,534 - INFO - powsybl - Elapsed time: 9.7283E-5\n" ] }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 41, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 41 + "execution_count": 34 }, { "metadata": {}, @@ -280,19 +280,19 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.409981Z", - "start_time": "2025-09-08T14:53:13.404792Z" + "end_time": "2025-09-08T15:17:53.592108Z", + "start_time": "2025-09-08T15:17:53.587442Z" } }, "cell_type": "code", "source": [ "parameters = RaoParameters()\n", - "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", + "parameters.load_from_file_source(\"./data/rao/monitoring/rao_parameters.json\")\n", "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" ], "id": "2602f3b7325812ca", "outputs": [], - "execution_count": 42 + "execution_count": 35 }, { "metadata": {}, @@ -303,24 +303,24 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.455548Z", - "start_time": "2025-09-08T14:53:13.451935Z" + "end_time": "2025-09-08T15:17:53.639605Z", + "start_time": "2025-09-08T15:17:53.635551Z" } }, "cell_type": "code", "source": [ "rao_runner = pp.rao.create_rao()\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json\")" + "rao_runner.set_crac_file_source(network, \"./data/rao/monitoring/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json\")" ], "id": "4e5f0e41497f9f69", "outputs": [], - "execution_count": 43 + "execution_count": 36 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.516609Z", - "start_time": "2025-09-08T14:53:13.501282Z" + "end_time": "2025-09-08T15:17:53.704778Z", + "start_time": "2025-09-08T15:17:53.690168Z" } }, "cell_type": "code", @@ -331,45 +331,44 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 16:53:13,502 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 16:53:13,503 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 16:53:13,503 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,504 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,504 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,504 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,505 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:53:13,506 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,506 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,506 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:53:13,507 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 16:53:13,507 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,507 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,508 - INFO - powsybl - Simulate contingency 'coL1'\n", - "2025-09-08 16:53:13,508 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,508 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,509 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:53:13,509 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:53:13,510 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,510 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 16:53:13,510 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:53:13,511 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,511 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:53:13,511 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 16:53:13,511 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:53:13,512 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:53:13,512 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,512 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-08 16:53:13,513 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", - "2025-09-08 16:53:13,514 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", - "2025-09-08 16:53:13,514 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-08 16:53:13,514 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", - "2025-09-08 16:53:13,515 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:53:13,515 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,515 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n" + "2025-09-08 17:17:53,692 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:17:53,692 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:53,692 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:53,693 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:53,693 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:53,694 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:17:53,694 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:53,695 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:53,695 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:17:53,695 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:17:53,695 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:53,696 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:17:53,696 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 17:17:53,697 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:53,697 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", + "2025-09-08 17:17:53,697 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 17:17:53,698 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:17:53,698 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:53,698 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:17:53,699 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:17:53,699 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:53,699 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:17:53,699 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:17:53,700 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 17:17:53,700 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:17:53,700 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:53,700 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 17:17:53,702 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 17:17:53,702 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 17:17:53,702 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 17:17:53,703 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 17:17:53,703 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:17:53,703 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:53,703 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n" ] } ], - "execution_count": 44 + "execution_count": 37 }, { "metadata": {}, @@ -384,23 +383,23 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.544110Z", - "start_time": "2025-09-08T14:53:13.541090Z" + "end_time": "2025-09-08T15:17:53.747806Z", + "start_time": "2025-09-08T15:17:53.744698Z" } }, "cell_type": "code", - "source": "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")", + "source": "rao_runner.set_glsk_file_source(network, \"./data/rao/monitoring/angle_monitoring/GlskB45test.xml\")", "id": "a8e68de35a37a9eb", "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 16:53:13,542 - INFO - powsybl - CIM GLSK importer could import this document.\n" + "2025-09-08 17:17:53,746 - INFO - powsybl - CIM GLSK importer could import this document.\n" ] } ], - "execution_count": 45 + "execution_count": 38 }, { "metadata": {}, @@ -411,8 +410,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.605404Z", - "start_time": "2025-09-08T14:53:13.587743Z" + "end_time": "2025-09-08T15:17:53.818165Z", + "start_time": "2025-09-08T15:17:53.799051Z" } }, "cell_type": "code", @@ -427,9 +426,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 16:53:13,589 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", - "2025-09-08 16:53:13,590 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:53:13,594 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:17:53,801 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 17:17:53,801 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:17:53,805 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", @@ -526,33 +525,33 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-09-08 16:53:13,595 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:53:13,595 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 16:53:13,596 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,596 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", - "2025-09-08 16:53:13,597 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:53:13,597 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,598 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689771093529304, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,598 - INFO - powsybl - Load flow ran in 7 ms\n", - "2025-09-08 16:53:13,599 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:53:13,600 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:53:13,601 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 16:53:13,601 - INFO - powsybl - Elapsed time: 4.3579E-5\n" + "2025-09-08 17:17:53,806 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:17:53,807 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:17:53,807 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:53,808 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", + "2025-09-08 17:17:53,808 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:17:53,808 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:53,809 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689771093529304, distributedActivePower=0.0))\n", + "2025-09-08 17:17:53,810 - INFO - powsybl - Load flow ran in 7 ms\n", + "2025-09-08 17:17:53,810 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:17:53,812 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:17:53,813 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:17:53,813 - INFO - powsybl - Elapsed time: 1.57577E-4\n" ] }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 383.2 kV / -3.7°
\n
\n
\n
\n
\n" }, - "execution_count": 46, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 46 + "execution_count": 39 }, { "metadata": {}, @@ -566,8 +565,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.654008Z", - "start_time": "2025-09-08T14:53:13.652248Z" + "end_time": "2025-09-08T15:17:53.898580Z", + "start_time": "2025-09-08T15:17:53.897014Z" } }, "cell_type": "code", @@ -579,8 +578,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.736758Z", - "start_time": "2025-09-08T14:53:13.702868Z" + "end_time": "2025-09-08T15:17:53.983596Z", + "start_time": "2025-09-08T15:17:53.948438Z" } }, "cell_type": "code", @@ -595,11 +594,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 16:53:13,704 - INFO - powsybl - ----- ANGLE monitoring [start]\n", - "2025-09-08 16:53:13,705 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", - "2025-09-08 16:53:13,706 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:53:13,706 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:53:13,710 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:17:53,949 - INFO - powsybl - ----- ANGLE monitoring [start]\n", + "2025-09-08 17:17:53,950 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 17:17:53,950 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:17:53,951 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:17:53,955 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -700,22 +699,22 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:53:13,711 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:53:13,711 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 16:53:13,712 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,712 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,713 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", - "2025-09-08 16:53:13,713 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,714 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,714 - INFO - powsybl - Load flow ran in 7 ms\n", - "2025-09-08 16:53:13,715 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:53:13,715 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", - "2025-09-08 16:53:13,715 - INFO - powsybl - All ANGLE Cnecs are secure.\n", - "2025-09-08 16:53:13,715 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario2d94b19a-2a84-401d-82e7-5e0fbe022508'\n", - "2025-09-08 16:53:13,716 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", - "2025-09-08 16:53:13,716 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:53:13,717 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:53:13,719 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:17:53,956 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:17:53,957 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:17:53,957 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:53,958 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:53,958 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 17:17:53,958 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:53,959 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", + "2025-09-08 17:17:53,959 - INFO - powsybl - Load flow ran in 8 ms\n", + "2025-09-08 17:17:53,960 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:17:53,960 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 17:17:53,960 - INFO - powsybl - All ANGLE Cnecs are secure.\n", + "2025-09-08 17:17:53,961 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario7e84618f-15f0-4d24-8d13-69174072e437'\n", + "2025-09-08 17:17:53,961 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", + "2025-09-08 17:17:53,961 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:17:53,962 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:17:53,965 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -816,22 +815,22 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:53:13,719 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:53:13,720 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 16:53:13,720 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,721 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,721 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", - "2025-09-08 16:53:13,721 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,722 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,722 - INFO - powsybl - Load flow ran in 5 ms\n", - "2025-09-08 16:53:13,722 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:53:13,723 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": Injection L1 - 2\n", - "2025-09-08 16:53:13,723 - INFO - powsybl - Redispatching -50.0 MW in FR [start]\n", - "2025-09-08 16:53:13,723 - WARNING - powsybl - Redispatching failed: asked=-50.0 MW, applied=0.0 MW\n", - "2025-09-08 16:53:13,724 - INFO - powsybl - Redispatching -50.0 MW in FR [end]\n", - "2025-09-08 16:53:13,724 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:53:13,724 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:53:13,727 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:17:53,965 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:17:53,966 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:17:53,966 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:53,967 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:53,967 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 17:17:53,967 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:53,968 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", + "2025-09-08 17:17:53,968 - INFO - powsybl - Load flow ran in 5 ms\n", + "2025-09-08 17:17:53,968 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:17:53,969 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": Injection L1 - 2\n", + "2025-09-08 17:17:53,969 - INFO - powsybl - Redispatching -50.0 MW in FR [start]\n", + "2025-09-08 17:17:53,970 - WARNING - powsybl - Redispatching failed: asked=-50.0 MW, applied=0.0 MW\n", + "2025-09-08 17:17:53,970 - INFO - powsybl - Redispatching -50.0 MW in FR [end]\n", + "2025-09-08 17:17:53,970 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:17:53,970 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:17:53,974 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -932,20 +931,20 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:53:13,727 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:53:13,728 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 16:53:13,728 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=50.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,728 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,729 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", - "2025-09-08 16:53:13,729 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,730 - INFO - powsybl - Slack bus active power (-49.75370763087723 MW) distributed in 1 distribution iteration(s)\n", - "2025-09-08 16:53:13,730 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=1, newtonRaphsonIterations=5, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.10133730290569076, distributedActivePower=-49.75370763087723))\n", - "2025-09-08 16:53:13,730 - INFO - powsybl - Load flow ran in 5 ms\n", - "2025-09-08 16:53:13,731 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:53:13,731 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", - "2025-09-08 16:53:13,731 - INFO - powsybl - All ANGLE Cnecs are secure.\n", - "2025-09-08 16:53:13,732 - INFO - powsybl - ----- ANGLE monitoring [end]\n", - "2025-09-08 16:53:13,732 - INFO - powsybl - All ANGLE Cnecs are secure.\n" + "2025-09-08 17:17:53,974 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:17:53,975 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:17:53,975 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=50.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:53,975 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:53,975 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 17:17:53,976 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:53,976 - INFO - powsybl - Slack bus active power (-49.75370763087723 MW) distributed in 1 distribution iteration(s)\n", + "2025-09-08 17:17:53,976 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=1, newtonRaphsonIterations=5, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=-0.10133730290569076, distributedActivePower=-49.75370763087723))\n", + "2025-09-08 17:17:53,977 - INFO - powsybl - Load flow ran in 6 ms\n", + "2025-09-08 17:17:53,977 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:17:53,977 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", + "2025-09-08 17:17:53,978 - INFO - powsybl - All ANGLE Cnecs are secure.\n", + "2025-09-08 17:17:53,979 - INFO - powsybl - ----- ANGLE monitoring [end]\n", + "2025-09-08 17:17:53,979 - INFO - powsybl - All ANGLE Cnecs are secure.\n" ] }, { @@ -953,7 +952,7 @@ "text/plain": [ " cnec_id angle margin\n", "index \n", - "6 acCur1 -3.783208 2.216792" + "2 acCur1 -3.783208 2.216792" ], "text/html": [ "

\n", @@ -987,7 +986,7 @@ " \n", " \n", " \n", - " 6\n", + " 2\n", " acCur1\n", " -3.783208\n", " 2.216792\n", @@ -997,12 +996,25 @@ "
" ] }, - "execution_count": 47, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 47 + "execution_count": 40 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-08T15:17:54.211517Z", + "start_time": "2025-09-08T15:17:54.210404Z" + } + }, + "cell_type": "code", + "source": "", + "id": "a2e560a9e9c3f68c", + "outputs": [], + "execution_count": null }, { "metadata": {}, @@ -1018,69 +1030,68 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T14:53:13.843531Z", - "start_time": "2025-09-08T14:53:13.797792Z" + "end_time": "2025-09-08T15:17:54.306012Z", + "start_time": "2025-09-08T15:17:54.257829Z" } }, "cell_type": "code", "source": [ - "network_2 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "network_2 = pp.network.load(\"./data/rao/monitoring/network.xiidm\")\n", "rao_runner_2 = pp.rao.create_rao()\n", - "rao_runner_2.set_crac_file_source(network_2, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json\")\n", + "rao_runner_2.set_crac_file_source(network_2, \"./data/rao/monitoring/angle_monitoring/angle_monitoring_simple_case_with_topo.json\")\n", "rao_result_2 = rao_runner_2.run(network_2, parameters)\n", "print(rao_result_2.to_json())\n", - "rao_runner_2.set_glsk_file_source(network_2, \"./data/rao/angle_monitoring/GlskB45test.xml\")\n", + "rao_runner_2.set_glsk_file_source(network_2, \"./data/rao/monitoring/angle_monitoring/GlskB45test.xml\")\n", "result_with_angle_monitoring_2 = rao_runner_2.run_angle_monitoring(network_2, rao_result_2, load_flow_parameters, \"OpenLoadFlow\")\n", "df_angle_cnecs_2 = result_with_angle_monitoring_2.get_angle_cnec_results()\n", "df_angle_cnecs_2[['cnec_id', 'angle', 'margin']]" ], - "id": "5c4538b1174b6e8e", + "id": "8e949fbb5189ecce", "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 16:53:13,802 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 16:53:13,802 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,803 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:53:13,804 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:53:13,804 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,805 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,805 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:53:13,806 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 16:53:13,806 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,806 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,807 - INFO - powsybl - Simulate contingency 'coL1'\n", - "2025-09-08 16:53:13,807 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,807 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,808 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:53:13,808 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:53:13,808 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,809 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 16:53:13,809 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:53:13,809 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,809 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:53:13,810 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 16:53:13,810 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:53:13,810 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:53:13,810 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,810 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-08 16:53:13,812 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", - "2025-09-08 16:53:13,813 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", - "2025-09-08 16:53:13,813 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-08 16:53:13,814 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", - "2025-09-08 16:53:13,814 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:53:13,814 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:53:13,815 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:53:13,816 - INFO - powsybl - CIM GLSK importer could import this document.\n", - "2025-09-08 16:53:13,817 - INFO - powsybl - ----- ANGLE monitoring [start]\n", - "2025-09-08 16:53:13,817 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", - "2025-09-08 16:53:13,817 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:53:13,817 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:53:13,822 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:17:54,262 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:17:54,263 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:54,263 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:54,263 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:54,264 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:17:54,265 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:17:54,265 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:54,266 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:54,266 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:17:54,267 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:17:54,267 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:54,268 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:17:54,268 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 17:17:54,268 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:54,269 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", + "2025-09-08 17:17:54,269 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 17:17:54,270 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:17:54,270 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:54,270 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:17:54,270 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:17:54,271 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:54,271 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:17:54,271 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:17:54,272 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 17:17:54,272 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:17:54,272 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:54,272 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 17:17:54,274 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 17:17:54,274 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 17:17:54,275 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 17:17:54,275 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 17:17:54,276 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:17:54,276 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:17:54,276 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n", + "2025-09-08 17:17:54,279 - INFO - powsybl - CIM GLSK importer could import this document.\n", + "2025-09-08 17:17:54,279 - INFO - powsybl - ----- ANGLE monitoring [start]\n", + "2025-09-08 17:17:54,280 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 17:17:54,280 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:17:54,280 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:17:54,283 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -1181,22 +1192,22 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:53:13,822 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:53:13,823 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:53:13,824 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,824 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,824 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:53:13,825 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,825 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,826 - INFO - powsybl - Load flow ran in 8 ms\n", - "2025-09-08 16:53:13,826 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:53:13,827 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", - "2025-09-08 16:53:13,827 - INFO - powsybl - All ANGLE Cnecs are secure.\n", - "2025-09-08 16:53:13,827 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario03826340-af2c-48fa-bbb3-b9ceec4637aa'\n", - "2025-09-08 16:53:13,827 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", - "2025-09-08 16:53:13,828 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:53:13,828 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:53:13,831 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:17:54,284 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:17:54,284 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:17:54,285 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:54,285 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:54,285 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:17:54,286 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:54,286 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:17:54,287 - INFO - powsybl - Load flow ran in 6 ms\n", + "2025-09-08 17:17:54,287 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:17:54,287 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 17:17:54,288 - INFO - powsybl - All ANGLE Cnecs are secure.\n", + "2025-09-08 17:17:54,288 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario44b91257-0c83-4a98-9c19-b54a35bb2358'\n", + "2025-09-08 17:17:54,288 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", + "2025-09-08 17:17:54,289 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:17:54,289 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:17:54,292 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -1297,23 +1308,23 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:53:13,832 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:53:13,833 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 16:53:13,833 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:53:13,833 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", - "2025-09-08 16:53:13,834 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", - "2025-09-08 16:53:13,834 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:53:13,835 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", - "2025-09-08 16:53:13,835 - INFO - powsybl - Load flow ran in 6 ms\n", - "2025-09-08 16:53:13,836 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:53:13,836 - WARNING - powsybl - Remedial action Open L1 - 2 of AngleCnec acCur1 is ignored : it has an elementary action that's not an injection setpoint.\n", - "2025-09-08 16:53:13,836 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": \n", - "2025-09-08 16:53:13,837 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", - "2025-09-08 16:53:13,837 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", - "2025-09-08 16:53:13,838 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n", - "2025-09-08 16:53:13,838 - INFO - powsybl - ----- ANGLE monitoring [end]\n", - "2025-09-08 16:53:13,838 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", - "2025-09-08 16:53:13,838 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n" + "2025-09-08 17:17:54,293 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:17:54,293 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:17:54,294 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:17:54,294 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", + "2025-09-08 17:17:54,294 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", + "2025-09-08 17:17:54,295 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:17:54,295 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", + "2025-09-08 17:17:54,295 - INFO - powsybl - Load flow ran in 5 ms\n", + "2025-09-08 17:17:54,296 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:17:54,296 - WARNING - powsybl - Remedial action Open L1 - 2 of AngleCnec acCur1 is ignored : it has an elementary action that's not an injection setpoint.\n", + "2025-09-08 17:17:54,297 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": \n", + "2025-09-08 17:17:54,298 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", + "2025-09-08 17:17:54,298 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", + "2025-09-08 17:17:54,298 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n", + "2025-09-08 17:17:54,299 - INFO - powsybl - ----- ANGLE monitoring [end]\n", + "2025-09-08 17:17:54,299 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", + "2025-09-08 17:17:54,300 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n" ] }, { @@ -1328,7 +1339,7 @@ "text/plain": [ " cnec_id angle margin\n", "index \n", - "7 acCur1 -7.713852 -4.713852" + "3 acCur1 -7.713852 -4.713852" ], "text/html": [ "
\n", @@ -1362,7 +1373,7 @@ " \n", " \n", " \n", - " 7\n", + " 3\n", " acCur1\n", " -7.713852\n", " -4.713852\n", @@ -1372,12 +1383,12 @@ "
" ] }, - "execution_count": 48, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 48 + "execution_count": 41 } ], "metadata": { diff --git a/open_rao_voltage_monitoring.ipynb b/open_rao_voltage_monitoring.ipynb index 18bb173..64de741 100644 --- a/open_rao_voltage_monitoring.ipynb +++ b/open_rao_voltage_monitoring.ipynb @@ -20,21 +20,21 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:42.172616Z", - "start_time": "2025-09-08T15:08:42.170641Z" + "end_time": "2025-09-08T15:18:04.408443Z", + "start_time": "2025-09-08T15:18:04.406131Z" } }, "cell_type": "code", "source": "#pip install pypowsybl==1.12.0", "id": "6657842d8b2d9845", "outputs": [], - "execution_count": 1 + "execution_count": 11 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:43.459107Z", - "start_time": "2025-09-08T15:08:42.219939Z" + "end_time": "2025-09-08T15:18:04.459151Z", + "start_time": "2025-09-08T15:18:04.455009Z" } }, "cell_type": "code", @@ -44,7 +44,7 @@ ], "id": "4ad9bbcf2f4f85bf", "outputs": [], - "execution_count": 2 + "execution_count": 12 }, { "cell_type": "code", @@ -52,8 +52,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-09-08T15:08:43.538329Z", - "start_time": "2025-09-08T15:08:43.536229Z" + "end_time": "2025-09-08T15:18:04.512054Z", + "start_time": "2025-09-08T15:18:04.507016Z" } }, "source": [ @@ -63,7 +63,7 @@ "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')" ], "outputs": [], - "execution_count": 3 + "execution_count": 13 }, { "metadata": {}, @@ -80,13 +80,13 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:43.609614Z", - "start_time": "2025-09-08T15:08:43.586107Z" + "end_time": "2025-09-08T15:18:04.575209Z", + "start_time": "2025-09-08T15:18:04.562867Z" } }, "cell_type": "code", "source": [ - "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", + "network = pp.network.load(\"data/rao/monitoring/network.xiidm\")\n", "network.get_network_area_diagram()" ], "id": "d923fa57b4d80171", @@ -95,48 +95,40 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 17:08:43,587 - INFO - powsybl - Using platform configuration provider classic\n", - "2025-09-08 17:08:43,587 - INFO - powsybl - Platform configuration defined by .properties files of directory /home/demontmorillongod/.itools\n", - "2025-09-08 17:08:43,589 - INFO - powsybl - LocalComputationConfig [localDir=/tmp, availableCore=1]\n", - "2025-09-08 17:08:43,591 - INFO - powsybl - Configuring StAX XMLInputFactory...\n", - "2025-09-08 17:08:43,591 - INFO - powsybl - Some properties may not be supported by your implementation.\n", - "2025-09-08 17:08:43,592 - INFO - powsybl - This may not be a problem because some are overlapping.\n", - "2025-09-08 17:08:43,592 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/property/accessExternalStylesheet\n", - "2025-09-08 17:08:43,593 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/feature/secure-processing\n", - "2025-09-08 17:08:43,594 - DEBUG - powsybl - XIIDM import done in 1 ms\n", - "2025-09-08 17:08:43,595 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 17:08:43,598 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 17:08:43,598 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 17:08:43,598 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 17:08:43,599 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 17:08:43,599 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 17:08:43,600 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 17:08:43,601 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 17:08:43,601 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 17:08:43,601 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 17:08:43,601 - INFO - powsybl - Elapsed time: 8.9488E-5\n" + "2025-09-08 17:18:04,564 - DEBUG - powsybl - XIIDM import done in 0 ms\n", + "2025-09-08 17:18:04,565 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:18:04,566 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:18:04,566 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:18:04,566 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:18:04,567 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:18:04,567 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:18:04,567 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:18:04,567 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:18:04,568 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:18:04,568 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:18:04,569 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:18:04,569 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:18:04,569 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:18:04,569 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:18:04,570 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:18:04,570 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:18:04,570 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:18:04,570 - INFO - powsybl - Elapsed time: 6.5015E-5\n" ] }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 4, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 4 + "execution_count": 14 }, { "metadata": {}, @@ -147,8 +139,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:43.750149Z", - "start_time": "2025-09-08T15:08:43.720690Z" + "end_time": "2025-09-08T15:18:04.614861Z", + "start_time": "2025-09-08T15:18:04.590603Z" } }, "cell_type": "code", @@ -162,9 +154,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 17:08:43,722 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", - "2025-09-08 17:08:43,722 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 17:08:43,727 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:18:04,591 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 17:18:04,592 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:18:04,595 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", @@ -261,68 +253,68 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-09-08 17:08:43,728 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 17:08:43,728 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 17:08:43,729 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 17:08:43,730 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 17:08:43,730 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 17:08:43,731 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 17:08:43,731 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 17:08:43,731 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 17:08:43,731 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 17:08:43,732 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 17:08:43,732 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 17:08:43,732 - DEBUG - powsybl - Equation vector updated in 73 us\n", - "2025-09-08 17:08:43,733 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 17:08:43,733 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:43,735 - DEBUG - powsybl - Jacobian matrix built in 1337 us\n", - "2025-09-08 17:08:43,735 - DEBUG - powsybl - Sparse LU decomposition done in 51 us\n", - "2025-09-08 17:08:43,735 - DEBUG - powsybl - LU decomposition done in 307 us\n", - "2025-09-08 17:08:43,735 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:43,736 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 17:08:43,736 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:43,736 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", - "2025-09-08 17:08:43,736 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 12 us\n", - "2025-09-08 17:08:43,737 - DEBUG - powsybl - LU decomposition updated in 267 us\n", - "2025-09-08 17:08:43,737 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:43,737 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 17:08:43,737 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:43,738 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 17:08:43,738 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 17:08:43,739 - INFO - powsybl - Load flow ran in 15 ms\n", - "2025-09-08 17:08:43,739 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 17:08:43,740 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 17:08:43,740 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 17:08:43,740 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 17:08:43,741 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 17:08:43,742 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 17:08:43,742 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 17:08:43,743 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 17:08:43,743 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 17:08:43,743 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 17:08:43,744 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 17:08:43,744 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 17:08:43,744 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 17:08:43,745 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 17:08:43,745 - INFO - powsybl - Elapsed time: 8.5373E-5\n" + "2025-09-08 17:18:04,596 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:18:04,596 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 17:18:04,597 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 17:18:04,597 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:18:04,597 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:18:04,598 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:18:04,598 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:04,598 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:18:04,599 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:04,599 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:18:04,599 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:18:04,600 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:18:04,600 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:18:04,600 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:04,600 - DEBUG - powsybl - Jacobian matrix built in 7 us\n", + "2025-09-08 17:18:04,601 - DEBUG - powsybl - Sparse LU decomposition done in 23 us\n", + "2025-09-08 17:18:04,601 - DEBUG - powsybl - LU decomposition done in 273 us\n", + "2025-09-08 17:18:04,601 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:04,602 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 17:18:04,602 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:04,602 - DEBUG - powsybl - Jacobian matrix values updated in 9 us\n", + "2025-09-08 17:18:04,603 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 7 us\n", + "2025-09-08 17:18:04,603 - DEBUG - powsybl - LU decomposition updated in 350 us\n", + "2025-09-08 17:18:04,603 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:18:04,603 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 17:18:04,604 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:04,604 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:18:04,605 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:18:04,605 - INFO - powsybl - Load flow ran in 12 ms\n", + "2025-09-08 17:18:04,606 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:18:04,606 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:18:04,607 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:18:04,607 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:18:04,607 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:18:04,607 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:18:04,607 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:18:04,608 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:18:04,608 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:18:04,608 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:18:04,609 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:18:04,609 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:18:04,609 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:18:04,609 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:18:04,609 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:18:04,610 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:18:04,610 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:18:04,610 - INFO - powsybl - Elapsed time: 4.6339E-5\n" ] }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" }, - "execution_count": 5, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 5 + "execution_count": 15 }, { "metadata": {}, @@ -338,8 +330,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:43.965137Z", - "start_time": "2025-09-08T15:08:43.957089Z" + "end_time": "2025-09-08T15:18:04.668677Z", + "start_time": "2025-09-08T15:18:04.664019Z" } }, "cell_type": "code", @@ -350,7 +342,7 @@ ], "id": "2602f3b7325812ca", "outputs": [], - "execution_count": 6 + "execution_count": 16 }, { "metadata": {}, @@ -361,24 +353,24 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:44.018273Z", - "start_time": "2025-09-08T15:08:44.011795Z" + "end_time": "2025-09-08T15:18:04.715348Z", + "start_time": "2025-09-08T15:18:04.711640Z" } }, "cell_type": "code", "source": [ "rao_runner = pp.rao.create_rao()\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json\")" + "rao_runner.set_crac_file_source(network, \"./data/rao/monitoring/voltage_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json\")" ], "id": "4e5f0e41497f9f69", "outputs": [], - "execution_count": 7 + "execution_count": 17 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:44.156469Z", - "start_time": "2025-09-08T15:08:44.074259Z" + "end_time": "2025-09-08T15:18:04.801655Z", + "start_time": "2025-09-08T15:18:04.760810Z" } }, "cell_type": "code", @@ -389,133 +381,133 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 17:08:44,081 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 17:08:44,082 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 17:08:44,082 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 17:08:44,082 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 17:08:44,082 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 17:08:44,083 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 17:08:44,083 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", - "2025-09-08 17:08:44,083 - DEBUG - powsybl - LF networks created in 0 ms\n", - "2025-09-08 17:08:44,084 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 17:08:44,084 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 17:08:44,084 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 17:08:44,085 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 17:08:44,085 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 17:08:44,085 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 17:08:44,086 - DEBUG - powsybl - Equations index updated (7 columns)\n", - "2025-09-08 17:08:44,086 - DEBUG - powsybl - Variables index updated (7 rows)\n", - "2025-09-08 17:08:44,086 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 17:08:44,086 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 17:08:44,087 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:44,087 - DEBUG - powsybl - Jacobian matrix built in 11 us\n", - "2025-09-08 17:08:44,087 - DEBUG - powsybl - Sparse LU decomposition done in 19 us\n", - "2025-09-08 17:08:44,087 - DEBUG - powsybl - LU decomposition done in 235 us\n", - "2025-09-08 17:08:44,088 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,088 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 17:08:44,088 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:44,089 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", - "2025-09-08 17:08:44,089 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 5 us\n", - "2025-09-08 17:08:44,089 - DEBUG - powsybl - LU decomposition updated in 285 us\n", - "2025-09-08 17:08:44,090 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 17:08:44,090 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 17:08:44,090 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:44,090 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 17:08:44,091 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", - "2025-09-08 17:08:44,091 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 7 us\n", - "2025-09-08 17:08:44,092 - DEBUG - powsybl - LU decomposition updated in 420 us\n", - "2025-09-08 17:08:44,092 - INFO - powsybl - Simulate contingency 'coL1'\n", - "2025-09-08 17:08:44,092 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", - "2025-09-08 17:08:44,093 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 17:08:44,093 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 17:08:44,093 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 17:08:44,094 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,094 - DEBUG - powsybl - |f(x0)|=0.5691286538358685\n", - "2025-09-08 17:08:44,094 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:44,095 - DEBUG - powsybl - Jacobian matrix built in 8 us\n", - "2025-09-08 17:08:44,095 - DEBUG - powsybl - Sparse LU decomposition done in 11 us\n", - "2025-09-08 17:08:44,095 - DEBUG - powsybl - LU decomposition done in 336 us\n", - "2025-09-08 17:08:44,096 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,096 - DEBUG - powsybl - |f(x)|=0.05597916961358258\n", - "2025-09-08 17:08:44,096 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:44,096 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", - "2025-09-08 17:08:44,097 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.022981714360819472, threshold is 1.0E-10) in 4 us\n", - "2025-09-08 17:08:44,097 - DEBUG - powsybl - LU decomposition updated in 333 us\n", - "2025-09-08 17:08:44,097 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,098 - DEBUG - powsybl - |f(x)|=9.088382225742943E-4\n", - "2025-09-08 17:08:44,098 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 17:08:44,098 - DEBUG - powsybl - Jacobian matrix values updated in 5 us\n", - "2025-09-08 17:08:44,098 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.020041432758458495, threshold is 1.0E-10) in 3 us\n", - "2025-09-08 17:08:44,098 - DEBUG - powsybl - LU decomposition updated in 231 us\n", - "2025-09-08 17:08:44,137 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,137 - DEBUG - powsybl - |f(x)|=1.9847708852864974E-7\n", - "2025-09-08 17:08:44,138 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:44,138 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689675321228103, distributedActivePower=0.0))\n", - "2025-09-08 17:08:44,138 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", - "2025-09-08 17:08:44,138 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991681598489332, threshold is 1.0E-10) in 4 us\n", - "2025-09-08 17:08:44,139 - DEBUG - powsybl - LU decomposition updated in 256 us\n", - "2025-09-08 17:08:44,139 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", - "2025-09-08 17:08:44,139 - INFO - powsybl - Initial sensitivity analysis: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 17:08:44,140 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 17:08:44,140 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 17:08:44,140 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 17:08:44,140 - DEBUG - powsybl - Creating variants [InitialScenario]\n", - "2025-09-08 17:08:44,140 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", - "2025-09-08 17:08:44,141 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", - "2025-09-08 17:08:44,141 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", - "2025-09-08 17:08:44,141 - DEBUG - powsybl - Evaluating root leaf\n", - "2025-09-08 17:08:44,141 - DEBUG - powsybl - Leaf has already been evaluated\n", - "2025-09-08 17:08:44,141 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 17:08:44,141 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 17:08:44,142 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 17:08:44,142 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 17:08:44,142 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", - "2025-09-08 17:08:44,142 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 17:08:44,143 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 17:08:44,143 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 17:08:44,143 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-08 17:08:44,143 - DEBUG - powsybl - Creating variants [ContingencyScenario4f0b2e2f-8a7b-47cd-b082-157db7044d4d]\n", - "2025-09-08 17:08:44,144 - DEBUG - powsybl - Filling network pool with 4 new copies of network phaseShifter on variant ContingencyScenario4f0b2e2f-8a7b-47cd-b082-157db7044d4d\n", - "2025-09-08 17:08:44,144 - DEBUG - powsybl - Copy n°1\n", - "2025-09-08 17:08:44,144 - DEBUG - powsybl - Copy n°2\n", - "2025-09-08 17:08:44,145 - DEBUG - powsybl - Copy n°3\n", - "2025-09-08 17:08:44,146 - DEBUG - powsybl - Copy n°4\n", - "2025-09-08 17:08:44,147 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", - "2025-09-08 17:08:44,147 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", - "2025-09-08 17:08:44,147 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", - "2025-09-08 17:08:44,148 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save f43c5e79-907f-4f4c-b2df-4cf002234b08, OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", - "2025-09-08 17:08:44,148 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339]\n", - "2025-09-08 17:08:44,148 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", - "2025-09-08 17:08:44,148 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", - "2025-09-08 17:08:44,149 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", - "2025-09-08 17:08:44,149 - DEBUG - powsybl - Evaluating root leaf\n", - "2025-09-08 17:08:44,149 - DEBUG - powsybl - Leaf has already been evaluated\n", - "2025-09-08 17:08:44,150 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 17:08:44,150 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 17:08:44,150 - INFO - powsybl - Linear optimization on root leaf\n", - "2025-09-08 17:08:44,150 - INFO - powsybl - No range actions to optimize\n", - "2025-09-08 17:08:44,151 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 17:08:44,151 - INFO - powsybl - No range actions activated\n", - "2025-09-08 17:08:44,151 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 17:08:44,151 - INFO - powsybl - No network action available\n", - "2025-09-08 17:08:44,152 - INFO - powsybl - Search-tree RAO completed with status DEFAULT\n", - "2025-09-08 17:08:44,152 - INFO - powsybl - Best leaf: Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 17:08:44,152 - INFO - powsybl - Best leaf: No range actions activated\n", - "2025-09-08 17:08:44,152 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 17:08:44,153 - INFO - powsybl - Scenario \"coL1\": initial cost = 95.0 (functional: 95.0, virtual: 0.0), no remedial actions activated, cost after curative optimization = 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 17:08:44,153 - INFO - powsybl - Curative state coL1 - curative has been optimized.\n", - "2025-09-08 17:08:44,153 - DEBUG - powsybl - Remaining post-contingency scenarios to optimize: 0\n", - "2025-09-08 17:08:44,153 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant fec19a9a-e938-4ae3-8de2-b7cd66c49339'\n", - "2025-09-08 17:08:44,154 - DEBUG - powsybl - Removing variant 'SearchTreeWorkingVariantId'\n", - "2025-09-08 17:08:44,154 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-08 17:08:44,154 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", - "2025-09-08 17:08:44,155 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 17:08:44,155 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 17:08:44,155 - INFO - powsybl - Cost before RAO = 95.0 (functional: 95.0, virtual: 0.0), cost after RAO = 95.0 (functional: 95.0, virtual: 0.0)\n" + "2025-09-08 17:18:04,762 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", + "2025-09-08 17:18:04,762 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", + "2025-09-08 17:18:04,763 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:04,763 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:04,763 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:04,764 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", + "2025-09-08 17:18:04,764 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", + "2025-09-08 17:18:04,765 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:18:04,765 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", + "2025-09-08 17:18:04,765 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:18:04,766 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:04,766 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:18:04,766 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-08 17:18:04,766 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:04,767 - DEBUG - powsybl - Equations index updated (7 columns)\n", + "2025-09-08 17:18:04,767 - DEBUG - powsybl - Variables index updated (7 rows)\n", + "2025-09-08 17:18:04,767 - DEBUG - powsybl - Equation vector updated in 6 us\n", + "2025-09-08 17:18:04,768 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:18:04,768 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:04,768 - DEBUG - powsybl - Jacobian matrix built in 9 us\n", + "2025-09-08 17:18:04,769 - DEBUG - powsybl - Sparse LU decomposition done in 24 us\n", + "2025-09-08 17:18:04,769 - DEBUG - powsybl - LU decomposition done in 775 us\n", + "2025-09-08 17:18:04,770 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:04,770 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", + "2025-09-08 17:18:04,770 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:04,770 - DEBUG - powsybl - Jacobian matrix values updated in 5 us\n", + "2025-09-08 17:18:04,771 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 17:18:04,771 - DEBUG - powsybl - LU decomposition updated in 670 us\n", + "2025-09-08 17:18:04,772 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:18:04,772 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", + "2025-09-08 17:18:04,773 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:04,773 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", + "2025-09-08 17:18:04,774 - DEBUG - powsybl - Jacobian matrix values updated in 9 us\n", + "2025-09-08 17:18:04,774 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 18 us\n", + "2025-09-08 17:18:04,774 - DEBUG - powsybl - LU decomposition updated in 367 us\n", + "2025-09-08 17:18:04,775 - INFO - powsybl - Simulate contingency 'coL1'\n", + "2025-09-08 17:18:04,775 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", + "2025-09-08 17:18:04,775 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:04,776 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:18:04,776 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:18:04,776 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:04,777 - DEBUG - powsybl - |f(x0)|=0.5691286538358685\n", + "2025-09-08 17:18:04,777 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:04,777 - DEBUG - powsybl - Jacobian matrix built in 8 us\n", + "2025-09-08 17:18:04,778 - DEBUG - powsybl - Sparse LU decomposition done in 16 us\n", + "2025-09-08 17:18:04,778 - DEBUG - powsybl - LU decomposition done in 354 us\n", + "2025-09-08 17:18:04,778 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:04,779 - DEBUG - powsybl - |f(x)|=0.05597916961358258\n", + "2025-09-08 17:18:04,779 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:04,779 - DEBUG - powsybl - Jacobian matrix values updated in 5 us\n", + "2025-09-08 17:18:04,780 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.022981714360819472, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 17:18:04,780 - DEBUG - powsybl - LU decomposition updated in 315 us\n", + "2025-09-08 17:18:04,780 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:04,781 - DEBUG - powsybl - |f(x)|=9.088382225742943E-4\n", + "2025-09-08 17:18:04,781 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:18:04,781 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", + "2025-09-08 17:18:04,781 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.020041432758458495, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 17:18:04,782 - DEBUG - powsybl - LU decomposition updated in 308 us\n", + "2025-09-08 17:18:04,782 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:04,783 - DEBUG - powsybl - |f(x)|=1.9847708852864974E-7\n", + "2025-09-08 17:18:04,783 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:04,783 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689675321228103, distributedActivePower=0.0))\n", + "2025-09-08 17:18:04,784 - DEBUG - powsybl - Jacobian matrix values updated in 5 us\n", + "2025-09-08 17:18:04,784 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991681598489332, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:18:04,784 - DEBUG - powsybl - LU decomposition updated in 335 us\n", + "2025-09-08 17:18:04,785 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", + "2025-09-08 17:18:04,785 - INFO - powsybl - Initial sensitivity analysis: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:18:04,785 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:18:04,785 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:18:04,785 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", + "2025-09-08 17:18:04,786 - DEBUG - powsybl - Creating variants [InitialScenario]\n", + "2025-09-08 17:18:04,786 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 17:18:04,786 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", + "2025-09-08 17:18:04,786 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", + "2025-09-08 17:18:04,787 - DEBUG - powsybl - Evaluating root leaf\n", + "2025-09-08 17:18:04,787 - DEBUG - powsybl - Leaf has already been evaluated\n", + "2025-09-08 17:18:04,787 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:18:04,787 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:18:04,787 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", + "2025-09-08 17:18:04,787 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", + "2025-09-08 17:18:04,788 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", + "2025-09-08 17:18:04,788 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:18:04,788 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:18:04,788 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:18:04,788 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-08 17:18:04,789 - DEBUG - powsybl - Creating variants [ContingencyScenario7ce8bd6a-8322-487c-bf2f-7a043acdb02c]\n", + "2025-09-08 17:18:04,789 - DEBUG - powsybl - Filling network pool with 4 new copies of network phaseShifter on variant ContingencyScenario7ce8bd6a-8322-487c-bf2f-7a043acdb02c\n", + "2025-09-08 17:18:04,789 - DEBUG - powsybl - Copy n°1\n", + "2025-09-08 17:18:04,790 - DEBUG - powsybl - Copy n°2\n", + "2025-09-08 17:18:04,790 - DEBUG - powsybl - Copy n°3\n", + "2025-09-08 17:18:04,791 - DEBUG - powsybl - Copy n°4\n", + "2025-09-08 17:18:04,791 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 6e893c41-60da-4645-8869-f046202555cd, OpenRaoNetworkPool working variant c8c8955a-0e2f-476a-8c49-b444febd0f1d]\n", + "2025-09-08 17:18:04,791 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 6e893c41-60da-4645-8869-f046202555cd, OpenRaoNetworkPool working variant c8c8955a-0e2f-476a-8c49-b444febd0f1d]\n", + "2025-09-08 17:18:04,792 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 6e893c41-60da-4645-8869-f046202555cd, OpenRaoNetworkPool working variant c8c8955a-0e2f-476a-8c49-b444febd0f1d]\n", + "2025-09-08 17:18:04,792 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 6e893c41-60da-4645-8869-f046202555cd, OpenRaoNetworkPool working variant c8c8955a-0e2f-476a-8c49-b444febd0f1d]\n", + "2025-09-08 17:18:04,792 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant c8c8955a-0e2f-476a-8c49-b444febd0f1d]\n", + "2025-09-08 17:18:04,793 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", + "2025-09-08 17:18:04,793 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", + "2025-09-08 17:18:04,793 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", + "2025-09-08 17:18:04,794 - DEBUG - powsybl - Evaluating root leaf\n", + "2025-09-08 17:18:04,794 - DEBUG - powsybl - Leaf has already been evaluated\n", + "2025-09-08 17:18:04,794 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:18:04,795 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:18:04,795 - INFO - powsybl - Linear optimization on root leaf\n", + "2025-09-08 17:18:04,795 - INFO - powsybl - No range actions to optimize\n", + "2025-09-08 17:18:04,795 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:18:04,796 - INFO - powsybl - No range actions activated\n", + "2025-09-08 17:18:04,796 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:18:04,796 - INFO - powsybl - No network action available\n", + "2025-09-08 17:18:04,796 - INFO - powsybl - Search-tree RAO completed with status DEFAULT\n", + "2025-09-08 17:18:04,797 - INFO - powsybl - Best leaf: Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:18:04,797 - INFO - powsybl - Best leaf: No range actions activated\n", + "2025-09-08 17:18:04,797 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:18:04,797 - INFO - powsybl - Scenario \"coL1\": initial cost = 95.0 (functional: 95.0, virtual: 0.0), no remedial actions activated, cost after curative optimization = 95.0 (functional: 95.0, virtual: 0.0)\n", + "2025-09-08 17:18:04,798 - INFO - powsybl - Curative state coL1 - curative has been optimized.\n", + "2025-09-08 17:18:04,798 - DEBUG - powsybl - Remaining post-contingency scenarios to optimize: 0\n", + "2025-09-08 17:18:04,798 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant c8c8955a-0e2f-476a-8c49-b444febd0f1d'\n", + "2025-09-08 17:18:04,799 - DEBUG - powsybl - Removing variant 'SearchTreeWorkingVariantId'\n", + "2025-09-08 17:18:04,799 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-08 17:18:04,799 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", + "2025-09-08 17:18:04,799 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", + "2025-09-08 17:18:04,800 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", + "2025-09-08 17:18:04,800 - INFO - powsybl - Cost before RAO = 95.0 (functional: 95.0, virtual: 0.0), cost after RAO = 95.0 (functional: 95.0, virtual: 0.0)\n" ] } ], - "execution_count": 8 + "execution_count": 18 }, { "metadata": {}, @@ -535,8 +527,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:44.432037Z", - "start_time": "2025-09-08T15:08:44.406180Z" + "end_time": "2025-09-08T15:18:05.094268Z", + "start_time": "2025-09-08T15:18:05.068320Z" } }, "cell_type": "code", @@ -551,9 +543,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 17:08:44,407 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", - "2025-09-08 17:08:44,407 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 17:08:44,411 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:18:05,069 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", + "2025-09-08 17:18:05,070 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:18:05,072 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", @@ -650,74 +642,74 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-09-08 17:08:44,411 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 17:08:44,412 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 17:08:44,412 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 17:08:44,412 - DEBUG - powsybl - LF networks created in 0 ms\n", - "2025-09-08 17:08:44,413 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 17:08:44,413 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 17:08:44,413 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", - "2025-09-08 17:08:44,414 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 17:08:44,414 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 17:08:44,414 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 17:08:44,414 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 17:08:44,415 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 17:08:44,415 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 17:08:44,415 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:44,416 - DEBUG - powsybl - Jacobian matrix built in 11 us\n", - "2025-09-08 17:08:44,416 - DEBUG - powsybl - Sparse LU decomposition done in 21 us\n", - "2025-09-08 17:08:44,416 - DEBUG - powsybl - LU decomposition done in 272 us\n", - "2025-09-08 17:08:44,417 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,417 - DEBUG - powsybl - |f(x)|=0.08500683913618383\n", - "2025-09-08 17:08:44,417 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:44,418 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", - "2025-09-08 17:08:44,418 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668633, threshold is 1.0E-10) in 8 us\n", - "2025-09-08 17:08:44,418 - DEBUG - powsybl - LU decomposition updated in 348 us\n", - "2025-09-08 17:08:44,419 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 17:08:44,419 - DEBUG - powsybl - |f(x)|=0.0010560775453428916\n", - "2025-09-08 17:08:44,419 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 17:08:44,420 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", - "2025-09-08 17:08:44,420 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01999167090866865, threshold is 1.0E-10) in 3 us\n", - "2025-09-08 17:08:44,420 - DEBUG - powsybl - LU decomposition updated in 316 us\n", - "2025-09-08 17:08:44,420 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,421 - DEBUG - powsybl - |f(x)|=1.857490290874069E-7\n", - "2025-09-08 17:08:44,421 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:44,421 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689711101421578, distributedActivePower=0.0))\n", - "2025-09-08 17:08:44,422 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 17:08:44,422 - INFO - powsybl - Load flow ran in 14 ms\n", - "2025-09-08 17:08:44,422 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 17:08:44,423 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 17:08:44,423 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 17:08:44,424 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 17:08:44,424 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 17:08:44,425 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 17:08:44,425 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 17:08:44,425 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 17:08:44,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 17:08:44,427 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 17:08:44,427 - INFO - powsybl - Elapsed time: 9.0005E-5\n" + "2025-09-08 17:18:05,073 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:18:05,073 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 17:18:05,073 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 17:18:05,074 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:18:05,074 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:18:05,075 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:18:05,075 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", + "2025-09-08 17:18:05,075 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", + "2025-09-08 17:18:05,076 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:05,076 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:18:05,076 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:18:05,077 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:18:05,077 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:18:05,077 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:05,077 - DEBUG - powsybl - Jacobian matrix built in 11 us\n", + "2025-09-08 17:18:05,078 - DEBUG - powsybl - Sparse LU decomposition done in 21 us\n", + "2025-09-08 17:18:05,078 - DEBUG - powsybl - LU decomposition done in 345 us\n", + "2025-09-08 17:18:05,078 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:05,079 - DEBUG - powsybl - |f(x)|=0.08500683913618383\n", + "2025-09-08 17:18:05,079 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:05,079 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", + "2025-09-08 17:18:05,080 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668633, threshold is 1.0E-10) in 5 us\n", + "2025-09-08 17:18:05,080 - DEBUG - powsybl - LU decomposition updated in 302 us\n", + "2025-09-08 17:18:05,080 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:05,080 - DEBUG - powsybl - |f(x)|=0.0010560775453428916\n", + "2025-09-08 17:18:05,081 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:18:05,081 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", + "2025-09-08 17:18:05,081 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01999167090866865, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:18:05,082 - DEBUG - powsybl - LU decomposition updated in 290 us\n", + "2025-09-08 17:18:05,082 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:05,082 - DEBUG - powsybl - |f(x)|=1.857490290874069E-7\n", + "2025-09-08 17:18:05,082 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:05,083 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689711101421578, distributedActivePower=0.0))\n", + "2025-09-08 17:18:05,083 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:18:05,084 - INFO - powsybl - Load flow ran in 13 ms\n", + "2025-09-08 17:18:05,084 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:18:05,085 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:18:05,085 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:18:05,086 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:18:05,086 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:18:05,086 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:18:05,086 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:18:05,086 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:18:05,087 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", + "2025-09-08 17:18:05,087 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", + "2025-09-08 17:18:05,087 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", + "2025-09-08 17:18:05,088 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", + "2025-09-08 17:18:05,088 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", + "2025-09-08 17:18:05,088 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", + "2025-09-08 17:18:05,088 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", + "2025-09-08 17:18:05,088 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", + "2025-09-08 17:18:05,089 - INFO - powsybl - Number of steps: 139\n", + "2025-09-08 17:18:05,089 - INFO - powsybl - Elapsed time: 5.3314E-5\n" ] }, { "data": { "text/plain": [ - "" + "" ], "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n -0\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 368.1 kV / -7.7°
\n
\n
\n
\n
\n" }, - "execution_count": 9, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 9 + "execution_count": 19 }, { "metadata": {}, @@ -731,8 +723,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:44.480807Z", - "start_time": "2025-09-08T15:08:44.479550Z" + "end_time": "2025-09-08T15:18:05.141339Z", + "start_time": "2025-09-08T15:18:05.139737Z" } }, "cell_type": "code", @@ -744,8 +736,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-08T15:08:44.591232Z", - "start_time": "2025-09-08T15:08:44.529487Z" + "end_time": "2025-09-08T15:18:05.253649Z", + "start_time": "2025-09-08T15:18:05.194076Z" } }, "cell_type": "code", @@ -761,11 +753,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-08 17:08:44,531 - INFO - powsybl - ----- VOLTAGE monitoring [start]\n", - "2025-09-08 17:08:44,532 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [start]\n", - "2025-09-08 17:08:44,532 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 17:08:44,532 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 17:08:44,538 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:18:05,195 - INFO - powsybl - ----- VOLTAGE monitoring [start]\n", + "2025-09-08 17:18:05,196 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [start]\n", + "2025-09-08 17:18:05,196 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:18:05,196 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:18:05,199 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -866,49 +858,49 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 17:08:44,539 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 17:08:44,539 - DEBUG - powsybl - LF networks created in 0 ms\n", - "2025-09-08 17:08:44,540 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 17:08:44,540 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 17:08:44,540 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", - "2025-09-08 17:08:44,541 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", - "2025-09-08 17:08:44,541 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 17:08:44,541 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 17:08:44,541 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 17:08:44,542 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 17:08:44,542 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 17:08:44,542 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:44,543 - DEBUG - powsybl - Jacobian matrix built in 7 us\n", - "2025-09-08 17:08:44,543 - DEBUG - powsybl - Sparse LU decomposition done in 23 us\n", - "2025-09-08 17:08:44,543 - DEBUG - powsybl - LU decomposition done in 316 us\n", - "2025-09-08 17:08:44,544 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 17:08:44,544 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", - "2025-09-08 17:08:44,544 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:44,544 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", - "2025-09-08 17:08:44,545 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 5 us\n", - "2025-09-08 17:08:44,545 - DEBUG - powsybl - LU decomposition updated in 344 us\n", - "2025-09-08 17:08:44,545 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,546 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", - "2025-09-08 17:08:44,546 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 17:08:44,546 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", - "2025-09-08 17:08:44,546 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", - "2025-09-08 17:08:44,547 - DEBUG - powsybl - LU decomposition updated in 295 us\n", - "2025-09-08 17:08:44,547 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,547 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", - "2025-09-08 17:08:44,548 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:44,548 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3667399372342284, distributedActivePower=0.0))\n", - "2025-09-08 17:08:44,548 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 17:08:44,548 - INFO - powsybl - Load flow ran in 16 ms\n", - "2025-09-08 17:08:44,549 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 17:08:44,549 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [end]\n", - "2025-09-08 17:08:44,549 - INFO - powsybl - All VOLTAGE Cnecs are secure.\n", - "2025-09-08 17:08:44,549 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario4f0b2e2f-8a7b-47cd-b082-157db7044d4d'\n", - "2025-09-08 17:08:44,550 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 0f94c867-d2d9-4a6d-977b-7284b13bc866, OpenRaoNetworkPool working variant fc7652c5-3222-4634-9b7d-588a905107c7]\n", - "2025-09-08 17:08:44,550 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant fc7652c5-3222-4634-9b7d-588a905107c7]\n", - "2025-09-08 17:08:44,551 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'coL1 - curative' [start]\n", - "2025-09-08 17:08:44,551 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 17:08:44,551 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 17:08:44,554 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:18:05,200 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:18:05,200 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:18:05,200 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:18:05,201 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:18:05,201 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:05,201 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", + "2025-09-08 17:18:05,202 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:05,202 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:18:05,202 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:18:05,203 - DEBUG - powsybl - Equation vector updated in 5 us\n", + "2025-09-08 17:18:05,203 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:18:05,203 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:05,203 - DEBUG - powsybl - Jacobian matrix built in 7 us\n", + "2025-09-08 17:18:05,204 - DEBUG - powsybl - Sparse LU decomposition done in 20 us\n", + "2025-09-08 17:18:05,204 - DEBUG - powsybl - LU decomposition done in 326 us\n", + "2025-09-08 17:18:05,204 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,205 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", + "2025-09-08 17:18:05,205 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:05,205 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:18:05,206 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:18:05,206 - DEBUG - powsybl - LU decomposition updated in 442 us\n", + "2025-09-08 17:18:05,206 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,207 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", + "2025-09-08 17:18:05,207 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:18:05,207 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:18:05,208 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 13 us\n", + "2025-09-08 17:18:05,208 - DEBUG - powsybl - LU decomposition updated in 515 us\n", + "2025-09-08 17:18:05,208 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,209 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", + "2025-09-08 17:18:05,209 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:05,209 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3667399372342284, distributedActivePower=0.0))\n", + "2025-09-08 17:18:05,210 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:18:05,210 - INFO - powsybl - Load flow ran in 13 ms\n", + "2025-09-08 17:18:05,210 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:18:05,210 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [end]\n", + "2025-09-08 17:18:05,211 - INFO - powsybl - All VOLTAGE Cnecs are secure.\n", + "2025-09-08 17:18:05,211 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario7ce8bd6a-8322-487c-bf2f-7a043acdb02c'\n", + "2025-09-08 17:18:05,211 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 4943a583-7343-46f4-8659-47e13ee94acd, OpenRaoNetworkPool working variant 0c487c13-f3fe-454c-a397-121f4792d9a2]\n", + "2025-09-08 17:18:05,211 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant 0c487c13-f3fe-454c-a397-121f4792d9a2]\n", + "2025-09-08 17:18:05,212 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'coL1 - curative' [start]\n", + "2025-09-08 17:18:05,212 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:18:05,212 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:18:05,216 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -1009,46 +1001,46 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 17:08:44,554 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 17:08:44,555 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 17:08:44,555 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 17:08:44,556 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 17:08:44,556 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 17:08:44,556 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 17:08:44,557 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", - "2025-09-08 17:08:44,557 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", - "2025-09-08 17:08:44,557 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 17:08:44,558 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 17:08:44,558 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 17:08:44,559 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 17:08:44,559 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 17:08:44,559 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:44,560 - DEBUG - powsybl - Jacobian matrix built in 9 us\n", - "2025-09-08 17:08:44,560 - DEBUG - powsybl - Sparse LU decomposition done in 18 us\n", - "2025-09-08 17:08:44,560 - DEBUG - powsybl - LU decomposition done in 277 us\n", - "2025-09-08 17:08:44,560 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,561 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", - "2025-09-08 17:08:44,561 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:44,561 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", - "2025-09-08 17:08:44,562 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", - "2025-09-08 17:08:44,562 - DEBUG - powsybl - LU decomposition updated in 268 us\n", - "2025-09-08 17:08:44,562 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,562 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", - "2025-09-08 17:08:44,563 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 17:08:44,563 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", - "2025-09-08 17:08:44,563 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", - "2025-09-08 17:08:44,564 - DEBUG - powsybl - LU decomposition updated in 240 us\n", - "2025-09-08 17:08:44,564 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,564 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", - "2025-09-08 17:08:44,564 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:44,565 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3667399372342284, distributedActivePower=0.0))\n", - "2025-09-08 17:08:44,565 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 17:08:44,565 - INFO - powsybl - Load flow ran in 13 ms\n", - "2025-09-08 17:08:44,566 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 17:08:44,566 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"vc\": Injection L1 - 2\n", - "2025-09-08 17:08:44,566 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 17:08:44,567 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 17:08:44,569 - INFO - powsybl - Parameters:\n", + "2025-09-08 17:18:05,216 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:18:05,217 - DEBUG - powsybl - Connected components computed in 0 ms\n", + "2025-09-08 17:18:05,217 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", + "2025-09-08 17:18:05,217 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:18:05,218 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:18:05,218 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:18:05,218 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:05,219 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", + "2025-09-08 17:18:05,219 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:05,219 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:18:05,219 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:18:05,220 - DEBUG - powsybl - Equation vector updated in 3 us\n", + "2025-09-08 17:18:05,220 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:18:05,220 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:05,221 - DEBUG - powsybl - Jacobian matrix built in 7 us\n", + "2025-09-08 17:18:05,221 - DEBUG - powsybl - Sparse LU decomposition done in 19 us\n", + "2025-09-08 17:18:05,221 - DEBUG - powsybl - LU decomposition done in 252 us\n", + "2025-09-08 17:18:05,222 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:05,222 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", + "2025-09-08 17:18:05,222 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:05,222 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:18:05,223 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", + "2025-09-08 17:18:05,223 - DEBUG - powsybl - LU decomposition updated in 278 us\n", + "2025-09-08 17:18:05,223 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,223 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", + "2025-09-08 17:18:05,224 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:18:05,224 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:18:05,224 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:18:05,224 - DEBUG - powsybl - LU decomposition updated in 222 us\n", + "2025-09-08 17:18:05,225 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:05,225 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", + "2025-09-08 17:18:05,225 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:05,226 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3667399372342284, distributedActivePower=0.0))\n", + "2025-09-08 17:18:05,226 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:18:05,226 - INFO - powsybl - Load flow ran in 13 ms\n", + "2025-09-08 17:18:05,227 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:18:05,227 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"vc\": Injection L1 - 2\n", + "2025-09-08 17:18:05,227 - INFO - powsybl - Load-flow computation [start]\n", + "2025-09-08 17:18:05,228 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", + "2025-09-08 17:18:05,231 - INFO - powsybl - Parameters:\n", "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", "│ Category │ Name │ Value │\n", "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", @@ -1149,66 +1141,66 @@ "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", "│ │ voltageInitModeOverride │ NONE │\n", "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 17:08:44,569 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 17:08:44,570 - DEBUG - powsybl - LF networks created in 0 ms\n", - "2025-09-08 17:08:44,570 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 17:08:44,570 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=140.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 17:08:44,570 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", - "2025-09-08 17:08:44,571 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", - "2025-09-08 17:08:44,571 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 17:08:44,571 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 17:08:44,572 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 17:08:44,572 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 17:08:44,572 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 17:08:44,572 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:44,573 - DEBUG - powsybl - Jacobian matrix built in 5 us\n", - "2025-09-08 17:08:44,573 - DEBUG - powsybl - Sparse LU decomposition done in 15 us\n", - "2025-09-08 17:08:44,573 - DEBUG - powsybl - LU decomposition done in 274 us\n", - "2025-09-08 17:08:44,574 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,574 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", - "2025-09-08 17:08:44,574 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:44,574 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", - "2025-09-08 17:08:44,575 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", - "2025-09-08 17:08:44,575 - DEBUG - powsybl - LU decomposition updated in 328 us\n", - "2025-09-08 17:08:44,575 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,575 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", - "2025-09-08 17:08:44,576 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 17:08:44,576 - DEBUG - powsybl - Jacobian matrix values updated in 2 us\n", - "2025-09-08 17:08:44,576 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", - "2025-09-08 17:08:44,576 - DEBUG - powsybl - LU decomposition updated in 253 us\n", - "2025-09-08 17:08:44,577 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,577 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", - "2025-09-08 17:08:44,577 - DEBUG - powsybl - 40.36673993723423 MW / 40.36673993723422 MW distributed at iteration 0 to 1 generators (0 at max power, 0 at min power)\n", - "2025-09-08 17:08:44,578 - INFO - powsybl - Slack bus active power (40.36673993723422 MW) distributed in 1 distribution iteration(s)\n", - "2025-09-08 17:08:44,578 - DEBUG - powsybl - Start outer loop 'DistributedSlack' iteration 0\n", - "2025-09-08 17:08:44,578 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,578 - DEBUG - powsybl - |f(x0)|=0.40366738305544736\n", - "2025-09-08 17:08:44,579 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 17:08:44,579 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", - "2025-09-08 17:08:44,579 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 4 us\n", - "2025-09-08 17:08:44,579 - DEBUG - powsybl - LU decomposition updated in 270 us\n", - "2025-09-08 17:08:44,580 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,580 - DEBUG - powsybl - |f(x)|=0.012804250496370755\n", - "2025-09-08 17:08:44,580 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 17:08:44,580 - DEBUG - powsybl - Jacobian matrix values updated in 2 us\n", - "2025-09-08 17:08:44,581 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", - "2025-09-08 17:08:44,581 - DEBUG - powsybl - LU decomposition updated in 225 us\n", - "2025-09-08 17:08:44,581 - DEBUG - powsybl - Equation vector updated in 1 us\n", - "2025-09-08 17:08:44,581 - DEBUG - powsybl - |f(x)|=3.696679144198829E-5\n", - "2025-09-08 17:08:44,582 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:44,582 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 17:08:44,582 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=1, newtonRaphsonIterations=5, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3011552165879561, distributedActivePower=40.36673993723423))\n", - "2025-09-08 17:08:44,583 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 17:08:44,583 - INFO - powsybl - Load flow ran in 16 ms\n", - "2025-09-08 17:08:44,583 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 17:08:44,584 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'coL1 - curative' [end]\n", - "2025-09-08 17:08:44,584 - INFO - powsybl - Some VOLTAGE Cnecs are not secure:\n", - "2025-09-08 17:08:44,584 - INFO - powsybl - Network element VL2 at state coL1 - curative has a min voltage of 363.62 kV and a max voltage of 363.62 kV.\n", - "2025-09-08 17:08:44,584 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant fc7652c5-3222-4634-9b7d-588a905107c7'\n", - "2025-09-08 17:08:44,585 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool state save 0f94c867-d2d9-4a6d-977b-7284b13bc866'\n", - "2025-09-08 17:08:44,585 - INFO - powsybl - ----- VOLTAGE monitoring [end]\n", - "2025-09-08 17:08:44,585 - INFO - powsybl - Some VOLTAGE Cnecs are not secure:\n", - "2025-09-08 17:08:44,586 - INFO - powsybl - Network element VL2 at state coL1 - curative has a min voltage of 363.62 kV and a max voltage of 363.62 kV.\n" + "2025-09-08 17:18:05,231 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", + "2025-09-08 17:18:05,232 - DEBUG - powsybl - LF networks created in 0 ms\n", + "2025-09-08 17:18:05,232 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", + "2025-09-08 17:18:05,232 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=140.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", + "2025-09-08 17:18:05,233 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL2_0] (method='Most meshed bus')\n", + "2025-09-08 17:18:05,233 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL2_0 (method='First slack')\n", + "2025-09-08 17:18:05,233 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-08 17:18:05,234 - DEBUG - powsybl - Equations index updated (6 columns)\n", + "2025-09-08 17:18:05,234 - DEBUG - powsybl - Variables index updated (6 rows)\n", + "2025-09-08 17:18:05,234 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:05,234 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", + "2025-09-08 17:18:05,235 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:05,235 - DEBUG - powsybl - Jacobian matrix built in 7 us\n", + "2025-09-08 17:18:05,235 - DEBUG - powsybl - Sparse LU decomposition done in 12 us\n", + "2025-09-08 17:18:05,236 - DEBUG - powsybl - LU decomposition done in 311 us\n", + "2025-09-08 17:18:05,236 - DEBUG - powsybl - Equation vector updated in 2 us\n", + "2025-09-08 17:18:05,236 - DEBUG - powsybl - |f(x)|=0.08620220271786033\n", + "2025-09-08 17:18:05,237 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:05,237 - DEBUG - powsybl - Jacobian matrix values updated in 3 us\n", + "2025-09-08 17:18:05,237 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:18:05,237 - DEBUG - powsybl - LU decomposition updated in 228 us\n", + "2025-09-08 17:18:05,237 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,238 - DEBUG - powsybl - |f(x)|=0.0010693405956603969\n", + "2025-09-08 17:18:05,238 - DEBUG - powsybl - Start iteration 2\n", + "2025-09-08 17:18:05,239 - DEBUG - powsybl - Jacobian matrix values updated in 2 us\n", + "2025-09-08 17:18:05,239 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:18:05,239 - DEBUG - powsybl - LU decomposition updated in 222 us\n", + "2025-09-08 17:18:05,239 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,239 - DEBUG - powsybl - |f(x)|=1.8534582905074213E-7\n", + "2025-09-08 17:18:05,240 - DEBUG - powsybl - 40.36673993723423 MW / 40.36673993723422 MW distributed at iteration 0 to 1 generators (0 at max power, 0 at min power)\n", + "2025-09-08 17:18:05,240 - INFO - powsybl - Slack bus active power (40.36673993723422 MW) distributed in 1 distribution iteration(s)\n", + "2025-09-08 17:18:05,241 - DEBUG - powsybl - Start outer loop 'DistributedSlack' iteration 0\n", + "2025-09-08 17:18:05,241 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,241 - DEBUG - powsybl - |f(x0)|=0.40366738305544736\n", + "2025-09-08 17:18:05,241 - DEBUG - powsybl - Start iteration 0\n", + "2025-09-08 17:18:05,242 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", + "2025-09-08 17:18:05,242 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 3 us\n", + "2025-09-08 17:18:05,242 - DEBUG - powsybl - LU decomposition updated in 232 us\n", + "2025-09-08 17:18:05,243 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,243 - DEBUG - powsybl - |f(x)|=0.012804250496370755\n", + "2025-09-08 17:18:05,243 - DEBUG - powsybl - Start iteration 1\n", + "2025-09-08 17:18:05,243 - DEBUG - powsybl - Jacobian matrix values updated in 2 us\n", + "2025-09-08 17:18:05,244 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991670908668668, threshold is 1.0E-10) in 2 us\n", + "2025-09-08 17:18:05,244 - DEBUG - powsybl - LU decomposition updated in 291 us\n", + "2025-09-08 17:18:05,244 - DEBUG - powsybl - Equation vector updated in 1 us\n", + "2025-09-08 17:18:05,244 - DEBUG - powsybl - |f(x)|=3.696679144198829E-5\n", + "2025-09-08 17:18:05,245 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:05,245 - DEBUG - powsybl - Already balanced\n", + "2025-09-08 17:18:05,245 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=1, newtonRaphsonIterations=5, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3011552165879561, distributedActivePower=40.36673993723423))\n", + "2025-09-08 17:18:05,246 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", + "2025-09-08 17:18:05,246 - INFO - powsybl - Load flow ran in 17 ms\n", + "2025-09-08 17:18:05,246 - INFO - powsybl - Load-flow computation [end]\n", + "2025-09-08 17:18:05,247 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'coL1 - curative' [end]\n", + "2025-09-08 17:18:05,247 - INFO - powsybl - Some VOLTAGE Cnecs are not secure:\n", + "2025-09-08 17:18:05,247 - INFO - powsybl - Network element VL2 at state coL1 - curative has a min voltage of 363.62 kV and a max voltage of 363.62 kV.\n", + "2025-09-08 17:18:05,248 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant 0c487c13-f3fe-454c-a397-121f4792d9a2'\n", + "2025-09-08 17:18:05,248 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool state save 4943a583-7343-46f4-8659-47e13ee94acd'\n", + "2025-09-08 17:18:05,248 - INFO - powsybl - ----- VOLTAGE monitoring [end]\n", + "2025-09-08 17:18:05,249 - INFO - powsybl - Some VOLTAGE Cnecs are not secure:\n", + "2025-09-08 17:18:05,249 - INFO - powsybl - Network element VL2 at state coL1 - curative has a min voltage of 363.62 kV and a max voltage of 363.62 kV.\n" ] }, { @@ -1217,12 +1209,12 @@ "text": [ " cnec_id min_voltage max_voltage margin\n", "index \n", - "0 vc 363.622121 363.622121 -13.622121\n", + "1 vc 363.622121 363.622121 -13.622121\n", "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'auto': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'curative': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [{'voltageCnecId': 'vc', 'curative': {'kilovolt': {'margin': -13.62}}}], 'networkActionResults': [{'networkActionId': 'Injection L1 - 2', 'activatedStates': [{'instant': 'curative', 'contingency': 'coL1'}]}], 'rangeActionResults': []}\n" ] } ], - "execution_count": 10 + "execution_count": 20 } ], "metadata": { From c7b4610f1f45c92c962142f52c8b5ab52f17ad18 Mon Sep 17 00:00:00 2001 From: Philippe Edwards Date: Thu, 11 Sep 2025 09:08:15 +0200 Subject: [PATCH 17/18] add qr codes Signed-off-by: Philippe Edwards --- images/notebook_qr.jpg | Bin 0 -> 550729 bytes images/read_the_docs_qr.jpg | Bin 0 -> 564116 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/notebook_qr.jpg create mode 100644 images/read_the_docs_qr.jpg diff --git a/images/notebook_qr.jpg b/images/notebook_qr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ac34e59291be8dd0d9b4926f81a0b4c82ee3443 GIT binary patch literal 550729 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�G!>lz?A9YhaX7~*D1xPJr_1d0XS^|Rv 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

e|fc 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%0AZpuN^Sd0-^}SWmC#GmH=1Cme>Guvz$ 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

Zab~Y} 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 Xv7Uz%-R7D!eD}ua-)^R){yFr&WQn(% literal 0 HcmV?d00001 diff --git a/images/read_the_docs_qr.jpg b/images/read_the_docs_qr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..361088c0f07c2d71b825ae1abdb4adcd4b94e385 GIT binary patch literal 564116 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

rM`son{s++1>Uu<@Cx2oB=^vQH_@;U1 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

" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 13 - }, - { - "cell_type": "code", - "id": "3caddf0e6ed1d7e0", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:12:04.255132Z", - "start_time": "2025-09-08T14:12:04.252805Z" - } - }, - "source": [], - "outputs": [], - "execution_count": null - }, - { - "cell_type": "markdown", - "id": "78577c35", - "metadata": {}, - "source": [ - "## II) VOLTAGE MONITORING\n", - "\n", - "TODO : blabla" - ] - }, - { - "cell_type": "code", - "id": "5aac37d1e047ee89", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:12:04.365215Z", - "start_time": "2025-09-08T14:12:04.261578Z" - } - }, - "source": [ - "network_3 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", - "rao_runner_3 = pp.rao.create_rao()\n", - "rao_runner_3.set_crac_file_source(network_3, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_no_RA.json\")\n", - "rao_result_3 = rao_runner_3.run(network_3, parameters)\n", - "print(rao_result_3.to_json())\n", - "result_with_voltage_monitoring = rao_runner_3.run_voltage_monitoring(network_3, rao_result_3, load_flow_parameters, \"OpenLoadFlow\")\n", - "df_voltage_cnecs = result_with_voltage_monitoring.get_voltage_cnec_results()\n", - "print(df_voltage_cnecs[['cnec_id', 'min_voltage', 'max_voltage', 'margin']])\n", - "print(result_with_voltage_monitoring.to_json())" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:12:04,266 - DEBUG - powsybl - XIIDM import done in 2 ms\n", - "2025-09-08 16:12:04,272 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 16:12:04,273 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 16:12:04,273 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,274 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,275 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,275 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,277 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", - "2025-09-08 16:12:04,277 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 16:12:04,278 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 16:12:04,279 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 16:12:04,280 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:12:04,280 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:12:04,281 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:12:04,282 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:12:04,283 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 16:12:04,284 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:12:04,285 - DEBUG - powsybl - Equations index updated (7 columns)\n", - "2025-09-08 16:12:04,285 - DEBUG - powsybl - Variables index updated (7 rows)\n", - "2025-09-08 16:12:04,286 - DEBUG - powsybl - Equation vector updated in 10 us\n", - "2025-09-08 16:12:04,287 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 16:12:04,288 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:12:04,288 - DEBUG - powsybl - Jacobian matrix built in 14 us\n", - "2025-09-08 16:12:04,289 - DEBUG - powsybl - Sparse LU decomposition done in 38 us\n", - "2025-09-08 16:12:04,289 - DEBUG - powsybl - LU decomposition done in 577 us\n", - "2025-09-08 16:12:04,290 - DEBUG - powsybl - Equation vector updated in 6 us\n", - "2025-09-08 16:12:04,291 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 16:12:04,291 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:12:04,292 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", - "2025-09-08 16:12:04,292 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 11 us\n", - "2025-09-08 16:12:04,293 - DEBUG - powsybl - LU decomposition updated in 552 us\n", - "2025-09-08 16:12:04,294 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,294 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 16:12:04,295 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:12:04,295 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:12:04,296 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", - "2025-09-08 16:12:04,297 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 9 us\n", - "2025-09-08 16:12:04,297 - DEBUG - powsybl - LU decomposition updated in 859 us\n", - "2025-09-08 16:12:04,298 - INFO - powsybl - Simulate contingency 'coL1'\n", - "2025-09-08 16:12:04,299 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", - "2025-09-08 16:12:04,300 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:12:04,300 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 16:12:04,301 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 16:12:04,301 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,302 - DEBUG - powsybl - |f(x0)|=0.5691286538358685\n", - "2025-09-08 16:12:04,303 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:12:04,304 - DEBUG - powsybl - Jacobian matrix built in 19 us\n", - "2025-09-08 16:12:04,304 - DEBUG - powsybl - Sparse LU decomposition done in 27 us\n", - "2025-09-08 16:12:04,305 - DEBUG - powsybl - LU decomposition done in 644 us\n", - "2025-09-08 16:12:04,306 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,306 - DEBUG - powsybl - |f(x)|=0.05597916961358258\n", - "2025-09-08 16:12:04,307 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:12:04,308 - DEBUG - powsybl - Jacobian matrix values updated in 14 us\n", - "2025-09-08 16:12:04,308 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.022981714360819472, threshold is 1.0E-10) in 12 us\n", - "2025-09-08 16:12:04,309 - DEBUG - powsybl - LU decomposition updated in 602 us\n", - "2025-09-08 16:12:04,309 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 16:12:04,310 - DEBUG - powsybl - |f(x)|=9.088382225742943E-4\n", - "2025-09-08 16:12:04,311 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 16:12:04,311 - DEBUG - powsybl - Jacobian matrix values updated in 10 us\n", - "2025-09-08 16:12:04,312 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.020041432758458495, threshold is 1.0E-10) in 8 us\n", - "2025-09-08 16:12:04,312 - DEBUG - powsybl - LU decomposition updated in 576 us\n", - "2025-09-08 16:12:04,313 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 16:12:04,313 - DEBUG - powsybl - |f(x)|=1.9847708852864974E-7\n", - "2025-09-08 16:12:04,314 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:12:04,315 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689675321228103, distributedActivePower=0.0))\n", - "2025-09-08 16:12:04,315 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", - "2025-09-08 16:12:04,316 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019991681598489332, threshold is 1.0E-10) in 8 us\n", - "2025-09-08 16:12:04,316 - DEBUG - powsybl - LU decomposition updated in 580 us\n", - "2025-09-08 16:12:04,317 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", - "2025-09-08 16:12:04,317 - INFO - powsybl - Initial sensitivity analysis: cost = 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,318 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,318 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,318 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 16:12:04,319 - DEBUG - powsybl - Creating variants [InitialScenario]\n", - "2025-09-08 16:12:04,319 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", - "2025-09-08 16:12:04,320 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", - "2025-09-08 16:12:04,320 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", - "2025-09-08 16:12:04,321 - DEBUG - powsybl - Evaluating root leaf\n", - "2025-09-08 16:12:04,321 - DEBUG - powsybl - Leaf has already been evaluated\n", - "2025-09-08 16:12:04,322 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,322 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,322 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,323 - INFO - powsybl - Linear optimization on root leaf\n", - "2025-09-08 16:12:04,323 - INFO - powsybl - No range actions to optimize\n", - "2025-09-08 16:12:04,323 - INFO - powsybl - Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,323 - INFO - powsybl - No range actions activated\n", - "2025-09-08 16:12:04,324 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,324 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,324 - INFO - powsybl - No network action available\n", - "2025-09-08 16:12:04,325 - INFO - powsybl - Search-tree RAO completed with status DEFAULT\n", - "2025-09-08 16:12:04,325 - INFO - powsybl - Best leaf: Root leaf, cost: 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,325 - INFO - powsybl - Best leaf: No range actions activated\n", - "2025-09-08 16:12:04,326 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,326 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,326 - INFO - powsybl - Scenario \"preventive\": initial cost = 95.0 (functional: 95.0, virtual: 0.0), no remedial actions activated, cost after preventive optimization = 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,327 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 16:12:04,327 - INFO - powsybl - Limiting element #01: margin = -95.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,328 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,328 - INFO - powsybl - Cost before RAO = 95.0 (functional: 95.0, virtual: 0.0), cost after RAO = 95.0 (functional: 95.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,330 - INFO - powsybl - ----- VOLTAGE monitoring [start]\n", - "2025-09-08 16:12:04,330 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [start]\n", - "2025-09-08 16:12:04,331 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:12:04,331 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:12:04,336 - INFO - powsybl - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ false │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ extrapolateReactiveLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ forceTargetQInReactiveLimits │ false │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ false │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ true │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", - "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", - "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", - "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", - "│ │ │ GR, PT, PL, ME] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ false │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ false │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", - "│ │ │ SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:12:04,338 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:12:04,338 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 16:12:04,339 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 16:12:04,340 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 16:12:04,340 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:12:04,341 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:12:04,342 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:12:04,342 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:12:04,343 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:12:04,343 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 16:12:04,344 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 16:12:04,344 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,345 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 16:12:04,346 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:12:04,346 - DEBUG - powsybl - Jacobian matrix built in 19 us\n", - "2025-09-08 16:12:04,347 - DEBUG - powsybl - Sparse LU decomposition done in 33 us\n", - "2025-09-08 16:12:04,347 - DEBUG - powsybl - LU decomposition done in 600 us\n", - "2025-09-08 16:12:04,348 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 16:12:04,348 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 16:12:04,349 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:12:04,350 - DEBUG - powsybl - Jacobian matrix values updated in 17 us\n", - "2025-09-08 16:12:04,350 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 9 us\n", - "2025-09-08 16:12:04,351 - DEBUG - powsybl - LU decomposition updated in 606 us\n", - "2025-09-08 16:12:04,352 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,353 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 16:12:04,353 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:12:04,354 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:12:04,354 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 16:12:04,355 - INFO - powsybl - Load flow ran in 23 ms\n", - "2025-09-08 16:12:04,355 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:12:04,356 - INFO - powsybl - -- 'VOLTAGE' Monitoring at state 'preventive' [end]\n", - "2025-09-08 16:12:04,356 - INFO - powsybl - All VOLTAGE Cnecs are secure.\n", - "2025-09-08 16:12:04,357 - INFO - powsybl - Using base network 'phaseShifter' on variant 'PreventiveScenario'\n", - "2025-09-08 16:12:04,357 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 59773d77-0a23-489b-9f0e-b8fa1461f002, OpenRaoNetworkPool working variant d3c75ad4-d95a-416e-ae36-f7026cc33bec]\n", - "2025-09-08 16:12:04,358 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant d3c75ad4-d95a-416e-ae36-f7026cc33bec]\n", - "2025-09-08 16:12:04,359 - INFO - powsybl - ----- VOLTAGE monitoring [end]\n", - "2025-09-08 16:12:04,359 - INFO - powsybl - VOLTAGE monitoring failed due to a load flow divergence or an inconsistency in the crac or in the parameters.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': 95.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'auto': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}, 'curative': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 175.35}}, 'megawatt': {'margin': -95.0, 'side2': {'flow': 100.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [], 'rangeActionResults': []}\n", - " cnec_id min_voltage max_voltage margin\n", - "index \n", - "0 vc NaN NaN NaN\n", - "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'failure', 'executionDetails': 'The RAO only went through first preventive'}\n" - ] - } - ], - "execution_count": 14 - }, - { - "cell_type": "code", - "id": "74e054af", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:12:04.392871Z", - "start_time": "2025-09-08T14:12:04.390830Z" - } - }, - "source": [ - "# network_4 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", - "# rao_runner_4 = pp.rao.create_rao()\n", - "# rao_runner_4.set_crac_file_source(network_4, \"./data/rao/angle_monitoring/voltage_monitoring_simple_case_with_RA_on_load.json\")\n", - "# rao_result_4 = rao_runner_4.run(network_4, parameters)\n", - "# result_with_voltage_monitoring_2 = rao_runner_4.run_voltage_monitoring(network_4, rao_result_4, load_flow_parameters, \"OpenLoadFlow\")\n", - "# df_voltage_cnecs_2 = result_with_voltage_monitoring_2.get_voltage_cnec_results()\n", - "# print(df_voltage_cnecs_2[['cnec_id', 'min_voltage', 'max_voltage', 'margin']])\n", - "# print(result_with_voltage_monitoring_2.to_json())" - ], - "outputs": [], - "execution_count": 15 - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.0rc1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -}

hZ7 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 z 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 <$0@K;a_)Qk@T@eKCQM!2zcoj8m+ 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⪙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 literal 0 HcmV?d00001 From 0c5ad54d30edc2666dba54bd2d0438d8dbd35216 Mon Sep 17 00:00:00 2001 From: Godelaine de Montmorillon Date: Fri, 12 Sep 2025 21:06:54 +0200 Subject: [PATCH 18/18] delete old notebook --- open_rao_monitoring.ipynb | 1652 ------------------------------------- 1 file changed, 1652 deletions(-) delete mode 100644 open_rao_monitoring.ipynb diff --git a/open_rao_monitoring.ipynb b/open_rao_monitoring.ipynb deleted file mode 100644 index 55017af..0000000 --- a/open_rao_monitoring.ipynb +++ /dev/null @@ -1,1652 +0,0 @@ -{ - "cells": [ - { - "metadata": {}, - "cell_type": "markdown", - "source": "# OpenRAO monitoring in pyPowsybl", - "id": "39034e89c83d500c" - }, - { - "metadata": {}, - "cell_type": "markdown", - "source": [ - "In this notebook, we'll explore how OpenRao monitoring algorithms work. \n", - "For network situations with angle or voltage overloads, the monitoring module will try to relieve these constraints by applying remedial actions. \n", - "\n", - "The first step is to install pypowsybl and import the library." - ], - "id": "86ce5a5ff1fe71aa" - }, - { - "cell_type": "code", - "id": "6cea1dbd7b6ce7f", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:05.454937Z", - "start_time": "2025-09-08T14:21:05.452802Z" - } - }, - "source": [ - "#pip install pypowsybl==1.12.0" - ], - "outputs": [], - "execution_count": 1 - }, - { - "cell_type": "code", - "id": "e3edbce5fc8fe4c6", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.220235Z", - "start_time": "2025-09-08T14:21:05.497122Z" - } - }, - "source": [ - "import pypowsybl as pp\n", - "from pypowsybl.rao import Parameters as RaoParameters" - ], - "outputs": [], - "execution_count": 2 - }, - { - "metadata": {}, - "cell_type": "markdown", - "source": "", - "id": "a0d6a6098210fa02" - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.325503Z", - "start_time": "2025-09-08T14:21:06.323042Z" - } - }, - "cell_type": "code", - "source": [ - "# set up logging\n", - "import logging\n", - "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')\n", - "logging.getLogger('powsybl').setLevel(logging.DEBUG)" - ], - "id": "a9a59bb03b3ad3ed", - "outputs": [], - "execution_count": 3 - }, - { - "cell_type": "markdown", - "id": "eda73ac35599f2e5", - "metadata": {}, - "source": [ - "## I) ANGLE MONITORING\n", - "\n", - "Let's load a simple 3 node network.\n", - "- VL1 voltage level contains a generator producing 100 MW.\n", - "- VL2 voltage level contains a load consuming 100 MW.\n", - "- VL1 and VL3 are connected by a PST.\n", - "- VL2 and VL3 are connected by 2 lines, one of with has infinite resistance : that's why it has no power flowing through it." - ] - }, - { - "cell_type": "code", - "id": "d923fa57b4d80171", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.447969Z", - "start_time": "2025-09-08T14:21:06.373104Z" - } - }, - "source": [ - "network = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", - "network.get_network_area_diagram()" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:21:06,379 - INFO - powsybl - Using platform configuration provider classic\n", - "2025-09-08 16:21:06,382 - INFO - powsybl - Platform configuration defined by .properties files of directory /home/demontmorillongod/.itools\n", - "2025-09-08 16:21:06,394 - INFO - powsybl - LocalComputationConfig [localDir=/tmp, availableCore=1]\n", - "2025-09-08 16:21:06,405 - INFO - powsybl - Configuring StAX XMLInputFactory...\n", - "2025-09-08 16:21:06,405 - INFO - powsybl - Some properties may not be supported by your implementation.\n", - "2025-09-08 16:21:06,405 - INFO - powsybl - This may not be a problem because some are overlapping.\n", - "2025-09-08 16:21:06,408 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/property/accessExternalStylesheet\n", - "2025-09-08 16:21:06,408 - INFO - powsybl - - Property unsupported by StAX implementation: http://javax.xml.XMLConstants/feature/secure-processing\n", - "2025-09-08 16:21:06,414 - DEBUG - powsybl - XIIDM import done in 5 ms\n", - "2025-09-08 16:21:06,415 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:21:06,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 16:21:06,426 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 16:21:06,427 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 16:21:06,428 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 16:21:06,428 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 16:21:06,429 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 16:21:06,429 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 16:21:06,430 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:21:06,430 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 16:21:06,430 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 16:21:06,430 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 16:21:06,431 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 16:21:06,433 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 16:21:06,433 - INFO - powsybl - Elapsed time: 1.08263E-4\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 4 - }, - { - "cell_type": "markdown", - "id": "ce005f42855370fb", - "metadata": {}, - "source": [ - "Now, let's run a loadflow on this network.\n", - "?? POURQUOI FLUX DEJA AFFICHES ? => c'est un iddm" - ] - }, - { - "cell_type": "code", - "id": "e37a9b29dce42548", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.520335Z", - "start_time": "2025-09-08T14:21:06.475871Z" - } - }, - "source": [ - "pp.loadflow.run_ac(network)\n", - "network.get_network_area_diagram()" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:21:06,479 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", - "2025-09-08 16:21:06,480 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:21:06,485 - INFO - powsybl - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ true │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ extrapolateReactiveLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ forceTargetQInReactiveLimits │ false │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ false │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ false │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", - "│ │ countriesToBalance │ [] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ true │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ true │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-09-08 16:21:06,486 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:21:06,487 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 16:21:06,487 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 16:21:06,492 - DEBUG - powsybl - LF networks created in 5 ms\n", - "2025-09-08 16:21:06,492 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:21:06,493 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:21:06,493 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:21:06,494 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:21:06,494 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:21:06,496 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 16:21:06,496 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 16:21:06,497 - DEBUG - powsybl - Equation vector updated in 251 us\n", - "2025-09-08 16:21:06,497 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 16:21:06,497 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:21:06,500 - DEBUG - powsybl - Jacobian matrix built in 2256 us\n", - "2025-09-08 16:21:06,501 - DEBUG - powsybl - Sparse LU decomposition done in 89 us\n", - "2025-09-08 16:21:06,501 - DEBUG - powsybl - LU decomposition done in 537 us\n", - "2025-09-08 16:21:06,502 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,502 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 16:21:06,502 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:21:06,503 - DEBUG - powsybl - Jacobian matrix values updated in 26 us\n", - "2025-09-08 16:21:06,503 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 18 us\n", - "2025-09-08 16:21:06,504 - DEBUG - powsybl - LU decomposition updated in 314 us\n", - "2025-09-08 16:21:06,504 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,504 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 16:21:06,505 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:21:06,505 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:21:06,507 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 16:21:06,507 - INFO - powsybl - Load flow ran in 25 ms\n", - "2025-09-08 16:21:06,508 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:21:06,509 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 16:21:06,509 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 16:21:06,510 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 16:21:06,511 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 16:21:06,511 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:21:06,511 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 16:21:06,512 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 16:21:06,513 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 16:21:06,513 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 16:21:06,513 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 16:21:06,514 - INFO - powsybl - Elapsed time: 1.0453E-4\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 50\n \n \n \n \n \n \n \n \n \n \n \n -50\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 385.7 kV / -3.7°
\n
\n
\n
VL3
\n
\n 392.6 kV / -1.8°
\n
\n
\n
\n
\n" - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 5 - }, - { - "cell_type": "markdown", - "id": "90a656ec77b5fff2", - "metadata": {}, - "source": [ - "The monitoring algorithm is run after a RAO has been run, on a network on which are applied the remedial actions optimized during the RAO to optimize flow CNECs. \n", - "To relieve Angle/Voltage CNECs, we won't be optimizing remedial actions because modelling the impact of remedial actions on angle/voltage values is highly complex and non linear. Instead, we'll be checking application conditions and applying remedial actions until CNECs are relieved.\n", - "\n", - "To run a monitoring, we need to load the following inputs:" - ] - }, - { - "cell_type": "code", - "id": "2602f3b7325812ca", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.572192Z", - "start_time": "2025-09-08T14:21:06.564565Z" - } - }, - "source": [ - "parameters = RaoParameters()\n", - "parameters.load_from_file_source(\"./data/rao/rao_parameters.json\")\n", - "load_flow_parameters = parameters.loadflow_and_sensitivity_parameters.sensitivity_parameters.load_flow_parameters" - ], - "outputs": [], - "execution_count": 6 - }, - { - "cell_type": "code", - "id": "62e8576fcdedacf8", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.620081Z", - "start_time": "2025-09-08T14:21:06.617790Z" - } - }, - "source": [], - "outputs": [], - "execution_count": null - }, - { - "cell_type": "markdown", - "id": "c8c25cdba7a37a83", - "metadata": {}, - "source": [ - "As stated previously, first we'll run a rao and save the rao_result. This rao_result will be used to load activated remedial actions during the monitoring module." - ] - }, - { - "cell_type": "code", - "id": "4e5f0e41497f9f69", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.685859Z", - "start_time": "2025-09-08T14:21:06.668054Z" - } - }, - "source": [ - "rao_runner = pp.rao.create_rao()\n", - "rao_runner.set_crac_file_source(network, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_RA_on_load.json\")" - ], - "outputs": [], - "execution_count": 7 - }, - { - "cell_type": "code", - "id": "979b8cf1fa67a46b", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.783735Z", - "start_time": "2025-09-08T14:21:06.720290Z" - } - }, - "source": [ - "rao_result = rao_runner.run(network, parameters)" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:21:06,745 - WARNING - powsybl - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-09-08 16:21:06,747 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", - "2025-09-08 16:21:06,748 - DEBUG - powsybl - LF networks created in 0 ms\n", - "2025-09-08 16:21:06,748 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:21:06,748 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:21:06,749 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", - "2025-09-08 16:21:06,749 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:21:06,750 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 16:21:06,750 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:21:06,750 - DEBUG - powsybl - Equations index updated (7 columns)\n", - "2025-09-08 16:21:06,751 - DEBUG - powsybl - Variables index updated (7 rows)\n", - "2025-09-08 16:21:06,751 - DEBUG - powsybl - Equation vector updated in 7 us\n", - "2025-09-08 16:21:06,752 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 16:21:06,752 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:21:06,752 - DEBUG - powsybl - Jacobian matrix built in 14 us\n", - "2025-09-08 16:21:06,753 - DEBUG - powsybl - Sparse LU decomposition done in 26 us\n", - "2025-09-08 16:21:06,753 - DEBUG - powsybl - LU decomposition done in 379 us\n", - "2025-09-08 16:21:06,753 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 16:21:06,754 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 16:21:06,754 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:21:06,754 - DEBUG - powsybl - Jacobian matrix values updated in 9 us\n", - "2025-09-08 16:21:06,755 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 12 us\n", - "2025-09-08 16:21:06,755 - DEBUG - powsybl - LU decomposition updated in 357 us\n", - "2025-09-08 16:21:06,755 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,756 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 16:21:06,756 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:21:06,757 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:21:06,757 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", - "2025-09-08 16:21:06,757 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 8 us\n", - "2025-09-08 16:21:06,758 - DEBUG - powsybl - LU decomposition updated in 364 us\n", - "2025-09-08 16:21:06,758 - INFO - powsybl - Simulate contingency 'coL1'\n", - "2025-09-08 16:21:06,759 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", - "2025-09-08 16:21:06,759 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:21:06,759 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,760 - DEBUG - powsybl - |f(x0)|=0.5589790207946416\n", - "2025-09-08 16:21:06,760 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:21:06,760 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", - "2025-09-08 16:21:06,761 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 0.0) in 12 us\n", - "2025-09-08 16:21:06,761 - DEBUG - powsybl - LU decomposition updated in 289 us\n", - "2025-09-08 16:21:06,761 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,762 - DEBUG - powsybl - |f(x)|=0.045758144886857484\n", - "2025-09-08 16:21:06,762 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:21:06,762 - DEBUG - powsybl - Jacobian matrix values updated in 9 us\n", - "2025-09-08 16:21:06,763 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01927928160698629, threshold is 1.0E-10) in 6 us\n", - "2025-09-08 16:21:06,763 - DEBUG - powsybl - LU decomposition updated in 374 us\n", - "2025-09-08 16:21:06,764 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,764 - DEBUG - powsybl - |f(x)|=4.383228928430377E-4\n", - "2025-09-08 16:21:06,764 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 16:21:06,765 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", - "2025-09-08 16:21:06,765 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019982805021482284, threshold is 1.0E-10) in 5 us\n", - "2025-09-08 16:21:06,765 - DEBUG - powsybl - LU decomposition updated in 363 us\n", - "2025-09-08 16:21:06,766 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 16:21:06,766 - DEBUG - powsybl - |f(x)|=3.173654213673744E-8\n", - "2025-09-08 16:21:06,766 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:21:06,767 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", - "2025-09-08 16:21:06,767 - DEBUG - powsybl - Jacobian matrix values updated in 7 us\n", - "2025-09-08 16:21:06,768 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01999167027640859, threshold is 1.0E-10) in 6 us\n", - "2025-09-08 16:21:06,768 - DEBUG - powsybl - LU decomposition updated in 403 us\n", - "2025-09-08 16:21:06,768 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", - "2025-09-08 16:21:06,769 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:21:06,770 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:21:06,770 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:21:06,770 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 16:21:06,771 - DEBUG - powsybl - Creating variants [InitialScenario]\n", - "2025-09-08 16:21:06,771 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", - "2025-09-08 16:21:06,772 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", - "2025-09-08 16:21:06,773 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", - "2025-09-08 16:21:06,773 - DEBUG - powsybl - Evaluating root leaf\n", - "2025-09-08 16:21:06,773 - DEBUG - powsybl - Leaf has already been evaluated\n", - "2025-09-08 16:21:06,774 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:21:06,774 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:21:06,774 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:21:06,775 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 16:21:06,775 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", - "2025-09-08 16:21:06,776 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:21:06,776 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:21:06,776 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:21:06,777 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-08 16:21:06,777 - DEBUG - powsybl - Creating variants [ContingencyScenario89419b62-9a4a-47a3-b529-7c6e8f73ab88]\n", - "2025-09-08 16:21:06,777 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario89419b62-9a4a-47a3-b529-7c6e8f73ab88'\n", - "2025-09-08 16:21:06,778 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 404e7ed6-41e8-4f32-bdb2-be3207ff9d70, OpenRaoNetworkPool working variant f29263d9-2cd3-4e65-aef7-7263707c6586]\n", - "2025-09-08 16:21:06,778 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant f29263d9-2cd3-4e65-aef7-7263707c6586]\n", - "2025-09-08 16:21:06,779 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", - "2025-09-08 16:21:06,779 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", - "2025-09-08 16:21:06,779 - DEBUG - powsybl - Remaining post-contingency scenarios to optimize: 0\n", - "2025-09-08 16:21:06,780 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant f29263d9-2cd3-4e65-aef7-7263707c6586'\n", - "2025-09-08 16:21:06,780 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool state save 404e7ed6-41e8-4f32-bdb2-be3207ff9d70'\n", - "2025-09-08 16:21:06,780 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-08 16:21:06,781 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", - "2025-09-08 16:21:06,782 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:21:06,782 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:21:06,782 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n" - ] - } - ], - "execution_count": 8 - }, - { - "cell_type": "markdown", - "id": "d0a5624d1e9b3d7", - "metadata": {}, - "source": [ - "In this case, no remedial actions were applied during the RAO, the network was already secure." - ] - }, - { - "cell_type": "markdown", - "id": "ec951ddcb84a44b7", - "metadata": {}, - "source": [ - "We'll also need a GLSK file to perform redispatching to balance the network following the application of remedial actions. Angle remedial actions are indeed injection actions on generators or loads. " - ] - }, - { - "cell_type": "code", - "id": "a8e68de35a37a9eb", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.831046Z", - "start_time": "2025-09-08T14:21:06.825671Z" - } - }, - "source": [ - "rao_runner.set_glsk_file_source(network, \"./data/rao/angle_monitoring/GlskB45test.xml\")" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:21:06,828 - INFO - powsybl - CIM GLSK importer could import this document.\n" - ] - } - ], - "execution_count": 9 - }, - { - "cell_type": "markdown", - "id": "126c2b1ed673c6fc", - "metadata": {}, - "source": [ - "Before running the angle monitoring algorithm, let's look at the angle cnec's situation in the network. As you can see in the crac, AngleCnec acCru1 is defined between exporting element VL2 and importing element VL1, at curative instant after contingency coL1 that disconnects line L1. A minimum threshold is defined at -6°. Let's look at the network after disconnecting L1:" - ] - }, - { - "cell_type": "code", - "id": "eb94026815d908e7", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.914990Z", - "start_time": "2025-09-08T14:21:06.878559Z" - } - }, - "source": [ - "network.disconnect(\"L1\")\n", - "pp.loadflow.run_ac(network)\n", - "network.get_network_area_diagram()" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:21:06,881 - INFO - powsybl - loadflow provider used is : OpenLoadFlow\n", - "2025-09-08 16:21:06,883 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:21:06,889 - INFO - powsybl - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬──────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼──────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ true │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ extrapolateReactiveLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ forceTargetQInReactiveLimits │ false │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ false │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ false │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P_MAX │\n", - "│ │ countriesToBalance │ [] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ true │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ true │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴──────────────────────────────────┘\n", - "2025-09-08 16:21:06,890 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:21:06,891 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 16:21:06,891 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 16:21:06,892 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 16:21:06,892 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 16:21:06,892 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:21:06,893 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Network extension bus')\n", - "2025-09-08 16:21:06,893 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:21:06,894 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:21:06,894 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 16:21:06,894 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 16:21:06,895 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:21:06,895 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 16:21:06,895 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:21:06,896 - DEBUG - powsybl - Jacobian matrix built in 11 us\n", - "2025-09-08 16:21:06,896 - DEBUG - powsybl - Sparse LU decomposition done in 25 us\n", - "2025-09-08 16:21:06,897 - DEBUG - powsybl - LU decomposition done in 377 us\n", - "2025-09-08 16:21:06,897 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,897 - DEBUG - powsybl - |f(x)|=0.11000183389812845\n", - "2025-09-08 16:21:06,897 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:21:06,898 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", - "2025-09-08 16:21:06,898 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.017570936140841497, threshold is 1.0E-10) in 5 us\n", - "2025-09-08 16:21:06,899 - DEBUG - powsybl - LU decomposition updated in 341 us\n", - "2025-09-08 16:21:06,899 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,899 - DEBUG - powsybl - |f(x)|=0.0012926250446475146\n", - "2025-09-08 16:21:06,900 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 16:21:06,900 - DEBUG - powsybl - Jacobian matrix values updated in 4 us\n", - "2025-09-08 16:21:06,900 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01996280301305678, threshold is 1.0E-10) in 4 us\n", - "2025-09-08 16:21:06,901 - DEBUG - powsybl - LU decomposition updated in 467 us\n", - "2025-09-08 16:21:06,901 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:21:06,901 - DEBUG - powsybl - |f(x)|=2.692707635455752E-7\n", - "2025-09-08 16:21:06,902 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:21:06,902 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689771093529304, distributedActivePower=0.0))\n", - "2025-09-08 16:21:06,903 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 16:21:06,903 - INFO - powsybl - Load flow ran in 19 ms\n", - "2025-09-08 16:21:06,904 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:21:06,904 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 16:21:06,905 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 16:21:06,906 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 16:21:06,906 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 16:21:06,906 - INFO - powsybl - Loading component library from /DefaultLibrary...\n", - "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/load.svg\n", - "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/battery.svg\n", - "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/generator.svg\n", - "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/capacitor.svg\n", - "2025-09-08 16:21:06,907 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/inductor.svg\n", - "2025-09-08 16:21:06,908 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/svc.svg\n", - "2025-09-08 16:21:06,908 - DEBUG - powsybl - Reading subComponent /DefaultLibrary/unknown-component.svg\n", - "2025-09-08 16:21:06,908 - INFO - powsybl - Number of steps: 139\n", - "2025-09-08 16:21:06,908 - INFO - powsybl - Elapsed time: 9.8802E-5\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 100\n \n \n \n \n \n \n \n \n \n \n \n -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 400.0 kV / 0.0°
\n
\n
\n
VL2
\n
\n 368.1 kV / -7.7°
\n
\n
\n
VL3
\n
\n 383.2 kV / -3.7°
\n
\n
\n
\n
\n" - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 10 - }, - { - "cell_type": "code", - "id": "337c3b32db277f93", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:21:06.964625Z", - "start_time": "2025-09-08T14:21:06.961758Z" - } - }, - "source": [ - "# network.connect(\"L1\")" - ], - "outputs": [], - "execution_count": 11 - }, - { - "cell_type": "markdown", - "id": "308a0b8c33bc09de", - "metadata": {}, - "source": [ - "AngleCnec is unsecure acCur1 is unsecure with an angle of -7.7 < -6°.\n", - "Now let's run the angle monitoring algorithm." - ] - }, - { - "cell_type": "code", - "id": "3a8f9fc4911af245", - "metadata": { - "jupyter": { - "is_executing": true - }, - "ExecuteTime": { - "start_time": "2025-09-08T14:21:07.009631Z" - } - }, - "source": [ - "result_with_angle_monitoring = rao_runner.run_angle_monitoring(network, rao_result, load_flow_parameters, \"OpenLoadFlow\")\n", - "df_angle_cnecs = result_with_angle_monitoring.get_angle_cnec_results()\n", - "df_angle_cnecs[['cnec_id', 'angle', 'margin']]" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:21:07,013 - INFO - powsybl - ----- ANGLE monitoring [start]\n", - "2025-09-08 16:21:07,015 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", - "2025-09-08 16:21:07,015 - INFO - powsybl - Load-flow computation [start]\n" - ] - } - ], - "execution_count": null - }, - { - "cell_type": "markdown", - "id": "624e989b754dc4c6", - "metadata": {}, - "source": [ - "During the monitoring algorithm, a network action was applied, setting load LD2's value to 50 MW. The monitoring algorithm tried to perform the opposite redispatching action to maintain network balance, but scaling failed in our case, most likely because the network is so small. Balance was achieved during load flow computation via slack redistribution. \n", - "Applied network action made AngleCnec acCur1 secure, by shifting its' angle from -7.7° to -3.8°.\n", - "\n", - "Only load actions and generator actions can be used to relieve angle cnecs. In the following example, a topological action is defined (open L3) but it isn't even considered to relieve AngleCnec acCur1." - ] - }, - { - "cell_type": "code", - "id": "8ecc842841490184", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-08T14:12:04.170010Z", - "start_time": "2025-09-08T14:12:04.028710Z" - } - }, - "source": [ - "network_2 = pp.network.load(\"./data/rao/angle_monitoring/network.xiidm\")\n", - "rao_runner_2 = pp.rao.create_rao()\n", - "rao_runner_2.set_crac_file_source(network_2, \"./data/rao/angle_monitoring/angle_monitoring_simple_case_with_topo.json\")\n", - "rao_result_2 = rao_runner_2.run(network_2, parameters)\n", - "print(rao_result_2.to_json())\n", - "rao_runner_2.set_glsk_file_source(network_2, \"./data/rao/angle_monitoring/GlskB45test.xml\")\n", - "result_with_angle_monitoring_2 = rao_runner_2.run_angle_monitoring(network_2, rao_result_2, load_flow_parameters, \"OpenLoadFlow\")\n", - "df_angle_cnecs_2 = result_with_angle_monitoring_2.get_angle_cnec_results()\n", - "df_angle_cnecs_2[['cnec_id', 'angle', 'margin']]" - ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-09-08 16:12:04,034 - DEBUG - powsybl - XIIDM import done in 2 ms\n", - "2025-09-08 16:12:04,039 - WARNING - powsybl - Running RAO using Open RAO version 6.7.0-SNAPSHOT from git commit ea80e63634c4ff2038696d4ca76f99ed861d1263.\n", - "2025-09-08 16:12:04,040 - WARNING - powsybl - Non re-optimizing curative range actions is deprecated. Curative range actions re-optimization will be mandatory in a future OpenRAO version.\n", - "2025-09-08 16:12:04,040 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,041 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,041 - WARNING - powsybl - A threshold for the flowCnec cnec1 - curative is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,042 - WARNING - powsybl - A threshold for the flowCnec cnec1 - preventive is defined in MW but the loadflow computation is in AC. It will be imprecisely converted by the RAO which could create uncoherent results due to side effects\n", - "2025-09-08 16:12:04,042 - DEBUG - powsybl - Systematic sensitivity analysis [start]\n", - "2025-09-08 16:12:04,042 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 16:12:04,043 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 16:12:04,044 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 16:12:04,044 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:12:04,045 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:12:04,045 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:12:04,046 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:12:04,046 - INFO - powsybl - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-08 16:12:04,047 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:12:04,047 - DEBUG - powsybl - Equations index updated (7 columns)\n", - "2025-09-08 16:12:04,048 - DEBUG - powsybl - Variables index updated (7 rows)\n", - "2025-09-08 16:12:04,048 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,049 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 16:12:04,050 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:12:04,050 - DEBUG - powsybl - Jacobian matrix built in 14 us\n", - "2025-09-08 16:12:04,051 - DEBUG - powsybl - Sparse LU decomposition done in 27 us\n", - "2025-09-08 16:12:04,051 - DEBUG - powsybl - LU decomposition done in 573 us\n", - "2025-09-08 16:12:04,052 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 16:12:04,052 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 16:12:04,053 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:12:04,053 - DEBUG - powsybl - Jacobian matrix values updated in 11 us\n", - "2025-09-08 16:12:04,054 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 9 us\n", - "2025-09-08 16:12:04,054 - DEBUG - powsybl - LU decomposition updated in 585 us\n", - "2025-09-08 16:12:04,055 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 16:12:04,055 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 16:12:04,056 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:12:04,056 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:12:04,057 - DEBUG - powsybl - Jacobian matrix values updated in 11 us\n", - "2025-09-08 16:12:04,057 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 1.0E-10) in 7 us\n", - "2025-09-08 16:12:04,058 - DEBUG - powsybl - LU decomposition updated in 565 us\n", - "2025-09-08 16:12:04,058 - INFO - powsybl - Simulate contingency 'coL1'\n", - "2025-09-08 16:12:04,059 - DEBUG - powsybl - Contingency 'coL1' without loss of connectivity\n", - "2025-09-08 16:12:04,060 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:12:04,060 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 16:12:04,061 - DEBUG - powsybl - |f(x0)|=0.5589790207946416\n", - "2025-09-08 16:12:04,061 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:12:04,062 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", - "2025-09-08 16:12:04,062 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019992185618309375, threshold is 0.0) in 13 us\n", - "2025-09-08 16:12:04,063 - DEBUG - powsybl - LU decomposition updated in 556 us\n", - "2025-09-08 16:12:04,063 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 16:12:04,064 - DEBUG - powsybl - |f(x)|=0.045758144886857484\n", - "2025-09-08 16:12:04,065 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:12:04,066 - DEBUG - powsybl - Jacobian matrix values updated in 15 us\n", - "2025-09-08 16:12:04,066 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01927928160698629, threshold is 1.0E-10) in 8 us\n", - "2025-09-08 16:12:04,067 - DEBUG - powsybl - LU decomposition updated in 604 us\n", - "2025-09-08 16:12:04,067 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 16:12:04,068 - DEBUG - powsybl - |f(x)|=4.383228928430377E-4\n", - "2025-09-08 16:12:04,069 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 16:12:04,070 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", - "2025-09-08 16:12:04,070 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019982805021482284, threshold is 1.0E-10) in 10 us\n", - "2025-09-08 16:12:04,071 - DEBUG - powsybl - LU decomposition updated in 631 us\n", - "2025-09-08 16:12:04,072 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 16:12:04,072 - DEBUG - powsybl - |f(x)|=3.173654213673744E-8\n", - "2025-09-08 16:12:04,073 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:12:04,074 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3689737523340897, distributedActivePower=0.0))\n", - "2025-09-08 16:12:04,074 - DEBUG - powsybl - Jacobian matrix values updated in 8 us\n", - "2025-09-08 16:12:04,075 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.01999167027640859, threshold is 1.0E-10) in 7 us\n", - "2025-09-08 16:12:04,075 - DEBUG - powsybl - LU decomposition updated in 459 us\n", - "2025-09-08 16:12:04,076 - DEBUG - powsybl - Systematic sensitivity analysis [end]\n", - "2025-09-08 16:12:04,076 - INFO - powsybl - Initial sensitivity analysis: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,077 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,077 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,077 - INFO - powsybl - ----- Preventive perimeter optimization [start]\n", - "2025-09-08 16:12:04,078 - DEBUG - powsybl - Creating variants [InitialScenario]\n", - "2025-09-08 16:12:04,078 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", - "2025-09-08 16:12:04,079 - DEBUG - powsybl - Creating variants [SecondPreventiveScenario]\n", - "2025-09-08 16:12:04,079 - DEBUG - powsybl - Creating variants [SearchTreeWorkingVariantId]\n", - "2025-09-08 16:12:04,080 - DEBUG - powsybl - Evaluating root leaf\n", - "2025-09-08 16:12:04,080 - DEBUG - powsybl - Leaf has already been evaluated\n", - "2025-09-08 16:12:04,080 - INFO - powsybl - Stop criterion reached on Root leaf, cost: -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:12:04,081 - INFO - powsybl - Limiting element #01: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,081 - INFO - powsybl - Scenario \"preventive\": initial cost = -49.99 (functional: -49.99, virtual: 0.0), no remedial actions activated, cost after preventive optimization = -49.99 (functional: -49.99, virtual: 0.0)\n", - "2025-09-08 16:12:04,082 - INFO - powsybl - ----- Preventive perimeter optimization [end]\n", - "2025-09-08 16:12:04,082 - DEBUG - powsybl - Creating variants [PreventiveScenario]\n", - "2025-09-08 16:12:04,083 - INFO - powsybl - Systematic sensitivity analysis after preventive remedial actions: cost = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,083 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,084 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,084 - INFO - powsybl - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-08 16:12:04,085 - DEBUG - powsybl - Creating variants [ContingencyScenario221b6988-6083-4d8a-be57-49c9ee9931f7]\n", - "2025-09-08 16:12:04,085 - DEBUG - powsybl - Filling network pool with 4 new copies of network phaseShifter on variant ContingencyScenario221b6988-6083-4d8a-be57-49c9ee9931f7\n", - "2025-09-08 16:12:04,085 - DEBUG - powsybl - Copy n°1\n", - "2025-09-08 16:12:04,086 - DEBUG - powsybl - Copy n°2\n", - "2025-09-08 16:12:04,087 - DEBUG - powsybl - Copy n°3\n", - "2025-09-08 16:12:04,088 - DEBUG - powsybl - Copy n°4\n", - "2025-09-08 16:12:04,088 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", - "2025-09-08 16:12:04,089 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", - "2025-09-08 16:12:04,090 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", - "2025-09-08 16:12:04,091 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save b57d92f1-5714-4621-9b6e-b44a608eb8b4, OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", - "2025-09-08 16:12:04,092 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611]\n", - "2025-09-08 16:12:04,092 - INFO - powsybl - Optimizing scenario post-contingency coL1.\n", - "2025-09-08 16:12:04,093 - INFO - powsybl - Optimizing curative state coL1 - curative.\n", - "2025-09-08 16:12:04,094 - DEBUG - powsybl - Remaining post-contingency scenarios to optimize: 0\n", - "2025-09-08 16:12:04,094 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant 6187fc1e-7018-42c6-b5a7-04e23cec0611'\n", - "2025-09-08 16:12:04,095 - INFO - powsybl - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-08 16:12:04,095 - INFO - powsybl - Merging preventive and post-contingency RAO results:\n", - "2025-09-08 16:12:04,096 - INFO - powsybl - Limiting element #01: margin = 5.0 MW, element L1 at state coL1 - curative, CNEC ID = \"cnec1 - curative\"\n", - "2025-09-08 16:12:04,096 - INFO - powsybl - Limiting element #02: margin = 49.99 MW, element L1 at state preventive, CNEC ID = \"cnec1 - preventive\"\n", - "2025-09-08 16:12:04,097 - INFO - powsybl - Cost before RAO = -5.0 (functional: -5.0, virtual: 0.0), cost after RAO = -5.0 (functional: -5.0, virtual: 0.0)\n", - "2025-09-08 16:12:04,100 - INFO - powsybl - CIM GLSK importer could import this document.\n", - "2025-09-08 16:12:04,102 - INFO - powsybl - ----- ANGLE monitoring [start]\n", - "2025-09-08 16:12:04,102 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [start]\n", - "2025-09-08 16:12:04,103 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:12:04,104 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:12:04,110 - INFO - powsybl - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ false │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ extrapolateReactiveLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ forceTargetQInReactiveLimits │ false │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ false │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ true │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", - "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", - "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", - "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", - "│ │ │ GR, PT, PL, ME] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ false │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ false │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", - "│ │ │ SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:12:04,111 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:12:04,112 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 16:12:04,113 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 16:12:04,114 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 16:12:04,114 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 4 branches\n", - "2025-09-08 16:12:04,115 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:12:04,115 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL1_0] (method='Most meshed bus')\n", - "2025-09-08 16:12:04,116 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL1_0 (method='First slack')\n", - "2025-09-08 16:12:04,116 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:12:04,117 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 16:12:04,117 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 16:12:04,118 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,118 - DEBUG - powsybl - |f(x0)|=1.1192721220071966\n", - "2025-09-08 16:12:04,119 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:12:04,119 - DEBUG - powsybl - Jacobian matrix built in 19 us\n", - "2025-09-08 16:12:04,120 - DEBUG - powsybl - Sparse LU decomposition done in 35 us\n", - "2025-09-08 16:12:04,121 - DEBUG - powsybl - LU decomposition done in 984 us\n", - "2025-09-08 16:12:04,122 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,122 - DEBUG - powsybl - |f(x)|=0.06774610629906617\n", - "2025-09-08 16:12:04,123 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:12:04,124 - DEBUG - powsybl - Jacobian matrix values updated in 14 us\n", - "2025-09-08 16:12:04,124 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.019395586280388767, threshold is 1.0E-10) in 9 us\n", - "2025-09-08 16:12:04,125 - DEBUG - powsybl - LU decomposition updated in 491 us\n", - "2025-09-08 16:12:04,126 - DEBUG - powsybl - Equation vector updated in 5 us\n", - "2025-09-08 16:12:04,126 - DEBUG - powsybl - |f(x)|=2.0052326218707072E-4\n", - "2025-09-08 16:12:04,127 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:12:04,128 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=2, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.17787785586249605, distributedActivePower=0.0))\n", - "2025-09-08 16:12:04,128 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 16:12:04,129 - INFO - powsybl - Load flow ran in 24 ms\n", - "2025-09-08 16:12:04,129 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:12:04,130 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'preventive' [end]\n", - "2025-09-08 16:12:04,130 - INFO - powsybl - All ANGLE Cnecs are secure.\n", - "2025-09-08 16:12:04,130 - INFO - powsybl - Using base network 'phaseShifter' on variant 'ContingencyScenario221b6988-6083-4d8a-be57-49c9ee9931f7'\n", - "2025-09-08 16:12:04,131 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool state save 35e0d8b2-ba1d-49c7-ace1-0e6a3b58c7af, OpenRaoNetworkPool working variant 78f1a179-b863-4e53-9d6f-e7648a85361d]\n", - "2025-09-08 16:12:04,131 - DEBUG - powsybl - Creating variants [OpenRaoNetworkPool working variant 78f1a179-b863-4e53-9d6f-e7648a85361d]\n", - "2025-09-08 16:12:04,132 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [start]\n", - "2025-09-08 16:12:04,132 - INFO - powsybl - Load-flow computation [start]\n", - "2025-09-08 16:12:04,133 - INFO - powsybl - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.16.0, gitVersion=9f4cb68a4139a1a5db7353e4b81ae590377f3096, gitBranch=UNKNOWN, buildTimestamp=2025-07-10T12:40:12.650Z}\n", - "2025-09-08 16:12:04,138 - INFO - powsybl - Parameters:\n", - "┌───────────────────────────┬───────────────────────────────────────────────────────────┬────────────────────────────────┐\n", - "│ Category │ Name │ Value │\n", - "├───────────────────────────┼───────────────────────────────────────────────────────────┼────────────────────────────────┤\n", - "│ Automation │ simulateAutomationSystems │ false │\n", - "│ DC │ dcApproximationType │ IGNORE_R │\n", - "│ │ dcPowerFactor │ 1.0 │\n", - "│ │ dcUseTransformerRatio │ false │\n", - "│ Debug │ alwaysUpdateNetwork │ false │\n", - "│ │ debugDir │ │\n", - "│ FastRestart │ actionableSwitchesIds │ [] │\n", - "│ │ actionableTransformersIds │ [] │\n", - "│ │ networkCacheEnabled │ false │\n", - "│ GeneratorVoltageControl │ disableInconsistentVoltageControls │ false │\n", - "│ │ disableVoltageControlOfGeneratorsOutsideActivePowerLimits │ false │\n", - "│ │ extrapolateReactiveLimits │ false │\n", - "│ │ fictitiousGeneratorVoltageControlCheckMode │ FORCED │\n", - "│ │ forceTargetQInReactiveLimits │ false │\n", - "│ │ reactiveLimitsMaxPqPvSwitch │ 3 │\n", - "│ │ reactivePowerDispatchMode │ Q_EQUAL_PROPORTION │\n", - "│ │ reactiveRangeCheckMode │ MAX │\n", - "│ │ svcVoltageMonitoring │ true │\n", - "│ │ voltagePerReactivePowerControl │ false │\n", - "│ │ voltageRemoteControl │ true │\n", - "│ │ voltageRemoteControlRobustMode │ true │\n", - "│ HVDC │ hvdcAcEmulation │ true │\n", - "│ Model │ asymmetrical │ false │\n", - "│ │ dc │ false │\n", - "│ │ linePerUnitMode │ IMPEDANCE │\n", - "│ │ lowImpedanceBranchMode │ REPLACE_BY_ZERO_IMPEDANCE_LINE │\n", - "│ │ lowImpedanceThreshold │ 1.0E-8 │\n", - "│ │ twtSplitShuntAdmittance │ true │\n", - "│ │ useLoadModel │ false │\n", - "│ NewtonKrylov │ maxNewtonKrylovIterations │ 100 │\n", - "│ │ newtonKrylovLineSearch │ false │\n", - "│ NewtonRaphson │ lineSearchStateVectorScalingMaxIteration │ 10 │\n", - "│ │ lineSearchStateVectorScalingStepFold │ 1.3333333333333333 │\n", - "│ │ maxActivePowerMismatch │ 0.01 │\n", - "│ │ maxAngleMismatch │ 1.0E-5 │\n", - "│ │ maxNewtonRaphsonIterations │ 15 │\n", - "│ │ maxRatioMismatch │ 1.0E-5 │\n", - "│ │ maxReactivePowerMismatch │ 0.01 │\n", - "│ │ maxSusceptanceMismatch │ 1.0E-4 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDphi │ 0.17453292519943295 │\n", - "│ │ maxVoltageChangeStateVectorScalingMaxDv │ 0.1 │\n", - "│ │ maxVoltageMismatch │ 1.0E-4 │\n", - "│ │ newtonRaphsonConvEpsPerEq │ 1.0E-4 │\n", - "│ │ newtonRaphsonStoppingCriteriaType │ UNIFORM_CRITERIA │\n", - "│ │ stateVectorScalingMode │ NONE │\n", - "│ OuterLoops │ maxOuterLoopIterations │ 20 │\n", - "│ │ outerLoopNames │ │\n", - "│ Performance │ computedConnectedComponentScope │ MAIN │\n", - "│ PhaseControl │ phaseShifterControlMode │ CONTINUOUS_WITH_DISCRETISATION │\n", - "│ │ phaseShifterRegulationOn │ false │\n", - "│ ReactivePowerControl │ generatorReactivePowerRemoteControl │ false │\n", - "│ │ transformerReactivePowerControl │ false │\n", - "│ ReferenceBus │ referenceBusSelectionMode │ FIRST_SLACK │\n", - "│ │ writeReferenceTerminals │ true │\n", - "│ Reporting │ reportedFeatures │ [] │\n", - "│ ShuntVoltageControl │ shuntCompensatorVoltageControlOn │ false │\n", - "│ │ shuntVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ SlackDistribution │ areaInterchangeControl │ false │\n", - "│ │ areaInterchangeControlAreaType │ ControlArea │\n", - "│ │ areaInterchangePMaxMismatch │ 2.0 │\n", - "│ │ balanceType │ PROPORTIONAL_TO_GENERATION_P │\n", - "│ │ countriesToBalance │ [TR, RO, BE, AT, FR, SK, BG, │\n", - "│ │ │ NL, CH, HU, MK, IT, HR, RS, │\n", - "│ │ │ UA, BA, SI, CZ, AL, ES, DE, │\n", - "│ │ │ GR, PT, PL, ME] │\n", - "│ │ distributedSlack │ true │\n", - "│ │ loadPowerFactorConstant │ false │\n", - "│ │ maxSlackBusCount │ 1 │\n", - "│ │ mostMeshedSlackBusSelectorMaxNominalVoltagePercentile │ 95.0 │\n", - "│ │ plausibleActivePowerLimit │ 5000.0 │\n", - "│ │ readSlackBus │ false │\n", - "│ │ slackBusCountryFilter │ [] │\n", - "│ │ slackBusPMaxMismatch │ 1.0 │\n", - "│ │ slackBusSelectionMode │ MOST_MESHED │\n", - "│ │ slackBusesIds │ [] │\n", - "│ │ slackDistributionFailureBehavior │ LEAVE_ON_SLACK_BUS │\n", - "│ │ useActiveLimits │ true │\n", - "│ │ writeSlackBus │ false │\n", - "│ Solver │ acSolverType │ NEWTON_RAPHSON │\n", - "│ TransformerVoltageControl │ generatorVoltageControlMinNominalVoltage │ -1.0 │\n", - "│ │ incrementalTransformerRatioTapControlOuterLoopMaxTapShift │ 3 │\n", - "│ │ transformerVoltageControlMode │ WITH_GENERATOR_VOLTAGE_CONTROL │\n", - "│ │ transformerVoltageControlOn │ false │\n", - "│ │ transformerVoltageControlUseInitialTapPosition │ false │\n", - "│ VoltageControls │ maxPlausibleTargetVoltage │ 1.2 │\n", - "│ │ maxRealisticVoltage │ 2.0 │\n", - "│ │ minNominalVoltageRealisticVoltageCheck │ 0.0 │\n", - "│ │ minNominalVoltageTargetVoltageCheck │ 20.0 │\n", - "│ │ minPlausibleTargetVoltage │ 0.8 │\n", - "│ │ minRealisticVoltage │ 0.5 │\n", - "│ │ secondaryVoltageControl │ false │\n", - "│ │ useReactiveLimits │ true │\n", - "│ │ voltageTargetPriorities │ [GENERATOR, TRANSFORMER, │\n", - "│ │ │ SHUNT] │\n", - "│ VoltageInit │ voltageInitMode │ UNIFORM_VALUES │\n", - "│ │ voltageInitModeOverride │ NONE │\n", - "└───────────────────────────┴───────────────────────────────────────────────────────────┴────────────────────────────────┘\n", - "2025-09-08 16:12:04,139 - INFO - powsybl - Outer loops: [DistributedSlack, VoltageMonitoring, ReactiveLimits]\n", - "2025-09-08 16:12:04,139 - DEBUG - powsybl - Connected components computed in 0 ms\n", - "2025-09-08 16:12:04,140 - DEBUG - powsybl - Synchronous components computed in 0 ms\n", - "2025-09-08 16:12:04,141 - DEBUG - powsybl - LF networks created in 1 ms\n", - "2025-09-08 16:12:04,141 - INFO - powsybl - Network {CC0 SC0} has 3 buses and 3 branches\n", - "2025-09-08 16:12:04,142 - INFO - powsybl - Network {CC0 SC0} balance: active generation=100.0 MW, active load=100.0 MW, reactive generation=0.0 MVar, reactive load=50.0 MVar\n", - "2025-09-08 16:12:04,143 - INFO - powsybl - Network {CC0 SC0}, slack buses are [VL3_0] (method='Most meshed bus')\n", - "2025-09-08 16:12:04,143 - INFO - powsybl - Network {CC0 SC0}, reference bus is VL3_0 (method='First slack')\n", - "2025-09-08 16:12:04,143 - INFO - powsybl - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-08 16:12:04,144 - DEBUG - powsybl - Equations index updated (6 columns)\n", - "2025-09-08 16:12:04,145 - DEBUG - powsybl - Variables index updated (6 rows)\n", - "2025-09-08 16:12:04,146 - DEBUG - powsybl - Equation vector updated in 4 us\n", - "2025-09-08 16:12:04,146 - DEBUG - powsybl - |f(x0)|=1.5009230770104418\n", - "2025-09-08 16:12:04,147 - DEBUG - powsybl - Start iteration 0\n", - "2025-09-08 16:12:04,147 - DEBUG - powsybl - Jacobian matrix built in 9 us\n", - "2025-09-08 16:12:04,148 - DEBUG - powsybl - Sparse LU decomposition done in 27 us\n", - "2025-09-08 16:12:04,148 - DEBUG - powsybl - LU decomposition done in 461 us\n", - "2025-09-08 16:12:04,149 - DEBUG - powsybl - Equation vector updated in 3 us\n", - "2025-09-08 16:12:04,149 - DEBUG - powsybl - |f(x)|=0.10925791776346036\n", - "2025-09-08 16:12:04,149 - DEBUG - powsybl - Start iteration 1\n", - "2025-09-08 16:12:04,150 - DEBUG - powsybl - Jacobian matrix values updated in 6 us\n", - "2025-09-08 16:12:04,151 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.0498038566424256, threshold is 1.0E-10) in 8 us\n", - "2025-09-08 16:12:04,151 - DEBUG - powsybl - LU decomposition updated in 470 us\n", - "2025-09-08 16:12:04,151 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:12:04,152 - DEBUG - powsybl - |f(x)|=0.0011152726117064607\n", - "2025-09-08 16:12:04,152 - DEBUG - powsybl - Start iteration 2\n", - "2025-09-08 16:12:04,153 - DEBUG - powsybl - Jacobian matrix values updated in 5 us\n", - "2025-09-08 16:12:04,153 - DEBUG - powsybl - Sparse LU decomposition updated (refactor rgrowth is 0.051579562453853936, threshold is 1.0E-10) in 6 us\n", - "2025-09-08 16:12:04,154 - DEBUG - powsybl - LU decomposition updated in 485 us\n", - "2025-09-08 16:12:04,154 - DEBUG - powsybl - Equation vector updated in 2 us\n", - "2025-09-08 16:12:04,154 - DEBUG - powsybl - |f(x)|=2.071601116602223E-7\n", - "2025-09-08 16:12:04,155 - DEBUG - powsybl - Already balanced\n", - "2025-09-08 16:12:04,156 - INFO - powsybl - AC loadflow complete on network {CC0 SC0} (result=AcLoadFlowResult(outerLoopIterations=0, newtonRaphsonIterations=3, solverStatus=CONVERGED, outerLoopStatus=STABLE, slackBusActivePowerMismatch=0.3679344606782542, distributedActivePower=0.0))\n", - "2025-09-08 16:12:04,157 - DEBUG - powsybl - Network {CC0 SC0}, IIDM network updated in 0 ms\n", - "2025-09-08 16:12:04,157 - INFO - powsybl - Load flow ran in 23 ms\n", - "2025-09-08 16:12:04,158 - INFO - powsybl - Load-flow computation [end]\n", - "2025-09-08 16:12:04,158 - WARNING - powsybl - Remedial action Open L1 - 2 of AngleCnec acCur1 is ignored : it has an elementary action that's not an injection setpoint.\n", - "2025-09-08 16:12:04,159 - INFO - powsybl - Applied the following remedial action(s) in order to reduce constraints on CNEC \"acCur1\": \n", - "2025-09-08 16:12:04,159 - INFO - powsybl - -- 'ANGLE' Monitoring at state 'coL1 - curative' [end]\n", - "2025-09-08 16:12:04,160 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", - "2025-09-08 16:12:04,160 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n", - "2025-09-08 16:12:04,161 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool working variant 78f1a179-b863-4e53-9d6f-e7648a85361d'\n", - "2025-09-08 16:12:04,162 - DEBUG - powsybl - Removing variant 'OpenRaoNetworkPool state save 35e0d8b2-ba1d-49c7-ace1-0e6a3b58c7af'\n", - "2025-09-08 16:12:04,162 - INFO - powsybl - ----- ANGLE monitoring [end]\n", - "2025-09-08 16:12:04,162 - INFO - powsybl - Some ANGLE Cnecs are not secure:\n", - "2025-09-08 16:12:04,163 - INFO - powsybl - AngleCnec acCur1 (with importing network element VL1 and exporting network element VL2) at state coL1 - curative has an angle of -7.71°.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'type': 'RAO_RESULT', 'version': '1.8', 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao', 'computationStatus': 'default', 'executionDetails': 'The RAO only went through first preventive', 'costResults': {'initial': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'preventive': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'outage': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'auto': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}, 'curative': {'functionalCost': -5.0, 'virtualCost': {'sensitivity-failure-cost': 0.0}}}, 'computationStatusMap': [], 'flowCnecResults': [{'flowCnecId': 'cnec1 - curative', 'initial': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'preventive': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'auto': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}, 'curative': {'megawatt': {'margin': 5.0, 'side2': {'flow': 0.0}}}}, {'flowCnecId': 'cnec1 - preventive', 'initial': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}, 'preventive': {'ampere': {'margin': 1.7976931348623157e+308, 'side2': {'flow': 83.68}}, 'megawatt': {'margin': 49.99, 'side2': {'flow': 50.01}}}}], 'angleCnecResults': [], 'voltageCnecResults': [], 'networkActionResults': [], 'rangeActionResults': []}\n" - ] - }, - { - "data": { - "text/plain": [ - " cnec_id angle margin\n", - "index \n", - "1 acCur1 -7.713852 -4.713852" - ], - "text/html": [ - "