meanas/examples/bend.py

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)