{ "cells": [ { "cell_type": "markdown", "id": "a2d55732-599d-449a-9d20-5df20c5520fd", "metadata": {}, "source": [ "# Grating efficiency benchmark\n", "\n", "In this example, we compute the grating efficiency of a multilevel diffraction grating whose design is inspired by the work of [Oliva et al. (2011)](https://opg.optica.org/oe/fulltext.cfm?uri=oe-19-15-14735&id=220358).\n", "\n", "Tidy3D uses a near field to far field transformation specialized to periodic structures to compute the grating efficiency, and its accuracy is verified through a comparison with the semi-analytical rigorous coupled wave analysis (RCWA) approach, using the open-source library [grcwa](https://grcwa.readthedocs.io/en/v1.9.0rc1/index.html)." ] }, { "cell_type": "code", "execution_count": 1, "id": "4963c7fb-8d1d-4b15-8794-65a5798d7c5d", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:01:51.746201Z", "iopub.status.busy": "2023-02-03T04:01:51.745751Z", "iopub.status.idle": "2023-02-03T04:01:52.919695Z", "shell.execute_reply": "2023-02-03T04:01:52.919298Z" } }, "outputs": [ { "data": { "text/html": [ "
[22:01:52] 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[22:01:52]\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=187399;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=577052;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=33894;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=961794;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": [ "# standard python imports\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# tidy3D import\n", "import tidy3d as td\n", "from tidy3d import web\n" ] }, { "cell_type": "markdown", "id": "7d4f0faa", "metadata": {}, "source": [ "## Normal incidence\n", "\n", "We will first analyze the grating under normal incidence, as also studied in the paper. In this case, we can use periodic boundary conditions in both tangential directions." ] }, { "cell_type": "markdown", "id": "d12b5401-7572-40ac-ab0a-d563a572381a", "metadata": {}, "source": [ "### Geometry setup\n", "First, the structure and simulation geometry are defined. The structure includes a dielectric substrate with two dielectric patterned layers." ] }, { "cell_type": "code", "execution_count": 2, "id": "995e5434-94a2-497a-ab6a-91392c0348b9", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:01:52.922246Z", "iopub.status.busy": "2023-02-03T04:01:52.921984Z", "iopub.status.idle": "2023-02-03T04:01:52.927981Z", "shell.execute_reply": "2023-02-03T04:01:52.927653Z" } }, "outputs": [], "source": [ "# Grating parameters (all lengths in um)\n", "index = 1.46847\n", "period = 1.866\n", "width_layer1 = 0.519\n", "width_layer2 = 1.202\n", "height_layer1 = 0.333\n", "height_layer2 = 0.281\n", "\n", "# free space central wavelength\n", "wavelength = 0.416\n", "\n", "# Simulation domain geometry\n", "space_above = wavelength * 3\n", "height_substrate = wavelength * 3\n", "space_below = wavelength * 3\n", "\n", "# Define a buffer to make sure objects extend past the simulation boundary\n", "buffer = 0.1\n", "\n", "# Simulation domain along x and z\n", "length_x = period\n", "length_z = space_below + height_substrate + height_layer1 + height_layer2 + space_above\n", "\n", "# Define the medium\n", "grating_medium = td.Medium(permittivity=index**2)\n", "\n", "# Create the substrate\n", "substrate = td.Structure(\n", " geometry=td.Box(\n", " center=[0, 0, -length_z / 2 + height_substrate / 2 + space_below],\n", " size=[td.inf, td.inf, height_substrate],\n", " ),\n", " medium=grating_medium,\n", ")\n", "\n", "# Level 1 grating\n", "center_L1 = [\n", " -buffer / 2 - length_x / 2 + width_layer1 / 2 + width_layer2 / 2,\n", " 0,\n", " -length_z / 2 + space_below + height_substrate + height_layer2 / 2,\n", "]\n", "size_L1 = [width_layer1 + width_layer2 + buffer, td.inf, height_layer2]\n", "grating_L1 = td.Structure(\n", " geometry=td.Box(center=center_L1, size=size_L1),\n", " medium=grating_medium,\n", ")\n", "\n", "# Level 2 grating\n", "center_L2 = [\n", " -buffer / 2 - length_x / 2 + width_layer1 / 2,\n", " 0,\n", " -length_z / 2 + space_below + height_substrate + height_layer2 + height_layer1 / 2,\n", "]\n", "size_L2 = [width_layer1 + buffer, td.inf, height_layer1]\n", "grating_L2 = td.Structure(\n", " geometry=td.Box(center=center_L2, size=size_L2),\n", " medium=grating_medium,\n", ")\n", "\n", "# Collect all structures\n", "structures = [substrate, grating_L1, grating_L2]\n" ] }, { "cell_type": "markdown", "id": "b690f441-06c1-42b2-902a-9518762c80c5", "metadata": {}, "source": [ "### Source setup\n", "Next, define the source plane wave impinging from above the grating at normal incidence" ] }, { "cell_type": "code", "execution_count": 3, "id": "d384ea06-0bf1-440c-9dc4-5a181b02af93", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:01:52.930046Z", "iopub.status.busy": "2023-02-03T04:01:52.929888Z", "iopub.status.idle": "2023-02-03T04:01:52.933164Z", "shell.execute_reply": "2023-02-03T04:01:52.932741Z" } }, "outputs": [], "source": [ "# Central frequency in Hz\n", "f0 = td.C_0 / wavelength\n", "\n", "# Bandwidth\n", "fwidth = f0 / 40.0\n", "\n", "# Run time\n", "run_time = 100 / fwidth\n", "\n", "# Time dependence of source\n", "gaussian = td.GaussianPulse(freq0=f0, fwidth=fwidth)\n", "\n", "# Source\n", "src_z = length_z / 2 - space_above / 2\n", "angle_theta = np.pi / 10\n", "source = td.PlaneWave(\n", " center=(0, 0, src_z),\n", " size=(td.inf, td.inf, 0),\n", " source_time=gaussian,\n", " direction=\"-\",\n", " pol_angle=0,\n", " angle_theta=0,\n", " angle_phi=0,\n", ")\n" ] }, { "cell_type": "markdown", "id": "2d5cd1e2-ee5e-4d22-a2b4-8b18c9f0081b", "metadata": {}, "source": [ "### Monitor setup\n", "Here, we'll set up a field monitor to record and plot the frequency domain fields at a plane in the `xz` cross-section. Also, we'll set up two `DiffractionMonitor`s, one for reflection, and the other for transmission." ] }, { "cell_type": "code", "execution_count": 4, "id": "89f43cc2-6d96-4c0a-908e-9bbd62840f34", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:01:52.935188Z", "iopub.status.busy": "2023-02-03T04:01:52.935058Z", "iopub.status.idle": "2023-02-03T04:01:52.938864Z", "shell.execute_reply": "2023-02-03T04:01:52.938512Z" } }, "outputs": [], "source": [ "# Fields\n", "monitor_xz = td.FieldMonitor(\n", " center=[0, 0, 0], size=[td.inf, 0, td.inf], freqs=[f0], name=\"field_xz\"\n", ")\n", "\n", "# The allowed orders will be computed automatically and returned as part of the results\n", "monitor_r = td.DiffractionMonitor(\n", " center=[0.0, 0.0, length_z / 2 - wavelength],\n", " size=[td.inf, td.inf, 0],\n", " freqs=[f0],\n", " name=\"reflection\",\n", " normal_dir=\"+\",\n", ")\n", "\n", "monitor_t = td.DiffractionMonitor(\n", " center=[0.0, 0.0, -length_z / 2 + wavelength],\n", " size=[td.inf, td.inf, 0],\n", " freqs=[f0],\n", " name=\"transmission\",\n", " normal_dir=\"-\",\n", ")\n", "\n", "monitors = [monitor_xz, monitor_r, monitor_t]\n" ] }, { "cell_type": "markdown", "id": "383d61f0-c458-486d-9573-e52847faa88a", "metadata": {}, "source": [ "### Set up boundary conditions and initialize simualtion\n", "\n", "For normal incidence, we can use periodic boundary conditions along the `x` and `y` directions. More generally, we need to use Bloch boundary conditions as will be illustrated below. We can also use Bloch boundaries with zero Bloch vector for normal incidence, but a simulation with Bloch boundaries uses complex fields and is twice more computationally expensive than a simulation with periodic boundaries, while the results for `bloch_vec = 0` are equivalent.\n", "\n", "Along `z`, a perfectly matched layer (PML) is applied to mimic an infinite domain. Because the diffraction grating introduces waves propagating at various angles, including steep angles with respect to the PML boundary, we use more layers than the default value to minimize spurious reflections at the PMLs." ] }, { "cell_type": "code", "execution_count": 5, "id": "0de6bd71-4044-4999-a2e0-5868fdec613d", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:01:52.940879Z", "iopub.status.busy": "2023-02-03T04:01:52.940725Z", "iopub.status.idle": "2023-02-03T04:01:53.056762Z", "shell.execute_reply": "2023-02-03T04:01:53.056371Z" } }, "outputs": [ { "data": { "text/html": [ "
INFO Auto meshing using wavelength 0.4160 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;36m0.4160\u001b[0m defined from sources. \u001b]8;id=335212;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=726481;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": "iVBORw0KGgoAAAANSUhEUgAAAS8AAAK9CAYAAAB1mOoNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2VUlEQVR4nO3deXxU9b3/8fcsmZnsIRBIIoiACggIXLaCFZTyUJS2cKtWrRW3ixtqXSs89ILQKrcVldYFl1ulF7VS+7vVXrUqILggWkW8F1G0uFSWsglkI5kkM9/fH3EmDNkmk1nyzbyej8c8NCdnZr5nPvm8Od8zZ844jDFGAGAZZ6oHAACxILwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK80GmsXbtWDodDa9euTfVQYAHCC0n30EMPadmyZakeRkyefvppLVmyJNXDiPC73/1OgwcPls/n03HHHaf7778/6vv6/X7deuutKi0tVWZmpsaNG6eVK1c2u+7bb7+t7373u8rKylJxcbGuu+46VVZWxmsz2s8ASTZkyBAzadKkJssDgYCprq42gUAg+YOK0rRp00zfvn1TPYywhx9+2EgyZ511lnn00UfNhRdeaCSZ//iP/4jq/uedd55xu93m5ptvNo888ogZP368cbvd5s0334xYb+PGjcbn85mRI0eapUuXmttuu814vV4zderURGxWVAivFKmsrEz1EFKmpfCyQWcKr0OHDpnu3bubadOmRSy/4IILTHZ2ttm/f3+r93/33XeNJHP33XeHl1VXV5sBAwaY8ePHR6x7xhlnmJKSElNWVhZe9thjjxlJ5pVXXonD1rQf4RUH27dvN5deeqkpKSkxHo/HHHPMMebKK680fr/fGGPME088YSSZtWvXmquuusoUFRWZgoKC8P0ffPBBc8IJJxiPx2NKSkrM1VdfbQ4cOBDxHJ999pn50Y9+ZHr16mW8Xq856qijzLnnnmsOHjwYXufVV181J510ksnPzzfZ2dnm+OOPN3Pnzm1z/NHcr6amxsybN88MGDDAeDwe07t3b3PLLbeYmpqaJo+3fPlyM2bMGJOZmWkKCgrMySefHP4D79u3r5EUcQsF2Zo1a4wks2bNmojH++Mf/2j+5V/+xfh8PtO9e3dzwQUXmO3bt0esc9FFF5ns7Gyzfft2M336dJOdnW169OhhbrrpJlNfX9/ma/Dcc8+ZM888M1zD/v37m4ULF0bcd9KkSU3G3lqQTZw40Zx44onN/u744483p512Wpvjas2LL75oJJkXX3wxYvnbb79tJJnly5e3ev9bbrnFuFyuiEAyxpi77rrLSDJff/21McaYsrIy43a7zS233BKxnt/vNzk5Oeayyy7r0HbEyp30eWoXs3PnTo0dO1YHDx7U5ZdfrkGDBmnHjh3605/+pEOHDsnj8YTXvfrqq1VUVKR58+apqqpKknTHHXdowYIFmjJliq666ip9+umnWrp0qd577z2tW7dOGRkZqq2t1emnny6/369rr71WxcXF2rFjh1544QUdPHhQ+fn52rx5s77//e/rxBNP1MKFC+X1erV161atW7eu1fFHc79gMKgf/vCHeuutt3T55Zdr8ODB2rRpk+677z599tlneu6558LrLliwQHfccYcmTJighQsXyuPx6N1339Vrr72m0047TUuWLNG1116rnJwc3XbbbZKkXr16tTi+ZcuW6ZJLLtGYMWO0aNEi7d69W7/5zW+0bt06bdy4UQUFBeF1A4GATj/9dI0bN06LFy/WqlWrdM8992jAgAG66qqrWn0dli1bppycHN14443KycnRa6+9pnnz5qm8vFx33323JOm2225TWVmZtm/frvvuu0+SlJOT0+JjXnjhhZo1a5Y++ugjDR06NLz8vffe02effabbb789vOzAgQMKBAKtjlGSsrKylJWVJUnauHGjJGn06NER64waNUpOp1MbN27UT3/60xYfa+PGjTr++OOVl5cXsXzs2LGSpA8//FB9+vTRpk2bVF9f3+R5PB6PRowYER5H0qUkMruQmTNnGqfTad57770mvwsGg8aYxj2v7373uxH/ku/Zs8d4PB5z2mmnRRzneeCBB4wk8/jjjxtjGo43SDLPPvtsi+O47777jCSzd+/edo0/mvstX77cOJ3OJsdBQsdb1q1bZ4wx5u9//7txOp3mX//1X5sctwq9Fsa0PG08cs+rtrbW9OzZ0wwdOtRUV1eH13vhhReMJDNv3rzwsosuushIMgsXLox4zJEjR5pRo0a1/iKYhinYka644gqTlZUVsXfZnmnjwYMHjc/nM7feemvE8uuuu85kZ2dHHDpobo+0udv8+fPD95k9e7ZxuVzNPndRUZE577zzWh3fkCFDzOTJk5ss37x5s5FkHn74YWOMMc8++6yRZN54440m655zzjmmuLi41edJFN5t7IBgMKjnnntOP/jBD5r8qyRJDocj4udZs2bJ5XKFf161apVqa2t1/fXXy+l0RqyXl5enF198UZKUn58vSXrllVd06NChZscS2gN5/vnnFQwGo96GaO737LPPavDgwRo0aJD27dsXvk2ePFmStGbNGknSc889p2AwqHnz5kVsj9T0tYjG+++/rz179ujqq6+Wz+cLL582bZoGDRoUfn0Od+WVV0b8fPLJJ+uLL75o87kyMzPD/19RUaF9+/bp5JNP1qFDh7Rly5Z2j11qqNv06dP1hz/8Qebba34GAgGtWLFCM2bMUHZ2dnjdp556SitXrmzzNnPmzPB9qqurI/bsD+fz+VRdXd3q+Kqrq+X1epu9b+j3h/+3pXXbep5EYdrYAXv37lV5eXnElKA1/fr1i/j5H//4hyRp4MCBEcs9Ho/69+8f/n2/fv1044036t5779VTTz2lk08+WT/84Q/105/+NBxs5557rv7zP/9T//Zv/6Y5c+boe9/7nn70ox/p7LPPbhIkh4vmfn//+9/1ySefqKioqNnH2LNnjyTp888/l9Pp1AknnBDV69GWll4fSRo0aJDeeuutiGU+n6/JGLt166YDBw60+VybN2/W7bffrtdee03l5eURvysrK2vv0MNmzpypFStW6M0339TEiRO1atUq7d69WxdeeGHEeieddFK7HzszM1O1tbXN/q6mpiYikFu6v9/vb/a+od8f/t+W1m3reRKF8EqijhT5nnvu0cUXX6znn39er776qq677jotWrRI77zzjnr37q3MzEy98cYbWrNmjV588UW9/PLLWrFihSZPnqxXX301Yo/vyDG1db9gMKhhw4bp3nvvbfYx+vTpE/N2xVNL29iWgwcPatKkScrLy9PChQs1YMAA+Xw+ffDBB7r11lvbtSd7pNNPP129evXSk08+qYkTJ+rJJ59UcXGxpkyZErHe3r17ozrmlZOTEz7OVlJSokAgoD179qhnz57hdWpra/XNN9+otLS01ccqKSnRjh07miz/5z//KUnh+5eUlEQsP3Ldtp4nYVIyWe0iAoGAycvLM9OnT291vdAxryOPiz399NNGknnppZcilvv9fpOfn2/OOuusFh9z3bp1RpK57bbbWlznzjvvNJLMypUr296YVu53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AmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWMmd6gGkwrnjBiovNzPVwwDQjPKKal0exXrseQGwEuEFwEqEFwArEV4ArGRNeN15552aMGGCsrKyVFBQkOrhAEgxa8KrtrZW55xzjq666qpUDwVAJ2DNqRILFiyQJC1btiy1AwHQKVgTXrHw+/3y+/3hn8vLy1M4GgDxZM20MRaLFi1Sfn5++NanT59UDwlAnKQ0vObMmSOHw9HqbcuWLTE//ty5c1VWVha+bdu2LY6jB5BKKZ023nTTTbr44otbXad///4xP77X65XX6435/gA6r5SGV1FRkYqKilI5BACWsuaA/ddff639+/fr66+/ViAQ0IcffihJOvbYY5WTk5PawQFIOmvCa968efr9738f/nnkyJGSpDVr1uiUU05J0agApIo17zYuW7ZMxpgmN4ILSE/WhBcAHI7wAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmAlwguAlQgvAFYivABYifACYCXCC4CVCC8A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K6+8Yj7//HOzYcMGc9555xmfz2c2b96cqk1IOMLLUt988405//zzTU5OjsnLyzOXXHKJqaioCP/+yy+/NJLMmjVrjDHGfP3112bixImmsLDQeL1ec+yxx5pbbrml05/nZYwx999/vzn66KONx+MxY8eONe+88074d5MmTTIXXXRRxPp//OMfzfHHH288Ho8ZMmSIefHFF5M84vhoz3Zff/314XV79eplzjzzTPPBBx+kYNTJwyVxAFiJY14ArER4AbAS4QXASoQXACsRXgCsRHgBsBLhBcBKhBcAKxFeAKxEeAGwEuEFwEqEF6yzd+9eFRcX66677gove/vtt+XxeJpcDgddFx/MhpVeeuklzZgxQ2+//bYGDhyoESNGaPr06br33ntTPTQkCeEFa82ePVurVq3S6NGjtWnTJr333nvyer2pHhaShPCCtaqrqzV06FBt27ZNGzZs0LBhw1I9JCQRx7xgrc8//1w7d+5UMBjUV199lerhIMnY84KVamtrNXbsWI0YMUIDBw7UkiVLtGnTpiZfCYeui/CClW655Rb96U9/0v/+7/8qJydHkyZNUn5+vl544YVUDw1JwrQR1lm7dq2WLFmi5cuXKy8vT06nU8uXL9ebb76ppUuXpnp4SBL2vABYiT0vAFYivABYifACYCXCC4CVCC8AViK8AFiJ8AJgJcILgJUILwBWIrwAWInwAmCl/w+QjwITVU6BpQAAAABJRU5ErkJggg==\n", "text/plain": [ "