Rabi oscillations¶
A resonant transverse drive coherently transfers population between spin-half states. Prepare the ground state and calculate the excited-state population versus pulse duration.
Fields are in $\mathrm{T}$, frequencies in $\mathrm{GHz}$ and pulse durations in $\mathrm{ns}$.
import numpy as np
import plotly.graph_objects as go
import plotly.io as pio
from qutip import Qobj
from spinfinity import CC, SpinSys, hamil, lind, plotting
pio.renderers.default = "plotly_mimetype+notebook"
# Use "fixed" for compact plots, or "no" to suppress display.
plotting.set_display_mode("responsive")
Hamiltonian and dissipation¶
Use a collinear field and explicitly combine tunneling-induced relaxation with phenomenological pure dephasing. T_phi is not total T2; microscopic elastic operators are not added in this model.
spin = SpinSys([0.5])
spin.B = [0.0, 0.0, 0.5]
spin.BTip = [0.0, 0.0, 0.0]
spin.gfactorvector = [2.0]
spin.tip = "f"
spin.T = 0.5
spin.V_DC = 0.0
spin.G_st = 1e-10
spin.G_ss = [1e-9]
spin.G_tt = 1
spin.U = np.array([0.0])
spin.b0 = 0.0
spin.TipPolarization = [0.0, 0.0, 0.0]
hamil.calc_EigEnergies(spin, rebuildH=True)
T_phi = 200.0 # ns
spin.collapse_ops = lind.calc_collapseOperators(spin)
spin.collapse_ops.append(lind.calc_dephasingOperator(spin, spin_idx=0, T_phi=T_phi))
Resonant drive and rotating-wave approximation¶
Set the RF frequency to the calculated energy gap. The rotating-wave approximation neglects the rapidly counter-rotating drive component. Here the drive and detuning are much smaller than the resonance frequency.
On resonance, the drive generator is $2\pi f_\mathrm{Rabi}S_x$ in $\mathrm{rad/ns}$. RabiRate is an ordinary frequency: $0.02 ~\mathrm{GHz}$ means $20 ~\mathrm{MHz}$ and an ideal period of $50~\mathrm{ns}$.
ground = Qobj(spin.eigVectors[:, 0])
excited = Qobj(spin.eigVectors[:, 1])
spin.psi0 = ground
spin.f_RF = float(spin.E_All_inGHz[1] - spin.E_All_inGHz[0])
spin.RabiRate = 0.02 # GHz
pulse_widths = np.linspace(0.0, 250.0, 501) # ns
pulse_widths, result = CC.calc_RabiOscillation(
spin,
pulse_widths,
e_ops=[excited.proj()],
solver_options={"atol": 1e-10, "rtol": 1e-10},
)
population = np.asarray(result.expect[0])
print(f"Resonance frequency = {spin.f_RF:.6f} GHz")
print(f"Rabi frequency = {1e3 * spin.RabiRate:.1f} MHz")
print(f"Ideal Rabi period = {1.0 / spin.RabiRate:.1f} ns")
Resonance frequency = 13.996245 GHz Rabi frequency = 20.0 MHz Ideal Rabi period = 50.0 ns
Driven population¶
Without dissipation, ground-state preparation gives
$$ p_e(t)=\sin^2(\pi f_\mathrm{Rabi}t). $$
The dashed curve is an ideal reference, not the prediction for the dissipative model. Relaxation and dephasing damp the oscillations and change the long-time population.
population_ideal = np.sin(np.pi * spin.RabiRate * pulse_widths) ** 2
fig = go.Figure(
go.Scatter(
x=pulse_widths,
y=population,
name="Simulation with dissipation",
)
)
fig.add_trace(
go.Scatter(
x=pulse_widths,
y=population_ideal,
name="Ideal, no dissipation",
line=dict(dash="dash"),
opacity=0.6,
)
)
fig.update_layout(
template="plotly_white",
title="Resonant Rabi oscillations",
xaxis_title="Pulse duration (ns)",
yaxis_title="Excited-state population",
)
plotting.show_figure(fig)