{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from Druckrohrleitung_class_file import Druckrohrleitung_class\n", "import matplotlib.pyplot as plt\n", "\n", "#importing pressure conversion function\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" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# define constants\n", "\n", " # for physics\n", "g = 9.81 # [m/s²] gravitational acceleration \n", "rho = 1000. # [kg/m³] density of water \n", "pUnit_calc = 'Pa' # [text] DO NOT CHANGE! for pressure conversion in print statements and plot labels \n", "pUnit_conv = 'mWS' # [text] for pressure conversion in print statements and plot labels\n", "\n", "\n", " # for Turbine\n", "Tur_Q_nenn = 0.85 # [m³/s] nominal flux of turbine \n", "Tur_p_nenn = pressure_conversion(10.6,'bar',pUnit_calc) # [Pa] nominal pressure of turbine \n", "Tur_closingTime = 90. # [s] closing time of turbine\n", "\n", "\n", " # for PI controller\n", "Con_targetLevel = 8. # [m]\n", "Con_K_p = 0.1 # [-] proportional constant of PI controller\n", "Con_T_i = 10. # [s] timespan in which a steady state error is corrected by the intergal term\n", "Con_deadbandRange = 0.05 # [m] Deadband range around targetLevel for which the controller does NOT intervene\n", "\n", "\n", " # for pipeline\n", "Pip_length = (535.+478.) # [m] length of pipeline\n", "Pip_dia = 0.9 # [m] diameter of pipeline\n", "Pip_area = Pip_dia**2/4*np.pi # [m²] crossectional area of pipeline\n", "Pip_head = 105. # [m] hydraulic head of pipeline without reservoir\n", "Pip_angle = np.arcsin(Pip_head/Pip_length) # [rad] elevation angle of pipeline \n", "Pip_n_seg = 50 # [-] number of pipe segments in discretization\n", "Pip_f_D = 0.014 # [-] Darcy friction factor\n", "Pip_pw_vel = 500. # [m/s] propagation velocity of the pressure wave (pw) in the given pipeline\n", " # derivatives of the pipeline constants\n", "Pip_dx = Pip_length/Pip_n_seg # [m] length of each pipe segment\n", "Pip_dt = Pip_dx/Pip_pw_vel # [s] timestep according to method of characteristics\n", "Pip_nn = Pip_n_seg+1 # [1] number of nodes\n", "Pip_x_vec = np.arange(0,Pip_nn,1)*Pip_dx # [m] vector holding the distance of each node from the upstream reservoir along the pipeline\n", "Pip_h_vec = np.arange(0,Pip_nn,1)*Pip_head/Pip_n_seg # [m] vector holding the vertival distance of each node from the upstream reservoir\n", "\n", "\n", " # for reservoir\n", "Res_area_base = 74. # [m²] total base are of the cuboid reservoir \n", "Res_area_out = Pip_area # [m²] outflux area of the reservoir, given by pipeline area\n", "Res_level_crit_lo = 0. # [m] for yet-to-be-implemented warnings\n", "Res_level_crit_hi = np.inf # [m] for yet-to-be-implemented warnings\n", "Res_dt_approx = 1e-3 # [s] approx. timestep of reservoir time evolution to ensure numerical stability (see Res_nt why approx.)\n", "Res_nt = max(1,int(Pip_dt//Res_dt_approx)) # [1] number of timesteps of the reservoir time evolution within one timestep of the pipeline\n", "Res_dt = Pip_dt/Res_nt # [s] harmonised timestep of reservoir time evolution\n", "\n", " # for general simulation\n", "flux_init = Tur_Q_nenn/1.1 # [m³/s] initial flux through whole system for steady state initialization \n", "level_init = Con_targetLevel # [m] initial water level in upstream reservoir for steady state initialization\n", "simTime_target = 600. # [s] target for total simulation time (will vary slightly to fit with Pip_dt)\n", "nt = int(simTime_target//Pip_dt) # [1] Number of timesteps of the whole system\n", "t_vec = np.arange(0,nt+1,1)*Pip_dt # [s] time vector. At each step of t_vec the system parameters are stored\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# create objects\n", "\n", "# Upstream reservoir\n", "reservoir = Ausgleichsbecken_class(Res_area_base,Res_area_out,Res_dt,Res_level_crit_lo,Res_level_crit_hi,rho)\n", "reservoir.set_steady_state(flux_init,level_init)\n", "\n", "# pipeline\n", "pipe = Druckrohrleitung_class(Pip_length,Pip_dia,Pip_n_seg,Pip_angle,Pip_f_D,Pip_pw_vel,Pip_dt,pUnit_conv,rho)\n", "pipe.set_steady_state(flux_init,level_init,Res_area_base,Pip_x_vec,Pip_h_vec)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "reservoir.get_info(full=True)\n", "pipe.get_info(full=True)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# initialization for timeloop\n", "\n", "level_vec = np.zeros_like(t_vec)\n", "level_vec[0] = reservoir.get_current_level()\n", "\n", "# prepare the vectors in which the pressure and velocity distribution in the pipeline from the previous timestep are stored\n", "v_old = pipe.get_current_velocity_distribution()\n", "p_old = pipe.get_current_pressure_distribution()\n", "\n", "# prepare the vectors in which the temporal evolution of the boundary conditions are stored\n", " # keep in mind, that the velocity at the turbine and the pressure at the reservoir are set manually and\n", " # through the time evolution of the reservoir respectively \n", " # the pressure at the turbine and the velocity at the reservoir are calculated from the method of characteristics\n", "v_boundary_res = np.zeros_like(t_vec)\n", "v_boundary_tur = np.zeros_like(t_vec)\n", "p_boundary_res = np.zeros_like(t_vec)\n", "p_boundary_tur = np.zeros_like(t_vec)\n", "\n", "# set the boundary conditions for the first timestep\n", "v_boundary_res[0] = v_old[0]\n", "v_boundary_tur[0] = v_old[-1] \n", "p_boundary_res[0] = p_old[0]\n", "p_boundary_tur[0] = p_old[-1]\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "%matplotlib qt5\n", "fig1,axs1 = plt.subplots(2,1)\n", "axs1[0].set_title('Pressure distribution in pipeline')\n", "axs1[0].set_xlabel(r'$x$ [$\\mathrm{m}$]')\n", "axs1[0].set_ylabel(r'$p$ [mWS]')\n", "axs1[0].set_ylim([0.9*np.min(pressure_conversion(p_old,'Pa',pUnit_conv)),1.1*np.max(pressure_conversion(p_old,'Pa',pUnit_conv))])\n", "lo_00, = axs1[0].plot(Pip_x_vec,pressure_conversion(p_old,'Pa',pUnit_conv),marker='.')\n", "\n", "axs1[1].set_title('Velocity distribution in pipeline')\n", "axs1[1].set_xlabel(r'$x$ [$\\mathrm{m}$]')\n", "axs1[1].set_ylabel(r'$v$ [m/s]')\n", "lo_01, = axs1[1].plot(Pip_x_vec,v_old,marker='.')\n", "axs1[1].autoscale()\n", "# axs1[1].set_ylim([0.9*np.min(v_old),1.1*np.max(v_boundary_res)])\n", "\n", "fig1.tight_layout()\n", "plt.pause(1)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[1;32my:\\KELAG\\KS\\KS-PW\\04 Digitalisierung\\KSPWDEV Server\\Digital Trainee Projekt\\DT_Slot_3_Project_Repo\\Druckrohrleitung\\Druckrohrleitung_test_steady_state.ipynb Cell 7\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 35\u001b[0m lo_01, \u001b[39m=\u001b[39m axs1[\u001b[39m1\u001b[39m]\u001b[39m.\u001b[39mplot(pl_vec,v_old,marker\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39m.\u001b[39m\u001b[39m'\u001b[39m,c\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mblue\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m 37\u001b[0m fig1\u001b[39m.\u001b[39msuptitle(\u001b[39mstr\u001b[39m(\u001b[39mround\u001b[39m(t_vec[it_pipe],\u001b[39m2\u001b[39m)) \u001b[39m+\u001b[39m \u001b[39m'\u001b[39m\u001b[39m/\u001b[39m\u001b[39m'\u001b[39m \u001b[39m+\u001b[39m \u001b[39mstr\u001b[39m(\u001b[39mround\u001b[39m(t_vec[\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m],\u001b[39m2\u001b[39m)))\n\u001b[1;32m---> 38\u001b[0m fig1\u001b[39m.\u001b[39;49mcanvas\u001b[39m.\u001b[39;49mdraw()\n\u001b[0;32m 39\u001b[0m fig1\u001b[39m.\u001b[39mtight_layout()\n\u001b[0;32m 40\u001b[0m plt\u001b[39m.\u001b[39mpause(\u001b[39m0.000001\u001b[39m)\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:436\u001b[0m, in \u001b[0;36mFigureCanvasAgg.draw\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 432\u001b[0m \u001b[39m# Acquire a lock on the shared font cache.\u001b[39;00m\n\u001b[0;32m 433\u001b[0m \u001b[39mwith\u001b[39;00m RendererAgg\u001b[39m.\u001b[39mlock, \\\n\u001b[0;32m 434\u001b[0m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtoolbar\u001b[39m.\u001b[39m_wait_cursor_for_draw_cm() \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtoolbar\n\u001b[0;32m 435\u001b[0m \u001b[39melse\u001b[39;00m nullcontext()):\n\u001b[1;32m--> 436\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mfigure\u001b[39m.\u001b[39;49mdraw(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mrenderer)\n\u001b[0;32m 437\u001b[0m \u001b[39m# A GUI class may be need to update a window using this draw, so\u001b[39;00m\n\u001b[0;32m 438\u001b[0m \u001b[39m# don't forget to call the superclass.\u001b[39;00m\n\u001b[0;32m 439\u001b[0m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39mdraw()\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\artist.py:73\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[1;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[0;32m 71\u001b[0m \u001b[39m@wraps\u001b[39m(draw)\n\u001b[0;32m 72\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdraw_wrapper\u001b[39m(artist, renderer, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m---> 73\u001b[0m result \u001b[39m=\u001b[39m draw(artist, renderer, \u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[0;32m 74\u001b[0m \u001b[39mif\u001b[39;00m renderer\u001b[39m.\u001b[39m_rasterizing:\n\u001b[0;32m 75\u001b[0m renderer\u001b[39m.\u001b[39mstop_rasterizing()\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\artist.py:50\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 47\u001b[0m \u001b[39mif\u001b[39;00m artist\u001b[39m.\u001b[39mget_agg_filter() \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 48\u001b[0m renderer\u001b[39m.\u001b[39mstart_filter()\n\u001b[1;32m---> 50\u001b[0m \u001b[39mreturn\u001b[39;00m draw(artist, renderer)\n\u001b[0;32m 51\u001b[0m \u001b[39mfinally\u001b[39;00m:\n\u001b[0;32m 52\u001b[0m \u001b[39mif\u001b[39;00m artist\u001b[39m.\u001b[39mget_agg_filter() \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\figure.py:2810\u001b[0m, in \u001b[0;36mFigure.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 2807\u001b[0m \u001b[39m# ValueError can occur when resizing a window.\u001b[39;00m\n\u001b[0;32m 2809\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpatch\u001b[39m.\u001b[39mdraw(renderer)\n\u001b[1;32m-> 2810\u001b[0m mimage\u001b[39m.\u001b[39;49m_draw_list_compositing_images(\n\u001b[0;32m 2811\u001b[0m renderer, \u001b[39mself\u001b[39;49m, artists, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49msuppressComposite)\n\u001b[0;32m 2813\u001b[0m \u001b[39mfor\u001b[39;00m sfig \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39msubfigs:\n\u001b[0;32m 2814\u001b[0m sfig\u001b[39m.\u001b[39mdraw(renderer)\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[1;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[39mif\u001b[39;00m not_composite \u001b[39mor\u001b[39;00m \u001b[39mnot\u001b[39;00m has_images:\n\u001b[0;32m 131\u001b[0m \u001b[39mfor\u001b[39;00m a \u001b[39min\u001b[39;00m artists:\n\u001b[1;32m--> 132\u001b[0m a\u001b[39m.\u001b[39;49mdraw(renderer)\n\u001b[0;32m 133\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 134\u001b[0m \u001b[39m# Composite any adjacent images together\u001b[39;00m\n\u001b[0;32m 135\u001b[0m image_group \u001b[39m=\u001b[39m []\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\artist.py:50\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 47\u001b[0m \u001b[39mif\u001b[39;00m artist\u001b[39m.\u001b[39mget_agg_filter() \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 48\u001b[0m renderer\u001b[39m.\u001b[39mstart_filter()\n\u001b[1;32m---> 50\u001b[0m \u001b[39mreturn\u001b[39;00m draw(artist, renderer)\n\u001b[0;32m 51\u001b[0m \u001b[39mfinally\u001b[39;00m:\n\u001b[0;32m 52\u001b[0m \u001b[39mif\u001b[39;00m artist\u001b[39m.\u001b[39mget_agg_filter() \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\axes\\_base.py:3082\u001b[0m, in \u001b[0;36m_AxesBase.draw\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 3079\u001b[0m a\u001b[39m.\u001b[39mdraw(renderer)\n\u001b[0;32m 3080\u001b[0m renderer\u001b[39m.\u001b[39mstop_rasterizing()\n\u001b[1;32m-> 3082\u001b[0m mimage\u001b[39m.\u001b[39;49m_draw_list_compositing_images(\n\u001b[0;32m 3083\u001b[0m renderer, \u001b[39mself\u001b[39;49m, artists, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mfigure\u001b[39m.\u001b[39;49msuppressComposite)\n\u001b[0;32m 3085\u001b[0m renderer\u001b[39m.\u001b[39mclose_group(\u001b[39m'\u001b[39m\u001b[39maxes\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m 3086\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstale \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[1;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[39mif\u001b[39;00m not_composite \u001b[39mor\u001b[39;00m \u001b[39mnot\u001b[39;00m has_images:\n\u001b[0;32m 131\u001b[0m \u001b[39mfor\u001b[39;00m a \u001b[39min\u001b[39;00m artists:\n\u001b[1;32m--> 132\u001b[0m a\u001b[39m.\u001b[39;49mdraw(renderer)\n\u001b[0;32m 133\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 134\u001b[0m \u001b[39m# Composite any adjacent images together\u001b[39;00m\n\u001b[0;32m 135\u001b[0m image_group \u001b[39m=\u001b[39m []\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\artist.py:50\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[1;34m(artist, renderer)\u001b[0m\n\u001b[0;32m 47\u001b[0m \u001b[39mif\u001b[39;00m artist\u001b[39m.\u001b[39mget_agg_filter() \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 48\u001b[0m renderer\u001b[39m.\u001b[39mstart_filter()\n\u001b[1;32m---> 50\u001b[0m \u001b[39mreturn\u001b[39;00m draw(artist, renderer)\n\u001b[0;32m 51\u001b[0m \u001b[39mfinally\u001b[39;00m:\n\u001b[0;32m 52\u001b[0m \u001b[39mif\u001b[39;00m artist\u001b[39m.\u001b[39mget_agg_filter() \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\axis.py:1170\u001b[0m, in \u001b[0;36mAxis.draw\u001b[1;34m(self, renderer, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1163\u001b[0m tick\u001b[39m.\u001b[39mdraw(renderer)\n\u001b[0;32m 1165\u001b[0m \u001b[39m# scale up the axis label box to also find the neighbors, not\u001b[39;00m\n\u001b[0;32m 1166\u001b[0m \u001b[39m# just the tick labels that actually overlap note we need a\u001b[39;00m\n\u001b[0;32m 1167\u001b[0m \u001b[39m# *copy* of the axis label box because we don't want to scale\u001b[39;00m\n\u001b[0;32m 1168\u001b[0m \u001b[39m# the actual bbox\u001b[39;00m\n\u001b[1;32m-> 1170\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_update_label_position(renderer)\n\u001b[0;32m 1172\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlabel\u001b[39m.\u001b[39mdraw(renderer)\n\u001b[0;32m 1174\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_update_offset_text_position(ticklabelBoxes, ticklabelBoxes2)\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\axis.py:2352\u001b[0m, in \u001b[0;36mYAxis._update_label_position\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 2348\u001b[0m \u001b[39mreturn\u001b[39;00m\n\u001b[0;32m 2350\u001b[0m \u001b[39m# get bounding boxes for this axis and any siblings\u001b[39;00m\n\u001b[0;32m 2351\u001b[0m \u001b[39m# that have been set by `fig.align_ylabels()`\u001b[39;00m\n\u001b[1;32m-> 2352\u001b[0m bboxes, bboxes2 \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_get_tick_boxes_siblings(renderer\u001b[39m=\u001b[39;49mrenderer)\n\u001b[0;32m 2354\u001b[0m x, y \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlabel\u001b[39m.\u001b[39mget_position()\n\u001b[0;32m 2355\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlabel_position \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mleft\u001b[39m\u001b[39m'\u001b[39m:\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\axis.py:1880\u001b[0m, in \u001b[0;36mAxis._get_tick_boxes_siblings\u001b[1;34m(self, renderer)\u001b[0m\n\u001b[0;32m 1878\u001b[0m \u001b[39mfor\u001b[39;00m ax \u001b[39min\u001b[39;00m grouper\u001b[39m.\u001b[39mget_siblings(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39maxes):\n\u001b[0;32m 1879\u001b[0m axis \u001b[39m=\u001b[39m \u001b[39mgetattr\u001b[39m(ax, \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00maxis_name\u001b[39m}\u001b[39;00m\u001b[39maxis\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m-> 1880\u001b[0m ticks_to_draw \u001b[39m=\u001b[39m axis\u001b[39m.\u001b[39;49m_update_ticks()\n\u001b[0;32m 1881\u001b[0m tlb, tlb2 \u001b[39m=\u001b[39m axis\u001b[39m.\u001b[39m_get_tick_bboxes(ticks_to_draw, renderer)\n\u001b[0;32m 1882\u001b[0m bboxes\u001b[39m.\u001b[39mextend(tlb)\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\axis.py:1053\u001b[0m, in \u001b[0;36mAxis._update_ticks\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1051\u001b[0m tick\u001b[39m.\u001b[39mset_label1(label)\n\u001b[0;32m 1052\u001b[0m tick\u001b[39m.\u001b[39mset_label2(label)\n\u001b[1;32m-> 1053\u001b[0m minor_locs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mget_minorticklocs()\n\u001b[0;32m 1054\u001b[0m minor_labels \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mminor\u001b[39m.\u001b[39mformatter\u001b[39m.\u001b[39mformat_ticks(minor_locs)\n\u001b[0;32m 1055\u001b[0m minor_ticks \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mget_minor_ticks(\u001b[39mlen\u001b[39m(minor_locs))\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\axis.py:1282\u001b[0m, in \u001b[0;36mAxis.get_minorticklocs\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1280\u001b[0m \u001b[39m\"\"\"Return this Axis' minor tick locations in data coordinates.\"\"\"\u001b[39;00m\n\u001b[0;32m 1281\u001b[0m \u001b[39m# Remove minor ticks duplicating major ticks.\u001b[39;00m\n\u001b[1;32m-> 1282\u001b[0m major_locs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmajor\u001b[39m.\u001b[39;49mlocator()\n\u001b[0;32m 1283\u001b[0m minor_locs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mminor\u001b[39m.\u001b[39mlocator()\n\u001b[0;32m 1284\u001b[0m transform \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_scale\u001b[39m.\u001b[39mget_transform()\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\ticker.py:2114\u001b[0m, in \u001b[0;36mMaxNLocator.__call__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 2112\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 2113\u001b[0m vmin, vmax \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maxis\u001b[39m.\u001b[39mget_view_interval()\n\u001b[1;32m-> 2114\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtick_values(vmin, vmax)\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\ticker.py:2122\u001b[0m, in \u001b[0;36mMaxNLocator.tick_values\u001b[1;34m(self, vmin, vmax)\u001b[0m\n\u001b[0;32m 2119\u001b[0m vmin \u001b[39m=\u001b[39m \u001b[39m-\u001b[39mvmax\n\u001b[0;32m 2120\u001b[0m vmin, vmax \u001b[39m=\u001b[39m mtransforms\u001b[39m.\u001b[39mnonsingular(\n\u001b[0;32m 2121\u001b[0m vmin, vmax, expander\u001b[39m=\u001b[39m\u001b[39m1e-13\u001b[39m, tiny\u001b[39m=\u001b[39m\u001b[39m1e-14\u001b[39m)\n\u001b[1;32m-> 2122\u001b[0m locs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_raw_ticks(vmin, vmax)\n\u001b[0;32m 2124\u001b[0m prune \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_prune\n\u001b[0;32m 2125\u001b[0m \u001b[39mif\u001b[39;00m prune \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mlower\u001b[39m\u001b[39m'\u001b[39m:\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\ticker.py:2061\u001b[0m, in \u001b[0;36mMaxNLocator._raw_ticks\u001b[1;34m(self, vmin, vmax)\u001b[0m\n\u001b[0;32m 2059\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_nbins \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mauto\u001b[39m\u001b[39m'\u001b[39m:\n\u001b[0;32m 2060\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maxis \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m-> 2061\u001b[0m nbins \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mclip(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49maxis\u001b[39m.\u001b[39;49mget_tick_space(),\n\u001b[0;32m 2062\u001b[0m \u001b[39mmax\u001b[39m(\u001b[39m1\u001b[39m, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_min_n_ticks \u001b[39m-\u001b[39m \u001b[39m1\u001b[39m), \u001b[39m9\u001b[39m)\n\u001b[0;32m 2063\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 2064\u001b[0m nbins \u001b[39m=\u001b[39m \u001b[39m9\u001b[39m\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\axis.py:2524\u001b[0m, in \u001b[0;36mYAxis.get_tick_space\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 2523\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mget_tick_space\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m-> 2524\u001b[0m ends \u001b[39m=\u001b[39m mtransforms\u001b[39m.\u001b[39;49mBbox\u001b[39m.\u001b[39;49mfrom_bounds(\u001b[39m0\u001b[39;49m, \u001b[39m0\u001b[39;49m, \u001b[39m1\u001b[39;49m, \u001b[39m1\u001b[39;49m)\n\u001b[0;32m 2525\u001b[0m ends \u001b[39m=\u001b[39m ends\u001b[39m.\u001b[39mtransformed(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39maxes\u001b[39m.\u001b[39mtransAxes \u001b[39m-\u001b[39m\n\u001b[0;32m 2526\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfigure\u001b[39m.\u001b[39mdpi_scale_trans)\n\u001b[0;32m 2527\u001b[0m length \u001b[39m=\u001b[39m ends\u001b[39m.\u001b[39mheight \u001b[39m*\u001b[39m \u001b[39m72\u001b[39m\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\transforms.py:820\u001b[0m, in \u001b[0;36mBbox.from_bounds\u001b[1;34m(x0, y0, width, height)\u001b[0m\n\u001b[0;32m 813\u001b[0m \u001b[39m@staticmethod\u001b[39m\n\u001b[0;32m 814\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mfrom_bounds\u001b[39m(x0, y0, width, height):\n\u001b[0;32m 815\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 816\u001b[0m \u001b[39m Create a new `Bbox` from *x0*, *y0*, *width* and *height*.\u001b[39;00m\n\u001b[0;32m 817\u001b[0m \n\u001b[0;32m 818\u001b[0m \u001b[39m *width* and *height* may be negative.\u001b[39;00m\n\u001b[0;32m 819\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 820\u001b[0m \u001b[39mreturn\u001b[39;00m Bbox\u001b[39m.\u001b[39;49mfrom_extents(x0, y0, x0 \u001b[39m+\u001b[39;49m width, y0 \u001b[39m+\u001b[39;49m height)\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\transforms.py:839\u001b[0m, in \u001b[0;36mBbox.from_extents\u001b[1;34m(minpos, *args)\u001b[0m\n\u001b[0;32m 822\u001b[0m \u001b[39m@staticmethod\u001b[39m\n\u001b[0;32m 823\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mfrom_extents\u001b[39m(\u001b[39m*\u001b[39margs, minpos\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m):\n\u001b[0;32m 824\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 825\u001b[0m \u001b[39m Create a new Bbox from *left*, *bottom*, *right* and *top*.\u001b[39;00m\n\u001b[0;32m 826\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 837\u001b[0m \u001b[39m scales where negative bounds result in floating point errors.\u001b[39;00m\n\u001b[0;32m 838\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 839\u001b[0m bbox \u001b[39m=\u001b[39m Bbox(np\u001b[39m.\u001b[39;49mreshape(args, (\u001b[39m2\u001b[39;49m, \u001b[39m2\u001b[39;49m)))\n\u001b[0;32m 840\u001b[0m \u001b[39mif\u001b[39;00m minpos \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 841\u001b[0m bbox\u001b[39m.\u001b[39m_minpos[:] \u001b[39m=\u001b[39m minpos\n", "File \u001b[1;32mc:\\ProgramData\\Anaconda3\\envs\\Georg_DT_Slot3\\lib\\site-packages\\matplotlib\\transforms.py:775\u001b[0m, in \u001b[0;36mBbox.__init__\u001b[1;34m(self, points, **kwargs)\u001b[0m\n\u001b[0;32m 768\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 769\u001b[0m \u001b[39mParameters\u001b[39;00m\n\u001b[0;32m 770\u001b[0m \u001b[39m----------\u001b[39;00m\n\u001b[0;32m 771\u001b[0m \u001b[39mpoints : ndarray\u001b[39;00m\n\u001b[0;32m 772\u001b[0m \u001b[39m A 2x2 numpy array of the form ``[[x0, y0], [x1, y1]]``.\u001b[39;00m\n\u001b[0;32m 773\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 774\u001b[0m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__init__\u001b[39m(\u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[1;32m--> 775\u001b[0m points \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39;49masarray(points, \u001b[39mfloat\u001b[39;49m)\n\u001b[0;32m 776\u001b[0m \u001b[39mif\u001b[39;00m points\u001b[39m.\u001b[39mshape \u001b[39m!=\u001b[39m (\u001b[39m2\u001b[39m, \u001b[39m2\u001b[39m):\n\u001b[0;32m 777\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39m'\u001b[39m\u001b[39mBbox points must be of the form \u001b[39m\u001b[39m'\u001b[39m\n\u001b[0;32m 778\u001b[0m \u001b[39m'\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m[[x0, y0], [x1, y1]]\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39m\u001b[39m'\u001b[39m)\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "for it_pipe in range(1,nt+1):\n", "# for each pipeline timestep, execute nt_eRK4 timesteps of the reservoir code\n", " # set initial conditions for the reservoir time evolution calculted with e-RK4\n", " reservoir.set_pressure(p_old[0],display_warning=False)\n", " reservoir.set_outflux(v_old[0]*Pip_area,display_warning=False)\n", " # calculate the time evolution of the reservoir level within each pipeline timestep to avoid runaway numerical error\n", " for it_res in range(Res_nt):\n", " reservoir.timestep_reservoir_evolution() \n", " level_vec[it_pipe] = reservoir.get_current_level() \n", "\n", " \n", " # set boundary conditions for the next timestep of the characteristic method\n", " p_boundary_res[it_pipe] = reservoir.get_current_pressure()\n", " v_boundary_tur[it_pipe] = flux_init/Pip_area\n", "\n", " # the the boundary conditions in the pipe.object and thereby calculate boundary pressure at turbine\n", " pipe.set_boundary_conditions_next_timestep(p_boundary_res[it_pipe],v_boundary_tur[it_pipe])\n", " p_boundary_tur[it_pipe] = pipe.get_current_pressure_distribution()[-1]\n", " v_boundary_res[it_pipe] = pipe.get_current_velocity_distribution()[0]\n", "\n", " # perform the next timestep via the characteristic method\n", " pipe.timestep_characteristic_method()\n", "\n", " # prepare for next loop\n", " p_old = pipe.get_current_pressure_distribution()\n", " v_old = pipe.get_current_velocity_distribution()\n", "\n", " # plot some stuff\n", " # remove line-objects to autoscale axes (there is definetly a better way, but this works ¯\\_(ツ)_/¯ )\n", " lo_00.remove()\n", " lo_01.remove()\n", " # lo_02.remove()\n", " # plot new pressure and velocity distribution in the pipeline\n", " lo_00, = axs1[0].plot(Pip_x_vec,pressure_conversion(p_old,'Pa', pUnit_conv),marker='.',c='blue')\n", " lo_01, = axs1[1].plot(Pip_x_vec,v_old,marker='.',c='blue')\n", " \n", " fig1.suptitle(str(round(t_vec[it_pipe],2)) + '/' + str(round(t_vec[-1],2)))\n", " fig1.canvas.draw()\n", " fig1.tight_layout()\n", " plt.pause(0.000001)\n", "\n", "reservoir.get_info(full=True)\n", "pipe.get_info(full=True)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "fig2,axs2 = plt.subplots(2,2)\n", "axs2[0,0].set_title('Pressure Reservoir')\n", "axs2[0,0].plot(t_vec,pressure_conversion(p_boundary_res,pUnit_calc,pUnit_conv))\n", "axs2[0,0].set_xlabel(r'$t$ [$\\mathrm{s}$]')\n", "axs2[0,0].set_ylabel(r'$p$ [mWS]')\n", "axs2[0,0].set_ylim([0.9*np.min(pressure_conversion(p_boundary_res,pUnit_calc,pUnit_conv)),1.1*np.max(pressure_conversion(p_boundary_res,pUnit_calc,pUnit_conv))])\n", "\n", "axs2[0,1].set_title('Velocity Reservoir')\n", "axs2[0,1].plot(t_vec,v_boundary_res)\n", "axs2[0,1].set_xlabel(r'$t$ [$\\mathrm{s}$]')\n", "axs2[0,1].set_ylabel(r'$v$ [$\\mathrm{m}/\\mathrm{s}$]')\n", "axs2[0,1].set_ylim([0.9*np.min(v_boundary_res),1.1*np.max(v_boundary_res)])\n", "\n", "axs2[1,0].set_title('Pressure Turbine')\n", "axs2[1,0].plot(t_vec,pressure_conversion(p_boundary_tur,pUnit_calc,pUnit_conv))\n", "axs2[1,0].set_xlabel(r'$t$ [$\\mathrm{s}$]')\n", "axs2[1,0].set_ylabel(r'$p$ [mWS]')\n", "axs2[1,0].set_ylim([0.9*np.min(pressure_conversion(p_boundary_tur,pUnit_calc,pUnit_conv)),1.1*np.max(pressure_conversion(p_boundary_tur,pUnit_calc,pUnit_conv))])\n", "\n", "axs2[1,1].set_title('Velocity Turbine')\n", "axs2[1,1].plot(t_vec,v_boundary_tur)\n", "axs2[1,1].set_xlabel(r'$t$ [$\\mathrm{s}$]')\n", "axs2[1,1].set_ylabel(r'$v$ [$\\mathrm{m}/\\mathrm{s}$]')\n", "axs2[1,1].set_ylim([0.95*np.min(v_boundary_tur),1.05*np.max(v_boundary_tur)])\n", "\n", "fig2.tight_layout()\n", "plt.show()" ] } ], "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 }