Lithium niobate phase-shifter

Contents

Lithium niobate phase-shifter#

Reproducing [1]

Hide code cell source
using PyCall

py"""
from collections import OrderedDict

from shapely.geometry import box

from femwell.mesh import mesh_from_OrderedDict

core_width = 1.532
electrode_start_x = core_width / 2 + 2.629
electrode_width = 4.4

electrode_left = box(-electrode_start_x - electrode_width, 0.5, -electrode_start_x, 0.5 + 1.8)
electrode_right = box(electrode_start_x, 0.5, electrode_start_x + electrode_width, 0.5 + 1.8)
slab = box(-10, 0, 10, 0.5)
core = box(-core_width / 2, 0.5, core_width / 2, 0.8)
env = slab.buffer(20, resolution=8)

polygons = OrderedDict(
    electrode_left=electrode_left,
    electrode_right=electrode_right,
    slab=slab,
    core=core,
    env=env,
)

resolutions = dict(
    slab={"resolution": 0.1, "distance": 4},
    core={"resolution": 0.1, "distance": 4},
)

mesh_from_OrderedDict(polygons, resolutions, filename="mesh.msh", default_resolution_max=3)
"""
using Gridap
using Gridap.Geometry
using GridapGmsh
using Femwell.Maxwell.Waveguide
using Femwell.Maxwell.Electrostatic
using GridapMakie, CairoMakie

model = GmshDiscreteModel("mesh.msh")
Ω = Triangulation(model)
labels = get_face_labeling(model)
τ = CellField(get_face_tag(labels, num_cell_dims(model)), Ω)

conductivity = [
    "core" => 7.5,
    "slab" => 28.4,
    "electrode_left" => 3.9,
    "electrode_right" => 3.9,
    "env" => 3.9,
]
σ(tag) = Dict(get_tag_from_name(labels, u) => v for (u, v) in conductivity)[tag]

p0 = compute_potential(
    σ  τ,
    Dict("electrode_left___slab" => 1.0, "electrode_right___slab" => 0.0),
    order = 2,
)

plot_potential(p0)

fig, _, plt =
    plot(get_triangulation(potential(p0)), (σ  τ) * (potential(p0))  VectorValue(1, 0))
Colorbar(fig[1, 2], plt)
display(fig)

voltages = 0:10:100
voltages_neffs = []

for voltage in voltages
    epsilons = [
        "core" => 1.989,
        "env" => 1.445,
        "slab" => 2.211,
        "electrode_left" => 1.445,
        "electrode_right" => 1.445,
    ]
    ε(tag) = Dict(get_tag_from_name(labels, u) => v for (u, v) in epsilons)[tag]

    ε_perturbation =
        0.5 * 2.211^3 * 31e-6 * (potential(p0))  VectorValue(-1, 0) *
        voltage *
        ((tag -> get_tag_from_name(labels, "slab") == tag)  τ)

    modes = calculate_modes(
        model,
        (ε  τ + ε_perturbation) * (ε  τ + ε_perturbation),
        λ = 1.55,
        order = 0,
    )
    push!(voltages_neffs, n_eff(modes[1]))
end
Info    : Reading 'mesh.msh'...
Info    : 112 entities
Info    : 6436 nodes
Info    : 13256 elements
Info    : Done reading 'mesh.msh'
../_images/dce3b5d2656065195880c1f7231aa9101a3d6cf79bcafb84b6ed5bc8903fd4bd.png ../_images/4f9ca6b895a4c00c2a78d72a868227c0c6f507760508c6b8b4bb09967992088f.png
Hide code cell source
f = Figure()
ax = Axis(f[1, 1], xlabel = "Voltage / V", ylabel = "Effective refractive index")
lines!(ax, voltages, real(voltages_neffs))
plot!(ax, voltages, real(voltages_neffs))
display(f)
../_images/b7f3919480d4fb2f42efa4d366f5e1ee979663f9199e0cd9fe636b33a97afeee.png

Bibliography#

[1]

Huangpu Han, Fan Yang, Chenghao Liu, Zhengfang Wang, Yunpeng Jiang, Guangyue Chai, Shuangchen Ruan, and Bingxi Xiang. High-performance electro-optical mach–zehnder modulators in a silicon nitride–lithium niobate thin-film hybrid platform. Photonics, 9(7):500, July 2022. URL: https://doi.org/10.3390/photonics9070500, doi:10.3390/photonics9070500.