{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "776cf2dc-0c2a-4e05-911d-17cc8ad95f38",
   "metadata": {},
   "source": [
    "# Group delay calculation from FDTD and mode solver\n",
    "\n",
    "**Group delay** is a measure of the time it takes for the envelope of a modulated signal (or a pulse) to propagate through a device. Mathematically, group delay is defined as the derivative of the phase response with respect to angular frequency:\n",
    "\n",
    "$$\n",
    "\\tau_g(\\omega) = \\frac{d\\phi(\\omega)}{d\\omega}\n",
    "$$\n",
    "\n",
    "where $\\phi(\\omega)$ is the phase of the S-parameter at angular frequency $\\omega$. Group delay provides insight into the dispersion and temporal distortion experienced by signals, and is particularly important in high-speed communication systems and photonics, where preserving the shape and timing of signals is crucial.\n",
    "\n",
    "This notebook demonstrates the group delay calculation using both FDTD and mode solver on the example of a waveguide bend. Both methods yield a consistent result. FDTD has the advantage of being more general as this approach works for the group delay calculation of any device. The mode solver-based approach only works for certain devices where the propagating mode is well defined. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "09b10cad-5f41-4493-b308-3c19290ffe06",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gdstk\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tidy3d as td\n",
    "import tidy3d.web as web"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f4c4c08-15c3-4ac5-b4e4-1505611c9ea8",
   "metadata": {},
   "source": [
    "## FDTD Approach\n",
    "\n",
    "### Simulation Setup\n",
    "\n",
    "First we will use FDTD to extract the group delay on the waveguide bend. To start, we define the relevant wavelength and frequency ranges. Although it's technically not necessary, it's more convenient to define the frequency array in an equal spacing and increasing order. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a6e313af-eedc-48f0-bf95-0bbb99a8ec35",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define wavelength and frequency ranges\n",
    "lda0 = 1.55\n",
    "lda_min = 1.5\n",
    "lda_max = 1.6\n",
    "\n",
    "freqs = np.linspace(td.C_0 / lda_max, td.C_0 / lda_min, 101)\n",
    "ldas = td.C_0 / freqs\n",
    "fwidth = 0.5 * (np.max(freqs) - np.min(freqs))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fcccba9e-fa1b-4c02-a301-b4ba78d3474a",
   "metadata": {},
   "source": [
    "We will focus on the case of a single-mode silicon waveguide with oxide cladding. For simplicity we will use the materials from the built-in [material library](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/material_library.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "01a0a885-cb9c-4c24-8a6c-b61b48fd0f3a",
   "metadata": {},
   "outputs": [],
   "source": [
    "si = td.material_library[\"cSi\"][\"Palik_Lossless\"]\n",
    "sio2 = td.material_library[\"SiO2\"][\"Palik_Lossless\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72045da7-166f-4c97-bb29-2e686a64bbfb",
   "metadata": {},
   "source": [
    "Define the geometry parameters. We will define our ports on the straight waveguide, leaving some spacing between the ports and the bend. The bend is a circular bend with a radius of 5 µm. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b5260f2b-d73b-4739-9860-43b8727b6fda",
   "metadata": {},
   "outputs": [],
   "source": [
    "l_straight = 2  # length of the straight waveguide\n",
    "r = 5  # bend radius\n",
    "w = 0.5  # waveguide width\n",
    "t = 0.22  # waveguide thickness\n",
    "inf_eff = 1e3  # effective infinity"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2080ecb-61ce-44d8-a222-e0bebf4787fe",
   "metadata": {},
   "source": [
    "Use [gdstk](https://heitzmann.github.io/gdstk/) to create a simple waveguide circular bend."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "84df9823-b600-4696-805f-49c8b3e1005c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# create a waveguide bend structure using gdstk\n",
    "cell = gdstk.Cell(\"BEND\")\n",
    "path = gdstk.RobustPath(initial_point=(-inf_eff, 0), width=0.5, layer=1, datatype=0)\n",
    "path.segment(xy=(0, 0))\n",
    "path.arc(radius=r, initial_angle=-np.pi / 2, final_angle=0)\n",
    "path.segment(xy=(r, inf_eff))\n",
    "cell.add(path)\n",
    "\n",
    "bend = td.Structure(\n",
    "    geometry=td.PolySlab.from_gds(\n",
    "        cell,\n",
    "        gds_layer=1,\n",
    "        axis=2,\n",
    "        slab_bounds=(-t / 2, t / 2),\n",
    "    )[0],\n",
    "    medium=si,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52a15426-1a86-4d1e-ac7d-b7842d600d14",
   "metadata": {},
   "source": [
    "Add the [ModeSource](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeSource.html) and [ModeMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeMonitor.html) at the port positions. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "293f8e51-24dd-4c1a-bcfb-db9f016de42d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define a mode source\n",
    "mode_source = td.ModeSource(\n",
    "    center=(-l_straight, 0, 0),\n",
    "    size=(0, 4 * w, 6 * t),\n",
    "    source_time=td.GaussianPulse(freq0=td.C_0 / lda0, fwidth=fwidth),\n",
    "    mode_spec=td.ModeSpec(),\n",
    "    mode_index=0,\n",
    "    direction=\"+\",\n",
    "    num_freqs=7,\n",
    ")\n",
    "\n",
    "# define a mode monitor\n",
    "mode_monitor = td.ModeMonitor(\n",
    "    center=(r, r + l_straight, 0),\n",
    "    size=(4 * w, 0, 6 * t),\n",
    "    freqs=freqs,\n",
    "    mode_spec=td.ModeSpec(),\n",
    "    name=\"s21\",\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fa9b0f43-4f70-4f30-a05d-ce62fe3459bc",
   "metadata": {},
   "source": [
    "Put together a [Simulation](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.Simulation.html) and visualize it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "7a73bd22-81c4-4d44-be8f-acb39fc15859",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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IiKiCPAeKBERUQQYoERERBFggBIREUWAAUpERBQBBigREVEEGKBEREQRYIASERFFgAFKREQUAQYoUQf017/+FRdffLHi61m6dCmGDh0KWZYVXxdRrDFAiTqY+vp6PPLII3j00UcVX9cll1wCrVaLBQsWKL4uolhjgBJ1MP/4xz9gNptxzjnnxGR9N910E1555ZWYrIsolhigREnq5MmTyM3NxdNPP+2b9uOPP0Kn07UY7qmphQsX4vLLL/ebdsEFF2DatGl+0yZMmICbbrrJ93OPHj3w5JNP4sYbb4TJZEL37t3x+eef4+TJk7jyyithMpkwZMgQbNiwwa+cyy+/HBs2bMC+ffsi/2WJEhADlChJZWVl4Z133sFjjz2GDRs2oKqqCjfccAOmTp2Kiy66KOByq1ev9g3aHq6XXnoJ55xzDjZv3ozx48fjhhtuwI033ojrr78emzZtQq9evXDjjTei6RgV3bp1Q05ODr7//vuI1kmUqBigREns0ksvxe23345JkybhrrvugtFoxJw5cwLOX1FRgcrKSuTn50e8vjvvvBN9+vTBrFmzYLfbMWrUKEycOBF9+/bFQw89hJ07d6KkpMRvufz8fBw6dCiidRIlKgYoUZL785//DLfbjUWLFmHBggXQ6/UB562rqwMAGAyGiNY1ZMgQ3/9zcnIAAIMHD24xrbS01G+5lJQU1NbWRrROokTFACVKcvv27cPx48chyzIOHjwYdF6r1QpJklBeXt5muR6Pp8U0rVbr+78kSQGnNX9s5dSpU8jKympznUTJhAFKlMScTieuv/56XHvttXjiiSdw2223tTj7a0qn02HAgAHYsWNHi/eaX3bdv39/VOpYX1+Pffv2YdiwYVEpjyhRMECJktif/vQnVFZW4pVXXsFDDz2Evn374pZbbgm6TFFREVavXt1i+meffYZ//vOf2LdvH5566ins2LEDhw4dwrFjx06rjj/99BP0ej3Gjh17WuUQJRoGKFGSWrVqFebOnYsPPvgAZrMZKpUKH3zwAb7//nu8+eabAZe79dZbsWTJElRWVvpNHz9+PJ577jkMGDAA3333Hd544w2sW7cOH3zwwWnV86OPPsKkSZOQmpp6WuUQJRpJNG1vTkQdwsSJEzF8+HDMmDEDQMNzoEOHDsXcuXOjuh6bzYYzzjgDGzZsQEFBQVTLJoo3noESdUDPP/88TCaT4us5ePAg3njjDYYntUs8AyUixc5AidozBigREVEEeAmXiIgoAgxQIiKiCDBAiYiIIsAAJSIiigADlIiIKAIMUCIioggwQImIiCLAACUiIooAA5SIiCgC/x9aV8RnVTco7wAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "buffer = 0.6 * lda0  # buffer spacing\n",
    "\n",
    "# define a simulation domain box\n",
    "sim_box = td.Box.from_bounds(\n",
    "    rmin=(-l_straight - buffer, -w / 2 - buffer, -w / 2 - buffer),\n",
    "    rmax=(r + w / 2 + buffer, r + l_straight + buffer, w / 2 + buffer),\n",
    ")\n",
    "\n",
    "# define a simulation\n",
    "sim = td.Simulation(\n",
    "    center=sim_box.center,\n",
    "    size=sim_box.size,\n",
    "    grid_spec=td.GridSpec.auto(min_steps_per_wvl=30),\n",
    "    run_time=5e-13,\n",
    "    structures=[bend],\n",
    "    sources=[mode_source],\n",
    "    monitors=[mode_monitor],\n",
    "    symmetry=(0, 0, 1),\n",
    "    boundary_spec=td.BoundarySpec.all_sides(boundary=td.PML()),\n",
    "    medium=sio2,\n",
    ")\n",
    "\n",
    "sim.plot(z=0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79d9b929-dca5-4113-aa8b-184e14a04899",
   "metadata": {},
   "source": [
    "Run the simulation in the cloud. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "ac4cd9e9-df4c-4cf4-bd23-a7dcaab7f832",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:47:59 UTC </span>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'waveguide_bend'</span> with task_id                         \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97'</span> and task_type <span style=\"color: #008000; text-decoration-color: #008000\">'FDTD'</span>.  \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:47:59 UTC\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'waveguide_bend'\u001b[0m with task_id                         \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97'\u001b[0m and task_type \u001b[32m'FDTD'\u001b[0m.  \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>View task using web UI at                                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">3-4b4e-963f-1c38374cbb97'</span></a>.                                         \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mView task using web UI at                                          \n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=556407;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=997937;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=556407;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=216237;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[32mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=556407;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[32m-4238aa63-9ae\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=556407;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[32m3-4b4e-963f-1c38374cbb97'\u001b[0m\u001b]8;;\u001b\\.                                         \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Task folder: <a href=\"https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'default'</span></a>.                                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=694652;https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\.                                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c40c4aff6c0048aab7a9374be19390af",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:02 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.273</span>. Minimum cost depends on task       \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>execution details. Use <span style=\"color: #008000; text-decoration-color: #008000\">'web.real_cost(task_id)'</span> to get the billed  \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>FlexCredit cost after a simulation run.                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:02 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.273\u001b[0m. Minimum cost depends on task       \n",
       "\u001b[2;36m             \u001b[0mexecution details. Use \u001b[32m'web.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed  \n",
       "\u001b[2;36m             \u001b[0mFlexCredit cost after a simulation run.                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:03 UTC </span>status = queued                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:03 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = queued                                                    \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>To cancel the simulation, use <span style=\"color: #008000; text-decoration-color: #008000\">'web.abort(task_id)'</span> or              \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'web.delete(task_id)'</span> or abort/delete the task in the web UI.      \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Terminating the Python script will not stop the job running on the \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>cloud.                                                             \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or              \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'web.delete\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or abort/delete the task in the web UI.      \n",
       "\u001b[2;36m             \u001b[0mTerminating the Python script will not stop the job running on the \n",
       "\u001b[2;36m             \u001b[0mcloud.                                                             \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "45c8d371790d4fa6848a85f353b87a1b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:15 UTC </span>status = preprocess                                                \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:15 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = preprocess                                                \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:19 UTC </span>starting up solver                                                 \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:19 UTC\u001b[0m\u001b[2;36m \u001b[0mstarting up solver                                                 \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:20 UTC </span>running solver                                                     \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:20 UTC\u001b[0m\u001b[2;36m \u001b[0mrunning solver                                                     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "156a23949ba448e8b21b8ba391e10350",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:51 UTC </span>early shutoff detected at <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">84</span>%, exiting.                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:51 UTC\u001b[0m\u001b[2;36m \u001b[0mearly shutoff detected at \u001b[1;36m84\u001b[0m%, exiting.                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:52 UTC </span>status = success                                                   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:52 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = success                                                   \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>View simulation result at                                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">'https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">3-4b4e-963f-1c38374cbb97'</span></a><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">.</span>                                         \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mView simulation result at                                          \n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=705801;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=680312;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=705801;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=412205;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[4;34mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=705801;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[4;34m-4238aa63-9ae\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=705801;https://tidy3d.simulation.cloud/workbench?taskId=fdve-4238aa63-9ae3-4b4e-963f-1c38374cbb97\u001b\\\u001b[4;34m3-4b4e-963f-1c38374cbb97'\u001b[0m\u001b]8;;\u001b\\\u001b[4;34m.\u001b[0m                                         \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b5f322eab50a482f9b6eb1d7748e9408",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:53 UTC </span>loading simulation from simulation_data.hdf5                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:53 UTC\u001b[0m\u001b[2;36m \u001b[0mloading simulation from simulation_data.hdf5                       \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sim_data = web.run(simulation=sim, task_name=\"waveguide_bend\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e73da0a6-410a-4346-a2a7-ae11bbf54edf",
   "metadata": {},
   "source": [
    "### Postprocessing\n",
    "\n",
    "After the simulation is completed, we first extract the complex S21 and calculate the derivative of the unwrapped phase with respect to frequency. The final group delay is then given by the derivative divided by 2$\\pi$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "1e564d04-6e78-40f0-82fc-0a65703aa440",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAG2CAYAAABrrBJlAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQlBJREFUeJzt3X9cVfXhx/H35Tf+gBQUREEwyt8hipCyhS6KWstZTvuhSdZqtdKQ5qbbym+1RFs2ljqJWtq2LLdazfpOy0jN0kJRLH+h5W8UyEQQf6Byz/eP871Xrh6NS5efvZ6Px3nA/dzP/ZzPOWPed5/zOZ9jMwzDEAAAAFx4NXUHAAAAmiNCEgAAgAVCEgAAgAVCEgAAgAVCEgAAgAVCEgAAgAVCEgAAgAVCEgAAgAVCEgAAgAVCEgAAgIVmEZLmzZun6OhoBQQEKCkpSfn5+Retu2XLFo0aNUrR0dGy2WzKzs6+oI7jvfO3hx56yFnn1KlTeuihhxQSEqJ27dpp1KhRKi0tbYjDAwAALVCTh6TFixcrMzNT06dP14YNGxQXF6e0tDSVlZVZ1j9x4oR69OihmTNnKjw83LLOunXrdOjQIee2fPlySdLo0aOddSZPnqx33nlH//rXv7Rq1SodPHhQt956q+cPEAAAtEi2pn7AbVJSkgYPHqy5c+dKkux2uyIjIzVx4kRNnTr1kp+Njo5WRkaGMjIyLlkvIyND7777rnbu3CmbzaaKigp16tRJixYt0s9+9jNJ0vbt29W7d2+tXbtWV199tUeODQAAtFw+Tbnz06dPq6CgQNOmTXOWeXl5KTU1VWvXrvXYPv7xj38oMzNTNptNklRQUKAzZ84oNTXVWa9Xr16Kioq6aEiqrq5WdXW187XdbteRI0cUEhLibBcAADRvhmHo2LFjioiIkJfXpS+oNWlIOnz4sGpqahQWFuZSHhYWpu3bt3tkH2+//baOHj2qu+++21lWUlIiPz8/XXbZZRfst6SkxLKdrKwsPfHEEx7pEwAAaFr79+9Xt27dLlmnSUNSY/jrX/+qG2+8UREREd+pnWnTpikzM9P5uqKiQlFRUdq/f7+CgoK+azcBAEAjqKysVGRkpNq3b/+tdZs0JIWGhsrb2/uCu8pKS0svOinbHXv37tUHH3ygf//73y7l4eHhOn36tI4ePeoymnSp/fr7+8vf3/+C8qCgIEISAAAtTF2myjTp3W1+fn4aNGiQ8vLynGV2u115eXkaMmTId25/wYIF6ty5s2666SaX8kGDBsnX19dlv0VFRdq3b59H9gsAAFq+Jr/clpmZqfT0dCUkJCgxMVHZ2dk6fvy4JkyYIEkaP368unbtqqysLEnmROytW7c6fy8uLlZhYaHatWun2NhYZ7t2u10LFixQenq6fHxcDzM4OFj33nuvMjMz1bFjRwUFBWnixIkaMmQId7YBAABJzSAk3Xbbbfr666/1+OOPq6SkRAMGDNCyZcuck7n37dvnMvv84MGDio+Pd75+9tln9eyzzyolJUUrV650ln/wwQfat2+f7rnnHsv9/ulPf5KXl5dGjRql6upqpaWl6S9/+UvDHCQAAGhxmnydpJaqsrJSwcHBqqioYE4SAAAthDvf302+4jYAAEBzREgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACwQEgCAACw0OQhad68eYqOjlZAQICSkpKUn59/0bpbtmzRqFGjFB0dLZvNpuzsbMt6xcXFGjdunEJCQhQYGKj+/ftr/fr1zverqqr08MMPq1u3bgoMDFSfPn2Uk5Pj6UMDAAAtWJOGpMWLFyszM1PTp0/Xhg0bFBcXp7S0NJWVlVnWP3HihHr06KGZM2cqPDzcsk55ebmSk5Pl6+urpUuXauvWrZo9e7Y6dOjgrJOZmally5bpH//4h7Zt26aMjAw9/PDDWrJkSYMcJwAAaHlshmEYTbXzpKQkDR48WHPnzpUk2e12RUZGauLEiZo6deolPxsdHa2MjAxlZGS4lE+dOlWffPKJVq9efdHP9uvXT7fddpsee+wxZ9mgQYN044036g9/+EOd+l5ZWang4GBVVFQoKCioTp8BAABNy53v7yYbSTp9+rQKCgqUmpp6rjNeXkpNTdXatWvr3e6SJUuUkJCg0aNHq3PnzoqPj9eLL77oUmfo0KFasmSJiouLZRiGVqxYoR07duj666+/aLvV1dWqrKx02QAAQOvVZCHp8OHDqqmpUVhYmEt5WFiYSkpK6t3url27NH/+fF1xxRV677339OCDD2rSpEl65ZVXnHXmzJmjPn36qFu3bvLz89MNN9ygefPm6Zprrrlou1lZWQoODnZukZGR9e4jAABo/nyaugOeZrfblZCQoBkzZkiS4uPjtXnzZuXk5Cg9PV2SGZI+/fRTLVmyRN27d9dHH32khx56SBERES4jW7VNmzZNmZmZzteVlZUEJQAAWrEmC0mhoaHy9vZWaWmpS3lpaelFJ2XXRZcuXdSnTx+Xst69e+vNN9+UJJ08eVK//e1v9dZbb+mmm26SJF111VUqLCzUs88+e9GQ5O/vL39//3r3CwAAtCxNdrnNz89PgwYNUl5enrPMbrcrLy9PQ4YMqXe7ycnJKioqcinbsWOHunfvLkk6c+aMzpw5Iy8v10P39vaW3W6v934BAEDr0qSX2zIzM5Wenq6EhAQlJiYqOztbx48f14QJEyRJ48ePV9euXZWVlSXJnOy9detW5+/FxcUqLCxUu3btFBsbK0maPHmyhg4dqhkzZmjMmDHKz89Xbm6ucnNzJUlBQUFKSUnRlClTFBgYqO7du2vVqlX629/+pueee64JzgIAAGiWjCY2Z84cIyoqyvDz8zMSExONTz/91PleSkqKkZ6e7ny9e/duQ9IFW0pKikub77zzjtGvXz/D39/f6NWrl5Gbm+vy/qFDh4y7777biIiIMAICAoyePXsas2fPNux2e537XVFRYUgyKioq6nXcAACg8bnz/d2k6yS1ZKyTBABAy9Mi1kkCAABozghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJAAAAFghJ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gAZUp5AUzCWQxpOVJf3pT2Yo+h5dvgQAoLnhcls98ew2AABaHne+v+u1ktzZs2f1wQcf6IUXXtCxY8ckSQcPHlRVVVV9mgMAAGh23J6Vu3fvXt1www3at2+fqqurdd1116l9+/aaNWuWqqurlZOT0xD9BAAAaFRujyQ98sgjSkhIUHl5uQJrPQPrlltuUV5enkc7BwAA0FTcHklavXq11qxZIz8/P5fy6OhoFRcXe6xjAAAATcntkSS73a6ampoLyg8cOOB8phsAAEBL53ZIuv7665Wdne18bbPZVFVVpenTp+vHP/6xJ/sGAADQZNxeAuDAgQNKS0uTYRjauXOnEhIStHPnToWGhuqjjz5S586dG6qvzQpLAAAA0PI0+GNJzp49q9dff12ff/65qqqqNHDgQI0dO9ZlIndrR0gCAKDl8fhjSS74kI+Pxo0bV6/OAQAAtAR1CklLliypc4MjRoyod2cAAACaizqFpJEjR7q8ttlsOv8qne3/nzNmdecbAABAS1Onu9vsdrtze//99zVgwAAtXbpUR48e1dGjR7V06VINHDhQy5Yta+j+AgAANAq35yRlZGQoJydHP/jBD5xlaWlpatOmje6//35t27bNox0EAABoCm6vk/TVV1/psssuu6A8ODhYe/bs8UCXAAAAmp7bIWnw4MHKzMxUaWmps6y0tFRTpkxRYmKiRzsHAADQVNwOSS+//LIOHTqkqKgoxcbGKjY2VlFRUSouLtZf//rXhugjAABAo3N7TlJsbKw+//xzLV++XNu3b5ck9e7dW6mpqc473AAAAFq6eq24DVbcBgCgJXLn+9vty20AAADfB4QkAAAAC4QkAAAAC4QkAAAAC27f3SaZz2d76623nKtr9+7dWyNHjpSPT72aAwAAaHbcTjVbtmzRiBEjVFJSop49e0qSZs2apU6dOumdd95Rv379PN5JAACAxub25baf//zn6tu3rw4cOKANGzZow4YN2r9/v6666irdf//9DdFHAACARuf2SFJhYaHWr1+vDh06OMs6dOigp59+WoMHD/Zo5wAAAJqK2yNJV155pctz2xzKysoUGxvrkU4BAAA0NbdDUlZWliZNmqQ33nhDBw4c0IEDB/TGG28oIyNDs2bNUmVlpXMDAABoqdx+LImX17lc5XhWm6OJ2q9tNptqamo81c9mh8eSAADQ8rjz/e32nKQVK1bUu2MAAAAthdshKSUlpSH6AQAA0Ky4HZI++uijS75/zTXX1LszAAAAzYXbIWnYsGEXlDnmIklq1fOQAADA94fbd7eVl5e7bGVlZVq2bJkGDx6s999/vyH6CAAA0OjcHkkKDg6+oOy6666Tn5+fMjMzVVBQ4JGOAQAANCW3R5IuJiwsTEVFRZ5qDgAAoEm5PZL0+eefu7w2DEOHDh3SzJkzNWDAAE/1CwAAoEm5HZIGDBggm82m89egvPrqq/Xyyy97rGMAAABNye3Lbbt379auXbu0e/du7d69W3v37tWJEye0Zs0a9erVq16dmDdvnqKjoxUQEKCkpCTl5+dftO6WLVs0atQoRUdHy2azKTs727JecXGxxo0bp5CQEAUGBqp///5av369Zd0HHnjgkm0BAIDvH7dHkrp37+7RDixevFiZmZnKyclRUlKSsrOzlZaWpqKiInXu3PmC+idOnFCPHj00evRoTZ482bLN8vJyJScna/jw4Vq6dKk6deqknTt3qkOHDhfUfeutt/Tpp58qIiLCo8cFAABatnpN3F61apVuvvlmxcbGKjY2ViNGjNDq1avr1YHnnntO9913nyZMmKA+ffooJydHbdq0ueilu8GDB+uPf/yjbr/9dvn7+1vWmTVrliIjI7VgwQIlJiYqJiZG119/vS6//HKXesXFxZo4caJeffVV+fr61qv/AACgdXI7JP3jH/9Qamqq2rRpo0mTJmnSpEkKDAzUtddeq0WLFrnV1unTp1VQUKDU1NRzHfLyUmpqqtauXetu15yWLFmihIQEjR49Wp07d1Z8fLxefPFFlzp2u1133XWXpkyZor59+35rm9XV1aqsrHTZAABA6+V2SHr66af1zDPPaPHixc6QtHjxYs2cOVNPPfWUW20dPnxYNTU1CgsLcykPCwtTSUmJu11z2rVrl+bPn68rrrhC7733nh588EFNmjRJr7zyirPOrFmz5OPjo0mTJtWpzaysLAUHBzu3yMjIevcPAAA0f26HpF27dunmm2++oHzEiBHavXu3Rzr1Xdntdg0cOFAzZsxQfHy87r//ft13333KycmRJBUUFOjPf/6zFi5c6PJIlUuZNm2aKioqnNv+/fsb8hAAAEATczskRUZGKi8v74LyDz74wO3RldDQUHl7e6u0tNSlvLS0VOHh4e52zalLly7q06ePS1nv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6nKed+3apfnz5yszM1O//e1vtW7dOk2aNEl+fn5KT09v4iNoGepynqdOnarKykr16tVL3t7eqqmp0dNPP62xY8c2ce9bll27dunjjz9WQECA3nrrLR0+fFi//OUv9c0332jBggWSpJKSEsvvwovNeawXj41J4VupDkOMVq655hpj3LhxhmEYRnFxsSHJWLNmjUudKVOmGImJiZ7oZovnifN8vgceeMDo3r27sX///u/Yu9bDE+d53759RufOnY1NmzY53+dymytP/T37+voaQ4YMcakzceJE4+qrr/6uXWwVPHWeX3vtNaNbt27Ga6+9Znz++efG3/72N6Njx47GwoULPdjblq0u5/q6664zAgICjKNHjzrL3nzzTcNmsxknTpwwDMP8m160aJHL5+bNm2d07tzZY33lclsLkJiYqC+//FKSFBoaKm9vb5WWlrrUKS0tVXh4eFN0r9WofZ5re/jhh/Xuu+9qxYoV6tatWxP0rHWpfZ4LCgpUVlamgQMHysfHRz4+Plq1apWef/55+fj4qKampol723Kd//fcpUsX9enTx6VO7969tW/fvsbuWqty/nmeMmWKpk6dqttvv139+/fXXXfdpcmTJzsf0o666dKli7p27arg4GBnWe/evWUYhg4cOCBJCg8Pb/DvQkJSC1BYWKguXbpIkvz8/DRo0CDl5eU537fb7crLy9OQIUOaqoutQu3zLEmGYejhhx/WW2+9pQ8//FAxMTFN2LvWo/Z5vvbaa/XFF1+osLDQuSUkJGjs2LEqLCyUt7d3E/e25Tr/7zk5OfmCJSx27Nih7t27N3bXWpXzz/OJEyfk5eX61ert7S273d7YXWvRkpOTdfDgQVVVVTnLduzYIS8vL+d/rA4ZMsTlu1CSli9f7tHvQuYkNbCqqiqX/8rYvXu3CgsL1bFjR0VFRWnatGkqLi7W3/72N0lSdna2YmJi1LdvX506dUovvfSSPvzwQ73//vvONjIzM5Wenq6EhAQlJiYqOztbx48f14QJExr9+JqLhjjPDz30kBYtWqT//Oc/at++vfM6d3BwsAIDAxv3AJsJT5/n9u3bXzDHq23btgoJCflez/1qiL/nyZMna+jQoZoxY4bGjBmj/Px85ebmKjc3t9GPr7loiPN888036+mnn1ZUVJT69u2rjRs36rnnntM999zT6MfXnLh7ru+880499dRTmjBhgp544gkdPnxYU6ZM0T333OP89/eRRx5RSkqKZs+erZtuukmvv/661q9f79m/aY9duIMlxy2j52/p6emGYRhGenq6kZKS4qw/a9Ys4/LLLzcCAgKMjh07GsOGDTM+/PDDC9qdM2eOERUVZfj5+RmJiYnGp59+2khH1Dw1xHm2ak+SsWDBgsY7sGamof6ea2NOUsOd53feecfo16+f4e/vb/Tq1cvIzc1tpCNqnhriPFdWVhqPPPKIERUVZQQEBBg9evQwfve73xnV1dWNeGTNj7vn2jAMY9u2bUZqaqoRGBhodOvWzcjMzHTOR3L45z//aVx55ZWGn5+f0bdvX+N///d/Pdpvm2F8z5cBBQAAsMCcJAAAAAuEJAAAAAuEJAAAAAuEJAAAAAuEJAAAAAuEJAAAAAuEJAAAAAuEJAAt3v/8z/9owIABTd0NJ5vNprffftvtzxUVFSk8PFzHjh3zfKdqOXz4sDp37ux8BhYAa4QkAHWSk5Oj9u3b6+zZs86yqqoq+fr6atiwYS51V65cKZvNpq+++qqRe9m4PB3Opk2bpokTJ6p9+/Yea9NKaGioxo8fr+nTpzfofoCWjpAEoE6GDx+uqqoqrV+/3lm2evVqhYeH67PPPtOpU6ec5StWrFBUVJQuv/zypuhqi7Rv3z69++67uvvuuxtlfxMmTNCrr76qI0eONMr+gJaIkASgTnr27KkuXbpo5cqVzrKVK1fqpz/9qWJiYvTpp5+6lA8fPlyS9Pe//10JCQlq3769wsPDdeedd6qsrEySZLfb1a1bN82fP99lXxs3bpSXl5f27t0rSTp69Kh+/vOfq1OnTgoKCtKPfvQjbdq06ZL9femll9S7d28FBASoV69e+stf/uJ8b8+ePbLZbPr3v/+t4cOHq02bNoqLi9PatWtd2njxxRcVGRmpNm3a6JZbbtFzzz2nyy67TJK0cOFCPfHEE9q0aZNsNptsNpsWLlzo/Ozhw4d1yy23qE2bNrriiiu0ZMmSS/b3n//8p+Li4tS1a1dnmdVIVXZ2tqKjo52v7777bo0cOVIzZsxQWFiYLrvsMj355JM6e/aspkyZoo4dO6pbt25asGCBSzt9+/ZVRESE3nrrrUv2C/g+IyQBqLPhw4drxYoVztcrVqzQsGHDlJKS4iw/efKkPvvsM2dIOnPmjJ566ilt2rRJb7/9tvbs2eMcLfHy8tIdd9yhRYsWuezn1VdfVXJysrp37y5JGj16tMrKyrR06VIVFBRo4MCBuvbaay86CvLqq6/q8ccf19NPP61t27ZpxowZeuyxx/TKK6+41Pvd736nX/3qVyosLNSVV16pO+64w3k58ZNPPtEDDzygRx55RIWFhbruuuv09NNPOz9722236dFHH1Xfvn116NAhHTp0SLfddpvz/SeeeEJjxozR559/rh//+McaO3bsJUdtVq9erYSEhEue/4v58MMPdfDgQX300Ud67rnnNH36dP3kJz9Rhw4d9Nlnn+mBBx7QL37xiwvmICUmJmr16tX12ifwveDRx+UCaNVefPFFo23btsaZM2eMyspKw8fHxygrKzMWLVpkXHPNNYZhGEZeXp4hydi7d69lG+vWrTMkGceOHTMMwzA2btxo2Gw2Z/2amhqja9euxvz58w3DMIzVq1cbQUFBxqlTp1zaufzyy40XXnjBMAzDmD59uhEXF+fy3qJFi1zqP/XUU8aQIUMMwzCM3bt3G5KMl156yfn+li1bDEnGtm3bDMMwjNtuu8246aabXNoYO3asERwc7Hx9/n4dJBm///3vna+rqqoMScbSpUstz4lhGEZcXJzx5JNPupRZtf+nP/3J6N69u/N1enq60b17d6OmpsZZ1rNnT+OHP/yh8/XZs2eNtm3bGq+99ppLW5MnTzaGDRt20T4B33eMJAGos2HDhun48eNat26dVq9erSuvvFKdOnVSSkqKc17SypUr1aNHD0VFRUmSCgoKdPPNNysqKkrt27dXSkqKJHMOjiQNGDBAvXv3do4mrVq1SmVlZRo9erQkadOmTaqqqlJISIjatWvn3Hbv3m05Mfz48eP66quvdO+997rU/8Mf/nBB/auuusr5e5cuXSTJeSmwqKhIiYmJLvXPf30ptdtu27atgoKCnG1bOXnypAICAurcfm19+/aVl9e5f87DwsLUv39/52tvb2+FhIRcsP/AwECdOHGiXvsEvg98mroDAFqO2NhYdevWTStWrFB5ebkz8ERERCgyMlJr1qzRihUr9KMf/UiSGVjS0tKUlpamV199VZ06ddK+ffuUlpam06dPO9sdO3asFi1apKlTp2rRokW64YYbFBISIsm8g+78uVAOjvlBtVVVVUky5xMlJSW5vOft7e3y2tfX1/m7zWaTZM6T8oTabTvav1TboaGhKi8v/9Z2a2pq6rSvuuz/yJEj6tSp07fuE/i+IiQBcMvw4cO1cuVKlZeXa8qUKc7ya665RkuXLlV+fr4efPBBSdL27dv1zTffaObMmYqMjJQkl7vjHO688079/ve/V0FBgd544w3l5OQ43xs4cKBKSkrk4+PjMmH5YsLCwhQREaFdu3Zp7Nix9T7Onj17at26dS5l57/28/OzDC31ER8fr61bt15QXlpa6vJ6165dHtmfJG3evPmC5RsAnMPlNgBuGT58uD7++GMVFhY6R5IkKSUlRS+88IJOnz7tnLQdFRUlPz8/zZkzR7t27dKSJUv01FNPXdBmdHS0hg4dqnvvvVc1NTUaMWKE873U1FQNGTJEI0eO1Pvvv689e/ZozZo1+t3vfmcZuCRz0nRWVpaef/557dixQ1988YUWLFig5557rs7HOXHiRP33v//Vc889p507d+qFF17Q0qVLnSNOjn7v3r1bhYWFOnz4sKqrq+vc/vnS0tK0du3aC0JXSUmJnnzySe3atUtvvvmm/v73v6u8vFzbt2+v974k6cSJEyooKND111//ndoBWjNCEgC3DB8+XCdPnlRsbKzCwsKc5SkpKTp27JhzqQBJ6tSpkxYuXKh//etf6tOnj2bOnKlnn33Wst2xY8dq06ZNuuWWWxQYGOgst9ls+u9//6trrrlGEyZM0JVXXqnbb79de/fuddl/bT//+c/10ksvacGCBerfv79SUlK0cOFCxcTE1Pk4k5OTlZOTo+eee05xcXFatmyZJk+e7DJvaNSoUbrhhhs0fPhwderUSa+99lqd2z/fjTfeKB8fH33wwQcu5f369dOOHTvUt29fPfbYY3rppZfk5+enX/3qV/XelyT95z//UVRUlH74wx9+p3aA1sxmGIbR1J0AgJbgvvvu0/bt2xvstvl58+ZpyZIleu+99ySZ6yS9/fbbKiws9Pi+rr76ak2aNEl33nmnx9sGWgvmJAHARTz77LO67rrr1LZtWy1dulSvvPKKy6KUnvaLX/xCR48e1bFjxxr00SSHDx/WrbfeqjvuuKPB9gG0BowkAcBFjBkzRitXrtSxY8fUo0cPTZw4UQ888ECj7b8hR5IAfDtCEgAAgAUmbgMAAFggJAEAAFggJAEAAFggJAEAAFggJAEAAFggJAEAAFggJAEAAFggJAEAAFggJAEAAFj4P3Eip6m8JgTKAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "s21 = sim_data[\"s21\"].amps.sel(direction=\"+\").squeeze(drop=True).values  # extract the s-parameter\n",
    "dphi_df = np.gradient(np.unwrap(np.angle(s21)), freqs)  # calculate gradient\n",
    "group_delay_fdtd = dphi_df / (2 * np.pi)  # calculate group delay\n",
    "\n",
    "# plot group delay as a function of wavelength\n",
    "plt.plot(ldas, group_delay_fdtd * 1e12, c=\"red\", linewidth=2)\n",
    "plt.xlabel(\"Wavelength (µm)\")\n",
    "plt.ylabel(\"Group delay (ps)\")\n",
    "plt.ylim(0.16, 0.17)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce8af804-ca1e-4fa9-b269-bb855238f666",
   "metadata": {},
   "source": [
    "## Mode Solver Approach\n",
    "\n",
    "### Group Index Calculation\n",
    "\n",
    "Next we demonstrate how to calculate the same group delay only using mode solving. To do so, we need to run mode solving on the same waveguide structure and calculate the group index of the mode. A convenient way to do so is by using the [waveguide plugin](https://www.flexcompute.com/tidy3d/examples/notebooks/WaveguidePluginDemonstration/)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b27f12e7-fa55-43cc-8556-25eb70ba95fc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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p06dLrgeXKC6/msCKJOYmGi8vLzMv//973Lryv76Lzuq6N27t8uR3rFjx4yPj4/p37+/y/vEc+fONZLMggULjDH/fb9x6dKlldYxa9YsI8kcP368SvW7s92bb75pvLy8yr2PWvZ+7caNG40xxuzevdt4eXmZv/zlL+Xe9/79kVBlp9nPPjIvLi42l19+uenUqZM5c+aM1e/jjz82kkxycrLVNmzYMCPJTJkyxWXM6Oho061bt3M/Cea3U9Znu//++02DBg1czj5U9TT70aNHzWWXXWZuuukmU1RUZKKjo02LFi3KHQ1XdMaiouX3R7GjR4823t7eFe43ODjYDBky5Jy1dezY0dx4443l2nfs2GEkmdTUVGOMMUuXLjWSzLp168r1HTRokAkNDT3nfj777DMjyXz00Ufl1p09pzKVHZnHx8e7/CzFxsYah8NhHnjgAavt119/NVdccUWFP2NlZy2WLFlyzppxcXA1OzxCaWmpli9frltvvbXcUYskORwOl8f33XefvL29rcefffaZiouLNXbsWHl5ebn0CwwM1MqVKyVJQUFBkqRPPvlEP//8c4W1lB2hrlixQqWlpW7PwZ3tli5dqquvvlrt27fXiRMnrOXGG2+UJH3++eeSpOXLl6u0tFTJycku85HKPxfu2LJli44dO6aHHnpIfn5+VvuAAQPUvn176/n5vQceeMDl8fXXX6/vv//+vPvy9/e3/v/UqVM6ceKErr/+ev3888/69ttvq1x7mdDQUM2bN0+rV6/W9ddfr+zsbC1YsKDc0fCiRYu0evXq8y6/P9I8c+aMy5mf3/Pz89OZM2fOWduZM2fk6+tb4bZl63//38r6nm8/P/74oySpSZMm5+znjhEjRrj8LMXExMgYoxEjRlht3t7e6t69e4Wve1kNJ06cuOBacOE4zQ6PcPz4cTmdTrdP10VGRro8Lrvftl27di7tPj4+uvLKK631kZGRSkpK0syZM7Vo0SJdf/31uu2223TPPfdYQT948GC99tprGjlypMaPH69+/frp9ttv15133lkuWH/Pne12796tnTt3Kjg4uMIxjh07Jknau3evvLy81KFDB7eej/Op7PmRpPbt22vDhg0ubX5+fuVqbNKkiU6ePHnefe3YsUMTJ07UmjVr5HQ6Xdbl5+dXtXQXQ4YM0VtvvaWVK1dq1KhR6tevX7k+1113XZXH9ff3V3FxcYXrCgsLXf5AqWz7oqKiCrctW//7/1bW93z7KWOMcavfubRo0cLlcdnPf0RERLn2il73shqq88clah5hDlty9x+9irzwwgu69957tWLFCn366ad6+OGHNW3aNH355Ze64oor5O/vr3Xr1unzzz/XypUrlZ6eriVLlujGG2/Up59+6nJG4OyazrddaWmpOnfurJkzZ1Y4xtn/kNaVyuZ4Pnl5eerTp48CAwM1ZcoUtW7dWn5+ftq2bZuefPLJKp3pqMiPP/6oLVu2SJK++eYblZaWlvsD6/jx4269Zx4QEGC9Tx8WFqaSkhIdO3ZMl19+udWnuLhYP/74o8LDw885VlhYmA4fPlyu/ejRo5JkbR8WFubSfnbf8+2nadOmkuTWH1VlKgv+yl7jitorGqOshmbNmrldC2oPp9nhEYKDgxUYGKivv/66WtuXfXjGrl27XNqLi4u1b9++ch+u0blzZ02cOFHr1q3T+vXrdfjwYaWmplrrvby81K9fP82cOVPffPONnnnmGa1Zs8Y6DV6Z823XunVr/fTTT+rXr5/i4uLKLWVHzq1bt1Zpaam++eabc+7P3aOiyp6fsraa+vCRtWvX6scff1RaWpoeeeQR/fnPf1ZcXFyFp4Wrc0Q3evRonTp1StOmTdOGDRsq/NCZHj16KCws7LzL888/b20TFRUlSdYfCmW2bNmi0tJSa31loqKi9N1335U7E5GZmekyfqdOnVSvXr1y+ykuLlZ2dvZ599O+fXtJ0r59+ypcf+rUqXJtZWd7alpZDVdffXWtjI+qIczhEby8vJSQkKCPPvqo3D900vlPK8bFxcnHx0dz5sxx6fv6668rPz9fAwYMkCQ5nU79+uuvLtt27txZXl5e1qnPn376qdz4Zf/IVnR6tIw72/31r3/V4cOH9eqrr5bre+bMGevK/ISEBHl5eWnKlCnljmZ/P7+GDRsqLy+v0prKdO/eXZdffrlSU1Nd5vCvf/1LO3futJ6fC1V2VPf7GouLizV//vxyfRs2bFil0+7vvfeelixZomeffVbjx4/XkCFDNHHiRH333Xcu/arznvmNN96oyy67TC+99JLLWC+99JIaNGjg8vycOHFC3377rcs1F3feeadKSkr0yiuvWG1FRUVauHChYmJirDMuQUFBiouL01tvveUSvG+++aZOnz6tQYMGnfM5aN68uSIiIir8HZFU7uN7//Wvf6mwsLBGTsufbevWrQoKClLHjh1rfGxUQ11deQec7dChQyY0NNQ0aNDAjB071rz88svm6aefNh07drTuFS+7EreiK95TUlKMJNO/f38zd+5cM2bMGOPt7W169OhhiouLjTHGfPDBB6Z58+Zm7NixZv78+WbOnDmmR48epn79+mbz5s3GGGMeeeQREx0dbSZOnGheffVV88wzz5jmzZubK664wuVe9LO5s11JSYm55ZZbjMPhMEOGDDEvvviimT17tnnggQfMZZdd5jKvSZMmGUmmV69e5vnnnzcvvviiSUxMNOPHj7f6PPTQQ8bhcJj//d//NW+//bb1iVwV3Wde9tzFxMSY2bNnmwkTJpgGDRqYVq1audyLX3afeWXP77mcOHHCNGnSxLRs2dK88MILZubMmSY6Otp07dq1XD3Tp083ksyjjz5qFi9ebD788MNKx83NzTXNmjUzffv2ta7APnHihAkJCTGxsbE18kl38+bNM5LMnXfeaV599VWTmJhoJJlnnnnGpV/Z83D2PfyDBg2y7iF/+eWXTa9evUy9evXMF1984dJv69atxtfX1+UT4Pz8/Ez//v3dqvN//ud/TPPmzcvd3y3J+Pv7m5tvvtm89NJLZtKkSSYwMNAEBQWZNm3amMWLFxtjKv8dKpvX2XdjVPbz0KlTJ3PPPfe4VTNqH2EOj7J//36TmJhogoODja+vr7nyyivN6NGjy31oTEVhbsxvt6K1b9/e1K9f34SEhJgHH3zQJai+//578/e//920bt3a+Pn5mcsuu8z07dvXfPbZZ1afjIwMM3DgQBMeHm58fHxMeHi4ueuuu8x33313ztrd3a64uNg899xzpmPHjsbX19c0adLEdOvWzUyePLncbVYLFiww0dHRVr8+ffqY1atXW+tzcnLMgAEDTKNGjdz60JglS5ZY41122WXn/NCYs7kT5sYYs3HjRnPttdcaf39/Ex4ebsaNG2c++eSTcvWcPn3a/O1vfzONGzc+74fG3H777aZRo0bmhx9+cGlfsWKFkWSee+6589bljldeecW0a9fO+Pj4mNatW5tZs2aVC83KwvzMmTPm8ccfN6GhocbX19f06NHDpKenV7if9evXm169ehk/Pz8THBxsRo8ebZxOp1s1btu2zfrQl9+TZJKSksygQYOMv7+/CQsL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vHnzjLe3t0lPT7f6nO+58sR5zZo1yyxfvtzs3r3bbN++3TzyyCPGy8vLfPbZZx41r+oizG1k4cKFRlK5JSUlxerTp08fM2zYMOvx2LFjTYsWLYyPj48JCQkxt9xyi9m2bZvLuKWlpWbSpEkmJCTE+Pr6mn79+pldu3ZdpFn9pjpzM8aYd99917Rt29b4+PiYjh07mpUrV7qsr+u5ubP/li1busxz8ODBJiwszPj4+JjmzZubwYMHmz179rhsc+bMGfPQQw+ZJk2amAYNGpi//OUvLn/41LYXX3zR+rnq2bOn+fLLL611dnydylRlXnb53Sq7JevspWwuw4YNM3369Cm3TVRUlPHx8TFXXnmlWbhwYblxz/VcXQxVnddzzz1nWrdubfz8/Mxll11mbrjhBrNmzZpy49b1vKqLb00DAMDmeM8cAACbI8wBALA5whwAAJsjzAEAsDnCHAAAmyPMAQCwOcIcAACbI8wBALA5whzABXv99dfVv3//Wt9Penq6oqKiVFpaWuv7AuyEMAdwQQoLCzVp0iSlpKTU+r7+9Kc/qX79+lq0aFGt7wuwE8IcwAV57733FBgYqOuuu+6i7O/ee+/VnDlzLsq+ALsgzAFIkt544w01bdrU+h72MgkJCRo6dGil273zzju69dZbXdpuuOEGjR07ttw49957r/W4VatWmjp1qhITExUQEKCWLVvqww8/1PHjxzVw4EAFBASoS5cu2rJli8s4t956q7Zs2aK9e/dWb6LAJYgwByBJGjRokEpKSvThhx9abceOHdPKlSv197//vdLtNmzYoO7du1drn7NmzdJ1112nrKwsDRgwQEOHDlViYqLuuecebdu2Ta1bt1ZiYqJ+/31QLVq0UEhIiNavX1+tfQKXIsIcgCTJ399ff/vb37Rw4UKr7a233lKLFi10ww03VLhNXl6e8vPzFR4eXq193nLLLbr//vt11VVXKTk5WU6nUz169NCgQYPUtm1bPfnkk9q5c6dyc3NdtgsPD9f+/furtU/gUkSYA7Dcd999+vTTT3X48GFJUlpamu699145HI4K+585c0aS5OfnV639denSxfr/kJAQSVLnzp3LtR07dsxlO39/f/3888/V2idwKapX1wUA8BzR0dHq2rWr3njjDfXv3187duzQypUrK+3ftGlTORwOnTx58rxjl5SUlGurX7++9f9lfzBU1Hb2rWg//fSTgoODz7tP4I+CI3MALkaOHKm0tDQtXLhQcXFxioiIqLSvj4+POnTooG+++abcurNPjX///fc1Ul9hYaH27t2r6OjoGhkPuBQQ5gBc/O1vf9OhQ4f06quvnvPCtzLx8fHasGFDufYVK1Zo2bJl2rt3r5555hl988032r9/v3UKv7q+/PJL+fr6KjY29oLGAS4lhDkAF0FBQbrjjjsUEBCghISE8/YfMWKEVq1apfz8fJf2AQMGaPr06erQoYPWrVun+fPn66uvvtKbb755QfW9/fbbuvvuu9WgQYMLGge4lDjM7+/5AABJ/fr1U8eOHd3+cJZBgwbpmmuu0YQJEyT9dp95VFSUZs+eXaN1nThxQu3atdOWLVsUGRlZo2MDdsaROQDLyZMn9cEHH2jt2rUaPXq029vNmDFDAQEBtVjZb3744QfNnz+fIAfOwtXsACzR0dE6efKknnvuObVr187t7Vq1aqUxY8bUYmW/6d69e7U/oAa4lHGaHQAAm+M0OwAANkeYAwBgc4Q5AAA2R5gDAGBzhDkAADZHmAMAYHOEOQAANkeYAwBgc4Q5AAA29/8B8NWu9R2WpugAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from tidy3d.plugins import waveguide\n",
    "\n",
    "# define the straight waveguide\n",
    "wg_straight = waveguide.RectangularDielectric(\n",
    "    wavelength=ldas,\n",
    "    core_width=w,\n",
    "    core_thickness=t,\n",
    "    core_medium=si,\n",
    "    clad_medium=sio2,\n",
    "    grid_resolution=30,\n",
    "    mode_spec=td.ModeSpec(num_modes=1, precision=\"double\", group_index_step=0.005),\n",
    ")\n",
    "\n",
    "wg_straight.plot_structures(x=0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d775d7a2-784e-4154-b6c3-183dab7a2aa9",
   "metadata": {},
   "source": [
    "Run mode solving on the straight waveguide and calculate the group velocity. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "119c5039-24bf-4443-8830-5ac4590007ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:54 UTC </span>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'straight waveguide'</span> with task_id                     \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5'</span> and task_type            \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'MODE_SOLVER'</span>.                                                     \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:54 UTC\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'straight waveguide'\u001b[0m with task_id                     \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5'\u001b[0m and task_type            \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'MODE_SOLVER'\u001b[0m.                                                     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>View task using web UI at                                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">49ed-8ae8-80b9d5e92fc5'</span></a>.                                           \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mView task using web UI at                                          \n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=158226;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=966370;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=158226;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=333762;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[32mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=158226;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[32m-2518acfb-4909-\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=158226;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[32m49ed-8ae8-80b9d5e92fc5'\u001b[0m\u001b]8;;\u001b\\.                                           \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Task folder: <a href=\"https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'default'</span></a>.                                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=830749;https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\.                                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "47b5147d0e9d4e039302e9f22534458b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:56 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.018</span>. Minimum cost depends on task       \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>execution details. Use <span style=\"color: #008000; text-decoration-color: #008000\">'web.real_cost(task_id)'</span> to get the billed  \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>FlexCredit cost after a simulation run.                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:56 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.018\u001b[0m. Minimum cost depends on task       \n",
       "\u001b[2;36m             \u001b[0mexecution details. Use \u001b[32m'web.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed  \n",
       "\u001b[2;36m             \u001b[0mFlexCredit cost after a simulation run.                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:57 UTC </span>status = queued                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:57 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = queued                                                    \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>To cancel the simulation, use <span style=\"color: #008000; text-decoration-color: #008000\">'web.abort(task_id)'</span> or              \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'web.delete(task_id)'</span> or abort/delete the task in the web UI.      \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Terminating the Python script will not stop the job running on the \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>cloud.                                                             \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or              \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'web.delete\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or abort/delete the task in the web UI.      \n",
       "\u001b[2;36m             \u001b[0mTerminating the Python script will not stop the job running on the \n",
       "\u001b[2;36m             \u001b[0mcloud.                                                             \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "29888aee4c314bd0a7747bd999cc89bc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:02 UTC </span>starting up solver                                                 \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:02 UTC\u001b[0m\u001b[2;36m \u001b[0mstarting up solver                                                 \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>running solver                                                     \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mrunning solver                                                     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:16 UTC </span>status = success                                                   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:16 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = success                                                   \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>View simulation result at                                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">'https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">49ed-8ae8-80b9d5e92fc5'</span></a><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">.</span>                                           \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mView simulation result at                                          \n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=966101;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=137756;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=966101;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=565608;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[4;34mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=966101;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[4;34m-2518acfb-4909-\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=966101;https://tidy3d.simulation.cloud/workbench?taskId=mo-2518acfb-4909-49ed-8ae8-80b9d5e92fc5\u001b\\\u001b[4;34m49ed-8ae8-80b9d5e92fc5'\u001b[0m\u001b]8;;\u001b\\\u001b[4;34m.\u001b[0m                                           \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b6f7c4303cbc443fbd7be60950201248",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:23 UTC </span>loading simulation from simulation_data.hdf5                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:23 UTC\u001b[0m\u001b[2;36m \u001b[0mloading simulation from simulation_data.hdf5                       \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "straight_data = web.run(simulation=wg_straight.mode_solver, task_name=\"straight waveguide\")\n",
    "vg_straight = (\n",
    "    td.C_0 / straight_data.n_group\n",
    ")  # calculate the group velocity of the straight waveguide mode"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3645114f-7496-4cd8-b7b3-45568b37f75c",
   "metadata": {},
   "source": [
    "Similarly, we need to do so for the bend waveguide since the group velocity is potentially slightly different. This can be done by copying the straight waveguide case and updating the mode specification to include a bend radius. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "285d3770-c8f8-4a06-9a4d-da1373de95c6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:24 UTC </span>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'bend waveguide'</span> with task_id                         \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa'</span> and task_type            \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'MODE_SOLVER'</span>.                                                     \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:24 UTC\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'bend waveguide'\u001b[0m with task_id                         \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa'\u001b[0m and task_type            \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'MODE_SOLVER'\u001b[0m.                                                     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>View task using web UI at                                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">464e-8c2f-e02fa34d4faa'</span></a>.                                           \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mView task using web UI at                                          \n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=149348;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=719796;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=149348;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=444220;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[32mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=149348;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[32m-9ff90bd0-c39c-\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=149348;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[32m464e-8c2f-e02fa34d4faa'\u001b[0m\u001b]8;;\u001b\\.                                           \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Task folder: <a href=\"https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'default'</span></a>.                                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=51433;https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\.                                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f0d5230557d74424874f9af876680845",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:27 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.018</span>. Minimum cost depends on task       \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>execution details. Use <span style=\"color: #008000; text-decoration-color: #008000\">'web.real_cost(task_id)'</span> to get the billed  \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>FlexCredit cost after a simulation run.                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:27 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.018\u001b[0m. Minimum cost depends on task       \n",
       "\u001b[2;36m             \u001b[0mexecution details. Use \u001b[32m'web.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed  \n",
       "\u001b[2;36m             \u001b[0mFlexCredit cost after a simulation run.                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:28 UTC </span>status = queued                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:28 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = queued                                                    \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>To cancel the simulation, use <span style=\"color: #008000; text-decoration-color: #008000\">'web.abort(task_id)'</span> or              \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'web.delete(task_id)'</span> or abort/delete the task in the web UI.      \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Terminating the Python script will not stop the job running on the \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>cloud.                                                             \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or              \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'web.delete\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or abort/delete the task in the web UI.      \n",
       "\u001b[2;36m             \u001b[0mTerminating the Python script will not stop the job running on the \n",
       "\u001b[2;36m             \u001b[0mcloud.                                                             \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ab339079daac4b12b6efce6c72cc2754",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:33 UTC </span>starting up solver                                                 \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:33 UTC\u001b[0m\u001b[2;36m \u001b[0mstarting up solver                                                 \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>running solver                                                     \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mrunning solver                                                     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:49:54 UTC </span>status = success                                                   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:54 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = success                                                   \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>View simulation result at                                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">'https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">464e-8c2f-e02fa34d4faa'</span></a><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">.</span>                                           \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mView simulation result at                                          \n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=337597;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=68533;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=337597;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=400871;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[4;34mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=337597;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[4;34m-9ff90bd0-c39c-\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=337597;https://tidy3d.simulation.cloud/workbench?taskId=mo-9ff90bd0-c39c-464e-8c2f-e02fa34d4faa\u001b\\\u001b[4;34m464e-8c2f-e02fa34d4faa'\u001b[0m\u001b]8;;\u001b\\\u001b[4;34m.\u001b[0m                                           \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d8a72ddb86cd4c5b8179f801a7023185",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:50:10 UTC </span>loading simulation from simulation_data.hdf5                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:50:10 UTC\u001b[0m\u001b[2;36m \u001b[0mloading simulation from simulation_data.hdf5                       \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "wg_bend = wg_straight.updated_copy(\n",
    "    mode_spec=td.ModeSpec(\n",
    "        num_modes=1,\n",
    "        bend_radius=r,\n",
    "        bend_axis=1,\n",
    "        num_pml=(12, 12),\n",
    "        precision=\"double\",\n",
    "        group_index_step=0.005,\n",
    "    ),\n",
    ")\n",
    "\n",
    "bend_data = web.run(simulation=wg_bend.mode_solver, task_name=\"bend waveguide\")\n",
    "vg_bend = td.C_0 / bend_data.n_group  # calculate the group velocity of the bend waveguide mode"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b3ce2c5-f18d-4dc7-9bf0-c1a5d7ef3c2d",
   "metadata": {},
   "source": [
    "Finally, the group delay can be calculated by dividing the mode propagation length by the group velocity. We compare the obtained group velocity from FDTD and mode solving. The results are very consistent as expected. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a9e5ca88-492d-46f0-9248-cefe30449923",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAG2CAYAAABrrBJlAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAURBJREFUeJzt3XlcVWXix/HvZd8EFWRTEAxzDxeE1Cl0srCxzHK0RZNs3zSlsdGZyqkmscXGKR0dW7TNctqtX9pCam6lYmjuljsKZCqrIHLP748bVy4chYssYp/363VecM95znOec4bpfn3Oc55jMQzDEAAAABy4NHYDAAAAzkeEJAAAABOEJAAAABOEJAAAABOEJAAAABOEJAAAABOEJAAAABOEJAAAABOEJAAAABOEJAAAABPnRUiaNWuWoqKi5OXlpYSEBK1du/aMZbds2aJhw4YpKipKFotFM2bMqFKmfFvl5YEHHrCXKS4u1gMPPKDAwED5+flp2LBhys7Oro/TAwAATVCjh6SFCxcqJSVFU6ZM0YYNGxQbG6ukpCTl5OSYli8qKlK7du00bdo0hYaGmpZZt26dDh8+bF+++uorSdLw4cPtZSZMmKBPP/1U7733npYvX65Dhw7phhtuqPsTBAAATZKlsV9wm5CQoN69e2vmzJmSJKvVqoiICI0dO1aTJk06675RUVEaP368xo8ff9Zy48eP12effaZdu3bJYrEoNzdXrVq10oIFC/TnP/9ZkrR9+3Z16tRJa9as0aWXXlon5wYAAJout8Y8+MmTJ5Wenq7Jkyfb17m4uGjgwIFas2ZNnR3jrbfeUkpKiiwWiyQpPT1dpaWlGjhwoL1cx44dFRkZecaQVFJSopKSEvtnq9Wqo0ePKjAw0F4vAAA4vxmGofz8fIWHh8vF5ew31Bo1JB05ckRlZWUKCQlxWB8SEqLt27fXyTE+/vhjHT9+XLfddpt9XVZWljw8PNS8efMqx83KyjKtJzU1VU888USdtAkAADSuAwcOqE2bNmct06ghqSG8+uqruvrqqxUeHn5O9UyePFkpKSn2z7m5uYqMjNSBAwfk7+9/rs0EAAANIC8vTxEREWrWrFm1ZRs1JAUFBcnV1bXKU2XZ2dlnHJTtjH379unrr7/Whx9+6LA+NDRUJ0+e1PHjxx16k852XE9PT3l6elZZ7+/vT0gCAKCJqclQmUZ9us3Dw0O9evVSWlqafZ3ValVaWpr69OlzzvXPmzdPwcHBGjx4sMP6Xr16yd3d3eG4O3bs0P79++vkuAAAoOlr9NttKSkpSk5OVlxcnOLj4zVjxgwVFhZqzJgxkqTRo0erdevWSk1NlWQbiL1161b775mZmcrIyJCfn59iYmLs9VqtVs2bN0/Jyclyc3M8zYCAAN1xxx1KSUlRy5Yt5e/vr7Fjx6pPnz482QYAACSdByHpxhtv1C+//KLHH39cWVlZ6t69u5YsWWIfzL1//36H0eeHDh1Sjx497J+ff/55Pf/880pMTNSyZcvs67/++mvt379ft99+u+lx//Wvf8nFxUXDhg1TSUmJkpKS9J///Kd+ThIAADQ5jT5PUlOVl5engIAA5ebmMiYJAFBrZWVlKi0tbexmXDDc3d3l6up6xu3OfH83ek8SAAC/R4ZhKCsrS8ePH2/splxwmjdvrtDQ0HOex5CQBABAIygPSMHBwfLx8WFi4jpgGIaKiorsrzYLCws7p/oISQAANLCysjJ7QAoMDGzs5lxQvL29JUk5OTkKDg4+66236jT6C24BAPi9KR+D5OPj08gtuTCVX9dzHetFSAIAoJFwi61+1NV1JSQBAACYICQBAACYICQBAIAau+2222SxWKosP/30k8M2d3d3hYSE6Morr9Rrr70mq9UqSVq2bJnp/hWXZcuWaf78+fbPrq6uatGihRISEvTkk08qNze3Qc6VkAQAAJwyaNAgHT582GGJjo522LZ3714tXrxYAwYM0EMPPaRrrrlGp06dUt++fR32GzFiRJX6+vbtK8n2EvnDhw/r4MGDWr16te6++2698cYb6t69uw4dOlTv58kUAAAAwCmenp4KDQ2tdlvr1q3Vs2dPXXrppbriiis0f/583XnnnQ77ent7q6SkxLQ+i8ViXx8WFqZOnTrp2muvVZcuXfTII4/orbfeqoezO42eJAAAUK/++Mc/KjY2Vh9++OE51xUcHKyRI0dq0aJFKisrq4PWnRk9SQAAnC/i4qSsrIY9ZmiotH69U7t89tln8vPzs3+++uqr9d577511n44dO2rTpk21aqJZXfn5+fr1118VHBxcJ3WaISQBAHC+yMqSMjMbuxXVGjBggGbPnm3/7OvrW+0+hmHU2fxFhmFIqv95pghJAACcL84wzud8O6avr69iYmKc2mfbtm32wd3natu2bfL396/3V7oQkgAAOF84edurqfjmm2/0448/asKECedcV05OjhYsWKChQ4fKxaV+h1YTkgAAQJ0pKSlRVlaWysrKlJ2drSVLlig1NVXXXHONRo8e7VRdhmEoKytLhmHo+PHjWrNmjaZOnaqAgABNmzatns7gNEISAACoM0uWLFFYWJjc3NzUokULxcbG6sUXX1RycrLTPT95eXkKCwuTxWKRv7+/OnTooOTkZD300EPy9/evpzM4zWKUj36CU/Ly8hQQEKDc3NwG+R8KAHDhKC4u1p49exQdHS0vL6/Gbs4F52zX15nvb+ZJAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAA541ly5bJYrHo+PHjjd0UQhIAAKi52267TRaLRffee2+VbQ888IAsFotuu+22hm9YPSAkAQAAp0REROjdd9/ViRMn7OuKi4u1YMECRUZGNmLL6hYhCQAAOKVnz56KiIjQhx9+aF/34YcfKjIyUj169LCvKykp0bhx4xQcHCwvLy/94Q9/0Lp16xzq+vzzz3XxxRfL29tbAwYM0N69e6scb+XKlbrsssvk7e2tiIgIjRs3ToWFhfV2fuUISQAAwGm333675s2bZ//82muvacyYMQ5lHnnkEX3wwQd6/fXXtWHDBsXExCgpKUlHjx6VJB04cEA33HCDrr32WmVkZOjOO+/UpEmTHOr4+eefNWjQIA0bNkybNm3SwoULtXLlSj344IP1fo6EJAAAziMvvCC1aVP9MmRI1X2HDKnZvi+8cO7tHDVqlFauXKl9+/Zp3759WrVqlUaNGmXfXlhYqNmzZ+u5557T1Vdfrc6dO+vll1+Wt7e3Xn31VUnS7NmzddFFF2n69Onq0KGDRo4cWWU8U2pqqkaOHKnx48erffv26tu3r1588UW98cYbKi4uPvcTOQu3eq0dAAA4JS9PysysvlxERNV1v/xSs33z8pxvV2WtWrXS4MGDNX/+fBmGocGDBysoKMi+/eeff1Zpaan69etnX+fu7q74+Hht27ZNkrRt2zYlJCQ41NunTx+Hzxs3btSmTZv09ttv29cZhiGr1ao9e/aoU6dO534yZ0BIAgDgPOLvL7VuXX25Vq3M19VkX39/59tl5vbbb7ff9po1a1bdVFpJQUGB7rnnHo0bN67KtvoeJE5IAgDgPJKSYltqY9Gium1LdQYNGqSTJ0/KYrEoKSnJYdtFF10kDw8PrVq1Sm3btpUklZaWat26dRo/frwkqVOnTlpUqdHfffedw+eePXtq69atiomJqb8TOQPGJAEAgFpxdXXVtm3btHXrVrm6ujps8/X11X333aeJEydqyZIl2rp1q+666y4VFRXpjjvukCTde++92rVrlyZOnKgdO3ZowYIFmj9/vkM9f/3rX7V69Wo9+OCDysjI0K5du/TJJ58wcBsAAJzf/P395X+G+3fTpk3TsGHDdOutt6pnz5766aef9MUXX6hFixaSbLfLPvjgA3388ceKjY3VnDlzNHXqVIc6LrnkEi1fvlw7d+7UZZddph49eujxxx9XeHh4vZ+bxTAMo96PcgHKy8tTQECAcnNzz/jHAQCAmeLiYu3Zs0fR0dHy8vJq7OZccM52fZ35/qYnCQAAwAQhCQAAwAQhCQAAwAQhCQAAwAQhCQCARsKzU/Wjrq4rIQkAgAbm7u4uSSoqKmrkllyYyq9r+XWuLWbcBgCggbm6uqp58+bKycmRJPn4+MhisTRyq5o+wzBUVFSknJwcNW/evMoEl84iJAEA0AhCQ0MlyR6UUHeaN29uv77ngpAEAEAjsFgsCgsLU3BwsEpLSxu7ORcMd3f3c+5BKkdIAgCgEbm6utbZlzrqFgO3AQAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATDR6SJo1a5aioqLk5eWlhIQErV279oxlt2zZomHDhikqKkoWi0UzZswwLZeZmalRo0YpMDBQ3t7e6tatm9avX2/fXlBQoAcffFBt2rSRt7e3OnfurDlz5tT1qQEAgCasUUPSwoULlZKSoilTpmjDhg2KjY1VUlKScnJyTMsXFRWpXbt2mjZtmkJDQ03LHDt2TP369ZO7u7sWL16srVu3avr06WrRooW9TEpKipYsWaK33npL27Zt0/jx4/Xggw9q0aJF9XKeAACg6bEYhmE01sETEhLUu3dvzZw5U5JktVoVERGhsWPHatKkSWfdNyoqSuPHj9f48eMd1k+aNEmrVq3SihUrzrhv165ddeONN+qxxx6zr+vVq5euvvpq/fOf/6xR2/Py8hQQEKDc3Fz5+/vXaB8AANC4nPn+brSepJMnTyo9PV0DBw483RgXFw0cOFBr1qypdb2LFi1SXFychg8fruDgYPXo0UMvv/yyQ5m+fftq0aJFyszMlGEYWrp0qXbu3KmrrrrqjPWWlJQoLy/PYQEAABeuRgtJR44cUVlZmUJCQhzWh4SEKCsrq9b17t69W7Nnz1b79u31xRdf6L777tO4ceP0+uuv28u89NJL6ty5s9q0aSMPDw8NGjRIs2bN0uWXX37GelNTUxUQEGBfIiIiat1GAABw/nNr7AbUNavVqri4OE2dOlWS1KNHD23evFlz5sxRcnKyJFtI+u6777Ro0SK1bdtW3377rR544AGFh4c79GxVNHnyZKWkpNg/5+XlEZQAALiANVpICgoKkqurq7Kzsx3WZ2dnn3FQdk2EhYWpc+fODus6deqkDz74QJJ04sQJ/e1vf9NHH32kwYMHS5IuueQSZWRk6Pnnnz9jSPL09JSnp2et2wUAAJqWRrvd5uHhoV69eiktLc2+zmq1Ki0tTX369Kl1vf369dOOHTsc1u3cuVNt27aVJJWWlqq0tFQuLo6n7urqKqvVWuvjAgCAC0uj3m5LSUlRcnKy4uLiFB8frxkzZqiwsFBjxoyRJI0ePVqtW7dWamqqJNtg761bt9p/z8zMVEZGhvz8/BQTEyNJmjBhgvr27aupU6dqxIgRWrt2rebOnau5c+dKkvz9/ZWYmKiJEyfK29tbbdu21fLly/XGG2/ohRdeaISrAAAAzktGI3vppZeMyMhIw8PDw4iPjze+++47+7bExEQjOTnZ/nnPnj2GpCpLYmKiQ52ffvqp0bVrV8PT09Po2LGjMXfuXIfthw8fNm677TYjPDzc8PLyMjp06GBMnz7dsFqtNW53bm6uIcnIzc2t1XkDAICG58z3d6POk9SUMU8SAABNT5OYJwkAAOB8RkgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAwQUgCAAAw4eZM4W3btundd9/VihUrtG/fPhUVFalVq1bq0aOHkpKSNGzYMHl6etZXWwEAABqMxTAMo7pCGzZs0COPPKKVK1eqX79+io+PV3h4uLy9vXX06FFt3rxZK1asUF5enh555BGNHz/+gg9LeXl5CggIUG5urvz9/Ru7OQAAoAac+f6uUU/SsGHDNHHiRL3//vtq3rz5GcutWbNG//73vzV9+nT97W9/c6rRAAAA55Ma9SSVlpbK3d29xpU6W74poicJAICmx5nv7xoN3K4u8Bw/ftyp8gAAAOc7p59ue+aZZ7Rw4UL75xEjRigwMFCtW7fWxo0b67RxAAAAjcXpkDRnzhxFRERIkr766it99dVXWrx4sa6++mpNnDixzhsIAADQGJyaAkCSsrKy7CHps88+04gRI3TVVVcpKipKCQkJdd5AAACAxuB0T1KLFi104MABSdKSJUs0cOBASZJhGCorK6vb1gEAADQSp3uSbrjhBt1yyy1q3769fv31V1199dWSpB9++EExMTF13kAAAIDG4HRI+te//qWoqCgdOHBAzz77rPz8/CRJhw8f1v3331/nDQQAAGgMNZonCVUxTxIAAE1Pnc+4XdmOHTv00ksvadu2bZKkTp06aezYserQoUNtqgMAADjvOD1w+4MPPlDXrl2Vnp6u2NhYxcbGasOGDeratas++OCD+mgjAABAg3P6dttFF12kkSNH6sknn3RYP2XKFL311lv6+eef67SB5ytutwEA0PTU+WtJKjp8+LBGjx5dZf2oUaN0+PBhZ6vTrFmzFBUVJS8vLyUkJGjt2rVnLLtlyxYNGzZMUVFRslgsmjFjhmm5zMxMjRo1SoGBgfL29la3bt20fv16hzLbtm3TkCFDFBAQIF9fX/Xu3Vv79+93uv0AAODC5HRI6t+/v1asWFFl/cqVK3XZZZc5VdfChQuVkpKiKVOmaMOGDYqNjVVSUpJycnJMyxcVFaldu3aaNm2aQkNDTcscO3ZM/fr1k7u7uxYvXqytW7dq+vTpatGihb3Mzz//rD/84Q/q2LGjli1bpk2bNumxxx6Tl5eXU+0HAAAXLqdvt82ZM0ePP/64RowYoUsvvVSS9N133+m9997TE088ofDwcHvZIUOGnLWuhIQE9e7dWzNnzpQkWa1WRUREaOzYsZo0adJZ942KitL48eM1fvx4h/WTJk3SqlWrTINcuZtuuknu7u568803z3qMs+F2GwAATY8z399OhyQXl5p1PlkslrPOwH3y5En5+Pjo/fff19ChQ+3rk5OTdfz4cX3yySdnrf9MIalz585KSkrSwYMHtXz5crVu3Vr333+/7rrrLkm2IBYQEKBHHnlEK1eu1A8//KDo6GhNnjzZoR2VlZSUqKSkxP45Ly9PERERhCQAAJqQeh2TZLVaa7RU94qSI0eOqKysTCEhIQ7rQ0JClJWV5Wyz7Hbv3q3Zs2erffv2+uKLL3Tfffdp3Lhxev311yVJOTk5Kigo0LRp0zRo0CB9+eWXuv7663XDDTdo+fLlZ6w3NTVVAQEB9qX8/XUAAODCVKt5ks5nVqtVcXFxmjp1qiSpR48e2rx5s+bMmaPk5GRZrVZJ0nXXXacJEyZIkrp3767Vq1drzpw5SkxMNK138uTJSklJsX8u70kCAAAXphr1JL377rs1rvDAgQNatWpVteWCgoLk6uqq7Oxsh/XZ2dlnHJRdE2FhYercubPDuk6dOtmfXAsKCpKbm9tZy5jx9PSUv7+/wwIAAC5cNQpJs2fPVqdOnfTss8/aZ9muKDc3V59//rluueUW9ezZU7/++mu1dXp4eKhXr15KS0uzr7NarUpLS1OfPn2cOAVH/fr1044dOxzW7dy5U23btrUft3fv3mctAwAAUKPbbcuXL9eiRYv00ksvafLkyfL19VVISIi8vLx07NgxZWVlKSgoSLfddps2b95cZZzRmaSkpCg5OVlxcXGKj4/XjBkzVFhYqDFjxkiSRo8erdatWys1NVWSbbD31q1b7b9nZmYqIyNDfn5+iomJkSRNmDBBffv21dSpUzVixAitXbtWc+fO1dy5c+3HnThxom688UZdfvnlGjBggJYsWaJPP/1Uy5Ytq/GFAwAAFzann247cuSIVq5cqX379unEiRMKCgpSjx491KNHjxo/+VbRzJkz9dxzzykrK0vdu3fXiy++qISEBEm2OZmioqI0f/58SdLevXsVHR1dpY7ExESHgPPZZ59p8uTJ2rVrl6Kjo5WSkmJ/uq3ca6+9ptTUVB08eFAdOnTQE088oeuuu67G7WYKAAAAmp56nQIANoQkAACaHme+vy+4p9sAAEATZRhSVpa0aZO0caMUECDdc0+jNYeQBAAA6p7VKu3dK/3yi1RaKp06ZVtKS6XCQikvT8rNtf08elTassUWjn755XQd3bsTkgAAQB3Ly5OOHZPy86WCAtvPwkKpuFgqKTm9nDxZdSkulk6csC3lvxcV2ZbCQtvPkyelVq2kNm2k1q1tPz09Vbplpwo3/azC7QdkKS5SuA47NGuxBilbISqSj07IW0XyUZFCVaR2KtRNKpKPCuWr2zRf12/93Baq3N0b5RISkgAAqA+GYQsSRUWnQ0bln5WDR/m28gBTHmgqbisqkiwWKTJSio4+veTn225RZWTYfh48eNbmFcpHu9Xut5BiCyblv9uW5ipSuIrko6f1d7nKat93tu7VfN2mokM+Ktp4OuwUylendDrQ/FFpStNAh+NOVqo2qnu1ly/hzxG6/tF/SK6uzlz1OuV0SFq6dKkGDBhQH20BAKD+GMbpWz0VQ0fF3hKzEFO+vnypGFCiomzLsWPShg225YcfpB9/tPXkWK3VtcqBVRaHwFL5Z5jy1FM/2AqvXStJelRP6bjKVChfFeoSFaqPCuT32+fTwWeexuga/Z/9WOsVp/468+u4KnpU/5SfCm3n7uOjw0aM1hYlVLtfYYs20qixkoeH5OYmubnJ5/VA6ez5TZJU1KGnFFuj5tUbp0PSoEGD1KZNG40ZM0bJycm8mgMAcG4MwxZSiopst4UKCmxBpqDgdIAp71kpLZXCwk6Hk2bNbPsfPCilp0vr19tCypEj5r001bxXtCZK5aYi+chXhXLT6foOqrXS1Uv5ilSBOpuGnAL5yVsnNE+3O9Q5Rq/pXd2kYnmf9dhj9Jpec7nLds6/PZw+Sw/ouFpU2+6860ZLCf0kLy/J01O+Wa2lp2p2zkXb9ssvykfy9JQsFvk+I2mS5ONjyMfLkI9HqXzcTsrbrVS+zd3lG+QjX39XdezYQXr6RYe6UrpLv/4qeXvbFh+f0z99fU8vAQE1a1t9cjokZWZm6s0339Trr7+uJ554Qn/84x91xx13aOjQofLw8KiPNgIAGovV6ti74uIihYbaegUqOnVK2rHDFlB27To9/qV8qRxWCgsd662tli1tt2MqDvaVZEg6IW97b0qhAiv8fnrprozTPTOScuWvuzXXoUyB/Ow9MwXy00l5SpI2qId6KMO+71IN0Gi9WW2TA70KpPE7HZKB9e3LVLzq7AFJkgr/nCz9b4wtLB44IO3ZI5/hHjp+vGpZV1db2PDxsS0eo0ZIfz69PSxTuuPQ6VBSXq48tFRcFxDdUr+dtiTp4YeliRMlFxeLJItsGz1VE3/+c/VlzhfnNE/Shg0bNG/ePL3zzjuSpFtuuUV33HGHYmMbuX+sATBPEoDzjmFI+/ZJe/aYBxOzcTDlPTflvTeVbz2dPFn1OC4uUnj46QG7Bw7Ybi/VIuxYZdEJeatAfmqlX+Si019Jm9RN6eplDyeVg0v57zH6SbN1v0O98fpe6xRf7fH/0XORpvT72pYKvLyU69Jczf8xoUZtXzl2ofpZVtue4PLx0YfuN2rYm0Or3c/T03aJK5oyRfroI8felPLfK67r2lW6/nrHfb//3vY/iY+P5Od3evHwsN0dg6MGnUzy0KFDmjt3rqZNmyY3NzcVFxerT58+mjNnjrp06XIuVZ/XCEkAzsowbKEhP9+2FBXZvhnLl/IwUnGpGFoqPpFU8aebm208TFSU1Lat7dbTTz/ZbjWlp9sepa4nJ+WufDWrslTsZblCaeqgnfZ9ftJFmqjnKpRppkKX33pmDB8VGr72skevvFEtWsj2De/rq6cyrtXjK66stl093DZpw4C/SHFxUq9eUlyc+idHavny6hPCxInSs8+e/nzqlOODVBaLY/Dw8zsdWp55xvaEerldu6T337c336Fsedhp1sz2e1BQtU1DPan3ySRLS0v1ySef6LXXXtNXX32luLg4zZw5UzfffLN++eUXPfrooxo+fLj9PWsAcF6yWk/P11IeQio+UVRScjq4lP+0WqWIiNNjYiIibD0pa9eeXrZvt9VZB+NfTO3cedbNp+SqE/JWMxU4rP9B3bVL7e23jyouhfJTgVuAClz81dcnQ38PefX0oBFvb7Ve9T8dKgmstmnzhn2mDrdJatFC8vXVicyW+viaSMdCZxjLXPjaQrVoc/qz378kraj2kCpsd4n05ZcO63r0+K0OP8dxLuVL+frycuXc3GwdceXbvbxq3hvTvr00eXLNyqJpcDokjR07Vu+8844Mw9Ctt96qZ599Vl27drVv9/X11fPPP6/w8PA6bSiA36HiYlvPSOUBuIGB0kUX2f5ZXs4wbD0qa9fanjAq36/iE0vlYadi8GnkNzOVyk0F8rP3yJQv5Z+v1FcK1i+2ezTNmmldQSe9WHyXadApsDRTgaWZiq2e8vcsVu7U/5weVOLrq1lz4/Xql2d52OaU7YfHn66UPprosMkjWtLe6s+ncMA10jWnP/tW+oe6l5djT0v5Tz8/2y2jiq64Qpo9u2rQMQs+lf3rX9W39Uyiomq/Ly4sToekrVu36qWXXtINN9wgT0/zQVpBQUFaunTpOTcOQBOVk2PrTcnNtfXQlPfUlJTYelfKl/LHsSveUjp61Pboy5Ejtm1nExoqxcTYvnnT022PYTegreqkLIVWCTgFAW2U7xmkAldbz8yf2m7RLV032drp5aUTrn5qM+NhFZz00Mmys/9neOmifAUP8rLfA8paZOit687QtWH8tkgqKPWSMSHFoRfEb4WkL812dGR22Xv3tt3l8/W1ZdPKS3lwSaj0VHhkpHT48OnbTc5MeXPJJbYFaCxOh6S0tLTqK3VzU2JiYq0aBKABZWdLP/8sHT/u+IqA8snsym87FRbaAkj5UlBgG1QREWH7FoyIsO1XPk9MZmbDtD8ry7aYMCT7I9flY2fy3IN0qd9mefq527/tV1n76JO8/ip0+S3olPkov8xb+aXeKij1VEGpp/JPeig6pEjrZq613W7bv1/as0cPvT5SX2ebfIvnOn5sNby/bqnQs+FlSMem1awTq8DSTBXm5pNfs6oBqWIPS3lYadbMlkErPnR83XW2/7kqlqk41qZiHZX973/Vt9WMm5stywJNUa1n3N66dav279+vk5WefBgyZMg5Nwr43TIM222h8p6XigN5zQb+Vrx1VN4Tc/z46eXECdsTSO3a2W5PRUXZQkV6+rmHmT17pHXr6ua8f3NULZTr0lIFzdso37+18v3ClO/dSoVuzVVgaaZCl2YqNHz0p+arlZD7pe32WlaW9ilSw9w+UYFnkPJd/FVQ5q2CYjdZrZUCRam0Z4Pj7ZQfZkrPja2+bf6tvKRBgxzW+e2U9HH1+xY4Dg2SxSLFxlYdFFyxl6b8c+fOjvvGx9uGJPn52cr5+FS9TXUmAwbYFgA143RI2r17t66//nr9+OOPslgsKn84zvJbn25ZfQ1UBM4XhmHrXan82HTFx6vLn2gqf6qpZUvbP+HLl8LC070uGzZI27ad7sVxcobeamVn20JRXfHyknx9VfJrgfLlpyD96rB5g9/l2tj6T8oPiVG+e0tbL47VV/llPioo9VD+CXflF7upd4d8vTRh9+mE0KyZEi4L0U+7XaWjsi1n0OJfVyhh/GO2DwUFctlRpPS4YPuYmrPJy3P8bDaepeKploeWyMiq22+4QerY8XSoqdgzU/H3QJPxzj/8UHVdTfj62gYIA6h/Toekhx56SNHR0UpLS1N0dLTWrl2rX3/9VQ8//LCef/75+mgjUDunTjn2slgstttC3pUmbDtyxNYjkp5uCxTlPTLl42TKBwxXXE7V4Nu4Mbm7254ucneXDh+WYbXaZ/3Nk78tuPiGKb9drPLDO+iyLkfVOsLFNsWtv7825wRr6vvtlV/sofxidxWUuKmwxF0FJ1xVWGRRQZ5U+tuhTi1dIdfM/bZE0aOH3vlPtJ6fbpF2nL2J3qHNpUTHQcTNajjDbn5+hQ9+fmp2kZ9cXBx7YSr+LP/d3992WSoaNEhavvz0LauK4aa68TO33lqz9gJompwOSWvWrNE333yjoKAgubi4yMXFRX/4wx+UmpqqcePG6Yfa/vMIkGyh5McfbbeKKj6BVFJiCyanTtkGWhQXO/bW5OWdHlNTvlSera1caKjtfktQkLR5s20iuMbWvLntbdr+/ralWTPbTz8/HVK4coxWynfxV77xW6/MKW/ln/JWgdVHBWXeyi/10qVxpzT6VsOWAn57bjkyUjrmY/z2EFelW0+Fkn60LR/e4zhB3bEV0juOc/OdUUGPyxTQ//Rnv2ZnLOrALGdeeaV08cXmPTMVb0ldfLHjfgEBtvpqM3FeWJhtAYDKnA5JZWVlavbbY7dBQUE6dOiQOnTooLZt22rHjmr+6Yim69Sp02NkKt9aqjxjb+WZfStuLyiwfYGXzzETHW0b2blmjbR6te3N1XV9u6myswz2NeXuXnU2uIrf4L6+Mry8VegWoHwX2xIZYcir5W9lvb21LaNEX6zwVn5OsfJ+Pan8Ml/l+4cr3ztYea4tbAOECyxqZpHWfeN4+IeG2yaoq06RrzS60swbtpxZfXJw6JmR45P1km3MS8WQ4ut7OstVvsM+eLAUEmL+BFT54utrPo7mmWeqP08zzCoMoD44HZK6du2qjRs3Kjo6WgkJCXr22Wfl4eGhuXPnql27dvXRRtRU+Usiywf9mr29uuLi7X06qJQPuNi40RZW1qyxDZo4dsxW35l6ZWprec3ePO0Ui8X2zf3bLaPynhj7Ulpq6zXau1c6fFilclOeV4jyu1yq/M4JymvXXQUtIpRv9VWB4aNLerqrZz9v+6PXubnSmDEVnmj/5fSlzs93fFJp/XrbxL/l0o9IEz6v/hSaN6+6rnJgOZPKg4Ml26Dfo0fNBwZXzHpxcY77depkmz24vJy3d82DSFxc1foAoClyOiQ9+uijKvxtEo0nn3xS11xzjS677DIFBgZq4cKFdd7A3y3DsD15lJ4uZWTYXt5o1mNTHoQKCmzf2KWl1VZtysXFFgZKSur0NJxisUjdukmXXmq7/1Gx28LLy9bj5O4uubnplyJf7S8MVJ7RTHlltkHBeSc9lV/g4jB5cuvW0lOV3nJ91VXSt0cNlZRYpGJJ6b8tlTz+uNSz/+nPLi62dyvVROV5ZqoLOuXjaczeet2/v+20K4ab8vxXMewEB1fdd0UNZis24+lpm34IAH7PnA5JSUlJ9t9jYmK0fft2HT16VC1atLA/4YZaKiuT/vGP0+9gyslpuGNbrVUDkre37Zu3/Fu5/D5J+Suiy2fyrXwfxtdX8vaW4W0bKJxv8VeB/BQU4a0WrX1s6WXfPuVkHNKbH/raemKaRyjfL0wFJz2Uf0jK3+HYS7Nli+MTQnOflh59tPrTio2tGpLKymQLSNWo3DPj62vLceU9RhVDSqVhRGrZ0nHfuDhpwYKqt53K9ztbT83o0bYFANCwaj1PUkUtK38joHZcXaX586WDB2te/rdAIh8fWzdExVtN5WHmt7dbV3wPk7y9beljz57TS0GBTsb2Vl6PROV1vlR54R1VWOLm8FBXWJjtVQEV3XGHbW698lBzpltQr74q3X67bG3r1k05lm76Sw2//AsKHEPSudyCat/eNqFz5aBSsVfGz6/qO51cXGz/05xtTM2ZtG4t3XxzzcsDABpfjULSDTfcUOMKP/zww1o3BrJ1ORw8aOuK+O1t1urVy/a278qP+FR8VbVsY2Z27HB8V6fDXINHbNtOnpTmzXM87IQJ0n/+I53cIeksM+ted13VkLR8uW3S5upUHhxczcuX5eZ2OsBUvovYvbt0//2OAafig2Hli9ntqzlzqm/rmfBKQgD4/ahRSAow+6ZB/UhN1Xej/6O0LaHKy7co75iU/5HjtD3lv7/zjnTZZad3XblSuuaaM1dd0auvOvaEuLjYwlN1Kk/EJzn26pTPRVM5vPj5VX1sOzjY9qoDs7lt/P1t42LOdAvq8sttCwAA9aVGIWle5W4H1J+OHbXyM+nRx6overTSjMQ1vQUl2XqXKpaPirKN36k4tqbiqxHKl+joqnV99ZUt0Dh7C8rLSxo+vOblAQBoSLUak3Tq1CktW7ZMP//8s2655RY1a9ZMhw4dkr+/v/zM3owIp5ztNpTFcjq8VNa2rTR2bNWxNRVnEi4PPz4+jvuOHWtbaiMoqHb7AQBwPrMYRk3eQ33avn37NGjQIO3fv18lJSXauXOn2rVrp4ceekglJSWacy4DPpqQvLw8BQQEKDc3V/7VDa5x0t69tkmnK9+ycna+GgAA4MiZ7+9avbstLi5OGzduVGCFx42uv/563XXXXc63FlWUT0YNAAAaj9MhacWKFVq9erU8PDwc1kdFRSkzM7POGgYAANCYnBhma2O1WlVW+WVNkg4ePGh/pxsAAEBT53RIuuqqqzRjxgz7Z4vFooKCAk2ZMkV/+tOf6rJtAAAAjcbpgdsHDx5UUlKSDMPQrl27FBcXp127dikoKEjffvutgs1eIHUBqs+B2wAAoH448/3tdEiSbFMAvPvuu9q0aZMKCgrUs2dPjRw5Ut7e3rVudFNDSAIAoOmp16fbJMnNzU2jRo2qVeMAAACaghqFpEWLFtW4wiFDhtS6MQAAAOeLGoWkoUOHOny2WCyqfJfO8tsMh2ZPvgEAADQ1NXq6zWq12pcvv/xS3bt31+LFi3X8+HEdP35cixcvVs+ePbVkyZL6bi8AAECDcHpM0vjx4zVnzhz94Q9/sK9LSkqSj4+P7r77bm3btq1OGwgAANAYnJ4n6eeff1bz5s2rrA8ICNDevXvroEkAAACNz+mQ1Lt3b6WkpCg7O9u+Ljs7WxMnTlR8fHydNg4AAKCxOB2SXnvtNR0+fFiRkZGKiYlRTEyMIiMjlZmZqVdffbU+2ggAANDgnB6TFBMTo02bNumrr77S9u3bJUmdOnXSwIED7U+4AQAANHW1mnEbzLgNAEBT5Mz3t9O32wAAAH4PCEkAAAAmCEkAAAAmCEkAAAAmnH66TbK9n+2jjz6yz67dqVMnDR06VG5utaoOAADgvON0qtmyZYuGDBmirKwsdejQQZL0zDPPqFWrVvr000/VtWvXOm8kAABAQ3P6dtudd96pLl266ODBg9qwYYM2bNigAwcO6JJLLtHdd99dH20EAABocE73JGVkZGj9+vVq0aKFfV2LFi309NNPq3fv3nXaOAAAgMbidE/SxRdf7PDetnI5OTmKiYmpk0YBAAA0NqdDUmpqqsaNG6f3339fBw8e1MGDB/X+++9r/PjxeuaZZ5SXl2dfAAAAmiqnX0vi4nI6V5W/q628ioqfLRaLysrK6qqd5x1eSwIAQNPjzPe302OSli5dWuuGAQAANBVOh6TExMT6aAcAAMB5xemQ9O233551++WXX17rxgAAAJwvnA5J/fv3r7KufCySpAt6HBIAAPj9cPrptmPHjjksOTk5WrJkiXr37q0vv/yyPtoIAADQ4JzuSQoICKiy7sorr5SHh4dSUlKUnp5eJw0DAABoTE73JJ1JSEiIduzYUVfVAQAANCqne5I2bdrk8NkwDB0+fFjTpk1T9+7d66pdAAAAjcrpkNS9e3dZLBZVnoPy0ksv1WuvvVZnDQMAAGhMTt9u27Nnj3bv3q09e/Zoz5492rdvn4qKirR69Wp17NixVo2YNWuWoqKi5OXlpYSEBK1du/aMZbds2aJhw4YpKipKFotFM2bMMC2XmZmpUaNGKTAwUN7e3urWrZvWr19vWvbee+89a10AAOD3x+mepLZt29ZpAxYuXKiUlBTNmTNHCQkJmjFjhpKSkrRjxw4FBwdXKV9UVKR27dpp+PDhmjBhgmmdx44dU79+/TRgwAAtXrxYrVq10q5du9SiRYsqZT/66CN99913Cg8Pr9PzAgAATVutBm4vX75c1157rWJiYhQTE6MhQ4ZoxYoVtWrACy+8oLvuuktjxoxR586dNWfOHPn4+Jzx1l3v3r313HPP6aabbpKnp6dpmWeeeUYRERGaN2+e4uPjFR0drauuukoXXXSRQ7nMzEyNHTtWb7/9ttzd3WvVfgAAcGFyOiS99dZbGjhwoHx8fDRu3DiNGzdO3t7euuKKK7RgwQKn6jp58qTS09M1cODA0w1ycdHAgQO1Zs0aZ5tmt2jRIsXFxWn48OEKDg5Wjx499PLLLzuUsVqtuvXWWzVx4kR16dKl2jpLSkqUl5fnsAAAgAuX0yHp6aef1rPPPquFCxfaQ9LChQs1bdo0PfXUU07VdeTIEZWVlSkkJMRhfUhIiLKyspxtmt3u3bs1e/ZstW/fXl988YXuu+8+jRs3Tq+//rq9zDPPPCM3NzeNGzeuRnWmpqYqICDAvkRERNS6fQAA4PzndEjavXu3rr322irrhwwZoj179tRJo86V1WpVz549NXXqVPXo0UN333237rrrLs2ZM0eSlJ6ern//+9+aP3++wytVzmby5MnKzc21LwcOHKjPUwAAAI3M6ZAUERGhtLS0Kuu//vprp3tXgoKC5OrqquzsbIf12dnZCg0NdbZpdmFhYercubPDuk6dOmn//v2SpBUrVignJ0eRkZFyc3OTm5ub9u3bp4cfflhRUVGmdXp6esrf399hAQAAFy6nn257+OGHNW7cOGVkZKhv376SpFWrVmn+/Pn697//7VRdHh4e6tWrl9LS0jR06FBJtl6gtLQ0Pfjgg842za5fv35VZv/euXOn/cm8W2+91WEclCQlJSXp1ltv1ZgxY2p9XAAAcOFwOiTdd999Cg0N1fTp0/W///1Pkq2XZuHChbruuuucbkBKSoqSk5MVFxen+Ph4zZgxQ4WFhfawMnr0aLVu3VqpqamSbIO9t27dav89MzNTGRkZ8vPzU0xMjCRpwoQJ6tu3r6ZOnaoRI0Zo7dq1mjt3rubOnStJCgwMVGBgoEM73N3dFRoaqg4dOjh9DgAA4MLjVEg6deqUpk6dqttvv10rV66skwbceOON+uWXX/T4448rKytL3bt315IlS+yDuffv3y8Xl9N3BQ8dOqQePXrYPz///PN6/vnnlZiYqGXLlkmyTRPw0UcfafLkyXryyScVHR2tGTNmaOTIkXXSZgAAcOGzGJXfL1INPz8/bd68+Yxjd34v8vLyFBAQoNzcXMYnAQDQRDjz/e30wO0rrrhCy5cvr3XjAAAAmgKnxyRdffXVmjRpkn788Uf16tVLvr6+DtuHDBlSZ40DAABoLE7fbqs4PqhKZRaLysrKzrlRTQG32wAAaHqc+f52uifJarXWumEAAABNRa1ecAsAAHChq3FP0okTJ5SWlqZrrrlGku01HSUlJfbtrq6ueuqpp+Tl5VX3rQQAAGhgNQ5Jr7/+uv7v//7PHpJmzpypLl26yNvbW5K0fft2hYeHa8KECfXTUgAAgAZU49ttb7/9tu6++26HdQsWLNDSpUu1dOlSPffcc/YZuAEAAJq6Goekn376Sd26dbN/9vLycnjSLT4+3v66EAAAgKauxrfbjh8/7jAG6ZdffnHYbrVaHbYDAAA0ZTXuSWrTpo02b958xu2bNm1SmzZt6qRRAAAAja3GIelPf/qTHn/8cRUXF1fZduLECT3xxBMaPHhwnTYOAACgsdR4xu3s7Gx1795dHh4eevDBB3XxxRdLknbs2KGZM2fq1KlT+uGHHxQSElKvDT5fMOM2AABNT73MuB0SEqLVq1frvvvu06RJk1SerSwWi6688kr95z//+d0EJAAAcOFz6rUk0dHRWrJkiY4ePaqffvpJkhQTE6OWLVvWS+MAAAAai9PvbpOkli1bKj4+vq7bAgAAcN7g3W0AAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmCEkAAAAmzouQNGvWLEVFRcnLy0sJCQlau3btGctu2bJFw4YNU1RUlCwWi2bMmGFaLjMzU6NGjVJgYKC8vb3VrVs3rV+/XpJUWlqqv/71r+rWrZt8fX0VHh6u0aNH69ChQ/VxegAAoAlq9JC0cOFCpaSkaMqUKdqwYYNiY2OVlJSknJwc0/JFRUVq166dpk2bptDQUNMyx44dU79+/eTu7q7Fixdr69atmj59ulq0aGGvY8OGDXrssce0YcMGffjhh9qxY4eGDBlSb+cJAACaFothGEZjNiAhIUG9e/fWzJkzJUlWq1UREREaO3asJk2adNZ9o6KiNH78eI0fP95h/aRJk7Rq1SqtWLGixu1Yt26d4uPjtW/fPkVGRlZbPi8vTwEBAcrNzZW/v3+NjwMAABqPM9/fjdqTdPLkSaWnp2vgwIH2dS4uLho4cKDWrFlT63oXLVqkuLg4DR8+XMHBwerRo4defvnls+6Tm5sri8Wi5s2bm24vKSlRXl6ewwIAAC5cjRqSjhw5orKyMoWEhDisDwkJUVZWVq3r3b17t2bPnq327dvriy++0H333adx48bp9ddfNy1fXFysv/71r7r55pvPmCpTU1MVEBBgXyIiImrdPgAAcP5r9DFJ9cFqtapnz56aOnWqevToobvvvlt33XWX5syZU6VsaWmpRowYIcMwNHv27DPWOXnyZOXm5tqXAwcO1OcpAACARtaoISkoKEiurq7Kzs52WJ+dnX3GQdk1ERYWps6dOzus69Spk/bv3++wrjwg7du3T1999dVZ7016enrK39/fYQEAABeuRg1JHh4e6tWrl9LS0uzrrFar0tLS1KdPn1rX269fP+3YscNh3c6dO9W2bVv75/KAtGvXLn399dcKDAys9fEAAMCFx62xG5CSkqLk5GTFxcUpPj5eM2bMUGFhocaMGSNJGj16tFq3bq3U1FRJtsHeW7dutf+emZmpjIwM+fn5KSYmRpI0YcIE9e3bV1OnTtWIESO0du1azZ07V3PnzpVkC0h//vOftWHDBn322WcqKyuzj4Fq2bKlPDw8GvoyAACA80yjTwEgSTNnztRzzz2nrKwsde/eXS+++KISEhIkSf3791dUVJTmz58vSdq7d6+io6Or1JGYmKhly5bZP3/22WeaPHmydu3apejoaKWkpOiuu+46ax2StHTpUvXv37/aNjMFAAAATY8z39/nRUhqighJAAA0PU1mniQAAIDzFSEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADAxHkRkmbN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cHCwevTooZdffrmRWtq0ne069+3bV2lpadq5c6ckaePGjVq5cqWuvvrqxmhqk1X+9/rss8+qdevWuvjii/WXv/xFJ06csJdZs2ZNlf9mJCUl1el3YaO/lgSOwsLCNGfOHMXFxamkpESvvPKK+vfvr++//149e/bUkSNHVFZWppCQEIf9QkJCtH379kZqddNT3XWuzGq1avz48erXr5+6du3aCC1ummpynd99911t2LBB69ata+TWNl01uc67d+/W7NmzlZKSor/97W9at26dxo0bJw8PDyUnJzfyGTQNNbnOkyZNUl5enjp27ChXV1eVlZXp6aef1siRIxu59U3L7t27tXLlSnl5eemjjz7SkSNHdP/99+vXX3/VvHnzJElZWVmm34VnGvNYK3XWJ4VqqQZdjGYuv/xyY9SoUYZhGEZmZqYhyVi9erVDmYkTJxrx8fF10cwmry6uc2X33nuv0bZtW+PAgQPn2LoLR11c5/379xvBwcHGxo0b7du53eaorv6e3d3djT59+jiUGTt2rHHppZeeaxMvCHV1nd955x2jTZs2xjvvvGNs2rTJeOONN4yWLVsa8+fPr8PWNm01udZXXnml4eXlZRw/fty+7oMPPjAsFotRVFRkGIbtb3rBggUO+82aNcsIDg6us7Zyu60JiI+P108//SRJCgoKkqurq7Kzsx3KZGdnKzQ0tDGad8GoeJ0revDBB/XZZ59p6dKlatOmTSO07MJS8Tqnp6crJydHPXv2lJubm9zc3LR8+XK9+OKLcnNzU1lZWSO3tumq/PccFhamzp07O5Tp1KmT9u/f39BNu6BUvs4TJ07UpEmTdNNNN6lbt2669dZbNWHCBPtL2lEzYWFhat26tQICAuzrOnXqJMMwdPDgQUlSaGhovX8XEpKagIyMDIWFhUmSPDw81KtXL6Wlpdm3W61WpaWlqU+fPo3VxAtCxessSYZh6MEHH9RHH32kb775RtHR0Y3YugtHxet8xRVX6Mcff1RGRoZ9iYuL08iRI5WRkSFXV9dGbm3TVfnvuV+/flWmsNi5c6fatm3b0E27oFS+zkVFRXJxcfxqdXV1ldVqbeimNWn9+vXToUOHVFBQYF+3c+dOubi42P+x2qdPH4fvQkn66quv6vS7kDFJ9aygoMDhXxl79uxRRkaGWrZsqcjISE2ePFmZmZl64403JEkzZsxQdHS0unTpouLiYr3yyiv65ptv9OWXX9rrSElJUXJysuLi4hQfH68ZM2aosLBQY8aMafDzO1/Ux3V+4IEHtGDBAn3yySdq1qyZ/T53QECAvL29G/YEzxN1fZ2bNWtWZYyXr6+vAgMDf9djv+rj73nChAnq27evpk6dqhEjRmjt2rWaO3eu5s6d2+Dnd76oj+t87bXX6umnn1ZkZKS6dOmiH374QS+88IJuv/32Bj+/84mz1/qWW27RU089pTFjxuiJJ57QkSNHNHHiRN1+++32//4+9NBDSkxM1PTp0zV48GC9++67Wr9+fd3+TdfZjTuYKn9ktPKSnJxsGIZhJCcnG4mJifbyzzzzjHHRRRcZXl5eRsuWLY3+/fsb33zzTZV6X3rpJSMyMtLw8PAw4uPjje+++66Bzuj8VB/X2aw+Sca8efMa7sTOM/X191wRY5Lq7zp/+umnRteuXQ1PT0+jY8eOxty5cxvojM5P9XGd8/LyjIceesiIjIw0vLy8jHbt2hl///vfjZKSkgY8s/OPs9faMAxj27ZtxsCBAw1vb2+jTZs2RkpKin08Urn//e9/xsUXX2x4eHgYXbp0Mf7v//6vTtttMYzf+TSgAAAAJhiTBAAAYIKQBAAAYIKQBAAAYIKQBAAAYIKQBAAAYIKQBAAAYIKQBAAAYIKQBKDJ+8c//qHu3bs3djPsLBaLPv74Y6f327Fjh0JDQ5Wfn1/3jargyJEjCg4Otr8DC4A5QhKAGpkzZ46aNWumU6dO2dcVFBTI3d1d/fv3dyi7bNkyWSwW/fzzzw3cyoZV1+Fs8uTJGjt2rJo1a1ZndZoJCgrS6NGjNWXKlHo9DtDUEZIA1MiAAQNUUFCg9evX29etWLFCoaGh+v7771VcXGxfv3TpUkVGRuqiiy5qjKY2Sfv379dnn32m2267rUGON2bMGL399ts6evRogxwPaIoISQBqpEOHDgoLC9OyZcvs65YtW6brrrtO0dHR+u677xzWDxgwQJL05ptvKi4uTs2aNVNoaKhuueUW5eTkSJKsVqvatGmj2bNnOxzrhx9+kIuLi/bt2ydJOn78uO688061atVK/v7++uMf/6iNGzeetb2vvPKKOnXqJC8vL3Xs2FH/+c9/7Nv27t0ri8WiDz/8UAMGDJCPj49iY2O1Zs0ahzpefvllRUREyMfHR9dff71eeOEFNW/eXJI0f/58PfHEE9q4caMsFossFovmz59v3/fIkSO6/vrr5ePjo/bt22vRokVnbe///vc/xcbGqnXr1vZ1Zj1VM2bMUFRUlP3zbbfdpqFDh2rq1KkKCQlR8+bN9eSTT+rUqVOaOHGiWrZsqTZt2mjevHkO9XTp0kXh4eH66KOPztou4PeMkASgxgYMGKClS5faPy9dulT9+/dXYmKiff2JEyf0/fff20NSaWmpnnrqKW3cuFEff/yx9u7da+8tcXFx0c0336wFCxY4HOftt99Wv3791LZtW0nS8OHDlZOTo8WLFys9PV09e/bUFVdcccZekLfffluPP/64nn76aW3btk1Tp07VY489ptdff92h3N///nf95S9/UUZGhi6++GLdfPPN9tuJq1at0r333quHHnpIGRkZuvLKK/X000/b973xxhv18MMPq0uXLjp8+LAOHz6sG2+80b79iSee0IgRI7Rp0yb96U9/0siRI8/aa7NixQrFxcWd9fqfyTfffKNDhw7p22+/1QsvvKApU6bommuuUYsWLfT999/r3nvv1T333FNlDFJ8fLxWrFhRq2MCvwt1+rpcABe0l19+2fD19TVKS0uNvLw8w83NzcjJyTEWLFhgXH755YZhGEZaWpohydi3b59pHevWrTMkGfn5+YZhGMYPP/xgWCwWe/mysjKjdevWxuzZsw3DMIwVK1YY/v7+RnFxsUM9F110kfHf//7XMAzDmDJlihEbG+uwbcGCBQ7ln3rqKaNPnz6GYRjGnj17DEnGK6+8Yt++ZcsWQ5Kxbds2wzAM48YbbzQGDx7sUMfIkSONgIAA++fKxy0nyXj00UftnwsKCgxJxuLFi02viWEYRmxsrPHkk086rDOr/1//+pfRtm1b++fk5GSjbdu2RllZmX1dhw4djMsuu8z++dSpU4avr6/xzjvvONQ1YcIEo3///mdsE/B7R08SgBrr37+/CgsLtW7dOq1YsUIXX3yxWrVqpcTERPu4pGXLlqldu3aKjIyUJKWnp+vaa69VZGSkmjVrpsTEREm2MTiS1L17d3Xq1Mnem7R8+XLl5ORo+PDhkqSNGzeqoKBAgYGB8vPzsy979uwxHRheWFion3/+WXfccYdD+X/+859Vyl9yySX238PCwiTJfitwx44dio+Pdyhf+fPZVKzb19dX/v7+9rrNnDhxQl5eXjWuv6IuXbrIxeX0f85DQkLUrVs3+2dXV1cFBgZWOb63t7eKiopqdUzg98CtsRsAoOmIiYlRmzZttHTpUh07dsweeMLDwxUREaHVq1dr6dKl+uMf/yjJFliSkpKUlJSkt99+W61atdL+/fuVlJSkkydP2usdOXKkFixYoEmTJmnBggUaNGiQAgMDJdmeoKs8Fqpc+figigoKCiTZxhMlJCQ4bHN1dXX47O7ubv/dYrFIso2TqgsV6y6v/2x1BwUF6dixY9XWW1ZWVqNj1eT4R48eVatWrao9JvB7RUgC4JQBAwZo2bJlOnbsmCZOnGhff/nll2vx4sVau3at7rvvPknS9u3b9euvv2ratGmKiIiQJIen48rdcsstevTRR5Wenq73339fc+bMsW/r2bOnsrKy5Obm5jBg+UxCQkIUHh6u3bt3a+TIkbU+zw4dOmjdunUO6yp/9vDwMA0ttdGjRw9t3bq1yvrs7GyHz7t3766T40nS5s2bq0zfAOA0brcBcMqAAQO0cuVKZWRk2HuSJCkxMVH//e9/dfLkSfug7cjISHl4eOill17S7t27tWjRIj311FNV6oyKilLfvn11xx13qKysTEOGDLFvGzhwoPr06aOhQ4fqyy+/1N69e7V69Wr9/e9/Nw1ckm3QdGpqql588UXt3LlTP/74o+bNm6cXXnihxuc5duxYff7553rhhRe0a9cu/fe//9XixYvtPU7l7d6zZ48yMjJ05MgRlZSU1Lj+ypKSkrRmzZoqoSsrK0tPPvmkdu/erQ8++EBvvvmmjh07pu3bt9f6WJJUVFSk9PR0XXXVVedUD3AhIyQBcMqAAQN04sQJxcTEKCQkxL4+MTFR+fn59qkCJKlVq1aaP3++3nvvPXXu3FnTpk3T888/b1rvyJEjtXHjRl1//fXy9va2r7dYLPr88891+eWXa8yYMbr44ot10003ad++fQ7Hr+jOO+/UK6+8onnz5qlbt25KTEzU/PnzFR0dXePz7Nevn+bMmaMXXnhBsbGxWrJkiSZMmOAwbmjYsGEaNGiQBgwYoFatWumdd96pcf2VXX311XJzc9PXX3/tsL5r167auXOnunTposcee0yvvPKKPDw89Je//KXWx5KkTz75RJGRkbrsssvOqR7gQmYxDMNo7EYAQFNw1113afv27fX22PysWbO0aNEiffHFF5Js8yR9/PHHysjIqPNjXXrppRo3bpxuueWWOq8buFAwJgkAzuD555/XlVdeKV9fXy1evFivv/66w6SUde2ee+7R8ePHlZ+fX6+vJjly5IhuuOEG3XzzzfV2DOBCQE8SAJzBiBEjtGzZMuXn56tdu3YaO3as7r333gY7fn32JAGoHiEJAADABAO3AQAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATBCSAAAATPw/tomdOuX8uFkAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "group_delay_mode = 2 * l_straight / vg_straight + 2 * np.pi * r / (\n",
    "    4 * vg_bend\n",
    ")  # calculate the total group delay\n",
    "\n",
    "plt.plot(ldas, group_delay_fdtd * 1e12, c=\"red\", linewidth=2, label=\"FDTD\")\n",
    "plt.plot(ldas, group_delay_mode * 1e12, \"--\", c=\"blue\", linewidth=2, label=\"Mode\")\n",
    "plt.xlabel(\"Wavelength (µm)\")\n",
    "plt.ylabel(\"Group delay (ps)\")\n",
    "plt.ylim(0.16, 0.17)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4785338e-a8e6-4653-a7a7-f866b5b037e1",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "description": "This notebook demonstrates how to calculate the group delay of a device using FDTD and mode solver.",
  "feature_image": "",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "keywords": "mode solver, postprocessing, group delay, Tidy3D, FDTD",
  "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.2"
  },
  "title": "Group Delay Calculation from FDTD and Mode Solver | Flexcompute"
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
