{
 "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": [
       "[<matplotlib.lines.Line2D at 0x1caf15caca0>]"
      ]
     },
     "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
}
