{ "cells": [ { "cell_type": "markdown", "id": "da3f0190", "metadata": {}, "source": [ "# Waveguide Y junction" ] }, { "cell_type": "markdown", "id": "eab8c7bd", "metadata": {}, "source": [ "Power splitters such as Y-junctions are widely used in photonic integrated circuits across different applications. When designing a power splitter, we aim to achieve a flat broadband response, low insertion loss, and compact footprint. At the same time, the design needs to comply with the fabrication resolution and tolerance.\n", "\n", "In this example, we demonstrate the modeling of a Y-junction for integrated photonics. The designed device shows an average insertion loss below 0.2 dB in the wavelength range of 1500 nm to 1600 nm. At the same time, it has a small footprint. The junction area is smaller than 2 $\\mu m$ by 2 $\\mu m$, much smaller than the typical power splitters based on multimode interference devices. The design is adapted from [Yi Zhang, Shuyu Yang, Andy Eu-Jin Lim, Guo-Qiang Lo, Christophe Galland, Tom Baehr-Jones, and Michael Hochberg, \"A compact and low loss Y-junction for submicron silicon waveguide,\" Opt. Express 21, 1310-1316 (2013)](https://opg.optica.org/oe/fulltext.cfm?uri=oe-21-1-1310).\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 1, "id": "ad43045e", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:09:13.898731Z", "iopub.status.busy": "2023-02-03T04:09:13.898331Z", "iopub.status.idle": "2023-02-03T04:09:15.524439Z", "shell.execute_reply": "2023-02-03T04:09:15.524012Z" } }, "outputs": [ { "data": { "text/html": [ "
[22:09:14] 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:09:14]\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=797860;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=116201;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=811080;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=659310;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 matplotlib.pyplot as plt\n", "import tidy3d as td\n", "import tidy3d.web as web\n", "from tidy3d.plugins import ModeSolver\n" ] }, { "cell_type": "markdown", "id": "128b718e", "metadata": {}, "source": [ "## Simulation Setup " ] }, { "cell_type": "markdown", "id": "c26dafaa", "metadata": {}, "source": [ "Define simulation wavelength range to be 1.5 $\\mu m$ to 1.6 $\\mu m$." ] }, { "cell_type": "code", "execution_count": 2, "id": "3a2dd129", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:09:15.527050Z", "iopub.status.busy": "2023-02-03T04:09:15.526770Z", "iopub.status.idle": "2023-02-03T04:09:15.529446Z", "shell.execute_reply": "2023-02-03T04:09:15.529070Z" } }, "outputs": [], "source": [ "lda0 = 1.55 # central wavelength\n", "freq0 = td.C_0 / lda0 # central frequency\n", "ldas = np.linspace(1.5, 1.6, 101) # wavelength range\n", "freqs = td.C_0 / ldas # frequency range\n" ] }, { "cell_type": "markdown", "id": "946d0a45", "metadata": {}, "source": [ "In this model, the Y-junction is made of silicon. The top and bottom claddings are made of silicon oxide. We will model them as non-dispersive materials here." ] }, { "cell_type": "code", "execution_count": 3, "id": "b90f342c", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:09:15.531515Z", "iopub.status.busy": "2023-02-03T04:09:15.531359Z", "iopub.status.idle": "2023-02-03T04:09:15.533813Z", "shell.execute_reply": "2023-02-03T04:09:15.533425Z" } }, "outputs": [], "source": [ "n_si = 3.48 # silicon refractive index\n", "si = td.Medium(permittivity=n_si**2)\n", "\n", "n_sio2 = 1.44 # silicon oxide refractive index\n", "sio2 = td.Medium(permittivity=n_sio2**2)\n" ] }, { "cell_type": "markdown", "id": "473f2133", "metadata": {}, "source": [ "The junction is discretized into 13 segments. Each segment is a tapper with the given widths. The optimum design is obtained by optimizing the 13 width parameters using the Particle Swarm Optimization algorithm. For the sake of simplicity, in this notebook, we skip the optimization procedure and only present the optimized result." ] }, { "cell_type": "code", "execution_count": 4, "id": "c67cbbf5", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:09:15.535806Z", "iopub.status.busy": "2023-02-03T04:09:15.535651Z", "iopub.status.idle": "2023-02-03T04:09:15.538741Z", "shell.execute_reply": "2023-02-03T04:09:15.538378Z" } }, "outputs": [], "source": [ "t = 0.22 # thickness of the silicon layer\n", "\n", "# width of the 13 segments\n", "w1 = 0.5\n", "w2 = 0.5\n", "w3 = 0.6\n", "w4 = 0.7\n", "w5 = 0.9\n", "w6 = 1.26\n", "w7 = 1.4\n", "w8 = 1.4\n", "w9 = 1.4\n", "w10 = 1.4\n", "w11 = 1.31\n", "w12 = 1.2\n", "w13 = 1.2\n", "\n", "l_in = 1 # input waveguide length\n", "l_junction = 2 # length of the junction\n", "l_bend = 6 # horizontal length of the waveguide bend\n", "h_bend = 2 # vertical offset of the waveguide bend\n", "l_out = 1 # output waveguide length\n", "inf_eff = 100 # effective infinity\n" ] }, { "cell_type": "markdown", "id": "98ae6d2c", "metadata": {}, "source": [ "First, define the junction structure by using a [PolySlab](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc1/_autosummary/tidy3d.PolySlab.html?highlight=polyslab). The vertices are given by the widths of the segments defined above. If a smooth curve is desirable, one can interpolate the vertices to a finer grid using spline for example. \n", "\n", "Before proceeding further to construct other structures, we can use the [plot](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc1/_autosummary/tidy3d.Structure.html) method to inspect the geometry. " ] }, { "cell_type": "code", "execution_count": 5, "id": "f1bd7cba", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T04:09:15.540786Z", "iopub.status.busy": "2023-02-03T04:09:15.540650Z", "iopub.status.idle": "2023-02-03T04:09:15.708850Z", "shell.execute_reply": "2023-02-03T04:09:15.708452Z" } }, "outputs": [ { "data": { "text/plain": [ "