Example: Multiport atom interferometer

[1]:
%matplotlib inline

import numpy as np

import aisim as ais

We simulate a Mach-Zehnder atom interferometer sequence, including all six output ports that are created due to imperfect beam splitter and mirror pulses.

Each of these output ports is represented by an entry in each of the atoms’ state vector properties (e.g. state_ket). The index of each port is illustrated in the following schematic:

title

That means that the excited and ground states after the first beamsplitter have indices 0 and 5, respectively.

First, we establish all relevant objects and parameters for the atomic sample and the experimental apparatus:

[2]:
pos_params = {
    'mean_x': 0.0,
    'std_x': 3.0e-3,  # cloud radius in m
    'mean_y': 0.0,
    'std_y': 3.0e-3,  # cloud radius in m
    'mean_z': 0.0,
    'std_z': 0.0,
}
vel_params = {
    'mean_vx': 0.0,
    # cloud velocity spread in m/s at tempearture of 3 uK
    'std_vx': ais.convert.vel_from_temp(3.0e-6),
    'mean_vy': 0.0,
    # cloud velocity spread in m/s at tempearture of 3 uK
    'std_vy': ais.convert.vel_from_temp(3.0e-6),
    'mean_vz': 0.0,
    'std_vz': ais.convert.vel_from_temp(100e-9), # only atoms within a narrow velocity class are pre-selected
}

t_det = 778e-3 # time of the detection in s
r_det = 5e-3 # size of detected region in x-y plane
det = ais.SphericalDetector(t_det, r_det=r_det) # set detection region

center_rabi_freq = 2 * np.pi * 12.5e3
r_beam = 29.5e-3 / 2  # 1/e^2 beam radius in m
intensity_profile = ais.IntensityProfile(r_beam, center_rabi_freq)
wave_vectors = ais.Wavevectors(k1=8.052945514e6, k2=-8.052802263e6)

# Creating an atomic ensemble, initially in the ground state |g, v_0, x_0 + v_0*t>
# and continuing only with the atoms that are eventually detected
atoms = ais.create_random_ensemble_from_gaussian_distribution(
    pos_params, vel_params, int(1e4), state_kets=[0, 0, 0, 0, 0, 1])
atoms = det.detected_atoms(atoms)

Next, we create the three propagators that comprise the atom interferometer and a propagator modeling free evolution of the atoms:

[3]:
# length of a beamspliter pulse
tau = 23e-6

beam_splitter1 = ais.SpatialSuperpositionTransitionPropagator(
    tau, n_pulse=1, n_pulses=3,
    intensity_profile=intensity_profile, wave_vectors=wave_vectors)

mirror = ais.SpatialSuperpositionTransitionPropagator(
    2 * tau, n_pulse=2, n_pulses=3,
    intensity_profile=intensity_profile, wave_vectors=wave_vectors)

beam_splitter2 = ais.SpatialSuperpositionTransitionPropagator(
    tau, n_pulse=3, n_pulses=3,
    intensity_profile=intensity_profile, wave_vectors=wave_vectors)

free_prop= ais.FreePropagator(260e-3)

To illustrate the simulation, we propagate the atoms step by step. Initially, all atoms are in the ground state:

[4]:
[np.mean(atoms.state_occupation(i)) for i in range(6)]
[4]:
[0.0, 0.0, 0.0, 0.0, 0.0, 1.0]

First, the atoms are subjected to the first beamsplitter pulse that transfers atoms into a roughly equal superposition between ground and excited state, i.e. indices 0 and 5:

[5]:
atoms = beam_splitter1.propagate(atoms)
[6]:
[np.mean(atoms.state_occupation(i)) for i in range(6)]
[6]:
[0.4714979674699093, 0.0, 0.0, 0.0, 0.0, 0.5285020325300908]

After free propagation a mirror pulse ideally transfers all atoms from the excited state (index 0) to the ground state (index 3) and from the ground state (index 5) to the excited state (index 2):

[7]:
atoms = free_prop.propagate(atoms)
atoms = mirror.propagate(atoms)
[8]:
[np.mean(atoms.state_occupation(i)) for i in range(6)]
[8]:
[0.11096631568718902,
 0.0,
 0.39041050819211104,
 0.3605316517827202,
 0.0,
 0.13809152433797972]

Finally, the second beam splitter pulse couples three pairs of states as indicated in the schematic above (indices 0 ↔ 1, 2 ↔ 3, 4 ↔ 5).

[9]:
atoms = free_prop.propagate(atoms)
atoms = beam_splitter2.propagate(atoms)

Indices 2 and 3 form the output of the closed interferometer that are of relevance for us:

[10]:
[np.mean(atoms.state_occupation(i)) for i in [2, 3]]
[10]:
[0.012465915360211103, 0.7384762446146201]

From this, we infere a fringe contrast of roughly 0.73 - 0.01 = 72% which aligns well with experimental results.