Notebook author: Nathan Shammah (nathan.shammah at gmail.com)
Here we study the effect of collective and local processes on a spin squeezing Hamiltonian.
We consider a system of $N$ two-level systems (TLSs) with identical frequency $\omega_{0}$, which can de-excite incoherently or collectively at the rates $\gamma_\text{E}$ and $\gamma_\text{CE}$,
\begin{eqnarray} \dot{\rho} &=&-i\lbrack -i\Lambda\left(J_{+}^2-J_{-}^2\right),\rho \rbrack +\frac{\gamma_\text {CE}}{2}\mathcal{L}_{J_{-}}[\rho] +\frac{\gamma_\text{E}}{2}\sum_{n=1}^{N}\mathcal{L}_{J_{-,n}}[\rho] \end{eqnarray}We study the time evolution of the spin squeezing parameter [1-4] \begin{eqnarray} \xi^2 &=& N\langle\Delta J_y^2\rangle/\left(\langle J_z\rangle^2+\langle J_x\rangle^2\right) \end{eqnarray}
We assess how different dynamical conditions and initial states can be explored to optimize the spin squeezing of a given Dicke state [5-7]. This study can be generalized to other types of local and collective incoherent processes. A table grouping this processes is given below,
Keyword | Rate $\gamma_j$ | Lindbladian $\mathcal{L}[\rho]$ |
$\texttt{emission}$ | $\gamma_\text{E}$ | \begin{eqnarray}\mathcal{L}[\rho]&=&\sum_n^N \left(J_{-,n}\rho J_{+,n} - \frac{1}{2}J_{+,n}J_{-,n}\rho - \frac{1}{2}\rho J_{+,n}J_{-,n} \right)\end{eqnarray} |
$\texttt{pumping}$ | $\gamma_\text{P}$ | \begin{eqnarray}\mathcal{L}[\rho]&=&\sum_n^N \left(J_{+,n}\rho J_{-,n} - \frac{1}{2}J_{-,n}J_{+,n}\rho - \frac{1}{2}\rho J_{-,n}J_{+,n} \right)\end{eqnarray} |
$\texttt{dephasing}$ | $\gamma_\text{D}$ | \begin{eqnarray}\mathcal{L}[\rho]&=&\sum_n^N \left(J_{z,n}\rho J_{z,n} - \frac{1}{2}J_{z,n}J_{z,n}\rho - \frac{1}{2}\rho J_{z,n}J_{z,n} \right)\end{eqnarray} |
$\texttt{collective}\_\texttt{emission}$ | $\gamma_\text{CE}$ | \begin{eqnarray}\mathcal{L}[\rho]&=& J_{-}\rho J_{+} - \frac{1}{2}J_{+}J_{-}\rho - \frac{1}{2}\rho J_{+}J_{-} \end{eqnarray} |
$\texttt{collective}\_\texttt{pumping}$ | $\gamma_\text{CP}$ | \begin{eqnarray}\mathcal{L}[\rho]&=& J_{+}\rho J_{-} - \frac{1}{2}J_{-}J_{+}\rho - \frac{1}{2}\rho J_{-}J_{+} \end{eqnarray} |
$\texttt{collective}\_\texttt{dephasing}$ | $\gamma_\text{CD}$ | \begin{eqnarray}\mathcal{L}[\rho]&=& J_{z}\rho J_{z} - \frac{1}{2}J_{z}^2\rho - \frac{1}{2}\rho J_{z}^2 \end{eqnarray} |
Note that in the table above and in $\texttt{qutip.piqs}$ functions, the Lindbladian $\mathcal{L}[\rho]$ is written with a factor 1/2 with respect to $\mathcal{L}_{A}[\rho]$ reported in the LaTeX math equations, in order to have the Lindbladian and full Liouvillian matrix consistently defined by the rates $\gamma_\alpha$.
Note also that the local depolarizing channel can be written in terms of this Lindbladians as \begin{eqnarray} \gamma_{Dep}\sum_n^N\left(\mathcal{L}_{J_{x,n}}+\mathcal{L}_{J_{y,n}}+\mathcal{L}_{J_{z,n}}\right)=\gamma_{Dep}\sum_n^N\left(\frac{1}{2}\mathcal{L}_{J_{+,n}}+\frac{1}{2}\mathcal{L}_{J_{-,n}}+ \mathcal{L}_{J_{z,n}}\right). \end{eqnarray} Similarly, the collective depolarizing channel reads
\begin{eqnarray} \gamma_\text{CDep}\left(\mathcal{L}_{J_{x}}+\mathcal{L}_{J_{y}}+\mathcal{L}_{J_{z}}\right)=\gamma_\text{CDep}\left( \frac{1}{2}\mathcal{L}_{J_{+}}+\frac{1}{2}\mathcal{L}_{J_{-}}+ \mathcal{L}_{J_{z}}\right). \end{eqnarray}
In [1]:
from time import clock
from scipy.io import mmwrite
import matplotlib.pyplot as plt
from qutip import *
from qutip.piqs import *
from scipy.sparse import load_npz, save_npz
In [2]:
def isdicke(N, j, m):
"""
Check if an element in a matrix is a valid element in the Dicke space.
Dicke row: j value index. Dicke column: m value index.
The function returns True if the element exists in the Dicke space and
False otherwise.
Parameters
----------
N : int
The number of two-level systems.
j: float
"j" index of the element in Dicke space which needs to be checked.
m: float
"m" index of the element in Dicke space which needs to be checked.
"""
dicke_row = j
dicke_col = m
rows = N + 1
cols = 0
if (N % 2) == 0:
cols = int(N/2 + 1)
else:
cols = int(N/2 + 1/2)
if (dicke_row > rows) or (dicke_row < 0):
return (False)
if (dicke_col > cols) or (dicke_col < 0):
return (False)
if (dicke_row < int(rows/2)) and (dicke_col > dicke_row):
return False
if (dicke_row >= int(rows/2)) and (rows - dicke_row <= dicke_col):
return False
else:
return True
def dicke_space(N):
"""
Generate a matrix to visualize the Dicke space.
j is on the horizontal axis, increasing right to left.
m is on the vertical axis, increasing bottom to top.
It puts 1 in all allowed (j,m) values.
It puts 0 in all not-allowed (j,m) values.
Parameters
----------
N : int
The number of two-level systems.
Returns
----------
dicke_space : ndarray
The matrix of all allowed (j,m) pairs.
"""
rows = N + 1
cols = 0
if (rows % 2) == 0:
cols = int((rows/2))
else:
cols = int((rows + 1)/2)
dicke_space = np.zeros((rows, cols), dtype = int)
for (i, j) in np.ndindex(rows, cols):
dicke_space[i, j] = isdicke(N, i, j)
return (dicke_space)
In [3]:
## general parameters
N = 20
ntls = N
nds = num_dicke_states(N)
[jx, jy, jz] = jspin(N)
jp = jspin(N, "+")
jm = jspin(N, "-")
jpjm = jp*jm
Lambda = 1
factor_l = 5
#spin hamiltonian
h = -1j*Lambda * (jp**2-jm**2)
gCE = Lambda/factor_l
gE = Lambda/factor_l
# system with collective emission only
system = Dicke(N=N)
# system2 with local emission only
system2 = Dicke(N=N)
system.collective_emission = gCE
system2.emission = gE
system.hamiltonian = h
system2.hamiltonian = h
liouv = system.liouvillian()
liouv2 = system2.liouvillian()
print(system)
print(system2)
In [4]:
#set initial state for spins (Dicke basis)
nt = 1001
td0 = 1/(N*Lambda)
tmax = 10 * td0
t = np.linspace(0, tmax, nt)
excited = dicke(N, N/2, N/2)
load_file = False
if load_file == False:
# cycle over all states in Dicke space
xi2_1_list = []
xi2_2_list = []
xi2_1_min_list = []
xi2_2_min_list = []
for j in j_vals(N):
#for m in m_vals(j):
m = j
rho0 = dicke(N, j, m)
#solve using qutip (Dicke basis)
# Dissipative dynamics: Only collective emission
result = mesolve(liouv, rho0, t, [],
e_ops = [jz, jy, jy**2,jz**2, jx],
options = Options(store_states=True))
rhot = result.states
jz_t = result.expect[0]
jy_t = result.expect[1]
jy2_t = result.expect[2]
jz2_t = result.expect[3]
jx_t = result.expect[4]
Delta_jy = jy2_t - jy_t**2
xi2_1 = N * Delta_jy / (jz_t**2+jx_t**2)
# Dissipative dynamics: Only local emission
result2 = mesolve(liouv2, rho0, t, [],
e_ops = [jz, jy, jy**2,jz**2, jx],
options = Options(store_states=True))
rhot2 = result2.states
jz_t2 = result2.expect[0]
jy_t2 = result2.expect[1]
jy2_t2 = result2.expect[2]
jz2_t2 = result2.expect[3]
jx_t2 = result2.expect[4]
Delta_jy2 = jy2_t2 - jy_t2**2
xi2_2 = N * Delta_jy2 / (jz_t2**2+jx_t2**2)
xi2_1_min = np.min(xi2_1)
xi2_2_min = np.min(xi2_2)
xi2_1_list.append(xi2_1)
xi2_2_list.append(xi2_2)
xi2_1_min_list.append(xi2_1_min)
xi2_2_min_list.append(xi2_2_min)
print("|j, m> = ",j,m)
In [5]:
label_size2 = 20
lw = 3
texplot = False
# if texplot == True:
# plt.rc('text', usetex = True)
# plt.rc('xtick', labelsize=label_size)
# plt.rc('ytick', labelsize=label_size)
fig1 = plt.figure(figsize = (10,6))
for xi2_1 in xi2_1_list:
plt.plot(t*(N*Lambda), xi2_1, '-', label = r' $\gamma_\Downarrow=0.2$', linewidth = lw)
for xi2_2 in xi2_2_list:
plt.plot(t*(N*Lambda), xi2_2, '-.', label = r'$\gamma_\downarrow=0.2$')
plt.plot(t*(N*Lambda), 1+0*t, '--k')
plt.xlim([0,3])
plt.ylim([0,8000.5])
plt.ylim([0,2.5])
plt.xlabel(r'$ N \Lambda t$', fontsize = label_size2)
plt.ylabel(r'$\xi^2$', fontsize = label_size2)
#plt.legend(fontsize = label_size2*0.8)
plt.title(r'Spin Squeezing Parameter, $N={}$'.format(N), fontsize = label_size2)
plt.show()
plt.close()
In [6]:
## Here we find for how long the spin-squeezing parameter, xi2,
## is less than 1 (non-classical or "quantum" condition), in the two dynamics
dt_quantum_xi1_list = []
dt_quantum_xi2_list = []
dt1_jm =[]
dt2_jm =[]
ds = dicke_space(N)
i = 0
for j in j_vals(N):
#for m in m_vals(j):
m = j
rho0 = dicke(N, j, m)
quantum_xi1 = xi2_1_list[i][xi2_1_list[i] < 1.0]
quantum_xi2 = xi2_2_list[i][xi2_2_list[i] < 1.0]
# first ensemble
if len(quantum_xi1)>0:
dt_quantum_xi1 = len(quantum_xi1)
dt1_jm.append((dt_quantum_xi1, j, m))
else:
dt_quantum_xi1 = 0.0
# second ensemble
if len(quantum_xi2)>0:
dt_quantum_xi2 = len(quantum_xi2)
dt2_jm.append((dt_quantum_xi2, j, m))
else:
dt_quantum_xi2 = 0.0
dt_quantum_xi1_list.append(dt_quantum_xi1)
dt_quantum_xi2_list.append(dt_quantum_xi2)
i = i+1
In [7]:
print("collective emission: (squeezing time, j, m)")
print(dt1_jm)
print("local emission: (squeezing time, j, m)")
print(dt2_jm)
In [8]:
plt.rc('text', usetex = True)
label_size = 20
label_size2 = 20
label_size3 = 20
plt.rc('xtick', labelsize=label_size)
plt.rc('ytick', labelsize=label_size)
lw = 3
i0 = -3
i0s=2
fig1 = plt.figure(figsize = (8,5))
# excited state spin squeezing
plt.plot(t*(N*Lambda), xi2_1_list[-1], 'k-',
label = r'$|\frac{N}{2},\frac{N}{2}\rangle$, $\gamma_\Downarrow=0.2\Lambda$',
linewidth = 0.8)
plt.plot(t*(N*Lambda), xi2_2_list[-1], 'r--',
label = r'$|\frac{N}{2},\frac{N}{2}\rangle$, $\gamma_\downarrow=0.2\Lambda$',
linewidth = 0.8)
# state with max time of spin squeezing
plt.plot(t*(N*Lambda), xi2_1_list[i0], 'k-',
label = r'$|j,j\rangle$, $\gamma_\Downarrow=0.2\Lambda$',
linewidth = 0.8+0.4*i0s*lw)
plt.plot(t*(N*Lambda), xi2_2_list[i0], 'r--',
label = r'$|j,j\rangle$, $\gamma_\downarrow=0.2\Lambda$',
linewidth = 0.8+0.4*i0s*lw)
plt.plot(t*(N*Lambda), 1+0*t, '--k')
plt.xlim([0,2.5])
plt.yticks([0,1,2])
plt.ylim([-1,2.])
plt.xlabel(r'$ N \Lambda t$', fontsize = label_size3)
plt.ylabel(r'$\xi^2$', fontsize = label_size3)
plt.legend(fontsize = label_size2*0.8, ncol=2)
fname = 'figures/spin_squeezing_N_{}_states.pdf'.format(N)
plt.title(r'Spin Squeezing Parameter, $N={}$'.format(N), fontsize = label_size2)
plt.show()
plt.close()
The plot shows the spin squeezing parameter for two different dynamics -- only collective de-excitation, black curves; only local de-excitation, red curves -- and for two different inital states, the maximally excited state (thin curves) and another Dicke state with longer squeezing time (thick curves). This study, performed in Refs. [5,6] for the maximally excited state has been extended to any Dicke state in Ref. [7].
In [10]:
# plot the dt matrix in the Dicke space
plt.rc('text', usetex = True)
label_size = 20
label_size2 = 20
label_size3 = 20
plt.rc('xtick', labelsize=label_size)
plt.rc('ytick', labelsize=label_size)
lw = 3
i0 = 7
i0s=2
ratio_squeezing_local = 3
fig1 = plt.figure(figsize = (6,8))
ds = dicke_space(N)
value_excited = 3
ds[0,0]=value_excited
ds[int(N/2-i0),int(N/2-i0)]=value_excited * ratio_squeezing_local
plt.imshow(ds, cmap="inferno_r")
plt.xticks([])
plt.yticks([])
plt.xlabel(r"$j$", fontsize = label_size3)
plt.ylabel(r"$m$", fontsize = label_size3)
plt.title(r"Dicke space $(j,m)$ for $N={}$".format(N), fontsize = label_size3)
plt.show()
plt.close()
The Plot above shows the two initial states (darker dots) $|\frac{N}{2},\frac{N}{2}\rangle$ (top edge of the Dicke triangle, red dot) and $|j,j\rangle$, with $j=\frac{N}{2}-3=7$ (black dot). A study of the Dicke triangle (dark yellow space) and state engineering is performed in Ref. [8] for different initial state.
[1] D. J. Wineland, J. J. Bollinger, W. M. Itano, F. L. Moore, and D. J. Heinzen, Spin squeezing and reduced quantum noise in spectroscopy, Phys. Rev. A 46, R6797 (1992)
[2] M. Kitagawa and M. Ueda, Squeezed spin states, Phys. Rev. A 47, 5138 (1993)
[3] J. Ma, X. Wang, C.-P. Sun, and F. Nori, Quantum spin squeezing, Physics Reports 509, 89 (2011)
[4] L. Pezzè, A. Smerzi, M. K. Oberthaler, R. Schmied, and P. Treutlein, Quantum metrology with nonclassical states of atomic ensembles, Reviews of Modern Physics, in press (2018)
[5] B. A. Chase and J. Geremia, Collective processes of an ensemble of spin-1 particles, Phys. Rev. A 78,0521012 (2008)
[6] B. Q. Baragiola, B. A. Chase, and J. Geremia, Collective uncertainty in partially polarized and partially deco- hered spin-1 systems, Phys. Rev. A 81, 032104 (2010)
[7] N. Shammah, S. Ahmed, N. Lambert, S. De Liberato, and F. Nori, Open quantum systems with local and collective incoherent processes: Efficient numerical simulation using permutational invariance https://arxiv.org/abs/1805.05129
[8] N. Shammah, N. Lambert, F. Nori, and S. De Liberato, Superradiance with local phase-breaking effects, Phys. Rev. A 96, 023863 (2017).
In [ ]:
qutip.about()