62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
import numpy
|
|
from numpy import pi
|
|
import gridlock
|
|
from meanas.fdfd import waveguide_2d, waveguide_cyl
|
|
from matplotlib import pyplot
|
|
|
|
|
|
wl = 1310
|
|
dx = 10
|
|
radius = 25e3
|
|
width = 400
|
|
thf = 161
|
|
thp = 77
|
|
eps_si = 3.51 ** 2
|
|
eps_ox = 1.453 ** 2
|
|
|
|
|
|
|
|
x0 = (width / 2) % dx
|
|
omega = 2 * pi / wl
|
|
|
|
grid = gridlock.Grid([
|
|
numpy.arange(-3000, 3000 + dx, dx),
|
|
numpy.arange(-1500, 1500 + dx, dx),
|
|
numpy.arange(-1 * dx, 1 * dx + dx, dx)],
|
|
periodic=True,
|
|
)
|
|
epsilon = grid.allocate(eps_ox)
|
|
|
|
grid.draw_cuboid(epsilon, center=[x0, thf / 2, 0], dimensions=[width, thf, 1e6], foreground=eps_si)
|
|
grid.draw_cuboid(epsilon, center=[x0, thp / 2, 0], dimensions=[width + 3e3, thp, 1e6], foreground=eps_si)
|
|
grid.draw_cuboid(epsilon, center=[x0 + width / 2 + 2e3, thf / 2, 0], dimensions=[1e3, thf, 1e6], foreground=eps_si)
|
|
grid.draw_cuboid(epsilon, center=[x0 - width / 2 - 2e3, thf / 2, 0], dimensions=[1e3, thf, 1e6], foreground=eps_si)
|
|
|
|
|
|
tilt = (1 + grid.xyz[0] / radius)
|
|
se = tilt[None, :, None, None] * epsilon
|
|
#print(tilt)
|
|
|
|
|
|
dxes = [grid.dxyz, grid.autoshifted_dxyz()]
|
|
dxes_2d = [[d[0], d[1]] for d in dxes]
|
|
mode_numbers = numpy.arange(6)
|
|
args = dict(dxes=dxes_2d, omega=omega, mode_numbers=numpy.arange(6))
|
|
|
|
e_xys, wavenumbers = waveguide_2d.solve_modes(epsilon=se[:, :, :, 1].ravel(), **args)
|
|
ee, hh = waveguide_2d.normalized_fields_e(e_xys[0], wavenumber=wavenumbers[0], dxes=dxes_2d, omega=omega, epsilon=se[:, :, :, 1].ravel())
|
|
|
|
#print('tilted baseline:' wavenumbers * wl / pi / 2)
|
|
|
|
|
|
rmin = radius + grid.xyz[0].min()
|
|
epsv = epsilon[:, :, :, 1].ravel()
|
|
e2, angular_wavenumbers2 = waveguide_cyl.solve_modes(epsilon=epsv, rmin=rmin, **args)
|
|
print('cylindrical:', angular_wavenumbers2 * wl / pi / 2 / radius)
|
|
|
|
|
|
wavenumbers_2 = waveguide_cyl.linear_wavenumbers(e_xys=e2, angular_wavenumbers=angular_wavenumbers2, rmin=rmin, epsilon=epsv, dxes=dxes_2d)
|
|
print('cyl_auto:', wavenumbers_2 * wl / pi / 2)
|
|
|
|
|