{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# DCOPF Verification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "For test cases, DCOPF results from AMS are identical to that from PYPOWER.\n", "\n", "NOTE: This verification works with PYPOWER ***v5.1.16***, where ***v5.1.17*** yields unexpected results." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "import ams\n", "import andes\n", "\n", "import pypower.api as pyp" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "ams.config_logger(stream_level=40)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generator Output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using built-in MATPOWER cases as inputs." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "cases = [\n", " ams.get_case('matpower/case14.m'),\n", " ams.get_case('matpower/case39.m'),\n", " ams.get_case('matpower/case118.m'),\n", " ams.get_case('npcc/npcc.m'),\n", " ams.get_case('wecc/wecc.m'),\n", " ams.get_case('matpower/case300.m'),]\n", "\n", "case_names = [case.split('/')[-1].split('.')[0] for case in cases]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "ams_obj = np.zeros(len(cases))\n", "pyp_obj = np.zeros(len(cases))\n", "\n", "for i, case in enumerate(cases):\n", " sp = ams.load(case, setup=True, no_output=True)\n", " sp.DCOPF.init()\n", " sp.DCOPF.run(solver='CLARABEL')\n", " ams_obj[i] = sp.DCOPF.obj.v\n", "\n", " ppc = ams.io.pypower.system2ppc(sp)\n", " ppopt = pyp.ppoption(VERBOSE=0, OUT_ALL=0, PF_ALG=1, OPF_ALG_DC=200)\n", " ppc_sol = pyp.rundcopf(ppc, ppopt)\n", " pyp_obj[i] = ppc_sol['f']" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.allclose(ams_obj, pyp_obj, atol=1e-6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## LMP" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "sp2 = ams.load(ams.get_case('pglib/pglib_opf_case39_epri__api.m'),\n", " setup=True,\n", " no_output=True,\n", " default_config=True)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp2.DCOPF.run(solver='CLARABEL')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "ppc2 = ams.io.pypower.system2ppc(sp2)\n", "ppc2_sol = pyp.rundcopf(ppc2, ppopt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nodal price" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.allclose(sp2.DCOPF.pi.v / sp2.config.mva,\n", " ppc2_sol['bus'][:, 13],\n", " atol=1e-6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bus angle" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.allclose(sp2.DCOPF.aBus.v * andes.shared.rad2deg,\n", " ppc2_sol['bus'][:, 8],\n", " atol=1e-6)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | ams_LMP | \n", "pyp_LMP | \n", "ams_aBus | \n", "pyp_aBus | \n", "
|---|---|---|---|---|
| 0 | \n", "29.9988 | \n", "29.9988 | \n", "-25.6184 | \n", "-25.6184 | \n", "
| 1 | \n", "34.2147 | \n", "34.2147 | \n", "-26.8519 | \n", "-26.8519 | \n", "
| 2 | \n", "35.6012 | \n", "35.6012 | \n", "-30.4965 | \n", "-30.4965 | \n", "
| 3 | \n", "38.1542 | \n", "38.1542 | \n", "-28.8548 | \n", "-28.8548 | \n", "
| 4 | \n", "20.1311 | \n", "20.1311 | \n", "-24.4545 | \n", "-24.4545 | \n", "
| 5 | \n", "20.9823 | \n", "20.9823 | \n", "-22.9110 | \n", "-22.9110 | \n", "
| 6 | \n", "21.0918 | \n", "21.0918 | \n", "-26.4821 | \n", "-26.4821 | \n", "
| 7 | \n", "21.1466 | \n", "21.1466 | \n", "-27.2531 | \n", "-27.2531 | \n", "
| 8 | \n", "24.8701 | \n", "24.8701 | \n", "-24.5329 | \n", "-24.5329 | \n", "
| 9 | \n", "24.8047 | \n", "24.8047 | \n", "-21.2851 | \n", "-21.2851 | \n", "
| 10 | \n", "23.5694 | \n", "23.5694 | \n", "-21.8833 | \n", "-21.8833 | \n", "
| 11 | \n", "24.8047 | \n", "24.8047 | \n", "-22.4869 | \n", "-22.4869 | \n", "
| 12 | \n", "26.0400 | \n", "26.0400 | \n", "-22.7386 | \n", "-22.7386 | \n", "
| 13 | \n", "34.3071 | \n", "34.3071 | \n", "-26.2107 | \n", "-26.2107 | \n", "
| 14 | \n", "34.6822 | \n", "34.6822 | \n", "-29.2227 | \n", "-29.2227 | \n", "
| 15 | \n", "34.8446 | \n", "34.8446 | \n", "-27.6899 | \n", "-27.6899 | \n", "
| 16 | \n", "34.9985 | \n", "34.9985 | \n", "-29.5901 | \n", "-29.5901 | \n", "
| 17 | \n", "35.2283 | \n", "35.2283 | \n", "-30.6918 | \n", "-30.6918 | \n", "
| 18 | \n", "34.8446 | \n", "34.8446 | \n", "-21.3650 | \n", "-21.3650 | \n", "
| 19 | \n", "34.8446 | \n", "34.8446 | \n", "-23.3981 | \n", "-23.3981 | \n", "
| 20 | \n", "34.8446 | \n", "34.8446 | \n", "-24.2513 | \n", "-24.2513 | \n", "
| 21 | \n", "34.8446 | \n", "34.8446 | \n", "-17.0667 | \n", "-17.0667 | \n", "
| 22 | \n", "34.8446 | \n", "34.8446 | \n", "-17.0905 | \n", "-17.0905 | \n", "
| 23 | \n", "34.8446 | \n", "34.8446 | \n", "-27.0536 | \n", "-27.0536 | \n", "
| 24 | \n", "34.3071 | \n", "34.3071 | \n", "-25.0737 | \n", "-25.0737 | \n", "
| 25 | \n", "34.6544 | \n", "34.6544 | \n", "-28.2256 | \n", "-28.2256 | \n", "
| 26 | \n", "34.8125 | \n", "34.8125 | \n", "-30.9591 | \n", "-30.9591 | \n", "
| 27 | \n", "34.6544 | \n", "34.6544 | \n", "-24.1366 | \n", "-24.1366 | \n", "
| 28 | \n", "34.6544 | \n", "34.6544 | \n", "-19.8996 | \n", "-19.8996 | \n", "
| 29 | \n", "34.2147 | \n", "34.2147 | \n", "-26.7668 | \n", "-26.7668 | \n", "
| 30 | \n", "20.9823 | \n", "20.9823 | \n", "0.0000 | \n", "0.0000 | \n", "
| 31 | \n", "24.8047 | \n", "24.8047 | \n", "-11.0741 | \n", "-11.0741 | \n", "
| 32 | \n", "34.8446 | \n", "34.8446 | \n", "-14.3249 | \n", "-14.3249 | \n", "
| 33 | \n", "34.8446 | \n", "34.8446 | \n", "-14.2720 | \n", "-14.2720 | \n", "
| 34 | \n", "32.3065 | \n", "32.3065 | \n", "-9.5084 | \n", "-9.5084 | \n", "
| 35 | \n", "18.1575 | \n", "18.1575 | \n", "-3.0644 | \n", "-3.0644 | \n", "
| 36 | \n", "31.5502 | \n", "31.5502 | \n", "-12.8112 | \n", "-12.8112 | \n", "
| 37 | \n", "34.6544 | \n", "34.6544 | \n", "-9.0065 | \n", "-9.0065 | \n", "
| 38 | \n", "27.4344 | \n", "27.4344 | \n", "-22.5664 | \n", "-22.5664 | \n", "