mirror of
https://github.com/edoverg/modeconverter.git
synced 2026-10-14 23:06:39 +00:00
369 lines
48 KiB
Plaintext
369 lines
48 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 86,
|
|
"id": "094bf901",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import meep as mp\n",
|
|
"import numpy as np\n",
|
|
"import numpy.matlib\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"resolution = 120 # pixels/unit length\n",
|
|
"\n",
|
|
"wvl_min = 1.5\n",
|
|
"wvl_max = 1.6\n",
|
|
"wvl_cen = 0.5*(wvl_min+wvl_max)\n",
|
|
"fmin = 1/wvl_max\n",
|
|
"fmax = 1/wvl_min\n",
|
|
"fcen = 0.5*(fmin+fmax)\n",
|
|
"df = fmax-fmin\n",
|
|
"nfreq = 10\n",
|
|
"\n",
|
|
"dpml = 1.0 #PML thickness\n",
|
|
"dsub = 1.5 + wvl_cen #substrate thickness\n",
|
|
"dpad = dsub #passind between cell and PML\n",
|
|
"\n",
|
|
"k_point = mp.Vector3(0,0,0) #used for PBC\n",
|
|
"\n",
|
|
"n_si = 3.43 #silicon refractive index\n",
|
|
"si = mp.Medium(index=n_si)\n",
|
|
"n_air = 1.0 #air refractive index\n",
|
|
"air = mp.Medium(index=n_air)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 87,
|
|
"id": "35f94716",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" block, center = (0,0,0.35)\n",
|
|
" size (0.4,0.6,0.7)\n",
|
|
" axes (1,0,0), (0,1,0), (0,0,1)\n",
|
|
" block, center = (0,0,-2.025)\n",
|
|
" size (1e+20,1e+20,4.05)\n",
|
|
" axes (1,0,0), (0,1,0), (0,0,1)\n",
|
|
" dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n",
|
|
" block, center = (0,0,0.35)\n",
|
|
" size (0.4,0.6,0.7)\n",
|
|
" axes (1,0,0), (0,1,0), (0,0,1)\n",
|
|
" block, center = (0,0,-2.025)\n",
|
|
" size (1e+20,1e+20,4.05)\n",
|
|
" axes (1,0,0), (0,1,0), (0,0,1)\n",
|
|
" dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 768x576 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"P = 0.7 #unit cell pitch\n",
|
|
"h = 0.7 #pillar height\n",
|
|
"\n",
|
|
"sim_z_size = dpml + dsub + dpad + dpml\n",
|
|
"sim_x_size = P\n",
|
|
"sim_y_size = P\n",
|
|
"\n",
|
|
"major_ax = 0.3 #major axis of the ellipse\n",
|
|
"minor_ax = 0.2 #minor axis of the ellipse\n",
|
|
"\n",
|
|
"substrate_geo = mp.Block(\n",
|
|
" material = si,\n",
|
|
" size = mp.Vector3(mp.inf, mp.inf, dsub+dpml),\n",
|
|
" center = mp.Vector3(0,0,-(dsub+dpml)/2),\n",
|
|
")\n",
|
|
"\n",
|
|
"ellipse_geo = mp.Ellipsoid(\n",
|
|
" size = mp.Vector3(major_ax, minor_ax, 2*dpad),\n",
|
|
" center = mp.Vector3(0,0,0),\n",
|
|
" material = si,\n",
|
|
")\n",
|
|
"ellipse_geo.do_averaging = True\n",
|
|
"\n",
|
|
"cut_box_1 = mp.Block(\n",
|
|
" material = air,\n",
|
|
" size = mp.Vector3(major_ax, minor_ax, dpad-h),\n",
|
|
" center = mp.Vector3(0,0,(dpad-h)/2+h)\n",
|
|
")\n",
|
|
"\n",
|
|
"cut_box_2 = mp.Block(\n",
|
|
" material = air,\n",
|
|
" size = mp.Vector3(major_ax, minor_ax, dpad),\n",
|
|
" center = mp.Vector3(0,0,-dpad/2)\n",
|
|
")\n",
|
|
"\n",
|
|
"source_position = mp.Vector3(0,0,-wvl_cen) #source position in the middle of the substrate\n",
|
|
"source = mp.Source(\n",
|
|
" mp.GaussianSource(fcen, fwidth=df),\n",
|
|
" component = mp.Ex,\n",
|
|
" center = source_position,\n",
|
|
" size = mp.Vector3(sim_x_size, sim_y_size, 0),\n",
|
|
")\n",
|
|
"\n",
|
|
"cell_size = mp.Vector3(sim_x_size, sim_y_size, sim_z_size)\n",
|
|
"pml_layers = [mp.PML(dpml,direction=mp.Z)]\n",
|
|
"\n",
|
|
"def elliptic_cylinder_func(p):\n",
|
|
" # p is an mp.Vector3 point (x, y, z)\n",
|
|
" if (p.x / (minor_ax/2)) ** 2 + (p.y / (major_ax/2)) ** 2 <= 1.0 and abs(p.z) <= h and abs(p.z) >= 0:\n",
|
|
" return si\n",
|
|
" return air\n",
|
|
"elliptic_cylinder_func.do_averaging = True\n",
|
|
"\n",
|
|
"test_ell = mp.Block(\n",
|
|
" center=mp.Vector3(0, 0, h/2),\n",
|
|
" size=mp.Vector3(2*minor_ax, 2*major_ax, h),\n",
|
|
" material=elliptic_cylinder_func,\n",
|
|
")\n",
|
|
"\n",
|
|
"sim = mp.Simulation(\n",
|
|
" resolution = resolution,\n",
|
|
" cell_size = cell_size,\n",
|
|
" boundary_layers = pml_layers,\n",
|
|
" sources = [source],\n",
|
|
" #geometry = [ ellipse_geo, cut_box_1, cut_box_2, substrate_geo ],\n",
|
|
" geometry = [test_ell, substrate_geo],\n",
|
|
" material_function = elliptic_cylinder_func,\n",
|
|
" default_material = air,\n",
|
|
" k_point = k_point,\n",
|
|
")\n",
|
|
"\n",
|
|
"monitor_position = mp.Vector3(0,0,h+wvl_cen)\n",
|
|
"flux_mon = sim.add_flux(\n",
|
|
" fcen, df, nfreq, mp.FluxRegion(center=monitor_position, size=mp.Vector3(sim_x_size, sim_y_size, 0))\n",
|
|
")\n",
|
|
"\n",
|
|
"f, ax = plt.subplots(1,2,dpi=120)\n",
|
|
"yz_plane = mp.Volume(center=mp.Vector3(0,0,0), size=mp.Vector3(0,sim_y_size,sim_z_size))\n",
|
|
"xy_plane = mp.Volume(center=mp.Vector3(0,0,h/2), size=mp.Vector3(sim_x_size,sim_y_size,0))\n",
|
|
"sim.plot2D(ax=ax[0],output_plane=yz_plane,show_sources=True,show_monitors=True)\n",
|
|
"sim.plot2D(ax=ax[1],output_plane=xy_plane,show_sources=True,show_monitors=True,show_epsilon=True)\n",
|
|
"ax[1].set_xlim(-sim_x_size/2, sim_x_size/2)\n",
|
|
"ax[1].set_ylim(-sim_y_size/2, sim_y_size/2)\n",
|
|
"plt.show()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 88,
|
|
"id": "e2e8c953",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"-----------\n",
|
|
"Initializing structure...\n",
|
|
"time for choose_chunkdivision = 0.00579405 s\n",
|
|
"Working in 3D dimensions.\n",
|
|
"Computational cell is 0.7 x 0.7 x 8.1 with resolution 120\n",
|
|
" block, center = (0,0,0.35)\n",
|
|
" size (0.4,0.6,0.7)\n",
|
|
" axes (1,0,0), (0,1,0), (0,0,1)\n",
|
|
" block, center = (0,0,-2.025)\n",
|
|
" size (1e+20,1e+20,4.05)\n",
|
|
" axes (1,0,0), (0,1,0), (0,0,1)\n",
|
|
" dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n",
|
|
"subpixel-averaging is 8.96239% done, 40.9949 s remaining\n",
|
|
"subpixel-averaging is 18.719% done, 17.5123 s remaining\n",
|
|
"subpixel-averaging is 28.1353% done, 10.2434 s remaining\n",
|
|
"subpixel-averaging is 37.5516% done, 6.67275 s remaining\n",
|
|
"subpixel-averaging is 47.4217% done, 4.43799 s remaining\n",
|
|
"subpixel-averaging is 57.2918% done, 3.01498 s remaining\n",
|
|
"subpixel-averaging is 66.9351% done, 1.99351 s remaining\n",
|
|
"subpixel-averaging is 77.1455% done, 1.18899 s remaining\n",
|
|
"subpixel-averaging is 87.129% done, 0.594217 s remaining\n",
|
|
"subpixel-averaging is 96.8857% done, 0.129903 s remaining\n",
|
|
"subpixel-averaging is 3.31345% done, 116.772 s remaining\n",
|
|
"subpixel-averaging is 6.60798% done, 56.6936 s remaining\n",
|
|
"subpixel-averaging is 9.86465% done, 36.645 s remaining\n",
|
|
"subpixel-averaging is 13.1592% done, 26.4271 s remaining\n",
|
|
"subpixel-averaging is 16.4727% done, 20.3888 s remaining\n",
|
|
"subpixel-averaging is 19.7483% done, 16.3062 s remaining\n",
|
|
"subpixel-averaging is 23.0807% done, 13.3563 s remaining\n",
|
|
"subpixel-averaging is 26.3373% done, 11.2352 s remaining\n",
|
|
"subpixel-averaging is 29.5751% done, 9.54566 s remaining\n",
|
|
"subpixel-averaging is 32.9075% done, 8.18746 s remaining\n",
|
|
"subpixel-averaging is 35.8044% done, 120.738 s remaining\n",
|
|
"subpixel-averaging is 35.8233% done, 109.194 s remaining\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "KeyboardInterrupt",
|
|
"evalue": "",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
|
"\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)",
|
|
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[87]\u001b[39m\u001b[32m, line 47\u001b[39m, in \u001b[36melliptic_cylinder_func\u001b[39m\u001b[34m(p)\u001b[39m\n\u001b[32m---> \u001b[39m\u001b[32m47\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m elliptic_cylinder_func(p):\n\u001b[32m 48\u001b[39m \u001b[38;5;66;03m# p is an mp.Vector3 point (x, y, z)\u001b[39;00m\n\u001b[32m 49\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (p.x / (minor_ax/\u001b[32m2\u001b[39m)) ** \u001b[32m2\u001b[39m + (p.y / (major_ax/\u001b[32m2\u001b[39m)) ** \u001b[32m2\u001b[39m <= \u001b[32m1.0\u001b[39m \u001b[38;5;28;01mand\u001b[39;00m abs(p.z) <= h \u001b[38;5;28;01mand\u001b[39;00m abs(p.z) >= \u001b[32m0\u001b[39m:\n\u001b[32m 50\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m si\n",
|
|
"\u001b[31mKeyboardInterrupt\u001b[39m: "
|
|
]
|
|
},
|
|
{
|
|
"ename": "RuntimeError",
|
|
"evalue": "meep: Error in typemaps",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
|
"\u001b[31mRuntimeError\u001b[39m Traceback (most recent call last)",
|
|
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[88]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m obs_point = monitor_position\n\u001b[32m 2\u001b[39m stop_cond = mp.stop_when_fields_decayed(\u001b[32m25\u001b[39m, mp.Ex, obs_point, \u001b[32m1e-6\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m sim.run(until_after_sources=stop_cond)\n\u001b[32m 4\u001b[39m eps_data = sim.get_array(center=mp.Vector3(), size=mp.Vector3(\u001b[32m0\u001b[39m,sim_y_size,sim_z_size), component=mp.Dielectric)\n\u001b[32m 5\u001b[39m ex_data = sim.get_array(center=mp.Vector3(), size=mp.Vector3(\u001b[32m0\u001b[39m,sim_y_size,sim_z_size), component=mp.Ex)\n\u001b[32m 6\u001b[39m plt.figure()\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/simulation.py:4553\u001b[39m, in \u001b[36mSimulation.run\u001b[39m\u001b[34m(self, *step_funcs, **kwargs)\u001b[39m\n\u001b[32m 4550\u001b[39m until_after_sources = kwargs.pop(\u001b[33m\"\u001b[39m\u001b[33muntil_after_sources\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 4552\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.fields \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m4553\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43minit_sim\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 4555\u001b[39m \u001b[38;5;28mself\u001b[39m._evaluate_dft_objects()\n\u001b[32m 4556\u001b[39m \u001b[38;5;28mself\u001b[39m._check_material_frequencies()\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/simulation.py:2482\u001b[39m, in \u001b[36mSimulation.init_sim\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 2479\u001b[39m warnings.warn(eps_warning, \u001b[38;5;167;01mRuntimeWarning\u001b[39;00m)\n\u001b[32m 2481\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.structure \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m2482\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_init_structure\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mk_point\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 2484\u001b[39m \u001b[38;5;28mself\u001b[39m.fields = mp.fields(\n\u001b[32m 2485\u001b[39m \u001b[38;5;28mself\u001b[39m.structure,\n\u001b[32m 2486\u001b[39m \u001b[38;5;28mself\u001b[39m.m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.is_cylindrical \u001b[38;5;28;01melse\u001b[39;00m \u001b[32m0\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 2491\u001b[39m \u001b[38;5;28mself\u001b[39m.bfast_scaled_k,\n\u001b[32m 2492\u001b[39m )\n\u001b[32m 2494\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.force_all_components \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m.dimensions != \u001b[32m1\u001b[39m:\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/simulation.py:2095\u001b[39m, in \u001b[36mSimulation._init_structure\u001b[39m\u001b[34m(self, k)\u001b[39m\n\u001b[32m 2057\u001b[39m \u001b[38;5;28mself\u001b[39m.gv = gv\n\u001b[32m 2058\u001b[39m \u001b[38;5;28mself\u001b[39m.structure = mp.create_structure(\n\u001b[32m 2059\u001b[39m \u001b[38;5;28mself\u001b[39m.cell_size,\n\u001b[32m 2060\u001b[39m \u001b[38;5;28mself\u001b[39m.dft_data_list,\n\u001b[32m (...)\u001b[39m\u001b[32m 2093\u001b[39m ),\n\u001b[32m 2094\u001b[39m )\n\u001b[32m-> \u001b[39m\u001b[32m2095\u001b[39m \u001b[38;5;28mself\u001b[39m.geps = \u001b[30;43mmp\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_set_materials\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 2096\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mstructure\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2097\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcell_size\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2098\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgv\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2099\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43meps_averaging\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2100\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msubpixel_tol\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2101\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msubpixel_maxeval\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2102\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgeometry\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2103\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgeometry_center\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2104\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mensure_periodicity\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mand\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mnot\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mnot\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mk_point\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2105\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mdefault_material\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2106\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mabsorbers\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2107\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mextra_materials\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2108\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msplit_chunks_evenly\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2109\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mTrue\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2110\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mNone\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2111\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2112\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mNone\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2113\u001b[39m \u001b[30;43m\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 2115\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._output_stats \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 2116\u001b[39m sys.exit(\u001b[32m0\u001b[39m)\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/__init__.py:4430\u001b[39m, in \u001b[36m_set_materials\u001b[39m\u001b[34m(s, cell_size, gv, use_anisotropic_averaging, tol, maxeval, gobj_list, center, _ensure_periodicity, _default_material, alist, extra_materials, split_chunks_evenly, set_materials, existing_geps, output_chunk_costs, my_bp)\u001b[39m\n\u001b[32m 4429\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_set_materials\u001b[39m(s, cell_size, gv, use_anisotropic_averaging, tol, maxeval, gobj_list, center, _ensure_periodicity, _default_material, alist, extra_materials, split_chunks_evenly, set_materials, existing_geps, output_chunk_costs, my_bp):\n\u001b[32m-> \u001b[39m\u001b[32m4430\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43m_meep\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_set_materials\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43ms\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mcell_size\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mgv\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43muse_anisotropic_averaging\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mtol\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mmaxeval\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mgobj_list\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mcenter\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m_ensure_periodicity\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m_default_material\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43malist\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mextra_materials\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43msplit_chunks_evenly\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mset_materials\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mexisting_geps\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43moutput_chunk_costs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mmy_bp\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n",
|
|
"\u001b[31mRuntimeError\u001b[39m: meep: Error in typemaps"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"obs_point = monitor_position\n",
|
|
"stop_cond = mp.stop_when_fields_decayed(25, mp.Ex, obs_point, 1e-6)\n",
|
|
"sim.run(until_after_sources=stop_cond)\n",
|
|
"eps_data = sim.get_array(center=mp.Vector3(), size=mp.Vector3(0,sim_y_size,sim_z_size), component=mp.Dielectric)\n",
|
|
"ex_data = sim.get_array(center=mp.Vector3(), size=mp.Vector3(0,sim_y_size,sim_z_size), component=mp.Ex)\n",
|
|
"plt.figure()\n",
|
|
"plt.imshow(eps_data, interpolation='spline36', cmap='binary')\n",
|
|
"plt.imshow(ex_data, interpolation='spline36', cmap='RdBu', alpha=0.9)\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "74c01e55",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"input_flux = mp.get_fluxes(flux_mon)\n",
|
|
"plt.plot(np.array(input_flux)/np.max(input_flux))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "93cee842",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"sim.reset_meep()\n",
|
|
"\n",
|
|
"def make_unit_cell(D):\n",
|
|
" pillar_geo = mp.Cylinder(\n",
|
|
" material = si,\n",
|
|
" radius = D/2,\n",
|
|
" height = h,\n",
|
|
" center = mp.Vector3(0,0,h/2),\n",
|
|
" )\n",
|
|
" return pillar_geo\n",
|
|
"\n",
|
|
"def make_unit_cell_sim(D):\n",
|
|
" pillar_geo = make_unit_cell(D)\n",
|
|
" geometries = [substrate_geo, pillar_geo]\n",
|
|
"\n",
|
|
" sim = mp.Simulation(\n",
|
|
" resolution = resolution,\n",
|
|
" cell_size = cell_size,\n",
|
|
" boundary_layers = pml_layers,\n",
|
|
" geometry = geometries,\n",
|
|
" default_material = air,\n",
|
|
" k_point = k_point,\n",
|
|
" sources = [source],\n",
|
|
" )\n",
|
|
" f = plt.figure(dpi=120)\n",
|
|
" sim.plot2D(ax=f.gca(),output_plane=yz_plane,show_sources=True,show_monitors=True)\n",
|
|
" plt.show()\n",
|
|
"\n",
|
|
" mode_mon = sim.add_flux(\n",
|
|
" fcen, df, nfreq, mp.FluxRegion(center=monitor_position, size=mp.Vector3(sim_x_size, sim_y_size, 0))\n",
|
|
" )\n",
|
|
" sim.run(until_after_sources=300)\n",
|
|
"\n",
|
|
" freqs = mp.get_eigenmode_freqs(mode_mon)\n",
|
|
" res = sim.get_eigenmode_coefficients(\n",
|
|
" mode_mon, [1], eig_parity=mp.EVEN_Y\n",
|
|
" )\n",
|
|
" coeffs = res.alpha\n",
|
|
"\n",
|
|
" mode_wvl = [1/freqs[nf] for nf in range(nfreq)]\n",
|
|
" mode_tran = [abs(coeffs[0,nf,0])**2 / input_flux[nf] for nf in range(nfreq)]\n",
|
|
" mode_phase = [np.angle(coeffs[0,nf,0]) for nf in range(nfreq)]\n",
|
|
"\n",
|
|
" return mode_wvl, mode_tran, mode_phase\n",
|
|
"\n",
|
|
"diameters = np.linspace(0.1, 0.7, 4)\n",
|
|
"mode_tran_arr = np.empty((len(diameters), nfreq))\n",
|
|
"mode_phase_arr = np.empty((len(diameters), nfreq))\n",
|
|
"\n",
|
|
"for i, D in enumerate(diameters):\n",
|
|
" mode_wvl, mode_tran, mode_phase = make_unit_cell_sim(D)\n",
|
|
" mode_tran_arr[i,:] = mode_tran\n",
|
|
" mode_phase_arr[i,:] = mode_phase\n",
|
|
"\n",
|
|
"#make a 2d plot of the transmission and phase as a function of wavelength and diameter\n",
|
|
"plt.figure(dpi=120)\n",
|
|
"plt.subplot(2,1,1)\n",
|
|
"plt.imshow(mode_tran_arr, extent=[wvl_min*1e6, wvl_max*1e6, diameters[0], diameters[-1]], aspect='auto', origin='lower', cmap='viridis')\n",
|
|
"plt.colorbar(label='Transmission')\n",
|
|
"plt.ylabel('Diameter (um)')\n",
|
|
"plt.title('Transmission vs Wavelength and Diameter')\n",
|
|
"plt.subplot(2,1,2)\n",
|
|
"plt.imshow(mode_phase_arr, extent=[wvl_min*1e6, wvl_max*1e6, diameters[0], diameters[-1]], aspect='auto', origin='lower', cmap='twilight')\n",
|
|
"plt.colorbar(label='Phase (radians)')\n",
|
|
"plt.ylabel('Diameter (um)')\n",
|
|
"plt.xlabel('Wavelength (um)')\n",
|
|
"plt.title('Phase vs Wavelength and Diameter')\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "352d606d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"print(input_flux[0])"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "mp",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.13.14"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|