{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Security-Constrained Optimisation\n", "\n", "In this example, the dispatch of generators is optimised using the security-constrained linear OPF, to guaranteed that no branches are overloaded by certain branch outages." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pypsa, os\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "network = pypsa.examples.scigrid_de(from_master=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are some infeasibilities without line extensions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for line_name in [\"316\", \"527\", \"602\"]:\n", " network.lines.loc[line_name, \"s_nom\"] = 1200\n", "\n", "now = network.snapshots[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Performing security-constrained linear OPF" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "branch_outages = network.lines.index[:15]\n", "network.sclopf(now, branch_outages=branch_outages, solver_name=\"cbc\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the PF, set the P to the optimised P." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "network.generators_t.p_set = network.generators_t.p_set.reindex(\n", " columns=network.generators.index\n", ")\n", "network.generators_t.p_set.loc[now] = network.generators_t.p.loc[now]\n", "\n", "network.storage_units_t.p_set = network.storage_units_t.p_set.reindex(\n", " columns=network.storage_units.index\n", ")\n", "network.storage_units_t.p_set.loc[now] = network.storage_units_t.p.loc[now]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check no lines are overloaded with the linear contingency analysis" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "p0_test = network.lpf_contingency(now, branch_outages=branch_outages)\n", "p0_test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check loading as per unit of s_nom in each contingency" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "max_loading = (\n", " abs(p0_test.divide(network.passive_branches().s_nom, axis=0)).describe().loc[\"max\"]\n", ")\n", "max_loading" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "np.allclose(max_loading, np.ones((len(max_loading))))" ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "", "language": "python", "name": "" }, "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.8.5" } }, "nbformat": 4, "nbformat_minor": 1 }