Collective Modes
A module that calculates the band structure and decay rates of different collective modes of quasimomentum k with functions:
It is probably best to illustrate the functionality using some examples.
One-dimensional case
The following code reproduces the band strucuture and decay plots from A. Asenjo-Garcia et al, 10.1103/PhysRevX.7.031024 (Figs. 1b and 1c).
using CollectiveSpins
# Define chain parameters
a = 0.2 # spin-spin distance
polarization_par = [1, 0, 0]
polarization_perp = [0, 1, 1]
k_max = 10000
k_list = [iii*pi/(a*k_max) for iii=-k_max:k_max]
band_structure_par = []
band_structure_perp = []
decay_par = []
decay_perp = []
for k in k_list
append!(band_structure_par, Omega_k_chain(k, a, polarization_par))
append!(band_structure_perp, Omega_k_chain(k, a, polarization_perp))
append!(decay_par, Gamma_k_chain(k, a, polarization_par))
append!(decay_perp, Gamma_k_chain(k, a, polarization_perp))
end
using PyPlot
figure()
subplot(211)
plot(k_list*a/pi, band_structure_par)
plot(k_list*a/pi, band_structure_perp, color="red")
xlabel("k d/pi")
ylabel("Omega(k)/gamma0")
subplot(212)
plot(k_list*a/pi, decay_par)
plot(k_list*a/pi, decay_perp, color="red")
xlabel("k d/pi")
ylabel("Gamma(k)/gamma0")
tight_layout()
┌ Warning: No working GUI backend found for matplotlib
└ @ PyPlot ~/.julia/packages/PyPlot/2MlrT/src/init.jl:153
Two-dimensional case
For the two-dimensional case, consider the following two examples. The first example reproduces the band structure for a 2D square lattice with in-plane circularly polarized and perpendicular (x-axis) polarized atoms, which can be found in E. Shahmoon et al 10.1103/PhysRevLett.118.113601 (Fig. 4a).
For a particularly elegant derivation of collective frequency shifts and decay rates in 2D atomic arrays, see the thesis of Dominik Wild, "Algorithms and Platforms for Quantum Science and Technology".
using CollectiveSpins
using PyPlot
polarization_par = [0, 1, im]
polarization_perp = [1, 0, 0]
a_vec1 = [0.2, 0]
a_vec2 = [0, 0.2]
k_max = 200
k_listy = [iii*pi/(a_vec1[1]*k_max) for iii=k_max:-1:0]
k_listz = copy(k_listy)
k_listy = append!(k_listy, [iii*pi/(a_vec1[1]*k_max) for iii=0:k_max])
k_listz = append!(k_listz, zeros(k_max+1))
k_listy = append!(k_listy, ones(k_max+1)*pi/a_vec1[1])
k_listz = append!(k_listz, [iii*pi/(a_vec1[1]*k_max) for iii=0:k_max])
k_dim = length(k_listy)
bandstructure_par = zeros(k_dim)
bandstructure_perp = zeros(k_dim)
for iii=1:k_dim
k = [k_listy[iii], k_listz[iii]]
bandstructure_par[iii] = Omega_k_2D(k, a_vec1, a_vec2, polarization_par)
bandstructure_perp[iii] = Omega_k_2D(k, a_vec1, a_vec2, polarization_perp)
end
positions = [0, k_max, 2*k_max, 3*k_max]
labels = ["M", "Gamma", "X", "M"]
figure(figsize=(6,4))
plot(collect(1:k_dim), bandstructure_par, "k--")
plot(collect(1:k_dim), bandstructure_perp, color="gold")
xticks(positions, labels)
ylim([-5.2, 5.2])
tight_layout()
The next example shows how one can compute the decay rates for a 2 square lattices with atoms polarized in-plane (y-axis) and perpendicularly (x-axis). This can be found in A. Asenjo-Garcia et al, 10.1103/PhysRevX.7.031024 (Figs. 2c and 2d).
polarization_par = [0, 1, 0]
polarization_perp = [1, 0, 0]
a_vec1 = [0.2, 0]
a_vec2 = [0, 0.2]
k_max = 200
k_list = [iii*pi/(a_vec1[1]*k_max) for iii=-k_max:k_max]
k_dim = length(k_list)
decay_par = zeros(k_dim, k_dim)
decay_perp = zeros(k_dim, k_dim)
y = 1
for ky in k_list
z = 1
for kz in k_list
k = [ky, kz]
decay_par[z, y] = Gamma_k_2D(k, a_vec1, a_vec2, polarization_par)
decay_perp[z, y] = Gamma_k_2D(k, a_vec1, a_vec2, polarization_perp)
z += 1
end
global y += 1
end
positions = [0, k_max, 2*k_max]
labels = [-1, 0, 1]
figure(figsize=(10,4))
subplot(121)
imshow(decay_par, cmap="jet")
colorbar()
clim(0, 22)
xlabel("k_y d/pi")
ylabel("k_z d/pi")
plt.xticks(positions, labels)
plt.yticks(positions, labels)
subplot(122)
imshow(decay_perp, cmap="jet")
colorbar()
clim(0, 22)
xlabel("k_y d/pi")
ylabel("k_z d/pi")
plt.xticks(positions, labels)
plt.yticks(positions, labels)
tight_layout()