arc.calculations_atom_pairstate.PairStateInteractions.getC6perturbatively#

PairStateInteractions.getC6perturbatively(theta, phi, nRange, energyDelta, degeneratePerturbation=False)[source]#

Calculates \(C_6\) from second order perturbation theory.

Calculates \(C_6=\sum_{\rm r',r''}|\langle {\rm r',r''}|V|\ {\rm r1,r2}\rangle|^2/\Delta_{\rm r',r''}\), where \(\Delta_{\rm r',r''}\equiv E({\rm r',r''})-E({\rm r1, r2})\) When second order perturbation couples to multiple energy degenerate states, users shold use degenerate perturbation calculations by setting degeneratePerturbation=True .

This calculation is faster then full diagonalization, but it is valid only far from the so called spaghetti region that occurs when atoms are close to each other. In that region multiple levels are strongly coupled, and one needs to use full diagonalization. In region where perturbative calculation is correct, energy level shift can be obtained as \(V(R)=-C_6/R^6\)

See perturbative C6 calculations example snippet and for degenerate perturbation calculation see degenerate pertubation C6 calculation example snippet

Parameters:
theta (float):

orientation of inter-atomic axis with respect to quantization axis (\(z\)) in Euler coordinates (measured in units of radian)

phi (float):

orientation of inter-atomic axis with respect to quantization axis (\(z\)) in Euler coordinates (measured in units of radian)

nRange (int):

how much below and above the given principal quantum number of the pair state we should be looking

energyDelta (float):

what is maximum energy difference ( \(\Delta E/h\) in Hz) between the original pair state and the other pair states that we are including in calculation

degeneratePerturbation (bool):

optional, default False. Should one use degenerate perturbation theory. This should be used whenever angle between quantisation and interatomic axis is non-zero, as well as when one considers non-stretched states.

Returns:

float: if degeneratePerturbation=False, returns \(C_6\) measured in \(\text{GHz }\mu\text{m}^6\); if degeneratePerturbation=True, returns array of \(C_6\) measured in \(\text{GHz }\mu\text{m}^6\) AND array of corresponding eigenvectors in \(\{m_{j_1}=-j_1, \ldots, m_{j_1} = +j1\}\bigotimes \ \{ m_{j_2}=-j_2, \ldots, m_{j_2} = +j2\}\) basis

Example:

If we want to quickly calculate \(C_6\) for two Rubidium atoms in state \(62 D_{3/2} m_j=3/2\), positioned in space along the shared quantization axis:

from arc import *
calculation = PairStateInteractions(Rubidium(), 62, 2, 1.5, 62, 2, 1.5, 1.5, 1.5)
c6 = calculation.getC6perturbatively(0,0, 5, 25e9)
print "C_6 = %.0f GHz (mu m)^6" % c6

Which returns:

C_6 = 767 GHz (mu m)^6

Quick calculation of angular anisotropy of for Rubidium \(D_{2/5},m_j=5/2\) states:

# Rb 60 D_{2/5}, mj=2.5 , 60 D_{2/5}, mj=2.5 pair state
calculation1 = PairStateInteractions(Rubidium(), 60, 2, 2.5, 60, 2, 2.5, 2.5, 2.5)
# list of atom orientations
thetaList = np.linspace(0,pi,30)
# do calculation of C6 pertubatively for all atom orientations
c6 = []
for theta in thetaList:
    value = calculation1.getC6perturbatively(theta,0,5,25e9)
    c6.append(value)
    print ("theta = %.2f * pi \tC6 = %.2f GHz  mum^6" % (theta/pi,value))
# plot results
plot(thetaList/pi,c6,"b-")
title("Rb, pairstate  60 $D_{5/2},m_j = 5/2$, 60 $D_{5/2},m_j = 5/2$")
xlabel(r"$\Theta /\pi$")
ylabel(r"$C_6$ (GHz $\mu$m${}^6$")
show()