Stimulated Emission
We simulate the emission of an atom stimulated by an incident quantum pulse. In particular, how efficiently such stimulated emission occurs into the mode occupied by the incident photons. This system is described in A. Kiilerich, et al., Phys. Rev. Lett. 123, 123604 (2019). The initially excited atom has a decay rate $\Gamma$ and the incident quantum pulse is a single photon in an exponentially decaying mode $u(t) = \sqrt{\Gamma} e^{-\Gamma t/2}$.
We start by loading the packages and defining the symbolic operators and parameters.
using QuantumInputOutputusing SecondQuantizedAlgebrausing QuantumOpticsusing QuantumOpticsBase: daggerusing Plotsusing LaTeXStrings# symbolic Hilbert spaceshu1 = FockSpace(:u1)hc1 = NLevelSpace(:atom1, 2)hv1 = FockSpace(:v1)h = hu1 ⊗ hc1 ⊗ hv1# symbolic operatorsau = Destroy(h, :a_u, 1)σ(i, j) = Transition(h, :σ, i, j, 2)av = Destroy(h, :a_v, 3)# symbolic parameters@variables γ::Real Δ::Real Γ::Real g_v::RealWe use the symbolic operators and parameters to define the SLH triples and cascade them to obtain the Hamiltonian and Lindblad for the system.
G_u = SLH(1, √(Γ)*au, 0) # input cavityG_c = SLH(1, √(γ)*σ(1, 2), Δ*σ(2, 2)) # two-level atomG_v = SLH(1, g_v'*av, 0) # output cavityG_cas = G_u ▷ G_c ▷ G_vH = G_cas.hamiltonianΔ * σ₂₂ + (-0.5sqrt(Γ)*sqrt(γ))im * a_u * σ₂₁ + (-0.5g_v*sqrt(Γ))im * a_u * a_v' + (0.5sqrt(Γ)*sqrt(γ))im * a_u' * σ₁₂ + (0.5g_v*sqrt(Γ))im * a_u' * a_v + (-0.5g_v*sqrt(γ))im * σ₁₂ * a_v' + (0.5g_v*sqrt(γ))im * σ₂₁ * a_vL = G_cas.jump_operator[1] # only one Lindblad in this examplesqrt(Γ) * a_u + sqrt(γ) * σ₁₂ + g_v * a_v# numerical parameters and functionsγ_ = 1.0Δ_ = 0.0Γ_ = γ_/0.36p_sym = [γ, Δ, Γ]p_num = [γ_, Δ_, Γ_]dict_p = Dict(p_sym .=> p_num)gv_(t) = √(Γ_/(exp(Γ_*t) - 1))dict_p_t = Dict(g_v => gv_)T = [0.001:0.001:1;]*4.0ΔT = T[2] - T[1]We use the function to_numeric to create the numeric operators and solve the dynamics with the function timeevolution.master_dynamic in QuantumOptics.jl.
# numeric basesbu1 = FockBasis(1)ba1 = NLevelBasis(2)bv1 = FockBasis(2)b = bu1 ⊗ ba1 ⊗ bv1H_QO = to_numeric(H, b; parameter = dict_p, time_parameter = dict_p_t)L_QO = to_numeric(L, b; parameter = dict_p, time_parameter = dict_p_t)function input_output(t, ρ) H = H_QO(t) J = [L_QO(t)] return H, J, dagger.(J)end;# initial stateψ0 = fockstate(bu1, 1) ⊗ nlevelstate(ba1, 2) ⊗ fockstate(bv1, 0)# time evolutiont_, ρt = timeevolution.master_dynamic(T, ψ0, input_output)To calculate expectation values we create the desired numerical operators.
au_qo = to_numeric(au, b)σ_qo(i, j) = to_numeric(σ(i, j), b)av_qo = to_numeric(av, b)proj_u(n) = embed(b, 1, projector(fockstate(bu1, n)))proj_v(n) = embed(b, 3, projector(fockstate(bv1, n)))popu_u_n1 = real.(expect(proj_u(1), ρt))popu_e = real.(expect(σ_qo(2, 2), ρt))popu_v_n1 = real.(expect(proj_v(1), ρt))popu_v_n2 = real.(expect(proj_v(2), ρt))L0(t) = √(γ_)*σ_qo(1, 2) + √(Γ_)*au_qo + gv_(t)*av_qoI_out = [real(expect(dagger(L0(t_[i]))*L0(t_[i]), ρt[i])) for i = 1:length(t_)]I_out_int = [0.0]for i = 2:length(I_out) push!(I_out_int, I_out_int[end]+I_out[i]*ΔT)endp = plot(t_, popu_u_n1; color = :red, label = L"| 1 \rangle_u")plot!(p, t_, popu_e; color = :pink, ls = :dash, label = L"| e \rangle")plot!(p, t_, popu_v_n1; color = :blue, ls = :dash, label = L"| 1 \rangle_v")plot!(p, t_, popu_v_n2; color = :green, label = L"| 2 \rangle_v")plot!(p, t_, I_out_int; color = :black, ls = :dot, label = L"\\int I_{out} dt")plot!( p; xlims = (0, 4), ylims = (0, 1), xlabel = "time [1/γ]", ylabel = "population", legend = :best, size = (600, 300),)pPackage versions
These results were obtained using the following versions:
using InteractiveUtilsversioninfo()using PkgPkg.status( [ "QuantumInputOutput", "SecondQuantizedAlgebra", "QuantumOptics", "Plots", "LaTeXStrings", ], mode = PKGMODE_MANIFEST,)Julia Version 1.13.0
Commit d1c37793dd2 (2026-09-09 19:00 UTC)
Build Info:
Official https://julialang.org release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 4 × AMD EPYC 7763 64-Core Processor
WORD_SIZE: 64
LLVM: libLLVM-20.1.8 (ORCJIT, znver3)
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/Manifest.toml`
⌅ [7d9fca2a] Arpack v0.5.3
⌅ [861a8166] Combinatorics v1.0.2
[d38c429a] Contour v0.6.3
⌅ [82cc6244] DataInterpolations v9.5.0
[459566f4] DiffEqCallbacks v4.19.4
[77a26b50] DiffEqNoiseProcess v5.36.4
[c87230d0] FFMPEG v0.4.5
[7a1cc6ca] FFTW v1.10.0
⌅ [53c48c17] FixedPointNumbers v0.8.6
[069b7b12] FunctionWrappers v1.1.3
[28b8d3ca] GR v0.73.27
[42fd0dbc] IterativeSolvers v0.9.4
[1019f520] JLFzf v0.1.11
[682c06a0] JSON v1.9.0
[0b1a1467] KrylovKit v0.10.4
[b964fa9f] LaTeXStrings v1.4.1
[23fbe1c1] Latexify v0.16.12
[7a12625a] LinearMaps v3.11.4
[442fdcdd] Measures v0.3.3
[d8a4904e] MutableArithmetics v1.8.1
[77ba4419] NaNMath v1.1.4
[e7bfaba1] NumericalIntegration v0.3.4
[1dea7af3] OrdinaryDiffEq v7.8.1
[1344f307] OrdinaryDiffEqLowOrderRK v2.2.5
[ccf2f8ad] PlotThemes v3.3.0
[995b91a9] PlotUtils v1.5.0
[91a5bcdd] Plots v1.41.7
[aea7be01] PrecompileTools v1.3.4
[18f9eda6] QuantumInputOutput v0.5.3 `~/work/QuantumInputOutput.jl/QuantumInputOutput.jl`
[5717a53b] QuantumInterface v0.4.4
[6e0679c1] QuantumOptics v1.2.10
[4f57444f] QuantumOpticsBase v0.5.16
[3cdcf5f2] RecipesBase v1.3.4
[01d81517] RecipesPipeline v0.6.12
[731186ca] RecursiveArrayTools v4.5.3
[189a3867] Reexport v1.2.2
[05181044] RelocatableFolders v1.0.1
[ae029012] Requires v1.3.1
[0bca4576] SciMLBase v3.56.1
[431bcebd] SciMLPublic v1.3.0
[6c6a2e73] Scratch v1.3.0
⌅ [f7aa4685] SecondQuantizedAlgebra v0.11.0
[992d4aef] Showoff v1.1.1
[276daf66] SpecialFunctions v2.9.0
[90137ffa] StaticArrays v1.9.22
[10745b16] Statistics v1.11.5
[2913bbd2] StatsBase v0.34.13
[789caeaf] StochasticDiffEq v7.2.0
[d1185830] SymbolicUtils v4.48.0
[0c5d862f] Symbolics v7.41.1
[8ea1fca8] TermInterface v2.0.0
[1cfade01] UnicodeFun v0.4.1
[41fe7b60] Unzip v0.2.0
[2a0f44e3] Base64 v1.11.0
[ade2ca70] Dates v1.11.0
[f43a241f] Downloads v1.7.0
[37e2e46d] LinearAlgebra v1.13.0
[44cfe95a] Pkg v1.13.0
[de0858da] Printf v1.11.0
[3fa0cd96] REPL v1.11.0
[9a3f8284] Random v1.11.0
[2f01184e] SparseArrays v1.13.0
[fa267f1f] TOML v1.0.3
[cf7118a7] UUIDs v1.11.0
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`
This page was generated using Literate.jl.