Quantum Pulse Bi-Directional Waveguide
This example mirrors the example Bi-Directional Waveguide but passes numeric operators directly to SLH, circumventing the symbolic derivation part. Furthermore it drives the system with a quantum single-photon pulse via a virtual cavity.
As usual, we start by loading the packages and defining the operators and parameters of the system.
using QuantumInputOutputusing QuantumOpticsusing QuantumOpticsBase: daggerusing PlotsN = 2 # number of quantum dots# numeric Hilbert spacebu = FockBasis(6) # virtual input cavityba = NLevelBasis(2)b_qds = tensor([ba for _ = 1:N]...)b = bu ⊗ b_qds# QD operatorsσ(i, j, k) = embed(b, i+1, transition(ba, j, k))# input mode operatora_u = destroy(bu) ⊗ one(b_qds)# parametersγ = 1.0β = 0.9γRn = fill(γ * β / 2, N)γLn = fill(γ * β / 2, N)γ_add = fill(γ * (1 - β), N)Δn = fill(0.0, N)ϕn = fill(π/10, max(N - 1, 0))# quantum pulse u(t) and virtual cavity coupling g_u(t)σt = 0.8 # pulse witht0 = 4σt # pulse peakTend = 3t0T = [0:0.005:1;]*TendΔT = T[2]-T[1]u1(t) = 1/(sqrt(σt)*π^(1/4)) * exp(-(t - t0)^2 / (2*σt^2))gu_t = coupling_input(u1, T)We use the SLH to directly use QuantumOptics.jl operators and functions to the model the system.
G_u = SLH(1, t -> gu_t(t) * a_u, 0*one(b))G_ϕ(i, j) = SLH(exp(1im * ϕn[i]), 0*one(b), 0*one(b))G_R(i) = SLH(1, √(γRn[i]) * σ(i, 1, 2), -Δn[i] * σ(i, 2, 2))G_L(i) = SLH(1, √(γLn[i]) * σ(i, 1, 2), 0*one(b))# Cascade right-moving channelG_R_t = G_u ▷ G_R(1) ▷ G_ϕ(1, 2) ▷ G_R(2)# Cascade left-moving channel (reverse order)G_L_t = G_L(2) ▷ G_ϕ(1, 2) ▷ G_L(1)G_t = G_R_t ⊞ G_L_tThe full Hamiltonian and Lindblad terms are extracted from the final SLH element. Note that as soon as one time-dependent function is involved in a cascade or concatenate, the returned $H$ and $L$ will also be time-dependent.
H = hamiltonian(G_t)L = jump_operator(G_t)L_R = L[1]L_L = L[2]J_add = [√(γ_add[i]) * σ(i, 1, 2) for i = 1:N]function input_output(t, ρ) Ht = H(t) J = [L_R(t), L_L(t), J_add...] return Ht, J, dagger.(J)end# time evolutionα0 = √(0.1) # √ of total photon numberψ0 = coherentstate(bu, α0) ⊗ tensor([nlevelstate(ba, 1) for _ = 1:N]...)t, ρt = timeevolution.master_dynamic(T, ψ0, input_output)# transmitted and reflected intensityI_R = zeros(length(t))I_L = zeros(length(t))for (i, ti) in enumerate(t) LR = L_R(ti) LL = L_L(ti) I_R[i] = real(expect(LR' * LR, ρt[i])) I_L[i] = real(expect(LL' * LL, ρt[i]))endp = plot(t, I_R; label = "Transmission")plot!(p, t, I_L; label = "Reflection")plot!(p, t, abs2.(α0*u1.(t)); color = :grey, ls = :dash, label = "Input")plot!( p; xlabel = "time", ylabel = "intensity", legend = :best, grid = true, size = (500, 320),)pPackage versions
These results were obtained using the following versions:
using InteractiveUtilsversioninfo()using PkgPkg.status(["QuantumInputOutput", "QuantumOptics", "Plots"])Julia Version 1.13.2
Commit 45b6d15e34b (2026-10-14 20:33 UTC)
Build Info:
Official https://julialang.org release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 4 × Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
WORD_SIZE: 64
LLVM: libLLVM-20.1.8 (ORCJIT, icelake-server)
GC: Built with stock GC
Threads: 1 default, 0 interactive, 1 GC (on 4 virtual cores)
Environment:
JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
JULIA_DEBUG = Documenter,Literate
JULIA_NUM_THREADS = 1
Status `~/work/QuantumInputOutput.jl/QuantumInputOutput.jl/docs/Project.toml`
[91a5bcdd] Plots v1.41.7
[18f9eda6] QuantumInputOutput v0.5.3 `~/work/QuantumInputOutput.jl/QuantumInputOutput.jl`
[6e0679c1] QuantumOptics v1.2.10
This page was generated using Literate.jl.