{ "cells": [ { "cell_type": "markdown", "source": [ "# Using PowerSystems to calculate network matrices" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "**Originally Contributed by**: Clayton Barrows" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "## Introduction" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "PowerSystems.jl supports the calculation of several different matrix representations of\n", "power system networks. This example demonstrates how to use PowerSystems.jl to calculate:\n", " - Y bus\n", " - Power transfer distribution factor (PTDF)\n", " - Line outage distribution factor (LODF)" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "### Dependencies\n", "Let's use a dataset from the [tabular data parsing example](https://nbviewer.jupyter.org/github/NREL-SIIP/SIIPExamples.jl/blob/master/notebook/2_PowerSystems_examples/parse_matpower.ipynb)" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: extending matpower format with data: areas 1x3\n", "[ Info: extending matpower format with data: gen_name 7x4\n", "[ Info: extending matpower format by appending matrix \"gen_name\" in to \"gen\"\n", "[ Info: reversing the orientation of branch 6 (4, 3) to be consistent with other parallel branches\n", "[ Info: the voltage setpoint on generator 4 does not match the value at bus 4\n", "[ Info: the voltage setpoint on generator 1 does not match the value at bus 1\n", "[ Info: the voltage setpoint on generator 5 does not match the value at bus 10\n", "[ Info: the voltage setpoint on generator 2 does not match the value at bus 1\n", "[ Info: the voltage setpoint on generator 3 does not match the value at bus 3\n", "[ Info: removing 1 cost terms from generator 4: [4000.0, 0.0]\n", "[ Info: removing 1 cost terms from generator 1: [1400.0, 0.0]\n", "[ Info: removing 1 cost terms from generator 5: [1000.0, 0.0]\n", "[ Info: removing 1 cost terms from generator 2: [1500.0, 0.0]\n", "[ Info: removing 3 cost terms from generator 6: Float64[]\n", "[ Info: removing 3 cost terms from generator 7: Float64[]\n", "[ Info: removing 1 cost terms from generator 3: [3000.0, 0.0]\n", "┌ Info: Constructing System from Power Models\n", "│ data[\"name\"] = \"nesta_case5_pjm\"\n", "└ data[\"source_type\"] = \"matpower\"\n", "[ Info: Reading bus data\n", "[ Info: Reading generator data\n", "[ Info: Reading branch data\n", "┌ Warning: Rate 1200.0 MW for bus2-bus3-i_4 is larger than the max expected in the range of (min = 134.0, max = 145.0).\n", "└ @ PowerSystems ~/.julia/packages/PowerSystems/N2l8o/src/utils/IO/branchdata_checks.jl:148\n", "┌ Warning: Rate 200.0 MW for bus1-bus2-i_1 is larger than the max expected in the range of (min = 134.0, max = 145.0).\n", "└ @ PowerSystems ~/.julia/packages/PowerSystems/N2l8o/src/utils/IO/branchdata_checks.jl:148\n", "┌ Warning: Rate 200.0 MW for bus1-bus4-i_2 is larger than the max expected in the range of (min = 134.0, max = 145.0).\n", "└ @ PowerSystems ~/.julia/packages/PowerSystems/N2l8o/src/utils/IO/branchdata_checks.jl:148\n", "┌ Warning: Rate 200.0 MW for bus4-bus5-i_7 is larger than the max expected in the range of (min = 134.0, max = 145.0).\n", "└ @ PowerSystems ~/.julia/packages/PowerSystems/N2l8o/src/utils/IO/branchdata_checks.jl:148\n", "┌ Warning: Rate 1000.0 MW for bus1-bus5-i_3 is larger than the max expected in the range of (min = 134.0, max = 145.0).\n", "└ @ PowerSystems ~/.julia/packages/PowerSystems/N2l8o/src/utils/IO/branchdata_checks.jl:148\n", "[ Info: Reading branch data\n", "[ Info: Reading DC Line data\n", "[ Info: Reading storage data\n" ] }, { "output_type": "execute_result", "data": { "text/plain": "System\n======\nSystem Units Base: SYSTEM_BASE\nBase Power: 100.0\nBase Frequency: 60.0\n\nComponents\n==========\nNum components: 30\n\n\u001b[1m9×3 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0m│\u001b[1m ConcreteType \u001b[0m\u001b[1m SuperTypes \u001b[0m\u001b[1m Count \u001b[0m\n\u001b[1m \u001b[0m│\u001b[90m String \u001b[0m\u001b[90m String \u001b[0m\u001b[90m Int64 \u001b[0m\n─────┼────────────────────────────────────────────────────────────────────\n 1 │ Arc Topology <: Component <: Infrast… 6\n 2 │ Area AggregationTopology <: Topology … 1\n 3 │ Bus Topology <: Component <: Infrast… 5\n 4 │ Line ACBranch <: Branch <: Device <: … 5\n 5 │ LoadZone AggregationTopology <: Topology … 1\n 6 │ PhaseShiftingTransformer ACBranch <: Branch <: Device <: … 2\n 7 │ PowerLoad StaticLoad <: ElectricLoad <: St… 3\n 8 │ RenewableDispatch RenewableGen <: Generator <: Sta… 2\n 9 │ ThermalStandard ThermalGen <: Generator <: Stati… 5\n\nTimeSeriesContainer\n===================\nComponents with time series data: 0\nTotal StaticTimeSeries: 0\nTotal Forecasts: 0\n", "text/html": [ "

System

\n", "

Base Power: 100.0

\n", "

Components

\n", "

Num components: 30

\n", "

9 rows × 3 columns

ConcreteTypeSuperTypesCount
StringStringInt64
1ArcTopology <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any6
2AreaAggregationTopology <: Topology <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any1
3BusTopology <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any5
4LineACBranch <: Branch <: Device <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any5
5LoadZoneAggregationTopology <: Topology <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any1
6PhaseShiftingTransformerACBranch <: Branch <: Device <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any2
7PowerLoadStaticLoad <: ElectricLoad <: StaticInjection <: Device <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any3
8RenewableDispatchRenewableGen <: Generator <: StaticInjection <: Device <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any2
9ThermalStandardThermalGen <: Generator <: StaticInjection <: Device <: Component <: InfrastructureSystemsComponent <: InfrastructureSystemsType <: Any5
\n", "\n", "

TimeSeriesContainer

\n", "

Components with time series data: 0

\n", "

Total StaticTimeSeries: 0

\n", "

Total Forecasts: 0

\n", "

Resolution: 0 seconds

\n" ] }, "metadata": {}, "execution_count": 1 } ], "cell_type": "code", "source": [ "using SIIPExamples\n", "\n", "pkgpath = dirname(dirname(pathof(SIIPExamples)))\n", "include(joinpath(pkgpath, \"test\", \"2_PowerSystems_examples\", \"02_parse_matpower.jl\"))" ], "metadata": {}, "execution_count": 1 }, { "cell_type": "markdown", "source": [ "### Ybus" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: The System has no islands\n" ] }, { "output_type": "execute_result", "data": { "text/plain": "PowerNetworkMatrix\n:\n 22.2507-222.484im -3.52348+35.2348im … -15.4703+154.703im\n -3.52348+35.2348im 12.6911-126.898im 0.0+0.0im\n 0.0+0.0im -9.16758+91.6758im 0.0+0.0im\n -3.2569+32.569im 0.0+0.0im -3.33367+33.3367im\n -15.4703+154.703im 0.0+0.0im 18.804-188.021im" }, "metadata": {}, "execution_count": 2 } ], "cell_type": "code", "source": [ "ybus = Ybus(sys)" ], "metadata": {}, "execution_count": 2 }, { "cell_type": "markdown", "source": [ "### PTDF" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "PowerNetworkMatrix\n:\n 0.23245 -0.37175 -0.219627 0.0 0.19124\n 0.41667 0.201807 0.119226 0.0 0.342801\n 0.35088 0.169943 0.100401 0.0 -0.53404\n 0.23245 0.62825 -0.219627 0.0 0.19124\n 0.116225 0.314125 0.390186 0.0 0.0956199\n 0.116225 0.314125 0.390186 0.0 0.0956199\n -0.35088 -0.169943 -0.100401 0.0 -0.46596" }, "metadata": {}, "execution_count": 3 } ], "cell_type": "code", "source": [ "ptdf = PTDF(sys)" ], "metadata": {}, "execution_count": 3 }, { "cell_type": "markdown", "source": [ "### LODF" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "PowerNetworkMatrix\n:\n -1.0 0.398488 0.3581 -1.0 -0.360154 -0.360154 -0.3581\n 0.542857 -1.0 0.6419 0.542857 0.195512 0.195512 -0.6419\n 0.457143 0.601512 -1.0 0.457143 0.164642 0.164642 1.0\n -1.0 0.398488 0.3581 -1.0 -0.360154 -0.360154 -0.3581\n -0.5 0.199244 0.17905 -0.5 -1.0 0.639846 -0.17905\n -0.5 0.199244 0.17905 -0.5 0.639846 -1.0 -0.17905\n -0.457143 -0.601512 1.0 -0.457143 -0.164642 -0.164642 -1.0" }, "metadata": {}, "execution_count": 4 } ], "cell_type": "code", "source": [ "lodf = LODF(sys)" ], "metadata": {}, "execution_count": 4 }, { "cell_type": "markdown", "source": [ "### Indexing\n", "Note that the axes of these matrices that correspond to buses are indexed by bus number\n", "(::Int64) while the branch axes are indexed by branch name (::String). You can access\n", "specific elements of the matrices as follows:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "0.39018648100730935" }, "metadata": {}, "execution_count": 5 } ], "cell_type": "code", "source": [ "ptdf[\"bus3-bus4-i_6\", 3]" ], "metadata": {}, "execution_count": 5 }, { "cell_type": "markdown", "source": [ "Additionally, PowerSystems provides accessors to the network matrices that take `Componets`\n", "as arguments so that you can pass references to the components themselves rather than the\n", "name or number. For example:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "-3.2569046378322044 + 32.56904637832204im" }, "metadata": {}, "execution_count": 6 } ], "cell_type": "code", "source": [ "buses = collect(get_components(Bus, sys))\n", "ybus[buses[1], buses[2]]" ], "metadata": {}, "execution_count": 6 }, { "cell_type": "markdown", "source": [ "If you would instead like to index by bus name, something like the following should work:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "0.39018648100730935" }, "metadata": {}, "execution_count": 7 } ], "cell_type": "code", "source": [ "busname2num = get_components(Bus, sys) |> (c -> Dict(zip(get_name.(c), get_number.(c))))\n", "ptdf[\"bus3-bus4-i_6\", busname2num[\"bus3\"]]" ], "metadata": {}, "execution_count": 7 }, { "cell_type": "markdown", "source": [ "---\n", "\n", "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" ], "metadata": {} } ], "nbformat_minor": 3, "metadata": { "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.5.4" }, "kernelspec": { "name": "julia-1.5", "display_name": "Julia 1.5.4", "language": "julia" } }, "nbformat": 4 }