{ "cells": [ { "cell_type": "code", "execution_count": 1, "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": 2, "metadata": {}, "outputs": [], "source": [ "#define constants\n", "\n", "#Turbine\n", "Q_nenn = 0.85 # m³/s\n", "p_nenn = pressure_conversion(10.6,'bar','Pa')\n", "closing_time = 480. #s\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.01\n", "Ti = 3600.\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 = 1e4 #s\n", "dt = 1e-2 # simulation timestep\n", "nt = int(t_max//dt) # number of simulation steps of reservoir in between timesteps of pipeline \n", "\n", "t_vec = np.arange(0,nt+1,1)*dt\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "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,conversion_pressure_unit)\n", "\n", "T1 = Francis_Turbine(Q_nenn,p_nenn,closing_time,dt)\n", "T1.set_steady_state(initial_influx,p0+offset_pressure)\n", "\n", "Pegelregler = PI_controller_class(target_level,deadband_range,Kp,Ti,dt)" ] }, { "cell_type": "code", "execution_count": 4, "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.get_current_LA()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0\n", "100.0\n", "200.0\n", "300.0\n", "400.0\n", "500.0\n", "600.0\n", "700.0\n", "800.0\n", "900.0\n", "1000.0\n", "1100.0\n", "1200.0\n", "1300.0\n", "1400.0\n", "1500.0\n", "1600.0\n", "1700.0\n", "1800.0\n", "1900.0\n", "2000.0\n", "2100.0\n", "2200.0\n", "2300.0\n", "2400.0\n", "2500.0\n", "2600.0\n", "2700.0\n", "2800.0\n", "2900.0\n", "3000.0\n", "3100.0\n", "3200.0\n", "3300.0\n", "3400.0\n", "3500.0\n", "3600.0\n", "3700.0\n", "3800.0\n", "3900.0\n", "4000.0\n", "4100.0\n", "4200.0\n", "4300.0\n", "4400.0\n", "4500.0\n", "4600.0\n", "4700.0\n", "4800.0\n", "4900.0\n", "5000.0\n", "5100.0\n", "5200.0\n", "5300.0\n", "5400.0\n", "5500.0\n", "5600.0\n", "5700.0\n", "5800.0\n", "5900.0\n", "6000.0\n", "6100.0\n", "6200.0\n", "6300.0\n", "6400.0\n", "6500.0\n", "6600.0\n", "6700.0\n", "6800.0\n", "6900.0\n", "7000.0\n", "7100.0\n", "7200.0\n", "7300.0\n", "7400.0\n", "7500.0\n", "7600.0\n", "7700.0\n", "7800.0\n", "7900.0\n", "8000.0\n", "8100.0\n", "8200.0\n", "8300.0\n", "8400.0\n", "8500.0\n", "8600.0\n", "8700.0\n", "8800.0\n", "8900.0\n", "9000.0\n", "9100.0\n", "9200.0\n", "9300.0\n", "9400.0\n", "9500.0\n", "9600.0\n", "9700.0\n", "9800.0\n", "9900.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 i == 0.4*(nt+1):\n", " V.set_influx(0.)\n", "\n", " p = V.get_current_pressure()\n", " Pegelregler.update_control_variable(V.level)\n", " LA_soll = Pegelregler.get_current_control_variable()\n", " T1.update_LA(LA_soll)\n", " T1.set_pressure(p+offset_pressure)\n", " LA_soll_vec[i] = LA_soll\n", " LA_ist_vec[i] = T1.get_current_LA()\n", " Q_vec[i] = T1.get_current_Q()\n", "\n", " \n", " V.set_outflux(Q_vec[i])\n", "\n", " V.timestep_reservoir_evolution() \n", " \n", " level_vec[i] = V.get_current_level()\n", " \n", " " ] }, { "cell_type": "code", "execution_count": 6, "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*initial_level,1.5*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" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig2 = plt.figure()\n", "plt.plot(t_vec,Pegelregler.get_error_history())" ] } ], "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 }