Skip to content

Instantly share code, notes, and snippets.

@jkrstulo
Created April 4, 2017 14:05
Show Gist options
  • Save jkrstulo/4a5dc0bca21764463135f2004ad161f1 to your computer and use it in GitHub Desktop.
Save jkrstulo/4a5dc0bca21764463135f2004ad161f1 to your computer and use it in GitHub Desktop.
first zip loads in pandapower test case
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ZIP load model (test with GridCal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## GridCal case 5 example with zip load at bus 2"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Setting the bus [0] as slack instead of pv\n",
"Setting the bus [0] as slack instead of pv\n",
"[[0, 1, 2, 3, 4]]\n",
"PowerFlow at Grid\n",
"Setting the bus [0] as slack instead of pv\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"from GridCal.grid.CalculationEngine import *\n",
"\n",
"np.set_printoptions(precision=4)\n",
"grid = MultiCircuit()\n",
"\n",
"\n",
"# Add buses\n",
"bus1 = Bus('Bus 1', vnom=20)\n",
"# bus1.is_slack = True\n",
"bus1.controlled_generators.append(ControlledGenerator('Slack Generator', voltage_module=1.0))\n",
"grid.add_bus(bus1)\n",
"\n",
"bus2 = Bus('Bus 2', vnom=20)\n",
"bus2.loads.append(Load('load 2', power=0.5*complex(40, 20),\n",
" impedance=1/(10.-5.j),\n",
" current=np.conj(10.+5.j) / (20 * np.sqrt(3)))\n",
" )\n",
"grid.add_bus(bus2)\n",
"\n",
"bus3 = Bus('Bus 3', vnom=20)\n",
"bus3.loads.append(Load('load 3', power=complex(25, 15)))\n",
"grid.add_bus(bus3)\n",
"\n",
"bus4 = Bus('Bus 4', vnom=20)\n",
"bus4.loads.append(Load('load 4', power=complex(40, 20)))\n",
"grid.add_bus(bus4)\n",
"\n",
"bus5 = Bus('Bus 5', vnom=20)\n",
"bus5.loads.append(Load('load 5', power=complex(50, 20)))\n",
"grid.add_bus(bus5)\n",
"\n",
"\n",
"# add branches (Lines in this case)\n",
"grid.add_branch(Branch(bus1, bus2, 'line 1-2', r=0.05, x=0.11, b=0.02))\n",
"\n",
"grid.add_branch(Branch(bus1, bus3, 'line 1-3', r=0.05, x=0.11, b=0.02))\n",
"\n",
"grid.add_branch(Branch(bus1, bus5, 'line 1-5', r=0.03, x=0.08, b=0.02))\n",
"\n",
"grid.add_branch(Branch(bus2, bus3, 'line 2-3', r=0.04, x=0.09, b=0.02))\n",
"\n",
"grid.add_branch(Branch(bus2, bus5, 'line 2-5', r=0.04, x=0.09, b=0.02))\n",
"\n",
"grid.add_branch(Branch(bus3, bus4, 'line 3-4', r=0.06, x=0.13, b=0.03))\n",
"\n",
"grid.add_branch(Branch(bus4, bus5, 'line 4-5', r=0.04, x=0.09, b=0.02))\n",
"\n",
"\n",
"grid.compile()\n",
"\n",
"# print('Ybus:\\n', grid.circuits[0].power_flow_input.Ybus.todense())\n",
"\n",
"options = PowerFlowOptions(SolverType.NR, verbose=False, robust=False)\n",
"power_flow = PowerFlow(grid, options)\n",
"power_flow.run()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\t|V|: [ 1. 0.9562 0.9553 0.9338 0.9538]\n",
"\tVang: [ 0. -2.3839 -2.3523 -3.6375 -2.6778]\n",
"\t|Sbus|: [ 0.00+0.j -0.20-0.1j -0.25-0.15j -0.40-0.2j -0.50-0.2j ]\n",
"\t|Sbranch|: [ 49.1041 49.3071 75.565 1.8908 5.3234 19.6851 24.2913]\n",
"\t|loading|: [ 4910.4096 4930.7092 7556.4998 189.0838 532.3418 1968.5141 2429.1295]\n",
"\terr: 1.778955111e-08\n",
"\tConv: True\n"
]
}
],
"source": [
"# print('\\n\\n', grid.name)\n",
"print('\\t|V|:', abs(grid.power_flow_results.voltage))\n",
"print('\\tVang:', np.rad2deg(np.angle(grid.power_flow_results.voltage)))\n",
"print('\\t|Sbus|:', grid.power_flow_results.Sbus)\n",
"print('\\t|Sbranch|:', abs(grid.power_flow_results.Sbranch))\n",
"print('\\t|loading|:', abs(grid.power_flow_results.loading) * 100)\n",
"print('\\terr:', grid.power_flow_results.error)\n",
"print('\\tConv:', grid.power_flow_results.converged)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## PandaPower"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append('/Users/jko/github/pandapower')\n",
"\n",
"import pandapower as pp #import pandapower\n",
"from pandapower import converter as ppconv\n",
"\n",
"# ppc case generated according to GridCal\n",
"from case5_gridcal import case5_gridcal\n",
"from pypower.api import makeYbus\n",
"\n",
"ppc = case5_gridcal()\n",
"\n",
"net = ppconv.from_ppc(ppc)\n",
"net.sn_kva = 1.e5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### adding zip loads to pandapower"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>bus</th>\n",
" <th>p_kw</th>\n",
" <th>q_kvar</th>\n",
" <th>sn_kva</th>\n",
" <th>scaling</th>\n",
" <th>in_service</th>\n",
" <th>type</th>\n",
" <th>const_p</th>\n",
" <th>const_i</th>\n",
" <th>const_z</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>None</td>\n",
" <td>1</td>\n",
" <td>40000.0</td>\n",
" <td>20000.0</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>0.5</td>\n",
" <td>0.25</td>\n",
" <td>0.25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>None</td>\n",
" <td>2</td>\n",
" <td>25000.0</td>\n",
" <td>15000.0</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>0.00</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>None</td>\n",
" <td>3</td>\n",
" <td>40000.0</td>\n",
" <td>20000.0</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>0.00</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>None</td>\n",
" <td>4</td>\n",
" <td>50000.0</td>\n",
" <td>20000.0</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" <td>True</td>\n",
" <td>None</td>\n",
" <td>1.0</td>\n",
" <td>0.00</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name bus p_kw q_kvar sn_kva scaling in_service type const_p \\\n",
"0 None 1 40000.0 20000.0 NaN 1.0 True None 0.5 \n",
"1 None 2 25000.0 15000.0 NaN 1.0 True None 1.0 \n",
"2 None 3 40000.0 20000.0 NaN 1.0 True None 1.0 \n",
"3 None 4 50000.0 20000.0 NaN 1.0 True None 1.0 \n",
"\n",
" const_i const_z \n",
"0 0.25 0.25 \n",
"1 0.00 0.00 \n",
"2 0.00 0.00 \n",
"3 0.00 0.00 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"net.load['const_p'] = 1.\n",
"net.load['const_i'] = 0.\n",
"net.load['const_z'] = 0.\n",
"net.load.loc[0,'const_p'] = 0.5\n",
"net.load.loc[0,'const_z'] = 0.25\n",
"net.load.loc[0,'const_i'] = 0.25\n",
"\n",
"net.load"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>vm_pu</th>\n",
" <th>va_degree</th>\n",
" <th>p_kw</th>\n",
" <th>q_kvar</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-158636.035777</td>\n",
" <td>-71349.56018</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.956154</td>\n",
" <td>-2.383869</td>\n",
" <td>40000.000000</td>\n",
" <td>20000.00000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.955289</td>\n",
" <td>-2.352291</td>\n",
" <td>25000.000000</td>\n",
" <td>15000.00000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.933784</td>\n",
" <td>-3.637473</td>\n",
" <td>40000.000000</td>\n",
" <td>20000.00000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.953811</td>\n",
" <td>-2.677807</td>\n",
" <td>50000.000000</td>\n",
" <td>20000.00000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" vm_pu va_degree p_kw q_kvar\n",
"0 1.000000 0.000000 -158636.035777 -71349.56018\n",
"1 0.956154 -2.383869 40000.000000 20000.00000\n",
"2 0.955289 -2.352291 25000.000000 15000.00000\n",
"3 0.933784 -3.637473 40000.000000 20000.00000\n",
"4 0.953811 -2.677807 50000.000000 20000.00000"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# recycle Ybus in order compare it with GridCal's Ybus\n",
"pp.runpp(net, voltage_depend_loads=True, recycle = dict(_is_elements=False, ppc=False, Ybus=True, bfsw=False))\n",
"net.res_bus"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandapower vs. GridCal "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ybus test"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"\tYbus PANDAPOWER = GridCal !!!\n"
]
}
],
"source": [
"Ybus_pp=net[\"_ppc\"]['internal']['Ybus'].todense()\n",
"bus_ord = net[\"_pd2ppc_lookups\"][\"bus\"]\n",
"Ybus_pp = Ybus_pp[bus_ord,:][:,bus_ord]\n",
"\n",
"if np.allclose(Ybus_pp, grid.circuits[0].power_flow_input.Ybus.todense()):\n",
" print(\"\\n\\tYbus PANDAPOWER = GridCal !!!\")\n",
"else:\n",
" print(\"Ybus ERROR\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### PF result test"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\t PF PANDAPOWER = GridCal !!!\n"
]
}
],
"source": [
"if (np.allclose(net.res_bus.vm_pu, abs(grid.power_flow_results.voltage)) and\n",
" np.allclose(np.rad2deg(np.angle(grid.power_flow_results.voltage)), net.res_bus.va_degree)):\n",
" print(\"\\n\\t PF PANDAPOWER = GridCal !!!\")\n",
"else:\n",
" print(\"PF ERROR\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment