{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Load Frequency Control" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This examples shows (1) how to trip a generator, and (2) how to drive frequency back by load shedding." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:27.821845Z", "start_time": "2021-03-20T14:50:27.457672Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:51.096056Z", "iopub.status.busy": "2021-09-26T22:41:51.095687Z", "iopub.status.idle": "2021-09-26T22:41:51.787388Z", "shell.execute_reply": "2021-09-26T22:41:51.787697Z" } }, "outputs": [], "source": [ "import andes\n", "import numpy as np\n", "\n", "andes.config_logger(stream_level=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tripping a Generator in the IEEE 14-Bus System" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:27.825186Z", "start_time": "2021-03-20T14:50:27.823356Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:51.791619Z", "iopub.status.busy": "2021-09-26T22:41:51.791291Z", "iopub.status.idle": "2021-09-26T22:41:51.793147Z", "shell.execute_reply": "2021-09-26T22:41:51.792812Z" } }, "outputs": [], "source": [ "# using the IEEE 14-bus model as an example. \n", "# The example here contains a variety of models: generators, exciters, turbine governors, and PSS\n", "# To speed up, one can remove unneeded ones, e.g., PSS\n", "\n", "ieee14_raw = andes.get_case(\"ieee14/ieee14.raw\")\n", "ieee14_dyr = andes.get_case(\"ieee14/ieee14.dyr\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:28.180552Z", "start_time": "2021-03-20T14:50:27.826164Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:51.795909Z", "iopub.status.busy": "2021-09-26T22:41:51.794488Z", "iopub.status.idle": "2021-09-26T22:41:52.329282Z", "shell.execute_reply": "2021-09-26T22:41:52.329629Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Working directory: \"/home/hacui/repos/andes/examples\"\n", "> Loaded config from file \"/home/hacui/.andes/andes.rc\"\n", "> Loaded generated Python code in \"/home/hacui/.andes/pycode\".\n", "Parsing input file \"/home/hacui/repos/andes/andes/cases/ieee14/ieee14.raw\"...\n", " IEEE 14 BUS TEST CASE\n", " 03/06/14 CONTO 100.0 1962 W\n", "Input file parsed in 0.0119 seconds.\n", "Parsing additional file \"/home/hacui/repos/andes/andes/cases/ieee14/ieee14.dyr\"...\n", "Addfile parsed in 0.2965 seconds.\n" ] } ], "source": [ "# use `andes.load` to load the test system\n", "# Need to set `setup=False` to be able to add new Toggles that turns off generators.\n", "\n", "ss = andes.load(ieee14_raw, addfile=ieee14_dyr, setup=False)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:28.195344Z", "start_time": "2021-03-20T14:50:28.182981Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:52.335603Z", "iopub.status.busy": "2021-09-26T22:41:52.335180Z", "iopub.status.idle": "2021-09-26T22:41:52.338935Z", "shell.execute_reply": "2021-09-26T22:41:52.338703Z" } }, "outputs": [ { "data": { "text/plain": [ "'Toggle_3'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Add a Toggle that disconnects `GENROU_2` at t=1 s\n", "\n", "ss.add(\"Toggle\", dict(model='SynGen', dev=\"GENROU_2\", t=1.0))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:28.229260Z", "start_time": "2021-03-20T14:50:28.196728Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:52.358570Z", "iopub.status.busy": "2021-09-26T22:41:52.341824Z", "iopub.status.idle": "2021-09-26T22:41:52.388612Z", "shell.execute_reply": "2021-09-26T22:41:52.388287Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "IEEEST added BusFreq linked to bus <3.0>\n", "ST2CUT added BusFreq linked to bus <1.0>\n", "ST2CUT added BusFreq linked to bus <2.0>\n", "System internal structure set up in 0.0750 seconds.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Call setup manually\n", "\n", "ss.setup()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:28.240488Z", "start_time": "2021-03-20T14:50:28.230390Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:52.398951Z", "iopub.status.busy": "2021-09-26T22:41:52.396091Z", "iopub.status.idle": "2021-09-26T22:41:52.408084Z", "shell.execute_reply": "2021-09-26T22:41:52.405814Z" } }, "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", "
idxunamemodeldevt
uid
0Toggle_11.0Toggle_1LineLine_11.0
1Toggle_21.0Toggle_2LineLine_11.1
2Toggle_31.0Toggle_3SynGenGENROU_21.0
\n", "
" ], "text/plain": [ " idx u name model dev t\n", "uid \n", "0 Toggle_1 1.0 Toggle_1 Line Line_1 1.0\n", "1 Toggle_2 1.0 Toggle_2 Line Line_1 1.1\n", "2 Toggle_3 1.0 Toggle_3 SynGen GENROU_2 1.0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# double check that Toggles are set up correctly\n", "# Check `u` of the Toggles - the first two line switches are disabled, and the generator trip is enabled\n", "\n", "ss.Toggle.as_df()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:28.243800Z", "start_time": "2021-03-20T14:50:28.241738Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:52.411440Z", "iopub.status.busy": "2021-09-26T22:41:52.410963Z", "iopub.status.idle": "2021-09-26T22:41:52.413395Z", "shell.execute_reply": "2021-09-26T22:41:52.413112Z" } }, "outputs": [], "source": [ "# disable existing line switches\n", "# The IEEE 14-bus system contains predefined line switches. Disabling them to study generator trip only.\n", "\n", "ss.Toggle.u.v[[0, 1]] = 0" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:28.269619Z", "start_time": "2021-03-20T14:50:28.245482Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:52.425054Z", "iopub.status.busy": "2021-09-26T22:41:52.424516Z", "iopub.status.idle": "2021-09-26T22:41:52.448538Z", "shell.execute_reply": "2021-09-26T22:41:52.448295Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "-> System connectivity check results:\n", " No islanded bus detected.\n", " System is interconnected.\n", " Each island has a slack bus correctly defined and enabled.\n", "\n", "-> Power flow calculation\n", " Numba: Off\n", " Sparse solver: KLU\n", " Solution method: NR method\n", "Power flow initialized in 0.0101 seconds.\n", "0: |F(x)| = 0.5605182134\n", "1: |F(x)| = 0.006202200332\n", "2: |F(x)| = 5.819382824e-06\n", "3: |F(x)| = 6.96508129e-12\n", "Converged in 4 iterations in 0.0111 seconds.\n", "Initialization for dynamics completed in 0.0575 seconds.\n", "Initialization was successful.\n", "Report saved to \"ieee14_out.txt\" in 0.0083 seconds.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculate power flow\n", "\n", "# use constant power model for PQ (we will come back to this later)\n", "\n", "ss.PQ.config.p2p = 1\n", "ss.PQ.config.q2q = 1\n", "ss.PQ.config.p2z = 0\n", "ss.PQ.config.q2z = 0\n", "\n", "# turn off under-voltage PQ-to-Z conversion\n", "ss.PQ.pq2z = 0\n", "\n", "ss.PFlow.run()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:31.946502Z", "start_time": "2021-03-20T14:50:28.271492Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:52.451872Z", "iopub.status.busy": "2021-09-26T22:41:52.451592Z", "iopub.status.idle": "2021-09-26T22:41:58.820742Z", "shell.execute_reply": "2021-09-26T22:41:58.821072Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\n", "-> Time Domain Simulation Summary:\n", "Sparse Solver: KLU\n", "Simulation time: 0.0-20 s.\n", "Fixed step size: h=33.33 ms. Shrink if not converged.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "196f6939366c4034bb80040dbebff9ce", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/100 [00:00: SynGen.GENROU_2 status changed to 0 at t=1.0 sec.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Simulation completed in 2.9748 seconds.\n", "Outputs to \"ieee14_out.lst\" and \"ieee14_out.npz\".\n", "Outputs written in 0.0421 seconds.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# set the first simulation stop and run it\n", "\n", "ss.TDS.config.tf = 20\n", "ss.TDS.config.criteria = 0 # temporarily turn off stability criteria based on angle separation\n", "ss.TDS.run()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:33.637699Z", "start_time": "2021-03-20T14:50:31.947639Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:58.836715Z", "iopub.status.busy": "2021-09-26T22:41:58.836316Z", "iopub.status.idle": "2021-09-26T22:41:59.376063Z", "shell.execute_reply": "2021-09-26T22:41:59.375772Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Show the frequency response of online generators\n", "\n", "# Refer to `plot` documentation by using `help(ss.TDS.plt.plot)` and `help(ss.TDS.plt.plot_data)`\n", "ss.TDS.load_plotter()\n", "\n", "ss.TDS.plt.plot(ss.GENROU.omega,\n", " a=(0, 2, 3, 4),\n", " ytimes=60,\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adjusting Load to Compensate for the Generation Loss" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check the power of the lost generator by inspecting the power flow inputs:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:33.653861Z", "start_time": "2021-03-20T14:50:33.638918Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:59.390416Z", "iopub.status.busy": "2021-09-26T22:41:59.381392Z", "iopub.status.idle": "2021-09-26T22:41:59.392998Z", "shell.execute_reply": "2021-09-26T22:41:59.392675Z" }, "scrolled": true }, "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", "
idxunameSnVnbusbusrp0q0pmaxpminqmaxqminv0vmaxvminraxs
uid
020.02100.069.02None0.400.150.50.10.15-0.401.031.40.60.00.13
130.03100.069.03None0.400.150.50.10.15-0.101.011.40.60.00.13
240.04100.0138.06None0.300.100.50.10.10-0.061.031.40.60.00.12
350.05100.069.08None0.350.100.50.10.10-0.061.031.40.60.00.12
\n", "
" ], "text/plain": [ " idx u name Sn Vn bus busr p0 q0 pmax pmin qmax \\\n", "uid \n", "0 2 0.0 2 100.0 69.0 2 None 0.40 0.15 0.5 0.1 0.15 \n", "1 3 0.0 3 100.0 69.0 3 None 0.40 0.15 0.5 0.1 0.15 \n", "2 4 0.0 4 100.0 138.0 6 None 0.30 0.10 0.5 0.1 0.10 \n", "3 5 0.0 5 100.0 69.0 8 None 0.35 0.10 0.5 0.1 0.10 \n", "\n", " qmin v0 vmax vmin ra xs \n", "uid \n", "0 -0.40 1.03 1.4 0.6 0.0 0.13 \n", "1 -0.10 1.01 1.4 0.6 0.0 0.13 \n", "2 -0.06 1.03 1.4 0.6 0.0 0.12 \n", "3 -0.06 1.03 1.4 0.6 0.0 0.12 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ss.PV.as_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The tripped GENROU_2 correspond to the first PV (GENROU_1 corresponds to Slack). Thus, the lost active power is 0.40 pu.\n", "\n", "Let's compensate for that by shedding 0.4 pu of active power load at t=2.0 s.\n", "\n", "By checking the equation documentation of PQ (using `print(ss.PQ.doc())`, we can tell that the imposed active power for time-domain simulation is from `Ppf`, because we used the constant power model with `p2p = 1`.\n", "\n", "```\n", "Algebraic Equations\n", "\n", "Name | Type | RHS of Equation \"0 = g(x, y)\" \n", "-----+----------+-------------------------------------------------------------\n", " a | ExtAlgeb | u * (dae_t <= 0) * (p0 * vcmp_zi + Rlb * vcmp_zl * v**2 + \n", " | | Rub * vcmp_zu * v**2) + u * (dae_t > 0) * (p2p * Ppf + p2i *\n", " | | Ipeq * v + p2z * Req * v**2) \n", " v | ExtAlgeb | u * (dae_t <= 0) * (q0 * vcmp_zi + Xlb * vcmp_zl * v**2 + \n", " | | Xub * vcmp_zu * v**2) + u * (dae_t > 0) * (q2q * Qpf + q2i *\n", " | | Iqeq * v + q2z * Xeq * v**2) \n", "\n", "```\n", "\n", "`Ppf` may be different from `p0` specified in the data file." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:33.662293Z", "start_time": "2021-03-20T14:50:33.655315Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:59.396349Z", "iopub.status.busy": "2021-09-26T22:41:59.396108Z", "iopub.status.idle": "2021-09-26T22:41:59.398474Z", "shell.execute_reply": "2021-09-26T22:41:59.398257Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.217, 0.5 , 0.478, 0.076, 0.15 , 0.295, 0.09 , 0.035, 0.061,\n", " 0.135, 0.2 ])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# active power from power flow solution - make a copy\n", "\n", "Ppf = np.array(ss.PQ.Ppf.v)\n", "\n", "Ppf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reload the system and add the generator trip." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:33.843520Z", "start_time": "2021-03-20T14:50:33.664077Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:59.401976Z", "iopub.status.busy": "2021-09-26T22:41:59.401670Z", "iopub.status.idle": "2021-09-26T22:41:59.781185Z", "shell.execute_reply": "2021-09-26T22:41:59.780928Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Working directory: \"/home/hacui/repos/andes/examples\"\n", "> Loaded config from file \"/home/hacui/.andes/andes.rc\"\n", "> Reloaded generated Python code of module \"pycode\".\n", "Parsing input file \"/home/hacui/repos/andes/andes/cases/ieee14/ieee14.raw\"...\n", " IEEE 14 BUS TEST CASE\n", " 03/06/14 CONTO 100.0 1962 W\n", "Input file parsed in 0.0047 seconds.\n", "Parsing additional file \"/home/hacui/repos/andes/andes/cases/ieee14/ieee14.dyr\"...\n", "Addfile parsed in 0.1101 seconds.\n", "IEEEST added BusFreq linked to bus <3.0>\n", "ST2CUT added BusFreq linked to bus <1.0>\n", "ST2CUT added BusFreq linked to bus <2.0>\n", "System internal structure set up in 0.0547 seconds.\n", "-> System connectivity check results:\n", " No islanded bus detected.\n", " System is interconnected.\n", " Each island has a slack bus correctly defined and enabled.\n", "\n", "-> Power flow calculation\n", " Numba: Off\n", " Sparse solver: KLU\n", " Solution method: NR method\n", "Power flow initialized in 0.0040 seconds.\n", "0: |F(x)| = 0.5605182134\n", "1: |F(x)| = 0.006202200332\n", "2: |F(x)| = 5.819382824e-06\n", "3: |F(x)| = 6.96508129e-12\n", "Converged in 4 iterations in 0.0065 seconds.\n", "Initialization for dynamics completed in 0.0547 seconds.\n", "Initialization was successful.\n", "Report saved to \"ieee14_out.txt\" in 0.0028 seconds.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ss = andes.load(ieee14_raw, addfile=ieee14_dyr, setup=False)\n", "\n", "ss.add(\"Toggle\", dict(model='SynGen', dev=\"GENROU_2\", t=1.0))\n", "ss.setup()\n", "ss.Toggle.u.v[[0, 1]] = 0\n", "\n", "ss.PQ.config.p2p = 1\n", "ss.PQ.config.q2q = 1\n", "ss.PQ.config.p2z = 0\n", "ss.PQ.config.q2z = 0\n", "ss.PQ.pq2z = 0\n", "\n", "ss.PFlow.run()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But let's run to 2 seconds." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:34.359640Z", "start_time": "2021-03-20T14:50:33.844497Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:41:59.783772Z", "iopub.status.busy": "2021-09-26T22:41:59.783385Z", "iopub.status.idle": "2021-09-26T22:42:00.427589Z", "shell.execute_reply": "2021-09-26T22:42:00.427211Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\n", "-> Time Domain Simulation Summary:\n", "Sparse Solver: KLU\n", "Simulation time: 0.0-2.0 s.\n", "Fixed step size: h=33.33 ms. Shrink if not converged.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "532dc5397a8e454aa2edb338ba8c6727", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/100 [00:00: SynGen.GENROU_2 status changed to 0 at t=1.0 sec.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Simulation completed in 0.2567 seconds.\n", "Outputs to \"ieee14_out.lst\" and \"ieee14_out.npz\".\n", "Outputs written in 0.0043 seconds.\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ss.TDS.config.tf = 2.0\n", "ss.TDS.config.criteria = 0 # temporarily turn off stability criteria based on angle separation\n", "\n", "ss.TDS.run()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:34.365314Z", "start_time": "2021-03-20T14:50:34.361320Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:42:00.431018Z", "iopub.status.busy": "2021-09-26T22:42:00.430731Z", "iopub.status.idle": "2021-09-26T22:42:00.432747Z", "shell.execute_reply": "2021-09-26T22:42:00.432950Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.217, 0.5 , 0.478, 0.076, 0.15 , 0.295, 0.09 , 0.035, 0.061,\n", " 0.135, 0.2 ])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# all `Ppf` before shedding\n", "\n", "ss.PQ.Ppf.v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And then apply the load shedding on buses 2, 3, 4, 5, 6, 9." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:34.371683Z", "start_time": "2021-03-20T14:50:34.366907Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:42:00.435888Z", "iopub.status.busy": "2021-09-26T22:42:00.435641Z", "iopub.status.idle": "2021-09-26T22:42:00.438413Z", "shell.execute_reply": "2021-09-26T22:42:00.438609Z" } }, "outputs": [ { "data": { "text/plain": [ "['PQ_1', 'PQ_2', 'PQ_3', 'PQ_4', 'PQ_5', 'PQ_6']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shed_buses = [2, 3, 4, 5, 6, 9]\n", "\n", "# find the `idx` of the loads on these buses\n", "\n", "pq_shed_idx = ss.PQ.find_idx(keys='bus', values=shed_buses)\n", "pq_shed_idx" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:34.377719Z", "start_time": "2021-03-20T14:50:34.373283Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:42:00.441930Z", "iopub.status.busy": "2021-09-26T22:42:00.440216Z", "iopub.status.idle": "2021-09-26T22:42:00.444716Z", "shell.execute_reply": "2021-09-26T22:42:00.444401Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.217, 0.5 , 0.478, 0.076, 0.15 , 0.295])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get `Ppf` on these buses before shedding\n", "\n", "pq_p = ss.PQ.get(src='Ppf', idx=pq_shed_idx, attr='v')\n", "pq_p" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:34.383710Z", "start_time": "2021-03-20T14:50:34.379275Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:42:00.447756Z", "iopub.status.busy": "2021-09-26T22:42:00.447520Z", "iopub.status.idle": "2021-09-26T22:42:00.450062Z", "shell.execute_reply": "2021-09-26T22:42:00.449815Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pq_p_new = pq_p - 0.4 / len(shed_buses)\n", "\n", "ss.PQ.set(src='Ppf', idx=pq_shed_idx, attr='v', value=pq_p_new)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:34.388943Z", "start_time": "2021-03-20T14:50:34.385210Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:42:00.452527Z", "iopub.status.busy": "2021-09-26T22:42:00.452212Z", "iopub.status.idle": "2021-09-26T22:42:00.454810Z", "shell.execute_reply": "2021-09-26T22:42:00.454551Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0.15033333, 0.43333333, 0.41133333, 0.00933333, 0.08333333,\n", " 0.22833333, 0.09 , 0.035 , 0.061 , 0.135 ,\n", " 0.2 ])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# double check\n", "\n", "ss.PQ.Ppf.v" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2021-03-20T14:50:38.328264Z", "start_time": "2021-03-20T14:50:34.390379Z" }, "execution": { "iopub.execute_input": "2021-09-26T22:42:00.457360Z", "iopub.status.busy": "2021-09-26T22:42:00.457090Z", "iopub.status.idle": "2021-09-26T22:42:04.033446Z", "shell.execute_reply": "2021-09-26T22:42:04.033166Z" }, "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b042851b458c412388c0ee4f5bedc8e5", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/100 [00:00" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ss.TDS.config.tf = 10\n", "\n", "ss.TDS.run()\n", "\n", "ss.TDS.plt.plot(ss.GENROU.omega,\n", " a=(0, 2, 3, 4),\n", " ytimes=60,\n", " )" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2021-09-26T22:42:04.036399Z", "iopub.status.busy": "2021-09-26T22:42:04.035958Z", "iopub.status.idle": "2021-09-26T22:42:04.657177Z", "shell.execute_reply": "2021-09-26T22:42:04.656933Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"/home/hacui/repos/andes/examples/ieee14_out.txt\" removed.\r\n", "\"/home/hacui/repos/andes/examples/ieee14_out.lst\" removed.\r\n", "\"/home/hacui/repos/andes/examples/ieee14_out.npz\" removed.\r\n" ] } ], "source": [ "!andes misc -C" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result shows the generator speed (frequency) returns to 60 Hz after load shedding. " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.10" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }