{ "cells": [ { "cell_type": "markdown", "id": "49a31b4f", "metadata": {}, "source": [ "# THz integrated demultiplexer/filter based on ring resonator" ] }, { "cell_type": "markdown", "id": "7431b8fb", "metadata": {}, "source": [ "Note: the cost of running the entire notebook is larger than 1 FlexUnit.\n", "\n", "Wireless communication technology has been experiencing rapid development to satisfy the ever growing need for higher data transmission speed. The current 5G network has been harnessing the power of microwave and mm wave. The future generations of wireless communication clearly points to even higher frequencies, entering the THz territory. \n", "\n", "Inspired by the advancement of integrated photonics at telecom wavelength, integrated THz technology is a promising candidate for future mass production of compact THz communication devices. This model aims to demonstrate the modeling of a silicon-based THz demultiplexer/filter, which is a crucial component in a high-speed integrated THz communication system. The device utilizes a ring resonator structure similar to a typical ring resonator used in a telecom integrated circuit. It achieves <1.5 dB transmission loss and 3 GHz free spectral range. The design of the device is adapted from [Deng, W. et al. OnβChip Polarizationβ and FrequencyβDivision Demultiplexing for Multidimensional Terahertz Communication. Laser Photon. Rev. 16, 2200136 (2022)](https://onlinelibrary.wiley.com/doi/abs/10.1002/lpor.202200136).\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "8cf441f1", "metadata": {}, "source": [ "## Simulation Setup " ] }, { "cell_type": "code", "execution_count": 1, "id": "6d1a57be", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T05:39:28.532175Z", "iopub.status.busy": "2023-02-03T05:39:28.531827Z", "iopub.status.idle": "2023-02-03T05:39:29.601644Z", "shell.execute_reply": "2023-02-03T05:39:29.601252Z" } }, "outputs": [ { "data": { "text/html": [ "
[23:39:29] 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[23:39:29]\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=359098;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=5710;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=753179;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=440380;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", "\n", "import tidy3d as td\n", "import tidy3d.web as web\n", "from tidy3d.plugins import ModeSolver" ] }, { "cell_type": "markdown", "id": "db3bc0d9", "metadata": {}, "source": [ "The demultiplexer/filter device consists of a ring resonator, a through port waveguide, and a drop port waveguide. It is fabricated on a silicon wafer with a thickness of 130 $\\mu m$. A ridge waveguide with 110 $\\mu m$ height is used. The radius of the ring resonator is designed to ensure low loss for the TE0 mode. " ] }, { "cell_type": "code", "execution_count": 2, "id": "cd6bd27d", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T05:39:29.603461Z", "iopub.status.busy": "2023-02-03T05:39:29.603277Z", "iopub.status.idle": "2023-02-03T05:39:29.605687Z", "shell.execute_reply": "2023-02-03T05:39:29.605423Z" } }, "outputs": [], "source": [ "t_si = 130 #thickness of the si wafer\n", "t_wg = 110 #height of the ridge waveguide\n", "W0 = 200 #width of the waveguide\n", "R1 = 3500 #inner radius of the ring resonator\n", "R2 = 2000 #inner radius of the waveguide bend\n", "Wg = 50 #width of the gap\n", "s = 3000 #horizontal shift of the waveguide bend\n", "inf_eff = 1e5 #effective infinity. This parameter is used to ensure the ports extend into the pml.\n", "\n", "freq0 = 380e9 #central frequency\n", "lda0 = td.C_0/freq0 #central wavelength\n", "freqs = np.linspace(375e9,385e9,301) #wavelength range. \n", "#To ensure we resolve the spectral features, 301 frequency points are used." ] }, { "cell_type": "markdown", "id": "90212abb", "metadata": {}, "source": [ "Since the whole structure is made of silicon, only two materials need to be defined -- silicon and air. At the simulation frequency, silicon has a small loss of $\\alpha$=0.025 $cm^{-1}$. Therefore, the imaginary part of the refractive index can be calculated as $k = \\frac{\\alpha \\lambda}{4\\pi}$. Since the frequency dispersion is very small, we will model silicon as dispersionless material." ] }, { "cell_type": "code", "execution_count": 3, "id": "03bdd9e3", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T05:39:29.607044Z", "iopub.status.busy": "2023-02-03T05:39:29.606946Z", "iopub.status.idle": "2023-02-03T05:39:29.608966Z", "shell.execute_reply": "2023-02-03T05:39:29.608707Z" } }, "outputs": [], "source": [ "alpha = 0.025 #loss\n", "k_si = alpha*lda0*1e-4/(4*np.pi) #imaginary part of the Si refractive index\n", "n_si = 3.405 #real part of the Si refractive index\n", "\n", "si = td.Medium.from_nk(n=n_si, k=k_si, freq=freq0)\n", "air = td.Medium(permittivity = 1)" ] }, { "cell_type": "markdown", "id": "51ae0cf5", "metadata": {}, "source": [ "To build the device, we need to keep in mind that when two structures overlap, the one added later will override the one added earlier. This gives us great flexibility when making more complex geometries. \n", "\n", "To make the ring resonator, we first create a [Cylinder](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc1/_autosummary/tidy3d.Cylinder.html?highlight=cylinder) made of silicon with the radius set to the outer radius of the ring. Then, another [Cylinder](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc1/_autosummary/tidy3d.Cylinder.html?highlight=cylinder) made of air with the radius set to the inner radius of the ring is added. This effectively results in a silicon ring. The waveguide bend structure is built using the same principle. " ] }, { "cell_type": "code", "execution_count": 4, "id": "8526222d", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T05:39:29.610336Z", "iopub.status.busy": "2023-02-03T05:39:29.610219Z", "iopub.status.idle": "2023-02-03T05:39:29.615009Z", "shell.execute_reply": "2023-02-03T05:39:29.614734Z" } }, "outputs": [], "source": [ "#through port waveguide\n", "wg1 = td.Structure(geometry=td.Box.from_bounds(rmin=(-inf_eff,0,0), rmax=(inf_eff,W0,t_si)),\n", " medium=si) \n", "\n", "\n", "#ring resonator\n", "ring_out = td.Structure(geometry=td.Cylinder(center=(0, 2*W0+Wg+R1,t_si/2),radius=R1+W0,length=t_si,axis=2),\n", " medium=si)\n", "\n", "ring_in = td.Structure(geometry=td.Cylinder(center=(0, 2*W0+Wg+R1,t_si/2),radius=R1,length=t_si,axis=2),\n", " medium=air) \n", "\n", "\n", "#waveguide bend\n", "wg_bend_out = td.Structure(geometry=td.Cylinder(center=(-s, 4*W0+2*Wg+2*R1+R2,t_si/2),radius=R2+W0,length=t_si,axis=2),\n", " medium=si)\n", "\n", "wg_bend_in = td.Structure(geometry=td.Cylinder(center=(-s, 4*W0+2*Wg+2*R1+R2,t_si/2),radius=R2,length=t_si,axis=2),\n", " medium=air)\n", "\n", "wg_bend_left = td.Structure(geometry=td.Box.from_bounds(rmin=(-s,3*W0+2*Wg+2*R1,0), rmax=(-s+R2+W0,5*W0+2*Wg+2*R1*2*R2,t_si)),\n", " medium=air)\n", "\n", "\n", "#drop port waveguide\n", "wg2 = td.Structure(geometry=td.Box.from_bounds(rmin=(-s,3*W0+2*Wg+2*R1,0), rmax=(s,4*W0+2*Wg+2*R1,t_si)),\n", " medium=si)\n", "\n", "wg3 = td.Structure(geometry=td.Box.from_bounds(rmin=(-s,4*W0+2*Wg+2*R1+2*R2,0), rmax=(inf_eff,5*W0+2*Wg+2*R1+2*R2,t_si)),\n", " medium=si)\n", "\n", "\n", "#si wafer \n", "si_substrate = td.Structure(geometry=td.Box.from_bounds(rmin=(-inf_eff,-inf_eff,0), rmax=(inf_eff,inf_eff,t_si-t_wg)),\n", " medium=si)" ] }, { "cell_type": "markdown", "id": "d2114d96", "metadata": {}, "source": [ "Define source and monitors. Here we will define a [ModeSource](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc1/search.html?q=modesource) that launches the TE0 mode into the input waveguide. Two [FluxMonitors](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc1/_autosummary/tidy3d.FluxMonitor.html?highlight=fluxmonitor) are added to the through port and the drop port to monitor the transmission. A [FieldMonitor](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc1/_autosummary/tidy3d.FieldMonitor.html?highlight=fieldmonitor) is added in the xy plane to visualize the field distribution." ] }, { "cell_type": "code", "execution_count": 5, "id": "c55531c4", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T05:39:29.616475Z", "iopub.status.busy": "2023-02-03T05:39:29.616390Z", "iopub.status.idle": "2023-02-03T05:39:29.619826Z", "shell.execute_reply": "2023-02-03T05:39:29.619581Z" } }, "outputs": [], "source": [ "mode_spec = td.ModeSpec(num_modes=1, target_neff=3) #we are only interested in the TE0 mode so num_modes is set to 1\n", "#add a mode source at the input of the waveguide\n", "mode_source = td.ModeSource(\n", " center=(-1.5*R1, W0/2, t_si/2),\n", " size=(0, 4*W0, 4*t_si),\n", " source_time = td.GaussianPulse(\n", " freq0=freq0,\n", " fwidth=freq0/10),\n", " direction='+',\n", " mode_spec=mode_spec,\n", " mode_index=0)\n", "\n", "#add two flux monitors at the through port and the drop port\n", "flux_monitor1 = td.FluxMonitor(\n", " center = (1.5*R1,W0/2,t_si/2),\n", " size = (0, 4*W0, 4*t_si),\n", " freqs = freqs,\n", " name='flux1') \n", "\n", "flux_monitor2 = td.FluxMonitor(\n", " center = (1.5*R1,4.5*W0+2*Wg+2*R1+2*R2,t_si/2),\n", " size = (0, 4*W0, 4*t_si),\n", " freqs = freqs,\n", " name='flux2') \n", "\n", "freq1 = 378.8e9 #frequency at which the power is transmitted to the through port\n", "freq2 = 380.2e9 #frequency at which the power is transmitted to the drop port\n", "\n", "#define a field monitor in the z=0 plane to visualize the field flow\n", "field_monitor = td.FieldMonitor(\n", " center = (0,0,t_si/2),\n", " size = (td.inf, td.inf, 0),\n", " freqs = [freq1, freq2],\n", " name='field'\n", ")" ] }, { "cell_type": "markdown", "id": "ebf3cf30", "metadata": {}, "source": [ "Define the simulation using the above structures, source, and monitors. Due to the high-Q resonance of the ring resonator, we need to ensure that the simulation run time is sufficiently long." ] }, { "cell_type": "code", "execution_count": 6, "id": "66b2caf7", "metadata": { "execution": { "iopub.execute_input": "2023-02-03T05:39:29.621195Z", "iopub.status.busy": "2023-02-03T05:39:29.621108Z", "iopub.status.idle": "2023-02-03T05:39:29.743894Z", "shell.execute_reply": "2023-02-03T05:39:29.743637Z" } }, "outputs": [ { "data": { "text/plain": [ "