From 64ba815c67322a7187d751a0b245f27b1f0c5a6f Mon Sep 17 00:00:00 2001 From: fyc2646 Date: Wed, 4 Jun 2025 08:41:35 -0400 Subject: [PATCH] Added group delay calculation notebook --- GroupDelayCalculation.ipynb | 1289 ++++++++++++++++++++++++++ docs/features/data_visualisation.rst | 1 + 2 files changed, 1290 insertions(+) create mode 100644 GroupDelayCalculation.ipynb diff --git a/GroupDelayCalculation.ipynb b/GroupDelayCalculation.ipynb new file mode 100644 index 00000000..5e31a4c3 --- /dev/null +++ b/GroupDelayCalculation.ipynb @@ -0,0 +1,1289 @@ +{ + "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": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAHWCAYAAADHBNgdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABcjUlEQVR4nO3dB3gUdf4/8M+W9AYEEnoHAQGpUkTRkxNP7PfnlLM37IreieIp3tmwnuVshw29Ewv+BD1FEBGwIUVAQZAiTVpCS0gvu/N/3t84YXezu9nZ7Gx9v55nIZnMlsxs5r3fbtE0TRMiIiIyxGpsdyIiIgIGKBERURAYoEREREFggBIREQWBAUpERBQEBigREVEQGKBERERBYIASEREFgQFKREQUBAYoURRYvHixWCwW9T/Fl/fee09atGghpaWlYX/u9evXi91ul3Xr1oX9uRMBA5QojF544QWZMWOGxKKZM2fK008/LdHA6XTKY489Jl26dJHU1FTp37+/vP322wHfv6ioSCZOnCitWrWSjIwMOeWUU2TVqlVe9/3oo49k0KBB6nk6duwo9913n9TW1gb0PA6HQ+1/8803S2ZmpoRbnz59ZNy4cTJ16tSwP3dCwFy4RBQexx57rDZ69OgG2x0Oh1ZRUaH+j1bjxo3TOnXqpEWDu+66C3N4a9dcc402ffp09drw/dtvv93ofXGMR44cqWVkZGh///vfteeee07r06ePlpWVpW3atMlt37lz52oWi0U75ZRT1PPcfPPNmtVq1a677rqAXufs2bPV/Xft2qVFCn4HHJstW7ZE7DXEKwYohV1paamWqHwFaCyIlgBFGCUlJWk33nhj/Tan06mdeOKJWvv27bXa2lq/93/33XdVoMyaNat+W2FhodasWTNtwoQJbvsiWI877jitpqamftvf/vY3FYobNmxo9LWeffbZ2qhRo7RIqq6u1po3b67de++9EX0d8YgBSk2+mF155ZVamzZttOTkZK1z587q03lVVZX6+euvv64uVosXL9auv/56rVWrVupCpXv++efVRQr3xWPccMMN2uHDh92eA6WC888/X8vPz9dSUlK0du3aaRdccIFWVFRUv89nn32mnXDCCVpOTo4qWfTs2VObMmVKo68/kPtVVlZqU6dO1bp166ZeJy7Sd9xxh9ru6T//+Y82dOhQLS0tTf2euKjPnz9f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", + "text/plain": [ + "
" + ] + }, + "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": [ + "
20:03:43 Eastern Daylight Time Created task 'waveguide_bend' with task_id       \n",
+       "                               'fdve-8ead52ef-1fff-431f-ad70-8532052c3923' and  \n",
+       "                               task_type 'FDTD'.                                \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:03:43 Eastern Daylight Time\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-8ead52ef-1fff-431f-ad70-8532052c3923'\u001b[0m and \n", + "\u001b[2;36m \u001b[0mtask_type \u001b[32m'FDTD'\u001b[0m. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               View task using web UI at                        \n",
+       "                               'https://tidy3d.simulation.cloud/workbench?taskId\n",
+       "                               =fdve-8ead52ef-1fff-431f-ad70-8532052c3923'.     \n",
+       "
\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=159839;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=243507;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m\u001b]8;id=159839;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=301182;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[32mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=159839;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[32m-8ead52ef-1fff-431f-ad70-8532052c3923'\u001b[0m\u001b]8;;\u001b\\. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               Task folder: 'default'.                          \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=96140;https://tidy3d.simulation.cloud/folders/639eb096-a602-4b56-a502-cac1f18f9557\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "45e61213d7b742ecb6ddd86fa9d93104", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:03:44 Eastern Daylight Time Maximum FlexCredit cost: 0.273. Minimum cost     \n",
+       "                               depends on task execution details. Use           \n",
+       "                               'web.real_cost(task_id)' to get the billed       \n",
+       "                               FlexCredit cost after a simulation run.          \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:03:44 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.273\u001b[0m. Minimum cost \n", + "\u001b[2;36m \u001b[0mdepends on task execution details. Use \n", + "\u001b[2;36m \u001b[0m\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": [ + "
20:03:45 Eastern Daylight Time status = queued                                  \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:03:45 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstatus = queued \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               To cancel the simulation, use                    \n",
+       "                               'web.abort(task_id)' or 'web.delete(task_id)' or \n",
+       "                               abort/delete the task in the web UI. Terminating \n",
+       "                               the Python script will not stop the job running  \n",
+       "                               on the cloud.                                    \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \n", + "\u001b[2;36m \u001b[0m\u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or \u001b[32m'web.delete\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[0mabort/delete the task in the web UI. Terminating \n", + "\u001b[2;36m \u001b[0mthe Python script will not stop the job running \n", + "\u001b[2;36m \u001b[0mon the cloud. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
20:03:49 Eastern Daylight Time status = preprocess                              \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:03:49 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstatus = preprocess \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:03:53 Eastern Daylight Time starting up solver                               \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:03:53 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstarting up solver \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
20:03:54 Eastern Daylight Time running solver                                   \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:03:54 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mrunning solver \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "44ecd60dc6bb4869a3b22a76da2037d9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
20:04:49 Eastern Daylight Time early shutoff detected at 84%, exiting.          \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:04:49 Eastern Daylight Time\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": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
                               status = postprocess                             \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mstatus = postprocess \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
20:04:51 Eastern Daylight Time status = success                                 \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:04:51 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstatus = success \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:04:53 Eastern Daylight Time View simulation result at                        \n",
+       "                               'https://tidy3d.simulation.cloud/workbench?taskId\n",
+       "                               =fdve-8ead52ef-1fff-431f-ad70-8532052c3923'.     \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:04:53 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mView simulation result at \n", + "\u001b[2;36m \u001b[0m\u001b]8;id=858405;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=411564;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m\u001b]8;id=858405;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=122383;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[4;34mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=858405;https://tidy3d.simulation.cloud/workbench?taskId=fdve-8ead52ef-1fff-431f-ad70-8532052c3923\u001b\\\u001b[4;34m-8ead52ef-1fff-431f-ad70-8532052c3923'\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": "c44ee2d629a34c0283cfe2faa8fbc1e1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:04:54 Eastern Daylight Time loading simulation from simulation_data.hdf5     \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:04:54 Eastern Daylight Time\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": "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op/Lli3z2q+hSn344YdmMWatHdFApQtXJiUlmdd0ZXRd0XvcuHFen6WLgupq3zt37jTbR44ckQcffFCKFi0q+fLlk7/85S+ydu3adK9XFx+tXr26REdHS7Vq1eTtt992v/bbb7+Zmq6vvvrKXOc111wjderUkaVLl3qdY+LEiVKmTBnz+p133mkWKi1QoIB5bfLkyWbhTb0OPZcW3efZpKXv0fdWqVJFpk+fnu71fvbZZ+YaSpUqlW5NlS6yWr58efe2hqpOnTqZhWuLFy9uru+FF14wNX66IKguIKr3eNKkSV7n0cVXY2NjZdq0aeleFxDOCEkAMkwDhdYSOfS5NrXpStzO/lOnTpmaJScknTt3zqzmrWFC++loQHFqSzQI3XPPPTJlyhSvz9EajubNm0u5cuXMdpcuXUywmjVrlqxatUrq168vN998c5q1IPr+559/3qzGvmnTJhMghg4dKu+//77Xcc8++6w8/fTTZjXy6667zlyL05y4ePFiefTRR81K4/p6mzZtzPkc3bp1k6eeesqEjX379pmi+xwaoLp27Srr1q2TW2+9Vbp3755urY3WymmYzApdiX7v3r2ycOFCE+S0Ge22226TggULmv8W+nM88sgjl/RBiouLM58LIA0+XS4XQEibOHGiK0+ePK5z586Z1c5z5crlSkpKck2ZMsXVokULc8zcuXPN6t47d+60nmPFihXm9ePHj5vtn3/+2RUREeE+/sKFC65SpUq5xo0bZ7YXLVrkypcvn+v06dNe59HV2N955x3zPD4+3lWnTh2v1/SaPL344ouupk2bmuc7duww1/Cvf/3L/fqGDRvMPl15XHXr1s3VoUMHr3N0797dlT9/fvd26s916Hmee+459/aJEyfMvlmzZqV5b/U8L7zwgtc+2/nffPNNV7ly5dzbunq6but9c1StWtV14403urfPnz9v/rt98sknXucaMGCAWckegB01SQAyTGuNTp48KStWrDA1EFr7ok1gWpPk9EvSpraKFSuaPklKa35uv/12s61Nbnqs0wdHaXOSNos5tUkLFiwwtUZae6S0Bkr7QhUuXFjy5s3rLjt27LB2DNfr0/0PPPCA1/EvvfTSJcdff/317ufalKicpkAdaaY1LZ5Sb6fH89x58uQxzYTOuW20Bk6bBrNCa7O0Vs6hzW61a9d2b+fMmdPcv9SfHxMTI8nJyVn6TCAc5Ar0BQAIHpUrVzb9W7Rp7fDhw+7Ao31btO/OkiVLzGvaZ8gJLO3atTNFm8A0UGk40u2zZ8+6z6tNURqSBg8ebB5vueUW86WuNCCl7gvlcPoHedLjnf5EjRs39npNw4InHZnn0D5FTj8pX/A8t3P+9M6tI870nl7OhQsXMvRZGfl8bf7T/yYA7AhJADJF+xppYNEvdO0Y7GjRooXpM7R8+XLp06eP2bd582Y5ePCgjBgxwoQo5Tk6zqGduZ977jlT6/TFF1+Y6QYc2v9o//79kitXLq8Oy2nRWhQNbdu3bzfh60o6qmuNmafU25GRkdbQkhX16tWTjRs3XrI/MTHRa1t/Ll9Zv379JdM3APgTzW0AMh2SfvrpJ9OZ2alJUvr8nXfeMTVETqdtbWLTIDF69Gjz5a4jvLQTd2oafpo1a2aayDR0dOzY0f1a69atpWnTpmYE1/fff286fmuNlXa6tgUup9N0QkKCvPXWW7J161b55ZdfzOgu7dScUTpf0bfffmves23bNvOzaQh0apyc69ZmP70XOprtzJkzklVau6aj61KHLg2IOlpN79+XX35pRgtqQNUAeiW0mU1Dadu2ba/oPEAoIyQByBQNQNp/RpvetNbGMyTpTNHOVAFKm3J0WPznn38uNWrUMDVKr7/+uvW8Wuuj/Y902Lz2lXFoKNGwojVVOreP9oO6++67zfQAnp/vSacL0CkANBhp3xy9Nr0Onaogo3R0ndZoaUjSofmzZ8+WAQMGePUb6ty5s2ka1HuiP+snn3wiWdW+fXtTW/bDDz947a9Vq5YJetrvSEfo6c+lwVNH5V2Jb775xoTYG2+88YrOA4SyCO29HeiLAIBg8NBDD5kaHH8Nmx87dqypbfvuu+/c8yTptAlaU+VrTZo0kX79+pmmTgB29EkCgDRorZfOj6Sj07SpTedZ8pyU0td0LiOdOFNr5Py5NIk2Dd51111mXigAaaMmCQDSoJNBaid1DS06rYH2U9KJGa8Wf9YkAbg8QhIAAIAFHbcBAAAsCEkAAAAWhCQAAAALQhIAAIAFIQkAAMCCkAQAAGBBSAIAALAgJAEAAFgQkgAAAORS/w8boaelRbnutQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "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": "iVBORw0KGgoAAAANSUhEUgAAAfMAAAHWCAYAAABjbmDOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2GUlEQVR4nO3dC5xN9f7/8c+4zbhkCM1Fgym3yC2XMdJDZTKVX+ji4FTkuHRx1KSO+MVM+ukIhaNIN+ZXUVIaFWckJYo4bo+D5JDLUGNQxkSGDuv/+HzPf+3f3nO/z/6O1/PxWMZae62113fvPfNe3+/6ftcOcBzHEQAAYK1K5X0AAACgeAhzAAAsR5gDAGA5whwAAMsR5gAAWI4wBwDAcoQ5AACWI8wBALAcYQ4AgOUIc6ACWrNmjQQEBJifqHg2bdok1apVk0OHDpX5c//8889Ss2ZNWbFiRZk/N3JHmAMWmzt3riQmJoqNFi1aJLNmzRJ/8uabb8o111wjQUFB0qxZM3nppZcKvO25c+fkqaeekvDwcKlevbpERUXJqlWrclx3/fr10r17d6lRo4aEhobKo48+KqdPny7wcz399NMyaNAgady4sZS1evXqyfDhw2XixIll/tzIg96bHYCdWrdu7fTo0SPb8gsXLjhnz541P/1V7969ncaNGzv+Yt68efo9Fc7dd9/tvPbaa879999v5p9//vkCbT9w4ECnSpUqzpNPPum8+uqrTnR0tJlft26dz3rbtm1zgoKCnA4dOjivvPKK8/TTTzuBgYHOrbfeWqDn0e31uNavX++Ul++++84cw+rVq8vtGOCLMIf1Tp8+7VyqcgtzG/hTmP/2229OvXr1zDF5u/fee52aNWs6v/zyS57bb9y40YTb9OnTPcv0ZOrqq682oe7ttttuc8LCwpxTp055lr3++utm+5UrV+Z7rI8++qjTqFEj5+LFi055uvbaa80JD/wDYQ6/cuTIEedPf/qT+WNXrVo1p0mTJs5DDz3knDt3zjy+YMEC80dvzZo1zsMPP+w0aNDAqVOnjmf7OXPmOK1atTLb6j4eeeQR5+TJkz7P8a9//cu56667nJCQEFMjatiwoTNgwAAnPT3ds85nn33mXH/99U5wcLD5Y968eXNn/Pjx+R5/QbbLzMx04uPjzR96Pc4rr7zS+ctf/mKWZ/X22287nTt3dqpXr27KecMNN3j+4GsQ6mvhPbnB/uWXX5p5/ent/fffd6677jpTM9Tw0rDS19zbkCFDzLHr8r59+5r/169f33niiSecf//73/m+BklJSc7tt9/ueQ+vuuoq59lnn/XZVo8z67HnFezz588367z55ps+y5977jmzfPny5U5x6PY57Udrv7pc34e86PtXuXJln4BWf/3rX832KSkpZl4f19q6ru9NP9+1atVyhg0blu+xapA/8MAD2Zbr8yQkJGRbrq+rvqcu93dIWwxGjx5t3lv9vI4cOdIch/6+aEjr500nPdacThwef/xx83h5n1TgP6rk1QQPlKWffvpJunTpIunp6TJy5Ehp2bKl/Pjjj/LBBx/Ib7/9Zjr8uB555BFp0KCBxMfHy5kzZ8yyZ555RiZNmiQxMTHy8MMPy549e+SVV16Rf/zjH/LNN99I1apV5fz58xIbG2uub44ePdpcr9Tn+PTTT83zBgcHy65du+S//uu/pG3btvLss89KYGCg7Nu3z+wjLwXZ7uLFi9KnTx/5+uuvTRn1+uyOHTtk5syZ8q9//UuSkpI862pZtEzdunUz+9Pyb9y4Ub744gvp1auXud6sZahVq5a5hqpCQkJyPT69tj506FDp3LmzTJkyRdLS0uRvf/ubOb5t27ZJnTp1POteuHDBvE563feFF16Qzz//XF588UW5+uqrzWubF30ePaYxY8aYn3q8+j5lZGTI9OnTzTp6vKdOnZIjR46YsitdNzd63EuXLjX7vOWWWyQiIsK8bvoaDRs2TG6//XbPuidPnjTHnx+9Xq2T0vKrTp06+azTsWNHqVSpknn8vvvuy3Vf+njz5s2ldu3aPsv186y2b9/uOeZ///vf2Z5H39v27dt7jiM3+llNSUmR6667TorL/fzra/jtt9/Ka6+9Zj4Dej2/UaNG8te//tV0ctP37Nprr5XBgwdne230vdPPvT6Ocvb/Qx0od4MHD3YqVark/OMf/8j2mHv279Yqunfv7lPTO3bsmKkF9urVy+c68csvv2zW15qd9/XGJUuW5HocM2fONOscP368UMdfkO20hqdlzHod1b1e+80335j5vXv3mvXuvPPObNe9vWtCuTWzZ62Znz9/3rniiitM06g2/7o+/fRTs562FLi0FqfLtDbtTa/xduzYsUBN1lk9+OCDTo0aNXxaHwrbzJ6amupcfvnlzi23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N954w9TK77333sLuEgAA+MM18549e8r27dtLancAAKCsw/yLL74w19MBAICfN7PfddddOX7H+caNG02Yez++dOnS4h8hAAAo2TAPDg7OcVnz5s0LuysAAFAeYb5gwYKSeF4AAFCW18wdxymp5wMAAOUR5q1bt5b33nvPfP1pXvbu3SsPP/ywPP/888U6qDlz5kiTJk0kKChIoqKiZNOmTXmuv2TJEmnZsqVZv02bNrJixYpsJyPx8fESFhYm1atXl5iYGHOsAABcMmH+0ksvyQsvvCChoaHmu8ynT58uCxculA8//NCMLx8zZox06dLF3FCmdu3aJtCLSr9eVfeXkJAgW7dulXbt2klsbKwcO3Ysx/XXr18vgwYNkmHDhsm2bdukX79+ZvL+Ehj9lrfZs2fLvHnzTEe9mjVrmn1mZmYW+TgBAPAXAU4h2tC//vprE7br1q0z92I/e/as1K9f33yLmoaj3jCmbt26xTogrYl37tzZc1vYixcvSkREhIwePVrGjRuXbX09uThz5ox8+umnnmVdu3Y1JxYa3lq88PBweeKJJ+TJJ580j586dUpCQkLMHesGDhxYoOPKyMgwHf10Wz1hAWz38PzVUhG98qee5X0IQIkpaPYUqgNc9+7dzVRatBl/y5YtMn78eM+ySpUqmWbxDRs25LiNLteavDc9sUhKSjL/P3DggBw9etTsw6UvjJ406La5hfm5c+fM5P2CAgBQIXqzl6YTJ06Ye71rrdmbzn///fc5bqNBndP6utx93F2W2zo5mTJlikyaNKnIZQH8HTVYoOIosTvAVTTaOqDNGu50+PDh8j4kAAD8P8z1+nvlypXNHeW86bx2vsuJLs9rffdnYfapAgMDzfUJ7wkAAH/kV2FerVo16dixo6xe/X8dc7QDnM5HR0fnuI0u915frVq1yrN+ZGSkCW3vdfT6t/Zqz22fAADYxK+umSvtzDZkyBDp1KmTGe42a9Ys01t96NCh5vHBgwdLw4YNzTVt9dhjj0mPHj3kxRdflN69e5vx8Js3b5bXXnvNPB4QECBxcXEyefJkadasmQn3iRMnmh7uOoQNAIBLLsxvvvlmE546DtzbyZMn5e677zbfnlYcOtTs+PHj5iYv2kFNh5glJyd7OrClpKSYHu6ubt26yaJFi2TChAny3//93yawtSf7tdde61ln7Nix5oRg5MiR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+vTpnmXp6elOYGCg8+677zr+XLY//OEPTu/evX2WRUVFOQ8++KBflK2oz5+QkOC0a9cu18d1H1WrVnWWLFniWbZ7927zum3YsMEpbV26dHFGjRrlmb9w4YITHh7uTJkyxcr3qajlsu13S+ln5KOPPspznbFjxzqtW7f2WTZgwAAnNja2yK+VP5Tryy+/NOudPHky13X8rVyFQc38EnD69Glp3LixuSdx3759ZdeuXT5n4drMpM1/3rcO1OalDRs2iD/T4/M+bqVn0e5xl3fZivP82hSrzYdXXXWV3HvvvZKSkuJ5bMuWLfL777/77FebsBs1alTq5Tp//rx5fu/n1lsd63xuz+3v71NRy1VRf7fye7+K+lr5i/bt25vLHrfccot88803nuW2l4swr+BatGgh8+fPl2XLlsk777xjvjCmW7ducuTIEfO4e70oJCTEZzudz3otyd/o8eV13OVdtqI+v/6x12uUycnJ8sorr5hQuOGGGzzf3KfbVqtWTerUqVOo/ZaEEydOyIULFwpVJn9/n4paror6u5Xb+6VfUnL27NkivVb+ICwszFzu+PDDD82kJ2A33nijaU5XtpbLRZj7qYULF5qOTe60bt26Iu0nOjpaBg8ebM5Ge/ToYTqaNWjQQF599VWxvWz+Jmu5tPZcFLfddpv0799f2rZta2pE2lksPT1d3n///RI/ZhSdP/5uIXd68vXggw9Kx44dzUmXnojpz5kzZ0pFwLem+ak+ffqYGpqrYcOGJbLfqlWrSocOHWTfvn1mPjQ01PzUntB65urSef0j5c9l02PP2oNb590ylXXZspbr3LlzJfL8WgNv3ry5z3umTYIa8N61c++yl5b69etL5cqV83zd/f19Kqly+ePvVknI7f3Szn7aI19fp+K+Vv6iS5cuns6lJfEZKE/UzP2Ufm+6DglxJ/0lKgnajLRjxw7PH5fIyEjzQV29erVnHW1O0563WvPw57Lp8Xkft1q1apXnuMu6bFnL1apVqxJ5fr0u+8MPP3jeM61ZaHB471d76Op19dJ6z1zavK/P7/3c2rys87k9t7+9TyVVLn/83SoJ+b1fJfFa+Yvt27d73i/ry1XePfBQcD///LPp5b18+XLTK/O9994z86mpqZ517r//fmfcuHGe+UmTJjkrV650fvjhB2fLli3OwIEDnaCgIGfXrl2edZ5//nmnTp06zrJly5x//vOfTt++fZ3IyEjn7Nmzfl22b775xqlSpYrzwgsvmN7c2gtce3nv2LHDb8pWkOe/+eabnZdeeskz/8QTTzhr1qwxPfu1jDExMU79+vWdY8eOedZ56KGHnEaNGjlffPGFs3nzZic6OtpMZUHfG+2RnZiY6Hz33XfOyJEjTRmPHj1q7ftUlHLZ8rv166+/mt8lnfR3a8aMGeb/hw4dMo9rmbRsrv379zs1atRw/vKXv5j3a86cOU7lypWd5OTkAr9W/liumTNnOklJSc7evXvNZ++xxx5zKlWq5Hz++ed+Va6iIswtokNh9EObddI/jq4ePXo4Q4YM8czHxcWZP/rVqlVzQkJCnNtvv93ZunVrtiE0EydONI/rB7lnz57Onj17/L5s6v3333eaN29uyqfDafRkwJ/KVpDnb9y4sU85dRhQWFiYKVPDhg3N/L59+3y20TB45JFHnLp165o/vHfeeafPiU9p05MP93Olw3m+/fZbq9+nopTLlt8td0hW1skti/7UsmXdpn379qZsV111lfn9LMxr5Y/lmjp1qnP11VebE67LL7/cufHGG83JsL+Vq6j41jQAACzHNXMAACxHmAMAYDnCHAAAyxHmAABYjjAHAMByhDkAAJYjzAEAsBxhDgCA5QhzAMX25ptvSq9evUr9efRrYfVLSvSe2QD+D2EOoFgyMzNl4sSJkpCQUOrPdeutt5ovmdGvmwXwfwhzAMXywQcfmK/HvP7668vk+R544AGZPXt2mTwXYAvCHIDx1ltvSb169Tzfw+7q16+f3H///blu995778kdd9zhs+zGG2+UuLi4bPvRIHY1adJEJk+eLIMHD5ZatWpJ48aN5eOPP5bjx49L3759zbK2bdvK5s2bffajz6XL9GthAfwHYQ7A6N+/v/lObg1U17Fjx2T58uXypz/9Kdftvv76a+nUqVORnnPmzJmmRr9t2zbp3bu3OWnQcL/vvvtk69atcvXVV5t57++DatSokYSEhMi6deuK9JxARUSYAzCqV68uf/zjH2XBggWeZe+8844JT61p5yQ9PV1OnTol4eHhRXrO22+/XR588EFp1qyZxMfHS0ZGhnTu3NmcWDRv3lyeeuop2b17t6Slpflsp8936NChIj0nUBER5gA8RowYIZ999pn8+OOPZj4xMdE0jQcEBOS4/tmzZ83PoKCgIj2fNqO7tLat2rRpk22ZthBkPfH47bffivScQEVUpbwPAID/6NChg7Rr185cP9ehZrt27TLN7LnRa+wa9CdPnsx339qEn5X2THe5Jww5Lcs6FO2XX36RBg0aFLBUQMVHzRyAj+HDh5sauTa3x8TESERERK7rVqtWTVq1aiXfffddtseyNo3v37+/xIbCaec3PfEA8B+EOQAfet38yJEj8vrrr+fZ8c0VGxtrOsFltWzZMlm6dKkJ3ueee84Evl7ndpvwi+rbb7+VwMBAiY6OLtZ+gIqEMAfgIzg4WO6++24zNEyHk+Vn2LBhsmLFCtMRzpv2Tp82bZqpua9du1bmzp0rmzZtkrfffrtYx/fuu+/KvffeKzVq1CjWfoCKJMDxHvMBACLSs2dPad26dYFvzqK9z6+77joZP368mdfe73rb1VmzZpXocZ04cUJatGhhxplHRkaW6L4Bm1EzB+ChHdk++ugjWbNmjYwaNarA202fPt3U5EvbwYMHTQ2fIAd80ZsdgId2KtNAnzp1qqkBF5TezW306NFS2vTmNEW9QQ1QkdHMDgCA5WhmBwDAcoQ5AACWI8wBALAcYQ4AgOUIcwAALEeYAwBgOcIcAADLEeYAAFiOMAcAQOz2/wDw1a71DSDVZgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "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": [ + "
                               Created task 'straight waveguide' with task_id   \n",
+       "                               'mo-30247e3c-53fb-48ae-8af6-fb49bed14451' and    \n",
+       "                               task_type 'MODE_SOLVER'.                         \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \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-30247e3c-53fb-48ae-8af6-fb49bed14451'\u001b[0m and \n", + "\u001b[2;36m \u001b[0mtask_type \u001b[32m'MODE_SOLVER'\u001b[0m. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               View task using web UI at                        \n",
+       "                               'https://tidy3d.simulation.cloud/workbench?taskId\n",
+       "                               =mo-30247e3c-53fb-48ae-8af6-fb49bed14451'.       \n",
+       "
\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=75173;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=672237;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m\u001b]8;id=75173;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=788654;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[32mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=75173;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[32m-30247e3c-53fb-48ae-8af6-fb49bed14451'\u001b[0m\u001b]8;;\u001b\\. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               Task folder: 'default'.                          \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=444440;https://tidy3d.simulation.cloud/folders/639eb096-a602-4b56-a502-cac1f18f9557\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8008927f14ca4cb8904dec66c981484d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:04:55 Eastern Daylight Time Maximum FlexCredit cost: 0.018. Minimum cost     \n",
+       "                               depends on task execution details. Use           \n",
+       "                               'web.real_cost(task_id)' to get the billed       \n",
+       "                               FlexCredit cost after a simulation run.          \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:04:55 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.018\u001b[0m. Minimum cost \n", + "\u001b[2;36m \u001b[0mdepends on task execution details. Use \n", + "\u001b[2;36m \u001b[0m\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": [ + "
20:04:56 Eastern Daylight Time status = queued                                  \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:04:56 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstatus = queued \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               To cancel the simulation, use                    \n",
+       "                               'web.abort(task_id)' or 'web.delete(task_id)' or \n",
+       "                               abort/delete the task in the web UI. Terminating \n",
+       "                               the Python script will not stop the job running  \n",
+       "                               on the cloud.                                    \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \n", + "\u001b[2;36m \u001b[0m\u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or \u001b[32m'web.delete\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[0mabort/delete the task in the web UI. Terminating \n", + "\u001b[2;36m \u001b[0mthe Python script will not stop the job running \n", + "\u001b[2;36m \u001b[0mon the cloud. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:05:01 Eastern Daylight Time starting up solver                               \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:05:01 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstarting up solver \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               running solver                                   \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mrunning solver \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
20:06:01 Eastern Daylight Time status = success                                 \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:06:01 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstatus = success \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
                               View simulation result at                        \n",
+       "                               'https://tidy3d.simulation.cloud/workbench?taskId\n",
+       "                               =mo-30247e3c-53fb-48ae-8af6-fb49bed14451'.       \n",
+       "
\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=21737;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=482595;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m\u001b]8;id=21737;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=111097;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[4;34mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=21737;https://tidy3d.simulation.cloud/workbench?taskId=mo-30247e3c-53fb-48ae-8af6-fb49bed14451\u001b\\\u001b[4;34m-30247e3c-53fb-48ae-8af6-fb49bed14451'\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": "b45b947608fa46d4b33acfeebb45889b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:06:06 Eastern Daylight Time loading simulation from simulation_data.hdf5     \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:06:06 Eastern Daylight Time\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": [ + "
                               Created task 'bend waveguide' with task_id       \n",
+       "                               'mo-d54fd24a-759d-4f92-8109-7b884c0b8928' and    \n",
+       "                               task_type 'MODE_SOLVER'.                         \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \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-d54fd24a-759d-4f92-8109-7b884c0b8928'\u001b[0m and \n", + "\u001b[2;36m \u001b[0mtask_type \u001b[32m'MODE_SOLVER'\u001b[0m. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               View task using web UI at                        \n",
+       "                               'https://tidy3d.simulation.cloud/workbench?taskId\n",
+       "                               =mo-d54fd24a-759d-4f92-8109-7b884c0b8928'.       \n",
+       "
\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=739186;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=696909;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m\u001b]8;id=739186;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=385070;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[32mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=739186;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[32m-d54fd24a-759d-4f92-8109-7b884c0b8928'\u001b[0m\u001b]8;;\u001b\\. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               Task folder: 'default'.                          \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=780928;https://tidy3d.simulation.cloud/folders/639eb096-a602-4b56-a502-cac1f18f9557\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6890f554d4b54d29be090f12b06335a3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:06:08 Eastern Daylight Time Maximum FlexCredit cost: 0.018. Minimum cost     \n",
+       "                               depends on task execution details. Use           \n",
+       "                               'web.real_cost(task_id)' to get the billed       \n",
+       "                               FlexCredit cost after a simulation run.          \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:06:08 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.018\u001b[0m. Minimum cost \n", + "\u001b[2;36m \u001b[0mdepends on task execution details. Use \n", + "\u001b[2;36m \u001b[0m\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": [ + "
                               status = queued                                  \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mstatus = queued \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               To cancel the simulation, use                    \n",
+       "                               'web.abort(task_id)' or 'web.delete(task_id)' or \n",
+       "                               abort/delete the task in the web UI. Terminating \n",
+       "                               the Python script will not stop the job running  \n",
+       "                               on the cloud.                                    \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \n", + "\u001b[2;36m \u001b[0m\u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or \u001b[32m'web.delete\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[0mabort/delete the task in the web UI. Terminating \n", + "\u001b[2;36m \u001b[0mthe Python script will not stop the job running \n", + "\u001b[2;36m \u001b[0mon the cloud. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:06:13 Eastern Daylight Time starting up solver                               \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:06:13 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstarting up solver \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                               running solver                                   \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0mrunning solver \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
20:08:05 Eastern Daylight Time status = success                                 \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:08:05 Eastern Daylight Time\u001b[0m\u001b[2;36m \u001b[0mstatus = success \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
                               View simulation result at                        \n",
+       "                               'https://tidy3d.simulation.cloud/workbench?taskId\n",
+       "                               =mo-d54fd24a-759d-4f92-8109-7b884c0b8928'.       \n",
+       "
\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=460924;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=289426;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[2;36m \u001b[0m\u001b]8;id=460924;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=188586;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[4;34mmo\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=460924;https://tidy3d.simulation.cloud/workbench?taskId=mo-d54fd24a-759d-4f92-8109-7b884c0b8928\u001b\\\u001b[4;34m-d54fd24a-759d-4f92-8109-7b884c0b8928'\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": "cfd549c00e5e46528f6080696b11ab41", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
20:08:17 Eastern Daylight Time loading simulation from simulation_data.hdf5     \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[2;36m20:08:17 Eastern Daylight Time\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": "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OnUy22rXri2bN2+Wd955J8mQFBgYaBYAAJAzZFh1m1ZzaWPppUuXupUC6XqTJk3SfVzt2bZ79263bdreSEuM1OXLl82i7Z9caWDTzwcAAMjw6jatvtIqMK0ei4yMNOMexcbGSr9+/czrvXv3llKlSpn2QFZjb+3Sbz3XhtdaAhQaGioRERFm+5AhQ0zDbK1u6969uxl3adq0aWZR2pK9ZcuWMmzYMDNGkoanFStWyIcffijvvvtuhl0LAACQyTgy2MSJEx1ly5Z1BAQEOCIjIx1r1651vtayZUtHnz59nOv79+/X4QoSLbqfq2+//dZRs2ZNR2BgoKNq1aqOadOmub1+9OhRR9++fR3h4eGOoKAgR5UqVRzjxo1zxMfHp/q8z507Zz5bHwEAQNaQlvt3ho6TlJUxThIAAFlPlhgnCQAAIDMjJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANggJAEAANjwlzTYuXOnfPbZZ7Jy5Uo5cOCAxMXFSdGiRaVevXrSvn176dq1qwQGBqblkAAAAJmSn8PhcKS006ZNm+T555+XX375RZo1ayaRkZESHh4uwcHBcvr0adm2bZsJTlFRUWa/wYMHZ/uwpN81f/78cu7cOQkLC8vo0wEAAF6+f6eqJElLiIYNGyZffvmlFChQIMn91qxZI//6179k3Lhx8sILL6Tm0AAAAFm3JOny5cuSJ0+eVB80rftnRZQkAQCQve/fqWq4nVLgOXv2bJr2BwAAyHa92958802ZO3euc7179+5SuHBhKVWqlGzZssXb5wcAAJA1QtLUqVOlTJky5vmSJUvMsmjRIunYsaNptwQAAJDjhgBQx44dc4akhQsXmpKkdu3aSfny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9a9/yaxZs9ymVEnOiBEj5Ny5c87l0KFDPv4WAAAgS4UkLUFZunRpou0//vhjmktXihQpIrlz55bjx4+7bdf1EiVKSHqVLFnStG9yVa1aNTl48KB5ru2ndDqVsmXLmtIkXbSX3rPPPmt6zdnR9k9hYWFuCwAAyL7S3LtNg4RWUW3evFmaNm1qtq1atcqUymjpTFroVCYNGjQwoatLly7OUiBdf/rppyW9tGeb5+jfe/bscfbM07ZIru2glPao0+3agBwAACDNIUnb92gpz7hx4+Tzzz93ltJou6R77rknzSeg3f/79OljGlprTzQdAiA2NtYZVnr37i2lSpUybYKsxt47duxwPtceahrYQkNDTU87pUMDaIDT6rbu3bubcZemTZtmFqVjJ+niSnu36feqUqVKmr8DAADI4SHpypUrJng8/PDD8ssvv3jlBHr06CF///23jBw50jTW1hG9Fy9e7GzMrVVk2uPNcuTIEdPOyPLOO++YpWXLlrJ8+XLnMAE6/pG2I3r11VfNEAAavnr27OmVcwYAANmfn8NzfpEUaInNtm3bkmy7k1PoEADay00bcdM+CQCA7Hf/TnPDbR0PSQeTBAAAyM7S3CapY8eOMnz4cPntt99Mo+uQkJBEQwEAAADkuOo21/ZBiQ7m52cGh8wJqG4DACB737/TXJKkXfQBAACyu3RNcAsAAJDdpbok6fz582aQx7vuususa/d6nfTVoiNn69xtQUFBvjlTAACAzBiSdHLY//73v86QNGnSJKlRo4YEBweb9V27dkl4eLgZyBEAACDHVLd98sknZqJYV3PmzJFly5aZ5e2333aOwA0AAJBjQtLvv/8utWrVcq5rtZprTzedUsSaLgQAACDHVLedPXvWrQ2STiXi2evN9XUAAIAcUZJUunRpMx1JUrZu3Wr2AQAAyFEh6c477zST0F64cMG259srr7winTp18vb5AQAAZO4Rt48fPy5169aVgIAAefrpp+WWW24x23fv3m16ul25ckV+/fVXKV68uOQEjLgNAEDW45MRtzX8rF69WgYMGGDmbrOylU5F0rZtW3n//fdzTEACAADZX5qmJalQoYIsXrxYTp8+bXq7qYiICClUqJCvzg8AACBDpHnuNqWhSLv8AwAAZFfM3QYAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAGCDkAQAAJBZQ9LkyZOlfPnyEhQUJI0bN5Z169Ylue/27dula9euZn8/Pz8ZP3687X6HDx+WXr16SeHChSU4OFhq1aolGzZsMK9dvnxZ/vnPf5ptISEhEh4eLr1795YjR4747DsCAICsJcND0ty5c2Xo0KEyatQo2bRpk9SpU0fat28vJ06csN0/Li5OKlasKGPHjpUSJUrY7nPmzBlp1qyZ5MmTRxYtWiQ7duyQcePGScGCBZ3H0M96+eWXzeO8efNk9+7d0rlzZ59+VwAAkHX4ORwOR0aegJYcNWrUSCZNmmTW4+PjpUyZMjJw4EAZPnx4su/V0qTBgwebxZW+b9WqVbJy5cpUn8f69eslMjJSDhw4IGXLlk1x/6ioKMmfP7+cO3dOwsLCUv05AAAg46Tl/p2hJUmXLl2SjRs3Sps2ba6fUK5cZn3NmjXpPu6CBQukYcOG0q1bNylWrJjUq1dPpk+fnux79GJp9V2BAgVsX7948aK5sK4LAADIvjI0JJ08eVKuXr0qxYsXd9uu68eOHUv3cfft2ydTpkyRypUry/fffy8DBgyQQYMGyezZs233v3Dhgmmj9MADDySZKseMGWOSp7VoaRcAAMi+MrxNki9olV39+vVl9OjRphTpsccek/79+8vUqVMT7auNuLt37y5a66jBKikjRowwpU3WcujQIR9/CwAAkGNDUpEiRSR37txy/Phxt+26nlSj7NQoWbKkVK9e3W1btWrV5ODBg7YBSdshLVmyJNm6ycDAQPO66wIAALKvDA1JAQEB0qBBA1m6dKlbKZCuN2nSJN3H1Z5t2lvN1Z49e6RcuXKJAtLevXvlxx9/NEMFAAAAWPwlg2n3/z59+piG1tq7TMc9io2NlX79+pnXdfyiUqVKmTZBVmNv7dJvPdfxkDZv3iyhoaESERFhtg8ZMkSaNm1qqts0COm4S9OmTTOLFZD+8Y9/mO7/CxcuNO2irDZQhQoVMuENAADkbBk+BIDS7v9vv/22CSp169aVCRMmmKEBVKtWrUxX/1mzZpn1P//8UypUqJDoGC1btpTly5c71zX8aDsiLSnS/TWMabuk5I6hli1bZj4zJQwBAABA1pOW+3emCElZESEJAICsJ8uMkwQAAJBZEZIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAABsEJIAAAAya0iaPHmylC9fXoKCgqRx48aybt26JPfdvn27dO3a1ezv5+cn48ePt93v8OHD0qtXLylcuLAEBwdLrVq1ZMOGDc7XHQ6HjBw5UkqWLGleb9Omjezdu9cn3w8AAGQ9GR6S5s6dK0OHDpVRo0bJpk2bpE6dOtK+fXs5ceKE7f5xcXFSsWJFGTt2rJQoUcJ2nzNnzkizZs0kT548smjRItmxY4eMGzdOChYs6NznrbfekgkTJsjUqVPlf//7n4SEhJjPvXDhgs++KwAAyDr8HFqkkoG05KhRo0YyadIksx4fHy9lypSRgQMHyvDhw5N9r5YmDR482Cyu9H2rVq2SlStX2r5Pv3J4eLg8++yz8txzz5lt586dk+LFi8usWbPk/vvvT/G8o6KiJH/+/OZ9YWFhafjGAAAgo6Tl/u0vGejSpUuyceNGGTFihHNbrly5TNXXmjVr0n3cBQsWmFKhbt26yYoVK6RUqVLy5JNPSv/+/c3r+/fvl2PHjpnPsegF08Cmn2sXki5evGgWi15c62IDAICswbpvp6aMKEND0smTJ+Xq1aumBMeVru/atSvdx923b59MmTLFVOO98MILsn79ehk0aJAEBARInz59TECyPsfzc63XPI0ZM0ZeeeWVRNu11AsAAGQt0dHRpoAk04YkX9Equ4YNG8ro0aPNer169WTbtm2m/ZGGpPTQ0i4NXa6fcfr0adMwXBuQezvlavg6dOgQVXk+xHW+ObjONwfX+ebgOmf966wlSBqQtNlNSjI0JBUpUkRy584tx48fd9uu60k1yk4N7bFWvXp1t23VqlWTr776yjy3jq2fo/u6fm7dunVtjxkYGGgWVwUKFBBf0l8M/if0Pa7zzcF1vjm4zjcH1zlrX+eUSpAyRe82rf5q0KCBLF261K2ERtebNGmS7uNqz7bdu3e7bduzZ4+UK1fOPK9QoYIJSq6fq6lVe7ndyOcCAIDsI8Or27QKS6vAtHosMjLSjHsUGxsr/fr1M6/37t3bNLzWNkFWY2/t0m891/GQNm/eLKGhoRIREWG2DxkyRJo2bWqq27p3727GXZo2bZpZlFaPaY+4119/XSpXrmxC08svv2yK3rp06ZJh1wIAAGQijkxg4sSJjrJlyzoCAgIckZGRjrVr1zpfa9mypaNPnz7O9f3792tz9ESL7ufq22+/ddSsWdMRGBjoqFq1qmPatGlur8fHxztefvllR/Hixc0+d9xxh2P37t2OzODChQuOUaNGmUf4Dtf55uA63xxc55uD65yzrnOGj5MEAACQGWX4iNsAAACZESEJAADABiEJAADABiEJAADABiHJx37++We5++67zfACOvTA119/nez+y5cvN/t5Lp7TpUyePNlM8BsUFGTmnNNhDnIyX1xnHXZCJ1/Oly+fFCtWzAwP4Tn+Vk7jq99ny9ixY51DdORkvrrOOmRKr169zEwBwcHBUqtWLdmwYYPkVL64zjrVlg4po0PL6DWuVKmSvPbaa6maJyw7+zmN11rpfKkvvviiGeNQB3PWe96MGTPc9vniiy+katWq5l6ov8/fffedV8+bkORjOuZTnTp1TKhJC70ZHz161LnoTdoyd+5cM77UqFGjZNOmTeb4OqHviRMnJKfyxXXWyZGfeuopWbt2rSxZskQuX74s7dq1M5+VU/niOlt0jsV///vfUrt2bcnpfHGdz5w5YwbazZMnjyxatMiMNzdu3DgpWLCg5FS+uM5vvvmmmTt00qRJsnPnTrP+1ltvycSJEyUni03HtdZxDnXQ5w8++MBc808//VSqVKnifH316tXywAMPyCOPPCK//vqr+UNWF52GzGsydACCHEYv9/z585PdZ9myZWa/M2fOJLmPjiX11FNPOdevXr3qCA8Pd4wZM8ar55vTr7OnEydOmPesWLHCC2eZ9XnzOkdHRzsqV67sWLJkiRnz7JlnnvHy2WZd3rrO//znPx233XabD84we/DWde7UqZPj4Ycfdtt23333OXr27Om1c80J13rRokWO/PnzO06dOpXkPt27dzfX21Xjxo0djz/+uNfOlZKkTErnkNN55dq2bSurVq1ybtdRxjdu3Cht2rRxbsuVK5dZX7NmTQadbfa7znbOnTtnHgsVKnSTzi7nXGctsevUqZPb7zW8e50XLFhgZjbo1q2bKfnQib+nT5+eYeeaXa+zzvagpR86FZbasmWL/PLLL9KxY8cMOtusacG131cthdNZN2655RZ57rnn5Pz588599J7n+W+G1qp4816Y4dOSwJ3+jzd16lTzy6H1sf/5z3+kVatWZl65+vXry8mTJ02dd/Hixd3ep+u7du3KsPPObtfZk84pqO1ktLqiZs2aGXLO2fU6f/bZZ6baWKvb4LvrvG/fPlMNpFX1L7zwgrnegwYNMnNo6tRQ8M51Hj58uJkLVNvJ6ATu+u/1G2+8IT179szo089S9u3bZ8KltjWaP3++ufc9+eSTcurUKZk5c6bZR9uC2d0Lk2rzmC5eK5OCV4oY7bRo0cLRq1cv8/zw4cPmOKtXr3bbZ9iwYaYaDt65zp6eeOIJR7ly5RyHDh3ywhlmD964zgcPHnQUK1bMsWXLFufrVLf55vc5T548jiZNmrjtM3DgQMett97qlfPM6rx1nT/99FNH6dKlzePWrVsdH374oaNQoUKOWbNmefmMs/e1btu2rSMoKMhx9uxZ57avvvrK4efn54iLi3P+Ts+ZM8ftfZMnTzb/pngL1W1ZgE78+/vvv5vnRYoUMX+dHD9+3G0fXS9RokQGnWH2u86unn76aVm4cKEsW7ZMSpcunSHnll2vs1Yda4cD/Svc39/fLNpgfsKECea5/hUO7/w+aylI9erV3fapVq2aHDx4MAPOLvte52HDhpnSpPvvv9/0tnrooYfMpOvWJO1IHf191Wq2/Pnzu/2+asb666+/zLre83x9LyQkZQGbN282vzBKi8YbNGhg6rxdq4J0vUmTJhl4ltnrOiv9n1EDkhb1/vTTT6ZLL7x7ne+44w757bffzDZr0aoMrZrQ5/oHAbzz+6xVxZ5DWGi7Ge1eDe9d57i4ONNO1JX+Huu/00g9/X09cuSIxMTEuP2+6rW1/ljVe57rvVBpT2Rv3gtpk+Rj+gN2/Stj//795n8qbfxbtmxZGTFihBm75MMPPzSvjx8/3tyMa9SoIRcuXDB13nqD/uGHH5zH0DYF2oZAbyb6V4y+R7tX9uvXT3IqX1xnbUw8Z84c+eabb8xYSVY9t/5lo+Of5ETevs56XT3beIWEhJhxfHJy2y9f/D5raYY2Kh49erTpWq1jq02bNs0sOZUvrrOOBaRtkPT9up92TX/33Xfl4YcflpwsJo3X+sEHHzTjS+l97ZVXXjFtkrSUTq+j9e/vM888Iy1btjRDWWjHD23fqON+efV32msVd0i2y6jn0qdPH/O6PmobDMubb77pqFSpkqmL1XrsVq1aOX766adEx504caKjbNmyjoCAANMWae3atY6czBfX2e54usycOdORU/nq99kVbZJ8d52//fZbR82aNR2BgYGOqlWrOqZNm+bIyXxxnaOioszvr/77rPtVrFjR8eKLLzouXrx4079fVr7WaufOnY42bdo4goODTTuvoUOHOtsjWT7//HPHLbfcYu6FNWrUcPz3v/91eJOf/sd7kQsAACB7oE0SAACADUISAACADUISAACADUISAACADUISAACADUISAACADUISAACADUISgCzv//7v/6Ru3bqSWfj5+cnXX3+d5vfptCE671R0dLT4ko5eXKxYMeccWADsEZIApMrUqVPNNCJXrlxxm2ogT5480qpVK7d9ly9fboLCH3/8IdmZt8OZTs0wcOBAc519SSfK7t27t4waNcqnnwNkdYQkAKnSunVrE4p0biTLypUrTcnH//73PzOXlWXZsmVmPqZKlSpl0NlmPQcPHpSFCxdK3759b8rn6ZxYn3zyiZw+ffqmfB6QFRGSAKRKlSpVzGznWkpk0ef33HOPmfRz7dq1bts1VKmPPvrITMaspSMaqHTiyhMnTpjXdGZ0ndF7ypQp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", + "text/plain": [ + "
" + ] + }, + "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.0" + }, + "title": "Group Delay Calculation from FDTD and Mode Solver | Flexcompute" + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/features/data_visualisation.rst b/docs/features/data_visualisation.rst index bb162fbe..d5aa03bd 100644 --- a/docs/features/data_visualisation.rst +++ b/docs/features/data_visualisation.rst @@ -12,4 +12,5 @@ Visualizing and analyzing data is crucial for validating and extracting meaningf ../../XarrayTutorial ../../AnimationTutorial ../../FieldProjections + ../../GroupDelayCalculation ../../UnstructuredData