Mode Solver
- orphan:
Dielectric Waveguide Mode Analysis
from pyModeSolver.pyModeSolver import VFDModeSolver
from pyOptiShared.LayerInfo import LayerStack
from pyOptiShared.DeviceGeometry import DeviceGeometry
from pyOptiShared.Material import ConstMaterial
import gdstk
import numpy as np
import matplotlib.pyplot as plt
##########################################
### WG GDS File ###
##########################################
filename = "wg.gds"
length = 10
width1 = 0.5
width2 = 2
lib = gdstk.Library()
strt_wg = lib.new_cell("Straight_WG")
vertices1 = [(0, -width1/2), (length, -width1/2), (length, width1/2), (0, width1/2)]
vertices2 = [(0, -width2/2), (length, -width2/2), (length, width2/2), (0, width2/2)]
strt_wg.add(gdstk.Polygon(vertices1, layer=1))
strt_wg.add(gdstk.Polygon(vertices2, layer=2))
lib.write_gds(filename)
##########################################
### Material Settings ###
##########################################
substrate_mat = ConstMaterial("SiO2", epsReal=1.444**2, epsImag=0.0)
core_mat = ConstMaterial("Si", epsReal=3.48**2, epsImag=0.0)
##########################################
### Layer Stack Settings ###
##########################################
layer_stack = LayerStack()
layer_stack.AddLayer(number=1,material=core_mat, thickness=0.22, zmin=0, sideWallAng=0, cladding="Air_default")
layer_stack.AddLayer(number=2,material=core_mat, thickness=0.09, zmin=0.0, sideWallAng=0, cladding="Air_default")
layer_stack.SetBGandSub(background="Air_default", substrate=substrate_mat)
##########################################
### Device Geometry/Port Settings ###
##########################################
device_geometry = DeviceGeometry()
device_geometry.SetFromGDS(layer_stack=layer_stack,
gds_file=filename,
buffers={'x':1,'y':1,'z':1})
##########################################
### ModeSolver Settings ###
##########################################
mode_solver = VFDModeSolver()
mode_solver.SetBoundaries(min_x = "pmc", max_x = "pmc",
min_y = "pmc", max_y = "pmc")
lams=np.linspace(start=1.5,stop=1.6,num=5)
mode_solver.SetSimSettings(device_geometry = device_geometry,
mesh={"dx": 0.02,"dy": 0.02, "dz": 0.02},
wavelength=lams,
nguess = 2.1,
nmodes = 10,
cut_plane = "YZ",
cut_location = 0.0,
tol = 1e-8,
results_path = "./ModeResults",
device_name = "my_results")
##########################################
### Run and Results Visualization ###
##########################################
results = mode_solver.Run()
results.PlotMode(field='Hy') # Fundamental Mode Profile
results.PlotPermittivity() # Material Profile
results.PlotIndex('neff',modes=[0,1,2,3]) # Effective Refractive Index
results.PlotIndex('ng',modes=[0,1,2,3]) # Effective Group Index
results.Polarity(wavelength=1.5) # polarity of the modes
plt.show()
- orphan:
Fiber - XY Cut Mode Analysis
import gdstk
import os
from pyModeSolver.pyModeSolver import VFDModeSolver
from pyOptiShared.LayerInfo import LayerStack
from pyOptiShared.DeviceGeometry import DeviceGeometry
from pyOptiShared.Material import ConstMaterial,ExperimentalMaterial
import numpy as np
import matplotlib.pyplot as plt
##########################################
### Create Fiber GDS File ###
##########################################
filename = "fiber.gds"
lib = gdstk.Library()
cell = lib.new_cell("fiber")
circle = gdstk.ellipse((0, 0), 7.5,layer=1)
cell.add(circle)
lib.write_gds(filename)
##########################################
### Material Settings ###
##########################################
air_mat = ConstMaterial("air", epsReal=1, epsImag=0.0)
sio2_exp = ExperimentalMaterial("my_material")
sio2_exp.SetFromRefDotInfo(shelf="main", book="SiO2", page="Malitson", wavelength_unit=1e-6)
##########################################
### Layer Stack Settings ###
##########################################
layer_stack = LayerStack()
layer_stack.AddLayer(number=1,material=sio2_exp, thickness=0.0, zmin=0, sideWallAng=0, cladding=air_mat)
layer_stack.SetBGandSub(background=air_mat, substrate=air_mat)
##########################################
### Device Geometry/Port Settings ###
##########################################
device_geometry = DeviceGeometry()
device_geometry.SetFromGDS(layer_stack=layer_stack,
gds_file=filename,
buffers={'x':5,'y':5,'z':5})
##########################################
### ModeSolver Settings ###
##########################################
lams=np.linspace(start=1.5,stop=1.6,num=5)
mode_solver = VFDModeSolver()
mode_solver.SetBoundaries(min_x = "pmc", max_x = "pmc",
min_y = "pmc", max_y = "pmc")
mode_solver.SetSimSettings(device_geometry = device_geometry,
mesh={"dx": 0.5,"dy": 0.5, "dz": 0.5},
wavelength=lams,
nguess = 3.4,
nmodes = 1,
cut_plane = "XY",
cut_location = 0.0,
tol = 1e-8,
results_path = "./ModeResults",
device_name = "my_results")
##########################################
### Run and Post Processing ###
##########################################
results = mode_solver.Run()
## Built in plotting functions
results.PlotMode() # Fundamental Mode Profile
results.PlotPermittivity() # Material Profile
results.PlotIndex('neff',modes=[0]) # Effective Refractive Index
results.PlotIndex('ng',modes=[0]) # Effective Group Index
plt.show()
- orphan:
Directional Coupler - Coupling length
import gdstk
import os
from pyModeSolver.pyModeSolver import VFDModeSolver
from pyOptiShared.LayerInfo import LayerStack
from pyOptiShared.DeviceGeometry import DeviceGeometry
from pyOptiShared.Material import ConstMaterial,ExperimentalMaterial
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
##########################################
### Waveguide function ###
##########################################
def directional_coupler(width=0.4, height=1.00, gap=0.35, center=(0,0), layer=1):
cx, cy = center
# --- Left Rectangle ---
# Extends from x = -gap/2 to x = -gap/2 - width
left_vertices = [
(cx - gap/2, cy), # Inner Bottom
(cx - gap/2 - width, cy), # Outer Bottom
(cx - gap/2 - width, cy + height), # Outer Top
(cx - gap/2, cy + height) # Inner Top
]
# --- Right Rectangle ---
# Extends from x = +gap/2 to x = +gap/2 + width
right_vertices = [
(cx + gap/2, cy), # Inner Bottom
(cx + gap/2 + width, cy), # Outer Bottom
(cx + gap/2 + width, cy + height), # Outer Top
(cx + gap/2, cy + height) # Inner Top
]
# Return a list containing two tuples (one for each rectangle)
return [(left_vertices, layer), (right_vertices, layer)]
parameters=(0.5, 0.22, 0.3, (0,0), 1) #width=0.4, height=1.00, gap=0.3, center=(0,0), layer=1
WG1=directional_coupler(*parameters)
fig, ax = plt.subplots()
polygon1 = Polygon(WG1[0][0], closed=True, facecolor="lightcoral", edgecolor="black")
polygon2 = Polygon(WG1[1][0], closed=True, facecolor="lightcoral", edgecolor="black")
ax.add_patch(polygon1)
ax.add_patch(polygon2)
# 1. Manually set x-limits to cover the negative coordinates
ax.set_xlim([-1, 1])
ax.set_ylim([-0.5, 1.5]) # Adjusted slightly to see the bottom at y=0
# 2. Optional: Force equal aspect ratio so the waveguides don't look distorted
ax.set_aspect('equal')
ax.set_xlabel('x [um]')
ax.set_ylabel('y [um]')
ax.set_title('Waveguide defined from function')
##########################################
### Material Settings ###
##########################################
substrate_mat = ConstMaterial("SiO2", epsReal=1.444**2, epsImag=0.0)
core_mat = ConstMaterial("Si", epsReal=3.48**2, epsImag=0.0)
##########################################
### Layer Stack Settings ###
##########################################
layer_stack = LayerStack()
layer_stack.AddLayer(number=1,material=core_mat, thickness=0.0, zmin=0, sideWallAng=0)
layer_stack.SetBGandSub(background=substrate_mat, substrate=substrate_mat)
##########################################
### Device Geometry/Port Settings ###
##########################################
device_geometry = DeviceGeometry()
device_geometry.SetFromFun(func=directional_coupler,
parameters=parameters,
layer_stack=layer_stack,
buffers={'x':2,'y':2,'z':2})
##########################################
### ModeSolver Settings ###
##########################################
num_wavelength=11
num_modes=2
lams=np.linspace(start=1.5,stop=1.6,num=num_wavelength)
mode_solver = VFDModeSolver()
mode_solver.SetBoundaries(min_x = "pmc", max_x = "pmc",
min_y = "pmc", max_y = "pmc")
mode_solver.SetSimSettings(device_geometry = device_geometry,
mesh={"dx": 0.025,"dy": 0.025, "dz": 0.025},
wavelength=lams,
nguess = 3.5,
nmodes = num_modes,
cut_plane = "XY",
cut_location = 0.0,
tol = 1e-8,
results_path = "./ModeResults",
device_name = "my_results")
##########################################
### Run and Post Processing ###
##########################################
results = mode_solver.Run()
# Compute coupling length
Neff=results.GetNeff()
Lc=np.zeros(num_wavelength,dtype=float)
for ii in np.arange(num_wavelength):
Lc[ii]=np.abs(lams[ii]/(2*(Neff[0,ii]-Neff[1,ii])))
plt.figure()
plt.plot(lams,Lc)
plt.xlabel('Wavelength [um]')
plt.ylabel('Coupling Length [um]')
## Built in plotting functions
for i in range(num_modes):
results.PlotMode(mode=i,field='Ex',plot_type='mag') # Fundamental Mode Profile
results.PlotPermittivity() # Material Profile
results.PlotIndex('neff',modes=[0]) # Effective Refractive Index
results.PlotIndex('ng',modes=[0]) # Effective Group Index
plt.show()