{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f610bd4b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-09-05T15:18:08.563461Z",
     "iopub.status.busy": "2024-09-05T15:18:08.562484Z",
     "iopub.status.idle": "2024-09-05T15:18:09.606266Z",
     "shell.execute_reply": "2024-09-05T15:18:09.604956Z",
     "shell.execute_reply.started": "2024-09-05T15:18:08.563387Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib widget\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.animation import FuncAnimation\n",
    "#from IPython.display import HTML"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3e8aaf17",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-09-05T15:18:09.607883Z",
     "iopub.status.busy": "2024-09-05T15:18:09.607500Z",
     "iopub.status.idle": "2024-09-05T15:18:09.767424Z",
     "shell.execute_reply": "2024-09-05T15:18:09.765442Z",
     "shell.execute_reply.started": "2024-09-05T15:18:09.607829Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1cec99713fcb4011b4fa2e6f8661f590",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "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",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='data:image/png;base64,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' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "A = 1.0                 # Amplitude of the wave\n",
    "phi = 0.0               # initial phase\n",
    "lambda_ = 3.0           # wavelength\n",
    "k = 2 * np.pi / lambda_ # wave number\n",
    "\n",
    "Lx, Ly = 10.0, 10.0     # length of the domain in x and y directions\n",
    "Nx, Ny = 200, 200       # number of grid points in x and y directions\n",
    "x = np.linspace(0, Lx, Nx)\n",
    "y = np.linspace(0, Ly, Ny)\n",
    "X, Y = np.meshgrid(x, y)\n",
    "\n",
    "theta = np.pi / 4      # direction of  propagation (in radians)\n",
    "kx = k * np.cos(theta) # wave number in x direction\n",
    "ky = k * np.sin(theta) # wave number in y direction\n",
    "\n",
    "T = 40.0              # period of the wave\n",
    "omega = 2 * np.pi / T # angular frequency\n",
    "dt = 0.01             # time step\n",
    "total_time = 10.0     # total time for the simulation\n",
    "\n",
    "# prepare the plot\n",
    "fig, ax = plt.subplots()\n",
    "img = ax.imshow(np.zeros((Nx, Ny)), extent=(0, Lx, 0, Ly), vmin=-A, vmax=A, cmap='RdBu')\n",
    "\n",
    "def update(t):\n",
    "    psi = A * np.cos(kx * X + ky * Y - omega * t + phi) # wave function\n",
    "    \n",
    "    img.set_array(psi)\n",
    "    return [img]\n",
    "\n",
    "ani = FuncAnimation(fig, update, frames=int(total_time/dt), interval=20, blit=True)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f095b2fb",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python3",
   "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.12.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
