diff --git a/.ipynb_checkpoints/0-introduction-checkpoint.ipynb b/.ipynb_checkpoints/0-introduction-checkpoint.ipynb new file mode 100644 index 0000000..14b51e0 --- /dev/null +++ b/.ipynb_checkpoints/0-introduction-checkpoint.ipynb @@ -0,0 +1,113 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Simulations in nanophotonics\n", + "\n", + "Solve Maxwell's equations for *e.g.* effective index, mode profile, transmission, etc. Need to fully simulate, since ray optics approximations break down when dimensions are order wavelength." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# What are your options?\n", + "\n", + "## Commercial\n", + "\n", + "Some I've used, but there are a lot more :\n", + "[Lumerical](https://www.lumerical.com/), [Synopsys](https://www.synopsys.com/photonic-solutions.html), [PhotonDesign](https://www.photond.com/products.htm). These may be easier to use in a \"production\" environment, and have more support.\n", + "\n", + "## Why MEEP/MPB (open-source)?\n", + "\n", + "* Free!\n", + "* Flexible. Good for research.\n", + "* Transparent. Good for teaching.\n", + "* Widely-used\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + " # What is PyMEEP?\n", + "\n", + "It is the Python wrapper to MEEP and MPB. These tools can also be used from a Scheme interface. \n", + "\n", + "* **MPB : MIT Periodic Bands**\n", + " * \"MPB computes definite-frequency eigenstates, or harmonic modes, of Maxwell's equations in periodic dielectric structures for arbitrary wavevectors, using fully-vectorial and three-dimensional methods. It is applicable to many problems in optics, such as waveguides and resonator systems, and photonic crystals. [1]\n", + " \n", + "\n", + "* **MEEP : MIT Electromagnetic Equation Propagation**\n", + " * \"A time-domain electromagnetic simulation simply evolves Maxwell's equations over time within some finite computational volume, essentially performing a kind of numerical experiment. This can be used to calculate a wide variety of useful quantities. Major applications include:\n", + " * Transmittance and Reflectance Spectra — by Fourier-transforming the response to a short pulse, a single simulation can yield the scattering amplitudes over a broadband spectrum.\n", + " * Resonant Modes and Frequencies — by analyzing the response of the system to a short pulse, one can extract the frequencies, decay rates, and field patterns of the harmonic modes of lossy and lossless systems including waveguide and cavity modes.\n", + " * Field Patterns (e.g. Green's functions) — in response to an arbitrary source via a continuous-wave (CW) input (fixed-ω).\"\n", + " \n", + " Meep's scriptable interface makes it possible to combine many sorts of computations along with multi-parameter optimization in sequence or in parallel.\" [2]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction to the Python interface\n", + "\n", + "Mostly follow Python syntax for objects, functions, etc." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# References\n", + "\n", + "1. https://mpb.readthedocs.io/en/latest/\n", + "2. https://meep.readthedocs.io/en/latest/\n", + "3. http://www.simpetus.com/projects.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyMeep", + "language": "python", + "name": "pymeep" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/.ipynb_checkpoints/1-simple_geometries-checkpoint.ipynb b/.ipynb_checkpoints/1-simple_geometries-checkpoint.ipynb new file mode 100644 index 0000000..b506636 --- /dev/null +++ b/.ipynb_checkpoints/1-simple_geometries-checkpoint.ipynb @@ -0,0 +1,380 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Defining geometries for PyMEEP\n", + "\n", + "Simple shapes can be directly defined in PyMEEP. Later, we will see how to import arbitrary shapes made with more specialized tools.\n", + "For visualization, we will call the Python packages [Matplotlib](https://matplotlib.org/) and [Ipyvolume](https://ipyvolume.readthedocs.io/en/latest/).\n", + "\n", + "References :\n", + "\n", + "1. https://mpb.readthedocs.io/en/latest/Python_Tutorial/\n", + "2. https://mpb.readthedocs.io/en/latest/Python_User_Interface/\n", + "2. http://www.simpetuscloud.com/projects.html#mpb_waveguide" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import meep and mpb (from meep)\n", + "import meep as mp\n", + "from meep import mpb\n", + "\n", + "# arrays\n", + "import numpy as np\n", + "\n", + "# plotting\n", + "import matplotlib.pyplot as plt\n", + "import ipyvolume as ipv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cross-section of a strip waveguide\n", + "\n", + "As a (useful) example, let's characterize a strip waveguide (Figure from [3])\n", + "\n", + "![alt text](http://www.simpetus.com/files/SOI_waveguide_bands.png)\n", + "\n", + "The left image is the geometry we want to simulate. Since we have translational invariance along $x$, the propagation direction, we will only consider the $yz$ cross-section. The right image contains the information we want : dispersion relation (allowed modes), and field profiles.\n", + "\n", + "## 1. Computational domain\n", + "\n", + "Since the computer has finite memory, our geometry will live inside a \"super\" geometry. For MPB, this \"supercell\" always has periodic boundary conditions. But if it is big enough, we don't expect it to have an effect on localized modes, which is what we are trying to solve for a waveguide.\n", + "\n", + "### 1.1 A note on geometry\n", + "\n", + "By default, everything is 3D. For a waveguide, we can use the translational invariance along the propagation direction (say, $x$) to do a 2D simulation. Then, the only thing that matters is the geometries' intersection with the yz plane (x=0). We can set this when we define the size of the computational cell, controlled by the geometry_lattice argument, an object of the meep.Lattice class: we can set some of the dimensions to have a size 0, which reduces the dimensionality of the system. [1]\n", + "\n", + "### 1.2 A note on units\n", + "\n", + "Since Maxwell's equations with linear permittivity are [scale-invariant](https://mpb.readthedocs.io/en/latest/Python_Tutorial/#a-few-words-on-units), a simulation in MPB with units of $x$ outputs frequencies equivalent to $f=x/\\lambda$. By default, dimensions are in microns. For instance, to look for the wavelength response at $1.5\\mu$m, we look at frequency $1/1.5 = 0.6667$ (the physical frequency outside of MPB would be $f=c/\\lambda$).\n", + "\n", + "Let's define the supercell :" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "sc_y = 2 # supercell width (um)\n", + "sc_z = 2 # supercell height (um)\n", + "resolution = 64 # pixels/um\n", + "geometry_lattice = mp.Lattice(size=mp.Vector3(0, sc_y, sc_z)) # Computational domain object" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we used variables to parametrize the supercell. The resolution should be a multiple of 2 for better results." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters for the waveguide\n", + "w = 0.3 # Si width (um)\n", + "h = 0.25 # Si height (um)\n", + "\n", + "# Materials\n", + "Si = mp.Medium(index=3.45)\n", + "SiO2 = mp.Medium(index=1.45)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Geometry\n", + "\n", + "The geometry that will be passed to the solver is a list of meep objects. Objects typically have a shape and index. Later objects in the list will be overlaid \"on top\" of earlier objects, effectively replacing them (useful to draw holes). See https://meep.readthedocs.io/en/latest/Python_User_Interface/#geometricobject for common geometries." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# define the 2d blocks for the strip and substrate\n", + "geometry = [mp.Block(size=mp.Vector3(mp.inf, mp.inf, 0.5 * (sc_z - h)),\n", + " center=mp.Vector3(z=0.25 * (sc_z + h)), material=SiO2),\n", + " mp.Block(size=mp.Vector3(mp.inf, w, h), material=Si)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 - Visualizing the geometry" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While we could directly convert the geometry object above into a visualization, MPB and MEEP offer an easy way to display the dielectric distribution once the simulation has been initialized. The function we are interested in is `ModeSolver.init_params(p, reset_fields)` [2]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Working in 3 dimensions.\n", + "Grid size is 1 x 64 x 64.\n", + "Solving for 1 bands at a time.\n", + "Creating Maxwell data...\n", + "Mesh size is 3.\n", + "Lattice vectors:\n", + " (1, 0, 0)\n", + " (0, 2, 0)\n", + " (0, 0, 2)\n", + "Cell volume = 4\n", + "Reciprocal lattice vectors (/ 2 pi):\n", + " (1, -0, 0)\n", + " (-0, 0.5, -0)\n", + " (0, -0, 0.5)\n", + "Geometric objects:\n", + " block, center = (0,0,0.5625)\n", + " size (1e+20,1e+20,0.875)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + " block, center = (0,0,0)\n", + " size (1e+20,0.3,0.25)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + "Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)\n", + "Initializing epsilon function...\n", + "Allocating fields...\n", + "Solving for band polarization: .\n", + "Initializing fields to random numbers...\n" + ] + } + ], + "source": [ + "ms = mpb.ModeSolver(\n", + " geometry_lattice=geometry_lattice,\n", + " geometry=geometry,\n", + " resolution=resolution)\n", + "ms.init_params(mp.NO_PARITY, True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's ask the modesolver for the permittivity distribution it will simulate and plot it :" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epsilon: 1-11.9025, mean 1.68727, harm. mean 1.33783, 47.4609% > 1, 6.30378% \"fill\"\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(6, 4))\n", + "\n", + "n = np.sqrt(ms.get_epsilon())\n", + "\n", + "pos = ax.imshow(n.T, cmap='gray_r', interpolation='spline36', extent=[-sc_y/2,sc_y/2,-sc_z/2,sc_z/2] )\n", + "cbar = fig.colorbar(pos, ax=ax)\n", + "cbar.set_label('n')\n", + "ax.set_xlabel('y')\n", + "ax.set_ylabel('z')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2.5D photonic crystal\n", + "\n", + "It is just as easy to define repeated elements and to extend to 3D :\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Working in 3 dimensions.\n", + "Grid size is 16 x 16 x 16.\n", + "Solving for 1 bands at a time.\n", + "Creating Maxwell data...\n", + "Mesh size is 3.\n", + "Lattice vectors:\n", + " (0.5, 0, 0)\n", + " (0, 0.5, 0)\n", + " (0, 0, 0.5)\n", + "Cell volume = 0.125\n", + "Reciprocal lattice vectors (/ 2 pi):\n", + " (2, -0, 0)\n", + " (-0, 2, -0)\n", + " (0, -0, 2)\n", + "Geometric objects:\n", + " cylinder, center = (0,0,0)\n", + " radius 0.2, height 1e+20, axis (0, 0, 1)\n", + "Geometric object tree has depth 1 and 3 object nodes (vs. 1 actual objects)\n", + "Initializing epsilon function...\n", + "Allocating fields...\n", + "Solving for band polarization: .\n", + "Initializing fields to random numbers...\n" + ] + } + ], + "source": [ + "# Supercell\n", + "sc_x = 0.5 # um\n", + "sc_y = 0.5 # um\n", + "sc_z = 0.5 # um\n", + "resolution = 32 # pixels/um\n", + "geometry_lattice = mp.Lattice(size=mp.Vector3(sc_x, sc_y, sc_z)) # Computational domain object\n", + "\n", + "# Objects\n", + "geometry = [mp.Cylinder(0.2, material=Si)] # 200nm radius cylinder, infinite extent in x\n", + "\n", + "# ModeSolver\n", + "ms = mpb.ModeSolver(\n", + " geometry_lattice=geometry_lattice,\n", + " geometry=geometry,\n", + " resolution=resolution)\n", + "ms.default_material = SiO2\n", + "ms.init_params(mp.NO_PARITY, True)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epsilon: 2.1025-11.9025, mean 7.02807, harm. mean 3.79119, 100% > 1, 50.2609% \"fill\"\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(6, 4))\n", + "\n", + "n = np.sqrt(ms.get_epsilon())\n", + "nxy = n[:,:,0]\n", + "\n", + "pos = ax.imshow(nxy, cmap='gray_r', interpolation='spline36', extent=[-sc_y/2,sc_y/2,-sc_z/2,sc_z/2] )\n", + "cbar = fig.colorbar(pos, ax=ax)\n", + "cbar.set_label('n')\n", + "ax.set_title('xy cut')\n", + "ax.set_xlabel('x')\n", + "ax.set_ylabel('y')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d984474050784edda3ccaf982a245fb5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(VBox(children=(HBox(children=(Label(value='levels:'), FloatSlider(value=0.0, max=1.0, step=0.00…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ipv.quickvolshow(n, level=[0,1.45,3.45])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyMeep", + "language": "python", + "name": "pymeep" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/.ipynb_checkpoints/2-MPB_simulation-checkpoint.ipynb b/.ipynb_checkpoints/2-MPB_simulation-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/2-MPB_simulation-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/3-MEEP_simulation-checkpoint.ipynb b/.ipynb_checkpoints/3-MEEP_simulation-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/3-MEEP_simulation-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/4-MEEP_S_parameters-checkpoint.ipynb b/.ipynb_checkpoints/4-MEEP_S_parameters-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/4-MEEP_S_parameters-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/5-complex_geometries-checkpoint.ipynb b/.ipynb_checkpoints/5-complex_geometries-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/5-complex_geometries-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/6-shell_simulations-checkpoint.ipynb b/.ipynb_checkpoints/6-shell_simulations-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/6-shell_simulations-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/0-introduction.ipynb b/0-introduction.ipynb index 14b51e0..a49c8d3 100644 --- a/0-introduction.ipynb +++ b/0-introduction.ipynb @@ -67,7 +67,16 @@ "source": [ "# Introduction to the Python interface\n", "\n", - "Mostly follow Python syntax for objects, functions, etc." + "Mostly follow Python syntax for objects, functions, etc.\n", + "\n", + "\n", + "\n", + "Image rom https://www.w3schools.com/python/python_classes.asp\n", + "\n", + "### Neat Notebook tricks\n", + "\n", + "* Autocomplete/suggest : press tab\n", + "* Cell magics : %%capture to suppress or capture output, etc." ] }, { @@ -76,9 +85,15 @@ "source": [ "# References\n", "\n", + "Most of the following is extracted from the Python User Interface and Tutorial pages of :\n", + "\n", "1. https://mpb.readthedocs.io/en/latest/\n", "2. https://meep.readthedocs.io/en/latest/\n", - "3. http://www.simpetus.com/projects.html" + "\n", + "The source code (thanks open-source!) itself and examples are also a good source of information :\n", + "\n", + "3. https://github.com/NanoComp/meep\n", + "4. http://www.simpetus.com/projects.html" ] }, { diff --git a/1-simple_geometries.ipynb b/1-simple_geometries.ipynb index 8f416d6..9479562 100644 --- a/1-simple_geometries.ipynb +++ b/1-simple_geometries.ipynb @@ -77,7 +77,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here, we used variables to parametrize the supercell. The resolution" + "Here, we used variables to parametrize the supercell. The resolution should be a multiple of 2 for better results." ] }, { @@ -92,15 +92,7 @@ "\n", "# Materials\n", "Si = mp.Medium(index=3.45)\n", - "SiO2 = mp.Medium(index=1.45)\n", - "\n", - "# Define the computational cell. We'll make x the propagation direction.\n", - "# the other cell sizes should be big enough so that the boundaries are\n", - "# far away from the mode field.\n", - "sc_y = 2 # supercell width (um)\n", - "sc_z = 2 # supercell height (um)\n", - "resolution = 32 # pixels/um\n", - "geometry_lattice = mp.Lattice(size=mp.Vector3(0, sc_y, sc_z))\n" + "SiO2 = mp.Medium(index=1.45)" ] }, { @@ -235,12 +227,12 @@ "source": [ "# 2.5D photonic crystal\n", "\n", - "It is just as easy to define repeated elements and to extend to 3D :\n" + "It is just as easy to define different elements and to extend to 3D. The periodic boundary conditions of MPB make a cell containing a single element automatically a photonic crystal. To simulate defect modes, one can proceed as above i.e. have a larger computational domain with the bounded mode decaying before reaching the boundary.\n" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -248,23 +240,23 @@ "output_type": "stream", "text": [ "Working in 3 dimensions.\n", - "Grid size is 16 x 16 x 16.\n", + "Grid size is 16 x 16 x 64.\n", "Solving for 1 bands at a time.\n", "Creating Maxwell data...\n", "Mesh size is 3.\n", "Lattice vectors:\n", " (0.5, 0, 0)\n", " (0, 0.5, 0)\n", - " (0, 0, 0.5)\n", - "Cell volume = 0.125\n", + " (0, 0, 2)\n", + "Cell volume = 0.5\n", "Reciprocal lattice vectors (/ 2 pi):\n", " (2, -0, 0)\n", " (-0, 2, -0)\n", - " (0, -0, 2)\n", + " (0, -0, 0.5)\n", "Geometric objects:\n", " cylinder, center = (0,0,0)\n", - " radius 0.2, height 1e+20, axis (0, 0, 1)\n", - "Geometric object tree has depth 1 and 3 object nodes (vs. 1 actual objects)\n", + " radius 0.2, height 0.875, axis (0, 0, 1)\n", + "Geometric object tree has depth 1 and 1 object nodes (vs. 1 actual objects)\n", "Initializing epsilon function...\n", "Allocating fields...\n", "Solving for band polarization: .\n", @@ -276,37 +268,80 @@ "# Supercell\n", "sc_x = 0.5 # um\n", "sc_y = 0.5 # um\n", - "sc_z = 0.5 # um\n", + "sc_z = 2 # um\n", "resolution = 32 # pixels/um\n", "geometry_lattice = mp.Lattice(size=mp.Vector3(sc_x, sc_y, sc_z)) # Computational domain object\n", "\n", "# Objects\n", - "geometry = [mp.Cylinder(0.2, material=Si)] # 200nm radius cylinder, infinite extent in x\n", + "geometry = [mp.Cylinder(radius=0.2, height=0.5 * (sc_z - h), material=Si)] # 200nm radius cylinder\n", "\n", "# ModeSolver\n", "ms = mpb.ModeSolver(\n", " geometry_lattice=geometry_lattice,\n", " geometry=geometry,\n", " resolution=resolution)\n", - "ms.default_material = SiO2\n", + "ms.default_material = SiO2 # Default fill for background\n", "ms.init_params(mp.NO_PARITY, True)" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epsilon: 2.1025-11.9025, mean 4.25806, harm. mean 2.62689, 100% > 1, 21.9955% \"fill\"\n", + "(16, 16, 64)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,2,figsize=(6, 4))\n", + "\n", + "n = np.sqrt(ms.get_epsilon())\n", + "print(np.shape(n))\n", + "nxy = n[:,:,int(sc_z*resolution/2)]\n", + "\n", + "pos = ax.imshow(nxy, cmap='gray_r', interpolation='spline36', extent=[-sc_x/2,sc_x/2,-sc_y/2,sc_y/2] )\n", + "cbar = fig.colorbar(pos, ax=ax)\n", + "cbar.set_label('n')\n", + "ax.set_title('xy cut for z={0}um'.format(sc_z/2))\n", + "ax.set_xlabel('x')\n", + "ax.set_ylabel('y')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "epsilon: 2.1025-11.9025, mean 7.02807, harm. mean 3.79119, 100% > 1, 50.2609% \"fill\"\n" + "epsilon: 2.1025-11.9025, mean 4.25806, harm. mean 2.62689, 100% > 1, 21.9955% \"fill\"\n", + "(16, 16, 64)\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -321,12 +356,13 @@ "fig, ax = plt.subplots(figsize=(6, 4))\n", "\n", "n = np.sqrt(ms.get_epsilon())\n", + "print(np.shape(n))\n", "nxy = n[:,:,0]\n", "\n", - "pos = ax.imshow(nxy, cmap='gray_r', interpolation='spline36', extent=[-sc_y/2,sc_y/2,-sc_z/2,sc_z/2] )\n", + "pos = ax.imshow(nxy, cmap='gray_r', interpolation='spline36', extent=[-sc_x/2,sc_x/2,-sc_y/2,sc_y/2] )\n", "cbar = fig.colorbar(pos, ax=ax)\n", "cbar.set_label('n')\n", - "ax.set_title('xy cut')\n", + "ax.set_title('xy cut for z={0}um'.format(0))\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y')\n", "plt.show()" @@ -334,13 +370,13 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d984474050784edda3ccaf982a245fb5", + "model_id": "63217db69aee42e5b19f938a991931dd", "version_major": 2, "version_minor": 0 }, @@ -355,13 +391,6 @@ "source": [ "ipv.quickvolshow(n, level=[0,1.45,3.45])" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/2-MPB_simulation.ipynb b/2-MPB_simulation.ipynb new file mode 100644 index 0000000..6932342 --- /dev/null +++ b/2-MPB_simulation.ipynb @@ -0,0 +1,1632 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MPB ModeSolver\n", + "\n", + "Now let's obtain the plot on the right (Figure from [3]) :\n", + "\n", + "![alt text](http://www.simpetus.com/files/SOI_waveguide_bands.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import meep and mpb (from meep)\n", + "import meep as mp\n", + "from meep import mpb\n", + "\n", + "# arrays\n", + "import numpy as np\n", + "\n", + "# plotting\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# for parsing text files\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Start by defining the geometry from last time :" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters for the waveguide\n", + "w = 0.3 # Si width (um)\n", + "h = 0.25 # Si height (um)\n", + "\n", + "# Materials\n", + "Si = mp.Medium(index=3.45)\n", + "SiO2 = mp.Medium(index=1.45)\n", + "\n", + "sc_y = 2 # supercell width (um)\n", + "sc_z = 2 # supercell height (um)\n", + "resolution = 32 # pixels/um\n", + "geometry_lattice = mp.Lattice(size=mp.Vector3(0, sc_y, sc_z))\n", + "\n", + "# define the 2d blocks for the strip and substrate\n", + "geometry = [mp.Block(size=mp.Vector3(mp.inf, mp.inf, 0.5 * (sc_z - h)),\n", + " center=mp.Vector3(z=0.25 * (sc_z + h)), material=SiO2),\n", + " mp.Block(size=mp.Vector3(mp.inf, w, h), material=Si)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Defining the simulation\n", + "\n", + "Now, instead of only initializing the geometry, we will load simulation parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# The k (i.e. beta, i.e. propagation constant) points to look at, in\n", + "# units of 2*pi/um. We'll look at num_k points from k_min to k_max.\n", + "num_k = 30\n", + "k_min = 0.1\n", + "k_max = 3.0\n", + "k_points = mp.interpolate(num_k, [mp.Vector3(k_min), mp.Vector3(k_max)])\n", + "\n", + "# Increase this to see more modes. (The guided ones are the ones below the\n", + "# light line, i.e. those with frequencies < kmag / 1.45, where kmag\n", + "# is the corresponding column in the output if you grep for \"freqs:\".)\n", + "num_bands = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# ModeSolver object\n", + "ms = mpb.ModeSolver(\n", + " geometry_lattice=geometry_lattice,\n", + " geometry=geometry,\n", + " # Add new things pertaining to simulation\n", + " k_points=k_points,\n", + " resolution=resolution,\n", + " num_bands=num_bands,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Running the simulation\n", + "\n", + "The simulation will be initialized as before when run() is called." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initializing eigensolver data\n", + "Computing 4 bands with 1e-07 tolerance\n", + "Working in 3 dimensions.\n", + "Grid size is 1 x 64 x 64.\n", + "Solving for 4 bands at a time.\n", + "Creating Maxwell data...\n", + "Mesh size is 3.\n", + "Lattice vectors:\n", + " (1, 0, 0)\n", + " (0, 2, 0)\n", + " (0, 0, 2)\n", + "Cell volume = 4\n", + "Reciprocal lattice vectors (/ 2 pi):\n", + " (1, -0, 0)\n", + " (-0, 0.5, -0)\n", + " (0, -0, 0.5)\n", + "Geometric objects:\n", + " block, center = (0,0,0.5625)\n", + " size (1e+20,1e+20,0.875)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + " block, center = (0,0,0)\n", + " size (1e+20,0.3,0.25)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + "Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)\n", + "Initializing epsilon function...\n", + "Allocating fields...\n", + "Solving for band polarization: .\n", + "Initializing fields to random numbers...\n", + "32 k-points\n", + " Vector3<0.1, 0.0, 0.0>\n", + " Vector3<0.1935483870967742, 0.0, 0.0>\n", + " Vector3<0.2870967741935484, 0.0, 0.0>\n", + " Vector3<0.38064516129032255, 0.0, 0.0>\n", + " Vector3<0.4741935483870968, 0.0, 0.0>\n", + " Vector3<0.567741935483871, 0.0, 0.0>\n", + " Vector3<0.6612903225806451, 0.0, 0.0>\n", + " Vector3<0.7548387096774194, 0.0, 0.0>\n", + " Vector3<0.8483870967741935, 0.0, 0.0>\n", + " Vector3<0.9419354838709677, 0.0, 0.0>\n", + " Vector3<1.035483870967742, 0.0, 0.0>\n", + " Vector3<1.1290322580645162, 0.0, 0.0>\n", + " Vector3<1.2225806451612904, 0.0, 0.0>\n", + " Vector3<1.3161290322580645, 0.0, 0.0>\n", + " Vector3<1.409677419354839, 0.0, 0.0>\n", + " Vector3<1.503225806451613, 0.0, 0.0>\n", + " Vector3<1.5967741935483872, 0.0, 0.0>\n", + " Vector3<1.6903225806451614, 0.0, 0.0>\n", + " Vector3<1.7838709677419355, 0.0, 0.0>\n", + " Vector3<1.87741935483871, 0.0, 0.0>\n", + " Vector3<1.970967741935484, 0.0, 0.0>\n", + " Vector3<2.064516129032258, 0.0, 0.0>\n", + " Vector3<2.1580645161290324, 0.0, 0.0>\n", + " Vector3<2.2516129032258068, 0.0, 0.0>\n", + " Vector3<2.3451612903225807, 0.0, 0.0>\n", + " Vector3<2.438709677419355, 0.0, 0.0>\n", + " Vector3<2.532258064516129, 0.0, 0.0>\n", + " Vector3<2.6258064516129034, 0.0, 0.0>\n", + " Vector3<2.7193548387096778, 0.0, 0.0>\n", + " Vector3<2.8129032258064517, 0.0, 0.0>\n", + " Vector3<2.906451612903226, 0.0, 0.0>\n", + " Vector3<3.0, 0.0, 0.0>\n", + "elapsed time for initialization: 0.03134512901306152\n", + "solve_kpoint (0.1,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 29 iterations.\n", + "freqs:, 1, 0.1, 0, 0, 0.1, 0.0807582, 0.0855765, 0.3147, 0.394675\n", + "elapsed time for k point: 0.1492457389831543\n", + "solve_kpoint (0.193548,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 15 iterations.\n", + "freqs:, 2, 0.193548, 0, 0, 0.193548, 0.155365, 0.16422, 0.341458, 0.410987\n", + "elapsed time for k point: 0.08380365371704102\n", + "solve_kpoint (0.287097,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 14 iterations.\n", + "freqs:, 3, 0.287097, 0, 0, 0.287097, 0.228276, 0.240091, 0.381337, 0.436147\n", + "elapsed time for k point: 0.07639384269714355\n", + "solve_kpoint (0.380645,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 14 iterations.\n", + "freqs:, 4, 0.380645, 0, 0, 0.380645, 0.298937, 0.311941, 0.430273, 0.467754\n", + "elapsed time for k point: 0.07965588569641113\n", + "solve_kpoint (0.474194,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 14 iterations.\n", + "freqs:, 5, 0.474194, 0, 0, 0.474194, 0.367072, 0.379151, 0.483705, 0.502991\n", + "elapsed time for k point: 0.07943391799926758\n", + "solve_kpoint (0.567742,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 16 iterations.\n", + "freqs:, 6, 0.567742, 0, 0, 0.567742, 0.432542, 0.441894, 0.536768, 0.538894\n", + "elapsed time for k point: 0.08882355690002441\n", + "solve_kpoint (0.66129,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 16 iterations.\n", + "freqs:, 7, 0.66129, 0, 0, 0.66129, 0.494782, 0.500315, 0.573355, 0.58507\n", + "elapsed time for k point: 0.08732295036315918\n", + "solve_kpoint (0.754839,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 15 iterations.\n", + "freqs:, 8, 0.754839, 0, 0, 0.754839, 0.551001, 0.553305, 0.608206, 0.629108\n", + "elapsed time for k point: 0.08421730995178223\n", + "solve_kpoint (0.848387,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 15 iterations.\n", + "freqs:, 9, 0.848387, 0, 0, 0.848387, 0.593884, 0.598211, 0.651795, 0.674567\n", + "elapsed time for k point: 0.08363509178161621\n", + "solve_kpoint (0.941935,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 14 iterations.\n", + "freqs:, 10, 0.941935, 0, 0, 0.941935, 0.622664, 0.633694, 0.706501, 0.725007\n", + "elapsed time for k point: 0.07930493354797363\n", + "solve_kpoint (1.03548,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 14 iterations.\n", + "freqs:, 11, 1.03548, 0, 0, 1.03548, 0.645081, 0.662012, 0.765683, 0.779634\n", + "elapsed time for k point: 0.07721424102783203\n", + "solve_kpoint (1.12903,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 17 iterations.\n", + "freqs:, 12, 1.12903, 0, 0, 1.12903, 0.665138, 0.686152, 0.824909, 0.836268\n", + "elapsed time for k point: 0.09172987937927246\n", + "solve_kpoint (1.22258,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 24 iterations.\n", + "freqs:, 13, 1.22258, 0, 0, 1.22258, 0.684281, 0.708024, 0.869466, 0.892966\n", + "elapsed time for k point: 0.12187790870666504\n", + "solve_kpoint (1.31613,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 17 iterations.\n", + "freqs:, 14, 1.31613, 0, 0, 1.31613, 0.703123, 0.728677, 0.894377, 0.947171\n", + "elapsed time for k point: 0.09132170677185059\n", + "solve_kpoint (1.40968,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 15 iterations.\n", + "freqs:, 15, 1.40968, 0, 0, 1.40968, 0.721964, 0.748699, 0.91638, 0.994817\n", + "elapsed time for k point: 0.08275747299194336\n", + "solve_kpoint (1.50323,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 14 iterations.\n", + "freqs:, 16, 1.50323, 0, 0, 1.50323, 0.740959, 0.768431, 0.937664, 1.03361\n", + "elapsed time for k point: 0.0791776180267334\n", + "solve_kpoint (1.59677,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 13 iterations.\n", + "freqs:, 17, 1.59677, 0, 0, 1.59677, 0.760193, 0.788079, 0.958655, 1.06537\n", + "elapsed time for k point: 0.07450485229492188\n", + "solve_kpoint (1.69032,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 11 iterations.\n", + "freqs:, 18, 1.69032, 0, 0, 1.69032, 0.779709, 0.807772, 0.979518, 1.09248\n", + "elapsed time for k point: 0.06581711769104004\n", + "solve_kpoint (1.78387,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 11 iterations.\n", + "freqs:, 19, 1.78387, 0, 0, 1.78387, 0.799526, 0.827589, 1.00034, 1.11654\n", + "elapsed time for k point: 0.06593608856201172\n", + "solve_kpoint (1.87742,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 10 iterations.\n", + "freqs:, 20, 1.87742, 0, 0, 1.87742, 0.81965, 0.847578, 1.02116, 1.13857\n", + "elapsed time for k point: 0.06191587448120117\n", + "solve_kpoint (1.97097,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 10 iterations.\n", + "freqs:, 21, 1.97097, 0, 0, 1.97097, 0.840077, 0.867771, 1.04203, 1.15923\n", + "elapsed time for k point: 0.06505203247070312\n", + "solve_kpoint (2.06452,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 10 iterations.\n", + "freqs:, 22, 2.06452, 0, 0, 2.06452, 0.8608, 0.888182, 1.06295, 1.17897\n", + "elapsed time for k point: 0.061644792556762695\n", + "solve_kpoint (2.15806,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 9 iterations.\n", + "freqs:, 23, 2.15806, 0, 0, 2.15806, 0.881807, 0.908821, 1.08394, 1.19812\n", + "elapsed time for k point: 0.05744528770446777\n", + "solve_kpoint (2.25161,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 9 iterations.\n", + "freqs:, 24, 2.25161, 0, 0, 2.25161, 0.903085, 0.929689, 1.10502, 1.21689\n", + "elapsed time for k point: 0.05728340148925781\n", + "solve_kpoint (2.34516,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 9 iterations.\n", + "freqs:, 25, 2.34516, 0, 0, 2.34516, 0.924621, 0.950785, 1.12618, 1.23544\n", + "elapsed time for k point: 0.060393333435058594\n", + "solve_kpoint (2.43871,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 9 iterations.\n", + "freqs:, 26, 2.43871, 0, 0, 2.43871, 0.946402, 0.972103, 1.14743, 1.25389\n", + "elapsed time for k point: 0.057176828384399414\n", + "solve_kpoint (2.53226,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 9 iterations.\n", + "freqs:, 27, 2.53226, 0, 0, 2.53226, 0.968413, 0.993637, 1.16878, 1.27231\n", + "elapsed time for k point: 0.05736899375915527\n", + "solve_kpoint (2.62581,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 9 iterations.\n", + "freqs:, 28, 2.62581, 0, 0, 2.62581, 0.990643, 1.01538, 1.19021, 1.29076\n", + "elapsed time for k point: 0.05733036994934082\n", + "solve_kpoint (2.71935,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 9 iterations.\n", + "freqs:, 29, 2.71935, 0, 0, 2.71935, 1.01308, 1.03733, 1.21175, 1.3093\n", + "elapsed time for k point: 0.0572965145111084\n", + "solve_kpoint (2.8129,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 89 iterations.\n", + "freqs:, 30, 2.8129, 0, 0, 2.8129, 1.03571, 1.05946, 1.23338, 1.31269\n", + "elapsed time for k point: 0.40296435356140137\n", + "solve_kpoint (2.90645,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 6 iterations.\n", + "freqs:, 31, 2.90645, 0, 0, 2.90645, 1.05852, 1.08179, 1.25511, 1.33173\n", + "elapsed time for k point: 0.04461216926574707\n", + "solve_kpoint (3,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 6 iterations.\n", + "freqs:, 32, 3, 0, 0, 3, 1.0815, 1.10429, 1.27693, 1.35105\n", + "elapsed time for k point: 0.04412245750427246\n", + "Band 1 range: 0.08075820828162611 at Vector3<0.1, 0.0, 0.0> to 1.0814996959234677 at Vector3<3.0, 0.0, 0.0>\n", + "Band 2 range: 0.08557653594456045 at Vector3<0.1, 0.0, 0.0> to 1.1042853219436242 at Vector3<3.0, 0.0, 0.0>\n", + "Band 3 range: 0.31469968133185044 at Vector3<0.1, 0.0, 0.0> to 1.2769288155070349 at Vector3<3.0, 0.0, 0.0>\n", + "Band 4 range: 0.3946748121624943 at Vector3<0.1, 0.0, 0.0> to 1.351049789287694 at Vector3<3.0, 0.0, 0.0>\n", + "total elapsed time for run: 2.7607743740081787\n", + "done\n" + ] + } + ], + "source": [ + "ms.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It solved, great! We can see from the text output lines like :\n", + "\n", + "`solve_kpoint (0.1,0,0):\n", + "Solving for bands 1 to 4...\n", + "Finished solving for bands 1 to 4 after 28 iterations.\n", + "freqs:, 1, 0.1, 0, 0, 0.1, 0.0807582, 0.0855765, 0.3147, 0.394675\n", + "elapsed time for k point: 0.14001059532165527`\n", + "\n", + "This contains our band information. Unfortunately, MPB only keeps in memory one at a time. So we only have access to the last one :" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vector3<3.0, 0.0, 0.0>\n", + "[1.0814996959234677, 1.1042853219436242, 1.2769288155070349, 1.351049789287694]\n" + ] + } + ], + "source": [ + "print(ms.current_k)\n", + "print(ms.freqs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So let's do it again, this time capturing the output :" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture --no-stderr output\n", + "ms.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Initializing eigensolver data',\n", + " 'Computing 4 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 4 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " 'Initializing fields to random numbers...',\n", + " '32 k-points',\n", + " ' Vector3<0.1, 0.0, 0.0>',\n", + " ' Vector3<0.1935483870967742, 0.0, 0.0>',\n", + " ' Vector3<0.2870967741935484, 0.0, 0.0>',\n", + " ' Vector3<0.38064516129032255, 0.0, 0.0>',\n", + " ' Vector3<0.4741935483870968, 0.0, 0.0>',\n", + " ' Vector3<0.567741935483871, 0.0, 0.0>',\n", + " ' Vector3<0.6612903225806451, 0.0, 0.0>',\n", + " ' Vector3<0.7548387096774194, 0.0, 0.0>',\n", + " ' Vector3<0.8483870967741935, 0.0, 0.0>',\n", + " ' Vector3<0.9419354838709677, 0.0, 0.0>',\n", + " ' Vector3<1.035483870967742, 0.0, 0.0>',\n", + " ' Vector3<1.1290322580645162, 0.0, 0.0>',\n", + " ' Vector3<1.2225806451612904, 0.0, 0.0>',\n", + " ' Vector3<1.3161290322580645, 0.0, 0.0>',\n", + " ' Vector3<1.409677419354839, 0.0, 0.0>',\n", + " ' Vector3<1.503225806451613, 0.0, 0.0>',\n", + " ' Vector3<1.5967741935483872, 0.0, 0.0>',\n", + " ' Vector3<1.6903225806451614, 0.0, 0.0>',\n", + " ' Vector3<1.7838709677419355, 0.0, 0.0>',\n", + " ' Vector3<1.87741935483871, 0.0, 0.0>',\n", + " ' Vector3<1.970967741935484, 0.0, 0.0>',\n", + " ' Vector3<2.064516129032258, 0.0, 0.0>',\n", + " ' Vector3<2.1580645161290324, 0.0, 0.0>',\n", + " ' Vector3<2.2516129032258068, 0.0, 0.0>',\n", + " ' Vector3<2.3451612903225807, 0.0, 0.0>',\n", + " ' Vector3<2.438709677419355, 0.0, 0.0>',\n", + " ' Vector3<2.532258064516129, 0.0, 0.0>',\n", + " ' Vector3<2.6258064516129034, 0.0, 0.0>',\n", + " ' Vector3<2.7193548387096778, 0.0, 0.0>',\n", + " ' Vector3<2.8129032258064517, 0.0, 0.0>',\n", + " ' Vector3<2.906451612903226, 0.0, 0.0>',\n", + " ' Vector3<3.0, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.010184764862060547',\n", + " 'solve_kpoint (0.1,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 27 iterations.',\n", + " 'freqs:, 1, 0.1, 0, 0, 0.1, 0.0807582, 0.0855765, 0.3147, 0.394675',\n", + " 'elapsed time for k point: 0.12482213973999023',\n", + " 'solve_kpoint (0.193548,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 15 iterations.',\n", + " 'freqs:, 2, 0.193548, 0, 0, 0.193548, 0.155365, 0.16422, 0.341458, 0.410987',\n", + " 'elapsed time for k point: 0.07110595703125',\n", + " 'solve_kpoint (0.287097,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 14 iterations.',\n", + " 'freqs:, 3, 0.287097, 0, 0, 0.287097, 0.228276, 0.240091, 0.381337, 0.436147',\n", + " 'elapsed time for k point: 0.06656813621520996',\n", + " 'solve_kpoint (0.380645,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 14 iterations.',\n", + " 'freqs:, 4, 0.380645, 0, 0, 0.380645, 0.298937, 0.311941, 0.430273, 0.467754',\n", + " 'elapsed time for k point: 0.06655502319335938',\n", + " 'solve_kpoint (0.474194,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 14 iterations.',\n", + " 'freqs:, 5, 0.474194, 0, 0, 0.474194, 0.367072, 0.379151, 0.483705, 0.502991',\n", + " 'elapsed time for k point: 0.06666064262390137',\n", + " 'solve_kpoint (0.567742,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 16 iterations.',\n", + " 'freqs:, 6, 0.567742, 0, 0, 0.567742, 0.432542, 0.441894, 0.536768, 0.538894',\n", + " 'elapsed time for k point: 0.07534289360046387',\n", + " 'solve_kpoint (0.66129,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 16 iterations.',\n", + " 'freqs:, 7, 0.66129, 0, 0, 0.66129, 0.494782, 0.500315, 0.573355, 0.58507',\n", + " 'elapsed time for k point: 0.07526564598083496',\n", + " 'solve_kpoint (0.754839,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 15 iterations.',\n", + " 'freqs:, 8, 0.754839, 0, 0, 0.754839, 0.551001, 0.553305, 0.608206, 0.629108',\n", + " 'elapsed time for k point: 0.07287859916687012',\n", + " 'solve_kpoint (0.848387,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 15 iterations.',\n", + " 'freqs:, 9, 0.848387, 0, 0, 0.848387, 0.593884, 0.598211, 0.651795, 0.674567',\n", + " 'elapsed time for k point: 0.06881570816040039',\n", + " 'solve_kpoint (0.941935,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 14 iterations.',\n", + " 'freqs:, 10, 0.941935, 0, 0, 0.941935, 0.622664, 0.633694, 0.706501, 0.725007',\n", + " 'elapsed time for k point: 0.06473851203918457',\n", + " 'solve_kpoint (1.03548,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 14 iterations.',\n", + " 'freqs:, 11, 1.03548, 0, 0, 1.03548, 0.645081, 0.662012, 0.765683, 0.779634',\n", + " 'elapsed time for k point: 0.0645139217376709',\n", + " 'solve_kpoint (1.12903,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 17 iterations.',\n", + " 'freqs:, 12, 1.12903, 0, 0, 1.12903, 0.665138, 0.686152, 0.824909, 0.836268',\n", + " 'elapsed time for k point: 0.07735013961791992',\n", + " 'solve_kpoint (1.22258,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 24 iterations.',\n", + " 'freqs:, 13, 1.22258, 0, 0, 1.22258, 0.684281, 0.708024, 0.869466, 0.892966',\n", + " 'elapsed time for k point: 0.10673928260803223',\n", + " 'solve_kpoint (1.31613,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 17 iterations.',\n", + " 'freqs:, 14, 1.31613, 0, 0, 1.31613, 0.703123, 0.728677, 0.894377, 0.947171',\n", + " 'elapsed time for k point: 0.07732057571411133',\n", + " 'solve_kpoint (1.40968,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 15 iterations.',\n", + " 'freqs:, 15, 1.40968, 0, 0, 1.40968, 0.721964, 0.748699, 0.91638, 0.994817',\n", + " 'elapsed time for k point: 0.06882405281066895',\n", + " 'solve_kpoint (1.50323,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 14 iterations.',\n", + " 'freqs:, 16, 1.50323, 0, 0, 1.50323, 0.740959, 0.768431, 0.937664, 1.03361',\n", + " 'elapsed time for k point: 0.0644369125366211',\n", + " 'solve_kpoint (1.59677,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 13 iterations.',\n", + " 'freqs:, 17, 1.59677, 0, 0, 1.59677, 0.760193, 0.788079, 0.958655, 1.06537',\n", + " 'elapsed time for k point: 0.06036710739135742',\n", + " 'solve_kpoint (1.69032,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 11 iterations.',\n", + " 'freqs:, 18, 1.69032, 0, 0, 1.69032, 0.779709, 0.807772, 0.979518, 1.09248',\n", + " 'elapsed time for k point: 0.05170416831970215',\n", + " 'solve_kpoint (1.78387,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 11 iterations.',\n", + " 'freqs:, 19, 1.78387, 0, 0, 1.78387, 0.799526, 0.827589, 1.00034, 1.11654',\n", + " 'elapsed time for k point: 0.051616668701171875',\n", + " 'solve_kpoint (1.87742,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 10 iterations.',\n", + " 'freqs:, 20, 1.87742, 0, 0, 1.87742, 0.81965, 0.847578, 1.02116, 1.13857',\n", + " 'elapsed time for k point: 0.04729151725769043',\n", + " 'solve_kpoint (1.97097,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 10 iterations.',\n", + " 'freqs:, 21, 1.97097, 0, 0, 1.97097, 0.840077, 0.867771, 1.04203, 1.15923',\n", + " 'elapsed time for k point: 0.047316789627075195',\n", + " 'solve_kpoint (2.06452,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 10 iterations.',\n", + " 'freqs:, 22, 2.06452, 0, 0, 2.06452, 0.8608, 0.888182, 1.06295, 1.17897',\n", + " 'elapsed time for k point: 0.04728507995605469',\n", + " 'solve_kpoint (2.15806,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 9 iterations.',\n", + " 'freqs:, 23, 2.15806, 0, 0, 2.15806, 0.881807, 0.908821, 1.08394, 1.19812',\n", + " 'elapsed time for k point: 0.04306530952453613',\n", + " 'solve_kpoint (2.25161,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 9 iterations.',\n", + " 'freqs:, 24, 2.25161, 0, 0, 2.25161, 0.903085, 0.929689, 1.10502, 1.21689',\n", + " 'elapsed time for k point: 0.04363417625427246',\n", + " 'solve_kpoint (2.34516,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 9 iterations.',\n", + " 'freqs:, 25, 2.34516, 0, 0, 2.34516, 0.924621, 0.950785, 1.12618, 1.23544',\n", + " 'elapsed time for k point: 0.04438018798828125',\n", + " 'solve_kpoint (2.43871,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 9 iterations.',\n", + " 'freqs:, 26, 2.43871, 0, 0, 2.43871, 0.946402, 0.972103, 1.14743, 1.25389',\n", + " 'elapsed time for k point: 0.04436993598937988',\n", + " 'solve_kpoint (2.53226,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 9 iterations.',\n", + " 'freqs:, 27, 2.53226, 0, 0, 2.53226, 0.968413, 0.993637, 1.16878, 1.27231',\n", + " 'elapsed time for k point: 0.04305839538574219',\n", + " 'solve_kpoint (2.62581,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 9 iterations.',\n", + " 'freqs:, 28, 2.62581, 0, 0, 2.62581, 0.990643, 1.01538, 1.19021, 1.29076',\n", + " 'elapsed time for k point: 0.04314303398132324',\n", + " 'solve_kpoint (2.71935,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 9 iterations.',\n", + " 'freqs:, 29, 2.71935, 0, 0, 2.71935, 1.01308, 1.03733, 1.21175, 1.3093',\n", + " 'elapsed time for k point: 0.043036460876464844',\n", + " 'solve_kpoint (2.8129,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 89 iterations.',\n", + " 'freqs:, 30, 2.8129, 0, 0, 2.8129, 1.03571, 1.05946, 1.23338, 1.31269',\n", + " 'elapsed time for k point: 0.3859236240386963',\n", + " 'solve_kpoint (2.90645,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 6 iterations.',\n", + " 'freqs:, 31, 2.90645, 0, 0, 2.90645, 1.05852, 1.08179, 1.25511, 1.33173',\n", + " 'elapsed time for k point: 0.03020763397216797',\n", + " 'solve_kpoint (3,0,0):',\n", + " 'Solving for bands 1 to 4...',\n", + " 'Finished solving for bands 1 to 4 after 6 iterations.',\n", + " 'freqs:, 32, 3, 0, 0, 3, 1.0815, 1.10429, 1.27693, 1.35105',\n", + " 'elapsed time for k point: 0.030241727828979492',\n", + " 'Band 1 range: 0.08075820708714998 at Vector3<0.1, 0.0, 0.0> to 1.0814996959234677 at Vector3<3.0, 0.0, 0.0>',\n", + " 'Band 2 range: 0.08557653659868339 at Vector3<0.1, 0.0, 0.0> to 1.1042853219436248 at Vector3<3.0, 0.0, 0.0>',\n", + " 'Band 3 range: 0.3146996824185554 at Vector3<0.1, 0.0, 0.0> to 1.2769288155070335 at Vector3<3.0, 0.0, 0.0>',\n", + " 'Band 4 range: 0.3946747992334725 at Vector3<0.1, 0.0, 0.0> to 1.3510497892876934 at Vector3<3.0, 0.0, 0.0>',\n", + " 'total elapsed time for run: 2.2840616703033447',\n", + " 'done',\n", + " '']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output_text = output.stdout\n", + "output_text.split('\\n')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analyzing the results\n", + "\n", + "Let's parse every line that begins with 'freqs :' in the output.\n", + "\n", + "Notice the lines all have the same syntax `'freqs:, 22, 2, 0, 0, 2, 0.846477, 0.874081, 1.04852, 1.16543',`\n", + "\n", + "i.e. for all the lines that start by 'freqs:' contains all the information we need in the form `freqs:, k index, kx, ky, kz, kmag/2pi, band 1, band 2, band 3, band 4, band 5, band 6, band 7, band 8 ...`. Python's `split` function and treating strings as arrays (slicing and indexing) is handy :" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "freqs:, 1, 0.1, 0, 0, 0.1, 0.0807582, 0.0855765, 0.3147, 0.394675\n", + "['freqs:', '1', '0.1', '0', '0', '0.1', '0.0807582', '0.0855765', '0.3147', '0.394675']\n", + "freqs:, 2, 0.193548, 0, 0, 0.193548, 0.155365, 0.16422, 0.341458, 0.410987\n", + "['freqs:', '2', '0.193548', '0', '0', '0.193548', '0.155365', '0.16422', '0.341458', '0.410987']\n", + "freqs:, 3, 0.287097, 0, 0, 0.287097, 0.228276, 0.240091, 0.381337, 0.436147\n", + "['freqs:', '3', '0.287097', '0', '0', '0.287097', '0.228276', '0.240091', '0.381337', '0.436147']\n", + "freqs:, 4, 0.380645, 0, 0, 0.380645, 0.298937, 0.311941, 0.430273, 0.467754\n", + "['freqs:', '4', '0.380645', '0', '0', '0.380645', '0.298937', '0.311941', '0.430273', '0.467754']\n", + "freqs:, 5, 0.474194, 0, 0, 0.474194, 0.367072, 0.379151, 0.483705, 0.502991\n", + "['freqs:', '5', '0.474194', '0', '0', '0.474194', '0.367072', '0.379151', '0.483705', '0.502991']\n", + "freqs:, 6, 0.567742, 0, 0, 0.567742, 0.432542, 0.441894, 0.536768, 0.538894\n", + "['freqs:', '6', '0.567742', '0', '0', '0.567742', '0.432542', '0.441894', '0.536768', '0.538894']\n", + "freqs:, 7, 0.66129, 0, 0, 0.66129, 0.494782, 0.500315, 0.573355, 0.58507\n", + "['freqs:', '7', '0.66129', '0', '0', '0.66129', '0.494782', '0.500315', '0.573355', '0.58507']\n", + "freqs:, 8, 0.754839, 0, 0, 0.754839, 0.551001, 0.553305, 0.608206, 0.629108\n", + "['freqs:', '8', '0.754839', '0', '0', '0.754839', '0.551001', '0.553305', '0.608206', '0.629108']\n", + "freqs:, 9, 0.848387, 0, 0, 0.848387, 0.593884, 0.598211, 0.651795, 0.674567\n", + "['freqs:', '9', '0.848387', '0', '0', '0.848387', '0.593884', '0.598211', '0.651795', '0.674567']\n", + "freqs:, 10, 0.941935, 0, 0, 0.941935, 0.622664, 0.633694, 0.706501, 0.725007\n", + "['freqs:', '10', '0.941935', '0', '0', '0.941935', '0.622664', '0.633694', '0.706501', '0.725007']\n", + "freqs:, 11, 1.03548, 0, 0, 1.03548, 0.645081, 0.662012, 0.765683, 0.779634\n", + "['freqs:', '11', '1.03548', '0', '0', '1.03548', '0.645081', '0.662012', '0.765683', '0.779634']\n", + "freqs:, 12, 1.12903, 0, 0, 1.12903, 0.665138, 0.686152, 0.824909, 0.836268\n", + "['freqs:', '12', '1.12903', '0', '0', '1.12903', '0.665138', '0.686152', '0.824909', '0.836268']\n", + "freqs:, 13, 1.22258, 0, 0, 1.22258, 0.684281, 0.708024, 0.869466, 0.892966\n", + "['freqs:', '13', '1.22258', '0', '0', '1.22258', '0.684281', '0.708024', '0.869466', '0.892966']\n", + "freqs:, 14, 1.31613, 0, 0, 1.31613, 0.703123, 0.728677, 0.894377, 0.947171\n", + "['freqs:', '14', '1.31613', '0', '0', '1.31613', '0.703123', '0.728677', '0.894377', '0.947171']\n", + "freqs:, 15, 1.40968, 0, 0, 1.40968, 0.721964, 0.748699, 0.91638, 0.994817\n", + "['freqs:', '15', '1.40968', '0', '0', '1.40968', '0.721964', '0.748699', '0.91638', '0.994817']\n", + "freqs:, 16, 1.50323, 0, 0, 1.50323, 0.740959, 0.768431, 0.937664, 1.03361\n", + "['freqs:', '16', '1.50323', '0', '0', '1.50323', '0.740959', '0.768431', '0.937664', '1.03361']\n", + "freqs:, 17, 1.59677, 0, 0, 1.59677, 0.760193, 0.788079, 0.958655, 1.06537\n", + "['freqs:', '17', '1.59677', '0', '0', '1.59677', '0.760193', '0.788079', '0.958655', '1.06537']\n", + "freqs:, 18, 1.69032, 0, 0, 1.69032, 0.779709, 0.807772, 0.979518, 1.09248\n", + "['freqs:', '18', '1.69032', '0', '0', '1.69032', '0.779709', '0.807772', '0.979518', '1.09248']\n", + "freqs:, 19, 1.78387, 0, 0, 1.78387, 0.799526, 0.827589, 1.00034, 1.11654\n", + "['freqs:', '19', '1.78387', '0', '0', '1.78387', '0.799526', '0.827589', '1.00034', '1.11654']\n", + "freqs:, 20, 1.87742, 0, 0, 1.87742, 0.81965, 0.847578, 1.02116, 1.13857\n", + "['freqs:', '20', '1.87742', '0', '0', '1.87742', '0.81965', '0.847578', '1.02116', '1.13857']\n", + "freqs:, 21, 1.97097, 0, 0, 1.97097, 0.840077, 0.867771, 1.04203, 1.15923\n", + "['freqs:', '21', '1.97097', '0', '0', '1.97097', '0.840077', '0.867771', '1.04203', '1.15923']\n", + "freqs:, 22, 2.06452, 0, 0, 2.06452, 0.8608, 0.888182, 1.06295, 1.17897\n", + "['freqs:', '22', '2.06452', '0', '0', '2.06452', '0.8608', '0.888182', '1.06295', '1.17897']\n", + "freqs:, 23, 2.15806, 0, 0, 2.15806, 0.881807, 0.908821, 1.08394, 1.19812\n", + "['freqs:', '23', '2.15806', '0', '0', '2.15806', '0.881807', '0.908821', '1.08394', '1.19812']\n", + "freqs:, 24, 2.25161, 0, 0, 2.25161, 0.903085, 0.929689, 1.10502, 1.21689\n", + "['freqs:', '24', '2.25161', '0', '0', '2.25161', '0.903085', '0.929689', '1.10502', '1.21689']\n", + "freqs:, 25, 2.34516, 0, 0, 2.34516, 0.924621, 0.950785, 1.12618, 1.23544\n", + "['freqs:', '25', '2.34516', '0', '0', '2.34516', '0.924621', '0.950785', '1.12618', '1.23544']\n", + "freqs:, 26, 2.43871, 0, 0, 2.43871, 0.946402, 0.972103, 1.14743, 1.25389\n", + "['freqs:', '26', '2.43871', '0', '0', '2.43871', '0.946402', '0.972103', '1.14743', '1.25389']\n", + "freqs:, 27, 2.53226, 0, 0, 2.53226, 0.968413, 0.993637, 1.16878, 1.27231\n", + "['freqs:', '27', '2.53226', '0', '0', '2.53226', '0.968413', '0.993637', '1.16878', '1.27231']\n", + "freqs:, 28, 2.62581, 0, 0, 2.62581, 0.990643, 1.01538, 1.19021, 1.29076\n", + "['freqs:', '28', '2.62581', '0', '0', '2.62581', '0.990643', '1.01538', '1.19021', '1.29076']\n", + "freqs:, 29, 2.71935, 0, 0, 2.71935, 1.01308, 1.03733, 1.21175, 1.3093\n", + "['freqs:', '29', '2.71935', '0', '0', '2.71935', '1.01308', '1.03733', '1.21175', '1.3093']\n", + "freqs:, 30, 2.8129, 0, 0, 2.8129, 1.03571, 1.05946, 1.23338, 1.31269\n", + "['freqs:', '30', '2.8129', '0', '0', '2.8129', '1.03571', '1.05946', '1.23338', '1.31269']\n", + "freqs:, 31, 2.90645, 0, 0, 2.90645, 1.05852, 1.08179, 1.25511, 1.33173\n", + "['freqs:', '31', '2.90645', '0', '0', '2.90645', '1.05852', '1.08179', '1.25511', '1.33173']\n", + "freqs:, 32, 3, 0, 0, 3, 1.0815, 1.10429, 1.27693, 1.35105\n", + "['freqs:', '32', '3', '0', '0', '3', '1.0815', '1.10429', '1.27693', '1.35105']\n" + ] + } + ], + "source": [ + "freqs = []\n", + "ks = []\n", + "line_header = \"freqs:\"\n", + "for ln in output_text.split('\\n'):\n", + " if ln.startswith(line_header):\n", + " print(ln)\n", + " line = ln.split(', ')\n", + " print(line)\n", + " ks.append([line[2], line[3], line[4]])\n", + " freqs.append([line[-4], line[-3], line[-2], line[-1]])\n", + " \n", + "freqs = np.array(freqs, dtype=np.float32)\n", + "ks = np.array(ks, dtype=np.float32)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.0807582 0.0855765 0.3147 0.394675 ]\n", + " [0.155365 0.16422 0.341458 0.410987 ]\n", + " [0.228276 0.240091 0.381337 0.436147 ]\n", + " [0.298937 0.311941 0.430273 0.467754 ]\n", + " [0.367072 0.379151 0.483705 0.502991 ]\n", + " [0.432542 0.441894 0.536768 0.538894 ]\n", + " [0.494782 0.500315 0.573355 0.58507 ]\n", + " [0.551001 0.553305 0.608206 0.629108 ]\n", + " [0.593884 0.598211 0.651795 0.674567 ]\n", + " [0.622664 0.633694 0.706501 0.725007 ]\n", + " [0.645081 0.662012 0.765683 0.779634 ]\n", + " [0.665138 0.686152 0.824909 0.836268 ]\n", + " [0.684281 0.708024 0.869466 0.892966 ]\n", + " [0.703123 0.728677 0.894377 0.947171 ]\n", + " [0.721964 0.748699 0.91638 0.994817 ]\n", + " [0.740959 0.768431 0.937664 1.03361 ]\n", + " [0.760193 0.788079 0.958655 1.06537 ]\n", + " [0.779709 0.807772 0.979518 1.09248 ]\n", + " [0.799526 0.827589 1.00034 1.11654 ]\n", + " [0.81965 0.847578 1.02116 1.13857 ]\n", + " [0.840077 0.867771 1.04203 1.15923 ]\n", + " [0.8608 0.888182 1.06295 1.17897 ]\n", + " [0.881807 0.908821 1.08394 1.19812 ]\n", + " [0.903085 0.929689 1.10502 1.21689 ]\n", + " [0.924621 0.950785 1.12618 1.23544 ]\n", + " [0.946402 0.972103 1.14743 1.25389 ]\n", + " [0.968413 0.993637 1.16878 1.27231 ]\n", + " [0.990643 1.01538 1.19021 1.29076 ]\n", + " [1.01308 1.03733 1.21175 1.3093 ]\n", + " [1.03571 1.05946 1.23338 1.31269 ]\n", + " [1.05852 1.08179 1.25511 1.33173 ]\n", + " [1.0815 1.10429 1.27693 1.35105 ]]\n", + "[[0.1 0. 0. ]\n", + " [0.193548 0. 0. ]\n", + " [0.287097 0. 0. ]\n", + " [0.380645 0. 0. ]\n", + " [0.474194 0. 0. ]\n", + " [0.567742 0. 0. ]\n", + " [0.66129 0. 0. ]\n", + " [0.754839 0. 0. ]\n", + " [0.848387 0. 0. ]\n", + " [0.941935 0. 0. ]\n", + " [1.03548 0. 0. ]\n", + " [1.12903 0. 0. ]\n", + " [1.22258 0. 0. ]\n", + " [1.31613 0. 0. ]\n", + " [1.40968 0. 0. ]\n", + " [1.50323 0. 0. ]\n", + " [1.59677 0. 0. ]\n", + " [1.69032 0. 0. ]\n", + " [1.78387 0. 0. ]\n", + " [1.87742 0. 0. ]\n", + " [1.97097 0. 0. ]\n", + " [2.06452 0. 0. ]\n", + " [2.15806 0. 0. ]\n", + " [2.25161 0. 0. ]\n", + " [2.34516 0. 0. ]\n", + " [2.43871 0. 0. ]\n", + " [2.53226 0. 0. ]\n", + " [2.62581 0. 0. ]\n", + " [2.71935 0. 0. ]\n", + " [2.8129 0. 0. ]\n", + " [2.90645 0. 0. ]\n", + " [3. 0. 0. ]]\n" + ] + } + ], + "source": [ + "print(freqs)\n", + "print(ks)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now plot. Let's add the lightline too :" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "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()\n", + "\n", + "ax.plot(ks[:,0], freqs)\n", + "ax.plot(ks[:,0], ks[:,0]/1.45, 'k-', linewidth=3, label='SiO2')\n", + "ax.plot(ks[:,0], ks[:,0]/1, '-', color='gray', linewidth=3, label='Air')\n", + "ax.set_xlabel('$k_x$')\n", + "ax.set_ylabel('$\\omega$')\n", + "ax.set_xlim([0,3])\n", + "ax.set_ylim([0,2])\n", + "ax.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But wait! This doesn't look like above! It seems to be multimode at $\\omega = 1/1.55 \\approx 0.65 \\rightarrow \\lambda = 1.55\\mu m$. What's wrong?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting field profiles\n", + "\n", + "Let's look at the modes at a given frequency, say $1.55\\mu$m. We can proceed inversely : `ms.run()` computes $\\omega(k)$, while `ms.find_k` computes $k(\\omega)$. Here, we will also pass a mpb function to the `run()` function, which will output h5 files." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture --no-stderr output\n", + "\n", + "f_mode = 1/1.55 # frequency corresponding to 1.55 um \n", + "band_min = 1\n", + "band_max = 3\n", + "kdir = mp.Vector3(1)\n", + "tol = 1e-6\n", + "kmag_guess = f_mode*3.45\n", + "kmag_min = f_mode*0.1\n", + "kmag_max = f_mode*4.0\n", + "\n", + "ms.find_k(mp.NO_PARITY, f_mode, band_min, band_max, kdir, tol, kmag_guess,\n", + " kmag_min, kmag_max, mpb.output_poynting_x)\n", + "output_text = output.stdout" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Initializing fields to random numbers...',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<2.2258064516129035, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.009303092956542969',\n", + " 'solve_kpoint (2.22581,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 21 iterations.',\n", + " 'freqs:, 1, 2.22581, 0, 0, 2.22581, 0.897189, 0.92391, 1.0992',\n", + " 'elapsed time for k point: 0.0725851058959961',\n", + " 'total elapsed time for run: 0.0819387435913086',\n", + " 'done',\n", + " 'find-k 3 at 2.2258064516129035: 0.4540348722818329',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.21213954322627115, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.009177207946777344',\n", + " 'solve_kpoint (0.21214,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 24 iterations.',\n", + " 'freqs:, 1, 0.21214, 0, 0, 0.21214, 0.170011, 0.179563, 0.348462',\n", + " 'elapsed time for k point: 0.07856035232543945',\n", + " 'total elapsed time for run: 0.08778166770935059',\n", + " 'done',\n", + " 'find-k 3 at 0.21213954322627115: -0.2966993363935748',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.9725819623426234, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008322715759277344',\n", + " 'solve_kpoint (0.972582,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 27 iterations.',\n", + " 'freqs:, 1, 0.972582, 0, 0, 0.972582, 0.630428, 0.643598, 0.742551',\n", + " 'elapsed time for k point: 0.087799072265625',\n", + " 'total elapsed time for run: 0.09616661071777344',\n", + " 'done',\n", + " 'find-k 3 at 0.9725819623426234: 0.09738967790588693',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.8043880162376597, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008353471755981445',\n", + " 'solve_kpoint (0.804388,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 84 iterations.',\n", + " 'freqs:, 1, 0.804388, 0, 0, 0.804388, 0.575824, 0.578269, 0.62965',\n", + " 'elapsed time for k point: 0.2601139545440674',\n", + " 'total elapsed time for run: 0.2685117721557617',\n", + " 'done',\n", + " 'find-k 3 at 0.8043880162376597: -0.015511662568443274',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.8374682198713483, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.00809478759765625',\n", + " 'solve_kpoint (0.837468,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 10 iterations.',\n", + " 'freqs:, 1, 0.837468, 0, 0, 0.837468, 0.589744, 0.593465, 0.646025',\n", + " 'elapsed time for k point: 0.03367042541503906',\n", + " 'total elapsed time for run: 0.041808366775512695',\n", + " 'done',\n", + " 'find-k 3 at 0.8374682198713483: 0.0008633584342160328',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.8358096698465939, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008076906204223633',\n", + " 'solve_kpoint (0.83581,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 5 iterations.',\n", + " 'freqs:, 1, 0.83581, 0, 0, 0.83581, 0.589096, 0.592733, 0.645163',\n", + " 'elapsed time for k point: 0.018621444702148438',\n", + " 'total elapsed time for run: 0.02674126625061035',\n", + " 'done',\n", + " 'find-k 3 at 0.8358096698465939: 2.025486580570224e-06',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.8358057603623551, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008080482482910156',\n", + " 'solve_kpoint (0.835806,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 1 iterations.',\n", + " 'freqs:, 1, 0.835806, 0, 0, 0.835806, 0.589095, 0.592731, 0.645161',\n", + " 'elapsed time for k point: 0.006573200225830078',\n", + " 'total elapsed time for run: 0.014696836471557617',\n", + " 'done',\n", + " 'find-k 3 at 0.8358057603623551: -1.0726994847942706e-09',\n", + " 'find-k 2 at 0.8358057603623551: -0.052430469959551806 (cached)',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 2 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 2 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Allocating fields...',\n", + " 'Solving for band polarization: .',\n", + " 'Initializing fields to random numbers...',\n", + " '1 k-points',\n", + " ' Vector3<0.9542668883548844, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.009068489074707031',\n", + " 'solve_kpoint (0.954267,0,0):',\n", + " 'Solving for bands 1 to 2...',\n", + " 'Finished solving for bands 1 to 2 after 20 iterations.',\n", + " 'freqs:, 1, 0.954267, 0, 0, 0.954267, 0.625852, 0.637765',\n", + " 'elapsed time for k point: 0.04419517517089844',\n", + " 'total elapsed time for run: 0.05330491065979004',\n", + " 'done',\n", + " 'find-k 2 at 0.9542668883548844: -0.007396453669743841',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 2 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 2 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.9770046968663186, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008069992065429688',\n", + " 'solve_kpoint (0.977005,0,0):',\n", + " 'Solving for bands 1 to 2...',\n", + " 'Finished solving for bands 1 to 2 after 9 iterations.',\n", + " 'freqs:, 1, 0.977005, 0, 0, 0.977005, 0.631507, 0.644971',\n", + " 'elapsed time for k point: 0.02140355110168457',\n", + " 'total elapsed time for run: 0.029523611068725586',\n", + " 'done',\n", + " 'find-k 2 at 0.9770046968663186: -0.00019071591336017324',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 2 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 2 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<0.9776221246995823, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008052587509155273',\n", + " 'solve_kpoint (0.977622,0,0):',\n", + " 'Solving for bands 1 to 2...',\n", + " 'Finished solving for bands 1 to 2 after 3 iterations.',\n", + " 'freqs:, 1, 0.977622, 0, 0, 0.977622, 0.631657, 0.645161',\n", + " 'elapsed time for k point: 0.009009599685668945',\n", + " 'total elapsed time for run: 0.017103910446166992',\n", + " 'done',\n", + " 'find-k 2 at 0.9776221246995823: -1.0805440386896237e-07',\n", + " 'find-k 1 at 2.2258064516129035: 0.2520273744464778 (cached)',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 1 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 1 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Allocating fields...',\n", + " 'Solving for band polarization: .',\n", + " 'Initializing fields to random numbers...',\n", + " '1 k-points',\n", + " ' Vector3<1.1208807925685298, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008707523345947266',\n", + " 'solve_kpoint (1.12088,0,0):',\n", + " 'Solving for bands 1 to 1...',\n", + " 'Finished solving for bands 1 to 1 after 26 iterations.',\n", + " 'freqs:, 1, 1.12088, 0, 0, 1.12088, 0.663439',\n", + " 'elapsed time for k point: 0.03162527084350586',\n", + " 'total elapsed time for run: 0.04037308692932129',\n", + " 'done',\n", + " 'find-k 1 at 1.1208807925685298: 0.018277694303210357',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 1 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 1 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<1.033340713793474, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008080244064331055',\n", + " 'solve_kpoint (1.03334,0,0):',\n", + " 'Solving for bands 1 to 1...',\n", + " 'Finished solving for bands 1 to 1 after 8 iterations.',\n", + " 'freqs:, 1, 1.03334, 0, 0, 1.03334, 0.644602',\n", + " 'elapsed time for k point: 0.011093616485595703',\n", + " 'total elapsed time for run: 0.019220352172851562',\n", + " 'done',\n", + " 'find-k 1 at 1.033340713793474: -0.0005593727467398946',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 1 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 1 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<1.0358414573843637, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008075475692749023',\n", + " 'solve_kpoint (1.03584,0,0):',\n", + " 'Solving for bands 1 to 1...',\n", + " 'Finished solving for bands 1 to 1 after 4 iterations.',\n", + " 'freqs:, 1, 1.03584, 0, 0, 1.03584, 0.645161',\n", + " 'elapsed time for k point: 0.006491184234619141',\n", + " 'total elapsed time for run: 0.01460719108581543',\n", + " 'done',\n", + " 'find-k 1 at 1.0358414573843637: -7.891137594473463e-07',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 1 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 1 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<1.0358449950358957, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008066892623901367',\n", + " 'solve_kpoint (1.03584,0,0):',\n", + " 'Solving for bands 1 to 1...',\n", + " 'Finished solving for bands 1 to 1 after 1 iterations.',\n", + " 'freqs:, 1, 1.03584, 0, 0, 1.03584, 0.645161',\n", + " 'elapsed time for k point: 0.003102540969848633',\n", + " 'total elapsed time for run: 0.01120901107788086',\n", + " 'done',\n", + " 'find-k 1 at 1.0358449950358957: -4.954723298311592e-09',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 1 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 1 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Solving for band polarization: .',\n", + " '1 k-points',\n", + " ' Vector3<1.0358450172484495, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.008098363876342773',\n", + " 'solve_kpoint (1.03585,0,0):',\n", + " 'Solving for bands 1 to 1...',\n", + " 'Finished solving for bands 1 to 1 after 1 iterations.',\n", + " 'freqs:, 1, 1.03585, 0, 0, 1.03585, 0.645161',\n", + " 'elapsed time for k point: 0.0030837059020996094',\n", + " 'Outputting fields to flux.v.k01.b01.x.h5...',\n", + " 'total elapsed time for run: 0.12282705307006836',\n", + " 'done',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 2 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 2 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Allocating fields...',\n", + " 'Solving for band polarization: .',\n", + " 'Initializing fields to random numbers...',\n", + " '1 k-points',\n", + " ' Vector3<0.9776224749130994, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.00921487808227539',\n", + " 'solve_kpoint (0.977622,0,0):',\n", + " 'Solving for bands 1 to 2...',\n", + " 'Finished solving for bands 1 to 2 after 18 iterations.',\n", + " 'freqs:, 1, 0.977622, 0, 0, 0.977622, 0.631657, 0.645161',\n", + " 'elapsed time for k point: 0.040230512619018555',\n", + " 'Outputting fields to flux.v.k01.b02.x.h5...',\n", + " 'total elapsed time for run: 0.16179871559143066',\n", + " 'done',\n", + " 'Initializing eigensolver data',\n", + " 'Computing 3 bands with 1e-07 tolerance',\n", + " 'Working in 3 dimensions.',\n", + " 'Grid size is 1 x 64 x 64.',\n", + " 'Solving for 3 bands at a time.',\n", + " 'Creating Maxwell data...',\n", + " 'Mesh size is 3.',\n", + " 'Lattice vectors:',\n", + " ' (1, 0, 0)',\n", + " ' (0, 2, 0)',\n", + " ' (0, 0, 2)',\n", + " 'Cell volume = 4',\n", + " 'Reciprocal lattice vectors (/ 2 pi):',\n", + " ' (1, -0, 0)',\n", + " ' (-0, 0.5, -0)',\n", + " ' (0, -0, 0.5)',\n", + " 'Geometric objects:',\n", + " ' block, center = (0,0,0.5625)',\n", + " ' size (1e+20,1e+20,0.875)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " ' block, center = (0,0,0)',\n", + " ' size (1e+20,0.3,0.25)',\n", + " ' axes (1,0,0), (0,1,0), (0,0,1)',\n", + " 'Geometric object tree has depth 2 and 8 object nodes (vs. 2 actual objects)',\n", + " 'Initializing epsilon function...',\n", + " 'Allocating fields...',\n", + " 'Solving for band polarization: .',\n", + " 'Initializing fields to random numbers...',\n", + " '1 k-points',\n", + " ' Vector3<0.8358057624328533, 0.0, 0.0>',\n", + " 'elapsed time for initialization: 0.009448528289794922',\n", + " 'solve_kpoint (0.835806,0,0):',\n", + " 'Solving for bands 1 to 3...',\n", + " 'Finished solving for bands 1 to 3 after 30 iterations.',\n", + " 'freqs:, 1, 0.835806, 0, 0, 0.835806, 0.589095, 0.592731, 0.645161',\n", + " 'elapsed time for k point: 0.09432482719421387',\n", + " 'Outputting fields to flux.v.k01.b03.x.h5...',\n", + " 'total elapsed time for run: 0.2164139747619629',\n", + " 'done',\n", + " 'kvals:, 0.6451612903225806, 1, 3, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0358450172484495, 0.9776224749130994, 0.8358057624328533',\n", + " '']" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output_text = output.stdout\n", + "output_text.split('\\n')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's look at the modes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyMeep", + "language": "python", + "name": "pymeep" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/3-MEEP_simulation.ipynb b/3-MEEP_simulation.ipynb new file mode 100644 index 0000000..31bafbd --- /dev/null +++ b/3-MEEP_simulation.ipynb @@ -0,0 +1,307 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MEEP simulations\n", + "\n", + "We will look again at a waveguide, but in the time-domain. This will introduce concepts important when doing time-domain simulations." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import meep as mp\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from IPython.display import Video" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Simple geometry as before :" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "resolution = 50 # pixels/μm\n", + "cell_size = mp.Vector3(14,14)\n", + "\n", + "w = 1.0 # width of waveguide\n", + "\n", + "geometry = [mp.Block(center=mp.Vector3(),\n", + " size=mp.Vector3(mp.inf,w,mp.inf),\n", + " material=mp.Medium(epsilon=12))]\n", + "\n", + "w = 1.0 # width of waveguide\n", + "\n", + "geometry = [mp.Block(center=mp.Vector3(),\n", + " size=mp.Vector3(mp.inf,w,mp.inf),\n", + " material=mp.Medium(epsilon=12))]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An important difference from MPB is that we would like to avoid periodic boundary conditions. To do so, we can introduce perfectly-matched layers around the simulation region :" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "pml_layers = [mp.PML(thickness=2)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the time-domain, we now need to define a way to excite the electromagnetic fields in the system. The most reliable way to do so is with en eigensource (see https://meep.readthedocs.io/en/latest/Python_Tutorials/Eigenmode_Source/)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "fsrc = 0.15 # frequency of eigenmode or constant-amplitude source\n", + "kx = 0.4 # initial guess for wavevector in x-direction of eigenmode\n", + "bnum = 1 # band number of eigenmode\n", + "\n", + "kpoint = mp.Vector3(kx)\n", + "\n", + "sources = [mp.EigenModeSource(src=mp.GaussianSource(fsrc,fwidth=0.2*fsrc),\n", + " center=mp.Vector3(),\n", + " size=mp.Vector3(y=3*w),\n", + " direction=mp.NO_DIRECTION,\n", + " eig_kpoint=kpoint,\n", + " eig_band=bnum,\n", + " eig_parity=mp.EVEN_Y+mp.ODD_Z,\n", + " eig_match_freq=True)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Defining the simulation object is similar to ModeSolver :" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim = mp.Simulation(cell_size=cell_size,\n", + " resolution=resolution,\n", + " boundary_layers=pml_layers,\n", + " sources=sources,\n", + " geometry=geometry,\n", + " symmetries=[mp.Mirror(mp.Y)])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------\n", + "Initializing structure...\n", + "Halving computational cell along direction y\n", + "time for choose_chunkdivision = 0.000775099 s\n", + "Working in 2D dimensions.\n", + "Computational cell is 14 x 14 x 0 with resolution 50\n", + " block, center = (0,0,0)\n", + " size (1e+20,1,1e+20)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + " dielectric constant epsilon diagonal = (12,12,12)\n", + "time for set_epsilon = 0.380896 s\n", + "-----------\n", + "MPB solved for omega_1(0.4,0,0) = 0.14249 after 9 iters\n", + "MPB solved for omega_1(0.426652,0,0) = 0.149974 after 7 iters\n", + "MPB solved for omega_1(0.426745,0,0) = 0.15 after 4 iters\n", + "MPB solved for omega_1(0.426745,0,0) = 0.15 after 1 iters\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "f = plt.figure(dpi=100)\n", + "sim.plot2D(ax=f.gca())\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Meep progress: 26.400000000000002/100.0 = 26.4% done in 4.0s, 11.2s to go\n", + "on time step 2640 (time=26.4), 0.00151524 s/step\n", + "Meep progress: 53.03/100.0 = 53.0% done in 8.0s, 7.1s to go\n", + "on time step 5303 (time=53.03), 0.00150235 s/step\n", + "Meep progress: 79.71000000000001/100.0 = 79.7% done in 12.0s, 3.1s to go\n", + "on time step 7971 (time=79.71), 0.00149946 s/step\n", + "run 0 finished at t = 100.0 (10000 timesteps)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sim.run(until=100)\n", + "sim.plot2D(output_plane=mp.Volume(center=mp.Vector3(), size=mp.Vector3(10,10)),\n", + " fields=mp.Ez,\n", + " field_parameters={'alpha':0.9})\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "on time step 10000 (time=100), 0.0522457 s/step\n", + "Meep progress: 12.019999999999996/383.3333435058594 = 3.1% done in 4.0s, 123.6s to go\n", + "on time step 12200 (time=122), 0.00181969 s/step\n", + "Meep progress: 34.0/383.3333435058594 = 8.9% done in 8.0s, 82.5s to go\n", + "on time step 14398 (time=143.98), 0.00182029 s/step\n", + "Meep progress: 55.75/383.3333435058594 = 14.5% done in 12.0s, 70.7s to go\n", + "on time step 16550 (time=165.5), 0.00185921 s/step\n", + "Meep progress: 77.5/383.3333435058594 = 20.2% done in 16.0s, 63.3s to go\n", + "on time step 18727 (time=187.27), 0.00183807 s/step\n", + "Meep progress: 99.25999999999999/383.3333435058594 = 25.9% done in 20.0s, 57.3s to go\n", + "on time step 20903 (time=209.03), 0.00183887 s/step\n", + "Meep progress: 121.00999999999999/383.3333435058594 = 31.6% done in 24.0s, 52.1s to go\n", + "on time step 23091 (time=230.91), 0.0018288 s/step\n", + "Meep progress: 142.88/383.3333435058594 = 37.3% done in 28.0s, 47.2s to go\n", + "on time step 25270 (time=252.7), 0.00183615 s/step\n", + "Meep progress: 164.62/383.3333435058594 = 42.9% done in 32.0s, 42.6s to go\n", + "on time step 27443 (time=274.43), 0.001841 s/step\n", + "Meep progress: 186.42000000000002/383.3333435058594 = 48.6% done in 36.0s, 38.1s to go\n", + "on time step 29621 (time=296.21), 0.001837 s/step\n", + "Meep progress: 208.01999999999998/383.3333435058594 = 54.3% done in 40.0s, 33.7s to go\n", + "on time step 31800 (time=318), 0.00184671 s/step\n", + "Meep progress: 229.79000000000002/383.3333435058594 = 59.9% done in 44.0s, 29.4s to go\n", + "on time step 33981 (time=339.81), 0.00183427 s/step\n", + "Meep progress: 251.70999999999998/383.3333435058594 = 65.7% done in 48.0s, 25.1s to go\n", + "on time step 36175 (time=361.75), 0.00182335 s/step\n", + "Meep progress: 273.6/383.3333435058594 = 71.4% done in 52.0s, 20.9s to go\n", + "Normalizing field data...\n", + "run 1 finished at t = 383.34000000000003 (38334 timesteps)\n" + ] + } + ], + "source": [ + "f = plt.figure(dpi=100)\n", + "animate = mp.Animate2D(sim,mp.Ez,f=f,normalize=True)\n", + "sim.run(mp.at_every(1,animate),until_after_sources=50)\n", + "plt.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating MP4...\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filename = 'media/oblique-source-normal.mp4'\n", + "animate.to_mp4(10,filename)\n", + "Video(filename)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyMeep", + "language": "python", + "name": "pymeep" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/4-MEEP_S_parameters.ipynb b/4-MEEP_S_parameters.ipynb new file mode 100644 index 0000000..0531737 --- /dev/null +++ b/4-MEEP_S_parameters.ipynb @@ -0,0 +1,32 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyMeep", + "language": "python", + "name": "pymeep" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/5-complex_geometries.ipynb b/5-complex_geometries.ipynb new file mode 100644 index 0000000..4e17387 --- /dev/null +++ b/5-complex_geometries.ipynb @@ -0,0 +1,127 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GDS geometries and MEEP\n", + "\n", + "Last week you were introduced to zeropdk, a way to create GDS masks. Today I will use zeropdk to define a complex geometry that we can then import into MEEP." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pya\n", + "\n", + "layout = pya.Layout()\n", + "dbu = layout.dbu = 0.001\n", + "TOP = layout.create_cell(\"TOP\")\n", + "\n", + "origin = pya.DPoint(0, 0)\n", + "ex = pya.DVector(1, 0)\n", + "ey = pya.DVector(0, 1)\n", + "\n", + "MZI_Broadband_DC(\"test\").place_cell(TOP, origin)\n", + "print(\"Wrote to demo2_output.gds\")\n", + "layout.write(\"demo2_output.gds\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res = 50 # pixels/μm\n", + "d = 0.12 # branch separation\n", + "\n", + "gdsII_file = 'coupler.gds'\n", + "CELL_LAYER = 0\n", + "PORT1_LAYER = 1\n", + "PORT2_LAYER = 2\n", + "PORT3_LAYER = 3\n", + "PORT4_LAYER = 4\n", + "SOURCE_LAYER = 5\n", + "UPPER_BRANCH_LAYER = 31\n", + "LOWER_BRANCH_LAYER = 32\n", + "default_d = 0.3\n", + "\n", + "t_oxide = 1.0\n", + "t_Si = 0.22\n", + "t_air = 0.78\n", + "\n", + "dpml = 1\n", + "cell_thickness = dpml+t_oxide+t_Si+t_air+dpml\n", + "si_zmin = 0\n", + "\n", + "oxide = mp.Medium(epsilon=2.25)\n", + "silicon=mp.Medium(epsilon=12)\n", + "\n", + "lcen = 1.55\n", + "fcen = 1/lcen\n", + "df = 0.2*fcen\n", + "\n", + "# read cell size, volumes for source region and flux monitors,\n", + "# and coupler geometry from GDSII file\n", + "upper_branch = mp.get_GDSII_prisms(silicon, gdsII_file, UPPER_BRANCH_LAYER, si_zmin, si_zmax)\n", + "lower_branch = mp.get_GDSII_prisms(silicon, gdsII_file, LOWER_BRANCH_LAYER, si_zmin, si_zmax)\n", + "\n", + "cell = mp.GDSII_vol(gdsII_file, CELL_LAYER, cell_zmin, cell_zmax)\n", + "p1 = mp.GDSII_vol(gdsII_file, PORT1_LAYER, si_zmin, si_zmax)\n", + "p2 = mp.GDSII_vol(gdsII_file, PORT2_LAYER, si_zmin, si_zmax)\n", + "p3 = mp.GDSII_vol(gdsII_file, PORT3_LAYER, si_zmin, si_zmax)\n", + "p4 = mp.GDSII_vol(gdsII_file, PORT4_LAYER, si_zmin, si_zmax)\n", + "src_vol = mp.GDSII_vol(gdsII_file, SOURCE_LAYER, si_zmin, si_zmax)\n", + "\n", + "geometry = upper_branch+lower_branch\n", + "\n", + "sources = [mp.EigenModeSource(src=mp.GaussianSource(fcen,fwidth=df),\n", + " size=src_vol.size,\n", + " center=src_vol.center,\n", + " eig_band=1,\n", + " eig_parity=mp.NO_PARITY if three_d else mp.EVEN_Y+mp.ODD_Z,\n", + " eig_match_freq=True)]\n", + "\n", + "# Display simulation object\n", + "sim = mp.Simulation(resolution=res,\n", + " eps_averaging=False,\n", + " subpixel_maxeval=1,\n", + " subpixel_tol=1,\n", + " cell_size=cell.size,\n", + " boundary_layers=[mp.PML(dpml)],\n", + " sources=sources,\n", + " geometry=geometry)\n", + "\n", + "mode1 = sim.add_mode_monitor(fcen, 0, 1, mp.ModeRegion(volume=p1))\n", + "mode2 = sim.add_mode_monitor(fcen, 0, 1, mp.ModeRegion(volume=p2))\n", + "mode3 = sim.add_mode_monitor(fcen, 0, 1, mp.ModeRegion(volume=p3))\n", + "mode4 = sim.add_mode_monitor(fcen, 0, 1, mp.ModeRegion(volume=p4))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyMeep", + "language": "python", + "name": "pymeep" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/6-shell_simulations.ipynb b/6-shell_simulations.ipynb new file mode 100644 index 0000000..b4014c5 --- /dev/null +++ b/6-shell_simulations.ipynb @@ -0,0 +1,39 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do everything we just did in a Python script run from the terminal :" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "PyMeep", + "language": "python", + "name": "pymeep" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 0000000..a1cf7a4 --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,65 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'predefined'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpya\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mpredefined\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mMZI_Broadband_DC\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mlayout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpya\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mLayout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mdbu\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlayout\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdbu\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.001\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'predefined'" + ] + } + ], + "source": [ + "import pya\n", + "\n", + "layout = pya.Layout()\n", + "dbu = layout.dbu = 0.001\n", + "TOP = layout.create_cell(\"TOP\")\n", + "\n", + "origin = pya.DPoint(0, 0)\n", + "ex = pya.DVector(1, 0)\n", + "ey = pya.DVector(0, 1)\n", + "\n", + "MZI_Broadband_DC(\"test\").place_cell(TOP, origin)\n", + "print(\"Wrote to demo2_output.gds\")\n", + "layout.write(\"demo2_output.gds\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "layout", + "language": "python", + "name": "layout" + }, + "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.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/flux.v.k01.b01.x.h5 b/flux.v.k01.b01.x.h5 new file mode 100644 index 0000000..21d42c2 Binary files /dev/null and b/flux.v.k01.b01.x.h5 differ diff --git a/flux.v.k01.b01.x.yodd.h5 b/flux.v.k01.b01.x.yodd.h5 new file mode 100644 index 0000000..78faabd Binary files /dev/null and b/flux.v.k01.b01.x.yodd.h5 differ diff --git a/flux.v.k01.b02.x.h5 b/flux.v.k01.b02.x.h5 new file mode 100644 index 0000000..b8498b1 Binary files /dev/null and b/flux.v.k01.b02.x.h5 differ diff --git a/flux.v.k01.b02.x.yodd.h5 b/flux.v.k01.b02.x.yodd.h5 new file mode 100644 index 0000000..8ea3436 Binary files /dev/null and b/flux.v.k01.b02.x.yodd.h5 differ diff --git a/flux.v.k01.b03.x.h5 b/flux.v.k01.b03.x.h5 new file mode 100644 index 0000000..8194893 Binary files /dev/null and b/flux.v.k01.b03.x.h5 differ diff --git a/flux.v.k01.b03.x.yodd.h5 b/flux.v.k01.b03.x.yodd.h5 new file mode 100644 index 0000000..03f49aa Binary files /dev/null and b/flux.v.k01.b03.x.yodd.h5 differ diff --git a/flux.v.k01.b04.x.h5 b/flux.v.k01.b04.x.h5 new file mode 100644 index 0000000..5d2c093 Binary files /dev/null and b/flux.v.k01.b04.x.h5 differ diff --git a/flux.v.k01.b04.x.yodd.h5 b/flux.v.k01.b04.x.yodd.h5 new file mode 100644 index 0000000..3eb0f73 Binary files /dev/null and b/flux.v.k01.b04.x.yodd.h5 differ diff --git a/media/oblique-source-normal.mp4 b/media/oblique-source-normal.mp4 new file mode 100644 index 0000000..c3429fc Binary files /dev/null and b/media/oblique-source-normal.mp4 differ