{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yNiFcBU9f34Q"
      },
      "source": [
        "### Libraries"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "j91ZRxA3f34Y",
        "outputId": "aa903630-ce23-496a-8c8c-499ad6c45f66"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Mounted at /content/drive\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "import os\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import glob\n",
        "import matplotlib.tri as tri\n",
        "import pandas as pd\n",
        "from PIL import Image\n",
        "from sklearn.preprocessing import MinMaxScaler\n",
        "import imageio\n",
        "from typing import Tuple, Union\n",
        "from torchsummary import summary\n",
        "from tqdm import tqdm as tqdm\n",
        "from sklearn.model_selection import train_test_split\n",
        "import torch.optim as optim\n",
        "import torch.nn.functional as F\n",
        "from torch.utils.data import DataLoader, TensorDataset\n",
        "import math\n",
        "from scipy.interpolate import interp1d\n",
        "from torch.utils.data import Dataset, DataLoader\n",
        "import copy\n",
        "from torchvision import transforms\n",
        "import torchvision\n",
        "import torch.nn.init as init\n",
        "from scipy.linalg import norm\n",
        "from skimage.transform import resize\n",
        "import shutil\n",
        "import cv2\n",
        "from scipy.linalg import svd\n",
        "import gzip\n",
        "\n",
        "import shutil\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive', force_remount=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "z6k9P75cf34a"
      },
      "source": [
        "### Load CFD Data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "id": "c-D8zzrRg9fy"
      },
      "outputs": [],
      "source": [
        "model = 'Sten' # or Sten\n",
        "bc_name = 'Mid' # or Wall\n",
        "state_lstm = 'load'  # train | load"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "id": "9QyXL92-f34c"
      },
      "outputs": [],
      "source": [
        "data = np.load(f'/content/drive/MyDrive/Paper/RoSo/{model}/{bc_name}/rylScty_patientSpec_StenosisModel_miduvw.npz')\n",
        "\n",
        "x = data['x']\n",
        "y = data['y']\n",
        "z = data['z']\n",
        "v_x = data['v_x']\n",
        "v_y = data['v_y']\n",
        "v_z = data['v_z']\n",
        "del data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "0dqGc54nf34d"
      },
      "outputs": [],
      "source": [
        "variable = v_z.T # (loc, time)\n",
        "variable_name = 'v_z'"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ob-RwiNyf34d"
      },
      "source": [
        "### General Model Info"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "zj4OeyScf34d"
      },
      "outputs": [],
      "source": [
        "n_snapshots = 999"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qyURirjMf34e"
      },
      "source": [
        "### Read BCs"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "id": "O6H0DvJZf34e"
      },
      "outputs": [],
      "source": [
        "df = pd.read_csv('/content/drive/MyDrive/Paper/RoSo/BC.csv')\n",
        "\n",
        "#Velocity Function Interpolation\n",
        "tv_values = df['t1'].tolist()\n",
        "v_values = df['v'].tolist()\n",
        "#Create interpolation function\n",
        "interp_func = interp1d(tv_values, v_values)\n",
        "# Generate 2000 uniform values\n",
        "uniform_tv_values = np.linspace(min(tv_values), max(tv_values), n_snapshots)\n",
        "interpolated_v_values = interp_func(uniform_tv_values)\n",
        "\n",
        "#Pressure Function Interpolation\n",
        "tp_values = df['t2'].tolist()\n",
        "tp_values = [x for x in tp_values if not math.isnan(x)]\n",
        "P_values = df['P'].tolist()\n",
        "P_values = [x for x in P_values if not math.isnan(x)]\n",
        "#Create interpolation function\n",
        "interp_func = interp1d(tp_values, P_values)\n",
        "#Generate 2000 uniform values\n",
        "uniform_tp_values = np.linspace(min(tp_values), max(tp_values), n_snapshots)\n",
        "interpolated_P_values = interp_func(uniform_tp_values)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "q7hVSxV9f34f"
      },
      "source": [
        "### POD"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "id": "kv-AckWaf34g",
        "outputId": "9ef4e867-019c-426c-e938-fb13aaeca0b9"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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fvmlrrvuOkv5/fffr/79+1u1nTBhgt0x7rvvPpuy/v37KzQ01Ok4Ro4cKX9/f5vyefPmKTU11W6for/vjz32mHx8+PgKlAf/xQCoEc6fP2/ZZe/JJ5+0qrvzzjvVuHFju/1K27zl+++/15YtW2zKAwICdMsttzjsFx4erhtuuMFu3fvvv2+3/I477nA4njP1nvLwww/bJLetWrWy2/a6665Tly5drMqaNWtm94Pf/v373RdkJYuNjdXJkye1efPmUtsV/4BdxDAMbdq0ya3xFBQU6MMPP7RbZ28To5YtW9qULVu2TKdPn7Yq++c//2l3zAEDBth8AA8ICNCgQYOcDblSNGjQQLGxsTZfxf8xyBX333+//Pz8rMqaN29u+ceP4n7++Webssr6PZXlj3/8o90YH374YT3xxBO67rrr9Msvv+ibb76xaePr62s3DrPZrLZt2zodQ2RkpO6//36b8szMTH388cd2y+fPny8fHx89/vjjTl8HwBUkfABqhH/+85/KyclRo0aNbFbDzGazw93cEhMTrXZ3LFlnT0xMjAICAkqNZ+3atUpKSlLTpk0tZWfOnNGePXvstreXDBT35JNPKikpSS+//HKp7apamzZtbMrq1atnt23Ryl5JdevWtSm7ePGiS3FVR47mjKOdSStq586ddn9+JpNJERERNuX2yvLz860S0ezsbO3evdvu9Rz9Xtu3b+9cwJVk8uTJOnz4sM2Xu3YRbdeund3ysLAwmzJ7q1aV8Xsqi8lk0sCBA+3WDR48WB999JG6d++u//znP3bbNGjQwOHdC+Vd0X3++eftlk+fPl2FhYVWZZ999pnS09PVu3dvxcTElOs6AEj4ANQQH330kaQr25Lb+0Dy+OOP270F0zAMS9+S9u7da7e8YcOGZcZTv359NWnSxCqWn376yWH7ssasVauWmjRpUq7bpqqCvZUCR4mNvbaS7K7wleeIgOoiKSlJ7777rvr166drr71WYWFhVtvdO7qVMC0tza1x7Nu3z255QECA3VvhatWqZbd98VuPjx8/rtzcXLvtHH3Qd+a/E29mLwGTZPfvj735XBm/p7I0a9bMcgtqaQ4dOmS3PDg42GGfolt6ndWlSxebFX/pylE1K1eutCoruhPjd7/7XbmuAeAKX08HAACu2rp1q37++WeZTCaHz+tdc8016tmzpzZs2GBT98knn2jChAk2H9TOnz9vdyxHH7zK4mg8V8b0NHtJtKPnaxw98+jtz+MYhqE333xTU6ZMsUmKfHx81LRpU/n7+ysrK0vJycl2+7uTo3mWk5Oja6+91qb8woULdtsXv1XQ0XNVkuMkoLwJgLcpa5W/LJXxeypLgwYNnGrn6Pdd8hbW4so619Ce559/XsOHD7cpnzZtmu655x5JV26H3bZtmyIjI22eMwTgHBI+AF5v5syZkq58cLb3QaksycnJWrVqleUDBlAeY8aM0V/+8herMpPJpEmTJumFF15QYGCgpCsHfrtrw5DSOEogDcPQkSNHnB7H2dtqHSUBFUkAqkLPnj3dnmRXRFX/niRZ5mJF5eXlOayryM/0/vvvt3tA/ddff639+/crLi7Osrr36KOPlppwAnDMu/9ZFcBV7+LFi/r8889dHqcoaSyufv36dttmZ2dX6BqOxnNlzNI4+gBWGdeqDuy938p+r6dOndJf//pXm/LHH39cr7/+ussfsCvC0TwLDAyUceU4Jqe+vvzyS0tfe89ZFnGUBFSHpKo6q4zfk7s4+n1fvnzZYZ+srKxyX8ff318jR460W/f3v/9dOTk5mjt3rkwmk81mXACcR8IHwKvNmzdPWVlZioiIUE5OTpkfjl566SW746xZs0YnT560KrO3IYlUvluonBnPlTEl+8/ASXL4zNW5c+cqfK3qoDzvt7Lf69q1a202mJCk3r17V+p1S+Nol9Ts7Gzl5+dXaExHu6lK0qVLl+yWZ2ZmVuhaV4vK+D25i6NNpM6ePauCggK7dRX9GzZq1Ci7K3f//Oc/9cknn+j8+fPq2bNnhe7eAHAFCR8Ar1Z0u8+IESMcfiAtztEzfgUFBZo9e7ZVmaMP7ceOHSt1U5Fz586pffv2at++vSZOnGgpj4yMdLiz38GDB0uNe9SoUWrfvr1uvvlmmwTD0SYMjp4RcrRTqLdwtPpg7/1W9nt19CHX3vNr7t6cxZEuXbo4fH7O3jl6xX377bd69dVX9eqrr1ptMhQQEKBOnTrZ7ePoZ/Dbb785GbFn/fbbb+rZs6d69uxZpTFXxu/JXRwdO5Ofn68DBw7YlBcWFlY4jkaNGtk9wuPSpUuWf6BjsxbANSR8ALzWzp079eOPP0qSw9uCSmrdurW6du1qt+7jjz+2SqY6dOig2267zaZdbm6u3fP5iqxbt04//vijfvzxR5st61988UW7fb7++muH4+Xl5WnevHn68ccfFRkZabPJSVBQkJo1a2bTz95ZdgcPHtR3333n8Fre4Prrr7dbbu+ss/nz51dqLI4+sNvb4dXehkEVGb/k6s8HH3ygrl276oEHHpB0ZQXU0TEkZW3h//777+uvf/2r3n//fZtdNkeMGGG3j6PdbH/44YdSr1VdZGdna9OmTdq0aVOV3u5cWb8nd2jRooW6detmt27x4sU2ZatXr3bpKBVHRzRkZ2erfv36dg97B+A8Ej4AXqtoda9nz55q0aKF0/0crfKdOHFCX331lVXZX//6V7vPYf3lL3+x+4xSTk6O3nnnHUlXbovq16+fVf0jjzxiN+FctGiRfv31V7txTZ48WRkZGZLk8By+Pn362JSdPHlSf/vb3yxxHj58WA8++KDdWxC9SUJCgt2t76dOnWq5LTc/P19/+9vftGDBgkqN5YYbbrBb/re//c2S8BiGoTlz5uiDDz4o9/j2EvmSK5mbN2/WN998Y7UD6Lhx4+yehzht2jSHz9zt2LFDixYtknTl3Mfw8HCr+uHDhys2Ntam3xdffGFzm19OTo7dxADWKuP35C7jx4+3Wz5lyhSr5wa/++47PfPMMy5dq3v37rrxxhvt1g0fPtzlHVGBqx0JHwCvdOnSJcuHeWdX94o8+OCDql27tt26oiSySKdOnfTPf/7T5nbRtWvX6tFHH7X6kH348GENGjRI+/btk7+/vz799FOb1Tiz2awvvvjC5vmdnJwc3XnnnVb/sp+Zmam//vWvevvttyVd+VdwR7dajR492u6HohdffFGhoaGKiYnRddddpxMnTjhcqfEWUVFRGjZsmE35vn37FB0drejoaNWrV08vvviiw2c23eW2226z+2zRmTNn1KFDB0VFRSkkJESPPvqo3dXisiQkJNiUHT582HKG2+7du7V8+XJJUnx8vKVN48aN9dlnn9kc97Fnzx4NGDDA6hbiy5cva8aMGerfv79ycnIUFxenSZMm2Vy3Vq1amjdvns2q45EjR/Tcc89ZnuVLTU3VI4884tJzqe7w888/6+uvvy7za+vWrR6LsTJ+T+7Su3dvvfLKKzblly9fVt++fRUZGammTZuqY8eOunjxoss70Dpa5eN2TsANDADwIjt27DBiY2ONxo0bG5IMSUZMTIwRGxtrxMbGltr35MmTlnYBAQGW/sW/zGazpc2OHTssfXft2mW0b9/epr3JZDIaNWpkREZGWsoaNmxoJCYmlhpLRkaG8bvf/c7w9fW1GTM0NNSIjo42/Pz8DEmGj4+P8eqrrxoFBQWljjlnzhzDbDbbfV+SjAYNGhhbtmwx3nrrLbv1UVFRRmxsrPHQQw9Zxiz6WdStW7fUPjt27LD8bmJiYuy2DQkJMWJjY43XX3/damx7PwNfX19L/eLFi23ea2pqqtG5c2eH71WS8cgjjxh5eXl26wIDA21+z3/7298sZc72MQzD+Pbbb406deo4jMPPz8945513jA0bNtitr1u3rsP5e+rUKSMqKsruPG3YsKHldfPmzY2UlBSb/nv27DE6dOhg97rh4eFWY0gy+vXrZ5w7d67UebZ9+3YjOjraZryAgACjadOmhp+fnxEQEGC88sor5X6/zirt9+7K19GjRy3XcHbuF81PV+azu35P5ZnDPXr0cOpnPX78eMvfIkdjLlmyxBgxYkSZP9PSZGVlGeHh4VZ9u3fv7lRfAKUj4QPgVRx9aC76Ks3Ro0fL9eFvw4YNNmOsX7/eGD16tNG5c2ejYcOGRkBAgBEQEGBERUUZffr0Mf7+978b6enpTr+fpKQkY+LEiUbfvn2NmJgYIyQkxDCbzUbdunWNTp06GS+//LLx008/OT3eDz/8YDz88MNG06ZNDX9/f6Nu3bpGu3btjDfeeMM4ffq0YRiGw4Sv6Kv4B8Hy/KzK+t0UfY0YMaJcY3/yySd232t2drbx3nvvGV27djVCQ0MtCceAAQOMZcuWOf0ein7PZf1cSpsbx48fN55//nnjuuuuMwIDA43g4GCjZcuWxrPPPmv5/Tnz87Hn3Llzxptvvml0797diIiIMPz9/S1zpEuXLsabb75pXLhwodR5sXbtWuPZZ581OnToYERERFiSsgYNGhg333yz8corrxjffPNNqWMUl5WVZXzwwQdG7969jYYNGxp+fn5GaGiocf311xvPPvusceTIkQq/X2eU57/j8nwVT07KOz9dnc+G4frvqTxzOCYmxumf96FDh4xXX33VuOGGG4w6deoYAQEBRvPmzY3HHnvM2LNnj2EYhvHQQw/ZvU7R3x1njB071umfFQDnmQyDg3IAAABQcffcc49WrFhhVebj46Pc3Fy7z9zak5SUpObNm6ugoEChoaE6ffq0w42RADiPZ/gAAABgY/369aXuSFycvU2nOnTo4HSyJ0lNmza1bED10EMPkewBbuLr6QAAAABQ/fTu3VuFhYU6deqUGjVq5LDdmTNn7B4DM3ToULvt//WvfykoKMjmuIW8vDx9//33ktisBXAnVvgAAABgl2EYmjx5cqltpkyZYnPcS8uWLfXcc8/ZbT98+HANHTrU5kzJTz75RMnJyerUqZPDYxoAlB8JHwAAABz629/+pqeeekqHDh2yKj969Kief/55/b//9/+symNiYvTll1+Wen5ebm6u3n77bcs5oevXr9frr78uSfrDH/7g5ncAXN3YtAUAAAA2atWqpezsbKuywMBANWjQQBkZGUpNTbWqM5vNevTRRzV58mTVr1/f4bgmk8nyfUhIiAICApSSkiJJeuSRRzRnzhw3vgsAJHwAAACwkZGRoS1btmj79u364YcfdPToUSUnJ+vSpUsyDEOhoaGKiIhQu3bt1L17dz344INq2LBhmeP+/e9/18aNG/XDDz/o9OnT8vf3V4sWLfS73/1OTzzxhHx8uAENcCcSPi/SsWNHnT59WpGRkdq0aZOnwwEAAADgIYZhKCMjQ1FRUaX+QwkJnxeJiorS6dOnPR0GAAAAgGoiKSlJTZo0cVjPsQxepOie90aNGunAgQMejSUvL09r165V79695efn59FY4H2YP3AF8wcVxdyBK5g/cEVlzJ/09HQ1bdpUISEhpbYj4fMiRQmfj4+PQkNDPRpLXl6egoKCFBoayh89lBvzB65g/qCimDtwBfMHrqjM+VN8IyR7eCoWAAAAAGooEj4AAAAAqKFI+AAAAACghvL6hK+wsFAffPCBQkNDZTKZdOzYMbeNnZycrNGjRys2NlaBgYGKjIxUv3799NVXXznV/+DBg3riiScUHR2twMBARUVF6YEHHtC3337rthgBAAAAwBGvTvj27dunW265Rc8995wyMjLcOvaOHTvUpk0bzZo1S08//bQ2b96s6dOnKykpSX369NG4ceNK7b9s2TJ16NBBy5cv17hx47RlyxZNnjxZ3377rbp3764PP/zQrfECAAAAQElem/C99dZbuvHGG2U2m/X73//erWOfO3dO/fv3V2pqqubPn6/XXntNXbp00aBBg7R582Y1bdpUEydO1Jw5c+z2379/v4YOHarc3Fx9+eWXevrpp9W5c2cNHz5cGzduVFBQ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Jk+erA4dOigkJER16tRRt27dNGPGDBUWFno6PHhYYWGhPvjgA4WGhspkMunYsWNO901OTtbo0aMVGxurwMBARUZGql+/fvrqq68qL2BUC3l5eVq8eLEeeeQRtWrVSsHBwQoMDFR0dLQGDRqkFStWlDlGWlqa/vCHPyguLk5BQUEKDw9XfHy8Fi5cWAXvAJ6Sk5OjlStX6sUXX1S3bt1Uv359+fr6KiQkRO3atdOLL76oI0eOlDoGcwclDR48WCaTyan/H2P+XL2K5khpX88995zD/lU6dwzASefOnTPatm1rSDJGjhxpbNmyxVi3bp1x7733GpKM+Ph4Iysry9NhwkN++ukno1u3boYky9fRo0ed6rt9+3ajbt26Rq1atYwpU6YY33zzjbFo0SKjXbt2hiRj7NixlRs8PCYpKclo3LixIcmIjo42pk2bZmzatMnYsWOH8e677xr169c3JBkDBw40srOz7Y5x6NAho2nTpoaPj48xduxYY/v27caqVauMHj16GJKMYcOGGQUFBVX8zlAVHnvsMUOSERoaavzhD38w1q5da3z77bfGokWLjN69exuSjICAAGPp0qV2+zN3UNJnn33m9P+PMX+ubpKMwMBAIzg42OHXyy+/bLdvVc8dEj44rWfPnoYkY/To0VblhYWFxoABAwxJxqOPPuqZ4OBRb775puHv72/ccsstxu9///tyJXxnz541wsPDDUk2H8ouXrxoNG3a1JBkfPrpp5UTPDxq7969hiSjSZMmxvnz523qf/zxR8PX19eQZDz77LM29dnZ2cZ1111nSDLee+89q7qcnByjU6dOhiRj/PjxlfUW4EEjRowwJBmbNm2yW9+vXz9DklGnTh0jMzPTqo65g5LOnTtnNGjQwKhdu3aZ/z/G/IEkY8OGDeXu54m5Q8IHpyxatMjyLxmpqak29T///LMhyTCZTMauXbuqPkB4VGhoqPHBBx8YhYWFxieffFKuhO+5554zJBk33XST3frp06cbkozIyEibD2zwfkUJ31//+leHbYYPH25ZqcnIyLCqe/fddw1JRlRUlJGfn2/Td/Xq1YYko1atWsapU6fcHj886w9/+IPRv39/h/ULFy60/D369ttvreqYOyjpwQcfNMLCwow//elPZf7/GPMHFU34PDF3eIYPTvnoo48kSfHx8apTp45NfVxcnOLi4mQYhmbP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fft2pf1Su+KqdtXPUl5eXggPD0d2djby8/Oxa9cuvPbaa6pXG8snjEREpMSEj4iI6oxnn30WxcXF0rZ8+XKpbNasWbKyli1bSmUXLlyQle3fv79a+zl27FjFlbxevXqpzqhpqQ4dOqgu5ZCXl6eIqS1IPmzYMGnf9FnHio6xZGHzAQMGKG4hvX79Oq5du6ZaXwiBgIAA9OjRA3FxcVJ869at6Nu3r+ycrVq1woQJE7B3715ERUUp2nqaxJKIqL5gwkdERHWW6XN4L730krR/8eJFXLp0CQDQpUsXuLu712i/dDqdYp25J1lovTy15xPT0tIUsRMnTshed+jQQVqMHQCCg4Oh0+lkddLT0xXtqE20Up6TkxPefPNNRfynn35SrR8fH4/k5GTk5OTIEuC8vDwcP34cMTExqscNHTpUEeN6fERElWPCR0REdZLBYEBycjKAR7d6+vv7S2Wmz3YFBgbWeN8AYPny5SgtLZW2yZMnP3WbkyZNQlBQkCy2ceNG2bIIUVFRUrILAA4ODoiKipLd4uru7o6wsDBZOzk5Odi7d6/0+urVq9i2bZtF/Vq9ejU8PT1lsY8//lhx9TE7O1uatGbp0qWqzyWGhoaqPptX/gqfnZ0d3njjDYv6R0RUn3GWTiIiqpN+//13aebJnj17yiYliY+Pl/ZNr/xVBeNyA8bF3uPi4lBWVgYAWLt2rVTPxsbG7LOCN27cwMqVKwGoX1lLT0+XzjNjxgx4eXkBeLTouHEtvzVr1kCv1yMjIwM+Pj4YMmQIrly5gn379kntdOzYEd999x169uypOMfixYtx+fJlbNiwQYoFBQVh1KhRcHFxQWxsLNq0aYPLly+r9s3Ly0taaN7V1RWJiYkYO3as9H4uXbqELl26YNiwYXjmmWfw119/4ciRI3j48CEWL16M+fPnq/5tbt26hcDAQPTt2xddu3aFra0tMjMzZVcb7e3tsWPHjgpnbCUiokc0wrhaLRERUR2ydu1aLFy4EACwYMECWbLVsmVL/Pvvv9BoNCgqKlJd9PtJmS7sXp6lH6mVLS9hKiEhAQMHDlRtY9u2bUhKSkJWVhaKi4uh0+ng7u4OX19fjBo1CqNHj4aNjU2F7SclJWHLli1ISUnBlStX0KhRI3Tq1Anjx4/HsGHD4O3trXqc2tIWBoMBsbGx2LNnD9LS0lBYWIg7d+6gcePG8PLywoABAxASEgIfHx9Fe3l5efjll19w6tQpZGRk4J9//sH169dRUlICrVYLV1dXdOzYEYGBgZg8eTKaN29u0d+PiKi+Y8JHRERERERkpfgMHxERERERkZViwkdERERERGSlmPARERERERFZKSZ8REREREREVooJHxERERERkZViwkdERERERGSlmPARERERERFZKSZ8REREREREVooJHxERERERkZViwkdERERERGSlmPARERERERFZKSZ8REREREREVooJHxERERERkZViwkdERERERGSl/g9T0Pu62UWqSgAAAABJRU5ErkJggg==",
            "text/plain": [
              "<Figure size 1000x600 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "U, S, VT = svd(variable, full_matrices=False)\n",
        "\n",
        "energy_retained = np.cumsum(S) / np.sum(S)\n",
        "\n",
        "\n",
        "plt.rc('font', family='DeJavu Serif', size=18)\n",
        "# plt.rcParams['font.family'] = 'Times New Roman'\n",
        "colors = sns.color_palette('deep', n_colors=100)\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.plot(energy_retained[:50], color=colors[0], linewidth=3, marker='D', markersize=5, markevery=1)\n",
        "\n",
        "ax = plt.gca()\n",
        "ax.spines['bottom'].set_linewidth(2)  # X-axis line width\n",
        "ax.spines['left'].set_linewidth(2)    # Y-axis line width\n",
        "\n",
        "plt.xlabel('# Modes', fontsize=20, weight='bold')\n",
        "plt.ylabel('Energy', fontsize=20, weight='bold')\n",
        "\n",
        "#plt.legend(frameon=True, edgecolor='black')\n",
        "# handles, labels = plt.gca().get_legend_handles_labels()\n",
        "# plt.legend(handles=handles, labels=labels, frameon=True, edgecolor='black', loc='upper center', bbox_to_anchor=(0.5, -0.15), fancybox=True, shadow=True, ncol=2)\n",
        "\n",
        "plt.grid(True)\n",
        "plt.axhline(y=0.99, linewidth=3, color=colors[1])\n",
        "plt.title('Accumulated Energy', fontsize=24, weight='bold')\n",
        "# plt.savefig('fig.jpg', dpi=400, bbox_inches='tight')\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gaDApmlSf34l"
      },
      "source": [
        "### Reduction"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ctXSPLzRf34l",
        "outputId": "a1506325-85a2-4a23-b9bd-a46038944f8f"
      },
      "outputs": [],
      "source": [
        "num_modes = 30  # correpsond to 99% energy\n",
        "\n",
        "# Energy content calculation\n",
        "total_energy = np.sum(S)\n",
        "retained_energy = np.sum(S[:num_modes])\n",
        "energy_content = retained_energy / total_energy * 100\n",
        "print(\"With\", num_modes, \"number of modes, the energy content is:\", energy_content)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "Z6VOqaEjf34l"
      },
      "outputs": [],
      "source": [
        "q = U[:,:num_modes].T @ variable\n",
        "\n",
        "variable_reconst = U[:,:num_modes] @ q\n",
        "\n",
        "RelErr1 = np.zeros((q.shape[1]))\n",
        "for t in range(q.shape[1]):\n",
        "        # print(t)\n",
        "        RelErr1[t] = (norm(variable[:,t] - variable_reconst[:,t])/norm(variable[:,t]) ) * 100"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "id": "2oQSlh77f34m"
      },
      "outputs": [],
      "source": [
        "np.savez(f'/content/drive/MyDrive/Paper/RoSo/{model}/{bc_name}/POD_data_{model}_{bc_name}_{variable_name}.npz', S=S, Reconst_error=RelErr1)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "id": "ZwCHnXRBf34m",
        "outputId": "7166bb63-54f4-44d5-e748-7942a45bda55"
      },
      "outputs": [],
      "source": [
        "plt.rc('font', family='DeJavu Serif', size=18)\n",
        "# plt.rcParams['font.family'] = 'Times New Roman'\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.plot(RelErr1, color=colors[3], linewidth=3)\n",
        "\n",
        "ax = plt.gca()\n",
        "ax.spines['bottom'].set_linewidth(2)  # X-axis line width\n",
        "ax.spines['left'].set_linewidth(2)    # Y-axis line width\n",
        "\n",
        "plt.xlabel('Snapshot', fontsize=20, weight='bold')\n",
        "plt.ylabel('L2 Norm Difference %', fontsize=20, weight='bold')\n",
        "\n",
        "plt.yscale('log')  # Set y-axis to logarithmic scale\n",
        "plt.xlim(0, 1000)  # X-axis range from 0 to 1\n",
        "plt.ylim(0.01, 100)  # Y-axis range from 0.01 to 100\n",
        "\n",
        "plt.yticks([0.01, 0.1, 1, 10, 100], fontsize=16, weight='normal')\n",
        "\n",
        "\n",
        "#plt.legend(frameon=True, edgecolor='black')\n",
        "# handles, labels = plt.gca().get_legend_handles_labels()\n",
        "# plt.legend(handles=handles, labels=labels, frameon=True, edgecolor='black', loc='upper center', bbox_to_anchor=(0.5, -0.15), fancybox=True, shadow=True, ncol=2)\n",
        "\n",
        "plt.grid(True)\n",
        "\n",
        "\n",
        "plt.title('Reconstruction Error', fontsize=24, weight='bold')\n",
        "\n",
        "# plt.savefig('fig.jpg', dpi=400, bbox_inches='tight')\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cktgziBff34m"
      },
      "source": [
        "# LSTM"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-8HDoX2bf34n"
      },
      "source": [
        "### Generating Input/Output Matrices"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "id": "j60BSVHGf34n"
      },
      "outputs": [],
      "source": [
        "t = np.linspace(1, n_snapshots, num=n_snapshots)\n",
        "inputt = np.concatenate((t.reshape(-1, 1), interpolated_v_values.reshape(-1, 1), interpolated_P_values.reshape(-1, 1), q.T), axis=1)\n",
        "outputt = np.copy(q).T"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mwk8XwbIf34n"
      },
      "source": [
        "### Scaling Input/Output Matrices"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "id": "kZrcP3cif34n"
      },
      "outputs": [],
      "source": [
        "min_vals_input = np.min(inputt, axis=0)\n",
        "max_vals_input = np.max(inputt, axis=0)\n",
        "input_scaled = inputt - min_vals_input[np.newaxis, :]\n",
        "input_scaled /= (max_vals_input - min_vals_input)[np.newaxis, :]\n",
        "\n",
        "min_vals_output = np.min(outputt, axis=0)\n",
        "max_vals_output = np.max(outputt, axis=0)\n",
        "output_scaled = outputt - min_vals_output[np.newaxis, :]\n",
        "output_scaled /= (max_vals_output - min_vals_output)[np.newaxis, :]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SKPpgg0Of34o"
      },
      "source": [
        "### Time Windowing (Sequencing)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "id": "hPKPvo_Kf34o"
      },
      "outputs": [],
      "source": [
        "time_window = 100\n",
        "\n",
        "x_train = []\n",
        "y_train = []\n",
        "\n",
        "for i in range(0,len(input_scaled) - time_window -1):\n",
        "    x_train.append( input_scaled[i : (i+time_window) , :] )\n",
        "    y_train.append( output_scaled[i+time_window,:])\n",
        "\n",
        "total_x = np.array(x_train)\n",
        "total_y = np.array(y_train)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pJiPrTGPf34o"
      },
      "source": [
        "### Train/Test Split"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "id": "shK2UYaof34o"
      },
      "outputs": [],
      "source": [
        "Test_split = 0.8\n",
        "\n",
        "x_train = total_x[:int(Test_split * total_x.shape[0]),:,:]\n",
        "y_train = total_y[:int(Test_split * total_y.shape[0])]\n",
        "\n",
        "x_test = total_x[int(Test_split * total_x.shape[0]):, :,:]\n",
        "y_test = total_y[int(Test_split * total_y.shape[0]):]\n",
        "\n",
        "# Convert data to PyTorch tensors\n",
        "x_train = torch.tensor(x_train, dtype=torch.float32)\n",
        "y_train = torch.tensor(y_train, dtype=torch.float32)\n",
        "x_test = torch.tensor(x_test, dtype=torch.float32)\n",
        "y_test = torch.tensor(y_test, dtype=torch.float32)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "d27e7H1Af34o"
      },
      "source": [
        "### LSTM Network"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "82CyZz2mf34p",
        "outputId": "22b4fb08-4e06-4362-e233-403f02cd309b"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Using device: cpu\n"
          ]
        }
      ],
      "source": [
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.init as init\n",
        "\n",
        "# Device setup\n",
        "device = torch.device('cpu') if state_lstm=='load' else torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
        "print(f'Using device: {device}')\n",
        "\n",
        "# Hyperparameters\n",
        "input_size = num_modes + 3  # 3 = (t & v & P)\n",
        "hidden_size = 512\n",
        "output_size = num_modes\n",
        "sequence_length = time_window\n",
        "learning_rate = 0.00001\n",
        "num_epochs = 200000\n",
        "batch_size = 20\n",
        "early_stop_patience = 100\n",
        "dropout_prob = 0.2\n",
        "\n",
        "# LSTMNet definition\n",
        "class LSTMNet(nn.Module):\n",
        "    def __init__(self, input_size, hidden_size, output_size, dropout_prob):\n",
        "        super(LSTMNet, self).__init__()\n",
        "        self.hidden_size = hidden_size\n",
        "        self.lstm1 = nn.LSTM(input_size, hidden_size, num_layers=3, batch_first=True, dropout=dropout_prob)\n",
        "        self.fc1 = nn.Linear(hidden_size, output_size)\n",
        "\n",
        "        # Initialize LSTM weights\n",
        "        for name, param in self.lstm1.named_parameters():\n",
        "            if 'weight' in name:\n",
        "                init.xavier_normal_(param)\n",
        "            elif 'bias' in name:\n",
        "                init.constant_(param, 0.0)\n",
        "\n",
        "        # Initialize linear layer weights\n",
        "        init.xavier_normal_(self.fc1.weight)\n",
        "        init.constant_(self.fc1.bias, 0.0)\n",
        "\n",
        "    def forward(self, x):\n",
        "        h01 = torch.zeros(3, x.size(0), self.hidden_size, device=device).requires_grad_()\n",
        "        c01 = torch.zeros(3, x.size(0), self.hidden_size, device=device).requires_grad_()\n",
        "        out1, (h01, c01) = self.lstm1(x, (h01.detach(), c01.detach()))\n",
        "        out = nn.functional.relu(self.fc1(out1[:, -1, :]))\n",
        "        return out\n",
        "\n",
        "model_lstm = LSTMNet(input_size, hidden_size, output_size, dropout_prob).to(device)\n",
        "\n",
        "criterion = nn.MSELoss()\n",
        "optimizer = torch.optim.Adam(model_lstm.parameters(), lr=learning_rate)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "03St5AYaf34p"
      },
      "source": [
        "### Train"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "id": "0H2ANCbN2Efl"
      },
      "outputs": [],
      "source": [
        "# Move the Data to GPU\n",
        "x_train = x_train.to(device)\n",
        "y_train = y_train.to(device)\n",
        "x_test = x_test.to(device)\n",
        "y_test = y_test.to(device)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 25,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WcuV_oGVf34p",
        "outputId": "8b2b43e1-ef07-4cdb-f0b2-90dd4452719d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Model is loaded completely!\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "<ipython-input-25-796ce0277df3>:48: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
            "  state_dict = torch.load(f'/content/drive/MyDrive/Paper/RoSo/{model}/{bc_name}/{name}', map_location=torch.device('cpu'))\n"
          ]
        }
      ],
      "source": [
        "name = f'LSTMNet_{model}_{bc_name}_{variable_name}.pt'\n",
        "\n",
        "best_loss = float('inf')\n",
        "early_stop_count = 0\n",
        "\n",
        "if state_lstm == 'train':\n",
        "    for epoch in range(num_epochs):\n",
        "        model_lstm.train()\n",
        "        for i in range(0, x_train.shape[0], batch_size):\n",
        "            batch_x = x_train[i:i+batch_size]\n",
        "            batch_y = y_train[i:i+batch_size]\n",
        "\n",
        "            # Forward pass\n",
        "            outputs = model_lstm(batch_x)\n",
        "\n",
        "            # Compute loss and backpropagation\n",
        "            loss = criterion(outputs, batch_y)\n",
        "            optimizer.zero_grad()\n",
        "            loss.backward()\n",
        "            optimizer.step()\n",
        "\n",
        "        # Evaluate the model on training and test data\n",
        "        with torch.no_grad():\n",
        "            model_lstm.eval()\n",
        "            train_outputs = model_lstm(x_train)\n",
        "            train_loss = criterion(train_outputs, y_train)\n",
        "            test_outputs = model_lstm(x_test)\n",
        "            test_loss = criterion(test_outputs, y_test)\n",
        "\n",
        "        # Print training and test loss every epoch\n",
        "        print('Epoch [{}/{}], Train Loss: {:.6f}, Test Loss: {:.6f}'.format(epoch+1, num_epochs, train_loss.item(), test_loss.item()))\n",
        "\n",
        "        # Check if the current test loss is the best so far\n",
        "        if test_loss < best_loss:\n",
        "            best_loss = test_loss\n",
        "            early_stop_count = 0\n",
        "\n",
        "            torch.save(model_lstm.state_dict(), name)\n",
        "            shutil.copy(name, f'/content/drive/MyDrive/Paper/RoSo/{model}/{bc_name}/')\n",
        "\n",
        "        else:\n",
        "            early_stop_count += 1\n",
        "            if early_stop_count == early_stop_patience:\n",
        "                print('Early stopping after {} epochs'.format(epoch+1))\n",
        "                break\n",
        "\n",
        "elif state_lstm == 'load':\n",
        "    state_dict = torch.load(f'/content/drive/MyDrive/Paper/RoSo/{model}/{bc_name}/{name}', map_location=torch.device('cpu'))\n",
        "    model_lstm.load_state_dict(state_dict)\n",
        "    model_lstm = model_lstm.to(torch.device('cpu'))\n",
        "\n",
        "    # Recheck the model is loaded completely!\n",
        "    missing_keys, unexpected_keys = model_lstm.load_state_dict(state_dict, strict=False)\n",
        "    if missing_keys or unexpected_keys:\n",
        "        print(\"Missing keys:\", missing_keys)\n",
        "        print(\"Unexpected keys:\", unexpected_keys)\n",
        "    else:\n",
        "        print(\"Model is loaded completely!\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "S8MKhkfaf34p"
      },
      "source": [
        "### Inference"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 26,
      "metadata": {
        "id": "o4t4mH-2f34p"
      },
      "outputs": [],
      "source": [
        "model_lstm.eval()\n",
        "with torch.no_grad():\n",
        "    x = x_test[0:1,:,:].cpu()\n",
        "    predict = model_lstm(x)\n",
        "    pred_final = []\n",
        "\n",
        "    for i in range (1,x_test.shape[0]):\n",
        "        pred_final.append(predict)\n",
        "        x = x_test[i:i+1, :, :]\n",
        "        x = x.to(device)\n",
        "        predict = model_lstm(x)\n",
        "\n",
        "pred_final = torch.cat(pred_final, dim=0).cpu().detach().numpy()"
      ]
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "collapsed_sections": [
        "yNiFcBU9f34Q",
        "z6k9P75cf34a",
        "ob-RwiNyf34d",
        "qyURirjMf34e",
        "q7hVSxV9f34f",
        "gaDApmlSf34l",
        "-8HDoX2bf34n",
        "mwk8XwbIf34n",
        "SKPpgg0Of34o",
        "pJiPrTGPf34o",
        "d27e7H1Af34o"
      ],
      "gpuType": "A100",
      "machine_shape": "hm",
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "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.11.5"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
