{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Uniform linear grating coupler\n",
    "\n",
    "Grating couplers are optical components used to efficiently couple light between optical fibers (or free-space beams) and integrated photonic waveguides. They consist of a periodic structure—typically etched onto the surface of a photonic chip—that diffracts incoming light into the waveguide mode (or vice versa). Grating couplers are widely used in silicon photonics due to their ease of fabrication, compatibility with planar processes, and ability to support wafer-scale testing. \n",
    "\n",
    "The simplest form of the grating coupler is the uniform linear grating coupler. In this notebook, we demonstrate the design workflow of such a device based on the silicon on insulator (SOI) platform. Conventionally, the initial design starts in 2D for faster speed and lower cost. Once the grating coupler is optimized in 2D, we construct the 3D version and can then potentially perform additional optimization to enhance its coupling efficiency. \n",
    "\n",
    "<img src=\"img/grating_coupler_schematic.png\" width=\"400\" alt=\"Schematic of the grating coupler\">\n",
    "\n",
    "More advanced grating coupler designs, such as the [focusing apodized grating coupler](https://www.flexcompute.com/tidy3d/examples/notebooks/FocusedApodGC/) and the [inverse designed grating coupler](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd19ApodizedCoupler/), can be realized to achieve higher performance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import matplotlib.pylab as plt\n",
    "import numpy as np\n",
    "import tidy3d as td\n",
    "import tidy3d.web as web"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Initial Design in 2D\n",
    "\n",
    "We start with the 2D design and aim to optimize its coupling efficiency as much as possible. This way, the design process is faster and costs fewer FlexCredits.\n",
    "\n",
    "First define the wavelength range of interest."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "lda0 = 1.55  # central wavelength\n",
    "freq0 = td.C_0 / lda0  # central frequency\n",
    "ldas = np.linspace(1.5, 1.6, 101)  # wavelength range\n",
    "freqs = td.C_0 / ldas  # frequency range\n",
    "fwidth = 0.5 * (np.max(freqs) - np.min(freqs))  # width of the source frequency range"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Grating couplers are relatively narrow band device. Within the working bandwidth, the refractive indices of silicon and oxide don't change noticeably. Therefore, for simplicity we will just model them as nondispersive mediums. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "n_si = 3.47\n",
    "si = td.Medium(permittivity=n_si**2)\n",
    "\n",
    "n_sio2 = 1.44\n",
    "sio2 = td.Medium(permittivity=n_sio2**2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define geometry parameters. In this case, we have a silicon layer of 260 nm thickness. The grating will be partially etched with an etching depth of 160 nm. The filling fraction is set to be 80% in this case. A higher filling fraction will lead to a smaller gap size so this needs to be chosen according to the fabrication. The BOX layer has a thickness of 2 μm and the top oxide cladding has a thickness of 680 nm. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "t_si = 0.26  # thickness of the silicon layer\n",
    "etch_depth = 0.16  # etching depth\n",
    "ff = 0.8  # filling fraction of the grating\n",
    "t_tox = 0.68  # top oxide layer thickness\n",
    "t_box = 2  # bottom oxide layer thickness\n",
    "n = 20  # number of grating teeth to create"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The goal is to couple between a single-mode waveguide and a single-mode fiber with a mode field diameter of 10.8 μm at an angle of 14.5 degrees."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "theta = np.deg2rad(14.5)  # fiber tilt angle\n",
    "mfd = 10.8  # mode field diameter\n",
    "\n",
    "inf_eff = 1e3  # effective infinity\n",
    "buffer = 0.6 * lda0  # buffer spacing to pad the simulation domain"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we define some [Structures](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.Structure.html) that are not changing in the design. This includes the top oxide layer, BOX layer, slab waveguide layer, etc. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# create the top oxide layer\n",
    "tox = td.Structure(\n",
    "    geometry=td.Box.from_bounds(rmin=(-inf_eff, -inf_eff, 0), rmax=(inf_eff, inf_eff, t_tox)),\n",
    "    medium=sio2,\n",
    ")\n",
    "\n",
    "# create the slab waveguide\n",
    "slab_waveguide = td.Structure(\n",
    "    geometry=td.Box.from_bounds(rmin=(-inf_eff, -inf_eff, 0), rmax=(0, inf_eff, t_si)),\n",
    "    medium=si,\n",
    ")\n",
    "\n",
    "# create the etched waveguide\n",
    "etched_waveguide = td.Structure(\n",
    "    geometry=td.Box.from_bounds(rmin=(0, -inf_eff, 0), rmax=(inf_eff, inf_eff, t_si - etch_depth)),\n",
    "    medium=si,\n",
    ")\n",
    "\n",
    "# create the bottom oxide layer\n",
    "box = td.Structure(\n",
    "    geometry=td.Box.from_bounds(rmin=(-inf_eff, -inf_eff, -t_box), rmax=(inf_eff, inf_eff, 0)),\n",
    "    medium=sio2,\n",
    ")\n",
    "\n",
    "# create the silicon substrate layer\n",
    "substrate = td.Structure(\n",
    "    geometry=td.Box.from_bounds(\n",
    "        rmin=(-inf_eff, -inf_eff, -inf_eff), rmax=(inf_eff, inf_eff, -t_box)\n",
    "    ),\n",
    "    medium=si,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To enable parameter sweeping in optimizing the design, we define a function that takes the design parameters as arguments and returns a [Simulation](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.Simulation.html) object. In the simulation, we use a [GaussianBeam](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.GaussianBeam.html) source to represent the incident field from the single-mode fiber. A [ModeMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeMonitor.html) is added on the waveguide to measure the coupling efficiency, which will be used as the figure of merit for our design optimization.\n",
    "\n",
    "Since this simulation is 2D, the boundary condition is set to periodic in the $y$ direction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_2d_sim(p: float, source_x: float) -> td.Simulation:\n",
    "    \"\"\"Function to create a 2D simulation given the grating period and source position\"\"\"\n",
    "\n",
    "    source_gap = 0.5  # gap distance between the source and the top oxide\n",
    "\n",
    "    # define a gaussian beam source\n",
    "    source = td.GaussianBeam(\n",
    "        size=(2 * mfd, td.inf, 0),\n",
    "        center=[source_x, 0, t_tox + source_gap],\n",
    "        source_time=td.GaussianPulse(freq0=freq0, fwidth=fwidth),\n",
    "        angle_theta=theta,\n",
    "        direction=\"-\",\n",
    "        waist_radius=mfd / 2,\n",
    "        pol_angle=np.pi / 2,  # 90 degree polarization angle for TE polarization\n",
    "    )\n",
    "\n",
    "    # define a mode monitor to measure coupling efficiency\n",
    "    mode_monitor = td.ModeMonitor(\n",
    "        center=(-buffer / 2, 0, t_si / 2),\n",
    "        size=(0, td.inf, 6 * t_si),\n",
    "        freqs=freqs,\n",
    "        mode_spec=td.ModeSpec(num_modes=1, target_neff=3.47),\n",
    "        name=\"mode\",\n",
    "    )\n",
    "\n",
    "    l_grating = n * p  # length of the grating region\n",
    "\n",
    "    # create the grating geometries\n",
    "    gratings = 0\n",
    "    for i in range(n):\n",
    "        gratings += td.Box(\n",
    "            center=(ff * p / 2 + i * p, 0, t_si - etch_depth / 2), size=(p * ff, td.inf, etch_depth)\n",
    "        )\n",
    "\n",
    "    # create the grating structure\n",
    "    gratings = td.Structure(geometry=gratings, medium=si)\n",
    "\n",
    "    # create a box to represent the simulation domain box\n",
    "    sim_box = td.Box.from_bounds(\n",
    "        rmin=(-buffer, 0, -t_box - buffer),\n",
    "        rmax=(l_grating + buffer, 0, t_si + t_tox + buffer),\n",
    "    )\n",
    "\n",
    "    run_time = 1e-12  # simulation run time\n",
    "\n",
    "    # construct simulation\n",
    "    sim = td.Simulation(\n",
    "        center=sim_box.center,\n",
    "        size=sim_box.size,\n",
    "        grid_spec=td.GridSpec.auto(\n",
    "            min_steps_per_wvl=25, wavelength=lda0\n",
    "        ),  # use a fine grid to ensure the small features are well resolved\n",
    "        structures=[\n",
    "            tox,\n",
    "            gratings,\n",
    "            etched_waveguide,\n",
    "            slab_waveguide,\n",
    "            box,\n",
    "            substrate,\n",
    "        ],\n",
    "        sources=[source],\n",
    "        monitors=[mode_monitor],\n",
    "        run_time=run_time,\n",
    "        boundary_spec=td.BoundarySpec(\n",
    "            x=td.Boundary.pml(),\n",
    "            y=td.Boundary.periodic(),  # set the boundary to periodic in y since it's a 2D simulation\n",
    "            z=td.Boundary.pml(),\n",
    "        ),\n",
    "    )\n",
    "\n",
    "    return sim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To visualize the simulation setup, we can create a dummy simulation and plot it. The plot shows the setup is correct. We have a grating with a tunable period and a Gaussian beam with a tunable position."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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jAwGg3j22WdF69athVqtFjfffLN48cUXhdFodJRprttq27Zt1R6f7PuYK/tOmzZtxPz5852W1bVdysrKxFNPPSXCw8NFcHCwuO+++8SVK1d8+VXJzyRC1HG7byIiIiIKeLymjoiIiKgJYKgjIiIiagIY6oiIiIiaAIY6IiIioiaAoY6IiIioCWCoIyIiImoCGOqIiIiImgCGOiIiIqImgKGOiALaBx98gGHDhvn8c7Zs2YIePXrU+qxSIqJAxlBHRAGrvLwcc+fOxfz5833+WXfeeScUCgXWrFnj888iIvIFhjoiCliff/45tFotBgwY0CCfN2nSJLzzzjsN8llERN7GUEdEPnf16lXExMTg1VdfdSzbs2cPlEoltm7dWuN669atw4gRI5yWDR48GNOnT3daNmrUKEyaNMnxc9u2bfHKK69gwoQJ0Gg0aNOmDb766itcvXoV9957LzQaDW677TZkZmY61TNixAhkZmbi119/9fzLEhH5CUMdEflcVFQUPvzwQ7z00kvIzMxEUVERxo8fj2nTpmHo0KE1rrd792707t3bo89cvHgxBgwYgCNHjmD48OEYP348JkyYgIcffhiHDx9Gu3btMGHCBAghHOu0bt0a0dHR2LVrl0efSUTkTwx1RNQg7r77bkyePBnjxo3Dk08+iZCQEKSnp9dYvrCwEHq9HnFxcR5/3hNPPIEOHTpg3rx5MBgM6NOnD1JTU9GxY0fMnDkTJ0+eRG5urtN6cXFxuHDhgkefSUTkTwx1RNRg/vnPf8JisWDDhg1Ys2YNVCpVjWXLysoAAGq12qPPuu222xz/Hx0dDQDo1q1blWV5eXlO6wUFBaG0tNSjzyQi8ieGOiJqML/++isuX74Mm82G3377rdayERERkEgkKCgoqLNeq9VaZZlCoXD8v0QiqXHZjbcw+eOPPxAVFVXnZxIRBRqGOiJqECaTCQ8//DBGjx6Nl19+GY899liVUbLrKZVK3HrrrThx4kSV9248ZXru3DmvtLG8vBy//vorevbs6ZX6iIgaEkMdETWIF198EXq9Hu+88w5mzpyJjh074q9//Wut66SkpGD37t1Vln/55Zf44osv8Ouvv2LRokU4ceIELly4gEuXLtWrjfv27YNKpUJSUlK96iEi8geGOiLyue3bt2PJkiX4+OOPodVqIZVK8fHHH2PXrl1YuXJljes9+uij+Pbbb6HX652WDx8+HK+//jpuvfVW7Ny5EytWrMCBAwfw8ccf16udn376KcaNG4fg4OB61UNE5A8Scf18fiKiAJOamoo//elPmD17NoCK+9T16NEDS5Ys8ern5Ofn45ZbbkFmZiYSEhK8WjcRUUPgSB0RBbQ33ngDGo3G55/z22+/YcWKFQx0RNRocaSOiBoVX43UERE1dgx1RERERE0AT78SERERNQEMdURERERNAEMdERERURPAUEdERETUBDDUERERETUBDHVERERETQBDHREREVETwFBHRERE1AT8/wKkHbUOZJ/gAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sim0 = make_2d_sim(p=0.5, source_x=5)\n",
    "sim0.plot_eps(y=0, freq=freq0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next step is to determine the optimal grating period and source position. We can first get an estimate of the optimal grating period by using the grating equation\n",
    "\n",
    "$$\n",
    "\\Lambda = \\frac{\\lambda_0}{n_{\\text{eff}} - n_{\\text{clad}} \\sin \\theta},\n",
    "$$\n",
    "\n",
    "where\n",
    "- $\\Lambda$ = grating period  \n",
    "- $\\lambda_0$ = free-space wavelength of the incident light  \n",
    "- $n_{\\text{eff}}$ = effective index of the guided mode in the waveguide  \n",
    "- $n_{\\text{clad}}$ = refractive index of the cladding \n",
    "- $\\theta$ = angle of incidence\n",
    "\n",
    "$n_{\\text{eff}}$ can be approximated by \n",
    "\n",
    "$$\n",
    "n_{\\text{eff}} = f n_{etched} + (1-f) n_{unetched},\n",
    "$$\n",
    "\n",
    "where $f$ is the filling fraction, $n_{unetched}$ is the effective index of the unetched slab mode, and $n_{etched}$ is the effective index of the etched slab mode. We will calculate $n_{unetched}$ and $n_{etched}$ using our mode solver. The most convenient way of doing so would be to construct mode simulations from the dummy FDTD simulation. For the unetched slab mode, we specify the mode solving plane to be on the left side of the grating region. For the etched slab mode, we specify the plane to be on the right side of the grating region."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "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:09 UTC </span>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'unetched'</span> with task_id                               \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'mos-cc5486ef-a151-4fad-948d-d750b2005641'</span> and task_type <span style=\"color: #008000; text-decoration-color: #008000\">'MODE'</span>.   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:09 UTC\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'unetched'\u001b[0m with task_id                               \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'mos-cc5486ef-a151-4fad-948d-d750b2005641'\u001b[0m and task_type \u001b[32m'MODE'\u001b[0m.   \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "113084e7e74d42018cd8a5187ac5a904",
       "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:11 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.004</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:11 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.004\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:13 UTC </span>status = queued                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:13 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": "82bdf51489a243d28cf5c13f6fe6ffcc",
       "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>starting up solver                                                 \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:56 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\">             </span>status = success                                                   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \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": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5d1156feb6624c07a10ed30f9cbdae3a",
       "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:58 UTC </span>loading simulation from simulation_data.hdf5                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:58 UTC\u001b[0m\u001b[2;36m \u001b[0mloading simulation from simulation_data.hdf5                       \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>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'etched'</span> with task_id                                 \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'mos-5625e4fb-c536-420e-b4e3-5afc9c91812c'</span> and task_type <span style=\"color: #008000; text-decoration-color: #008000\">'MODE'</span>.   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'etched'\u001b[0m with task_id                                 \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'mos-5625e4fb-c536-420e-b4e3-5afc9c91812c'\u001b[0m and task_type \u001b[32m'MODE'\u001b[0m.   \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ffb347baa49e45e990b36bf60e84608e",
       "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:00 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.004</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:00 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.004\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:01 UTC </span>status = queued                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:01 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": "8dd114eda84f45fbb5ee6f0ab47a944c",
       "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:42 UTC </span>starting up solver                                                 \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:42 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:46 UTC </span>status = success                                                   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:46 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": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "13c97aa86d4244348254e7592561aa51",
       "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:48 UTC </span>loading simulation from simulation_data.hdf5                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:49:48 UTC\u001b[0m\u001b[2;36m \u001b[0mloading simulation from simulation_data.hdf5                       \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mode_unetched = td.ModeSimulation.from_simulation(\n",
    "    sim0,\n",
    "    mode_spec=td.ModeSpec(num_modes=1, target_neff=3.47),\n",
    "    plane=td.Box(center=(-0.1, 0, 0), size=(0, td.inf, 5 * t_si)),\n",
    "    freqs=[freq0],\n",
    ")\n",
    "data_unetched = web.run(simulation=mode_unetched, task_name=\"unetched\")\n",
    "\n",
    "mode_etched = mode_unetched.updated_copy(\n",
    "    plane=td.Box(center=(n * 0.5 + 0.1, 0, 0), size=(0, td.inf, 5 * t_si))\n",
    ")\n",
    "data_etched = web.run(simulation=mode_etched, task_name=\"etched\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After running the mode solving, we can extract the effective indices and hence calculate the appropriate grating period."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Calculated grating period is 608 nm\n"
     ]
    }
   ],
   "source": [
    "neff_unetch = (\n",
    "    data_unetched.modes.n_eff.values.item()\n",
    ")  # effective index of the slab mode of the unetched waveguide\n",
    "neff_etch = (\n",
    "    data_etched.modes.n_eff.values.item()\n",
    ")  # effective index of the slab mode of the etched waveguide\n",
    "theta_c = np.sin(theta) / n_sio2  # incident angle in the cladding\n",
    "ff = 0.8  # filling fraction\n",
    "\n",
    "# calculate the grating period\n",
    "p = lda0 / (ff * neff_unetch + (1 - ff) * neff_etch - n_sio2 * np.sin(theta_c))\n",
    "\n",
    "print(f\"Calculated grating period is {p * 1e3:.0f} nm\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To optimize the design, we can perform a [parameter sweep](https://www.flexcompute.com/tidy3d/examples/notebooks/ParameterScan/) over the grating period and source position. To do so, we create a dictionary of simulations and then a [Batch](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.web.api.container.Batch.html). When running the batch, multiple simulations will be running in parallel, making the sweep very time-efficient."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3869b2bb1bf241e18c2471c4dfc53585",
       "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:01 UTC </span>Started working on Batch containing <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">44</span> tasks.                      \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:50:01 UTC\u001b[0m\u001b[2;36m \u001b[0mStarted working on Batch containing \u001b[1;36m44\u001b[0m tasks.                      \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:50:44 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1.100</span> for the whole batch.                \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:50:44 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m1.100\u001b[0m for the whole batch.                \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>Use <span style=\"color: #008000; text-decoration-color: #008000\">'Batch.real_cost()'</span> to get the billed FlexCredit cost after the\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Batch has completed.                                               \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mUse \u001b[32m'Batch.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed FlexCredit cost after the\n",
       "\u001b[2;36m             \u001b[0mBatch has completed.                                               \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a3972aeacb8145d19a76ea450a238c12",
       "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\">13:03:07 UTC </span>Batch complete.                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m13:03:07 UTC\u001b[0m\u001b[2;36m \u001b[0mBatch complete.                                                    \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": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "88763b69a0ff420d8a1b1e3dc8cb85bb",
       "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"
    }
   ],
   "source": [
    "p_list = np.linspace(0.60, 0.63, 7)\n",
    "source_x_list = np.linspace(3, 5, 11)\n",
    "\n",
    "sims_2d = {\n",
    "    f\"p={p:.2f};source_x={source_x:.2f}\": make_2d_sim(p, source_x)\n",
    "    for p in p_list\n",
    "    for source_x in source_x_list\n",
    "}\n",
    "\n",
    "batch = web.Batch(simulations=sims_2d)\n",
    "batch_results = batch.run(path_dir=\"data\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After the sweep is finished, we can extract the coupling efficiency from the monitor data. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "ce = np.array(\n",
    "    [\n",
    "        [\n",
    "            np.abs(\n",
    "                batch_results[f\"p={p:.2f};source_x={source_x:.2f}\"][\"mode\"]\n",
    "                .amps.sel(f=freq0, direction=\"-\")\n",
    "                .values.item()\n",
    "            )\n",
    "            ** 2\n",
    "            for source_x in source_x_list\n",
    "        ]\n",
    "        for p in p_list\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot the coupling efficiency as a function of period and source position in a false color map. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pcolormesh(source_x_list, p_list, ce, cmap=\"bwr\")\n",
    "plt.colorbar()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From the result we can determine the optimal grating period and source position. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimal period is 620.0 nm.\n",
      "Optimal source_x is 3.8 μm.\n",
      "Optimal coupling efficiency is 56.21%, or -2.50 dB.\n"
     ]
    }
   ],
   "source": [
    "i, j = np.unravel_index(np.argmax(ce), ce.shape)\n",
    "best_p = p_list[i]\n",
    "best_source_x = source_x_list[j]\n",
    "best_ce = ce[i, j]\n",
    "\n",
    "print(f\"Optimal period is {best_p * 1e3} nm.\")\n",
    "print(f\"Optimal source_x is {best_source_x} μm.\")\n",
    "print(f\"Optimal coupling efficiency is {best_ce * 1e2:.2f}%, or {10 * np.log10(best_ce):.2f} dB.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3D Design of the Grating Coupler\n",
    "\n",
    "The 2D design shows promising results. Now we can convert it to 3D for verification and potentially further optimization. \n",
    "\n",
    "The single-mode waveguide has a width of 500 nm. The waveguide and the grating are connected via a linear taper. The longer the taper, the lower the loss in the taper region but the larger the footprint. Here we use a 50 μm linear taper with reasonably low loss. \n",
    "\n",
    "To enable additional optimization, we create a function similar to before. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "w_wg = 0.5  # waveguide width\n",
    "w_grating = mfd  # grating width is set to the mode field diameter\n",
    "l_taper = 50  # length of the linear taper\n",
    "\n",
    "\n",
    "def make_3d_sim(p: float, source_x: float) -> td.Simulation:\n",
    "    \"\"\"Function to create a 2D simulation given the grating period and source position\"\"\"\n",
    "\n",
    "    source_gap = 0.5\n",
    "\n",
    "    # define a gaussian beam source\n",
    "    source = td.GaussianBeam(\n",
    "        size=(2 * mfd, 2 * mfd, 0),\n",
    "        center=[source_x, 0, t_tox + source_gap],\n",
    "        source_time=td.GaussianPulse(freq0=freq0, fwidth=fwidth),\n",
    "        angle_theta=theta,\n",
    "        direction=\"-\",\n",
    "        waist_radius=mfd / 2,\n",
    "        pol_angle=np.pi / 2,  # 90 degree polarization angle for TE polarization\n",
    "    )\n",
    "\n",
    "    # define a mode monitor\n",
    "    mode_monitor = td.ModeMonitor(\n",
    "        center=(-l_taper - buffer / 2, 0, t_si / 2),\n",
    "        size=(0, 4 * w_wg, 6 * t_si),\n",
    "        freqs=freqs,\n",
    "        mode_spec=td.ModeSpec(num_modes=1, target_neff=3.47),\n",
    "        name=\"mode\",\n",
    "    )\n",
    "\n",
    "    l_grating = n * p  # length of the grating region\n",
    "\n",
    "    gratings = 0\n",
    "    for i in range(n):\n",
    "        gratings += td.Box(\n",
    "            center=(ff * p / 2 + i * p, 0, t_si - etch_depth / 2),\n",
    "            size=(p * ff, w_grating, etch_depth),\n",
    "        )\n",
    "\n",
    "    # create the grating structure\n",
    "    gratings = td.Structure(geometry=gratings, medium=si)\n",
    "\n",
    "    vertices = [\n",
    "        (0, w_grating / 2),\n",
    "        (0, -w_grating / 2),\n",
    "        (-l_taper, -w_wg / 2),\n",
    "        (-l_taper - 2 * buffer, -w_wg / 2),\n",
    "        (-l_taper - 2 * buffer, w_wg / 2),\n",
    "        (-l_taper, w_wg / 2),\n",
    "    ]\n",
    "    taper = td.Structure(\n",
    "        geometry=td.PolySlab(vertices=vertices, axis=2, slab_bounds=(0, t_si)), medium=si\n",
    "    )\n",
    "\n",
    "    # create a box to represent the simulation domain box\n",
    "    sim_box = td.Box.from_bounds(\n",
    "        rmin=(-buffer - l_taper, -w_grating / 2 - buffer, -t_box - buffer),\n",
    "        rmax=(l_grating + buffer, w_grating / 2 + buffer, t_si + t_tox + buffer),\n",
    "    )\n",
    "\n",
    "    run_time = 2e-12  # simulation run time\n",
    "\n",
    "    # construct simulation\n",
    "    sim = td.Simulation(\n",
    "        center=sim_box.center,\n",
    "        size=sim_box.size,\n",
    "        grid_spec=td.GridSpec.auto(\n",
    "            min_steps_per_wvl=15, wavelength=lda0\n",
    "        ),  # use a fine grid to ensure the small features are well resolved\n",
    "        structures=[\n",
    "            tox,\n",
    "            gratings,\n",
    "            etched_waveguide,\n",
    "            taper,\n",
    "            box,\n",
    "            substrate,\n",
    "        ],\n",
    "        sources=[source],\n",
    "        monitors=[mode_monitor],\n",
    "        run_time=run_time,\n",
    "        symmetry=(0, -1, 0),\n",
    "    )\n",
    "\n",
    "    return sim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Generate the simulation using the optimal parameters from the 2D design. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAADFCAYAAADZlb8LAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQdVJREFUeJzt3Xl4FFX6NuCnqnrJRhYgJIR9CaAswoAgiqKSIWhkUT9URlYRAXUQGTeURRBBUVmUQX5uoAwKMqNhRhCFCLIFEAyOCDiKgLKEPQlreqn3+6PpSjrd6XSHDll47uvqi/SpU1WnT3XgpU6d9ygiIiAiIiKiSk8t7wYQERERUWgwsCMiIiKqIhjYEREREVURDOyIiIiIqggGdkRERERVBAM7IiIioiqCgR0RERFRFcHAjoiIiKiKYGBHREREVEUwsCOiKmnt2rVQFAVr164t76ZQiG3duhUWiwUHDhy44uc+efIkIiMjsWLFiit+bqJAMLAjokpt7ty5WLBgQXk3o1Q+/vhjzJo1q7ybAQDQdR3Tp09Ho0aNEBYWhjZt2uCTTz4JaN+MjAw89NBDaNasGSIiItC4cWM8/PDDOHLkiM/6NpsNU6dORYsWLRAWFoaEhASkpaXh4MGDAZ3vhRdeQL9+/dCgQYOAP1+o1KhRAw8//DDGjx9/xc9NFAiFa8USUWXWqlUr1KxZ0+vOnK7rsNlssFgsUNWK+X/Yu+66Czt37sT+/fvLuykYO3YsXnnlFQwbNgzXX389li1bhuXLl+OTTz7BAw884HffDh064NSpU+jbty+Sk5Px22+/Yc6cOYiIiMCOHTuQmJho1LXb7bjzzjuxadMmDBs2DG3atMHp06exZcsWTJw4ES1btvR7rh07dqBdu3bYtGkTOnfuHJLPHqzdu3fj2muvRUZGBm6//fZyaQNRcRjYEVUB586dQ2RkZHk3o1wUF9hVBhUlsDt06BAaNWqERx55BHPmzAEAiAi6du2Kffv2Yf/+/dA0rdj9161bhy5dungE0OvWrUPXrl3xwgsvYMqUKUb59OnTMW7cOGzYsAEdO3YMuq1PPPEE0tPTsX//fiiKEvT+odK6dWu0a9cOH330Ubm1gciXivnfWKKr2KFDhzB06FAkJSXBarWiUaNGGDlyJGw2GwBgwYIFUBQF3377LR599FHUqlULdevWNfafO3cuWrZsCavViqSkJDz22GPIycnxOMcvv/yCe++9F4mJiQgLC0PdunXxwAMPIDc316izatUqdOnSBbGxsYiKikLz5s3x/PPPl9j+QPbLz8/HxIkT0bRpU1itVtSrVw/PPPMM8vPzvY73j3/8Ax07dkRERATi4uJwyy234OuvvwYANGzYED/99BO+/fZbKIoCRVFw6623Aij+GbulS5eiffv2CA8PR82aNdG/f38cOnTIo87gwYMRFRWFQ4cOoU+fPoiKikJ8fDyeeuopOJ3OEvtg2bJlSEtLM65hkyZN8NJLL3nse+utt2L58uU4cOCA0faGDRsWe8zBgwcb9Yq+XnzxxRLbVFJ77XY7Hn30UaNMURSMHDkSBw8eRGZmpt/9b7nlFq+7orfccguqV6+O3bt3G2W6rmP27Nm4++670bFjRzgcDpw/fz6otqanp+P222/3CuqK64eGDRti8ODBxnv378+GDRswatQoxMfHIzY2FsOHD4fNZkNOTg4GDhyIuLg4xMXF4ZlnnoGv+x9//vOf8Z///MfnNqLyZCrvBhBRgcOHD6Njx47IycnBI488ghYtWuDQoUP45z//ifPnz8NisRh1H330UcTHx2PChAk4d+4cAODFF1/EpEmTkJKSgpEjR+Lnn3/G22+/je+++w4bN26E2WyGzWZDamoq8vPz8de//hWJiYk4dOgQvvjiC+Tk5CAmJgY//fQT7rrrLrRp0waTJ0+G1WrFr7/+io0bN/ptfyD76bqOXr16YcOGDXjkkUdwzTXX4Mcff8TMmTPxv//9D+np6UbdSZMm4cUXX8SNN96IyZMnw2KxYMuWLfjmm2/QvXt3zJo1C3/9618RFRWFF154AQCQkJBQbPsWLFiAIUOG4Prrr8e0adNw9OhRzJ49Gxs3bkRWVhZiY2ONuk6nE6mpqejUqRNef/11rF69Gm+88QaaNGmCkSNH+u2HBQsWICoqCmPGjEFUVBS++eYbTJgwAXl5eXjttdcAuJ4Ty83NxcGDBzFz5kwAQFRUVLHHHD58OFJSUjzKVq5ciUWLFqFWrVpG2YkTJ/y2za1atWqwWq0AgKysLERGRuKaa67xqOO+o5aVlYUuXboEdFy3s2fP4uzZs6hZs6ZRtmvXLhw+fBht2rTBI488gg8//BA2mw2tW7fG7Nmzcdttt/k95qFDh/D777/jT3/6U1Bt8cX93Z80aRI2b96Md955B7Gxsdi0aRPq16+PqVOnYsWKFXjttdfQqlUrDBw40GP/9u3bY+bMmfjpp5/QqlWry24PUcgIEVUYAwcOFFVV5bvvvvPapuu6iIjMnz9fAEiXLl3E4XAY248dOyYWi0W6d+8uTqfTKJ8zZ44AkA8++EBERLKysgSALF26tNh2zJw5UwDI8ePHg2p/IPstXLhQVFWV9evXe5TPmzdPAMjGjRtFROSXX34RVVXl7rvv9vg8IgV9ISLSsmVL6dq1q9d51qxZIwBkzZo1IiJis9mkVq1a0qpVK7lw4YJR74svvhAAMmHCBKNs0KBBAkAmT57sccx27dpJ+/bt/XeCiJw/f96rbPjw4RIRESEXL140ytLS0qRBgwYlHs+XX375RWJiYuTPf/6zx/cAQECv+fPne7SjcePGXuc4d+6cAJDnnnsu6Pa99NJLAkAyMjKMss8++0wASI0aNSQ5OVnmz58v8+fPl+TkZLFYLPLDDz/4Pebq1asFgPznP//x2gZAJk6c6FXeoEEDGTRokPHe/fuTmprq8T3q3LmzKIoiI0aMMMocDofUrVvX5/dr06ZNAkCWLFnit81EVxqHYokqCF3XkZ6ejp49e6JDhw5e24sOPQ0bNszjuafVq1fDZrNh9OjRHsNiw4YNQ3R0NJYvXw4AiImJAQB89dVXxQ6Due9cLVu2DLquB/wZAtlv6dKluOaaa9CiRQucOHHCeLkfQl+zZg0A15CbruuYMGGC1zBfaZ6t2rZtG44dO4ZHH30UYWFhRnlaWhpatGhh9E9hI0aM8Hh/880347fffivxXOHh4cbPZ86cwYkTJ3DzzTfj/Pnz2LNnT9BtL+rcuXO4++67ERcXh08++cTje7Bq1aqAXqmpqcY+Fy5cMO7eFebupwsXLgTVvnXr1mHSpEm47777PCYXnD17FoCrTzIyMjB48GAMHjwYq1evhohg+vTpfo978uRJAEBcXFxQ7fFl6NChHt+jTp06QUQwdOhQo0zTNHTo0MHnNXe3IdA7pERXCodiiSqI48ePIy8vL+BhnUaNGnm8d+f0at68uUe5xWJB48aNje2NGjXCmDFjMGPGDCxatAg333wzevXqhf79+xtB3/3334/33nsPDz/8MJ577jl069YN99xzD/7f//t/fmeYBrLfL7/8gt27dyM+Pt7nMY4dOwYA2Lt3L1RVxbXXXhtQf5SkuP4BgBYtWmDDhg0eZWFhYV5tjIuLw+nTp0s8108//YRx48bhm2++QV5ense2ws8xltawYcOwd+9ebNq0CTVq1PDYVnS4NhDh4eE+n2+8ePGisT1Qe/bswd13341WrVrhvffe8zoPANx0002oV6+eUV6/fn106dIFmzZtCugcEoLn2urXr+/x3v3dL9wud7mva+5uQ3lO4CDyhYEdUSUVzD+2Rb3xxhsYPHgwli1bhq+//hqjRo3CtGnTsHnzZtStWxfh4eFYt24d1qxZg+XLl2PlypVYsmQJbr/9dnz99dfFzpAMZD9d19G6dWvMmDHD5zGK/sNaXvzNAvUnJycHXbt2RXR0NCZPnowmTZogLCwM33//PZ599tmg7oD6Mnv2bHzyySf4xz/+gbZt23ptz87ODug4MTExxneodu3aWLNmDUTEI1Bx56FLSkoK6Jh//PEHunfvjpiYGKxYsQLVqlXz2O4+jq/nIGvVqoWsrCy/x3cHsYEE127FBYHFXV9f5b6O4W5D4WcIiSoCDsUSVRDx8fGIjo7Gzp07S7W/O1nrzz//7FFus9mwb98+r2SurVu3xrhx47Bu3TqsX78ehw4dwrx584ztqqqiW7dumDFjBnbt2oWXX34Z33zzjTFUWpyS9mvSpAlOnTqFbt26ISUlxevlvqPWpEkT6LqOXbt2+T1foHdMiusfd1mokt2uXbsWJ0+exIIFC/DEE0/grrvuQkpKis/hw2Dv9qxfvx5PPfUURo8ejQcffNBnndq1awf0WrJkibFP27Ztcf78eY8ZrACwZcsWY3tJTp48ie7duyM/Px9fffUVateu7VWndevWMJvNXrOQAdfEoeLu4rq1aNECALBv3z6f28+cOeNV5r4DHGruNhSdcEJU3hjYEVUQqqqiT58++M9//oNt27Z5bS9p+CklJQUWiwVvvvmmR933338fubm5SEtLAwDk5eXB4XB47Nu6dWuoqmoMx506dcrr+O5/3H0N2bkFst99992HQ4cO4d133/Wqe+HCBWOGb58+faCqKiZPnux1l6vw54uMjPRK5+JLhw4dUKtWLcybN8/jM3z55ZfYvXu30T+Xy33Hp3AbbTYb5s6d61U3MjIy4KHZI0eO4L777kOXLl2MmbW+lOYZu969e8NsNnu0UUQwb9481KlTBzfeeKNHO/bs2QO73W6UnTt3DnfeeScOHTqEFStWIDk52WfbqlWrZiQnLvys4e7du7Fp0yb8+c9/9tsHderUQb169Xz+fgDwSm3z5Zdf4uLFi2WSkmT79u2IiYkpMaEy0ZXGoViiCmTq1Kn4+uuv0bVrVyMVyJEjR7B06VJs2LDBIx1HUfHx8Rg7diwmTZqEHj16oFevXvj5558xd+5cXH/99ejfvz8A4JtvvsHjjz+Ovn37olmzZnA4HFi4cCE0TcO9994LAJg8eTLWrVuHtLQ0NGjQAMeOHcPcuXNRt25dv2kvAtlvwIAB+PTTTzFixAisWbMGN910E5xOJ/bs2YNPP/0UX331FTp06ICmTZvihRdewEsvvYSbb74Z99xzD6xWK7777jskJSVh2rRpAFxpJ95++21MmTIFTZs2Ra1atXyuBmA2m/Hqq69iyJAh6Nq1K/r162ekO2nYsCGefPLJ0l42DzfeeCPi4uIwaNAgjBo1CoqiYOHChT6Di/bt22PJkiUYM2YMrr/+ekRFRaFnz54+jztq1CgcP34czzzzDBYvXuyxrU2bNmjTpg2A0j1jV7duXYwePRqvvfYa7HY7rr/+eqSnp2P9+vVYtGiRx/Dk2LFj8eGHH2Lfvn1G3r0HH3wQW7duxUMPPYTdu3d73PmLiopCnz59jPdTp041VmwYNWoUAODNN99E9erVA8qT2Lt3b3z++edew8aAK0C888470atXLxw+fBizZ89GTEwMNm3ahE8++QT9+vULum+Ks2rVKvTs2ZPP2FHFUw4zcYnIjwMHDsjAgQMlPj5erFarNG7cWB577DHJz88XkYJ0Db5Sooi40pu0aNFCzGazJCQkyMiRI+X06dPG9t9++00eeughadKkiYSFhUn16tXltttuk9WrVxt1MjIypHfv3pKUlCQWi0WSkpKkX79+8r///c9v2wPdz2azyauvviotW7YUq9UqcXFx0r59e5k0aZLk5uZ61P3ggw+kXbt2Rr2uXbvKqlWrjO3Z2dmSlpYm1apVEwBGaoqi6U7clixZYhyvevXq8uCDD8rBgwc96gwaNEgiIyO9Pt/EiRMlkL82N27cKDfccIOEh4dLUlKSPPPMM/LVV195tefs2bPyl7/8RWJjYwWA39QnXbt2LTZ1ia80H8FyOp0ydepUadCggVgsFmnZsqX84x//8KrnTgWzb98+o6xBgwbFts3XZ9q+fbukpKRIZGSkVKtWTXr37l3id8vt+++/FwBe6XIAyJgxY6Rv374SHh4utWvXljlz5si8efMkIiJCHn74YREp/vfHfW2Lpurx9V3YvXu3APD4nSGqKLikGBERVSrdunVDUlISFi5caJQpioKJEyde9iocgRg9ejTWrVuH7du3844dVTh8xo6IiCqVqVOnYsmSJUYKmyvp5MmTeO+99zBlyhQGdVQh8Rk7IiKqVDp16mSsnXyl1ahRw0i0TFQR8Y4dERERURXBO3ZERFTp8XFxIhfesSMiIiKqIhjYEREREVURHIoNkK7rOHz4MKpVq8aZUERERHTFiAjOnDmDpKQkqKr/e3IM7AJ0+PBhvPXWWzCZXF0mIjh9+nTInuuwWCzGxdJ1vVxmfJlMJuPzAa4loK70cyuKosBqtRrvHQ6H1/JXVwKvhwuvRwFejwK8Hi68HgV4PQqE6nooioK4uDjjZtLUqVPxxx9/oG7dun73Y2AXoGrVqsFkMkGzuL40CoC4uo0hIRrNVsQJk9N18R2aBaJoJexRBkRgdl4EAOiKhnDNcuXbAEBz2qCKEwBg18KAcrhDyutRgNfjEl4PA69HAV6PS3g9DKG6Hgp0mB0XUDg8rlatWon7MbALUMHwq3LpJYCqQglFYCc6TE47RHVdfJNuh8OkAcqVfARSoDlsgKJAV1Woug6BE6Kar2AbAEW3Q4UOXdOg6jpMYodTs8LV51cIr4eB18NoBK+HG6+HgdfDaASvh1vIr0ehmAMI6FEwBnZBEJFLXw9XB6u6E1Au81azCBRxQlST8UWA7oSm211R/hX634aiOy/9Ulpcfyo6VNEhuv3K/QUhOhTRoWtmQFGhK66+0Qr9kpR9G3g9DLweBl4Pdxt4PQy8HgZeD3cbQnw9RAcAKAguzmBgF4ScnBzEJsUBqgpVnMiLawLdZC15RyIiIqIgqI58RJ/eC13RAF0PeD8GdkHQdR2iqFAUFYBAN1nhNIWXd7OIiIioKlJUQFEhQdzsYx47IiIioiqCgR0RERFRFcHAjoiIiKiKYGAXBIvFAnChaSIiIqqgKtTkiRdffBGTJk3yKGvevDn27NlT7D5Lly7F+PHjsX//fiQnJ+PVV1/FnXfeaWwXEUycOBHvvvsucnJycNNNN+Htt99GcnJy0O1TVRWaboOuhQW9LxERUZkQgcWpI9JuR6TNjgi7HZF2ByJtdrQ6ftKj6rwObTBi23+9DuGrPNRlPI93WVmoUIEdALRs2RKrV6823hdeoqSoTZs2oV+/fpg2bRruuusufPzxx+jTpw++//57tGrVCgAwffp0vPnmm/jwww/RqFEjjB8/Hqmpqdi1axfCwoIL0PLz81FNdGiOfIh2ZRMvEhHR1UfT9UvBmsNn4BZpd7036xxNIpcKF9iZTCYkJiYGVHf27Nno0aMHnn76aQDASy+9hFWrVmHOnDmYN28eRASzZs3CuHHj0Lt3bwDARx99hISEBKSnp+OBBx4Iqm0iAqdmgUm3A7ozuA9GRER0iSKCCLvDFaQZAZrD6+cwJ/+toeBUuMDul19+QVJSEsLCwtC5c2dMmzYN9evX91k3MzMTY8aM8ShLTU1Feno6AGDfvn3Izs5GSkqKsT0mJgadOnVCZmam38AuPz8f+fn5xvu8vDwAgCgaHCYNmm4v7UckIqKqSgRWp/NSgFZ84BZud/AhdwpcEM/3V6jArlOnTliwYAGaN2+OI0eOYNKkSbj55puxc+dOnwvfZmdnIyEhwaMsISEB2dnZxnZ3WXF1ijNt2jSv5/2GDx/u+kFRy2eRZSIiKjcmp9NrCDTS5vD4OcJuh4mT7CikBJpuC7h2hQrs7rjjDuPnNm3aoFOnTmjQoAE+/fRTDB069Iq2ZezYsR53A/Py8jBlypSCCldoDT4iIipbqq4bz7BF+AncrM7Al3UiChXNkW+sGxuIChXYFRUbG4tmzZrh119/9bk9MTERR48e9Sg7evSo8Yye+8+jR4+idu3aHnXatm3r99xWqxVWK9eBJSKqtEQQ7nB4BGtFJyJE2u0Id/A5NqqYFN0JRXQ4NEvA+1TowO7s2bPYu3cvBgwY4HN7586dkZGRgdGjRxtlq1atQufOnQEAjRo1QmJiIjIyMoxALi8vD1u2bMHIkSPLuvlERFQWLqX3cM0OLRgCLRq4Rdjt0DgqSpWawGEKCyqFboUK7J566in07NkTDRo0wOHDhzFx4kRomoZ+/foBAAYOHIg6depg2rRpAIAnnngCXbt2xRtvvIG0tDQsXrwY27ZtwzvvvAMAUBQFo0ePxpQpU5CcnGykO0lKSkKfPn3K62MSEVExNF33GAItmt7D/bNZ57AokS8VKrA7ePAg+vXrh5MnTyI+Ph5dunTB5s2bER8fDwD4/fffoaoF84huvPFGfPzxxxg3bhyef/55JCcnIz093chhBwDPPPMMzp07h0ceeQQ5OTno0qULVq5cGXQOOyIiKj1FBOEeudh8B25M70FUmAKT4yIcauC5cytUYLd48WK/29euXetV1rdvX/Tt27fYfRRFweTJkzF58uTLbR4RERVVKL2H57Nrnqk+mN6DKHiiaoDo0JyVdFZspcLp7ERUxZkuLVMVUUyw5p6UwPQeRGXHabJCtV8MuD4Du9IQHYpwuICIKidVF4Q7fAVrhZ9jY3oPoopBgVOtIrNiKyJFnDA57RCVXUdEFYwIwhxOj1QevvKyhTscYCZOokokiNy5jE6CoCgKNKcNomqucW8ioivEbCxT5XtNUffPGodFia5qDOyCYLVaIYoK3WSFGkQWaCKi4qi67jUE6isvm4XpPYgoAAzsgqDrOpyqBQoHMYioBO70Hr6DtYIEulz1gIhCiYFdEGw2GyK5RizR1U0EliKLwXvnZXMFcUzvQURXGgM7IqJLTB7LVHkHa+67bGadz7ERUcXEwI6IqryC9B6ez64VTfVh5aoHRFTJMbAjosqrUHoP30l0XT9H2Jneg4iuDgzsiKhCMjudXovBM70HEZF/DOyI6Ipyp/coaZkqpvcgIgoeAzsiCg0RhDscPoO1ws+2Mb0HEVHZYWBHRP6JwHJpMfiCJLq+E+oyvQcRUfkKOrDbt28f1q9fjwMHDuD8+fOIj49Hu3bt0LlzZ4SFhZVFG4mojGi67iOth3cSXab3ICKqHAIO7BYtWoTZs2dj27ZtSEhIQFJSEsLDw3Hq1Cns3bsXYWFhePDBB/Hss8+iQYMGZdlmIiqBImI8q+ZvmaowpvcgIqpSAgrs2rVrB4vFgsGDB+Nf//oX6tWr57E9Pz8fmZmZWLx4MTp06IC5c+eib9++ZdJgoqvapfQevodDCyfRZXoPIqKrUUCB3SuvvILU1NRit1utVtx666249dZb8fLLL2P//v2hah/RVcNUZJmqiCLDoe5JCUzvQURExQkosPMX1BVVo0YN1KhRo9QNIqpqVF33uJPmK3Bjeg8iIgqFUs+KPXbsGI4dOwa9yD9Gbdq0uexGEVUKl9J7RBRZDL5oqg+m9yAioisl6MBu+/btGDRoEHbv3g25NCSkKApEBIqiwMmHsamyK5Teo7jh0IhL7zWOihIRUQUSdGD30EMPoVmzZnj//feRkJAARbl6HtE2mZj2r7LTdN1rCNTXRASm9yAiosoo6Ejlt99+w7/+9S80bdq0LNpToZlMJqi6HaJay7spVIQignCPXGy+Azem9yAioqos6MCuW7du+OGHH67KwM7hcEDTHXDqKqAwx/4VIQKr0+kVrHk9x2Z3cNUDIiK66gUd2L333nsYNGgQdu7ciVatWsFsNnts79WrV8gaV9E4HA44VRM0px26Zi55B/LLFOAyVSam9yAiIgpI0IFdZmYmNm7ciC+//NJr29UweUJXzQBUqMLUFMVRdTEmF3gGa56Bm9XJPiQiIgqloAO7v/71r+jfvz/Gjx+PhISEsmhThSeqGaLbEYZzaKdleGz73tkV51GtnFpWxi6tehBZaAjUV162cAdXPSAiIgoVVbcHXDfowO7kyZN48sknr9qgznAZz9jF2fNwRouAQ60gs2xFYL60GLx3sOb5M1c9ICIiunIU3Q5NdwRcP+jI4p577sGaNWvQpEmTYHclAGbdgeHZ/4ZT0bA9shl2RDXFKXNMmZ1Pc696UMIyVWauekBERFSxiA7NaYcziBtBQQd2zZo1w9ixY7Fhwwa0bt3aa/LEqFGjgj3kVUWDExbdjnD9HFJyt+PmvP/il/A6+D6qOf4XXhe6ogV0nMLpPbyDtYKfueoBERFR5aSIDqdmho7AYgOglLNio6Ki8O233+Lbb7/1bICiMLAL0HnNinzFjDCxoeX5/bj2/AGcNEVjW1Rz7A5rBKdYPZapiiiSoy3Cbmd6DyIioipOVBMQRNL8oAO7ffv2BbtL0P7+97/jtddeQ3Z2Nq677jq89dZb6NixY7H1ly5divHjx2P//v1ITk7Gq6++ijvvvNPYLiKYOHEi3n33XeTk5OCmm27C22+/jeTk5KDa1TAmHJGOUwAUOKDCfOEoUChXscXpxH1Hv4VaTP+rAph0J8y6EwIVKpxQRYUuFph0B+raT6H+hU3QZQvO2msg11YL550xAKciEBERXZU0Rz4cSuAp1kJ20+fIkSOYPn36ZR9nyZIlGDNmDCZOnIjvv/8e1113HVJTU3Hs2DGf9Tdt2oR+/fph6NChyMrKQp8+fdCnTx/s3LnTqDN9+nS8+eabmDdvHrZs2YLIyEikpqbi4sWLQbUt0mJChJ6PCD0fYboNLXMOISnvrPFqkJOHFucOocW5g2h+7iCuOXcQ1579Ay3P/IFWZ35HyzO/o/m5Q4iy2xFu0xF16e5bmMMJk65A1y1w6BYAgmjLMdSN/AkNo3Yg1nIYmhL4jBgiIiKq/ETRoIgOTbcFvE+p1or15cCBA9i6dSueeeaZYA/pYcaMGRg2bBiGDBkCAJg3bx6WL1+ODz74AM8995xX/dmzZ6NHjx54+umnAQAvvfQSVq1ahTlz5mDevHkQEcyaNQvjxo1D7969AQAfffQREhISkJ6ejgceeCDgttmdOgDVtT6uAiSdOY8I5BrbTboOq1Pg1M2QSzGzXHoFToEuZugiUKDDqp5DQvhvqBn2O87YaiLXnoCLzijwLh4REVEVpyhwmMKg2S8EvEvQgd3p06c93judTvz222/YvXs35s6dG+zhPNhsNmzfvh1jx441ylRVRUpKCjIzM33uk5mZiTFjxniUpaamIj09HYBr6Dg7OxspKSnG9piYGHTq1AmZmZnFBnb5+fnIz8833ufl5UFRAFEFOgT5igbdfBFiKqij6wKHCJy6KwAMBdcEZ4GqXEC0ZR8i5CBO5ddDnr1WSI5PRERXj2o4CcV6JqDyUJfxPN5l/iiwQYUDiqJBTGU4eeLzzz/3Wf7yyy8jPT0dw4cPD/aQhhMnTsDpdHrlyEtISMCePXt87pOdne2zfnZ2trHdXVZcHV+mTZuGSZMmeZTNnDwKDtWBM3okVDiQX2cPzNaCO3YKBE4dxt260BAol+75CVQ4dAvs+glYOHWCiIiC1N2cCUvTswGVh7qM5/Eu8+cCrPhZSYamOgGlDCdPFKdfv36YMmVKqA5X7saOHetxJzAvLw//mv86zjgj4RQNVi0fum6FQwpmT2giUJw6IAoAxQjIfPM/lKpAh2sQV4FTzLA5w+DQrRAOwRIRUSmdl2joNu+8pb7KQ13G83iX+ZMvrjQnrpgu8FyzIQvsfvjhB7Rr1+6yjlGzZk1omoajR496lB89ehSJiYk+90lMTPRb3/3n0aNHUbt2bY86bdu2LbYtVqsVVqvVo8wBE5zQEGW6ABEVOZYoXAgvyBNn1p2IP2eDUij2Ui6t1OAuUgCookOHeikAdN3pc/1U+O6cGTY9DDY9HE7dBD5TR0REl8uOMEC3BFQe6jKex0eZH3aYIFAhECCIVZ+CDuyKPs8GuIKkZcuWIS0tzWP7jBkzgjq2xWJB+/btkZGRgT59+gAAdF1HRkYGHn/8cZ/7dO7cGRkZGRg9erRRtmrVKnTu3BkA0KhRIyQmJiIjI8MI5PLy8rBlyxaMHDkyqPZddAosFgfyVQucuoYT5mjUKTR5wq5q2BVZHyLFj4Wr0HHN+QMAFDgVFQoATZzQRIdAQb5iRZ4ShQuIgKoDZl2HSReYdB1aEHlsiIiI6OoTdGCXlZXls/z666/HsWPHjLQkilK6O0xjxozBoEGD0KFDB3Ts2BGzZs3CuXPnjFmyAwcORJ06dTBt2jQAwBNPPIGuXbvijTfeQFpaGhYvXoxt27bhnXfeMdoxevRoTJkyBcnJyWjUqBHGjx+PpKQkI3gMmG6DolhdEbTiGm4tyqGY/Oab0cR1h0+FDk13Dbc6FQ3HzLE4YY7BWS2i2H0VcQV4Jl0uBXyul1nXYXIWvC8ujx4RERFVbUEHdmvWrCmLdhjuv/9+HD9+HBMmTEB2djbatm2LlStXGpMffv/9d6hqwcSBG2+8ER9//DHGjRuH559/HsnJyUhPT0erVq2MOs888wzOnTuHRx55BDk5OejSpQtWrlyJsDD/t0GL8v/MXHBHggguqBYct8TilCkadqXkSyGKArumwa4B/iY+q1Io8HMWCQB1Md4H8SwmERERVQIhe8YulB5//PFih17Xrl3rVda3b1/07du32OMpioLJkydj8uTJoWpiqTkVDQet8chXzcjVIlEWz87pioJ8TUO+pgF+klVrxt0/pyvwc3oGfmYO/xIREVUqAQV2PXr0wIsvvogbbrjBb70zZ85g7ty5iIqKwmOPPRaSBlYkmgZYFBugAHYxo7p6GJGKZ14/RbG7Jkb4YwXCAITheNk1NhA+mqkDsF16Aa4Z1qq47gKqIlBEoF36ufCLd/+IiCq+BDUXapT3qku+ykNdxvN4l/lzXg3HEcTCHOTKUwEFdn379sW9996LmJgY9OzZEx06dEBSUhLCwsJw+vRp7Nq1Cxs2bMCKFSuQlpaG1157LahGVBYigBMqABUCDRekGo6L9yyZKsf344SeVS4FfJquX/pTCv3puvPHAJCIqHxdkCiI3fsvdF/loS7jebzL/MkXKwQanBCEPN3J0KFD0b9/fyxduhRLlizBO++8g9xcV6SpKAquvfZapKam4rvvvsM111wT8MkrG10HnGICoMEJDWckDjZxlHezKg4FQAnJsTVjqNcJc+Fh30LPApo4/EtEVCbypDok33u4xld5qMt4Hu8yf/LFBCdMrtRo4vRbt7CAn7GzWq3o378/+vfvDwDIzc3FhQsXUKNGDZjNfh7kIirEqSpwqhryS4gAvYO9whNAXMEfn/8jIiLyVOrJEzExMYiJiQllW4gMDlWFQ/X/rKKv9C9FZwObOfuXiIiuIhVyVixRIIJO/+KV+sU9DOwKEImIiCo7BnZU5Xmkf/FD8wr4CoZ9mf6FiIgqAwZ2RJc4VRXOgIZ/xfedv0LDwFz9g4iIygMDuyCoKqApDkDRARFUU04jTMkv72bRlaTAI/+f49LLq5rP9C86NB1M/0JE5SZa0aFYzwZUHuoynse7zJ+LihUaarjijlCnOyls0KBBGDp0KG655ZZgd630FAXQoAPQoUOBVTmHcMXf01101XKnK9IAQfEBYOHkz8ZLL5oA+so1m4iqtnBFoJi9E+36Kg91Gc/jXeaPKA4ocELz+a9H8YIO7HJzc5GSkoIGDRpgyJAhGDRoEOrUqRPsYSolpxOwiQXuPHYn9Lqw6sxjRyFQOAl0kUcBFXHd5Sua/sVzGNgVEBIR+XM0vDqqnz0VUHmoy3ge7zJ/8nUTHLBCxFQ2eezc0tPTcfz4cSxcuBAffvghJk6ciJSUFAwdOhS9e/dmTjuiEBMFcCiBp38pnOvP12xgDv8SEVVdpXrGLj4+HmPGjMGYMWPw/fffY/78+RgwYACioqLQv39/PProo0hOTg51W8udlLSuFlE5Kkj/4n/2b9H0L94zgZn+hYiosrqsyRNHjhzBqlWrsGrVKmiahjvvvBM//vgjrr32WkyfPh1PPvlkqNpZIYhihi4qVMZ3VIkFmv7F5BXwFbkTyPQvREQVTtCBnd1ux7///W/Mnz8fX3/9Ndq0aYPRo0fjL3/5C6KjowEAn3/+OR566KEqF9gBApvDAouZz9VR1Rf46h9Fh4C9VwDhBBAioisj6MCudu3a0HUd/fr1w9atW9G2bVuvOrfddhtiY2ND0LyKRRU7RNFhc5hh0gJ/kJGoqnIN/yqwa2qJq3/4CvgK3/0z8fk/IqLLFnRgN3PmTPTt2xdhYWHF1omNjcW+ffsuq2EVkgKEmfKR7wyDLgrMyIcZ9vJuFVHFpwCiATYNsLkLik7/BVz5/nSBSZwFq344XTkATRz+JbpsZlwEVFtA5aEu43l8lPmhwwwFOhTocCXOCkzQgd2AAQOC3aXK0FTAotpgVuy46AxDDfUwIlTmsSMKmWJGfp2XXvkAIK5qrgTPUvAnPHMCBvH3INFVo5aaBzXKO7G+r/JQl/E83mX+nFfD8Qdqwaw44JDAH+7nyhNBcOqATbcAigpRVJzUk3BW5x07onJTOP9f0U3u5/9Ev7QOsEBz6jBdWhHEtfYvh3/p6nLMGovoszkBlYe6jOfxLvMnXzfDAQscugl2e+Cp5BjYBUPcKU9UQFFhhxWqj+EkIqoAFNfQb0k0Ea9cf96zgRn9UdVgRxigWwIqD3UZz+OjzA87TNBFhcNphqKUYYJiIqKqxKkocJo05JfwnzTfqV8KVv7g839EFGq6qFAUHRbN+/m+4jCwIyIKgDv9y0U/f2u6V/8oOtu36AogTP9CRAERwKI5gloegYEdEVGIFKz+gcDTv3gNAwvTvxCRwaFrMKsciiUiqrB0RYFN02DTNMDPM9GacffP6bXkmzsQ5PAvUdWlqAKHQ0Mw4RoDOyKiCsqpqnCq8Pv8X+HVP3xOAHEP/3L5X6JKR1UEJs0Jh5OBXZnQNMCi2AAFyNetqKkeZB47Iip/PuI+j9x/ABQpyPOnGTkAPcuY/6/qS1BzoUZ5J8b1VR7qMp7Hu8yf82o4jiAWZpMdNnjPyC0OA7sgiABOqLA7LXCKCfkSCUXYhURUSfjJ++emimv1D030S38KVHENAWu662eNd/8qrQsSBbF7fwl8lYe6jOfxLvMnX6wQaHBCoGmBr1HPqCQIug5cdIbB4TTDZNJxRuJgk8A7m4ioUnCvAOInA0xx6V8KhoGFz/9VQHlSHZLvvcSLr/JQl/E83mX+5IsJTpgAUQDh5IkyIYoGp9MEk+aEGszcYyKiKobpX4gqJgZ2QRCYYNIcMGsCp3DFCSIif4JJ/+I79Yv7rqArQCSikjGwC4ICB8yqAr/jE0REFBRdUZCvacjX/P/dqnkFfAXDvkz/QuTiPWBcjgYPHgxFUTxePXr0KHG/v//972jYsCHCwsLQqVMnbN261WP7xYsX8dhjj6FGjRqIiorCvffei6NHjwbdPiWIMW4iIgotp6riosmEsxYLcsLCcDwyAkeqReGPmGrYFxeD/9WIw56acfi1eiz2x0bjYHQUjkZF4GREGHLDLDhvMcFmUqHzURqqwircHbsePXpg/vz5xnur1eq3/pIlSzBmzBjMmzcPnTp1wqxZs5Camoqff/4ZtWrVAgA8+eSTWL58OZYuXYqYmBg8/vjjuOeee7Bx48Yy/SxERHRluYZ/Fdg1//ctVJFinvnzfB6Qq39QZVPhAjur1YrExMSA68+YMQPDhg3DkCFDAADz5s3D8uXL8cEHH+C5555Dbm4u3n//fXz88ce4/fbbAQDz58/HNddcg82bN+OGG24I+FyqCmiKA1B0QATVlNMIU/JL3pGIiCoWBcaYlQCwX3oVpV5K+eJK/6JDE1Tq9C/Rig7Fejag8lCX8TzeZf5cVKzQUMMVdyDwL1mFC+zWrl2LWrVqIS4uDrfffjumTJmCGjVq+Kxrs9mwfft2jB071ihTVRUpKSnIzMwEAGzfvh12ux0pKSlGnRYtWqB+/frIzMwsNrDLz89Hfn5B0JaXlwdFATToAHToUGBVziFcYYJiIqIqq9BjfzoK/nkt/F96RVxxoivQcyd/Lkj67H5VhLt/4YpAMXsn2vVVHuoynse7zB9RHFDghIbg0qpVqMCuR48euOeee9CoUSPs3bsXzz//PO644w5kZmZC8/FQ7YkTJ+B0OpGQkOBRnpCQgD179gAAsrOzYbFYEBsb61UnOzu72LZMmzYNkyZN8ih7efxjsIkFgAYnNJzQ68KqM48dERGhxATQ7vQv5iITPorOBi7LAPBoeHVUP3sqoPJQl/E83mX+5OsmOGCFiKly5LFbtGgRhg8fbrz/8ssv8cADDxjvW7dujTZt2qBJkyZYu3YtunXrdkXbN3bsWIwZM8Z4n5eXh4/eeeWKtoGIiKqOgvQv/mf/Fk3/4j0TmOlfqHjlFtj16tULnTp1Mt7XqVPHq07jxo1Rs2ZN/Prrrz4Du5o1a0LTNK8ZrkePHjWe00tMTITNZkNOTo7HXbvCdXyxWq0lTtwgIiIKtUDTv5h8pn5h+perXbkFdtWqVUO1atX81jl48CBOnjyJ2rVr+9xusVjQvn17ZGRkoE+fPgAAXdeRkZGBxx9/HADQvn17mM1mZGRk4N577wUA/Pzzz/j999/RuXPn0H0gIiKiK8i9+kewdsf7HgL0VR7qMp6n7FWYPHZnz57F008/jc2bN2P//v3IyMhA79690bRpU6Smphr1unXrhjlz5hjvx4wZg3fffRcffvghdu/ejZEjR+LcuXPGLNmYmBgMHToUY8aMwZo1a7B9+3YMGTIEnTt3DmpGLBEREVFFV2EmT2iahv/+97/48MMPkZOTg6SkJHTv3h0vvfSSx5Do3r17ceLECeP9/fffj+PHj2PChAnIzs5G27ZtsXLlSo8JFTNnzoSqqrj33nuRn5+P1NRUzJ0794p+PiIiIqKypogIB+ADkJeXhzlvPA9rmBVQVDhFQ6NaB2E1+8p8RERERFR6+XYz9h2rC01xAqLjqednIDc3F9HR0X73qzB37CoDTQUsqg2AAruYUEM9jAiVeeyIiIgotM6r4fgDtWBWHAgmBw4DuyA4dcCmW1x37KDhpJ6Eszrv2BEREVFo5etmOGCBiAZIJV55okITQC6tQyNQYYcVKvxPRyciIiIKlh0mCFQIBK6F7wLDwC4IAgW6uFKL6wLYHOw+IiIiCj2bwwRdAAUKIH6WNCmCkUkQHGoMnHYVigKIKDhysibUAMe9RQBdVAACzb2wYDAEcF4KKlVFhxLs/iE6hi4KRFegqBLwZw/1MS67L0NxDF4PA69HAV4P9wF4Pdx4PQrwergPEFhf6qLAbjfBoUgwN+wY2AVHhUCBiECBQFN0qErJ4966KLA7zVAUHRbNUbpfKgVQBbA5TXDoGiwme1BfahHAppsgoga9b2GaAthFg8OhwaQ5YdYCX78OAOxODQ6n6tpXDW5fgwLoosPmMENK0ae8HgV4PVx4PQrwehTg9XDh9ShwJa+HAhX2YCK6SxjYBciVFUbgyumsQKADcJb4QKMuKmwOMxTFCYtmcwX2pUwwowCwaE7YHBbY7CZYTLaAAksBYHNYIKLAYsqHCr3UbQBw6RfKBIfTBECHWXUEtJ9dN136pbS79rmMNqgALJru6gvRYDHZAvpPE69HAV4PF16PArweBXg9XHg9Clz56yEAzJfiD1cLA8lQxzx2ATp48CDq1atX3s0gIiKiq9Qff/yBunXr+q3DwC5Auq7j8OHDqFatGpQS7r3m5eWhXr16+OOPP0pMJEglY3+GDvsytNifocX+DC32Z2iVZ3+KCM6cOYOkpCSoJawPzKHYAKmqWmKUXFR0dDR/mUKI/Rk67MvQYn+GFvsztNifoVVe/RkTExNQPf9hHxERERFVGgzsiIiIiKoIBnZlwGq1YuLEibBareXdlCqB/Rk67MvQYn+GFvsztNifoVVZ+pOTJ4iIiIiqCN6xIyIiIqoiGNgRERERVREM7IiIiIiqCAZ2RERERFUEAzsfBg8eDEVRPF49evTwqHPq1Ck8+OCDiI6ORmxsLIYOHYqzZ8/6Pe7Fixfx2GOPoUaNGoiKisK9996Lo0ePetT5/fffkZaWhoiICNSqVQtPP/00HI7A1tKrDEaMGAFFUTBr1iyPcvZn4F588UW0aNECkZGRiIuLQ0pKCrZs2eJRh/0ZGLvdjmeffRatW7dGZGQkkpKSMHDgQBw+fNijHvszcJ999hm6d++OGjVqQFEU7Nixw6tOIH1TlIhgwoQJqF27NsLDw5GSkoJffvnFo05prlNl8/e//x0NGzZEWFgYOnXqhK1bt/qtv3TpUrRo0QJhYWFo3bo1VqxY4bE9kH6tCtatW4eePXsiKSkJiqIgPT3dY3tp+6Gk61Ga7/plE/IyaNAg6dGjhxw5csR4nTp1yqNOjx495LrrrpPNmzfL+vXrpWnTptKvXz+/xx0xYoTUq1dPMjIyZNu2bXLDDTfIjTfeaGx3OBzSqlUrSUlJkaysLFmxYoXUrFlTxo4dWyaf80r77LPP5LrrrpOkpCSZOXOmxzb2Z+AWLVokq1atkr1798rOnTtl6NChEh0dLceOHTPqsD8Dk5OTIykpKbJkyRLZs2ePZGZmSseOHaV9+/Ye9difgfvoo49k0qRJ8u677woAycrK8qpTUt/48sorr0hMTIykp6fLDz/8IL169ZJGjRrJhQsXjDqluU6VyeLFi8ViscgHH3wgP/30kwwbNkxiY2Pl6NGjPutv3LhRNE2T6dOny65du2TcuHFiNpvlxx9/NOoE0q9VwYoVK+SFF16Qzz77TADI559/7rG9NP0QyPUozXf9cjGw82HQoEHSu3fvYrfv2rVLAMh3331nlH355ZeiKIocOnTI5z45OTliNptl6dKlRtnu3bsFgGRmZoqI64unqqpkZ2cbdd5++22Jjo6W/Pz8y/xU5evgwYNSp04d2blzpzRo0MAjsGN/Xp7c3FwBIKtXrxYR9ufl2rp1qwCQAwcOiAj7s7T27dvnM7ALpG+K0nVdEhMT5bXXXvM4jtVqlU8++URESnedKpuOHTvKY489Zrx3Op2SlJQk06ZN81n/vvvuk7S0NI+yTp06yfDhw0UksH6tiooGdqXth5KuR2m+66HAodhirF27FrVq1ULz5s0xcuRInDx50tiWmZmJ2NhYdOjQwShLSUmBqqpeQ2Ju27dvh91uR0pKilHWokUL1K9fH5mZmcZxW7dujYSEBKNOamoq8vLy8NNPP4X6I14xuq5jwIABePrpp9GyZUuv7ezP0rPZbHjnnXcQExOD6667DgD783Ll5uZCURTExsYCYH+GWiB9U9S+ffuQnZ3tsU9MTAw6derk0Z/BXqfKxGazYfv27R59oKoqUlJSiu23zMxMj/qA6zvmrh9Iv14NStMPgVyP0nzXQ4GBnQ89evTARx99hIyMDLz66qv49ttvcccdd8DpdAIAsrOzUatWLY99TCYTqlevjuzsbJ/HzM7OhsViMf6xcEtISDD2yc7O9vhL3r3dva2yevXVV2EymTBq1Cif29mfwfviiy8QFRWFsLAwzJw5E6tWrULNmjUBsD8vx8WLF/Hss8+iX79+xiLf7M/QCqRvfO3jrlPcPqW5TpXJiRMn4HQ6/fZBUcV9xwr3mbss0GNWRaXph0CuR2m+66Fw1Qd2ixYtQlRUlPFav349HnjgAfTq1QutW7dGnz598MUXX+C7777D2rVry7u5FV7R/vz2228xe/ZsLFiwAIqilHfzKh1f308AuO2227Bjxw5s2rQJPXr0wH333Ydjx46Vc2srvuL6E3BNpLjvvvsgInj77bfLsZWVh7/+JKLycdUHdr169cKOHTuMV+Hb+G6NGzdGzZo18euvvwIAEhMTvf4RdTgcOHXqFBITE32eJzExETabDTk5OR7lR48eNfZJTEz0mi3jfl/ccSuaov25adMmHDt2DPXr14fJZILJZMKBAwfwt7/9DQ0bNgTA/vSnuO9nZGQkmjZtihtuuAHvv/8+TCYT3n//fQDsT3+K6093UHfgwAGsWrXKuFsHsD/9CeTvz6IC6Rtf+7jrFLdPaa5TZVKzZk1omua3D4oq7jtWuM/cZYEesyoqTT8Ecj1K810PiTJ7eq8K+eOPP0RRFFm2bJmIFDyku23bNqPOV199FdDD1P/85z+Nsj179vh8mLrwjJr/+7//k+joaLl48WJZfLQyd+LECfnxxx89XklJSfLss8/Knj17RIT9GQqNGzeWiRMnigj7M1g2m0369OkjLVu29JhZ7Mb+LJ2SJk/465ui3A+3v/7660ZZbm6uz8kTwVynyqZjx47y+OOPG++dTqfUqVPH7+SJu+66y6Osc+fOXpMn/PVrVYRiJk8E2w8lXY/SfNdDgYFdEWfOnJGnnnpKMjMzZd++fbJ69Wr505/+JMnJyR5/2fbo0UPatWsnW7ZskQ0bNkhycrLHtPqDBw9K8+bNZcuWLUbZiBEjpH79+vLNN9/Itm3bpHPnztK5c2djuzv9Qffu3WXHjh2ycuVKiY+Pr/TpD4oqOitWhP0ZqLNnz8rYsWMlMzNT9u/fL9u2bZMhQ4aI1WqVnTt3GvXYn4Gx2WzSq1cvqVu3ruzYscMjxVHhmansz8CdPHlSsrKyZPny5QJAFi9eLFlZWXLkyBGjTkl9IyLSvHlz+eyzz4z3r7zyisTGxsqyZcvkv//9r/Tu3dtnuhN/16myW7x4sVitVlmwYIHs2rVLHnnkEYmNjTVmVg8YMECee+45o/7GjRvFZDLJ66+/Lrt375aJEyf6THdSUr9WBWfOnJGsrCzJysoSADJjxgzJysoyZr8H0g+33367vPXWW8b7kq6HSGDf9VBjYFfE+fPnpXv37hIfHy9ms1kaNGggw4YN87hQIq6/vPr16ydRUVESHR0tQ4YMkTNnzhjb3f9bXbNmjVF24cIFefTRRyUuLk4iIiLk7rvv9vjLTkRk//79cscdd0h4eLjUrFlT/va3v4ndbi/Tz3yl+Qrs2J+BuXDhgtx9992SlJQkFotFateuLb169ZKtW7d61GN/BsbdD75ehfuG/Rm4+fPn++xP9x1lkcD6BoDMnz/feK/ruowfP14SEhLEarVKt27d5Oeff/bYp6TrVBW89dZbUr9+fbFYLNKxY0fZvHmzsa1r164yaNAgj/qffvqpNGvWTCwWi7Rs2VKWL1/usT2Qfq0K1qxZ4/N76e6vQPqhQYMGHt9jEf/XQySw73qoKSIiZTfQS0RERERXylU/eYKIiIioqmBgR0RERFRFMLAjIiIiqiIY2BERERFVEQzsiIiIiKoIBnZEREREVQQDOyIiIqIqgoEdERERURXBwI6IKETef/99dO/evczPs3LlSrRt2xa6rpf5uYiocmFgR0QUAhcvXsT48eMxceLEMj9Xjx49YDabsWjRojI/FxFVLgzsiIhC4J///Ceio6Nx0003XZHzDR48GG+++eYVORcRVR4M7IiICjl+/DgSExMxdepUo2zTpk2wWCzIyMgodr/FixejZ8+eHmW33norRo8e7VHWp08fDB482HjfsGFDTJkyBQMHDkRUVBQaNGiAf//73zh+/Dh69+6NqKgotGnTBtu2bfM4Ts+ePbFt2zbs3bu39B+WiKocBnZERIXEx8fjgw8+wIsvvoht27bhzJkzGDBgAB5//HF069at2P02bNiADh06lOqcM2fOxE033YSsrCykpaVhwIABGDhwIPr374/vv/8eTZo0wcCBAyEixj7169dHQkIC1q9fX6pzElHVxMCOiKiIO++8E8OGDcODDz6IESNGIDIyEtOmTSu2fk5ODnJzc5GUlFTq8w0fPhzJycmYMGEC8vLycP3116Nv375o1qwZnn32WezevRtHjx712C8pKQkHDhwo1TmJqGpiYEdE5MPrr78Oh8OBpUuXYtGiRbBarcXWvXDhAgAgLCysVOdq06aN8XNCQgIAoHXr1l5lx44d89gvPDwc58+fL9U5iahqYmBHROTD3r17cfjwYei6jv379/utW6NGDSiKgtOnT5d4XKfT6VVmNpuNnxVFKbasaHqTU6dOIT4+vsRzEtHVg4EdEVERNpsN/fv3x/3334+XXnoJDz/8sNfdssIsFguuvfZa7Nq1y2tb0eHT3377LSRtvHjxIvbu3Yt27dqF5HhEVDUwsCMiKuKFF15Abm4u3nzzTTz77LNo1qwZHnroIb/7pKamYsOGDV7ly5Ytw2effYa9e/fi5Zdfxq5du3DgwAEcOnTostq4efNmWK1WdO7c+bKOQ0RVCwM7IqJC1q5di1mzZmHhwoWIjo6GqqpYuHAh1q9fj7fffrvY/YYOHYoVK1YgNzfXozwtLQ3Tp0/Htddei3Xr1mHu3LnYunUrFi5ceFnt/OSTT/Dggw8iIiLiso5DRFWLIoXnzxMRUan17dsXf/rTnzB27FgArjx2bdu2xaxZs0J6nhMnTqB58+bYtm0bGjVqFNJjE1Hlxjt2REQh8tprryEqKqrMz7N//37MnTuXQR0ReeEdOyKiMlJWd+yIiIrDwI6IiIioiuBQLBEREVEVwcCOiIiIqIpgYEdERERURTCwIyIiIqoiGNgRERERVREM7IiIiIiqCAZ2RERERFUEAzsiIiKiKuL/A4Lh/fWQKPp2AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sim_3d = make_3d_sim(p=best_p, source_x=best_source_x)\n",
    "sim_3d.plot(z=t_si)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run the 3D simulation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "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\">13:05:53 UTC </span>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'3D_GC'</span> with task_id                                  \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8'</span> and task_type <span style=\"color: #008000; text-decoration-color: #008000\">'FDTD'</span>.  \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m13:05:53 UTC\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'3D_GC'\u001b[0m with task_id                                  \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8'\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-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a7</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">7-4774-80f0-a36fa6d3dab8'</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=94214;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=966395;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=94214;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=575951;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[32mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=94214;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[32m-c11a8f5d-9a7\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=94214;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[32m7-4774-80f0-a36fa6d3dab8'\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=559074;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": "49f3d58c3f3f4391bc8503b374c04ae1",
       "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\">13:05:55 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.687</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;36m13:05:55 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.687\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\">13:05:56 UTC </span>status = queued                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m13:05:56 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": "fed6210c752440db85889f092243032c",
       "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\">13:06:04 UTC </span>status = preprocess                                                \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m13:06:04 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\">13:06:08 UTC </span>starting up solver                                                 \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m13:06:08 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": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9ce7666f1c024bad96d92730d0c3165a",
       "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\">13:06:52 UTC </span>status = success                                                   \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m13:06: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-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">'https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a7</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\" target=\"_blank\"><span style=\"color: #000080; text-decoration-color: #000080; text-decoration: underline\">7-4774-80f0-a36fa6d3dab8'</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=590399;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[4;34m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=573407;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[4;34mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=590399;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[4;34m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=555665;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[4;34mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=590399;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[4;34m-c11a8f5d-9a7\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=590399;https://tidy3d.simulation.cloud/workbench?taskId=fdve-c11a8f5d-9a77-4774-80f0-a36fa6d3dab8\u001b\\\u001b[4;34m7-4774-80f0-a36fa6d3dab8'\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": "a5c1616215314223857e81069bb67177",
       "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\">13:06:54 UTC </span>loading simulation from simulation_data.hdf5                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m13:06:54 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_3d, task_name=\"3D_GC\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot the coupling efficiency as a function of wavelength. Compared to 2D, the coupling efficiency of -4 dB is slightly lower in 3D. This is because of two factors: 1. the taper introduces some loss during the mode size conversion down to the single-mode waveguide; 2. The optimal parameters in 2D can differ slightly from the optimal parameters in 3D. \n",
    "\n",
    "One can perform a parameter sweep similar to the 2D case to further optimize the design. For simplicity, we skip this part in this notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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WRZdunTh66+/ZtWqVeTPn9/G6rzLf9u6Tp06/Pbbb2zfvj3+VrFiRdq0acP27dvx9/e3udqU6+bPdPXq1W+ZkmHfvn3kzZvX3aV5lZvbOSoqCj+/hL8y/f39iYuLc3dpKVb16tU5duwYFy9ejN+3b98+/Pz84v8ArVq1aoLfhQDLly936u9CjfFJhosXLyb4S+DgwYNs376dTJkykSdPHvr27cvRo0f55JNPAHj33XfJnz8/JUuW5MqVK0yfPp1Vq1axbNmy+GP07NmTtm3bUrFiRSpXrsy7777LpUuXeOmll9z+9XkKV7Rz586dmTNnDosWLSJdunTx543Tp09PcHCwe79AD+Lstk6XLt0t46bSpk1L5syZfXo8lSs+0z169KBatWqMGDGCp59+ml9++YWpU6cydepUt399nsIV7dykSROGDx9Onjx5KFmyJNu2bWP8+PG0b9/e7V+fp0hqO7du3ZqhQ4fy0ksvMXjwYCIiIujduzft27eP//nbrVs3atSowbhx42jUqBHz5s3j119/de7n2WknzXzI9Usfb761bdvWsizLatu2rVWjRo34548ePdoqWLCgFRQUZGXKlMmqWbOmtWrVqluO+/7771t58uSxUqdObVWuXNnatGmTm74iz+SKdr7d8QBrxowZ7vvCPJCrPtP/pTE+rmvnb7/91ipVqpQVGBhoFStWzJo6daqbviLP5Ip2Pn/+vNWtWzcrT548VlBQkFWgQAGrX79+VnR0tBu/Ms+S1Ha2LMvas2ePVbduXSs4ONjKlSuX1bNnz/jxPdd98cUXVpEiRazUqVNbJUuWtL7//nun1u2wLB+edlJERER8isb4iIiIiM9Q8BERERGfoeAjIiIiPkPBR0RERHyGgo+IiIj4DAUfERER8RkKPiIiIuIzFHxExGMNGjSIcuXK2V1GPIfDwcKFC5P8ur1795I9e3YuXLjg/KL+IyIigqxZs8aveyQit1LwEfFxkydPJl26dFy7di1+38WLFwkICKBmzZoJnrtmzRocDgd//fWXm6t0L2cHrr59+9K1a1fSpUvntGPeTpYsWXjxxRcJDw936fuIpGQKPiI+rlatWly8eJFff/01ft+6devInj07P//8M1euXInfv3r1avLkyUPBggXtKDVFOnLkCN999x3t2rVzy/u99NJLfPbZZ0RGRrrl/URSGgUfER9X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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ce_3d = np.abs(sim_data[\"mode\"].amps.sel(direction=\"-\")) ** 2\n",
    "\n",
    "plt.plot(ldas, 10 * np.log10(ce_3d), c=\"red\")\n",
    "plt.ylim(-12, 0)\n",
    "plt.xlabel(\"Wavelength (μm)\")\n",
    "plt.ylabel(\"Coupling efficiency (dB)\")\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Final Remarks\n",
    "\n",
    "In this notebook, we use the Gaussian beam as the source and use a mode monitor to measure the coupling efficiency. Due to reciprocity, one can use a mode source at the waveguide as excitation and then take the radiated field and do a mode overlap with a Gaussian profile to calculate the same value. In addition, in this setup, one can also perform near field to far field projection by using monitors like [FieldProjectionAngleMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.FieldProjectionAngleMonitor.html) to investigate he radiation angle of the grating if that's of interest.\n",
    "\n",
    "In the simulations we only focus on the coupling efficiency and hence only use a [ModeMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeMonitor.html) to measure the power of the fundamental mode in the waveguide. One can also add [FieldMonitors](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.FieldMonitor.html) in the simulations to help visualize the field distribution if needed. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "applications": [
   "Passive photonic integrated circuit components"
  ],
  "description": "This notebook demonstrates how to model a uniform grating coupler in Tidy3D FDTD.",
  "feature_image": "./img/grating_coupler_schematic.png",
  "features": [
   "Parameter sweep",
   "Mode analysis"
  ],
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "keywords": "silicon photonics, PIC, integrated photonics, grating coupler, 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": "Uniform Grating Coupler Modeling in Tidy3D | Flexcompute",
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "050aded282124bbbb634334fd5c37664": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_0b631e7f54a7478698da06012c67c9d9",
       "msg_id": "",
       "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: #008000; text-decoration-color: #008000; font-weight: bold\">↓</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">monitor_data.hdf5</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">43.4/43.4 MB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">21.4 MB/s</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m43.4/43.4 MB\u001b[0m • \u001b[31m21.4 MB/s\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "0b631e7f54a7478698da06012c67c9d9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "115fb4674bc94a06a341271d0255af95": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_85e9891128d9443aa0b5a7c0dad4f965",
       "msg_id": "",
       "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\">solver progress (field decay = 2.10e-05) <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "solver progress (field decay = 2.10e-05) \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "1647b8fce7d7493abf62abf26e962c16": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "1bbc132043d04c3192351648b894a536": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "1dc3e2d378ee4eeaa229eb6991881610": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_f1ca607db552450793dbee2f3386fad5",
       "msg_id": "",
       "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: #800000; text-decoration-color: #800000; font-weight: bold\">↑</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">simulation.hdf5.gz</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">2.2/2.2 kB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">?</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.hdf5.gz\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m2.2/2.2 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "2765bf4343d743ce8e7f0dc79472a9a7": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_31204e44b31c4d75b135fe4768952bf8",
       "msg_id": "",
       "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: #008000; text-decoration-color: #008000\">🚶 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Finishing 'grating_coupler'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🚶 \u001b[0m \u001b[1;32mFinishing 'grating_coupler'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "31204e44b31c4d75b135fe4768952bf8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "31e4e1aa43dc41ad88894a510ddeddab": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "32dd38e8470044e49d683e3d40634ab7": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_4392c708c5a347ac9b1c43170da5ec2d",
       "msg_id": "",
       "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: #800000; text-decoration-color: #800000; font-weight: bold\">↑</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">simulation.hdf5.gz</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">2.1/2.1 kB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">?</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.hdf5.gz\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m2.1/2.1 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "4392c708c5a347ac9b1c43170da5ec2d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "445d4e037feb444b831b575b32190786": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_a8f9dedf6b074a68af67ef7981b04f0c",
       "msg_id": "",
       "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: #008000; text-decoration-color: #008000\">🏃 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Finishing 'grating_coupler_beam'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'grating_coupler_beam'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "45489fce142843ce9ea1ab09769d6723": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_31e4e1aa43dc41ad88894a510ddeddab",
       "msg_id": "",
       "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\">Processing surface monitor 'radiated_near_fields'... <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "Processing surface monitor 'radiated_near_fields'... \u001b[38;2;114;156;31m━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "6511cc19eac7411793454c7d525a3b12": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "72b3ccf3a57b4f1b8d7e5cbed0cebd70": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_6511cc19eac7411793454c7d525a3b12",
       "msg_id": "",
       "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: #008000; text-decoration-color: #008000\">🚶 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Starting 'grating_coupler_beam'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🚶 \u001b[0m \u001b[1;32mStarting 'grating_coupler_beam'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "85e9891128d9443aa0b5a7c0dad4f965": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a8f9dedf6b074a68af67ef7981b04f0c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "afa800f8a5a04422ae73534b3597be39": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "cf1eda112ce74eb3b2373b5bf1f41c94": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_1647b8fce7d7493abf62abf26e962c16",
       "msg_id": "",
       "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: #008000; text-decoration-color: #008000; font-weight: bold\">↓</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">monitor_data.hdf5</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">24.7/24.7 MB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">12.3 MB/s</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m24.7/24.7 MB\u001b[0m • \u001b[31m12.3 MB/s\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "d8c85337c1544bf7acd8c3bf7aef3e44": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_1bbc132043d04c3192351648b894a536",
       "msg_id": "",
       "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\">solver progress (field decay = 2.76e-05) <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "solver progress (field decay = 2.76e-05) \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "f1ca607db552450793dbee2f3386fad5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "f999f617c08e4ec0b28df94ac9cb6af5": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_afa800f8a5a04422ae73534b3597be39",
       "msg_id": "",
       "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: #008000; text-decoration-color: #008000\">🚶 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Starting 'grating_coupler'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🚶 \u001b[0m \u001b[1;32mStarting 'grating_coupler'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
