Note
Click here to download the full example code
Example 3: Raman Rabi Flopping
Starts with the Thomas-Fermi solution with all the population in one spin component. Propagates in imaginary time to the ground state. From here, configures a uniform Raman coupling which drives the population on resonance between the two components.
Physical Parameters
Atom number
\(\quad N_{\rm at} = 10,000\)
Atomic mass, Rubidium-87
\(\quad m = 1.4442 \times 10^{-25}~[\rm kg]\)
Trap frequencies
\(\quad (\omega_x, \omega_y, \omega_z) = 2 \pi \times (50, 200, 2000)~[{\rm Hz}]\)
\(\quad (\omega_x, \omega_y, \omega_z) = \omega_x \times (1, \gamma, \eta) = (1, 1, 40)~[\omega_x]\)
Harmonic oscillator length, x-axis
\(\quad a_x = \sqrt{\hbar / m \omega_x} = 1.525~[{\mu\rm m}]\)
3D scattering length, Rubidium-87
Scattering 2D scale
Scattering coupling
Chemical potential
\(\quad \mu = \sqrt{4 N_{\rm at} a_{\rm sc} \gamma \sqrt{\eta / 2 \pi}} = 18.754~[\omega_x]\)
Thomas-Fermi radius
\(\quad R_{\rm TF} = \sqrt{2 \mu} = 6.124~[a_x]\)
Initial population fractions
\(\quad (p_0, p_1) = (1.0, 0.0)\)
Raman wavelength
\(\quad \lambda_L = 790.1~[{\rm nm}]\)
Numerical Parameters
Number of grid points
\(\quad (N_x, N_y) = (256, 256)\)
r-grid half-size
\(\quad (x^{\rm max}, y^{\rm max}) = (16, 16)~[a_x]\)
r-grid spacing
\(\quad (\Delta x, \Delta y) = (0.125, 0.125)~[a_x]\)
k-grid half-size
\(\quad (k_x^{\rm max}, k_y^{\rm max}) = \pi / (\Delta x, \Delta y)\)
\(\quad (k_x^{\rm max}, k_y^{\rm max}) = (25.133, 25.133)~[a_x^{-1}]\)
k-grid spacing
\(\quad (\Delta k_x, \Delta k_y) = \pi / (x^{\rm max}, y^{\rm max})\)
\(\quad (\Delta k_x, \Delta k_y) = (0.1963, 0.1963)~[a_x^{-1}]\)
Time scale
\(\quad \tau_0 = 1 / \omega_x = 0.00318~[{\rm s/rad}]\)
\(\quad \tau_0 = 1~[\omega_x^{-1}]\)
Time step duration, imaginary
\(\quad \Delta \tau_{\rm im} = 1 / 50~[-i \tau_0]\)
Number of time steps, imaginary
\(\quad N_{\rm im} = 1000\)
Time step duration, real
\(\quad \Delta \tau_{\rm real} = 1 / 5000~[\tau_0]\)
Number of time steps, real
\(\quad N_{\rm real} = 2000\)
import os
import sys
sys.path.insert(0, os.path.abspath('../..')) # Adds project root to the PATH
import numpy as np
from spinor_gpe.pspinor import pspinor as spin
# 1. SETUP
DATA_PATH = 'examples/Trial_003' # Default data path is in the /data/ folder
FREQ = 50
W = 2*np.pi*FREQ
Y_SCALE = 1
Z_SCALE = 40.0
ATOM_NUM = 1e4
OMEG = {'x': W, 'y': Y_SCALE * W, 'z': Z_SCALE * W}
G_SC = {'uu': 1, 'dd': 1, 'ud': 0.0}
POP_FRAC = (1.0, 0.0)
ps = spin.PSpinor(DATA_PATH, overwrite=True,
atom_num=ATOM_NUM,
omeg=OMEG,
g_sc=G_SC,
pop_frac=POP_FRAC,
r_sizes=(16, 16),
mesh_points=(256, 256))
ps.coupling_setup(wavel=790.1e-9, kin_shift=True)
# Shifts the k-space density momentum peaks by `kshift_val` [`kL_recoil` units]
ps.shift_momentum(scale=1.0, frac=(0, 1.0))
# Selects the form of the coupling operator in the non-rotated reference frame
ps.rot_coupling = False
ZOOM = 2 # Zooms the momentum-space density plots by a constant factor
ps.plot_spins(rscale=ps.rad_tf, kscale=ps.kL_recoil, zoom=ZOOM)
# 2. RUN (Imaginary-time)
DT = 1/50
N_STEPS = 1000
DEVICE = 'cuda'
ps.rand_seed = 99999
res0, prop0 = ps.imaginary(DT, N_STEPS, DEVICE, is_sampling=True, n_samples=50)
# 3. ANALYZE
res0.plot_spins(rscale=ps.rad_tf, kscale=ps.kL_recoil, zoom=ZOOM)
res0.plot_total(kscale=ps.kL_recoil, zoom=ZOOM)
res0.plot_pops()
# res0.make_movie(rscale=ps.rad_tf, kscale=ps.kL_recoil, play=True, zoom=ZOOM)
print(f'\nFinal energy: {res0.eng_final[0]} [hbar * omeg]')
# 4. RUN (Real-time)
# Initializes a uniform Raman coupling (scaled in `EL_recoil` units)
ps.coupling_uniform(1.0 * ps.EL_recoil)
DT = 1/5000
N_STEPS = 2000
res1, prop1 = ps.real(DT, N_STEPS, DEVICE, is_sampling=True, n_samples=100)
# 5. ANALYZE
res1.plot_spins(rscale=ps.rad_tf, kscale=ps.kL_recoil, zoom=ZOOM/2)
res1.plot_total(kscale=ps.kL_recoil, zoom=ZOOM/2)
res1.plot_pops()
res1.make_movie(rscale=ps.rad_tf, kscale=ps.kL_recoil, play=True, zoom=ZOOM/2)
print(f'\nFinal energy: {res1.eng_final[0]} [hbar * omeg]')
Total running time of the script: ( 0 minutes 0.000 seconds)