Reduced Spin
A common approach to treating many spins quantum mechanically is to truncate the Hilbert space at a specific number of excitations. This widely reduces the number of possible states. CollectiveSpins.jl offers generic functionality to truncate a system of spins at an arbitrary number of excitations. The following functions can be used, and are largely equivalent to the SpinBasis
implemented in QuantumOptics.jl.
ReducedSpinBasis
reducedspintransition
reducedsigmap
reducedsigmam
reducedsigmax
reducedsigmay
reducedsigmaz
reducedsigmapsigmam
reducedspinstate
Example
Let us illustrate how to work with the reducedspin
submodule. In the following example, we will compute the intensity radiation pattern of a regular chain of atoms in a subradiant state from A. Asenjo-Garcia et al, 10.1103/PhysRevX.7.031024 (Fig. 3b).
using CollectiveSpins
using QuantumOptics
using PyPlot
# Parameters
N = 50
M = 1 # Number of excitations
d = 0.33
pos = geometry.chain(d,N)
μ = [[1.0,0,0] for i=1:N]
S = SpinCollection(pos,μ)
# Collective effects
Ωmat = OmegaMatrix(S)
Γmat = GammaMatrix(S)
# Hilbert space
b = ReducedSpinBasis(N,M,M) # Basis from M excitations up to M excitations
# Effective Hamiltonian
spsm = [reducedsigmapsigmam(b, i, j) for i=1:N, j=1:N]
H_eff = dense(sum((Ωmat[i,j] - 0.5im*Γmat[i,j])*spsm[i, j] for i=1:N, j=1:N))
# Find the most subradiant eigenstate
λ, states = eigenstates(H_eff; warning=false)
γ = -2 .* imag.(λ)
s_ind = findmin(γ)[2]
ψ = states[s_ind]
# Compute the radiation pattern
function G(r,i,j) # Green's Tensor overlap
G_i = GreenTensor(r-pos[i])
G_j = GreenTensor(r-pos[j])
return μ[i]' * (G_i'*G_j) * μ[j]
end
function intensity(r) # The intensity ⟨E⁻(r)⋅E⁺(r)⟩
real(sum(expect(spsm[i,j], ψ)*G(r,i,j) for i=1:N, j=1:N))
end
y = -50d:2d:50d
z = 5d
x = y .+ 0.5d*(N-1)
I = zeros(length(x), length(y))
for i=1:length(x), j=1:length(y)
I[i,j] = intensity([x[i],y[j],z])
end
# Plot
figure(figsize=(9,4))
contourf(x./d,y./d,I',30)
for p in pos
plot(p[1]./d,p[2],"o",color="w",ms=2)
end
xlabel("x/d")
ylabel("y/d")
colorbar(label="Intensity",ticks=[])
tight_layout()