{ "cells": [ { "cell_type": "markdown", "id": "fed083e4-9be1-480c-82e9-4bfd7dbccf1f", "metadata": {}, "source": [ "# Adjoint Plugin: 2 Checking Gradients\n", "\n", "In this notebook, we will show how to use the adjoint plugin for `DiffractionMonitor` outputs and also check the gradient values against gradients obtained using transfer matrix method (TMM) to validate their accuracy for a multilayer slab problem." ] }, { "cell_type": "code", "execution_count": 1, "id": "51963da1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
[11:22:11] WARNING  This version of Tidy3D was pip installed from the 'tidy3d-beta' repository on   __init__.py:103\n",
       "                    PyPI. Future releases will be uploaded to the 'tidy3d' repository. From now on,                \n",
       "                    please use 'pip install tidy3d' instead.                                                       \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:11]\u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m This version of Tidy3D was pip installed from the \u001b[32m'tidy3d-beta'\u001b[0m repository on \u001b]8;id=131947;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=506553;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py#103\u001b\\\u001b[2m103\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m PyPI. Future releases will be uploaded to the \u001b[32m'tidy3d'\u001b[0m repository. From now on, \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m please use \u001b[32m'pip install tidy3d'\u001b[0m instead. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Using client version: 1.9.0rc1                                                  __init__.py:121\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Using client version: \u001b[1;36m1.9\u001b[0m.0rc1 \u001b]8;id=512406;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=815300;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py#121\u001b\\\u001b[2m121\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import jax.numpy as jnp\n", "import jax\n", "import tmm\n", "import matplotlib.pyplot as plt\n", "from typing import Tuple, List\n", "\n", "import tidy3d as td\n", "from tidy3d.web import run as run_sim\n", "from tidy3d.plugins.adjoint import JaxSimulation, JaxBox, JaxMedium, JaxStructure, JaxSimulationData\n", "from tidy3d.plugins.adjoint.web import run as run_adjoint" ] }, { "cell_type": "markdown", "id": "b33d0892-62d3-4329-810f-f29ce10056b4", "metadata": {}, "source": [ "First, we define some global parameters describing the transmission through a multilayer slab with some spacing between each slab.\n", "\n", "The layout is diagrammed below.\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "ccbd2c6a-419d-4570-8f91-f57ad5bad813", "metadata": {}, "outputs": [], "source": [ "# frequency we want to simulate at\n", "freq0 = 2.0e14\n", "k0 = 2 * np.pi * freq0 / td.C_0\n", "freqs = [freq0]\n", "wavelength = td.C_0 / freq0\n", "\n", "# background permittivity\n", "bck_eps = 1.3**2\n", "\n", "# space between each slab\n", "spc = 0.0\n", "\n", "# slab permittivities and thicknesses\n", "slab_eps0 = [2.**2, 1.8**2, 1.5**2, 1.9**2]\n", "slab_ds0 = [0.5, 0.25, 0.5, 0.5]\n", "\n", "# incidence angle\n", "theta = 0 * np.pi/8\n", "\n", "# resolution\n", "dl = 0.01" ] }, { "cell_type": "markdown", "id": "48dd37b0-ba97-45cd-a861-53ea6ae3fa74", "metadata": {}, "source": [ "## Transfer Matrix Method (Ground Truth)\n", "\n", "Next we use the `tmm` package to write a function to return the transmission `T` of `p` polarized light given a set of slab permittivities and thicknesses. We'll also write a function to compute the numerical gradient using TMM and will take these to be our \"ground truths\" when evaluating the accuracy of our values obtained through FDTD and the adjoint plugin.\n", "\n", "### Transmission Calculation with TMM\n", "\n", "First, we write a function to compute transmission." ] }, { "cell_type": "code", "execution_count": 3, "id": "cc4f6e91-6a53-476e-b4c6-e76e50246426", "metadata": {}, "outputs": [], "source": [ "def compute_T_tmm(slab_eps=slab_eps0, slab_ds=slab_ds0) -> float:\n", " \"\"\"Get transmission as a function of slab permittivities and thicknesses.\"\"\"\n", "\n", " # construct lists of permittivities and thicknesses including spaces between\n", " new_slab_eps = []\n", " new_slab_ds = []\n", " for eps, d in zip(slab_eps, slab_ds):\n", " new_slab_eps.append(eps)\n", " new_slab_eps.append(bck_eps)\n", " new_slab_ds.append(d)\n", " new_slab_ds.append(spc)\n", " slab_eps = new_slab_eps[:-1]\n", " slab_ds = new_slab_ds[:-1]\n", "\n", " # add the input and output spaces to the lists\n", " eps_list = [bck_eps] + slab_eps + [bck_eps]\n", " n_list = np.sqrt(eps_list) \n", " d_list = [np.inf] + slab_ds + [np.inf]\n", " \n", " # compute transmission with TMM\n", " return tmm.coh_tmm(\"p\", n_list, d_list, theta, wavelength)[\"T\"]" ] }, { "cell_type": "markdown", "id": "c6c0da6b-2d2f-4be5-80e6-c84afd8d1a23", "metadata": {}, "source": [ "We run this function with our starting parameters and see that we get a transmission of about 98% for the set of input parameters." ] }, { "cell_type": "code", "execution_count": 4, "id": "c1743e54-d7f3-468a-8ac4-d42d4c2bc8dc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "T (tmm) = 0.901\n" ] } ], "source": [ "T_tmm = compute_T_tmm(slab_eps=slab_eps0, slab_ds=slab_ds0)\n", "print(f\"T (tmm) = {T_tmm:.3f}\")" ] }, { "cell_type": "markdown", "id": "452db467-f486-468d-8ec9-b9e669755c92", "metadata": {}, "source": [ "### Numerical Gradient with TMM\n", "\n", "Next, we will use our `compute_T_tmm()` function to compute the \"numerical\" gradient to use as comparison against our adjoint results with FDTD.\n", "\n", "The derivative of a function $f(x)$ w.r.t. $x$ can be approximated using finite differences as\n", "\n", "$$ \\frac{df}{dx}(x) \\approx \\frac{f(x+\\Delta) - f(x-\\Delta)}{2\\Delta}$$\n", "\n", "with a small step $\\Delta$.\n", "\n", "To compute the gradient of our transmission with respect to each of the slab thicknesses and permittivities, we need to repeat this step for each of the values. Luckily, since TMM is very fast, we can compute these quantities quite quickly compared to if we were using FDTD.\n", "\n", "> Important note: We assume in our TMM numerical gradient that when the slabs are touching (`spc=0`) and a slab thickness is modified, that the thicknesses of the neighboring slabs adjust to accomidate this change. For example, if slab `i` increases by `dt`, slab `i-1` and `i+1` each decrease by `dt/2`. We also account for this in our FDTD set up by keeping the centers of all boxes constant and not tracking the gradient through these quantities. The reason this is required is that `tidy3d.plugins.adjoint` does not recognize the space between touching `JaxBox` objects as a single interface and will instead \"double count\" the gradient contribution of the interface if they are placed right next to each other. One must therefore be careful about overlapping or touching two `JaxBox` or other geometries when computing gradients.\n", "\n", "Here we write the function to return the numerical gradient." ] }, { "cell_type": "code", "execution_count": 5, "id": "15d5bae1-6fc7-41c8-8772-2e80505be17d", "metadata": {}, "outputs": [], "source": [ "def compute_grad_tmm(slab_eps=slab_eps0, slab_ds=slab_ds0) -> Tuple[List[float], List[float]]:\n", " \"\"\"Compute numerical gradient of transmission w.r.t. each of the slab permittivities and thicknesses using TMM.\"\"\"\n", "\n", " delta = 1e-4\n", "\n", " # set up containers to store gradient and perturbed arguments\n", " num_slabs = len(slab_eps)\n", " grad_tmm = np.zeros((2, num_slabs), dtype=float)\n", " args = np.stack((slab_eps, slab_ds), axis=0)\n", "\n", " # loop through slab index and argument index (eps, d)\n", " for arg_index in range(2):\n", " for slab_index in range(num_slabs):\n", " grad = 0.0\n", " \n", " # perturb the argument by delta in each + and - direction\n", " for pm in (-1, +1):\n", " args_num = args.copy()\n", " args_num[arg_index][slab_index] += delta * pm\n", "\n", " # NEW: for slab thickness gradient, need to modify neighboring slabs too\n", " if arg_index == 1 and spc == 0:\n", " if slab_index > 0:\n", " args_num[arg_index][slab_index - 1] -= delta * pm / 2\n", " if slab_index < num_slabs - 1:\n", " args_num[arg_index][slab_index + 1] -= delta * pm / 2\n", " \n", " # compute argument perturbed T and add to finite difference gradient contribution\n", " T_tmm = compute_T_tmm(slab_eps=args_num[0], slab_ds=args_num[1])\n", " grad += pm * T_tmm / 2 / delta \n", "\n", " grad_tmm[arg_index][slab_index] = grad\n", " grad_eps, grad_ds = grad_tmm\n", " return grad_eps, grad_ds" ] }, { "cell_type": "markdown", "id": "d3c362ca-fb31-4ead-8e7c-fcc24d0faecc", "metadata": {}, "source": [ "Let's run this function and observe the gradients. These will be saved later to compare against our adjoint plugin results." ] }, { "cell_type": "code", "execution_count": 6, "id": "b5d1cc93-6d6e-43a7-8e5f-f1829770f3d5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gradient w.r.t. eps (tmm) = [-0.15463022 0.0376046 -0.0850184 -0.15883104]\n", "gradient w.r.t. ds (tmm) = [-0.86661161 -0.12292531 0.58010922 -1.05537496]\n" ] } ], "source": [ "grad_eps_tmm, grad_ds_tmm = compute_grad_tmm()\n", "print(f\"gradient w.r.t. eps (tmm) = {grad_eps_tmm}\")\n", "print(f\"gradient w.r.t. ds (tmm) = {grad_ds_tmm}\")" ] }, { "cell_type": "markdown", "id": "50ca68ae-ca5a-49aa-9969-ac6d43324ea9", "metadata": {}, "source": [ "## FDTD (Using adjoint plugin)\n", "\n", "Next, we will implement the same two functions using Tidy3D's adjoint plugin.\n", "\n", "### Transmission Calculation with FDTD\n", "\n", "We first write a function to compute the transmission of a multilayer slab using Tidy3D.\n", "\n", "As discussed in the previous adjoint tutorial notebook, we need to use `jax`-compatible components from the tidy3d subclass for any structures that may depend on the parameters. In this case, this means that the slabs must be `JaxStructures` containing `JaxBox` and `JaxMedium` and must be added to `JaxSimulation.input_structures`.\n", "\n", "We use a `DiffractionMonitor` to measure our transmission amplitudes. As the data corresponding to this monitor will be used in the differentiable function return value, we must add it to `JaxSimulation.output_monitors`.\n", "\n", "Below, we break up the transmission calculation into a few functions to make it easier to read and re-use later." ] }, { "cell_type": "code", "execution_count": 7, "id": "4d12f133-a8d8-4e59-938f-fca4d2e2fa0b", "metadata": {}, "outputs": [], "source": [ "def make_sim(slab_eps=slab_eps0, slab_ds=slab_ds0) -> JaxSimulation:\n", " \"\"\"Create a JaxSimulation given the slab permittivities and thicknesses.\"\"\"\n", "\n", " # frequency setup\n", " wavelength = td.C_0 / freq0\n", " fwidth = freq0 / 10.0\n", " freqs = [freq0]\n", "\n", " # geometry setup\n", " bck_medium = td.Medium(permittivity=bck_eps)\n", "\n", " space_above = 2\n", " space_below = 2\n", "\n", " length_x = 0.1\n", " length_y = 0.1\n", " length_z = space_below + sum(slab_ds0) + space_above + (len(slab_ds0) - 1) * spc\n", " sim_size = (length_x, length_y, length_z)\n", "\n", " # make structures\n", " slabs = []\n", " z_start = -length_z/2 + space_below\n", " for (d, eps) in zip(slab_ds, slab_eps):\n", "\n", " # dont track the gradient through the center of each slab\n", " # as tidy3d doesn't have enough information to properly process the interface between touching JaxBox objects\n", " z_center = jax.lax.stop_gradient(z_start + d / 2) \n", " slab = JaxStructure(\n", " geometry=JaxBox(center=[0, 0, z_center], size=[td.inf, td.inf, d]),\n", " medium=JaxMedium(permittivity=eps),\n", " )\n", " slabs.append(slab)\n", " z_start += d + spc\n", "\n", " # source setup\n", " gaussian = td.GaussianPulse(freq0=freq0, fwidth=fwidth)\n", " src_z = -length_z/2 + space_below/2.0\n", "\n", " source = td.PlaneWave(\n", " center=(0, 0, src_z),\n", " size=(td.inf, td.inf, 0),\n", " source_time=gaussian,\n", " direction=\"+\",\n", " angle_theta=theta,\n", " angle_phi=0,\n", " pol_angle=0,\n", " )\n", "\n", " # boundaries\n", " boundary_x = td.Boundary.bloch_from_source(\n", " source=source, domain_size=sim_size[0], axis=0, medium=bck_medium\n", " )\n", " boundary_y = td.Boundary.bloch_from_source(\n", " source=source, domain_size=sim_size[1], axis=1, medium=bck_medium\n", " ) \n", " boundary_spec = td.BoundarySpec(x=boundary_x, y=boundary_y, z=td.Boundary.pml(num_layers=40))\n", "\n", " # monitors\n", " mnt_z = length_z/2 - space_above/2.0\n", " monitor_1 = td.DiffractionMonitor(\n", " center=[0.0, 0.0, mnt_z],\n", " size=[td.inf, td.inf, 0],\n", " freqs=freqs,\n", " name=\"diffraction\",\n", " normal_dir=\"+\",\n", " )\n", "\n", " # make simulation\n", " return JaxSimulation(\n", " size=sim_size,\n", " grid_spec=td.GridSpec.auto(min_steps_per_wvl=100),\n", " input_structures=slabs,\n", " sources=[source],\n", " output_monitors=[monitor_1],\n", " run_time= 10 / fwidth,\n", " boundary_spec=boundary_spec,\n", " medium=bck_medium,\n", " subpixel=True,\n", " shutoff=1e-8,\n", " )" ] }, { "cell_type": "markdown", "id": "9addea1f-4dd8-4e5e-a058-b94638fb2d70", "metadata": {}, "source": [ "Let's generate a simulation and plot it to make sure it looks reasonable." ] }, { "cell_type": "code", "execution_count": 8, "id": "bc0dc456-e742-4299-ae5e-22daa49e3997", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=555675;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=242971;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=533883;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=778167;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=794982;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=426881;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Auto meshing using wavelength 1.4990 defined from sources.                     grid_spec.py:510\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Auto meshing using wavelength \u001b[1;36m1.4990\u001b[0m defined from sources. \u001b]8;id=611705;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/grid/grid_spec.py\u001b\\\u001b[2mgrid_spec.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=714841;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/grid/grid_spec.py#510\u001b\\\u001b[2m510\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAANcAAANXCAYAAACmJcrwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAArwUlEQVR4nO3deXTTdb7/8VfSNukelhbKUrYqFFkUERBcEGRYZBTuqFfnqoh6UQH1quhADwrKXGRm3HDFZVTuRZmL6AhzdRQBAR0QRQbvRRQZUIZNdmhLLS00n98f/ppL6O703ST4fJyTI/nm800+TX32u6RJPc45JwD1zhvpCQCnKuICjBAXYIS4ACPEBRghLsAIcQFGiAswQlyAEeKKkOXLl8vj8Wj58uWRngqMEJexZ599VrNnz470NH6UuXPnaubMmZGeRpiXXnpJnTt3VmJiok4//XQ99dRTtV63pKREEydOVMuWLZWUlKQ+ffpo8eLFlY5dtWqVzj//fCUnJysrK0t33HGHjhw5UrfJOpjq0qWL69+/f4XlZWVlrri42JWVlTX8pGpp+PDhrm3btpGeRshzzz3nJLnLL7/cvfDCC+66665zktxvfvObWq1/9dVXu/j4eHfPPfe4559/3vXt29fFx8e7jz76KGzcunXrXGJiouvRo4ebNWuWmzx5svP7/W7o0KF1mm+DxHXkyJGGeJioVFVcsSCa4vr+++9d06ZN3fDhw8OWX3PNNS4lJcUdPHiw2vU/+eQTJ8k9/PDDoWXFxcUuJyfH9e3bN2zssGHDXIsWLVx+fn5o2YsvvugkuUWLFtV6znWOa8eOHe7GG290LVq0cD6fz7Vr187deuutrqSkxDnn3CuvvOIkueXLl7uxY8e6zMxM16hRo9D6zzzzjDvjjDOcz+dzLVq0cOPGjXOHDh0Ke4xNmza5X/ziF6558+bO7/e7Vq1auauuusodPnw4NOb999935513ngsEAi4lJcV17NjR5eXl1Tj/2qx39OhRN2XKFJeTk+N8Pp9r3bq1u/fee93Ro0cr3N+cOXNcr169XFJSkmvUqJG74IILQt+Atm3bOklhl/LQli1b5iS5ZcuWhd3f66+/7s4++2yXmJjomjZt6q655hq3Y8eOsDHXX3+9S0lJcTt27HAjRoxwKSkpLiMjw02YMMEdP368xudgwYIF7pJLLgl9Dzt06OCmTZsWtm7//v0rzL260C688ELXvXv3Sm/r2LGjGzx4cI3zqs4777zjJLl33nknbPmqVaucJDdnzpxq17/33ntdXFxcWDDOOffQQw85SW7btm3OOefy8/NdfHy8u/fee8PGlZSUuNTUVHfTTTfVes7xddmF3LVrl3r37q3Dhw/r5ptvVm5urnbu3Kk33nhD33//vXw+X2jsuHHjlJmZqSlTpqioqEiS9MADD+jBBx/UoEGDNHbsWH399deaNWuW1qxZo5UrVyohIUGlpaUaMmSISkpKdPvttysrK0s7d+7U22+/rcOHDysQCGjDhg36+c9/ru7du2vatGny+/3avHmzVq5cWe38a7NeMBjUZZddpr/85S+6+eab1blzZ61fv16PP/64Nm3apAULFoTGPvjgg3rggQfUr18/TZs2TT6fT5988ok++OADDR48WDNnztTtt9+u1NRUTZ48WZLUvHnzKuc3e/Zs3XDDDerVq5dmzJihPXv26IknntDKlSu1bt06NWrUKDS2rKxMQ4YMUZ8+ffTII49oyZIlevTRR5WTk6OxY8dW+zzMnj1bqampuvvuu5WamqoPPvhAU6ZMUUFBgR5++GFJ0uTJk5Wfn68dO3bo8ccflySlpqZWeZ/XXXedxowZoy+++EJdu3YNLV+zZo02bdqk++67L7Ts0KFDKisrq3aOkpScnKzk5GRJ0rp16yRJ55xzTtiYnj17yuv1at26dbr22murvK9169apY8eOSk9PD1veu3dvSdLnn3+u7OxsrV+/XsePH6/wOD6fT2eddVZoHrVS6wydc6NGjXJer9etWbOmwm3BYNA5939brvPPPz/sJ+HevXudz+dzgwcPDjvOePrpp50k9/LLLzvnftjfleTmz59f5Twef/xxJ8nt27evLtOv1Xpz5sxxXq+3wn54+f7+ypUrnXPO/e1vf3Ner9f90z/9U4XjpvLnwrmqdwtP3nKVlpa6Zs2aua5du7ri4uLQuLfffttJclOmTAktu/76650kN23atLD77NGjh+vZs2f1T4L7YRfrZLfccotLTk4O2zrXZbfw8OHDLjEx0U2cODFs+R133OFSUlLCDg0q26JXdpk6dWponfHjx7u4uLhKHzszM9NdffXV1c6vS5cubuDAgRWWb9iwwUlyzz33nHPOufnz5ztJ7sMPP6ww9sorr3RZWVnVPs6Jan22MBgMasGCBbr00ksrVC1JHo8n7PqYMWMUFxcXur5kyRKVlpbqzjvvlNfrDRuXnp6ud955R5IUCAQkSYsWLdL3339f6VzKf4IvXLhQwWCwtl9CrdabP3++OnfurNzcXO3fvz90GThwoCRp2bJlkqQFCxYoGAxqypQpYV+PVPG5qI3PPvtMe/fu1bhx45SYmBhaPnz4cOXm5oaenxPdeuutYdcvuOACffPNNzU+VlJSUujfhYWF2r9/vy644AJ9//332rhxY53nLv3wfRsxYoT+8Ic/yP3/99+WlZVp3rx5GjlypFJSUkJjX3vtNS1evLjGy6hRo0LrFBcXh+0ZnSgxMVHFxcXVzq+4uFh+v7/SdctvP/G/VY2t6XFOVOvdwn379qmgoCBsk1+d9u3bh13/+9//Lknq1KlT2HKfz6cOHTqEbm/fvr3uvvtuPfbYY3rttdd0wQUX6LLLLtO1114bCu+qq67S73//e/3rv/6rJk2apIsvvli/+MUvdMUVV1T4H/1EtVnvb3/7m7766itlZmZWeh979+6VJG3ZskVer1dnnHFGrZ6PmlT1/EhSbm6u/vKXv4QtS0xMrDDHxo0b69ChQzU+1oYNG3Tffffpgw8+UEFBQdht+fn5dZ16yKhRozRv3jx99NFHuvDCC7VkyRLt2bNH1113Xdi48847r873nZSUpNLS0kpvO3r0aNgPjKrWLykpqXTd8ttP/G9VY2t6nBPV6ZirLuoyiZM9+uijGj16tBYuXKj3339fd9xxh2bMmKHVq1erdevWSkpK0ocffqhly5bpnXfe0Xvvvad58+Zp4MCBev/998O2mCfPqab1gsGgunXrpscee6zS+8jOzv7RX1d9quprrMnhw4fVv39/paena9q0acrJyVFiYqL++te/auLEiXXaEzjZkCFD1Lx5c7366qu68MIL9eqrryorK0uDBg0KG7dv375aHXOlpqaGjvNatGihsrIy7d27V82aNQuNKS0t1YEDB9SyZctq76tFixbauXNnheXfffedJIXWb9GiRdjyk8fW9Dhharv/WFZW5tLT092IESOqHVd+zHXycdncuXOdJPfnP/85bHlJSYkLBALu8ssvr/I+V65c6SS5yZMnVzlm+vTpTpJbvHhxzV9MNetdcsklrlWrVmHHTZV5+OGHnSS3bt26asd17dq1Vsdc5We9nn322QpjO3fuHHYsVX628GRTp051NX1L33rrLSfJrVixImz5Cy+8UOHs5c9//vM6n4q/6667XOPGjd3Bgwddamqqu+uuuyqM+THHXOXHniefLSz/f+M///M/q53XPffcU+nZwvLvf/nZwsOHD1d7tvDGG2+s9XNR62Mur9erkSNH6r//+7/12WefVRZptesPGjRIPp9PTz75ZNjYl156Sfn5+Ro+fLgkqaCgQMePHw9bt1u3bvJ6vaFN9cGDByvc/1lnnSWp8s15udqs98///M/auXOnXnzxxQpji4uLQ2c+R44cKa/Xq2nTplX4aX/i15eSkqLDhw9XOady55xzjpo1a6bnnnsu7Gt499139dVXX4Wen39U+RbvxDmWlpbq2WefrTA2JSWlzruJ1113nQ4dOqRbbrlFR44cqfQM3o855ho4cKCaNGmiWbNmhd3XrFmzlJycHPb87N+/Xxs3bgw7Zr/iiitUVlamF154IbSspKREr7zyivr06RPaIwkEAho0aJBeffVVFRYWhsbOmTNHR44c0ZVXXln7J6PWGbofXuPKyspyycnJ7s4773TPP/+8e+CBB1yXLl1Cr1VVteVy7v9+sg4ePNg9/fTT7vbbb3dxcXGuV69errS01Dn3w0/WVq1auTvvvNM9++yz7sknn3S9evVyCQkJ7uOPP3bOOfdv//ZvrkePHu6+++5zL774ops+fbpr1aqVa926ddhrYSerzXplZWXukksucR6Px1199dXuqaeecjNnznS33nqra9KkSdjXdf/99ztJrl+/fu6RRx5xTz31lBs1apSbNGlSaMy4ceOcx+Nxv/71r90f/vAHt3TpUudc5a9zlT93ffr0cTNnznR5eXkuOTnZtWvXLuy1wH9ky7V//37XuHFj17ZtW/foo4+6xx57zPXo0cOdeeaZFebzu9/9zklyd911l5s7d67705/+VO19l+vatauT5Dp37lyr8bX1zDPPOEnuiiuucC+++KIbNWqUk+SmT58eNq78eTj5NcQrr7wytFV6/vnnXb9+/Vx8fHyFrfjatWud3+8P+w2NxMTEOr9WV+cXkf/+97+7UaNGuczMTOf3+12HDh3c+PHjK7yIXFlczv1w6j03N9clJCS45s2bu7Fjx4b9j/PNN9+4G2+80eXk5LjExETXpEkTN2DAALdkyZLQmKVLl7oRI0a4li1bOp/P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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sim = make_sim()\n", "f, ax = plt.subplots(1, 1, figsize=(10, 10))\n", "sim.plot(y=0, ax=ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "e4c9a742-5988-444d-9ac4-34b612d42289", "metadata": {}, "source": [ "Now we write a function to post process some run results to get the transmission we are after." ] }, { "cell_type": "code", "execution_count": 9, "id": "1917a8b6-8ba9-4767-90ca-06cd6daadcd3", "metadata": {}, "outputs": [], "source": [ "def post_process_T(sim_data: JaxSimulationData) -> float:\n", " \"\"\"Given some JaxSimulationData from the run, return the transmission of \"p\" polarized light.\"\"\"\n", " amps = sim_data.output_monitor_data[\"diffraction\"].amps.sel(polarization=\"p\")\n", " return jnp.sum(abs(amps.values)**2)" ] }, { "cell_type": "markdown", "id": "b65e4d49-e8b1-4e05-9fce-57bd63b3f2cf", "metadata": {}, "source": [ "And finally, put everything together in a single function that relates the permittivities and thicknesses of each slab to the transmission, through a `JaxSimulation` run using the adjoint plugin." ] }, { "cell_type": "code", "execution_count": 10, "id": "f64ac290-b67d-4a9a-88e8-504de931fef8", "metadata": {}, "outputs": [], "source": [ "def compute_T_fdtd(slab_eps=slab_eps0, slab_ds=slab_ds0) -> float:\n", " \"\"\"Given the slab permittivities and thicknesses, compute T, making sure to use `tidy3d.plugins.adjoint.web.run_adjoint`.\"\"\"\n", " sim = make_sim(slab_eps=slab_eps, slab_ds=slab_ds)\n", " sim_data = run_adjoint(sim, task_name='slab')\n", " return post_process_T(sim_data)" ] }, { "cell_type": "markdown", "id": "c4c19d59-d9a3-4935-b785-5fb6b3b3a819", "metadata": {}, "source": [ "### Computing T and Gradient with FDTD\n", "\n", "Now that we have this function defined, we are ready to compute our transmission and gradients using Tidy3d.\n", "\n", "We first call `jax.value_and_grad()` on our transmission calculation function, which returns a function that will give us both `T` and the gradient of `T` with respect to the input parameters in one shot. For more details, see the previous tutorial." ] }, { "cell_type": "code", "execution_count": 11, "id": "59647cdf-8c2a-40d6-bbc9-b7537616938a", "metadata": {}, "outputs": [], "source": [ "compute_T_and_grad_fdtd = jax.value_and_grad(compute_T_fdtd, argnums=(0, 1))" ] }, { "cell_type": "markdown", "id": "81caed90-8554-441b-8948-b240e181e98c", "metadata": {}, "source": [ "Next, we call this function on our starting parameters, which will kick off the original (`fwd`) T transmission simulation and then the reverse (`adj`) simulation, which is used in combination with `fwd` for the gradient calculation." ] }, { "cell_type": "code", "execution_count": 12, "id": "ef6716b3-79a3-40cc-ac2a-5056b5ed2ae9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
           INFO     Remote TPU is not linked into jax; skipping remote TPU.                       xla_bridge.py:160\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Remote TPU is not linked into jax; skipping remote TPU. \u001b]8;id=147120;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py\u001b\\\u001b[2mxla_bridge.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=394611;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py#160\u001b\\\u001b[2m160\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Unable to initialize backend 'tpu_driver': Could not initialize backend       xla_bridge.py:333\n",
       "                    'tpu_driver'                                                                                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Unable to initialize backend \u001b[32m'tpu_driver'\u001b[0m: Could not initialize backend \u001b]8;id=536666;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py\u001b\\\u001b[2mxla_bridge.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=801510;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py#333\u001b\\\u001b[2m333\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m \u001b[32m'tpu_driver'\u001b[0m \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Unable to initialize backend 'cuda': module 'jaxlib.xla_extension' has no     xla_bridge.py:333\n",
       "                    attribute 'GpuAllocatorConfig'                                                                 \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Unable to initialize backend \u001b[32m'cuda'\u001b[0m: module \u001b[32m'jaxlib.xla_extension'\u001b[0m has no \u001b]8;id=892887;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py\u001b\\\u001b[2mxla_bridge.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=545833;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py#333\u001b\\\u001b[2m333\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m attribute \u001b[32m'GpuAllocatorConfig'\u001b[0m \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Unable to initialize backend 'rocm': module 'jaxlib.xla_extension' has no     xla_bridge.py:333\n",
       "                    attribute 'GpuAllocatorConfig'                                                                 \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Unable to initialize backend \u001b[32m'rocm'\u001b[0m: module \u001b[32m'jaxlib.xla_extension'\u001b[0m has no \u001b]8;id=386591;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py\u001b\\\u001b[2mxla_bridge.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=577322;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py#333\u001b\\\u001b[2m333\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m attribute \u001b[32m'GpuAllocatorConfig'\u001b[0m \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Unable to initialize backend 'tpu': module 'jaxlib.xla_extension' has no      xla_bridge.py:333\n",
       "                    attribute 'get_tpu_client'                                                                     \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Unable to initialize backend \u001b[32m'tpu'\u001b[0m: module \u001b[32m'jaxlib.xla_extension'\u001b[0m has no \u001b]8;id=529943;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py\u001b\\\u001b[2mxla_bridge.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=595311;file:///Users/twhughes/.pyenv/versions/3.10.9/lib/python3.10/site-packages/jax/_src/lib/xla_bridge.py#333\u001b\\\u001b[2m333\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m attribute \u001b[32m'get_tpu_client'\u001b[0m \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=642266;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=188196;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=893611;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=153325;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=532469;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=688856;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=522016;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=331402;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=991697;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=835096;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=527655;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=348078;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=732109;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=120591;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=157276;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=386035;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=872658;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=119787;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=406279;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=765179;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=890222;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=730292;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=249522;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=243872;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Auto meshing using wavelength 1.4990 defined from sources.                     grid_spec.py:510\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Auto meshing using wavelength \u001b[1;36m1.4990\u001b[0m defined from sources. \u001b]8;id=301480;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/grid/grid_spec.py\u001b\\\u001b[2mgrid_spec.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=181793;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/grid/grid_spec.py#510\u001b\\\u001b[2m510\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:12] INFO     Created task 'slab_fwd' with task_id '0c0b4861-d0c2-4717-93cc-a841603c730d'.      webapi.py:120\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:12]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Created task \u001b[32m'slab_fwd'\u001b[0m with task_id \u001b[32m'0c0b4861-d0c2-4717-93cc-a841603c730d'\u001b[0m. \u001b]8;id=419074;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=602189;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#120\u001b\\\u001b[2m120\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8c2b76e9c5854f7cbd3a36f596d35081",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:15] INFO     Maximum FlexUnit cost: 0.025                                                      webapi.py:253\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:15]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Maximum FlexUnit cost: \u001b[1;36m0.025\u001b[0m \u001b]8;id=769872;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=391835;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#253\u001b\\\u001b[2m253\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     status = queued                                                                   webapi.py:262\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = queued \u001b]8;id=628687;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=671984;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#262\u001b\\\u001b[2m262\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[11:22:18] INFO     status = preprocess                                                               webapi.py:274\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:18]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = preprocess \u001b]8;id=395272;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=653774;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#274\u001b\\\u001b[2m274\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:21] INFO     starting up solver                                                                webapi.py:278\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:21]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m starting up solver \u001b]8;id=815221;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=781866;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#278\u001b\\\u001b[2m278\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:31] INFO     running solver                                                                    webapi.py:284\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:31]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m running solver \u001b]8;id=57714;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=577777;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#284\u001b\\\u001b[2m284\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "74d4ef4c4287473a9ae94c9a0fbcf606",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[11:22:34] INFO     early shutoff detected, exiting.                                                  webapi.py:295\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:34]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m early shutoff detected, exiting. \u001b]8;id=28526;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=774913;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#295\u001b\\\u001b[2m295\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     status = postprocess                                                              webapi.py:301\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = postprocess \u001b]8;id=908197;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=581664;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#301\u001b\\\u001b[2m301\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[11:22:36] INFO     status = success                                                                  webapi.py:307\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:36]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = success \u001b]8;id=33265;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=789616;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#307\u001b\\\u001b[2m307\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Billed FlexUnit cost: 0.025                                                       webapi.py:311\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Billed FlexUnit cost: \u001b[1;36m0.025\u001b[0m \u001b]8;id=328335;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=46182;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#311\u001b\\\u001b[2m311\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     downloading file \"output/monitor_data.hdf5\" to \"simulation_data.hdf5\"             webapi.py:593\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m downloading file \u001b[32m\"output/monitor_data.hdf5\"\u001b[0m to \u001b[32m\"simulation_data.hdf5\"\u001b[0m \u001b]8;id=883438;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=809330;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#593\u001b\\\u001b[2m593\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "790825e1bda84f3baddb7d24b201743e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:39] INFO     loading SimulationData from simulation_data.hdf5                                  webapi.py:415\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:39]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m loading SimulationData from simulation_data.hdf5 \u001b]8;id=475833;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=763910;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#415\u001b\\\u001b[2m415\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=790561;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=66900;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=118626;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=21271;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=310798;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=701108;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=809439;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=670649;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=605932;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=423904;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=185955;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=268463;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=792043;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=98659;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=32976;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=806319;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=891750;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=426777;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=300029;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=21607;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=18886;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=655055;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=947741;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=54468;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=322684;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=26622;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=339161;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=438638;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=216849;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=602360;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=780981;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=194022;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=207002;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=605378;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=49746;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=903114;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=54628;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=142958;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=885745;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=621317;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=148466;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=186982;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=356621;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=757198;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=915942;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=1118;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=775149;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=749227;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Auto meshing using wavelength 1.4990 defined from sources.                     grid_spec.py:510\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Auto meshing using wavelength \u001b[1;36m1.4990\u001b[0m defined from sources. \u001b]8;id=359146;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/grid/grid_spec.py\u001b\\\u001b[2mgrid_spec.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=752118;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/grid/grid_spec.py#510\u001b\\\u001b[2m510\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     Created task 'slab_adj' with task_id 'a3846f9b-6cb3-49f2-8869-c0df8893aeab'.      webapi.py:120\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Created task \u001b[32m'slab_adj'\u001b[0m with task_id \u001b[32m'a3846f9b-6cb3-49f2-8869-c0df8893aeab'\u001b[0m. \u001b]8;id=546258;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=647303;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#120\u001b\\\u001b[2m120\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "527edb9272304e6795ec21b7121a5767",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:42] INFO     Maximum FlexUnit cost: 0.025                                                      webapi.py:253\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:42]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Maximum FlexUnit cost: \u001b[1;36m0.025\u001b[0m \u001b]8;id=374990;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=808505;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#253\u001b\\\u001b[2m253\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     status = queued                                                                   webapi.py:262\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = queued \u001b]8;id=189155;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=747101;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#262\u001b\\\u001b[2m262\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a7ca99f4db884e7690ed9a0b589dfad4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[11:22:44] INFO     status = preprocess                                                               webapi.py:274\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:44]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = preprocess \u001b]8;id=729841;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=208337;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#274\u001b\\\u001b[2m274\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:48] INFO     starting up solver                                                                webapi.py:278\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:48]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m starting up solver \u001b]8;id=268159;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=310436;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#278\u001b\\\u001b[2m278\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:22:55] INFO     running solver                                                                    webapi.py:284\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:55]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m running solver \u001b]8;id=315813;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=555184;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#284\u001b\\\u001b[2m284\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "651760fb7ceb42b896c80a3a7d4f32dd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[11:22:57] INFO     early shutoff detected, exiting.                                                  webapi.py:295\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:22:57]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m early shutoff detected, exiting. \u001b]8;id=31870;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=712040;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#295\u001b\\\u001b[2m295\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     status = postprocess                                                              webapi.py:301\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = postprocess \u001b]8;id=412374;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=690281;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#301\u001b\\\u001b[2m301\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bece5bc1081242da880711bd048bc049",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
[11:23:00] INFO     status = success                                                                  webapi.py:307\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:23:00]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m status = success \u001b]8;id=824697;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=329329;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#307\u001b\\\u001b[2m307\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:23:01] INFO     Billed FlexUnit cost: 0.025                                                       webapi.py:311\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:23:01]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Billed FlexUnit cost: \u001b[1;36m0.025\u001b[0m \u001b]8;id=369915;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=633858;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#311\u001b\\\u001b[2m311\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           INFO     downloading file \"output/monitor_data.hdf5\" to \"simulation_data.hdf5\"             webapi.py:593\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m downloading file \u001b[32m\"output/monitor_data.hdf5\"\u001b[0m to \u001b[32m\"simulation_data.hdf5\"\u001b[0m \u001b]8;id=141105;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=484378;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#593\u001b\\\u001b[2m593\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "850302040bf34f008adfa99b8907d033",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[11:23:03] INFO     loading SimulationData from simulation_data.hdf5                                  webapi.py:415\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:23:03]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m loading SimulationData from simulation_data.hdf5 \u001b]8;id=513766;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=292416;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#415\u001b\\\u001b[2m415\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=386720;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=759567;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=349180;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=892543;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=137411;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=324159;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=717443;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=788090;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=103510;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=803322;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=87290;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=472966;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 1 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m1\u001b[0m are overlapping or \u001b]8;id=940936;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=841757;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=609290;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=58883;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 2 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m2\u001b[0m are overlapping or \u001b]8;id=654750;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=428243;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 0 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m0\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=67662;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=941052;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 1 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m1\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=483515;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=730881;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  'JaxSimulation.input_structures' elements 2 and 3 are overlapping or          simulation.py:132\n",
       "                    touching. Geometric gradients for overlapping structures may contain errors.                   \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'JaxSimulation.input_structures'\u001b[0m elements \u001b[1;36m2\u001b[0m and \u001b[1;36m3\u001b[0m are overlapping or \u001b]8;id=876188;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=364439;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/plugins/adjoint/components/simulation.py#132\u001b\\\u001b[2m132\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m touching. Geometric gradients for overlapping structures may contain errors. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "T_fdtd, (grad_eps_fdtd, grad_ds_fdtd) = compute_T_and_grad_fdtd(slab_eps0, slab_ds0)" ] }, { "cell_type": "markdown", "id": "cbd02aa9-41f9-4e28-802d-f9a46b7f6263", "metadata": {}, "source": [ "### Checking Accuracy of TMM (Numerical) vs FDTD (Adjoint)\n", "\n", "Let's convert these from jax types to numpy arrays to work with them easier, and then display the results compared to TMM." ] }, { "cell_type": "code", "execution_count": 13, "id": "41e66722-bb8c-41d9-a0a7-85009ff46df3", "metadata": {}, "outputs": [], "source": [ "grad_eps_fdtd = np.array(grad_eps_fdtd)\n", "grad_ds_fdtd = np.array(grad_ds_fdtd)" ] }, { "cell_type": "code", "execution_count": 14, "id": "953d2497-240a-4295-9fcd-5342942983d0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "T (tmm) = 0.90105\n", "T (FDTD) = 0.90048\n" ] } ], "source": [ "print(f\"T (tmm) = {T_tmm:.5f}\")\n", "print(f\"T (FDTD) = {T_fdtd:.5f}\")" ] }, { "cell_type": "markdown", "id": "809d274a-9bb4-4f24-a7c2-962fc36f0b74", "metadata": {}, "source": [ "We see that the transmission results match very well with TMM, giving us a lot of confidence that our set up is correct.\n", "\n", "Let's look at the gradients now." ] }, { "cell_type": "code", "execution_count": 15, "id": "d0e496be-a967-427d-9ed6-8eea5a96fd70", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "un-normalized:\n", "\tgrad_eps (tmm) = [-0.15463022 0.0376046 -0.0850184 -0.15883104]\n", "\tgrad_eps (FDTD) = [-0.1555976 0.03868869 -0.08492474 -0.15971336]\n", "--------------------------------------------------------------------------------\n", "\tgrad_ds (tmm) = [-0.86661161 -0.12292531 0.58010922 -1.05537496]\n", "\tgrad_ds (FDTD) = [-0.86666322 -0.12288866 0.58089763 -1.05617058]\n", "RMS error = 0.7082491898399449 %\n", "RMS error = 0.07535549363258941 %\n" ] } ], "source": [ "print(\"un-normalized:\")\n", "print(f\"\\tgrad_eps (tmm) = {grad_eps_tmm}\")\n", "print(f\"\\tgrad_eps (FDTD) = {grad_eps_fdtd}\")\n", "print(80*'-')\n", "print(f\"\\tgrad_ds (tmm) = {grad_ds_tmm}\")\n", "print(f\"\\tgrad_ds (FDTD) = {grad_ds_fdtd}\")\n", "\n", "\n", "rms_eps = np.linalg.norm(grad_eps_tmm - grad_eps_fdtd) / np.linalg.norm(grad_eps_tmm)\n", "rms_ds = np.linalg.norm(grad_ds_tmm - grad_ds_fdtd) / np.linalg.norm(grad_ds_tmm)\n", "\n", "print(f\"RMS error = {rms_eps * 100} %\")\n", "print(f\"RMS error = {rms_ds * 100} %\")" ] }, { "cell_type": "markdown", "id": "111ef29c-a78f-468a-b2a7-afa3785ab5aa", "metadata": {}, "source": [ "The gradients match to < 1% of their respective norms, which is very good agreement.\n", "\n", "If we only care about the error in the \"directions\" of the gradients, we can compare their normalized versions to each other." ] }, { "cell_type": "code", "execution_count": 16, "id": "2993410c-0c1d-412e-9c2c-1c43664ae20c", "metadata": {}, "outputs": [], "source": [ "def normalize(arr):\n", " return arr / np.linalg.norm(arr)\n", "\n", "grad_eps_tmm_norm = normalize(grad_eps_tmm)\n", "grad_ds_tmm_norm = normalize(grad_ds_tmm)\n", "grad_eps_fdtd_norm = normalize(grad_eps_fdtd)\n", "grad_ds_fdtd_norm = normalize(grad_ds_fdtd)\n", "\n", "rms_eps = np.linalg.norm(grad_eps_tmm_norm - grad_eps_fdtd_norm) / np.linalg.norm(grad_eps_tmm_norm)\n", "rms_ds = np.linalg.norm(grad_ds_tmm_norm - grad_ds_fdtd_norm) / np.linalg.norm(grad_ds_tmm_norm)" ] }, { "cell_type": "code", "execution_count": 17, "id": "8a375cb8-79ae-4b57-86bd-26af66bba8b4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "normalized:\n", "\tgrad_eps (tmm) = [-0.64328803 0.15644151 -0.35369102 -0.66076412]\n", "\tgrad_eps (FDTD) = [-0.64371317 0.16005659 -0.35133688 -0.66074022]\n", "\tRMS error = 0.4334980715866199 %\n", "--------------------------------------------------------------------------------\n", "\tgrad_ds (tmm) = [-0.58209469 -0.08256775 0.38965379 -0.70888522]\n", "\tgrad_ds (FDTD) = [-0.58177829 -0.08249335 0.38994805 -0.70899181]\n", "\tRMS error = 0.04512126664001993 %\n" ] } ], "source": [ "print(\"normalized:\")\n", "print(f\"\\tgrad_eps (tmm) = {grad_eps_tmm_norm}\")\n", "print(f\"\\tgrad_eps (FDTD) = {grad_eps_fdtd_norm}\")\n", "print(f\"\\tRMS error = {rms_eps * 100} %\")\n", "print(80*'-')\n", "print(f\"\\tgrad_ds (tmm) = {grad_ds_tmm_norm}\")\n", "print(f\"\\tgrad_ds (FDTD) = {grad_ds_fdtd_norm}\")\n", "print(f\"\\tRMS error = {rms_ds * 100} %\")" ] }, { "cell_type": "markdown", "id": "a66dbc89-3804-4576-bf08-31421fcb2476", "metadata": {}, "source": [ "In which case we see slight improvement, but the unnormalized gradients already match quite well before this." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" }, "vscode": { "interpreter": { "hash": "9e43a20ef2440406ea6cbfb61ead7c471aba2de37f508addf1f0635fad81ef64" } }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "00b2fd25c39b41eea8d5604068d76aa0": { "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 } }, "042612d2ed0947d48a9db31c34f2729d": { "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_00b2fd25c39b41eea8d5604068d76aa0", "msg_id": "", "outputs": [ { "data": { "text/html": "
🚶  Starting 'slab_adj'...\n🚶  Starting 'slab_adj'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🚶 \u001b[0m \u001b[1;32mStarting 'slab_adj'...\u001b[0m\n\u001b[32m🚶 \u001b[0m \u001b[1;32mStarting 'slab_adj'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "1bbefff27a0242dbb3be40be7b2f7be4": { "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 } }, "1fd505732e8a43578659ffad0816197a": { "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 } }, "2078b654416d4be3b99b1242b035b4bc": { "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 } }, "23df6bb05b614409ba70494d15633f7b": { "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_810cf13ba5d042fe8fc4b40e55eb8261", "msg_id": "", "outputs": [ { "data": { "text/html": "
🏃  Finishing 'slab_adj'...\n🏃  Finishing 'slab_adj'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'slab_adj'...\u001b[0m\n\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'slab_adj'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "2b631a8f196840f6a6128322d5723694": { "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_2078b654416d4be3b99b1242b035b4bc", "msg_id": "", "outputs": [ { "data": { "text/html": "
 simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/5.7 kB?-:--:--\n simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/5.7 kB?-:--:--
\n", "text/plain": "\r\u001b[2K\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/5.7 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m\n\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/5.7 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "2bc7aad47b704edeba3d989447c6acb0": { "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 } }, "32359174e28e4358837b64156848f22a": { "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_4b6cc865d6a94e8b9abcdcfb6719dc60", "msg_id": "", "outputs": [ { "data": { "text/html": "
🏃  Finishing 'slab_fwd'...\n🏃  Finishing 'slab_fwd'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'slab_fwd'...\u001b[0m\n\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'slab_fwd'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "4b6cc865d6a94e8b9abcdcfb6719dc60": { "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 } }, "5909230a4c294168847630f8127a5c96": { "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_d56b34370dfc4452b988c2ab43db626c", "msg_id": "", "outputs": [ { "data": { "text/html": "
🏃  Starting 'slab_fwd'...\n🏃  Starting 'slab_fwd'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🏃 \u001b[0m \u001b[1;32mStarting 'slab_fwd'...\u001b[0m\n\u001b[32m🏃 \u001b[0m \u001b[1;32mStarting 'slab_fwd'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "5b5e50ecfbfc49c189a0f0d8943171d8": { "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_2bc7aad47b704edeba3d989447c6acb0", "msg_id": "", "outputs": [ { "data": { "text/html": "
% done (field decay = 1.63e-10) ━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━  32% -:--:--\n% done (field decay = 1.63e-10) ━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━  32% -:--:--
\n", "text/plain": "\r\u001b[2K% done (field decay = 1.63e-10) \u001b[38;2;249;38;114m━━━━━━━━━━━━\u001b[0m\u001b[38;2;249;38;114m╸\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 32%\u001b[0m \u001b[36m-:--:--\u001b[0m\n% done (field decay = 1.63e-10) \u001b[38;2;249;38;114m━━━━━━━━━━━━\u001b[0m\u001b[38;2;249;38;114m╸\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 32%\u001b[0m \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "810cf13ba5d042fe8fc4b40e55eb8261": { "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 } }, "883016225eb74774a10a5a7a28e8791f": { "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_bdc427d34d0440f38d8f9ba17c300d11", "msg_id": "", "outputs": [ { "data": { "text/html": "
 simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/5.9 kB?-:--:--\n simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/5.9 kB?-:--:--
\n", "text/plain": "\r\u001b[2K\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/5.9 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m\n\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/5.9 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "993f2741882146c8bf704caf02b82014": { "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 } }, "aff38de6b5394f53b425ace6a5d3d42e": { "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_993f2741882146c8bf704caf02b82014", "msg_id": "", "outputs": [ { "data": { "text/html": "
 monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━ 93.2%3.4/3.7 MB5.5 MB/s0:00:01\n monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━ 93.2%3.4/3.7 MB5.5 MB/s0:00:01
\n", "text/plain": "\r\u001b[2K\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━\u001b[0m \u001b[35m93.2%\u001b[0m • \u001b[32m3.4/3.7 MB\u001b[0m • \u001b[31m5.5 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m\n\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━\u001b[0m \u001b[35m93.2%\u001b[0m • \u001b[32m3.4/3.7 MB\u001b[0m • \u001b[31m5.5 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "bdc427d34d0440f38d8f9ba17c300d11": { "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 } }, "d56b34370dfc4452b988c2ab43db626c": { "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 } }, "e2fbc5558c6846508566f1b9c8f87306": { "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_1fd505732e8a43578659ffad0816197a", "msg_id": "", "outputs": [ { "data": { "text/html": "
 monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━ 64.2%2.4/3.7 MB4.3 MB/s0:00:01\n monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━ 64.2%2.4/3.7 MB4.3 MB/s0:00:01
\n", "text/plain": "\r\u001b[2K\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;2;249;38;114m╸\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━\u001b[0m \u001b[35m64.2%\u001b[0m • \u001b[32m2.4/3.7 MB\u001b[0m • \u001b[31m4.3 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m\n\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;2;249;38;114m╸\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━\u001b[0m \u001b[35m64.2%\u001b[0m • \u001b[32m2.4/3.7 MB\u001b[0m • \u001b[31m4.3 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "e901469e34ea4fa8a92892c700ce7334": { "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_1bbefff27a0242dbb3be40be7b2f7be4", "msg_id": "", "outputs": [ { "data": { "text/html": "
% done (field decay = 1.78e-10) ━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━  32% -:--:--\n% done (field decay = 1.78e-10) ━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━  32% -:--:--
\n", "text/plain": "\r\u001b[2K% done (field decay = 1.78e-10) \u001b[38;2;249;38;114m━━━━━━━━━━━━\u001b[0m\u001b[38;2;249;38;114m╸\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 32%\u001b[0m \u001b[36m-:--:--\u001b[0m\n% done (field decay = 1.78e-10) \u001b[38;2;249;38;114m━━━━━━━━━━━━\u001b[0m\u001b[38;2;249;38;114m╸\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 32%\u001b[0m \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }