From 9af264cb6e30a1265589cf98061db3658f22549d Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Mon, 15 Sep 2025 13:05:29 +0200 Subject: [PATCH 01/27] Add requirements files back Signed-off-by: Florian Dupuy --- requirements.in | 2 ++ requirements.txt | 84 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 requirements.in diff --git a/requirements.in b/requirements.in new file mode 100644 index 0000000..75ec8d9 --- /dev/null +++ b/requirements.in @@ -0,0 +1,2 @@ +pypowsybl==1.12.0 +pypowsybl-jupyter==1.2.1 diff --git a/requirements.txt b/requirements.txt index b422c2f..158d24f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,83 @@ -# needed by pypowsybl-jupyter, for Binder -anywidget +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile requirements.in +# +anywidget==0.9.18 + # via pypowsybl-jupyter +asttokens==3.0.0 + # via stack-data +comm==0.2.3 + # via ipywidgets +decorator==5.2.1 + # via ipython +exceptiongroup==1.3.0 + # via ipython +executing==2.2.1 + # via stack-data +ipython==8.37.0 + # via ipywidgets +ipywidgets==8.1.7 + # via anywidget +jedi==0.19.2 + # via ipython +jupyterlab-widgets==3.0.15 + # via ipywidgets +matplotlib-inline==0.1.7 + # via ipython +networkx==3.4.2 + # via pypowsybl +numpy==2.2.6 + # via pandas +pandas==2.3.2 + # via pypowsybl +parso==0.8.5 + # via jedi +pexpect==4.9.0 + # via ipython +prettytable==3.16.0 + # via pypowsybl +prompt-toolkit==3.0.52 + # via ipython +psygnal==0.14.1 + # via anywidget +ptyprocess==0.7.0 + # via pexpect +pure-eval==0.2.3 + # via stack-data +pygments==2.19.2 + # via ipython +pypowsybl==1.12.0 + # via + # -r requirements.in + # pypowsybl-jupyter +pypowsybl-jupyter==1.2.1 + # via -r requirements.in +python-dateutil==2.9.0.post0 + # via pandas +pytz==2025.2 + # via pandas +six==1.17.0 + # via python-dateutil +stack-data==0.6.3 + # via ipython +traitlets==5.14.3 + # via + # ipython + # ipywidgets + # matplotlib-inline +typing-extensions==4.15.0 + # via + # anywidget + # exceptiongroup + # ipython +tzdata==2025.2 + # via pandas +wcwidth==0.2.13 + # via + # prettytable + # prompt-toolkit +widgetsnbextension==4.0.14 + # via ipywidgets From 2ab3b341c64dc9fdc95f3492206d1ca696b9face Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Mon, 15 Sep 2025 13:21:25 +0200 Subject: [PATCH 02/27] Update sensitivity_analysis notebook Signed-off-by: Florian Dupuy --- sensitivity_analysis.ipynb | 1007 ++++++++---------------------------- 1 file changed, 206 insertions(+), 801 deletions(-) diff --git a/sensitivity_analysis.ipynb b/sensitivity_analysis.ipynb index e0c0c64..7a4d2d6 100644 --- a/sensitivity_analysis.ipynb +++ b/sensitivity_analysis.ipynb @@ -17,26 +17,22 @@ "\n", "It is also possible to calculate Power Transfer Distribution Factors (PTDF). In this case, zones are defined and the effect of the variation of the net position of a zone on a branch between this zone and another one.\n", "\n", - "The first step is to install pypowsybl and import the library." + "The first step is to import the library." ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pip install pypowsybl" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:15:52.382937Z", + "start_time": "2025-09-15T11:15:51.440528Z" + } + }, "source": [ "import pypowsybl as pp" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "markdown", @@ -47,12 +43,17 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:15:52.460564Z", + "start_time": "2025-09-15T11:15:52.402886Z" + } + }, "source": [ "n6 = pp.network.create_metrix_tutorial_six_buses_network()" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -63,687 +64,29 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:15:52.579225Z", + "start_time": "2025-09-15T11:15:52.518591Z" + } + }, + "source": [ + "n6.get_network_area_diagram()" + ], "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\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", - " 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", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
NE_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
NO_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / 0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
N_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
SE_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.1°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
SO_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / 0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
S_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.0°
\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 -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\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 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 -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
NO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
N_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
SE_poste
\n
\n 380.0 kV / -0.1°
\n
\n
\n
SO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
S_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
\n
\n" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n6.get_network_area_diagram()" - ] + "execution_count": 3 }, { "cell_type": "markdown", @@ -765,12 +108,17 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:15:52.640242Z", + "start_time": "2025-09-15T11:15:52.635338Z" + } + }, "source": [ "analysis = pp.sensitivity.create_dc_analysis()" - ] + ], + "outputs": [], + "execution_count": 4 }, { "cell_type": "markdown", @@ -783,12 +131,17 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:15:52.703913Z", + "start_time": "2025-09-15T11:15:52.698237Z" + } + }, "source": [ "analysis.add_branch_flow_factor_matrix(branches_ids=['S_SO_1', 'S_SO_2'], variables_ids=['SE_G'])" - ] + ], + "outputs": [], + "execution_count": 5 }, { "cell_type": "markdown", @@ -799,12 +152,17 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:15:52.770267Z", + "start_time": "2025-09-15T11:15:52.754779Z" + } + }, "source": [ "result = analysis.run(n6)" - ] + ], + "outputs": [], + "execution_count": 6 }, { "cell_type": "markdown", @@ -815,11 +173,22 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:15:52.849031Z", + "start_time": "2025-09-15T11:15:52.826166Z" + } + }, + "source": [ + "result.get_reference_matrix()" + ], "outputs": [ { "data": { + "text/plain": [ + " S_SO_1 S_SO_2\n", + "reference_values -120.433341 -120.433341" + ], "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 -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\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 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 -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
NO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
N_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
SE_poste
\n
\n 380.0 kV / -0.1°
\n
\n
\n
SO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
S_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
\n\n" + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3 }, { "cell_type": "markdown", @@ -112,71 +140,502 @@ "source": [ "If we wish to get a more detailed view of the network, featuring each component (busbars, switches, generators, loads etc.), we can display a single-line diagram.\n", "Here, we chose to display the single-line diagram of the 'SE' substation." - ] + ], + "id": "976c877bc72a9dec" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:13.345067Z", + "start_time": "2025-09-15T11:22:13.314887Z" + } + }, "source": [ "n6.get_single_line_diagram('SO')" - ] + ], + "id": "9ff44765df054dd3", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n SO_poste\n \n \n \n SOO1_1\n \n \n \n SOO1_mnv\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_G1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_NO_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_NO_2\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 \n \n \n \n \n \n \n \n \n \n AC / DC - VSC\n HVDC1\n \n \n \n \n \n \n \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 \n \n \n \n \n AC / DC - VSC\n HVDC2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SO_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SO_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_L\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_G2\n \n \n \n \n \n \n \n \n\n" + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can display node info:" - ] + ], + "id": "8cfc8a5e6f031e8f" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:13.408706Z", + "start_time": "2025-09-15T11:22:13.396557Z" + } + }, "source": [ "n6.get_substations()" - ] + ], + "id": "1fd05d36b15c34da", + "outputs": [ + { + "data": { + "text/plain": [ + " name TSO geo_tags country\n", + "id \n", + "NO \n", + "S \n", + "SO \n", + "SE \n", + "N " + ], + "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", + "
nameTSOgeo_tagscountry
id
NO
S
SO
SE
N
\n", + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generator info:" - ] + ], + "id": "41857cb818f4713a" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:13.526861Z", + "start_time": "2025-09-15T11:22:13.517176Z" + } + }, "source": [ "n6.get_generators()" - ] + ], + "id": "75dfe70c4e70fb31", + "outputs": [ + { + "data": { + "text/plain": [ + " name energy_source target_p min_p max_p min_q max_q rated_s \\\n", + "id \n", + "SO_G1 THERMAL 480.0 0.0 2000.0 NaN NaN NaN \n", + "SO_G2 THERMAL 480.0 0.0 2000.0 NaN NaN NaN \n", + "SE_G THERMAL 100.0 0.0 600.0 NaN NaN NaN \n", + "N_G THERMAL 0.0 0.0 600.0 NaN NaN NaN \n", + "\n", + " reactive_limits_kind target_v target_q voltage_regulator_on \\\n", + "id \n", + "SO_G1 CURVE 406.450043 2.35231 True \n", + "SO_G2 CURVE 406.450043 2.35231 True \n", + "SE_G CURVE 406.450043 6.45498 True \n", + "N_G CURVE 406.450043 7.48158 True \n", + "\n", + " regulated_element_id p q i voltage_level_id bus_id \\\n", + "id \n", + "SO_G1 SO_G1 -480.0 NaN NaN SO_poste SO_poste_0 \n", + "SO_G2 SO_G2 -480.0 NaN NaN SO_poste SO_poste_0 \n", + "SE_G SE_G -0.0 NaN NaN SE_poste SE_poste_0 \n", + "N_G N_G -0.0 NaN NaN N_poste N_poste_0 \n", + "\n", + " connected \n", + "id \n", + "SO_G1 True \n", + "SO_G2 True \n", + "SE_G True \n", + "N_G True " + ], + "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", + "
nameenergy_sourcetarget_pmin_pmax_pmin_qmax_qrated_sreactive_limits_kindtarget_vtarget_qvoltage_regulator_onregulated_element_idpqivoltage_level_idbus_idconnected
id
SO_G1THERMAL480.00.02000.0NaNNaNNaNCURVE406.4500432.35231TrueSO_G1-480.0NaNNaNSO_posteSO_poste_0True
SO_G2THERMAL480.00.02000.0NaNNaNNaNCURVE406.4500432.35231TrueSO_G2-480.0NaNNaNSO_posteSO_poste_0True
SE_GTHERMAL100.00.0600.0NaNNaNNaNCURVE406.4500436.45498TrueSE_G-0.0NaNNaNSE_posteSE_poste_0True
N_GTHERMAL0.00.0600.0NaNNaNNaNCURVE406.4500437.48158TrueN_G-0.0NaNNaNN_posteN_poste_0True
\n", + "
" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load info:" - ] + ], + "id": "ff87ac635ef03cb2" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:13.793374Z", + "start_time": "2025-09-15T11:22:13.783354Z" + } + }, "source": [ "n6.get_loads()" - ] + ], + "id": "af7a00602276dd0b", + "outputs": [ + { + "data": { + "text/plain": [ + " name type p0 q0 p q i voltage_level_id bus_id \\\n", + "id \n", + "SO_L UNDEFINED 480.0 4.8 480.0 NaN NaN SO_poste SO_poste_0 \n", + "SE_L1 UNDEFINED 480.0 4.8 480.0 NaN NaN SE_poste SE_poste_0 \n", + "SE_L2 UNDEFINED 0.0 4.8 0.0 NaN NaN SE_poste SE_poste_0 \n", + "\n", + " connected \n", + "id \n", + "SO_L True \n", + "SE_L1 True \n", + "SE_L2 True " + ], + "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", + "
nametypep0q0pqivoltage_level_idbus_idconnected
id
SO_LUNDEFINED480.04.8480.0NaNNaNSO_posteSO_poste_0True
SE_L1UNDEFINED480.04.8480.0NaNNaNSE_posteSE_poste_0True
SE_L2UNDEFINED0.04.80.0NaNNaNSE_posteSE_poste_0True
\n", + "
" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2- Production and demand trends" - ] + ], + "id": "9db506679810e4f2" }, { "cell_type": "markdown", @@ -189,7 +648,8 @@ "| T01 | 960 | 0 | 960 |\n", "| T02 | 960 | 960 | 0 |\n", "| T03 | 960 | 960 | 0 |\n" - ] + ], + "id": "2c7e82feeffa7aff" }, { "attachments": { @@ -201,68 +661,397 @@ "metadata": {}, "source": [ "![network_with_production_consumption.png](attachment:network_with_production_consumption.png)" - ] + ], + "id": "73d6cfe12faa745c" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look at the first time step and change the production accordingly:" - ] + ], + "id": "1d04eaed58b9822" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:13.937910Z", + "start_time": "2025-09-15T11:22:13.928878Z" + } + }, "source": [ "n6.update_generators(id='SO_G1', target_p=0)\n", "n6.update_generators(id='SO_G2', target_p=960)\n", "n6.update_generators(id='SE_G', target_p=0)" - ] + ], + "id": "e50154dec7ae82fe", + "outputs": [], + "execution_count": 8 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.078721Z", + "start_time": "2025-09-15T11:22:14.058678Z" + } + }, "source": [ "n6.get_generators()" - ] + ], + "id": "34347961db166e60", + "outputs": [ + { + "data": { + "text/plain": [ + " name energy_source target_p min_p max_p min_q max_q rated_s \\\n", + "id \n", + "SO_G1 THERMAL 0.0 0.0 2000.0 NaN NaN NaN \n", + "SO_G2 THERMAL 960.0 0.0 2000.0 NaN NaN NaN \n", + "SE_G THERMAL 0.0 0.0 600.0 NaN NaN NaN \n", + "N_G THERMAL 0.0 0.0 600.0 NaN NaN NaN \n", + "\n", + " reactive_limits_kind target_v target_q voltage_regulator_on \\\n", + "id \n", + "SO_G1 CURVE 406.450043 2.35231 True \n", + "SO_G2 CURVE 406.450043 2.35231 True \n", + "SE_G CURVE 406.450043 6.45498 True \n", + "N_G CURVE 406.450043 7.48158 True \n", + "\n", + " regulated_element_id p q i voltage_level_id bus_id \\\n", + "id \n", + "SO_G1 SO_G1 -480.0 NaN NaN SO_poste SO_poste_0 \n", + "SO_G2 SO_G2 -480.0 NaN NaN SO_poste SO_poste_0 \n", + "SE_G SE_G -0.0 NaN NaN SE_poste SE_poste_0 \n", + "N_G N_G -0.0 NaN NaN N_poste N_poste_0 \n", + "\n", + " connected \n", + "id \n", + "SO_G1 True \n", + "SO_G2 True \n", + "SE_G True \n", + "N_G True " + ], + "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", + "
nameenergy_sourcetarget_pmin_pmax_pmin_qmax_qrated_sreactive_limits_kindtarget_vtarget_qvoltage_regulator_onregulated_element_idpqivoltage_level_idbus_idconnected
id
SO_G1THERMAL0.00.02000.0NaNNaNNaNCURVE406.4500432.35231TrueSO_G1-480.0NaNNaNSO_posteSO_poste_0True
SO_G2THERMAL960.00.02000.0NaNNaNNaNCURVE406.4500432.35231TrueSO_G2-480.0NaNNaNSO_posteSO_poste_0True
SE_GTHERMAL0.00.0600.0NaNNaNNaNCURVE406.4500436.45498TrueSE_G-0.0NaNNaNSE_posteSE_poste_0True
N_GTHERMAL0.00.0600.0NaNNaNNaNCURVE406.4500437.48158TrueN_G-0.0NaNNaNN_posteN_poste_0True
\n", + "
" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we modify the active power loads and display the data:" - ] + ], + "id": "da69f512282cb82f" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.180683Z", + "start_time": "2025-09-15T11:22:14.173675Z" + } + }, "source": [ "n6.update_loads(id='SO_L', p0=0)\n", "n6.update_loads(id='SE_L1', p0=960)\n", "n6.update_loads(id='SE_L2', p0=0)" - ] + ], + "id": "530a52aa06c07bf2", + "outputs": [], + "execution_count": 10 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.313732Z", + "start_time": "2025-09-15T11:22:14.306258Z" + } + }, "source": [ "n6.get_loads()" - ] + ], + "id": "905f4a54587ff216", + "outputs": [ + { + "data": { + "text/plain": [ + " name type p0 q0 p q i voltage_level_id bus_id \\\n", + "id \n", + "SO_L UNDEFINED 0.0 4.8 480.0 NaN NaN SO_poste SO_poste_0 \n", + "SE_L1 UNDEFINED 960.0 4.8 480.0 NaN NaN SE_poste SE_poste_0 \n", + "SE_L2 UNDEFINED 0.0 4.8 0.0 NaN NaN SE_poste SE_poste_0 \n", + "\n", + " connected \n", + "id \n", + "SO_L True \n", + "SE_L1 True \n", + "SE_L2 True " + ], + "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", + "
nametypep0q0pqivoltage_level_idbus_idconnected
id
SO_LUNDEFINED0.04.8480.0NaNNaNSO_posteSO_poste_0True
SE_L1UNDEFINED960.04.8480.0NaNNaNSE_posteSE_poste_0True
SE_L2UNDEFINED0.04.80.0NaNNaNSE_posteSE_poste_0True
\n", + "
" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3 - Load flow computation" - ] + ], + "id": "e5f1353aa46f7278" }, { "cell_type": "markdown", @@ -271,50 +1060,484 @@ "Let's run a load flow in order to analyze the base case. It is an analysis that calculates the magnitude and angle of the voltage as well as the power flow on each electrical bus of a network. \n", "\n", "The base case (also called the N case) represents the nominal state of the network (no failures)." - ] + ], + "id": "5ccd08c5ee24e305" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.437122Z", + "start_time": "2025-09-15T11:22:14.421916Z" + } + }, "source": [ "results = pp.loadflow.run_dc(n6)" - ] + ], + "id": "cde46e9261cff514", + "outputs": [], + "execution_count": 12 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.593280Z", + "start_time": "2025-09-15T11:22:14.589803Z" + } + }, "source": [ "results" - ] + ], + "id": "2482abffc8524317", + "outputs": [ + { + "data": { + "text/plain": [ + "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=Converged, iteration_count=0, reference_bus_id='NE_poste_0', slack_bus_results=[SlackBusResult(id='NE_poste_0', active_power_mismatch=-0.0)], distributed_active_power=-0.0)]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 13 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.655788Z", + "start_time": "2025-09-15T11:22:14.643229Z" + } + }, "source": [ "n6.get_lines()" - ] + ], + "id": "771062589ab2a89a", + "outputs": [ + { + "data": { + "text/plain": [ + " name r x g1 b1 g2 b2 p1 q1 i1 p2 \\\n", + "id \n", + "NO_N_1 1.0 1.0 0.0 0.0 0.0 0.0 101.040745 NaN NaN -101.040745 \n", + "NO_N_2 2.0 1.0 0.0 0.0 0.0 0.0 101.040745 NaN NaN -101.040745 \n", + "S_SE_1 3.0 1.0 0.0 0.0 0.0 0.0 290.520372 NaN NaN -290.520372 \n", + "S_SE_2 4.0 1.0 0.0 0.0 0.0 0.0 290.520372 NaN NaN -290.520372 \n", + "S_SO_1 5.0 1.0 0.0 0.0 0.0 0.0 -290.520372 NaN NaN 290.520372 \n", + "S_SO_2 6.0 1.0 0.0 0.0 0.0 0.0 -290.520372 NaN NaN 290.520372 \n", + "SO_NO_1 7.0 1.0 0.0 0.0 0.0 0.0 189.479628 NaN NaN -189.479628 \n", + "SO_NO_2 8.0 1.0 0.0 0.0 0.0 0.0 189.479628 NaN NaN -189.479628 \n", + "NE_N_1 9.0 1.0 0.0 0.0 0.0 0.0 -101.040745 NaN NaN 101.040745 \n", + "NE_N_2 10.0 1.0 0.0 0.0 0.0 0.0 -101.040745 NaN NaN 101.040745 \n", + "SE_NE_1 11.0 1.0 0.0 0.0 0.0 0.0 -189.479628 NaN NaN 189.479628 \n", + "SE_NE_2 12.0 1.0 0.0 0.0 0.0 0.0 -189.479628 NaN NaN 189.479628 \n", + "\n", + " q2 i2 voltage_level1_id voltage_level2_id bus1_id bus2_id \\\n", + "id \n", + "NO_N_1 NaN NaN NO_poste N_poste NO_poste_0 N_poste_0 \n", + "NO_N_2 NaN NaN NO_poste N_poste NO_poste_0 N_poste_0 \n", + "S_SE_1 NaN NaN S_poste SE_poste S_poste_0 SE_poste_0 \n", + "S_SE_2 NaN NaN S_poste SE_poste S_poste_0 SE_poste_0 \n", + "S_SO_1 NaN NaN S_poste SO_poste S_poste_0 SO_poste_0 \n", + "S_SO_2 NaN NaN S_poste SO_poste S_poste_0 SO_poste_0 \n", + "SO_NO_1 NaN NaN SO_poste NO_poste SO_poste_0 NO_poste_0 \n", + "SO_NO_2 NaN NaN SO_poste NO_poste SO_poste_0 NO_poste_0 \n", + "NE_N_1 NaN NaN NE_poste N_poste NE_poste_0 N_poste_0 \n", + "NE_N_2 NaN NaN NE_poste N_poste NE_poste_0 N_poste_0 \n", + "SE_NE_1 NaN NaN SE_poste NE_poste SE_poste_0 NE_poste_0 \n", + "SE_NE_2 NaN NaN SE_poste NE_poste SE_poste_0 NE_poste_0 \n", + "\n", + " connected1 connected2 \n", + "id \n", + "NO_N_1 True True \n", + "NO_N_2 True True \n", + "S_SE_1 True True \n", + "S_SE_2 True True \n", + "S_SO_1 True True \n", + "S_SO_2 True True \n", + "SO_NO_1 True True \n", + "SO_NO_2 True True \n", + "NE_N_1 True True \n", + "NE_N_2 True True \n", + "SE_NE_1 True True \n", + "SE_NE_2 True True " + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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
NO_N_11.01.00.00.00.00.0101.040745NaNNaN-101.040745NaNNaNNO_posteN_posteNO_poste_0N_poste_0TrueTrue
NO_N_22.01.00.00.00.00.0101.040745NaNNaN-101.040745NaNNaNNO_posteN_posteNO_poste_0N_poste_0TrueTrue
S_SE_13.01.00.00.00.00.0290.520372NaNNaN-290.520372NaNNaNS_posteSE_posteS_poste_0SE_poste_0TrueTrue
S_SE_24.01.00.00.00.00.0290.520372NaNNaN-290.520372NaNNaNS_posteSE_posteS_poste_0SE_poste_0TrueTrue
S_SO_15.01.00.00.00.00.0-290.520372NaNNaN290.520372NaNNaNS_posteSO_posteS_poste_0SO_poste_0TrueTrue
S_SO_26.01.00.00.00.00.0-290.520372NaNNaN290.520372NaNNaNS_posteSO_posteS_poste_0SO_poste_0TrueTrue
SO_NO_17.01.00.00.00.00.0189.479628NaNNaN-189.479628NaNNaNSO_posteNO_posteSO_poste_0NO_poste_0TrueTrue
SO_NO_28.01.00.00.00.00.0189.479628NaNNaN-189.479628NaNNaNSO_posteNO_posteSO_poste_0NO_poste_0TrueTrue
NE_N_19.01.00.00.00.00.0-101.040745NaNNaN101.040745NaNNaNNE_posteN_posteNE_poste_0N_poste_0TrueTrue
NE_N_210.01.00.00.00.00.0-101.040745NaNNaN101.040745NaNNaNNE_posteN_posteNE_poste_0N_poste_0TrueTrue
SE_NE_111.01.00.00.00.00.0-189.479628NaNNaN189.479628NaNNaNSE_posteNE_posteSE_poste_0NE_poste_0TrueTrue
SE_NE_212.01.00.00.00.00.0-189.479628NaNNaN189.479628NaNNaNSE_posteNE_posteSE_poste_0NE_poste_0TrueTrue
\n", + "
" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 14 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.773878Z", + "start_time": "2025-09-15T11:22:14.761108Z" + } + }, "source": [ "n6.get_network_area_diagram()" - ] + ], + "id": "d62ddd16014f7559", + "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 -101\n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n \n \n -101\n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \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 177\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n -101\n \n \n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n -101\n \n \n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n -291\n \n \n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n -291\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 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 -291\n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n \n \n -291\n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n kV / 0.0°
\n
\n
\n
NO_poste
\n
\n kV / 0.1°
\n
\n
\n
N_poste
\n
\n kV / 0.0°
\n
\n
\n
SE_poste
\n
\n kV / -0.1°
\n
\n
\n
SO_poste
\n
\n kV / 0.2°
\n
\n
\n
S_poste
\n
\n kV / 0.0°
\n
\n
\n
\n
\n" + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the base case, the generating units and the loads are both located south. The flow takes the path of least resistance so it goes mostly through the SO -> S -> SE lines. There is also flow on the PST, and to the north." - ] + ], + "id": "a0039c667113c25e" }, { "attachments": { @@ -326,7 +1549,8 @@ "metadata": {}, "source": [ "![network_after_LF.png](attachment:network_after_LF.png)" - ] + ], + "id": "16e1d7b0dc87854a" }, { "cell_type": "markdown", @@ -337,59 +1561,510 @@ "This situation is called a N-1 case.\n", "\n", "We disconnect the line to simulate its loss." - ] + ], + "id": "8321798731300c2f" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.895817Z", + "start_time": "2025-09-15T11:22:14.891789Z" + } + }, "source": [ "n6.disconnect(id='S_SO_1')" - ] + ], + "id": "8839747a2e11823a", + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 16 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:14.950917Z", + "start_time": "2025-09-15T11:22:14.948164Z" + } + }, "source": [ "results = pp.loadflow.run_dc(n6)" - ] + ], + "id": "887d602d87257d0d", + "outputs": [], + "execution_count": 17 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.006065Z", + "start_time": "2025-09-15T11:22:15.000333Z" + } + }, "source": [ "results" - ] + ], + "id": "b687b09fc86e5822", + "outputs": [ + { + "data": { + "text/plain": [ + "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=Converged, iteration_count=0, reference_bus_id='NE_poste_0', slack_bus_results=[SlackBusResult(id='NE_poste_0', active_power_mismatch=-0.0)], distributed_active_power=-0.0)]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 18 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.086945Z", + "start_time": "2025-09-15T11:22:15.064648Z" + } + }, "source": [ "n6.get_lines()" - ] + ], + "id": "4fec5edb2e9aa8bb", + "outputs": [ + { + "data": { + "text/plain": [ + " name r x g1 b1 g2 b2 p1 q1 i1 p2 \\\n", + "id \n", + "NO_N_1 1.0 1.0 0.0 0.0 0.0 0.0 125.250843 NaN NaN -125.250843 \n", + "NO_N_2 2.0 1.0 0.0 0.0 0.0 0.0 125.250843 NaN NaN -125.250843 \n", + "S_SE_1 3.0 1.0 0.0 0.0 0.0 0.0 242.100337 NaN NaN -242.100337 \n", + "S_SE_2 4.0 1.0 0.0 0.0 0.0 0.0 242.100337 NaN NaN -242.100337 \n", + "S_SO_1 5.0 1.0 0.0 0.0 0.0 0.0 NaN NaN NaN NaN \n", + "S_SO_2 6.0 1.0 0.0 0.0 0.0 0.0 -484.200674 NaN NaN 484.200674 \n", + "SO_NO_1 7.0 1.0 0.0 0.0 0.0 0.0 237.899663 NaN NaN -237.899663 \n", + "SO_NO_2 8.0 1.0 0.0 0.0 0.0 0.0 237.899663 NaN NaN -237.899663 \n", + "NE_N_1 9.0 1.0 0.0 0.0 0.0 0.0 -125.250843 NaN NaN 125.250843 \n", + "NE_N_2 10.0 1.0 0.0 0.0 0.0 0.0 -125.250843 NaN NaN 125.250843 \n", + "SE_NE_1 11.0 1.0 0.0 0.0 0.0 0.0 -237.899663 NaN NaN 237.899663 \n", + "SE_NE_2 12.0 1.0 0.0 0.0 0.0 0.0 -237.899663 NaN NaN 237.899663 \n", + "\n", + " q2 i2 voltage_level1_id voltage_level2_id bus1_id bus2_id \\\n", + "id \n", + "NO_N_1 NaN NaN NO_poste N_poste NO_poste_0 N_poste_0 \n", + "NO_N_2 NaN NaN NO_poste N_poste NO_poste_0 N_poste_0 \n", + "S_SE_1 NaN NaN S_poste SE_poste S_poste_0 SE_poste_0 \n", + "S_SE_2 NaN NaN S_poste SE_poste S_poste_0 SE_poste_0 \n", + "S_SO_1 NaN NaN S_poste SO_poste \n", + "S_SO_2 NaN NaN S_poste SO_poste S_poste_0 SO_poste_0 \n", + "SO_NO_1 NaN NaN SO_poste NO_poste SO_poste_0 NO_poste_0 \n", + "SO_NO_2 NaN NaN SO_poste NO_poste SO_poste_0 NO_poste_0 \n", + "NE_N_1 NaN NaN NE_poste N_poste NE_poste_0 N_poste_0 \n", + "NE_N_2 NaN NaN NE_poste N_poste NE_poste_0 N_poste_0 \n", + "SE_NE_1 NaN NaN SE_poste NE_poste SE_poste_0 NE_poste_0 \n", + "SE_NE_2 NaN NaN SE_poste NE_poste SE_poste_0 NE_poste_0 \n", + "\n", + " connected1 connected2 \n", + "id \n", + "NO_N_1 True True \n", + "NO_N_2 True True \n", + "S_SE_1 True True \n", + "S_SE_2 True True \n", + "S_SO_1 False False \n", + "S_SO_2 True True \n", + "SO_NO_1 True True \n", + "SO_NO_2 True True \n", + "NE_N_1 True True \n", + "NE_N_2 True True \n", + "SE_NE_1 True True \n", + "SE_NE_2 True True " + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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
NO_N_11.01.00.00.00.00.0125.250843NaNNaN-125.250843NaNNaNNO_posteN_posteNO_poste_0N_poste_0TrueTrue
NO_N_22.01.00.00.00.00.0125.250843NaNNaN-125.250843NaNNaNNO_posteN_posteNO_poste_0N_poste_0TrueTrue
S_SE_13.01.00.00.00.00.0242.100337NaNNaN-242.100337NaNNaNS_posteSE_posteS_poste_0SE_poste_0TrueTrue
S_SE_24.01.00.00.00.00.0242.100337NaNNaN-242.100337NaNNaNS_posteSE_posteS_poste_0SE_poste_0TrueTrue
S_SO_15.01.00.00.00.00.0NaNNaNNaNNaNNaNNaNS_posteSO_posteFalseFalse
S_SO_26.01.00.00.00.00.0-484.200674NaNNaN484.200674NaNNaNS_posteSO_posteS_poste_0SO_poste_0TrueTrue
SO_NO_17.01.00.00.00.00.0237.899663NaNNaN-237.899663NaNNaNSO_posteNO_posteSO_poste_0NO_poste_0TrueTrue
SO_NO_28.01.00.00.00.00.0237.899663NaNNaN-237.899663NaNNaNSO_posteNO_posteSO_poste_0NO_poste_0TrueTrue
NE_N_19.01.00.00.00.00.0-125.250843NaNNaN125.250843NaNNaNNE_posteN_posteNE_poste_0N_poste_0TrueTrue
NE_N_210.01.00.00.00.00.0-125.250843NaNNaN125.250843NaNNaNNE_posteN_posteNE_poste_0N_poste_0TrueTrue
SE_NE_111.01.00.00.00.00.0-237.899663NaNNaN237.899663NaNNaNSE_posteNE_posteSE_poste_0NE_poste_0TrueTrue
SE_NE_212.01.00.00.00.00.0-237.899663NaNNaN237.899663NaNNaNSE_posteNE_posteSE_poste_0NE_poste_0TrueTrue
\n", + "
" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 19 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.222316Z", + "start_time": "2025-09-15T11:22:15.209432Z" + } + }, "source": [ "n6.get_network_area_diagram()" - ] + ], + "id": "9c079651d94da643", + "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 -125\n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n \n \n -125\n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n \n \n -225\n \n \n \n \n \n \n \n \n \n \n \n 225\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n -125\n \n \n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n -125\n \n \n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n \n \n 242\n \n \n \n \n \n \n \n \n \n \n \n -242\n \n \n \n \n \n \n \n \n \n \n \n \n \n 242\n \n \n \n \n \n \n \n \n \n \n \n -242\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 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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -484\n \n \n \n \n \n \n \n \n \n \n \n 484\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n kV / 0.0°
\n
\n
\n
NO_poste
\n
\n kV / 0.1°
\n
\n
\n
N_poste
\n
\n kV / 0.0°
\n
\n
\n
SE_poste
\n
\n kV / -0.1°
\n
\n
\n
SO_poste
\n
\n kV / 0.2°
\n
\n
\n
S_poste
\n
\n kV / 0.0°
\n
\n
\n
\n
\n" + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The 'S_SO_2' line is overloaded. The network is not secure in this N-1 case. " - ] + ], + "id": "dcf26afcd6dade1c" }, { "attachments": { @@ -401,14 +2076,16 @@ "metadata": {}, "source": [ "![network_after_LF_and_contingency.png](attachment:network_after_LF_and_contingency.png)" - ] + ], + "id": "f46b4fe5091f8cf9" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4 - Security Analysis" - ] + ], + "id": "5e3ce92fe7d894f4" }, { "cell_type": "markdown", @@ -417,49 +2094,273 @@ "Dispatchers monitor the network in real time. Part of their work is also to anticipate N-1 cases by simulating them and planning actions to be taken if a fault actually occurs.\n", "Manually disconnecting one line, computing a loadflow and checking the limits of every branch of a small network is fastidious. It is nearly impossible on a real network, let alone in real time.\n", "The security analysis deals with that.\n" - ] + ], + "id": "40ac599ae4d6c621" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before performing a security analysis, let's reconnect the `S_SO_1` line and consider the second hourly time step. " - ] + ], + "id": "fb074222f61b0a8a" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.333024Z", + "start_time": "2025-09-15T11:22:15.329716Z" + } + }, "source": [ "n6.connect(id='S_SO_1')" - ] + ], + "id": "b35c250cb633b16", + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 21 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.392345Z", + "start_time": "2025-09-15T11:22:15.388790Z" + } + }, "source": [ "n6.update_generators(id='SO_G1', target_p=960)\n", "n6.update_generators(id='SO_G2', target_p=0)" - ] + ], + "id": "d2c6a65986f711ad", + "outputs": [], + "execution_count": 22 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.454276Z", + "start_time": "2025-09-15T11:22:15.444173Z" + } + }, "source": [ "n6.get_generators()" - ] + ], + "id": "48426775ada6b72d", + "outputs": [ + { + "data": { + "text/plain": [ + " name energy_source target_p min_p max_p min_q max_q rated_s \\\n", + "id \n", + "SO_G1 THERMAL 960.0 0.0 2000.0 NaN NaN NaN \n", + "SO_G2 THERMAL 0.0 0.0 2000.0 NaN NaN NaN \n", + "SE_G THERMAL 0.0 0.0 600.0 NaN NaN NaN \n", + "N_G THERMAL 0.0 0.0 600.0 NaN NaN NaN \n", + "\n", + " reactive_limits_kind target_v target_q voltage_regulator_on \\\n", + "id \n", + "SO_G1 CURVE 406.450043 2.35231 True \n", + "SO_G2 CURVE 406.450043 2.35231 True \n", + "SE_G CURVE 406.450043 6.45498 True \n", + "N_G CURVE 406.450043 7.48158 True \n", + "\n", + " regulated_element_id p q i voltage_level_id bus_id \\\n", + "id \n", + "SO_G1 SO_G1 -0.0 -0.0 NaN SO_poste SO_poste_0 \n", + "SO_G2 SO_G2 -960.0 -0.0 NaN SO_poste SO_poste_0 \n", + "SE_G SE_G -0.0 -0.0 NaN SE_poste SE_poste_0 \n", + "N_G N_G -0.0 -0.0 NaN N_poste N_poste_0 \n", + "\n", + " connected \n", + "id \n", + "SO_G1 True \n", + "SO_G2 True \n", + "SE_G True \n", + "N_G True " + ], + "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", + "
nameenergy_sourcetarget_pmin_pmax_pmin_qmax_qrated_sreactive_limits_kindtarget_vtarget_qvoltage_regulator_onregulated_element_idpqivoltage_level_idbus_idconnected
id
SO_G1THERMAL960.00.02000.0NaNNaNNaNCURVE406.4500432.35231TrueSO_G1-0.0-0.0NaNSO_posteSO_poste_0True
SO_G2THERMAL0.00.02000.0NaNNaNNaNCURVE406.4500432.35231TrueSO_G2-960.0-0.0NaNSO_posteSO_poste_0True
SE_GTHERMAL0.00.0600.0NaNNaNNaNCURVE406.4500436.45498TrueSE_G-0.0-0.0NaNSE_posteSE_poste_0True
N_GTHERMAL0.00.0600.0NaNNaNNaNCURVE406.4500437.48158TrueN_G-0.0-0.0NaNN_posteN_poste_0True
\n", + "
" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1 - Security analysis" - ] + ], + "id": "a816f0e15042cc06" }, { "cell_type": "markdown", @@ -469,155 +2370,719 @@ "\n", "The violations detected without simulating any failure are collected in the `pre_contingency_result`.\n", "The violations detected while simulating a contingency are collected in the `post_contingency_result`." - ] + ], + "id": "dcf40779f5d1a88" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.589168Z", + "start_time": "2025-09-15T11:22:15.575294Z" + } + }, "source": [ "security_analysis = pp.security.create_analysis()" - ] + ], + "id": "cf2a921fb306de06", + "outputs": [], + "execution_count": 24 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.731265Z", + "start_time": "2025-09-15T11:22:15.726236Z" + } + }, "source": [ "security_analysis.add_single_element_contingency('S_SO_1', 'First contingency')" - ] + ], + "id": "40badf1e50b6eda", + "outputs": [], + "execution_count": 25 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.793608Z", + "start_time": "2025-09-15T11:22:15.786735Z" + } + }, "source": [ "sa_result = security_analysis.run_dc(n6)" - ] + ], + "id": "961b9b321b341c7f", + "outputs": [], + "execution_count": 26 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.840698Z", + "start_time": "2025-09-15T11:22:15.836776Z" + } + }, "source": [ "sa_result.pre_contingency_result " - ] + ], + "id": "82c3a4015f713df3", + "outputs": [ + { + "data": { + "text/plain": [ + "PreContingencyResult(, status=CONVERGED, limit_violations=[0])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is no pre-contingency violations because the base case is secured." - ] + ], + "id": "2b5d52d85d210c5a" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.911198Z", + "start_time": "2025-09-15T11:22:15.903195Z" + } + }, "source": [ "sa_result.post_contingency_results" - ] + ], + "id": "8a67cb9015010f5e", + "outputs": [ + { + "data": { + "text/plain": [ + "{'First contingency': PostContingencyResult(contingency_id='First contingency', status=CONVERGED, limit_violations=[2])}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 28 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.977017Z", + "start_time": "2025-09-15T11:22:15.962800Z" + } + }, "source": [ "sa_result.limit_violations" - ] + ], + "id": "600bbc9793749cf2", + "outputs": [ + { + "data": { + "text/plain": [ + " subject_name limit_type limit_name limit \\\n", + "contingency_id subject_id \n", + "First contingency S_SO_2 CURRENT 10' 600.000000 \n", + " S_SO_2 CURRENT permanent 500.000061 \n", + "\n", + " acceptable_duration limit_reduction \\\n", + "contingency_id subject_id \n", + "First contingency S_SO_2 1 1.0 \n", + " S_SO_2 2147483647 1.0 \n", + "\n", + " value side \n", + "contingency_id subject_id \n", + "First contingency S_SO_2 735.666815 ONE \n", + " S_SO_2 735.666815 TWO " + ], + "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", + "
subject_namelimit_typelimit_namelimitacceptable_durationlimit_reductionvalueside
contingency_idsubject_id
First contingencyS_SO_2CURRENT10'600.00000011.0735.666815ONE
S_SO_2CURRENTpermanent500.00006121474836471.0735.666815TWO
\n", + "
" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 29 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:16.156443Z", + "start_time": "2025-09-15T11:22:16.143655Z" + } + }, "source": [ "n6.get_operational_limits().loc['S_SO_2']" - ] + ], + "id": "b9848f10ec538e11", + "outputs": [ + { + "data": { + "text/plain": [ + " element_type side name type value \\\n", + "element_id \n", + "S_SO_2 LINE ONE permanent_limit CURRENT 5.000001e+02 \n", + "S_SO_2 LINE ONE 20' CURRENT 5.500000e+02 \n", + "S_SO_2 LINE ONE 10' CURRENT 6.000000e+02 \n", + "S_SO_2 LINE ONE 1' CURRENT 1.797693e+308 \n", + "S_SO_2 LINE TWO permanent_limit CURRENT 5.000001e+02 \n", + "\n", + " acceptable_duration \n", + "element_id \n", + "S_SO_2 -1 \n", + "S_SO_2 1200 \n", + "S_SO_2 600 \n", + "S_SO_2 1 \n", + "S_SO_2 -1 " + ], + "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", + "
element_typesidenametypevalueacceptable_duration
element_id
S_SO_2LINEONEpermanent_limitCURRENT5.000001e+02-1
S_SO_2LINEONE20'CURRENT5.500000e+021200
S_SO_2LINEONE10'CURRENT6.000000e+02600
S_SO_2LINEONE1'CURRENT1.797693e+3081
S_SO_2LINETWOpermanent_limitCURRENT5.000001e+02-1
\n", + "
" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The contingency on the `S_SO_1` line leads to an overload on the `S_SO_2` line. " - ] + ], + "id": "55134651f3de087d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 - Adding monitored Elements" - ] + ], + "id": "c9647c9edf9766e4" }, { "cell_type": "markdown", "metadata": {}, "source": [ "This feature is used to obtain information on various elements of the network after the load flow computations. Information can be obtained on buses, branches and three-winding transformers." - ] + ], + "id": "b9066238d78747bb" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:16.435404Z", + "start_time": "2025-09-15T11:22:16.433220Z" + } + }, "source": [ "sa = pp.security.create_analysis()" - ] + ], + "id": "56f48e1bd29678e7", + "outputs": [], + "execution_count": 31 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:16.488579Z", + "start_time": "2025-09-15T11:22:16.485453Z" + } + }, "source": [ "# S_SO_1: one of the two lines connecting the S and SO substations\n", "sa.add_single_element_contingencies(['S_SO_1'])" - ] + ], + "id": "4771237c2a11a8b5", + "outputs": [], + "execution_count": 32 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:16.546255Z", + "start_time": "2025-09-15T11:22:16.542619Z" + } + }, "source": [ "# S_SO_1 and S_SO_2: lines connecting the S and SO substations\n", "# SO_NO_1 and SO_NO_2: lines connecting the SO and NO substations\n", "sa.add_monitored_elements(branch_ids=['S_SO_2', 'SO_NO_1', 'SO_NO_2', 'S_SO_1'])" - ] + ], + "id": "3947611197e07605", + "outputs": [], + "execution_count": 33 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:16.613735Z", + "start_time": "2025-09-15T11:22:16.604337Z" + } + }, "source": [ "sa_result = sa.run_dc(n6)" - ] + ], + "id": "4e50ec5da6d95fa6", + "outputs": [], + "execution_count": 34 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:16.663701Z", + "start_time": "2025-09-15T11:22:16.656342Z" + } + }, "source": [ "sa_result.limit_violations" - ] + ], + "id": "7aadb52dc5e8e1ee", + "outputs": [ + { + "data": { + "text/plain": [ + " subject_name limit_type limit_name limit \\\n", + "contingency_id subject_id \n", + "S_SO_1 S_SO_2 CURRENT 10' 600.000000 \n", + " S_SO_2 CURRENT permanent 500.000061 \n", + "\n", + " acceptable_duration limit_reduction value \\\n", + "contingency_id subject_id \n", + "S_SO_1 S_SO_2 1 1.0 735.666815 \n", + " S_SO_2 2147483647 1.0 735.666815 \n", + "\n", + " side \n", + "contingency_id subject_id \n", + "S_SO_1 S_SO_2 ONE \n", + " S_SO_2 TWO " + ], + "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", + "
subject_namelimit_typelimit_namelimitacceptable_durationlimit_reductionvalueside
contingency_idsubject_id
S_SO_1S_SO_2CURRENT10'600.00000011.0735.666815ONE
S_SO_2CURRENTpermanent500.00006121474836471.0735.666815TWO
\n", + "
" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 35 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:16.828830Z", + "start_time": "2025-09-15T11:22:16.814860Z" + } + }, "source": [ "sa_result.branch_results" - ] + ], + "id": "be31440bd5313916", + "outputs": [ + { + "data": { + "text/plain": [ + " p1 q1 i1 \\\n", + "contingency_id operator_strategy_id branch_id \n", + " SO_NO_2 189.479628 NaN 287.884510 \n", + " SO_NO_1 189.479628 NaN 287.884510 \n", + " S_SO_2 -290.520372 NaN 441.400040 \n", + " S_SO_1 -290.520372 NaN 441.400040 \n", + "S_SO_1 SO_NO_1 237.899663 NaN 361.451143 \n", + " SO_NO_2 237.899663 NaN 361.451143 \n", + " S_SO_2 -484.200674 NaN 735.666815 \n", + "\n", + " p2 q2 i2 \\\n", + "contingency_id operator_strategy_id branch_id \n", + " SO_NO_2 -189.479628 NaN 287.884510 \n", + " SO_NO_1 -189.479628 NaN 287.884510 \n", + " S_SO_2 290.520372 NaN 441.400040 \n", + " S_SO_1 290.520372 NaN 441.400040 \n", + "S_SO_1 SO_NO_1 -237.899663 NaN 361.451143 \n", + " SO_NO_2 -237.899663 NaN 361.451143 \n", + " S_SO_2 484.200674 NaN 735.666815 \n", + "\n", + " flow_transfer \n", + "contingency_id operator_strategy_id branch_id \n", + " SO_NO_2 NaN \n", + " SO_NO_1 NaN \n", + " S_SO_2 NaN \n", + " S_SO_1 NaN \n", + "S_SO_1 SO_NO_1 -0.166667 \n", + " SO_NO_2 -0.166667 \n", + " S_SO_2 0.666667 " + ], + "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", + "
p1q1i1p2q2i2flow_transfer
contingency_idoperator_strategy_idbranch_id
SO_NO_2189.479628NaN287.884510-189.479628NaN287.884510NaN
SO_NO_1189.479628NaN287.884510-189.479628NaN287.884510NaN
S_SO_2-290.520372NaN441.400040290.520372NaN441.400040NaN
S_SO_1-290.520372NaN441.400040290.520372NaN441.400040NaN
S_SO_1SO_NO_1237.899663NaN361.451143-237.899663NaN361.451143-0.166667
SO_NO_2237.899663NaN361.451143-237.899663NaN361.451143-0.166667
S_SO_2-484.200674NaN735.666815484.200674NaN735.6668150.666667
\n", + "
" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 36 }, { "cell_type": "markdown", @@ -633,7 +3098,8 @@ "- Open bus coupler on `S` (resulting in splitting S station into two electrical nodes)\n", "- Open both couplers\n", "- Open line `S_SO_2`\n" - ] + ], + "id": "257508905ef1da30" }, { "attachments": { @@ -645,14 +3111,16 @@ "metadata": {}, "source": [ "![Curative_remedial_actions-2.png](attachment:Curative_remedial_actions-2.png)" - ] + ], + "id": "e1cb4367cc521317" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5 - Sensitivity Analysis" - ] + ], + "id": "e60c43838d3763d5" }, { "cell_type": "markdown", @@ -665,14 +3133,16 @@ "- Asking its neighbors for help (in a dedicated notebook)\n", "\n", "In both cases, the national dispatching center will compute the impact of that adjustement in some chosen parts of the network. This is done by running a sensitivity analysis.\n" - ] + ], + "id": "3b6199a58318ab01" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 - Increase the production of a generator" - ] + ], + "id": "caa50430f9e31a12" }, { "cell_type": "markdown", @@ -689,7 +3159,8 @@ }, "source": [ "In order to perform a sensitivity analysis, you must first define the “factors” you want to compute. \n" - ] + ], + "id": "7cda9597f32feb3a" }, { "cell_type": "markdown", @@ -706,13 +3177,17 @@ "`pypowsybl` provides a method to define the variables (injection, phase shifter) through their ids (variables_ids) and the functions through the branch ids (branches_ids). \n", "\n", "We obtain a matrix of sensitivities as a result:" - ] + ], + "id": "8433c289bb3521e7" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:17.100576Z", + "start_time": "2025-09-15T11:22:17.093193Z" + } + }, "source": [ "# SE_G = generator in the SE voltage level\n", "# S_SO_1 and S_SO_2: lines connecting the S voltage level and the SO voltage level\n", @@ -720,30 +3195,86 @@ "analysis = pp.sensitivity.create_dc_analysis()\n", "analysis.add_branch_flow_factor_matrix(branches_ids=['S_SO_1', 'S_SO_2'], variables_ids=['SE_G'])\n", "result = analysis.run(n6)" - ] + ], + "id": "8743adf1b4906e28", + "outputs": [], + "execution_count": 37 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:17.151741Z", + "start_time": "2025-09-15T11:22:17.146585Z" + } + }, "source": [ "result.get_sensitivity_matrix()" - ] + ], + "id": "da9eb5bf75ae6fd4", + "outputs": [ + { + "data": { + "text/plain": [ + " S_SO_1 S_SO_2\n", + "SE_G 0.3 0.3" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S_SO_1S_SO_2
SE_G0.30.3
\n", + "
" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 38 }, { "cell_type": "markdown", "metadata": {}, "source": [ "An increase of 1 MW on generator SE_G impacts the lines S_SO_1 and S_SO_2 with a 0.3 MW increase of the active power flow from side 1 to side 2.\n" - ] + ], + "id": "8c4e317c0ef401d2" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 - Transfer electricity production from one zone to another" - ] + ], + "id": "d7b5578334157a65" }, { "cell_type": "markdown", @@ -754,7 +3285,8 @@ "This zone-to-zone sensitivity feature is better known as Power Transfer Distribution Factor (PTDF).\n", "\n", "There is a dedicated notebook on this topic in the repository (sensitivity_analysis.ipynb)" - ] + ], + "id": "5e295b676f25c865" } ], "metadata": { From 2e3ce6d42a07b1237795d9f52f6a61ce43086b32 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Mon, 15 Sep 2025 13:26:50 +0200 Subject: [PATCH 04/27] Update sld notebook Signed-off-by: Florian Dupuy --- single_line_diagram.ipynb | 975 ++++---------------------------------- 1 file changed, 92 insertions(+), 883 deletions(-) diff --git a/single_line_diagram.ipynb b/single_line_diagram.ipynb index 6b15c8a..669b0b5 100644 --- a/single_line_diagram.ipynb +++ b/single_line_diagram.ipynb @@ -2,91 +2,96 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", - "Looking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\n", - "Requirement already satisfied: pypowsybl in /home/kuleszahug/.local/lib/python3.8/site-packages (1.4.0.dev1)\n", - "Requirement already satisfied: prettytable in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (2.0.0)\n", - "Requirement already satisfied: numpy>=1.20.0 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (1.24.3)\n", - "Requirement already satisfied: networkx in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (3.1)\n", - "Requirement already satisfied: pandas>=1.3.5 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (2.0.3)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2.8.2)\n", - "Requirement already satisfied: pytz>=2020.1 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2023.3)\n", - "Requirement already satisfied: tzdata>=2022.1 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2023.3)\n", - "Requirement already satisfied: setuptools in /home/kuleszahug/.local/lib/python3.8/site-packages (from prettytable->pypowsybl) (69.1.1)\n", - "Requirement already satisfied: wcwidth in /home/kuleszahug/.local/lib/python3.8/site-packages (from prettytable->pypowsybl) (0.2.6)\n", - "Requirement already satisfied: six>=1.5 in /home/kuleszahug/.local/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=1.3.5->pypowsybl) (1.16.0)\n", - "\u001b[33mDEPRECATION: distro-info 0.23ubuntu1 has a non-standard version number. pip 24.1 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of distro-info or contact the author to suggest that they release a version with a conforming version number. Discussion can be found at https://github.com/pypa/pip/issues/12063\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mDEPRECATION: python-debian 0.1.36ubuntu1 has a non-standard version number. pip 24.1 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of python-debian or contact the author to suggest that they release a version with a conforming version number. Discussion can be found at https://github.com/pypa/pip/issues/12063\u001b[0m\u001b[33m\n", - "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" - ] + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:26:14.833678Z", + "start_time": "2025-09-15T11:26:14.415381Z" } - ], - "source": [ - "pip install pypowsybl" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], + }, "source": [ "import pypowsybl as pp" - ] + ], + "id": "62556024c53fd36", + "outputs": [], + "execution_count": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load a node/breaker test network" - ] + ], + "id": "efca261898913b77" }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:26:14.842549Z", + "start_time": "2025-09-15T11:26:14.838617Z" + } + }, "source": [ "n = pp.network.create_four_substations_node_breaker_network()" - ] + ], + "id": "3e27bcd4a9bb502e", + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get substation data frame" - ] + ], + "id": "107c4bc399df98d0" }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:26:14.900854Z", + "start_time": "2025-09-15T11:26:14.895322Z" + } + }, "source": [ "substations = n.get_substations()" - ] + ], + "id": "c1cb034bece7cd32", + "outputs": [], + "execution_count": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Print substation data frame" - ] + ], + "id": "f461affde7714b23" }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:26:14.961908Z", + "start_time": "2025-09-15T11:26:14.952501Z" + } + }, + "source": [ + "substations" + ], + "id": "2a47ef9f6015213d", "outputs": [ { "data": { + "text/plain": [ + " name TSO geo_tags country\n", + "id \n", + "S1 \n", + "S2 \n", + "S3 \n", + "S4 " + ], "text/html": [ "
\n", "\n", - " \n", - " \n", - " \n", - " S1VL2\n", - " \n", - " \n", - " \n", - " S1VL2_BBS1\n", - " \n", - " \n", - " \n", - " S1VL2_BBS2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 5\n", - " \n", - " \n", - " \n", - " \n", - " 80\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " TWT\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -512\n", - " \n", - " \n", - " \n", - " \n", - " 10\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " AC / DC - VSC\n", - " HVDC1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -85\n", - " \n", - " \n", - " \n", - " \n", - " -512\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " GH1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -512\n", - " \n", - " \n", - " \n", - " \n", - " -90\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " GH2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -156\n", - " \n", - " \n", - " \n", - " \n", - " -512\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " GH3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 5\n", - " \n", - " \n", - " \n", - " \n", - " 60\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " LD2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 60\n", - " \n", - " \n", - " \n", - " \n", - " 5\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " LD3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 5\n", - " \n", - " \n", - " \n", - " \n", - " 40\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " LD4\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 1,920\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SHUNT\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " AC / DC - LCC\n", - " HVDC2\n", - " \n", - " \n", - " \n", - " S1VL1\n", - " \n", - " \n", - " \n", - " S1VL1_BBS\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 80\n", - " \n", - " \n", - " \n", - " \n", - " 10\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " LD1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -10\n", - " \n", - " \n", - " \n", - " \n", - " -80\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " TWT\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n S1VL2\n \n \n \n S1VL2_BBS1\n \n \n \n S1VL2_BBS2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 5\n \n \n \n \n 80\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n TWT\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -512\n \n \n \n \n 10\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n AC / DC - VSC\n HVDC1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -85\n \n \n \n \n -512\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n GH1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -512\n \n \n \n \n -90\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n GH2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -156\n \n \n \n \n -512\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n GH3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 5\n \n \n \n \n 60\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n LD2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 60\n \n \n \n \n 5\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n LD3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 5\n \n \n \n \n 40\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n LD4\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 1,920\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SHUNT\n \n \n \n \n \n \n \n \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n AC / DC - LCC\n HVDC2\n \n \n \n \n \n S1VL1\n \n \n \n S1VL1_BBS\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 80\n \n \n \n \n 10\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n LD1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -10\n \n \n \n \n -80\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n TWT\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sld" - ] + "execution_count": 6 }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:26:15.276670Z", + "start_time": "2025-09-15T11:26:15.274851Z" + } + }, + "source": [], + "id": "d03d7ee265e1e9b3", "outputs": [], - "source": [] + "execution_count": null } ], "metadata": { From 79c3c08a973b66d633682a7932d648c7bd7de7eb Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Mon, 15 Sep 2025 13:40:24 +0200 Subject: [PATCH 05/27] Add back image deleted in 2024 Signed-off-by: Florian Dupuy --- images/network_6_nodes_without_HDVC.png | Bin 0 -> 105106 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/network_6_nodes_without_HDVC.png diff --git a/images/network_6_nodes_without_HDVC.png b/images/network_6_nodes_without_HDVC.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed523e584f343b212ff1d56dbc900829819b86f GIT binary patch literal 105106 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 Ju87W;{|Bg) Date: Mon, 15 Sep 2025 13:42:26 +0200 Subject: [PATCH 06/27] Update operator strategy notebook Signed-off-by: Florian Dupuy --- operator_strategy.ipynb | 2790 +++++++-------------------------------- 1 file changed, 498 insertions(+), 2292 deletions(-) diff --git a/operator_strategy.ipynb b/operator_strategy.ipynb index f47c660..0ccea73 100644 --- a/operator_strategy.ipynb +++ b/operator_strategy.ipynb @@ -5,7 +5,8 @@ "metadata": {}, "source": [ "# Operator strategy notebook " - ] + ], + "id": "1b0280a047f95aea" }, { "cell_type": "markdown", @@ -14,760 +15,89 @@ }, "source": [ "This notebook illustrates how to run a security analysis with remedial actions. For a contingency, an operator strategy groups a list of actions and a condition to apply them. This small tutorial is based on a 6 nodes network, called Metrix, that is easily understandable. We are going to simulate contingencies and various operator strategies to show the available features. Network elements can be monitored in pre-contingency state, after a contingency and after each operator strategy." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", - "Looking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\n", - "Requirement already satisfied: pypowsybl in /home/kuleszahug/.local/lib/python3.8/site-packages (1.4.0.dev1)\n", - "Requirement already satisfied: prettytable in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (2.0.0)\n", - "Requirement already satisfied: numpy>=1.20.0 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (1.24.3)\n", - "Requirement already satisfied: networkx in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (3.1)\n", - "Requirement already satisfied: pandas>=1.3.5 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (2.0.3)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2.8.2)\n", - "Requirement already satisfied: pytz>=2020.1 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2023.3)\n", - "Requirement already satisfied: tzdata>=2022.1 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2023.3)\n", - "Requirement already satisfied: setuptools in /home/kuleszahug/.local/lib/python3.8/site-packages (from prettytable->pypowsybl) (69.1.1)\n", - "Requirement already satisfied: wcwidth in /home/kuleszahug/.local/lib/python3.8/site-packages (from prettytable->pypowsybl) (0.2.6)\n", - "Requirement already satisfied: six>=1.5 in /home/kuleszahug/.local/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=1.3.5->pypowsybl) (1.16.0)\n", - "\u001b[33mDEPRECATION: distro-info 0.23ubuntu1 has a non-standard version number. pip 24.1 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of distro-info or contact the author to suggest that they release a version with a conforming version number. Discussion can be found at https://github.com/pypa/pip/issues/12063\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mDEPRECATION: python-debian 0.1.36ubuntu1 has a non-standard version number. pip 24.1 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of python-debian or contact the author to suggest that they release a version with a conforming version number. Discussion can be found at https://github.com/pypa/pip/issues/12063\u001b[0m\u001b[33m\n", - "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" - ] - } ], - "source": [ - "pip install pypowsybl" - ] + "id": "4f07e59e693da262" }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.369752Z", + "start_time": "2025-09-15T11:41:33.361231Z" + } + }, "source": [ "import pypowsybl as pp\n", "import pandas as pd\n", "import numpy as np\n", "from pypowsybl._pypowsybl import ConditionType" - ] + ], + "id": "dc0fa4c0ea4328ed", + "outputs": [], + "execution_count": 189 }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.402804Z", + "start_time": "2025-09-15T11:41:33.379187Z" + } + }, "source": [ "six_nodes = pp.network.create_metrix_tutorial_six_buses_network()" - ] + ], + "id": "14e8f5d999dd7e91", + "outputs": [], + "execution_count": 190 }, { "cell_type": "markdown", "metadata": {}, - "source": [ - "![6 nodes network](data/reseau_6_noeuds_ss_HDVC.png)" - ] + "source": "![6 nodes network](images/network_6_nodes_without_HDVC.png)", + "id": "7e21c296f88d2989" }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.453853Z", + "start_time": "2025-09-15T11:41:33.433647Z" + } + }, + "source": [ + "six_nodes.get_network_area_diagram()" + ], + "id": "3ad43659504d12cf", "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -48\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\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", - " 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", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
NE_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
NO_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / 0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
N_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
SE_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.1°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
SO_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / 0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
S_poste
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
380.0 kV / -0.0°
\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 -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\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 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 -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
NO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
N_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
SE_poste
\n
\n 380.0 kV / -0.1°
\n
\n
\n
SO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
S_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
\n
\n" }, - "execution_count": 7, + "execution_count": 191, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "six_nodes.get_network_area_diagram()" - ] + "execution_count": 191 }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.514614Z", + "start_time": "2025-09-15T11:41:33.508695Z" + } + }, "source": [ "sa = pp.security.create_analysis()" - ] + ], + "id": "bcb3ce751e3c18f4", + "outputs": [], + "execution_count": 192 }, { "cell_type": "markdown", @@ -776,1421 +106,151 @@ }, "source": [ "We simulate a contingency on line S_SO_1. When loosing this line, flows are redirected and line S_SO_2 is overloaded. We are going to test various operator strategies to remove the limit violation." - ] + ], + "id": "e3fce4e38cd1b21a" }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.572162Z", + "start_time": "2025-09-15T11:41:33.567011Z" + } + }, "source": [ "sa.add_single_element_contingency('S_SO_1', 'S_SO_1_contingency')" - ] + ], + "id": "cfb39506a50ada0d", + "outputs": [], + "execution_count": 193 }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.627730Z", + "start_time": "2025-09-15T11:41:33.623954Z" + } + }, "source": [ "sa.add_monitored_elements(branch_ids=['S_SO_2', 'SO_NO_1'])" - ] + ], + "id": "bd361396f785bcd9", + "outputs": [], + "execution_count": 194 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We add a current limit on line S_SO_2" - ] + ], + "id": "7ee406c85a45c88b" }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.689327Z", + "start_time": "2025-09-15T11:41:33.680899Z" + } + }, "source": [ "six_nodes.create_operational_limits(pd.DataFrame.from_records(index='element_id', data=[\n", " {'element_id': 'S_SO_2', 'name': 'permanent_limit', 'element_type': 'LINE', 'side': 'TWO',\n", " 'type': 'CURRENT', 'value': 400,\n", - " 'acceptable_duration': np.Inf, 'is_fictitious': False}\n", + " 'acceptable_duration': np.inf, 'is_fictitious': False}\n", " ]))" - ] + ], + "id": "a91145c3468656aa", + "outputs": [], + "execution_count": 195 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Detailed topology" - ] + ], + "id": "4d50fb96cd1231c5" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### SO_poste" - ] + ], + "id": "9d46aafb1ee45846" }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.769801Z", + "start_time": "2025-09-15T11:41:33.745198Z" + } + }, + "source": [ + "six_nodes.get_single_line_diagram('SO_poste')" + ], + "id": "d63f9a70d0617c48", "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SOO1_1\n", - " \n", - " \n", - " \n", - " SOO1_mnv\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -480\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SO_G1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SO_NO_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SO_NO_2\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " AC / DC - VSC\n", - " HVDC1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " AC / DC - VSC\n", - " HVDC2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " S_SO_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " S_SO_2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 480\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SO_L\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -480\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SO_G2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n SOO1_1\n \n \n \n SOO1_mnv\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_G1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_NO_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_NO_2\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 \n \n \n \n \n \n \n \n \n \n AC / DC - VSC\n HVDC1\n \n \n \n \n \n \n \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 \n \n \n \n \n AC / DC - VSC\n HVDC2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SO_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SO_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_L\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_G2\n \n \n \n \n \n \n \n \n\n" }, - "execution_count": 12, + "execution_count": 196, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "six_nodes.get_single_line_diagram('SO_poste')" - ] + "execution_count": 196 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### SE_poste" - ] + ], + "id": "c9fdaeda67f90947" }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.840565Z", + "start_time": "2025-09-15T11:41:33.820027Z" + } + }, + "source": [ + "six_nodes.get_single_line_diagram('SE_poste')" + ], + "id": "d1c444ff76b5274a", "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SEI1_1\n", - " \n", - " \n", - " \n", - " SEI1_mnv\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SE_G\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " S_SE_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -144\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " S_SE_2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SE_NE_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -96\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SE_NE_2\n", - " \n", - " \n", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " AC / DC - VSC\n", - " HVDC1\n", - " \n", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " AC / DC - VSC\n", - " HVDC2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 480\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SE_L1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " SE_L2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n SEI1_1\n \n \n \n SEI1_mnv\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SE_G\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SE_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SE_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SE_NE_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SE_NE_2\n \n \n \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 \n \n \n \n \n AC / DC - VSC\n HVDC1\n \n \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 \n \n \n \n \n \n \n \n \n \n AC / DC - VSC\n HVDC2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SE_L1\n \n \n \n \n \n \n \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 \n \n \n \n \n \n \n \n SE_L2\n \n \n \n \n \n \n \n \n\n" }, - "execution_count": 13, + "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "six_nodes.get_single_line_diagram('SE_poste')" - ] + "execution_count": 197 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Topological remedial actions" - ] + ], + "id": "9d43113842d0c203" }, { "cell_type": "markdown", @@ -2200,59 +260,91 @@ "source": [ "You have to add all the actions involved in the strategies you want to test. Here, we want to see the effect of opening switches SS1_SS1_DJ_OMN or/and SOO1_SOO1_DJ_OMN: opening only the first one, only the second one or both.\n", "Operator strategies have the condition ANY_VIOLATION_CONDITION " - ] + ], + "id": "d6f86589013952a1" }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.901914Z", + "start_time": "2025-09-15T11:41:33.897759Z" + } + }, "source": [ "sa.add_switch_action(action_id='Switch_SS1_SS1_DJ_OMN_OPEN', switch_id='SS1_SS1_DJ_OMN', open=True)" - ] + ], + "id": "647af507098f6e3", + "outputs": [], + "execution_count": 198 }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:33.956010Z", + "start_time": "2025-09-15T11:41:33.952334Z" + } + }, "source": [ "sa.add_switch_action(action_id='Switch_SOO1_SOO1_DJ_OMN_OPEN', switch_id='SOO1_SOO1_DJ_OMN', open=True)" - ] + ], + "id": "92ae9b8777f508ef", + "outputs": [], + "execution_count": 199 }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.013685Z", + "start_time": "2025-09-15T11:41:34.008558Z" + } + }, "source": [ "sa.add_operator_strategy('StrategyOpenSS1_SS1', 'S_SO_1_contingency', ['Switch_SS1_SS1_DJ_OMN_OPEN'], ConditionType.ANY_VIOLATION_CONDITION) " - ] + ], + "id": "a92d5ab2f749d3d4", + "outputs": [], + "execution_count": 200 }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.069289Z", + "start_time": "2025-09-15T11:41:34.064093Z" + } + }, "source": [ "sa.add_operator_strategy('StrategyOpenSOO1_SOO1', 'S_SO_1_contingency', ['Switch_SOO1_SOO1_DJ_OMN_OPEN'], ConditionType.ANY_VIOLATION_CONDITION) " - ] + ], + "id": "519c2de05c20647a", + "outputs": [], + "execution_count": 201 }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.124810Z", + "start_time": "2025-09-15T11:41:34.121324Z" + } + }, "source": [ "sa.add_operator_strategy('StrategyOpenBothSwitchs', 'S_SO_1_contingency', ['Switch_SS1_SS1_DJ_OMN_OPEN', 'Switch_SOO1_SOO1_DJ_OMN_OPEN'], ConditionType.ANY_VIOLATION_CONDITION) " - ] + ], + "id": "35fa47a5301cf143", + "outputs": [], + "execution_count": 202 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Redispatch remedial actions" - ] + ], + "id": "b257fa60aae196ee" }, { "cell_type": "markdown", @@ -2261,68 +353,99 @@ }, "source": [ "An other strategy could be to modify the active power target of some generators, in a way the two modifications compensate (also called re-dispatching). Decreasing active power target of generator SO_G2 and increasing active power of SE_G (closer to loads) could be efficient." - ] + ], + "id": "666ac7b1aa783de9" }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.181168Z", + "start_time": "2025-09-15T11:41:34.176223Z" + } + }, "source": [ "sa.add_generator_active_power_action(action_id='Simple_Redispatch_SO_G2', generator_id='SO_G2', is_relative=True, active_power=-100)\n", "sa.add_generator_active_power_action(action_id='Simple_Redispatch_SE_G', generator_id='SE_G', is_relative=True, active_power=100)" - ] + ], + "id": "5ab7c10f9bd71676", + "outputs": [], + "execution_count": 203 }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.238793Z", + "start_time": "2025-09-15T11:41:34.235181Z" + } + }, "source": [ "sa.add_operator_strategy('StrategyRedispatch', 'S_SO_1_contingency', ['Simple_Redispatch_SO_G2', 'Simple_Redispatch_SE_G'], ConditionType.ANY_VIOLATION_CONDITION)" - ] + ], + "id": "bf1ce6bee49176b0", + "outputs": [], + "execution_count": 204 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Run the security analysis " - ] + ], + "id": "af204906980f0e20" }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.305639Z", + "start_time": "2025-09-15T11:41:34.291887Z" + } + }, "source": [ "sa_result = sa.run_ac(six_nodes)" - ] + ], + "id": "43ae2463b4d09085", + "outputs": [], + "execution_count": 205 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Check the results at each steps" - ] + ], + "id": "fb32175c4cdfc1ba" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pre contingency step" - ] + ], + "id": "a83c52bfe9b129e5" }, { "cell_type": "markdown", "metadata": {}, "source": [ "We should have no limit violations at the pre contingency state." - ] + ], + "id": "89166bdd75b36cd" }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.356305Z", + "start_time": "2025-09-15T11:41:34.349906Z" + } + }, + "source": [ + "sa_result.pre_contingency_result" + ], + "id": "47c05b893ec1b062", "outputs": [ { "data": { @@ -2330,33 +453,41 @@ "PreContingencyResult(, status=CONVERGED, limit_violations=[0])" ] }, - "execution_count": 22, + "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sa_result.pre_contingency_result" - ] + "execution_count": 206 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Post contingency step" - ] + ], + "id": "58fa05fb3c90eb27" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then the first contingency trigger the current limit installed on S_SO_2" - ] + ], + "id": "7e8ed3b0c79c1b18" }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.418804Z", + "start_time": "2025-09-15T11:41:34.412276Z" + } + }, + "source": [ + "sa_result.find_post_contingency_result('S_SO_1_contingency')" + ], + "id": "5d9ab85a779a3b5d", "outputs": [ { "data": { @@ -2364,60 +495,73 @@ "PostContingencyResult(contingency_id='S_SO_1_contingency', status=CONVERGED, limit_violations=[1])" ] }, - "execution_count": 23, + "execution_count": 207, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sa_result.find_post_contingency_result('S_SO_1_contingency')" - ] + "execution_count": 207 }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.484330Z", + "start_time": "2025-09-15T11:41:34.474789Z" + } + }, + "source": [ + "sa_result.find_post_contingency_result('S_SO_1_contingency').limit_violations[0]" + ], + "id": "11306df26b311f86", "outputs": [ { "data": { "text/plain": [ - "LimitViolation(subject_id='S_SO_2', subject_name='', limit_type=CURRENT, limit=400.0, limit_name='permanent', acceptable_duration=2147483647, limit_reduction=1.0, value=419.2577908692318, side=TWO)" + "LimitViolation(subject_id='S_SO_2', subject_name='', limit_type=CURRENT, limit=400.0, limit_name='permanent', acceptable_duration=2147483647, limit_reduction=1.0, value=419.25779086638283, side=TWO)" ] }, - "execution_count": 24, + "execution_count": 208, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sa_result.find_post_contingency_result('S_SO_1_contingency').limit_violations[0]" - ] + "execution_count": 208 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the flow is at 419.25." - ] + ], + "id": "e571b6f51eb0f24d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### StrategyOpenSS1_SS1" - ] + ], + "id": "ecb73b22d5542449" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check results for StrategyOpenSS1_SS1 :" - ] + ], + "id": "3d35d85ccb6e31d1" }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.547807Z", + "start_time": "2025-09-15T11:41:34.540530Z" + } + }, + "source": "sa_result.operator_strategy_results['StrategyOpenSS1_SS1']", + "id": "4596b24f0b81143e", "outputs": [ { "data": { @@ -2425,60 +569,73 @@ "OperatorStrategyResult(operator_strategy_id='StrategyOpenSS1_SS1', status=CONVERGED, limit_violations=[0])" ] }, - "execution_count": 25, + "execution_count": 209, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - " sa_result.operator_strategy_results['StrategyOpenSS1_SS1']" - ] + "execution_count": 209 }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.614515Z", + "start_time": "2025-09-15T11:41:34.604387Z" + } + }, + "source": [ + "sa_result.branch_results.loc['S_SO_1_contingency', 'StrategyOpenSS1_SS1', 'S_SO_2']['i2']" + ], + "id": "26d5d2be34df1fa7", "outputs": [ { "data": { "text/plain": [ - "378.3380062100674" + "np.float64(378.3380062100348)" ] }, - "execution_count": 26, + "execution_count": 210, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sa_result.branch_results.loc['S_SO_1_contingency', 'StrategyOpenSS1_SS1', 'S_SO_2']['i2']" - ] + "execution_count": 210 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We no longer have a limit violation, and we see that flow on S_SO2 is under 400." - ] + ], + "id": "3598bf16ad30c1e2" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### StrategyOpenSOO1_SOO1" - ] + ], + "id": "39bfb255e04836ec" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check results for StrategyOpenSOO1_SOO1 :" - ] + ], + "id": "35d7f311615a83d5" }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.674994Z", + "start_time": "2025-09-15T11:41:34.669052Z" + } + }, + "source": "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1']", + "id": "7771bd4cd9f297b1", "outputs": [ { "data": { @@ -2486,80 +643,97 @@ "OperatorStrategyResult(operator_strategy_id='StrategyOpenSOO1_SOO1', status=CONVERGED, limit_violations=[2])" ] }, - "execution_count": 27, + "execution_count": 211, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - " sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1']" - ] + "execution_count": 211 }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.737651Z", + "start_time": "2025-09-15T11:41:34.731059Z" + } + }, + "source": "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[0]", + "id": "9b2f75a1d140e946", "outputs": [ { "data": { "text/plain": [ - "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=700.0, limit_name=\"10'\", acceptable_duration=1, limit_reduction=1.0, value=1044.4966633667539, side=ONE)" + "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=700.0, limit_name=\"10'\", acceptable_duration=1, limit_reduction=1.0, value=1044.4966633667482, side=ONE)" ] }, - "execution_count": 28, + "execution_count": 212, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - " sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[0]" - ] + "execution_count": 212 }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.795858Z", + "start_time": "2025-09-15T11:41:34.789530Z" + } + }, + "source": [ + "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[1]" + ], + "id": "8dcd1830734d74a5", "outputs": [ { "data": { "text/plain": [ - "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=600.0, limit_name='permanent', acceptable_duration=2147483647, limit_reduction=1.0, value=1044.4966633667539, side=TWO)" + "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=600.0, limit_name='permanent', acceptable_duration=2147483647, limit_reduction=1.0, value=1044.4966633667477, side=TWO)" ] }, - "execution_count": 29, + "execution_count": 213, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[1]" - ] + "execution_count": 213 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that we have two new limit violation on SO_NO_1. But still no limit violation on S_SO2" - ] + ], + "id": "acc51c99fff318fb" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### StrategyOpenBothSwitchs" - ] + ], + "id": "4c7e60050aea7936" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check results for StrategyOpenBothSwitchs :" - ] + ], + "id": "6c05427aab4ad741" }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.869027Z", + "start_time": "2025-09-15T11:41:34.864124Z" + } + }, + "source": "sa_result.operator_strategy_results['StrategyOpenBothSwitchs']", + "id": "a61c5a890e6ed82a", "outputs": [ { "data": { @@ -2567,80 +741,99 @@ "OperatorStrategyResult(operator_strategy_id='StrategyOpenBothSwitchs', status=CONVERGED, limit_violations=[2])" ] }, - "execution_count": 30, + "execution_count": 214, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - " sa_result.operator_strategy_results['StrategyOpenBothSwitchs']" - ] + "execution_count": 214 }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.920379Z", + "start_time": "2025-09-15T11:41:34.917504Z" + } + }, + "source": [ + "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[0]" + ], + "id": "b6ac97e8f513b01c", "outputs": [ { "data": { "text/plain": [ - "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=700.0, limit_name=\"10'\", acceptable_duration=1, limit_reduction=1.0, value=1044.4966633667539, side=ONE)" + "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=700.0, limit_name=\"10'\", acceptable_duration=1, limit_reduction=1.0, value=1044.4966633667482, side=ONE)" ] }, - "execution_count": 31, + "execution_count": 215, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[0]" - ] + "execution_count": 215 }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:34.971744Z", + "start_time": "2025-09-15T11:41:34.967955Z" + } + }, + "source": [ + "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[1]" + ], + "id": "f187ed1370f6b05b", "outputs": [ { "data": { "text/plain": [ - "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=600.0, limit_name='permanent', acceptable_duration=2147483647, limit_reduction=1.0, value=1044.4966633667539, side=TWO)" + "LimitViolation(subject_id='SO_NO_1', subject_name='', limit_type=CURRENT, limit=600.0, limit_name='permanent', acceptable_duration=2147483647, limit_reduction=1.0, value=1044.4966633667477, side=TWO)" ] }, - "execution_count": 32, + "execution_count": 216, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "sa_result.operator_strategy_results['StrategyOpenSOO1_SOO1'].limit_violations[1]" - ] + "execution_count": 216 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also have some violations on SO_NO_1 but still no violation on S_SO2." - ] + ], + "id": "46c16bee67991daa" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### StrategyRedispatch" - ] + ], + "id": "e4d658e0eb0acf95" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally the StrategyRedispatch :" - ] + ], + "id": "3a79790e2cc6dff6" }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:35.023737Z", + "start_time": "2025-09-15T11:41:35.020447Z" + } + }, + "source": "sa_result.operator_strategy_results['StrategyRedispatch']", + "id": "e32d2c03037446a0", "outputs": [ { "data": { @@ -2648,43 +841,113 @@ "OperatorStrategyResult(operator_strategy_id='StrategyRedispatch', status=CONVERGED, limit_violations=[0])" ] }, - "execution_count": 33, + "execution_count": 217, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - " sa_result.operator_strategy_results['StrategyRedispatch']" - ] + "execution_count": 217 }, { "cell_type": "markdown", "metadata": {}, "source": [ "No more limit violations !" - ] + ], + "id": "8b60a6945b213cbf" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Observe the flow on each step of the analysis" - ] + ], + "id": "b17f517a80399ebd" }, { "cell_type": "markdown", "metadata": {}, "source": [ "To have an overview on the flows on S_SO_2 you can print the whole monitored branche results : " - ] + ], + "id": "c55402d21b4e20e4" }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:41:35.094560Z", + "start_time": "2025-09-15T11:41:35.080416Z" + } + }, + "source": [ + "sa_result.branch_results" + ], + "id": "118cc45a700bc16", "outputs": [ { "data": { + "text/plain": [ + " p1 q1 \\\n", + "contingency_id operator_strategy_id branch_id \n", + " SO_NO_1 54.531480 -110.016475 \n", + " S_SO_2 -133.377630 85.519336 \n", + "S_SO_1_contingency SO_NO_1 79.418783 -124.999658 \n", + " S_SO_2 -249.100890 153.754036 \n", + " StrategyOpenSS1_SS1 SO_NO_1 92.554967 -133.720643 \n", + " S_SO_2 -226.152625 136.898071 \n", + " StrategyOpenSOO1_SOO1 SO_NO_1 451.041734 -580.734940 \n", + " S_SO_2 -136.449843 11.254213 \n", + " StrategyOpenBothSwitchs SO_NO_1 451.153915 -580.693806 \n", + " S_SO_2 -125.372756 9.603396 \n", + " StrategyRedispatch SO_NO_1 59.361505 -124.265372 \n", + " S_SO_2 -185.947605 155.624093 \n", + "\n", + " i1 p2 \\\n", + "contingency_id operator_strategy_id branch_id \n", + " SO_NO_1 174.419119 -53.892618 \n", + " S_SO_2 226.042956 134.297347 \n", + "S_SO_1_contingency SO_NO_1 210.365186 -78.489460 \n", + " S_SO_2 419.257791 252.264878 \n", + " StrategyOpenSS1_SS1 SO_NO_1 231.007243 -91.434316 \n", + " S_SO_2 378.338006 228.729139 \n", + " StrategyOpenSOO1_SOO1 SO_NO_1 1044.496663 -428.131295 \n", + " S_SO_2 199.930622 137.169344 \n", + " StrategyOpenBothSwitchs SO_NO_1 1044.548275 -428.241212 \n", + " S_SO_2 183.434100 125.978421 \n", + " StrategyRedispatch SO_NO_1 195.621373 -58.557883 \n", + " S_SO_2 346.465621 188.108297 \n", + "\n", + " q2 i2 \\\n", + "contingency_id operator_strategy_id branch_id \n", + " SO_NO_1 110.107741 174.419119 \n", + " S_SO_2 -85.366050 226.042956 \n", + "S_SO_1_contingency SO_NO_1 125.132419 210.365186 \n", + " S_SO_2 -153.226705 419.257791 \n", + " StrategyOpenSS1_SS1 SO_NO_1 133.880736 231.007243 \n", + " S_SO_2 -136.468652 378.338006 \n", + " StrategyOpenSOO1_SOO1 SO_NO_1 584.007860 1044.496663 \n", + " S_SO_2 -11.134296 199.930622 \n", + " StrategyOpenBothSwitchs SO_NO_1 583.967050 1044.548275 \n", + " S_SO_2 -9.502452 183.434100 \n", + " StrategyRedispatch SO_NO_1 124.380175 195.621373 \n", + " S_SO_2 -155.263977 346.465621 \n", + "\n", + " flow_transfer \n", + "contingency_id operator_strategy_id branch_id \n", + " SO_NO_1 NaN \n", + " S_SO_2 NaN \n", + "S_SO_1_contingency SO_NO_1 NaN \n", + " S_SO_2 NaN \n", + " StrategyOpenSS1_SS1 SO_NO_1 NaN \n", + " S_SO_2 NaN \n", + " StrategyOpenSOO1_SOO1 SO_NO_1 NaN \n", + " S_SO_2 NaN \n", + " StrategyOpenBothSwitchs SO_NO_1 NaN \n", + " S_SO_2 NaN \n", + " StrategyRedispatch SO_NO_1 NaN \n", + " S_SO_2 NaN " + ], "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", - " 157\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", - " 76\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -73\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 5\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -5\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", - " 4\n", - " \n", - " \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", - " -7\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 8\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -8\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 18\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -18\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 6\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -6\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 9\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -9\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 73\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -71\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 56\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -54\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 42\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -41\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", - " 24\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -61\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 62\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 16\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -16\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 44\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -44\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", - " 28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
VL1
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
143.1 kV / 0.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL10
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.6 kV / -15.1°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL11
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.7 kV / -14.8°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL12
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.7 kV / -15.1°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL13
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.6 kV / -15.2°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL14
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.4 kV / -16.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL2
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
141.1 kV / -5.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL3
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
136.3 kV / -12.7°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL4
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
137.4 kV / -10.3°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL5
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
137.6 kV / -8.8°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL6
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.8 kV / -14.2°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL7
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
14.9 kV / -13.4°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL8
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
21.8 kV / -13.4°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL9
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.7 kV / -14.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 \n \n \n \n \n \n \n 157\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 76\n \n \n \n \n \n \n \n \n \n \n \n -73\n \n \n \n \n \n \n \n \n \n \n \n \n \n 5\n \n \n \n \n \n \n \n \n \n \n \n -5\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 4\n \n \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 -7\n \n \n \n \n \n \n \n \n \n \n \n \n \n 8\n \n \n \n \n \n \n \n \n \n \n \n -8\n \n \n \n \n \n \n \n \n \n \n \n \n \n 2\n \n \n \n \n \n \n \n \n \n \n \n -2\n \n \n \n \n \n \n \n \n \n \n \n \n \n 18\n \n \n \n \n \n \n \n \n \n \n \n -18\n \n \n \n \n \n \n \n \n \n \n \n \n \n 6\n \n \n \n \n \n \n \n \n \n \n \n -6\n \n \n \n \n \n \n \n \n \n \n \n \n \n 9\n \n \n \n \n \n \n \n \n \n \n \n -9\n \n \n \n \n \n \n \n \n \n \n \n \n \n 73\n \n \n \n \n \n \n \n \n \n \n \n -71\n \n \n \n \n \n \n \n \n \n \n \n \n \n 56\n \n \n \n \n \n \n \n \n \n \n \n -54\n \n \n \n \n \n \n \n \n \n \n \n \n \n 42\n \n \n \n \n \n \n \n \n \n \n \n -41\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 24\n \n \n \n \n \n \n \n \n \n \n \n \n \n -61\n \n \n \n \n \n \n \n \n \n \n \n 62\n \n \n \n \n \n \n \n \n \n \n \n \n \n 28\n \n \n \n \n \n \n \n \n \n \n \n -28\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 16\n \n \n \n \n \n \n \n \n \n \n \n -16\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 44\n \n \n \n \n \n \n \n \n \n \n \n -44\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 28\n \n \n \n \n \n \n \n \n \n \n \n -28\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL1
\n
\n 143.1 kV / 0.0°
\n
\n
\n
VL10
\n
\n 12.6 kV / -15.1°
\n
\n
\n
VL11
\n
\n 12.7 kV / -14.8°
\n
\n
\n
VL12
\n
\n 12.7 kV / -15.1°
\n
\n
\n
VL13
\n
\n 12.6 kV / -15.2°
\n
\n
\n
VL14
\n
\n 12.4 kV / -16.0°
\n
\n
\n
VL2
\n
\n 141.1 kV / -5.0°
\n
\n
\n
VL3
\n
\n 136.3 kV / -12.7°
\n
\n
\n
VL4
\n
\n 137.4 kV / -10.3°
\n
\n
\n
VL5
\n
\n 137.6 kV / -8.8°
\n
\n
\n
VL6
\n
\n 12.8 kV / -14.2°
\n
\n
\n
VL7
\n
\n 14.9 kV / -13.4°
\n
\n
\n
VL8
\n
\n 21.8 kV / -13.4°
\n
\n
\n
VL9
\n
\n 12.7 kV / -14.9°
\n
\n
\n
\n
\n" }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_network_area_diagram()" - ] + "execution_count": 4 }, { "cell_type": "markdown", @@ -1080,607 +115,29 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:42:55.865398Z", + "start_time": "2025-09-15T11:42:55.843851Z" + } + }, + "source": [ + "n.get_network_area_diagram('VL4', 1)" + ], "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \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", - " \n", - " \n", - " 73\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -71\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 56\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -54\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 42\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -41\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", - " 24\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -61\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 62\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 16\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -16\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -73\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 44\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", - " \n", - " \n", - " 28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " -28\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 5\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " 9\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
VL2
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
141.1 kV / -5.0°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL3
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
136.3 kV / -12.7°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL4
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
137.4 kV / -10.3°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL5
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
137.6 kV / -8.8°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL7
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
14.9 kV / -13.4°
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
VL9
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
\n", - "
12.7 kV / -14.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 -153\n \n \n \n \n \n \n \n \n \n \n \n \n \n 73\n \n \n \n \n \n \n \n \n \n \n \n -71\n \n \n \n \n \n \n \n \n \n \n \n \n \n 56\n \n \n \n \n \n \n \n \n \n \n \n -54\n \n \n \n \n \n \n \n \n \n \n \n \n \n 42\n \n \n \n \n \n \n \n \n \n \n \n -41\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 24\n \n \n \n \n \n \n \n \n \n \n \n \n \n -61\n \n \n \n \n \n \n \n \n \n \n \n 62\n \n \n \n \n \n \n \n \n \n \n \n \n \n 28\n \n \n \n \n \n \n \n \n \n \n \n -28\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 16\n \n \n \n \n \n \n \n \n \n \n \n -16\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -73\n \n \n \n \n \n \n \n \n \n \n \n \n \n 44\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 \n \n 28\n \n \n \n \n \n \n \n \n \n \n \n -28\n \n \n \n \n \n \n \n \n \n \n \n \n \n 5\n \n \n \n \n \n \n \n \n \n \n \n \n \n 9\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
VL2
\n
\n 141.1 kV / -5.0°
\n
\n
\n
VL3
\n
\n 136.3 kV / -12.7°
\n
\n
\n
VL4
\n
\n 137.4 kV / -10.3°
\n
\n
\n
VL5
\n
\n 137.6 kV / -8.8°
\n
\n
\n
VL7
\n
\n 14.9 kV / -13.4°
\n
\n
\n
VL9
\n
\n 12.7 kV / -14.9°
\n
\n
\n
\n
\n" }, - "execution_count": 7, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_network_area_diagram('VL4', 1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "execution_count": 5 } ], "metadata": { From 0de7a99a8b1a5581fe7d454e95d1f617759557d3 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Mon, 15 Sep 2025 13:55:49 +0200 Subject: [PATCH 08/27] Update widgets notebook Signed-off-by: Florian Dupuy --- pypowsybl_jupyter_widgets_demo.ipynb | 146 +++++++++++++++++++-------- 1 file changed, 102 insertions(+), 44 deletions(-) diff --git a/pypowsybl_jupyter_widgets_demo.ipynb b/pypowsybl_jupyter_widgets_demo.ipynb index ec6e731..0205bc7 100644 --- a/pypowsybl_jupyter_widgets_demo.ipynb +++ b/pypowsybl_jupyter_widgets_demo.ipynb @@ -31,34 +31,19 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ab21fcb8-d724-48f6-aa53-63e81a863e7a", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install pypowsybl" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2624eba1", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install pypowsybl_jupyter" - ] - }, - { - "cell_type": "code", - "execution_count": null, "id": "33e76b81-4788-4fd6-af5d-390cb6230c34", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:44:22.573220Z", + "start_time": "2025-09-15T11:44:22.075673Z" + } + }, "source": [ "import pypowsybl as pp\n", "from pypowsybl_jupyter import network_explorer" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "markdown", @@ -70,13 +55,18 @@ }, { "cell_type": "code", - "execution_count": null, "id": "ff9bf071-2f25-43a5-8db1-838dc781bd69", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:44:22.590632Z", + "start_time": "2025-09-15T11:44:22.578162Z" + } + }, "source": [ "n = pp.network.create_ieee14()" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -99,13 +89,34 @@ }, { "cell_type": "code", - "execution_count": null, "id": "4e7dd648-eef9-4a33-b7c8-3925fbca7395", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:44:22.817314Z", + "start_time": "2025-09-15T11:44:22.642074Z" + } + }, "source": [ "network_explorer(n)" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "HBox(children=(VBox(children=(Label(value='Voltage levels'), VBox(children=(Text(value='', description='Filter…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "b9e2458b1e6448ea99a2a1e03e484375" + } + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3 }, { "cell_type": "markdown", @@ -123,13 +134,34 @@ }, { "cell_type": "code", - "execution_count": null, "id": "5966caae-c700-4904-ba19-2c2400ba46e9", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:44:23.020790Z", + "start_time": "2025-09-15T11:44:22.882193Z" + } + }, "source": [ "network_explorer(n, vl_id='VL14', depth=4)" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "HBox(children=(VBox(children=(Label(value='Voltage levels'), VBox(children=(Text(value='', description='Filter…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "6feab69a0c854f7e8428d41957e0837e" + } + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4 }, { "cell_type": "markdown", @@ -157,23 +189,49 @@ }, { "cell_type": "code", - "execution_count": null, "id": "5467ab6f-8591-4b7c-a1e5-5b28953bd572", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:44:23.328666Z", + "start_time": "2025-09-15T11:44:23.163880Z" + } + }, "source": [ "microgrid_network = pp.network.load('./data/MicroGridTestConfiguration_T4_BE_BB_Complete_v2.zip', {'iidm.import.cgmes.post-processors': 'cgmesGLImport'})" - ] + ], + "outputs": [], + "execution_count": 5 }, { "cell_type": "code", - "execution_count": null, "id": "87f6a143-6b95-47e6-b0f4-8e561b6f31a7", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:44:23.476014Z", + "start_time": "2025-09-15T11:44:23.333757Z" + } + }, "source": [ "network_explorer(microgrid_network, nominal_voltages_top_tiers_filter=3)" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "HBox(children=(VBox(children=(Label(value='Voltage levels'), VBox(children=(Text(value='', description='Filter…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "35c2e1e5e69140c689af96eed6f26f25" + } + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6 }, { "cell_type": "markdown", From f9fd3e253ca70062e7387e83522c02fbab427031 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Mon, 15 Sep 2025 14:51:08 +0200 Subject: [PATCH 09/27] Update flow decomposition notebook Signed-off-by: Florian Dupuy --- flow_decomposition_visualization_demo.ipynb | 1118 ++----------------- requirements.in | 2 + requirements.txt | 9 +- 3 files changed, 90 insertions(+), 1039 deletions(-) diff --git a/flow_decomposition_visualization_demo.ipynb b/flow_decomposition_visualization_demo.ipynb index 978a076..ebf9044 100644 --- a/flow_decomposition_visualization_demo.ipynb +++ b/flow_decomposition_visualization_demo.ipynb @@ -22,49 +22,7 @@ "It does not intend to illustrate a mass analysis on multiple network but rather plot some metrics about a decomposition of a single network. \n", "All plots are in MW (if not explicitly normalized). \n", "A toy network is provided. Do not hesitate to load your network ! \n", - "We hope that this notebook can motivate you to use the flow decompositioin and encourage you to explore further the results of the flow decomposition. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", - "Looking in indexes: https://devin-depot.rte-france.com/repository/pypi-all/simple\n", - "Requirement already satisfied: pypowsybl in /home/kuleszahug/.local/lib/python3.8/site-packages (1.4.0.dev1)\n", - "Requirement already satisfied: plotly in /home/kuleszahug/.local/lib/python3.8/site-packages (5.20.0)\n", - "Collecting pycountry\n", - " Downloading https://devin-depot.rte-france.com/repository/pypi-all/packages/pycountry/23.12.11/pycountry-23.12.11-py3-none-any.whl (6.2 MB)\n", - "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.2/6.2 MB\u001b[0m \u001b[31m15.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mm eta \u001b[36m0:00:01\u001b[0m0:01\u001b[0m:01\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: prettytable in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (2.0.0)\n", - "Requirement already satisfied: numpy>=1.20.0 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (1.24.3)\n", - "Requirement already satisfied: networkx in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (3.1)\n", - "Requirement already satisfied: pandas>=1.3.5 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pypowsybl) (2.0.3)\n", - "Requirement already satisfied: tenacity>=6.2.0 in /home/kuleszahug/.local/lib/python3.8/site-packages (from plotly) (8.2.3)\n", - "Requirement already satisfied: packaging in /home/kuleszahug/.local/lib/python3.8/site-packages (from plotly) (23.1)\n", - "Requirement already satisfied: importlib-resources<6.0.0,>=5.12.0 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pycountry) (5.12.0)\n", - "Requirement already satisfied: zipp>=3.1.0 in /home/kuleszahug/.local/lib/python3.8/site-packages (from importlib-resources<6.0.0,>=5.12.0->pycountry) (3.15.0)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2.8.2)\n", - "Requirement already satisfied: pytz>=2020.1 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2023.3)\n", - "Requirement already satisfied: tzdata>=2022.1 in /home/kuleszahug/.local/lib/python3.8/site-packages (from pandas>=1.3.5->pypowsybl) (2023.3)\n", - "Requirement already satisfied: setuptools in /home/kuleszahug/.local/lib/python3.8/site-packages (from prettytable->pypowsybl) (69.1.1)\n", - "Requirement already satisfied: wcwidth in /home/kuleszahug/.local/lib/python3.8/site-packages (from prettytable->pypowsybl) (0.2.6)\n", - "Requirement already satisfied: six>=1.5 in /home/kuleszahug/.local/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=1.3.5->pypowsybl) (1.16.0)\n", - "\u001b[33mDEPRECATION: distro-info 0.23ubuntu1 has a non-standard version number. pip 24.1 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of distro-info or contact the author to suggest that they release a version with a conforming version number. Discussion can be found at https://github.com/pypa/pip/issues/12063\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mDEPRECATION: python-debian 0.1.36ubuntu1 has a non-standard version number. pip 24.1 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of python-debian or contact the author to suggest that they release a version with a conforming version number. Discussion can be found at https://github.com/pypa/pip/issues/12063\u001b[0m\u001b[33m\n", - "\u001b[0mInstalling collected packages: pycountry\n", - "Successfully installed pycountry-23.12.11\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "pip install pypowsybl plotly pycountry" + "We hope that this notebook can motivate you to use the flow decompositioin and encourage you to explore further the results of the flow decomposition." ] }, { @@ -83,9 +41,7 @@ }, { "cell_type": "code", - "execution_count": 5, "metadata": {}, - "outputs": [], "source": [ "import random\n", "import numpy as np\n", @@ -99,17 +55,19 @@ "\n", "pd.options.display.max_columns = None\n", "pd.options.display.expand_frame_repr = False\n" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 6, "metadata": {}, - "outputs": [], "source": [ "colors = px.colors.qualitative.Dark24 + px.colors.qualitative.Light24\n", "random.Random(42).shuffle(colors)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -123,9 +81,7 @@ }, { "cell_type": "code", - "execution_count": 7, "metadata": {}, - "outputs": [], "source": [ "def assign_country_all_substations(net):\n", " substation_ids = net.get_substations().index\n", @@ -161,17 +117,19 @@ " #net.dump(\"/tmp/test-net.xiidm\")\n", "\n", " return net" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 8, "metadata": {}, - "outputs": [], "source": [ "net = get_upgraded_ieee_net()\n", "#net = pp.network.load(\"\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -196,387 +154,30 @@ }, { "cell_type": "code", - "execution_count": 9, "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
branch_idcontingency_idcountry1country2ac_reference_flowdc_reference_flowcommercial_flowx_node_flowpst_flowinternal_flowloop_flow_from_bgloop_flow_from_czloop_flow_from_dkloop_flow_from_eeloop_flow_from_frloop_flow_from_huloop_flow_from_ieloop_flow_from_ltloop_flow_from_lu
xnec_id
L105-110-1L105-110-1LTLU45.99082344.63249317.5750740.00.00.0000000.1343780.599154-1.2432890.3563872.012950-1.7980940.0135967.22976420.436399
L109-114-1L109-114-1LUBG7.7957687.30077322.2246040.00.00.000000-1.1960140.644376-2.7303690.9413903.517598-1.3160790.013292-0.902432-12.075320
L112-114-1L112-114-1LUBG-7.574891-6.799883-28.1372340.00.00.0000000.672358-0.956081-0.625192-0.860768-4.0503283.347053-0.0210962.14661033.618433
L115-122-1L115-122-1DKHU54.84850949.336716142.5253110.00.00.000000-0.0112580.241060-42.379365-0.0066620.004200-51.0634060.0060480.037167-0.016380
L116-120-1L116-120-1HUHU-62.152247-60.255260317.9894210.00.0-369.5924340.002858-0.061206111.9228080.001691-0.0010660.000000-0.001536-0.0094370.004159
............................................................
T7130-130-1T7130-130-1DKDK1299.3658761299.368013537.8844150.00.0760.863157-0.0358210.7670220.000000-0.0211960.013363-0.1883140.0192450.118261-0.052119
T7139-139-1T7139-139-1DKDK707.365876707.368013291.0637710.00.0415.683801-0.0358210.7670220.000000-0.0211960.013363-0.1883140.0192450.118261-0.052119
T7166-166-1T7166-166-1LTLT560.365876560.368013122.8652490.00.0436.836062-0.0358210.7670220.164522-0.0211960.013363-0.1883140.0192450.000000-0.052119
T73-74-1T73-74-1BGBG-247.856369-245.142195151.3112180.00.054.5383030.00000017.82880810.8199482.15097911.5868537.5137310.35708910.797059-19.525040
T81-88-1T81-88-1DKDK204.545743200.64639743.5397780.00.071.88703581.27747813.4124920.0000003.882132-41.027528-21.4709550.420337-3.44203955.893323
\n", - "

227 rows × 19 columns

\n", - "
" - ], - "text/plain": [ - " branch_id contingency_id country1 country2 ac_reference_flow dc_reference_flow commercial_flow x_node_flow pst_flow internal_flow loop_flow_from_bg loop_flow_from_cz loop_flow_from_dk loop_flow_from_ee loop_flow_from_fr loop_flow_from_hu loop_flow_from_ie loop_flow_from_lt loop_flow_from_lu\n", - "xnec_id \n", - "L105-110-1 L105-110-1 LT LU 45.990823 44.632493 17.575074 0.0 0.0 0.000000 0.134378 0.599154 -1.243289 0.356387 2.012950 -1.798094 0.013596 7.229764 20.436399\n", - "L109-114-1 L109-114-1 LU BG 7.795768 7.300773 22.224604 0.0 0.0 0.000000 -1.196014 0.644376 -2.730369 0.941390 3.517598 -1.316079 0.013292 -0.902432 -12.075320\n", - "L112-114-1 L112-114-1 LU BG -7.574891 -6.799883 -28.137234 0.0 0.0 0.000000 0.672358 -0.956081 -0.625192 -0.860768 -4.050328 3.347053 -0.021096 2.146610 33.618433\n", - "L115-122-1 L115-122-1 DK HU 54.848509 49.336716 142.525311 0.0 0.0 0.000000 -0.011258 0.241060 -42.379365 -0.006662 0.004200 -51.063406 0.006048 0.037167 -0.016380\n", - "L116-120-1 L116-120-1 HU HU -62.152247 -60.255260 317.989421 0.0 0.0 -369.592434 0.002858 -0.061206 111.922808 0.001691 -0.001066 0.000000 -0.001536 -0.009437 0.004159\n", - "... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", - "T7130-130-1 T7130-130-1 DK DK 1299.365876 1299.368013 537.884415 0.0 0.0 760.863157 -0.035821 0.767022 0.000000 -0.021196 0.013363 -0.188314 0.019245 0.118261 -0.052119\n", - "T7139-139-1 T7139-139-1 DK DK 707.365876 707.368013 291.063771 0.0 0.0 415.683801 -0.035821 0.767022 0.000000 -0.021196 0.013363 -0.188314 0.019245 0.118261 -0.052119\n", - "T7166-166-1 T7166-166-1 LT LT 560.365876 560.368013 122.865249 0.0 0.0 436.836062 -0.035821 0.767022 0.164522 -0.021196 0.013363 -0.188314 0.019245 0.000000 -0.052119\n", - "T73-74-1 T73-74-1 BG BG -247.856369 -245.142195 151.311218 0.0 0.0 54.538303 0.000000 17.828808 10.819948 2.150979 11.586853 7.513731 0.357089 10.797059 -19.525040\n", - "T81-88-1 T81-88-1 DK DK 204.545743 200.646397 43.539778 0.0 0.0 71.887035 81.277478 13.412492 0.000000 3.882132 -41.027528 -21.470955 0.420337 -3.442039 55.893323\n", - "\n", - "[227 rows x 19 columns]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ "parameters = pp.flowdecomposition.Parameters(enable_losses_compensation=True,\n", - " rescale_enabled=False,\n", - " )\n", + " rescale_mode=pp.flowdecomposition.RescaleMode.ACER_METHODOLOGY)\n", "flow_dec_object = pp.flowdecomposition.create_decomposition() \\\n", " .add_5perc_ptdf_as_monitored_elements()\n", "flow_dec_original=flow_dec_object.run(net, flow_decomposition_parameters=parameters)\n", "flow_dec_original" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 10, "metadata": {}, - "outputs": [], "source": [ "flow_dec = flow_dec_original.copy()" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 11, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Country(alpha_2='EE', alpha_3='EST', flag='🇪🇪', name='Estonia', numeric='233', official_name='Republic of Estonia'),\n", - " Country(alpha_2='FR', alpha_3='FRA', flag='🇫🇷', name='France', numeric='250', official_name='French Republic'),\n", - " Country(alpha_2='IE', alpha_3='IRL', flag='🇮🇪', name='Ireland', numeric='372'),\n", - " Country(alpha_2='CZ', alpha_3='CZE', flag='🇨🇿', name='Czechia', numeric='203', official_name='Czech Republic'),\n", - " Country(alpha_2='HU', alpha_3='HUN', flag='🇭🇺', name='Hungary', numeric='348', official_name='Hungary'),\n", - " Country(alpha_2='LT', alpha_3='LTU', flag='🇱🇹', name='Lithuania', numeric='440', official_name='Republic of Lithuania'),\n", - " Country(alpha_2='DK', alpha_3='DNK', flag='🇩🇰', name='Denmark', numeric='208', official_name='Kingdom of Denmark'),\n", - " Country(alpha_2='BG', alpha_3='BGR', flag='🇧🇬', name='Bulgaria', numeric='100', official_name='Republic of Bulgaria'),\n", - " Country(alpha_2='LU', alpha_3='LUX', flag='🇱🇺', name='Luxembourg', numeric='442', official_name='Grand Duchy of Luxembourg')]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ "flow_dec['total_flow'] = flow_dec[[c for c in flow_dec.columns if ('reference' not in c and 'flow' in c)]].sum(axis=1)\n", "flow_dec['total_loop_flow'] = flow_dec[[c for c in flow_dec.columns if 'loop_flow_from_' in c]].sum(axis=1)\n", @@ -587,7 +188,9 @@ "countries_alpha2 = set(flow_dec[\"country1\"]).union(set(flow_dec[\"country2\"]))\n", "countries = alpha_2_to_country(countries_alpha2)\n", "countries" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -602,9 +205,7 @@ }, { "cell_type": "code", - "execution_count": 12, "metadata": {}, - "outputs": [], "source": [ "def flow_decomposition_bar_chart(sorting_column, ascending=False, head=20, plot_scatter=True):\n", " threshold = .05\n", @@ -641,583 +242,81 @@ " name='total_loop_flow'\n", " )\n", " fig.show(renderer=\"notebook\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 13, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart('total_loop_flow')" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 14, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart('total_loop_flow', ascending=True)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 15, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart('total_flow')" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 16, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart('pst_flow')" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 17, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart('pst_flow', ascending=True)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 18, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart(f'loop_flow_from_{random.Random(42).choice(list(countries)).alpha_2.lower()}')" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 19, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart(f'loop_flow_from_{random.Random(42).choice(list(countries)).alpha_2.lower()}', ascending=True)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 20, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "flow_decomposition_bar_chart(f'loop_flow_from_{random.Random(12).choice(list(countries)).alpha_2.lower()}')" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -1236,60 +335,20 @@ }, { "cell_type": "code", - "execution_count": 21, "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "unsupported operand type(s) for /: 'str' and 'int'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/ops/array_ops.py\u001b[0m in \u001b[0;36m_na_arithmetic_op\u001b[0;34m(left, right, op, is_cmp)\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 171\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 172\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/computation/expressions.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(op, a, b, use_numexpr)\u001b[0m\n\u001b[1;32m 238\u001b[0m \u001b[0;31m# error: \"None\" not callable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 239\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop_str\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore[misc]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 240\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_evaluate_standard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop_str\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/computation/expressions.py\u001b[0m in \u001b[0;36m_evaluate_standard\u001b[0;34m(op, op_str, a, b)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0m_store_test_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 70\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'str' and 'int'", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mdf_sum1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mflow_dec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mdf_sum2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mflow_dec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mdf_lf_per_country\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf_sum1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf_sum2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/ops/common.py\u001b[0m in \u001b[0;36mnew_method\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[0mother\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitem_from_zerodim\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 80\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 81\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 82\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnew_method\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/arraylike.py\u001b[0m in \u001b[0;36m__truediv__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 208\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0munpack_zerodim_and_defer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"__truediv__\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__truediv__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 210\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_arith_method\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moperator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtruediv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 211\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 212\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0munpack_zerodim_and_defer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"__rtruediv__\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m_arith_method\u001b[0;34m(self, other, op)\u001b[0m\n\u001b[1;32m 7455\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0malign_method_FRAME\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7456\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7457\u001b[0;31m \u001b[0mnew_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dispatch_frame_op\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7458\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_construct_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7459\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m_dispatch_frame_op\u001b[0;34m(self, right, func, axis)\u001b[0m\n\u001b[1;32m 7482\u001b[0m \u001b[0;31m# i.e. scalar, faster than checking np.ndim(right) == 0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7483\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrstate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"ignore\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7484\u001b[0;31m \u001b[0mbm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_mgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray_op\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7485\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_constructor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7486\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, f, align_keys, **kwargs)\u001b[0m\n\u001b[1;32m 348\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 349\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 350\u001b[0;31m \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 351\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 352\u001b[0m \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/internals/blocks.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, func, **kwargs)\u001b[0m\n\u001b[1;32m 327\u001b[0m \u001b[0mone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 328\u001b[0m \"\"\"\n\u001b[0;32m--> 329\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 330\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 331\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_split_op_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/ops/array_ops.py\u001b[0m in \u001b[0;36marithmetic_op\u001b[0;34m(left, right, op)\u001b[0m\n\u001b[1;32m 230\u001b[0m \u001b[0;31m# error: Argument 1 to \"_na_arithmetic_op\" has incompatible type\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 231\u001b[0m \u001b[0;31m# \"Union[ExtensionArray, ndarray[Any, Any]]\"; expected \"ndarray[Any, Any]\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 232\u001b[0;31m \u001b[0mres_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_na_arithmetic_op\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore[arg-type]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 233\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 234\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mres_values\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/ops/array_ops.py\u001b[0m in \u001b[0;36m_na_arithmetic_op\u001b[0;34m(left, right, op, is_cmp)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;31m# Don't do this for comparisons, as that will handle complex numbers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;31m# incorrectly, see GH#32047\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_masked_arith_op\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/pandas/core/ops/array_ops.py\u001b[0m in \u001b[0;36m_masked_arith_op\u001b[0;34m(x, y, op)\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 134\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 135\u001b[0;31m \u001b[0mresult\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmask\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxrav\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmask\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 136\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mputmask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m~\u001b[0m\u001b[0mmask\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'str' and 'int'" - ] - } - ], "source": [ "c1, c2 = 'country1', 'country2'\n", - "df_sum1 = flow_dec.groupby(c1).sum().transpose()\n", - "df_sum2 = flow_dec.groupby(c2).sum().transpose()\n", - "df_lf_per_country = pd.concat([df_sum1, df_sum2]).groupby(level=0).sum()/2" - ] + "df_sum1 = flow_dec.groupby(c1).sum(numeric_only=True).transpose()\n", + "df_sum2 = flow_dec.groupby(c2).sum(numeric_only=True).transpose()\n", + "df_lf_per_country = pd.concat([df_sum1, df_sum2]).groupby(level=0).sum()/2\n", + "df_lf_per_country" + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": 22, "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'df_lf_per_country' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mthreshold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m.03\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_lf_per_country\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mdf_p\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'loop_flow_from'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mdf_s\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdf_p\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_s\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mascending\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'df_lf_per_country' is not defined" - ] - } - ], "source": [ "threshold = .03\n", "df = df_lf_per_country.copy().transpose()\n", @@ -1313,13 +372,13 @@ " }\n", " )\n", "fig.show(renderer=\"notebook\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "threshold = .03\n", "df = df_lf_per_country.copy().transpose()\n", @@ -1343,7 +402,9 @@ " }\n", " )\n", "fig.show(renderer=\"notebook\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -1356,21 +417,7 @@ }, { "cell_type": "code", - "execution_count": 23, "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'df_lf_per_country' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mthreshold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m.03\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_lf_per_country\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mdf_p\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'loop_flow_from'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mdf_s\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdf_p\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_s\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mascending\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'df_lf_per_country' is not defined" - ] - } - ], "source": [ "threshold = .03\n", "df = df_lf_per_country.copy().transpose()\n", @@ -1394,13 +441,13 @@ " }\n", " )\n", "fig.show(renderer=\"notebook\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "threshold = .03\n", "df = df_lf_per_country.copy().transpose()\n", @@ -1424,7 +471,9 @@ " }\n", " )\n", "fig.show(renderer=\"notebook\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -1438,9 +487,7 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "df_matrix = df_lf_per_country.transpose().sort_index(axis=1).sort_index()\n", "\n", @@ -1463,7 +510,9 @@ " ticktext=[np.sign(v)*10**abs(v) for v in tickvals],\n", "))\n", "fig.show(renderer=\"notebook\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -1488,9 +537,7 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "def plot_map(source = None, visited = None):\n", " if (visited is None) == (source is None) :\n", @@ -1534,34 +581,29 @@ " lonaxis_range=[-20, 50]\n", " )\n", " fig.show(renderer=\"notebook\")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "country = random.Random(12).choice(list(countries)).name\n", "country = pycountry.countries.get(alpha_2='FR').name # \"France\"\n", "plot_map(source=country)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "plot_map(visited=country)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, + ], "outputs": [], - "source": [] + "execution_count": null } ], "metadata": { diff --git a/requirements.in b/requirements.in index 75ec8d9..6982132 100644 --- a/requirements.in +++ b/requirements.in @@ -1,2 +1,4 @@ pypowsybl==1.12.0 pypowsybl-jupyter==1.2.1 +plotly==6.3.0 +pycountry==24.6.1 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 158d24f..19277d1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,6 @@ # # pip-compile requirements.in # - anywidget==0.9.18 # via pypowsybl-jupyter asttokens==3.0.0 @@ -27,16 +26,22 @@ jupyterlab-widgets==3.0.15 # via ipywidgets matplotlib-inline==0.1.7 # via ipython +narwhals==2.5.0 + # via plotly networkx==3.4.2 # via pypowsybl numpy==2.2.6 # via pandas +packaging==25.0 + # via plotly pandas==2.3.2 # via pypowsybl parso==0.8.5 # via jedi pexpect==4.9.0 # via ipython +plotly==6.3.0 + # via -r requirements.in prettytable==3.16.0 # via pypowsybl prompt-toolkit==3.0.52 @@ -47,6 +52,8 @@ ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data +pycountry==24.6.1 + # via -r requirements.in pygments==2.19.2 # via ipython pypowsybl==1.12.0 From c5a16f4b52dc544cf12fff026d33778e81ffffce Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Tue, 16 Sep 2025 12:34:54 +0200 Subject: [PATCH 10/27] Update dynaflow notebook Signed-off-by: Florian Dupuy --- dynaflow/config.yml | 7 +- dynaflow/pypowsybl_dynaflow.ipynb | 552 ++++++++++++++++++++++-------- 2 files changed, 412 insertions(+), 147 deletions(-) diff --git a/dynaflow/config.yml b/dynaflow/config.yml index cc63e5a..d195a88 100644 --- a/dynaflow/config.yml +++ b/dynaflow/config.yml @@ -1,5 +1,5 @@ dynaflow: - homeDir: /home/jovyan/dynaflow/dynaflow-launcher + homeDir: WORKING_DIR/dynaflow-launcher debug: true dynaflow-default-parameters: @@ -9,7 +9,6 @@ dynaflow-default-parameters: vscAsGenerators: true lccAsLoads: true dsoVoltageLevel: 63.0 - outputDir: /home/jovyan/tmp - settingPath: /home/jovyan/dynaflow/dynaflow-launcher/DB/setting.xml - assemblingPath: /home/jovyan/dynaflow/dynaflow-launcher/DB/assembling.xml + settingPath: WORKING_DIR/setting-1.xml + assemblingPath: WORKING_DIR/assembling.xml timeStep: 2.6 \ No newline at end of file diff --git a/dynaflow/pypowsybl_dynaflow.ipynb b/dynaflow/pypowsybl_dynaflow.ipynb index 3670169..fc0ff60 100644 --- a/dynaflow/pypowsybl_dynaflow.ipynb +++ b/dynaflow/pypowsybl_dynaflow.ipynb @@ -23,86 +23,189 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "1/ DYNAFLOW installing" + "## 1/ Dynaflow installing\n", + "\n", + "**For Windows**\n", + "Follow [this link](https://github.com/dynawo/dynaflow-launcher/?tab=readme-ov-file#dynaflow-launcher-distribution) to install Dynaflow-launcher.\n", + "\n", + "**For Linux**\n", + "You can launch the following commands to download the latest distribution:\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-16T10:32:36.426869Z", + "start_time": "2025-09-16T10:32:22.712989Z" + } + }, "source": [ "!curl -L $(curl -s -L -X GET https://api.github.com/repos/dynawo/dynaflow-launcher/releases/latest | grep \"DynaFlowLauncher_Linux\" | grep url | cut -d '\"' -f 4) -o DynaflowLauncher_Linux_latest.zip\n", - "!unzip DynaflowLauncher_Linux_latest.zip > /dev/null 2>&1\n", + "!unzip -o -q DynaflowLauncher_Linux_latest.zip\n", "!./dynaflow-launcher/dynaflow-launcher.sh help" - ] + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\r\n", + " Dload Upload Total Spent Left Speed\r\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r\n", + "100 193M 100 193M 0 0 59.1M 0 0:00:03 0:00:03 --:--:-- 66.5M\r\n", + "Warning: Binary output can mess up your terminal. Use \"--output -\" to tell \r\n", + "Warning: curl to output it to your terminal anyway, or consider \"--output \r\n", + "Warning: \" to save to a file.\r\n", + "Ignoring PCI device with non-16bit domain.\r\n", + "Pass --enable-32bits-pci-domain to configure to support such devices\r\n", + "(warning: it would break the library ABI, don't enable unless really needed).\r\n", + "the option '--config' is required but missing\r\n", + "DynaFlowLauncher v1.7.0\r\n", + " -h [ --help ] Display help message\r\n", + " -v [ --version ] Display version\r\n", + " --log-level arg Dynawo logger level (allowed values are ERROR, WARN, \r\n", + " INFO, DEBUG): default is INFO\r\n", + " --network arg Network file path to process (IIDM support only)\r\n", + " --config arg launcher Configuration file to use\r\n", + " --contingencies arg Contingencies file path to process (Security Analysis)\r\n", + " --nsa Run steady state calculation followed by security \r\n", + " analysis. Requires contingencies file to be defined.\r\n", + " --input-archive arg Path to a ZIP archive containing input files for \r\n", + " '--network', '--config', and '--contingencies'.\r\n", + "\r\n" + ] + } + ], + "execution_count": 1 }, { "cell_type": "markdown", "metadata": {}, - "source": [ - "2/ POWSYBL installing and setting of default parameter (path to dynaflow_launcher)" - ] + "source": "## 2/ PowSyBl installing and setting of default parameter (path to dynaflow_launcher)" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pip install pypowsybl > /dev/null 2>&1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-16T10:32:36.946073Z", + "start_time": "2025-09-16T10:32:36.448673Z" + } + }, "source": [ - "!mkdir /home/jovyan/.itools/\n", - "!cp /home/jovyan/dynaflow/config.yml /home/jovyan/.itools/\n", - "!cat /home/jovyan/.itools/config.yml" - ] + "!mkdir /home/$USER/.itools/\n", + "!cp config.yml /home/$USER/.itools/\n", + "!sed -i \"s|WORKING_DIR|$(pwd)|g\" /home/$USER/.itools/config.yml\n", + "!cat /home/$USER/.itools/config.yml" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mkdir: cannot create directory ‘/home/dupuyflo/.itools/’: File exists\r\n", + "dynaflow: \r\n", + " homeDir: /home/dupuyflo/Projects/powsybl/pypowsybl-notebooks/dynaflow/dynaflow-launcher\r\n", + " debug: true \r\n", + "\r\n", + "dynaflow-default-parameters: \r\n", + " svcRegulationOn: true\r\n", + " shuntRegulationOn: true \r\n", + " automaticSlackBusOn: true \r\n", + " vscAsGenerators: true\r\n", + " lccAsLoads: true \r\n", + " dsoVoltageLevel: 63.0 \r\n", + " settingPath: /home/dupuyflo/Projects/powsybl/pypowsybl-notebooks/dynaflow/dynaflow/setting-1.xml\r\n", + " assemblingPath: /home/dupuyflo/Projects/powsybl/pypowsybl-notebooks/dynaflow/dynaflow/assembling.xml\r\n", + " timeStep: 2.6 " + ] + } + ], + "execution_count": 2 }, { "cell_type": "markdown", "metadata": {}, - "source": [ - "3/ NOTEBOOK" - ] + "source": "## 3/ Notebook" }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-16T10:32:37.361662Z", + "start_time": "2025-09-16T10:32:36.954603Z" + } + }, "source": [ "import pypowsybl\n", "import pypowsybl.network as pn\n", "import pypowsybl.loadflow as lf\n", "import pypowsybl.security as sa\n", "import os.path" - ] + ], + "outputs": [], + "execution_count": 3 }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-16T10:32:37.390810Z", + "start_time": "2025-09-16T10:32:37.367147Z" + } + }, "source": [ "# Load initial situation\n", "network_file = 'PhaseShifters.iidm'\n", "network = pn.load(network_file)\n", "network.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 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \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 -20\n \n \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 -20\n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \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 -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 40\n \n \n \n \n \n \n \n \n \n \n \n -40\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BUS 10_VL
\n
\n 402.8 kV / -0.0°
\n
\n
\n
BUS 1_VL
\n
\n 73.1 kV / 12.6°
\n
\n
\n
BUS 5_VL
\n
\n 68.0 kV / 0.2°
\n
\n
\n
BUS 6_VL
\n
\n 402.9 kV / 0.1°
\n
\n 402.9 kV / 0.1°
\n
\n 402.9 kV / 0.1°
\n
\n
\n
\n
\n" + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4 }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-16T10:32:37.446366Z", + "start_time": "2025-09-16T10:32:37.427200Z" + } + }, + "source": [ + "# Initial tap positions\n", + "network.get_phase_tap_changers()" + ], "outputs": [ { "data": { + "text/plain": [ + " side tap solved_tap_position low_tap high_tap \\\n", + "id \n", + "_BUS____5-BUS____6-1_PS 13 NaN 1 25 \n", + "_BUS____5-BUS____7-2_PS 13 NaN 1 25 \n", + "\n", + " step_count oltc regulating regulation_mode \\\n", + "id \n", + "_BUS____5-BUS____6-1_PS 25 True True CURRENT_LIMITER \n", + "_BUS____5-BUS____7-2_PS 25 True True CURRENT_LIMITER \n", + "\n", + " regulation_value target_deadband regulating_bus_id \n", + "id \n", + "_BUS____5-BUS____6-1_PS 770.0 0.0 _BUS____5_VL_0 \n", + "_BUS____5-BUS____7-2_PS 770.0 0.0 _BUS____5_VL_0 " + ], "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", + "
i1i2
id
_BUS____5-BUS____6-1_PS233.95231939.468929
_BUS____5-BUS____7-2_PS233.95231939.468929
_BUS____5-BUS____8-1_PT383.85538964.758329
\n", + "
" ] }, - "execution_count": 16, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "# Final tap positions after N-1 simulation with different time constants\n", - "network2.get_phase_tap_changers()" - ] + "execution_count": 11 }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-16T10:32:40.210285Z", + "start_time": "2025-09-16T10:32:40.199293Z" + } + }, "cell_type": "code", - "execution_count": 17, - "metadata": {}, + "source": [ + "print('\\nTransits in transformers with different time constants:')\n", + "network2.get_2_windings_transformers()[['i1','i2']]" + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Transits in transformers with identical time constants:\n", - " i1 i2\n", - "id \n", - "_BUS____5-BUS____6-1_PS 233.952319 39.468929\n", - "_BUS____5-BUS____7-2_PS 233.952319 39.468929\n", - "_BUS____5-BUS____8-1_PT 383.855389 64.758329\n", "\n", - "Transits in transformers with different time constants:\n", - " i1 i2\n", - "id \n", - "_BUS____5-BUS____6-1_PS 223.959508 37.783092\n", - "_BUS____5-BUS____7-2_PS 253.934704 42.840058\n", - "_BUS____5-BUS____8-1_PT 373.860516 63.072144\n" + "Transits in transformers with different time constants:\n" ] + }, + { + "data": { + "text/plain": [ + " i1 i2\n", + "id \n", + "_BUS____5-BUS____6-1_PS 223.959508 37.783092\n", + "_BUS____5-BUS____7-2_PS 253.934704 42.840058\n", + "_BUS____5-BUS____8-1_PT 373.860516 63.072144" + ], + "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", + "
i1i2
id
_BUS____5-BUS____6-1_PS223.95950837.783092
_BUS____5-BUS____7-2_PS253.93470442.840058
_BUS____5-BUS____8-1_PT373.86051663.072144
\n", + "
" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" } ], - "source": [ - "print('Transits in transformers with identical time constants:')\n", - "print(network1.get_2_windings_transformers()[['i1','i2']])\n", - "print('\\nTransits in transformers with different time constants:')\n", - "print(network2.get_2_windings_transformers()[['i1','i2']])" - ] + "execution_count": 12 }, { "cell_type": "markdown", From c54e413ebf84fa3ea24e3051113eeba3099bbd31 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Tue, 16 Sep 2025 12:56:24 +0200 Subject: [PATCH 11/27] Update open-rao notebook Signed-off-by: Florian Dupuy --- open_rao.ipynb | 970 ++++++++++++++++--------------------------------- 1 file changed, 313 insertions(+), 657 deletions(-) diff --git a/open_rao.ipynb b/open_rao.ipynb index 28b36a1..f85492e 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -20,38 +20,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-04-25T09:44:29.641944Z", - "start_time": "2025-04-25T09:44:28.397731Z" - } - }, - "source": "pip install pypowsybl==1.10.0", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: pypowsybl==1.10.0 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==1.10.0) (3.11.0)\r\n", - "Requirement already satisfied: networkx in ./venv/lib/python3.8/site-packages (from pypowsybl==1.10.0) (3.1)\r\n", - "Requirement already satisfied: pandas>=2.0.3 in ./venv/lib/python3.8/site-packages (from pypowsybl==1.10.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.10.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.10.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.10.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.10.0) (1.24.4)\r\n", - "Requirement already satisfied: wcwidth in ./venv/lib/python3.8/site-packages (from prettytable>=2.0.0->pypowsybl==1.10.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.10.0) (1.17.0)\r\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "execution_count": 41 - }, - { - "cell_type": "code", - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-25T09:44:29.662606Z", - "start_time": "2025-04-25T09:44:29.659526Z" + "end_time": "2025-09-16T10:46:49.175868Z", + "start_time": "2025-09-16T10:46:48.726425Z" } }, "source": [ @@ -59,7 +29,7 @@ "from pypowsybl.rao import Parameters as RaoParameters" ], "outputs": [], - "execution_count": 42 + "execution_count": 1 }, { "cell_type": "markdown", @@ -72,43 +42,15 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-04-25T09:44:29.723509Z", - "start_time": "2025-04-25T09:44:29.710478Z" + "end_time": "2025-09-16T10:46:49.188459Z", + "start_time": "2025-09-16T10:46:49.180214Z" } }, "source": [ "n12 = pp.network.load('./data/rao/12_node_network.uct')" ], - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-25 11:44:29,712 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,713 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,713 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,713 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,713 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,714 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,714 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,716 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,716 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,716 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,717 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,717 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,718 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,718 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,718 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,719 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,719 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:29,719 - 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-25 11:44:29,720 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-25 11:44:29,720 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-25 11:44:29,721 - 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" - ] - } - ], - "execution_count": 43 + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -121,36 +63,27 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-04-25T09:44:29.825086Z", - "start_time": "2025-04-25T09:44:29.799849Z" + "end_time": "2025-09-16T10:46:49.256082Z", + "start_time": "2025-09-16T10:46:49.237350Z" } }, "source": [ "n12.get_network_area_diagram()" ], "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-25 11:44:29,809 - INFO - Number of steps: 688\n", - "2025-04-25 11:44:29,810 - INFO - Elapsed time: 0.004018472\n", - "2025-04-25 11:44:29,810 - 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" + "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": 44, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 44 + "execution_count": 3 }, { "cell_type": "markdown", @@ -170,8 +103,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-04-25T09:44:29.905286Z", - "start_time": "2025-04-25T09:44:29.878799Z" + "end_time": "2025-09-16T10:46:49.339226Z", + "start_time": "2025-09-16T10:46:49.309090Z" } }, "source": [ @@ -179,131 +112,19 @@ "n12.get_network_area_diagram()" ], "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-25 11:44:29,880 - INFO - loadflow provider used is : OpenLoadFlow\n", - "2025-04-25 11:44:29,881 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.14.1, gitVersion=092b42a34ce74e1a2fe7c58ce5b5422945218e8d, gitBranch=UNKNOWN, buildTimestamp=2024-12-18T10:01:21.754Z}\n", - "2025-04-25 11:44:29,885 - 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-04-25 11:44:29,886 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:29,886 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-25 11:44:29,887 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-25 11:44:29,887 - 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-25 11:44:29,888 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-25 11:44:29,888 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-25 11:44:29,889 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", - "2025-04-25 11:44:29,890 - 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-25 11:44:29,891 - INFO - Load flow ran in 9 ms\n", - "2025-04-25 11:44:29,896 - INFO - Number of steps: 688\n", - "2025-04-25 11:44:29,896 - INFO - Elapsed time: 0.002389342\n", - "2025-04-25 11:44:29,897 - 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" + "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": 45, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 45 + "execution_count": 4 }, { "cell_type": "markdown", @@ -317,8 +138,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-04-25T09:44:30.007418Z", - "start_time": "2025-04-25T09:44:29.971672Z" + "end_time": "2025-09-16T10:46:49.425743Z", + "start_time": "2025-09-16T10:46:49.393220Z" } }, "source": [ @@ -327,131 +148,19 @@ "n12.get_network_area_diagram()" ], "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-25 11:44:29,973 - INFO - loadflow provider used is : OpenLoadFlow\n", - "2025-04-25 11:44:29,974 - INFO - Version: {repositoryName=powsybl-open-loadflow, mavenProjectVersion=1.14.1, gitVersion=092b42a34ce74e1a2fe7c58ce5b5422945218e8d, gitBranch=UNKNOWN, buildTimestamp=2024-12-18T10:01:21.754Z}\n", - "2025-04-25 11:44:29,978 - 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-04-25 11:44:29,980 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:29,981 - WARNING - Network {CC0 SC0}: 12 generators have been discarded from active power control because of maxP not plausible\n", - "2025-04-25 11:44:29,981 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-25 11:44:29,982 - 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-25 11:44:29,983 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Network extension bus')\n", - "2025-04-25 11:44:29,984 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-25 11:44:29,985 - INFO - Slack bus active power (-0.0 MW) distributed in 0 distribution iteration(s)\n", - "2025-04-25 11:44:29,986 - 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-25 11:44:29,987 - INFO - Load flow ran in 12 ms\n", - "2025-04-25 11:44:29,992 - INFO - Number of steps: 688\n", - "2025-04-25 11:44:29,993 - INFO - Elapsed time: 0.003730359\n", - "2025-04-25 11:44:29,993 - 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" + "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": 46, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 46 + "execution_count": 5 }, { "cell_type": "markdown", @@ -466,8 +175,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-04-25T09:44:30.140632Z", - "start_time": "2025-04-25T09:44:30.086640Z" + "end_time": "2025-09-16T10:46:49.670393Z", + "start_time": "2025-09-16T10:46:49.488984Z" } }, "source": [ @@ -487,80 +196,20 @@ ], "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-04-25 11:44:30,090 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,091 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,091 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,092 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,092 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,093 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,093 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,093 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,094 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,094 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,094 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,095 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,096 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,096 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,096 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,097 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,097 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,098 - 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-25 11:44:30,099 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-25 11:44:30,099 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-25 11:44:30,100 - 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-25 11:44:30,106 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", - "2025-04-25 11:44:30,107 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,108 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-25 11:44:30,109 - 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-25 11:44:30,109 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,110 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-25 11:44:30,110 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-04-25 11:44:30,111 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,112 - 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-25 11:44:30,113 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-25 11:44:30,114 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,114 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-25 11:44:30,115 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-25 11:44:30,115 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,115 - INFO - Linear optimization on root leaf\n", - "2025-04-25 11:44:30,116 - INFO - No range actions to optimize\n", - "2025-04-25 11:44:30,116 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", - "2025-04-25 11:44:30,116 - INFO - No range actions activated\n", - "2025-04-25 11:44:30,117 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,117 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-25 11:44:30,118 - INFO - Search depth 1 [start]\n", - "2025-04-25 11:44:30,118 - INFO - Leaves to evaluate: 1\n", - "2025-04-25 11:44:30,119 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-25 11:44:30,120 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,120 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-25 11:44:30,121 - 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-25 11:44:30,123 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,123 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-25 11:44:30,124 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", - "2025-04-25 11:44:30,125 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,127 - 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-25 11:44:30,128 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-25 11:44:30,129 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-25 11:44:30,129 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-25 11:44:30,130 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-25 11:44:30,131 - INFO - Search depth 1 [end]\n", - "2025-04-25 11:44:30,132 - 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-25 11:44:30,133 - INFO - Search depth 1 best leaf: No range actions activated\n", - "2025-04-25 11:44:30,134 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,135 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-25 11:44:30,135 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", - "2025-04-25 11:44:30,136 - INFO - Best leaf: No range actions activated\n", - "2025-04-25 11:44:30,136 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,137 - 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-25 11:44:30,137 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-25 11:44:30,138 - INFO - ----- Preventive perimeter optimization [end]\n" + "ename": "PyPowsyblError", + "evalue": "RaoParameters version '2.4' cannot be deserialized. The only supported version currently is '3.1'.", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mPyPowsyblError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[6], line 6\u001B[0m\n\u001B[1;32m 4\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 5\u001B[0m rao_parameters \u001B[38;5;241m=\u001B[39m RaoParameters()\n\u001B[0;32m----> 6\u001B[0m \u001B[43mrao_parameters\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload_from_file_source\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43m./data/rao/rao_parameters.json\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[1;32m 7\u001B[0m \u001B[38;5;66;03m# set up logging\u001B[39;00m\n\u001B[1;32m 8\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21;01mlogging\u001B[39;00m\n", + "File \u001B[0;32m~/Projects/powsybl/pypowsybl-notebooks/.venv/lib/python3.10/site-packages/pypowsybl/rao/impl/parameters.py:113\u001B[0m, in \u001B[0;36mParameters.load_from_file_source\u001B[0;34m(self, parameters_file)\u001B[0m\n\u001B[1;32m 111\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mload_from_file_source\u001B[39m(\u001B[38;5;28mself\u001B[39m, parameters_file: Union[\u001B[38;5;28mstr\u001B[39m, PathLike]) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m 112\u001B[0m parameters \u001B[38;5;241m=\u001B[39m io\u001B[38;5;241m.\u001B[39mBytesIO(\u001B[38;5;28mopen\u001B[39m(path_to_str(parameters_file), \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrb\u001B[39m\u001B[38;5;124m\"\u001B[39m)\u001B[38;5;241m.\u001B[39mread())\n\u001B[0;32m--> 113\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload_from_buffer_source\u001B[49m\u001B[43m(\u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/Projects/powsybl/pypowsybl-notebooks/.venv/lib/python3.10/site-packages/pypowsybl/rao/impl/parameters.py:116\u001B[0m, in \u001B[0;36mParameters.load_from_buffer_source\u001B[0;34m(self, parameters_source)\u001B[0m\n\u001B[1;32m 115\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mload_from_buffer_source\u001B[39m(\u001B[38;5;28mself\u001B[39m, parameters_source: io\u001B[38;5;241m.\u001B[39mBytesIO) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m--> 116\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_init_from_c(\u001B[43m_pypowsybl\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload_rao_parameters\u001B[49m\u001B[43m(\u001B[49m\u001B[43mparameters_source\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mgetbuffer\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m)\n", + "\u001B[0;31mPyPowsyblError\u001B[0m: RaoParameters version '2.4' cannot be deserialized. The only supported version currently is '3.1'." ] } ], - "execution_count": 47 + "execution_count": 6 }, { "cell_type": "markdown", @@ -573,8 +222,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-04-25T09:44:30.294100Z", - "start_time": "2025-04-25T09:44:30.288850Z" + "end_time": "2025-09-16T10:46:49.686098864Z", + "start_time": "2025-09-16T10:45:44.019853Z" } }, "source": [ @@ -585,8 +234,8 @@ "data": { "text/plain": [ "{'type': 'RAO_RESULT',\n", - " 'version': '1.7',\n", - " 'info': 'Generated by Open RAO http://farao-community.github.io',\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", @@ -610,12 +259,12 @@ " 'rangeActionResults': []}" ] }, - "execution_count": 48, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 48 + "execution_count": 7 }, { "cell_type": "markdown", @@ -667,8 +316,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-25T09:44:30.404900Z", - "start_time": "2025-04-25T09:44:30.347037Z" + "end_time": "2025-09-16T10:46:49.690561956Z", + "start_time": "2025-09-16T10:45:44.078973Z" } }, "outputs": [ @@ -676,101 +325,109 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-04-25 11:44:30,350 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,350 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,351 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,351 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,352 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,352 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,353 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,353 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,353 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,354 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,354 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,354 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,355 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,355 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,355 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,356 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,356 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,356 - 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-25 11:44:30,357 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-25 11:44:30,357 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-25 11:44:30,357 - 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-25 11:44:30,363 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", - "2025-04-25 11:44:30,364 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-04-25 11:44:30,365 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,366 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-25 11:44:30,366 - 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-25 11:44:30,367 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,367 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-25 11:44:30,368 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-25 11:44:30,368 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,369 - 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-25 11:44:30,369 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,370 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,370 - 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-25 11:44:30,371 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-25 11:44:30,371 - 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-25 11:44:30,371 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,372 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-25 11:44:30,372 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-25 11:44:30,372 - 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-25 11:44:30,373 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,374 - INFO - Linear optimization on root leaf\n", - "2025-04-25 11:44:30,376 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,377 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-25 11:44:30,377 - 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-25 11:44:30,378 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,378 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-25 11:44:30,379 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-25 11:44:30,379 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,380 - 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-25 11:44:30,381 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,382 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,382 - 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-25 11:44:30,383 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-04-25 11:44:30,385 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-25 11:44:30,385 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-04-25 11:44:30,385 - INFO - range action(s): pst-range-action: -10\n", - "2025-04-25 11:44:30,386 - 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-25 11:44:30,386 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,386 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-25 11:44:30,387 - INFO - Search depth 1 [start]\n", - "2025-04-25 11:44:30,387 - INFO - Leaves to evaluate: 1\n", - "2025-04-25 11:44:30,388 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-25 11:44:30,389 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,389 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-25 11:44:30,390 - 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-25 11:44:30,390 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,391 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-25 11:44:30,391 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-25 11:44:30,392 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,392 - 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-25 11:44:30,393 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,394 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,394 - 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-25 11:44:30,394 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-25 11:44:30,395 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-25 11:44:30,395 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-25 11:44:30,396 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-25 11:44:30,396 - INFO - Search depth 1 [end]\n", - "2025-04-25 11:44:30,397 - 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-25 11:44:30,397 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-04-25 11:44:30,397 - 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-25 11:44:30,398 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,398 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-25 11:44:30,398 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-25 11:44:30,399 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-04-25 11:44:30,399 - 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-25 11:44:30,399 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,400 - 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-25 11:44:30,401 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-25 11:44:30,402 - INFO - ----- Preventive perimeter optimization [end]\n" + "2025-09-16 12:45:44,082 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,082 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,083 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,083 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,083 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,084 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,084 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,084 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,085 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,085 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,085 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,085 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,086 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,086 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,086 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,087 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,087 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,087 - 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-16 12:45:44,088 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-16 12:45:44,088 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-16 12:45:44,088 - 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-16 12:45:44,091 - WARNING - The initial tap is now read from the network so the value in the crac will not be read\n", + "2025-09-16 12:45:44,092 - 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-09-16 12:45:44,093 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-09-16 12:45:44,094 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-09-16 12:45:44,094 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,095 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,095 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:45:44,096 - 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-16 12:45:44,096 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,096 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:45:44,097 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:45:44,097 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,098 - 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-16 12:45:44,098 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,098 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,099 - 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-16 12:45:44,099 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:45:44,100 - 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-16 12:45:44,100 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,100 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-16 12:45:44,101 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:45:44,101 - 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-16 12:45:44,101 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,101 - INFO - Linear optimization on root leaf\n", + "2025-09-16 12:45:44,104 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,106 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,106 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:45:44,107 - 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-16 12:45:44,108 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,109 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:45:44,110 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:45:44,110 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,111 - 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-16 12:45:44,112 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,113 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,113 - 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-16 12:45:44,114 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-16 12:45:44,116 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-16 12:45:44,117 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-16 12:45:44,117 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-16 12:45:44,117 - 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-16 12:45:44,118 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,119 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-16 12:45:44,119 - INFO - Search depth 1 [start]\n", + "2025-09-16 12:45:44,120 - INFO - Leaves to evaluate: 1\n", + "2025-09-16 12:45:44,120 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:45:44,121 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,122 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,122 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:45:44,123 - 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-16 12:45:44,123 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,124 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:45:44,124 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:45:44,124 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,125 - 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-16 12:45:44,125 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,125 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,126 - 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-16 12:45:44,126 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:45:44,126 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:45:44,127 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-16 12:45:44,127 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-16 12:45:44,127 - INFO - Search depth 1 [end]\n", + "2025-09-16 12:45:44,128 - 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-16 12:45:44,128 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:45:44,128 - 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-16 12:45:44,128 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,129 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-16 12:45:44,129 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:45:44,129 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:45:44,130 - 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-16 12:45:44,131 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,132 - 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-16 12:45:44,133 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:45:44,134 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-16 12:45:44,135 - 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-16 12:45:44,136 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,137 - 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": 49 + "execution_count": 8 }, { "cell_type": "code", @@ -780,8 +437,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-25T09:44:30.509006Z", - "start_time": "2025-04-25T09:44:30.504404Z" + "end_time": "2025-09-16T10:46:49.699605558Z", + "start_time": "2025-09-16T10:45:44.203345Z" } }, "outputs": [ @@ -789,8 +446,8 @@ "data": { "text/plain": [ "{'type': 'RAO_RESULT',\n", - " 'version': '1.7',\n", - " 'info': 'Generated by Open RAO http://farao-community.github.io',\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", @@ -817,17 +474,16 @@ " '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}]}]}" + " 'initialTap': 0,\n", + " 'activatedStates': [{'instant': 'preventive', 'tap': -10}]}]}" ] }, - "execution_count": 50, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 50 + "execution_count": 9 }, { "cell_type": "markdown", @@ -877,8 +533,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-25T09:44:30.681403Z", - "start_time": "2025-04-25T09:44:30.560575Z" + "end_time": "2025-09-16T10:46:49.700492157Z", + "start_time": "2025-09-16T10:45:44.273603Z" } }, "outputs": [ @@ -886,150 +542,153 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-04-25 11:44:30,563 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,563 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,564 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,564 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,565 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,565 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,567 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,567 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,568 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,568 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,568 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,568 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,569 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,569 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,569 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,570 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,570 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-04-25 11:44:30,570 - 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-25 11:44:30,571 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-04-25 11:44:30,571 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-04-25 11:44:30,572 - 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-25 11:44:30,576 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", - "2025-04-25 11:44:30,578 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,578 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-25 11:44:30,579 - 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-25 11:44:30,579 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,580 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-25 11:44:30,580 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-04-25 11:44:30,581 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,582 - 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-25 11:44:30,583 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,584 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,585 - 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-25 11:44:30,585 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-25 11:44:30,586 - 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-25 11:44:30,586 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,587 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-04-25 11:44:30,587 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-04-25 11:44:30,588 - 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-25 11:44:30,588 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,588 - INFO - Linear optimization on root leaf\n", - "2025-04-25 11:44:30,590 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,591 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-04-25 11:44:30,591 - 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-25 11:44:30,592 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,593 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-04-25 11:44:30,594 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-25 11:44:30,594 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,595 - 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-25 11:44:30,596 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,597 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,597 - 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-25 11:44:30,598 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-04-25 11:44:30,599 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-25 11:44:30,600 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-04-25 11:44:30,600 - INFO - range action(s): pst-range-action: -10\n", - "2025-04-25 11:44:30,601 - 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-25 11:44:30,601 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,602 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", - "2025-04-25 11:44:30,603 - INFO - Search depth 1 [start]\n", - "2025-04-25 11:44:30,603 - INFO - Leaves to evaluate: 1\n", - "2025-04-25 11:44:30,605 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-25 11:44:30,606 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,606 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-25 11:44:30,607 - 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-25 11:44:30,608 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,608 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-25 11:44:30,609 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-04-25 11:44:30,610 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,611 - 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-25 11:44:30,612 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,612 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,613 - 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-25 11:44:30,613 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-25 11:44:30,614 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-25 11:44:30,614 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-04-25 11:44:30,615 - INFO - Remaining leaves to evaluate: 0\n", - "2025-04-25 11:44:30,615 - INFO - Search depth 1 [end]\n", - "2025-04-25 11:44:30,616 - 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-25 11:44:30,616 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-04-25 11:44:30,617 - 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-25 11:44:30,617 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,617 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-25 11:44:30,618 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-04-25 11:44:30,618 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-04-25 11:44:30,618 - 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-25 11:44:30,619 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,620 - 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-25 11:44:30,620 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-25 11:44:30,621 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-04-25 11:44:30,621 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-04-25 11:44:30,623 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,624 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-25 11:44:30,624 - 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-25 11:44:30,625 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,625 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-25 11:44:30,626 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-04-25 11:44:30,627 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,628 - 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-25 11:44:30,629 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,629 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,630 - 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-25 11:44:30,631 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-04-25 11:44:30,631 - 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-25 11:44:30,632 - 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-25 11:44:30,632 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-04-25 11:44:30,649 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-04-25 11:44:30,650 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-04-25 11:44:30,651 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-04-25 11:44:30,652 - 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-25 11:44:30,653 - INFO - Linear optimization on root leaf\n", - "2025-04-25 11:44:30,655 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-04-25 11:44:30,656 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-04-25 11:44:30,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-25 11:44:30,657 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-04-25 11:44:30,658 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-04-25 11:44:30,658 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-04-25 11:44:30,659 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,660 - 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-25 11:44:30,661 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-04-25 11:44:30,662 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-04-25 11:44:30,663 - 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-25 11:44:30,664 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", - "2025-04-25 11:44:30,666 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-04-25 11:44:30,667 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-04-25 11:44:30,668 - INFO - range action(s): pst-range-action: 6\n", - "2025-04-25 11:44:30,668 - 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-25 11:44:30,669 - INFO - No network action available\n", - "2025-04-25 11:44:30,670 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-04-25 11:44:30,671 - INFO - Best leaf: Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-04-25 11:44:30,672 - INFO - Best leaf: range action(s): pst-range-action: 6\n", - "2025-04-25 11:44:30,673 - 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-25 11:44:30,674 - 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-25 11:44:30,674 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-04-25 11:44:30,675 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-04-25 11:44:30,676 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-04-25 11:44:30,676 - 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-25 11:44:30,677 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-04-25 11:44:30,677 - 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-25 11:44:30,678 - 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-16 12:45:44,279 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,281 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,282 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,284 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,285 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,287 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,288 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,289 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,290 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,292 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,294 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,296 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,297 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,298 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,300 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,302 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,303 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:45:44,304 - 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-16 12:45:44,305 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-16 12:45:44,306 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-16 12:45:44,307 - 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-16 12:45:44,311 - WARNING - The initial tap is now read from the network so the value in the crac will not be read\n", + "2025-09-16 12:45:44,313 - 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-09-16 12:45:44,317 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", + "2025-09-16 12:45:44,319 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,320 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,321 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:45:44,322 - 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-16 12:45:44,324 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,324 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:45:44,325 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-16 12:45:44,326 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,328 - 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-16 12:45:44,328 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,329 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,331 - 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-16 12:45:44,333 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:45:44,334 - 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-16 12:45:44,336 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,337 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-16 12:45:44,339 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:45:44,340 - 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-16 12:45:44,341 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,341 - INFO - Linear optimization on root leaf\n", + "2025-09-16 12:45:44,343 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,344 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,345 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:45:44,346 - 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-16 12:45:44,346 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,347 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:45:44,347 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:45:44,348 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,349 - 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-16 12:45:44,349 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,351 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,355 - 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-16 12:45:44,357 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-16 12:45:44,361 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-16 12:45:44,362 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-16 12:45:44,364 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-16 12:45:44,366 - 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-16 12:45:44,368 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,369 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", + "2025-09-16 12:45:44,371 - INFO - Search depth 1 [start]\n", + "2025-09-16 12:45:44,372 - INFO - Leaves to evaluate: 1\n", + "2025-09-16 12:45:44,373 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:45:44,374 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,375 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,378 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:45:44,381 - 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-16 12:45:44,384 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,387 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:45:44,388 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:45:44,391 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,394 - 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-16 12:45:44,396 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,397 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,400 - 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-16 12:45:44,402 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:45:44,404 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:45:44,407 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-16 12:45:44,409 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-16 12:45:44,412 - INFO - Search depth 1 [end]\n", + "2025-09-16 12:45:44,414 - 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-16 12:45:44,415 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:45:44,417 - 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-16 12:45:44,417 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,418 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-16 12:45:44,418 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:45:44,419 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:45:44,419 - 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-16 12:45:44,419 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,419 - 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-16 12:45:44,420 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:45:44,420 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-16 12:45:44,420 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:45:44,421 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,421 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,422 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:45:44,422 - 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-16 12:45:44,422 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,423 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:45:44,423 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-16 12:45:44,423 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,424 - 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-16 12:45:44,424 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,425 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,425 - 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-16 12:45:44,426 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-16 12:45:44,426 - 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-16 12:45:44,426 - 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-16 12:45:44,426 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-16 12:45:44,427 - INFO - Using base network '12_node_network' on variant 'ContingencyScenarioe707c247-8e76-4986-b4a5-63a9847af32d'\n", + "2025-09-16 12:45:44,427 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-09-16 12:45:44,428 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-09-16 12:45:44,428 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-16 12:45:44,428 - 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-16 12:45:44,429 - INFO - Linear optimization on root leaf\n", + "2025-09-16 12:45:44,431 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:45:44,431 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", + "2025-09-16 12:45:44,432 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:45:44,432 - 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-16 12:45:44,433 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:45:44,433 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:45:44,433 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-09-16 12:45:44,434 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,435 - 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-16 12:45:44,436 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:45:44,437 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:45:44,438 - 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-16 12:45:44,438 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-09-16 12:45:44,443 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-16 12:45:44,444 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-09-16 12:45:44,445 - INFO - range action(s): pst-range-action: 6\n", + "2025-09-16 12:45:44,446 - 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-16 12:45:44,448 - 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-16 12:45:44,450 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-09-16 12:45:44,451 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-16 12:45:44,453 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-09-16 12:45:44,455 - 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-16 12:45:44,456 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:45:44,457 - 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-16 12:45:44,459 - 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": 51 + "execution_count": 10 }, { "cell_type": "code", @@ -1039,8 +698,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-25T09:44:31.267614Z", - "start_time": "2025-04-25T09:44:31.259811Z" + "end_time": "2025-09-16T10:46:49.700841678Z", + "start_time": "2025-09-16T10:45:44.504822Z" } }, "outputs": [ @@ -1048,8 +707,8 @@ "data": { "text/plain": [ "{'type': 'RAO_RESULT',\n", - " 'version': '1.7',\n", - " 'info': 'Generated by Open RAO http://farao-community.github.io',\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", @@ -1083,20 +742,17 @@ " '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}]}]}" + " 'initialTap': 0,\n", + " 'activatedStates': [{'instant': 'preventive', 'tap': -10},\n", + " {'instant': 'curative', 'contingency': 'Contingency DE2 DE3', 'tap': 6}]}]}" ] }, - "execution_count": 52, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 52 + "execution_count": 11 }, { "cell_type": "markdown", @@ -1116,8 +772,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-04-25T09:44:31.324625Z", - "start_time": "2025-04-25T09:44:31.319652Z" + "end_time": "2025-09-16T10:46:49.701099889Z", + "start_time": "2025-09-16T10:45:44.551937Z" } }, "outputs": [ @@ -1133,12 +789,12 @@ " 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}}]" ] }, - "execution_count": 53, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 53 + "execution_count": 12 }, { "cell_type": "markdown", From c4601375fd2e4a2b5b30a11bb7b8b8d29b5cdfd0 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Tue, 16 Sep 2025 12:59:49 +0200 Subject: [PATCH 12/27] Add pip install back in open-rao notebook for pypowsybl 1.10 installation Signed-off-by: Florian Dupuy --- open_rao.ipynb | 689 +++++++++++++++++++++++++++---------------------- 1 file changed, 377 insertions(+), 312 deletions(-) diff --git a/open_rao.ipynb b/open_rao.ipynb index f85492e..d0a10a4 100644 --- a/open_rao.ipynb +++ b/open_rao.ipynb @@ -17,19 +17,52 @@ ] }, { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-16T10:58:20.245992Z", + "start_time": "2025-09-16T10:58:19.352882Z" + } + }, "cell_type": "code", + "source": "%pip install pypowsybl==1.10.0", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pypowsybl==1.10.0 in ./.venv/lib/python3.10/site-packages (1.10.0)\r\n", + "Requirement already satisfied: prettytable>=2.0.0 in ./.venv/lib/python3.10/site-packages (from pypowsybl==1.10.0) (3.16.0)\r\n", + "Requirement already satisfied: networkx in ./.venv/lib/python3.10/site-packages (from pypowsybl==1.10.0) (3.4.2)\r\n", + "Requirement already satisfied: pandas>=2.2.2 in ./.venv/lib/python3.10/site-packages (from pypowsybl==1.10.0) (2.3.2)\r\n", + "Requirement already satisfied: numpy>=1.22.4 in ./.venv/lib/python3.10/site-packages (from pandas>=2.2.2->pypowsybl==1.10.0) (2.2.6)\r\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in ./.venv/lib/python3.10/site-packages (from pandas>=2.2.2->pypowsybl==1.10.0) (2.9.0.post0)\r\n", + "Requirement already satisfied: pytz>=2020.1 in ./.venv/lib/python3.10/site-packages (from pandas>=2.2.2->pypowsybl==1.10.0) (2025.2)\r\n", + "Requirement already satisfied: tzdata>=2022.7 in ./.venv/lib/python3.10/site-packages (from pandas>=2.2.2->pypowsybl==1.10.0) (2025.2)\r\n", + "Requirement already satisfied: wcwidth in ./.venv/lib/python3.10/site-packages (from prettytable>=2.0.0->pypowsybl==1.10.0) (0.2.13)\r\n", + "Requirement already satisfied: six>=1.5 in ./.venv/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.2->pypowsybl==1.10.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;49m24.3.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": 1 + }, + { "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.175868Z", - "start_time": "2025-09-16T10:46:48.726425Z" + "end_time": "2025-09-16T10:58:20.683109Z", + "start_time": "2025-09-16T10:58:20.265926Z" } }, + "cell_type": "code", "source": [ "import pypowsybl as pp\n", "from pypowsybl.rao import Parameters as RaoParameters" ], "outputs": [], - "execution_count": 1 + "execution_count": 2 }, { "cell_type": "markdown", @@ -42,15 +75,15 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.188459Z", - "start_time": "2025-09-16T10:46:49.180214Z" + "end_time": "2025-09-16T10:58:20.693625Z", + "start_time": "2025-09-16T10:58:20.687177Z" } }, "source": [ "n12 = pp.network.load('./data/rao/12_node_network.uct')" ], "outputs": [], - "execution_count": 2 + "execution_count": 3 }, { "cell_type": "markdown", @@ -63,8 +96,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.256082Z", - "start_time": "2025-09-16T10:46:49.237350Z" + "end_time": "2025-09-16T10:58:20.763472Z", + "start_time": "2025-09-16T10:58:20.738564Z" } }, "source": [ @@ -74,16 +107,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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \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" + "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": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 3 + "execution_count": 4 }, { "cell_type": "markdown", @@ -103,8 +136,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.339226Z", - "start_time": "2025-09-16T10:46:49.309090Z" + "end_time": "2025-09-16T10:58:20.841484Z", + "start_time": "2025-09-16T10:58:20.816870Z" } }, "source": [ @@ -115,16 +148,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 \n \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 \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": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 4 + "execution_count": 5 }, { "cell_type": "markdown", @@ -138,8 +171,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.425743Z", - "start_time": "2025-09-16T10:46:49.393220Z" + "end_time": "2025-09-16T10:58:20.914379Z", + "start_time": "2025-09-16T10:58:20.890847Z" } }, "source": [ @@ -151,16 +184,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 \n \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 \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": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 5 + "execution_count": 6 }, { "cell_type": "markdown", @@ -175,8 +208,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.670393Z", - "start_time": "2025-09-16T10:46:49.488984Z" + "end_time": "2025-09-16T10:58:21.017349Z", + "start_time": "2025-09-16T10:58:20.971008Z" } }, "source": [ @@ -196,20 +229,59 @@ ], "outputs": [ { - "ename": "PyPowsyblError", - "evalue": "RaoParameters version '2.4' cannot be deserialized. The only supported version currently is '3.1'.", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mPyPowsyblError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[0;32mIn[6], line 6\u001B[0m\n\u001B[1;32m 4\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 5\u001B[0m rao_parameters \u001B[38;5;241m=\u001B[39m RaoParameters()\n\u001B[0;32m----> 6\u001B[0m \u001B[43mrao_parameters\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload_from_file_source\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43m./data/rao/rao_parameters.json\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[1;32m 7\u001B[0m \u001B[38;5;66;03m# set up logging\u001B[39;00m\n\u001B[1;32m 8\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21;01mlogging\u001B[39;00m\n", - "File \u001B[0;32m~/Projects/powsybl/pypowsybl-notebooks/.venv/lib/python3.10/site-packages/pypowsybl/rao/impl/parameters.py:113\u001B[0m, in \u001B[0;36mParameters.load_from_file_source\u001B[0;34m(self, parameters_file)\u001B[0m\n\u001B[1;32m 111\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mload_from_file_source\u001B[39m(\u001B[38;5;28mself\u001B[39m, parameters_file: Union[\u001B[38;5;28mstr\u001B[39m, PathLike]) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m 112\u001B[0m parameters \u001B[38;5;241m=\u001B[39m io\u001B[38;5;241m.\u001B[39mBytesIO(\u001B[38;5;28mopen\u001B[39m(path_to_str(parameters_file), \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrb\u001B[39m\u001B[38;5;124m\"\u001B[39m)\u001B[38;5;241m.\u001B[39mread())\n\u001B[0;32m--> 113\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload_from_buffer_source\u001B[49m\u001B[43m(\u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m)\u001B[49m\n", - "File \u001B[0;32m~/Projects/powsybl/pypowsybl-notebooks/.venv/lib/python3.10/site-packages/pypowsybl/rao/impl/parameters.py:116\u001B[0m, in \u001B[0;36mParameters.load_from_buffer_source\u001B[0;34m(self, parameters_source)\u001B[0m\n\u001B[1;32m 115\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mload_from_buffer_source\u001B[39m(\u001B[38;5;28mself\u001B[39m, parameters_source: io\u001B[38;5;241m.\u001B[39mBytesIO) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m--> 116\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_init_from_c(\u001B[43m_pypowsybl\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload_rao_parameters\u001B[49m\u001B[43m(\u001B[49m\u001B[43mparameters_source\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mgetbuffer\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m)\n", - "\u001B[0;31mPyPowsyblError\u001B[0m: RaoParameters version '2.4' cannot be deserialized. The only supported version currently is '3.1'." + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-16 12:58:20,985 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", + "2025-09-16 12:58:20,987 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:20,987 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:58:20,988 - 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-16 12:58:20,989 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:58:20,989 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:58:20,990 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-09-16 12:58:20,991 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:20,992 - 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-16 12:58:20,993 - INFO - Initial sensitivity analysis: cost = 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-16 12:58:20,994 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:20,994 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-16 12:58:20,995 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-16 12:58:20,996 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:20,996 - INFO - Linear optimization on root leaf\n", + "2025-09-16 12:58:20,997 - INFO - No range actions to optimize\n", + "2025-09-16 12:58:20,998 - INFO - Root leaf, cost: 90.0 (functional: 90.0, virtual: 0.0)\n", + "2025-09-16 12:58:20,999 - INFO - No range actions activated\n", + "2025-09-16 12:58:20,999 - INFO - Limiting element #01: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,000 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-09-16 12:58:21,001 - INFO - Search depth 1 [start]\n", + "2025-09-16 12:58:21,001 - INFO - Leaves to evaluate: 1\n", + "2025-09-16 12:58:21,002 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:58:21,003 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,004 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:58:21,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-09-16 12:58:21,005 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,005 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:58:21,006 - INFO - Running AC sensitivity analysis with 2 factors and 0 contingencies\n", + "2025-09-16 12:58:21,007 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,007 - 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-16 12:58:21,008 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-16 12:58:21,009 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-16 12:58:21,009 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-16 12:58:21,010 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-16 12:58:21,010 - INFO - Search depth 1 [end]\n", + "2025-09-16 12:58:21,011 - 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-16 12:58:21,011 - INFO - Search depth 1 best leaf: No range actions activated\n", + "2025-09-16 12:58:21,012 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,012 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-16 12:58:21,013 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -139.73 (functional: -139.73, virtual: 0.0)\n", + "2025-09-16 12:58:21,013 - INFO - Best leaf: No range actions activated\n", + "2025-09-16 12:58:21,013 - INFO - Limiting element #01: margin = 139.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,014 - 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-16 12:58:21,014 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:58:21,014 - INFO - ----- Preventive perimeter optimization [end]\n" ] } ], - "execution_count": 6 + "execution_count": 7 }, { "cell_type": "markdown", @@ -222,8 +294,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.686098864Z", - "start_time": "2025-09-16T10:45:44.019853Z" + "end_time": "2025-09-16T10:58:21.072194Z", + "start_time": "2025-09-16T10:58:21.067245Z" } }, "source": [ @@ -234,8 +306,8 @@ "data": { "text/plain": [ "{'type': 'RAO_RESULT',\n", - " 'version': '1.8',\n", - " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\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", @@ -259,12 +331,12 @@ " 'rangeActionResults': []}" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 7 + "execution_count": 8 }, { "cell_type": "markdown", @@ -316,8 +388,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.690561956Z", - "start_time": "2025-09-16T10:45:44.078973Z" + "end_time": "2025-09-16T10:58:21.250890Z", + "start_time": "2025-09-16T10:58:21.130700Z" } }, "outputs": [ @@ -325,109 +397,101 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-16 12:45:44,082 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,082 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,083 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,083 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,083 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,084 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,084 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,084 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,085 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,085 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,085 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,085 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,086 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,086 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,086 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,087 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,087 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,087 - 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-16 12:45:44,088 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-09-16 12:45:44,088 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-09-16 12:45:44,088 - 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-16 12:45:44,091 - WARNING - The initial tap is now read from the network so the value in the crac will not be read\n", - "2025-09-16 12:45:44,092 - 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-09-16 12:45:44,093 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-09-16 12:45:44,094 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", - "2025-09-16 12:45:44,094 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,095 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,095 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-16 12:45:44,096 - 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-16 12:45:44,096 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,096 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-16 12:45:44,097 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-16 12:45:44,097 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,098 - 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-16 12:45:44,098 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,098 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,099 - 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-16 12:45:44,099 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-16 12:45:44,100 - 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-16 12:45:44,100 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,100 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-09-16 12:45:44,101 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-16 12:45:44,101 - 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-16 12:45:44,101 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,101 - INFO - Linear optimization on root leaf\n", - "2025-09-16 12:45:44,104 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,106 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,106 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-16 12:45:44,107 - 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-16 12:45:44,108 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,109 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-16 12:45:44,110 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-16 12:45:44,110 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,111 - 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-16 12:45:44,112 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,113 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,113 - 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-16 12:45:44,114 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-09-16 12:45:44,116 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-16 12:45:44,117 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-09-16 12:45:44,117 - INFO - range action(s): pst-range-action: -10\n", - "2025-09-16 12:45:44,117 - 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-16 12:45:44,118 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,119 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-09-16 12:45:44,119 - INFO - Search depth 1 [start]\n", - "2025-09-16 12:45:44,120 - INFO - Leaves to evaluate: 1\n", - "2025-09-16 12:45:44,120 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-16 12:45:44,121 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,122 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,122 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-16 12:45:44,123 - 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-16 12:45:44,123 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,124 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-16 12:45:44,124 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-16 12:45:44,124 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,125 - 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-16 12:45:44,125 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,125 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,126 - 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-16 12:45:44,126 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-16 12:45:44,126 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-16 12:45:44,127 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-09-16 12:45:44,127 - INFO - Remaining leaves to evaluate: 0\n", - "2025-09-16 12:45:44,127 - INFO - Search depth 1 [end]\n", - "2025-09-16 12:45:44,128 - 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-16 12:45:44,128 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-09-16 12:45:44,128 - 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-16 12:45:44,128 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,129 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-09-16 12:45:44,129 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-16 12:45:44,129 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-09-16 12:45:44,130 - 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-16 12:45:44,131 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,132 - 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-16 12:45:44,133 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-16 12:45:44,134 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-09-16 12:45:44,135 - 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-16 12:45:44,136 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,137 - 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-16 12:58:21,136 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,137 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,138 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,139 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,139 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,140 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,141 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,141 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,142 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,142 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,143 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,143 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,144 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,144 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,144 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,145 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,145 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,145 - 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-16 12:58:21,146 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-16 12:58:21,146 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-16 12:58:21,147 - 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-16 12:58:21,151 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", + "2025-09-16 12:58:21,151 - WARNING - Contingency Contingency DE2 DE3 has an automaton or a curative remedial action but no CNECs associated.\n", + "2025-09-16 12:58:21,152 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,153 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:58:21,153 - 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-16 12:58:21,153 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,154 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:58:21,154 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:58:21,155 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,156 - 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-16 12:58:21,156 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,157 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,158 - 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-16 12:58:21,158 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:58:21,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-16 12:58:21,159 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,160 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-16 12:58:21,161 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:58:21,161 - 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-16 12:58:21,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-16 12:58:21,162 - INFO - Linear optimization on root leaf\n", + "2025-09-16 12:58:21,171 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,171 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:58:21,172 - 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-16 12:58:21,172 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,173 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:58:21,174 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:58:21,175 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,177 - 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-16 12:58:21,178 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,180 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,182 - 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-16 12:58:21,184 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-16 12:58:21,187 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-16 12:58:21,187 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-16 12:58:21,188 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-16 12:58:21,188 - 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-16 12:58:21,189 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,190 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-09-16 12:58:21,190 - INFO - Search depth 1 [start]\n", + "2025-09-16 12:58:21,191 - INFO - Leaves to evaluate: 1\n", + "2025-09-16 12:58:21,192 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:58:21,193 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,194 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:58:21,194 - 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-16 12:58:21,195 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,196 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:58:21,196 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:58:21,240 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,241 - 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-16 12:58:21,242 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,243 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,243 - 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-16 12:58:21,244 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:58:21,244 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:58:21,245 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-16 12:58:21,245 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-16 12:58:21,246 - INFO - Search depth 1 [end]\n", + "2025-09-16 12:58:21,246 - 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-16 12:58:21,246 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:58:21,247 - 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-16 12:58:21,247 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,247 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-16 12:58:21,247 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:58:21,248 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:58:21,248 - 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-16 12:58:21,248 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,248 - 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-16 12:58:21,249 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:58:21,249 - INFO - ----- Preventive perimeter optimization [end]\n" ] } ], - "execution_count": 8 + "execution_count": 9 }, { "cell_type": "code", @@ -437,8 +501,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.699605558Z", - "start_time": "2025-09-16T10:45:44.203345Z" + "end_time": "2025-09-16T10:58:21.313349Z", + "start_time": "2025-09-16T10:58:21.303940Z" } }, "outputs": [ @@ -446,8 +510,8 @@ "data": { "text/plain": [ "{'type': 'RAO_RESULT',\n", - " 'version': '1.8',\n", - " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\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", @@ -474,16 +538,17 @@ " '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}]}]}" + " 'initialSetpoint': 0.0,\n", + " 'activatedStates': [{'instant': 'preventive',\n", + " 'setpoint': -3.894612745121778}]}]}" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 9 + "execution_count": 10 }, { "cell_type": "markdown", @@ -533,8 +598,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.700492157Z", - "start_time": "2025-09-16T10:45:44.273603Z" + "end_time": "2025-09-16T10:58:21.524022Z", + "start_time": "2025-09-16T10:58:21.363828Z" } }, "outputs": [ @@ -542,153 +607,150 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-09-16 12:45:44,279 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,281 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,282 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,284 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,285 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,287 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,288 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,289 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,290 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,292 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,294 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,296 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,297 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,298 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,300 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,302 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,303 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", - "2025-09-16 12:45:44,304 - 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-16 12:45:44,305 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", - "2025-09-16 12:45:44,306 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", - "2025-09-16 12:45:44,307 - 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-16 12:45:44,311 - WARNING - The initial tap is now read from the network so the value in the crac will not be read\n", - "2025-09-16 12:45:44,313 - 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-09-16 12:45:44,317 - WARNING - Running RAO using Open RAO version 6.6.0 from git commit 4aa4ea6cf728c58414986e13216923c054a475f8.\n", - "2025-09-16 12:45:44,319 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,320 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,321 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-16 12:45:44,322 - 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-16 12:45:44,324 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,324 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-16 12:45:44,325 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-09-16 12:45:44,326 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,328 - 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-16 12:45:44,328 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,329 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,331 - 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-16 12:45:44,333 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-16 12:45:44,334 - 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-16 12:45:44,336 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,337 - INFO - ----- Preventive perimeter optimization [start]\n", - "2025-09-16 12:45:44,339 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", - "2025-09-16 12:45:44,340 - 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-16 12:45:44,341 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,341 - INFO - Linear optimization on root leaf\n", - "2025-09-16 12:45:44,343 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,344 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,345 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", - "2025-09-16 12:45:44,346 - 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-16 12:45:44,346 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,347 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", - "2025-09-16 12:45:44,347 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-16 12:45:44,348 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,349 - 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-16 12:45:44,349 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,351 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,355 - 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-16 12:45:44,357 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", - "2025-09-16 12:45:44,361 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-16 12:45:44,362 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", - "2025-09-16 12:45:44,364 - INFO - range action(s): pst-range-action: -10\n", - "2025-09-16 12:45:44,366 - 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-16 12:45:44,368 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,369 - INFO - Using base network '12_node_network' on variant 'SearchTreeWorkingVariantId'\n", - "2025-09-16 12:45:44,371 - INFO - Search depth 1 [start]\n", - "2025-09-16 12:45:44,372 - INFO - Leaves to evaluate: 1\n", - "2025-09-16 12:45:44,373 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-16 12:45:44,374 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,375 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,378 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-16 12:45:44,381 - 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-16 12:45:44,384 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,387 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-16 12:45:44,388 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", - "2025-09-16 12:45:44,391 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,394 - 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-16 12:45:44,396 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,397 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,400 - 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-16 12:45:44,402 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-16 12:45:44,404 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-16 12:45:44,407 - INFO - Stop criterion reached, other threads may skip optimization.\n", - "2025-09-16 12:45:44,409 - INFO - Remaining leaves to evaluate: 0\n", - "2025-09-16 12:45:44,412 - INFO - Search depth 1 [end]\n", - "2025-09-16 12:45:44,414 - 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-16 12:45:44,415 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", - "2025-09-16 12:45:44,417 - 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-16 12:45:44,417 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,418 - INFO - Search-tree RAO completed with status DEFAULT\n", - "2025-09-16 12:45:44,418 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", - "2025-09-16 12:45:44,419 - INFO - Best leaf: range action(s): pst-range-action: -10\n", - "2025-09-16 12:45:44,419 - 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-16 12:45:44,419 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,419 - 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-16 12:45:44,420 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-16 12:45:44,420 - INFO - ----- Preventive perimeter optimization [end]\n", - "2025-09-16 12:45:44,420 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", - "2025-09-16 12:45:44,421 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,421 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,422 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-16 12:45:44,422 - 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-16 12:45:44,422 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,423 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-16 12:45:44,423 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", - "2025-09-16 12:45:44,423 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,424 - 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-16 12:45:44,424 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,425 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,425 - 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-16 12:45:44,426 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-09-16 12:45:44,426 - 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-16 12:45:44,426 - 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-16 12:45:44,426 - INFO - ----- Post-contingency perimeters optimization [start]\n", - "2025-09-16 12:45:44,427 - INFO - Using base network '12_node_network' on variant 'ContingencyScenarioe707c247-8e76-4986-b4a5-63a9847af32d'\n", - "2025-09-16 12:45:44,427 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", - "2025-09-16 12:45:44,428 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", - "2025-09-16 12:45:44,428 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", - "2025-09-16 12:45:44,428 - 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-16 12:45:44,429 - INFO - Linear optimization on root leaf\n", - "2025-09-16 12:45:44,431 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", - "2025-09-16 12:45:44,431 - WARNING - Network {CC0 SC0}: 1 generators have been discarded from active power control because of maxP not plausible\n", - "2025-09-16 12:45:44,432 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", - "2025-09-16 12:45:44,432 - 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-16 12:45:44,433 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", - "2025-09-16 12:45:44,433 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", - "2025-09-16 12:45:44,433 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", - "2025-09-16 12:45:44,434 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,435 - 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-16 12:45:44,436 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", - "2025-09-16 12:45:44,437 - INFO - Start AC loadflow on network {CC0 SC0}\n", - "2025-09-16 12:45:44,438 - 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-16 12:45:44,438 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", - "2025-09-16 12:45:44,443 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", - "2025-09-16 12:45:44,444 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", - "2025-09-16 12:45:44,445 - INFO - range action(s): pst-range-action: 6\n", - "2025-09-16 12:45:44,446 - 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-16 12:45:44,448 - 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-16 12:45:44,450 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", - "2025-09-16 12:45:44,451 - INFO - ----- Post-contingency perimeters optimization [end]\n", - "2025-09-16 12:45:44,453 - INFO - Merging preventive and post-contingency RAO results:\n", - "2025-09-16 12:45:44,455 - 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-16 12:45:44,456 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", - "2025-09-16 12:45:44,457 - 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-16 12:45:44,459 - 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-16 12:58:21,370 - ERROR - BBE1AA1 BBE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,372 - ERROR - BBE1AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,374 - ERROR - FFR1AA1 FFR2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,375 - ERROR - FFR1AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,376 - ERROR - FFR2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,378 - ERROR - DDE1AA1 DDE2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,379 - ERROR - DDE1AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,380 - ERROR - DDE2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,381 - ERROR - NNL1AA1 NNL2AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,382 - ERROR - NNL1AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,384 - ERROR - NNL2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,385 - ERROR - FFR2AA1 DDE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,386 - ERROR - DDE2AA1 NNL3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,387 - ERROR - NNL2AA1 BBE3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,388 - ERROR - NNL2AA1 BBE3AA1 2 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,390 - ERROR - NNL2AA1 BBE3AA1 3 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,390 - ERROR - BBE2AA1 FFR3AA1 1 - Real line resistance cannot be negative (0.0 ohm)\n", + "2025-09-16 12:58:21,391 - 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-16 12:58:21,392 - WARNING - BBE2AA1 BBE3AA1 1 - Blank is not allowed (0.0 S)\n", + "2025-09-16 12:58:21,393 - WARNING - BBE2AA1 BBE3AA1 1 - Transformer shunt conductance must be greater than or equal to zero (0.0 S)\n", + "2025-09-16 12:58:21,393 - 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-16 12:58:21,398 - WARNING - Running RAO using Open RAO version 4.7.0 from git commit 4d70d0db5169461830fbb40cf4d2014f510e43f1.\n", + "2025-09-16 12:58:21,399 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,400 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:58:21,401 - 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-16 12:58:21,401 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,402 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:58:21,403 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-16 12:58:21,404 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,405 - 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-16 12:58:21,407 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,407 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,408 - 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-16 12:58:21,410 - INFO - Initial sensitivity analysis: cost = 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:58:21,411 - 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-16 12:58:21,412 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,413 - INFO - ----- Preventive perimeter optimization [start]\n", + "2025-09-16 12:58:21,414 - INFO - Root leaf, cost: 133.3 (functional: 133.3, virtual: 0.0)\n", + "2025-09-16 12:58:21,415 - 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-16 12:58:21,417 - INFO - Limiting element #02: margin = -90.0 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,418 - INFO - Linear optimization on root leaf\n", + "2025-09-16 12:58:21,423 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,424 - INFO - Network {CC0 SC0} has 12 buses and 16 branches\n", + "2025-09-16 12:58:21,426 - 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-16 12:58:21,427 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_0] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,428 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_0 (method='First slack')\n", + "2025-09-16 12:58:21,429 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:58:21,431 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,432 - 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-16 12:58:21,433 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,434 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,435 - 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-16 12:58:21,437 - INFO - Iteration 1: better solution found with a cost of 42.72 (functional: 42.72)\n", + "2025-09-16 12:58:21,443 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-16 12:58:21,444 - INFO - Root leaf, 1 range action(s) activated, cost: 42.72 (functional: 42.72, virtual: 0.0)\n", + "2025-09-16 12:58:21,444 - INFO - range action(s): pst-range-action: -10\n", + "2025-09-16 12:58:21,445 - 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-16 12:58:21,445 - INFO - Limiting element #02: margin = 18.73 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,446 - INFO - Using base network '12_node_network' on variant 'PreventiveScenario'\n", + "2025-09-16 12:58:21,448 - INFO - Search depth 1 [start]\n", + "2025-09-16 12:58:21,450 - INFO - Leaves to evaluate: 1\n", + "2025-09-16 12:58:21,453 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:58:21,456 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,456 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:58:21,458 - 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-16 12:58:21,460 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,463 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:58:21,465 - INFO - Running AC sensitivity analysis with 4 factors and 1 contingencies\n", + "2025-09-16 12:58:21,466 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,468 - 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-16 12:58:21,469 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,472 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,475 - 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-16 12:58:21,477 - INFO - Evaluated network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:58:21,477 - INFO - Optimized network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:58:21,478 - INFO - Stop criterion reached, other threads may skip optimization.\n", + "2025-09-16 12:58:21,479 - INFO - Remaining leaves to evaluate: 0\n", + "2025-09-16 12:58:21,480 - INFO - Search depth 1 [end]\n", + "2025-09-16 12:58:21,480 - 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-16 12:58:21,482 - INFO - Search depth 1 best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:58:21,482 - 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-16 12:58:21,483 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,483 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-16 12:58:21,483 - INFO - Best leaf: network action(s): close NL2 BE3 2, cost: -187.22 (functional: -187.22, virtual: 0.0)\n", + "2025-09-16 12:58:21,484 - INFO - Best leaf: range action(s): pst-range-action: -10\n", + "2025-09-16 12:58:21,484 - 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-16 12:58:21,484 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,485 - 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-16 12:58:21,485 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:58:21,485 - INFO - ----- Preventive perimeter optimization [end]\n", + "2025-09-16 12:58:21,486 - INFO - Connectable NNL2AA1 BBE3AA1 2 has been connected on each side.\n", + "2025-09-16 12:58:21,486 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,487 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:58:21,487 - 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-16 12:58:21,487 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,488 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:58:21,488 - INFO - Running AC sensitivity analysis with 6 factors and 1 contingencies\n", + "2025-09-16 12:58:21,488 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,489 - 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-16 12:58:21,489 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,490 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,490 - 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-16 12:58:21,490 - INFO - Systematic sensitivity analysis after preventive remedial actions: cost = 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-16 12:58:21,491 - 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-16 12:58:21,491 - 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-16 12:58:21,491 - INFO - ----- Post-contingency perimeters optimization [start]\n", + "2025-09-16 12:58:21,493 - INFO - Optimizing scenario post-contingency Contingency DE2 DE3.\n", + "2025-09-16 12:58:21,493 - INFO - Optimizing curative state Contingency DE2 DE3 - curative.\n", + "2025-09-16 12:58:21,494 - INFO - Root leaf, cost: 237.65 (functional: 237.65, virtual: 0.0)\n", + "2025-09-16 12:58:21,494 - 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-16 12:58:21,494 - INFO - Linear optimization on root leaf\n", + "2025-09-16 12:58:21,496 - WARNING - Network {CC0 SC0}: 11 generators have been discarded from active power control because of a targetP equals 0\n", + "2025-09-16 12:58:21,496 - INFO - Network {CC0 SC0} has 12 buses and 17 branches\n", + "2025-09-16 12:58:21,496 - 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-16 12:58:21,497 - INFO - Network {CC0 SC0}, slack buses are [BBE2AA1_1] (method='Most meshed bus')\n", + "2025-09-16 12:58:21,497 - INFO - Network {CC0 SC0}, reference bus is BBE2AA1_1 (method='First slack')\n", + "2025-09-16 12:58:21,497 - INFO - Running AC sensitivity analysis with 2 factors and 1 contingencies\n", + "2025-09-16 12:58:21,498 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,498 - 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-16 12:58:21,499 - INFO - Simulate contingency 'Contingency DE2 DE3'\n", + "2025-09-16 12:58:21,500 - INFO - Start AC loadflow on network {CC0 SC0}\n", + "2025-09-16 12:58:21,500 - 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-16 12:58:21,501 - INFO - Iteration 1: better solution found with a cost of -290.77 (functional: -290.77)\n", + "2025-09-16 12:58:21,503 - INFO - Iteration 2: same results as previous iterations, optimal solution found\n", + "2025-09-16 12:58:21,503 - INFO - Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-09-16 12:58:21,504 - INFO - range action(s): pst-range-action: 6\n", + "2025-09-16 12:58:21,505 - 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-16 12:58:21,506 - INFO - No network action available\n", + "2025-09-16 12:58:21,507 - INFO - Search-tree RAO completed with status DEFAULT\n", + "2025-09-16 12:58:21,510 - INFO - Best leaf: Root leaf, 1 range action(s) activated, cost: -290.77 (functional: -290.77, virtual: 0.0)\n", + "2025-09-16 12:58:21,512 - INFO - Best leaf: range action(s): pst-range-action: 6\n", + "2025-09-16 12:58:21,513 - 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-16 12:58:21,515 - 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-16 12:58:21,517 - INFO - Curative state Contingency DE2 DE3 - curative has been optimized.\n", + "2025-09-16 12:58:21,518 - INFO - ----- Post-contingency perimeters optimization [end]\n", + "2025-09-16 12:58:21,520 - INFO - Merging preventive and post-contingency RAO results:\n", + "2025-09-16 12:58:21,521 - 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-16 12:58:21,521 - INFO - Limiting element #02: margin = 198.5 MW, element NNL2AA1 BBE3AA1 1 at state preventive, CNEC ID = \"NNL2AA1 BBE3AA1 1 - preventive\"\n", + "2025-09-16 12:58:21,521 - 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-16 12:58:21,522 - 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": 10 + "execution_count": 11 }, { "cell_type": "code", @@ -698,8 +760,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.700841678Z", - "start_time": "2025-09-16T10:45:44.504822Z" + "end_time": "2025-09-16T10:58:21.582543Z", + "start_time": "2025-09-16T10:58:21.574572Z" } }, "outputs": [ @@ -707,8 +769,8 @@ "data": { "text/plain": [ "{'type': 'RAO_RESULT',\n", - " 'version': '1.8',\n", - " 'info': 'Generated by Open RAO https://powsybl.readthedocs.io/projects/openrao',\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", @@ -742,17 +804,20 @@ " '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}]}]}" + " '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": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 11 + "execution_count": 12 }, { "cell_type": "markdown", @@ -772,8 +837,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2025-09-16T10:46:49.701099889Z", - "start_time": "2025-09-16T10:45:44.551937Z" + "end_time": "2025-09-16T10:58:21.643937Z", + "start_time": "2025-09-16T10:58:21.635968Z" } }, "outputs": [ @@ -789,12 +854,12 @@ " 'megawatt': {'margin': 290.77, 'side1': {'flow': 9.23}}}}]" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 12 + "execution_count": 13 }, { "cell_type": "markdown", From be61bbc8e69759c7ba1f9206e6404be0e680b689 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Wed, 17 Sep 2025 13:07:36 +0200 Subject: [PATCH 13/27] Upgrade python 3.10 Signed-off-by: Florian Dupuy --- runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime.txt b/runtime.txt index 8fdd907..5509089 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.9 +python-3.10 From 803693cfd4cc547ca1ceccc4f9f3f081d968b597 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Wed, 17 Sep 2025 13:17:51 +0200 Subject: [PATCH 14/27] Update cgmes notebook Signed-off-by: Florian Dupuy --- cgmes.ipynb | 1408 +++++++++++++++++++++++++-------------------------- 1 file changed, 690 insertions(+), 718 deletions(-) diff --git a/cgmes.ipynb b/cgmes.ipynb index c03418c..0f1dcf4 100644 --- a/cgmes.ipynb +++ b/cgmes.ipynb @@ -11,6 +11,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:33.811022Z", + "start_time": "2025-09-17T11:08:32.852306Z" + }, "pycharm": { "name": "#%%\n" } @@ -35,6 +39,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:33.966216Z", + "start_time": "2025-09-17T11:08:33.834708Z" + }, "pycharm": { "name": "#%%\n" } @@ -55,7 +63,12 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:34.023458Z", + "start_time": "2025-09-17T11:08:34.020621Z" + } + }, "outputs": [], "source": [ "be_id = be.id\n", @@ -72,13 +85,18 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:34.107090Z", + "start_time": "2025-09-17T11:08:34.083456Z" + } + }, "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", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 52\n", + " 52\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 96\n", + " 96\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 51\n", + " 51\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 29\n", + " 29\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 28\n", + " 28\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", "
\n", "
15.8
\n", " \n", @@ -452,7 +432,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
15.8
\n", " \n", @@ -465,7 +445,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
400.0
\n", " \n", @@ -478,7 +458,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
220.0
\n", " \n", @@ -495,7 +475,7 @@ "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -510,13 +490,18 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:34.196143Z", + "start_time": "2025-09-17T11:08:34.186748Z" + } + }, "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -37\n", + " -37\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -83\n", + " -83\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -37\n", + " -37\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -26\n", + " -26\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -24\n", + " -24\n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \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", @@ -1006,7 +943,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
10.5
\n", " \n", @@ -1019,7 +956,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
110.0
\n", " \n", @@ -1032,7 +969,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
21.0
\n", " \n", @@ -1045,7 +982,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
225.0
\n", " \n", @@ -1058,7 +995,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
220.0
\n", " \n", @@ -1075,7 +1012,7 @@ "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -1104,7 +1041,12 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:34.280429Z", + "start_time": "2025-09-17T11:08:34.258755Z" + } + }, "outputs": [ { "data": { @@ -1178,7 +1120,12 @@ { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:34.387711Z", + "start_time": "2025-09-17T11:08:34.382882Z" + } + }, "outputs": [ { "data": { @@ -1254,8 +1201,13 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:34.666862Z", + "start_time": "2025-09-17T11:08:34.658043Z" + } + }, "outputs": [ { "data": { @@ -1320,7 +1272,7 @@ "ed0c5d75-4a54-43c8-b782-b20d7431630b TN_Border_MA11" ] }, - "execution_count": 14, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -1331,8 +1283,13 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:34.793932Z", + "start_time": "2025-09-17T11:08:34.789255Z" + } + }, "outputs": [ { "data": { @@ -1397,7 +1354,7 @@ "dad02278-bd25-476f-8f58-dbe44be72586 TN_Border_MA11" ] }, - "execution_count": 15, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1419,8 +1376,12 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 10, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.048645Z", + "start_time": "2025-09-17T11:08:35.045719Z" + }, "pycharm": { "name": "#%%\n" } @@ -1444,8 +1405,12 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.099738Z", + "start_time": "2025-09-17T11:08:35.094607Z" + }, "pycharm": { "name": "#%%\n" } @@ -1525,7 +1490,7 @@ "c49942d6-8b01-4b01-b5e8-f1180f84906c NL " ] }, - "execution_count": 17, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1547,8 +1512,12 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 12, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.224384Z", + "start_time": "2025-09-17T11:08:35.212915Z" + }, "pycharm": { "name": "#%%\n" } @@ -1558,7 +1527,7 @@ "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -37\n", + " -37\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 52\n", + " 52\n", " \n", " \n", " \n", @@ -1840,26 +1760,26 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -83\n", + " -83\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 96\n", + " 96\n", " \n", " \n", " \n", @@ -1867,26 +1787,26 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 51\n", + " 51\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -37\n", + " -37\n", " \n", " \n", " \n", @@ -1894,198 +1814,198 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -26\n", + " -26\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 29\n", + " 29\n", " \n", " \n", " \n", @@ -2093,26 +2013,26 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " -24\n", + " -24\n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " 28\n", + " 28\n", " \n", " \n", " \n", @@ -2121,63 +2041,63 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", "
\n", "
15.8
\n", "
\n", @@ -2190,7 +2110,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
380.0
\n", " \n", @@ -2203,7 +2123,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
10.5
\n", " \n", @@ -2216,7 +2136,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
110.0
\n", " \n", @@ -2229,7 +2149,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
15.8
\n", " \n", @@ -2242,7 +2162,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
21.0
\n", " \n", @@ -2255,7 +2175,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
225.0
\n", " \n", @@ -2268,7 +2188,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
400.0
\n", " \n", @@ -2281,7 +2201,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
220.0
\n", " \n", @@ -2294,7 +2214,7 @@ "
\n", "
\n", "
\n", - " \n", + " \n", "
\n", "
220.0
\n", " \n", @@ -2311,10 +2231,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 18, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -2332,8 +2252,13 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.359875Z", + "start_time": "2025-09-17T11:08:35.343331Z" + } + }, "outputs": [ { "data": { @@ -2391,7 +2316,7 @@ "c49942d6-8b01-4b01-b5e8-f1180f84906c NL " ] }, - "execution_count": 19, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -2402,8 +2327,13 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.467012Z", + "start_time": "2025-09-17T11:08:35.461427Z" + } + }, "outputs": [ { "data": { @@ -2465,7 +2395,7 @@ "87f7002b-056f-4a6a-a872-1744eea757e3 Anvers ELIA-Anvers BE" ] }, - "execution_count": 20, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -2487,8 +2417,12 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.764893Z", + "start_time": "2025-09-17T11:08:35.753463Z" + }, "pycharm": { "name": "#%%\n" } @@ -2497,10 +2431,10 @@ { "data": { "text/plain": [ - "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=CONVERGED, iteration_count=6, reference_bus_id='8d8a82ba-b5b0-4e94-861a-192af055f2b8_0', slack_bus_results=[SlackBusResult(id='8d8a82ba-b5b0-4e94-861a-192af055f2b8_0', active_power_mismatch=0.3282217078453442)], distributed_active_power=-44.13525678739042)]" + "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=Converged, iteration_count=7, reference_bus_id='c1d5bfde8f8011e08e4d00247eb1f55e_0', slack_bus_results=[SlackBusResult(id='c1d5bfde8f8011e08e4d00247eb1f55e_0', active_power_mismatch=-0.21366219014484766)], distributed_active_power=-45.16664728458926)]" ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -2512,8 +2446,13 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.820169Z", + "start_time": "2025-09-17T11:08:35.807715Z" + } + }, "outputs": [ { "data": { @@ -2595,9 +2534,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2617,9 +2556,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2639,9 +2578,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2661,9 +2600,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2683,9 +2622,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2737,11 +2676,11 @@ "\n", " p q i \\\n", "id \n", - "3a3b27be-b18b-4385-b557-6735d733baf0 -85.354183 -27.088380 4689.473090 \n", - "550ebe0d-f2b2-48c1-991f-cebea43a21aa -113.354183 -24.705000 3046.407443 \n", - "2844585c-0d35-488d-a449-685bcd57afbf -134.192729 -0.000000 4765.160785 \n", - "1dc9afba-23b5-41a0-8540-b479ed8baf4b -144.192729 -0.000000 5120.259069 \n", - "9c3b8f97-7972-477d-9dc8-87365cc0ad0e -577.263618 -166.129473 21630.359223 \n", + "3a3b27be-b18b-4385-b557-6735d733baf0 -85.245616 57.537385 5682.888931 \n", + "550ebe0d-f2b2-48c1-991f-cebea43a21aa -113.245616 -84.453532 3709.545342 \n", + "2844585c-0d35-488d-a449-685bcd57afbf -134.057020 -0.000000 4781.183683 \n", + "1dc9afba-23b5-41a0-8540-b479ed8baf4b -144.057020 -0.000000 5137.836671 \n", + "9c3b8f97-7972-477d-9dc8-87365cc0ad0e -576.720781 -206.084407 22053.200473 \n", "\n", " voltage_level_id \\\n", "id \n", @@ -2768,7 +2707,7 @@ "9c3b8f97-7972-477d-9dc8-87365cc0ad0e True " ] }, - "execution_count": 22, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -2790,8 +2729,12 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 17, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:35.935912Z", + "start_time": "2025-09-17T11:08:35.931847Z" + }, "pycharm": { "name": "#%%\n" } @@ -2800,10 +2743,10 @@ { "data": { "text/plain": [ - "90.0" + "np.float64(90.0)" ] }, - "execution_count": 23, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -2826,8 +2769,12 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 18, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:36.060457Z", + "start_time": "2025-09-17T11:08:36.057775Z" + }, "pycharm": { "name": "#%%\n" } @@ -2850,8 +2797,12 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 19, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:36.116672Z", + "start_time": "2025-09-17T11:08:36.113089Z" + }, "pycharm": { "name": "#%%\n" } @@ -2860,10 +2811,10 @@ { "data": { "text/plain": [ - "100.0" + "np.float64(100.0)" ] }, - "execution_count": 25, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -2886,8 +2837,12 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 20, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:36.168386Z", + "start_time": "2025-09-17T11:08:36.163694Z" + }, "pycharm": { "name": "#%%\n" } @@ -2896,10 +2851,10 @@ { "data": { "text/plain": [ - "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=CONVERGED, iteration_count=7, reference_bus_id='8d8a82ba-b5b0-4e94-861a-192af055f2b8_0', slack_bus_results=[SlackBusResult(id='8d8a82ba-b5b0-4e94-861a-192af055f2b8_0', active_power_mismatch=0.3444775195734273)], distributed_active_power=-54.24227251491311)]" + "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=Converged, iteration_count=7, reference_bus_id='c1d5bfde8f8011e08e4d00247eb1f55e_0', slack_bus_results=[SlackBusResult(id='c1d5bfde8f8011e08e4d00247eb1f55e_0', active_power_mismatch=-0.25955289487091804)], distributed_active_power=-55.2225126815256)]" ] }, - "execution_count": 26, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -2922,8 +2877,12 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 21, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:36.221640Z", + "start_time": "2025-09-17T11:08:36.211308Z" + }, "pycharm": { "name": "#%%\n" } @@ -3009,9 +2968,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3031,9 +2990,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3053,9 +3012,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3075,9 +3034,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3097,9 +3056,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3151,11 +3110,11 @@ "\n", " p q i \\\n", "id \n", - "3a3b27be-b18b-4385-b557-6735d733baf0 -94.290287 -26.937530 5135.284664 \n", - "550ebe0d-f2b2-48c1-991f-cebea43a21aa -112.290287 -24.342298 3017.085401 \n", - "2844585c-0d35-488d-a449-685bcd57afbf -132.862859 -0.000000 4717.532906 \n", - "1dc9afba-23b5-41a0-8540-b479ed8baf4b -142.862859 -0.000000 5072.600751 \n", - "9c3b8f97-7972-477d-9dc8-87365cc0ad0e -571.944137 -165.116497 21436.200746 \n", + "3a3b27be-b18b-4385-b557-6735d733baf0 -94.187104 58.301221 6123.602646 \n", + "550ebe0d-f2b2-48c1-991f-cebea43a21aa -112.187104 -84.603909 3689.677534 \n", + "2844585c-0d35-488d-a449-685bcd57afbf -132.733880 -0.000000 4733.761755 \n", + "1dc9afba-23b5-41a0-8540-b479ed8baf4b -142.733880 -0.000000 5090.397284 \n", + "9c3b8f97-7972-477d-9dc8-87365cc0ad0e -571.428221 -205.411167 21865.615940 \n", "\n", " voltage_level_id \\\n", "id \n", @@ -3182,7 +3141,7 @@ "9c3b8f97-7972-477d-9dc8-87365cc0ad0e True " ] }, - "execution_count": 27, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -3204,8 +3163,12 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 22, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:36.356985Z", + "start_time": "2025-09-17T11:08:36.336447Z" + }, "pycharm": { "name": "#%%\n" } @@ -3285,12 +3248,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3307,12 +3270,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3332,18 +3295,18 @@ "\n", " b1 g2 b2 p1 \\\n", "id \n", - "b58bf21a-096a-4dae-9a01-3f03b60c24c7 0.000021 0.000034 0.000021 -17.587416 \n", - "ffbabc27-1ccd-4fdc-b037-e341706c8d29 0.000010 0.000060 0.000010 -6.224587 \n", + "b58bf21a-096a-4dae-9a01-3f03b60c24c7 0.000021 0.000034 0.000021 -17.685639 \n", + "ffbabc27-1ccd-4fdc-b037-e341706c8d29 0.000010 0.000060 0.000010 -6.336742 \n", "\n", " q1 i1 p2 \\\n", "id \n", - "b58bf21a-096a-4dae-9a01-3f03b60c24c7 -3.106957 45.445906 21.083981 \n", - "ffbabc27-1ccd-4fdc-b037-e341706c8d29 -1.330019 16.196622 12.424309 \n", + "b58bf21a-096a-4dae-9a01-3f03b60c24c7 -5.312858 47.488283 21.115713 \n", + "ffbabc27-1ccd-4fdc-b037-e341706c8d29 -2.391001 17.417027 12.417184 \n", "\n", " q2 i2 \\\n", "id \n", - "b58bf21a-096a-4dae-9a01-3f03b60c24c7 1.169710 53.617718 \n", - "ffbabc27-1ccd-4fdc-b037-e341706c8d29 0.418134 31.565048 \n", + "b58bf21a-096a-4dae-9a01-3f03b60c24c7 3.434416 54.811563 \n", + "ffbabc27-1ccd-4fdc-b037-e341706c8d29 1.507009 32.047555 \n", "\n", " voltage_level1_id \\\n", "id \n", @@ -3371,7 +3334,7 @@ "ffbabc27-1ccd-4fdc-b037-e341706c8d29 True True " ] }, - "execution_count": 28, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -3382,8 +3345,13 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, + "execution_count": 23, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:36.625665Z", + "start_time": "2025-09-17T11:08:36.614999Z" + } + }, "outputs": [ { "data": { @@ -3421,6 +3389,7 @@ " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3441,6 +3410,7 @@ " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3453,14 +3423,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3472,14 +3443,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3491,14 +3463,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3510,14 +3483,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3529,14 +3503,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3548,14 +3523,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3567,14 +3543,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3586,14 +3563,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3605,14 +3583,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3624,14 +3603,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3667,16 +3647,16 @@ "\n", " p q i \\\n", "id \n", - "ed0c5d75-4a54-43c8-b782-b20d7431630b -43.858954 88.851000 136.736232 \n", - "b18cd1aa-7808-49b9-a7cf-605eaf07b006 -90.648689 149.265265 240.990783 \n", - "78736387-5f60-4832-b3fe-d50daf81b0a6 -39.220349 59.054995 97.829358 \n", - "a16b4a6c-70b1-4abf-9a9d-bd0fa47f9fe4 -16.237023 1.123689 41.326852 \n", - "17086487-56ba-4979-b8de-064025a6b4da -18.271265 -2.711533 46.901585 \n", - "a279a3dc-550b-426c-af3a-61b7be508dcc 20.466345 -2.289792 52.347008 \n", - "8fdc7abd-3746-481a-a65e-3df56acd8b13 21.145972 -5.181329 55.339945 \n", - "7f43f508-2496-4b64-9146-0a40406cbe49 54.973610 -108.150034 169.292749 \n", - "e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc 104.162080 -169.365875 277.456249 \n", - "dad02278-bd25-476f-8f58-dbe44be72586 57.873034 -96.129847 156.575245 \n", + "ed0c5d75-4a54-43c8-b782-b20d7431630b -44.074415 79.398809 126.703886 \n", + "b18cd1aa-7808-49b9-a7cf-605eaf07b006 -90.107574 132.603780 223.687774 \n", + "78736387-5f60-4832-b3fe-d50daf81b0a6 -39.254095 50.754496 89.522972 \n", + "a16b4a6c-70b1-4abf-9a9d-bd0fa47f9fe4 -16.294068 -0.556141 41.771397 \n", + "17086487-56ba-4979-b8de-064025a6b4da -18.238829 -4.385284 48.061508 \n", + "a279a3dc-550b-426c-af3a-61b7be508dcc 20.460359 -0.575155 52.257277 \n", + "8fdc7abd-3746-481a-a65e-3df56acd8b13 21.074380 -3.384612 54.493757 \n", + "7f43f508-2496-4b64-9146-0a40406cbe49 54.662015 -98.973320 159.359054 \n", + "e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc 103.320111 -152.565573 259.703284 \n", + "dad02278-bd25-476f-8f58-dbe44be72586 57.778985 -86.683186 146.829004 \n", "\n", " voltage_level_id \\\n", "id \n", @@ -3717,18 +3697,18 @@ "e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc True TN_Border_GY11 \n", "dad02278-bd25-476f-8f58-dbe44be72586 True TN_Border_MA11 \n", "\n", - " ucte_xnode_code \\\n", - "id \n", - "ed0c5d75-4a54-43c8-b782-b20d7431630b TN_Border_MA11 \n", - "b18cd1aa-7808-49b9-a7cf-605eaf07b006 TN_Border_GY11 \n", - "78736387-5f60-4832-b3fe-d50daf81b0a6 TN_Border_AL11 \n", - "a16b4a6c-70b1-4abf-9a9d-bd0fa47f9fe4 TN_Border_ST24 \n", - "17086487-56ba-4979-b8de-064025a6b4da TN_Border_ST23 \n", - "a279a3dc-550b-426c-af3a-61b7be508dcc TN_Border_ST24 \n", - "8fdc7abd-3746-481a-a65e-3df56acd8b13 TN_Border_ST23 \n", - "7f43f508-2496-4b64-9146-0a40406cbe49 TN_Border_AL11 \n", - "e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc TN_Border_GY11 \n", - "dad02278-bd25-476f-8f58-dbe44be72586 TN_Border_MA11 \n", + " ucte_xnode_code paired \\\n", + "id \n", + "ed0c5d75-4a54-43c8-b782-b20d7431630b TN_Border_MA11 True \n", + "b18cd1aa-7808-49b9-a7cf-605eaf07b006 TN_Border_GY11 True \n", + "78736387-5f60-4832-b3fe-d50daf81b0a6 TN_Border_AL11 True \n", + "a16b4a6c-70b1-4abf-9a9d-bd0fa47f9fe4 TN_Border_ST24 True \n", + "17086487-56ba-4979-b8de-064025a6b4da TN_Border_ST23 True \n", + "a279a3dc-550b-426c-af3a-61b7be508dcc TN_Border_ST24 True \n", + "8fdc7abd-3746-481a-a65e-3df56acd8b13 TN_Border_ST23 True \n", + "7f43f508-2496-4b64-9146-0a40406cbe49 TN_Border_AL11 True \n", + "e8acf6b6-99cb-45ad-b8dc-16c7866a4ddc TN_Border_GY11 True \n", + "dad02278-bd25-476f-8f58-dbe44be72586 TN_Border_MA11 True \n", "\n", " tie_line_id \n", "id \n", @@ -3744,7 +3724,7 @@ "dad02278-bd25-476f-8f58-dbe44be72586 dad02278-bd25-476f-8f58-dbe44be72586 + ed0c5d7... " ] }, - "execution_count": 29, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -3773,25 +3753,17 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 24, "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:08:36.785458Z", + "start_time": "2025-09-17T11:08:36.766489Z" + }, "pycharm": { "name": "#%%\n" } }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "True\n", - "\n", - "\n", - "True\n" - ] - }, { "data": { "text/html": [ @@ -3840,7 +3812,7 @@ "BE -> NL 0.419779 " ] }, - "execution_count": 30, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -3858,7 +3830,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -3872,9 +3844,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } From a06a0c752e2cd822990f025c4c4aa037d2459ea1 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Wed, 17 Sep 2025 13:19:01 +0200 Subject: [PATCH 15/27] Update network modification notebook Signed-off-by: Florian Dupuy --- network_modifications_node_breaker.ipynb | 688 +++++++++++++++-------- 1 file changed, 464 insertions(+), 224 deletions(-) diff --git a/network_modifications_node_breaker.ipynb b/network_modifications_node_breaker.ipynb index b2c2b27..a634289 100644 --- a/network_modifications_node_breaker.ipynb +++ b/network_modifications_node_breaker.ipynb @@ -22,7 +22,12 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.137508Z", + "start_time": "2025-09-17T11:20:33.602304Z" + } + }, "outputs": [], "source": [ "import pypowsybl as pp\n", @@ -38,8 +43,13 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.151800Z", + "start_time": "2025-09-17T11:20:34.147399Z" + } + }, "outputs": [], "source": [ "n = pp.network.create_empty()" @@ -55,8 +65,13 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.203161Z", + "start_time": "2025-09-17T11:20:34.200142Z" + } + }, "outputs": [], "source": [ "n.create_substations(id=['S1', 'S2'])" @@ -64,8 +79,13 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.254836Z", + "start_time": "2025-09-17T11:20:34.251223Z" + } + }, "outputs": [], "source": [ "voltage_levels = pd.DataFrame.from_records(index='id', data=[\n", @@ -85,8 +105,13 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.308483Z", + "start_time": "2025-09-17T11:20:34.303385Z" + } + }, "outputs": [], "source": [ "voltage_level_topology = pd.DataFrame.from_records(index='id', data=[\n", @@ -106,8 +131,13 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.377698Z", + "start_time": "2025-09-17T11:20:34.359553Z" + } + }, "outputs": [ { "data": { @@ -205,7 +235,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -218,6 +248,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -232,6 +264,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -241,7 +274,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -254,6 +287,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -261,46 +300,46 @@ " \n", " VL1\n", " \n", - " \n", + " \n", " \n", " VL1_1_1\n", " \n", " \n", " VL2\n", " \n", - " \n", + " \n", " \n", " VL2_1_1\n", " \n", - " \n", + " \n", " \n", " VL2_2_1\n", " \n", - " \n", + " \n", " \n", " VL2_3_1\n", " \n", - " \n", + " \n", " \n", " VL2_1_2\n", " \n", - " \n", + " \n", " \n", " VL2_2_2\n", " \n", - " \n", + " \n", " \n", " VL2_3_2\n", " \n", - " \n", + " \n", " \n", " VL2_1_3\n", " \n", - " \n", + " \n", " \n", " VL2_2_3\n", " \n", - " \n", + " \n", " \n", " VL2_3_3\n", " \n", @@ -494,10 +533,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -508,8 +547,13 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.476283Z", + "start_time": "2025-09-17T11:20:34.452529Z" + } + }, "outputs": [ { "data": { @@ -607,7 +651,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -620,6 +664,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -634,6 +680,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -643,7 +690,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -656,6 +703,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -663,19 +716,19 @@ " \n", " VL3\n", " \n", - " \n", + " \n", " \n", " VL3_1_1\n", " \n", - " \n", + " \n", " \n", " VL3_2_1\n", " \n", - " \n", + " \n", " \n", " VL3_1_2\n", " \n", - " \n", + " \n", " \n", " VL3_2_2\n", " \n", @@ -743,10 +796,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -767,8 +820,13 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.532860Z", + "start_time": "2025-09-17T11:20:34.528064Z" + } + }, "outputs": [], "source": [ "coupling_device = pd.DataFrame.from_records(index='bus_or_busbar_section_id_1', data=[\n", @@ -784,8 +842,13 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.623147Z", + "start_time": "2025-09-17T11:20:34.605661Z" + } + }, "outputs": [ { "data": { @@ -883,7 +946,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -896,6 +959,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -910,6 +975,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -919,7 +985,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -932,6 +998,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -939,46 +1011,46 @@ " \n", " VL1\n", " \n", - " \n", + " \n", " \n", " VL1_1_1\n", " \n", " \n", " VL2\n", " \n", - " \n", + " \n", " \n", " VL2_1_1\n", " \n", - " \n", + " \n", " \n", " VL2_2_1\n", " \n", - " \n", + " \n", " \n", " VL2_3_1\n", " \n", - " \n", + " \n", " \n", " VL2_1_2\n", " \n", - " \n", + " \n", " \n", " VL2_2_2\n", " \n", - " \n", + " \n", " \n", " VL2_3_2\n", " \n", - " \n", + " \n", " \n", " VL2_1_3\n", " \n", - " \n", + " \n", " \n", " VL2_2_3\n", " \n", - " \n", + " \n", " \n", " VL2_3_3\n", " \n", @@ -1065,7 +1137,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1074,7 +1146,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1092,7 +1164,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1370,10 +1442,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1384,8 +1456,13 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.671184Z", + "start_time": "2025-09-17T11:20:34.650030Z" + } + }, "outputs": [ { "data": { @@ -1483,7 +1560,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -1496,6 +1573,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -1510,6 +1589,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -1519,7 +1599,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -1532,6 +1612,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -1539,19 +1625,19 @@ " \n", " VL3\n", " \n", - " \n", + " \n", " \n", " VL3_1_1\n", " \n", - " \n", + " \n", " \n", " VL3_2_1\n", " \n", - " \n", + " \n", " \n", " VL3_1_2\n", " \n", - " \n", + " \n", " \n", " VL3_2_2\n", " \n", @@ -1683,10 +1769,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1708,8 +1794,13 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.725915Z", + "start_time": "2025-09-17T11:20:34.714090Z" + } + }, "outputs": [ { "data": { @@ -1795,7 +1886,7 @@ "load5 10.0 3.0 VL3_1_1 10" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1814,8 +1905,13 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.841060Z", + "start_time": "2025-09-17T11:20:34.837621Z" + } + }, "outputs": [], "source": [ "pp.network.create_load_bay(n, loads)" @@ -1823,8 +1919,13 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:34.995987Z", + "start_time": "2025-09-17T11:20:34.974348Z" + } + }, "outputs": [ { "data": { @@ -1922,7 +2023,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -1935,6 +2036,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -1949,6 +2052,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -1958,7 +2062,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -1971,6 +2075,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -1996,13 +2106,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -2148,7 +2258,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2157,7 +2267,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2175,7 +2285,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2469,13 +2579,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -2527,13 +2637,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -2585,13 +2695,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -2627,10 +2737,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -2641,8 +2751,13 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.054809Z", + "start_time": "2025-09-17T11:20:35.044305Z" + } + }, "outputs": [ { "data": { @@ -2740,7 +2855,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -2753,6 +2868,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -2767,6 +2884,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -2776,7 +2894,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -2789,6 +2907,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -2953,13 +3077,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -2991,10 +3115,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -3012,8 +3136,13 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.111572Z", + "start_time": "2025-09-17T11:20:35.103339Z" + } + }, "outputs": [ { "data": { @@ -3114,7 +3243,7 @@ "gen3 VL2_1_2 50 TOP " ] }, - "execution_count": 16, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -3131,8 +3260,13 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.245812Z", + "start_time": "2025-09-17T11:20:35.242459Z" + } + }, "outputs": [], "source": [ "pp.network.create_generator_bay(n, generators)" @@ -3140,9 +3274,12 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": { - "scrolled": false + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.423893Z", + "start_time": "2025-09-17T11:20:35.371138Z" + } }, "outputs": [ { @@ -3241,7 +3378,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -3254,6 +3391,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -3268,6 +3407,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -3277,7 +3417,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -3290,6 +3430,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -3315,13 +3461,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3467,7 +3613,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3476,7 +3622,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3494,7 +3640,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3788,13 +3934,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3846,13 +3992,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3904,13 +4050,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -3962,13 +4108,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -4020,13 +4166,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -4078,13 +4224,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -4120,10 +4266,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -4142,8 +4288,13 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.440161Z", + "start_time": "2025-09-17T11:20:35.432282Z" + } + }, "outputs": [ { "data": { @@ -4210,7 +4361,7 @@ "shunt1 VL2_3_3 90 TOP " ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -4230,8 +4381,13 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.551923Z", + "start_time": "2025-09-17T11:20:35.542639Z" + } + }, "outputs": [], "source": [ "pp.network.create_shunt_compensator_bay(n, shunt_df=shunt_df, linear_model_df=model_df)" @@ -4239,9 +4395,12 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": { - "scrolled": false + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.683973Z", + "start_time": "2025-09-17T11:20:35.669451Z" + } }, "outputs": [ { @@ -4340,7 +4499,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -4353,6 +4512,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -4367,6 +4528,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -4376,7 +4538,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -4389,6 +4551,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -4414,13 +4582,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -4566,7 +4734,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4575,7 +4743,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4593,7 +4761,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4887,13 +5055,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -4945,13 +5113,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5003,13 +5171,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5061,13 +5229,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5119,13 +5287,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5177,13 +5345,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5235,13 +5403,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5278,10 +5446,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 21, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -5299,8 +5467,13 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, + "execution_count": 21, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.747156Z", + "start_time": "2025-09-17T11:20:35.735376Z" + } + }, "outputs": [], "source": [ "pp.network.create_static_var_compensator_bay(n, id='svc', target_q=200.0, regulation_mode='REACTIVE_POWER', target_v=400, b_min=0, b_max=2, bus_or_busbar_section_id='VL3_1_1', position_order=20, direction='TOP')" @@ -5308,8 +5481,13 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.806544Z", + "start_time": "2025-09-17T11:20:35.794576Z" + } + }, "outputs": [ { "data": { @@ -5407,7 +5585,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -5420,6 +5598,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -5434,6 +5614,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -5443,7 +5624,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -5456,6 +5637,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -5617,13 +5804,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5668,13 +5855,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5705,10 +5892,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 23, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -5727,8 +5914,13 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, + "execution_count": 23, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.857733Z", + "start_time": "2025-09-17T11:20:35.853473Z" + } + }, "outputs": [], "source": [ "pp.network.create_2_windings_transformer_bays(n, id='twt', b=1e-6, g=1e-6, r=0.5, x=10, rated_u1=225, rated_u2=63,\n", @@ -5738,8 +5930,13 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, + "execution_count": 24, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.912960Z", + "start_time": "2025-09-17T11:20:35.906553Z" + } + }, "outputs": [], "source": [ "pp.network.create_line_bays(n, id='line1', r=0.1, x=10, g1=0, b1=0, g2=0, b2=0, bus_or_busbar_section_id_1='VL2_3_1', position_order_1=20, direction_1='BOTTOM',\n", @@ -5748,8 +5945,13 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, + "execution_count": 25, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:35.981547Z", + "start_time": "2025-09-17T11:20:35.963002Z" + } + }, "outputs": [ { "data": { @@ -5847,7 +6049,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -5860,6 +6062,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -5874,6 +6078,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -5883,7 +6088,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -5896,6 +6101,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -5921,13 +6132,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -5965,13 +6176,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6114,7 +6325,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6123,7 +6334,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6141,7 +6352,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6435,13 +6646,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6490,13 +6701,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6545,13 +6756,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6603,13 +6814,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6661,13 +6872,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6719,13 +6930,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6777,13 +6988,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6835,13 +7046,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6893,13 +7104,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -6946,10 +7157,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 26, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -6960,8 +7171,13 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, + "execution_count": 26, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:36.006261Z", + "start_time": "2025-09-17T11:20:35.990049Z" + } + }, "outputs": [ { "data": { @@ -7059,7 +7275,7 @@ ".sld-wire.sld-feeder-disconnected {stroke: black}\n", ".sld-wire.sld-feeder-connected-disconnected {stroke-dasharray: 3,3}\n", ".sld-wire.sld-feeder-disconnected-connected {stroke: black; stroke-dasharray: 3,3}\n", - "/* ----------------------------------------------------------------------- */\n", + ".sld-busbar-section.sld-bus-disconnected {stroke-dasharray: 3,3}/* ----------------------------------------------------------------------- */\n", "/* File : components.css ------------------------------------------------- */\n", "/* Stroke black */\n", ".sld-disconnector {stroke-width: 3; stroke: black; fill: none}\n", @@ -7072,6 +7288,8 @@ ".sld-busbar-section {stroke: var(--sld-vl-color, black); stroke-width: 3; fill: none}\n", "/* Stroke --sld-vl-color with fallback red */\n", ".sld-wire {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-wire.sld-dangling-line {stroke-width: 2px}\n", + ".sld-wire.sld-tie-line {stroke-width: 2px}\n", "/* Stroke --sld-vl-color with fallback blue */\n", ".sld-load {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-battery {stroke: var(--sld-vl-color, blue); fill: none}\n", @@ -7086,6 +7304,7 @@ ".sld-svc {stroke: var(--sld-vl-color, blue); fill: none}\n", ".sld-vsc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", ".sld-lcc {stroke: var(--sld-vl-color, blue); font-size: 7.43px; fill: none}\n", + ".sld-ground {stroke: var(--sld-vl-color, blue); fill: none}\n", "/* Stroke none & fill: --sld-vl-color */\n", ".sld-node-infos {stroke: none; fill: var(--sld-vl-color, black)}\n", "/* Stroke none & fill: black */\n", @@ -7095,7 +7314,7 @@ ".sld-unknown {stroke: none; fill: black}\n", "/* Fonts */\n", ".sld-label {stroke: none; fill: black; font: 8px serif}\n", - ".sld-angle, .sld-voltage {font: 10px serif}\n", + ".sld-bus-legend-info {font: 10px serif}\n", ".sld-graph-label {font: 12px serif}\n", "/* Specific */\n", ".sld-grid {stroke: #003700; stroke-dasharray: 1,10}\n", @@ -7108,6 +7327,12 @@ ".sld-disconnector.sld-fictitious {stroke: maroon}\n", ".sld-load-break-switch.sld-fictitious {stroke: maroon}\n", ".sld-busbar-section.sld-fictitious {stroke: var(--sld-vl-color, #c80000); stroke-width: 1}\n", + "/* ground disconnector specific */\n", + ".sld-ground-disconnection-attach {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-open .sld-ground-disconnection-ground {stroke: black; fill: none}\n", + ".sld-closed .sld-ground-disconnection-ground {stroke: var(--sld-vl-color, #c80000); fill: none}\n", + ".sld-ground-disconnection .sld-sw-open {stroke: black; fill: none}\n", + ".sld-ground-disconnection .sld-sw-closed {stroke: black; fill: none}\n", "\n", "]]>\n", " \n", @@ -7272,13 +7497,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -7323,13 +7548,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -7373,13 +7598,13 @@ " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", @@ -7408,10 +7633,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 27, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -7438,8 +7663,13 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, + "execution_count": 27, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:36.072165Z", + "start_time": "2025-09-17T11:20:36.057654Z" + } + }, "outputs": [ { "data": { @@ -7535,7 +7765,7 @@ "shunt1 90 shunt1" ] }, - "execution_count": 28, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -7555,8 +7785,13 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, + "execution_count": 28, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:36.208973Z", + "start_time": "2025-09-17T11:20:36.204996Z" + } + }, "outputs": [ { "data": { @@ -7564,7 +7799,7 @@ "Interval(0, 9, closed='both')" ] }, - "execution_count": 29, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -7575,8 +7810,13 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, + "execution_count": 29, + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-17T11:20:36.337819Z", + "start_time": "2025-09-17T11:20:36.333586Z" + } + }, "outputs": [ { "data": { @@ -7584,7 +7824,7 @@ "Interval(21, 29, closed='both')" ] }, - "execution_count": 30, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -7603,7 +7843,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -7617,7 +7857,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.10.12" } }, "nbformat": 4, From 3a7934653a7fbcf2277612ac5fad42995369c560 Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Wed, 17 Sep 2025 13:29:49 +0200 Subject: [PATCH 16/27] Fix image link Signed-off-by: Florian Dupuy --- ...ybl_lf_security_sensitivity_analysis.ipynb | 3725 ++++++++++++++--- 1 file changed, 3090 insertions(+), 635 deletions(-) diff --git a/pypowsybl_lf_security_sensitivity_analysis.ipynb b/pypowsybl_lf_security_sensitivity_analysis.ipynb index b4e6ea6..e408c11 100644 --- a/pypowsybl_lf_security_sensitivity_analysis.ipynb +++ b/pypowsybl_lf_security_sensitivity_analysis.ipynb @@ -2,66 +2,68 @@ "cells": [ { "cell_type": "markdown", + "id": "9e9d9cf8041e81f2", "metadata": {}, "source": [ "
\n", - "\n", + "\n", "
" - ], - "id": "9e9d9cf8041e81f2" + ] }, { "cell_type": "markdown", + "id": "7ed15e14f29946af", "metadata": {}, "source": [ "# Introduction to PyPowSyBl: Network representation, load flow calculation, security analysis and sensitivity analysis" - ], - "id": "7ed15e14f29946af" + ] }, { "cell_type": "markdown", + "id": "a55ee0e4dd35c508", "metadata": {}, "source": [ "@authors: Alexandre Marié ([Artelys](https://www.artelys.com/)), Coline Piloquet ([Rte](https://www.rte-france.com/)), Sophie Frasnedo ([Rte](https://www.rte-france.com/))." - ], - "id": "a55ee0e4dd35c508" + ] }, { "cell_type": "markdown", + "id": "f33392be66862121", "metadata": {}, - "source": "Let's start this notebook by importing pypowsybl!", - "id": "f33392be66862121" + "source": [ + "Let's start this notebook by importing pypowsybl!" + ] }, { "cell_type": "code", + "execution_count": 1, + "id": "9526aa2d29731d3d", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:13.179298Z", "start_time": "2025-09-15T11:22:12.738550Z" } }, + "outputs": [], "source": [ "import pypowsybl as pp" - ], - "id": "9526aa2d29731d3d", - "outputs": [], - "execution_count": 1 + ] }, { "cell_type": "markdown", + "id": "fc88f344d8e01669", "metadata": {}, "source": [ "## 1 - Network presentation" - ], - "id": "fc88f344d8e01669" + ] }, { "cell_type": "markdown", + "id": "80d928c95acdc97e", "metadata": {}, "source": [ "The network used for this tutorial consists of 6 voltage levels, all of which are connected by two parallel lines with the same electrotechnical characteristics (same resistance and same reactance for each line), as well as two HVDC lines and a Phase-Shifting Transformer (PST). It also has 4 generating units and 3 loads." - ], - "id": "80d928c95acdc97e" + ] }, { "attachments": { @@ -70,138 +72,1384 @@ } }, "cell_type": "markdown", + "id": "fecd2a9c5061e055", "metadata": {}, "source": [ "![network_6_nodes.png](attachment:network_6_nodes.png)" - ], - "id": "fecd2a9c5061e055" + ] }, { "cell_type": "markdown", + "id": "a1010b80876b4c1", "metadata": {}, "source": [ "The network is available in the pyPowSyBl library and can be loaded very easily." - ], - "id": "a1010b80876b4c1" + ] }, { "cell_type": "code", + "execution_count": 2, + "id": "32ffba9a49107723", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:13.190419Z", "start_time": "2025-09-15T11:22:13.184739Z" } }, + "outputs": [], "source": [ "n6 = pp.network.create_metrix_tutorial_six_buses_network()" - ], - "id": "32ffba9a49107723", - "outputs": [], - "execution_count": 2 + ] }, { "cell_type": "markdown", + "id": "bf1d3dcfdbc36da1", "metadata": {}, "source": [ "In order to display the network, we can draw the network area diagram. This type of diagram displays the voltage levels and how they are connected to each other." - ], - "id": "bf1d3dcfdbc36da1" + ] }, { "cell_type": "code", + "execution_count": 3, + "id": "cb2a785212b8461b", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:13.265535Z", "start_time": "2025-09-15T11:22:13.240964Z" } }, - "source": [ - "n6.get_network_area_diagram()" - ], - "id": "cb2a785212b8461b", "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", + " -48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -48\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -144\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", + " 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", + " -144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
NE_poste
\n", + "
\n", + " 380.0 kV / -0.0°
\n", + "
\n", + "
\n", + "
NO_poste
\n", + "
\n", + " 380.0 kV / 0.0°
\n", + "
\n", + "
\n", + "
N_poste
\n", + "
\n", + " 380.0 kV / -0.0°
\n", + "
\n", + "
\n", + "
SE_poste
\n", + "
\n", + " 380.0 kV / -0.1°
\n", + "
\n", + "
\n", + "
SO_poste
\n", + "
\n", + " 380.0 kV / 0.0°
\n", + "
\n", + "
\n", + "
S_poste
\n", + "
\n", + " 380.0 kV / -0.0°
\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 -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 48\n \n \n \n \n \n \n \n \n \n \n \n -48\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n -96\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n -144\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 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 -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n -144\n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
NO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
N_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
SE_poste
\n
\n 380.0 kV / -0.1°
\n
\n
\n
SO_poste
\n
\n 380.0 kV / 0.0°
\n
\n
\n
S_poste
\n
\n 380.0 kV / -0.0°
\n
\n
\n
\n
\n" + ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 3 + "source": [ + "n6.get_network_area_diagram()" + ] }, { "cell_type": "markdown", + "id": "976c877bc72a9dec", "metadata": {}, "source": [ "If we wish to get a more detailed view of the network, featuring each component (busbars, switches, generators, loads etc.), we can display a single-line diagram.\n", "Here, we chose to display the single-line diagram of the 'SE' substation." - ], - "id": "976c877bc72a9dec" + ] }, { "cell_type": "code", + "execution_count": 4, + "id": "9ff44765df054dd3", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:13.345067Z", "start_time": "2025-09-15T11:22:13.314887Z" } }, - "source": [ - "n6.get_single_line_diagram('SO')" - ], - "id": "9ff44765df054dd3", "outputs": [ { "data": { + "image/svg+xml": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " SO_poste\n", + " \n", + " \n", + " \n", + " SOO1_1\n", + " \n", + " \n", + " \n", + " SOO1_mnv\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -480\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " SO_G1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " SO_NO_1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 96\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " SO_NO_2\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " AC / DC - VSC\n", + " HVDC1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " AC / DC - VSC\n", + " HVDC2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " S_SO_1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 144\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " S_SO_2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 480\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " SO_L\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -480\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " SO_G2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ "" - ], - "image/svg+xml": "\n\n \n \n \n \n \n SO_poste\n \n \n \n SOO1_1\n \n \n \n SOO1_mnv\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_G1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_NO_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 96\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_NO_2\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 \n \n \n \n \n \n \n \n \n \n AC / DC - VSC\n HVDC1\n \n \n \n \n \n \n \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 \n \n \n \n \n AC / DC - VSC\n HVDC2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SO_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 144\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n S_SO_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_L\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -480\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n SO_G2\n \n \n \n \n \n \n \n \n\n" + ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 4 + "source": [ + "n6.get_single_line_diagram('SO')" + ] }, { "cell_type": "markdown", + "id": "8cfc8a5e6f031e8f", "metadata": {}, "source": [ "We can display node info:" - ], - "id": "8cfc8a5e6f031e8f" + ] }, { "cell_type": "code", + "execution_count": 5, + "id": "1fd05d36b15c34da", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:13.408706Z", "start_time": "2025-09-15T11:22:13.396557Z" } }, - "source": [ - "n6.get_substations()" - ], - "id": "1fd05d36b15c34da", "outputs": [ { "data": { - "text/plain": [ - " name TSO geo_tags country\n", - "id \n", - "NO \n", - "S \n", - "SO \n", - "SE \n", - "N " - ], "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", + " -101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -189\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 189\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -189\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 189\n", + " \n", + " \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", + " 177\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -101\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 189\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -189\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 189\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -189\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 291\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -291\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 291\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -291\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", + " 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", + " -291\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 291\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -291\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 291\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
NE_poste
\n", + "
\n", + " kV / 0.0°
\n", + "
\n", + "
\n", + "
NO_poste
\n", + "
\n", + " kV / 0.1°
\n", + "
\n", + "
\n", + "
N_poste
\n", + "
\n", + " kV / 0.0°
\n", + "
\n", + "
\n", + "
SE_poste
\n", + "
\n", + " kV / -0.1°
\n", + "
\n", + "
\n", + "
SO_poste
\n", + "
\n", + " kV / 0.2°
\n", + "
\n", + "
\n", + "
S_poste
\n", + "
\n", + " kV / 0.0°
\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 -101\n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n \n \n -101\n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \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 177\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n -101\n \n \n \n \n \n \n \n \n \n \n \n \n \n 101\n \n \n \n \n \n \n \n \n \n \n \n -101\n \n \n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n \n \n 189\n \n \n \n \n \n \n \n \n \n \n \n -189\n \n \n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n -291\n \n \n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n -291\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 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 -291\n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n \n \n -291\n \n \n \n \n \n \n \n \n \n \n \n 291\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n kV / 0.0°
\n
\n
\n
NO_poste
\n
\n kV / 0.1°
\n
\n
\n
N_poste
\n
\n kV / 0.0°
\n
\n
\n
SE_poste
\n
\n kV / -0.1°
\n
\n
\n
SO_poste
\n
\n kV / 0.2°
\n
\n
\n
S_poste
\n
\n kV / 0.0°
\n
\n
\n
\n
\n" + ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 15 + "source": [ + "n6.get_network_area_diagram()" + ] }, { "cell_type": "markdown", + "id": "a0039c667113c25e", "metadata": {}, "source": [ "In the base case, the generating units and the loads are both located south. The flow takes the path of least resistance so it goes mostly through the SO -> S -> SE lines. There is also flow on the PST, and to the north." - ], - "id": "a0039c667113c25e" + ] }, { "attachments": { @@ -1546,14 +3403,15 @@ } }, "cell_type": "markdown", + "id": "16e1d7b0dc87854a", "metadata": {}, "source": [ "![network_after_LF.png](attachment:network_after_LF.png)" - ], - "id": "16e1d7b0dc87854a" + ] }, { "cell_type": "markdown", + "id": "8321798731300c2f", "metadata": {}, "source": [ "Now, let's assume we're faced with the loss of the `S_SO_1` line. \n", @@ -1561,21 +3419,18 @@ "This situation is called a N-1 case.\n", "\n", "We disconnect the line to simulate its loss." - ], - "id": "8321798731300c2f" + ] }, { "cell_type": "code", + "execution_count": 16, + "id": "8839747a2e11823a", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:14.895817Z", "start_time": "2025-09-15T11:22:14.891789Z" } }, - "source": [ - "n6.disconnect(id='S_SO_1')" - ], - "id": "8839747a2e11823a", "outputs": [ { "data": { @@ -1588,110 +3443,64 @@ "output_type": "execute_result" } ], - "execution_count": 16 + "source": [ + "n6.disconnect(id='S_SO_1')" + ] }, { "cell_type": "code", + "execution_count": 17, + "id": "887d602d87257d0d", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:14.950917Z", "start_time": "2025-09-15T11:22:14.948164Z" } }, - "source": [ - "results = pp.loadflow.run_dc(n6)" - ], - "id": "887d602d87257d0d", "outputs": [], - "execution_count": 17 - }, - { - "cell_type": "code", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-15T11:22:15.006065Z", - "start_time": "2025-09-15T11:22:15.000333Z" - } - }, "source": [ - "results" - ], - "id": "b687b09fc86e5822", - "outputs": [ - { - "data": { - "text/plain": [ - "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=Converged, iteration_count=0, reference_bus_id='NE_poste_0', slack_bus_results=[SlackBusResult(id='NE_poste_0', active_power_mismatch=-0.0)], distributed_active_power=-0.0)]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 18 + "results = pp.loadflow.run_dc(n6)" + ] }, { - "cell_type": "code", - "metadata": { - "ExecuteTime": { - "end_time": "2025-09-15T11:22:15.086945Z", - "start_time": "2025-09-15T11:22:15.064648Z" - } - }, - "source": [ - "n6.get_lines()" - ], - "id": "4fec5edb2e9aa8bb", - "outputs": [ - { - "data": { - "text/plain": [ - " name r x g1 b1 g2 b2 p1 q1 i1 p2 \\\n", - "id \n", - "NO_N_1 1.0 1.0 0.0 0.0 0.0 0.0 125.250843 NaN NaN -125.250843 \n", - "NO_N_2 2.0 1.0 0.0 0.0 0.0 0.0 125.250843 NaN NaN -125.250843 \n", - "S_SE_1 3.0 1.0 0.0 0.0 0.0 0.0 242.100337 NaN NaN -242.100337 \n", - "S_SE_2 4.0 1.0 0.0 0.0 0.0 0.0 242.100337 NaN NaN -242.100337 \n", - "S_SO_1 5.0 1.0 0.0 0.0 0.0 0.0 NaN NaN NaN NaN \n", - "S_SO_2 6.0 1.0 0.0 0.0 0.0 0.0 -484.200674 NaN NaN 484.200674 \n", - "SO_NO_1 7.0 1.0 0.0 0.0 0.0 0.0 237.899663 NaN NaN -237.899663 \n", - "SO_NO_2 8.0 1.0 0.0 0.0 0.0 0.0 237.899663 NaN NaN -237.899663 \n", - "NE_N_1 9.0 1.0 0.0 0.0 0.0 0.0 -125.250843 NaN NaN 125.250843 \n", - "NE_N_2 10.0 1.0 0.0 0.0 0.0 0.0 -125.250843 NaN NaN 125.250843 \n", - "SE_NE_1 11.0 1.0 0.0 0.0 0.0 0.0 -237.899663 NaN NaN 237.899663 \n", - "SE_NE_2 12.0 1.0 0.0 0.0 0.0 0.0 -237.899663 NaN NaN 237.899663 \n", - "\n", - " q2 i2 voltage_level1_id voltage_level2_id bus1_id bus2_id \\\n", - "id \n", - "NO_N_1 NaN NaN NO_poste N_poste NO_poste_0 N_poste_0 \n", - "NO_N_2 NaN NaN NO_poste N_poste NO_poste_0 N_poste_0 \n", - "S_SE_1 NaN NaN S_poste SE_poste S_poste_0 SE_poste_0 \n", - "S_SE_2 NaN NaN S_poste SE_poste S_poste_0 SE_poste_0 \n", - "S_SO_1 NaN NaN S_poste SO_poste \n", - "S_SO_2 NaN NaN S_poste SO_poste S_poste_0 SO_poste_0 \n", - "SO_NO_1 NaN NaN SO_poste NO_poste SO_poste_0 NO_poste_0 \n", - "SO_NO_2 NaN NaN SO_poste NO_poste SO_poste_0 NO_poste_0 \n", - "NE_N_1 NaN NaN NE_poste N_poste NE_poste_0 N_poste_0 \n", - "NE_N_2 NaN NaN NE_poste N_poste NE_poste_0 N_poste_0 \n", - "SE_NE_1 NaN NaN SE_poste NE_poste SE_poste_0 NE_poste_0 \n", - "SE_NE_2 NaN NaN SE_poste NE_poste SE_poste_0 NE_poste_0 \n", - "\n", - " connected1 connected2 \n", - "id \n", - "NO_N_1 True True \n", - "NO_N_2 True True \n", - "S_SE_1 True True \n", - "S_SE_2 True True \n", - "S_SO_1 False False \n", - "S_SO_2 True True \n", - "SO_NO_1 True True \n", - "SO_NO_2 True True \n", - "NE_N_1 True True \n", - "NE_N_2 True True \n", - "SE_NE_1 True True \n", - "SE_NE_2 True True " - ], + "cell_type": "code", + "execution_count": 18, + "id": "b687b09fc86e5822", + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.006065Z", + "start_time": "2025-09-15T11:22:15.000333Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[ComponentResult(connected_component_num=0, synchronous_component_num=0, status=CONVERGED, status_text=Converged, iteration_count=0, reference_bus_id='NE_poste_0', slack_bus_results=[SlackBusResult(id='NE_poste_0', active_power_mismatch=-0.0)], distributed_active_power=-0.0)]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "4fec5edb2e9aa8bb", + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T11:22:15.086945Z", + "start_time": "2025-09-15T11:22:15.064648Z" + } + }, + "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", + " -125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -225\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 225\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -125\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -238\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 242\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -242\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 242\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -242\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", + " 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -484\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 484\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
NE_poste
\n", + "
\n", + " kV / 0.0°
\n", + "
\n", + "
\n", + "
NO_poste
\n", + "
\n", + " kV / 0.1°
\n", + "
\n", + "
\n", + "
N_poste
\n", + "
\n", + " kV / 0.0°
\n", + "
\n", + "
\n", + "
SE_poste
\n", + "
\n", + " kV / -0.1°
\n", + "
\n", + "
\n", + "
SO_poste
\n", + "
\n", + " kV / 0.2°
\n", + "
\n", + "
\n", + "
S_poste
\n", + "
\n", + " kV / 0.0°
\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 -125\n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n \n \n -125\n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n \n \n -225\n \n \n \n \n \n \n \n \n \n \n \n 225\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n -125\n \n \n \n \n \n \n \n \n \n \n \n \n \n 125\n \n \n \n \n \n \n \n \n \n \n \n -125\n \n \n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n \n \n 238\n \n \n \n \n \n \n \n \n \n \n \n -238\n \n \n \n \n \n \n \n \n \n \n \n \n \n 242\n \n \n \n \n \n \n \n \n \n \n \n -242\n \n \n \n \n \n \n \n \n \n \n \n \n \n 242\n \n \n \n \n \n \n \n \n \n \n \n -242\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 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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -484\n \n \n \n \n \n \n \n \n \n \n \n 484\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
NE_poste
\n
\n kV / 0.0°
\n
\n
\n
NO_poste
\n
\n kV / 0.1°
\n
\n
\n
N_poste
\n
\n kV / 0.0°
\n
\n
\n
SE_poste
\n
\n kV / -0.1°
\n
\n
\n
SO_poste
\n
\n kV / 0.2°
\n
\n
\n
S_poste
\n
\n kV / 0.0°
\n
\n
\n
\n
\n" + ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 20 + "source": [ + "n6.get_network_area_diagram()" + ] }, { "cell_type": "markdown", + "id": "dcf26afcd6dade1c", "metadata": {}, "source": [ "The 'S_SO_2' line is overloaded. The network is not secure in this N-1 case. " - ], - "id": "dcf26afcd6dade1c" + ] }, { "attachments": { @@ -2073,50 +4528,48 @@ } }, "cell_type": "markdown", + "id": "f46b4fe5091f8cf9", "metadata": {}, "source": [ "![network_after_LF_and_contingency.png](attachment:network_after_LF_and_contingency.png)" - ], - "id": "f46b4fe5091f8cf9" + ] }, { "cell_type": "markdown", + "id": "5e3ce92fe7d894f4", "metadata": {}, "source": [ "## 4 - Security Analysis" - ], - "id": "5e3ce92fe7d894f4" + ] }, { "cell_type": "markdown", + "id": "40ac599ae4d6c621", "metadata": {}, "source": [ "Dispatchers monitor the network in real time. Part of their work is also to anticipate N-1 cases by simulating them and planning actions to be taken if a fault actually occurs.\n", "Manually disconnecting one line, computing a loadflow and checking the limits of every branch of a small network is fastidious. It is nearly impossible on a real network, let alone in real time.\n", "The security analysis deals with that.\n" - ], - "id": "40ac599ae4d6c621" + ] }, { "cell_type": "markdown", + "id": "fb074222f61b0a8a", "metadata": {}, "source": [ "Before performing a security analysis, let's reconnect the `S_SO_1` line and consider the second hourly time step. " - ], - "id": "fb074222f61b0a8a" + ] }, { "cell_type": "code", + "execution_count": 21, + "id": "b35c250cb633b16", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:15.333024Z", "start_time": "2025-09-15T11:22:15.329716Z" } }, - "source": [ - "n6.connect(id='S_SO_1')" - ], - "id": "b35c250cb633b16", "outputs": [ { "data": { @@ -2129,68 +4582,39 @@ "output_type": "execute_result" } ], - "execution_count": 21 + "source": [ + "n6.connect(id='S_SO_1')" + ] }, { "cell_type": "code", + "execution_count": 22, + "id": "d2c6a65986f711ad", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:15.392345Z", "start_time": "2025-09-15T11:22:15.388790Z" } }, + "outputs": [], "source": [ "n6.update_generators(id='SO_G1', target_p=960)\n", "n6.update_generators(id='SO_G2', target_p=0)" - ], - "id": "d2c6a65986f711ad", - "outputs": [], - "execution_count": 22 + ] }, { "cell_type": "code", + "execution_count": 23, + "id": "48426775ada6b72d", "metadata": { "ExecuteTime": { "end_time": "2025-09-15T11:22:15.454276Z", "start_time": "2025-09-15T11:22:15.444173Z" } }, - "source": [ - "n6.get_generators()" - ], - "id": "48426775ada6b72d", "outputs": [ { "data": { - "text/plain": [ - " name energy_source target_p min_p max_p min_q max_q rated_s \\\n", - "id \n", - "SO_G1 THERMAL 960.0 0.0 2000.0 NaN NaN NaN \n", - "SO_G2 THERMAL 0.0 0.0 2000.0 NaN NaN NaN \n", - "SE_G THERMAL 0.0 0.0 600.0 NaN NaN NaN \n", - "N_G THERMAL 0.0 0.0 600.0 NaN NaN NaN \n", - "\n", - " reactive_limits_kind target_v target_q voltage_regulator_on \\\n", - "id \n", - "SO_G1 CURVE 406.450043 2.35231 True \n", - "SO_G2 CURVE 406.450043 2.35231 True \n", - "SE_G CURVE 406.450043 6.45498 True \n", - "N_G CURVE 406.450043 7.48158 True \n", - "\n", - " regulated_element_id p q i voltage_level_id bus_id \\\n", - "id \n", - "SO_G1 SO_G1 -0.0 -0.0 NaN SO_poste SO_poste_0 \n", - "SO_G2 SO_G2 -960.0 -0.0 NaN SO_poste SO_poste_0 \n", - "SE_G SE_G -0.0 -0.0 NaN SE_poste SE_poste_0 \n", - "N_G N_G -0.0 -0.0 NaN N_poste N_poste_0 \n", - "\n", - " connected \n", - "id \n", - "SO_G1 True \n", - "SO_G2 True \n", - "SE_G True \n", - "N_G True " - ], "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 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \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 -20\n \n \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 -20\n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \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 -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 40\n \n \n \n \n \n \n \n \n \n \n \n -40\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BUS 10_VL
\n
\n 402.8 kV / -0.0°
\n
\n
\n
BUS 1_VL
\n
\n 73.1 kV / 12.6°
\n
\n
\n
BUS 5_VL
\n
\n 68.0 kV / 0.2°
\n
\n
\n
BUS 6_VL
\n
\n 402.9 kV / 0.1°
\n
\n 402.9 kV / 0.1°
\n
\n 402.9 kV / 0.1°
\n
\n
\n
\n\n" }, @@ -179,8 +143,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:32:37.446366Z", - "start_time": "2025-09-16T10:32:37.427200Z" + "end_time": "2025-09-26T14:44:50.397262Z", + "start_time": "2025-09-26T14:44:50.373083Z" } }, "source": [ @@ -300,8 +264,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:32:38.573649Z", - "start_time": "2025-09-16T10:32:37.682404Z" + "end_time": "2025-09-26T14:44:52.276724Z", + "start_time": "2025-09-26T14:44:50.497441Z" } }, "cell_type": "code", @@ -312,8 +276,8 @@ " 'automaticSlackBusOn' : 'true',\n", " 'dsoVoltageLevel' : '63.0',\n", " 'activePowerCompensation' : 'P',\n", - " 'settingPath' : os.getcwd() + '/setting-1.xml',\n", - " 'assemblingPath' : os.getcwd() + '/assembling.xml',\n", + " 'settingPath' : os.getcwd() + '/data/dynaflow/setting-1.xml',\n", + " 'assemblingPath' : os.getcwd() + '/data/dynaflow/assembling.xml',\n", " 'stopTime' : '300',\n", " 'chosenOutputs' : 'STEADYSTATE, LOSTEQ, TIMELINE, CONSTRAINTS',\n", " 'timeStep' : '2.6'})\n", @@ -321,14 +285,14 @@ "network1 = network" ], "outputs": [], - "execution_count": 7 + "execution_count": 6 }, { "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:32:38.649457Z", - "start_time": "2025-09-16T10:32:38.641504Z" + "end_time": "2025-09-26T14:44:52.425033Z", + "start_time": "2025-09-26T14:44:52.411767Z" } }, "source": [ @@ -438,19 +402,19 @@ "
" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 8 + "execution_count": 7 }, { "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:32:39.650892Z", - "start_time": "2025-09-16T10:32:38.765557Z" + "end_time": "2025-09-26T14:44:54.313691Z", + "start_time": "2025-09-26T14:44:52.580837Z" } }, "source": [ @@ -461,8 +425,8 @@ " 'automaticSlackBusOn' : 'true',\n", " 'dsoVoltageLevel' : '63.0',\n", " 'activePowerCompensation' : 'P',\n", - " 'settingPath' : os.getcwd() + '/setting-2.xml',\n", - " 'assemblingPath' : os.getcwd() + '/assembling.xml',\n", + " 'settingPath' : os.getcwd() + '/data/dynaflow//setting-2.xml',\n", + " 'assemblingPath' : os.getcwd() + '/data/dynaflow/assembling.xml',\n", " 'stopTime' : '300',\n", " 'chosenOutputs' : 'STEADYSTATE, LOSTEQ, TIMELINE, CONSTRAINTS',\n", " 'timeStep' : '2.6'})\n", @@ -470,14 +434,14 @@ "network2 = network" ], "outputs": [], - "execution_count": 9 + "execution_count": 8 }, { "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:32:39.792252Z", - "start_time": "2025-09-16T10:32:39.782132Z" + "end_time": "2025-09-26T14:44:54.455940Z", + "start_time": "2025-09-26T14:44:54.440486Z" } }, "source": [ @@ -587,19 +551,19 @@ "
" ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 10 + "execution_count": 9 }, { "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:32:39.946172Z", - "start_time": "2025-09-16T10:32:39.933727Z" + "end_time": "2025-09-26T14:44:54.575758Z", + "start_time": "2025-09-26T14:44:54.564035Z" } }, "source": [ @@ -672,18 +636,18 @@ "
" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 11 + "execution_count": 10 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-09-16T10:32:40.210285Z", - "start_time": "2025-09-16T10:32:40.199293Z" + "end_time": "2025-09-26T14:44:54.831940Z", + "start_time": "2025-09-26T14:44:54.813348Z" } }, "cell_type": "code", @@ -758,12 +722,12 @@ "" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 12 + "execution_count": 11 }, { "cell_type": "markdown", From 3938dcad8dd24c523ea8d6554d1913dbdbe5946f Mon Sep 17 00:00:00 2001 From: Florian Dupuy Date: Fri, 26 Sep 2025 16:49:45 +0200 Subject: [PATCH 23/27] Add regulating=True Signed-off-by: Florian Dupuy --- network_modifications_node_breaker.ipynb | 7266 +--------------------- 1 file changed, 261 insertions(+), 7005 deletions(-) diff --git a/network_modifications_node_breaker.ipynb b/network_modifications_node_breaker.ipynb index a634289..a5d9dc4 100644 --- a/network_modifications_node_breaker.ipynb +++ b/network_modifications_node_breaker.ipynb @@ -21,18 +21,18 @@ }, { "cell_type": "code", - "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.137508Z", - "start_time": "2025-09-17T11:20:33.602304Z" + "end_time": "2025-09-26T14:49:19.397981Z", + "start_time": "2025-09-26T14:49:18.954341Z" } }, - "outputs": [], "source": [ "import pypowsybl as pp\n", "import pandas as pd" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "markdown", @@ -43,17 +43,17 @@ }, { "cell_type": "code", - "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.151800Z", - "start_time": "2025-09-17T11:20:34.147399Z" + "end_time": "2025-09-26T14:49:19.406328Z", + "start_time": "2025-09-26T14:49:19.402845Z" } }, - "outputs": [], "source": [ "n = pp.network.create_empty()" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -65,28 +65,26 @@ }, { "cell_type": "code", - "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.203161Z", - "start_time": "2025-09-17T11:20:34.200142Z" + "end_time": "2025-09-26T14:49:19.465802Z", + "start_time": "2025-09-26T14:49:19.460525Z" } }, - "outputs": [], "source": [ "n.create_substations(id=['S1', 'S2'])" - ] + ], + "outputs": [], + "execution_count": 3 }, { "cell_type": "code", - "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.254836Z", - "start_time": "2025-09-17T11:20:34.251223Z" + "end_time": "2025-09-26T14:49:19.525058Z", + "start_time": "2025-09-26T14:49:19.515399Z" } }, - "outputs": [], "source": [ "voltage_levels = pd.DataFrame.from_records(index='id', data=[\n", " {'substation_id': 'S1', 'id': 'VL1', 'topology_kind': 'NODE_BREAKER', 'nominal_v': 400},\n", @@ -94,7 +92,9 @@ " {'substation_id': 'S2', 'id': 'VL3', 'topology_kind': 'NODE_BREAKER', 'nominal_v': 400},\n", "])\n", "n.create_voltage_levels(voltage_levels)" - ] + ], + "outputs": [], + "execution_count": 4 }, { "cell_type": "markdown", @@ -105,14 +105,12 @@ }, { "cell_type": "code", - "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.308483Z", - "start_time": "2025-09-17T11:20:34.303385Z" + "end_time": "2025-09-26T14:49:19.585630Z", + "start_time": "2025-09-26T14:49:19.575522Z" } }, - "outputs": [], "source": [ "voltage_level_topology = pd.DataFrame.from_records(index='id', data=[\n", " {'id': 'VL1', 'aligned_buses_or_busbar_count': 1, 'switch_kinds': ''},\n", @@ -120,7 +118,9 @@ " {'id': 'VL3', 'aligned_buses_or_busbar_count': 2, 'switch_kinds': 'DISCONNECTOR'},\n", "])\n", "pp.network.create_voltage_level_topology(n, voltage_level_topology)" - ] + ], + "outputs": [], + "execution_count": 5 }, { "cell_type": "markdown", @@ -131,682 +131,55 @@ }, { "cell_type": "code", - "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.377698Z", - "start_time": "2025-09-17T11:20:34.359553Z" + "end_time": "2025-09-26T14:49:19.665798Z", + "start_time": "2025-09-26T14:49:19.634809Z" } }, + "source": [ + "n.get_single_line_diagram('S1')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " VL1\n", - " \n", - " \n", - " \n", - " VL1_1_1\n", - " \n", - " \n", - " VL2\n", - " \n", - " \n", - " \n", - " VL2_1_1\n", - " \n", - " \n", - " \n", - " VL2_2_1\n", - " \n", - " \n", - " \n", - " VL2_3_1\n", - " \n", - " \n", - " \n", - " VL2_1_2\n", - " \n", - " \n", - " \n", - " VL2_2_2\n", - " \n", - " \n", - " \n", - " VL2_3_2\n", - " \n", - " \n", - " \n", - " VL2_1_3\n", - " \n", - " \n", - " \n", - " VL2_2_3\n", - " \n", - " \n", - " \n", - " VL2_3_3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL1\n \n \n \n VL1_1_1\n \n \n \n \n VL2\n \n \n \n VL2_1_1\n \n \n \n VL2_2_1\n \n \n \n VL2_3_1\n \n \n \n VL2_1_2\n \n \n \n VL2_2_2\n \n \n \n VL2_3_2\n \n \n \n VL2_1_3\n \n \n \n VL2_2_3\n \n \n \n VL2_3_3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S1')" - ] + "execution_count": 6 }, { "cell_type": "code", - "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.476283Z", - "start_time": "2025-09-17T11:20:34.452529Z" + "end_time": "2025-09-26T14:49:19.746600Z", + "start_time": "2025-09-26T14:49:19.720933Z" } }, + "source": [ + "n.get_single_line_diagram('S2')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " VL3\n", - " \n", - " \n", - " \n", - " VL3_1_1\n", - " \n", - " \n", - " \n", - " VL3_2_1\n", - " \n", - " \n", - " \n", - " VL3_1_2\n", - " \n", - " \n", - " \n", - " VL3_2_2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL3\n \n \n \n VL3_1_1\n \n \n \n VL3_2_1\n \n \n \n VL3_1_2\n \n \n \n VL3_2_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S2')" - ] + "execution_count": 7 }, { "cell_type": "markdown", @@ -820,14 +193,12 @@ }, { "cell_type": "code", - "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.532860Z", - "start_time": "2025-09-17T11:20:34.528064Z" + "end_time": "2025-09-26T14:49:19.810333Z", + "start_time": "2025-09-26T14:49:19.800441Z" } }, - "outputs": [], "source": [ "coupling_device = pd.DataFrame.from_records(index='bus_or_busbar_section_id_1', data=[\n", " {'bus_or_busbar_section_id_1': 'VL2_1_1', 'bus_or_busbar_section_id_2': 'VL2_2_1'},\n", @@ -838,948 +209,61 @@ " {'bus_or_busbar_section_id_1': 'VL3_1_2', 'bus_or_busbar_section_id_2': 'VL3_2_2'},\n", "])\n", "pp.network.create_coupling_device(n, coupling_device)" - ] + ], + "outputs": [], + "execution_count": 8 }, { "cell_type": "code", - "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.623147Z", - "start_time": "2025-09-17T11:20:34.605661Z" + "end_time": "2025-09-26T14:49:19.890413Z", + "start_time": "2025-09-26T14:49:19.860399Z" } }, + "source": [ + "n.get_single_line_diagram('S1')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " VL1\n", - " \n", - " \n", - " \n", - " VL1_1_1\n", - " \n", - " \n", - " VL2\n", - " \n", - " \n", - " \n", - " VL2_1_1\n", - " \n", - " \n", - " \n", - " VL2_2_1\n", - " \n", - " \n", - " \n", - " VL2_3_1\n", - " \n", - " \n", - " \n", - " VL2_1_2\n", - " \n", - " \n", - " \n", - " VL2_2_2\n", - " \n", - " \n", - " \n", - " VL2_3_2\n", - " \n", - " \n", - " \n", - " VL2_1_3\n", - " \n", - " \n", - " \n", - " VL2_2_3\n", - " \n", - " \n", - " \n", - " VL2_3_3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL1\n \n \n \n VL1_1_1\n \n \n \n \n VL2\n \n \n \n VL2_1_1\n \n \n \n VL2_2_1\n \n \n \n VL2_3_1\n \n \n \n VL2_1_2\n \n \n \n VL2_2_2\n \n \n \n VL2_3_2\n \n \n \n VL2_1_3\n \n \n \n VL2_2_3\n \n \n \n VL2_3_3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S1')" - ] + "execution_count": 9 }, { "cell_type": "code", - "execution_count": 10, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.671184Z", - "start_time": "2025-09-17T11:20:34.650030Z" + "end_time": "2025-09-26T14:49:19.971250Z", + "start_time": "2025-09-26T14:49:19.943313Z" } }, + "source": [ + "n.get_single_line_diagram('S2')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " VL3\n", - " \n", - " \n", - " \n", - " VL3_1_1\n", - " \n", - " \n", - " \n", - " VL3_2_1\n", - " \n", - " \n", - " \n", - " VL3_1_2\n", - " \n", - " \n", - " \n", - " VL3_2_2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL3\n \n \n \n VL3_1_1\n \n \n \n VL3_2_1\n \n \n \n VL3_1_2\n \n \n \n VL3_2_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S2')" - ] + "execution_count": 10 }, { "cell_type": "markdown", @@ -1794,16 +278,35 @@ }, { "cell_type": "code", - "execution_count": 11, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:34.725915Z", - "start_time": "2025-09-17T11:20:34.714090Z" + "end_time": "2025-09-26T14:49:20.027858Z", + "start_time": "2025-09-26T14:49:20.012047Z" } }, + "source": [ + "loads = pd.DataFrame.from_records(\n", + " index='id',\n", + " columns=['id', 'p0', 'q0', 'bus_or_busbar_section_id', 'position_order'],\n", + " data=[('load1', 10.0, 3.0, 'VL1_1_1', 10),\n", + " ('load2', 10.0, 3.0, 'VL2_1_3', 60),\n", + " ('load3', 10.0, 3.0, 'VL2_2_3', 70),\n", + " ('load4', 10.0, 3.0, 'VL2_3_3', 80),\n", + " ('load5', 10.0, 3.0, 'VL3_1_1', 10)])\n", + "loads" + ], "outputs": [ { "data": { + "text/plain": [ + " p0 q0 bus_or_busbar_section_id position_order\n", + "id \n", + "load1 10.0 3.0 VL1_1_1 10\n", + "load2 10.0 3.0 VL2_1_3 60\n", + "load3 10.0 3.0 VL2_2_3 70\n", + "load4 10.0 3.0 VL2_3_3 80\n", + "load5 10.0 3.0 VL3_1_1 10" + ], "text/html": [ "
\n", "\n", - " \n", - " \n", - " \n", - " VL1\n", - " \n", - " \n", - " \n", - " VL1_1_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load1\n", - " \n", - " \n", - " \n", - " VL2\n", - " \n", - " \n", - " \n", - " VL2_1_1\n", - " \n", - " \n", - " \n", - " VL2_2_1\n", - " \n", - " \n", - " \n", - " VL2_3_1\n", - " \n", - " \n", - " \n", - " VL2_1_2\n", - " \n", - " \n", - " \n", - " VL2_2_2\n", - " \n", - " \n", - " \n", - " VL2_3_2\n", - " \n", - " \n", - " \n", - " VL2_1_3\n", - " \n", - " \n", - " \n", - " VL2_2_3\n", - " \n", - " \n", - " \n", - " VL2_3_3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load4\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL1\n \n \n \n VL1_1_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load1\n \n \n \n \n \n VL2\n \n \n \n VL2_1_1\n \n \n \n VL2_2_1\n \n \n \n VL2_3_1\n \n \n \n VL2_1_2\n \n \n \n VL2_2_2\n \n \n \n VL2_3_2\n \n \n \n VL2_1_3\n \n \n \n VL2_2_3\n \n \n \n VL2_3_3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load4\n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S1')" - ] + "execution_count": 13 }, { "cell_type": "code", - "execution_count": 14, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.054809Z", - "start_time": "2025-09-17T11:20:35.044305Z" + "end_time": "2025-09-26T14:49:20.392854Z", + "start_time": "2025-09-26T14:49:20.368560Z" } }, + "source": [ + "n.get_single_line_diagram('S2')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " VL3\n", - " \n", - " \n", - " \n", - " VL3_1_1\n", - " \n", - " \n", - " \n", - " VL3_2_1\n", - " \n", - " \n", - " \n", - " VL3_1_2\n", - " \n", - " \n", - " \n", - " VL3_2_2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load5\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL3\n \n \n \n VL3_1_1\n \n \n \n VL3_2_1\n \n \n \n VL3_1_2\n \n \n \n VL3_2_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load5\n \n \n \n \n \n \n \n \n\n" }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S2')" - ] + "execution_count": 14 }, { "cell_type": "markdown", @@ -3136,16 +462,37 @@ }, { "cell_type": "code", - "execution_count": 15, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.111572Z", - "start_time": "2025-09-17T11:20:35.103339Z" + "end_time": "2025-09-26T14:49:20.472981Z", + "start_time": "2025-09-26T14:49:20.450920Z" } }, + "source": [ + "generators = pd.DataFrame.from_records(\n", + " index='id',\n", + " columns=['id', 'max_p', 'min_p', 'voltage_regulator_on', 'target_p', 'target_q', 'target_v', 'bus_or_busbar_section_id', 'position_order', 'direction'],\n", + " data=[('gen1', 1000.0, 0, True, 100.0, 150.0, 225.0, 'VL2_1_2', 30, 'TOP'),\n", + " ('gen2', 1000.0, 0, True, 100.0, 150.0, 225.0, 'VL2_1_2', 40, 'TOP'),\n", + " ('gen3', 1000.0, 0, True, 100.0, 150.0, 225.0, 'VL2_1_2', 50, 'TOP')])\n", + "generators" + ], "outputs": [ { "data": { + "text/plain": [ + " max_p min_p voltage_regulator_on target_p target_q target_v \\\n", + "id \n", + "gen1 1000.0 0 True 100.0 150.0 225.0 \n", + "gen2 1000.0 0 True 100.0 150.0 225.0 \n", + "gen3 1000.0 0 True 100.0 150.0 225.0 \n", + "\n", + " bus_or_busbar_section_id position_order direction \n", + "id \n", + "gen1 VL2_1_2 30 TOP \n", + "gen2 VL2_1_2 40 TOP \n", + "gen3 VL2_1_2 50 TOP " + ], "text/html": [ "
\n", "\n", - " \n", - " \n", - " \n", - " VL1\n", - " \n", - " \n", - " \n", - " VL1_1_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load1\n", - " \n", - " \n", - " \n", - " VL2\n", - " \n", - " \n", - " \n", - " VL2_1_1\n", - " \n", - " \n", - " \n", - " VL2_2_1\n", - " \n", - " \n", - " \n", - " VL2_3_1\n", - " \n", - " \n", - " \n", - " VL2_1_2\n", - " \n", - " \n", - " \n", - " VL2_2_2\n", - " \n", - " \n", - " \n", - " VL2_3_2\n", - " \n", - " \n", - " \n", - " VL2_1_3\n", - " \n", - " \n", - " \n", - " VL2_2_3\n", - " \n", - " \n", - " \n", - " VL2_3_3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load4\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL1\n \n \n \n VL1_1_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load1\n \n \n \n \n \n VL2\n \n \n \n VL2_1_1\n \n \n \n VL2_2_1\n \n \n \n VL2_3_1\n \n \n \n VL2_1_2\n \n \n \n VL2_2_2\n \n \n \n VL2_3_2\n \n \n \n VL2_1_3\n \n \n \n VL2_2_3\n \n \n \n VL2_3_3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load4\n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S1')" - ] + "execution_count": 17 }, { "cell_type": "markdown", @@ -4288,16 +634,36 @@ }, { "cell_type": "code", - "execution_count": 18, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.440161Z", - "start_time": "2025-09-17T11:20:35.432282Z" + "end_time": "2025-09-26T14:49:20.907872Z", + "start_time": "2025-09-26T14:49:20.885850Z" } }, + "source": [ + "shunt_df = pd.DataFrame.from_records(\n", + " index='id',\n", + " columns=['id', 'model_type', 'section_count', 'target_v',\n", + " 'target_deadband', 'bus_or_busbar_section_id', 'position_order', 'direction'],\n", + " data=[('shunt1', 'LINEAR', 1, 221, 2, 'VL2_3_3', 90, 'TOP')])\n", + "model_df = pd.DataFrame.from_records(\n", + " index='id',\n", + " columns=['id', 'g_per_section', 'b_per_section', 'max_section_count'],\n", + " data=[('shunt1', 0.014, 0.0001, 2)])\n", + "shunt_df" + ], "outputs": [ { "data": { + "text/plain": [ + " model_type section_count target_v target_deadband \\\n", + "id \n", + "shunt1 LINEAR 1 221 2 \n", + "\n", + " bus_or_busbar_section_id position_order direction \n", + "id \n", + "shunt1 VL2_3_3 90 TOP " + ], "text/html": [ "
\n", "\n", - " \n", - " \n", - " \n", - " VL1\n", - " \n", - " \n", - " \n", - " VL1_1_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load1\n", - " \n", - " \n", - " \n", - " VL2\n", - " \n", - " \n", - " \n", - " VL2_1_1\n", - " \n", - " \n", - " \n", - " VL2_2_1\n", - " \n", - " \n", - " \n", - " VL2_3_1\n", - " \n", - " \n", - " \n", - " VL2_1_2\n", - " \n", - " \n", - " \n", - " VL2_2_2\n", - " \n", - " \n", - " \n", - " VL2_3_2\n", - " \n", - " \n", - " \n", - " VL2_1_3\n", - " \n", - " \n", - " \n", - " VL2_2_3\n", - " \n", - " \n", - " \n", - " VL2_3_3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load4\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " shunt1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL1\n \n \n \n VL1_1_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load1\n \n \n \n \n \n VL2\n \n \n \n VL2_1_1\n \n \n \n VL2_2_1\n \n \n \n VL2_3_1\n \n \n \n VL2_1_2\n \n \n \n VL2_2_2\n \n \n \n VL2_3_2\n \n \n \n VL2_1_3\n \n \n \n VL2_2_3\n \n \n \n VL2_3_3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load4\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n shunt1\n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S1')" - ] + "execution_count": 20 }, { "cell_type": "markdown", @@ -5467,442 +774,41 @@ }, { "cell_type": "code", - "execution_count": 21, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.747156Z", - "start_time": "2025-09-17T11:20:35.735376Z" + "end_time": "2025-09-26T14:49:21.203713Z", + "start_time": "2025-09-26T14:49:21.197105Z" } }, + "source": "pp.network.create_static_var_compensator_bay(n, id='svc', target_q=200.0, regulation_mode='REACTIVE_POWER', regulating=True, target_v=400, b_min=0, b_max=2, bus_or_busbar_section_id='VL3_1_1', position_order=20, direction='TOP')", "outputs": [], - "source": [ - "pp.network.create_static_var_compensator_bay(n, id='svc', target_q=200.0, regulation_mode='REACTIVE_POWER', target_v=400, b_min=0, b_max=2, bus_or_busbar_section_id='VL3_1_1', position_order=20, direction='TOP')" - ] + "execution_count": 21 }, { "cell_type": "code", - "execution_count": 22, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.806544Z", - "start_time": "2025-09-17T11:20:35.794576Z" + "end_time": "2025-09-26T14:49:21.290346Z", + "start_time": "2025-09-26T14:49:21.252706Z" } }, + "source": [ + "n.get_single_line_diagram('VL3')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " VL3_1_1\n", - " \n", - " \n", - " \n", - " VL3_2_1\n", - " \n", - " \n", - " \n", - " VL3_1_2\n", - " \n", - " \n", - " \n", - " VL3_2_2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load5\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " svc\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n \n VL3_1_1\n \n \n \n VL3_2_1\n \n \n \n VL3_1_2\n \n \n \n VL3_2_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load5\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n svc\n \n \n \n \n \n \n \n \n\n" }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('VL3')" - ] + "execution_count": 22 }, { "cell_type": "markdown", @@ -5914,1736 +820,86 @@ }, { "cell_type": "code", - "execution_count": 23, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.857733Z", - "start_time": "2025-09-17T11:20:35.853473Z" + "end_time": "2025-09-26T14:49:21.338198Z", + "start_time": "2025-09-26T14:49:21.331236Z" } }, - "outputs": [], "source": [ "pp.network.create_2_windings_transformer_bays(n, id='twt', b=1e-6, g=1e-6, r=0.5, x=10, rated_u1=225, rated_u2=63,\n", " bus_or_busbar_section_id_1='VL1_1_1', position_order_1=20,\n", " bus_or_busbar_section_id_2='VL2_1_1', position_order_2=10)" - ] + ], + "outputs": [], + "execution_count": 23 }, { "cell_type": "code", - "execution_count": 24, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.912960Z", - "start_time": "2025-09-17T11:20:35.906553Z" + "end_time": "2025-09-26T14:49:21.395324Z", + "start_time": "2025-09-26T14:49:21.386933Z" } }, - "outputs": [], "source": [ "pp.network.create_line_bays(n, id='line1', r=0.1, x=10, g1=0, b1=0, g2=0, b2=0, bus_or_busbar_section_id_1='VL2_3_1', position_order_1=20, direction_1='BOTTOM',\n", " bus_or_busbar_section_id_2='VL3_1_2', position_order_2=30)" - ] + ], + "outputs": [], + "execution_count": 24 }, { "cell_type": "code", - "execution_count": 25, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:35.981547Z", - "start_time": "2025-09-17T11:20:35.963002Z" + "end_time": "2025-09-26T14:49:21.466503Z", + "start_time": "2025-09-26T14:49:21.444397Z" } }, + "source": [ + "n.get_single_line_diagram('S1')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " VL1\n", - " \n", - " \n", - " \n", - " VL1_1_1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " twt\n", - " \n", - " \n", - " \n", - " VL2\n", - " \n", - " \n", - " \n", - " VL2_1_1\n", - " \n", - " \n", - " \n", - " VL2_2_1\n", - " \n", - " \n", - " \n", - " VL2_3_1\n", - " \n", - " \n", - " \n", - " VL2_1_2\n", - " \n", - " \n", - " \n", - " VL2_2_2\n", - " \n", - " \n", - " \n", - " VL2_3_2\n", - " \n", - " \n", - " \n", - " VL2_1_3\n", - " \n", - " \n", - " \n", - " VL2_2_3\n", - " \n", - " \n", - " \n", - " VL2_3_3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " twt\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " line1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " gen3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load3\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load4\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " shunt1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL1\n \n \n \n VL1_1_1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n twt\n \n \n \n \n \n VL2\n \n \n \n VL2_1_1\n \n \n \n VL2_2_1\n \n \n \n VL2_3_1\n \n \n \n VL2_1_2\n \n \n \n VL2_2_2\n \n \n \n VL2_3_2\n \n \n \n VL2_1_3\n \n \n \n VL2_2_3\n \n \n \n VL2_3_3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n twt\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n line1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n gen3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load4\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n shunt1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S1')" - ] + "execution_count": 25 }, { "cell_type": "code", - "execution_count": 26, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:36.006261Z", - "start_time": "2025-09-17T11:20:35.990049Z" + "end_time": "2025-09-26T14:49:21.556066Z", + "start_time": "2025-09-26T14:49:21.526292Z" } }, + "source": [ + "n.get_single_line_diagram('S2')" + ], "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " VL3\n", - " \n", - " \n", - " \n", - " VL3_1_1\n", - " \n", - " \n", - " \n", - " VL3_2_1\n", - " \n", - " \n", - " \n", - " VL3_1_2\n", - " \n", - " \n", - " \n", - " VL3_2_2\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " load5\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " svc\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " line1\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], "text/plain": [ - "" - ] + "" + ], + "image/svg+xml": "\n\n \n \n \n \n \n VL3\n \n \n \n VL3_1_1\n \n \n \n VL3_2_1\n \n \n \n VL3_1_2\n \n \n \n VL3_2_2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n load5\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n svc\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n line1\n \n \n \n \n \n \n \n \n\n" }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "n.get_single_line_diagram('S2')" - ] + "execution_count": 26 }, { "cell_type": "markdown", @@ -7663,16 +919,31 @@ }, { "cell_type": "code", - "execution_count": 27, "metadata": { "ExecuteTime": { - "end_time": "2025-09-17T11:20:36.072165Z", - "start_time": "2025-09-17T11:20:36.057654Z" + "end_time": "2025-09-26T14:49:21.615948Z", + "start_time": "2025-09-26T14:49:21.606328Z" } }, + "source": [ + "pp.network.get_connectables_order_positions(n, 'VL2')" + ], "outputs": [ { "data": { + "text/plain": [ + " order_position extension_name\n", + "connectable_id \n", + "twt 10 twt\n", + "line1 20 line1\n", + "gen1 30 gen1\n", + "gen2 40 gen2\n", + "gen3 50 gen3\n", + "load2 60 load2\n", + "load3 70 load3\n", + "load4 80 load4\n", + "shunt1 90 shunt1" + ], "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", + " 30\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -30\n", + " \n", + " \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", + " -20\n", + " \n", + " \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", + " -20\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 30\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -30\n", + " \n", + " \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", + " -100\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 30\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -30\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 30\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -30\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 40\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " -40\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
BUS 10_VL
\n", + "
\n", + " 402.8 kV / -0.0°
\n", + "
\n", + "
\n", + "
BUS 1_VL
\n", + "
\n", + " 73.1 kV / 12.6°
\n", + "
\n", + "
\n", + "
BUS 5_VL
\n", + "
\n", + " 68.0 kV / 0.2°
\n", + "
\n", + "
\n", + "
BUS 6_VL
\n", + "
\n", + " 402.9 kV / 0.1°
\n", + "
\n", + " 402.9 kV / 0.1°
\n", + "
\n", + " 402.9 kV / 0.1°
\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 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \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 -20\n \n \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 -20\n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \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 -100\n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 30\n \n \n \n \n \n \n \n \n \n \n \n -30\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 40\n \n \n \n \n \n \n \n \n \n \n \n -40\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
BUS 10_VL
\n
\n 402.8 kV / -0.0°
\n
\n
\n
BUS 1_VL
\n
\n 73.1 kV / 12.6°
\n
\n
\n
BUS 5_VL
\n
\n 68.0 kV / 0.2°
\n
\n
\n
BUS 6_VL
\n
\n 402.9 kV / 0.1°
\n
\n 402.9 kV / 0.1°
\n
\n 402.9 kV / 0.1°
\n
\n
\n
\n
\n" + ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 4 + "source": [ + "# Load initial situation\n", + "network_file = 'data/dynaflow/PhaseShifters.iidm'\n", + "network = pn.load(network_file)\n", + "network.get_network_area_diagram()" + ] }, { "cell_type": "code", + "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2025-09-26T14:44:50.397262Z", "start_time": "2025-09-26T14:44:50.373083Z" } }, - "source": [ - "# Initial tap positions\n", - "network.get_phase_tap_changers()" - ], "outputs": [ { "data": { - "text/plain": [ - " side tap solved_tap_position low_tap high_tap \\\n", - "id \n", - "_BUS____5-BUS____6-1_PS 13 NaN 1 25 \n", - "_BUS____5-BUS____7-2_PS 13 NaN 1 25 \n", - "\n", - " step_count oltc regulating regulation_mode \\\n", - "id \n", - "_BUS____5-BUS____6-1_PS 25 True True CURRENT_LIMITER \n", - "_BUS____5-BUS____7-2_PS 25 True True CURRENT_LIMITER \n", - "\n", - " regulation_value target_deadband regulating_bus_id \n", - "id \n", - "_BUS____5-BUS____6-1_PS 770.0 0.0 _BUS____5_VL_0 \n", - "_BUS____5-BUS____7-2_PS 770.0 0.0 _BUS____5_VL_0 " - ], "text/html": [ "
\n", "
100.256000Truea708c3bc-465d-4fe7-b6ef-6fa6408a62b0-85.354183-27.0883804689.473090-85.24561657.5373855682.8889314ba71b59-ee2f-450b-9f7d-cc2f1cc5e3864ba71b59-ee2f-450b-9f7d-cc2f1cc5e386_0True18.720301True550ebe0d-f2b2-48c1-991f-cebea43a21aa-113.354183-24.7050003046.407443-113.245616-84.4535323709.545342929ba893-c9dc-44d7-b1fd-30834bd3ab85929ba893-c9dc-44d7-b1fd-30834bd3ab85_0True77.743000True2844585c-0d35-488d-a449-685bcd57afbf-134.192729-134.057020-0.0000004765.1607854781.1836832a37dc57-2faf-464a-8175-bc415f9a635f2a37dc57-2faf-464a-8175-bc415f9a635f_0True83.296000True1dc9afba-23b5-41a0-8540-b479ed8baf4b-144.192729-144.057020-0.0000005120.2590695137.8366712a37dc57-2faf-464a-8175-bc415f9a635f2a37dc57-2faf-464a-8175-bc415f9a635f_0True386.922556True9c3b8f97-7972-477d-9dc8-87365cc0ad0e-577.263618-166.12947321630.359223-576.720781-206.08440722053.2004738d8a82ba-b5b0-4e94-861a-192af055f2b88d8a82ba-b5b0-4e94-861a-192af055f2b8_0True100.256000Truea708c3bc-465d-4fe7-b6ef-6fa6408a62b0-94.290287-26.9375305135.284664-94.18710458.3012216123.6026464ba71b59-ee2f-450b-9f7d-cc2f1cc5e3864ba71b59-ee2f-450b-9f7d-cc2f1cc5e386_0True18.720301True550ebe0d-f2b2-48c1-991f-cebea43a21aa-112.290287-24.3422983017.085401-112.187104-84.6039093689.677534929ba893-c9dc-44d7-b1fd-30834bd3ab85929ba893-c9dc-44d7-b1fd-30834bd3ab85_0True77.743000True2844585c-0d35-488d-a449-685bcd57afbf-132.862859-132.733880-0.0000004717.5329064733.7617552a37dc57-2faf-464a-8175-bc415f9a635f2a37dc57-2faf-464a-8175-bc415f9a635f_0True83.296000True1dc9afba-23b5-41a0-8540-b479ed8baf4b-142.862859-142.733880-0.0000005072.6007515090.3972842a37dc57-2faf-464a-8175-bc415f9a635f2a37dc57-2faf-464a-8175-bc415f9a635f_0True386.922556True9c3b8f97-7972-477d-9dc8-87365cc0ad0e-571.944137-165.11649721436.200746-571.428221-205.41116721865.6159408d8a82ba-b5b0-4e94-861a-192af055f2b88d8a82ba-b5b0-4e94-861a-192af055f2b8_0True0.0000210.0000340.000021-17.587416-3.10695745.44590621.0839811.16971053.617718-17.685639-5.31285847.48828321.1157133.43441654.811563b10b171b-3bc5-4849-bb1f-61ed9ea1ec7cd0486169-2205-40b2-895e-b672ecb9e5fcb10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_00.0000100.0000600.000010-6.224587-1.33001916.19662212.4243090.41813431.565048-6.336742-2.39100117.41702712.4171841.50700932.047555b10b171b-3bc5-4849-bb1f-61ed9ea1ec7cd0486169-2205-40b2-895e-b672ecb9e5fcb10b171b-3bc5-4849-bb1f-61ed9ea1ec7c_0connectedpairing_keyucte_xnode_codepairedtie_line_id
0.000025-43.68722784.876604-43.85895488.851000136.736232-44.07441579.398809126.703886469df5f7-058f-4451-a998-57a48e8a56fe469df5f7-058f-4451-a998-57a48e8a56fe_0TrueTN_Border_MA11TN_Border_MA11Truedad02278-bd25-476f-8f58-dbe44be72586 + ed0c5d7...
0.000066-90.037005148.603743-90.648689149.265265240.990783-90.107574132.603780223.687774469df5f7-058f-4451-a998-57a48e8a56fe469df5f7-058f-4451-a998-57a48e8a56fe_0TrueTN_Border_GY11TN_Border_GY11Trueb18cd1aa-7808-49b9-a7cf-605eaf07b006 + e8acf6b...
0.000150-46.81662579.193778-39.22034959.05499597.829358-39.25409550.75449689.522972469df5f7-058f-4451-a998-57a48e8a56fe469df5f7-058f-4451-a998-57a48e8a56fe_0TrueTN_Border_AL11TN_Border_AL11True78736387-5f60-4832-b3fe-d50daf81b0a6 + 7f43f50...
0.000022-26.8050061.489867-16.2370231.12368941.326852-16.294068-0.55614141.771397d0486169-2205-40b2-895e-b672ecb9e5fcd0486169-2205-40b2-895e-b672ecb9e5fc_0TrueTN_Border_ST24TN_Border_ST24Truea16b4a6c-70b1-4abf-9a9d-bd0fa47f9fe4 + a279a3d...
0.000083-27.3652250.425626-18.271265-2.71153346.901585-18.238829-4.38528448.061508d0486169-2205-40b2-895e-b672ecb9e5fcd0486169-2205-40b2-895e-b672ecb9e5fc_0TrueTN_Border_ST23TN_Border_ST23True17086487-56ba-4979-b8de-064025a6b4da + 8fdc7ab...
0.00002026.805006-1.48986720.466345-2.28979252.34700820.460359-0.57515552.257277c1d5bfea8f8011e08e4d00247eb1f55ec1d5bfea8f8011e08e4d00247eb1f55e_0TrueTN_Border_ST24TN_Border_ST24Truea16b4a6c-70b1-4abf-9a9d-bd0fa47f9fe4 + a279a3d...
0.00009027.365225-0.42562621.145972-5.18132955.33994521.074380-3.38461254.493757c1d5bfea8f8011e08e4d00247eb1f55ec1d5bfea8f8011e08e4d00247eb1f55e_0TrueTN_Border_ST23TN_Border_ST23True17086487-56ba-4979-b8de-064025a6b4da + 8fdc7ab...
0.00014146.816625-79.19377854.973610-108.150034169.29274954.662015-98.973320159.359054c1d5bfde8f8011e08e4d00247eb1f55ec1d5bfde8f8011e08e4d00247eb1f55e_0TrueTN_Border_AL11TN_Border_AL11True78736387-5f60-4832-b3fe-d50daf81b0a6 + 7f43f50...
0.00006590.037005-148.603743104.162080-169.365875277.456249103.320111-152.565573259.703284c1d5bfde8f8011e08e4d00247eb1f55ec1d5bfde8f8011e08e4d00247eb1f55e_0TrueTN_Border_GY11TN_Border_GY11Trueb18cd1aa-7808-49b9-a7cf-605eaf07b006 + e8acf6b...
0.00002543.687227-84.87660457.873034-96.129847156.57524557.778985-86.683186146.829004c1d5bfde8f8011e08e4d00247eb1f55ec1d5bfde8f8011e08e4d00247eb1f55e_0TrueTN_Border_MA11TN_Border_MA11Truedad02278-bd25-476f-8f58-dbe44be72586 + ed0c5d7...