{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Automatic nonuniform grid\n", "\n", "Here we demonstrate how to use the automatic nonuniform grid generation available in Tidy3D. We will show different possible ways to discretize the air-slot waveguide first introduced in [this reference](https://opg.optica.org/ol/abstract.cfm?uri=ol-29-11-1209)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:23:18.542957Z", "iopub.status.busy": "2023-02-03T04:23:18.542476Z", "iopub.status.idle": "2023-02-03T04:23:20.138075Z", "shell.execute_reply": "2023-02-03T04:23:20.137575Z" }, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
[22:23:19] 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:23:19]\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=98845;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=497926;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=134166;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=849705;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": [ "# basic imports\n", "import numpy as np\n", "import matplotlib.pylab as plt\n", "\n", "# tidy3d imports\n", "import tidy3d as td\n", "from tidy3d.plugins import ModeSolver\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:23:20.140740Z", "iopub.status.busy": "2023-02-03T04:23:20.140300Z", "iopub.status.idle": "2023-02-03T04:23:20.144984Z", "shell.execute_reply": "2023-02-03T04:23:20.144602Z" }, "scrolled": true }, "outputs": [], "source": [ "# basic parameters (note, all length units are microns)\n", "nm = 1e-3\n", "wavelength = 1550 * nm\n", "freq0 = td.C_0 / wavelength\n", "\n", "# waveguide parameters\n", "slot_width = 50 * nm\n", "box_length = 300 * nm\n", "box_height = 180 * nm\n", "\n", "# materials\n", "si_med = td.Medium(permittivity=3.48**2)\n", "sub_med = td.Medium(permittivity=1.46**2)\n", "\n", "# structures\n", "box1 = td.Structure(\n", " geometry=td.Box(\n", " center=(0, -box_length / 2 - slot_width / 2, 0),\n", " size=(td.inf, box_length, box_height),\n", " ),\n", " medium=si_med,\n", ")\n", "box2 = td.Structure(\n", " geometry=td.Box(\n", " center=(0, box_length / 2 + slot_width / 2, 0),\n", " size=(td.inf, box_length, box_height),\n", " ),\n", " medium=si_med,\n", ")\n", "\n", "# boundaries\n", "boundary_spec = td.BoundarySpec.all_sides(boundary=td.PML())\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define a helper function to show us the various grids as we go along this exmaple." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:23:20.147078Z", "iopub.status.busy": "2023-02-03T04:23:20.146902Z", "iopub.status.idle": "2023-02-03T04:23:20.150697Z", "shell.execute_reply": "2023-02-03T04:23:20.150302Z" }, "scrolled": true }, "outputs": [], "source": [ "# Plot simulation and overlay grid in the yz and xy planes\n", "def plot_sim_grid(sim):\n", " fig, ax = plt.subplots(1, 2, figsize=(12, 6))\n", " sim.plot(x=0, ax=ax[0])\n", " sim.plot_grid(x=0, ax=ax[0], lw=0.4, colors=\"r\")\n", " ax[0].set_xlim(-0.6, 0.6)\n", " ax[0].set_ylim(-0.4, 0.4)\n", " sim.plot(z=0, ax=ax[1])\n", " sim.plot_grid(z=0, ax=ax[1], lw=0.4, colors=\"r\")\n", " ax[1].set_xlim(-0.6, 0.6)\n", " ax[1].set_ylim(-0.4, 0.4)\n", " print(f\"Total number of grid points (millions): {sim.num_cells / 1e6:1.2}\")\n", "\n", " return ax\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Uniform grid\n", "\n", "The most standard way to define a simulation is to use a constant grid size in each of the three directions. This can be achieved simply using `td.GridSpec.uniform(dl=...)` as shown below." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:23:20.152631Z", "iopub.status.busy": "2023-02-03T04:23:20.152500Z", "iopub.status.idle": "2023-02-03T04:23:20.420160Z", "shell.execute_reply": "2023-02-03T04:23:20.419736Z" }, "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
[22:23:20] WARNING No sources in simulation. simulation.py:494\n", "\n" ], "text/plain": [ "\u001b[2;36m[22:23:20]\u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m No sources in simulation. \u001b]8;id=72175;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=428434;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/components/simulation.py#494\u001b\\\u001b[2m494\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Total number of grid points (millions): 8.3\n" ] }, { "data": { "text/plain": [ "array([