Finite-element mode solver#
You can mesh any component cross-section and solve the PDEs thanks to femwell mode - solver.
Unlike other mode solvers, this actually uses the component geometry instead of a hardcoded geometry.
You can directly compute the modes of a Gdsfactory cross-section (internally, it defines a “uz” mesh perpendicular to a straight component with the provided cross-section).
You can also downsample layers from the LayerStack, and modify both the cross-section and LayerStack prior to simulation to change the geometry. You can also define refractive indices on the active PDK.
try:
import google.colab
is_running_on_colab = True
!pip install gdsfactory gplugins[femwell] > /dev/null
!apt install python3-gmsh gmsh > /dev/null
except ImportError:
is_running_on_colab = False
import matplotlib.pyplot as plt
import gdsfactory as gf
from tqdm.auto import tqdm
import numpy as np
from gplugins.femwell.mode_solver import compute_cross_section_modes
from gdsfactory.technology import LayerStack
from gdsfactory.cross_section import rib
from gdsfactory.generic_tech import LAYER_STACK
from skfem.io.meshio import from_meshio
from femwell.maxwell.waveguide import compute_modes
from femwell.mesh import mesh_from_OrderedDict
from femwell.visualization import plot_domains
import sys
import logging
from rich.logging import RichHandler
import gdsfactory as gf
from gdsfactory.generic_tech import get_generic_pdk
gf.config.rich_output()
PDK = get_generic_pdk()
PDK.activate()
logger = logging.getLogger()
logger.removeHandler(sys.stderr)
logging.basicConfig(level="WARNING", datefmt="[%X]", handlers=[RichHandler()])
filtered_layer_stack = LayerStack(
layers={
k: LAYER_STACK.layers[k]
for k in (
"core",
"clad",
"slab90",
"box",
)
}
)
filtered_layer_stack.layers[
"core"
].thickness = 0.22 # Perturb the layer_stack before simulating
filtered_layer_stack.layers[
"slab90"
].thickness = 0.09 # Perturb the layer_stack before simulating
resolutions = {
"core": {"resolution": 0.02, "distance": 2},
"clad": {"resolution": 0.2, "distance": 1},
"box": {"resolution": 0.2, "distance": 1},
"slab90": {"resolution": 0.05, "distance": 1},
}
modes = compute_cross_section_modes(
cross_section=rib(width=0.6),
layer_stack=filtered_layer_stack,
wavelength=1.55,
num_modes=4,
resolutions=resolutions,
)
Info : Meshing 1D...
Info : [ 0%] Meshing curve 9 (Line)
Info : [ 0%] Meshing curve 8 (Line)
Info : [ 0%] Meshing curve 10 (Line)
Info : [ 0%] Meshing curve 7 (Line)
Info : [ 0%] Meshing curve 11 (Line)
Info : [ 10%] Meshing curve 12 (Line)
Info : [ 20%] Meshing curve 13 (Line)
Info : [ 20%] Meshing curve 14 (Line)
Info : [ 20%] Meshing curve 15 (Line)
Info : [ 20%] Meshing curve 16 (Line)
Info : [ 20%] Meshing curve 17 (Line)
Info : [ 20%] Meshing curve 18 (Line)
Info : [ 20%] Meshing curve 19 (Line)
Info : [ 20%] Meshing curve 20 (Line)
Info : [ 50%] Meshing curve 21 (Line)
Info : [ 50%] Meshing curve 22 (Line)
Info : [ 60%] Meshing curve 23 (Line)
Info : [ 60%] Meshing curve 24 (Line)
Info : [ 60%] Meshing curve 25 (Line)
Info : [ 60%] Meshing curve 26 (Line)
Info : [ 60%] Meshing curve 27 (Line)
Info : [ 60%] Meshing curve 28 (Line)
Info : Done meshing 1D (Wall 0.0161029s, CPU 0.046674s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 4 (Plane, Frontal-Delaunay)
Info : [ 20%] Meshing surface 5 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0904249s, CPU 0.216828s)
Info : 6657 nodes 13668 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp2bm3dt2j/mesh.msh'...
Info : Done writing '/tmp/tmp2bm3dt2j/mesh.msh'
2024-03-09 00:44:02.711 | WARNING | gdsfactory.pdk:get_material_index:602 - UserWarning: get_material_index is deprecated
/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/gdsfactory/pdk.py:602: UserWarning: get_material_index is deprecated
warnings.warn("get_material_index is deprecated")
The solver returns the list of modes
mode = modes[0]
mode.show(mode.E.real, colorbar=True, direction="x")
You can use them as inputs to other femwell mode solver functions to inspect or analyze the modes:
print(modes[0].te_fraction)
0.9901230355084943
Sweep waveguide width#
widths = np.linspace(0.2, 2, 10)
num_modes = 4
all_neffs = np.zeros((widths.shape[0], num_modes))
all_te_fracs = np.zeros((widths.shape[0], num_modes))
for i, width in enumerate(tqdm(widths)):
modes = compute_cross_section_modes(
cross_section=gf.cross_section.strip(width=width),
layer_stack=filtered_layer_stack,
wavelength=1.55,
num_modes=num_modes,
resolutions=resolutions,
wafer_padding=2,
solver="scipy",
)
all_neffs[i] = np.real([mode.n_eff for mode in modes])
all_te_fracs[i, :] = [mode.te_fraction for mode in modes]
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 0%] Meshing curve 4 (Line)
Info : [ 0%] Meshing curve 5 (Line)
Info : [ 0%] Meshing curve 6 (Line)
Info : [ 0%] Meshing curve 7 (Line)
Info : [ 0%] Meshing curve 8 (Line)
Info : [ 0%] Meshing curve 9 (Line)
Info : [ 0%] Meshing curve 10 (Line)
Info : [ 0%] Meshing curve 11 (Line)
Info : [ 0%] Meshing curve 12 (Line)
Info : [ 0%] Meshing curve 13 (Line)
Info : [ 0%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.0129658s, CPU 0.039533s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0282612s, CPU 0.077615s)
Info : 1646 nodes 3380 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp97040ftf/mesh.msh'...
Info : Done writing '/tmp/tmp97040ftf/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 4 (Line)
Info : [ 0%] Meshing curve 5 (Line)
Info : [ 0%] Meshing curve 6 (Line)
Info : [ 0%] Meshing curve 7 (Line)
Info : [ 0%] Meshing curve 8 (Line)
Info : [ 40%] Meshing curve 9 (Line)
Info : [ 40%] Meshing curve 10 (Line)
Info : [ 40%] Meshing curve 11 (Line)
Info : [ 40%] Meshing curve 12 (Line)
Info : [ 40%] Meshing curve 13 (Line)
Info : [ 40%] Meshing curve 14 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : Done meshing 1D (Wall 0.0120178s, CPU 0.040796s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0270874s, CPU 0.081979s)
Info : 1968 nodes 4044 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp5t2fbn63/mesh.msh'...
Info : Done writing '/tmp/tmp5t2fbn63/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 10%] Meshing curve 4 (Line)
Info : [ 10%] Meshing curve 5 (Line)
Info : [ 10%] Meshing curve 6 (Line)
Info : [ 10%] Meshing curve 7 (Line)
Info : [ 10%] Meshing curve 8 (Line)
Info : [ 10%] Meshing curve 9 (Line)
Info : [ 50%] Meshing curve 10 (Line)
Info : [ 50%] Meshing curve 11 (Line)
Info : [ 60%] Meshing curve 12 (Line)
Info : [ 60%] Meshing curve 13 (Line)
Info : [ 80%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.0116121s, CPU 0.040662s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0288094s, CPU 0.084716s)
Info : 2458 nodes 5044 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmppzabsm49/mesh.msh'...
Info : Done writing '/tmp/tmppzabsm49/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 4 (Line)
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 5 (Line)
Info : [ 20%] Meshing curve 6 (Line)
Info : [ 20%] Meshing curve 7 (Line)
Info : [ 30%] Meshing curve 8 (Line)
Info : [ 30%] Meshing curve 9 (Line)
Info : [ 30%] Meshing curve 10 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 30%] Meshing curve 11 (Line)
Info : [ 30%] Meshing curve 12 (Line)
Info : [ 30%] Meshing curve 13 (Line)
Info : [ 30%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.0114956s, CPU 0.041116s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0403827s, CPU 0.10925s)
Info : 2896 nodes 5940 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp6vgjgjnw/mesh.msh'...
Info : Done writing '/tmp/tmp6vgjgjnw/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 20%] Meshing curve 4 (Line)
Info : [ 20%] Meshing curve 5 (Line)
Info : [ 20%] Meshing curve 6 (Line)
Info : [ 20%] Meshing curve 7 (Line)
Info : [ 20%] Meshing curve 8 (Line)
Info : [ 20%] Meshing curve 9 (Line)
Info : [ 50%] Meshing curve 10 (Line)
Info : [ 60%] Meshing curve 11 (Line)
Info : [ 60%] Meshing curve 12 (Line)
Info : [ 70%] Meshing curve 13 (Line)
Info : [ 80%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.010996s, CPU 0.036804s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0426665s, CPU 0.124429s)
Info : 3323 nodes 6814 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmpe16y3x7j/mesh.msh'...
Info : Done writing '/tmp/tmpe16y3x7j/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 0%] Meshing curve 4 (Line)
Info : [ 0%] Meshing curve 5 (Line)
Info : [ 20%] Meshing curve 6 (Line)
Info : [ 20%] Meshing curve 7 (Line)
Info : [ 30%] Meshing curve 8 (Line)
Info : [ 30%] Meshing curve 9 (Line)
Info : [ 30%] Meshing curve 10 (Line)
Info : [ 30%] Meshing curve 11 (Line)
Info : [ 30%] Meshing curve 12 (Line)
Info : [ 30%] Meshing curve 13 (Line)
Info : [ 30%] Meshing curve 14 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : Done meshing 1D (Wall 0.0115949s, CPU 0.041911s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0485731s, CPU 0.135921s)
Info : 3796 nodes 7780 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp36fy2xvb/mesh.msh'...
Info : Done writing '/tmp/tmp36fy2xvb/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 0%] Meshing curve 4 (Line)
Info : [ 0%] Meshing curve 5 (Line)
Info : [ 0%] Meshing curve 6 (Line)
Info : [ 0%] Meshing curve 7 (Line)
Info : [ 0%] Meshing curve 8 (Line)
Info : [ 0%] Meshing curve 9 (Line)
Info : [ 0%] Meshing curve 11 (Line)
Info : [ 0%] Meshing curve 10 (Line)
Info : [ 0%] Meshing curve 12 (Line)
Info : [ 0%] Meshing curve 13 (Line)
Info : [ 0%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.0118756s, CPU 0.041128s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0487232s, CPU 0.144948s)
Info : 4216 nodes 8640 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp95s99839/mesh.msh'...
Info : Done writing '/tmp/tmp95s99839/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 0%] Meshing curve 4 (Line)
Info : [ 0%] Meshing curve 5 (Line)
Info : [ 0%] Meshing curve 6 (Line)
Info : [ 0%] Meshing curve 7 (Line)
Info : [ 0%] Meshing curve 8 (Line)
Info : [ 0%] Meshing curve 9 (Line)
Info : [ 0%] Meshing curve 10 (Line)
Info : [ 0%] Meshing curve 11 (Line)
Info : [ 0%] Meshing curve 12 (Line)
Info : [ 0%] Meshing curve 13 (Line)
Info : [ 80%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.0118944s, CPU 0.040178s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0615158s, CPU 0.165408s)
Info : 4603 nodes 9434 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmpaen__r3d/mesh.msh'...
Info : Done writing '/tmp/tmpaen__r3d/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 0%] Meshing curve 4 (Line)
Info : [ 0%] Meshing curve 5 (Line)
Info : [ 0%] Meshing curve 6 (Line)
Info : [ 0%] Meshing curve 7 (Line)
Info : [ 0%] Meshing curve 8 (Line)
Info : [ 0%] Meshing curve 9 (Line)
Info : [ 0%] Meshing curve 10 (Line)
Info : [ 0%] Meshing curve 11 (Line)
Info : [ 0%] Meshing curve 12 (Line)
Info : [ 0%] Meshing curve 13 (Line)
Info : [ 80%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.0122212s, CPU 0.036866s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0635384s, CPU 0.18214s)
Info : 5243 nodes 10734 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp683079cf/mesh.msh'...
Info : Done writing '/tmp/tmp683079cf/mesh.msh'
Info : Meshing 1D...
Info : [ 0%] Meshing curve 1 (Line)
Info : [ 0%] Meshing curve 2 (Line)
Info : [ 0%] Meshing curve 3 (Line)
Info : [ 10%] Meshing curve 4 (Line)
Info : [ 10%] Meshing curve 5 (Line)
Info : [ 10%] Meshing curve 6 (Line)
Info : [ 10%] Meshing curve 7 (Line)
Info : [ 30%] Meshing curve 8 (Line)
Info : [ 30%] Meshing curve 9 (Line)
Info : [ 30%] Meshing curve 10 (Line)
Info : [ 30%] Meshing curve 11 (Line)
Info : [ 30%] Meshing curve 12 (Line)
Info : [ 30%] Meshing curve 13 (Line)
Info : [ 30%] Meshing curve 14 (Line)
Info : Done meshing 1D (Wall 0.0116826s, CPU 0.043037s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 2 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 3 (Plane, Frontal-Delaunay)
Info : [ 0%] Meshing surface 1 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0627536s, CPU 0.184641s)
Info : 5526 nodes 11320 elements
Info : Writing 'mesh.msh'...
Info : Done writing 'mesh.msh'
Info : Writing '/tmp/tmp25zy9tlj/mesh.msh'...
Info : Done writing '/tmp/tmp25zy9tlj/mesh.msh'
all_neffs = np.real(all_neffs)
plt.xlabel("Width of waveguide µm")
plt.ylabel("Effective refractive index")
plt.ylim(1.444, np.max(all_neffs) + 0.1 * (np.max(all_neffs) - 1.444))
for lams, te_fracs in zip(all_neffs.T, all_te_fracs.T):
plt.plot(widths, lams, c='k')
plt.scatter(widths, lams, c=te_fracs, cmap="cool")
plt.colorbar().set_label("TE fraction")