def get_structures(
h4=4.7,
h2=0.4,
h1=1,
cpw_thickness=1, # CPW geometry parameters
cpw_width=18, # w1
cpw_gap=5, # g
optical_waveguide_gap=25,
): # G
sio2_thickness = h1 + h3 + h4
si_substrate = td.Structure(
geometry=td.Box.from_bounds(
rmin=(-eff_inf, -eff_inf, -eff_inf), rmax=(eff_inf, eff_inf, -sio2_thickness / 2)
),
medium=si_rf,
)
# Define substrate and layer structures
sio2_slab = td.Structure(
geometry=td.Box(center=(0, 0, 0), size=(eff_inf, eff_inf, sio2_thickness)), medium=sio2_rf
)
# Optical waveguide
center_slab = sio2_slab.geometry.bounds[0][2] + h4 + slab_thickness / 2
tfln_slab = td.Structure(
geometry=td.Box(center=(0, 0, center_slab), size=(eff_inf, eff_inf, slab_thickness)),
medium=tfln_rf,
)
# Calculate vertical offset to position waveguides at TFLN slab level
delta_z = tfln_slab.geometry.center[2] - ridge.geometry.center[2]
# Define conformal cladding for waveguides
delta_z_conformal = sio2_slab.geometry.bounds[1][2]
waveguide_conformal_cladding = td.PolySlab(
sidewall_angle=sidewall_angle * np.pi / 180,
reference_plane="top",
slab_bounds=[delta_z_conformal, delta_z_conformal + core_thickness],
vertices=[
[-eff_inf, -core_width / 1.5],
[eff_inf, -core_width / 1.5],
[eff_inf, core_width / 1.5],
[-eff_inf, core_width / 1.5],
],
)
# Define right waveguide positioned under CPW gap
waveguide_r = [
ridge.updated_copy(
geometry=ridge.geometry.translated(
x=0, y=optical_waveguide_gap / 2 + core_width / 2, z=delta_z
),
name="ridge_r",
medium=tfln_rf,
),
core.updated_copy(
geometry=core.geometry.translated(
x=0, y=optical_waveguide_gap / 2 + core_width / 2, z=delta_z
),
name="core_r",
medium=tfln_rf,
),
td.Structure(
geometry=waveguide_conformal_cladding.translated(
x=0, y=optical_waveguide_gap / 2 + core_width / 2, z=0
),
medium=sio2_rf,
),
]
# Define left waveguide positioned under CPW gap
waveguide_l = [
ridge.updated_copy(
geometry=ridge.geometry.translated(
x=0, y=-optical_waveguide_gap / 2 - core_width / 2, z=delta_z
),
name="ridge_l",
medium=tfln_rf,
),
core.updated_copy(
geometry=core.geometry.translated(
x=0, y=-optical_waveguide_gap / 2 - core_width / 2, z=delta_z
),
name="core_l",
medium=tfln_rf,
),
td.Structure(
geometry=waveguide_conformal_cladding.translated(
x=0, y=-optical_waveguide_gap / 2 - core_width / 2, z=0
),
medium=sio2_rf,
),
]
cpw_center_pos = sio2_slab.geometry.bounds[1][2] + cpw_thickness / 2
# Define CPW transmission line structures
cpw_left = td.Structure(
geometry=td.Box.from_bounds(
rmin=(-eff_inf, -eff_inf, cpw_center_pos - cpw_thickness / 2),
rmax=(eff_inf, -cpw_width / 2 - cpw_gap, cpw_center_pos + cpw_thickness / 2),
),
medium=metal,
)
cpw_right = td.Structure(
geometry=td.Box.from_bounds(
rmin=(-eff_inf, cpw_width / 2 + cpw_gap, cpw_center_pos - cpw_thickness / 2),
rmax=(eff_inf, eff_inf, cpw_center_pos + cpw_thickness / 2),
),
medium=metal,
)
cpw_center = td.Structure(
geometry=td.Box.from_bounds(
rmin=(-eff_inf, -cpw_width / 2, cpw_center_pos - cpw_thickness / 2),
rmax=(eff_inf, cpw_width / 2, cpw_center_pos + cpw_thickness / 2),
),
medium=metal,
)
air_gap = td.Structure(
geometry=td.Box.from_bounds(
rmin=(-eff_inf, -eff_inf, sio2_thickness / 2), rmax=(eff_inf, eff_inf, eff_inf)
),
medium=air_rf,
)
return (
[sio2_slab, si_substrate, air_gap, cpw_left, cpw_right, cpw_center, tfln_slab]
+ waveguide_l
+ waveguide_r
)
structures = get_structures()