{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Manipulate the Simulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This example shows how to play with the simulation,\n", "such as contingency analysis and manipulate the constraints." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import ams\n", "\n", "import datetime" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Last run time: 2024-01-29 20:44:33\n", "ams:0.8.1.post37.dev0+gf76a132\n" ] } ], "source": [ "print(\"Last run time:\", datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\"))\n", "\n", "print(f'ams:{ams.__version__}')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "ams.config_logger(stream_level=20)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Manipulate the Simulation" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Load Case" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", "Input file parsed in 0.1167 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", "System set up in 0.0026 seconds.\n" ] } ], "source": [ "sp = ams.load(ams.get_case('5bus/pjm5bus_uced.xlsx'),\n", " setup=True,\n", " no_output=True,)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The system load are defined in model `PQ`." ] }, { "cell_type": "code", "execution_count": 5, "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", "
idxunamebusVnp0q0vmaxvminownerctrl
uid
0PQ_11.0PQ 1Bus_2230.03.00.98611.10.9None1.0
1PQ_21.0PQ 2Bus_3230.03.00.98611.10.9None1.0
2PQ_31.0PQ 3Bus_4230.04.01.31471.10.9None1.0
\n", "
" ], "text/plain": [ " idx u name bus Vn p0 q0 vmax vmin owner ctrl\n", "uid \n", "0 PQ_1 1.0 PQ 1 Bus_2 230.0 3.0 0.9861 1.1 0.9 None 1.0\n", "1 PQ_2 1.0 PQ 2 Bus_3 230.0 3.0 0.9861 1.1 0.9 None 1.0\n", "2 PQ_3 1.0 PQ 3 Bus_4 230.0 4.0 1.3147 1.1 0.9 None 1.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.PQ.as_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In RTED, system load is referred as `pd`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([3., 3., 4.])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.pd.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run Simulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "RTED can be solved and one can inspect the results as discussed in\n", "previous example." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Routine initialized in 0.0141 seconds.\n", "RTED solved as optimal in 0.0166 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.run(solver='ECOS')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Power generation `pg` and line flow `plf` can be accessed as follows." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2.1, 5.2, 0.7, 2. ])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.pg.v" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.70595331, 0.68616798, 0.00192539, -1.58809337, 0.61190663,\n", " -0.70192539, 0.70595331])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.plf.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Change Load" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The load values can be manipulated in the model `PQ`." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.PQ.set(src='p0', attr='v', idx=['PQ_1', 'PQ_2'], value=[3.2, 3.2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "According parameters need to be updated to make the changes effective in the optimization model.\n", "If not sure which parameters need to be updated, one can use\n", "``update()`` to update all parameters." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.update('pd')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After manipulation, the routined can be solved again." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "RTED solved as optimal in 0.0025 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.run(solver='ECOS')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2.1, 5.2, 1.1, 2. ])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.pg.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An alternative way is to alter the load through ``RTED``.\n", "\n", "As ``pd`` has owner ``StaticLoad`` and soruce ``p0``, the parameter update through ``RTED`` actually happens to ``StaticLoad.p0``." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "StaticLoad (3 devices) at 0x1379130d0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.pd.owner" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'p0'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.pd.src" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, the load can be changed using ``set`` method." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.set(src='pd', attr='v', idx=['PQ_1', 'PQ_2'], value=[3.8, 3.8])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember to update the optimization parameters after the change." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.update('pd')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the original load is also updated." ] }, { "cell_type": "code", "execution_count": 18, "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", "
idxunamebusVnp0q0vmaxvminownerctrl
uid
0PQ_11.0PQ 1Bus_2230.03.80.98611.10.9None1.0
1PQ_21.0PQ 2Bus_3230.03.80.98611.10.9None1.0
2PQ_31.0PQ 3Bus_4230.04.01.31471.10.9None1.0
\n", "
" ], "text/plain": [ " idx u name bus Vn p0 q0 vmax vmin owner ctrl\n", "uid \n", "0 PQ_1 1.0 PQ 1 Bus_2 230.0 3.8 0.9861 1.1 0.9 None 1.0\n", "1 PQ_2 1.0 PQ 2 Bus_3 230.0 3.8 0.9861 1.1 0.9 None 1.0\n", "2 PQ_3 1.0 PQ 3 Bus_4 230.0 4.0 1.3147 1.1 0.9 None 1.0" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.PQ.as_df()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "RTED solved as optimal in 0.0020 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.run(solver='ECOS')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As expected, the power generation also changed." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2.1, 5.2, 2.3, 2. ])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.pg.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Trip a Generator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that there are three PV generators in the system." ] }, { "cell_type": "code", "execution_count": 21, "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", "
idxunameSnVnbusbusrp0q0pmax...Qc2minQc2maxRagcR10R30Rqapfpg0td1td2
uid
0PV_11.0Alta100.0230.0Bus_1None1.00000.02.1...0.00.0999.0999.0999.0999.00.00.00.50.0
1PV_31.0Solitude100.0230.0Bus_3None3.23490.05.2...0.00.0999.0999.0999.0999.00.00.00.50.0
2PV_51.0Brighton100.0230.0Bus_5None4.66510.06.0...0.00.0999.0999.0999.0999.00.00.00.50.0
\n", "

3 rows × 33 columns

\n", "
" ], "text/plain": [ " idx u name Sn Vn bus busr p0 q0 pmax ... \\\n", "uid ... \n", "0 PV_1 1.0 Alta 100.0 230.0 Bus_1 None 1.0000 0.0 2.1 ... \n", "1 PV_3 1.0 Solitude 100.0 230.0 Bus_3 None 3.2349 0.0 5.2 ... \n", "2 PV_5 1.0 Brighton 100.0 230.0 Bus_5 None 4.6651 0.0 6.0 ... \n", "\n", " Qc2min Qc2max Ragc R10 R30 Rq apf pg0 td1 td2 \n", "uid \n", "0 0.0 0.0 999.0 999.0 999.0 999.0 0.0 0.0 0.5 0.0 \n", "1 0.0 0.0 999.0 999.0 999.0 999.0 0.0 0.0 0.5 0.0 \n", "2 0.0 0.0 999.0 999.0 999.0 999.0 0.0 0.0 0.5 0.0 \n", "\n", "[3 rows x 33 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.PV.as_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`PV_1` is tripped by setting its connection status `u` to 0." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.StaticGen.set(src='u', attr='v', idx='PV_1', value=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In AMS, some parameters are defiend as constants in the numerical optimization model\n", "to follow the CVXPY DCP and DPP rules.\n", "Once non-parametric parameters are changed, the optimization model will be\n", "re-initialized to make the changes effective.\n", "\n", "More details can be found at [CVXPY - Disciplined Convex Programming](https://www.cvxpy.org/tutorial/dcp/index.html#disciplined-convex-programming)." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Re-init RTED OModel due to non-parametric change.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.update()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we can re-solve the model." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "RTED solved as optimal in 0.0164 seconds, converged after 8 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.run(solver='ECOS')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the tripped generator has no power generation." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-0. , 5.2, 4.4, 2. ])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.pg.v.round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Trip a Line" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can inspect the `Line` model to check the system topology." ] }, { "cell_type": "code", "execution_count": 26, "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", "
idxunamebus1bus2SnfnVn1Vn2r...tapphirate_arate_brate_cownerxcoordycoordaminamax
uid
0Line_01.0Line ABBus_1Bus_2100.060.0230.0230.00.00281...1.00.04.0999.0999.0NoneNoneNone-6.2831856.283185
1Line_11.0Line ADBus_1Bus_4100.060.0230.0230.00.00304...1.00.0999.0999.0999.0NoneNoneNone-6.2831856.283185
2Line_21.0Line AEBus_1Bus_5100.060.0230.0230.00.00064...1.00.0999.0999.0999.0NoneNoneNone-6.2831856.283185
3Line_31.0Line BCBus_2Bus_3100.060.0230.0230.00.00108...1.00.0999.0999.0999.0NoneNoneNone-6.2831856.283185
4Line_41.0Line CDBus_3Bus_4100.060.0230.0230.00.00297...1.00.0999.0999.0999.0NoneNoneNone-6.2831856.283185
5Line_51.0Line DEBus_4Bus_5100.060.0230.0230.00.00297...1.00.02.4999.0999.0NoneNoneNone-6.2831856.283185
6Line_61.0Line AB2Bus_1Bus_2100.060.0230.0230.00.00281...1.00.04.0999.0999.0NoneNoneNone-6.2831856.283185
\n", "

7 rows × 28 columns

\n", "
" ], "text/plain": [ " idx u name bus1 bus2 Sn fn Vn1 Vn2 r \\\n", "uid \n", "0 Line_0 1.0 Line AB Bus_1 Bus_2 100.0 60.0 230.0 230.0 0.00281 \n", "1 Line_1 1.0 Line AD Bus_1 Bus_4 100.0 60.0 230.0 230.0 0.00304 \n", "2 Line_2 1.0 Line AE Bus_1 Bus_5 100.0 60.0 230.0 230.0 0.00064 \n", "3 Line_3 1.0 Line BC Bus_2 Bus_3 100.0 60.0 230.0 230.0 0.00108 \n", "4 Line_4 1.0 Line CD Bus_3 Bus_4 100.0 60.0 230.0 230.0 0.00297 \n", "5 Line_5 1.0 Line DE Bus_4 Bus_5 100.0 60.0 230.0 230.0 0.00297 \n", "6 Line_6 1.0 Line AB2 Bus_1 Bus_2 100.0 60.0 230.0 230.0 0.00281 \n", "\n", " ... tap phi rate_a rate_b rate_c owner xcoord ycoord amin \\\n", "uid ... \n", "0 ... 1.0 0.0 4.0 999.0 999.0 None None None -6.283185 \n", "1 ... 1.0 0.0 999.0 999.0 999.0 None None None -6.283185 \n", "2 ... 1.0 0.0 999.0 999.0 999.0 None None None -6.283185 \n", "3 ... 1.0 0.0 999.0 999.0 999.0 None None None -6.283185 \n", "4 ... 1.0 0.0 999.0 999.0 999.0 None None None -6.283185 \n", "5 ... 1.0 0.0 2.4 999.0 999.0 None None None -6.283185 \n", "6 ... 1.0 0.0 4.0 999.0 999.0 None None None -6.283185 \n", "\n", " amax \n", "uid \n", "0 6.283185 \n", "1 6.283185 \n", "2 6.283185 \n", "3 6.283185 \n", "4 6.283185 \n", "5 6.283185 \n", "6 6.283185 \n", "\n", "[7 rows x 28 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.Line.as_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here line `2` is tripped by setting its connection status `u` to 0.\n", "\n", "Note that in ANDES, dynamic simulation of *line tripping should use model ``Toggle``.*" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.Line.set(src='u', attr='v', idx='Line_1', value=0)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Re-init RTED OModel due to non-parametric change.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.update()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "RTED solved as optimal in 0.0159 seconds, converged after 8 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.run(solver='ECOS')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we can see the tripped line has no flow." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.34, 0. , -2.68, -1.12, 0.28, -1.72, 1.34])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.RTED.plf.v.round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Disable the Constraints" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to the system parameters, the constraints can also be manipulated.\n", "\n", "Here, we load the case to a new system." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", "Input file parsed in 0.0386 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", "System set up in 0.0025 seconds.\n" ] } ], "source": [ "spc = ams.load(ams.get_case('5bus/pjm5bus_uced.xlsx'),\n", " setup=True,\n", " no_output=True,)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Routine initialized in 0.0101 seconds.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.init()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.set(src='rate_a', attr='v', idx=['Line_2'], value=1.4)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.update('rate_a')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can inspect the constraints status as follows.\n", "All constraints are turned on by default." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('pglb', Constraint: pglb [ON]),\n", " ('pgub', Constraint: pgub [ON]),\n", " ('pb', Constraint: pb [ON]),\n", " ('plflb', Constraint: plflb [ON]),\n", " ('plfub', Constraint: plfub [ON]),\n", " ('alflb', Constraint: alflb [ON]),\n", " ('alfub', Constraint: alfub [ON]),\n", " ('rbu', Constraint: rbu [ON]),\n", " ('rbd', Constraint: rbd [ON]),\n", " ('rru', Constraint: rru [ON]),\n", " ('rrd', Constraint: rrd [ON]),\n", " ('rgu', Constraint: rgu [ON]),\n", " ('rgd', Constraint: rgd [ON])])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.constrs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, solve the dispatch and inspect the line flow." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "RTED solved as optimal in 0.0158 seconds, converged after 10 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.run(solver='ECOS')" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.71, 0.69, 0. , -1.59, 0.61, -0.7 , 0.71])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.plf.v.round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the next, we can disable specific constraints, and the parameter name takes both single constraint name or a list of constraint names." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Turn off constraints: plflb, plfub\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.disable(['plflb', 'plfub'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, it can be seen that the two constraints are disabled." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('pglb', Constraint: pglb [ON]),\n", " ('pgub', Constraint: pgub [ON]),\n", " ('pb', Constraint: pb [ON]),\n", " ('plflb', Constraint: plflb [OFF]),\n", " ('plfub', Constraint: plfub [OFF]),\n", " ('alflb', Constraint: alflb [ON]),\n", " ('alfub', Constraint: alfub [ON]),\n", " ('rbu', Constraint: rbu [ON]),\n", " ('rbd', Constraint: rbd [ON]),\n", " ('rru', Constraint: rru [ON]),\n", " ('rrd', Constraint: rrd [ON]),\n", " ('rgu', Constraint: rgu [ON]),\n", " ('rgd', Constraint: rgd [ON])])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.constrs" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Disabled constraints: plflb, plfub\n", "Routine initialized in 0.0086 seconds.\n", "RTED solved as optimal in 0.0141 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.run(solver='ECOS')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the line flow limits are not in effect." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.71, 0.69, 0. , -1.59, 0.61, -0.7 , 0.71])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.plf.v.round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, you can also enable the constraints again." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Turn on constraints: plflb, plfub\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.enable(['plflb', 'plfub'])" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('pglb', Constraint: pglb [ON]),\n", " ('pgub', Constraint: pgub [ON]),\n", " ('pb', Constraint: pb [ON]),\n", " ('plflb', Constraint: plflb [ON]),\n", " ('plfub', Constraint: plfub [ON]),\n", " ('alflb', Constraint: alflb [ON]),\n", " ('alfub', Constraint: alfub [ON]),\n", " ('rbu', Constraint: rbu [ON]),\n", " ('rbd', Constraint: rbd [ON]),\n", " ('rru', Constraint: rru [ON]),\n", " ('rrd', Constraint: rrd [ON]),\n", " ('rgu', Constraint: rgu [ON]),\n", " ('rgd', Constraint: rgd [ON])])" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.constrs" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Routine initialized in 0.0101 seconds.\n", "RTED solved as optimal in 0.0149 seconds, converged after 10 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.run(solver='ECOS')" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.71, 0.69, 0. , -1.59, 0.61, -0.7 , 0.71])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.plf.v.round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, you can also force init the dispatch to rebuild the system matrices, enable all constraints, and re-init the optimization models." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Turn off constraints: plflb, plfub, rgu, rgd\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.disable(['plflb', 'plfub', 'rgu', 'rgd'])" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Routine initialized in 0.0103 seconds.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.init(force=True)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('pglb', Constraint: pglb [ON]),\n", " ('pgub', Constraint: pgub [ON]),\n", " ('pb', Constraint: pb [ON]),\n", " ('plflb', Constraint: plflb [ON]),\n", " ('plfub', Constraint: plfub [ON]),\n", " ('alflb', Constraint: alflb [ON]),\n", " ('alfub', Constraint: alfub [ON]),\n", " ('rbu', Constraint: rbu [ON]),\n", " ('rbd', Constraint: rbd [ON]),\n", " ('rru', Constraint: rru [ON]),\n", " ('rrd', Constraint: rrd [ON]),\n", " ('rgu', Constraint: rgu [ON]),\n", " ('rgd', Constraint: rgd [ON])])" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spc.RTED.constrs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Alter the Config" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In AMS, routines have an ``config`` object as configuration settings." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", "Input file parsed in 0.0946 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", "System set up in 0.0027 seconds.\n" ] } ], "source": [ "spf = ams.load(ams.get_case('5bus/pjm5bus_uced.xlsx'),\n", " setup=True,\n", " no_output=True,)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In RTED, the default interval is 5/60 [hour], and the formulations has been adjusted to fit the interval." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('t', 0.08333333333333333)])" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.config" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Routine initialized in 0.0108 seconds.\n", "RTED solved as optimal in 0.0155 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.run(solver='ECOS')" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.19537500005072062" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.obj.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can update the interval to 1 [hour] and re-solve the dispatch.\n", "\n", "Note that in this senario, compared to DCOPF, RTED has extra costs for ``pru`` and ``prd``." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "spf.RTED.config.t = 60/60" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember to update the parameters after the change." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Re-init RTED OModel due to non-parametric change.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.update()" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "RTED solved as optimal in 0.0200 seconds, converged after 325 iterations using solver SCS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.run(solver='SCS')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can then get the objective value." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.3444999986498134" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.obj.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that in this build-in case, the ``cru`` and ``crd`` are defined as zero." ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0.])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.cru.v" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0.])" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.RTED.crd.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As benchmark, we can solve the DCOPF." ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Routine initialized in 0.0057 seconds.\n", "DCOPF solved as optimal in 0.0092 seconds, converged after 225 iterations using solver SCS.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.DCOPF.run(solver='SCS')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As expected, the DCOPF has a similar objective value." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.3445094955490013" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spf.DCOPF.obj.v" ] } ], "metadata": { "kernelspec": { "display_name": "ams", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.18" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "d2b3bf80176349caa68dc4a3c77bd06eaade8abc678330f7d1c813c53380e5d2" } } }, "nbformat": 4, "nbformat_minor": 2 }