diff --git a/src/quantum_system_templates/_quantum_system_templates.jl b/src/quantum_system_templates/_quantum_system_templates.jl index 51694174..4cee2bd0 100644 --- a/src/quantum_system_templates/_quantum_system_templates.jl +++ b/src/quantum_system_templates/_quantum_system_templates.jl @@ -3,6 +3,7 @@ module QuantumSystemTemplates export TransmonSystem export TransmonDipoleCoupling export MultiTransmonSystem +export RydbergChainSystem using ..QuantumUtils using ..QuantumSystems @@ -10,5 +11,6 @@ using ..QuantumSystems using LinearAlgebra include("transmons.jl") +include("rydberg.jl") end diff --git a/src/quantum_system_templates/rydberg.jl b/src/quantum_system_templates/rydberg.jl new file mode 100644 index 00000000..70042e72 --- /dev/null +++ b/src/quantum_system_templates/rydberg.jl @@ -0,0 +1,91 @@ +@doc raw""" + RydbergChainSystem(; + C::Float64=862690*2π, + distance::Float64=10.0, # μm + cutoff_order::Int=2, # 1 is nearest neighbor, 2 is next-nearest neighbor, etc. + local_detune::Bool=false, # If true, include one local detuning pattern. + ) -> QuantumSystem + +Returns a `QuantumSystem` object for the Rydberg atom chain in the spin basis + |g⟩ = |0⟩ = [1, 0], |r⟩ = |1⟩ = [0, 1]. + +```math +H = \sum_i 0.5*\Omega_i(t)\cos(\phi_i(t)) \sigma_i^x - 0.5*\Omega_i(t)\sin(\phi_i(t)) \sigma_i^y - \sum_i \Delta_i(t)n_i + \sum_{i [1 0; 0 1], "X" => [0 1; 1 0], "Y" => [0 -im; im 0], "Z" => [1 0; 0 -1], "n" => [0 0; 0 1]) + if cutoff_order == 1 + H_drift = sum([C*kron_from_dict(generate_pattern(N,i),PAULIS)/(distance^6) for i in 1:N-1]) + elseif cutoff_order == 2 + H_drift = sum([C*kron_from_dict(generate_pattern(N,i),PAULIS)/(distance^6) for i in 1:N-1]) + H_drift += sum([C*kron_from_dict(generate_pattern_with_gap(N,i,1),PAULIS)/((2*distance)^6) for i in 1:N-2]) + else + error("Higher cutoff order not supported") + end + H_drives = Matrix{ComplexF64}[] + # Add global X drive + Hx = sum([0.5*kron_from_dict(lift('X',i,N), PAULIS) for i in 1:N]) + push!(H_drives, Hx) + # Add global Y drive + Hy = sum([0.5*kron_from_dict(lift('Y',i,N), PAULIS) for i in 1:N]) + push!(H_drives, Hy) + # Add global detuning + H_detune = -sum([kron_from_dict(lift('n',i,N), PAULIS) for i in 1:N]) + push!(H_drives, H_detune) + params = Dict{Symbol, Any}( + :N => N, + :C => C, + :distance => distance, + :cutoff_order => cutoff_order, + :local_detune => local_detune, + ) + return QuantumSystem( + H_drift, + H_drives; + constructor=RydbergChainSystem, + params=params, + ) +end \ No newline at end of file