{ "cells": [ { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from Regler_class_file import PI_controller_class\n", "\n", "#importing Druckrohrleitung\n", "import sys\n", "import os\n", "current = os.path.dirname(os.path.realpath('Main_Programm.ipynb'))\n", "parent = os.path.dirname(current)\n", "sys.path.append(parent)\n", "from functions.pressure_conversion import pressure_conversion\n", "from Ausgleichsbecken.Ausgleichsbecken_class_file import Ausgleichsbecken_class\n", "from Turbinen.Turbinen_class_file import Francis_Turbine" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "#define constants\n", "\n", "#Turbine\n", "Q_nenn = 0.85\n", "p_nenn,_ = pressure_conversion(10.6,'bar','Pa')\n", "\n", "# physics\n", "g = 9.81 # gravitational acceleration [m/s²]\n", "rho = 1000. # density of water [kg/m³]\n", "\n", "# define controller constants\n", "target_level = 8. # m\n", "Kp = 0.1\n", "Ti = 100.\n", "deadband_range = 0.05 # m\n", "\n", "# reservoir\n", "initial_level = target_level\n", "initial_influx = Q_nenn/2 # initial influx of volume to the reservoir [m³/s]\n", "initial_pressure_unit = 'Pa' # DO NOT CHANGE! for pressure conversion in print statements and plot labels \n", "conversion_pressure_unit = 'bar' # for pressure conversion in print statements and plot labels\n", "area_base = 74. # total base are of the cuboid reservoir [m²] \n", "area_outflux = 1. # outflux area of the reservoir, given by pipeline area [m²]\n", "critical_level_low = 0. # for yet-to-be-implemented warnings[m]\n", "critical_level_high = np.inf # for yet-to-be-implemented warnings[m]\n", "\n", "p0 = rho*g*initial_level-0.5*rho*(initial_influx/area_outflux)**2\n", "\n", "# offset the pressure in front of the turbine to get realisitc fluxes\n", "h_fict = 100\n", "offset_pressure = rho*g*h_fict\n", "\n", "t_max = 1e3 #s\n", "nt = int(1e6) # number of simulation steps of reservoir in between timesteps of pipeline \n", "dt = t_max/nt\n", "\n", "t_vec = np.arange(0,nt+1,1)*dt\n", "\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "# create objects\n", "\n", "V = Ausgleichsbecken_class(area_base,area_outflux,critical_level_low,critical_level_high,dt)\n", "V.set_steady_state(initial_influx,initial_level,initial_pressure_unit,conversion_pressure_unit)\n", "\n", "T1 = Francis_Turbine(Q_nenn,p_nenn)\n", "T1.set_steady_state(initial_influx,p0+offset_pressure)\n", "T1.set_closing_time(500)\n", "\n", "Pegelregler = PI_controller_class(target_level,deadband_range,Kp,Ti,dt)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "level_vec = np.full(nt+1,V.level)\n", "LA_ist_vec = np.full(nt+1,T1.LA)\n", "LA_soll_vec = np.full(nt+1,T1.LA)\n", "Q_vec = np.full(nt+1,initial_influx)\n", "\n", "Pegelregler.control_variable = T1.LA" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0\n", "10.0\n", "20.0\n", "30.0\n", "40.0\n", "50.0\n", "60.0\n", "70.0\n", "80.0\n", "90.0\n", "100.0\n", "110.0\n", "120.0\n", "130.0\n", "140.0\n", "150.0\n", "160.0\n", "170.0\n", "180.0\n", "190.0\n", "200.0\n", "210.0\n", "220.0\n", "230.0\n", "240.0\n", "250.0\n", "260.0\n", "270.0\n", "280.0\n", "290.0\n", "300.0\n", "310.0\n", "320.0\n", "330.0\n", "340.0\n", "350.0\n", "360.0\n", "370.0\n", "380.0\n", "390.0\n", "400.0\n", "410.0\n", "420.0\n", "430.0\n", "440.0\n", "450.0\n", "460.0\n", "470.0\n", "480.0\n", "490.0\n", "500.0\n", "510.0\n", "520.0\n", "530.0\n", "540.0\n", "550.0\n", "560.0\n", "570.0\n", "580.0\n", "590.0\n", "600.0\n", "610.0\n", "620.0\n", "630.0\n", "640.0\n", "650.0\n", "660.0\n", "670.0\n", "680.0\n", "690.0\n", "700.0\n", "710.0\n", "720.0\n", "730.0\n", "740.0\n", "750.0\n", "760.0\n", "770.0\n", "780.0\n", "790.0\n", "800.0\n", "810.0\n", "820.0\n", "830.0\n", "840.0\n", "850.0\n", "860.0\n", "870.0\n", "880.0\n", "890.0\n", "900.0\n", "910.0\n", "920.0\n", "930.0\n", "940.0\n", "950.0\n", "960.0\n", "970.0\n", "980.0\n", "990.0\n", "1000.0\n" ] } ], "source": [ "# time loop\n", "\n", "for i in range(nt+1):\n", "\n", " if np.mod(i,1e4) == 0:\n", " print(t_vec[i])\n", "\n", " if t_vec[i] == 0.4*np.max(t_vec):\n", " V.influx = 0\n", "\n", " p = rho*g*V.level-0.5*rho*(V.outflux_vel)**2\n", "\n", " LA_soll = Pegelregler.get_control_variable(V.level)\n", " T1.change_LA(LA_soll,dt)\n", " LA_soll_vec[i] = LA_soll\n", " LA_ist_vec[i] = T1.LA\n", " Q_vec[i] = T1.get_Q(p+offset_pressure)\n", "\n", " V.pressure = p\n", " V.outflux_vel = 1/V.area_outflux*Q_vec[i]\n", "\n", " V.e_RK_4() \n", " V.level = V.update_level(V.timestep) \n", " V.set_volume() \n", " level_vec[i] = V.level \n", " \n", " " ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "%matplotlib qt5\n", "# time loop\n", "\n", "# create a figure and subplots to display the velocity and pressure distribution across the pipeline in each pipeline step\n", "fig1,axs1 = plt.subplots(3,1)\n", "axs1[0].set_title('Level')\n", "axs1[0].set_xlabel(r'$t$ [$\\mathrm{s}$]')\n", "axs1[0].set_ylabel(r'$h$ [$\\mathrm{m}$]')\n", "axs1[0].plot(t_vec,level_vec)\n", "axs1[0].set_ylim([0.85*initial_level,1.05*initial_level])\n", "axs1[1].set_title('Flux')\n", "axs1[1].set_xlabel(r'$t$ [$\\mathrm{s}$]')\n", "axs1[1].set_ylabel(r'$Q$ [$\\mathrm{m} / \\mathrm{s}^3$]')\n", "axs1[1].plot(t_vec,Q_vec)\n", "axs1[1].set_ylim([0,2*initial_influx])\n", "axs1[2].set_title('LA')\n", "axs1[2].set_xlabel(r'$t$ [$\\mathrm{s}$]')\n", "axs1[2].set_ylabel(r'$LA$ [\\%]')\n", "axs1[2].plot(t_vec,LA_soll_vec)\n", "axs1[2].plot(t_vec,LA_ist_vec)\n", "axs1[2].set_ylim([0,1])\n", "fig1.tight_layout()\n", "fig1.show()\n", "plt.pause(1)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig2 = plt.figure()\n", "plt.plot(t_vec,Pegelregler.error_history[1:])" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[8. 8. 8. ... 7.21126138 7.21126138 7.21126138]\n" ] } ], "source": [ "print(level_vec[:])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.13 ('Georg_DT_Slot3')", "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.8.13" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "84fb123bdc47ab647d3782661abcbe80fbb79236dd2f8adf4cef30e8755eb2cd" } } }, "nbformat": 4, "nbformat_minor": 2 }