{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Self-intersecting PolySlab\n", "\n", "This tutorial shows how to use the `ComplexPolySlab` plugin in tidy3d to deal with self-intersecting polygon that occurs during extrusion in a slanted polyslab." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2022-07-21T20:35:00.874214Z", "iopub.status.busy": "2022-07-21T20:35:00.873757Z", "iopub.status.idle": "2022-07-21T20:35:01.863810Z", "shell.execute_reply": "2022-07-21T20:35:01.863282Z" }, "scrolled": false, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
[11:56:05] WARNING  This version of Tidy3D was pip installed from the         __init__.py:103\n",
       "                    'tidy3d-beta' repository on PyPI. Future releases will be                \n",
       "                    uploaded to the 'tidy3d' repository. From now on, please                 \n",
       "                    use 'pip install tidy3d' instead.                                        \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:56:05]\u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m This version of Tidy3D was pip installed from the \u001b]8;id=848395;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=245123;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/__init__.py#103\u001b\\\u001b[2m103\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m \u001b[32m'tidy3d-beta'\u001b[0m repository on PyPI. Future releases will be \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m uploaded to the \u001b[32m'tidy3d'\u001b[0m repository. From now on, please \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m 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.0rc2                            __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.0rc2 \u001b]8;id=28351;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=906229;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/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 gdstk\n", "\n", "import tidy3d as td\n", "\n", "from tidy3d.plugins import ComplexPolySlab" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 1: concave polygon on the top with positive sidewall angle\n", "\n", "Let's consider a concave polygon as shown in the following figure. As we dilate the polygon, the length of the edge in the middle will approach 0, and the two vertices at the end of the edge can be degenerate. Further dilation will result in a self-intersecting polygon. The collapsing of the two neighboring vertices is known as one type of edge events. There are other types of edge events as well, while our plugin at the moment will focus on this type of edge event." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "vertices= ((0, 0), (1, 0), (1, 1), (0, 1), (0, 0.8), (0.5, 0.65), (0.5, 0.35), (0, 0.2))\n", "s = td.PolySlab(\n", " vertices=vertices,\n", " slab_bounds=(0, 1),\n", " axis=2,\n", " sidewall_angle=0,\n", " reference_plane=\"top\",\n", ")\n", "s.plot(z=0.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a slanted polyslab where this polygon is at the top, self-intersection can occur as the polygon is extruded to the base when the sidewall angle is large. Since `td.PolySlab` only deals with simple polyslab, an error message will be displayed in this case." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
           ERROR    Sidewall angle or structure thickness is so large that the      log.py:34\n",
       "                    polygon is self-intersecting during extrusion. Please either             \n",
       "                    reduce structure thickness to be < 2.016e-01, or use our plugin          \n",
       "                    'ComplexPolySlab' to divide the complex polyslab into a list of          \n",
       "                    simple polyslabs.                                                        \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[1;31mERROR \u001b[0m Sidewall angle or structure thickness is so large that the \u001b]8;id=63821;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/log.py\u001b\\\u001b[2mlog.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=327859;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/log.py#34\u001b\\\u001b[2m34\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m polygon is self-intersecting during extrusion. Please either \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m reduce structure thickness to be < \u001b[1;36m2.016e-01\u001b[0m, or use our plugin \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m \u001b[32m'ComplexPolySlab'\u001b[0m to divide the complex polyslab into a list of \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m simple polyslabs. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sidewall_angle = np.pi/4\n", "try:\n", " s = td.PolySlab(\n", " vertices=vertices,\n", " slab_bounds=(0, 1),\n", " axis=2,\n", " sidewall_angle=sidewall_angle,\n", " reference_plane=\"top\",\n", " )\n", "except Exception as e:\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dividing a complex polyslab into sub-polyslabs\n", "\n", "The plugin `ComplexPolySlab` can divide such a complex polyslab into a list of simple polyslabs. The procedure of setting up the object is the same as in `td.PolySlab`:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "s = ComplexPolySlab(\n", " vertices=vertices,\n", " slab_bounds=(0, 1),\n", " axis=2,\n", " sidewall_angle=sidewall_angle,\n", " reference_plane=\"top\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can obtain the division result in the form of a list of simple polyslabs, or combined into a `GeometryGroup`. As shown below, the entire polyslab will be divided into 3 simple polyslabsl" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The number of sub-polyslabs in the list is 3.\n", "The number of sub-polyslabs in geometry group is 3.\n" ] } ], "source": [ "# To obtain the divided polyslabs, there are two approaches:\n", "# 1) a list of divided polyslabs\n", "sub_polyslabs = s.sub_polyslabs\n", "\n", "# 2) geometry group containing the divided polyslabs\n", "polyslabs_group = s.geometry_group\n", "\n", "print(f\"The number of sub-polyslabs in the list is {len(sub_polyslabs)}.\")\n", "print(f\"The number of sub-polyslabs in geometry group is {len(polyslabs_group.geometries)}.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Define a simulation\n", "Now let's make a simple simulation with a `ComplexPolySlab` object." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "mat = td.Medium(permittivity=2)\n", "\n", "# Three equivalent approaches\n", "# 1) from sub-polyslabs\n", "struct_list = [td.Structure(geometry=poly, medium=mat) for poly in s.sub_polyslabs]\n", "\n", "# 2) from geometry group\n", "struct_list = [td.Structure(geometry=s.geometry_group, medium=mat)]\n", "\n", "# 3) directly obtain the structure with a user-specified medium\n", "struct_list = [s.to_structure(mat)]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
           WARNING  'Simulation.boundary_spec' uses default value, which is simulation.py:227\n",
       "                    'Periodic()' on all sides but will change to 'PML()' in                  \n",
       "                    Tidy3D version 2.0. We recommend explicitly setting all                  \n",
       "                    boundary conditions ahead of this release to avoid                       \n",
       "                    unexpected results.                                                      \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'Simulation.boundary_spec'\u001b[0m uses default value, which is \u001b]8;id=591797;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=889496;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py#227\u001b\\\u001b[2m227\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m \u001b[32m'Periodic\u001b[0m\u001b[32m(\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m on all sides but will change to \u001b[32m'PML\u001b[0m\u001b[32m(\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m in \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m Tidy3D version \u001b[1;36m2.0\u001b[0m. We recommend explicitly setting all \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m boundary conditions ahead of this release to avoid \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m unexpected results. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  No sources in simulation.                               simulation.py:494\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m No sources in simulation. \u001b]8;id=836104;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=520792;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py#494\u001b\\\u001b[2m494\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sim = td.Simulation(\n", " run_time=1e-12,\n", " size=(4, 4, 2),\n", " center=(0.5,0.5,0.5),\n", " grid_spec=td.GridSpec.auto(wavelength=1.0),\n", " structures=struct_list,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualization\n", "\n", "Three characteristic normal cross sections are illustrated below. The polygon near the top looks similar to the supplied polygon. Somewhere between $z=0.75$ $\\mu$m and $z=0.95$ $\\mu$m, a vertex-vertex crossing event happens, and the shape of the polygon changes. Between $z=0.75$ $\\mu$m and $z=0.5$ $\\mu$m, another event occurs, and the shape evolves to a simple box." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 3, figsize=(8,4),layout=\"tight\")\n", "sim.plot(z=0.95,ax=ax[0])\n", "sim.plot(z=0.75,ax=ax[1])\n", "sim.plot(z=0.5,ax=ax[2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 2: GDS import\n", "Similar to `PolySlab`, a `ComplexPolySlab` can also be setup from a `gdstk.Cell`. To illustrate this, let's make a GDS cell with the aforementioned concave polygon, and load it with `.from_gds` classmethod." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# add the concave polygon to the gds cell\n", "\n", "lib = gdstk.Library()\n", "cell = lib.new_cell(\"SI\")\n", "poly = gdstk.Polygon(vertices,layer=0)\n", "cell.add(poly)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Loading a GDS cell into `ComplexPolySlab`" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# obtain a list of polyslabs\n", "geo_list = ComplexPolySlab.from_gds(\n", " cell,\n", " gds_layer=0,\n", " axis=2,\n", " slab_bounds=(0, 1),\n", " sidewall_angle=np.pi/4,\n", " reference_plane=\"top\",\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
[11:56:06] WARNING  'Simulation.boundary_spec' uses default value, which is simulation.py:227\n",
       "                    'Periodic()' on all sides but will change to 'PML()' in                  \n",
       "                    Tidy3D version 2.0. We recommend explicitly setting all                  \n",
       "                    boundary conditions ahead of this release to avoid                       \n",
       "                    unexpected results.                                                      \n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[11:56:06]\u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m \u001b[32m'Simulation.boundary_spec'\u001b[0m uses default value, which is \u001b]8;id=256312;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=536129;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py#227\u001b\\\u001b[2m227\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m \u001b[32m'Periodic\u001b[0m\u001b[32m(\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m on all sides but will change to \u001b[32m'PML\u001b[0m\u001b[32m(\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m in \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m Tidy3D version \u001b[1;36m2.0\u001b[0m. We recommend explicitly setting all \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m boundary conditions ahead of this release to avoid \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m unexpected results. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
           WARNING  No sources in simulation.                               simulation.py:494\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m No sources in simulation. \u001b]8;id=528677;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py\u001b\\\u001b[2msimulation.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=39718;file:///home/weiliang/Documents/tidy3d-core/tidy3d_frontend/tidy3d/components/simulation.py#494\u001b\\\u001b[2m494\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "structure = td.Structure(\n", " geometry=td.GeometryGroup(geometries=geo_list),\n", " medium=mat,\n", ")\n", "\n", "sim = td.Simulation(\n", " run_time=1e-12,\n", " size=(4, 4, 2),\n", " center=(0.5,0.5,0.5),\n", " grid_spec=td.GridSpec.auto(wavelength=1.0),\n", " structures=[structure],\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 3, figsize=(8,4),layout=\"tight\")\n", "sim.plot(z=0.95,ax=ax[0])\n", "sim.plot(z=0.75,ax=ax[1])\n", "sim.plot(z=0.5,ax=ax[2])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }